@form-eng/core 1.1.1 → 1.2.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/types/ICondition.ts","../src/types/IRulesEngineAction.ts","../src/types/TypedFieldConfig.ts","../src/utils/index.ts","../src/constants.ts","../src/helpers/LocaleRegistry.ts","../src/strings.ts","../src/providers/RulesEngineProvider.tsx","../src/helpers/ConditionEvaluator.ts","../src/helpers/ValueFunctionRegistry.ts","../src/helpers/ExpressionEngine.ts","../src/helpers/EventTimeline.ts","../src/helpers/RuleEngine.ts","../src/reducers/RulesEngineReducer.ts","../src/providers/InjectedFieldProvider.tsx","../src/helpers/ValidationRegistry.ts","../src/helpers/InlineFormHelper.ts","../src/helpers/FieldHelper.ts","../src/helpers/DependencyGraphValidator.ts","../src/helpers/ConfigValidator.ts","../src/components/WizardForm.tsx","../src/helpers/WizardHelper.ts","../src/components/FieldArray.tsx","../src/components/InlineForm.tsx","../src/hooks/useFormAnalytics.ts","../src/components/ConfirmInputsModal.tsx","../src/components/RenderField.tsx","../src/components/FieldWrapper.tsx","../src/helpers/RenderTracker.ts","../src/components/InlineFormFields.tsx","../src/components/FormErrorBoundary.tsx","../src/components/FormDevTools.tsx","../src/utils/rjsf/refResolver.ts","../src/utils/rjsf/fieldMapper.ts","../src/utils/rjsf/ruleConverter.ts","../src/utils/rjsf/converter.ts","../src/utils/rjsf/reverseConverter.ts","../src/utils/zodSchemaImport.ts","../src/utils/lazyFieldRegistry.ts","../src/hooks/useDraftPersistence.ts","../src/utils/formStateSerialization.ts","../src/hooks/useBeforeUnload.ts","../src/helpers/RuleTracer.ts"],"sourcesContent":["// Types\nexport * from \"./types\";\n\n// Utils\nexport * from \"./utils\";\n\n// Constants\nexport { ComponentTypes, FormConstants, FIELD_PARENT_PREFIX } from \"./constants\";\n\n// Strings\nexport { FormStrings } from \"./strings\";\n\n// Providers\nexport {\n RulesEngineProvider,\n UseRulesEngineContext,\n} from \"./providers/RulesEngineProvider\";\nexport {\n InjectedFieldProvider,\n UseInjectedFieldContext,\n} from \"./providers/InjectedFieldProvider\";\nexport type { IRulesEngineProvider } from \"./providers/IRulesEngineProvider\";\nexport type { IInjectedFieldProvider } from \"./providers/IInjectedFieldProvider\";\n\n// Rule Engine\nexport {\n evaluateAllRules,\n evaluateAffectedFields,\n buildDependencyGraph,\n buildDefaultFieldStates,\n topologicalSort,\n} from \"./helpers/RuleEngine\";\n\n// Condition Evaluator\nexport {\n evaluateCondition,\n extractConditionDependencies,\n} from \"./helpers/ConditionEvaluator\";\n\n// Helpers\nexport {\n GetChildEntity,\n IsExpandVisible,\n GetConfirmInputModalProps,\n GetComputedValuesOnDirtyFields,\n GetComputedValuesOnCreate,\n ExecuteComputedValue,\n CheckFieldValidationRules,\n CheckAsyncFieldValidationRules,\n CheckValidDropdownOptions,\n CheckDefaultValues,\n InitOnCreateFormState,\n InitOnEditFormState,\n ShowField,\n GetFieldsToRender,\n SortOptions,\n} from \"./helpers/InlineFormHelper\";\n\nexport { SortOptions as SortDropdownOptions } from \"./helpers/FieldHelper\";\n\nexport {\n detectDependencyCycles,\n detectSelfDependencies,\n validateDependencyGraph,\n} from \"./helpers/DependencyGraphValidator\";\nexport type { ICycleError } from \"./helpers/DependencyGraphValidator\";\n\nexport {\n registerValidators,\n getValidator,\n getValidatorRegistry,\n resetValidatorRegistry,\n runValidations,\n runSyncValidations,\n createMinLengthRule,\n createMaxLengthRule,\n createNumericRangeRule,\n createPatternRule,\n createRequiredIfRule,\n registerValidatorMetadata,\n getValidatorMetadata,\n getAllValidatorMetadata,\n resetValidatorMetadataRegistry,\n} from \"./helpers/ValidationRegistry\";\nexport type { ValidatorFn, IValidationContext, IValidatorMetadata } from \"./helpers/ValidationRegistry\";\n\nexport {\n registerValueFunctions,\n getValueFunction,\n executeValueFunction,\n resetValueFunctionRegistry,\n} from \"./helpers/ValueFunctionRegistry\";\nexport type { ValueFunction, IValueFunctionContext } from \"./helpers/ValueFunctionRegistry\";\n\nexport { validateFieldConfigs } from \"./helpers/ConfigValidator\";\nexport type { IConfigValidationError } from \"./helpers/ConfigValidator\";\n\n// Locale\nexport {\n registerLocale,\n getLocaleString,\n resetLocale,\n getCurrentLocale,\n} from \"./helpers/LocaleRegistry\";\n\n// Wizard\nexport { WizardForm } from \"./components/WizardForm\";\nexport type { IWizardNavigationProps, IWizardStepHeaderProps, IWizardFormProps } from \"./components/WizardForm\";\nexport { getVisibleSteps, getStepFields, getStepFieldOrder, validateStepFields, isStepValid, getStepIndex } from \"./helpers/WizardHelper\";\n\n// Field Array\nexport { FieldArray } from \"./components/FieldArray\";\nexport type { IFieldArrayProps } from \"./components/FieldArray\";\n\n// Components\nexport { FormEngine } from \"./components/InlineForm\";\nexport { FormFields } from \"./components/InlineFormFields\";\nexport { FieldWrapper } from \"./components/FieldWrapper\";\nexport { default as RenderField } from \"./components/RenderField\";\nexport { default as ConfirmInputsModal } from \"./components/ConfirmInputsModal\";\nexport { FormErrorBoundary } from \"./components/FormErrorBoundary\";\n\n// DevTools\nexport { FormDevTools } from \"./components/FormDevTools\";\nexport type { IFormDevToolsProps } from \"./components/FormDevTools\";\n\n// RJSF Schema Import/Export\nexport { fromRjsfSchema, toRjsfSchema } from \"./utils/rjsf\";\nexport type { IJsonSchemaNode, IRjsfUiSchema, IRjsfConvertOptions } from \"./utils/rjsf\";\n\n// Zod Schema Import\nexport { zodSchemaToFieldConfig } from \"./utils/zodSchemaImport\";\n\n// Lazy Field Registry\nexport { createLazyFieldRegistry } from \"./utils/lazyFieldRegistry\";\n\n// Hooks\nexport { useDraftPersistence } from \"./hooks/useDraftPersistence\";\nexport type { IDraftPersistenceOptions, IDraftState, IUseDraftPersistenceResult } from \"./hooks/useDraftPersistence\";\nexport { useBeforeUnload } from \"./hooks/useBeforeUnload\";\nexport { useFormAnalytics } from \"./hooks/useFormAnalytics\";\nexport type { IFormAnalytics } from \"./hooks/useFormAnalytics\";\n\n// Form State Serialization\nexport { serializeFormState, deserializeFormState } from \"./utils/formStateSerialization\";\n\n// Expression Engine\nexport { evaluateExpression, extractExpressionDependencies, extractFunctionDependencies } from \"./helpers/ExpressionEngine\";\n\n// Rule Tracing / Debugging\nexport {\n enableRuleTracing,\n disableRuleTracing,\n traceRuleEvent,\n getRuleTraceLog,\n clearRuleTraceLog,\n isRuleTracingEnabled,\n} from \"./helpers/RuleTracer\";\nexport type { IRuleTraceEvent } from \"./helpers/RuleTracer\";\n\n// Render Tracking\nexport {\n trackRender,\n flushRenderCycle,\n getRenderCounts,\n getLastRenderedFields,\n getTotalFormRenders,\n resetRenderTracker,\n} from \"./helpers/RenderTracker\";\n\n// Event Timeline\nexport {\n logEvent,\n getTimeline,\n clearTimeline,\n} from \"./helpers/EventTimeline\";\nexport type { ITimelineEvent, TimelineEventType } from \"./helpers/EventTimeline\";\n","/**\n * Condition types for the v2 rule engine.\n *\n * Conditions can be field-level comparisons or logical combinations (AND/OR/NOT).\n * Used in IRule.when, IValidationRule.when, and IWizardStepCondition.\n */\n\n/** A condition that compares a single field's value */\nexport interface IFieldCondition {\n /** The field name to evaluate */\n field: string;\n /** Comparison operator */\n operator:\n | \"equals\"\n | \"notEquals\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\"\n | \"contains\"\n | \"notContains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"in\"\n | \"notIn\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"matches\"\n | \"arrayContains\"\n | \"arrayNotContains\"\n | \"arrayLengthEquals\"\n | \"arrayLengthGreaterThan\"\n | \"arrayLengthLessThan\";\n /** The value to compare against. Not required for isEmpty/isNotEmpty. */\n value?: unknown;\n}\n\n/** A logical combination of conditions */\nexport interface ILogicalCondition {\n /** Logical operator to combine child conditions */\n operator: \"and\" | \"or\" | \"not\";\n /** Child conditions to combine */\n conditions: ICondition[];\n}\n\n/** Union type: either a field comparison or a logical combination */\nexport type ICondition = IFieldCondition | ILogicalCondition;\n\n/** Type guard: checks if a condition is a logical condition (and/or/not) */\nexport function isLogicalCondition(condition: ICondition): condition is ILogicalCondition {\n const op = condition.operator;\n return op === \"and\" || op === \"or\" || op === \"not\";\n}\n\n/** Type guard: checks if a condition is a field condition */\nexport function isFieldCondition(condition: ICondition): condition is IFieldCondition {\n return \"field\" in condition;\n}\n","import { IRuntimeFormState } from \"./IRuntimeFieldState\";\n\n/** Action type keys for the rules engine reducer */\nexport enum RulesEngineActionType {\n SET = \"RULES_ENGINE_SET\",\n UPDATE = \"RULES_ENGINE_UPDATE\",\n CLEAR = \"RULES_ENGINE_CLEAR\",\n}\n\nexport interface ISetRulesAction {\n readonly type: RulesEngineActionType.SET;\n readonly payload: {\n readonly configName: string;\n readonly formState: IRuntimeFormState;\n };\n}\n\nexport interface IUpdateRulesAction {\n readonly type: RulesEngineActionType.UPDATE;\n readonly payload: {\n readonly configName: string;\n readonly formState: IRuntimeFormState;\n };\n}\n\nexport interface IClearRulesAction {\n readonly type: RulesEngineActionType.CLEAR;\n readonly payload: {\n readonly configName?: string;\n };\n}\n\nexport type RulesEngineAction = ISetRulesAction | IUpdateRulesAction | IClearRulesAction;\n","import { IFieldConfig } from \"./IFieldConfig\";\nimport { ICondition } from \"./ICondition\";\nimport { IFieldEffect } from \"./IFieldEffect\";\n\n/**\n * A field config where rule targets are constrained to known field names.\n * Provides compile-time checking that cross-field rule effects reference valid fields.\n */\nexport type TypedFieldConfig<TFields extends string> = Omit<IFieldConfig, \"rules\"> & {\n /**\n * Business rules with type-safe cross-field effect targets.\n * Field names in `then.fields` and `else.fields` are checked against TFields.\n */\n rules?: Array<{\n id?: string;\n when: ICondition;\n then: Omit<IFieldEffect, \"fields\"> & {\n fields?: Partial<Record<TFields, IFieldEffect>>;\n };\n else?: Omit<IFieldEffect, \"fields\"> & {\n fields?: Partial<Record<TFields, IFieldEffect>>;\n };\n priority?: number;\n }>;\n};\n\n/**\n * Define field configs with type-safe rule references.\n * TypeScript will error if a rule's cross-field effect targets a field name that doesn't exist.\n *\n * At runtime this is a no-op -- it just returns the input. The value is purely at compile time.\n *\n * @example\n * const config = defineFormConfig({\n * name: { type: \"Textbox\", label: \"Name\" },\n * status: {\n * type: \"Dropdown\",\n * label: \"Status\",\n * options: [{ value: \"Active\", label: \"Active\" }, { value: \"Inactive\", label: \"Inactive\" }],\n * rules: [{\n * when: { field: \"status\", operator: \"equals\", value: \"Active\" },\n * then: { fields: { name: { required: true } } }, // \"name\" checked at compile time\n * }],\n * },\n * });\n */\nexport function defineFormConfig<T extends Record<string, TypedFieldConfig<Extract<keyof T, string>>>>(\n fields: T\n): Record<string, IFieldConfig> {\n return fields as unknown as Record<string, IFieldConfig>;\n}\n","/** Generic dictionary type */\nexport type Dictionary<T> = Record<string, T>;\n\n/** Entity data type */\nexport type IEntityData = Record<string, unknown>;\n\n/** Sub-entity value type */\nexport type SubEntityType = string | number | boolean | Date | object | null | undefined;\n\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\nexport function isNull(value: unknown): value is null | undefined {\n return value == null;\n}\n\nexport function isStringEmpty(value: string | null | undefined): boolean {\n return value == null || value.trim() === \"\";\n}\n\nexport function deepCopy<T>(obj: T): T {\n return structuredClone(obj);\n}\n\nexport function convertBooleanToYesOrNoText(value: boolean | null | undefined): string {\n if (value === true) return \"Yes\";\n if (value === false) return \"No\";\n return \"\";\n}\n\n/** Sort options alphabetically by label */\nexport function sortDropdownOptions(a: { label?: string }, b: { label?: string }): number {\n const aText = a.label ? a.label.toLowerCase() : \"\";\n const bText = b.label ? b.label.toLowerCase() : \"\";\n return aText < bText ? -1 : aText > bText ? 1 : 0;\n}\n\n/** Create an option from a value string (value and label are the same) */\nexport function createOption(value: string): { value: string; label: string } {\n return { value, label: value };\n}\n","export const FIELD_PARENT_PREFIX = \"Parent.\";\n\n/** Component type constants */\nexport const ComponentTypes = {\n Textbox: \"Textbox\",\n Dropdown: \"Dropdown\",\n Toggle: \"Toggle\",\n Number: \"Number\",\n MultiSelect: \"Multiselect\",\n DateControl: \"DateControl\",\n Slider: \"Slider\",\n Fragment: \"DynamicFragment\",\n SimpleDropdown: \"SimpleDropdown\",\n MultiSelectSearch: \"MultiSelectSearch\",\n PopOutEditor: \"PopOutEditor\",\n RichText: \"RichText\",\n Textarea: \"Textarea\",\n DocumentLinks: \"DocumentLinks\",\n StatusDropdown: \"StatusDropdown\",\n ReadOnly: \"ReadOnly\",\n ReadOnlyArray: \"ReadOnlyArray\",\n ReadOnlyDateTime: \"ReadOnlyDateTime\",\n ReadOnlyCumulativeNumber: \"ReadOnlyCumulativeNumber\",\n ReadOnlyRichText: \"ReadOnlyRichText\",\n ReadOnlyWithButton: \"ReadOnlyWithButton\",\n ChoiceSet: \"ChoiceSet\",\n FieldArray: \"FieldArray\",\n RadioGroup: \"RadioGroup\",\n CheckboxGroup: \"CheckboxGroup\",\n Rating: \"Rating\",\n ColorPicker: \"ColorPicker\",\n Autocomplete: \"Autocomplete\",\n FileUpload: \"FileUpload\",\n DateRange: \"DateRange\",\n DateTime: \"DateTime\",\n PhoneInput: \"PhoneInput\",\n} as const;\n\n/** Form-level constants */\nexport const FormConstants = {\n defaultExpandCutoffCount: 12,\n loadingShimmerCount: 12,\n loadingFieldShimmerHeight: 32,\n na: \"n/a\",\n panelActionKeys: {\n cancel: \"Cancel\",\n close: \"Close\",\n create: \"Create\",\n update: \"Update\",\n },\n urlRegex: /(http(s?)):\\/\\//i,\n errorColor: \"#a4262c\",\n} as const;\n\n","import { ICoreLocaleStrings } from \"../types/ILocaleStrings\";\n\n/** Default English strings */\nconst defaultStrings: ICoreLocaleStrings = {\n // Form status\n autoSavePending: \"AutoSave Pending, please check for errors...\",\n savePending: \"Save Pending, please check for errors...\",\n saving: \"Saving...\",\n saveError: \"Error saving form\",\n\n // Actions\n save: \"Save\",\n cancel: \"Cancel\",\n create: \"Create\",\n update: \"Update\",\n confirm: \"Confirm\",\n add: \"Add\",\n edit: \"Edit\",\n deleteLabel: \"Delete\",\n remove: \"Remove\",\n close: \"Close\",\n clear: \"Clear\",\n\n // Field labels\n required: \"Required\",\n remaining: \"remaining\",\n na: \"N/A\",\n unknown: \"Unknown\",\n loading: \"Loading\",\n noResultsFound: \"No results found\",\n clickToClear: \"Click here to Clear\",\n\n // Document links\n linkTitleLabel: \"Link Title\",\n linkUrlLabel: \"Link URL\",\n urlRequired: \"Invalid Url (http/https required)\",\n\n // Expand/collapse\n seeLess: \"See less\",\n expand: \"Expand\",\n\n // Rich text editor\n openExpandedTextEditor: \"Open Expanded Editor\",\n closeExpandedTextEditor: \"Close Expanded Editor\",\n\n // Unsaved changes\n unsavedChanges: \"Unsaved Changes\",\n returnToEditing: \"Return to Editing\",\n dontSave: \"Don't save\",\n overview: \"Overview\",\n by: \"by\",\n\n // Accessibility\n filterFields: \"Filter form fields\",\n saved: \"Saved successfully\",\n saveFailed: \"Save failed\",\n validating: \"Validating...\",\n stepOf: (current: number, total: number) => `Step ${current} of ${total}`,\n formWizard: \"Form wizard\",\n itemOfTotal: (index: number, total: number, label: string) => `${label} item ${index} of ${total}`,\n\n // Dynamic functions\n saveChangesTo: (title: string) => `Do you want to save your changes to ${title}?`,\n\n // Validation error messages\n invalidUrl: \"Invalid URL\",\n invalidEmail: \"Invalid email address\",\n invalidPhoneNumber: \"Invalid phone number\",\n invalidYear: \"Invalid year\",\n contentExceedsMaxSize: (maxKb: number) => `Content exceeds maximum size of ${maxKb}KB`,\n noSpecialCharacters: \"Special characters are not allowed\",\n invalidCurrencyFormat: \"Invalid currency format\",\n duplicateValue: (value: string) => `Duplicate value: ${value}`,\n mustBeAtLeastChars: (min: number) => `Must be at least ${min} characters`,\n mustBeAtMostChars: (max: number) => `Must be at most ${max} characters`,\n mustBeANumber: \"Must be a number\",\n mustBeBetween: (min: number, max: number) => `Must be between ${min} and ${max}`,\n thisFieldIsRequired: \"This field is required\",\n\n // Reliability / save status\n saveRetrying: \"Retrying save...\",\n saveTimeout: \"Save timed out\",\n\n // Draft persistence\n draftRecovered: \"Draft recovered\",\n discardDraft: \"Discard draft\",\n unsavedChangesWarning: \"You have unsaved changes. Are you sure you want to leave?\",\n};\n\nlet currentLocale: ICoreLocaleStrings = { ...defaultStrings };\n\n/**\n * Register a partial or full locale override. Unspecified keys fall back to English defaults.\n * Can be called multiple times; each call merges into the current locale.\n */\nexport function registerLocale(partial: Partial<ICoreLocaleStrings>): void {\n currentLocale = { ...currentLocale, ...partial };\n}\n\n/**\n * Get a locale string by key. Returns the registered locale value or the English default.\n */\nexport function getLocaleString<K extends keyof ICoreLocaleStrings>(key: K): ICoreLocaleStrings[K] {\n return currentLocale[key];\n}\n\n/**\n * Reset the locale to English defaults. Useful for testing.\n */\nexport function resetLocale(): void {\n currentLocale = { ...defaultStrings };\n}\n\n/**\n * Get the full current locale object. Useful for debugging or bulk operations.\n */\nexport function getCurrentLocale(): ICoreLocaleStrings {\n return { ...currentLocale };\n}\n","import { getLocaleString } from \"./helpers/LocaleRegistry\";\n\n/**\n * User-facing string literals (v2).\n * All properties resolve through the locale registry.\n */\nexport const FormStrings = {\n get autoSavePending() { return getLocaleString(\"autoSavePending\"); },\n get savePending() { return getLocaleString(\"savePending\"); },\n get remaining() { return getLocaleString(\"remaining\"); },\n get saving() { return getLocaleString(\"saving\"); },\n get seeLess() { return getLocaleString(\"seeLess\"); },\n get expand() { return getLocaleString(\"expand\"); },\n get required() { return getLocaleString(\"required\"); },\n get save() { return getLocaleString(\"save\"); },\n get cancel() { return getLocaleString(\"cancel\"); },\n get create() { return getLocaleString(\"create\"); },\n get update() { return getLocaleString(\"update\"); },\n get na() { return getLocaleString(\"na\"); },\n get saveError() { return getLocaleString(\"saveError\"); },\n get confirm() { return getLocaleString(\"confirm\"); },\n get linkTitleLabel() { return getLocaleString(\"linkTitleLabel\"); },\n get linkUrlLabel() { return getLocaleString(\"linkUrlLabel\"); },\n get add() { return getLocaleString(\"add\"); },\n get edit() { return getLocaleString(\"edit\"); },\n get deleteLabel() { return getLocaleString(\"deleteLabel\"); },\n get remove() { return getLocaleString(\"remove\"); },\n get unknown() { return getLocaleString(\"unknown\"); },\n get close() { return getLocaleString(\"close\"); },\n get loading() { return getLocaleString(\"loading\"); },\n get noResultsFound() { return getLocaleString(\"noResultsFound\"); },\n get clickToClear() { return getLocaleString(\"clickToClear\"); },\n get clear() { return getLocaleString(\"clear\"); },\n get urlRequired() { return getLocaleString(\"urlRequired\"); },\n get openExpandedTextEditor() { return getLocaleString(\"openExpandedTextEditor\"); },\n get closeExpandedTextEditor() { return getLocaleString(\"closeExpandedTextEditor\"); },\n get unsavedChanges() { return getLocaleString(\"unsavedChanges\"); },\n get returnToEditing() { return getLocaleString(\"returnToEditing\"); },\n get dontSave() { return getLocaleString(\"dontSave\"); },\n get overview() { return getLocaleString(\"overview\"); },\n get by() { return getLocaleString(\"by\"); },\n get filterFields() { return getLocaleString(\"filterFields\"); },\n get saved() { return getLocaleString(\"saved\"); },\n get saveFailed() { return getLocaleString(\"saveFailed\"); },\n get validating() { return getLocaleString(\"validating\"); },\n get stepOf() { return getLocaleString(\"stepOf\"); },\n get formWizard() { return getLocaleString(\"formWizard\"); },\n get itemOfTotal() { return getLocaleString(\"itemOfTotal\"); },\n get saveChangesTo() { return getLocaleString(\"saveChangesTo\"); },\n get draftRecovered() { return getLocaleString(\"draftRecovered\"); },\n get discardDraft() { return getLocaleString(\"discardDraft\"); },\n get unsavedChangesWarning() { return getLocaleString(\"unsavedChangesWarning\"); },\n get saveRetrying() { return getLocaleString(\"saveRetrying\"); },\n get saveTimeout() { return getLocaleString(\"saveTimeout\"); },\n};\n\n","import { IEntityData } from \"../utils\";\nimport React from \"react\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { RulesEngineActionType } from \"../types/IRulesEngineAction\";\nimport { evaluateAllRules, evaluateAffectedFields } from \"../helpers/RuleEngine\";\nimport rulesEngineReducer, { defaultRulesEngineState } from \"../reducers/RulesEngineReducer\";\nimport { IRulesEngineProvider } from \"./IRulesEngineProvider\";\n\nconst RulesEngineContext: React.Context<IRulesEngineProvider> = React.createContext(\n undefined as unknown as IRulesEngineProvider\n);\n\nexport function UseRulesEngineContext() {\n const context = React.useContext(RulesEngineContext);\n if (context === undefined) {\n throw new Error(\n \"UseRulesEngineContext() was called outside of <RulesEngineProvider>. \" +\n \"Required hierarchy: <RulesEngineProvider> > <InjectedFieldProvider> > <FormEngine>\"\n );\n }\n return context;\n}\n\n\nexport const RulesEngineProvider: React.FC<React.PropsWithChildren<{}>> = (\n props: React.PropsWithChildren<{}>\n): React.JSX.Element => {\n const [rulesState, dispatch] = React.useReducer(rulesEngineReducer, defaultRulesEngineState);\n\n const rulesStateRef = React.useRef(rulesState);\n React.useEffect(() => { rulesStateRef.current = rulesState; }, [rulesState]);\n\n const initFormState = React.useCallback((\n configName: string,\n defaultValues: IEntityData,\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n ): IRuntimeFormState => {\n const formState = evaluateAllRules(fields, defaultValues, areAllFieldsReadonly);\n\n dispatch({\n type: RulesEngineActionType.SET,\n payload: { configName, formState },\n });\n\n return formState;\n }, []);\n\n const clearFormState = React.useCallback((configName?: string) => {\n dispatch({\n type: RulesEngineActionType.CLEAR,\n payload: { configName },\n });\n }, []);\n\n const processFieldChange = React.useCallback((\n entityData: IEntityData,\n configName: string,\n fieldName: string,\n fields: Record<string, IFieldConfig>\n ) => {\n const currentState = rulesStateRef.current.configs[configName];\n if (!currentState) return;\n\n const hasAnyDeps =\n (currentState.fieldStates[fieldName]?.dependentFields?.length ?? 0) > 0 ||\n (currentState.fieldStates[fieldName]?.dependsOnFields?.length ?? 0) > 0;\n\n if (!hasAnyDeps) return;\n\n const updatedState = evaluateAffectedFields(fieldName, fields, entityData, currentState);\n\n dispatch({\n type: RulesEngineActionType.UPDATE,\n payload: { configName, formState: updatedState },\n });\n }, []);\n\n const providerValue: IRulesEngineProvider = React.useMemo(() => ({\n rulesState,\n initFormState,\n processFieldChange,\n clearFormState,\n }), [rulesState, initFormState, processFieldChange, clearFormState]);\n\n return (\n <RulesEngineContext.Provider value={providerValue}>\n {props.children}\n </RulesEngineContext.Provider>\n );\n};\n\n","import { ICondition, IFieldCondition, ILogicalCondition, isLogicalCondition } from \"../types/ICondition\";\nimport { IEntityData } from \"../utils\";\n\n/**\n * Evaluates a condition tree against the current form values.\n *\n * Supports all 15 field operators and AND/OR/NOT logical operators.\n */\nexport function evaluateCondition(condition: ICondition, values: IEntityData): boolean {\n if (isLogicalCondition(condition)) {\n return evaluateLogicalCondition(condition, values);\n }\n return evaluateFieldCondition(condition as IFieldCondition, values);\n}\n\nfunction evaluateLogicalCondition(condition: ILogicalCondition, values: IEntityData): boolean {\n switch (condition.operator) {\n case \"and\":\n return condition.conditions.every(c => evaluateCondition(c, values));\n case \"or\":\n return condition.conditions.some(c => evaluateCondition(c, values));\n case \"not\":\n // NOT applies to the first (and typically only) child condition\n return condition.conditions.length > 0\n ? !evaluateCondition(condition.conditions[0], values)\n : false;\n default:\n return false;\n }\n}\n\nfunction evaluateFieldCondition(condition: IFieldCondition, values: IEntityData): boolean {\n const fieldValue = getNestedValue(values, condition.field);\n\n switch (condition.operator) {\n case \"equals\":\n return looseEquals(fieldValue, condition.value);\n case \"notEquals\":\n return !looseEquals(fieldValue, condition.value);\n case \"greaterThan\":\n return toNumber(fieldValue) > toNumber(condition.value);\n case \"lessThan\":\n return toNumber(fieldValue) < toNumber(condition.value);\n case \"greaterThanOrEqual\":\n return toNumber(fieldValue) >= toNumber(condition.value);\n case \"lessThanOrEqual\":\n return toNumber(fieldValue) <= toNumber(condition.value);\n case \"contains\":\n return toString(fieldValue).includes(toString(condition.value));\n case \"notContains\":\n return !toString(fieldValue).includes(toString(condition.value));\n case \"startsWith\":\n return toString(fieldValue).startsWith(toString(condition.value));\n case \"endsWith\":\n return toString(fieldValue).endsWith(toString(condition.value));\n case \"in\":\n return Array.isArray(condition.value)\n ? condition.value.some(v => looseEquals(fieldValue, v))\n : false;\n case \"notIn\":\n return Array.isArray(condition.value)\n ? !condition.value.some(v => looseEquals(fieldValue, v))\n : false;\n case \"isEmpty\":\n return isValueEmpty(fieldValue);\n case \"isNotEmpty\":\n return !isValueEmpty(fieldValue);\n case \"matches\":\n try {\n return new RegExp(toString(condition.value)).test(toString(fieldValue));\n } catch {\n return false;\n }\n case \"arrayContains\":\n return Array.isArray(fieldValue)\n ? fieldValue.some(v => looseEquals(v, condition.value))\n : false;\n case \"arrayNotContains\":\n return Array.isArray(fieldValue)\n ? !fieldValue.some(v => looseEquals(v, condition.value))\n : true;\n case \"arrayLengthEquals\":\n return Array.isArray(fieldValue)\n ? fieldValue.length === toNumber(condition.value)\n : false;\n case \"arrayLengthGreaterThan\":\n return Array.isArray(fieldValue)\n ? fieldValue.length > toNumber(condition.value)\n : false;\n case \"arrayLengthLessThan\":\n return Array.isArray(fieldValue)\n ? fieldValue.length < toNumber(condition.value)\n : false;\n default:\n return false;\n }\n}\n\n/**\n * Extracts all field names referenced in a condition tree.\n */\nexport function extractConditionDependencies(condition: ICondition): string[] {\n const deps = new Set<string>();\n collectDependencies(condition, deps);\n return [...deps];\n}\n\nfunction collectDependencies(condition: ICondition, deps: Set<string>): void {\n if (isLogicalCondition(condition)) {\n condition.conditions.forEach(c => collectDependencies(c, deps));\n } else {\n const fieldRef = (condition as IFieldCondition).field;\n deps.add(fieldRef.includes('.') ? fieldRef.split('.')[0] : fieldRef);\n }\n}\n\n// --- Utility functions ---\n\nfunction getNestedValue(obj: IEntityData, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction looseEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null && b == null) return true;\n if (a == null || b == null) return false;\n return String(a) === String(b);\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const n = Number(value);\n return isNaN(n) ? 0 : n;\n }\n if (value instanceof Date) return value.getTime();\n return 0;\n}\n\nfunction toString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n return String(value);\n}\n\nfunction isValueEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n","import { IEntityData, SubEntityType } from \"../utils\";\n\n/**\n * Value function signature (v2).\n * Used in computed value expressions via $fn.name() syntax.\n */\nexport type ValueFunction = (context: IValueFunctionContext) => SubEntityType;\n\nexport interface IValueFunctionContext {\n fieldName: string;\n fieldValue?: SubEntityType;\n values: IEntityData;\n parentEntity?: IEntityData;\n currentUserId?: string;\n}\n\n// --- Built-in value functions ---\n\nconst defaultValueFunctions: Record<string, ValueFunction> = {\n setDate: () => new Date(),\n setDateIfNull: ({ fieldValue }) => fieldValue ? fieldValue : new Date(),\n setLoggedInUser: ({ currentUserId }) => currentUserId ? { id: currentUserId } : undefined,\n inheritFromParent: ({ fieldName, values }) => {\n const parent = values?.Parent as IEntityData | undefined;\n return parent ? parent[fieldName] as SubEntityType : undefined;\n },\n};\n\nlet valueFunctionRegistry: Record<string, ValueFunction> = { ...defaultValueFunctions };\n\n/** Register custom value functions (merge into registry) */\nexport function registerValueFunctions(custom: Record<string, ValueFunction>): void {\n valueFunctionRegistry = { ...valueFunctionRegistry, ...custom };\n}\n\n/** Get a value function by name */\nexport function getValueFunction(name: string): ValueFunction | undefined {\n return valueFunctionRegistry[name];\n}\n\n/** Execute a named value function */\nexport function executeValueFunction(\n fieldName: string,\n functionName: string,\n values: IEntityData,\n fieldValue?: SubEntityType,\n parentEntity?: IEntityData,\n currentUserId?: string\n): SubEntityType {\n const fn = valueFunctionRegistry[functionName];\n if (fn) {\n return fn({ fieldName, fieldValue, values, parentEntity, currentUserId });\n }\n return undefined;\n}\n\n/** Reset registry to defaults (for testing) */\nexport function resetValueFunctionRegistry(): void {\n valueFunctionRegistry = { ...defaultValueFunctions };\n}\n","import { IEntityData } from \"../utils\";\nimport { getValueFunction } from \"./ValueFunctionRegistry\";\n\n/**\n * Evaluates an expression string against form values.\n *\n * Supports:\n * - $values.fieldName for field references (including nested paths)\n * - $fn.name() for value function calls\n * - $parent.fieldName for parent entity references\n * - $root.fieldName alias for $values.fieldName\n * - Math functions: Math.round, Math.floor, Math.ceil, Math.abs, Math.min, Math.max\n * - Arithmetic: +, -, *, /\n * - Comparison: >, <, >=, <=, ===, !==\n * - Logical: &&, ||\n * - String concatenation via +\n *\n * @example\n * \"$values.quantity * $values.unitPrice\"\n * \"$fn.setDate()\"\n * \"$parent.category\"\n * \"Math.round($values.total * 100) / 100\"\n */\nexport function evaluateExpression(\n expression: string,\n values: IEntityData,\n fieldName?: string,\n parentEntity?: IEntityData,\n currentUserId?: string\n): unknown {\n // Replace $fn.name() calls with their results\n let resolved = expression.replace(\n /\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)/g,\n (_, fnName) => {\n const fn = getValueFunction(fnName);\n if (fn) {\n const result = fn({\n fieldName: fieldName ?? \"\",\n fieldValue: fieldName ? values[fieldName] as string : undefined,\n values,\n parentEntity,\n currentUserId,\n });\n if (result === null || result === undefined) return \"undefined\";\n if (typeof result === \"string\") return JSON.stringify(result);\n if (result instanceof Date) return `new Date(${result.getTime()})`;\n return String(result);\n }\n return \"undefined\";\n }\n );\n\n // Replace $parent.fieldName with parent entity values\n resolved = resolved.replace(\n /\\$parent\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_, fieldPath) => {\n const value = getNestedValue(parentEntity ?? {}, fieldPath);\n if (value === null || value === undefined) return \"undefined\";\n if (typeof value === \"string\") return JSON.stringify(value);\n return String(value);\n }\n );\n\n // Replace $root.fieldName (alias for $values)\n resolved = resolved.replace(\n /\\$root\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_, fieldPath) => {\n const value = getNestedValue(values, fieldPath);\n if (value === null || value === undefined) return \"undefined\";\n if (typeof value === \"string\") return JSON.stringify(value);\n return String(value);\n }\n );\n\n // Replace $values.fieldName with actual values\n resolved = resolved.replace(\n /\\$values\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_, fieldPath) => {\n const value = getNestedValue(values, fieldPath);\n if (value === null || value === undefined) return \"undefined\";\n if (typeof value === \"string\") return JSON.stringify(value);\n return String(value);\n }\n );\n\n // Safe evaluation using Function constructor with restricted scope\n try {\n const safeEval = new Function(\n \"Math\",\n \"Date\",\n `\"use strict\"; return (${resolved});`\n );\n return safeEval(Math, Date);\n } catch {\n return undefined;\n }\n}\n\nfunction getNestedValue(obj: IEntityData, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Extracts field names referenced in an expression via $values.fieldName or $root.fieldName.\n */\nexport function extractExpressionDependencies(expression: string): string[] {\n const deps = new Set<string>();\n const valuesRegex = /\\$(?:values|root)\\.([a-zA-Z_][a-zA-Z0-9_]*)/g;\n let match;\n while ((match = valuesRegex.exec(expression)) !== null) {\n deps.add(match[1]);\n }\n return [...deps];\n}\n\n/**\n * Extracts value function names referenced via $fn.name() syntax.\n */\nexport function extractFunctionDependencies(expression: string): string[] {\n const fns = new Set<string>();\n const fnRegex = /\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)/g;\n let match;\n while ((match = fnRegex.exec(expression)) !== null) {\n fns.add(match[1]);\n }\n return [...fns];\n}\n","/**\n * EventTimeline — Module-level chronological event log for FormDevTools.\n *\n * Logs timestamped events from the rules engine, field changes, and validations.\n */\n\nexport type TimelineEventType = \"field_change\" | \"rule_evaluated\" | \"validation_run\" | \"form_submit\";\n\nexport interface ITimelineEvent {\n timestamp: number;\n type: TimelineEventType;\n fieldName: string;\n details: string;\n}\n\nconst timeline: ITimelineEvent[] = [];\nconst MAX_EVENTS = 500;\n\n/**\n * Log a new event to the timeline.\n */\nexport function logEvent(type: TimelineEventType, fieldName: string, details: string): void {\n timeline.push({ timestamp: Date.now(), type, fieldName, details });\n // Keep bounded to avoid unbounded memory growth\n if (timeline.length > MAX_EVENTS) {\n timeline.splice(0, timeline.length - MAX_EVENTS);\n }\n}\n\n/**\n * Returns a copy of the full timeline.\n */\nexport function getTimeline(): ITimelineEvent[] {\n return [...timeline];\n}\n\n/**\n * Clear all timeline events.\n */\nexport function clearTimeline(): void {\n timeline.length = 0;\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IRule } from \"../types/IRule\";\nimport { IFieldEffect } from \"../types/IFieldEffect\";\nimport { IRuntimeFieldState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IEntityData } from \"../utils\";\nimport { evaluateCondition, extractConditionDependencies } from \"./ConditionEvaluator\";\nimport { extractExpressionDependencies } from \"./ExpressionEngine\";\nimport { logEvent } from \"./EventTimeline\";\n\n/**\n * Builds the dependency graph from field configs.\n * Returns adjacency lists: for each field, which other fields depend on it.\n */\nexport function buildDependencyGraph(\n fields: Record<string, IFieldConfig>\n): Record<string, Set<string>> {\n const graph: Record<string, Set<string>> = {};\n const fieldNames = Object.keys(fields);\n\n for (const name of fieldNames) {\n graph[name] = new Set();\n }\n\n for (const [fieldName, config] of Object.entries(fields)) {\n if (config.rules) {\n for (const rule of config.rules) {\n // Fields referenced in the when condition\n const condDeps = extractConditionDependencies(rule.when);\n for (const dep of condDeps) {\n if (dep in graph) {\n graph[dep].add(fieldName);\n }\n }\n\n // Fields referenced in cross-field effects\n collectEffectTargets(rule.then, fieldName, graph);\n if (rule.else) {\n collectEffectTargets(rule.else, fieldName, graph);\n }\n }\n }\n\n // Computed value dependencies\n if (config.computedValue) {\n const exprDeps = extractExpressionDependencies(config.computedValue);\n for (const dep of exprDeps) {\n if (dep in graph) {\n graph[dep].add(fieldName);\n }\n }\n }\n }\n\n return graph;\n}\n\nfunction collectEffectTargets(\n effect: IFieldEffect,\n ownerField: string,\n graph: Record<string, Set<string>>\n): void {\n if (effect.fields) {\n for (const targetField of Object.keys(effect.fields)) {\n if (targetField in graph) {\n // The field that owns this rule's condition depends on condition fields;\n // the target field is AFFECTED by the owner field's rule\n graph[ownerField]?.add(targetField);\n }\n }\n }\n}\n\n/**\n * Topological sort of field names using Kahn's algorithm.\n * Returns fields in dependency order. Detects cycles.\n */\nexport function topologicalSort(\n graph: Record<string, Set<string>>\n): { sorted: string[]; hasCycle: boolean; cycleFields: string[] } {\n const inDegree: Record<string, number> = {};\n const adjacency: Record<string, string[]> = {};\n const fields = Object.keys(graph);\n\n for (const f of fields) {\n inDegree[f] = 0;\n adjacency[f] = [...graph[f]];\n }\n\n for (const f of fields) {\n for (const dep of adjacency[f]) {\n if (dep in inDegree) {\n inDegree[dep]++;\n }\n }\n }\n\n const queue: string[] = [];\n for (const f of fields) {\n if (inDegree[f] === 0) queue.push(f);\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n for (const neighbor of adjacency[current]) {\n if (neighbor in inDegree) {\n inDegree[neighbor]--;\n if (inDegree[neighbor] === 0) queue.push(neighbor);\n }\n }\n }\n\n const hasCycle = sorted.length < fields.length;\n const cycleFields = hasCycle ? fields.filter(f => !sorted.includes(f)) : [];\n return { sorted, hasCycle, cycleFields };\n}\n\n/**\n * Builds the default runtime field state from static field configs.\n */\nexport function buildDefaultFieldStates(\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n): Record<string, IRuntimeFieldState> {\n const states: Record<string, IRuntimeFieldState> = {};\n const graph = buildDependencyGraph(fields);\n\n for (const [fieldName, config] of Object.entries(fields)) {\n states[fieldName] = {\n type: config.type,\n required: config.required,\n hidden: config.hidden || config.type === \"DynamicFragment\",\n readOnly: areAllFieldsReadonly ? true : config.readOnly,\n validate: config.validate,\n computedValue: config.computedValue,\n confirmInput: config.confirmInput,\n options: config.options,\n label: config.label,\n defaultValue: config.defaultValue,\n computeOnCreateOnly: config.computeOnCreateOnly,\n dependentFields: [...(graph[fieldName] ?? [])],\n dependsOnFields: [],\n activeRuleIds: [],\n };\n }\n\n // Wire up reverse dependencies\n for (const [fieldName, state] of Object.entries(states)) {\n for (const dep of state.dependentFields ?? []) {\n if (states[dep]) {\n states[dep].dependsOnFields = states[dep].dependsOnFields ?? [];\n states[dep].dependsOnFields!.push(fieldName);\n }\n }\n }\n\n return states;\n}\n\n/**\n * Evaluates all rules for all fields against current values.\n * Returns the full runtime form state.\n */\nexport function evaluateAllRules(\n fields: Record<string, IFieldConfig>,\n values: IEntityData,\n areAllFieldsReadonly?: boolean\n): IRuntimeFormState {\n const fieldStates = buildDefaultFieldStates(fields, areAllFieldsReadonly);\n const fieldOrder = Object.keys(fields);\n\n // Apply rules in topological order for correct dependency resolution\n const graph = buildDependencyGraph(fields);\n const { sorted } = topologicalSort(graph);\n const evalOrder = sorted.length > 0 ? sorted : fieldOrder;\n\n let currentOrder = [...fieldOrder];\n\n for (const fieldName of evalOrder) {\n const config = fields[fieldName];\n if (!config?.rules) continue;\n\n const ruleResults = evaluateFieldRules(config.rules, values);\n\n if (fieldStates[fieldName]) {\n fieldStates[fieldName].activeRuleIds = ruleResults.activeRuleIds;\n }\n\n logEvent(\"rule_evaluated\", fieldName, `${config.rules.length} rule(s) evaluated`);\n\n // Apply self-effects\n applyEffectToState(fieldStates, fieldName, ruleResults.selfEffect);\n\n // Apply setValue from then-branch only (stored separately to avoid else contamination)\n if (ruleResults.pendingSetValue !== undefined && fieldStates[fieldName]) {\n fieldStates[fieldName].pendingSetValue = ruleResults.pendingSetValue;\n }\n\n // Apply cross-field effects\n for (const [targetField, effect] of Object.entries(ruleResults.crossEffects)) {\n if (fieldStates[targetField]) {\n applyEffectToState(fieldStates, targetField, effect);\n }\n }\n\n // Apply field order changes\n if (ruleResults.fieldOrder) {\n currentOrder = ruleResults.fieldOrder;\n }\n }\n\n return { fieldStates, fieldOrder: currentOrder };\n}\n\n/**\n * Evaluates rules for fields that are transitively affected by a changed field.\n * Returns only the changed field states (incremental update).\n */\nexport function evaluateAffectedFields(\n changedField: string,\n fields: Record<string, IFieldConfig>,\n values: IEntityData,\n currentState: IRuntimeFormState\n): IRuntimeFormState {\n // Find all transitively affected fields\n const affected = getTransitivelyAffectedFields(changedField, currentState.fieldStates);\n logEvent(\"field_change\", changedField, `${affected.size} affected field(s)`);\n if (affected.size === 0) {\n return currentState;\n }\n\n const updatedStates = { ...currentState.fieldStates };\n let updatedOrder = [...currentState.fieldOrder];\n\n // Re-evaluate affected fields\n for (const fieldName of affected) {\n const config = fields[fieldName];\n if (!config) continue;\n\n // Reset to defaults first\n updatedStates[fieldName] = {\n ...updatedStates[fieldName],\n type: config.type,\n required: config.required,\n hidden: config.hidden || config.type === \"DynamicFragment\",\n readOnly: config.readOnly,\n validate: config.validate,\n computedValue: config.computedValue,\n confirmInput: config.confirmInput,\n options: config.options,\n label: config.label,\n defaultValue: config.defaultValue,\n computeOnCreateOnly: config.computeOnCreateOnly,\n activeRuleIds: [],\n pendingSetValue: undefined,\n };\n }\n\n // Re-apply all rules that could affect the changed fields\n // (from ALL fields, not just the changed one)\n for (const [ownerField, config] of Object.entries(fields)) {\n if (!config.rules) continue;\n\n const ruleResults = evaluateFieldRules(config.rules, values);\n\n // Apply self-effects if this field is affected\n if (affected.has(ownerField) || ownerField === changedField) {\n applyEffectToState(updatedStates, ownerField, ruleResults.selfEffect);\n if (ruleResults.pendingSetValue !== undefined && updatedStates[ownerField]) {\n updatedStates[ownerField].pendingSetValue = ruleResults.pendingSetValue;\n }\n }\n\n // Apply cross-field effects to affected fields\n for (const [targetField, effect] of Object.entries(ruleResults.crossEffects)) {\n if (affected.has(targetField) && updatedStates[targetField]) {\n applyEffectToState(updatedStates, targetField, effect);\n }\n }\n\n if (ruleResults.fieldOrder) {\n updatedOrder = ruleResults.fieldOrder;\n }\n }\n\n return { fieldStates: updatedStates, fieldOrder: updatedOrder };\n}\n\nfunction getTransitivelyAffectedFields(\n changedField: string,\n fieldStates: Record<string, IRuntimeFieldState>\n): Set<string> {\n const affected = new Set<string>();\n const queue = [changedField];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const deps = fieldStates[current]?.dependentFields ?? [];\n for (const dep of deps) {\n if (!affected.has(dep)) {\n affected.add(dep);\n queue.push(dep);\n }\n }\n }\n\n return affected;\n}\n\ninterface IRuleEvalResult {\n selfEffect: IFieldEffect;\n crossEffects: Record<string, IFieldEffect>;\n fieldOrder?: string[];\n activeRuleIds: string[];\n /** Pending setValue from the winning then-branch rule (undefined if no rule fired setValue) */\n pendingSetValue?: { value: unknown };\n}\n\n/**\n * Evaluates an array of rules for a single field.\n * Resolves priority conflicts (higher priority wins).\n */\nfunction evaluateFieldRules(rules: IRule[], values: IEntityData): IRuleEvalResult {\n // Sort by priority (higher first) for conflict resolution\n const sorted = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\n const selfEffect: IFieldEffect = {};\n const crossEffects: Record<string, IFieldEffect> = {};\n let fieldOrder: string[] | undefined;\n const activeRuleIds: string[] = [];\n // setValue is tracked separately: only applies from the then-branch (not else)\n let pendingSetValue: { value: unknown } | undefined;\n\n for (let i = 0; i < sorted.length; i++) {\n const rule = sorted[i];\n const conditionMet = evaluateCondition(rule.when, values);\n if (conditionMet) {\n activeRuleIds.push(rule.id ?? `rule_${i}`);\n }\n const effect = conditionMet ? rule.then : rule.else;\n\n // setValue: only from the then branch, first-write-wins by priority\n if (conditionMet && rule.then?.setValue !== undefined && pendingSetValue === undefined) {\n pendingSetValue = { value: rule.then.setValue };\n }\n\n if (!effect) continue;\n\n // Merge self-effects (first write wins due to priority sort)\n // Note: setValue is intentionally excluded from general merging — handled above\n mergeEffect(selfEffect, effect);\n\n // Merge cross-field effects\n if (effect.fields) {\n for (const [targetField, targetEffect] of Object.entries(effect.fields)) {\n if (!crossEffects[targetField]) {\n crossEffects[targetField] = {};\n }\n mergeEffect(crossEffects[targetField], targetEffect);\n }\n }\n\n // Field order (highest priority rule wins)\n if (effect.fieldOrder && !fieldOrder) {\n fieldOrder = effect.fieldOrder;\n }\n }\n\n return { selfEffect, crossEffects, fieldOrder, activeRuleIds, pendingSetValue };\n}\n\n/**\n * Merges an effect into a target effect (first-write-wins for each property).\n */\nfunction mergeEffect(target: IFieldEffect, source: IFieldEffect): void {\n if (source.required !== undefined && target.required === undefined) {\n target.required = source.required;\n }\n if (source.hidden !== undefined && target.hidden === undefined) {\n target.hidden = source.hidden;\n }\n if (source.readOnly !== undefined && target.readOnly === undefined) {\n target.readOnly = source.readOnly;\n }\n if (source.label !== undefined && target.label === undefined) {\n target.label = source.label;\n }\n const sourceType = source.type ?? source.component;\n const targetType = target.type ?? target.component;\n if (sourceType !== undefined && targetType === undefined) {\n target.type = sourceType;\n }\n if (source.options !== undefined && target.options === undefined) {\n target.options = source.options;\n }\n if (source.validate !== undefined && target.validate === undefined) {\n target.validate = source.validate;\n }\n if (source.computedValue !== undefined && target.computedValue === undefined) {\n target.computedValue = source.computedValue;\n }\n // Note: setValue is intentionally NOT merged here — it is handled via pendingSetValue\n // in evaluateFieldRules to ensure it only applies from the then branch (not else).\n}\n\nfunction applyEffectToState(\n states: Record<string, IRuntimeFieldState>,\n fieldName: string,\n effect: IFieldEffect\n): void {\n const state = states[fieldName];\n if (!state) return;\n\n if (effect.required !== undefined) state.required = effect.required;\n if (effect.hidden !== undefined) state.hidden = effect.hidden;\n if (effect.readOnly !== undefined) state.readOnly = effect.readOnly;\n if (effect.label !== undefined) state.label = effect.label;\n const effectType = effect.type ?? effect.component;\n if (effectType !== undefined) state.type = effectType;\n if (effect.options !== undefined) state.options = effect.options;\n if (effect.validate !== undefined) state.validate = effect.validate;\n if (effect.computedValue !== undefined) state.computedValue = effect.computedValue;\n // Note: setValue is applied via ruleResults.pendingSetValue in evaluateAllRules /\n // evaluateAffectedFields, NOT here — to ensure it only fires from the then branch.\n}\n","import { RulesEngineActionType, RulesEngineAction } from \"../types/IRulesEngineAction\";\nimport { IRulesEngineState } from \"../types/IRuntimeFieldState\";\n\nexport const defaultRulesEngineState: IRulesEngineState = {\n configs: {},\n};\n\nconst rulesEngineReducer = (\n state: IRulesEngineState = defaultRulesEngineState,\n action: RulesEngineAction\n): IRulesEngineState => {\n switch (action.type) {\n case RulesEngineActionType.SET: {\n const configName = action.payload.configName;\n return {\n configs: {\n ...state.configs,\n [configName]: { ...action.payload.formState },\n },\n };\n }\n case RulesEngineActionType.UPDATE: {\n const configName = action.payload.configName;\n const existing = state.configs[configName];\n if (!existing) return state;\n\n const updatedFieldStates = { ...existing.fieldStates };\n Object.keys(action.payload.formState.fieldStates).forEach(fieldName => {\n updatedFieldStates[fieldName] = {\n ...updatedFieldStates[fieldName],\n ...action.payload.formState.fieldStates[fieldName],\n };\n });\n\n return {\n configs: {\n ...state.configs,\n [configName]: {\n fieldStates: updatedFieldStates,\n fieldOrder: action.payload.formState.fieldOrder,\n },\n },\n };\n }\n case RulesEngineActionType.CLEAR: {\n if (action.payload.configName) {\n const { [action.payload.configName]: _, ...remaining } = state.configs;\n return { configs: remaining };\n }\n return defaultRulesEngineState;\n }\n default:\n return state;\n }\n};\n\nexport default rulesEngineReducer;\n","import React from \"react\";\nimport { IInjectedFieldProvider } from \"./IInjectedFieldProvider\";\n\nconst InjectedFieldContext: React.Context<IInjectedFieldProvider> = React.createContext(\n undefined as unknown as IInjectedFieldProvider\n);\n\nexport function UseInjectedFieldContext() {\n const context = React.useContext(InjectedFieldContext);\n if (context === undefined) {\n throw new Error(\n \"UseInjectedFieldContext() was called outside of <InjectedFieldProvider>. \" +\n \"Required hierarchy: <RulesEngineProvider> > <InjectedFieldProvider> > <FormEngine>\"\n );\n }\n return context;\n}\n\n\ninterface InjectedFieldProviderProps {\n /** Optional initial field registry. If provided, fields are set immediately. */\n injectedFields?: Record<string, React.JSX.Element>;\n children?: React.ReactNode;\n}\n\nexport const InjectedFieldProvider: React.FC<InjectedFieldProviderProps> = (\n props: InjectedFieldProviderProps\n): React.JSX.Element => {\n const [injectedFields, setInjectedFields] = React.useState<Record<string, React.JSX.Element>>(\n (props.injectedFields ?? undefined) as unknown as Record<string, React.JSX.Element>\n );\n\n const providerValue: IInjectedFieldProvider = React.useMemo(() => ({\n injectedFields,\n setInjectedFields,\n }), [injectedFields]);\n\n return (\n <InjectedFieldContext.Provider value={providerValue}>\n {props.children}\n </InjectedFieldContext.Provider>\n );\n};\n\n","import { IEntityData } from \"../utils\";\nimport { IValidationRule } from \"../types/IValidationRule\";\nimport { ICondition } from \"../types/ICondition\";\nimport { evaluateCondition } from \"./ConditionEvaluator\";\n\n/**\n * Unified validator function signature.\n * Handles sync, async, and cross-field validation.\n *\n * @param value - The field's current value\n * @param params - Parameters from IValidationRule.params\n * @param context - Full form context (values, field name, abort signal)\n * @returns Error message string, undefined if valid, or a Promise for async\n */\nexport type ValidatorFn = (\n value: unknown,\n params: Record<string, unknown> | undefined,\n context: IValidationContext\n) => string | undefined | Promise<string | undefined>;\n\nexport interface IValidationContext {\n fieldName: string;\n values: IEntityData;\n signal?: AbortSignal;\n}\n\n// --- Built-in validators ---\n\nconst required: ValidatorFn = (value) => {\n if (value === null || value === undefined || (typeof value === \"string\" && value.trim() === \"\")) {\n return \"This field is required\";\n }\n return undefined;\n};\n\nconst email: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value) ? undefined : \"Invalid email address\";\n};\n\nconst phone: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n const phoneRegex = /^[+]?[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/;\n return phoneRegex.test(value) ? undefined : \"Invalid phone number\";\n};\n\nconst url: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n return /(http(s?)):\\/\\//i.test(value) ? undefined : \"Invalid URL\";\n};\n\nconst year: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n const y = parseInt(value, 10);\n if (isNaN(y) || y < 1900 || y > 2100) return \"Invalid year\";\n return undefined;\n};\n\nconst noSpecialCharacters: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n return /[^a-zA-Z0-9\\s\\-_.]/.test(value) ? \"Special characters are not allowed\" : undefined;\n};\n\nconst currency: ValidatorFn = (value) => {\n if (!value && value !== 0) return undefined;\n const str = typeof value === \"string\" ? value : String(value);\n return /^-?\\d{1,}(\\.\\d{1,2})?$/.test(str) ? undefined : \"Invalid currency format\";\n};\n\nconst uniqueInArray: ValidatorFn = (value) => {\n if (!value || !Array.isArray(value)) return undefined;\n const seen = new Set<string>();\n for (const item of value) {\n const str = String(item);\n if (seen.has(str)) return `Duplicate value: ${str}`;\n seen.add(str);\n }\n return undefined;\n};\n\nconst minLength: ValidatorFn = (value, params) => {\n if (value === null || value === undefined || typeof value !== \"string\") return undefined;\n const min = Number(params?.min ?? 0);\n return value.length < min ? `Must be at least ${min} characters` : undefined;\n};\n\nconst maxLength: ValidatorFn = (value, params) => {\n if (!value || typeof value !== \"string\") return undefined;\n const max = Number(params?.max ?? Infinity);\n return value.length > max ? `Must be at most ${max} characters` : undefined;\n};\n\nconst numericRange: ValidatorFn = (value, params) => {\n if (value == null || value === \"\") return undefined;\n const num = typeof value === \"number\" ? value : Number(value);\n if (isNaN(num)) return \"Must be a number\";\n const min = Number(params?.min ?? -Infinity);\n const max = Number(params?.max ?? Infinity);\n if (num < min || num > max) return `Must be between ${min} and ${max}`;\n return undefined;\n};\n\nconst pattern: ValidatorFn = (value, params) => {\n if (!value || typeof value !== \"string\") return undefined;\n const regex = params?.pattern;\n const message = (params?.message as string) ?? \"Invalid format\";\n if (!regex) return undefined;\n try {\n return new RegExp(regex as string).test(value) ? undefined : message;\n } catch {\n return undefined;\n }\n};\n\nconst maxKb: ValidatorFn = (value, params) => {\n if (!value || typeof value !== \"string\") return undefined;\n const maxKbValue = Number(params?.maxKb ?? 150);\n const sizeKb = Math.ceil(new Blob([value]).size / 1000);\n return sizeKb > maxKbValue ? `Content exceeds maximum size of ${maxKbValue}KB` : undefined;\n};\n\nconst exclusiveNumericRange: ValidatorFn = (value, params) => {\n if (value == null || value === \"\") return undefined;\n const num = typeof value === \"number\" ? value : Number(value);\n if (isNaN(num)) return \"Must be a number\";\n const exclMin = params?.exclusiveMin != null ? Number(params.exclusiveMin) : undefined;\n const exclMax = params?.exclusiveMax != null ? Number(params.exclusiveMax) : undefined;\n const min = params?.min != null ? Number(params.min) : undefined;\n const max = params?.max != null ? Number(params.max) : undefined;\n if (exclMin !== undefined && num <= exclMin) return `Must be greater than ${exclMin}`;\n if (exclMax !== undefined && num >= exclMax) return `Must be less than ${exclMax}`;\n if (min !== undefined && num < min) return `Must be at least ${min}`;\n if (max !== undefined && num > max) return `Must be at most ${max}`;\n return undefined;\n};\n\nconst multipleOf: ValidatorFn = (value, params) => {\n if (value == null || value === \"\") return undefined;\n const num = typeof value === \"number\" ? value : Number(value);\n if (isNaN(num)) return \"Must be a number\";\n const factor = Number(params?.factor ?? 1);\n if (factor === 0) return undefined;\n // Use tolerance for floating-point arithmetic\n const remainder = Math.abs(num % factor);\n const tolerance = 1e-10;\n if (remainder > tolerance && Math.abs(remainder - Math.abs(factor)) > tolerance) {\n return `Must be a multiple of ${factor}`;\n }\n return undefined;\n};\n\nconst requiredIf: ValidatorFn = (value, params, context) => {\n if (!params?.field || !params?.values) return undefined;\n const depValue = context.values[params.field as string];\n const allowedValues = params.values as string[];\n if (allowedValues.includes(String(depValue)) && (value == null || value === \"\")) {\n return \"This field is required\";\n }\n return undefined;\n};\n\n// --- Validator Metadata ---\n\n/** Metadata describing a validator for use in designer UIs and documentation. */\nexport interface IValidatorMetadata {\n /** Human-readable display name */\n label: string;\n /** Optional description of what the validator checks */\n description?: string;\n /** Named parameters the validator accepts */\n params?: Record<string, {\n type: \"string\" | \"number\" | \"boolean\";\n label: string;\n required?: boolean;\n }>;\n}\n\nlet validatorMetadataRegistry: Record<string, IValidatorMetadata> = {};\n\n/** Register metadata for a custom (or built-in) validator */\nexport function registerValidatorMetadata(name: string, metadata: IValidatorMetadata): void {\n validatorMetadataRegistry = { ...validatorMetadataRegistry, [name]: metadata };\n}\n\n/** Get metadata for a specific validator by name */\nexport function getValidatorMetadata(name: string): IValidatorMetadata | undefined {\n return validatorMetadataRegistry[name];\n}\n\n/** Get all registered validator metadata */\nexport function getAllValidatorMetadata(): Record<string, IValidatorMetadata> {\n return { ...validatorMetadataRegistry };\n}\n\n/** Reset validator metadata registry (for testing) */\nexport function resetValidatorMetadataRegistry(): void {\n validatorMetadataRegistry = {};\n}\n\n// --- Registry ---\n\nconst defaultValidators: Record<string, ValidatorFn> = {\n required,\n email,\n phone,\n url,\n year,\n noSpecialCharacters,\n currency,\n uniqueInArray,\n minLength,\n maxLength,\n numericRange,\n pattern,\n maxKb,\n exclusiveNumericRange,\n multipleOf,\n requiredIf,\n // Legacy name aliases\n EmailValidation: email,\n PhoneNumberValidation: phone,\n YearValidation: year,\n isValidUrl: url,\n NoSpecialCharactersValidation: noSpecialCharacters,\n CurrencyValidation: currency,\n UniqueInArrayValidation: uniqueInArray,\n Max150KbValidation: (v, _p, c) => maxKb(v, { maxKb: 150 }, c),\n Max32KbValidation: (v, _p, c) => maxKb(v, { maxKb: 32 }, c),\n};\n\nlet validatorRegistry: Record<string, ValidatorFn> = { ...defaultValidators };\n\n/** Register custom validators (merge into registry) */\nexport function registerValidators(custom: Record<string, ValidatorFn>): void {\n validatorRegistry = { ...validatorRegistry, ...custom };\n}\n\n/** Get a validator by name */\nexport function getValidator(name: string): ValidatorFn | undefined {\n return validatorRegistry[name];\n}\n\n/** Get a copy of the full registry */\nexport function getValidatorRegistry(): Record<string, ValidatorFn> {\n return { ...validatorRegistry };\n}\n\n/** Reset registry to defaults (for testing) */\nexport function resetValidatorRegistry(): void {\n validatorRegistry = { ...defaultValidators };\n}\n\n/**\n * Run all validation rules for a field value.\n * Handles sync, async, and conditional validation.\n */\nexport async function runValidations(\n value: unknown,\n rules: IValidationRule[],\n context: IValidationContext\n): Promise<string | undefined> {\n for (const rule of rules) {\n if (context.signal?.aborted) return undefined;\n\n // Check conditional validation\n if (rule.when) {\n if (!evaluateCondition(rule.when, context.values)) continue;\n }\n\n const validator = getValidator(rule.name);\n if (!validator) continue;\n\n const result = validator(value, rule.params, context);\n const message = result instanceof Promise ? await result : result;\n\n if (message) {\n return rule.message ?? message;\n }\n }\n return undefined;\n}\n\n/**\n * Run only sync validation rules (no await, fast fail).\n */\nexport function runSyncValidations(\n value: unknown,\n rules: IValidationRule[],\n context: IValidationContext\n): string | undefined {\n for (const rule of rules) {\n if (rule.async) continue;\n\n if (rule.when) {\n if (!evaluateCondition(rule.when, context.values)) continue;\n }\n\n const validator = getValidator(rule.name);\n if (!validator) continue;\n\n const result = validator(value, rule.params, context);\n if (typeof result === \"string\") {\n return rule.message ?? result;\n }\n }\n return undefined;\n}\n\n// --- Factory helpers for common validators ---\n\nexport function createMinLengthRule(min: number, message?: string): IValidationRule {\n return { name: \"minLength\", params: { min }, message };\n}\n\nexport function createMaxLengthRule(max: number, message?: string): IValidationRule {\n return { name: \"maxLength\", params: { max }, message };\n}\n\nexport function createNumericRangeRule(min: number, max: number, message?: string): IValidationRule {\n return { name: \"numericRange\", params: { min, max }, message };\n}\n\nexport function createPatternRule(pattern: string, message: string): IValidationRule {\n return { name: \"pattern\", params: { pattern, message } };\n}\n\nexport function createRequiredIfRule(\n field: string,\n values: string[],\n message?: string\n): IValidationRule {\n return { name: \"requiredIf\", params: { field, values }, message };\n}\n","import { IEntityData, SubEntityType, isEmpty, isNull, isStringEmpty } from \"../utils\";\nimport { UseFormSetValue } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IConfirmInputModalProps } from \"../types/IConfirmInputModalProps\";\nimport { IFieldToRender } from \"../types/IFieldToRender\";\nimport { IRuntimeFieldState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IOption } from \"../types/IOption\";\nimport { evaluateAllRules } from \"./RuleEngine\";\nimport { runSyncValidations, runValidations, IValidationContext } from \"./ValidationRegistry\";\nimport { executeValueFunction } from \"./ValueFunctionRegistry\";\nimport { evaluateExpression } from \"./ExpressionEngine\";\nimport { logEvent } from \"./EventTimeline\";\n\nexport const GetChildEntity = (\n entityId?: string,\n entity?: IEntityData,\n entityPath?: string,\n idField: string = \"id\"\n): IEntityData | undefined => {\n if (!entity || !entityPath) return undefined;\n const childValues = (entity[entityPath] as IEntityData[])?.filter(child => child[idField] === entityId);\n return childValues?.length === 1 ? { ...childValues[0], Parent: { ...entity } } : undefined;\n};\n\nexport const IsExpandVisible = (\n fieldStates: Record<string, IRuntimeFieldState>,\n expandCutoffCount: number = 12\n): boolean => {\n let count = 0;\n Object.keys(fieldStates).forEach(field => {\n if (!fieldStates[field].hidden) count += 1;\n });\n return count > expandCutoffCount;\n};\n\nexport const GetConfirmInputModalProps = (\n dirtyFieldNames: string[],\n fieldStates: Record<string, IRuntimeFieldState>\n): IConfirmInputModalProps => {\n const confirmInputModalProps: IConfirmInputModalProps = {};\n\n dirtyFieldNames?.forEach(fieldName => {\n fieldStates[fieldName]?.dependentFields?.forEach(dependentFieldName => {\n if (fieldStates[dependentFieldName]?.confirmInput) {\n if (confirmInputModalProps.confirmInputsTriggeredBy === undefined) {\n confirmInputModalProps.confirmInputsTriggeredBy = fieldName;\n confirmInputModalProps.dependentFieldNames = [dependentFieldName];\n } else {\n confirmInputModalProps.dependentFieldNames!.push(dependentFieldName);\n }\n }\n });\n });\n\n confirmInputModalProps.otherDirtyFields = dirtyFieldNames?.filter(\n fieldName =>\n !confirmInputModalProps.dependentFieldNames?.includes(fieldName) &&\n fieldName !== confirmInputModalProps.confirmInputsTriggeredBy\n );\n\n return confirmInputModalProps;\n};\n\ninterface IExecuteComputedValue {\n fieldName: string;\n expression: string;\n}\n\nexport const GetComputedValuesOnDirtyFields = (\n dirtyFieldNames: string[],\n fieldStates: Record<string, IRuntimeFieldState>\n): IExecuteComputedValue[] => {\n const computedValues: IExecuteComputedValue[] = [];\n\n dirtyFieldNames?.forEach(fieldName => {\n fieldStates[fieldName]?.dependentFields?.forEach(dependentFieldName => {\n const state = fieldStates[dependentFieldName];\n if (\n state?.computedValue &&\n !state.computeOnCreateOnly &&\n !dirtyFieldNames.includes(dependentFieldName)\n ) {\n computedValues.push({\n fieldName: dependentFieldName,\n expression: state.computedValue,\n });\n }\n });\n });\n\n return computedValues;\n};\n\nexport const GetComputedValuesOnCreate = (\n fieldStates: Record<string, IRuntimeFieldState>\n): IExecuteComputedValue[] => {\n const computedValues: IExecuteComputedValue[] = [];\n\n Object.keys(fieldStates).forEach(fieldName => {\n const state = fieldStates[fieldName];\n if (state.computedValue && state.computeOnCreateOnly) {\n computedValues.push({\n fieldName,\n expression: state.computedValue,\n });\n }\n });\n\n return computedValues;\n};\n\nexport const ExecuteComputedValue = (\n expression: string,\n values: IEntityData,\n fieldName?: string,\n parentEntity?: IEntityData,\n currentUserId?: string\n): SubEntityType => {\n return evaluateExpression(expression, values, fieldName, parentEntity, currentUserId) as SubEntityType;\n};\n\nexport const CheckFieldValidationRules = (\n value: unknown,\n fieldName: string,\n entityData: IEntityData,\n state: IRuntimeFieldState\n): string | undefined => {\n if (!state.validate || state.validate.length === 0) return undefined;\n const context: IValidationContext = { fieldName, values: entityData };\n const result = runSyncValidations(value, state.validate, context);\n logEvent(\"validation_run\", fieldName, result ? `failed: ${result}` : \"passed\");\n return result;\n};\n\nexport const CheckAsyncFieldValidationRules = async (\n value: unknown,\n fieldName: string,\n entityData: IEntityData,\n state: IRuntimeFieldState,\n signal?: AbortSignal\n): Promise<string | undefined> => {\n if (!state.validate || state.validate.length === 0) return undefined;\n const context: IValidationContext = { fieldName, values: entityData, signal };\n return runValidations(value, state.validate, context);\n};\n\nexport const CheckValidDropdownOptions = (\n fieldStates: Record<string, IRuntimeFieldState>,\n formValues: IEntityData,\n setValue: UseFormSetValue<IEntityData>\n) => {\n if (isEmpty(fieldStates) || isEmpty(formValues)) return;\n\n Object.keys(fieldStates).forEach(fieldName => {\n const { type, options } = fieldStates[fieldName];\n if (\n (type === \"Dropdown\" || type === \"StatusDropdown\") &&\n !isNull(formValues[fieldName]) &&\n options &&\n options.findIndex(o => String(o.value) === String(formValues[fieldName])) === -1\n ) {\n setValue(`${fieldName}` as const, null, { shouldDirty: false });\n } else if (type === \"Multiselect\" && !isNull(formValues[fieldName]) && options) {\n const filteredValues = (formValues[fieldName] as string[])?.filter(\n val => options.some(o => String(o.value) === val)\n );\n if (filteredValues?.length !== (formValues[fieldName] as string[])?.length) {\n setValue(`${fieldName}` as const, filteredValues, { shouldDirty: false });\n }\n }\n });\n};\n\nexport const CheckDefaultValues = (\n fieldStates: Record<string, IRuntimeFieldState>,\n formValues: IEntityData,\n setValue: UseFormSetValue<IEntityData>\n) => {\n if (isEmpty(fieldStates) || isEmpty(formValues)) return;\n\n Object.keys(fieldStates).forEach(fieldName => {\n const { defaultValue, hidden } = fieldStates[fieldName];\n if (!isNull(defaultValue) && isNull(formValues[fieldName]) && !hidden) {\n setValue(`${fieldName}` as const, defaultValue, { shouldDirty: true });\n }\n });\n};\n\nexport const InitOnCreateFormState = (\n configName: string,\n fields: Record<string, IFieldConfig>,\n defaultValues: IEntityData,\n parentEntity: IEntityData,\n userId: string,\n setValue: UseFormSetValue<IEntityData>,\n initFormState: (\n configName: string,\n defaultValues: IEntityData,\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n ) => IRuntimeFormState\n): { formState: IRuntimeFormState; initEntityData: IEntityData } => {\n const initEntityData: IEntityData = { ...defaultValues, Parent: { ...parentEntity } };\n\n // Execute computed values for create\n for (const [fieldName, config] of Object.entries(fields)) {\n if (config.computedValue && config.computeOnCreateOnly) {\n const result = ExecuteComputedValue(\n config.computedValue,\n initEntityData,\n fieldName,\n parentEntity,\n userId\n );\n if (result !== undefined) {\n setValue(`${fieldName}` as const, result);\n initEntityData[fieldName] = result;\n }\n }\n if (config.defaultValue !== undefined && isNull(initEntityData[fieldName])) {\n setValue(`${fieldName}` as const, config.defaultValue);\n initEntityData[fieldName] = config.defaultValue;\n }\n }\n\n return {\n formState: initFormState(configName, initEntityData, fields, false),\n initEntityData,\n };\n};\n\nexport const InitOnEditFormState = (\n configName: string,\n fields: Record<string, IFieldConfig>,\n defaultValues: IEntityData,\n areAllFieldsReadonly: boolean,\n initFormState: (\n configName: string,\n defaultValues: IEntityData,\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n ) => IRuntimeFormState\n): { formState: IRuntimeFormState; initEntityData: IEntityData } => {\n return {\n formState: initFormState(configName, defaultValues, fields, areAllFieldsReadonly),\n initEntityData: defaultValues,\n };\n};\n\nexport const ShowField = (filterText?: string, value?: SubEntityType, label?: string): boolean => {\n if (!filterText) return true;\n const valueStr = JSON.stringify(value)?.toLowerCase();\n const labelStr = label?.toLowerCase();\n return (valueStr?.includes(filterText.toLowerCase()) ?? false) ||\n (labelStr?.includes(filterText.toLowerCase()) ?? false);\n};\n\nexport const GetFieldsToRender = (\n fieldRenderLimit: number,\n fieldOrder: string[],\n fieldStates?: Record<string, IRuntimeFieldState>\n): IFieldToRender[] => {\n if (fieldRenderLimit) {\n const fieldsToRender: IFieldToRender[] = [];\n let count = 0;\n fieldOrder.forEach(fieldName => {\n if (fieldStates?.[fieldName]?.hidden) return;\n if (count === fieldRenderLimit) {\n fieldsToRender.push({ fieldName, softHidden: true });\n } else {\n fieldsToRender.push({ fieldName, softHidden: false });\n count += 1;\n }\n });\n return fieldsToRender;\n }\n return fieldOrder?.map(fieldName => ({ fieldName, softHidden: false }));\n};\n\n/** Sort options alphabetically by label */\nexport const SortOptions = (options: IOption[]): IOption[] => {\n return [...options].sort((a, b) => {\n const aLabel = a.label?.toLowerCase() ?? \"\";\n const bLabel = b.label?.toLowerCase() ?? \"\";\n return aLabel < bLabel ? -1 : aLabel > bLabel ? 1 : 0;\n });\n};\n","import { IOption } from \"../types/IOption\";\n\n/** Sort options alphabetically by label */\nexport function SortOptions(options: IOption[]): IOption[] {\n return [...options].sort((a, b) => {\n const aLabel = a.label?.toLowerCase() ?? \"\";\n const bLabel = b.label?.toLowerCase() ?? \"\";\n return aLabel < bLabel ? -1 : aLabel > bLabel ? 1 : 0;\n });\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { buildDependencyGraph, topologicalSort } from \"./RuleEngine\";\nimport { extractConditionDependencies } from \"./ConditionEvaluator\";\n\nexport interface ICycleError {\n type: \"dependency\" | \"self\";\n fields: string[];\n message: string;\n}\n\n/**\n * Detects circular dependencies in field rules using Kahn's algorithm.\n * Operates on the dependency graph built from IFieldConfig.rules.\n */\nexport function detectDependencyCycles(\n fields: Record<string, IFieldConfig>\n): ICycleError[] {\n const errors: ICycleError[] = [];\n const graph = buildDependencyGraph(fields);\n const { hasCycle, cycleFields } = topologicalSort(graph);\n\n if (hasCycle) {\n errors.push({\n type: \"dependency\",\n fields: cycleFields,\n message: `Circular dependency detected among fields: ${cycleFields.join(\", \")}`,\n });\n }\n\n return errors;\n}\n\n/**\n * Detects self-dependencies (a field's rule references itself in a way that causes loops).\n */\nexport function detectSelfDependencies(\n fields: Record<string, IFieldConfig>\n): ICycleError[] {\n const errors: ICycleError[] = [];\n\n for (const [fieldName, config] of Object.entries(fields)) {\n if (!config.rules) continue;\n for (const rule of config.rules) {\n // Check if the rule's condition references itself AND its effect targets itself\n const condDeps = extractConditionDependencies(rule.when);\n const selfInCondition = condDeps.includes(fieldName);\n\n if (selfInCondition && rule.then.fields?.[fieldName]) {\n errors.push({\n type: \"self\",\n fields: [fieldName],\n message: `Field \"${fieldName}\" has a rule that both depends on and modifies itself`,\n });\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Validates the full dependency graph of field configs.\n * Logs warnings in development, returns errors for programmatic use.\n */\nexport function validateDependencyGraph(\n fields: Record<string, IFieldConfig>\n): ICycleError[] {\n const errors: ICycleError[] = [];\n\n errors.push(...detectDependencyCycles(fields));\n errors.push(...detectSelfDependencies(fields));\n\n // Log warnings in development\n try {\n if (typeof globalThis !== \"undefined\" && (globalThis as Record<string, unknown>).__DEV__ !== false) {\n for (const error of errors) {\n console.warn(`[form-engine] ${error.message}`);\n }\n }\n } catch {\n // Silently ignore\n }\n\n return errors;\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { getValidator } from \"./ValidationRegistry\";\nimport { detectDependencyCycles, detectSelfDependencies } from \"./DependencyGraphValidator\";\nimport { extractConditionDependencies } from \"./ConditionEvaluator\";\n\nexport interface IConfigValidationError {\n type:\n | \"missing_rule_target\"\n | \"unregistered_component\"\n | \"unregistered_validator\"\n | \"circular_dependency\"\n | \"self_dependency\"\n | \"missing_options\"\n | \"invalid_condition\";\n fieldName: string;\n message: string;\n details?: string;\n}\n\n/**\n * Validates field configs for common issues at dev time.\n *\n * Checks:\n * - Rule conditions reference existing fields\n * - Cross-field effects target existing fields\n * - Component types are registered (if registry provided)\n * - Validators are registered\n * - Dropdown fields have options or rules providing them\n * - No circular/self dependencies\n */\nexport function validateFieldConfigs(\n fields: Record<string, IFieldConfig>,\n registeredComponents?: Set<string>\n): IConfigValidationError[] {\n const errors: IConfigValidationError[] = [];\n const fieldNames = new Set(Object.keys(fields));\n\n for (const [fieldName, config] of Object.entries(fields)) {\n // Check rule condition field references\n if (config.rules) {\n for (const rule of config.rules) {\n const condDeps = extractConditionDependencies(rule.when);\n for (const dep of condDeps) {\n if (!fieldNames.has(dep)) {\n errors.push({\n type: \"missing_rule_target\",\n fieldName,\n message: `Field \"${fieldName}\" has a rule condition referencing non-existent field \"${dep}\"`,\n details: dep,\n });\n }\n }\n\n // Check cross-field effect targets\n if (rule.then.fields) {\n for (const target of Object.keys(rule.then.fields)) {\n if (!fieldNames.has(target)) {\n errors.push({\n type: \"missing_rule_target\",\n fieldName,\n message: `Field \"${fieldName}\" has a rule effect targeting non-existent field \"${target}\"`,\n details: target,\n });\n }\n }\n }\n if (rule.else?.fields) {\n for (const target of Object.keys(rule.else.fields)) {\n if (!fieldNames.has(target)) {\n errors.push({\n type: \"missing_rule_target\",\n fieldName,\n message: `Field \"${fieldName}\" has a rule else-effect targeting non-existent field \"${target}\"`,\n details: target,\n });\n }\n }\n }\n }\n }\n\n // Check component types are registered\n if (registeredComponents && config.type && !registeredComponents.has(config.type)) {\n errors.push({\n type: \"unregistered_component\",\n fieldName,\n message: `Field \"${fieldName}\" uses unregistered component type \"${config.type}\". Available: ${[...registeredComponents].join(\", \")}`,\n details: config.type,\n });\n }\n\n // Check validator names\n if (config.validate) {\n for (const rule of config.validate) {\n if (!getValidator(rule.name)) {\n errors.push({\n type: \"unregistered_validator\",\n fieldName,\n message: `Field \"${fieldName}\" references unregistered validator \"${rule.name}\"`,\n details: rule.name,\n });\n }\n }\n }\n\n // Check dropdown fields have options\n if (\n (config.type === \"Dropdown\" || config.type === \"StatusDropdown\" || config.type === \"Multiselect\") &&\n (!config.options || config.options.length === 0) &&\n !hasRuleProvidingOptions(fieldName, fields)\n ) {\n errors.push({\n type: \"missing_options\",\n fieldName,\n message: `Field \"${fieldName}\" is a ${config.type} but has no options configured and no rules providing options`,\n });\n }\n }\n\n // Check for circular/self dependencies\n const cycleErrors = detectDependencyCycles(fields);\n for (const cycleError of cycleErrors) {\n errors.push({\n type: \"circular_dependency\",\n fieldName: cycleError.fields[0] ?? \"\",\n message: cycleError.message,\n });\n }\n\n const selfErrors = detectSelfDependencies(fields);\n for (const selfError of selfErrors) {\n errors.push({\n type: \"self_dependency\",\n fieldName: selfError.fields[0] ?? \"\",\n message: selfError.message,\n });\n }\n\n return errors;\n}\n\n/** Checks if any rule provides options for a field */\nfunction hasRuleProvidingOptions(\n targetFieldName: string,\n fields: Record<string, IFieldConfig>\n): boolean {\n for (const config of Object.values(fields)) {\n if (config.rules) {\n for (const rule of config.rules) {\n if (rule.then.fields?.[targetFieldName]?.options) return true;\n if (rule.else?.fields?.[targetFieldName]?.options) return true;\n }\n }\n }\n return false;\n}\n","import React from \"react\";\nimport { IWizardConfig, IWizardStep } from \"../types/IWizardConfig\";\nimport { IEntityData } from \"../utils\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { getVisibleSteps, getStepFields, isStepValid } from \"../helpers/WizardHelper\";\nimport { FormStrings } from \"../strings\";\n\nexport interface IWizardNavigationProps {\n steps: IWizardStep[];\n currentStepIndex: number;\n goToStep: (index: number) => void;\n canGoNext: boolean;\n canGoPrev: boolean;\n goNext: () => void;\n goPrev: () => void;\n}\n\nexport interface IWizardStepHeaderProps {\n step: IWizardStep;\n stepIndex: number;\n totalSteps: number;\n}\n\nexport interface IWizardFormProps {\n wizardConfig: IWizardConfig;\n entityData: IEntityData;\n fieldStates?: Record<string, IRuntimeFieldState>;\n errors?: Record<string, unknown>;\n renderStepContent: (fields: string[]) => React.ReactNode;\n renderStepNavigation?: (props: IWizardNavigationProps) => React.ReactNode;\n renderStepHeader?: (props: IWizardStepHeaderProps) => React.ReactNode;\n onStepChange?: (fromIndex: number, toIndex: number) => void;\n /** Analytics callback for wizard step changes. */\n onAnalyticsStepChange?: (fromStep: number, toStep: number) => void;\n}\n\nexport const WizardForm: React.FC<IWizardFormProps> = (props) => {\n const {\n wizardConfig, entityData, fieldStates, errors,\n renderStepContent, renderStepNavigation, renderStepHeader, onStepChange, onAnalyticsStepChange,\n } = props;\n\n const [currentStepIndex, setCurrentStepIndex] = React.useState(0);\n\n const visibleSteps = React.useMemo(\n () => getVisibleSteps(wizardConfig.steps, entityData),\n [wizardConfig.steps, entityData]\n );\n\n const currentStep = visibleSteps[currentStepIndex];\n const currentFields = currentStep ? getStepFields(currentStep, fieldStates) : [];\n const canGoNext = currentStepIndex < visibleSteps.length - 1;\n const canGoPrev = currentStepIndex > 0;\n\n const goToStep = React.useCallback((index: number) => {\n if (index >= 0 && index < visibleSteps.length) {\n if (wizardConfig.validateOnStepChange && errors && currentStep) {\n if (!isStepValid(currentStep, errors)) return;\n }\n const prevIndex = currentStepIndex;\n setCurrentStepIndex(index);\n onStepChange?.(prevIndex, index);\n onAnalyticsStepChange?.(prevIndex, index);\n }\n }, [visibleSteps.length, currentStepIndex, wizardConfig.validateOnStepChange, errors, currentStep, onStepChange, onAnalyticsStepChange]);\n\n const goNext = React.useCallback(() => { if (canGoNext) goToStep(currentStepIndex + 1); }, [canGoNext, currentStepIndex, goToStep]);\n const goPrev = React.useCallback(() => { if (canGoPrev) goToStep(currentStepIndex - 1); }, [canGoPrev, currentStepIndex, goToStep]);\n\n const stepAnnouncement = currentStep\n ? `${FormStrings.stepOf(currentStepIndex + 1, visibleSteps.length)}${currentStep.title ? `: ${currentStep.title}` : \"\"}`\n : \"\";\n\n if (!currentStep) return null;\n\n return (\n <div className=\"wizard-form\" role=\"group\" aria-label={FormStrings.formWizard}>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }} data-testid=\"wizard-step-live-region\">\n {stepAnnouncement}\n </div>\n {renderStepHeader?.({ step: currentStep, stepIndex: currentStepIndex, totalSteps: visibleSteps.length })}\n <div className=\"wizard-step-content\" aria-current=\"step\">\n {renderStepContent(currentFields)}\n </div>\n {renderStepNavigation?.({ steps: visibleSteps, currentStepIndex, goToStep, canGoNext, canGoPrev, goNext, goPrev })}\n </div>\n );\n};\n\n","import { IEntityData } from \"../utils\";\nimport { IWizardStep } from \"../types/IWizardConfig\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { evaluateCondition } from \"./ConditionEvaluator\";\n\nexport function getVisibleSteps(\n steps: IWizardStep[],\n entityData: IEntityData\n): IWizardStep[] {\n return steps.filter(step => {\n if (!step.visibleWhen) return true;\n return evaluateCondition(step.visibleWhen, entityData);\n });\n}\n\nexport function getStepFields(\n step: IWizardStep,\n fieldStates?: Record<string, IRuntimeFieldState>\n): string[] {\n if (!fieldStates) return step.fields;\n return step.fields.filter(fieldName => {\n const state = fieldStates[fieldName];\n return !state?.hidden;\n });\n}\n\nexport function getStepFieldOrder(\n steps: IWizardStep[],\n entityData: IEntityData\n): string[] {\n const visibleSteps = getVisibleSteps(steps, entityData);\n return visibleSteps.flatMap(step => step.fields);\n}\n\nexport function validateStepFields(\n step: IWizardStep,\n errors: Record<string, unknown>\n): string[] {\n return step.fields.filter(fieldName => fieldName in errors);\n}\n\nexport function isStepValid(\n step: IWizardStep,\n errors: Record<string, unknown>\n): boolean {\n return validateStepFields(step, errors).length === 0;\n}\n\nexport function getStepIndex(\n steps: IWizardStep[],\n stepId: string\n): number {\n return steps.findIndex(s => s.id === stepId);\n}\n","import React from \"react\";\nimport { useFieldArray, useFormContext } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { FormStrings } from \"../strings\";\n\nexport interface IFieldArrayProps {\n fieldName: string;\n config: IFieldConfig;\n renderItem: (itemFieldNames: string[], index: number, remove: () => void) => React.ReactNode;\n renderAddButton?: (append: () => void, canAdd: boolean) => React.ReactNode;\n}\n\nexport const FieldArray: React.FC<IFieldArrayProps> = (props) => {\n const { fieldName, config, renderItem, renderAddButton } = props;\n const { control } = useFormContext();\n const { fields, append, remove } = useFieldArray({ control, name: fieldName });\n\n const canAdd = config.maxItems ? fields.length < config.maxItems : true;\n const canRemove = config.minItems ? fields.length > config.minItems : true;\n\n const handleAppend = React.useCallback(() => {\n if (canAdd) append({});\n }, [canAdd, append]);\n\n const handleRemove = React.useCallback((index: number) => {\n if (canRemove) remove(index);\n }, [canRemove, remove]);\n\n const itemFieldNames = React.useMemo(\n () => config.items ? Object.keys(config.items) : [],\n [config.items]\n );\n\n return (\n <div className=\"field-array\" role=\"group\" aria-label={config.label || fieldName}>\n {fields.map((field, index) => (\n <div key={field.id} className=\"field-array-item\" role=\"group\" aria-label={FormStrings.itemOfTotal(index + 1, fields.length, config.label || fieldName)}>\n {renderItem(\n itemFieldNames.map(name => `${fieldName}.${index}.${name}`),\n index,\n () => handleRemove(index)\n )}\n </div>\n ))}\n {renderAddButton?.(handleAppend, canAdd)}\n </div>\n );\n};\n\n","import { IEntityData, SubEntityType, isEmpty } from \"../utils\";\nimport React from \"react\";\nimport { FormProvider, FormState, useForm } from \"react-hook-form\";\nimport { FormConstants } from \"../constants\";\nimport {\n CheckDefaultValues,\n CheckValidDropdownOptions,\n ExecuteComputedValue,\n GetChildEntity,\n GetConfirmInputModalProps,\n GetComputedValuesOnDirtyFields,\n InitOnCreateFormState,\n InitOnEditFormState,\n IsExpandVisible,\n} from \"../helpers/InlineFormHelper\";\nimport { IRulesEngineState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IConfirmInputModalProps } from \"../types/IConfirmInputModalProps\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IFormConfig } from \"../types/IFormConfig\";\nimport { IFormEngineSharedProps } from \"../types/IFormEngineSharedProps\";\nimport { UseRulesEngineContext } from \"../providers/RulesEngineProvider\";\nimport { FormStrings } from \"../strings\";\nimport { useFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport ConfirmInputsModal from \"./ConfirmInputsModal\";\nimport { FormFields } from \"./InlineFormFields\";\n\ninterface IFormEngineProps extends IFormEngineSharedProps {\n /** v2 form config (preferred). If provided, fieldConfigs is ignored. */\n formConfig?: IFormConfig;\n /** v1-style field configs (for migration). Use formConfig instead. */\n fieldConfigs?: Record<string, IFieldConfig>;\n defaultValues: IEntityData;\n isChildEntity?: boolean;\n saveData?: (entityData: IEntityData, dirtyFieldNames?: string[]) => Promise<IEntityData>;\n saveTimeoutMs?: number;\n maxSaveRetries?: number;\n renderExpandButton?: (props: { isExpanded: boolean; onToggle: () => void }) => React.JSX.Element;\n renderFilterInput?: (props: { onChange: (value: string) => void }) => React.JSX.Element;\n renderDialog?: (props: { isOpen: boolean; onSave: () => void; onCancel: () => void; children: React.ReactNode }) => React.JSX.Element;\n isManualSave?: boolean;\n renderSaveButton?: (props: { onSave: () => void; isDirty: boolean; isValid: boolean; isSubmitting: boolean }) => React.ReactNode;\n formErrors?: string[];\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n}\n\nexport const FormEngine: React.FC<IFormEngineProps> = (props: IFormEngineProps): React.JSX.Element => {\n const {\n configName,\n entityId,\n entityType,\n programName,\n parentEntityId,\n parentEntityType,\n entityPath,\n expandCutoffCount,\n formConfig,\n defaultValues,\n areAllFieldsReadonly,\n collapsedMaxHeight,\n isCreate,\n parentEntity,\n isChildEntity,\n enableFilter,\n currentUserId,\n onSaveError,\n isManualSave = false,\n saveTimeoutMs = 30000,\n maxSaveRetries = 3,\n renderExpandButton,\n renderFilterInput,\n renderDialog,\n renderSaveButton,\n formErrors,\n renderLabel,\n renderError,\n renderStatus,\n } = props;\n\n // Support both v2 formConfig and v1 fieldConfigs\n const fields = formConfig?.fields ?? props.fieldConfigs ?? {};\n const formSettings = formConfig?.settings;\n const effectiveManualSave = formSettings?.manualSave ?? isManualSave;\n const effectiveSaveTimeout = formSettings?.saveTimeoutMs ?? saveTimeoutMs;\n const effectiveMaxRetries = formSettings?.maxSaveRetries ?? maxSaveRetries;\n const effectiveExpandCutoff = formSettings?.expandCutoffCount ?? expandCutoffCount;\n const analytics = useFormAnalytics(formSettings?.analytics);\n\n const saveData = props.saveData\n ? props.saveData\n : (): Promise<IEntityData> => Promise.resolve({} as IEntityData);\n\n const { initFormState, processFieldChange, rulesState } = UseRulesEngineContext();\n\n const saveTimeoutDelay = React.useRef<number | undefined>(undefined);\n const saveTimeout = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const confirmInputModalProps = React.useRef<IConfirmInputModalProps | undefined>(undefined);\n const saveAbortControllerRef = React.useRef<AbortController | undefined>(undefined);\n const [isExpanded, setIsExpanded] = React.useState<boolean>(false);\n const [expandEnabled, setExpandEnabled] = React.useState<boolean>();\n const [inputFieldsConfirmed, setInputFieldsConfirmed] = React.useState<boolean>(true);\n const [filterText, setFilterText] = React.useState<string>();\n const [statusMessage, setStatusMessage] = React.useState<string>(\"\");\n\n const formMethods = useForm({ mode: \"onChange\", defaultValues });\n const { reset, resetField, handleSubmit, trigger, setValue, getValues, setError, clearErrors, formState } = formMethods;\n\n const rulesStateRef = React.useRef<IRulesEngineState>(rulesState);\n const formStateRef = React.useRef<FormState<IEntityData>>({ ...formState });\n const filterTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const validateAndSaveRef = React.useRef<(() => void) | undefined>(undefined);\n const { isDirty, isValid, dirtyFields, errors, isSubmitting, isSubmitSuccessful } = formState;\n\n React.useEffect(() => { rulesStateRef.current = rulesState; }, [rulesState]);\n React.useEffect(() => { formStateRef.current = formState; }, [formState]);\n React.useEffect(() => { initForm(defaultValues); }, [areAllFieldsReadonly]);\n\n const initForm = (entityData: IEntityData) => {\n const { formState: loadedState, initEntityData } = isCreate\n ? InitOnCreateFormState(configName, fields, entityData, parentEntity ?? {}, currentUserId ?? \"\", setValue, initFormState)\n : InitOnEditFormState(configName, fields, entityData, areAllFieldsReadonly ?? false, initFormState);\n\n setExpandEnabled(IsExpandVisible(loadedState.fieldStates, effectiveExpandCutoff));\n CheckValidDropdownOptions(loadedState.fieldStates, initEntityData, setValue);\n };\n\n React.useEffect(() => {\n if (rulesState.configs[configName]) {\n const cfg = rulesState.configs[configName];\n CheckValidDropdownOptions(cfg.fieldStates, getValues(), setValue);\n CheckDefaultValues(cfg.fieldStates, getValues(), setValue);\n handleComputedValues();\n }\n }, [rulesState]);\n\n const attemptSave = React.useCallback(() => {\n if (saveTimeout.current) { clearTimeout(saveTimeout.current); saveTimeout.current = undefined; }\n saveTimeout.current = setTimeout(() => {\n validateAndSaveRef.current?.();\n clearTimeout(saveTimeout.current);\n saveTimeout.current = undefined;\n }, saveTimeoutDelay?.current || 100);\n }, []);\n\n const setFieldValue = (fieldName: string, fieldValue: unknown, skipSave?: boolean, timeout?: number) => {\n saveTimeoutDelay.current = timeout;\n setValue(`${fieldName}` as const, fieldValue, { shouldDirty: !skipSave });\n trigger(fieldName);\n processFieldChange(getValues(), configName, fieldName, fields);\n if (!skipSave && !effectiveManualSave) { attemptSave(); }\n };\n\n const manualSave = React.useCallback(() => { validateAndSaveRef.current?.(); }, []);\n\n const saveConfirmInputFields = () => {\n trigger().then((valid: boolean) => {\n if (valid) { setInputFieldsConfirmed(true); attemptSave(); }\n });\n };\n\n const handleComputedValues = () => {\n const { dirtyFields } = formStateRef.current;\n const currentRulesState = rulesStateRef.current;\n const cfg = currentRulesState.configs[configName];\n if (!cfg) return;\n const computedValues = GetComputedValuesOnDirtyFields(Object.keys(dirtyFields), cfg.fieldStates);\n if (computedValues.length > 0) {\n computedValues.forEach(cv => {\n const result = ExecuteComputedValue(cv.expression, getValues(), cv.fieldName);\n setValue(`${cv.fieldName}` as const, result as unknown, { shouldDirty: true });\n });\n }\n };\n\n const focusFirstError = () => {\n if (typeof document === \"undefined\") return;\n const currentErrors = formStateRef.current.errors;\n const errorFieldNames = Object.keys(currentErrors);\n if (errorFieldNames.length > 0) {\n const element = document.getElementById(errorFieldNames[0]) || document.querySelector<HTMLElement>(`[name=\"${errorFieldNames[0]}\"]`);\n if (element && typeof element.focus === \"function\") element.focus();\n }\n };\n\n const validateAndSave = () => {\n const { dirtyFields } = formStateRef.current;\n const currentRulesState = rulesStateRef.current;\n const cfg = currentRulesState.configs[configName];\n if (cfg?.fieldStates) {\n Object.keys(cfg.fieldStates).forEach(fieldName => {\n if (cfg.fieldStates[fieldName]?.hidden) clearErrors(fieldName);\n });\n }\n\n setStatusMessage(FormStrings.validating);\n trigger().then((valid: boolean) => {\n if (!valid) {\n setIsExpanded(true);\n setStatusMessage(\"\");\n (typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : setTimeout)(() => focusFirstError());\n } else {\n const newConfirmInputModalProps = confirmInputModalProps.current === undefined\n ? GetConfirmInputModalProps(Object.keys(dirtyFields), cfg?.fieldStates ?? {})\n : undefined;\n\n if (newConfirmInputModalProps && !isEmpty(newConfirmInputModalProps.confirmInputsTriggeredBy) && (newConfirmInputModalProps.dependentFieldNames?.length ?? 0) > 0) {\n confirmInputModalProps.current = newConfirmInputModalProps;\n setInputFieldsConfirmed(false);\n setStatusMessage(\"\");\n } else if (dirtyFields && Object.keys(dirtyFields).length > 0) {\n setStatusMessage(FormStrings.saving);\n handleSubmit(handleSave)();\n confirmInputModalProps.current = undefined;\n } else {\n setStatusMessage(\"\");\n }\n }\n });\n };\n validateAndSaveRef.current = validateAndSave;\n\n const handleSave = (data: IEntityData) => {\n if (saveAbortControllerRef.current) saveAbortControllerRef.current.abort();\n const abortController = new AbortController();\n saveAbortControllerRef.current = abortController;\n const dirtyFieldNames = Object.keys(formStateRef.current.dirtyFields);\n\n const saveWithTimeoutAndRetry = async (attempt: number): Promise<void> => {\n if (abortController.signal.aborted) return;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(FormStrings.saveTimeout)), effectiveSaveTimeout);\n });\n try {\n const updatedEntity = await Promise.race([saveData(data, dirtyFieldNames), timeoutPromise]);\n if (abortController.signal.aborted) return;\n setStatusMessage(FormStrings.saved);\n analytics.trackFormSubmit(data as Record<string, unknown>);\n if (!isCreate) handleDirtyFields(updatedEntity, data);\n } catch (error) {\n if (abortController.signal.aborted) return;\n if (attempt < effectiveMaxRetries) {\n const delay = Math.pow(2, attempt) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n if (abortController.signal.aborted) return;\n return saveWithTimeoutAndRetry(attempt + 1);\n }\n setStatusMessage(FormStrings.saveFailed);\n dirtyFieldNames.forEach(field => { setError(field, { type: \"custom\", message: FormStrings.saveError }); });\n onSaveError?.(`${FormStrings.saveError}${error ? `: ${error}` : \"\"}`);\n }\n };\n saveWithTimeoutAndRetry(0);\n };\n\n const handleDirtyFields = (entity: IEntityData, data: IEntityData) => {\n const { dirtyFields } = formStateRef.current;\n const stillDirtyFields: IEntityData = {};\n Object.keys(dirtyFields).forEach(field => { stillDirtyFields[field] = getValues(field); });\n const resetValue = isChildEntity ? (GetChildEntity(entityId, entity, entityPath) ?? entity) : entity;\n reset(resetValue);\n Object.keys(stillDirtyFields).forEach(field => {\n if (JSON.stringify(stillDirtyFields[field]) !== JSON.stringify(data[field])) {\n setFieldValue(field, stillDirtyFields[field], false, saveTimeoutDelay?.current);\n }\n });\n };\n\n const onFilterChange = React.useCallback((value: string) => {\n if (filterTimeoutRef.current) clearTimeout(filterTimeoutRef.current);\n filterTimeoutRef.current = setTimeout(() => setFilterText(value), 500);\n }, []);\n\n const cancelConfirmInputFields = () => {\n const current = confirmInputModalProps.current;\n if (current && current.otherDirtyFields && current.otherDirtyFields.length > 0) {\n if (current.confirmInputsTriggeredBy) resetField(current.confirmInputsTriggeredBy);\n if (current.dependentFieldNames) current.dependentFieldNames.forEach(n => resetField(n));\n saveData(getValues(), current.otherDirtyFields).then(updatedEntity => initForm(updatedEntity));\n } else {\n reset();\n initForm(getValues());\n }\n setInputFieldsConfirmed(true);\n confirmInputModalProps.current = undefined;\n };\n\n const cutoff = expandEnabled && !isExpanded\n ? (effectiveExpandCutoff ?? FormConstants.defaultExpandCutoffCount)\n : undefined;\n\n return (\n <FormProvider {...formMethods} formState={{ ...formMethods.formState, isDirty, isValid, dirtyFields, errors, isSubmitting, isSubmitSuccessful }}>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }} data-testid=\"form-status-live-region\">\n {statusMessage}\n </div>\n {enableFilter && (\n <div className=\"fe-filter\">\n {renderFilterInput ? renderFilterInput({ onChange: onFilterChange }) : (\n <input type=\"text\" placeholder={FormStrings.filterFields} aria-label={FormStrings.filterFields} onChange={(e) => onFilterChange(e.target.value)} className=\"fe-filter-input\" />\n )}\n </div>\n )}\n {formErrors && formErrors.length > 0 && (\n <div className=\"form-errors\" role=\"alert\" style={{ color: \"var(--fe-error-color, #d13438)\", padding: \"8px\", marginBottom: \"8px\" }}>\n {formErrors.map((err, i) => (<div key={i} className=\"form-error-item\">{err}</div>))}\n </div>\n )}\n <div className=\"fe-form-wrapper\">\n <FormFields\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n parentEntityId={parentEntityId}\n parentEntityType={parentEntityType}\n isExpanded={isExpanded}\n expandEnabled={expandEnabled}\n fieldOrder={rulesState?.configs[configName]?.fieldOrder}\n collapsedMaxHeight={collapsedMaxHeight}\n formState={rulesState?.configs[configName]}\n fields={fields}\n setFieldValue={setFieldValue}\n isManualSave={effectiveManualSave}\n isCreate={isCreate}\n filterText={filterText}\n fieldRenderLimit={cutoff}\n renderLabel={renderLabel}\n renderError={renderError}\n renderStatus={renderStatus}\n analytics={analytics}\n />\n {expandEnabled && (\n renderExpandButton ? renderExpandButton({ isExpanded, onToggle: () => setIsExpanded(!isExpanded) }) : (\n <button className=\"expand-button\" onClick={() => setIsExpanded(!isExpanded)} aria-expanded={isExpanded} data-testid={`${programName}-${entityType}-${entityId}-expand-form`}>\n {isExpanded ? FormStrings.seeLess : FormStrings.expand}\n </button>\n )\n )}\n {effectiveManualSave && (\n renderSaveButton ? renderSaveButton({ onSave: manualSave, isDirty, isValid, isSubmitting }) : (\n <div className=\"fe-save-actions\" style={{ marginTop: \"16px\", display: \"flex\", gap: \"8px\" }}>\n <button type=\"button\" className=\"save-button\" onClick={manualSave} disabled={!isDirty || isSubmitting}>\n {isCreate ? FormStrings.create : FormStrings.save}\n </button>\n <button type=\"button\" className=\"cancel-button\" onClick={() => { reset(); initForm(defaultValues); }} disabled={!isDirty || isSubmitting}>\n {FormStrings.cancel}\n </button>\n </div>\n )\n )}\n </div>\n <ConfirmInputsModal\n isOpen={confirmInputModalProps !== undefined && !inputFieldsConfirmed}\n configName={configName}\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n fields={fields}\n confirmInputFields={confirmInputModalProps?.current?.dependentFieldNames ?? []}\n cancelConfirmInputFields={cancelConfirmInputFields}\n saveConfirmInputFields={saveConfirmInputFields}\n renderDialog={renderDialog}\n />\n </FormProvider>\n );\n};\n\n","import { useRef, useMemo } from \"react\";\nimport { IAnalyticsCallbacks } from \"../types/IAnalyticsCallbacks\";\n\n/**\n * Stable wrapper functions for analytics callbacks.\n * Each function is a no-op when the corresponding callback is not provided.\n */\nexport interface IFormAnalytics {\n trackFieldFocus: (fieldName: string) => void;\n trackFieldBlur: (fieldName: string) => void;\n trackFieldChange: (fieldName: string, oldValue: unknown, newValue: unknown) => void;\n trackValidationError: (fieldName: string, errors: string[]) => void;\n trackFormSubmit: (values: Record<string, unknown>) => void;\n trackFormAbandonment: (filledFields: string[], emptyRequiredFields: string[]) => void;\n trackWizardStepChange: (fromStep: number, toStep: number) => void;\n trackRuleTriggered: (event: { fieldName: string; ruleIndex: number; conditionMet: boolean }) => void;\n /** Timestamp (ms) when the hook was first created -- used for form duration. */\n formStartTime: number;\n}\n\n/**\n * Hook that wraps IAnalyticsCallbacks into safe, memoized wrapper functions.\n * Tracks form start time for duration calculations and per-field focus times.\n */\nexport function useFormAnalytics(callbacks?: IAnalyticsCallbacks): IFormAnalytics {\n const formStartTime = useRef(Date.now()).current;\n const focusTimes = useRef<Record<string, number>>({});\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n return useMemo<IFormAnalytics>(() => ({\n formStartTime,\n\n trackFieldFocus(fieldName: string) {\n focusTimes.current[fieldName] = Date.now();\n callbacksRef.current?.onFieldFocus?.(fieldName);\n },\n\n trackFieldBlur(fieldName: string) {\n const start = focusTimes.current[fieldName];\n const timeSpentMs = start ? Date.now() - start : 0;\n delete focusTimes.current[fieldName];\n callbacksRef.current?.onFieldBlur?.(fieldName, timeSpentMs);\n },\n\n trackFieldChange(fieldName: string, oldValue: unknown, newValue: unknown) {\n callbacksRef.current?.onFieldChange?.(fieldName, oldValue, newValue);\n },\n\n trackValidationError(fieldName: string, errors: string[]) {\n callbacksRef.current?.onValidationError?.(fieldName, errors);\n },\n\n trackFormSubmit(values: Record<string, unknown>) {\n const durationMs = Date.now() - formStartTime;\n callbacksRef.current?.onFormSubmit?.(values, durationMs);\n },\n\n trackFormAbandonment(filledFields: string[], emptyRequiredFields: string[]) {\n callbacksRef.current?.onFormAbandonment?.(filledFields, emptyRequiredFields);\n },\n\n trackWizardStepChange(fromStep: number, toStep: number) {\n callbacksRef.current?.onWizardStepChange?.(fromStep, toStep);\n },\n\n trackRuleTriggered(event: { fieldName: string; ruleIndex: number; conditionMet: boolean }) {\n callbacksRef.current?.onRuleTriggered?.(event);\n },\n }), [formStartTime]);\n}\n","import React from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { UseRulesEngineContext } from \"../providers/RulesEngineProvider\";\nimport { FormStrings } from \"../strings\";\nimport RenderField from \"./RenderField\";\n\ninterface IConfirmInputsModalProps {\n isOpen?: boolean;\n configName: string;\n entityId?: string;\n entityType?: string;\n programName?: string;\n fields: Record<string, IFieldConfig>;\n confirmInputFields: string[];\n saveConfirmInputFields: () => void;\n cancelConfirmInputFields: () => void;\n renderDialog?: (props: { isOpen: boolean; onSave: () => void; onCancel: () => void; children: React.ReactNode }) => React.JSX.Element;\n}\n\nfunction getFocusableElements(container: HTMLElement): HTMLElement[] {\n const selector = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(container.querySelectorAll<HTMLElement>(selector));\n}\n\nconst ConfirmInputsModal = (props: IConfirmInputsModalProps) => {\n const {\n isOpen, configName, entityId, entityType, programName,\n fields, confirmInputFields, saveConfirmInputFields,\n cancelConfirmInputFields, renderDialog,\n } = props;\n\n const { setValue, trigger } = useFormContext();\n const { rulesState } = UseRulesEngineContext();\n\n const dialogRef = React.useRef<HTMLDialogElement>(null);\n const previouslyFocusedRef = React.useRef<Element | null>(null);\n const saveButtonRef = React.useRef<HTMLButtonElement>(null);\n\n React.useEffect(() => {\n if (isOpen && dialogRef.current && !dialogRef.current.open) {\n previouslyFocusedRef.current = document.activeElement;\n dialogRef.current.showModal();\n saveButtonRef.current?.focus();\n } else if (!isOpen && dialogRef.current?.open) {\n dialogRef.current.close();\n if (previouslyFocusedRef.current instanceof HTMLElement) previouslyFocusedRef.current.focus();\n previouslyFocusedRef.current = null;\n }\n }, [isOpen]);\n\n React.useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n const handleCancel = (e: Event) => { e.preventDefault(); cancelConfirmInputFields(); };\n dialog.addEventListener(\"cancel\", handleCancel);\n return () => { dialog.removeEventListener(\"cancel\", handleCancel); };\n }, [cancelConfirmInputFields]);\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLDialogElement>) => {\n if (e.key !== \"Tab\" || !dialogRef.current) return;\n const focusableElements = getFocusableElements(dialogRef.current);\n if (focusableElements.length === 0) return;\n const first = focusableElements[0];\n const last = focusableElements[focusableElements.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first.focus(); }\n }\n }, []);\n\n const setValueFunctionFieldValue = (fieldName: string, fieldValue: unknown) => {\n trigger();\n setValue(`${fieldName}` as const, fieldValue, { shouldDirty: true });\n };\n\n const content = (\n <div className=\"fe-form-wrapper\">\n <div className=\"fe-form-container\">\n <form className=\"fe-form fe-modal\">\n {confirmInputFields?.map(confirmInputField => {\n const fieldState = rulesState.configs[configName]?.fieldStates[confirmInputField];\n const fieldConfig = fields[confirmInputField];\n if (!fieldState || !fieldConfig) return null;\n return (\n <RenderField\n key={`${confirmInputField}-${entityId}-modal`}\n fieldName={confirmInputField}\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n type={fieldState.type ?? \"\"}\n required\n options={fieldState.options}\n validate={fieldState.validate}\n isManualSave\n setFieldValue={setValueFunctionFieldValue}\n label={fieldConfig.label}\n skipLayoutReadOnly\n hideOnCreate={fieldConfig.hideOnCreate}\n config={fieldConfig.config}\n />\n );\n })}\n </form>\n </div>\n </div>\n );\n\n if (renderDialog) {\n return renderDialog({ isOpen: !!isOpen, onSave: saveConfirmInputFields, onCancel: cancelConfirmInputFields, children: content });\n }\n\n return (\n <dialog ref={dialogRef} className=\"fe-modal\" role=\"dialog\" aria-modal=\"true\" aria-label={FormStrings.confirm} onKeyDown={handleKeyDown}>\n {content}\n <div className=\"fe-modal-actions\">\n <button type=\"button\" ref={saveButtonRef} onClick={saveConfirmInputFields}>{FormStrings.save}</button>\n <button type=\"button\" onClick={cancelConfirmInputFields}>{FormStrings.cancel}</button>\n </div>\n </dialog>\n );\n};\n\nexport default ConfirmInputsModal;\n","import { isEmpty, isNull } from \"../utils\";\nimport React from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { ComponentTypes } from \"../constants\";\nimport { CheckFieldValidationRules, CheckAsyncFieldValidationRules, ShowField } from \"../helpers/InlineFormHelper\";\nimport { IOption } from \"../types/IOption\";\nimport { IValidationRule } from \"../types/IValidationRule\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { UseInjectedFieldContext } from \"../providers/InjectedFieldProvider\";\nimport { FormStrings } from \"../strings\";\nimport { IFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport { FieldWrapper } from \"./FieldWrapper\";\nimport { trackRender } from \"../helpers/RenderTracker\";\n\ninterface IRenderFieldProps {\n fieldName: string;\n entityId?: string;\n entityType?: string;\n programName?: string;\n type: string;\n hidden?: boolean;\n required?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n options?: IOption[];\n validate?: IValidationRule[];\n parentEntityId?: string;\n parentEntityType?: string;\n isManualSave?: boolean;\n setFieldValue: (fieldName: string, fieldValue: unknown, skipSave?: boolean) => void;\n isCreate?: boolean;\n filterText?: string;\n softHidden?: boolean;\n label?: string;\n skipLayoutReadOnly?: boolean;\n hideOnCreate?: boolean;\n config?: Record<string, unknown>;\n description?: string;\n placeholder?: string;\n helpText?: string;\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n analytics?: IFormAnalytics;\n}\n\nconst RenderField = (props: IRenderFieldProps) => {\n const {\n type, fieldName, entityId, entityType, programName,\n hidden, required, readOnly, disabled, options, validate,\n parentEntityId, parentEntityType, isManualSave,\n setFieldValue, isCreate, filterText, softHidden,\n label, skipLayoutReadOnly, hideOnCreate, config,\n description, placeholder, helpText,\n renderLabel, renderError, renderStatus, analytics,\n } = props;\n\n const { injectedFields } = UseInjectedFieldContext();\n const { control, getValues } = useFormContext();\n const previousValueRef = React.useRef<unknown>(undefined);\n\n React.useEffect(() => {\n trackRender(fieldName);\n });\n\n const isDisabled = disabled ?? false;\n const fieldNameConst = `${fieldName}` as const;\n\n const FieldComponent = React.useMemo(() => {\n const isReadOnly = readOnly || (isDisabled && (isNull(skipLayoutReadOnly) || (!isNull(skipLayoutReadOnly) && !skipLayoutReadOnly)));\n\n if ((isCreate && hideOnCreate) || hidden) return <></>;\n\n if (!isEmpty(injectedFields) && injectedFields[type]) {\n const Comp = injectedFields[type];\n return (\n <Controller\n name={fieldNameConst}\n control={control}\n rules={{\n required: required && type !== ComponentTypes.Toggle && !isReadOnly\n ? { value: true, message: FormStrings.required }\n : undefined,\n validate: async (value) => {\n if (!validate || validate.length === 0 || isReadOnly || !value) return undefined;\n // Build a mock runtime state for validation\n const fieldState: IRuntimeFieldState = { validate };\n const syncError = CheckFieldValidationRules(value, fieldName, getValues(), fieldState);\n if (syncError) return syncError;\n return CheckAsyncFieldValidationRules(value, fieldName, getValues(), fieldState);\n },\n }}\n render={({\n field: { value },\n fieldState: { error, isDirty },\n formState: { isSubmitting, isSubmitSuccessful, errors },\n }) => {\n const errorCount = errors ? Object.keys(errors).length : 0;\n const saving = isDirty && (isSubmitting || isSubmitSuccessful);\n const savePending = isDirty && errorCount > 0 && !isSubmitting && !isSubmitSuccessful;\n if (error && analytics) {\n analytics.trackValidationError(fieldName, [error.message || \"Error\"]);\n }\n if (previousValueRef.current !== undefined && previousValueRef.current !== value && analytics) {\n analytics.trackFieldChange(fieldName, previousValueRef.current, value);\n }\n previousValueRef.current = value;\n return type === \"DynamicFragment\" ? (\n <>{React.cloneElement(Comp, { value })}</>\n ) : ShowField(filterText, value, label) && !softHidden ? (\n <FieldWrapper\n id={fieldName}\n required={required}\n label={label}\n error={error}\n errorCount={errorCount}\n saving={saving}\n savePending={savePending}\n labelClassName=\"form-label\"\n isManualSave={isManualSave}\n renderLabel={renderLabel}\n renderError={renderError}\n renderStatus={renderStatus}\n >\n {React.cloneElement(Comp, {\n fieldName,\n entityId,\n entityType,\n parentEntityId,\n parentEntityType,\n programName,\n value,\n readOnly: isReadOnly,\n required,\n error,\n errorCount,\n saving,\n savePending,\n config,\n options,\n label,\n type,\n description,\n placeholder,\n helpText,\n setFieldValue,\n onFocus: analytics ? () => analytics.trackFieldFocus(fieldName) : undefined,\n onBlur: analytics ? () => analytics.trackFieldBlur(fieldName) : undefined,\n })}\n </FieldWrapper>\n ) : <></>;\n }}\n />\n );\n }\n\n const available = !isEmpty(injectedFields) ? Object.keys(injectedFields).join(\", \") : \"none\";\n return (\n <div style={{ color: \"red\", fontSize: \"0.85em\", padding: \"4px\" }}>\n Missing component &quot;{type}&quot; for field &quot;{fieldName}&quot;. Available: [{available}]\n </div>\n );\n }, [type, hidden, required, readOnly, disabled, options, softHidden, renderLabel, renderError, renderStatus,\n fieldName, fieldNameConst, label, validate, config, description, placeholder, helpText,\n isCreate, hideOnCreate, isManualSave, skipLayoutReadOnly,\n entityId, entityType, programName, parentEntityId, parentEntityType,\n injectedFields, analytics, control, getValues, setFieldValue]);\n\n return FieldComponent;\n};\n\nexport default React.memo(RenderField);\n","import React from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { FormStrings } from \"../strings\";\n\ninterface IFieldWrapperProps {\n id?: string;\n readonly label?: string;\n readonly required?: boolean;\n readonly error?: FieldError;\n readonly errorCount?: number;\n readonly savePending?: boolean;\n readonly saving?: boolean;\n readonly labelClassName?: string;\n readonly fieldClassName?: string;\n readonly showControlonSide?: boolean;\n readonly ariaLabel?: string;\n readonly ariaDescription?: string;\n readonly containerClassName?: string;\n readonly additionalInfo?: string;\n readonly additionalInfoIcon?: string;\n readonly additionalInfoComponent?: React.ReactNode;\n isManualSave?: boolean;\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n}\n\nexport const FieldWrapper: React.FunctionComponent<React.PropsWithChildren<IFieldWrapperProps>> = React.memo((\n props: React.PropsWithChildren<IFieldWrapperProps>\n) => {\n const {\n id, required, error, errorCount, savePending, saving,\n labelClassName, fieldClassName, showControlonSide, label,\n ariaLabel, ariaDescription, containerClassName,\n additionalInfo, additionalInfoComponent, isManualSave,\n renderLabel, renderError, renderStatus,\n } = props;\n\n const labelId = `${id}_label`;\n const errorMessageId = `${id}_error`;\n const children = (Array.isArray(props.children) ? props.children : [props.children]) as React.ReactElement<Record<string, unknown>>[];\n\n const defaultLabel = (\n <div className={labelClassName || \"\"}>\n <label id={labelId} htmlFor={id} className=\"field-label\">\n {label}\n {required && <><span className=\"required-indicator\" aria-hidden=\"true\" style={{ color: \"var(--fe-required-color, #d13438)\" }}> *</span><span className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }}> (required)</span></>}\n </label>\n {additionalInfoComponent}\n {!additionalInfoComponent && additionalInfo && (\n <span className=\"additional-info\" title={additionalInfo}>&#9432;</span>\n )}\n </div>\n );\n\n const defaultErrorAndStatus = (\n <div className=\"message\">\n {error ? (\n <>\n <span className=\"error-icon\" aria-hidden=\"true\" style={{ color: \"var(--fe-error-color, #d13438)\" }}>&#10006;</span>\n <span className=\"error-message\" id={errorMessageId} role=\"alert\" style={{ color: \"var(--fe-error-color, #d13438)\" }}>\n {error.message || \"Error\"}\n </span>\n </>\n ) : savePending ? (\n <>\n <span className=\"warning-icon\" aria-hidden=\"true\" style={{ color: \"var(--fe-warning-color, #ffb900)\" }}>&#9888;</span>\n <span className=\"warning-message\" id={errorMessageId} role=\"status\" style={{ color: \"var(--fe-warning-color, #ffb900)\" }}>\n {!isManualSave ? FormStrings.autoSavePending : FormStrings.savePending} ({`${errorCount} ${FormStrings.remaining}`})\n </span>\n </>\n ) : saving ? (\n <>\n <span className=\"save-spinner\" aria-hidden=\"true\" style={{ color: \"var(--fe-saving-color, #0078d4)\" }}>&#8987;</span>\n <span className=\"save-message\" id={errorMessageId} role=\"status\" style={{ color: \"var(--fe-saving-color, #0078d4)\" }}>\n {FormStrings.saving}\n </span>\n </>\n ) : <></>}\n </div>\n );\n\n return (\n <div\n className={`form-field ${showControlonSide ? \"flexBox\" : \"\"} ${containerClassName || \"\"} ${saving ? \"saving\" : \"\"}`}\n aria-busy={saving ? \"true\" : undefined}\n >\n {renderLabel ? renderLabel({ id: id || \"\", labelId, label, required }) : defaultLabel}\n <div className={`flexBox-Direction-column field-container ${fieldClassName || \"\"}`}>\n {children.map((child, index) => {\n if (child && child.props) {\n const childProps: Record<string, unknown> = {\n id,\n \"aria-labelledby\": ariaLabel ? undefined : labelId,\n \"aria-label\": ariaLabel || undefined,\n \"aria-required\": required,\n \"aria-invalid\": !!error,\n \"aria-describedby\": errorMessageId,\n key: index,\n className: child.props.className,\n };\n if (ariaDescription && !error) {\n childProps[\"aria-description\"] = ariaDescription;\n }\n if (index === 0) {\n return React.cloneElement(child, childProps);\n }\n const siblingProps: Record<string, unknown> = {\n key: index,\n \"aria-labelledby\": childProps[\"aria-labelledby\"],\n \"aria-label\": childProps[\"aria-label\"],\n \"aria-required\": childProps[\"aria-required\"],\n \"aria-invalid\": childProps[\"aria-invalid\"],\n \"aria-describedby\": childProps[\"aria-describedby\"],\n className: child.props.className,\n };\n if (childProps[\"aria-description\"]) {\n siblingProps[\"aria-description\"] = childProps[\"aria-description\"];\n }\n return React.cloneElement(child, siblingProps);\n }\n return <React.Fragment key={index} />;\n })}\n </div>\n {renderError\n ? renderError({ id: id || \"\", error, errorCount })\n : renderStatus\n ? renderStatus({ id: id || \"\", saving, savePending, errorCount, isManualSave })\n : defaultErrorAndStatus}\n </div>\n );\n});\n\n","/**\n * RenderTracker — Module-level render count tracking for FormDevTools.\n *\n * Tracks per-field render counts and which fields re-rendered on the last change.\n */\n\nconst renderCounts: Map<string, number> = new Map();\nlet lastRenderedFields: Set<string> = new Set();\nlet pendingRenderedFields: Set<string> = new Set();\nlet totalFormRenders = 0;\n\n/**\n * Record a render for the given field. Call this from RenderField.\n */\nexport function trackRender(fieldName: string): void {\n renderCounts.set(fieldName, (renderCounts.get(fieldName) ?? 0) + 1);\n pendingRenderedFields.add(fieldName);\n}\n\n/**\n * Call once per form render cycle to snapshot which fields rendered.\n */\nexport function flushRenderCycle(): void {\n lastRenderedFields = pendingRenderedFields;\n pendingRenderedFields = new Set();\n totalFormRenders++;\n}\n\n/**\n * Returns the current render counts for all tracked fields.\n */\nexport function getRenderCounts(): Map<string, number> {\n return new Map(renderCounts);\n}\n\n/**\n * Returns the set of field names that rendered in the last cycle.\n */\nexport function getLastRenderedFields(): Set<string> {\n return new Set(lastRenderedFields);\n}\n\n/**\n * Returns total form render count.\n */\nexport function getTotalFormRenders(): number {\n return totalFormRenders;\n}\n\n/**\n * Reset all tracking data.\n */\nexport function resetRenderTracker(): void {\n renderCounts.clear();\n lastRenderedFields.clear();\n pendingRenderedFields.clear();\n totalFormRenders = 0;\n}\n","import React from \"react\";\nimport { GetFieldsToRender } from \"../helpers/InlineFormHelper\";\nimport { IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport RenderField from \"./RenderField\";\nimport { FormErrorBoundary } from \"./FormErrorBoundary\";\n\ninterface IFormFieldsProps {\n entityId?: string;\n entityType?: string;\n programName?: string;\n parentEntityId?: string;\n parentEntityType?: string;\n isExpanded?: boolean;\n expandEnabled?: boolean;\n fieldOrder?: string[];\n inPanel?: boolean;\n collapsedMaxHeight?: number;\n formState?: IRuntimeFormState;\n fields?: Record<string, IFieldConfig>;\n setFieldValue: (fieldName: string, fieldValue: unknown, skipSave?: boolean) => void;\n isManualSave?: boolean;\n isCreate?: boolean;\n filterText?: string;\n fieldRenderLimit?: number;\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n analytics?: IFormAnalytics;\n}\n\nexport const FormFields = (props: IFormFieldsProps) => {\n const {\n entityId, entityType, programName, parentEntityId, parentEntityType,\n isExpanded, expandEnabled, fieldOrder, inPanel, collapsedMaxHeight,\n formState, fields, setFieldValue, isManualSave, isCreate, filterText,\n fieldRenderLimit, renderLabel, renderError, renderStatus, analytics,\n } = props;\n\n const collapsedClass = !isExpanded && (expandEnabled || expandEnabled === undefined) ? \"collapsed\" : \"\";\n const fieldsToRender = GetFieldsToRender(fieldRenderLimit ?? 0, fieldOrder ?? [], formState?.fieldStates);\n const loadingKey = `${programName}-${entityType}-${entityId}-form-loaded`;\n\n return (\n <div className={`fe-form-container ${collapsedClass}`}>\n <form\n className={`fe-form ${collapsedClass} ${inPanel ? \"in-panel\" : \"\"}`}\n style={collapsedClass && collapsedMaxHeight ? { maxHeight: `${collapsedMaxHeight}px` } : undefined}\n data-testid={`${programName}-${entityType}-${entityId}-form`}\n >\n <input type=\"hidden\" id={loadingKey} name={loadingKey} data-testid={loadingKey} />\n {fieldsToRender?.map(fieldToRender => {\n const { fieldName, softHidden } = fieldToRender;\n const fieldState = formState?.fieldStates[fieldName];\n if (!fieldState) return <React.Fragment key={fieldName} />;\n\n const fieldConfig = fields![fieldName];\n return (\n <FormErrorBoundary key={`${fieldName}-${entityId}-form`}>\n <RenderField\n fieldName={fieldName}\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n type={fieldState.type ?? \"\"}\n hidden={fieldState.hidden}\n required={fieldState.required}\n readOnly={fieldState.readOnly}\n options={fieldState.options}\n validate={fieldState.validate}\n parentEntityId={parentEntityId}\n parentEntityType={parentEntityType}\n setFieldValue={setFieldValue}\n isManualSave={isManualSave}\n isCreate={isCreate}\n filterText={filterText}\n softHidden={softHidden}\n label={fieldState?.label ?? fieldConfig?.label}\n skipLayoutReadOnly={fieldConfig?.skipLayoutReadOnly}\n hideOnCreate={fieldConfig?.hideOnCreate}\n config={fieldConfig?.config}\n description={fieldConfig?.description}\n placeholder={fieldConfig?.placeholder}\n helpText={fieldConfig?.helpText}\n renderLabel={renderLabel}\n renderError={renderError}\n renderStatus={renderStatus}\n analytics={analytics}\n />\n </FormErrorBoundary>\n );\n })}\n </form>\n </div>\n );\n};\n\n","import React from \"react\";\n\ninterface IFormErrorBoundaryProps {\n children: React.ReactNode;\n fallback?: (error: Error, resetError: () => void) => React.ReactNode;\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n}\n\ninterface IFormErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class FormErrorBoundary extends React.Component<IFormErrorBoundaryProps, IFormErrorBoundaryState> {\n constructor(props: IFormErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): IFormErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n }\n\n resetError = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): React.ReactNode {\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) return this.props.fallback(this.state.error, this.resetError);\n return (\n <div className=\"form-error-boundary\" role=\"alert\">\n <span className=\"error-boundary-message\">Something went wrong: {this.state.error.message}</span>\n <button className=\"error-boundary-retry\" onClick={this.resetError} type=\"button\">Retry</button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n","import React from \"react\";\nimport { IRuntimeFormState, IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { getRenderCounts, getLastRenderedFields, getTotalFormRenders, resetRenderTracker } from \"../helpers/RenderTracker\";\nimport { getTimeline, clearTimeline, ITimelineEvent } from \"../helpers/EventTimeline\";\n\nexport interface IFormDevToolsProps {\n configName: string;\n formState?: IRuntimeFormState;\n formValues?: Record<string, unknown>;\n formErrors?: Record<string, unknown>;\n dirtyFields?: Record<string, boolean>;\n enabled?: boolean;\n}\n\ntype TabKey = \"rules\" | \"values\" | \"errors\" | \"graph\" | \"performance\" | \"depgraph\" | \"timeline\";\n\nexport const FormDevTools: React.FC<IFormDevToolsProps> = (props) => {\n const { configName, formState, formValues, formErrors, dirtyFields, enabled = true } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [activeTab, setActiveTab] = React.useState<TabKey>(\"rules\");\n const [timelineFilter, setTimelineFilter] = React.useState(\"\");\n const [depGraphSort, setDepGraphSort] = React.useState<\"name\" | \"depCount\">(\"name\");\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\n\n if (!enabled) return null;\n\n const fieldStates = formState?.fieldStates ?? {};\n const fieldNames = Object.keys(fieldStates);\n\n const dependencyGraph = React.useMemo(() => {\n const lines: string[] = [];\n for (const [name, state] of Object.entries(fieldStates)) {\n if (state.dependentFields?.length) {\n lines.push(`${name} -> ${state.dependentFields.join(\", \")}`);\n }\n if (state.dependsOnFields?.length) {\n lines.push(`${name} (depends on) ${state.dependsOnFields.join(\", \")}`);\n }\n }\n return lines;\n }, [fieldStates]);\n\n const containerStyle: React.CSSProperties = {\n position: \"fixed\", bottom: 0, right: 0,\n width: isOpen ? \"520px\" : \"auto\", maxHeight: isOpen ? \"50vh\" : \"auto\",\n background: \"#1e1e1e\", color: \"#d4d4d4\", fontFamily: \"monospace\", fontSize: \"12px\",\n zIndex: 9999, borderTopLeftRadius: \"8px\", overflow: \"hidden\", boxShadow: \"0 -2px 10px rgba(0,0,0,0.3)\",\n };\n\n const tabStyle = (active: boolean): React.CSSProperties => ({\n padding: \"4px 8px\", cursor: \"pointer\",\n background: active ? \"#333\" : \"transparent\", color: active ? \"#fff\" : \"#888\",\n border: \"none\", borderBottom: active ? \"2px solid #007acc\" : \"2px solid transparent\",\n fontFamily: \"monospace\", fontSize: \"11px\",\n });\n\n const thStyle: React.CSSProperties = {\n textAlign: \"left\", padding: \"3px 6px\", borderBottom: \"1px solid #555\",\n fontWeight: \"bold\", color: \"#fff\", fontSize: \"11px\",\n };\n\n const tdStyle: React.CSSProperties = {\n padding: \"3px 6px\", borderBottom: \"1px solid #333\", fontSize: \"11px\",\n };\n\n const btnStyle: React.CSSProperties = {\n padding: \"2px 8px\", margin: \"0 4px\", cursor: \"pointer\",\n background: \"#333\", color: \"#d4d4d4\", border: \"1px solid #555\",\n fontFamily: \"monospace\", fontSize: \"10px\", borderRadius: \"3px\",\n };\n\n // --- Performance Tab ---\n const renderPerformanceTab = () => {\n const counts = getRenderCounts();\n const lastRendered = getLastRenderedFields();\n const totalRenders = getTotalFormRenders();\n const entries = Array.from(counts.entries()).sort((a, b) => a[0].localeCompare(b[0]));\n const avgCount = entries.length > 0\n ? entries.reduce((sum, [, c]) => sum + c, 0) / entries.length\n : 0;\n\n return (\n <div>\n <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span>Total form renders: <strong style={{ color: \"#4ec9b0\" }}>{totalRenders}</strong></span>\n <button style={btnStyle} onClick={() => { resetRenderTracker(); forceUpdate(); }}>Reset</button>\n <button style={btnStyle} onClick={() => forceUpdate()}>Refresh</button>\n </div>\n {entries.length === 0 ? (\n <div>No render data yet.</div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr>\n <th style={thStyle}>Field</th>\n <th style={thStyle}>Renders</th>\n <th style={thStyle}>Last Cycle</th>\n <th style={thStyle}>Hot</th>\n </tr>\n </thead>\n <tbody>\n {entries.map(([fieldName, count]) => {\n const isHot = count > avgCount * 1.5;\n const wasLastRendered = lastRendered.has(fieldName);\n return (\n <tr key={fieldName} style={isHot ? { background: \"#3e2a00\" } : undefined}>\n <td style={tdStyle}>{fieldName}</td>\n <td style={{ ...tdStyle, color: isHot ? \"#ff9900\" : \"#d4d4d4\" }}>{count}</td>\n <td style={tdStyle}>{wasLastRendered ? \"\\u2713\" : \"\"}</td>\n <td style={tdStyle}>{isHot ? \"\\u26a0\" : \"\"}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n )}\n </div>\n );\n };\n\n // --- Dependency Graph Tab ---\n const renderDepGraphTab = () => {\n // Build adjacency data from fieldStates\n const rows: Array<{\n name: string;\n dependsOn: string[];\n dependedBy: string[];\n effects: string[];\n }> = [];\n\n let hasCycles = false;\n\n for (const [name, state] of Object.entries(fieldStates)) {\n const dependsOn = state.dependsOnFields ?? [];\n const dependedBy = state.dependentFields ?? [];\n\n // Determine primary effect types from this field's state\n const effects: string[] = [];\n if (state.hidden) effects.push(\"hidden\");\n if (state.required) effects.push(\"required\");\n if (state.readOnly) effects.push(\"readOnly\");\n if (state.options && state.options.length > 0 && dependsOn.length > 0) effects.push(\"options\");\n if (state.computedValue) effects.push(\"computed\");\n\n rows.push({ name, dependsOn, dependedBy, effects });\n }\n\n // Check for cycles: a field that both depends on and is depended by the same field\n for (const row of rows) {\n for (const dep of row.dependsOn) {\n const depRow = rows.find(r => r.name === dep);\n if (depRow?.dependsOn.includes(row.name)) {\n hasCycles = true;\n break;\n }\n }\n if (hasCycles) break;\n }\n\n // Filter to only fields with dependencies\n const depRows = rows.filter(r => r.dependsOn.length > 0 || r.dependedBy.length > 0);\n\n // Sort\n if (depGraphSort === \"name\") {\n depRows.sort((a, b) => a.name.localeCompare(b.name));\n } else {\n depRows.sort((a, b) => (b.dependsOn.length + b.dependedBy.length) - (a.dependsOn.length + a.dependedBy.length));\n }\n\n const effectColor = (effects: string[]): React.CSSProperties => {\n if (effects.includes(\"hidden\")) return { background: \"#3e3a20\" }; // light yellow\n if (effects.includes(\"required\")) return { background: \"#1e2a3e\" }; // light blue\n if (effects.includes(\"readOnly\")) return { background: \"#2a2a2a\" }; // light gray\n if (effects.includes(\"options\")) return { background: \"#1e3a2a\" }; // light green\n return {};\n };\n\n return (\n <div>\n <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span>Sort by:</span>\n <button style={{ ...btnStyle, borderColor: depGraphSort === \"name\" ? \"#007acc\" : \"#555\" }} onClick={() => setDepGraphSort(\"name\")}>Name</button>\n <button style={{ ...btnStyle, borderColor: depGraphSort === \"depCount\" ? \"#007acc\" : \"#555\" }} onClick={() => setDepGraphSort(\"depCount\")}>Dep Count</button>\n {hasCycles && <span style={{ color: \"#f44747\", fontWeight: \"bold\" }}>Cycles detected!</span>}\n </div>\n {depRows.length === 0 ? (\n <div>No dependencies defined.</div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr>\n <th style={thStyle}>Field</th>\n <th style={thStyle}>Depends On</th>\n <th style={thStyle}>Depended By</th>\n <th style={thStyle}>Effects</th>\n </tr>\n </thead>\n <tbody>\n {depRows.map(row => (\n <tr key={row.name} style={effectColor(row.effects)}>\n <td style={tdStyle}>{row.name}</td>\n <td style={tdStyle}>{row.dependsOn.join(\", \") || \"\\u2014\"}</td>\n <td style={tdStyle}>{row.dependedBy.join(\", \") || \"\\u2014\"}</td>\n <td style={tdStyle}>{row.effects.join(\", \") || \"\\u2014\"}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n );\n };\n\n // --- Timeline Tab ---\n const renderTimelineTab = () => {\n const timeline = getTimeline();\n const filterLower = timelineFilter.toLowerCase();\n const filtered = filterLower\n ? timeline.filter(e => e.fieldName.toLowerCase().includes(filterLower) || e.type.toLowerCase().includes(filterLower))\n : timeline;\n // Show newest first\n const reversed = [...filtered].reverse();\n\n const typeColor = (type: string): string => {\n switch (type) {\n case \"field_change\": return \"#4ec9b0\";\n case \"rule_evaluated\": return \"#ce9178\";\n case \"validation_run\": return \"#dcdcaa\";\n case \"form_submit\": return \"#569cd6\";\n default: return \"#d4d4d4\";\n }\n };\n\n const formatTime = (ts: number): string => {\n const d = new Date(ts);\n return `${String(d.getHours()).padStart(2, \"0\")}:${String(d.getMinutes()).padStart(2, \"0\")}:${String(d.getSeconds()).padStart(2, \"0\")}.${String(d.getMilliseconds()).padStart(3, \"0\")}`;\n };\n\n return (\n <div>\n <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <input\n type=\"text\"\n placeholder=\"Filter by field or type...\"\n value={timelineFilter}\n onChange={e => setTimelineFilter(e.target.value)}\n style={{\n padding: \"2px 6px\", background: \"#2d2d2d\", color: \"#d4d4d4\",\n border: \"1px solid #555\", fontFamily: \"monospace\", fontSize: \"11px\",\n borderRadius: \"3px\", flex: 1,\n }}\n />\n <button style={btnStyle} onClick={() => { clearTimeline(); forceUpdate(); }}>Clear</button>\n <button style={btnStyle} onClick={() => forceUpdate()}>Refresh</button>\n </div>\n <div style={{ fontSize: \"10px\", color: \"#888\", marginBottom: \"4px\" }}>\n {filtered.length} event{filtered.length !== 1 ? \"s\" : \"\"}\n </div>\n {reversed.length === 0 ? (\n <div>No events recorded yet.</div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr>\n <th style={thStyle}>Time</th>\n <th style={thStyle}>Type</th>\n <th style={thStyle}>Field</th>\n <th style={thStyle}>Details</th>\n </tr>\n </thead>\n <tbody>\n {reversed.slice(0, 200).map((event, i) => (\n <tr key={i}>\n <td style={{ ...tdStyle, whiteSpace: \"nowrap\", color: \"#888\" }}>{formatTime(event.timestamp)}</td>\n <td style={{ ...tdStyle, color: typeColor(event.type), whiteSpace: \"nowrap\" }}>{event.type}</td>\n <td style={tdStyle}>{event.fieldName}</td>\n <td style={{ ...tdStyle, maxWidth: \"200px\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>{event.details}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n );\n };\n\n return (\n <div style={containerStyle} data-testid=\"form-devtools\">\n <button type=\"button\" aria-expanded={isOpen} aria-controls=\"devtools-content\" style={{ width: \"100%\", padding: \"4px 8px\", cursor: \"pointer\", background: \"#333\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", border: \"none\", color: \"inherit\", font: \"inherit\" }} onClick={() => setIsOpen(!isOpen)}>\n <span style={{ color: \"#007acc\", fontWeight: \"bold\" }}>DevTools: {configName}</span>\n <span aria-hidden=\"true\">{isOpen ? \"\\u25BC\" : \"\\u25B2\"}</span>\n </button>\n {isOpen && (\n <>\n <div role=\"tablist\" aria-label=\"DevTools panels\" style={{ display: \"flex\", borderBottom: \"1px solid #333\", flexWrap: \"wrap\" }}>\n <button role=\"tab\" aria-selected={activeTab === \"rules\"} aria-controls=\"devtools-panel-rules\" style={tabStyle(activeTab === \"rules\")} onClick={() => setActiveTab(\"rules\")}>Rules ({fieldNames.length})</button>\n <button role=\"tab\" aria-selected={activeTab === \"values\"} aria-controls=\"devtools-panel-values\" style={tabStyle(activeTab === \"values\")} onClick={() => setActiveTab(\"values\")}>Values</button>\n <button role=\"tab\" aria-selected={activeTab === \"errors\"} aria-controls=\"devtools-panel-errors\" style={tabStyle(activeTab === \"errors\")} onClick={() => setActiveTab(\"errors\")}>Errors</button>\n <button role=\"tab\" aria-selected={activeTab === \"graph\"} aria-controls=\"devtools-panel-graph\" style={tabStyle(activeTab === \"graph\")} onClick={() => setActiveTab(\"graph\")}>Graph</button>\n <button role=\"tab\" aria-selected={activeTab === \"performance\"} aria-controls=\"devtools-panel-performance\" style={tabStyle(activeTab === \"performance\")} onClick={() => { setActiveTab(\"performance\"); forceUpdate(); }}>Perf</button>\n <button role=\"tab\" aria-selected={activeTab === \"depgraph\"} aria-controls=\"devtools-panel-depgraph\" style={tabStyle(activeTab === \"depgraph\")} onClick={() => setActiveTab(\"depgraph\")}>Deps</button>\n <button role=\"tab\" aria-selected={activeTab === \"timeline\"} aria-controls=\"devtools-panel-timeline\" style={tabStyle(activeTab === \"timeline\")} onClick={() => { setActiveTab(\"timeline\"); forceUpdate(); }}>Timeline</button>\n </div>\n <div role=\"tabpanel\" id={`devtools-panel-${activeTab}`} aria-label={activeTab} style={{ overflow: \"auto\", maxHeight: \"calc(50vh - 60px)\", padding: \"8px\" }}>\n {activeTab === \"rules\" && fieldNames.map(name => {\n const state = fieldStates[name];\n return (\n <div key={name} style={{ marginBottom: \"8px\", borderBottom: \"1px solid #333\", paddingBottom: \"4px\" }}>\n <div style={{ color: \"#4ec9b0\" }}>{name}</div>\n <div>type: {state.type ?? \"\\u2014\"} | required: {String(state.required ?? false)} | hidden: {String(state.hidden ?? false)} | readOnly: {String(state.readOnly ?? false)}</div>\n {state.validate?.length ? <div>validate: {state.validate.map(v => v.name).join(\", \")}</div> : null}\n {state.computedValue ? <div>computedValue: {state.computedValue}</div> : null}\n {state.activeRuleIds?.length ? <div>activeRules: {state.activeRuleIds.join(\", \")}</div> : null}\n </div>\n );\n })}\n {activeTab === \"values\" && <pre style={{ margin: 0, whiteSpace: \"pre-wrap\" }}>{JSON.stringify(formValues, null, 2)}</pre>}\n {activeTab === \"errors\" && (\n <pre style={{ margin: 0, whiteSpace: \"pre-wrap\", color: formErrors && Object.keys(formErrors).length > 0 ? \"#f44747\" : \"#4ec9b0\" }}>\n {formErrors && Object.keys(formErrors).length > 0 ? JSON.stringify(formErrors, null, 2) : \"No errors\"}\n </pre>\n )}\n {activeTab === \"graph\" && (dependencyGraph.length > 0\n ? dependencyGraph.map((line, i) => <div key={i} style={{ color: \"#ce9178\" }}>{line}</div>)\n : <div>No dependencies defined</div>\n )}\n {activeTab === \"performance\" && renderPerformanceTab()}\n {activeTab === \"depgraph\" && renderDepGraphTab()}\n {activeTab === \"timeline\" && renderTimelineTab()}\n </div>\n </>\n )}\n </div>\n );\n};\n","import { IJsonSchemaNode } from \"./types\";\n\n/**\n * Resolve all $ref pointers in a JSON Schema, inlining referenced definitions.\n *\n * - Handles both `definitions` (draft-04) and `$defs` (draft-2019+)\n * - Merges sibling properties alongside $ref (title, description override)\n * - Detects circular references via visited set, falls back to { type: \"string\" }\n * - Strips definitions/$defs from output\n */\nexport function resolveRefs(schema: IJsonSchemaNode): IJsonSchemaNode {\n const defs: Record<string, IJsonSchemaNode> = {\n ...(schema.definitions ?? {}),\n ...(schema.$defs ?? {}),\n };\n\n const resolved = resolveNode(schema, defs, new Set<string>());\n\n // Strip definition blocks from output\n const { definitions: _d, $defs: _dd, ...clean } = resolved;\n return clean;\n}\n\nfunction resolveNode(\n node: IJsonSchemaNode,\n defs: Record<string, IJsonSchemaNode>,\n visited: Set<string>\n): IJsonSchemaNode {\n if (node.$ref) {\n const refPath = node.$ref;\n\n if (visited.has(refPath)) {\n // Circular reference — fall back to string\n return { type: \"string\" };\n }\n\n const resolved = lookupRef(refPath, defs);\n if (!resolved) {\n return { type: \"string\" };\n }\n\n visited.add(refPath);\n\n // Merge sibling properties (title, description, etc.) over the resolved def\n const { $ref: _ref, ...siblings } = node;\n const inlined = resolveNode({ ...resolved, ...siblings }, defs, visited);\n\n visited.delete(refPath);\n return inlined;\n }\n\n const result: IJsonSchemaNode = {};\n\n for (const [key, value] of Object.entries(node)) {\n if (key === \"definitions\" || key === \"$defs\") {\n continue;\n }\n\n if (key === \"properties\" && value && typeof value === \"object\") {\n const props: Record<string, IJsonSchemaNode> = {};\n for (const [propName, propValue] of Object.entries(\n value as Record<string, IJsonSchemaNode>\n )) {\n props[propName] = resolveNode(propValue, defs, visited);\n }\n result.properties = props;\n } else if (key === \"items\") {\n if (Array.isArray(value)) {\n result.items = value.map((item: IJsonSchemaNode) =>\n resolveNode(item, defs, visited)\n ) as unknown as IJsonSchemaNode;\n } else if (value && typeof value === \"object\") {\n result.items = resolveNode(value as IJsonSchemaNode, defs, visited);\n }\n } else if (\n (key === \"allOf\" || key === \"oneOf\" || key === \"anyOf\") &&\n Array.isArray(value)\n ) {\n (result as Record<string, unknown>)[key] = value.map(\n (item: IJsonSchemaNode) => resolveNode(item, defs, visited)\n );\n } else if (key === \"if\" || key === \"then\" || key === \"else\") {\n if (value && typeof value === \"object\") {\n (result as Record<string, unknown>)[key] = resolveNode(\n value as IJsonSchemaNode,\n defs,\n visited\n );\n }\n } else if (key === \"dependencies\" && value && typeof value === \"object\") {\n const deps: Record<string, string[] | IJsonSchemaNode> = {};\n for (const [depName, depValue] of Object.entries(\n value as Record<string, string[] | IJsonSchemaNode>\n )) {\n if (Array.isArray(depValue)) {\n deps[depName] = depValue;\n } else if (typeof depValue === \"object\" && depValue !== null) {\n deps[depName] = resolveNode(\n depValue as IJsonSchemaNode,\n defs,\n visited\n );\n }\n }\n result.dependencies = deps;\n } else if (\n key === \"additionalProperties\" &&\n value &&\n typeof value === \"object\"\n ) {\n result.additionalProperties = resolveNode(\n value as IJsonSchemaNode,\n defs,\n visited\n );\n } else {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n\n return result;\n}\n\nfunction lookupRef(\n ref: string,\n defs: Record<string, IJsonSchemaNode>\n): IJsonSchemaNode | undefined {\n // Support \"#/definitions/Foo\" and \"#/$defs/Foo\"\n const match = ref.match(/^#\\/(?:definitions|\\$defs)\\/(.+)$/);\n if (!match) return undefined;\n\n const path = match[1];\n // Handle nested paths like \"Foo/Bar\"\n const parts = path.split(\"/\");\n let current: IJsonSchemaNode | undefined = defs[parts[0]];\n for (let i = 1; i < parts.length && current; i++) {\n current = (current as Record<string, IJsonSchemaNode>)[parts[i]];\n }\n return current;\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { IOption } from \"../../types/IOption\";\nimport { IValidationRule } from \"../../types/IValidationRule\";\nimport { IJsonSchemaNode, IRjsfUiSchema } from \"./types\";\n\n/**\n * Map from RJSF ui:widget names to our component type keys.\n */\nconst WIDGET_MAP: Record<string, string> = {\n text: \"Textbox\",\n textarea: \"Textarea\",\n password: \"Textbox\",\n color: \"Textbox\",\n hidden: \"DynamicFragment\",\n select: \"Dropdown\",\n radio: \"Dropdown\",\n checkboxes: \"Multiselect\",\n updown: \"Number\",\n range: \"Slider\",\n date: \"DateControl\",\n datetime: \"DateControl\",\n \"date-time\": \"DateControl\",\n file: \"DocumentLinks\",\n checkbox: \"Toggle\",\n};\n\n/**\n * Config overrides for specific widgets (e.g., password → config.type:\"password\").\n */\nconst WIDGET_CONFIG: Record<string, Record<string, unknown>> = {\n password: { type: \"password\" },\n color: { type: \"color\" },\n radio: { display: \"radio\" },\n checkboxes: { display: \"checkboxes\" },\n};\n\n/**\n * Convert a JSON Schema node to an IFieldConfig.\n */\nexport function schemaNodeToFieldConfig(\n fieldName: string,\n node: IJsonSchemaNode,\n isRequired: boolean\n): IFieldConfig {\n const type = mapTypeToComponent(node);\n const validate = extractValidationRules(node);\n const options = extractOptions(node);\n\n const config: IFieldConfig = {\n type,\n label: node.title ?? fieldName,\n required: isRequired,\n };\n\n if (validate.length > 0) config.validate = validate;\n if (options) config.options = options;\n if (node.default !== undefined) config.defaultValue = node.default;\n if (node.description) config.description = node.description;\n\n // const fields are read-only with the const as default\n if (node.const !== undefined) {\n config.readOnly = true;\n config.defaultValue = node.const;\n }\n\n return config;\n}\n\n/**\n * Extract IValidationRule[] from JSON Schema constraints.\n */\nexport function extractValidationRules(\n node: IJsonSchemaNode\n): IValidationRule[] {\n const rules: IValidationRule[] = [];\n\n if (node.minLength !== undefined) {\n rules.push({ name: \"minLength\", params: { min: node.minLength } });\n }\n if (node.maxLength !== undefined) {\n rules.push({ name: \"maxLength\", params: { max: node.maxLength } });\n }\n if (node.pattern) {\n rules.push({\n name: \"pattern\",\n params: { pattern: node.pattern, message: \"Must match pattern\" },\n });\n }\n\n // Numeric ranges\n const hasMin = node.minimum !== undefined;\n const hasMax = node.maximum !== undefined;\n const hasExclMin = node.exclusiveMinimum !== undefined;\n const hasExclMax = node.exclusiveMaximum !== undefined;\n\n if (hasExclMin || hasExclMax) {\n rules.push({\n name: \"exclusiveNumericRange\",\n params: {\n exclusiveMin: node.exclusiveMinimum,\n exclusiveMax: node.exclusiveMaximum,\n min: node.minimum,\n max: node.maximum,\n },\n });\n } else if (hasMin || hasMax) {\n rules.push({\n name: \"numericRange\",\n params: {\n min: node.minimum ?? -Infinity,\n max: node.maximum ?? Infinity,\n },\n });\n }\n\n if (node.multipleOf !== undefined) {\n rules.push({\n name: \"multipleOf\",\n params: { factor: node.multipleOf },\n });\n }\n\n // Format-based validators\n if (node.format === \"email\") rules.push({ name: \"email\" });\n if (node.format === \"uri\" || node.format === \"url\") rules.push({ name: \"url\" });\n if (node.format === \"phone\") rules.push({ name: \"phone\" });\n\n if (node.uniqueItems) {\n rules.push({ name: \"uniqueInArray\" });\n }\n\n return rules;\n}\n\n/**\n * Apply RJSF uiSchema overrides to an IFieldConfig.\n */\nexport function applyUiSchema(\n config: IFieldConfig,\n uiSchema: IRjsfUiSchema\n): IFieldConfig {\n const result = { ...config };\n\n // Widget → component type override\n const widget = uiSchema[\"ui:widget\"];\n if (typeof widget === \"string\" && WIDGET_MAP[widget]) {\n result.type = WIDGET_MAP[widget];\n // Apply widget-specific config\n const extraConfig = WIDGET_CONFIG[widget];\n if (extraConfig) {\n result.config = { ...(result.config ?? {}), ...extraConfig };\n }\n }\n\n if (uiSchema[\"ui:title\"]) result.label = uiSchema[\"ui:title\"] as string;\n if (uiSchema[\"ui:description\"])\n result.description = uiSchema[\"ui:description\"] as string;\n if (uiSchema[\"ui:help\"]) result.helpText = uiSchema[\"ui:help\"] as string;\n if (uiSchema[\"ui:placeholder\"])\n result.placeholder = uiSchema[\"ui:placeholder\"] as string;\n if (uiSchema[\"ui:hidden\"] === true) result.hidden = true;\n if (uiSchema[\"ui:readonly\"] === true) result.readOnly = true;\n if (uiSchema[\"ui:disabled\"] === true) result.disabled = true;\n\n if (uiSchema[\"ui:autofocus\"] === true) {\n result.config = { ...(result.config ?? {}), autofocus: true };\n }\n if (uiSchema[\"ui:classNames\"]) {\n result.config = {\n ...(result.config ?? {}),\n className: uiSchema[\"ui:classNames\"],\n };\n }\n if (uiSchema[\"ui:options\"] && typeof uiSchema[\"ui:options\"] === \"object\") {\n result.config = { ...(result.config ?? {}), ...uiSchema[\"ui:options\"] };\n }\n if (uiSchema[\"ui:label\"] === false) {\n result.config = { ...(result.config ?? {}), hideLabel: true };\n }\n\n // ui:enumDisabled → mark matching options as disabled\n const enumDisabled = uiSchema[\"ui:enumDisabled\"];\n if (Array.isArray(enumDisabled) && result.options) {\n result.options = result.options.map((opt) => ({\n ...opt,\n disabled: enumDisabled.includes(opt.value) ? true : opt.disabled,\n }));\n }\n\n // ui:enumNames → override option labels\n const enumNames = uiSchema[\"ui:enumNames\"];\n if (Array.isArray(enumNames) && result.options) {\n result.options = result.options.map((opt, i) => ({\n ...opt,\n label: enumNames[i] != null ? String(enumNames[i]) : opt.label,\n }));\n }\n\n return result;\n}\n\n// --- Internal helpers ---\n\nfunction mapTypeToComponent(node: IJsonSchemaNode): string {\n // Enum always → Dropdown\n if (node.enum) return \"Dropdown\";\n\n // const → Textbox (will be read-only)\n if (node.const !== undefined) return \"Textbox\";\n\n const type = resolveType(node);\n\n switch (type) {\n case \"string\":\n if (node.format === \"date\" || node.format === \"date-time\") return \"DateControl\";\n if (node.format === \"data-url\") return \"DocumentLinks\";\n if (node.maxLength && node.maxLength > 200) return \"Textarea\";\n return \"Textbox\";\n case \"number\":\n case \"integer\":\n if (node.minimum !== undefined && node.maximum !== undefined) return \"Slider\";\n return \"Number\";\n case \"boolean\":\n return \"Toggle\";\n case \"array\":\n return mapArrayType(node);\n case \"object\":\n return \"Textbox\"; // Objects handled at converter level\n default:\n return \"Textbox\";\n }\n}\n\nfunction resolveType(node: IJsonSchemaNode): string {\n if (!node.type) return \"string\";\n if (typeof node.type === \"string\") return node.type;\n // Array of types (nullable) — pick first non-null\n const nonNull = node.type.filter((t) => t !== \"null\");\n return nonNull[0] ?? \"string\";\n}\n\nfunction mapArrayType(node: IJsonSchemaNode): string {\n const items = node.items;\n if (!items || Array.isArray(items)) return \"Multiselect\";\n\n if (items.enum) return \"Multiselect\";\n if (items.type === \"object\" && items.properties) return \"FieldArray\";\n return \"Multiselect\";\n}\n\nfunction extractOptions(node: IJsonSchemaNode): IOption[] | undefined {\n if (!node.enum) return undefined;\n\n const names = node.enumNames;\n return node.enum.map((val, i) => ({\n value: String(val),\n label: names && names[i] != null ? String(names[i]) : String(val),\n }));\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { ICondition } from \"../../types/ICondition\";\nimport { IRule } from \"../../types/IRule\";\nimport { IJsonSchemaNode } from \"./types\";\nimport { schemaNodeToFieldConfig } from \"./fieldMapper\";\n\n/**\n * Convert JSON Schema `dependencies` to IRule[] attached to affected fields.\n *\n * Handles both property dependencies (string[]) and schema dependencies (object).\n */\nexport function convertDependencies(\n dependencies: Record<string, string[] | IJsonSchemaNode>,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n for (const [sourceField, dep] of Object.entries(dependencies)) {\n if (Array.isArray(dep)) {\n // Property dependency: when source is not empty, dependents become required\n for (const dependentField of dep) {\n if (!fields[dependentField]) continue;\n const rule: IRule = {\n id: `${idPrefix}_dep_${sourceField}_${dependentField}`,\n when: { field: sourceField, operator: \"isNotEmpty\" },\n then: { required: true },\n else: { required: false },\n };\n fields[dependentField].rules = [\n ...(fields[dependentField].rules ?? []),\n rule,\n ];\n }\n } else {\n // Schema dependency: source not empty → show/require additional fields\n convertSchemaDependency(sourceField, dep, fields, rootSchema, idPrefix);\n }\n }\n}\n\n/**\n * Convert JSON Schema `if/then/else` to IRule[] attached to affected fields.\n */\nexport function convertIfThenElse(\n schema: IJsonSchemaNode,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n const condition = schemaToCondition(schema.if!);\n if (!condition) return;\n\n const thenSchema = schema.then;\n const elseSchema = schema.else;\n\n // Collect affected fields from then/else\n const affectedFields = new Set<string>();\n if (thenSchema?.properties) {\n Object.keys(thenSchema.properties).forEach((f) => affectedFields.add(f));\n }\n if (thenSchema?.required) {\n thenSchema.required.forEach((f) => affectedFields.add(f));\n }\n if (elseSchema?.properties) {\n Object.keys(elseSchema.properties).forEach((f) => affectedFields.add(f));\n }\n if (elseSchema?.required) {\n elseSchema.required.forEach((f) => affectedFields.add(f));\n }\n\n for (const fieldName of affectedFields) {\n // Ensure field exists\n if (!fields[fieldName] && thenSchema?.properties?.[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n thenSchema.properties[fieldName],\n false\n );\n fields[fieldName].hidden = true;\n }\n if (!fields[fieldName] && elseSchema?.properties?.[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n elseSchema.properties[fieldName],\n false\n );\n fields[fieldName].hidden = true;\n }\n if (!fields[fieldName]) continue;\n\n const thenEffect: Record<string, unknown> = {};\n const elseEffect: Record<string, unknown> = {};\n\n // Visibility\n if (thenSchema?.properties?.[fieldName]) {\n thenEffect.hidden = false;\n }\n if (elseSchema?.properties?.[fieldName]) {\n elseEffect.hidden = false;\n }\n // If only in then → hide in else\n if (thenSchema?.properties?.[fieldName] && !elseSchema?.properties?.[fieldName]) {\n elseEffect.hidden = true;\n }\n // If only in else → hide in then\n if (!thenSchema?.properties?.[fieldName] && elseSchema?.properties?.[fieldName]) {\n thenEffect.hidden = true;\n }\n\n // Required\n if (thenSchema?.required?.includes(fieldName)) {\n thenEffect.required = true;\n }\n if (elseSchema?.required?.includes(fieldName)) {\n elseEffect.required = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_ite_${fieldName}`,\n when: condition,\n then: thenEffect,\n };\n\n if (Object.keys(elseEffect).length > 0) {\n rule.else = elseEffect;\n }\n\n fields[fieldName].rules = [...(fields[fieldName].rules ?? []), rule];\n }\n}\n\n/**\n * Convert oneOf/anyOf composition with discriminator detection to IRule[].\n */\nexport function convertComposition(\n schema: IJsonSchemaNode,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n const variants = schema.oneOf ?? schema.anyOf;\n if (!variants || variants.length === 0) return;\n\n const compositionType = schema.oneOf ? \"oneOf\" : \"anyOf\";\n\n // Detect discriminator: a property that has const/enum in every variant\n const discriminator = findDiscriminator(variants);\n\n if (discriminator) {\n convertWithDiscriminator(\n discriminator,\n variants,\n fields,\n rootSchema,\n idPrefix,\n compositionType\n );\n } else {\n convertWithSyntheticDiscriminator(\n variants,\n fields,\n rootSchema,\n idPrefix,\n compositionType\n );\n }\n}\n\n/**\n * Convert a JSON Schema condition shape to our ICondition type.\n * Used for if/then/else, dependencies, and composition detection.\n */\nexport function schemaToCondition(\n schema: IJsonSchemaNode\n): ICondition | null {\n if (!schema) return null;\n\n // { not: {...} }\n if (schema.not) {\n const inner = schemaToCondition(schema.not as IJsonSchemaNode);\n if (!inner) return null;\n return { operator: \"not\", conditions: [inner] };\n }\n\n // { allOf: [...] }\n if (schema.allOf && schema.allOf.length > 0) {\n const conditions = schema.allOf\n .map((s) => schemaToCondition(s))\n .filter((c): c is ICondition => c !== null);\n if (conditions.length === 0) return null;\n if (conditions.length === 1) return conditions[0];\n return { operator: \"and\", conditions };\n }\n\n // { anyOf: [...] }\n if (schema.anyOf && schema.anyOf.length > 0) {\n const conditions = schema.anyOf\n .map((s) => schemaToCondition(s))\n .filter((c): c is ICondition => c !== null);\n if (conditions.length === 0) return null;\n if (conditions.length === 1) return conditions[0];\n return { operator: \"or\", conditions };\n }\n\n // { required: [\"x\"] } without properties → isNotEmpty\n if (schema.required && !schema.properties) {\n const conditions: ICondition[] = schema.required.map((field) => ({\n field,\n operator: \"isNotEmpty\" as const,\n }));\n if (conditions.length === 1) return conditions[0];\n return { operator: \"and\", conditions };\n }\n\n // { properties: { x: { const: v } } }\n if (schema.properties) {\n const conditions: ICondition[] = [];\n\n for (const [field, propSchema] of Object.entries(schema.properties)) {\n const condition = propertySchemaToCondition(field, propSchema);\n if (condition) conditions.push(condition);\n }\n\n // Also handle required alongside properties\n if (schema.required) {\n for (const field of schema.required) {\n if (!schema.properties[field]) {\n conditions.push({ field, operator: \"isNotEmpty\" });\n }\n }\n }\n\n if (conditions.length === 0) return null;\n if (conditions.length === 1) return conditions[0];\n return { operator: \"and\", conditions };\n }\n\n return null;\n}\n\n// --- Internal helpers ---\n\nfunction propertySchemaToCondition(\n field: string,\n schema: IJsonSchemaNode\n): ICondition | null {\n if (schema.const !== undefined) {\n return { field, operator: \"equals\", value: schema.const };\n }\n if (schema.enum && schema.enum.length > 0) {\n return { field, operator: \"in\", value: schema.enum };\n }\n if (schema.minimum !== undefined) {\n return { field, operator: \"greaterThanOrEqual\", value: schema.minimum };\n }\n if (schema.maximum !== undefined) {\n return { field, operator: \"lessThanOrEqual\", value: schema.maximum };\n }\n if (schema.minLength !== undefined && schema.minLength > 0) {\n return { field, operator: \"isNotEmpty\" };\n }\n if (schema.pattern) {\n return { field, operator: \"matches\", value: schema.pattern };\n }\n\n return null;\n}\n\nfunction convertSchemaDependency(\n sourceField: string,\n depSchema: IJsonSchemaNode,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n const depRequired = new Set(depSchema.required ?? []);\n\n if (depSchema.properties) {\n for (const [depFieldName, depFieldSchema] of Object.entries(\n depSchema.properties\n )) {\n // Create field if it doesn't exist\n if (!fields[depFieldName]) {\n fields[depFieldName] = schemaNodeToFieldConfig(\n depFieldName,\n depFieldSchema,\n depRequired.has(depFieldName)\n );\n fields[depFieldName].hidden = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_schemadep_${sourceField}_${depFieldName}`,\n when: { field: sourceField, operator: \"isNotEmpty\" },\n then: {\n hidden: false,\n ...(depRequired.has(depFieldName) ? { required: true } : {}),\n },\n else: {\n hidden: true,\n },\n };\n\n fields[depFieldName].rules = [\n ...(fields[depFieldName].rules ?? []),\n rule,\n ];\n }\n }\n\n // Handle oneOf inside schema dependencies (common RJSF pattern)\n if (depSchema.oneOf) {\n convertComposition(\n depSchema,\n fields,\n rootSchema,\n `${idPrefix}_schemadep_${sourceField}`\n );\n }\n}\n\nfunction findDiscriminator(\n variants: IJsonSchemaNode[]\n): string | null {\n if (variants.length < 2) return null;\n\n // Find properties that appear in all variants with const or single-value enum\n const firstVariant = variants[0];\n if (!firstVariant.properties) return null;\n\n for (const propName of Object.keys(firstVariant.properties)) {\n const prop = firstVariant.properties[propName];\n if (!hasConstOrSingleEnum(prop)) continue;\n\n // Check all other variants have this property with const/enum\n const allHave = variants.every(\n (v) => v.properties?.[propName] && hasConstOrSingleEnum(v.properties[propName])\n );\n\n if (allHave) {\n // Verify all values are distinct\n const values = variants.map((v) =>\n getConstValue(v.properties![propName])\n );\n const unique = new Set(values.map(String));\n if (unique.size === variants.length) return propName;\n }\n }\n\n return null;\n}\n\nfunction hasConstOrSingleEnum(node: IJsonSchemaNode): boolean {\n if (node.const !== undefined) return true;\n if (node.enum && node.enum.length === 1) return true;\n return false;\n}\n\nfunction getConstValue(node: IJsonSchemaNode): unknown {\n if (node.const !== undefined) return node.const;\n if (node.enum && node.enum.length === 1) return node.enum[0];\n return undefined;\n}\n\nfunction convertWithDiscriminator(\n discriminatorField: string,\n variants: IJsonSchemaNode[],\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string,\n compositionType: string\n): void {\n // Ensure discriminator field exists as a dropdown\n const allValues = variants.map((v) =>\n getConstValue(v.properties![discriminatorField])\n );\n if (!fields[discriminatorField]) {\n fields[discriminatorField] = {\n type: \"Dropdown\",\n label: discriminatorField,\n options: allValues.map((v) => ({\n value: String(v),\n label: String(v),\n })),\n };\n }\n\n // For each variant, create visibility rules for variant-specific fields\n for (const variant of variants) {\n if (!variant.properties) continue;\n const variantValue = getConstValue(variant.properties[discriminatorField]);\n const variantRequired = new Set(variant.required ?? []);\n\n for (const [fieldName, fieldSchema] of Object.entries(variant.properties)) {\n if (fieldName === discriminatorField) continue;\n\n if (!fields[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n fieldSchema,\n variantRequired.has(fieldName)\n );\n fields[fieldName].hidden = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_${compositionType}_${discriminatorField}_${fieldName}`,\n when: {\n field: discriminatorField,\n operator: \"equals\",\n value: variantValue,\n },\n then: {\n hidden: false,\n ...(variantRequired.has(fieldName) ? { required: true } : {}),\n },\n else: { hidden: true },\n };\n\n fields[fieldName].rules = [\n ...(fields[fieldName].rules ?? []),\n rule,\n ];\n }\n }\n}\n\nfunction convertWithSyntheticDiscriminator(\n variants: IJsonSchemaNode[],\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string,\n compositionType: string\n): void {\n // Create a synthetic _variant dropdown\n const options = variants.map((_, i) => ({\n value: String(i),\n label: `Option ${i + 1}`,\n }));\n\n fields[\"_variant\"] = {\n type: \"Dropdown\",\n label: \"Variant\",\n options,\n };\n\n // For each variant, create visibility rules\n for (let i = 0; i < variants.length; i++) {\n const variant = variants[i];\n if (!variant.properties) continue;\n const variantRequired = new Set(variant.required ?? []);\n\n for (const [fieldName, fieldSchema] of Object.entries(variant.properties)) {\n if (!fields[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n fieldSchema,\n variantRequired.has(fieldName)\n );\n fields[fieldName].hidden = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_${compositionType}_variant${i}_${fieldName}`,\n when: {\n field: \"_variant\",\n operator: \"equals\",\n value: String(i),\n },\n then: {\n hidden: false,\n ...(variantRequired.has(fieldName) ? { required: true } : {}),\n },\n else: { hidden: true },\n };\n\n fields[fieldName].rules = [\n ...(fields[fieldName].rules ?? []),\n rule,\n ];\n }\n }\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { IFormConfig } from \"../../types/IFormConfig\";\nimport { IJsonSchemaNode, IRjsfUiSchema, IRjsfConvertOptions } from \"./types\";\nimport { resolveRefs } from \"./refResolver\";\nimport {\n schemaNodeToFieldConfig,\n applyUiSchema,\n extractValidationRules,\n} from \"./fieldMapper\";\nimport {\n convertDependencies,\n convertIfThenElse,\n convertComposition,\n} from \"./ruleConverter\";\n\n/**\n * Convert an RJSF schema + uiSchema + formData into an IFormConfig (v2).\n *\n * This is the main entry point for RJSF migration. It:\n * 1. Resolves all $ref pointers\n * 2. Merges allOf if present\n * 3. Maps properties to IFieldConfig\n * 4. Applies uiSchema rendering hints\n * 5. Merges formData as defaultValues\n * 6. Converts dependencies → IRule[]\n * 7. Converts if/then/else → IRule[]\n * 8. Converts oneOf/anyOf → IRule[]\n * 9. Determines fieldOrder from uiSchema or property order\n */\nexport function fromRjsfSchema(\n schema: IJsonSchemaNode,\n uiSchema?: IRjsfUiSchema,\n formData?: Record<string, unknown>,\n options?: IRjsfConvertOptions\n): IFormConfig {\n const strategy = options?.nestedObjectStrategy ?? \"flatten\";\n const idPrefix = options?.ruleIdPrefix ?? \"rjsf\";\n\n // Step 1: Resolve $ref pointers\n const resolved = resolveRefs(schema);\n\n // Step 2: Merge allOf if present\n const merged = mergeAllOf(resolved);\n\n // Step 3: Map properties to field configs\n const fields: Record<string, IFieldConfig> = {};\n const requiredSet = new Set(merged.required ?? []);\n\n if (merged.properties) {\n mapProperties(\n merged.properties,\n requiredSet,\n fields,\n \"\",\n strategy,\n uiSchema,\n formData\n );\n }\n\n // Step 4-5 handled in mapProperties\n\n // Step 6: Convert dependencies\n if (merged.dependencies) {\n convertDependencies(merged.dependencies, fields, merged, idPrefix);\n }\n\n // Step 7: Convert if/then/else\n if (merged.if) {\n convertIfThenElse(merged, fields, merged, idPrefix);\n }\n\n // Step 8: Convert oneOf/anyOf\n if (merged.oneOf || merged.anyOf) {\n convertComposition(merged, fields, merged, idPrefix);\n }\n\n // Step 9: Determine field order\n const fieldOrder = resolveFieldOrder(fields, uiSchema);\n\n return {\n version: 2,\n fields,\n fieldOrder,\n };\n}\n\n// --- Internal helpers ---\n\nfunction mapProperties(\n properties: Record<string, IJsonSchemaNode>,\n requiredSet: Set<string>,\n fields: Record<string, IFieldConfig>,\n prefix: string,\n strategy: \"flatten\" | \"fieldArray\",\n uiSchema?: IRjsfUiSchema,\n formData?: Record<string, unknown>\n): void {\n for (const [propName, propSchema] of Object.entries(properties)) {\n const fullName = prefix ? `${prefix}.${propName}` : propName;\n const isRequired = requiredSet.has(propName);\n\n if (isObjectType(propSchema) && propSchema.properties) {\n if (strategy === \"flatten\") {\n // Flatten: recurse with dot-prefix\n const nestedRequired = new Set(propSchema.required ?? []);\n const nestedUiSchema = uiSchema?.[propName] as IRjsfUiSchema | undefined;\n const nestedFormData = formData?.[propName] as\n | Record<string, unknown>\n | undefined;\n mapProperties(\n propSchema.properties,\n nestedRequired,\n fields,\n fullName,\n strategy,\n nestedUiSchema,\n nestedFormData\n );\n continue;\n } else {\n // FieldArray strategy for nested objects\n const items: Record<string, IFieldConfig> = {};\n const nestedRequired = new Set(propSchema.required ?? []);\n for (const [itemProp, itemSchema] of Object.entries(\n propSchema.properties\n )) {\n items[itemProp] = schemaNodeToFieldConfig(\n itemProp,\n itemSchema,\n nestedRequired.has(itemProp)\n );\n }\n fields[fullName] = {\n type: \"FieldArray\",\n label: propSchema.title ?? propName,\n items,\n };\n continue;\n }\n }\n\n // Array with object items → FieldArray\n if (isArrayWithObjectItems(propSchema)) {\n const itemSchema = propSchema.items as IJsonSchemaNode;\n const items: Record<string, IFieldConfig> = {};\n const itemRequired = new Set(itemSchema.required ?? []);\n if (itemSchema.properties) {\n for (const [itemProp, itemPropSchema] of Object.entries(\n itemSchema.properties\n )) {\n items[itemProp] = schemaNodeToFieldConfig(\n itemProp,\n itemPropSchema,\n itemRequired.has(itemProp)\n );\n }\n }\n const config = schemaNodeToFieldConfig(fullName, propSchema, isRequired);\n config.type = \"FieldArray\";\n config.items = items;\n if (propSchema.minItems !== undefined) config.minItems = propSchema.minItems;\n if (propSchema.maxItems !== undefined) config.maxItems = propSchema.maxItems;\n fields[fullName] = config;\n\n // Apply uiSchema\n const fieldUiSchema = getFieldUiSchema(uiSchema, propName, prefix);\n if (fieldUiSchema) {\n fields[fullName] = applyUiSchema(fields[fullName], fieldUiSchema);\n }\n\n // Apply formData\n const dataValue = getFormDataValue(formData, propName);\n if (dataValue !== undefined && fields[fullName].defaultValue === undefined) {\n fields[fullName].defaultValue = dataValue;\n }\n\n continue;\n }\n\n // Standard field\n const config = schemaNodeToFieldConfig(fullName, propSchema, isRequired);\n fields[fullName] = config;\n\n // Apply uiSchema\n const fieldUiSchema = getFieldUiSchema(uiSchema, propName, prefix);\n if (fieldUiSchema) {\n fields[fullName] = applyUiSchema(fields[fullName], fieldUiSchema);\n }\n\n // Apply formData as defaultValue\n const dataValue = getFormDataValue(formData, propName);\n if (dataValue !== undefined && fields[fullName].defaultValue === undefined) {\n fields[fullName].defaultValue = dataValue;\n }\n }\n}\n\nfunction mergeAllOf(schema: IJsonSchemaNode): IJsonSchemaNode {\n if (!schema.allOf || schema.allOf.length === 0) return schema;\n\n const { allOf, ...base } = schema;\n let result = { ...base };\n\n for (const subSchema of allOf) {\n result = mergeSchemas(result, subSchema);\n }\n\n return result;\n}\n\nfunction mergeSchemas(\n a: IJsonSchemaNode,\n b: IJsonSchemaNode\n): IJsonSchemaNode {\n const result = { ...a };\n\n if (b.properties) {\n result.properties = { ...(result.properties ?? {}), ...b.properties };\n }\n if (b.required) {\n const existing = new Set(result.required ?? []);\n for (const r of b.required) existing.add(r);\n result.required = [...existing];\n }\n if (b.if) result.if = b.if;\n if (b.then) result.then = b.then;\n if (b.else) result.else = b.else;\n if (b.dependencies) {\n result.dependencies = {\n ...(result.dependencies ?? {}),\n ...b.dependencies,\n };\n }\n\n return result;\n}\n\nfunction isObjectType(node: IJsonSchemaNode): boolean {\n if (node.type === \"object\") return true;\n if (Array.isArray(node.type) && node.type.includes(\"object\")) return true;\n return false;\n}\n\nfunction isArrayWithObjectItems(node: IJsonSchemaNode): boolean {\n const type = Array.isArray(node.type) ? node.type[0] : node.type;\n if (type !== \"array\") return false;\n const items = node.items;\n if (!items || Array.isArray(items)) return false;\n return items.type === \"object\" && !!items.properties;\n}\n\nfunction getFieldUiSchema(\n uiSchema: IRjsfUiSchema | undefined,\n fieldName: string,\n prefix: string\n): IRjsfUiSchema | undefined {\n if (!uiSchema) return undefined;\n // Navigate into nested uiSchema for prefixed fields\n if (prefix) {\n const parts = prefix.split(\".\");\n let current: IRjsfUiSchema | undefined = uiSchema;\n for (const part of parts) {\n current = current?.[part] as IRjsfUiSchema | undefined;\n }\n return current?.[fieldName] as IRjsfUiSchema | undefined;\n }\n return uiSchema[fieldName] as IRjsfUiSchema | undefined;\n}\n\nfunction getFormDataValue(\n formData: Record<string, unknown> | undefined,\n fieldName: string\n): unknown {\n if (!formData) return undefined;\n return formData[fieldName];\n}\n\nfunction resolveFieldOrder(\n fields: Record<string, IFieldConfig>,\n uiSchema?: IRjsfUiSchema\n): string[] {\n const uiOrder = uiSchema?.[\"ui:order\"];\n if (!Array.isArray(uiOrder)) return Object.keys(fields);\n\n const allFields = new Set(Object.keys(fields));\n const order: string[] = [];\n const wildcardIdx = uiOrder.indexOf(\"*\");\n\n for (const item of uiOrder) {\n if (item === \"*\") continue;\n if (allFields.has(item)) {\n order.push(item);\n allFields.delete(item);\n }\n }\n\n if (wildcardIdx !== -1) {\n // Insert remaining fields where * was\n const remaining = [...allFields];\n order.splice(wildcardIdx, 0, ...remaining);\n } else {\n // Append remaining at end\n order.push(...allFields);\n }\n\n return order;\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { IFormConfig } from \"../../types/IFormConfig\";\nimport { IJsonSchemaNode, IRjsfUiSchema } from \"./types\";\n\n/**\n * Reverse-convert an IFormConfig to JSON Schema + uiSchema.\n *\n * Best-effort: structural fidelity only. Rules, computed values,\n * and other dynamic features do NOT map back to JSON Schema.\n */\nexport function toRjsfSchema(config: IFormConfig): {\n schema: IJsonSchemaNode;\n uiSchema: IRjsfUiSchema;\n} {\n const properties: Record<string, IJsonSchemaNode> = {};\n const required: string[] = [];\n const uiSchema: IRjsfUiSchema = {};\n\n for (const [fieldName, fieldConfig] of Object.entries(config.fields)) {\n // Handle dot-notation (flattened nested objects)\n if (fieldName.includes(\".\")) {\n setNestedProperty(properties, required, uiSchema, fieldName, fieldConfig);\n continue;\n }\n\n properties[fieldName] = fieldConfigToSchemaNode(fieldConfig);\n if (fieldConfig.required) required.push(fieldName);\n\n const fieldUi = fieldConfigToUiSchema(fieldConfig);\n if (Object.keys(fieldUi).length > 0) {\n uiSchema[fieldName] = fieldUi;\n }\n }\n\n // Set field order in uiSchema\n if (config.fieldOrder && config.fieldOrder.length > 0) {\n uiSchema[\"ui:order\"] = config.fieldOrder;\n }\n\n const schema: IJsonSchemaNode = {\n type: \"object\",\n properties,\n };\n if (required.length > 0) schema.required = required;\n\n return { schema, uiSchema };\n}\n\n// --- Internal helpers ---\n\nconst REVERSE_TYPE_MAP: Record<string, string> = {\n Textbox: \"string\",\n Textarea: \"string\",\n Number: \"number\",\n Slider: \"number\",\n Toggle: \"boolean\",\n DateControl: \"string\",\n Dropdown: \"string\",\n Multiselect: \"array\",\n DocumentLinks: \"string\",\n DynamicFragment: \"string\",\n};\n\nconst REVERSE_WIDGET_MAP: Record<string, string> = {\n Textarea: \"textarea\",\n Slider: \"range\",\n Toggle: \"checkbox\",\n DocumentLinks: \"file\",\n};\n\nfunction fieldConfigToSchemaNode(config: IFieldConfig): IJsonSchemaNode {\n const node: IJsonSchemaNode = {};\n\n // Type\n const jsonType = REVERSE_TYPE_MAP[config.type] ?? \"string\";\n node.type = jsonType;\n\n if (config.label) node.title = config.label;\n if (config.description) node.description = config.description;\n if (config.defaultValue !== undefined) node.default = config.defaultValue;\n\n // Options → enum\n if (config.options && config.options.length > 0) {\n node.enum = config.options.map((o) => o.value);\n const labels = config.options.map((o) => o.label);\n const valuesAsStrings = config.options.map((o) => String(o.value));\n // Only set enumNames if labels differ from values\n if (labels.some((l, i) => l !== valuesAsStrings[i])) {\n node.enumNames = labels;\n }\n }\n\n // Validation rules → schema constraints\n if (config.validate) {\n for (const rule of config.validate) {\n applyValidationToSchema(node, rule.name, rule.params);\n }\n }\n\n // FieldArray → array with object items\n if (config.type === \"FieldArray\" && config.items) {\n node.type = \"array\";\n const itemProperties: Record<string, IJsonSchemaNode> = {};\n const itemRequired: string[] = [];\n for (const [itemName, itemConfig] of Object.entries(config.items)) {\n itemProperties[itemName] = fieldConfigToSchemaNode(itemConfig);\n if (itemConfig.required) itemRequired.push(itemName);\n }\n node.items = {\n type: \"object\",\n properties: itemProperties,\n ...(itemRequired.length > 0 ? { required: itemRequired } : {}),\n };\n if (config.minItems !== undefined) node.minItems = config.minItems;\n if (config.maxItems !== undefined) node.maxItems = config.maxItems;\n }\n\n // Multiselect → array with enum items\n if (config.type === \"Multiselect\" && config.options) {\n node.type = \"array\";\n node.items = {\n type: \"string\",\n enum: config.options.map((o) => o.value),\n };\n // Move enum off the root node\n delete node.enum;\n delete node.enumNames;\n }\n\n // Format\n if (config.type === \"DateControl\") {\n node.format = \"date\";\n }\n if (config.type === \"DocumentLinks\") {\n node.format = \"data-url\";\n }\n\n // Password / color via config\n if (config.config?.type === \"password\" || config.config?.type === \"color\") {\n // No schema equivalent, handled in uiSchema\n }\n\n return node;\n}\n\nfunction fieldConfigToUiSchema(config: IFieldConfig): IRjsfUiSchema {\n const ui: IRjsfUiSchema = {};\n\n // Widget mapping\n const widget = REVERSE_WIDGET_MAP[config.type];\n if (widget) ui[\"ui:widget\"] = widget;\n\n // Config-based widget overrides\n if (config.config?.type === \"password\") ui[\"ui:widget\"] = \"password\";\n if (config.config?.type === \"color\") ui[\"ui:widget\"] = \"color\";\n if (config.config?.display === \"radio\") ui[\"ui:widget\"] = \"radio\";\n if (config.config?.display === \"checkboxes\") ui[\"ui:widget\"] = \"checkboxes\";\n\n if (config.placeholder) ui[\"ui:placeholder\"] = config.placeholder;\n if (config.helpText) ui[\"ui:help\"] = config.helpText;\n if (config.hidden) ui[\"ui:hidden\"] = true;\n if (config.readOnly) ui[\"ui:readonly\"] = true;\n if (config.disabled) ui[\"ui:disabled\"] = true;\n if (config.config?.autofocus) ui[\"ui:autofocus\"] = true;\n if (config.config?.className) ui[\"ui:classNames\"] = config.config.className as string;\n if (config.config?.hideLabel) ui[\"ui:label\"] = false;\n\n // Disabled options\n if (config.options) {\n const disabled = config.options\n .filter((o) => o.disabled)\n .map((o) => o.value);\n if (disabled.length > 0) ui[\"ui:enumDisabled\"] = disabled;\n }\n\n return ui;\n}\n\nfunction applyValidationToSchema(\n node: IJsonSchemaNode,\n name: string,\n params?: Record<string, unknown>\n): void {\n switch (name) {\n case \"minLength\":\n node.minLength = Number(params?.min ?? 0);\n break;\n case \"maxLength\":\n node.maxLength = Number(params?.max ?? 0);\n break;\n case \"pattern\":\n node.pattern = String(params?.pattern ?? \"\");\n break;\n case \"numericRange\":\n if (params?.min !== undefined && params.min !== -Infinity)\n node.minimum = Number(params.min);\n if (params?.max !== undefined && params.max !== Infinity)\n node.maximum = Number(params.max);\n break;\n case \"exclusiveNumericRange\":\n if (params?.exclusiveMin !== undefined)\n node.exclusiveMinimum = Number(params.exclusiveMin);\n if (params?.exclusiveMax !== undefined)\n node.exclusiveMaximum = Number(params.exclusiveMax);\n break;\n case \"multipleOf\":\n node.multipleOf = Number(params?.factor ?? 1);\n break;\n case \"email\":\n node.format = \"email\";\n break;\n case \"url\":\n node.format = \"uri\";\n break;\n case \"uniqueInArray\":\n node.uniqueItems = true;\n break;\n }\n}\n\nfunction setNestedProperty(\n properties: Record<string, IJsonSchemaNode>,\n required: string[],\n uiSchema: IRjsfUiSchema,\n dotPath: string,\n config: IFieldConfig\n): void {\n const parts = dotPath.split(\".\");\n let currentProps = properties;\n let currentUi = uiSchema;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!currentProps[part]) {\n currentProps[part] = {\n type: \"object\",\n properties: {},\n };\n }\n if (!currentProps[part].properties) {\n currentProps[part].properties = {};\n }\n currentProps = currentProps[part].properties!;\n\n if (!currentUi[part]) {\n currentUi[part] = {};\n }\n currentUi = currentUi[part] as IRjsfUiSchema;\n }\n\n const leafName = parts[parts.length - 1];\n currentProps[leafName] = fieldConfigToSchemaNode(config);\n if (config.required) {\n // Add to parent's required array\n const parentPath = parts.slice(0, -1);\n let parentNode: IJsonSchemaNode | undefined;\n let props = properties;\n for (const p of parentPath) {\n parentNode = props[p];\n props = parentNode?.properties ?? {};\n }\n if (parentNode) {\n parentNode.required = [...(parentNode.required ?? []), leafName];\n }\n }\n\n const fieldUi = fieldConfigToUiSchema(config);\n if (Object.keys(fieldUi).length > 0) {\n currentUi[leafName] = fieldUi;\n }\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IOption } from \"../types/IOption\";\n\n/**\n * Converts a Zod object schema to Record<string, IFieldConfig>.\n * Does NOT require zod as a dependency — inspects the schema shape at runtime.\n */\nexport function zodSchemaToFieldConfig(zodSchema: unknown): Record<string, IFieldConfig> {\n const configs: Record<string, IFieldConfig> = {};\n const shape = getZodShape(zodSchema);\n if (!shape) return configs;\n\n for (const [fieldName, fieldSchema] of Object.entries(shape)) {\n configs[fieldName] = zodFieldToConfig(fieldName, fieldSchema as ZodDef);\n }\n\n return configs;\n}\n\ninterface ZodDef {\n _def?: {\n typeName?: string;\n innerType?: ZodDef;\n checks?: Array<{ kind: string; value?: unknown; message?: string }>;\n values?: string[];\n options?: ZodDef[];\n type?: ZodDef;\n };\n}\n\nfunction getZodShape(schema: unknown): Record<string, unknown> | null {\n const s = schema as ZodDef;\n if (s?._def && typeof s._def === \"object\") {\n const def = s._def as Record<string, unknown>;\n if (typeof def.shape === \"function\") return (def.shape as () => Record<string, unknown>)();\n if (typeof def.shape === \"object\" && def.shape !== null) return def.shape as Record<string, unknown>;\n }\n return null;\n}\n\nfunction zodFieldToConfig(fieldName: string, field: ZodDef): IFieldConfig {\n const { typeName, isOptional } = unwrapZodType(field);\n const checks = getZodChecks(field);\n\n const config: IFieldConfig = {\n type: \"Textbox\",\n label: formatLabel(fieldName),\n required: !isOptional,\n };\n\n switch (typeName) {\n case \"ZodString\":\n config.type = \"Textbox\";\n if (checks.some(c => c.kind === \"email\")) {\n config.validate = [...(config.validate ?? []), { name: \"email\" }];\n }\n if (checks.some(c => c.kind === \"url\")) {\n config.validate = [...(config.validate ?? []), { name: \"url\" }];\n }\n break;\n case \"ZodNumber\":\n config.type = \"Number\";\n break;\n case \"ZodBoolean\":\n config.type = \"Toggle\";\n break;\n case \"ZodEnum\":\n case \"ZodNativeEnum\": {\n config.type = \"Dropdown\";\n const values = getZodEnumValues(field);\n if (values) {\n config.options = values.map(v => ({ value: String(v), label: String(v) }));\n }\n break;\n }\n case \"ZodDate\":\n config.type = \"DateControl\";\n break;\n case \"ZodArray\":\n config.type = \"Multiselect\";\n break;\n default:\n config.type = \"Textbox\";\n }\n\n return config;\n}\n\nfunction unwrapZodType(field: ZodDef): { typeName: string; isOptional: boolean } {\n let current = field;\n let isOptional = false;\n while (current?._def) {\n const tn = current._def.typeName;\n if (tn === \"ZodOptional\" || tn === \"ZodNullable\") {\n isOptional = true;\n current = current._def.innerType as ZodDef;\n } else if (tn === \"ZodDefault\") {\n current = current._def.innerType as ZodDef;\n } else {\n break;\n }\n }\n return { typeName: current?._def?.typeName ?? \"ZodString\", isOptional };\n}\n\nfunction getZodChecks(field: ZodDef): Array<{ kind: string; value?: unknown }> {\n let current = field;\n while (current?._def) {\n if (current._def.checks) return current._def.checks;\n if (current._def.innerType) { current = current._def.innerType as ZodDef; } else { break; }\n }\n return [];\n}\n\nfunction getZodEnumValues(field: ZodDef): string[] | null {\n let current = field;\n while (current?._def) {\n if (current._def.values) return current._def.values;\n if (current._def.innerType) { current = current._def.innerType as ZodDef; } else { break; }\n }\n return null;\n}\n\nfunction formatLabel(fieldName: string): string {\n return fieldName.replace(/([A-Z])/g, \" $1\").replace(/^./, s => s.toUpperCase()).trim();\n}\n","import React from \"react\";\nimport { Dictionary } from \"../utils\";\n\ntype LazyFieldImport = () => Promise<{ default: React.ComponentType<any> }>;\n\n/**\n * Creates a field registry where components are loaded on-demand via React.lazy().\n * Fields are only loaded when first rendered, reducing initial bundle size.\n *\n * @example\n * const registry = createLazyFieldRegistry({\n * Textbox: () => import(\"./fields/Textbox\"),\n * Dropdown: () => import(\"./fields/Dropdown\"),\n * });\n */\nexport function createLazyFieldRegistry(\n imports: Record<string, LazyFieldImport>\n): Dictionary<React.JSX.Element> {\n const registry: Dictionary<React.JSX.Element> = {};\n\n for (const [key, importFn] of Object.entries(imports)) {\n const LazyComponent = React.lazy(importFn);\n registry[key] = React.createElement(\n React.Suspense,\n { fallback: React.createElement(\"span\", { className: \"field-loading\" }, \"Loading...\") },\n React.createElement(LazyComponent)\n );\n }\n\n return registry;\n}\n","import { useEffect, useCallback, useRef, useState } from \"react\";\nimport { IEntityData } from \"../utils\";\nimport { serializeFormState, deserializeFormState } from \"../utils/formStateSerialization\";\n\nexport interface IDraftPersistenceOptions {\n /** Unique form identifier for storage key */\n formId: string;\n /** Current form data to persist */\n data: IEntityData;\n /** Auto-save interval in ms (default 30000) */\n saveIntervalMs?: number;\n /** Whether persistence is enabled (default true) */\n enabled?: boolean;\n /** Custom storage key prefix (default \"draft_\") */\n storageKeyPrefix?: string;\n}\n\nexport interface IDraftState {\n data: IEntityData;\n timestamp: number;\n}\n\nexport interface IUseDraftPersistenceResult {\n /** Recover a saved draft if one exists */\n recoverDraft: () => IDraftState | null;\n /** Clear the saved draft */\n clearDraft: () => void;\n /** Whether a draft exists */\n hasDraft: boolean;\n /** Manually save current state as draft */\n saveDraft: () => void;\n}\n\nfunction getStorageKey(formId: string, prefix: string): string {\n return `${prefix}${formId}`;\n}\n\nfunction getStorage(): Storage | undefined {\n try {\n return typeof localStorage !== \"undefined\" ? localStorage : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Hook that persists form draft state to localStorage on a configurable interval.\n *\n * Handles localStorage errors gracefully (e.g. private browsing, quota exceeded).\n */\nexport function useDraftPersistence(options: IDraftPersistenceOptions): IUseDraftPersistenceResult {\n const {\n formId,\n data,\n saveIntervalMs = 30000,\n enabled = true,\n storageKeyPrefix = \"draft_\",\n } = options;\n\n const [hasDraft, setHasDraft] = useState<boolean>(false);\n const dataRef = useRef<IEntityData>(data);\n const intervalRef = useRef<ReturnType<typeof setInterval> | undefined>(undefined);\n\n // Keep dataRef up to date with the latest data\n useEffect(() => {\n dataRef.current = data;\n }, [data]);\n\n const storageKey = getStorageKey(formId, storageKeyPrefix);\n\n const saveDraft = useCallback(() => {\n try {\n const storage = getStorage();\n if (!storage) return;\n const draftState: IDraftState = {\n data: dataRef.current,\n timestamp: Date.now(),\n };\n storage.setItem(storageKey, serializeFormState(draftState as unknown as IEntityData));\n setHasDraft(true);\n } catch {\n // localStorage may throw in private browsing or when quota is exceeded\n }\n }, [storageKey]);\n\n const recoverDraft = useCallback((): IDraftState | null => {\n try {\n const storage = getStorage();\n if (!storage) return null;\n const stored = storage.getItem(storageKey);\n if (!stored) return null;\n const parsed = deserializeFormState(stored) as unknown as IDraftState;\n return parsed;\n } catch {\n return null;\n }\n }, [storageKey]);\n\n const clearDraft = useCallback(() => {\n try {\n const storage = getStorage();\n if (!storage) return;\n storage.removeItem(storageKey);\n setHasDraft(false);\n } catch {\n // localStorage may throw in private browsing\n }\n }, [storageKey]);\n\n // On mount, check if a draft exists\n useEffect(() => {\n if (!enabled) return;\n try {\n const storage = getStorage();\n if (!storage) { setHasDraft(false); return; }\n const stored = storage.getItem(storageKey);\n setHasDraft(stored !== null);\n } catch {\n setHasDraft(false);\n }\n }, [enabled, storageKey]);\n\n // Set up auto-save interval\n useEffect(() => {\n if (!enabled) return;\n\n intervalRef.current = setInterval(() => {\n saveDraft();\n }, saveIntervalMs);\n\n return () => {\n if (intervalRef.current !== undefined) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n };\n }, [enabled, saveIntervalMs, saveDraft]);\n\n return {\n recoverDraft,\n clearDraft,\n hasDraft,\n saveDraft,\n };\n}\n","import { IEntityData } from \"../utils\";\n\n/**\n * Recursively walk an object tree and replace Date instances with\n * a serializable marker: `{ __type: \"Date\", value: \"<ISO string>\" }`.\n *\n * JSON.stringify's replacer receives the *return value* of `.toJSON()`,\n * which means Date objects appear as plain strings to the replacer.\n * Pre-processing avoids this problem.\n */\nfunction markDates(value: unknown, visited = new WeakSet()): unknown {\n if (value instanceof Date) {\n return { __type: \"Date\", value: value.toISOString() };\n }\n if (Array.isArray(value)) {\n if (visited.has(value)) return value;\n visited.add(value);\n return value.map((item) => markDates(item, visited));\n }\n if (value !== null && typeof value === \"object\") {\n if (visited.has(value as object)) return value;\n visited.add(value as object);\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = markDates((value as Record<string, unknown>)[key], visited);\n }\n return result;\n }\n return value;\n}\n\n/**\n * Serialize form state to a JSON string, preserving Date objects\n * with a special `__type` marker so they can be round-tripped.\n */\nexport function serializeFormState(data: IEntityData): string {\n return JSON.stringify(markDates(data));\n}\n\n/**\n * Deserialize a JSON string back to form state, restoring Date objects\n * that were serialized with `serializeFormState`.\n */\nexport function deserializeFormState(json: string): IEntityData {\n return JSON.parse(json, (_key, value) => {\n if (value && typeof value === \"object\" && value.__type === \"Date\") {\n return new Date(value.value);\n }\n return value;\n });\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Hook that warns the user before navigating away when there are unsaved changes.\n *\n * @param shouldWarn - Whether the beforeunload warning should be active\n * @param message - Custom message (modern browsers ignore custom text but still show a prompt)\n * @param onAbandonment - Optional analytics callback fired when the user leaves with unsaved changes\n */\nexport function useBeforeUnload(\n shouldWarn: boolean,\n message?: string,\n onAbandonment?: () => void,\n): void {\n const onAbandonmentRef = useRef(onAbandonment);\n onAbandonmentRef.current = onAbandonment;\n\n useEffect(() => {\n if (!shouldWarn || typeof window === \"undefined\") return;\n\n const handler = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n onAbandonmentRef.current?.();\n // Modern browsers ignore custom messages but still show a prompt\n return (e.returnValue = message ?? \"You have unsaved changes.\");\n };\n\n window.addEventListener(\"beforeunload\", handler);\n return () => window.removeEventListener(\"beforeunload\", handler);\n }, [shouldWarn, message]);\n}\n","import { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\n\nexport interface IRuleTraceEvent {\n timestamp: number;\n type: \"evaluate\" | \"apply\" | \"revert\" | \"init\";\n triggerField: string;\n triggerValue: unknown;\n affectedField: string;\n ruleId?: string;\n previousState?: Partial<IRuntimeFieldState>;\n newState?: Partial<IRuntimeFieldState>;\n}\n\nlet traceEnabled = false;\nlet traceLog: IRuleTraceEvent[] = [];\nlet traceCallback: ((event: IRuleTraceEvent) => void) | null = null;\n\nexport function enableRuleTracing(callback?: (event: IRuleTraceEvent) => void): void {\n traceEnabled = true;\n traceLog = [];\n traceCallback = callback ?? null;\n}\n\nexport function disableRuleTracing(): void {\n traceEnabled = false;\n traceCallback = null;\n}\n\nexport function traceRuleEvent(event: Omit<IRuleTraceEvent, \"timestamp\">): void {\n if (!traceEnabled) return;\n const fullEvent = { ...event, timestamp: Date.now() };\n traceLog.push(fullEvent);\n traceCallback?.(fullEvent);\n}\n\nexport function getRuleTraceLog(): IRuleTraceEvent[] {\n return [...traceLog];\n}\n\nexport function clearRuleTraceLog(): void {\n traceLog = [];\n}\n\nexport function isRuleTracingEnabled(): boolean {\n return traceEnabled;\n}\n"],"mappings":"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","names":["SortOptions","RulesEngineActionType","maxKb","getNestedValue","React","import_react","import_jsx_runtime","React","pattern","SortOptions","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_react_hook_form","import_react","import_react","import_react_hook_form","import_react","import_react_hook_form","import_react","import_jsx_runtime","React","required","import_jsx_runtime","required","React","import_jsx_runtime","React","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","dirtyFields","import_react","import_jsx_runtime","React","timeline","config","fieldUiSchema","dataValue","required","import_react","React","import_react","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types/ICondition.ts","../src/types/IRulesEngineAction.ts","../src/types/TypedFieldConfig.ts","../src/utils/index.ts","../src/constants.ts","../src/helpers/LocaleRegistry.ts","../src/strings.ts","../src/providers/RulesEngineProvider.tsx","../src/helpers/ConditionEvaluator.ts","../src/helpers/ValueFunctionRegistry.ts","../src/helpers/ExpressionEngine.ts","../src/helpers/EventTimeline.ts","../src/helpers/RuleEngine.ts","../src/reducers/RulesEngineReducer.ts","../src/providers/InjectedFieldProvider.tsx","../src/helpers/ValidationRegistry.ts","../src/helpers/InlineFormHelper.ts","../src/helpers/FieldHelper.ts","../src/helpers/DependencyGraphValidator.ts","../src/helpers/ConfigValidator.ts","../src/components/WizardForm.tsx","../src/helpers/WizardHelper.ts","../src/components/FieldArray.tsx","../src/components/InlineForm.tsx","../src/hooks/useFormAnalytics.ts","../src/components/ConfirmInputsModal.tsx","../src/components/RenderField.tsx","../src/components/FieldWrapper.tsx","../src/helpers/RenderTracker.ts","../src/components/InlineFormFields.tsx","../src/components/FormErrorBoundary.tsx","../src/components/FormDevTools.tsx","../src/utils/rjsf/refResolver.ts","../src/utils/rjsf/fieldMapper.ts","../src/utils/rjsf/ruleConverter.ts","../src/utils/rjsf/converter.ts","../src/utils/rjsf/reverseConverter.ts","../src/utils/zodSchemaImport.ts","../src/utils/lazyFieldRegistry.ts","../src/hooks/useDraftPersistence.ts","../src/utils/formStateSerialization.ts","../src/hooks/useBeforeUnload.ts","../src/helpers/FieldUtils.ts","../src/helpers/RuleTracer.ts"],"sourcesContent":["// Types\nexport * from \"./types\";\n\n// Utils\nexport * from \"./utils\";\n\n// Constants\nexport { ComponentTypes, FormConstants, FIELD_PARENT_PREFIX } from \"./constants\";\n\n// Strings\nexport { FormStrings } from \"./strings\";\n\n// Providers\nexport {\n RulesEngineProvider,\n UseRulesEngineContext,\n} from \"./providers/RulesEngineProvider\";\nexport {\n InjectedFieldProvider,\n UseInjectedFieldContext,\n} from \"./providers/InjectedFieldProvider\";\nexport type { IRulesEngineProvider } from \"./providers/IRulesEngineProvider\";\nexport type { IInjectedFieldProvider } from \"./providers/IInjectedFieldProvider\";\n\n// Rule Engine\nexport {\n evaluateAllRules,\n evaluateAffectedFields,\n buildDependencyGraph,\n buildDefaultFieldStates,\n topologicalSort,\n} from \"./helpers/RuleEngine\";\n\n// Condition Evaluator\nexport {\n evaluateCondition,\n extractConditionDependencies,\n} from \"./helpers/ConditionEvaluator\";\n\n// Helpers\nexport {\n GetChildEntity,\n IsExpandVisible,\n GetConfirmInputModalProps,\n GetComputedValuesOnDirtyFields,\n GetComputedValuesOnCreate,\n ExecuteComputedValue,\n CheckFieldValidationRules,\n CheckAsyncFieldValidationRules,\n CheckValidDropdownOptions,\n CheckDefaultValues,\n InitOnCreateFormState,\n InitOnEditFormState,\n ShowField,\n GetFieldsToRender,\n SortOptions,\n} from \"./helpers/InlineFormHelper\";\n\nexport { SortOptions as SortDropdownOptions } from \"./helpers/FieldHelper\";\n\nexport {\n detectDependencyCycles,\n detectSelfDependencies,\n validateDependencyGraph,\n} from \"./helpers/DependencyGraphValidator\";\nexport type { ICycleError } from \"./helpers/DependencyGraphValidator\";\n\nexport {\n registerValidators,\n getValidator,\n getValidatorRegistry,\n resetValidatorRegistry,\n runValidations,\n runSyncValidations,\n createMinLengthRule,\n createMaxLengthRule,\n createNumericRangeRule,\n createPatternRule,\n createRequiredIfRule,\n registerValidatorMetadata,\n getValidatorMetadata,\n getAllValidatorMetadata,\n resetValidatorMetadataRegistry,\n} from \"./helpers/ValidationRegistry\";\nexport type { ValidatorFn, IValidationContext, IValidatorMetadata } from \"./helpers/ValidationRegistry\";\n\nexport {\n registerValueFunctions,\n getValueFunction,\n executeValueFunction,\n resetValueFunctionRegistry,\n} from \"./helpers/ValueFunctionRegistry\";\nexport type { ValueFunction, IValueFunctionContext } from \"./helpers/ValueFunctionRegistry\";\n\nexport { validateFieldConfigs } from \"./helpers/ConfigValidator\";\nexport type { IConfigValidationError } from \"./helpers/ConfigValidator\";\n\n// Locale\nexport {\n registerLocale,\n getLocaleString,\n resetLocale,\n getCurrentLocale,\n} from \"./helpers/LocaleRegistry\";\n\n// Wizard\nexport { WizardForm } from \"./components/WizardForm\";\nexport type { IWizardNavigationProps, IWizardStepHeaderProps, IWizardFormProps } from \"./components/WizardForm\";\nexport { getVisibleSteps, getStepFields, getStepFieldOrder, validateStepFields, isStepValid, getStepIndex } from \"./helpers/WizardHelper\";\n\n// Field Array\nexport { FieldArray } from \"./components/FieldArray\";\nexport type { IFieldArrayProps } from \"./components/FieldArray\";\n\n// Components\nexport { FormEngine } from \"./components/InlineForm\";\nexport { FormFields } from \"./components/InlineFormFields\";\nexport { FieldWrapper } from \"./components/FieldWrapper\";\nexport { default as RenderField } from \"./components/RenderField\";\nexport { default as ConfirmInputsModal } from \"./components/ConfirmInputsModal\";\nexport { FormErrorBoundary } from \"./components/FormErrorBoundary\";\n\n// DevTools\nexport { FormDevTools } from \"./components/FormDevTools\";\nexport type { IFormDevToolsProps } from \"./components/FormDevTools\";\n\n// RJSF Schema Import/Export\nexport { fromRjsfSchema, toRjsfSchema } from \"./utils/rjsf\";\nexport type { IJsonSchemaNode, IRjsfUiSchema, IRjsfConvertOptions } from \"./utils/rjsf\";\n\n// Zod Schema Import\nexport { zodSchemaToFieldConfig } from \"./utils/zodSchemaImport\";\n\n// Lazy Field Registry\nexport { createLazyFieldRegistry } from \"./utils/lazyFieldRegistry\";\n\n// Hooks\nexport { useDraftPersistence } from \"./hooks/useDraftPersistence\";\nexport type { IDraftPersistenceOptions, IDraftState, IUseDraftPersistenceResult } from \"./hooks/useDraftPersistence\";\nexport { useBeforeUnload } from \"./hooks/useBeforeUnload\";\nexport { useFormAnalytics } from \"./hooks/useFormAnalytics\";\nexport type { IFormAnalytics } from \"./hooks/useFormAnalytics\";\n\n// Form State Serialization\nexport { serializeFormState, deserializeFormState } from \"./utils/formStateSerialization\";\n\n// Field Utilities (shared across adapter packages)\nexport {\n GetFieldDataTestId,\n FieldClassName,\n getFieldState,\n formatDateTime,\n formatDateTimeValue,\n formatDateRange,\n getFileNames,\n extractDigits,\n formatPhone,\n ellipsifyText,\n MAX_FILE_SIZE_MB_DEFAULT,\n DocumentLinksStrings,\n} from \"./helpers/FieldUtils\";\n\n// Expression Engine\nexport { evaluateExpression, extractExpressionDependencies, extractFunctionDependencies } from \"./helpers/ExpressionEngine\";\n\n// Rule Tracing / Debugging\nexport {\n enableRuleTracing,\n disableRuleTracing,\n traceRuleEvent,\n getRuleTraceLog,\n clearRuleTraceLog,\n isRuleTracingEnabled,\n} from \"./helpers/RuleTracer\";\nexport type { IRuleTraceEvent } from \"./helpers/RuleTracer\";\n\n// Render Tracking\nexport {\n trackRender,\n flushRenderCycle,\n getRenderCounts,\n getLastRenderedFields,\n getTotalFormRenders,\n resetRenderTracker,\n} from \"./helpers/RenderTracker\";\n\n// Event Timeline\nexport {\n logEvent,\n getTimeline,\n clearTimeline,\n} from \"./helpers/EventTimeline\";\nexport type { ITimelineEvent, TimelineEventType } from \"./helpers/EventTimeline\";\n","/**\n * Condition types for the v2 rule engine.\n *\n * Conditions can be field-level comparisons or logical combinations (AND/OR/NOT).\n * Used in IRule.when, IValidationRule.when, and IWizardStepCondition.\n */\n\n/** A condition that compares a single field's value */\nexport interface IFieldCondition {\n /** The field name to evaluate */\n field: string;\n /** Comparison operator */\n operator:\n | \"equals\"\n | \"notEquals\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\"\n | \"contains\"\n | \"notContains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"in\"\n | \"notIn\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"matches\"\n | \"arrayContains\"\n | \"arrayNotContains\"\n | \"arrayLengthEquals\"\n | \"arrayLengthGreaterThan\"\n | \"arrayLengthLessThan\";\n /** The value to compare against. Not required for isEmpty/isNotEmpty. */\n value?: unknown;\n}\n\n/** A logical combination of conditions */\nexport interface ILogicalCondition {\n /** Logical operator to combine child conditions */\n operator: \"and\" | \"or\" | \"not\";\n /** Child conditions to combine */\n conditions: ICondition[];\n}\n\n/** Union type: either a field comparison or a logical combination */\nexport type ICondition = IFieldCondition | ILogicalCondition;\n\n/** Type guard: checks if a condition is a logical condition (and/or/not) */\nexport function isLogicalCondition(condition: ICondition): condition is ILogicalCondition {\n const op = condition.operator;\n return op === \"and\" || op === \"or\" || op === \"not\";\n}\n\n/** Type guard: checks if a condition is a field condition */\nexport function isFieldCondition(condition: ICondition): condition is IFieldCondition {\n return \"field\" in condition;\n}\n","import { IRuntimeFormState } from \"./IRuntimeFieldState\";\n\n/** Action type keys for the rules engine reducer */\nexport enum RulesEngineActionType {\n SET = \"RULES_ENGINE_SET\",\n UPDATE = \"RULES_ENGINE_UPDATE\",\n CLEAR = \"RULES_ENGINE_CLEAR\",\n}\n\nexport interface ISetRulesAction {\n readonly type: RulesEngineActionType.SET;\n readonly payload: {\n readonly configName: string;\n readonly formState: IRuntimeFormState;\n };\n}\n\nexport interface IUpdateRulesAction {\n readonly type: RulesEngineActionType.UPDATE;\n readonly payload: {\n readonly configName: string;\n readonly formState: IRuntimeFormState;\n };\n}\n\nexport interface IClearRulesAction {\n readonly type: RulesEngineActionType.CLEAR;\n readonly payload: {\n readonly configName?: string;\n };\n}\n\nexport type RulesEngineAction = ISetRulesAction | IUpdateRulesAction | IClearRulesAction;\n","import { IFieldConfig } from \"./IFieldConfig\";\nimport { ICondition } from \"./ICondition\";\nimport { IFieldEffect } from \"./IFieldEffect\";\n\n/**\n * A field config where rule targets are constrained to known field names.\n * Provides compile-time checking that cross-field rule effects reference valid fields.\n */\nexport type TypedFieldConfig<TFields extends string> = Omit<IFieldConfig, \"rules\"> & {\n /**\n * Business rules with type-safe cross-field effect targets.\n * Field names in `then.fields` and `else.fields` are checked against TFields.\n */\n rules?: Array<{\n id?: string;\n when: ICondition;\n then: Omit<IFieldEffect, \"fields\"> & {\n fields?: Partial<Record<TFields, IFieldEffect>>;\n };\n else?: Omit<IFieldEffect, \"fields\"> & {\n fields?: Partial<Record<TFields, IFieldEffect>>;\n };\n priority?: number;\n }>;\n};\n\n/**\n * Define field configs with type-safe rule references.\n * TypeScript will error if a rule's cross-field effect targets a field name that doesn't exist.\n *\n * At runtime this is a no-op -- it just returns the input. The value is purely at compile time.\n *\n * @example\n * const config = defineFormConfig({\n * name: { type: \"Textbox\", label: \"Name\" },\n * status: {\n * type: \"Dropdown\",\n * label: \"Status\",\n * options: [{ value: \"Active\", label: \"Active\" }, { value: \"Inactive\", label: \"Inactive\" }],\n * rules: [{\n * when: { field: \"status\", operator: \"equals\", value: \"Active\" },\n * then: { fields: { name: { required: true } } }, // \"name\" checked at compile time\n * }],\n * },\n * });\n */\nexport function defineFormConfig<T extends Record<string, TypedFieldConfig<Extract<keyof T, string>>>>(\n fields: T\n): Record<string, IFieldConfig> {\n return fields as unknown as Record<string, IFieldConfig>;\n}\n","/** Generic dictionary type */\nexport type Dictionary<T> = Record<string, T>;\n\n/** Entity data type */\nexport type IEntityData = Record<string, unknown>;\n\n/** Sub-entity value type */\nexport type SubEntityType = string | number | boolean | Date | object | null | undefined;\n\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\nexport function isNull(value: unknown): value is null | undefined {\n return value == null;\n}\n\nexport function isStringEmpty(value: string | null | undefined): boolean {\n return value == null || value.trim() === \"\";\n}\n\nexport function deepCopy<T>(obj: T): T {\n return structuredClone(obj);\n}\n\nexport function convertBooleanToYesOrNoText(value: boolean | null | undefined): string {\n if (value === true) return \"Yes\";\n if (value === false) return \"No\";\n return \"\";\n}\n\n/** Sort options alphabetically by label */\nexport function sortDropdownOptions(a: { label?: string }, b: { label?: string }): number {\n const aText = a.label ? a.label.toLowerCase() : \"\";\n const bText = b.label ? b.label.toLowerCase() : \"\";\n return aText < bText ? -1 : aText > bText ? 1 : 0;\n}\n\n/** Create an option from a value string (value and label are the same) */\nexport function createOption(value: string): { value: string; label: string } {\n return { value, label: value };\n}\n","export const FIELD_PARENT_PREFIX = \"Parent.\";\n\n/** Component type constants */\nexport const ComponentTypes = {\n Textbox: \"Textbox\",\n Dropdown: \"Dropdown\",\n Toggle: \"Toggle\",\n Number: \"Number\",\n MultiSelect: \"Multiselect\",\n DateControl: \"DateControl\",\n Slider: \"Slider\",\n Fragment: \"DynamicFragment\",\n SimpleDropdown: \"SimpleDropdown\",\n MultiSelectSearch: \"MultiSelectSearch\",\n PopOutEditor: \"PopOutEditor\",\n RichText: \"RichText\",\n Textarea: \"Textarea\",\n DocumentLinks: \"DocumentLinks\",\n StatusDropdown: \"StatusDropdown\",\n ReadOnly: \"ReadOnly\",\n ReadOnlyArray: \"ReadOnlyArray\",\n ReadOnlyDateTime: \"ReadOnlyDateTime\",\n ReadOnlyCumulativeNumber: \"ReadOnlyCumulativeNumber\",\n ReadOnlyRichText: \"ReadOnlyRichText\",\n ReadOnlyWithButton: \"ReadOnlyWithButton\",\n ChoiceSet: \"ChoiceSet\",\n FieldArray: \"FieldArray\",\n RadioGroup: \"RadioGroup\",\n CheckboxGroup: \"CheckboxGroup\",\n Rating: \"Rating\",\n ColorPicker: \"ColorPicker\",\n Autocomplete: \"Autocomplete\",\n FileUpload: \"FileUpload\",\n DateRange: \"DateRange\",\n DateTime: \"DateTime\",\n PhoneInput: \"PhoneInput\",\n} as const;\n\n/** Form-level constants */\nexport const FormConstants = {\n defaultExpandCutoffCount: 12,\n loadingShimmerCount: 12,\n loadingFieldShimmerHeight: 32,\n na: \"n/a\",\n panelActionKeys: {\n cancel: \"Cancel\",\n close: \"Close\",\n create: \"Create\",\n update: \"Update\",\n },\n urlRegex: /(http(s?)):\\/\\//i,\n errorColor: \"#a4262c\",\n} as const;\n\n","import { ICoreLocaleStrings } from \"../types/ILocaleStrings\";\n\n/** Default English strings */\nconst defaultStrings: ICoreLocaleStrings = {\n // Form status\n autoSavePending: \"AutoSave Pending, please check for errors...\",\n savePending: \"Save Pending, please check for errors...\",\n saving: \"Saving...\",\n saveError: \"Error saving form\",\n\n // Actions\n save: \"Save\",\n cancel: \"Cancel\",\n create: \"Create\",\n update: \"Update\",\n confirm: \"Confirm\",\n add: \"Add\",\n edit: \"Edit\",\n deleteLabel: \"Delete\",\n remove: \"Remove\",\n close: \"Close\",\n clear: \"Clear\",\n\n // Field labels\n required: \"Required\",\n remaining: \"remaining\",\n na: \"N/A\",\n unknown: \"Unknown\",\n loading: \"Loading\",\n noResultsFound: \"No results found\",\n clickToClear: \"Click here to Clear\",\n\n // Document links\n linkTitleLabel: \"Link Title\",\n linkUrlLabel: \"Link URL\",\n urlRequired: \"Invalid Url (http/https required)\",\n\n // Expand/collapse\n seeLess: \"See less\",\n expand: \"Expand\",\n\n // Rich text editor\n openExpandedTextEditor: \"Open Expanded Editor\",\n closeExpandedTextEditor: \"Close Expanded Editor\",\n\n // Unsaved changes\n unsavedChanges: \"Unsaved Changes\",\n returnToEditing: \"Return to Editing\",\n dontSave: \"Don't save\",\n overview: \"Overview\",\n by: \"by\",\n\n // Accessibility\n filterFields: \"Filter form fields\",\n saved: \"Saved successfully\",\n saveFailed: \"Save failed\",\n validating: \"Validating...\",\n stepOf: (current: number, total: number) => `Step ${current} of ${total}`,\n formWizard: \"Form wizard\",\n itemOfTotal: (index: number, total: number, label: string) => `${label} item ${index} of ${total}`,\n\n // Dynamic functions\n saveChangesTo: (title: string) => `Do you want to save your changes to ${title}?`,\n\n // Validation error messages\n invalidUrl: \"Invalid URL\",\n invalidEmail: \"Invalid email address\",\n invalidPhoneNumber: \"Invalid phone number\",\n invalidYear: \"Invalid year\",\n contentExceedsMaxSize: (maxKb: number) => `Content exceeds maximum size of ${maxKb}KB`,\n noSpecialCharacters: \"Special characters are not allowed\",\n invalidCurrencyFormat: \"Invalid currency format\",\n duplicateValue: (value: string) => `Duplicate value: ${value}`,\n mustBeAtLeastChars: (min: number) => `Must be at least ${min} characters`,\n mustBeAtMostChars: (max: number) => `Must be at most ${max} characters`,\n mustBeANumber: \"Must be a number\",\n mustBeBetween: (min: number, max: number) => `Must be between ${min} and ${max}`,\n thisFieldIsRequired: \"This field is required\",\n\n // Reliability / save status\n saveRetrying: \"Retrying save...\",\n saveTimeout: \"Save timed out\",\n\n // Draft persistence\n draftRecovered: \"Draft recovered\",\n discardDraft: \"Discard draft\",\n unsavedChangesWarning: \"You have unsaved changes. Are you sure you want to leave?\",\n};\n\nlet currentLocale: ICoreLocaleStrings = { ...defaultStrings };\n\n/**\n * Register a partial or full locale override. Unspecified keys fall back to English defaults.\n * Can be called multiple times; each call merges into the current locale.\n */\nexport function registerLocale(partial: Partial<ICoreLocaleStrings>): void {\n currentLocale = { ...currentLocale, ...partial };\n}\n\n/**\n * Get a locale string by key. Returns the registered locale value or the English default.\n */\nexport function getLocaleString<K extends keyof ICoreLocaleStrings>(key: K): ICoreLocaleStrings[K] {\n return currentLocale[key];\n}\n\n/**\n * Reset the locale to English defaults. Useful for testing.\n */\nexport function resetLocale(): void {\n currentLocale = { ...defaultStrings };\n}\n\n/**\n * Get the full current locale object. Useful for debugging or bulk operations.\n */\nexport function getCurrentLocale(): ICoreLocaleStrings {\n return { ...currentLocale };\n}\n","import { getLocaleString } from \"./helpers/LocaleRegistry\";\n\n/**\n * User-facing string literals (v2).\n * All properties resolve through the locale registry.\n */\nexport const FormStrings = {\n get autoSavePending() { return getLocaleString(\"autoSavePending\"); },\n get savePending() { return getLocaleString(\"savePending\"); },\n get remaining() { return getLocaleString(\"remaining\"); },\n get saving() { return getLocaleString(\"saving\"); },\n get seeLess() { return getLocaleString(\"seeLess\"); },\n get expand() { return getLocaleString(\"expand\"); },\n get required() { return getLocaleString(\"required\"); },\n get save() { return getLocaleString(\"save\"); },\n get cancel() { return getLocaleString(\"cancel\"); },\n get create() { return getLocaleString(\"create\"); },\n get update() { return getLocaleString(\"update\"); },\n get na() { return getLocaleString(\"na\"); },\n get saveError() { return getLocaleString(\"saveError\"); },\n get confirm() { return getLocaleString(\"confirm\"); },\n get linkTitleLabel() { return getLocaleString(\"linkTitleLabel\"); },\n get linkUrlLabel() { return getLocaleString(\"linkUrlLabel\"); },\n get add() { return getLocaleString(\"add\"); },\n get edit() { return getLocaleString(\"edit\"); },\n get deleteLabel() { return getLocaleString(\"deleteLabel\"); },\n get remove() { return getLocaleString(\"remove\"); },\n get unknown() { return getLocaleString(\"unknown\"); },\n get close() { return getLocaleString(\"close\"); },\n get loading() { return getLocaleString(\"loading\"); },\n get noResultsFound() { return getLocaleString(\"noResultsFound\"); },\n get clickToClear() { return getLocaleString(\"clickToClear\"); },\n get clear() { return getLocaleString(\"clear\"); },\n get urlRequired() { return getLocaleString(\"urlRequired\"); },\n get openExpandedTextEditor() { return getLocaleString(\"openExpandedTextEditor\"); },\n get closeExpandedTextEditor() { return getLocaleString(\"closeExpandedTextEditor\"); },\n get unsavedChanges() { return getLocaleString(\"unsavedChanges\"); },\n get returnToEditing() { return getLocaleString(\"returnToEditing\"); },\n get dontSave() { return getLocaleString(\"dontSave\"); },\n get overview() { return getLocaleString(\"overview\"); },\n get by() { return getLocaleString(\"by\"); },\n get filterFields() { return getLocaleString(\"filterFields\"); },\n get saved() { return getLocaleString(\"saved\"); },\n get saveFailed() { return getLocaleString(\"saveFailed\"); },\n get validating() { return getLocaleString(\"validating\"); },\n get stepOf() { return getLocaleString(\"stepOf\"); },\n get formWizard() { return getLocaleString(\"formWizard\"); },\n get itemOfTotal() { return getLocaleString(\"itemOfTotal\"); },\n get saveChangesTo() { return getLocaleString(\"saveChangesTo\"); },\n get draftRecovered() { return getLocaleString(\"draftRecovered\"); },\n get discardDraft() { return getLocaleString(\"discardDraft\"); },\n get unsavedChangesWarning() { return getLocaleString(\"unsavedChangesWarning\"); },\n get saveRetrying() { return getLocaleString(\"saveRetrying\"); },\n get saveTimeout() { return getLocaleString(\"saveTimeout\"); },\n};\n\n","import { IEntityData } from \"../utils\";\nimport React from \"react\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { RulesEngineActionType } from \"../types/IRulesEngineAction\";\nimport { evaluateAllRules, evaluateAffectedFields } from \"../helpers/RuleEngine\";\nimport rulesEngineReducer, { defaultRulesEngineState } from \"../reducers/RulesEngineReducer\";\nimport { IRulesEngineProvider } from \"./IRulesEngineProvider\";\n\nconst RulesEngineContext: React.Context<IRulesEngineProvider> = React.createContext(\n undefined as unknown as IRulesEngineProvider\n);\n\nexport function UseRulesEngineContext() {\n const context = React.useContext(RulesEngineContext);\n if (context === undefined) {\n throw new Error(\n \"UseRulesEngineContext() was called outside of <RulesEngineProvider>. \" +\n \"Required hierarchy: <RulesEngineProvider> > <InjectedFieldProvider> > <FormEngine>\"\n );\n }\n return context;\n}\n\n\nexport const RulesEngineProvider: React.FC<React.PropsWithChildren<{}>> = (\n props: React.PropsWithChildren<{}>\n): React.JSX.Element => {\n const [rulesState, dispatch] = React.useReducer(rulesEngineReducer, defaultRulesEngineState);\n\n const rulesStateRef = React.useRef(rulesState);\n React.useEffect(() => { rulesStateRef.current = rulesState; }, [rulesState]);\n\n const initFormState = React.useCallback((\n configName: string,\n defaultValues: IEntityData,\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n ): IRuntimeFormState => {\n const formState = evaluateAllRules(fields, defaultValues, areAllFieldsReadonly);\n\n dispatch({\n type: RulesEngineActionType.SET,\n payload: { configName, formState },\n });\n\n return formState;\n }, []);\n\n const clearFormState = React.useCallback((configName?: string) => {\n dispatch({\n type: RulesEngineActionType.CLEAR,\n payload: { configName },\n });\n }, []);\n\n const processFieldChange = React.useCallback((\n entityData: IEntityData,\n configName: string,\n fieldName: string,\n fields: Record<string, IFieldConfig>\n ) => {\n const currentState = rulesStateRef.current.configs[configName];\n if (!currentState) return;\n\n const hasAnyDeps =\n (currentState.fieldStates[fieldName]?.dependentFields?.length ?? 0) > 0 ||\n (currentState.fieldStates[fieldName]?.dependsOnFields?.length ?? 0) > 0;\n\n if (!hasAnyDeps) return;\n\n const updatedState = evaluateAffectedFields(fieldName, fields, entityData, currentState);\n\n dispatch({\n type: RulesEngineActionType.UPDATE,\n payload: { configName, formState: updatedState },\n });\n }, []);\n\n const providerValue: IRulesEngineProvider = React.useMemo(() => ({\n rulesState,\n initFormState,\n processFieldChange,\n clearFormState,\n }), [rulesState, initFormState, processFieldChange, clearFormState]);\n\n return (\n <RulesEngineContext.Provider value={providerValue}>\n {props.children}\n </RulesEngineContext.Provider>\n );\n};\n\n","import { ICondition, IFieldCondition, ILogicalCondition, isLogicalCondition } from \"../types/ICondition\";\nimport { IEntityData } from \"../utils\";\n\n/**\n * Evaluates a condition tree against the current form values.\n *\n * Supports all 15 field operators and AND/OR/NOT logical operators.\n */\nexport function evaluateCondition(condition: ICondition, values: IEntityData): boolean {\n if (isLogicalCondition(condition)) {\n return evaluateLogicalCondition(condition, values);\n }\n return evaluateFieldCondition(condition as IFieldCondition, values);\n}\n\nfunction evaluateLogicalCondition(condition: ILogicalCondition, values: IEntityData): boolean {\n switch (condition.operator) {\n case \"and\":\n return condition.conditions.every(c => evaluateCondition(c, values));\n case \"or\":\n return condition.conditions.some(c => evaluateCondition(c, values));\n case \"not\":\n // NOT applies to the first (and typically only) child condition\n return condition.conditions.length > 0\n ? !evaluateCondition(condition.conditions[0], values)\n : false;\n default:\n return false;\n }\n}\n\nfunction evaluateFieldCondition(condition: IFieldCondition, values: IEntityData): boolean {\n const fieldValue = getNestedValue(values, condition.field);\n\n switch (condition.operator) {\n case \"equals\":\n return looseEquals(fieldValue, condition.value);\n case \"notEquals\":\n return !looseEquals(fieldValue, condition.value);\n case \"greaterThan\":\n return toNumber(fieldValue) > toNumber(condition.value);\n case \"lessThan\":\n return toNumber(fieldValue) < toNumber(condition.value);\n case \"greaterThanOrEqual\":\n return toNumber(fieldValue) >= toNumber(condition.value);\n case \"lessThanOrEqual\":\n return toNumber(fieldValue) <= toNumber(condition.value);\n case \"contains\":\n return toString(fieldValue).includes(toString(condition.value));\n case \"notContains\":\n return !toString(fieldValue).includes(toString(condition.value));\n case \"startsWith\":\n return toString(fieldValue).startsWith(toString(condition.value));\n case \"endsWith\":\n return toString(fieldValue).endsWith(toString(condition.value));\n case \"in\":\n return Array.isArray(condition.value)\n ? condition.value.some(v => looseEquals(fieldValue, v))\n : false;\n case \"notIn\":\n return Array.isArray(condition.value)\n ? !condition.value.some(v => looseEquals(fieldValue, v))\n : false;\n case \"isEmpty\":\n return isValueEmpty(fieldValue);\n case \"isNotEmpty\":\n return !isValueEmpty(fieldValue);\n case \"matches\":\n try {\n return new RegExp(toString(condition.value)).test(toString(fieldValue));\n } catch {\n return false;\n }\n case \"arrayContains\":\n return Array.isArray(fieldValue)\n ? fieldValue.some(v => looseEquals(v, condition.value))\n : false;\n case \"arrayNotContains\":\n return Array.isArray(fieldValue)\n ? !fieldValue.some(v => looseEquals(v, condition.value))\n : true;\n case \"arrayLengthEquals\":\n return Array.isArray(fieldValue)\n ? fieldValue.length === toNumber(condition.value)\n : false;\n case \"arrayLengthGreaterThan\":\n return Array.isArray(fieldValue)\n ? fieldValue.length > toNumber(condition.value)\n : false;\n case \"arrayLengthLessThan\":\n return Array.isArray(fieldValue)\n ? fieldValue.length < toNumber(condition.value)\n : false;\n default:\n return false;\n }\n}\n\n/**\n * Extracts all field names referenced in a condition tree.\n */\nexport function extractConditionDependencies(condition: ICondition): string[] {\n const deps = new Set<string>();\n collectDependencies(condition, deps);\n return [...deps];\n}\n\nfunction collectDependencies(condition: ICondition, deps: Set<string>): void {\n if (isLogicalCondition(condition)) {\n condition.conditions.forEach(c => collectDependencies(c, deps));\n } else {\n const fieldRef = (condition as IFieldCondition).field;\n deps.add(fieldRef.includes('.') ? fieldRef.split('.')[0] : fieldRef);\n }\n}\n\n// --- Utility functions ---\n\nfunction getNestedValue(obj: IEntityData, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction looseEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null && b == null) return true;\n if (a == null || b == null) return false;\n return String(a) === String(b);\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const n = Number(value);\n return isNaN(n) ? 0 : n;\n }\n if (value instanceof Date) return value.getTime();\n return 0;\n}\n\nfunction toString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n return String(value);\n}\n\nfunction isValueEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n","import { IEntityData, SubEntityType } from \"../utils\";\n\n/**\n * Value function signature (v2).\n * Used in computed value expressions via $fn.name() syntax.\n */\nexport type ValueFunction = (context: IValueFunctionContext) => SubEntityType;\n\nexport interface IValueFunctionContext {\n fieldName: string;\n fieldValue?: SubEntityType;\n values: IEntityData;\n parentEntity?: IEntityData;\n currentUserId?: string;\n}\n\n// --- Built-in value functions ---\n\nconst defaultValueFunctions: Record<string, ValueFunction> = {\n setDate: () => new Date(),\n setDateIfNull: ({ fieldValue }) => fieldValue ? fieldValue : new Date(),\n setLoggedInUser: ({ currentUserId }) => currentUserId ? { id: currentUserId } : undefined,\n inheritFromParent: ({ fieldName, values }) => {\n const parent = values?.Parent as IEntityData | undefined;\n return parent ? parent[fieldName] as SubEntityType : undefined;\n },\n};\n\nlet valueFunctionRegistry: Record<string, ValueFunction> = { ...defaultValueFunctions };\n\n/** Register custom value functions (merge into registry) */\nexport function registerValueFunctions(custom: Record<string, ValueFunction>): void {\n valueFunctionRegistry = { ...valueFunctionRegistry, ...custom };\n}\n\n/** Get a value function by name */\nexport function getValueFunction(name: string): ValueFunction | undefined {\n return valueFunctionRegistry[name];\n}\n\n/** Execute a named value function */\nexport function executeValueFunction(\n fieldName: string,\n functionName: string,\n values: IEntityData,\n fieldValue?: SubEntityType,\n parentEntity?: IEntityData,\n currentUserId?: string\n): SubEntityType {\n const fn = valueFunctionRegistry[functionName];\n if (fn) {\n return fn({ fieldName, fieldValue, values, parentEntity, currentUserId });\n }\n return undefined;\n}\n\n/** Reset registry to defaults (for testing) */\nexport function resetValueFunctionRegistry(): void {\n valueFunctionRegistry = { ...defaultValueFunctions };\n}\n","import { IEntityData } from \"../utils\";\nimport { getValueFunction } from \"./ValueFunctionRegistry\";\nimport { Parser } from \"expr-eval\";\n\n/**\n * CSP-SAFE: This module uses expr-eval (https://www.npmjs.com/package/expr-eval) instead of\n * `new Function()` / `eval()`, making expression evaluation safe in environments with strict\n * Content-Security-Policies (CSP) that forbid `script-src 'unsafe-eval'`.\n *\n * Evaluates an expression string against form values.\n *\n * Supports:\n * - $values.fieldName for field references (including nested paths)\n * - $fn.name() for value function calls\n * - $parent.fieldName for parent entity references\n * - $root.fieldName alias for $values.fieldName\n * - Math functions (expr-eval builtins): round(), floor(), ceil(), abs(), min(), max(), sqrt(), pow(), log()\n * - Arithmetic: +, -, *, /\n * - Comparison: ==, !=, >, <, >=, <=\n * - Logical: and, or, not\n * - String concatenation via +\n *\n * @example\n * \"$values.quantity * $values.unitPrice\"\n * \"$fn.setDate()\"\n * \"$parent.category\"\n * \"round($values.total * 100) / 100\"\n */\n\n// Singleton CSP-safe parser.\n// expr-eval 2.x exposes binaryOps/consts as plain objects; access via any to avoid\n// augmenting the upstream @types/expr-eval declarations.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _parser: Parser = new Parser() as any;\n// Override + to handle string concatenation (string + number, number + string).\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _origAdd = (_parser as any).binaryOps[\"+\"];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(_parser as any).binaryOps[\"+\"] = (a: unknown, b: unknown): unknown => {\n if (typeof a === \"string\" || typeof b === \"string\") return String(a) + String(b);\n return _origAdd(a as number, b as number);\n};\n// Register NaN as a named constant so substituted \"NaN\" tokens evaluate correctly.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(_parser as any).consts[\"NaN\"] = NaN;\n\n\nexport function evaluateExpression(\n expression: string,\n values: IEntityData,\n fieldName?: string,\n parentEntity?: IEntityData,\n currentUserId?: string\n): unknown {\n // Optimisation: if the expression is a single $fn.name() call (nothing else),\n // execute the function and return its result directly — preserving complex types\n // such as Date objects that cannot be round-tripped through text substitution.\n const singleFnMatch = /^\\s*\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)\\s*$/.exec(expression);\n if (singleFnMatch) {\n const fn = getValueFunction(singleFnMatch[1]);\n if (!fn) return undefined;\n return fn({\n fieldName: fieldName ?? \"\",\n fieldValue: fieldName ? values[fieldName] as string : undefined,\n values,\n parentEntity,\n currentUserId,\n });\n }\n\n // Step 1 – resolve $fn.name() calls by executing registered value functions and\n // substituting their results as literal tokens into the expression string.\n let resolved = expression.replace(\n /\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)/g,\n (_, fnName: string) => {\n const fn = getValueFunction(fnName);\n if (fn) {\n const result = fn({\n fieldName: fieldName ?? \"\",\n fieldValue: fieldName ? values[fieldName] as string : undefined,\n values,\n parentEntity,\n currentUserId,\n });\n if (result === null || result === undefined) return \"NaN\";\n if (typeof result === \"string\") return JSON.stringify(result);\n if (result instanceof Date) return String(result.getTime());\n return String(result);\n }\n // Unknown function: substitute NaN so arithmetic remains well-behaved\n return \"NaN\";\n }\n );\n\n // Step 2 – substitute $parent.fieldName, $root.fieldName, $values.fieldName with\n // their literal values inline. null/undefined values are substituted as the token\n // \"NaN\" so that arithmetic expressions (e.g. qty * price) return NaN rather than\n // throwing, preserving backward-compatible behaviour.\n\n const serializeValue = (value: unknown): string => {\n if (value === null || value === undefined) return \"NaN\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (value instanceof Date) return String(value.getTime());\n return String(value);\n };\n\n // Replace $parent.fieldName\n resolved = resolved.replace(\n /\\$parent\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_, fieldPath: string) => serializeValue(getNestedValue(parentEntity ?? {}, fieldPath))\n );\n\n // Replace $root.fieldName (alias for $values)\n resolved = resolved.replace(\n /\\$root\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_, fieldPath: string) => serializeValue(getNestedValue(values, fieldPath))\n );\n\n // Replace $values.fieldName\n resolved = resolved.replace(\n /\\$values\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_, fieldPath: string) => serializeValue(getNestedValue(values, fieldPath))\n );\n\n // Step 3 – evaluate with the CSP-safe expr-eval parser\n try {\n return _parser.evaluate(resolved, {});\n } catch {\n return undefined;\n }\n}\n\nfunction getNestedValue(obj: IEntityData, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Extracts field names referenced in an expression via $values.fieldName or $root.fieldName.\n */\nexport function extractExpressionDependencies(expression: string): string[] {\n const deps = new Set<string>();\n const valuesRegex = /\\$(?:values|root)\\.([a-zA-Z_][a-zA-Z0-9_]*)/g;\n let match;\n while ((match = valuesRegex.exec(expression)) !== null) {\n deps.add(match[1]);\n }\n return [...deps];\n}\n\n/**\n * Extracts value function names referenced via $fn.name() syntax.\n */\nexport function extractFunctionDependencies(expression: string): string[] {\n const fns = new Set<string>();\n const fnRegex = /\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)/g;\n let match;\n while ((match = fnRegex.exec(expression)) !== null) {\n fns.add(match[1]);\n }\n return [...fns];\n}\n","/**\n * EventTimeline — Module-level chronological event log for FormDevTools.\n *\n * Logs timestamped events from the rules engine, field changes, and validations.\n */\n\nexport type TimelineEventType = \"field_change\" | \"rule_evaluated\" | \"validation_run\" | \"form_submit\";\n\nexport interface ITimelineEvent {\n timestamp: number;\n type: TimelineEventType;\n fieldName: string;\n details: string;\n}\n\nconst timeline: ITimelineEvent[] = [];\nconst MAX_EVENTS = 500;\n\n/**\n * Log a new event to the timeline.\n */\nexport function logEvent(type: TimelineEventType, fieldName: string, details: string): void {\n timeline.push({ timestamp: Date.now(), type, fieldName, details });\n // Keep bounded to avoid unbounded memory growth\n if (timeline.length > MAX_EVENTS) {\n timeline.splice(0, timeline.length - MAX_EVENTS);\n }\n}\n\n/**\n * Returns a copy of the full timeline.\n */\nexport function getTimeline(): ITimelineEvent[] {\n return [...timeline];\n}\n\n/**\n * Clear all timeline events.\n */\nexport function clearTimeline(): void {\n timeline.length = 0;\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IRule } from \"../types/IRule\";\nimport { IFieldEffect } from \"../types/IFieldEffect\";\nimport { IRuntimeFieldState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IEntityData } from \"../utils\";\nimport { evaluateCondition, extractConditionDependencies } from \"./ConditionEvaluator\";\nimport { extractExpressionDependencies } from \"./ExpressionEngine\";\nimport { logEvent } from \"./EventTimeline\";\n\n/**\n * Builds the dependency graph from field configs.\n * Returns adjacency lists: for each field, which other fields depend on it.\n */\nexport function buildDependencyGraph(\n fields: Record<string, IFieldConfig>\n): Record<string, Set<string>> {\n const graph: Record<string, Set<string>> = {};\n const fieldNames = Object.keys(fields);\n\n for (const name of fieldNames) {\n graph[name] = new Set();\n }\n\n for (const [fieldName, config] of Object.entries(fields)) {\n if (config.rules) {\n for (const rule of config.rules) {\n // Fields referenced in the when condition\n const condDeps = extractConditionDependencies(rule.when);\n for (const dep of condDeps) {\n if (dep in graph) {\n graph[dep].add(fieldName);\n }\n }\n\n // Fields referenced in cross-field effects\n collectEffectTargets(rule.then, fieldName, graph);\n if (rule.else) {\n collectEffectTargets(rule.else, fieldName, graph);\n }\n }\n }\n\n // Computed value dependencies\n if (config.computedValue) {\n const exprDeps = extractExpressionDependencies(config.computedValue);\n for (const dep of exprDeps) {\n if (dep in graph) {\n graph[dep].add(fieldName);\n }\n }\n }\n }\n\n return graph;\n}\n\nfunction collectEffectTargets(\n effect: IFieldEffect,\n ownerField: string,\n graph: Record<string, Set<string>>\n): void {\n if (effect.fields) {\n for (const targetField of Object.keys(effect.fields)) {\n if (targetField in graph) {\n // The field that owns this rule's condition depends on condition fields;\n // the target field is AFFECTED by the owner field's rule\n graph[ownerField]?.add(targetField);\n }\n }\n }\n}\n\n/**\n * Topological sort of field names using Kahn's algorithm.\n * Returns fields in dependency order. Detects cycles.\n */\nexport function topologicalSort(\n graph: Record<string, Set<string>>\n): { sorted: string[]; hasCycle: boolean; cycleFields: string[] } {\n const inDegree: Record<string, number> = {};\n const adjacency: Record<string, string[]> = {};\n const fields = Object.keys(graph);\n\n for (const f of fields) {\n inDegree[f] = 0;\n adjacency[f] = [...graph[f]];\n }\n\n for (const f of fields) {\n for (const dep of adjacency[f]) {\n if (dep in inDegree) {\n inDegree[dep]++;\n }\n }\n }\n\n const queue: string[] = [];\n for (const f of fields) {\n if (inDegree[f] === 0) queue.push(f);\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n for (const neighbor of adjacency[current]) {\n if (neighbor in inDegree) {\n inDegree[neighbor]--;\n if (inDegree[neighbor] === 0) queue.push(neighbor);\n }\n }\n }\n\n const hasCycle = sorted.length < fields.length;\n const cycleFields = hasCycle ? fields.filter(f => !sorted.includes(f)) : [];\n return { sorted, hasCycle, cycleFields };\n}\n\n/**\n * Builds the default runtime field state from static field configs.\n */\nexport function buildDefaultFieldStates(\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n): Record<string, IRuntimeFieldState> {\n const states: Record<string, IRuntimeFieldState> = {};\n const graph = buildDependencyGraph(fields);\n\n for (const [fieldName, config] of Object.entries(fields)) {\n states[fieldName] = {\n type: config.type,\n required: config.required,\n hidden: config.hidden || config.type === \"DynamicFragment\",\n readOnly: areAllFieldsReadonly ? true : config.readOnly,\n validate: config.validate,\n computedValue: config.computedValue,\n confirmInput: config.confirmInput,\n options: config.options,\n label: config.label,\n defaultValue: config.defaultValue,\n computeOnCreateOnly: config.computeOnCreateOnly,\n dependentFields: [...(graph[fieldName] ?? [])],\n dependsOnFields: [],\n activeRuleIds: [],\n };\n }\n\n // Wire up reverse dependencies\n for (const [fieldName, state] of Object.entries(states)) {\n for (const dep of state.dependentFields ?? []) {\n if (states[dep]) {\n states[dep].dependsOnFields = states[dep].dependsOnFields ?? [];\n states[dep].dependsOnFields!.push(fieldName);\n }\n }\n }\n\n return states;\n}\n\n/**\n * Evaluates all rules for all fields against current values.\n * Returns the full runtime form state.\n */\nexport function evaluateAllRules(\n fields: Record<string, IFieldConfig>,\n values: IEntityData,\n areAllFieldsReadonly?: boolean\n): IRuntimeFormState {\n const fieldStates = buildDefaultFieldStates(fields, areAllFieldsReadonly);\n const fieldOrder = Object.keys(fields);\n\n // Apply rules in topological order for correct dependency resolution\n const graph = buildDependencyGraph(fields);\n const { sorted } = topologicalSort(graph);\n const evalOrder = sorted.length > 0 ? sorted : fieldOrder;\n\n let currentOrder = [...fieldOrder];\n\n for (const fieldName of evalOrder) {\n const config = fields[fieldName];\n if (!config?.rules) continue;\n\n const ruleResults = evaluateFieldRules(config.rules, values);\n\n if (fieldStates[fieldName]) {\n fieldStates[fieldName].activeRuleIds = ruleResults.activeRuleIds;\n }\n\n logEvent(\"rule_evaluated\", fieldName, `${config.rules.length} rule(s) evaluated`);\n\n // Apply self-effects\n applyEffectToState(fieldStates, fieldName, ruleResults.selfEffect);\n\n // Apply setValue from then-branch only (stored separately to avoid else contamination)\n if (ruleResults.pendingSetValue !== undefined && fieldStates[fieldName]) {\n fieldStates[fieldName].pendingSetValue = ruleResults.pendingSetValue;\n }\n\n // Apply cross-field effects\n for (const [targetField, effect] of Object.entries(ruleResults.crossEffects)) {\n if (fieldStates[targetField]) {\n applyEffectToState(fieldStates, targetField, effect);\n }\n }\n\n // Apply field order changes\n if (ruleResults.fieldOrder) {\n currentOrder = ruleResults.fieldOrder;\n }\n }\n\n return { fieldStates, fieldOrder: currentOrder };\n}\n\n/**\n * Evaluates rules for fields that are transitively affected by a changed field.\n * Returns only the changed field states (incremental update).\n */\nexport function evaluateAffectedFields(\n changedField: string,\n fields: Record<string, IFieldConfig>,\n values: IEntityData,\n currentState: IRuntimeFormState\n): IRuntimeFormState {\n // Find all transitively affected fields\n const affected = getTransitivelyAffectedFields(changedField, currentState.fieldStates);\n logEvent(\"field_change\", changedField, `${affected.size} affected field(s)`);\n if (affected.size === 0) {\n return currentState;\n }\n\n const updatedStates = { ...currentState.fieldStates };\n let updatedOrder = [...currentState.fieldOrder];\n\n // Re-evaluate affected fields\n for (const fieldName of affected) {\n const config = fields[fieldName];\n if (!config) continue;\n\n // Reset to defaults first\n updatedStates[fieldName] = {\n ...updatedStates[fieldName],\n type: config.type,\n required: config.required,\n hidden: config.hidden || config.type === \"DynamicFragment\",\n readOnly: config.readOnly,\n validate: config.validate,\n computedValue: config.computedValue,\n confirmInput: config.confirmInput,\n options: config.options,\n label: config.label,\n defaultValue: config.defaultValue,\n computeOnCreateOnly: config.computeOnCreateOnly,\n activeRuleIds: [],\n pendingSetValue: undefined,\n };\n }\n\n // Re-apply all rules that could affect the changed fields\n // (from ALL fields, not just the changed one)\n for (const [ownerField, config] of Object.entries(fields)) {\n if (!config.rules) continue;\n\n const ruleResults = evaluateFieldRules(config.rules, values);\n\n // Apply self-effects if this field is affected\n if (affected.has(ownerField) || ownerField === changedField) {\n applyEffectToState(updatedStates, ownerField, ruleResults.selfEffect);\n if (ruleResults.pendingSetValue !== undefined && updatedStates[ownerField]) {\n updatedStates[ownerField].pendingSetValue = ruleResults.pendingSetValue;\n }\n }\n\n // Apply cross-field effects to affected fields\n for (const [targetField, effect] of Object.entries(ruleResults.crossEffects)) {\n if (affected.has(targetField) && updatedStates[targetField]) {\n applyEffectToState(updatedStates, targetField, effect);\n }\n }\n\n if (ruleResults.fieldOrder) {\n updatedOrder = ruleResults.fieldOrder;\n }\n }\n\n return { fieldStates: updatedStates, fieldOrder: updatedOrder };\n}\n\nfunction getTransitivelyAffectedFields(\n changedField: string,\n fieldStates: Record<string, IRuntimeFieldState>\n): Set<string> {\n const affected = new Set<string>();\n const queue = [changedField];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const deps = fieldStates[current]?.dependentFields ?? [];\n for (const dep of deps) {\n if (!affected.has(dep)) {\n affected.add(dep);\n queue.push(dep);\n }\n }\n }\n\n return affected;\n}\n\ninterface IRuleEvalResult {\n selfEffect: IFieldEffect;\n crossEffects: Record<string, IFieldEffect>;\n fieldOrder?: string[];\n activeRuleIds: string[];\n /** Pending setValue from the winning then-branch rule (undefined if no rule fired setValue) */\n pendingSetValue?: { value: unknown };\n}\n\n/**\n * Evaluates an array of rules for a single field.\n * Resolves priority conflicts (higher priority wins).\n */\nfunction evaluateFieldRules(rules: IRule[], values: IEntityData): IRuleEvalResult {\n // Sort by priority (higher first) for conflict resolution\n const sorted = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\n const selfEffect: IFieldEffect = {};\n const crossEffects: Record<string, IFieldEffect> = {};\n let fieldOrder: string[] | undefined;\n const activeRuleIds: string[] = [];\n // setValue is tracked separately: only applies from the then-branch (not else)\n let pendingSetValue: { value: unknown } | undefined;\n\n for (let i = 0; i < sorted.length; i++) {\n const rule = sorted[i];\n const conditionMet = evaluateCondition(rule.when, values);\n if (conditionMet) {\n activeRuleIds.push(rule.id ?? `rule_${i}`);\n }\n const effect = conditionMet ? rule.then : rule.else;\n\n // setValue: only from the then branch, first-write-wins by priority\n if (conditionMet && rule.then?.setValue !== undefined && pendingSetValue === undefined) {\n pendingSetValue = { value: rule.then.setValue };\n }\n\n if (!effect) continue;\n\n // Merge self-effects (first write wins due to priority sort)\n // Note: setValue is intentionally excluded from general merging — handled above\n mergeEffect(selfEffect, effect);\n\n // Merge cross-field effects\n if (effect.fields) {\n for (const [targetField, targetEffect] of Object.entries(effect.fields)) {\n if (!crossEffects[targetField]) {\n crossEffects[targetField] = {};\n }\n mergeEffect(crossEffects[targetField], targetEffect);\n }\n }\n\n // Field order (highest priority rule wins)\n if (effect.fieldOrder && !fieldOrder) {\n fieldOrder = effect.fieldOrder;\n }\n }\n\n return { selfEffect, crossEffects, fieldOrder, activeRuleIds, pendingSetValue };\n}\n\n/**\n * Merges an effect into a target effect (first-write-wins for each property).\n */\nfunction mergeEffect(target: IFieldEffect, source: IFieldEffect): void {\n if (source.required !== undefined && target.required === undefined) {\n target.required = source.required;\n }\n if (source.hidden !== undefined && target.hidden === undefined) {\n target.hidden = source.hidden;\n }\n if (source.readOnly !== undefined && target.readOnly === undefined) {\n target.readOnly = source.readOnly;\n }\n if (source.label !== undefined && target.label === undefined) {\n target.label = source.label;\n }\n const sourceType = source.type ?? source.component;\n const targetType = target.type ?? target.component;\n if (sourceType !== undefined && targetType === undefined) {\n target.type = sourceType;\n }\n if (source.options !== undefined && target.options === undefined) {\n target.options = source.options;\n }\n if (source.validate !== undefined && target.validate === undefined) {\n target.validate = source.validate;\n }\n if (source.computedValue !== undefined && target.computedValue === undefined) {\n target.computedValue = source.computedValue;\n }\n // Note: setValue is intentionally NOT merged here — it is handled via pendingSetValue\n // in evaluateFieldRules to ensure it only applies from the then branch (not else).\n}\n\nfunction applyEffectToState(\n states: Record<string, IRuntimeFieldState>,\n fieldName: string,\n effect: IFieldEffect\n): void {\n const state = states[fieldName];\n if (!state) return;\n\n if (effect.required !== undefined) state.required = effect.required;\n if (effect.hidden !== undefined) state.hidden = effect.hidden;\n if (effect.readOnly !== undefined) state.readOnly = effect.readOnly;\n if (effect.label !== undefined) state.label = effect.label;\n const effectType = effect.type ?? effect.component;\n if (effectType !== undefined) state.type = effectType;\n if (effect.options !== undefined) state.options = effect.options;\n if (effect.validate !== undefined) state.validate = effect.validate;\n if (effect.computedValue !== undefined) state.computedValue = effect.computedValue;\n // Note: setValue is applied via ruleResults.pendingSetValue in evaluateAllRules /\n // evaluateAffectedFields, NOT here — to ensure it only fires from the then branch.\n}\n","import { RulesEngineActionType, RulesEngineAction } from \"../types/IRulesEngineAction\";\nimport { IRulesEngineState } from \"../types/IRuntimeFieldState\";\n\nexport const defaultRulesEngineState: IRulesEngineState = {\n configs: {},\n};\n\nconst rulesEngineReducer = (\n state: IRulesEngineState = defaultRulesEngineState,\n action: RulesEngineAction\n): IRulesEngineState => {\n switch (action.type) {\n case RulesEngineActionType.SET: {\n const configName = action.payload.configName;\n return {\n configs: {\n ...state.configs,\n [configName]: { ...action.payload.formState },\n },\n };\n }\n case RulesEngineActionType.UPDATE: {\n const configName = action.payload.configName;\n const existing = state.configs[configName];\n if (!existing) return state;\n\n const updatedFieldStates = { ...existing.fieldStates };\n Object.keys(action.payload.formState.fieldStates).forEach(fieldName => {\n updatedFieldStates[fieldName] = {\n ...updatedFieldStates[fieldName],\n ...action.payload.formState.fieldStates[fieldName],\n };\n });\n\n return {\n configs: {\n ...state.configs,\n [configName]: {\n fieldStates: updatedFieldStates,\n fieldOrder: action.payload.formState.fieldOrder,\n },\n },\n };\n }\n case RulesEngineActionType.CLEAR: {\n if (action.payload.configName) {\n const { [action.payload.configName]: _, ...remaining } = state.configs;\n return { configs: remaining };\n }\n return defaultRulesEngineState;\n }\n default:\n return state;\n }\n};\n\nexport default rulesEngineReducer;\n","import React from \"react\";\nimport { IInjectedFieldProvider } from \"./IInjectedFieldProvider\";\n\nconst InjectedFieldContext: React.Context<IInjectedFieldProvider> = React.createContext(\n undefined as unknown as IInjectedFieldProvider\n);\n\nexport function UseInjectedFieldContext() {\n const context = React.useContext(InjectedFieldContext);\n if (context === undefined) {\n throw new Error(\n \"UseInjectedFieldContext() was called outside of <InjectedFieldProvider>. \" +\n \"Required hierarchy: <RulesEngineProvider> > <InjectedFieldProvider> > <FormEngine>\"\n );\n }\n return context;\n}\n\n\ninterface InjectedFieldProviderProps {\n /** Optional initial field registry. If provided, fields are set immediately. */\n injectedFields?: Record<string, React.JSX.Element>;\n children?: React.ReactNode;\n}\n\nexport const InjectedFieldProvider: React.FC<InjectedFieldProviderProps> = (\n props: InjectedFieldProviderProps\n): React.JSX.Element => {\n const [injectedFields, setInjectedFields] = React.useState<Record<string, React.JSX.Element>>(\n (props.injectedFields ?? undefined) as unknown as Record<string, React.JSX.Element>\n );\n\n const providerValue: IInjectedFieldProvider = React.useMemo(() => ({\n injectedFields,\n setInjectedFields,\n }), [injectedFields]);\n\n return (\n <InjectedFieldContext.Provider value={providerValue}>\n {props.children}\n </InjectedFieldContext.Provider>\n );\n};\n\n","import { IEntityData } from \"../utils\";\nimport { IValidationRule } from \"../types/IValidationRule\";\nimport { ICondition } from \"../types/ICondition\";\nimport { evaluateCondition } from \"./ConditionEvaluator\";\n\n/**\n * Unified validator function signature.\n * Handles sync, async, and cross-field validation.\n *\n * @param value - The field's current value\n * @param params - Parameters from IValidationRule.params\n * @param context - Full form context (values, field name, abort signal)\n * @returns Error message string, undefined if valid, or a Promise for async\n */\nexport type ValidatorFn = (\n value: unknown,\n params: Record<string, unknown> | undefined,\n context: IValidationContext\n) => string | undefined | Promise<string | undefined>;\n\nexport interface IValidationContext {\n fieldName: string;\n values: IEntityData;\n signal?: AbortSignal;\n}\n\n// --- Built-in validators ---\n\nconst required: ValidatorFn = (value) => {\n if (value === null || value === undefined || (typeof value === \"string\" && value.trim() === \"\")) {\n return \"This field is required\";\n }\n return undefined;\n};\n\nconst email: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value) ? undefined : \"Invalid email address\";\n};\n\nconst phone: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n const phoneRegex = /^[+]?[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/;\n return phoneRegex.test(value) ? undefined : \"Invalid phone number\";\n};\n\nconst url: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n return /(http(s?)):\\/\\//i.test(value) ? undefined : \"Invalid URL\";\n};\n\nconst year: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n const y = parseInt(value, 10);\n if (isNaN(y) || y < 1900 || y > 2100) return \"Invalid year\";\n return undefined;\n};\n\nconst noSpecialCharacters: ValidatorFn = (value) => {\n if (!value || typeof value !== \"string\") return undefined;\n return /[^a-zA-Z0-9\\s\\-_.]/.test(value) ? \"Special characters are not allowed\" : undefined;\n};\n\nconst currency: ValidatorFn = (value) => {\n if (!value && value !== 0) return undefined;\n const str = typeof value === \"string\" ? value : String(value);\n return /^-?\\d{1,}(\\.\\d{1,2})?$/.test(str) ? undefined : \"Invalid currency format\";\n};\n\nconst uniqueInArray: ValidatorFn = (value) => {\n if (!value || !Array.isArray(value)) return undefined;\n const seen = new Set<string>();\n for (const item of value) {\n const str = String(item);\n if (seen.has(str)) return `Duplicate value: ${str}`;\n seen.add(str);\n }\n return undefined;\n};\n\nconst minLength: ValidatorFn = (value, params) => {\n if (value === null || value === undefined || typeof value !== \"string\") return undefined;\n const min = Number(params?.min ?? 0);\n return value.length < min ? `Must be at least ${min} characters` : undefined;\n};\n\nconst maxLength: ValidatorFn = (value, params) => {\n if (!value || typeof value !== \"string\") return undefined;\n const max = Number(params?.max ?? Infinity);\n return value.length > max ? `Must be at most ${max} characters` : undefined;\n};\n\nconst numericRange: ValidatorFn = (value, params) => {\n if (value == null || value === \"\") return undefined;\n const num = typeof value === \"number\" ? value : Number(value);\n if (isNaN(num)) return \"Must be a number\";\n const min = Number(params?.min ?? -Infinity);\n const max = Number(params?.max ?? Infinity);\n if (num < min || num > max) return `Must be between ${min} and ${max}`;\n return undefined;\n};\n\nconst pattern: ValidatorFn = (value, params) => {\n if (!value || typeof value !== \"string\") return undefined;\n const regex = params?.pattern;\n const message = (params?.message as string) ?? \"Invalid format\";\n if (!regex) return undefined;\n try {\n return new RegExp(regex as string).test(value) ? undefined : message;\n } catch {\n return undefined;\n }\n};\n\nconst maxKb: ValidatorFn = (value, params) => {\n if (!value || typeof value !== \"string\") return undefined;\n const maxKbValue = Number(params?.maxKb ?? 150);\n const sizeKb = Math.ceil(new Blob([value]).size / 1000);\n return sizeKb > maxKbValue ? `Content exceeds maximum size of ${maxKbValue}KB` : undefined;\n};\n\nconst exclusiveNumericRange: ValidatorFn = (value, params) => {\n if (value == null || value === \"\") return undefined;\n const num = typeof value === \"number\" ? value : Number(value);\n if (isNaN(num)) return \"Must be a number\";\n const exclMin = params?.exclusiveMin != null ? Number(params.exclusiveMin) : undefined;\n const exclMax = params?.exclusiveMax != null ? Number(params.exclusiveMax) : undefined;\n const min = params?.min != null ? Number(params.min) : undefined;\n const max = params?.max != null ? Number(params.max) : undefined;\n if (exclMin !== undefined && num <= exclMin) return `Must be greater than ${exclMin}`;\n if (exclMax !== undefined && num >= exclMax) return `Must be less than ${exclMax}`;\n if (min !== undefined && num < min) return `Must be at least ${min}`;\n if (max !== undefined && num > max) return `Must be at most ${max}`;\n return undefined;\n};\n\nconst multipleOf: ValidatorFn = (value, params) => {\n if (value == null || value === \"\") return undefined;\n const num = typeof value === \"number\" ? value : Number(value);\n if (isNaN(num)) return \"Must be a number\";\n const factor = Number(params?.factor ?? 1);\n if (factor === 0) return undefined;\n // Use tolerance for floating-point arithmetic\n const remainder = Math.abs(num % factor);\n const tolerance = 1e-10;\n if (remainder > tolerance && Math.abs(remainder - Math.abs(factor)) > tolerance) {\n return `Must be a multiple of ${factor}`;\n }\n return undefined;\n};\n\nconst requiredIf: ValidatorFn = (value, params, context) => {\n if (!params?.field || !params?.values) return undefined;\n const depValue = context.values[params.field as string];\n const allowedValues = params.values as string[];\n if (allowedValues.includes(String(depValue)) && (value == null || value === \"\")) {\n return \"This field is required\";\n }\n return undefined;\n};\n\n// --- Validator Metadata ---\n\n/** Metadata describing a validator for use in designer UIs and documentation. */\nexport interface IValidatorMetadata {\n /** Human-readable display name */\n label: string;\n /** Optional description of what the validator checks */\n description?: string;\n /** Named parameters the validator accepts */\n params?: Record<string, {\n type: \"string\" | \"number\" | \"boolean\";\n label: string;\n required?: boolean;\n }>;\n}\n\nlet validatorMetadataRegistry: Record<string, IValidatorMetadata> = {};\n\n/** Register metadata for a custom (or built-in) validator */\nexport function registerValidatorMetadata(name: string, metadata: IValidatorMetadata): void {\n validatorMetadataRegistry = { ...validatorMetadataRegistry, [name]: metadata };\n}\n\n/** Get metadata for a specific validator by name */\nexport function getValidatorMetadata(name: string): IValidatorMetadata | undefined {\n return validatorMetadataRegistry[name];\n}\n\n/** Get all registered validator metadata */\nexport function getAllValidatorMetadata(): Record<string, IValidatorMetadata> {\n return { ...validatorMetadataRegistry };\n}\n\n/** Reset validator metadata registry (for testing) */\nexport function resetValidatorMetadataRegistry(): void {\n validatorMetadataRegistry = {};\n}\n\n// --- Registry ---\n\nconst defaultValidators: Record<string, ValidatorFn> = {\n required,\n email,\n phone,\n url,\n year,\n noSpecialCharacters,\n currency,\n uniqueInArray,\n minLength,\n maxLength,\n numericRange,\n pattern,\n maxKb,\n exclusiveNumericRange,\n multipleOf,\n requiredIf,\n // Legacy name aliases\n EmailValidation: email,\n PhoneNumberValidation: phone,\n YearValidation: year,\n isValidUrl: url,\n NoSpecialCharactersValidation: noSpecialCharacters,\n CurrencyValidation: currency,\n UniqueInArrayValidation: uniqueInArray,\n Max150KbValidation: (v, _p, c) => maxKb(v, { maxKb: 150 }, c),\n Max32KbValidation: (v, _p, c) => maxKb(v, { maxKb: 32 }, c),\n};\n\nlet validatorRegistry: Record<string, ValidatorFn> = { ...defaultValidators };\n\n/** Register custom validators (merge into registry) */\nexport function registerValidators(custom: Record<string, ValidatorFn>): void {\n validatorRegistry = { ...validatorRegistry, ...custom };\n}\n\n/** Get a validator by name */\nexport function getValidator(name: string): ValidatorFn | undefined {\n return validatorRegistry[name];\n}\n\n/** Get a copy of the full registry */\nexport function getValidatorRegistry(): Record<string, ValidatorFn> {\n return { ...validatorRegistry };\n}\n\n/** Reset registry to defaults (for testing) */\nexport function resetValidatorRegistry(): void {\n validatorRegistry = { ...defaultValidators };\n}\n\n/**\n * Run all validation rules for a field value.\n * Handles sync, async, and conditional validation.\n */\nexport async function runValidations(\n value: unknown,\n rules: IValidationRule[],\n context: IValidationContext\n): Promise<string | undefined> {\n for (const rule of rules) {\n if (context.signal?.aborted) return undefined;\n\n // Check conditional validation\n if (rule.when) {\n if (!evaluateCondition(rule.when, context.values)) continue;\n }\n\n const validator = getValidator(rule.name);\n if (!validator) continue;\n\n const result = validator(value, rule.params, context);\n const message = result instanceof Promise ? await result : result;\n\n if (message) {\n return rule.message ?? message;\n }\n }\n return undefined;\n}\n\n/**\n * Run only sync validation rules (no await, fast fail).\n */\nexport function runSyncValidations(\n value: unknown,\n rules: IValidationRule[],\n context: IValidationContext\n): string | undefined {\n for (const rule of rules) {\n if (rule.async) continue;\n\n if (rule.when) {\n if (!evaluateCondition(rule.when, context.values)) continue;\n }\n\n const validator = getValidator(rule.name);\n if (!validator) continue;\n\n const result = validator(value, rule.params, context);\n if (typeof result === \"string\") {\n return rule.message ?? result;\n }\n }\n return undefined;\n}\n\n// --- Factory helpers for common validators ---\n\nexport function createMinLengthRule(min: number, message?: string): IValidationRule {\n return { name: \"minLength\", params: { min }, message };\n}\n\nexport function createMaxLengthRule(max: number, message?: string): IValidationRule {\n return { name: \"maxLength\", params: { max }, message };\n}\n\nexport function createNumericRangeRule(min: number, max: number, message?: string): IValidationRule {\n return { name: \"numericRange\", params: { min, max }, message };\n}\n\nexport function createPatternRule(pattern: string, message: string): IValidationRule {\n return { name: \"pattern\", params: { pattern, message } };\n}\n\nexport function createRequiredIfRule(\n field: string,\n values: string[],\n message?: string\n): IValidationRule {\n return { name: \"requiredIf\", params: { field, values }, message };\n}\n","import { IEntityData, SubEntityType, isEmpty, isNull, isStringEmpty } from \"../utils\";\nimport { UseFormSetValue } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IConfirmInputModalProps } from \"../types/IConfirmInputModalProps\";\nimport { IFieldToRender } from \"../types/IFieldToRender\";\nimport { IRuntimeFieldState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IOption } from \"../types/IOption\";\nimport { evaluateAllRules } from \"./RuleEngine\";\nimport { runSyncValidations, runValidations, IValidationContext } from \"./ValidationRegistry\";\nimport { executeValueFunction } from \"./ValueFunctionRegistry\";\nimport { evaluateExpression } from \"./ExpressionEngine\";\nimport { logEvent } from \"./EventTimeline\";\n\nexport const GetChildEntity = (\n entityId?: string,\n entity?: IEntityData,\n entityPath?: string,\n idField: string = \"id\"\n): IEntityData | undefined => {\n if (!entity || !entityPath) return undefined;\n const childValues = (entity[entityPath] as IEntityData[])?.filter(child => child[idField] === entityId);\n return childValues?.length === 1 ? { ...childValues[0], Parent: { ...entity } } : undefined;\n};\n\nexport const IsExpandVisible = (\n fieldStates: Record<string, IRuntimeFieldState>,\n expandCutoffCount: number = 12\n): boolean => {\n let count = 0;\n Object.keys(fieldStates).forEach(field => {\n if (!fieldStates[field].hidden) count += 1;\n });\n return count > expandCutoffCount;\n};\n\nexport const GetConfirmInputModalProps = (\n dirtyFieldNames: string[],\n fieldStates: Record<string, IRuntimeFieldState>\n): IConfirmInputModalProps => {\n const confirmInputModalProps: IConfirmInputModalProps = {};\n\n dirtyFieldNames?.forEach(fieldName => {\n fieldStates[fieldName]?.dependentFields?.forEach(dependentFieldName => {\n if (fieldStates[dependentFieldName]?.confirmInput) {\n if (confirmInputModalProps.confirmInputsTriggeredBy === undefined) {\n confirmInputModalProps.confirmInputsTriggeredBy = fieldName;\n confirmInputModalProps.dependentFieldNames = [dependentFieldName];\n } else {\n confirmInputModalProps.dependentFieldNames!.push(dependentFieldName);\n }\n }\n });\n });\n\n confirmInputModalProps.otherDirtyFields = dirtyFieldNames?.filter(\n fieldName =>\n !confirmInputModalProps.dependentFieldNames?.includes(fieldName) &&\n fieldName !== confirmInputModalProps.confirmInputsTriggeredBy\n );\n\n return confirmInputModalProps;\n};\n\ninterface IExecuteComputedValue {\n fieldName: string;\n expression: string;\n}\n\nexport const GetComputedValuesOnDirtyFields = (\n dirtyFieldNames: string[],\n fieldStates: Record<string, IRuntimeFieldState>\n): IExecuteComputedValue[] => {\n const computedValues: IExecuteComputedValue[] = [];\n\n dirtyFieldNames?.forEach(fieldName => {\n fieldStates[fieldName]?.dependentFields?.forEach(dependentFieldName => {\n const state = fieldStates[dependentFieldName];\n if (\n state?.computedValue &&\n !state.computeOnCreateOnly &&\n !dirtyFieldNames.includes(dependentFieldName)\n ) {\n computedValues.push({\n fieldName: dependentFieldName,\n expression: state.computedValue,\n });\n }\n });\n });\n\n return computedValues;\n};\n\nexport const GetComputedValuesOnCreate = (\n fieldStates: Record<string, IRuntimeFieldState>\n): IExecuteComputedValue[] => {\n const computedValues: IExecuteComputedValue[] = [];\n\n Object.keys(fieldStates).forEach(fieldName => {\n const state = fieldStates[fieldName];\n if (state.computedValue && state.computeOnCreateOnly) {\n computedValues.push({\n fieldName,\n expression: state.computedValue,\n });\n }\n });\n\n return computedValues;\n};\n\nexport const ExecuteComputedValue = (\n expression: string,\n values: IEntityData,\n fieldName?: string,\n parentEntity?: IEntityData,\n currentUserId?: string\n): SubEntityType => {\n return evaluateExpression(expression, values, fieldName, parentEntity, currentUserId) as SubEntityType;\n};\n\nexport const CheckFieldValidationRules = (\n value: unknown,\n fieldName: string,\n entityData: IEntityData,\n state: IRuntimeFieldState\n): string | undefined => {\n if (!state.validate || state.validate.length === 0) return undefined;\n const context: IValidationContext = { fieldName, values: entityData };\n const result = runSyncValidations(value, state.validate, context);\n logEvent(\"validation_run\", fieldName, result ? `failed: ${result}` : \"passed\");\n return result;\n};\n\nexport const CheckAsyncFieldValidationRules = async (\n value: unknown,\n fieldName: string,\n entityData: IEntityData,\n state: IRuntimeFieldState,\n signal?: AbortSignal\n): Promise<string | undefined> => {\n if (!state.validate || state.validate.length === 0) return undefined;\n const context: IValidationContext = { fieldName, values: entityData, signal };\n return runValidations(value, state.validate, context);\n};\n\nexport const CheckValidDropdownOptions = (\n fieldStates: Record<string, IRuntimeFieldState>,\n formValues: IEntityData,\n setValue: UseFormSetValue<IEntityData>\n) => {\n if (isEmpty(fieldStates) || isEmpty(formValues)) return;\n\n Object.keys(fieldStates).forEach(fieldName => {\n const { type, options } = fieldStates[fieldName];\n if (\n (type === \"Dropdown\" || type === \"StatusDropdown\") &&\n !isNull(formValues[fieldName]) &&\n options &&\n options.findIndex(o => String(o.value) === String(formValues[fieldName])) === -1\n ) {\n setValue(`${fieldName}` as const, null, { shouldDirty: false });\n } else if (type === \"Multiselect\" && !isNull(formValues[fieldName]) && options) {\n const filteredValues = (formValues[fieldName] as string[])?.filter(\n val => options.some(o => String(o.value) === val)\n );\n if (filteredValues?.length !== (formValues[fieldName] as string[])?.length) {\n setValue(`${fieldName}` as const, filteredValues, { shouldDirty: false });\n }\n }\n });\n};\n\nexport const CheckDefaultValues = (\n fieldStates: Record<string, IRuntimeFieldState>,\n formValues: IEntityData,\n setValue: UseFormSetValue<IEntityData>\n) => {\n if (isEmpty(fieldStates) || isEmpty(formValues)) return;\n\n Object.keys(fieldStates).forEach(fieldName => {\n const { defaultValue, hidden } = fieldStates[fieldName];\n if (!isNull(defaultValue) && isNull(formValues[fieldName]) && !hidden) {\n setValue(`${fieldName}` as const, defaultValue, { shouldDirty: true });\n }\n });\n};\n\nexport const InitOnCreateFormState = (\n configName: string,\n fields: Record<string, IFieldConfig>,\n defaultValues: IEntityData,\n parentEntity: IEntityData,\n userId: string,\n setValue: UseFormSetValue<IEntityData>,\n initFormState: (\n configName: string,\n defaultValues: IEntityData,\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n ) => IRuntimeFormState\n): { formState: IRuntimeFormState; initEntityData: IEntityData } => {\n const initEntityData: IEntityData = { ...defaultValues, Parent: { ...parentEntity } };\n\n // Execute computed values for create\n for (const [fieldName, config] of Object.entries(fields)) {\n if (config.computedValue && config.computeOnCreateOnly) {\n const result = ExecuteComputedValue(\n config.computedValue,\n initEntityData,\n fieldName,\n parentEntity,\n userId\n );\n if (result !== undefined) {\n setValue(`${fieldName}` as const, result);\n initEntityData[fieldName] = result;\n }\n }\n if (config.defaultValue !== undefined && isNull(initEntityData[fieldName])) {\n setValue(`${fieldName}` as const, config.defaultValue);\n initEntityData[fieldName] = config.defaultValue;\n }\n }\n\n return {\n formState: initFormState(configName, initEntityData, fields, false),\n initEntityData,\n };\n};\n\nexport const InitOnEditFormState = (\n configName: string,\n fields: Record<string, IFieldConfig>,\n defaultValues: IEntityData,\n areAllFieldsReadonly: boolean,\n initFormState: (\n configName: string,\n defaultValues: IEntityData,\n fields: Record<string, IFieldConfig>,\n areAllFieldsReadonly?: boolean\n ) => IRuntimeFormState\n): { formState: IRuntimeFormState; initEntityData: IEntityData } => {\n return {\n formState: initFormState(configName, defaultValues, fields, areAllFieldsReadonly),\n initEntityData: defaultValues,\n };\n};\n\nexport const ShowField = (filterText?: string, value?: SubEntityType, label?: string): boolean => {\n if (!filterText) return true;\n const valueStr = JSON.stringify(value)?.toLowerCase();\n const labelStr = label?.toLowerCase();\n return (valueStr?.includes(filterText.toLowerCase()) ?? false) ||\n (labelStr?.includes(filterText.toLowerCase()) ?? false);\n};\n\nexport const GetFieldsToRender = (\n fieldRenderLimit: number,\n fieldOrder: string[],\n fieldStates?: Record<string, IRuntimeFieldState>\n): IFieldToRender[] => {\n if (fieldRenderLimit) {\n const fieldsToRender: IFieldToRender[] = [];\n let count = 0;\n fieldOrder.forEach(fieldName => {\n if (fieldStates?.[fieldName]?.hidden) return;\n if (count === fieldRenderLimit) {\n fieldsToRender.push({ fieldName, softHidden: true });\n } else {\n fieldsToRender.push({ fieldName, softHidden: false });\n count += 1;\n }\n });\n return fieldsToRender;\n }\n return fieldOrder?.map(fieldName => ({ fieldName, softHidden: false }));\n};\n\n/** Sort options alphabetically by label */\nexport const SortOptions = (options: IOption[]): IOption[] => {\n return [...options].sort((a, b) => {\n const aLabel = a.label?.toLowerCase() ?? \"\";\n const bLabel = b.label?.toLowerCase() ?? \"\";\n return aLabel < bLabel ? -1 : aLabel > bLabel ? 1 : 0;\n });\n};\n","import { IOption } from \"../types/IOption\";\n\n/** Sort options alphabetically by label */\nexport function SortOptions(options: IOption[]): IOption[] {\n return [...options].sort((a, b) => {\n const aLabel = a.label?.toLowerCase() ?? \"\";\n const bLabel = b.label?.toLowerCase() ?? \"\";\n return aLabel < bLabel ? -1 : aLabel > bLabel ? 1 : 0;\n });\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { buildDependencyGraph, topologicalSort } from \"./RuleEngine\";\nimport { extractConditionDependencies } from \"./ConditionEvaluator\";\n\nexport interface ICycleError {\n type: \"dependency\" | \"self\";\n fields: string[];\n message: string;\n}\n\n/**\n * Detects circular dependencies in field rules using Kahn's algorithm.\n * Operates on the dependency graph built from IFieldConfig.rules.\n */\nexport function detectDependencyCycles(\n fields: Record<string, IFieldConfig>\n): ICycleError[] {\n const errors: ICycleError[] = [];\n const graph = buildDependencyGraph(fields);\n const { hasCycle, cycleFields } = topologicalSort(graph);\n\n if (hasCycle) {\n errors.push({\n type: \"dependency\",\n fields: cycleFields,\n message: `Circular dependency detected among fields: ${cycleFields.join(\", \")}`,\n });\n }\n\n return errors;\n}\n\n/**\n * Detects self-dependencies (a field's rule references itself in a way that causes loops).\n */\nexport function detectSelfDependencies(\n fields: Record<string, IFieldConfig>\n): ICycleError[] {\n const errors: ICycleError[] = [];\n\n for (const [fieldName, config] of Object.entries(fields)) {\n if (!config.rules) continue;\n for (const rule of config.rules) {\n // Check if the rule's condition references itself AND its effect targets itself\n const condDeps = extractConditionDependencies(rule.when);\n const selfInCondition = condDeps.includes(fieldName);\n\n if (selfInCondition && rule.then.fields?.[fieldName]) {\n errors.push({\n type: \"self\",\n fields: [fieldName],\n message: `Field \"${fieldName}\" has a rule that both depends on and modifies itself`,\n });\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Validates the full dependency graph of field configs.\n * Logs warnings in development, returns errors for programmatic use.\n */\nexport function validateDependencyGraph(\n fields: Record<string, IFieldConfig>\n): ICycleError[] {\n const errors: ICycleError[] = [];\n\n errors.push(...detectDependencyCycles(fields));\n errors.push(...detectSelfDependencies(fields));\n\n // Log warnings in development\n try {\n if (typeof globalThis !== \"undefined\" && (globalThis as Record<string, unknown>).__DEV__ !== false) {\n for (const error of errors) {\n console.warn(`[form-engine] ${error.message}`);\n }\n }\n } catch {\n // Silently ignore\n }\n\n return errors;\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { getValidator } from \"./ValidationRegistry\";\nimport { detectDependencyCycles, detectSelfDependencies } from \"./DependencyGraphValidator\";\nimport { extractConditionDependencies } from \"./ConditionEvaluator\";\n\nexport interface IConfigValidationError {\n type:\n | \"missing_rule_target\"\n | \"unregistered_component\"\n | \"unregistered_validator\"\n | \"circular_dependency\"\n | \"self_dependency\"\n | \"missing_options\"\n | \"invalid_condition\";\n fieldName: string;\n message: string;\n details?: string;\n}\n\n/**\n * Validates field configs for common issues at dev time.\n *\n * Checks:\n * - Rule conditions reference existing fields\n * - Cross-field effects target existing fields\n * - Component types are registered (if registry provided)\n * - Validators are registered\n * - Dropdown fields have options or rules providing them\n * - No circular/self dependencies\n */\nexport function validateFieldConfigs(\n fields: Record<string, IFieldConfig>,\n registeredComponents?: Set<string>\n): IConfigValidationError[] {\n const errors: IConfigValidationError[] = [];\n const fieldNames = new Set(Object.keys(fields));\n\n for (const [fieldName, config] of Object.entries(fields)) {\n // Check rule condition field references\n if (config.rules) {\n for (const rule of config.rules) {\n const condDeps = extractConditionDependencies(rule.when);\n for (const dep of condDeps) {\n if (!fieldNames.has(dep)) {\n errors.push({\n type: \"missing_rule_target\",\n fieldName,\n message: `Field \"${fieldName}\" has a rule condition referencing non-existent field \"${dep}\"`,\n details: dep,\n });\n }\n }\n\n // Check cross-field effect targets\n if (rule.then.fields) {\n for (const target of Object.keys(rule.then.fields)) {\n if (!fieldNames.has(target)) {\n errors.push({\n type: \"missing_rule_target\",\n fieldName,\n message: `Field \"${fieldName}\" has a rule effect targeting non-existent field \"${target}\"`,\n details: target,\n });\n }\n }\n }\n if (rule.else?.fields) {\n for (const target of Object.keys(rule.else.fields)) {\n if (!fieldNames.has(target)) {\n errors.push({\n type: \"missing_rule_target\",\n fieldName,\n message: `Field \"${fieldName}\" has a rule else-effect targeting non-existent field \"${target}\"`,\n details: target,\n });\n }\n }\n }\n }\n }\n\n // Check component types are registered\n if (registeredComponents && config.type && !registeredComponents.has(config.type)) {\n errors.push({\n type: \"unregistered_component\",\n fieldName,\n message: `Field \"${fieldName}\" uses unregistered component type \"${config.type}\". Available: ${[...registeredComponents].join(\", \")}`,\n details: config.type,\n });\n }\n\n // Check validator names\n if (config.validate) {\n for (const rule of config.validate) {\n if (!getValidator(rule.name)) {\n errors.push({\n type: \"unregistered_validator\",\n fieldName,\n message: `Field \"${fieldName}\" references unregistered validator \"${rule.name}\"`,\n details: rule.name,\n });\n }\n }\n }\n\n // Check dropdown fields have options\n if (\n (config.type === \"Dropdown\" || config.type === \"StatusDropdown\" || config.type === \"Multiselect\") &&\n (!config.options || config.options.length === 0) &&\n !hasRuleProvidingOptions(fieldName, fields)\n ) {\n errors.push({\n type: \"missing_options\",\n fieldName,\n message: `Field \"${fieldName}\" is a ${config.type} but has no options configured and no rules providing options`,\n });\n }\n }\n\n // Check for circular/self dependencies\n const cycleErrors = detectDependencyCycles(fields);\n for (const cycleError of cycleErrors) {\n errors.push({\n type: \"circular_dependency\",\n fieldName: cycleError.fields[0] ?? \"\",\n message: cycleError.message,\n });\n }\n\n const selfErrors = detectSelfDependencies(fields);\n for (const selfError of selfErrors) {\n errors.push({\n type: \"self_dependency\",\n fieldName: selfError.fields[0] ?? \"\",\n message: selfError.message,\n });\n }\n\n return errors;\n}\n\n/** Checks if any rule provides options for a field */\nfunction hasRuleProvidingOptions(\n targetFieldName: string,\n fields: Record<string, IFieldConfig>\n): boolean {\n for (const config of Object.values(fields)) {\n if (config.rules) {\n for (const rule of config.rules) {\n if (rule.then.fields?.[targetFieldName]?.options) return true;\n if (rule.else?.fields?.[targetFieldName]?.options) return true;\n }\n }\n }\n return false;\n}\n","import React from \"react\";\nimport { IWizardConfig, IWizardStep } from \"../types/IWizardConfig\";\nimport { IEntityData } from \"../utils\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { getVisibleSteps, getStepFields, isStepValid } from \"../helpers/WizardHelper\";\nimport { FormStrings } from \"../strings\";\n\nexport interface IWizardNavigationProps {\n steps: IWizardStep[];\n currentStepIndex: number;\n goToStep: (index: number) => void;\n canGoNext: boolean;\n canGoPrev: boolean;\n goNext: () => void;\n goPrev: () => void;\n}\n\nexport interface IWizardStepHeaderProps {\n step: IWizardStep;\n stepIndex: number;\n totalSteps: number;\n}\n\nexport interface IWizardFormProps {\n wizardConfig: IWizardConfig;\n entityData: IEntityData;\n fieldStates?: Record<string, IRuntimeFieldState>;\n errors?: Record<string, unknown>;\n renderStepContent: (fields: string[]) => React.ReactNode;\n renderStepNavigation?: (props: IWizardNavigationProps) => React.ReactNode;\n renderStepHeader?: (props: IWizardStepHeaderProps) => React.ReactNode;\n onStepChange?: (fromIndex: number, toIndex: number) => void;\n /** Analytics callback for wizard step changes. */\n onAnalyticsStepChange?: (fromStep: number, toStep: number) => void;\n}\n\nexport const WizardForm: React.FC<IWizardFormProps> = (props) => {\n const {\n wizardConfig, entityData, fieldStates, errors,\n renderStepContent, renderStepNavigation, renderStepHeader, onStepChange, onAnalyticsStepChange,\n } = props;\n\n const [currentStepIndex, setCurrentStepIndex] = React.useState(0);\n\n const visibleSteps = React.useMemo(\n () => getVisibleSteps(wizardConfig.steps, entityData),\n [wizardConfig.steps, entityData]\n );\n\n const currentStep = visibleSteps[currentStepIndex];\n const currentFields = currentStep ? getStepFields(currentStep, fieldStates) : [];\n const canGoNext = currentStepIndex < visibleSteps.length - 1;\n const canGoPrev = currentStepIndex > 0;\n\n const goToStep = React.useCallback((index: number) => {\n if (index >= 0 && index < visibleSteps.length) {\n if (wizardConfig.validateOnStepChange && errors && currentStep) {\n if (!isStepValid(currentStep, errors)) return;\n }\n const prevIndex = currentStepIndex;\n setCurrentStepIndex(index);\n onStepChange?.(prevIndex, index);\n onAnalyticsStepChange?.(prevIndex, index);\n }\n }, [visibleSteps.length, currentStepIndex, wizardConfig.validateOnStepChange, errors, currentStep, onStepChange, onAnalyticsStepChange]);\n\n const goNext = React.useCallback(() => { if (canGoNext) goToStep(currentStepIndex + 1); }, [canGoNext, currentStepIndex, goToStep]);\n const goPrev = React.useCallback(() => { if (canGoPrev) goToStep(currentStepIndex - 1); }, [canGoPrev, currentStepIndex, goToStep]);\n\n const stepAnnouncement = currentStep\n ? `${FormStrings.stepOf(currentStepIndex + 1, visibleSteps.length)}${currentStep.title ? `: ${currentStep.title}` : \"\"}`\n : \"\";\n\n if (!currentStep) return null;\n\n return (\n <div className=\"wizard-form\" role=\"group\" aria-label={FormStrings.formWizard}>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }} data-testid=\"wizard-step-live-region\">\n {stepAnnouncement}\n </div>\n {renderStepHeader?.({ step: currentStep, stepIndex: currentStepIndex, totalSteps: visibleSteps.length })}\n <div className=\"wizard-step-content\" aria-current=\"step\">\n {renderStepContent(currentFields)}\n </div>\n {renderStepNavigation?.({ steps: visibleSteps, currentStepIndex, goToStep, canGoNext, canGoPrev, goNext, goPrev })}\n </div>\n );\n};\n\n","import { IEntityData } from \"../utils\";\nimport { IWizardStep } from \"../types/IWizardConfig\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { evaluateCondition } from \"./ConditionEvaluator\";\n\nexport function getVisibleSteps(\n steps: IWizardStep[],\n entityData: IEntityData\n): IWizardStep[] {\n return steps.filter(step => {\n if (!step.visibleWhen) return true;\n return evaluateCondition(step.visibleWhen, entityData);\n });\n}\n\nexport function getStepFields(\n step: IWizardStep,\n fieldStates?: Record<string, IRuntimeFieldState>\n): string[] {\n if (!fieldStates) return step.fields;\n return step.fields.filter(fieldName => {\n const state = fieldStates[fieldName];\n return !state?.hidden;\n });\n}\n\nexport function getStepFieldOrder(\n steps: IWizardStep[],\n entityData: IEntityData\n): string[] {\n const visibleSteps = getVisibleSteps(steps, entityData);\n return visibleSteps.flatMap(step => step.fields);\n}\n\nexport function validateStepFields(\n step: IWizardStep,\n errors: Record<string, unknown>\n): string[] {\n return step.fields.filter(fieldName => fieldName in errors);\n}\n\nexport function isStepValid(\n step: IWizardStep,\n errors: Record<string, unknown>\n): boolean {\n return validateStepFields(step, errors).length === 0;\n}\n\nexport function getStepIndex(\n steps: IWizardStep[],\n stepId: string\n): number {\n return steps.findIndex(s => s.id === stepId);\n}\n","import React from \"react\";\nimport { useFieldArray, useFormContext } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { FormStrings } from \"../strings\";\n\nexport interface IFieldArrayProps {\n fieldName: string;\n config: IFieldConfig;\n renderItem: (itemFieldNames: string[], index: number, remove: () => void) => React.ReactNode;\n renderAddButton?: (append: () => void, canAdd: boolean) => React.ReactNode;\n}\n\nexport const FieldArray: React.FC<IFieldArrayProps> = (props) => {\n const { fieldName, config, renderItem, renderAddButton } = props;\n const { control } = useFormContext();\n const { fields, append, remove } = useFieldArray({ control, name: fieldName });\n\n const canAdd = config.maxItems ? fields.length < config.maxItems : true;\n const canRemove = config.minItems ? fields.length > config.minItems : true;\n\n const handleAppend = React.useCallback(() => {\n if (canAdd) append({});\n }, [canAdd, append]);\n\n const handleRemove = React.useCallback((index: number) => {\n if (canRemove) remove(index);\n }, [canRemove, remove]);\n\n const itemFieldNames = React.useMemo(\n () => config.items ? Object.keys(config.items) : [],\n [config.items]\n );\n\n return (\n <div className=\"field-array\" role=\"group\" aria-label={config.label || fieldName}>\n {fields.map((field, index) => (\n <div key={field.id} className=\"field-array-item\" role=\"group\" aria-label={FormStrings.itemOfTotal(index + 1, fields.length, config.label || fieldName)}>\n {renderItem(\n itemFieldNames.map(name => `${fieldName}.${index}.${name}`),\n index,\n () => handleRemove(index)\n )}\n </div>\n ))}\n {renderAddButton?.(handleAppend, canAdd)}\n </div>\n );\n};\n\n","import { IEntityData, SubEntityType, isEmpty } from \"../utils\";\nimport React from \"react\";\nimport { FormProvider, FormState, useForm } from \"react-hook-form\";\nimport { FormConstants } from \"../constants\";\nimport {\n CheckDefaultValues,\n CheckValidDropdownOptions,\n ExecuteComputedValue,\n GetChildEntity,\n GetConfirmInputModalProps,\n GetComputedValuesOnDirtyFields,\n InitOnCreateFormState,\n InitOnEditFormState,\n IsExpandVisible,\n} from \"../helpers/InlineFormHelper\";\nimport { IRulesEngineState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IConfirmInputModalProps } from \"../types/IConfirmInputModalProps\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IFormConfig } from \"../types/IFormConfig\";\nimport { IFormEngineSharedProps } from \"../types/IFormEngineSharedProps\";\nimport { UseRulesEngineContext } from \"../providers/RulesEngineProvider\";\nimport { FormStrings } from \"../strings\";\nimport { useFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport ConfirmInputsModal from \"./ConfirmInputsModal\";\nimport { FormFields } from \"./InlineFormFields\";\n\ninterface IFormEngineProps extends IFormEngineSharedProps {\n /** v2 form config (preferred). If provided, fieldConfigs is ignored. */\n formConfig?: IFormConfig;\n /** v1-style field configs (for migration). Use formConfig instead. */\n fieldConfigs?: Record<string, IFieldConfig>;\n defaultValues: IEntityData;\n isChildEntity?: boolean;\n saveData?: (entityData: IEntityData, dirtyFieldNames?: string[]) => Promise<IEntityData>;\n saveTimeoutMs?: number;\n maxSaveRetries?: number;\n renderExpandButton?: (props: { isExpanded: boolean; onToggle: () => void }) => React.JSX.Element;\n renderFilterInput?: (props: { onChange: (value: string) => void }) => React.JSX.Element;\n renderDialog?: (props: { isOpen: boolean; onSave: () => void; onCancel: () => void; children: React.ReactNode }) => React.JSX.Element;\n isManualSave?: boolean;\n renderSaveButton?: (props: { onSave: () => void; isDirty: boolean; isValid: boolean; isSubmitting: boolean }) => React.ReactNode;\n formErrors?: string[];\n /** Per-field server-side errors to inject (e.g. from a failed API save). Keys are field names, values are error messages. */\n fieldErrors?: Record<string, string>;\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n /** Called with validated form values when the user submits. Works alongside auto-save. */\n onSubmit?: (values: IEntityData) => void | Promise<void>;\n /** Called with RHF FieldErrors when submit validation fails. */\n onSubmitError?: (errors: import(\"react-hook-form\").FieldErrors) => void;\n /** Render prop for a custom submit button. If onSubmit is provided and this is omitted, a default submit button is rendered. */\n renderSubmitButton?: (props: { onSubmit: () => void; isDirty: boolean; isValid: boolean; isSubmitting: boolean }) => React.ReactNode;\n}\n\nexport const FormEngine: React.FC<IFormEngineProps> = (props: IFormEngineProps): React.JSX.Element => {\n const {\n configName,\n entityId,\n entityType,\n programName,\n parentEntityId,\n parentEntityType,\n entityPath,\n expandCutoffCount,\n formConfig,\n defaultValues,\n areAllFieldsReadonly,\n collapsedMaxHeight,\n isCreate,\n parentEntity,\n isChildEntity,\n enableFilter,\n currentUserId,\n onSaveError,\n isManualSave = false,\n saveTimeoutMs = 30000,\n maxSaveRetries = 3,\n renderExpandButton,\n renderFilterInput,\n renderDialog,\n renderSaveButton,\n formErrors,\n fieldErrors,\n renderLabel,\n renderError,\n renderStatus,\n onSubmit: onSubmitProp,\n onSubmitError,\n renderSubmitButton,\n } = props;\n\n // Support both v2 formConfig and v1 fieldConfigs\n const fields = formConfig?.fields ?? props.fieldConfigs ?? {};\n const formSettings = formConfig?.settings;\n const effectiveManualSave = formSettings?.manualSave ?? isManualSave;\n const effectiveSaveTimeout = formSettings?.saveTimeoutMs ?? saveTimeoutMs;\n const effectiveMaxRetries = formSettings?.maxSaveRetries ?? maxSaveRetries;\n const effectiveExpandCutoff = formSettings?.expandCutoffCount ?? expandCutoffCount;\n const analytics = useFormAnalytics(formSettings?.analytics);\n\n const saveData = props.saveData\n ? props.saveData\n : (): Promise<IEntityData> => Promise.resolve({} as IEntityData);\n\n const { initFormState, processFieldChange, rulesState } = UseRulesEngineContext();\n\n const saveTimeoutDelay = React.useRef<number | undefined>(undefined);\n const saveTimeout = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const confirmInputModalProps = React.useRef<IConfirmInputModalProps | undefined>(undefined);\n const saveAbortControllerRef = React.useRef<AbortController | undefined>(undefined);\n const [isExpanded, setIsExpanded] = React.useState<boolean>(false);\n const [expandEnabled, setExpandEnabled] = React.useState<boolean>();\n const [inputFieldsConfirmed, setInputFieldsConfirmed] = React.useState<boolean>(true);\n const [filterText, setFilterText] = React.useState<string>();\n const [statusMessage, setStatusMessage] = React.useState<string>(\"\");\n\n const formMethods = useForm({ mode: \"onChange\", defaultValues });\n const { reset, resetField, handleSubmit, trigger, setValue, getValues, setError, clearErrors, formState } = formMethods;\n\n const rulesStateRef = React.useRef<IRulesEngineState>(rulesState);\n const formStateRef = React.useRef<FormState<IEntityData>>({ ...formState });\n const filterTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const validateAndSaveRef = React.useRef<(() => void) | undefined>(undefined);\n const { isDirty, isValid, dirtyFields, errors, isSubmitting, isSubmitSuccessful } = formState;\n\n React.useEffect(() => { rulesStateRef.current = rulesState; }, [rulesState]);\n React.useEffect(() => { formStateRef.current = formState; }, [formState]);\n React.useEffect(() => { initForm(defaultValues); }, [areAllFieldsReadonly]);\n\n // Inject server-side per-field errors into RHF error state\n React.useEffect(() => {\n if (!fieldErrors) return;\n Object.entries(fieldErrors).forEach(([fieldName, message]) => {\n setError(fieldName, { type: \"server\", message });\n });\n }, [fieldErrors]);\n\n const initForm = (entityData: IEntityData) => {\n const { formState: loadedState, initEntityData } = isCreate\n ? InitOnCreateFormState(configName, fields, entityData, parentEntity ?? {}, currentUserId ?? \"\", setValue, initFormState)\n : InitOnEditFormState(configName, fields, entityData, areAllFieldsReadonly ?? false, initFormState);\n\n setExpandEnabled(IsExpandVisible(loadedState.fieldStates, effectiveExpandCutoff));\n CheckValidDropdownOptions(loadedState.fieldStates, initEntityData, setValue);\n };\n\n React.useEffect(() => {\n if (rulesState.configs[configName]) {\n const cfg = rulesState.configs[configName];\n CheckValidDropdownOptions(cfg.fieldStates, getValues(), setValue);\n CheckDefaultValues(cfg.fieldStates, getValues(), setValue);\n handleComputedValues();\n }\n }, [rulesState]);\n\n const attemptSave = React.useCallback(() => {\n if (saveTimeout.current) { clearTimeout(saveTimeout.current); saveTimeout.current = undefined; }\n saveTimeout.current = setTimeout(() => {\n validateAndSaveRef.current?.();\n clearTimeout(saveTimeout.current);\n saveTimeout.current = undefined;\n }, saveTimeoutDelay?.current || 100);\n }, []);\n\n const setFieldValue = (fieldName: string, fieldValue: unknown, skipSave?: boolean, timeout?: number) => {\n saveTimeoutDelay.current = timeout;\n setValue(`${fieldName}` as const, fieldValue, { shouldDirty: !skipSave });\n trigger(fieldName);\n processFieldChange(getValues(), configName, fieldName, fields);\n if (!skipSave && !effectiveManualSave) { attemptSave(); }\n };\n\n const manualSave = React.useCallback(() => { validateAndSaveRef.current?.(); }, []);\n\n const saveConfirmInputFields = () => {\n trigger().then((valid: boolean) => {\n if (valid) { setInputFieldsConfirmed(true); attemptSave(); }\n });\n };\n\n const handleComputedValues = () => {\n const { dirtyFields } = formStateRef.current;\n const currentRulesState = rulesStateRef.current;\n const cfg = currentRulesState.configs[configName];\n if (!cfg) return;\n const computedValues = GetComputedValuesOnDirtyFields(Object.keys(dirtyFields), cfg.fieldStates);\n if (computedValues.length > 0) {\n computedValues.forEach(cv => {\n const result = ExecuteComputedValue(cv.expression, getValues(), cv.fieldName);\n setValue(`${cv.fieldName}` as const, result as unknown, { shouldDirty: true });\n });\n }\n };\n\n const focusFirstError = () => {\n if (typeof document === \"undefined\") return;\n const currentErrors = formStateRef.current.errors;\n const errorFieldNames = Object.keys(currentErrors);\n if (errorFieldNames.length > 0) {\n const element = document.getElementById(errorFieldNames[0]) || document.querySelector<HTMLElement>(`[name=\"${errorFieldNames[0]}\"]`);\n if (element && typeof element.focus === \"function\") element.focus();\n }\n };\n\n const validateAndSave = () => {\n const { dirtyFields } = formStateRef.current;\n const currentRulesState = rulesStateRef.current;\n const cfg = currentRulesState.configs[configName];\n if (cfg?.fieldStates) {\n Object.keys(cfg.fieldStates).forEach(fieldName => {\n if (cfg.fieldStates[fieldName]?.hidden) clearErrors(fieldName);\n });\n }\n\n setStatusMessage(FormStrings.validating);\n trigger().then((valid: boolean) => {\n if (!valid) {\n setIsExpanded(true);\n setStatusMessage(\"\");\n (typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : setTimeout)(() => focusFirstError());\n } else {\n const newConfirmInputModalProps = confirmInputModalProps.current === undefined\n ? GetConfirmInputModalProps(Object.keys(dirtyFields), cfg?.fieldStates ?? {})\n : undefined;\n\n if (newConfirmInputModalProps && !isEmpty(newConfirmInputModalProps.confirmInputsTriggeredBy) && (newConfirmInputModalProps.dependentFieldNames?.length ?? 0) > 0) {\n confirmInputModalProps.current = newConfirmInputModalProps;\n setInputFieldsConfirmed(false);\n setStatusMessage(\"\");\n } else if (dirtyFields && Object.keys(dirtyFields).length > 0) {\n setStatusMessage(FormStrings.saving);\n handleSubmit(handleSave)();\n confirmInputModalProps.current = undefined;\n } else {\n setStatusMessage(\"\");\n }\n }\n });\n };\n validateAndSaveRef.current = validateAndSave;\n\n const handleSave = (data: IEntityData) => {\n if (saveAbortControllerRef.current) saveAbortControllerRef.current.abort();\n const abortController = new AbortController();\n saveAbortControllerRef.current = abortController;\n const dirtyFieldNames = Object.keys(formStateRef.current.dirtyFields);\n\n const saveWithTimeoutAndRetry = async (attempt: number): Promise<void> => {\n if (abortController.signal.aborted) return;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(FormStrings.saveTimeout)), effectiveSaveTimeout);\n });\n try {\n const updatedEntity = await Promise.race([saveData(data, dirtyFieldNames), timeoutPromise]);\n if (abortController.signal.aborted) return;\n setStatusMessage(FormStrings.saved);\n analytics.trackFormSubmit(data as Record<string, unknown>);\n if (!isCreate) handleDirtyFields(updatedEntity, data);\n } catch (error) {\n if (abortController.signal.aborted) return;\n if (attempt < effectiveMaxRetries) {\n const delay = Math.pow(2, attempt) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n if (abortController.signal.aborted) return;\n return saveWithTimeoutAndRetry(attempt + 1);\n }\n setStatusMessage(FormStrings.saveFailed);\n dirtyFieldNames.forEach(field => { setError(field, { type: \"custom\", message: FormStrings.saveError }); });\n onSaveError?.(`${FormStrings.saveError}${error ? `: ${error}` : \"\"}`);\n }\n };\n saveWithTimeoutAndRetry(0);\n };\n\n const handleDirtyFields = (entity: IEntityData, data: IEntityData) => {\n const { dirtyFields } = formStateRef.current;\n const stillDirtyFields: IEntityData = {};\n Object.keys(dirtyFields).forEach(field => { stillDirtyFields[field] = getValues(field); });\n const resetValue = isChildEntity ? (GetChildEntity(entityId, entity, entityPath) ?? entity) : entity;\n reset(resetValue);\n Object.keys(stillDirtyFields).forEach(field => {\n if (JSON.stringify(stillDirtyFields[field]) !== JSON.stringify(data[field])) {\n setFieldValue(field, stillDirtyFields[field], false, saveTimeoutDelay?.current);\n }\n });\n };\n\n // Feature 2: handleSubmit / Batch Submit Validation\n // Triggers full RHF validation, calls onSubmit if valid, onSubmitError if invalid,\n // and focuses the first invalid field.\n const handleFormSubmit = React.useCallback(() => {\n if (!onSubmitProp) return;\n const cfg = rulesStateRef.current.configs[configName];\n // Clear hidden-field errors before batch validation (mirrors validateAndSave behaviour)\n if (cfg?.fieldStates) {\n Object.keys(cfg.fieldStates).forEach(fieldName => {\n if (cfg.fieldStates[fieldName]?.hidden) clearErrors(fieldName);\n });\n }\n trigger().then((valid: boolean) => {\n if (!valid) {\n setIsExpanded(true);\n (typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : setTimeout)(() => focusFirstError());\n onSubmitError?.(formStateRef.current.errors);\n } else {\n const values = formMethods.getValues();\n Promise.resolve(onSubmitProp(values)).catch(() => { /* consumer handles errors */ });\n }\n });\n }, [onSubmitProp, onSubmitError, configName, trigger, clearErrors]);\n\n const onFilterChange = React.useCallback((value: string) => {\n if (filterTimeoutRef.current) clearTimeout(filterTimeoutRef.current);\n filterTimeoutRef.current = setTimeout(() => setFilterText(value), 500);\n }, []);\n\n const cancelConfirmInputFields = () => {\n const current = confirmInputModalProps.current;\n if (current && current.otherDirtyFields && current.otherDirtyFields.length > 0) {\n if (current.confirmInputsTriggeredBy) resetField(current.confirmInputsTriggeredBy);\n if (current.dependentFieldNames) current.dependentFieldNames.forEach(n => resetField(n));\n saveData(getValues(), current.otherDirtyFields).then(updatedEntity => initForm(updatedEntity));\n } else {\n reset();\n initForm(getValues());\n }\n setInputFieldsConfirmed(true);\n confirmInputModalProps.current = undefined;\n };\n\n const cutoff = expandEnabled && !isExpanded\n ? (effectiveExpandCutoff ?? FormConstants.defaultExpandCutoffCount)\n : undefined;\n\n return (\n <FormProvider {...formMethods} formState={{ ...formMethods.formState, isDirty, isValid, dirtyFields, errors, isSubmitting, isSubmitSuccessful }}>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }} data-testid=\"form-status-live-region\">\n {statusMessage}\n </div>\n {enableFilter && (\n <div className=\"fe-filter\">\n {renderFilterInput ? renderFilterInput({ onChange: onFilterChange }) : (\n <input type=\"text\" placeholder={FormStrings.filterFields} aria-label={FormStrings.filterFields} onChange={(e) => onFilterChange(e.target.value)} className=\"fe-filter-input\" />\n )}\n </div>\n )}\n {formErrors && formErrors.length > 0 && (\n <div className=\"form-errors\" role=\"alert\" style={{ color: \"var(--fe-error-color, #d13438)\", padding: \"8px\", marginBottom: \"8px\" }}>\n {formErrors.map((err, i) => (<div key={i} className=\"form-error-item\">{err}</div>))}\n </div>\n )}\n <div className=\"fe-form-wrapper\">\n <FormFields\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n parentEntityId={parentEntityId}\n parentEntityType={parentEntityType}\n isExpanded={isExpanded}\n expandEnabled={expandEnabled}\n fieldOrder={rulesState?.configs[configName]?.fieldOrder}\n collapsedMaxHeight={collapsedMaxHeight}\n formState={rulesState?.configs[configName]}\n fields={fields}\n setFieldValue={setFieldValue}\n isManualSave={effectiveManualSave}\n isCreate={isCreate}\n filterText={filterText}\n fieldRenderLimit={cutoff}\n renderLabel={renderLabel}\n renderError={renderError}\n renderStatus={renderStatus}\n analytics={analytics}\n />\n {expandEnabled && (\n renderExpandButton ? renderExpandButton({ isExpanded, onToggle: () => setIsExpanded(!isExpanded) }) : (\n <button className=\"expand-button\" onClick={() => setIsExpanded(!isExpanded)} aria-expanded={isExpanded} data-testid={`${programName}-${entityType}-${entityId}-expand-form`}>\n {isExpanded ? FormStrings.seeLess : FormStrings.expand}\n </button>\n )\n )}\n {effectiveManualSave && (\n renderSaveButton ? renderSaveButton({ onSave: manualSave, isDirty, isValid, isSubmitting }) : (\n <div className=\"fe-save-actions\" style={{ marginTop: \"16px\", display: \"flex\", gap: \"8px\" }}>\n <button type=\"button\" className=\"save-button\" onClick={manualSave} disabled={!isDirty || isSubmitting}>\n {isCreate ? FormStrings.create : FormStrings.save}\n </button>\n <button type=\"button\" className=\"cancel-button\" onClick={() => { reset(); initForm(defaultValues); }} disabled={!isDirty || isSubmitting}>\n {FormStrings.cancel}\n </button>\n </div>\n )\n )}\n {onSubmitProp && (\n renderSubmitButton ? renderSubmitButton({ onSubmit: handleFormSubmit, isDirty, isValid, isSubmitting }) : (\n <div className=\"fe-submit-actions\" style={{ marginTop: \"16px\" }}>\n <button type=\"button\" className=\"submit-button\" onClick={handleFormSubmit} disabled={isSubmitting}>\n {FormStrings.save}\n </button>\n </div>\n )\n )}\n </div>\n <ConfirmInputsModal\n isOpen={confirmInputModalProps !== undefined && !inputFieldsConfirmed}\n configName={configName}\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n fields={fields}\n confirmInputFields={confirmInputModalProps?.current?.dependentFieldNames ?? []}\n cancelConfirmInputFields={cancelConfirmInputFields}\n saveConfirmInputFields={saveConfirmInputFields}\n renderDialog={renderDialog}\n />\n </FormProvider>\n );\n};\n\n","import { useRef, useMemo } from \"react\";\nimport { IAnalyticsCallbacks } from \"../types/IAnalyticsCallbacks\";\n\n/**\n * Stable wrapper functions for analytics callbacks.\n * Each function is a no-op when the corresponding callback is not provided.\n */\nexport interface IFormAnalytics {\n trackFieldFocus: (fieldName: string) => void;\n trackFieldBlur: (fieldName: string) => void;\n trackFieldChange: (fieldName: string, oldValue: unknown, newValue: unknown) => void;\n trackValidationError: (fieldName: string, errors: string[]) => void;\n trackFormSubmit: (values: Record<string, unknown>) => void;\n trackFormAbandonment: (filledFields: string[], emptyRequiredFields: string[]) => void;\n trackWizardStepChange: (fromStep: number, toStep: number) => void;\n trackRuleTriggered: (event: { fieldName: string; ruleIndex: number; conditionMet: boolean }) => void;\n /** Timestamp (ms) when the hook was first created -- used for form duration. */\n formStartTime: number;\n}\n\n/**\n * Hook that wraps IAnalyticsCallbacks into safe, memoized wrapper functions.\n * Tracks form start time for duration calculations and per-field focus times.\n */\nexport function useFormAnalytics(callbacks?: IAnalyticsCallbacks): IFormAnalytics {\n const formStartTime = useRef(Date.now()).current;\n const focusTimes = useRef<Record<string, number>>({});\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n return useMemo<IFormAnalytics>(() => ({\n formStartTime,\n\n trackFieldFocus(fieldName: string) {\n focusTimes.current[fieldName] = Date.now();\n callbacksRef.current?.onFieldFocus?.(fieldName);\n },\n\n trackFieldBlur(fieldName: string) {\n const start = focusTimes.current[fieldName];\n const timeSpentMs = start ? Date.now() - start : 0;\n delete focusTimes.current[fieldName];\n callbacksRef.current?.onFieldBlur?.(fieldName, timeSpentMs);\n },\n\n trackFieldChange(fieldName: string, oldValue: unknown, newValue: unknown) {\n callbacksRef.current?.onFieldChange?.(fieldName, oldValue, newValue);\n },\n\n trackValidationError(fieldName: string, errors: string[]) {\n callbacksRef.current?.onValidationError?.(fieldName, errors);\n },\n\n trackFormSubmit(values: Record<string, unknown>) {\n const durationMs = Date.now() - formStartTime;\n callbacksRef.current?.onFormSubmit?.(values, durationMs);\n },\n\n trackFormAbandonment(filledFields: string[], emptyRequiredFields: string[]) {\n callbacksRef.current?.onFormAbandonment?.(filledFields, emptyRequiredFields);\n },\n\n trackWizardStepChange(fromStep: number, toStep: number) {\n callbacksRef.current?.onWizardStepChange?.(fromStep, toStep);\n },\n\n trackRuleTriggered(event: { fieldName: string; ruleIndex: number; conditionMet: boolean }) {\n callbacksRef.current?.onRuleTriggered?.(event);\n },\n }), [formStartTime]);\n}\n","import React from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { UseRulesEngineContext } from \"../providers/RulesEngineProvider\";\nimport { FormStrings } from \"../strings\";\nimport RenderField from \"./RenderField\";\n\ninterface IConfirmInputsModalProps {\n isOpen?: boolean;\n configName: string;\n entityId?: string;\n entityType?: string;\n programName?: string;\n fields: Record<string, IFieldConfig>;\n confirmInputFields: string[];\n saveConfirmInputFields: () => void;\n cancelConfirmInputFields: () => void;\n renderDialog?: (props: { isOpen: boolean; onSave: () => void; onCancel: () => void; children: React.ReactNode }) => React.JSX.Element;\n}\n\nfunction getFocusableElements(container: HTMLElement): HTMLElement[] {\n const selector = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(container.querySelectorAll<HTMLElement>(selector));\n}\n\nconst ConfirmInputsModal = (props: IConfirmInputsModalProps) => {\n const {\n isOpen, configName, entityId, entityType, programName,\n fields, confirmInputFields, saveConfirmInputFields,\n cancelConfirmInputFields, renderDialog,\n } = props;\n\n const { setValue, trigger } = useFormContext();\n const { rulesState } = UseRulesEngineContext();\n\n const dialogRef = React.useRef<HTMLDialogElement>(null);\n const previouslyFocusedRef = React.useRef<Element | null>(null);\n const saveButtonRef = React.useRef<HTMLButtonElement>(null);\n\n React.useEffect(() => {\n if (isOpen && dialogRef.current && !dialogRef.current.open) {\n previouslyFocusedRef.current = document.activeElement;\n dialogRef.current.showModal();\n saveButtonRef.current?.focus();\n } else if (!isOpen && dialogRef.current?.open) {\n dialogRef.current.close();\n if (previouslyFocusedRef.current instanceof HTMLElement) previouslyFocusedRef.current.focus();\n previouslyFocusedRef.current = null;\n }\n }, [isOpen]);\n\n React.useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n const handleCancel = (e: Event) => { e.preventDefault(); cancelConfirmInputFields(); };\n dialog.addEventListener(\"cancel\", handleCancel);\n return () => { dialog.removeEventListener(\"cancel\", handleCancel); };\n }, [cancelConfirmInputFields]);\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLDialogElement>) => {\n if (e.key !== \"Tab\" || !dialogRef.current) return;\n const focusableElements = getFocusableElements(dialogRef.current);\n if (focusableElements.length === 0) return;\n const first = focusableElements[0];\n const last = focusableElements[focusableElements.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first.focus(); }\n }\n }, []);\n\n const setValueFunctionFieldValue = (fieldName: string, fieldValue: unknown) => {\n trigger();\n setValue(`${fieldName}` as const, fieldValue, { shouldDirty: true });\n };\n\n const content = (\n <div className=\"fe-form-wrapper\">\n <div className=\"fe-form-container\">\n <form className=\"fe-form fe-modal\">\n {confirmInputFields?.map(confirmInputField => {\n const fieldState = rulesState.configs[configName]?.fieldStates[confirmInputField];\n const fieldConfig = fields[confirmInputField];\n if (!fieldState || !fieldConfig) return null;\n return (\n <RenderField\n key={`${confirmInputField}-${entityId}-modal`}\n fieldName={confirmInputField}\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n type={fieldState.type ?? \"\"}\n required\n options={fieldState.options}\n validate={fieldState.validate}\n isManualSave\n setFieldValue={setValueFunctionFieldValue}\n label={fieldConfig.label}\n skipLayoutReadOnly\n hideOnCreate={fieldConfig.hideOnCreate}\n config={fieldConfig.config}\n />\n );\n })}\n </form>\n </div>\n </div>\n );\n\n if (renderDialog) {\n return renderDialog({ isOpen: !!isOpen, onSave: saveConfirmInputFields, onCancel: cancelConfirmInputFields, children: content });\n }\n\n return (\n <dialog ref={dialogRef} className=\"fe-modal\" role=\"dialog\" aria-modal=\"true\" aria-label={FormStrings.confirm} onKeyDown={handleKeyDown}>\n {content}\n <div className=\"fe-modal-actions\">\n <button type=\"button\" ref={saveButtonRef} onClick={saveConfirmInputFields}>{FormStrings.save}</button>\n <button type=\"button\" onClick={cancelConfirmInputFields}>{FormStrings.cancel}</button>\n </div>\n </dialog>\n );\n};\n\nexport default ConfirmInputsModal;\n","import { isEmpty, isNull } from \"../utils\";\nimport React from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { ComponentTypes } from \"../constants\";\nimport { CheckFieldValidationRules, CheckAsyncFieldValidationRules, ShowField } from \"../helpers/InlineFormHelper\";\nimport { IOption } from \"../types/IOption\";\nimport { IValidationRule } from \"../types/IValidationRule\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { UseInjectedFieldContext } from \"../providers/InjectedFieldProvider\";\nimport { FormStrings } from \"../strings\";\nimport { IFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport { FieldWrapper } from \"./FieldWrapper\";\nimport { trackRender } from \"../helpers/RenderTracker\";\n\ninterface IRenderFieldProps {\n fieldName: string;\n entityId?: string;\n entityType?: string;\n programName?: string;\n type: string;\n hidden?: boolean;\n required?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n options?: IOption[];\n optionsLoading?: boolean;\n validate?: IValidationRule[];\n parentEntityId?: string;\n parentEntityType?: string;\n isManualSave?: boolean;\n setFieldValue: (fieldName: string, fieldValue: unknown, skipSave?: boolean) => void;\n isCreate?: boolean;\n filterText?: string;\n softHidden?: boolean;\n label?: string;\n skipLayoutReadOnly?: boolean;\n hideOnCreate?: boolean;\n config?: Record<string, unknown>;\n description?: string;\n placeholder?: string;\n helpText?: string;\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n analytics?: IFormAnalytics;\n}\n\nconst RenderField = (props: IRenderFieldProps) => {\n const {\n type, fieldName, entityId, entityType, programName,\n hidden, required, readOnly, disabled, options, optionsLoading, validate,\n parentEntityId, parentEntityType, isManualSave,\n setFieldValue, isCreate, filterText, softHidden,\n label, skipLayoutReadOnly, hideOnCreate, config,\n description, placeholder, helpText,\n renderLabel, renderError, renderStatus, analytics,\n } = props;\n\n const { injectedFields } = UseInjectedFieldContext();\n const { control, getValues } = useFormContext();\n const previousValueRef = React.useRef<unknown>(undefined);\n\n React.useEffect(() => {\n trackRender(fieldName);\n });\n\n const isDisabled = disabled ?? false;\n const fieldNameConst = `${fieldName}` as const;\n\n const FieldComponent = React.useMemo(() => {\n const isReadOnly = readOnly || (isDisabled && (isNull(skipLayoutReadOnly) || (!isNull(skipLayoutReadOnly) && !skipLayoutReadOnly)));\n\n if ((isCreate && hideOnCreate) || hidden) return <></>;\n\n if (!isEmpty(injectedFields) && injectedFields[type]) {\n const Comp = injectedFields[type];\n return (\n <Controller\n name={fieldNameConst}\n control={control}\n rules={{\n required: required && type !== ComponentTypes.Toggle && !isReadOnly\n ? { value: true, message: FormStrings.required }\n : undefined,\n validate: async (value) => {\n if (!validate || validate.length === 0 || isReadOnly || !value) return undefined;\n // Build a mock runtime state for validation\n const fieldState: IRuntimeFieldState = { validate };\n const syncError = CheckFieldValidationRules(value, fieldName, getValues(), fieldState);\n if (syncError) return syncError;\n return CheckAsyncFieldValidationRules(value, fieldName, getValues(), fieldState);\n },\n }}\n render={({\n field: { value },\n fieldState: { error, isDirty },\n formState: { isSubmitting, isSubmitSuccessful, errors },\n }) => {\n const errorCount = errors ? Object.keys(errors).length : 0;\n const saving = isDirty && (isSubmitting || isSubmitSuccessful);\n const savePending = isDirty && errorCount > 0 && !isSubmitting && !isSubmitSuccessful;\n if (error && analytics) {\n analytics.trackValidationError(fieldName, [error.message || \"Error\"]);\n }\n if (previousValueRef.current !== undefined && previousValueRef.current !== value && analytics) {\n analytics.trackFieldChange(fieldName, previousValueRef.current, value);\n }\n previousValueRef.current = value;\n return type === \"DynamicFragment\" ? (\n <>{React.cloneElement(Comp, { value })}</>\n ) : ShowField(filterText, value, label) && !softHidden ? (\n <FieldWrapper\n id={fieldName}\n required={required}\n label={label}\n error={error}\n errorCount={errorCount}\n saving={saving}\n savePending={savePending}\n labelClassName=\"form-label\"\n isManualSave={isManualSave}\n renderLabel={renderLabel}\n renderError={renderError}\n renderStatus={renderStatus}\n >\n {React.cloneElement(Comp, {\n fieldName,\n entityId,\n entityType,\n parentEntityId,\n parentEntityType,\n programName,\n value,\n readOnly: isReadOnly,\n required,\n error,\n errorCount,\n saving,\n savePending,\n config,\n options,\n optionsLoading,\n label,\n type,\n description,\n placeholder,\n helpText,\n setFieldValue,\n onFocus: analytics ? () => analytics.trackFieldFocus(fieldName) : undefined,\n onBlur: analytics ? () => analytics.trackFieldBlur(fieldName) : undefined,\n })}\n </FieldWrapper>\n ) : <></>;\n }}\n />\n );\n }\n\n const available = !isEmpty(injectedFields) ? Object.keys(injectedFields).join(\", \") : \"none\";\n return (\n <div style={{ color: \"red\", fontSize: \"0.85em\", padding: \"4px\" }}>\n Missing component &quot;{type}&quot; for field &quot;{fieldName}&quot;. Available: [{available}]\n </div>\n );\n }, [type, hidden, required, readOnly, disabled, options, optionsLoading, softHidden, renderLabel, renderError, renderStatus,\n fieldName, fieldNameConst, label, validate, config, description, placeholder, helpText,\n isCreate, hideOnCreate, isManualSave, skipLayoutReadOnly,\n entityId, entityType, programName, parentEntityId, parentEntityType,\n injectedFields, analytics, control, getValues, setFieldValue]);\n\n return FieldComponent;\n};\n\nexport default React.memo(RenderField);\n","import React from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { FormStrings } from \"../strings\";\n\ninterface IFieldWrapperProps {\n id?: string;\n readonly label?: string;\n readonly required?: boolean;\n readonly error?: FieldError;\n readonly errorCount?: number;\n readonly savePending?: boolean;\n readonly saving?: boolean;\n readonly labelClassName?: string;\n readonly fieldClassName?: string;\n readonly showControlonSide?: boolean;\n readonly ariaLabel?: string;\n readonly ariaDescription?: string;\n readonly containerClassName?: string;\n readonly additionalInfo?: string;\n readonly additionalInfoIcon?: string;\n readonly additionalInfoComponent?: React.ReactNode;\n isManualSave?: boolean;\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n}\n\nexport const FieldWrapper: React.FunctionComponent<React.PropsWithChildren<IFieldWrapperProps>> = React.memo((\n props: React.PropsWithChildren<IFieldWrapperProps>\n) => {\n const {\n id, required, error, errorCount, savePending, saving,\n labelClassName, fieldClassName, showControlonSide, label,\n ariaLabel, ariaDescription, containerClassName,\n additionalInfo, additionalInfoComponent, isManualSave,\n renderLabel, renderError, renderStatus,\n } = props;\n\n const labelId = `${id}_label`;\n const errorMessageId = `${id}_error`;\n const children = (Array.isArray(props.children) ? props.children : [props.children]) as React.ReactElement<Record<string, unknown>>[];\n\n const defaultLabel = (\n <div className={labelClassName || \"\"}>\n <label id={labelId} htmlFor={id} className=\"field-label\">\n {label}\n {required && <><span className=\"required-indicator\" aria-hidden=\"true\" style={{ color: \"var(--fe-required-color, #d13438)\" }}> *</span><span className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }}> (required)</span></>}\n </label>\n {additionalInfoComponent}\n {!additionalInfoComponent && additionalInfo && (\n <span className=\"additional-info\" title={additionalInfo}>&#9432;</span>\n )}\n </div>\n );\n\n const defaultErrorAndStatus = (\n <div className=\"message\">\n {error ? (\n <>\n <span className=\"error-icon\" aria-hidden=\"true\" style={{ color: \"var(--fe-error-color, #d13438)\" }}>&#10006;</span>\n <span className=\"error-message\" id={errorMessageId} role=\"alert\" style={{ color: \"var(--fe-error-color, #d13438)\" }}>\n {error.message || \"Error\"}\n </span>\n </>\n ) : savePending ? (\n <>\n <span className=\"warning-icon\" aria-hidden=\"true\" style={{ color: \"var(--fe-warning-color, #ffb900)\" }}>&#9888;</span>\n <span className=\"warning-message\" id={errorMessageId} role=\"status\" style={{ color: \"var(--fe-warning-color, #ffb900)\" }}>\n {!isManualSave ? FormStrings.autoSavePending : FormStrings.savePending} ({`${errorCount} ${FormStrings.remaining}`})\n </span>\n </>\n ) : saving ? (\n <>\n <span className=\"save-spinner\" aria-hidden=\"true\" style={{ color: \"var(--fe-saving-color, #0078d4)\" }}>&#8987;</span>\n <span className=\"save-message\" id={errorMessageId} role=\"status\" style={{ color: \"var(--fe-saving-color, #0078d4)\" }}>\n {FormStrings.saving}\n </span>\n </>\n ) : <></>}\n </div>\n );\n\n return (\n <div\n className={`form-field ${showControlonSide ? \"flexBox\" : \"\"} ${containerClassName || \"\"} ${saving ? \"saving\" : \"\"}`}\n aria-busy={saving ? \"true\" : undefined}\n >\n {renderLabel ? renderLabel({ id: id || \"\", labelId, label, required }) : defaultLabel}\n <div className={`flexBox-Direction-column field-container ${fieldClassName || \"\"}`}>\n {children.map((child, index) => {\n if (child && child.props) {\n const childProps: Record<string, unknown> = {\n id,\n \"aria-labelledby\": ariaLabel ? undefined : labelId,\n \"aria-label\": ariaLabel || undefined,\n \"aria-required\": required,\n \"aria-invalid\": !!error,\n \"aria-describedby\": errorMessageId,\n key: index,\n className: child.props.className,\n };\n if (ariaDescription && !error) {\n childProps[\"aria-description\"] = ariaDescription;\n }\n if (index === 0) {\n return React.cloneElement(child, childProps);\n }\n const siblingProps: Record<string, unknown> = {\n key: index,\n \"aria-labelledby\": childProps[\"aria-labelledby\"],\n \"aria-label\": childProps[\"aria-label\"],\n \"aria-required\": childProps[\"aria-required\"],\n \"aria-invalid\": childProps[\"aria-invalid\"],\n \"aria-describedby\": childProps[\"aria-describedby\"],\n className: child.props.className,\n };\n if (childProps[\"aria-description\"]) {\n siblingProps[\"aria-description\"] = childProps[\"aria-description\"];\n }\n return React.cloneElement(child, siblingProps);\n }\n return <React.Fragment key={index} />;\n })}\n </div>\n {renderError\n ? renderError({ id: id || \"\", error, errorCount })\n : renderStatus\n ? renderStatus({ id: id || \"\", saving, savePending, errorCount, isManualSave })\n : defaultErrorAndStatus}\n </div>\n );\n});\n\n","/**\n * RenderTracker — Module-level render count tracking for FormDevTools.\n *\n * Tracks per-field render counts and which fields re-rendered on the last change.\n */\n\nconst renderCounts: Map<string, number> = new Map();\nlet lastRenderedFields: Set<string> = new Set();\nlet pendingRenderedFields: Set<string> = new Set();\nlet totalFormRenders = 0;\n\n/**\n * Record a render for the given field. Call this from RenderField.\n */\nexport function trackRender(fieldName: string): void {\n renderCounts.set(fieldName, (renderCounts.get(fieldName) ?? 0) + 1);\n pendingRenderedFields.add(fieldName);\n}\n\n/**\n * Call once per form render cycle to snapshot which fields rendered.\n */\nexport function flushRenderCycle(): void {\n lastRenderedFields = pendingRenderedFields;\n pendingRenderedFields = new Set();\n totalFormRenders++;\n}\n\n/**\n * Returns the current render counts for all tracked fields.\n */\nexport function getRenderCounts(): Map<string, number> {\n return new Map(renderCounts);\n}\n\n/**\n * Returns the set of field names that rendered in the last cycle.\n */\nexport function getLastRenderedFields(): Set<string> {\n return new Set(lastRenderedFields);\n}\n\n/**\n * Returns total form render count.\n */\nexport function getTotalFormRenders(): number {\n return totalFormRenders;\n}\n\n/**\n * Reset all tracking data.\n */\nexport function resetRenderTracker(): void {\n renderCounts.clear();\n lastRenderedFields.clear();\n pendingRenderedFields.clear();\n totalFormRenders = 0;\n}\n","import React from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { GetFieldsToRender } from \"../helpers/InlineFormHelper\";\nimport { IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IOption } from \"../types/IOption\";\nimport { IFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport RenderField from \"./RenderField\";\nimport { FormErrorBoundary } from \"./FormErrorBoundary\";\n\ninterface IFormFieldsProps {\n entityId?: string;\n entityType?: string;\n programName?: string;\n parentEntityId?: string;\n parentEntityType?: string;\n isExpanded?: boolean;\n expandEnabled?: boolean;\n fieldOrder?: string[];\n inPanel?: boolean;\n collapsedMaxHeight?: number;\n formState?: IRuntimeFormState;\n fields?: Record<string, IFieldConfig>;\n setFieldValue: (fieldName: string, fieldValue: unknown, skipSave?: boolean) => void;\n isManualSave?: boolean;\n isCreate?: boolean;\n filterText?: string;\n fieldRenderLimit?: number;\n renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n analytics?: IFormAnalytics;\n}\n\nexport const FormFields = (props: IFormFieldsProps) => {\n const {\n entityId, entityType, programName, parentEntityId, parentEntityType,\n isExpanded, expandEnabled, fieldOrder, inPanel, collapsedMaxHeight,\n formState, fields, setFieldValue, isManualSave, isCreate, filterText,\n fieldRenderLimit, renderLabel, renderError, renderStatus, analytics,\n } = props;\n\n // Async options state: maps fieldId -> loaded IOption[] (undefined = not yet loaded)\n const [asyncOptions, setAsyncOptions] = React.useState<Record<string, IOption[]>>({});\n // Async options loading state: maps fieldId -> boolean\n const [asyncOptionsLoading, setAsyncOptionsLoading] = React.useState<Record<string, boolean>>({});\n // Cache key per field: JSON-serialised values of optionsDependsOn fields\n const asyncCacheKeyRef = React.useRef<Record<string, string>>({});\n\n const { getValues } = useFormContext();\n\n // Run loadOptions for each field that declares it, re-running when deps change.\n // useEffect runs after every render; we guard with a cache key to avoid redundant fetches.\n React.useEffect(() => {\n if (!fields) return;\n Object.entries(fields).forEach(([fieldId, fieldConfig]) => {\n if (!fieldConfig.loadOptions) return;\n const depValues = (fieldConfig.optionsDependsOn ?? []).reduce<Record<string, unknown>>(\n (acc, dep) => { acc[dep] = getValues(dep); return acc; },\n {}\n );\n const cacheKey = JSON.stringify(depValues);\n if (asyncCacheKeyRef.current[fieldId] === cacheKey) return; // deps unchanged, use cached result\n asyncCacheKeyRef.current[fieldId] = cacheKey;\n setAsyncOptionsLoading(prev => ({ ...prev, [fieldId]: true }));\n fieldConfig.loadOptions({ fieldId, values: getValues() })\n .then(options => {\n setAsyncOptions(prev => ({ ...prev, [fieldId]: options }));\n })\n .catch(() => {\n // On error, leave the previous options intact and clear loading state\n })\n .finally(() => {\n setAsyncOptionsLoading(prev => ({ ...prev, [fieldId]: false }));\n });\n });\n });\n\n const collapsedClass = !isExpanded && (expandEnabled || expandEnabled === undefined) ? \"collapsed\" : \"\";\n const fieldsToRender = GetFieldsToRender(fieldRenderLimit ?? 0, fieldOrder ?? [], formState?.fieldStates);\n const loadingKey = `${programName}-${entityType}-${entityId}-form-loaded`;\n\n return (\n <div className={`fe-form-container ${collapsedClass}`}>\n <form\n className={`fe-form ${collapsedClass} ${inPanel ? \"in-panel\" : \"\"}`}\n style={collapsedClass && collapsedMaxHeight ? { maxHeight: `${collapsedMaxHeight}px` } : undefined}\n data-testid={`${programName}-${entityType}-${entityId}-form`}\n >\n <input type=\"hidden\" id={loadingKey} name={loadingKey} data-testid={loadingKey} />\n {fieldsToRender?.map(fieldToRender => {\n const { fieldName, softHidden } = fieldToRender;\n const fieldState = formState?.fieldStates[fieldName];\n if (!fieldState) return <React.Fragment key={fieldName} />;\n\n const fieldConfig = fields![fieldName];\n return (\n <FormErrorBoundary key={`${fieldName}-${entityId}-form`}>\n <RenderField\n fieldName={fieldName}\n entityId={entityId}\n entityType={entityType}\n programName={programName}\n type={fieldState.type ?? \"\"}\n hidden={fieldState.hidden}\n required={fieldState.required}\n readOnly={fieldState.readOnly}\n options={asyncOptions[fieldName] ?? fieldState.options}\n optionsLoading={asyncOptionsLoading[fieldName] ?? false}\n validate={fieldState.validate}\n parentEntityId={parentEntityId}\n parentEntityType={parentEntityType}\n setFieldValue={setFieldValue}\n isManualSave={isManualSave}\n isCreate={isCreate}\n filterText={filterText}\n softHidden={softHidden}\n label={fieldState?.label ?? fieldConfig?.label}\n skipLayoutReadOnly={fieldConfig?.skipLayoutReadOnly}\n hideOnCreate={fieldConfig?.hideOnCreate}\n config={fieldConfig?.config}\n description={fieldConfig?.description}\n placeholder={fieldConfig?.placeholder}\n helpText={fieldConfig?.helpText}\n renderLabel={renderLabel}\n renderError={renderError}\n renderStatus={renderStatus}\n analytics={analytics}\n />\n </FormErrorBoundary>\n );\n })}\n </form>\n </div>\n );\n};\n\n","import React from \"react\";\n\ninterface IFormErrorBoundaryProps {\n children: React.ReactNode;\n fallback?: (error: Error, resetError: () => void) => React.ReactNode;\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n}\n\ninterface IFormErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class FormErrorBoundary extends React.Component<IFormErrorBoundaryProps, IFormErrorBoundaryState> {\n constructor(props: IFormErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): IFormErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n }\n\n resetError = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): React.ReactNode {\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) return this.props.fallback(this.state.error, this.resetError);\n return (\n <div className=\"form-error-boundary\" role=\"alert\">\n <span className=\"error-boundary-message\">Something went wrong: {this.state.error.message}</span>\n <button className=\"error-boundary-retry\" onClick={this.resetError} type=\"button\">Retry</button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n","import React from \"react\";\nimport { IRuntimeFormState, IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { getRenderCounts, getLastRenderedFields, getTotalFormRenders, resetRenderTracker } from \"../helpers/RenderTracker\";\nimport { getTimeline, clearTimeline, ITimelineEvent } from \"../helpers/EventTimeline\";\n\nexport interface IFormDevToolsProps {\n configName: string;\n formState?: IRuntimeFormState;\n formValues?: Record<string, unknown>;\n formErrors?: Record<string, unknown>;\n dirtyFields?: Record<string, boolean>;\n enabled?: boolean;\n}\n\ntype TabKey = \"rules\" | \"values\" | \"errors\" | \"graph\" | \"performance\" | \"depgraph\" | \"timeline\";\n\nexport const FormDevTools: React.FC<IFormDevToolsProps> = (props) => {\n const { configName, formState, formValues, formErrors, dirtyFields, enabled = true } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [activeTab, setActiveTab] = React.useState<TabKey>(\"rules\");\n const [timelineFilter, setTimelineFilter] = React.useState(\"\");\n const [depGraphSort, setDepGraphSort] = React.useState<\"name\" | \"depCount\">(\"name\");\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\n\n if (!enabled) return null;\n\n const fieldStates = formState?.fieldStates ?? {};\n const fieldNames = Object.keys(fieldStates);\n\n const dependencyGraph = React.useMemo(() => {\n const lines: string[] = [];\n for (const [name, state] of Object.entries(fieldStates)) {\n if (state.dependentFields?.length) {\n lines.push(`${name} -> ${state.dependentFields.join(\", \")}`);\n }\n if (state.dependsOnFields?.length) {\n lines.push(`${name} (depends on) ${state.dependsOnFields.join(\", \")}`);\n }\n }\n return lines;\n }, [fieldStates]);\n\n const containerStyle: React.CSSProperties = {\n position: \"fixed\", bottom: 0, right: 0,\n width: isOpen ? \"520px\" : \"auto\", maxHeight: isOpen ? \"50vh\" : \"auto\",\n background: \"#1e1e1e\", color: \"#d4d4d4\", fontFamily: \"monospace\", fontSize: \"12px\",\n zIndex: 9999, borderTopLeftRadius: \"8px\", overflow: \"hidden\", boxShadow: \"0 -2px 10px rgba(0,0,0,0.3)\",\n };\n\n const tabStyle = (active: boolean): React.CSSProperties => ({\n padding: \"4px 8px\", cursor: \"pointer\",\n background: active ? \"#333\" : \"transparent\", color: active ? \"#fff\" : \"#888\",\n border: \"none\", borderBottom: active ? \"2px solid #007acc\" : \"2px solid transparent\",\n fontFamily: \"monospace\", fontSize: \"11px\",\n });\n\n const thStyle: React.CSSProperties = {\n textAlign: \"left\", padding: \"3px 6px\", borderBottom: \"1px solid #555\",\n fontWeight: \"bold\", color: \"#fff\", fontSize: \"11px\",\n };\n\n const tdStyle: React.CSSProperties = {\n padding: \"3px 6px\", borderBottom: \"1px solid #333\", fontSize: \"11px\",\n };\n\n const btnStyle: React.CSSProperties = {\n padding: \"2px 8px\", margin: \"0 4px\", cursor: \"pointer\",\n background: \"#333\", color: \"#d4d4d4\", border: \"1px solid #555\",\n fontFamily: \"monospace\", fontSize: \"10px\", borderRadius: \"3px\",\n };\n\n // --- Performance Tab ---\n const renderPerformanceTab = () => {\n const counts = getRenderCounts();\n const lastRendered = getLastRenderedFields();\n const totalRenders = getTotalFormRenders();\n const entries = Array.from(counts.entries()).sort((a, b) => a[0].localeCompare(b[0]));\n const avgCount = entries.length > 0\n ? entries.reduce((sum, [, c]) => sum + c, 0) / entries.length\n : 0;\n\n return (\n <div>\n <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span>Total form renders: <strong style={{ color: \"#4ec9b0\" }}>{totalRenders}</strong></span>\n <button style={btnStyle} onClick={() => { resetRenderTracker(); forceUpdate(); }}>Reset</button>\n <button style={btnStyle} onClick={() => forceUpdate()}>Refresh</button>\n </div>\n {entries.length === 0 ? (\n <div>No render data yet.</div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr>\n <th style={thStyle}>Field</th>\n <th style={thStyle}>Renders</th>\n <th style={thStyle}>Last Cycle</th>\n <th style={thStyle}>Hot</th>\n </tr>\n </thead>\n <tbody>\n {entries.map(([fieldName, count]) => {\n const isHot = count > avgCount * 1.5;\n const wasLastRendered = lastRendered.has(fieldName);\n return (\n <tr key={fieldName} style={isHot ? { background: \"#3e2a00\" } : undefined}>\n <td style={tdStyle}>{fieldName}</td>\n <td style={{ ...tdStyle, color: isHot ? \"#ff9900\" : \"#d4d4d4\" }}>{count}</td>\n <td style={tdStyle}>{wasLastRendered ? \"\\u2713\" : \"\"}</td>\n <td style={tdStyle}>{isHot ? \"\\u26a0\" : \"\"}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n )}\n </div>\n );\n };\n\n // --- Dependency Graph Tab ---\n const renderDepGraphTab = () => {\n // Build adjacency data from fieldStates\n const rows: Array<{\n name: string;\n dependsOn: string[];\n dependedBy: string[];\n effects: string[];\n }> = [];\n\n let hasCycles = false;\n\n for (const [name, state] of Object.entries(fieldStates)) {\n const dependsOn = state.dependsOnFields ?? [];\n const dependedBy = state.dependentFields ?? [];\n\n // Determine primary effect types from this field's state\n const effects: string[] = [];\n if (state.hidden) effects.push(\"hidden\");\n if (state.required) effects.push(\"required\");\n if (state.readOnly) effects.push(\"readOnly\");\n if (state.options && state.options.length > 0 && dependsOn.length > 0) effects.push(\"options\");\n if (state.computedValue) effects.push(\"computed\");\n\n rows.push({ name, dependsOn, dependedBy, effects });\n }\n\n // Check for cycles: a field that both depends on and is depended by the same field\n for (const row of rows) {\n for (const dep of row.dependsOn) {\n const depRow = rows.find(r => r.name === dep);\n if (depRow?.dependsOn.includes(row.name)) {\n hasCycles = true;\n break;\n }\n }\n if (hasCycles) break;\n }\n\n // Filter to only fields with dependencies\n const depRows = rows.filter(r => r.dependsOn.length > 0 || r.dependedBy.length > 0);\n\n // Sort\n if (depGraphSort === \"name\") {\n depRows.sort((a, b) => a.name.localeCompare(b.name));\n } else {\n depRows.sort((a, b) => (b.dependsOn.length + b.dependedBy.length) - (a.dependsOn.length + a.dependedBy.length));\n }\n\n const effectColor = (effects: string[]): React.CSSProperties => {\n if (effects.includes(\"hidden\")) return { background: \"#3e3a20\" }; // light yellow\n if (effects.includes(\"required\")) return { background: \"#1e2a3e\" }; // light blue\n if (effects.includes(\"readOnly\")) return { background: \"#2a2a2a\" }; // light gray\n if (effects.includes(\"options\")) return { background: \"#1e3a2a\" }; // light green\n return {};\n };\n\n return (\n <div>\n <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span>Sort by:</span>\n <button style={{ ...btnStyle, borderColor: depGraphSort === \"name\" ? \"#007acc\" : \"#555\" }} onClick={() => setDepGraphSort(\"name\")}>Name</button>\n <button style={{ ...btnStyle, borderColor: depGraphSort === \"depCount\" ? \"#007acc\" : \"#555\" }} onClick={() => setDepGraphSort(\"depCount\")}>Dep Count</button>\n {hasCycles && <span style={{ color: \"#f44747\", fontWeight: \"bold\" }}>Cycles detected!</span>}\n </div>\n {depRows.length === 0 ? (\n <div>No dependencies defined.</div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr>\n <th style={thStyle}>Field</th>\n <th style={thStyle}>Depends On</th>\n <th style={thStyle}>Depended By</th>\n <th style={thStyle}>Effects</th>\n </tr>\n </thead>\n <tbody>\n {depRows.map(row => (\n <tr key={row.name} style={effectColor(row.effects)}>\n <td style={tdStyle}>{row.name}</td>\n <td style={tdStyle}>{row.dependsOn.join(\", \") || \"\\u2014\"}</td>\n <td style={tdStyle}>{row.dependedBy.join(\", \") || \"\\u2014\"}</td>\n <td style={tdStyle}>{row.effects.join(\", \") || \"\\u2014\"}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n );\n };\n\n // --- Timeline Tab ---\n const renderTimelineTab = () => {\n const timeline = getTimeline();\n const filterLower = timelineFilter.toLowerCase();\n const filtered = filterLower\n ? timeline.filter(e => e.fieldName.toLowerCase().includes(filterLower) || e.type.toLowerCase().includes(filterLower))\n : timeline;\n // Show newest first\n const reversed = [...filtered].reverse();\n\n const typeColor = (type: string): string => {\n switch (type) {\n case \"field_change\": return \"#4ec9b0\";\n case \"rule_evaluated\": return \"#ce9178\";\n case \"validation_run\": return \"#dcdcaa\";\n case \"form_submit\": return \"#569cd6\";\n default: return \"#d4d4d4\";\n }\n };\n\n const formatTime = (ts: number): string => {\n const d = new Date(ts);\n return `${String(d.getHours()).padStart(2, \"0\")}:${String(d.getMinutes()).padStart(2, \"0\")}:${String(d.getSeconds()).padStart(2, \"0\")}.${String(d.getMilliseconds()).padStart(3, \"0\")}`;\n };\n\n return (\n <div>\n <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <input\n type=\"text\"\n placeholder=\"Filter by field or type...\"\n value={timelineFilter}\n onChange={e => setTimelineFilter(e.target.value)}\n style={{\n padding: \"2px 6px\", background: \"#2d2d2d\", color: \"#d4d4d4\",\n border: \"1px solid #555\", fontFamily: \"monospace\", fontSize: \"11px\",\n borderRadius: \"3px\", flex: 1,\n }}\n />\n <button style={btnStyle} onClick={() => { clearTimeline(); forceUpdate(); }}>Clear</button>\n <button style={btnStyle} onClick={() => forceUpdate()}>Refresh</button>\n </div>\n <div style={{ fontSize: \"10px\", color: \"#888\", marginBottom: \"4px\" }}>\n {filtered.length} event{filtered.length !== 1 ? \"s\" : \"\"}\n </div>\n {reversed.length === 0 ? (\n <div>No events recorded yet.</div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr>\n <th style={thStyle}>Time</th>\n <th style={thStyle}>Type</th>\n <th style={thStyle}>Field</th>\n <th style={thStyle}>Details</th>\n </tr>\n </thead>\n <tbody>\n {reversed.slice(0, 200).map((event, i) => (\n <tr key={i}>\n <td style={{ ...tdStyle, whiteSpace: \"nowrap\", color: \"#888\" }}>{formatTime(event.timestamp)}</td>\n <td style={{ ...tdStyle, color: typeColor(event.type), whiteSpace: \"nowrap\" }}>{event.type}</td>\n <td style={tdStyle}>{event.fieldName}</td>\n <td style={{ ...tdStyle, maxWidth: \"200px\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>{event.details}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n );\n };\n\n return (\n <div style={containerStyle} data-testid=\"form-devtools\">\n <button type=\"button\" aria-expanded={isOpen} aria-controls=\"devtools-content\" style={{ width: \"100%\", padding: \"4px 8px\", cursor: \"pointer\", background: \"#333\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", border: \"none\", color: \"inherit\", font: \"inherit\" }} onClick={() => setIsOpen(!isOpen)}>\n <span style={{ color: \"#007acc\", fontWeight: \"bold\" }}>DevTools: {configName}</span>\n <span aria-hidden=\"true\">{isOpen ? \"\\u25BC\" : \"\\u25B2\"}</span>\n </button>\n {isOpen && (\n <>\n <div role=\"tablist\" aria-label=\"DevTools panels\" style={{ display: \"flex\", borderBottom: \"1px solid #333\", flexWrap: \"wrap\" }}>\n <button role=\"tab\" aria-selected={activeTab === \"rules\"} aria-controls=\"devtools-panel-rules\" style={tabStyle(activeTab === \"rules\")} onClick={() => setActiveTab(\"rules\")}>Rules ({fieldNames.length})</button>\n <button role=\"tab\" aria-selected={activeTab === \"values\"} aria-controls=\"devtools-panel-values\" style={tabStyle(activeTab === \"values\")} onClick={() => setActiveTab(\"values\")}>Values</button>\n <button role=\"tab\" aria-selected={activeTab === \"errors\"} aria-controls=\"devtools-panel-errors\" style={tabStyle(activeTab === \"errors\")} onClick={() => setActiveTab(\"errors\")}>Errors</button>\n <button role=\"tab\" aria-selected={activeTab === \"graph\"} aria-controls=\"devtools-panel-graph\" style={tabStyle(activeTab === \"graph\")} onClick={() => setActiveTab(\"graph\")}>Graph</button>\n <button role=\"tab\" aria-selected={activeTab === \"performance\"} aria-controls=\"devtools-panel-performance\" style={tabStyle(activeTab === \"performance\")} onClick={() => { setActiveTab(\"performance\"); forceUpdate(); }}>Perf</button>\n <button role=\"tab\" aria-selected={activeTab === \"depgraph\"} aria-controls=\"devtools-panel-depgraph\" style={tabStyle(activeTab === \"depgraph\")} onClick={() => setActiveTab(\"depgraph\")}>Deps</button>\n <button role=\"tab\" aria-selected={activeTab === \"timeline\"} aria-controls=\"devtools-panel-timeline\" style={tabStyle(activeTab === \"timeline\")} onClick={() => { setActiveTab(\"timeline\"); forceUpdate(); }}>Timeline</button>\n </div>\n <div role=\"tabpanel\" id={`devtools-panel-${activeTab}`} aria-label={activeTab} style={{ overflow: \"auto\", maxHeight: \"calc(50vh - 60px)\", padding: \"8px\" }}>\n {activeTab === \"rules\" && fieldNames.map(name => {\n const state = fieldStates[name];\n return (\n <div key={name} style={{ marginBottom: \"8px\", borderBottom: \"1px solid #333\", paddingBottom: \"4px\" }}>\n <div style={{ color: \"#4ec9b0\" }}>{name}</div>\n <div>type: {state.type ?? \"\\u2014\"} | required: {String(state.required ?? false)} | hidden: {String(state.hidden ?? false)} | readOnly: {String(state.readOnly ?? false)}</div>\n {state.validate?.length ? <div>validate: {state.validate.map(v => v.name).join(\", \")}</div> : null}\n {state.computedValue ? <div>computedValue: {state.computedValue}</div> : null}\n {state.activeRuleIds?.length ? <div>activeRules: {state.activeRuleIds.join(\", \")}</div> : null}\n </div>\n );\n })}\n {activeTab === \"values\" && <pre style={{ margin: 0, whiteSpace: \"pre-wrap\" }}>{JSON.stringify(formValues, null, 2)}</pre>}\n {activeTab === \"errors\" && (\n <pre style={{ margin: 0, whiteSpace: \"pre-wrap\", color: formErrors && Object.keys(formErrors).length > 0 ? \"#f44747\" : \"#4ec9b0\" }}>\n {formErrors && Object.keys(formErrors).length > 0 ? JSON.stringify(formErrors, null, 2) : \"No errors\"}\n </pre>\n )}\n {activeTab === \"graph\" && (dependencyGraph.length > 0\n ? dependencyGraph.map((line, i) => <div key={i} style={{ color: \"#ce9178\" }}>{line}</div>)\n : <div>No dependencies defined</div>\n )}\n {activeTab === \"performance\" && renderPerformanceTab()}\n {activeTab === \"depgraph\" && renderDepGraphTab()}\n {activeTab === \"timeline\" && renderTimelineTab()}\n </div>\n </>\n )}\n </div>\n );\n};\n","import { IJsonSchemaNode } from \"./types\";\n\n/**\n * Resolve all $ref pointers in a JSON Schema, inlining referenced definitions.\n *\n * - Handles both `definitions` (draft-04) and `$defs` (draft-2019+)\n * - Merges sibling properties alongside $ref (title, description override)\n * - Detects circular references via visited set, falls back to { type: \"string\" }\n * - Strips definitions/$defs from output\n */\nexport function resolveRefs(schema: IJsonSchemaNode): IJsonSchemaNode {\n const defs: Record<string, IJsonSchemaNode> = {\n ...(schema.definitions ?? {}),\n ...(schema.$defs ?? {}),\n };\n\n const resolved = resolveNode(schema, defs, new Set<string>());\n\n // Strip definition blocks from output\n const { definitions: _d, $defs: _dd, ...clean } = resolved;\n return clean;\n}\n\nfunction resolveNode(\n node: IJsonSchemaNode,\n defs: Record<string, IJsonSchemaNode>,\n visited: Set<string>\n): IJsonSchemaNode {\n if (node.$ref) {\n const refPath = node.$ref;\n\n if (visited.has(refPath)) {\n // Circular reference — fall back to string\n return { type: \"string\" };\n }\n\n const resolved = lookupRef(refPath, defs);\n if (!resolved) {\n return { type: \"string\" };\n }\n\n visited.add(refPath);\n\n // Merge sibling properties (title, description, etc.) over the resolved def\n const { $ref: _ref, ...siblings } = node;\n const inlined = resolveNode({ ...resolved, ...siblings }, defs, visited);\n\n visited.delete(refPath);\n return inlined;\n }\n\n const result: IJsonSchemaNode = {};\n\n for (const [key, value] of Object.entries(node)) {\n if (key === \"definitions\" || key === \"$defs\") {\n continue;\n }\n\n if (key === \"properties\" && value && typeof value === \"object\") {\n const props: Record<string, IJsonSchemaNode> = {};\n for (const [propName, propValue] of Object.entries(\n value as Record<string, IJsonSchemaNode>\n )) {\n props[propName] = resolveNode(propValue, defs, visited);\n }\n result.properties = props;\n } else if (key === \"items\") {\n if (Array.isArray(value)) {\n result.items = value.map((item: IJsonSchemaNode) =>\n resolveNode(item, defs, visited)\n ) as unknown as IJsonSchemaNode;\n } else if (value && typeof value === \"object\") {\n result.items = resolveNode(value as IJsonSchemaNode, defs, visited);\n }\n } else if (\n (key === \"allOf\" || key === \"oneOf\" || key === \"anyOf\") &&\n Array.isArray(value)\n ) {\n (result as Record<string, unknown>)[key] = value.map(\n (item: IJsonSchemaNode) => resolveNode(item, defs, visited)\n );\n } else if (key === \"if\" || key === \"then\" || key === \"else\") {\n if (value && typeof value === \"object\") {\n (result as Record<string, unknown>)[key] = resolveNode(\n value as IJsonSchemaNode,\n defs,\n visited\n );\n }\n } else if (key === \"dependencies\" && value && typeof value === \"object\") {\n const deps: Record<string, string[] | IJsonSchemaNode> = {};\n for (const [depName, depValue] of Object.entries(\n value as Record<string, string[] | IJsonSchemaNode>\n )) {\n if (Array.isArray(depValue)) {\n deps[depName] = depValue;\n } else if (typeof depValue === \"object\" && depValue !== null) {\n deps[depName] = resolveNode(\n depValue as IJsonSchemaNode,\n defs,\n visited\n );\n }\n }\n result.dependencies = deps;\n } else if (\n key === \"additionalProperties\" &&\n value &&\n typeof value === \"object\"\n ) {\n result.additionalProperties = resolveNode(\n value as IJsonSchemaNode,\n defs,\n visited\n );\n } else {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n\n return result;\n}\n\nfunction lookupRef(\n ref: string,\n defs: Record<string, IJsonSchemaNode>\n): IJsonSchemaNode | undefined {\n // Support \"#/definitions/Foo\" and \"#/$defs/Foo\"\n const match = ref.match(/^#\\/(?:definitions|\\$defs)\\/(.+)$/);\n if (!match) return undefined;\n\n const path = match[1];\n // Handle nested paths like \"Foo/Bar\"\n const parts = path.split(\"/\");\n let current: IJsonSchemaNode | undefined = defs[parts[0]];\n for (let i = 1; i < parts.length && current; i++) {\n current = (current as Record<string, IJsonSchemaNode>)[parts[i]];\n }\n return current;\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { IOption } from \"../../types/IOption\";\nimport { IValidationRule } from \"../../types/IValidationRule\";\nimport { IJsonSchemaNode, IRjsfUiSchema } from \"./types\";\n\n/**\n * Map from RJSF ui:widget names to our component type keys.\n */\nconst WIDGET_MAP: Record<string, string> = {\n text: \"Textbox\",\n textarea: \"Textarea\",\n password: \"Textbox\",\n color: \"Textbox\",\n hidden: \"DynamicFragment\",\n select: \"Dropdown\",\n radio: \"Dropdown\",\n checkboxes: \"Multiselect\",\n updown: \"Number\",\n range: \"Slider\",\n date: \"DateControl\",\n datetime: \"DateControl\",\n \"date-time\": \"DateControl\",\n file: \"DocumentLinks\",\n checkbox: \"Toggle\",\n};\n\n/**\n * Config overrides for specific widgets (e.g., password → config.type:\"password\").\n */\nconst WIDGET_CONFIG: Record<string, Record<string, unknown>> = {\n password: { type: \"password\" },\n color: { type: \"color\" },\n radio: { display: \"radio\" },\n checkboxes: { display: \"checkboxes\" },\n};\n\n/**\n * Convert a JSON Schema node to an IFieldConfig.\n */\nexport function schemaNodeToFieldConfig(\n fieldName: string,\n node: IJsonSchemaNode,\n isRequired: boolean\n): IFieldConfig {\n const type = mapTypeToComponent(node);\n const validate = extractValidationRules(node);\n const options = extractOptions(node);\n\n const config: IFieldConfig = {\n type,\n label: node.title ?? fieldName,\n required: isRequired,\n };\n\n if (validate.length > 0) config.validate = validate;\n if (options) config.options = options;\n if (node.default !== undefined) config.defaultValue = node.default;\n if (node.description) config.description = node.description;\n\n // const fields are read-only with the const as default\n if (node.const !== undefined) {\n config.readOnly = true;\n config.defaultValue = node.const;\n }\n\n return config;\n}\n\n/**\n * Extract IValidationRule[] from JSON Schema constraints.\n */\nexport function extractValidationRules(\n node: IJsonSchemaNode\n): IValidationRule[] {\n const rules: IValidationRule[] = [];\n\n if (node.minLength !== undefined) {\n rules.push({ name: \"minLength\", params: { min: node.minLength } });\n }\n if (node.maxLength !== undefined) {\n rules.push({ name: \"maxLength\", params: { max: node.maxLength } });\n }\n if (node.pattern) {\n rules.push({\n name: \"pattern\",\n params: { pattern: node.pattern, message: \"Must match pattern\" },\n });\n }\n\n // Numeric ranges\n const hasMin = node.minimum !== undefined;\n const hasMax = node.maximum !== undefined;\n const hasExclMin = node.exclusiveMinimum !== undefined;\n const hasExclMax = node.exclusiveMaximum !== undefined;\n\n if (hasExclMin || hasExclMax) {\n rules.push({\n name: \"exclusiveNumericRange\",\n params: {\n exclusiveMin: node.exclusiveMinimum,\n exclusiveMax: node.exclusiveMaximum,\n min: node.minimum,\n max: node.maximum,\n },\n });\n } else if (hasMin || hasMax) {\n rules.push({\n name: \"numericRange\",\n params: {\n min: node.minimum ?? -Infinity,\n max: node.maximum ?? Infinity,\n },\n });\n }\n\n if (node.multipleOf !== undefined) {\n rules.push({\n name: \"multipleOf\",\n params: { factor: node.multipleOf },\n });\n }\n\n // Format-based validators\n if (node.format === \"email\") rules.push({ name: \"email\" });\n if (node.format === \"uri\" || node.format === \"url\") rules.push({ name: \"url\" });\n if (node.format === \"phone\") rules.push({ name: \"phone\" });\n\n if (node.uniqueItems) {\n rules.push({ name: \"uniqueInArray\" });\n }\n\n return rules;\n}\n\n/**\n * Apply RJSF uiSchema overrides to an IFieldConfig.\n */\nexport function applyUiSchema(\n config: IFieldConfig,\n uiSchema: IRjsfUiSchema\n): IFieldConfig {\n const result = { ...config };\n\n // Widget → component type override\n const widget = uiSchema[\"ui:widget\"];\n if (typeof widget === \"string\" && WIDGET_MAP[widget]) {\n result.type = WIDGET_MAP[widget];\n // Apply widget-specific config\n const extraConfig = WIDGET_CONFIG[widget];\n if (extraConfig) {\n result.config = { ...(result.config ?? {}), ...extraConfig };\n }\n }\n\n if (uiSchema[\"ui:title\"]) result.label = uiSchema[\"ui:title\"] as string;\n if (uiSchema[\"ui:description\"])\n result.description = uiSchema[\"ui:description\"] as string;\n if (uiSchema[\"ui:help\"]) result.helpText = uiSchema[\"ui:help\"] as string;\n if (uiSchema[\"ui:placeholder\"])\n result.placeholder = uiSchema[\"ui:placeholder\"] as string;\n if (uiSchema[\"ui:hidden\"] === true) result.hidden = true;\n if (uiSchema[\"ui:readonly\"] === true) result.readOnly = true;\n if (uiSchema[\"ui:disabled\"] === true) result.disabled = true;\n\n if (uiSchema[\"ui:autofocus\"] === true) {\n result.config = { ...(result.config ?? {}), autofocus: true };\n }\n if (uiSchema[\"ui:classNames\"]) {\n result.config = {\n ...(result.config ?? {}),\n className: uiSchema[\"ui:classNames\"],\n };\n }\n if (uiSchema[\"ui:options\"] && typeof uiSchema[\"ui:options\"] === \"object\") {\n result.config = { ...(result.config ?? {}), ...uiSchema[\"ui:options\"] };\n }\n if (uiSchema[\"ui:label\"] === false) {\n result.config = { ...(result.config ?? {}), hideLabel: true };\n }\n\n // ui:enumDisabled → mark matching options as disabled\n const enumDisabled = uiSchema[\"ui:enumDisabled\"];\n if (Array.isArray(enumDisabled) && result.options) {\n result.options = result.options.map((opt) => ({\n ...opt,\n disabled: enumDisabled.includes(opt.value) ? true : opt.disabled,\n }));\n }\n\n // ui:enumNames → override option labels\n const enumNames = uiSchema[\"ui:enumNames\"];\n if (Array.isArray(enumNames) && result.options) {\n result.options = result.options.map((opt, i) => ({\n ...opt,\n label: enumNames[i] != null ? String(enumNames[i]) : opt.label,\n }));\n }\n\n return result;\n}\n\n// --- Internal helpers ---\n\nfunction mapTypeToComponent(node: IJsonSchemaNode): string {\n // Enum always → Dropdown\n if (node.enum) return \"Dropdown\";\n\n // const → Textbox (will be read-only)\n if (node.const !== undefined) return \"Textbox\";\n\n const type = resolveType(node);\n\n switch (type) {\n case \"string\":\n if (node.format === \"date\" || node.format === \"date-time\") return \"DateControl\";\n if (node.format === \"data-url\") return \"DocumentLinks\";\n if (node.maxLength && node.maxLength > 200) return \"Textarea\";\n return \"Textbox\";\n case \"number\":\n case \"integer\":\n if (node.minimum !== undefined && node.maximum !== undefined) return \"Slider\";\n return \"Number\";\n case \"boolean\":\n return \"Toggle\";\n case \"array\":\n return mapArrayType(node);\n case \"object\":\n return \"Textbox\"; // Objects handled at converter level\n default:\n return \"Textbox\";\n }\n}\n\nfunction resolveType(node: IJsonSchemaNode): string {\n if (!node.type) return \"string\";\n if (typeof node.type === \"string\") return node.type;\n // Array of types (nullable) — pick first non-null\n const nonNull = node.type.filter((t) => t !== \"null\");\n return nonNull[0] ?? \"string\";\n}\n\nfunction mapArrayType(node: IJsonSchemaNode): string {\n const items = node.items;\n if (!items || Array.isArray(items)) return \"Multiselect\";\n\n if (items.enum) return \"Multiselect\";\n if (items.type === \"object\" && items.properties) return \"FieldArray\";\n return \"Multiselect\";\n}\n\nfunction extractOptions(node: IJsonSchemaNode): IOption[] | undefined {\n if (!node.enum) return undefined;\n\n const names = node.enumNames;\n return node.enum.map((val, i) => ({\n value: String(val),\n label: names && names[i] != null ? String(names[i]) : String(val),\n }));\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { ICondition } from \"../../types/ICondition\";\nimport { IRule } from \"../../types/IRule\";\nimport { IJsonSchemaNode } from \"./types\";\nimport { schemaNodeToFieldConfig } from \"./fieldMapper\";\n\n/**\n * Convert JSON Schema `dependencies` to IRule[] attached to affected fields.\n *\n * Handles both property dependencies (string[]) and schema dependencies (object).\n */\nexport function convertDependencies(\n dependencies: Record<string, string[] | IJsonSchemaNode>,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n for (const [sourceField, dep] of Object.entries(dependencies)) {\n if (Array.isArray(dep)) {\n // Property dependency: when source is not empty, dependents become required\n for (const dependentField of dep) {\n if (!fields[dependentField]) continue;\n const rule: IRule = {\n id: `${idPrefix}_dep_${sourceField}_${dependentField}`,\n when: { field: sourceField, operator: \"isNotEmpty\" },\n then: { required: true },\n else: { required: false },\n };\n fields[dependentField].rules = [\n ...(fields[dependentField].rules ?? []),\n rule,\n ];\n }\n } else {\n // Schema dependency: source not empty → show/require additional fields\n convertSchemaDependency(sourceField, dep, fields, rootSchema, idPrefix);\n }\n }\n}\n\n/**\n * Convert JSON Schema `if/then/else` to IRule[] attached to affected fields.\n */\nexport function convertIfThenElse(\n schema: IJsonSchemaNode,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n const condition = schemaToCondition(schema.if!);\n if (!condition) return;\n\n const thenSchema = schema.then;\n const elseSchema = schema.else;\n\n // Collect affected fields from then/else\n const affectedFields = new Set<string>();\n if (thenSchema?.properties) {\n Object.keys(thenSchema.properties).forEach((f) => affectedFields.add(f));\n }\n if (thenSchema?.required) {\n thenSchema.required.forEach((f) => affectedFields.add(f));\n }\n if (elseSchema?.properties) {\n Object.keys(elseSchema.properties).forEach((f) => affectedFields.add(f));\n }\n if (elseSchema?.required) {\n elseSchema.required.forEach((f) => affectedFields.add(f));\n }\n\n for (const fieldName of affectedFields) {\n // Ensure field exists\n if (!fields[fieldName] && thenSchema?.properties?.[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n thenSchema.properties[fieldName],\n false\n );\n fields[fieldName].hidden = true;\n }\n if (!fields[fieldName] && elseSchema?.properties?.[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n elseSchema.properties[fieldName],\n false\n );\n fields[fieldName].hidden = true;\n }\n if (!fields[fieldName]) continue;\n\n const thenEffect: Record<string, unknown> = {};\n const elseEffect: Record<string, unknown> = {};\n\n // Visibility\n if (thenSchema?.properties?.[fieldName]) {\n thenEffect.hidden = false;\n }\n if (elseSchema?.properties?.[fieldName]) {\n elseEffect.hidden = false;\n }\n // If only in then → hide in else\n if (thenSchema?.properties?.[fieldName] && !elseSchema?.properties?.[fieldName]) {\n elseEffect.hidden = true;\n }\n // If only in else → hide in then\n if (!thenSchema?.properties?.[fieldName] && elseSchema?.properties?.[fieldName]) {\n thenEffect.hidden = true;\n }\n\n // Required\n if (thenSchema?.required?.includes(fieldName)) {\n thenEffect.required = true;\n }\n if (elseSchema?.required?.includes(fieldName)) {\n elseEffect.required = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_ite_${fieldName}`,\n when: condition,\n then: thenEffect,\n };\n\n if (Object.keys(elseEffect).length > 0) {\n rule.else = elseEffect;\n }\n\n fields[fieldName].rules = [...(fields[fieldName].rules ?? []), rule];\n }\n}\n\n/**\n * Convert oneOf/anyOf composition with discriminator detection to IRule[].\n */\nexport function convertComposition(\n schema: IJsonSchemaNode,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n const variants = schema.oneOf ?? schema.anyOf;\n if (!variants || variants.length === 0) return;\n\n const compositionType = schema.oneOf ? \"oneOf\" : \"anyOf\";\n\n // Detect discriminator: a property that has const/enum in every variant\n const discriminator = findDiscriminator(variants);\n\n if (discriminator) {\n convertWithDiscriminator(\n discriminator,\n variants,\n fields,\n rootSchema,\n idPrefix,\n compositionType\n );\n } else {\n convertWithSyntheticDiscriminator(\n variants,\n fields,\n rootSchema,\n idPrefix,\n compositionType\n );\n }\n}\n\n/**\n * Convert a JSON Schema condition shape to our ICondition type.\n * Used for if/then/else, dependencies, and composition detection.\n */\nexport function schemaToCondition(\n schema: IJsonSchemaNode\n): ICondition | null {\n if (!schema) return null;\n\n // { not: {...} }\n if (schema.not) {\n const inner = schemaToCondition(schema.not as IJsonSchemaNode);\n if (!inner) return null;\n return { operator: \"not\", conditions: [inner] };\n }\n\n // { allOf: [...] }\n if (schema.allOf && schema.allOf.length > 0) {\n const conditions = schema.allOf\n .map((s) => schemaToCondition(s))\n .filter((c): c is ICondition => c !== null);\n if (conditions.length === 0) return null;\n if (conditions.length === 1) return conditions[0];\n return { operator: \"and\", conditions };\n }\n\n // { anyOf: [...] }\n if (schema.anyOf && schema.anyOf.length > 0) {\n const conditions = schema.anyOf\n .map((s) => schemaToCondition(s))\n .filter((c): c is ICondition => c !== null);\n if (conditions.length === 0) return null;\n if (conditions.length === 1) return conditions[0];\n return { operator: \"or\", conditions };\n }\n\n // { required: [\"x\"] } without properties → isNotEmpty\n if (schema.required && !schema.properties) {\n const conditions: ICondition[] = schema.required.map((field) => ({\n field,\n operator: \"isNotEmpty\" as const,\n }));\n if (conditions.length === 1) return conditions[0];\n return { operator: \"and\", conditions };\n }\n\n // { properties: { x: { const: v } } }\n if (schema.properties) {\n const conditions: ICondition[] = [];\n\n for (const [field, propSchema] of Object.entries(schema.properties)) {\n const condition = propertySchemaToCondition(field, propSchema);\n if (condition) conditions.push(condition);\n }\n\n // Also handle required alongside properties\n if (schema.required) {\n for (const field of schema.required) {\n if (!schema.properties[field]) {\n conditions.push({ field, operator: \"isNotEmpty\" });\n }\n }\n }\n\n if (conditions.length === 0) return null;\n if (conditions.length === 1) return conditions[0];\n return { operator: \"and\", conditions };\n }\n\n return null;\n}\n\n// --- Internal helpers ---\n\nfunction propertySchemaToCondition(\n field: string,\n schema: IJsonSchemaNode\n): ICondition | null {\n if (schema.const !== undefined) {\n return { field, operator: \"equals\", value: schema.const };\n }\n if (schema.enum && schema.enum.length > 0) {\n return { field, operator: \"in\", value: schema.enum };\n }\n if (schema.minimum !== undefined) {\n return { field, operator: \"greaterThanOrEqual\", value: schema.minimum };\n }\n if (schema.maximum !== undefined) {\n return { field, operator: \"lessThanOrEqual\", value: schema.maximum };\n }\n if (schema.minLength !== undefined && schema.minLength > 0) {\n return { field, operator: \"isNotEmpty\" };\n }\n if (schema.pattern) {\n return { field, operator: \"matches\", value: schema.pattern };\n }\n\n return null;\n}\n\nfunction convertSchemaDependency(\n sourceField: string,\n depSchema: IJsonSchemaNode,\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string\n): void {\n const depRequired = new Set(depSchema.required ?? []);\n\n if (depSchema.properties) {\n for (const [depFieldName, depFieldSchema] of Object.entries(\n depSchema.properties\n )) {\n // Create field if it doesn't exist\n if (!fields[depFieldName]) {\n fields[depFieldName] = schemaNodeToFieldConfig(\n depFieldName,\n depFieldSchema,\n depRequired.has(depFieldName)\n );\n fields[depFieldName].hidden = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_schemadep_${sourceField}_${depFieldName}`,\n when: { field: sourceField, operator: \"isNotEmpty\" },\n then: {\n hidden: false,\n ...(depRequired.has(depFieldName) ? { required: true } : {}),\n },\n else: {\n hidden: true,\n },\n };\n\n fields[depFieldName].rules = [\n ...(fields[depFieldName].rules ?? []),\n rule,\n ];\n }\n }\n\n // Handle oneOf inside schema dependencies (common RJSF pattern)\n if (depSchema.oneOf) {\n convertComposition(\n depSchema,\n fields,\n rootSchema,\n `${idPrefix}_schemadep_${sourceField}`\n );\n }\n}\n\nfunction findDiscriminator(\n variants: IJsonSchemaNode[]\n): string | null {\n if (variants.length < 2) return null;\n\n // Find properties that appear in all variants with const or single-value enum\n const firstVariant = variants[0];\n if (!firstVariant.properties) return null;\n\n for (const propName of Object.keys(firstVariant.properties)) {\n const prop = firstVariant.properties[propName];\n if (!hasConstOrSingleEnum(prop)) continue;\n\n // Check all other variants have this property with const/enum\n const allHave = variants.every(\n (v) => v.properties?.[propName] && hasConstOrSingleEnum(v.properties[propName])\n );\n\n if (allHave) {\n // Verify all values are distinct\n const values = variants.map((v) =>\n getConstValue(v.properties![propName])\n );\n const unique = new Set(values.map(String));\n if (unique.size === variants.length) return propName;\n }\n }\n\n return null;\n}\n\nfunction hasConstOrSingleEnum(node: IJsonSchemaNode): boolean {\n if (node.const !== undefined) return true;\n if (node.enum && node.enum.length === 1) return true;\n return false;\n}\n\nfunction getConstValue(node: IJsonSchemaNode): unknown {\n if (node.const !== undefined) return node.const;\n if (node.enum && node.enum.length === 1) return node.enum[0];\n return undefined;\n}\n\nfunction convertWithDiscriminator(\n discriminatorField: string,\n variants: IJsonSchemaNode[],\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string,\n compositionType: string\n): void {\n // Ensure discriminator field exists as a dropdown\n const allValues = variants.map((v) =>\n getConstValue(v.properties![discriminatorField])\n );\n if (!fields[discriminatorField]) {\n fields[discriminatorField] = {\n type: \"Dropdown\",\n label: discriminatorField,\n options: allValues.map((v) => ({\n value: String(v),\n label: String(v),\n })),\n };\n }\n\n // For each variant, create visibility rules for variant-specific fields\n for (const variant of variants) {\n if (!variant.properties) continue;\n const variantValue = getConstValue(variant.properties[discriminatorField]);\n const variantRequired = new Set(variant.required ?? []);\n\n for (const [fieldName, fieldSchema] of Object.entries(variant.properties)) {\n if (fieldName === discriminatorField) continue;\n\n if (!fields[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n fieldSchema,\n variantRequired.has(fieldName)\n );\n fields[fieldName].hidden = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_${compositionType}_${discriminatorField}_${fieldName}`,\n when: {\n field: discriminatorField,\n operator: \"equals\",\n value: variantValue,\n },\n then: {\n hidden: false,\n ...(variantRequired.has(fieldName) ? { required: true } : {}),\n },\n else: { hidden: true },\n };\n\n fields[fieldName].rules = [\n ...(fields[fieldName].rules ?? []),\n rule,\n ];\n }\n }\n}\n\nfunction convertWithSyntheticDiscriminator(\n variants: IJsonSchemaNode[],\n fields: Record<string, IFieldConfig>,\n rootSchema: IJsonSchemaNode,\n idPrefix: string,\n compositionType: string\n): void {\n // Create a synthetic _variant dropdown\n const options = variants.map((_, i) => ({\n value: String(i),\n label: `Option ${i + 1}`,\n }));\n\n fields[\"_variant\"] = {\n type: \"Dropdown\",\n label: \"Variant\",\n options,\n };\n\n // For each variant, create visibility rules\n for (let i = 0; i < variants.length; i++) {\n const variant = variants[i];\n if (!variant.properties) continue;\n const variantRequired = new Set(variant.required ?? []);\n\n for (const [fieldName, fieldSchema] of Object.entries(variant.properties)) {\n if (!fields[fieldName]) {\n fields[fieldName] = schemaNodeToFieldConfig(\n fieldName,\n fieldSchema,\n variantRequired.has(fieldName)\n );\n fields[fieldName].hidden = true;\n }\n\n const rule: IRule = {\n id: `${idPrefix}_${compositionType}_variant${i}_${fieldName}`,\n when: {\n field: \"_variant\",\n operator: \"equals\",\n value: String(i),\n },\n then: {\n hidden: false,\n ...(variantRequired.has(fieldName) ? { required: true } : {}),\n },\n else: { hidden: true },\n };\n\n fields[fieldName].rules = [\n ...(fields[fieldName].rules ?? []),\n rule,\n ];\n }\n }\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { IFormConfig } from \"../../types/IFormConfig\";\nimport { IJsonSchemaNode, IRjsfUiSchema, IRjsfConvertOptions } from \"./types\";\nimport { resolveRefs } from \"./refResolver\";\nimport {\n schemaNodeToFieldConfig,\n applyUiSchema,\n extractValidationRules,\n} from \"./fieldMapper\";\nimport {\n convertDependencies,\n convertIfThenElse,\n convertComposition,\n} from \"./ruleConverter\";\n\n/**\n * Convert an RJSF schema + uiSchema + formData into an IFormConfig (v2).\n *\n * This is the main entry point for RJSF migration. It:\n * 1. Resolves all $ref pointers\n * 2. Merges allOf if present\n * 3. Maps properties to IFieldConfig\n * 4. Applies uiSchema rendering hints\n * 5. Merges formData as defaultValues\n * 6. Converts dependencies → IRule[]\n * 7. Converts if/then/else → IRule[]\n * 8. Converts oneOf/anyOf → IRule[]\n * 9. Determines fieldOrder from uiSchema or property order\n */\nexport function fromRjsfSchema(\n schema: IJsonSchemaNode,\n uiSchema?: IRjsfUiSchema,\n formData?: Record<string, unknown>,\n options?: IRjsfConvertOptions\n): IFormConfig {\n const strategy = options?.nestedObjectStrategy ?? \"flatten\";\n const idPrefix = options?.ruleIdPrefix ?? \"rjsf\";\n\n // Step 1: Resolve $ref pointers\n const resolved = resolveRefs(schema);\n\n // Step 2: Merge allOf if present\n const merged = mergeAllOf(resolved);\n\n // Step 3: Map properties to field configs\n const fields: Record<string, IFieldConfig> = {};\n const requiredSet = new Set(merged.required ?? []);\n\n if (merged.properties) {\n mapProperties(\n merged.properties,\n requiredSet,\n fields,\n \"\",\n strategy,\n uiSchema,\n formData\n );\n }\n\n // Step 4-5 handled in mapProperties\n\n // Step 6: Convert dependencies\n if (merged.dependencies) {\n convertDependencies(merged.dependencies, fields, merged, idPrefix);\n }\n\n // Step 7: Convert if/then/else\n if (merged.if) {\n convertIfThenElse(merged, fields, merged, idPrefix);\n }\n\n // Step 8: Convert oneOf/anyOf\n if (merged.oneOf || merged.anyOf) {\n convertComposition(merged, fields, merged, idPrefix);\n }\n\n // Step 9: Determine field order\n const fieldOrder = resolveFieldOrder(fields, uiSchema);\n\n return {\n version: 2,\n fields,\n fieldOrder,\n };\n}\n\n// --- Internal helpers ---\n\nfunction mapProperties(\n properties: Record<string, IJsonSchemaNode>,\n requiredSet: Set<string>,\n fields: Record<string, IFieldConfig>,\n prefix: string,\n strategy: \"flatten\" | \"fieldArray\",\n uiSchema?: IRjsfUiSchema,\n formData?: Record<string, unknown>\n): void {\n for (const [propName, propSchema] of Object.entries(properties)) {\n const fullName = prefix ? `${prefix}.${propName}` : propName;\n const isRequired = requiredSet.has(propName);\n\n if (isObjectType(propSchema) && propSchema.properties) {\n if (strategy === \"flatten\") {\n // Flatten: recurse with dot-prefix\n const nestedRequired = new Set(propSchema.required ?? []);\n const nestedUiSchema = uiSchema?.[propName] as IRjsfUiSchema | undefined;\n const nestedFormData = formData?.[propName] as\n | Record<string, unknown>\n | undefined;\n mapProperties(\n propSchema.properties,\n nestedRequired,\n fields,\n fullName,\n strategy,\n nestedUiSchema,\n nestedFormData\n );\n continue;\n } else {\n // FieldArray strategy for nested objects\n const items: Record<string, IFieldConfig> = {};\n const nestedRequired = new Set(propSchema.required ?? []);\n for (const [itemProp, itemSchema] of Object.entries(\n propSchema.properties\n )) {\n items[itemProp] = schemaNodeToFieldConfig(\n itemProp,\n itemSchema,\n nestedRequired.has(itemProp)\n );\n }\n fields[fullName] = {\n type: \"FieldArray\",\n label: propSchema.title ?? propName,\n items,\n };\n continue;\n }\n }\n\n // Array with object items → FieldArray\n if (isArrayWithObjectItems(propSchema)) {\n const itemSchema = propSchema.items as IJsonSchemaNode;\n const items: Record<string, IFieldConfig> = {};\n const itemRequired = new Set(itemSchema.required ?? []);\n if (itemSchema.properties) {\n for (const [itemProp, itemPropSchema] of Object.entries(\n itemSchema.properties\n )) {\n items[itemProp] = schemaNodeToFieldConfig(\n itemProp,\n itemPropSchema,\n itemRequired.has(itemProp)\n );\n }\n }\n const config = schemaNodeToFieldConfig(fullName, propSchema, isRequired);\n config.type = \"FieldArray\";\n config.items = items;\n if (propSchema.minItems !== undefined) config.minItems = propSchema.minItems;\n if (propSchema.maxItems !== undefined) config.maxItems = propSchema.maxItems;\n fields[fullName] = config;\n\n // Apply uiSchema\n const fieldUiSchema = getFieldUiSchema(uiSchema, propName, prefix);\n if (fieldUiSchema) {\n fields[fullName] = applyUiSchema(fields[fullName], fieldUiSchema);\n }\n\n // Apply formData\n const dataValue = getFormDataValue(formData, propName);\n if (dataValue !== undefined && fields[fullName].defaultValue === undefined) {\n fields[fullName].defaultValue = dataValue;\n }\n\n continue;\n }\n\n // Standard field\n const config = schemaNodeToFieldConfig(fullName, propSchema, isRequired);\n fields[fullName] = config;\n\n // Apply uiSchema\n const fieldUiSchema = getFieldUiSchema(uiSchema, propName, prefix);\n if (fieldUiSchema) {\n fields[fullName] = applyUiSchema(fields[fullName], fieldUiSchema);\n }\n\n // Apply formData as defaultValue\n const dataValue = getFormDataValue(formData, propName);\n if (dataValue !== undefined && fields[fullName].defaultValue === undefined) {\n fields[fullName].defaultValue = dataValue;\n }\n }\n}\n\nfunction mergeAllOf(schema: IJsonSchemaNode): IJsonSchemaNode {\n if (!schema.allOf || schema.allOf.length === 0) return schema;\n\n const { allOf, ...base } = schema;\n let result = { ...base };\n\n for (const subSchema of allOf) {\n result = mergeSchemas(result, subSchema);\n }\n\n return result;\n}\n\nfunction mergeSchemas(\n a: IJsonSchemaNode,\n b: IJsonSchemaNode\n): IJsonSchemaNode {\n const result = { ...a };\n\n if (b.properties) {\n result.properties = { ...(result.properties ?? {}), ...b.properties };\n }\n if (b.required) {\n const existing = new Set(result.required ?? []);\n for (const r of b.required) existing.add(r);\n result.required = [...existing];\n }\n if (b.if) result.if = b.if;\n if (b.then) result.then = b.then;\n if (b.else) result.else = b.else;\n if (b.dependencies) {\n result.dependencies = {\n ...(result.dependencies ?? {}),\n ...b.dependencies,\n };\n }\n\n return result;\n}\n\nfunction isObjectType(node: IJsonSchemaNode): boolean {\n if (node.type === \"object\") return true;\n if (Array.isArray(node.type) && node.type.includes(\"object\")) return true;\n return false;\n}\n\nfunction isArrayWithObjectItems(node: IJsonSchemaNode): boolean {\n const type = Array.isArray(node.type) ? node.type[0] : node.type;\n if (type !== \"array\") return false;\n const items = node.items;\n if (!items || Array.isArray(items)) return false;\n return items.type === \"object\" && !!items.properties;\n}\n\nfunction getFieldUiSchema(\n uiSchema: IRjsfUiSchema | undefined,\n fieldName: string,\n prefix: string\n): IRjsfUiSchema | undefined {\n if (!uiSchema) return undefined;\n // Navigate into nested uiSchema for prefixed fields\n if (prefix) {\n const parts = prefix.split(\".\");\n let current: IRjsfUiSchema | undefined = uiSchema;\n for (const part of parts) {\n current = current?.[part] as IRjsfUiSchema | undefined;\n }\n return current?.[fieldName] as IRjsfUiSchema | undefined;\n }\n return uiSchema[fieldName] as IRjsfUiSchema | undefined;\n}\n\nfunction getFormDataValue(\n formData: Record<string, unknown> | undefined,\n fieldName: string\n): unknown {\n if (!formData) return undefined;\n return formData[fieldName];\n}\n\nfunction resolveFieldOrder(\n fields: Record<string, IFieldConfig>,\n uiSchema?: IRjsfUiSchema\n): string[] {\n const uiOrder = uiSchema?.[\"ui:order\"];\n if (!Array.isArray(uiOrder)) return Object.keys(fields);\n\n const allFields = new Set(Object.keys(fields));\n const order: string[] = [];\n const wildcardIdx = uiOrder.indexOf(\"*\");\n\n for (const item of uiOrder) {\n if (item === \"*\") continue;\n if (allFields.has(item)) {\n order.push(item);\n allFields.delete(item);\n }\n }\n\n if (wildcardIdx !== -1) {\n // Insert remaining fields where * was\n const remaining = [...allFields];\n order.splice(wildcardIdx, 0, ...remaining);\n } else {\n // Append remaining at end\n order.push(...allFields);\n }\n\n return order;\n}\n","import { IFieldConfig } from \"../../types/IFieldConfig\";\nimport { IFormConfig } from \"../../types/IFormConfig\";\nimport { IJsonSchemaNode, IRjsfUiSchema } from \"./types\";\n\n/**\n * Reverse-convert an IFormConfig to JSON Schema + uiSchema.\n *\n * Best-effort: structural fidelity only. Rules, computed values,\n * and other dynamic features do NOT map back to JSON Schema.\n */\nexport function toRjsfSchema(config: IFormConfig): {\n schema: IJsonSchemaNode;\n uiSchema: IRjsfUiSchema;\n} {\n const properties: Record<string, IJsonSchemaNode> = {};\n const required: string[] = [];\n const uiSchema: IRjsfUiSchema = {};\n\n for (const [fieldName, fieldConfig] of Object.entries(config.fields)) {\n // Handle dot-notation (flattened nested objects)\n if (fieldName.includes(\".\")) {\n setNestedProperty(properties, required, uiSchema, fieldName, fieldConfig);\n continue;\n }\n\n properties[fieldName] = fieldConfigToSchemaNode(fieldConfig);\n if (fieldConfig.required) required.push(fieldName);\n\n const fieldUi = fieldConfigToUiSchema(fieldConfig);\n if (Object.keys(fieldUi).length > 0) {\n uiSchema[fieldName] = fieldUi;\n }\n }\n\n // Set field order in uiSchema\n if (config.fieldOrder && config.fieldOrder.length > 0) {\n uiSchema[\"ui:order\"] = config.fieldOrder;\n }\n\n const schema: IJsonSchemaNode = {\n type: \"object\",\n properties,\n };\n if (required.length > 0) schema.required = required;\n\n return { schema, uiSchema };\n}\n\n// --- Internal helpers ---\n\nconst REVERSE_TYPE_MAP: Record<string, string> = {\n Textbox: \"string\",\n Textarea: \"string\",\n Number: \"number\",\n Slider: \"number\",\n Toggle: \"boolean\",\n DateControl: \"string\",\n Dropdown: \"string\",\n Multiselect: \"array\",\n DocumentLinks: \"string\",\n DynamicFragment: \"string\",\n};\n\nconst REVERSE_WIDGET_MAP: Record<string, string> = {\n Textarea: \"textarea\",\n Slider: \"range\",\n Toggle: \"checkbox\",\n DocumentLinks: \"file\",\n};\n\nfunction fieldConfigToSchemaNode(config: IFieldConfig): IJsonSchemaNode {\n const node: IJsonSchemaNode = {};\n\n // Type\n const jsonType = REVERSE_TYPE_MAP[config.type] ?? \"string\";\n node.type = jsonType;\n\n if (config.label) node.title = config.label;\n if (config.description) node.description = config.description;\n if (config.defaultValue !== undefined) node.default = config.defaultValue;\n\n // Options → enum\n if (config.options && config.options.length > 0) {\n node.enum = config.options.map((o) => o.value);\n const labels = config.options.map((o) => o.label);\n const valuesAsStrings = config.options.map((o) => String(o.value));\n // Only set enumNames if labels differ from values\n if (labels.some((l, i) => l !== valuesAsStrings[i])) {\n node.enumNames = labels;\n }\n }\n\n // Validation rules → schema constraints\n if (config.validate) {\n for (const rule of config.validate) {\n applyValidationToSchema(node, rule.name, rule.params);\n }\n }\n\n // FieldArray → array with object items\n if (config.type === \"FieldArray\" && config.items) {\n node.type = \"array\";\n const itemProperties: Record<string, IJsonSchemaNode> = {};\n const itemRequired: string[] = [];\n for (const [itemName, itemConfig] of Object.entries(config.items)) {\n itemProperties[itemName] = fieldConfigToSchemaNode(itemConfig);\n if (itemConfig.required) itemRequired.push(itemName);\n }\n node.items = {\n type: \"object\",\n properties: itemProperties,\n ...(itemRequired.length > 0 ? { required: itemRequired } : {}),\n };\n if (config.minItems !== undefined) node.minItems = config.minItems;\n if (config.maxItems !== undefined) node.maxItems = config.maxItems;\n }\n\n // Multiselect → array with enum items\n if (config.type === \"Multiselect\" && config.options) {\n node.type = \"array\";\n node.items = {\n type: \"string\",\n enum: config.options.map((o) => o.value),\n };\n // Move enum off the root node\n delete node.enum;\n delete node.enumNames;\n }\n\n // Format\n if (config.type === \"DateControl\") {\n node.format = \"date\";\n }\n if (config.type === \"DocumentLinks\") {\n node.format = \"data-url\";\n }\n\n // Password / color via config\n if (config.config?.type === \"password\" || config.config?.type === \"color\") {\n // No schema equivalent, handled in uiSchema\n }\n\n return node;\n}\n\nfunction fieldConfigToUiSchema(config: IFieldConfig): IRjsfUiSchema {\n const ui: IRjsfUiSchema = {};\n\n // Widget mapping\n const widget = REVERSE_WIDGET_MAP[config.type];\n if (widget) ui[\"ui:widget\"] = widget;\n\n // Config-based widget overrides\n if (config.config?.type === \"password\") ui[\"ui:widget\"] = \"password\";\n if (config.config?.type === \"color\") ui[\"ui:widget\"] = \"color\";\n if (config.config?.display === \"radio\") ui[\"ui:widget\"] = \"radio\";\n if (config.config?.display === \"checkboxes\") ui[\"ui:widget\"] = \"checkboxes\";\n\n if (config.placeholder) ui[\"ui:placeholder\"] = config.placeholder;\n if (config.helpText) ui[\"ui:help\"] = config.helpText;\n if (config.hidden) ui[\"ui:hidden\"] = true;\n if (config.readOnly) ui[\"ui:readonly\"] = true;\n if (config.disabled) ui[\"ui:disabled\"] = true;\n if (config.config?.autofocus) ui[\"ui:autofocus\"] = true;\n if (config.config?.className) ui[\"ui:classNames\"] = config.config.className as string;\n if (config.config?.hideLabel) ui[\"ui:label\"] = false;\n\n // Disabled options\n if (config.options) {\n const disabled = config.options\n .filter((o) => o.disabled)\n .map((o) => o.value);\n if (disabled.length > 0) ui[\"ui:enumDisabled\"] = disabled;\n }\n\n return ui;\n}\n\nfunction applyValidationToSchema(\n node: IJsonSchemaNode,\n name: string,\n params?: Record<string, unknown>\n): void {\n switch (name) {\n case \"minLength\":\n node.minLength = Number(params?.min ?? 0);\n break;\n case \"maxLength\":\n node.maxLength = Number(params?.max ?? 0);\n break;\n case \"pattern\":\n node.pattern = String(params?.pattern ?? \"\");\n break;\n case \"numericRange\":\n if (params?.min !== undefined && params.min !== -Infinity)\n node.minimum = Number(params.min);\n if (params?.max !== undefined && params.max !== Infinity)\n node.maximum = Number(params.max);\n break;\n case \"exclusiveNumericRange\":\n if (params?.exclusiveMin !== undefined)\n node.exclusiveMinimum = Number(params.exclusiveMin);\n if (params?.exclusiveMax !== undefined)\n node.exclusiveMaximum = Number(params.exclusiveMax);\n break;\n case \"multipleOf\":\n node.multipleOf = Number(params?.factor ?? 1);\n break;\n case \"email\":\n node.format = \"email\";\n break;\n case \"url\":\n node.format = \"uri\";\n break;\n case \"uniqueInArray\":\n node.uniqueItems = true;\n break;\n }\n}\n\nfunction setNestedProperty(\n properties: Record<string, IJsonSchemaNode>,\n required: string[],\n uiSchema: IRjsfUiSchema,\n dotPath: string,\n config: IFieldConfig\n): void {\n const parts = dotPath.split(\".\");\n let currentProps = properties;\n let currentUi = uiSchema;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!currentProps[part]) {\n currentProps[part] = {\n type: \"object\",\n properties: {},\n };\n }\n if (!currentProps[part].properties) {\n currentProps[part].properties = {};\n }\n currentProps = currentProps[part].properties!;\n\n if (!currentUi[part]) {\n currentUi[part] = {};\n }\n currentUi = currentUi[part] as IRjsfUiSchema;\n }\n\n const leafName = parts[parts.length - 1];\n currentProps[leafName] = fieldConfigToSchemaNode(config);\n if (config.required) {\n // Add to parent's required array\n const parentPath = parts.slice(0, -1);\n let parentNode: IJsonSchemaNode | undefined;\n let props = properties;\n for (const p of parentPath) {\n parentNode = props[p];\n props = parentNode?.properties ?? {};\n }\n if (parentNode) {\n parentNode.required = [...(parentNode.required ?? []), leafName];\n }\n }\n\n const fieldUi = fieldConfigToUiSchema(config);\n if (Object.keys(fieldUi).length > 0) {\n currentUi[leafName] = fieldUi;\n }\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IOption } from \"../types/IOption\";\n\n/**\n * Converts a Zod object schema to Record<string, IFieldConfig>.\n * Does NOT require zod as a dependency — inspects the schema shape at runtime.\n */\nexport function zodSchemaToFieldConfig(zodSchema: unknown): Record<string, IFieldConfig> {\n const configs: Record<string, IFieldConfig> = {};\n const shape = getZodShape(zodSchema);\n if (!shape) return configs;\n\n for (const [fieldName, fieldSchema] of Object.entries(shape)) {\n configs[fieldName] = zodFieldToConfig(fieldName, fieldSchema as ZodDef);\n }\n\n return configs;\n}\n\ninterface ZodDef {\n _def?: {\n typeName?: string;\n innerType?: ZodDef;\n checks?: Array<{ kind: string; value?: unknown; message?: string }>;\n values?: string[];\n options?: ZodDef[];\n type?: ZodDef;\n };\n}\n\nfunction getZodShape(schema: unknown): Record<string, unknown> | null {\n const s = schema as ZodDef;\n if (s?._def && typeof s._def === \"object\") {\n const def = s._def as Record<string, unknown>;\n if (typeof def.shape === \"function\") return (def.shape as () => Record<string, unknown>)();\n if (typeof def.shape === \"object\" && def.shape !== null) return def.shape as Record<string, unknown>;\n }\n return null;\n}\n\nfunction zodFieldToConfig(fieldName: string, field: ZodDef): IFieldConfig {\n const { typeName, isOptional } = unwrapZodType(field);\n const checks = getZodChecks(field);\n\n const config: IFieldConfig = {\n type: \"Textbox\",\n label: formatLabel(fieldName),\n required: !isOptional,\n };\n\n switch (typeName) {\n case \"ZodString\":\n config.type = \"Textbox\";\n if (checks.some(c => c.kind === \"email\")) {\n config.validate = [...(config.validate ?? []), { name: \"email\" }];\n }\n if (checks.some(c => c.kind === \"url\")) {\n config.validate = [...(config.validate ?? []), { name: \"url\" }];\n }\n break;\n case \"ZodNumber\":\n config.type = \"Number\";\n break;\n case \"ZodBoolean\":\n config.type = \"Toggle\";\n break;\n case \"ZodEnum\":\n case \"ZodNativeEnum\": {\n config.type = \"Dropdown\";\n const values = getZodEnumValues(field);\n if (values) {\n config.options = values.map(v => ({ value: String(v), label: String(v) }));\n }\n break;\n }\n case \"ZodDate\":\n config.type = \"DateControl\";\n break;\n case \"ZodArray\":\n config.type = \"Multiselect\";\n break;\n default:\n config.type = \"Textbox\";\n }\n\n return config;\n}\n\nfunction unwrapZodType(field: ZodDef): { typeName: string; isOptional: boolean } {\n let current = field;\n let isOptional = false;\n while (current?._def) {\n const tn = current._def.typeName;\n if (tn === \"ZodOptional\" || tn === \"ZodNullable\") {\n isOptional = true;\n current = current._def.innerType as ZodDef;\n } else if (tn === \"ZodDefault\") {\n current = current._def.innerType as ZodDef;\n } else {\n break;\n }\n }\n return { typeName: current?._def?.typeName ?? \"ZodString\", isOptional };\n}\n\nfunction getZodChecks(field: ZodDef): Array<{ kind: string; value?: unknown }> {\n let current = field;\n while (current?._def) {\n if (current._def.checks) return current._def.checks;\n if (current._def.innerType) { current = current._def.innerType as ZodDef; } else { break; }\n }\n return [];\n}\n\nfunction getZodEnumValues(field: ZodDef): string[] | null {\n let current = field;\n while (current?._def) {\n if (current._def.values) return current._def.values;\n if (current._def.innerType) { current = current._def.innerType as ZodDef; } else { break; }\n }\n return null;\n}\n\nfunction formatLabel(fieldName: string): string {\n return fieldName.replace(/([A-Z])/g, \" $1\").replace(/^./, s => s.toUpperCase()).trim();\n}\n","import React from \"react\";\nimport { Dictionary } from \"../utils\";\n\ntype LazyFieldImport = () => Promise<{ default: React.ComponentType<any> }>;\n\n/**\n * Creates a field registry where components are loaded on-demand via React.lazy().\n * Fields are only loaded when first rendered, reducing initial bundle size.\n *\n * @example\n * const registry = createLazyFieldRegistry({\n * Textbox: () => import(\"./fields/Textbox\"),\n * Dropdown: () => import(\"./fields/Dropdown\"),\n * });\n */\nexport function createLazyFieldRegistry(\n imports: Record<string, LazyFieldImport>\n): Dictionary<React.JSX.Element> {\n const registry: Dictionary<React.JSX.Element> = {};\n\n for (const [key, importFn] of Object.entries(imports)) {\n const LazyComponent = React.lazy(importFn);\n registry[key] = React.createElement(\n React.Suspense,\n { fallback: React.createElement(\"span\", { className: \"field-loading\" }, \"Loading...\") },\n React.createElement(LazyComponent)\n );\n }\n\n return registry;\n}\n","import { useEffect, useCallback, useRef, useState } from \"react\";\nimport { IEntityData } from \"../utils\";\nimport { serializeFormState, deserializeFormState } from \"../utils/formStateSerialization\";\n\nexport interface IDraftPersistenceOptions {\n /** Unique form identifier for storage key */\n formId: string;\n /** Current form data to persist */\n data: IEntityData;\n /** Auto-save interval in ms (default 30000) */\n saveIntervalMs?: number;\n /** Whether persistence is enabled (default true) */\n enabled?: boolean;\n /** Custom storage key prefix (default \"draft_\") */\n storageKeyPrefix?: string;\n}\n\nexport interface IDraftState {\n data: IEntityData;\n timestamp: number;\n}\n\nexport interface IUseDraftPersistenceResult {\n /** Recover a saved draft if one exists */\n recoverDraft: () => IDraftState | null;\n /** Clear the saved draft */\n clearDraft: () => void;\n /** Whether a draft exists */\n hasDraft: boolean;\n /** Manually save current state as draft */\n saveDraft: () => void;\n}\n\nfunction getStorageKey(formId: string, prefix: string): string {\n return `${prefix}${formId}`;\n}\n\nfunction getStorage(): Storage | undefined {\n try {\n return typeof localStorage !== \"undefined\" ? localStorage : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Hook that persists form draft state to localStorage on a configurable interval.\n *\n * Handles localStorage errors gracefully (e.g. private browsing, quota exceeded).\n */\nexport function useDraftPersistence(options: IDraftPersistenceOptions): IUseDraftPersistenceResult {\n const {\n formId,\n data,\n saveIntervalMs = 30000,\n enabled = true,\n storageKeyPrefix = \"draft_\",\n } = options;\n\n const [hasDraft, setHasDraft] = useState<boolean>(false);\n const dataRef = useRef<IEntityData>(data);\n const intervalRef = useRef<ReturnType<typeof setInterval> | undefined>(undefined);\n\n // Keep dataRef up to date with the latest data\n useEffect(() => {\n dataRef.current = data;\n }, [data]);\n\n const storageKey = getStorageKey(formId, storageKeyPrefix);\n\n const saveDraft = useCallback(() => {\n try {\n const storage = getStorage();\n if (!storage) return;\n const draftState: IDraftState = {\n data: dataRef.current,\n timestamp: Date.now(),\n };\n storage.setItem(storageKey, serializeFormState(draftState as unknown as IEntityData));\n setHasDraft(true);\n } catch {\n // localStorage may throw in private browsing or when quota is exceeded\n }\n }, [storageKey]);\n\n const recoverDraft = useCallback((): IDraftState | null => {\n try {\n const storage = getStorage();\n if (!storage) return null;\n const stored = storage.getItem(storageKey);\n if (!stored) return null;\n const parsed = deserializeFormState(stored) as unknown as IDraftState;\n return parsed;\n } catch {\n return null;\n }\n }, [storageKey]);\n\n const clearDraft = useCallback(() => {\n try {\n const storage = getStorage();\n if (!storage) return;\n storage.removeItem(storageKey);\n setHasDraft(false);\n } catch {\n // localStorage may throw in private browsing\n }\n }, [storageKey]);\n\n // On mount, check if a draft exists\n useEffect(() => {\n if (!enabled) return;\n try {\n const storage = getStorage();\n if (!storage) { setHasDraft(false); return; }\n const stored = storage.getItem(storageKey);\n setHasDraft(stored !== null);\n } catch {\n setHasDraft(false);\n }\n }, [enabled, storageKey]);\n\n // Set up auto-save interval\n useEffect(() => {\n if (!enabled) return;\n\n intervalRef.current = setInterval(() => {\n saveDraft();\n }, saveIntervalMs);\n\n return () => {\n if (intervalRef.current !== undefined) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n };\n }, [enabled, saveIntervalMs, saveDraft]);\n\n return {\n recoverDraft,\n clearDraft,\n hasDraft,\n saveDraft,\n };\n}\n","import { IEntityData } from \"../utils\";\n\n/**\n * Recursively walk an object tree and replace Date instances with\n * a serializable marker: `{ __type: \"Date\", value: \"<ISO string>\" }`.\n *\n * JSON.stringify's replacer receives the *return value* of `.toJSON()`,\n * which means Date objects appear as plain strings to the replacer.\n * Pre-processing avoids this problem.\n */\nfunction markDates(value: unknown, visited = new WeakSet()): unknown {\n if (value instanceof Date) {\n return { __type: \"Date\", value: value.toISOString() };\n }\n if (Array.isArray(value)) {\n if (visited.has(value)) return value;\n visited.add(value);\n return value.map((item) => markDates(item, visited));\n }\n if (value !== null && typeof value === \"object\") {\n if (visited.has(value as object)) return value;\n visited.add(value as object);\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = markDates((value as Record<string, unknown>)[key], visited);\n }\n return result;\n }\n return value;\n}\n\n/**\n * Serialize form state to a JSON string, preserving Date objects\n * with a special `__type` marker so they can be round-tripped.\n */\nexport function serializeFormState(data: IEntityData): string {\n return JSON.stringify(markDates(data));\n}\n\n/**\n * Deserialize a JSON string back to form state, restoring Date objects\n * that were serialized with `serializeFormState`.\n */\nexport function deserializeFormState(json: string): IEntityData {\n return JSON.parse(json, (_key, value) => {\n if (value && typeof value === \"object\" && value.__type === \"Date\") {\n return new Date(value.value);\n }\n return value;\n });\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Hook that warns the user before navigating away when there are unsaved changes.\n *\n * @param shouldWarn - Whether the beforeunload warning should be active\n * @param message - Custom message (modern browsers ignore custom text but still show a prompt)\n * @param onAbandonment - Optional analytics callback fired when the user leaves with unsaved changes\n */\nexport function useBeforeUnload(\n shouldWarn: boolean,\n message?: string,\n onAbandonment?: () => void,\n): void {\n const onAbandonmentRef = useRef(onAbandonment);\n onAbandonmentRef.current = onAbandonment;\n\n useEffect(() => {\n if (!shouldWarn || typeof window === \"undefined\") return;\n\n const handler = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n onAbandonmentRef.current?.();\n // Modern browsers ignore custom messages but still show a prompt\n return (e.returnValue = message ?? \"You have unsaved changes.\");\n };\n\n window.addEventListener(\"beforeunload\", handler);\n return () => window.removeEventListener(\"beforeunload\", handler);\n }, [shouldWarn, message]);\n}\n","import { FieldError } from \"react-hook-form\";\n\n/**\n * Generates a consistent data-testid for field components.\n * Used by all adapter packages for test attribute generation.\n */\nexport const GetFieldDataTestId = (\n fieldName: string,\n programName?: string,\n entityType?: string,\n entityId?: string\n): string => {\n return `${programName}-${entityType}-${entityId}-${fieldName}`;\n};\n\n/**\n * Appends \"error\" to a className when a field has a validation error.\n * Used by Fluent and MUI adapters for error styling.\n */\nexport const FieldClassName = (className: string, error?: FieldError): string => {\n return error ? `${className} error` : className;\n};\n\n/**\n * Returns a field state string based on the current field props.\n * Used by headless adapter for data-state attributes.\n */\nexport function getFieldState(props: {\n error?: FieldError;\n required?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n}): string | undefined {\n if (props.error) return \"error\";\n if (props.required) return \"required\";\n if (props.readOnly) return \"readonly\";\n if (props.disabled) return \"disabled\";\n return undefined;\n}\n\n/**\n * Formats an ISO date string for display.\n * Returns short date (e.g. \"Jan 15, 2024\") or date+time (e.g. \"Jan 15, 2024, 02:30 PM\").\n */\nexport function formatDateTime(dateStr: string, options?: { hideTimestamp?: boolean }): string {\n if (!dateStr) return \"\";\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n if (options?.hideTimestamp) {\n return date.toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n }\n return date.toLocaleString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\" });\n}\n\n/**\n * Safely formats a value as a date+time string, falling back to String() on error.\n */\nexport function formatDateTimeValue(value: unknown): string {\n if (!value) return \"\";\n try {\n return formatDateTime(value as string);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Formats a date range value for read-only display.\n * Returns \"start – end\", or just the one that exists.\n */\nexport function formatDateRange(value: unknown): string {\n if (!value) return \"\";\n const v = value as { start: string; end: string };\n if (!v.start && !v.end) return \"\";\n if (v.start && v.end) return `${v.start} – ${v.end}`;\n return v.start || v.end;\n}\n\n/**\n * Extracts display names from File or File[] values.\n */\nexport function getFileNames(value: unknown): string {\n if (!value) return \"\";\n if (Array.isArray(value)) return (value as File[]).map(f => f.name).join(\", \");\n return (value as File).name ?? \"\";\n}\n\n/**\n * Strips all non-digit characters from a string.\n */\nexport function extractDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Formats a digit string as a phone number.\n * Supports US \"(XXX) XXX-XXXX\", international \"+X XXX XXX XXXX\", and raw digits.\n */\nexport function formatPhone(digits: string, format: \"us\" | \"international\" | \"raw\"): string {\n if (format === \"raw\") return digits;\n\n if (format === \"international\") {\n // +X XXX XXX XXXX\n const d = digits.slice(0, 12);\n if (d.length === 0) return \"\";\n if (d.length <= 1) return `+${d}`;\n if (d.length <= 4) return `+${d[0]} ${d.slice(1)}`;\n if (d.length <= 7) return `+${d[0]} ${d.slice(1, 4)} ${d.slice(4)}`;\n return `+${d[0]} ${d.slice(1, 4)} ${d.slice(4, 7)} ${d.slice(7)}`;\n }\n\n // US: (XXX) XXX-XXXX\n const d = digits.slice(0, 10);\n if (d.length === 0) return \"\";\n if (d.length <= 3) return `(${d}`;\n if (d.length <= 6) return `(${d.slice(0, 3)}) ${d.slice(3)}`;\n return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;\n}\n\n/**\n * Truncates text with \"...\" if it exceeds maxChars.\n */\nexport function ellipsifyText(value: string, maxChars: number): string {\n if (!value || value.length <= maxChars) return value ?? \"\";\n const cutoff = maxChars - 3;\n return `${value.substring(0, cutoff)}...`;\n}\n\n/** Default max file size in MB for FileUpload fields */\nexport const MAX_FILE_SIZE_MB_DEFAULT = 10;\n\n/** Shared strings for DocumentLinks component */\nexport const DocumentLinksStrings = {\n link: \"Link\",\n addLink: \"Add Link\",\n addAnotherLink: \"Add Another Link\",\n deleteLink: \"Delete Link\",\n confirmDeleteLink: \"Are you sure you want to delete\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n saveChanges: \"Save Changes\",\n save: \"Save\",\n};\n","import { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\n\nexport interface IRuleTraceEvent {\n timestamp: number;\n type: \"evaluate\" | \"apply\" | \"revert\" | \"init\";\n triggerField: string;\n triggerValue: unknown;\n affectedField: string;\n ruleId?: string;\n previousState?: Partial<IRuntimeFieldState>;\n newState?: Partial<IRuntimeFieldState>;\n}\n\nlet traceEnabled = false;\nlet traceLog: IRuleTraceEvent[] = [];\nlet traceCallback: ((event: IRuleTraceEvent) => void) | null = null;\n\nexport function enableRuleTracing(callback?: (event: IRuleTraceEvent) => void): void {\n traceEnabled = true;\n traceLog = [];\n traceCallback = callback ?? null;\n}\n\nexport function disableRuleTracing(): void {\n traceEnabled = false;\n traceCallback = null;\n}\n\nexport function traceRuleEvent(event: Omit<IRuleTraceEvent, \"timestamp\">): void {\n if (!traceEnabled) return;\n const fullEvent = { ...event, timestamp: Date.now() };\n traceLog.push(fullEvent);\n traceCallback?.(fullEvent);\n}\n\nexport function getRuleTraceLog(): IRuleTraceEvent[] {\n return [...traceLog];\n}\n\nexport function clearRuleTraceLog(): void {\n traceLog = [];\n}\n\nexport function isRuleTracingEnabled(): boolean {\n return traceEnabled;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiDO,SAAS,mBAAmB,WAAuD;AACxF,QAAM,KAAK,UAAU;AACrB,SAAO,OAAO,SAAS,OAAO,QAAQ,OAAO;AAC/C;AAGO,SAAS,iBAAiB,WAAqD;AACpF,SAAO,WAAW;AACpB;;;ACtDO,IAAK,wBAAL,kBAAKC,2BAAL;AACL,EAAAA,uBAAA,SAAM;AACN,EAAAA,uBAAA,YAAS;AACT,EAAAA,uBAAA,WAAQ;AAHE,SAAAA;AAAA,GAAA;;;AC2CL,SAAS,iBACd,QAC8B;AAC9B,SAAO;AACT;;;ACzCO,SAAS,QAAQ,OAAyB;AAC/C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,MAAM;AACvD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,WAAW;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AACpE,SAAO;AACT;AAEO,SAAS,OAAO,OAA2C;AAChE,SAAO,SAAS;AAClB;AAEO,SAAS,cAAc,OAA2C;AACvE,SAAO,SAAS,QAAQ,MAAM,KAAK,MAAM;AAC3C;AAEO,SAAS,SAAY,KAAW;AACrC,SAAO,gBAAgB,GAAG;AAC5B;AAEO,SAAS,4BAA4B,OAA2C;AACrF,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAO;AACT;AAGO,SAAS,oBAAoB,GAAuB,GAA+B;AACxF,QAAM,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,IAAI;AAChD,QAAM,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,IAAI;AAChD,SAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,IAAI;AAClD;AAGO,SAAS,aAAa,OAAiD;AAC5E,SAAO,EAAE,OAAO,OAAO,MAAM;AAC/B;;;AC7CO,IAAM,sBAAsB;AAG5B,IAAM,iBAAiB;AAAA,EAC5B,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AACd;AAGO,IAAM,gBAAgB;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,IAAI;AAAA,EACJ,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AACd;;;ACjDA,IAAM,iBAAqC;AAAA;AAAA,EAEzC,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,WAAW;AAAA;AAAA,EAGX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAGP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,cAAc;AAAA;AAAA,EAGd,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA;AAAA,EAGb,SAAS;AAAA,EACT,QAAQ;AAAA;AAAA,EAGR,wBAAwB;AAAA,EACxB,yBAAyB;AAAA;AAAA,EAGzB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,IAAI;AAAA;AAAA,EAGJ,cAAc;AAAA,EACd,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ,CAAC,SAAiB,UAAkB,QAAQ,OAAO,OAAO,KAAK;AAAA,EACvE,YAAY;AAAA,EACZ,aAAa,CAAC,OAAe,OAAe,UAAkB,GAAG,KAAK,SAAS,KAAK,OAAO,KAAK;AAAA;AAAA,EAGhG,eAAe,CAAC,UAAkB,uCAAuC,KAAK;AAAA;AAAA,EAG9E,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,uBAAuB,CAACC,WAAkB,mCAAmCA,MAAK;AAAA,EAClF,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,gBAAgB,CAAC,UAAkB,oBAAoB,KAAK;AAAA,EAC5D,oBAAoB,CAAC,QAAgB,oBAAoB,GAAG;AAAA,EAC5D,mBAAmB,CAAC,QAAgB,mBAAmB,GAAG;AAAA,EAC1D,eAAe;AAAA,EACf,eAAe,CAAC,KAAa,QAAgB,mBAAmB,GAAG,QAAQ,GAAG;AAAA,EAC9E,qBAAqB;AAAA;AAAA,EAGrB,cAAc;AAAA,EACd,aAAa;AAAA;AAAA,EAGb,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,uBAAuB;AACzB;AAEA,IAAI,gBAAoC,EAAE,GAAG,eAAe;AAMrD,SAAS,eAAe,SAA4C;AACzE,kBAAgB,EAAE,GAAG,eAAe,GAAG,QAAQ;AACjD;AAKO,SAAS,gBAAoD,KAA+B;AACjG,SAAO,cAAc,GAAG;AAC1B;AAKO,SAAS,cAAoB;AAClC,kBAAgB,EAAE,GAAG,eAAe;AACtC;AAKO,SAAS,mBAAuC;AACrD,SAAO,EAAE,GAAG,cAAc;AAC5B;;;AChHO,IAAM,cAAc;AAAA,EACzB,IAAI,kBAAkB;AAAE,WAAO,gBAAgB,iBAAiB;AAAA,EAAG;AAAA,EACnE,IAAI,cAAc;AAAE,WAAO,gBAAgB,aAAa;AAAA,EAAG;AAAA,EAC3D,IAAI,YAAY;AAAE,WAAO,gBAAgB,WAAW;AAAA,EAAG;AAAA,EACvD,IAAI,SAAS;AAAE,WAAO,gBAAgB,QAAQ;AAAA,EAAG;AAAA,EACjD,IAAI,UAAU;AAAE,WAAO,gBAAgB,SAAS;AAAA,EAAG;AAAA,EACnD,IAAI,SAAS;AAAE,WAAO,gBAAgB,QAAQ;AAAA,EAAG;AAAA,EACjD,IAAI,WAAW;AAAE,WAAO,gBAAgB,UAAU;AAAA,EAAG;AAAA,EACrD,IAAI,OAAO;AAAE,WAAO,gBAAgB,MAAM;AAAA,EAAG;AAAA,EAC7C,IAAI,SAAS;AAAE,WAAO,gBAAgB,QAAQ;AAAA,EAAG;AAAA,EACjD,IAAI,SAAS;AAAE,WAAO,gBAAgB,QAAQ;AAAA,EAAG;AAAA,EACjD,IAAI,SAAS;AAAE,WAAO,gBAAgB,QAAQ;AAAA,EAAG;AAAA,EACjD,IAAI,KAAK;AAAE,WAAO,gBAAgB,IAAI;AAAA,EAAG;AAAA,EACzC,IAAI,YAAY;AAAE,WAAO,gBAAgB,WAAW;AAAA,EAAG;AAAA,EACvD,IAAI,UAAU;AAAE,WAAO,gBAAgB,SAAS;AAAA,EAAG;AAAA,EACnD,IAAI,iBAAiB;AAAE,WAAO,gBAAgB,gBAAgB;AAAA,EAAG;AAAA,EACjE,IAAI,eAAe;AAAE,WAAO,gBAAgB,cAAc;AAAA,EAAG;AAAA,EAC7D,IAAI,MAAM;AAAE,WAAO,gBAAgB,KAAK;AAAA,EAAG;AAAA,EAC3C,IAAI,OAAO;AAAE,WAAO,gBAAgB,MAAM;AAAA,EAAG;AAAA,EAC7C,IAAI,cAAc;AAAE,WAAO,gBAAgB,aAAa;AAAA,EAAG;AAAA,EAC3D,IAAI,SAAS;AAAE,WAAO,gBAAgB,QAAQ;AAAA,EAAG;AAAA,EACjD,IAAI,UAAU;AAAE,WAAO,gBAAgB,SAAS;AAAA,EAAG;AAAA,EACnD,IAAI,QAAQ;AAAE,WAAO,gBAAgB,OAAO;AAAA,EAAG;AAAA,EAC/C,IAAI,UAAU;AAAE,WAAO,gBAAgB,SAAS;AAAA,EAAG;AAAA,EACnD,IAAI,iBAAiB;AAAE,WAAO,gBAAgB,gBAAgB;AAAA,EAAG;AAAA,EACjE,IAAI,eAAe;AAAE,WAAO,gBAAgB,cAAc;AAAA,EAAG;AAAA,EAC7D,IAAI,QAAQ;AAAE,WAAO,gBAAgB,OAAO;AAAA,EAAG;AAAA,EAC/C,IAAI,cAAc;AAAE,WAAO,gBAAgB,aAAa;AAAA,EAAG;AAAA,EAC3D,IAAI,yBAAyB;AAAE,WAAO,gBAAgB,wBAAwB;AAAA,EAAG;AAAA,EACjF,IAAI,0BAA0B;AAAE,WAAO,gBAAgB,yBAAyB;AAAA,EAAG;AAAA,EACnF,IAAI,iBAAiB;AAAE,WAAO,gBAAgB,gBAAgB;AAAA,EAAG;AAAA,EACjE,IAAI,kBAAkB;AAAE,WAAO,gBAAgB,iBAAiB;AAAA,EAAG;AAAA,EACnE,IAAI,WAAW;AAAE,WAAO,gBAAgB,UAAU;AAAA,EAAG;AAAA,EACrD,IAAI,WAAW;AAAE,WAAO,gBAAgB,UAAU;AAAA,EAAG;AAAA,EACrD,IAAI,KAAK;AAAE,WAAO,gBAAgB,IAAI;AAAA,EAAG;AAAA,EACzC,IAAI,eAAe;AAAE,WAAO,gBAAgB,cAAc;AAAA,EAAG;AAAA,EAC7D,IAAI,QAAQ;AAAE,WAAO,gBAAgB,OAAO;AAAA,EAAG;AAAA,EAC/C,IAAI,aAAa;AAAE,WAAO,gBAAgB,YAAY;AAAA,EAAG;AAAA,EACzD,IAAI,aAAa;AAAE,WAAO,gBAAgB,YAAY;AAAA,EAAG;AAAA,EACzD,IAAI,SAAS;AAAE,WAAO,gBAAgB,QAAQ;AAAA,EAAG;AAAA,EACjD,IAAI,aAAa;AAAE,WAAO,gBAAgB,YAAY;AAAA,EAAG;AAAA,EACzD,IAAI,cAAc;AAAE,WAAO,gBAAgB,aAAa;AAAA,EAAG;AAAA,EAC3D,IAAI,gBAAgB;AAAE,WAAO,gBAAgB,eAAe;AAAA,EAAG;AAAA,EAC/D,IAAI,iBAAiB;AAAE,WAAO,gBAAgB,gBAAgB;AAAA,EAAG;AAAA,EACjE,IAAI,eAAe;AAAE,WAAO,gBAAgB,cAAc;AAAA,EAAG;AAAA,EAC7D,IAAI,wBAAwB;AAAE,WAAO,gBAAgB,uBAAuB;AAAA,EAAG;AAAA,EAC/E,IAAI,eAAe;AAAE,WAAO,gBAAgB,cAAc;AAAA,EAAG;AAAA,EAC7D,IAAI,cAAc;AAAE,WAAO,gBAAgB,aAAa;AAAA,EAAG;AAC7D;;;ACrDA,mBAAkB;;;ACOX,SAAS,kBAAkB,WAAuB,QAA8B;AACrF,MAAI,mBAAmB,SAAS,GAAG;AACjC,WAAO,yBAAyB,WAAW,MAAM;AAAA,EACnD;AACA,SAAO,uBAAuB,WAA8B,MAAM;AACpE;AAEA,SAAS,yBAAyB,WAA8B,QAA8B;AAC5F,UAAQ,UAAU,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,UAAU,WAAW,MAAM,OAAK,kBAAkB,GAAG,MAAM,CAAC;AAAA,IACrE,KAAK;AACH,aAAO,UAAU,WAAW,KAAK,OAAK,kBAAkB,GAAG,MAAM,CAAC;AAAA,IACpE,KAAK;AAEH,aAAO,UAAU,WAAW,SAAS,IACjC,CAAC,kBAAkB,UAAU,WAAW,CAAC,GAAG,MAAM,IAClD;AAAA,IACN;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,uBAAuB,WAA4B,QAA8B;AACxF,QAAM,aAAa,eAAe,QAAQ,UAAU,KAAK;AAEzD,UAAQ,UAAU,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,YAAY,YAAY,UAAU,KAAK;AAAA,IAChD,KAAK;AACH,aAAO,CAAC,YAAY,YAAY,UAAU,KAAK;AAAA,IACjD,KAAK;AACH,aAAO,SAAS,UAAU,IAAI,SAAS,UAAU,KAAK;AAAA,IACxD,KAAK;AACH,aAAO,SAAS,UAAU,IAAI,SAAS,UAAU,KAAK;AAAA,IACxD,KAAK;AACH,aAAO,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK;AAAA,IACzD,KAAK;AACH,aAAO,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK;AAAA,IACzD,KAAK;AACH,aAAO,SAAS,UAAU,EAAE,SAAS,SAAS,UAAU,KAAK,CAAC;AAAA,IAChE,KAAK;AACH,aAAO,CAAC,SAAS,UAAU,EAAE,SAAS,SAAS,UAAU,KAAK,CAAC;AAAA,IACjE,KAAK;AACH,aAAO,SAAS,UAAU,EAAE,WAAW,SAAS,UAAU,KAAK,CAAC;AAAA,IAClE,KAAK;AACH,aAAO,SAAS,UAAU,EAAE,SAAS,SAAS,UAAU,KAAK,CAAC;AAAA,IAChE,KAAK;AACH,aAAO,MAAM,QAAQ,UAAU,KAAK,IAChC,UAAU,MAAM,KAAK,OAAK,YAAY,YAAY,CAAC,CAAC,IACpD;AAAA,IACN,KAAK;AACH,aAAO,MAAM,QAAQ,UAAU,KAAK,IAChC,CAAC,UAAU,MAAM,KAAK,OAAK,YAAY,YAAY,CAAC,CAAC,IACrD;AAAA,IACN,KAAK;AACH,aAAO,aAAa,UAAU;AAAA,IAChC,KAAK;AACH,aAAO,CAAC,aAAa,UAAU;AAAA,IACjC,KAAK;AACH,UAAI;AACF,eAAO,IAAI,OAAO,SAAS,UAAU,KAAK,CAAC,EAAE,KAAK,SAAS,UAAU,CAAC;AAAA,MACxE,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,KAAK;AACH,aAAO,MAAM,QAAQ,UAAU,IAC3B,WAAW,KAAK,OAAK,YAAY,GAAG,UAAU,KAAK,CAAC,IACpD;AAAA,IACN,KAAK;AACH,aAAO,MAAM,QAAQ,UAAU,IAC3B,CAAC,WAAW,KAAK,OAAK,YAAY,GAAG,UAAU,KAAK,CAAC,IACrD;AAAA,IACN,KAAK;AACH,aAAO,MAAM,QAAQ,UAAU,IAC3B,WAAW,WAAW,SAAS,UAAU,KAAK,IAC9C;AAAA,IACN,KAAK;AACH,aAAO,MAAM,QAAQ,UAAU,IAC3B,WAAW,SAAS,SAAS,UAAU,KAAK,IAC5C;AAAA,IACN,KAAK;AACH,aAAO,MAAM,QAAQ,UAAU,IAC3B,WAAW,SAAS,SAAS,UAAU,KAAK,IAC5C;AAAA,IACN;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,6BAA6B,WAAiC;AAC5E,QAAM,OAAO,oBAAI,IAAY;AAC7B,sBAAoB,WAAW,IAAI;AACnC,SAAO,CAAC,GAAG,IAAI;AACjB;AAEA,SAAS,oBAAoB,WAAuB,MAAyB;AAC3E,MAAI,mBAAmB,SAAS,GAAG;AACjC,cAAU,WAAW,QAAQ,OAAK,oBAAoB,GAAG,IAAI,CAAC;AAAA,EAChE,OAAO;AACL,UAAM,WAAY,UAA8B;AAChD,SAAK,IAAI,SAAS,SAAS,GAAG,IAAI,SAAS,MAAM,GAAG,EAAE,CAAC,IAAI,QAAQ;AAAA,EACrE;AACF;AAIA,SAAS,eAAe,KAAkB,MAAuB;AAC/D,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAmB;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,YAAY,QAAQ,YAAY,OAAW,QAAO;AACtD,cAAW,QAAoC,IAAI;AAAA,EACrD;AACA,SAAO;AACT;AAEA,SAAS,YAAY,GAAY,GAAqB;AACpD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,KAAK,QAAQ,KAAK,KAAM,QAAO;AACnC,MAAI,KAAK,QAAQ,KAAK,KAAM,QAAO;AACnC,SAAO,OAAO,CAAC,MAAM,OAAO,CAAC;AAC/B;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,OAAO,KAAK;AACtB,WAAO,MAAM,CAAC,IAAI,IAAI;AAAA,EACxB;AACA,MAAI,iBAAiB,KAAM,QAAO,MAAM,QAAQ;AAChD,SAAO;AACT;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,aAAa,OAAyB;AAC7C,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,MAAM;AACvD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,WAAW;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AACpE,SAAO;AACT;;;AC3IA,IAAM,wBAAuD;AAAA,EAC3D,SAAS,MAAM,oBAAI,KAAK;AAAA,EACxB,eAAe,CAAC,EAAE,WAAW,MAAM,aAAa,aAAa,oBAAI,KAAK;AAAA,EACtE,iBAAiB,CAAC,EAAE,cAAc,MAAM,gBAAgB,EAAE,IAAI,cAAc,IAAI;AAAA,EAChF,mBAAmB,CAAC,EAAE,WAAW,OAAO,MAAM;AAC5C,UAAM,SAAS,QAAQ;AACvB,WAAO,SAAS,OAAO,SAAS,IAAqB;AAAA,EACvD;AACF;AAEA,IAAI,wBAAuD,EAAE,GAAG,sBAAsB;AAG/E,SAAS,uBAAuB,QAA6C;AAClF,0BAAwB,EAAE,GAAG,uBAAuB,GAAG,OAAO;AAChE;AAGO,SAAS,iBAAiB,MAAyC;AACxE,SAAO,sBAAsB,IAAI;AACnC;AAGO,SAAS,qBACd,WACA,cACA,QACA,YACA,cACA,eACe;AACf,QAAM,KAAK,sBAAsB,YAAY;AAC7C,MAAI,IAAI;AACN,WAAO,GAAG,EAAE,WAAW,YAAY,QAAQ,cAAc,cAAc,CAAC;AAAA,EAC1E;AACA,SAAO;AACT;AAGO,SAAS,6BAAmC;AACjD,0BAAwB,EAAE,GAAG,sBAAsB;AACrD;;;ACzDA,uBAAuB;AA+BvB,IAAM,UAAkB,IAAI,wBAAO;AAGnC,IAAM,WAAY,QAAgB,UAAU,GAAG;AAE9C,QAAgB,UAAU,GAAG,IAAI,CAAC,GAAY,MAAwB;AACrE,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,OAAO,CAAC,IAAI,OAAO,CAAC;AAC/E,SAAO,SAAS,GAAa,CAAW;AAC1C;AAGC,QAAgB,OAAO,KAAK,IAAI;AAG1B,SAAS,mBACd,YACA,QACA,WACA,cACA,eACS;AAIT,QAAM,gBAAgB,6CAA6C,KAAK,UAAU;AAClF,MAAI,eAAe;AACjB,UAAM,KAAK,iBAAiB,cAAc,CAAC,CAAC;AAC5C,QAAI,CAAC,GAAI,QAAO;AAChB,WAAO,GAAG;AAAA,MACR,WAAW,aAAa;AAAA,MACxB,YAAY,YAAY,OAAO,SAAS,IAAc;AAAA,MACtD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAIA,MAAI,WAAW,WAAW;AAAA,IACxB;AAAA,IACA,CAAC,GAAG,WAAmB;AACrB,YAAM,KAAK,iBAAiB,MAAM;AAClC,UAAI,IAAI;AACN,cAAM,SAAS,GAAG;AAAA,UAChB,WAAW,aAAa;AAAA,UACxB,YAAY,YAAY,OAAO,SAAS,IAAc;AAAA,UACtD;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,YAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AACpD,YAAI,OAAO,WAAW,SAAU,QAAO,KAAK,UAAU,MAAM;AAC5D,YAAI,kBAAkB,KAAM,QAAO,OAAO,OAAO,QAAQ,CAAC;AAC1D,eAAO,OAAO,MAAM;AAAA,MACtB;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAOA,QAAM,iBAAiB,CAAC,UAA2B;AACjD,QAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,QAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,QAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,QAAI,iBAAiB,KAAM,QAAO,OAAO,MAAM,QAAQ,CAAC;AACxD,WAAO,OAAO,KAAK;AAAA,EACrB;AAGA,aAAW,SAAS;AAAA,IAClB;AAAA,IACA,CAAC,GAAG,cAAsB,eAAeC,gBAAe,gBAAgB,CAAC,GAAG,SAAS,CAAC;AAAA,EACxF;AAGA,aAAW,SAAS;AAAA,IAClB;AAAA,IACA,CAAC,GAAG,cAAsB,eAAeA,gBAAe,QAAQ,SAAS,CAAC;AAAA,EAC5E;AAGA,aAAW,SAAS;AAAA,IAClB;AAAA,IACA,CAAC,GAAG,cAAsB,eAAeA,gBAAe,QAAQ,SAAS,CAAC;AAAA,EAC5E;AAGA,MAAI;AACF,WAAO,QAAQ,SAAS,UAAU,CAAC,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASA,gBAAe,KAAkB,MAAuB;AAC/D,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAmB;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,YAAY,QAAQ,YAAY,OAAW,QAAO;AACtD,cAAW,QAAoC,IAAI;AAAA,EACrD;AACA,SAAO;AACT;AAKO,SAAS,8BAA8B,YAA8B;AAC1E,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,cAAc;AACpB,MAAI;AACJ,UAAQ,QAAQ,YAAY,KAAK,UAAU,OAAO,MAAM;AACtD,SAAK,IAAI,MAAM,CAAC,CAAC;AAAA,EACnB;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;AAKO,SAAS,4BAA4B,YAA8B;AACxE,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,UAAU;AAChB,MAAI;AACJ,UAAQ,QAAQ,QAAQ,KAAK,UAAU,OAAO,MAAM;AAClD,QAAI,IAAI,MAAM,CAAC,CAAC;AAAA,EAClB;AACA,SAAO,CAAC,GAAG,GAAG;AAChB;;;ACxJA,IAAM,WAA6B,CAAC;AACpC,IAAM,aAAa;AAKZ,SAAS,SAAS,MAAyB,WAAmB,SAAuB;AAC1F,WAAS,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,WAAW,QAAQ,CAAC;AAEjE,MAAI,SAAS,SAAS,YAAY;AAChC,aAAS,OAAO,GAAG,SAAS,SAAS,UAAU;AAAA,EACjD;AACF;AAKO,SAAS,cAAgC;AAC9C,SAAO,CAAC,GAAG,QAAQ;AACrB;AAKO,SAAS,gBAAsB;AACpC,WAAS,SAAS;AACpB;;;AC5BO,SAAS,qBACd,QAC6B;AAC7B,QAAM,QAAqC,CAAC;AAC5C,QAAM,aAAa,OAAO,KAAK,MAAM;AAErC,aAAW,QAAQ,YAAY;AAC7B,UAAM,IAAI,IAAI,oBAAI,IAAI;AAAA,EACxB;AAEA,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,QAAI,OAAO,OAAO;AAChB,iBAAW,QAAQ,OAAO,OAAO;AAE/B,cAAM,WAAW,6BAA6B,KAAK,IAAI;AACvD,mBAAW,OAAO,UAAU;AAC1B,cAAI,OAAO,OAAO;AAChB,kBAAM,GAAG,EAAE,IAAI,SAAS;AAAA,UAC1B;AAAA,QACF;AAGA,6BAAqB,KAAK,MAAM,WAAW,KAAK;AAChD,YAAI,KAAK,MAAM;AACb,+BAAqB,KAAK,MAAM,WAAW,KAAK;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,eAAe;AACxB,YAAM,WAAW,8BAA8B,OAAO,aAAa;AACnE,iBAAW,OAAO,UAAU;AAC1B,YAAI,OAAO,OAAO;AAChB,gBAAM,GAAG,EAAE,IAAI,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBACP,QACA,YACA,OACM;AACN,MAAI,OAAO,QAAQ;AACjB,eAAW,eAAe,OAAO,KAAK,OAAO,MAAM,GAAG;AACpD,UAAI,eAAe,OAAO;AAGxB,cAAM,UAAU,GAAG,IAAI,WAAW;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,gBACd,OACgE;AAChE,QAAM,WAAmC,CAAC;AAC1C,QAAM,YAAsC,CAAC;AAC7C,QAAM,SAAS,OAAO,KAAK,KAAK;AAEhC,aAAW,KAAK,QAAQ;AACtB,aAAS,CAAC,IAAI;AACd,cAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EAC7B;AAEA,aAAW,KAAK,QAAQ;AACtB,eAAW,OAAO,UAAU,CAAC,GAAG;AAC9B,UAAI,OAAO,UAAU;AACnB,iBAAS,GAAG;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,QAAQ;AACtB,QAAI,SAAS,CAAC,MAAM,EAAG,OAAM,KAAK,CAAC;AAAA,EACrC;AAEA,QAAM,SAAmB,CAAC;AAC1B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,MAAM;AAC5B,WAAO,KAAK,OAAO;AACnB,eAAW,YAAY,UAAU,OAAO,GAAG;AACzC,UAAI,YAAY,UAAU;AACxB,iBAAS,QAAQ;AACjB,YAAI,SAAS,QAAQ,MAAM,EAAG,OAAM,KAAK,QAAQ;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,SAAS,OAAO;AACxC,QAAM,cAAc,WAAW,OAAO,OAAO,OAAK,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC;AAC1E,SAAO,EAAE,QAAQ,UAAU,YAAY;AACzC;AAKO,SAAS,wBACd,QACA,sBACoC;AACpC,QAAM,SAA6C,CAAC;AACpD,QAAM,QAAQ,qBAAqB,MAAM;AAEzC,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,WAAO,SAAS,IAAI;AAAA,MAClB,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO,UAAU,OAAO,SAAS;AAAA,MACzC,UAAU,uBAAuB,OAAO,OAAO;AAAA,MAC/C,UAAU,OAAO;AAAA,MACjB,eAAe,OAAO;AAAA,MACtB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,qBAAqB,OAAO;AAAA,MAC5B,iBAAiB,CAAC,GAAI,MAAM,SAAS,KAAK,CAAC,CAAE;AAAA,MAC7C,iBAAiB,CAAC;AAAA,MAClB,eAAe,CAAC;AAAA,IAClB;AAAA,EACF;AAGA,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,eAAW,OAAO,MAAM,mBAAmB,CAAC,GAAG;AAC7C,UAAI,OAAO,GAAG,GAAG;AACf,eAAO,GAAG,EAAE,kBAAkB,OAAO,GAAG,EAAE,mBAAmB,CAAC;AAC9D,eAAO,GAAG,EAAE,gBAAiB,KAAK,SAAS;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,iBACd,QACA,QACA,sBACmB;AACnB,QAAM,cAAc,wBAAwB,QAAQ,oBAAoB;AACxE,QAAM,aAAa,OAAO,KAAK,MAAM;AAGrC,QAAM,QAAQ,qBAAqB,MAAM;AACzC,QAAM,EAAE,OAAO,IAAI,gBAAgB,KAAK;AACxC,QAAM,YAAY,OAAO,SAAS,IAAI,SAAS;AAE/C,MAAI,eAAe,CAAC,GAAG,UAAU;AAEjC,aAAW,aAAa,WAAW;AACjC,UAAM,SAAS,OAAO,SAAS;AAC/B,QAAI,CAAC,QAAQ,MAAO;AAEpB,UAAM,cAAc,mBAAmB,OAAO,OAAO,MAAM;AAE3D,QAAI,YAAY,SAAS,GAAG;AAC1B,kBAAY,SAAS,EAAE,gBAAgB,YAAY;AAAA,IACrD;AAEA,aAAS,kBAAkB,WAAW,GAAG,OAAO,MAAM,MAAM,oBAAoB;AAGhF,uBAAmB,aAAa,WAAW,YAAY,UAAU;AAGjE,QAAI,YAAY,oBAAoB,UAAa,YAAY,SAAS,GAAG;AACvE,kBAAY,SAAS,EAAE,kBAAkB,YAAY;AAAA,IACvD;AAGA,eAAW,CAAC,aAAa,MAAM,KAAK,OAAO,QAAQ,YAAY,YAAY,GAAG;AAC5E,UAAI,YAAY,WAAW,GAAG;AAC5B,2BAAmB,aAAa,aAAa,MAAM;AAAA,MACrD;AAAA,IACF;AAGA,QAAI,YAAY,YAAY;AAC1B,qBAAe,YAAY;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,YAAY,aAAa;AACjD;AAMO,SAAS,uBACd,cACA,QACA,QACA,cACmB;AAEnB,QAAM,WAAW,8BAA8B,cAAc,aAAa,WAAW;AACrF,WAAS,gBAAgB,cAAc,GAAG,SAAS,IAAI,oBAAoB;AAC3E,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,EAAE,GAAG,aAAa,YAAY;AACpD,MAAI,eAAe,CAAC,GAAG,aAAa,UAAU;AAG9C,aAAW,aAAa,UAAU;AAChC,UAAM,SAAS,OAAO,SAAS;AAC/B,QAAI,CAAC,OAAQ;AAGb,kBAAc,SAAS,IAAI;AAAA,MACzB,GAAG,cAAc,SAAS;AAAA,MAC1B,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO,UAAU,OAAO,SAAS;AAAA,MACzC,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,eAAe,OAAO;AAAA,MACtB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,qBAAqB,OAAO;AAAA,MAC5B,eAAe,CAAC;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAIA,aAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACzD,QAAI,CAAC,OAAO,MAAO;AAEnB,UAAM,cAAc,mBAAmB,OAAO,OAAO,MAAM;AAG3D,QAAI,SAAS,IAAI,UAAU,KAAK,eAAe,cAAc;AAC3D,yBAAmB,eAAe,YAAY,YAAY,UAAU;AACpE,UAAI,YAAY,oBAAoB,UAAa,cAAc,UAAU,GAAG;AAC1E,sBAAc,UAAU,EAAE,kBAAkB,YAAY;AAAA,MAC1D;AAAA,IACF;AAGA,eAAW,CAAC,aAAa,MAAM,KAAK,OAAO,QAAQ,YAAY,YAAY,GAAG;AAC5E,UAAI,SAAS,IAAI,WAAW,KAAK,cAAc,WAAW,GAAG;AAC3D,2BAAmB,eAAe,aAAa,MAAM;AAAA,MACvD;AAAA,IACF;AAEA,QAAI,YAAY,YAAY;AAC1B,qBAAe,YAAY;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,eAAe,YAAY,aAAa;AAChE;AAEA,SAAS,8BACP,cACA,aACa;AACb,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,QAAQ,CAAC,YAAY;AAE3B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,MAAM;AAC5B,UAAM,OAAO,YAAY,OAAO,GAAG,mBAAmB,CAAC;AACvD,eAAW,OAAO,MAAM;AACtB,UAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,iBAAS,IAAI,GAAG;AAChB,cAAM,KAAK,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAeA,SAAS,mBAAmB,OAAgB,QAAsC;AAEhF,QAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAE9E,QAAM,aAA2B,CAAC;AAClC,QAAM,eAA6C,CAAC;AACpD,MAAI;AACJ,QAAM,gBAA0B,CAAC;AAEjC,MAAI;AAEJ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AACrB,UAAM,eAAe,kBAAkB,KAAK,MAAM,MAAM;AACxD,QAAI,cAAc;AAChB,oBAAc,KAAK,KAAK,MAAM,QAAQ,CAAC,EAAE;AAAA,IAC3C;AACA,UAAM,SAAS,eAAe,KAAK,OAAO,KAAK;AAG/C,QAAI,gBAAgB,KAAK,MAAM,aAAa,UAAa,oBAAoB,QAAW;AACtF,wBAAkB,EAAE,OAAO,KAAK,KAAK,SAAS;AAAA,IAChD;AAEA,QAAI,CAAC,OAAQ;AAIb,gBAAY,YAAY,MAAM;AAG9B,QAAI,OAAO,QAAQ;AACjB,iBAAW,CAAC,aAAa,YAAY,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AACvE,YAAI,CAAC,aAAa,WAAW,GAAG;AAC9B,uBAAa,WAAW,IAAI,CAAC;AAAA,QAC/B;AACA,oBAAY,aAAa,WAAW,GAAG,YAAY;AAAA,MACrD;AAAA,IACF;AAGA,QAAI,OAAO,cAAc,CAAC,YAAY;AACpC,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,cAAc,YAAY,eAAe,gBAAgB;AAChF;AAKA,SAAS,YAAY,QAAsB,QAA4B;AACrE,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,QAAW;AAClE,WAAO,WAAW,OAAO;AAAA,EAC3B;AACA,MAAI,OAAO,WAAW,UAAa,OAAO,WAAW,QAAW;AAC9D,WAAO,SAAS,OAAO;AAAA,EACzB;AACA,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,QAAW;AAClE,WAAO,WAAW,OAAO;AAAA,EAC3B;AACA,MAAI,OAAO,UAAU,UAAa,OAAO,UAAU,QAAW;AAC5D,WAAO,QAAQ,OAAO;AAAA,EACxB;AACA,QAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,QAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,MAAI,eAAe,UAAa,eAAe,QAAW;AACxD,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,YAAY,UAAa,OAAO,YAAY,QAAW;AAChE,WAAO,UAAU,OAAO;AAAA,EAC1B;AACA,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,QAAW;AAClE,WAAO,WAAW,OAAO;AAAA,EAC3B;AACA,MAAI,OAAO,kBAAkB,UAAa,OAAO,kBAAkB,QAAW;AAC5E,WAAO,gBAAgB,OAAO;AAAA,EAChC;AAGF;AAEA,SAAS,mBACP,QACA,WACA,QACM;AACN,QAAM,QAAQ,OAAO,SAAS;AAC9B,MAAI,CAAC,MAAO;AAEZ,MAAI,OAAO,aAAa,OAAW,OAAM,WAAW,OAAO;AAC3D,MAAI,OAAO,WAAW,OAAW,OAAM,SAAS,OAAO;AACvD,MAAI,OAAO,aAAa,OAAW,OAAM,WAAW,OAAO;AAC3D,MAAI,OAAO,UAAU,OAAW,OAAM,QAAQ,OAAO;AACrD,QAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,MAAI,eAAe,OAAW,OAAM,OAAO;AAC3C,MAAI,OAAO,YAAY,OAAW,OAAM,UAAU,OAAO;AACzD,MAAI,OAAO,aAAa,OAAW,OAAM,WAAW,OAAO;AAC3D,MAAI,OAAO,kBAAkB,OAAW,OAAM,gBAAgB,OAAO;AAGvE;;;ACtaO,IAAM,0BAA6C;AAAA,EACxD,SAAS,CAAC;AACZ;AAEA,IAAM,qBAAqB,CACzB,QAA2B,yBAC3B,WACsB;AACtB,UAAQ,OAAO,MAAM;AAAA,IACnB,mCAAgC;AAC9B,YAAM,aAAa,OAAO,QAAQ;AAClC,aAAO;AAAA,QACL,SAAS;AAAA,UACP,GAAG,MAAM;AAAA,UACT,CAAC,UAAU,GAAG,EAAE,GAAG,OAAO,QAAQ,UAAU;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,IACA,yCAAmC;AACjC,YAAM,aAAa,OAAO,QAAQ;AAClC,YAAM,WAAW,MAAM,QAAQ,UAAU;AACzC,UAAI,CAAC,SAAU,QAAO;AAEtB,YAAM,qBAAqB,EAAE,GAAG,SAAS,YAAY;AACrD,aAAO,KAAK,OAAO,QAAQ,UAAU,WAAW,EAAE,QAAQ,eAAa;AACrE,2BAAmB,SAAS,IAAI;AAAA,UAC9B,GAAG,mBAAmB,SAAS;AAAA,UAC/B,GAAG,OAAO,QAAQ,UAAU,YAAY,SAAS;AAAA,QACnD;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,UACP,GAAG,MAAM;AAAA,UACT,CAAC,UAAU,GAAG;AAAA,YACZ,aAAa;AAAA,YACb,YAAY,OAAO,QAAQ,UAAU;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,uCAAkC;AAChC,UAAI,OAAO,QAAQ,YAAY;AAC7B,cAAM,EAAE,CAAC,OAAO,QAAQ,UAAU,GAAG,GAAG,GAAG,UAAU,IAAI,MAAM;AAC/D,eAAO,EAAE,SAAS,UAAU;AAAA,MAC9B;AACA,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAO,6BAAQ;;;AN+BX;AA9EJ,IAAM,qBAA0D,aAAAC,QAAM;AAAA,EACpE;AACF;AAEO,SAAS,wBAAwB;AACtC,QAAM,UAAU,aAAAA,QAAM,WAAW,kBAAkB;AACnD,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;AAGO,IAAM,sBAA6D,CACxE,UACsB;AACtB,QAAM,CAAC,YAAY,QAAQ,IAAI,aAAAA,QAAM,WAAW,4BAAoB,uBAAuB;AAE3F,QAAM,gBAAgB,aAAAA,QAAM,OAAO,UAAU;AAC7C,eAAAA,QAAM,UAAU,MAAM;AAAE,kBAAc,UAAU;AAAA,EAAY,GAAG,CAAC,UAAU,CAAC;AAE3E,QAAM,gBAAgB,aAAAA,QAAM,YAAY,CACtC,YACA,eACA,QACA,yBACsB;AACtB,UAAM,YAAY,iBAAiB,QAAQ,eAAe,oBAAoB;AAE9E,aAAS;AAAA,MACP;AAAA,MACA,SAAS,EAAE,YAAY,UAAU;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,aAAAA,QAAM,YAAY,CAAC,eAAwB;AAChE,aAAS;AAAA,MACP;AAAA,MACA,SAAS,EAAE,WAAW;AAAA,IACxB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,aAAAA,QAAM,YAAY,CAC3C,YACA,YACA,WACA,WACG;AACH,UAAM,eAAe,cAAc,QAAQ,QAAQ,UAAU;AAC7D,QAAI,CAAC,aAAc;AAEnB,UAAM,cACH,aAAa,YAAY,SAAS,GAAG,iBAAiB,UAAU,KAAK,MACrE,aAAa,YAAY,SAAS,GAAG,iBAAiB,UAAU,KAAK;AAExE,QAAI,CAAC,WAAY;AAEjB,UAAM,eAAe,uBAAuB,WAAW,QAAQ,YAAY,YAAY;AAEvF,aAAS;AAAA,MACP;AAAA,MACA,SAAS,EAAE,YAAY,WAAW,aAAa;AAAA,IACjD,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAsC,aAAAA,QAAM,QAAQ,OAAO;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,CAAC,YAAY,eAAe,oBAAoB,cAAc,CAAC;AAEnE,SACE,4CAAC,mBAAmB,UAAnB,EAA4B,OAAO,eACjC,gBAAM,UACT;AAEJ;;;AO3FA,IAAAC,gBAAkB;AAsCd,IAAAC,sBAAA;AAnCJ,IAAM,uBAA8D,cAAAC,QAAM;AAAA,EACxE;AACF;AAEO,SAAS,0BAA0B;AACxC,QAAM,UAAU,cAAAA,QAAM,WAAW,oBAAoB;AACrD,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;AASO,IAAM,wBAA8D,CACzE,UACsB;AACtB,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,cAAAA,QAAM;AAAA,IAC/C,MAAM,kBAAkB;AAAA,EAC3B;AAEA,QAAM,gBAAwC,cAAAA,QAAM,QAAQ,OAAO;AAAA,IACjE;AAAA,IACA;AAAA,EACF,IAAI,CAAC,cAAc,CAAC;AAEpB,SACE,6CAAC,qBAAqB,UAArB,EAA8B,OAAO,eACnC,gBAAM,UACT;AAEJ;;;ACdA,IAAM,WAAwB,CAAC,UAAU;AACvC,MAAI,UAAU,QAAQ,UAAU,UAAc,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAK;AAC/F,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,QAAqB,CAAC,UAAU;AACpC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,aAAa;AACnB,SAAO,WAAW,KAAK,KAAK,IAAI,SAAY;AAC9C;AAEA,IAAM,QAAqB,CAAC,UAAU;AACpC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,aAAa;AACnB,SAAO,WAAW,KAAK,KAAK,IAAI,SAAY;AAC9C;AAEA,IAAM,MAAmB,CAAC,UAAU;AAClC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAO,mBAAmB,KAAK,KAAK,IAAI,SAAY;AACtD;AAEA,IAAM,OAAoB,CAAC,UAAU;AACnC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI,SAAS,OAAO,EAAE;AAC5B,MAAI,MAAM,CAAC,KAAK,IAAI,QAAQ,IAAI,KAAM,QAAO;AAC7C,SAAO;AACT;AAEA,IAAM,sBAAmC,CAAC,UAAU;AAClD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAO,qBAAqB,KAAK,KAAK,IAAI,uCAAuC;AACnF;AAEA,IAAM,WAAwB,CAAC,UAAU;AACvC,MAAI,CAAC,SAAS,UAAU,EAAG,QAAO;AAClC,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC5D,SAAO,yBAAyB,KAAK,GAAG,IAAI,SAAY;AAC1D;AAEA,IAAM,gBAA6B,CAAC,UAAU;AAC5C,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAC5C,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,OAAO,IAAI;AACvB,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO,oBAAoB,GAAG;AACjD,SAAK,IAAI,GAAG;AAAA,EACd;AACA,SAAO;AACT;AAEA,IAAM,YAAyB,CAAC,OAAO,WAAW;AAChD,MAAI,UAAU,QAAQ,UAAU,UAAa,OAAO,UAAU,SAAU,QAAO;AAC/E,QAAM,MAAM,OAAO,QAAQ,OAAO,CAAC;AACnC,SAAO,MAAM,SAAS,MAAM,oBAAoB,GAAG,gBAAgB;AACrE;AAEA,IAAM,YAAyB,CAAC,OAAO,WAAW;AAChD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,MAAM,OAAO,QAAQ,OAAO,QAAQ;AAC1C,SAAO,MAAM,SAAS,MAAM,mBAAmB,GAAG,gBAAgB;AACpE;AAEA,IAAM,eAA4B,CAAC,OAAO,WAAW;AACnD,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC5D,MAAI,MAAM,GAAG,EAAG,QAAO;AACvB,QAAM,MAAM,OAAO,QAAQ,OAAO,SAAS;AAC3C,QAAM,MAAM,OAAO,QAAQ,OAAO,QAAQ;AAC1C,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO,mBAAmB,GAAG,QAAQ,GAAG;AACpE,SAAO;AACT;AAEA,IAAM,UAAuB,CAAC,OAAO,WAAW;AAC9C,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,QAAQ,QAAQ;AACtB,QAAM,UAAW,QAAQ,WAAsB;AAC/C,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,WAAO,IAAI,OAAO,KAAe,EAAE,KAAK,KAAK,IAAI,SAAY;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,QAAqB,CAAC,OAAO,WAAW;AAC5C,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,aAAa,OAAO,QAAQ,SAAS,GAAG;AAC9C,QAAM,SAAS,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAI;AACtD,SAAO,SAAS,aAAa,mCAAmC,UAAU,OAAO;AACnF;AAEA,IAAM,wBAAqC,CAAC,OAAO,WAAW;AAC5D,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC5D,MAAI,MAAM,GAAG,EAAG,QAAO;AACvB,QAAM,UAAU,QAAQ,gBAAgB,OAAO,OAAO,OAAO,YAAY,IAAI;AAC7E,QAAM,UAAU,QAAQ,gBAAgB,OAAO,OAAO,OAAO,YAAY,IAAI;AAC7E,QAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI;AACvD,QAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI;AACvD,MAAI,YAAY,UAAa,OAAO,QAAS,QAAO,wBAAwB,OAAO;AACnF,MAAI,YAAY,UAAa,OAAO,QAAS,QAAO,qBAAqB,OAAO;AAChF,MAAI,QAAQ,UAAa,MAAM,IAAK,QAAO,oBAAoB,GAAG;AAClE,MAAI,QAAQ,UAAa,MAAM,IAAK,QAAO,mBAAmB,GAAG;AACjE,SAAO;AACT;AAEA,IAAM,aAA0B,CAAC,OAAO,WAAW;AACjD,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC5D,MAAI,MAAM,GAAG,EAAG,QAAO;AACvB,QAAM,SAAS,OAAO,QAAQ,UAAU,CAAC;AACzC,MAAI,WAAW,EAAG,QAAO;AAEzB,QAAM,YAAY,KAAK,IAAI,MAAM,MAAM;AACvC,QAAM,YAAY;AAClB,MAAI,YAAY,aAAa,KAAK,IAAI,YAAY,KAAK,IAAI,MAAM,CAAC,IAAI,WAAW;AAC/E,WAAO,yBAAyB,MAAM;AAAA,EACxC;AACA,SAAO;AACT;AAEA,IAAM,aAA0B,CAAC,OAAO,QAAQ,YAAY;AAC1D,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,OAAQ,QAAO;AAC9C,QAAM,WAAW,QAAQ,OAAO,OAAO,KAAe;AACtD,QAAM,gBAAgB,OAAO;AAC7B,MAAI,cAAc,SAAS,OAAO,QAAQ,CAAC,MAAM,SAAS,QAAQ,UAAU,KAAK;AAC/E,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAkBA,IAAI,4BAAgE,CAAC;AAG9D,SAAS,0BAA0B,MAAc,UAAoC;AAC1F,8BAA4B,EAAE,GAAG,2BAA2B,CAAC,IAAI,GAAG,SAAS;AAC/E;AAGO,SAAS,qBAAqB,MAA8C;AACjF,SAAO,0BAA0B,IAAI;AACvC;AAGO,SAAS,0BAA8D;AAC5E,SAAO,EAAE,GAAG,0BAA0B;AACxC;AAGO,SAAS,iCAAuC;AACrD,8BAA4B,CAAC;AAC/B;AAIA,IAAM,oBAAiD;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,oBAAoB,CAAC,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC;AAAA,EAC5D,mBAAmB,CAAC,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,OAAO,GAAG,GAAG,CAAC;AAC5D;AAEA,IAAI,oBAAiD,EAAE,GAAG,kBAAkB;AAGrE,SAAS,mBAAmB,QAA2C;AAC5E,sBAAoB,EAAE,GAAG,mBAAmB,GAAG,OAAO;AACxD;AAGO,SAAS,aAAa,MAAuC;AAClE,SAAO,kBAAkB,IAAI;AAC/B;AAGO,SAAS,uBAAoD;AAClE,SAAO,EAAE,GAAG,kBAAkB;AAChC;AAGO,SAAS,yBAA+B;AAC7C,sBAAoB,EAAE,GAAG,kBAAkB;AAC7C;AAMA,eAAsB,eACpB,OACA,OACA,SAC6B;AAC7B,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ,QAAQ,QAAS,QAAO;AAGpC,QAAI,KAAK,MAAM;AACb,UAAI,CAAC,kBAAkB,KAAK,MAAM,QAAQ,MAAM,EAAG;AAAA,IACrD;AAEA,UAAM,YAAY,aAAa,KAAK,IAAI;AACxC,QAAI,CAAC,UAAW;AAEhB,UAAM,SAAS,UAAU,OAAO,KAAK,QAAQ,OAAO;AACpD,UAAM,UAAU,kBAAkB,UAAU,MAAM,SAAS;AAE3D,QAAI,SAAS;AACX,aAAO,KAAK,WAAW;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,mBACd,OACA,OACA,SACoB;AACpB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,MAAO;AAEhB,QAAI,KAAK,MAAM;AACb,UAAI,CAAC,kBAAkB,KAAK,MAAM,QAAQ,MAAM,EAAG;AAAA,IACrD;AAEA,UAAM,YAAY,aAAa,KAAK,IAAI;AACxC,QAAI,CAAC,UAAW;AAEhB,UAAM,SAAS,UAAU,OAAO,KAAK,QAAQ,OAAO;AACpD,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,KAAK,WAAW;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAIO,SAAS,oBAAoB,KAAa,SAAmC;AAClF,SAAO,EAAE,MAAM,aAAa,QAAQ,EAAE,IAAI,GAAG,QAAQ;AACvD;AAEO,SAAS,oBAAoB,KAAa,SAAmC;AAClF,SAAO,EAAE,MAAM,aAAa,QAAQ,EAAE,IAAI,GAAG,QAAQ;AACvD;AAEO,SAAS,uBAAuB,KAAa,KAAa,SAAmC;AAClG,SAAO,EAAE,MAAM,gBAAgB,QAAQ,EAAE,KAAK,IAAI,GAAG,QAAQ;AAC/D;AAEO,SAAS,kBAAkBC,UAAiB,SAAkC;AACnF,SAAO,EAAE,MAAM,WAAW,QAAQ,EAAE,SAAAA,UAAS,QAAQ,EAAE;AACzD;AAEO,SAAS,qBACd,OACA,QACA,SACiB;AACjB,SAAO,EAAE,MAAM,cAAc,QAAQ,EAAE,OAAO,OAAO,GAAG,QAAQ;AAClE;;;AChUO,IAAM,iBAAiB,CAC5B,UACA,QACA,YACA,UAAkB,SACU;AAC5B,MAAI,CAAC,UAAU,CAAC,WAAY,QAAO;AACnC,QAAM,cAAe,OAAO,UAAU,GAAqB,OAAO,WAAS,MAAM,OAAO,MAAM,QAAQ;AACtG,SAAO,aAAa,WAAW,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,IAAI;AACpF;AAEO,IAAM,kBAAkB,CAC7B,aACA,oBAA4B,OAChB;AACZ,MAAI,QAAQ;AACZ,SAAO,KAAK,WAAW,EAAE,QAAQ,WAAS;AACxC,QAAI,CAAC,YAAY,KAAK,EAAE,OAAQ,UAAS;AAAA,EAC3C,CAAC;AACD,SAAO,QAAQ;AACjB;AAEO,IAAM,4BAA4B,CACvC,iBACA,gBAC4B;AAC5B,QAAM,yBAAkD,CAAC;AAEzD,mBAAiB,QAAQ,eAAa;AACpC,gBAAY,SAAS,GAAG,iBAAiB,QAAQ,wBAAsB;AACrE,UAAI,YAAY,kBAAkB,GAAG,cAAc;AACjD,YAAI,uBAAuB,6BAA6B,QAAW;AACjE,iCAAuB,2BAA2B;AAClD,iCAAuB,sBAAsB,CAAC,kBAAkB;AAAA,QAClE,OAAO;AACL,iCAAuB,oBAAqB,KAAK,kBAAkB;AAAA,QACrE;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,yBAAuB,mBAAmB,iBAAiB;AAAA,IACzD,eACE,CAAC,uBAAuB,qBAAqB,SAAS,SAAS,KAC/D,cAAc,uBAAuB;AAAA,EACzC;AAEA,SAAO;AACT;AAOO,IAAM,iCAAiC,CAC5C,iBACA,gBAC4B;AAC5B,QAAM,iBAA0C,CAAC;AAEjD,mBAAiB,QAAQ,eAAa;AACpC,gBAAY,SAAS,GAAG,iBAAiB,QAAQ,wBAAsB;AACrE,YAAM,QAAQ,YAAY,kBAAkB;AAC5C,UACE,OAAO,iBACP,CAAC,MAAM,uBACP,CAAC,gBAAgB,SAAS,kBAAkB,GAC5C;AACA,uBAAe,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,YAAY,MAAM;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAEO,IAAM,4BAA4B,CACvC,gBAC4B;AAC5B,QAAM,iBAA0C,CAAC;AAEjD,SAAO,KAAK,WAAW,EAAE,QAAQ,eAAa;AAC5C,UAAM,QAAQ,YAAY,SAAS;AACnC,QAAI,MAAM,iBAAiB,MAAM,qBAAqB;AACpD,qBAAe,KAAK;AAAA,QAClB;AAAA,QACA,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,IAAM,uBAAuB,CAClC,YACA,QACA,WACA,cACA,kBACkB;AAClB,SAAO,mBAAmB,YAAY,QAAQ,WAAW,cAAc,aAAa;AACtF;AAEO,IAAM,4BAA4B,CACvC,OACA,WACA,YACA,UACuB;AACvB,MAAI,CAAC,MAAM,YAAY,MAAM,SAAS,WAAW,EAAG,QAAO;AAC3D,QAAM,UAA8B,EAAE,WAAW,QAAQ,WAAW;AACpE,QAAM,SAAS,mBAAmB,OAAO,MAAM,UAAU,OAAO;AAChE,WAAS,kBAAkB,WAAW,SAAS,WAAW,MAAM,KAAK,QAAQ;AAC7E,SAAO;AACT;AAEO,IAAM,iCAAiC,OAC5C,OACA,WACA,YACA,OACA,WACgC;AAChC,MAAI,CAAC,MAAM,YAAY,MAAM,SAAS,WAAW,EAAG,QAAO;AAC3D,QAAM,UAA8B,EAAE,WAAW,QAAQ,YAAY,OAAO;AAC5E,SAAO,eAAe,OAAO,MAAM,UAAU,OAAO;AACtD;AAEO,IAAM,4BAA4B,CACvC,aACA,YACA,aACG;AACH,MAAI,QAAQ,WAAW,KAAK,QAAQ,UAAU,EAAG;AAEjD,SAAO,KAAK,WAAW,EAAE,QAAQ,eAAa;AAC5C,UAAM,EAAE,MAAM,QAAQ,IAAI,YAAY,SAAS;AAC/C,SACG,SAAS,cAAc,SAAS,qBACjC,CAAC,OAAO,WAAW,SAAS,CAAC,KAC7B,WACA,QAAQ,UAAU,OAAK,OAAO,EAAE,KAAK,MAAM,OAAO,WAAW,SAAS,CAAC,CAAC,MAAM,IAC9E;AACA,eAAS,GAAG,SAAS,IAAa,MAAM,EAAE,aAAa,MAAM,CAAC;AAAA,IAChE,WAAW,SAAS,iBAAiB,CAAC,OAAO,WAAW,SAAS,CAAC,KAAK,SAAS;AAC9E,YAAM,iBAAkB,WAAW,SAAS,GAAgB;AAAA,QAC1D,SAAO,QAAQ,KAAK,OAAK,OAAO,EAAE,KAAK,MAAM,GAAG;AAAA,MAClD;AACA,UAAI,gBAAgB,WAAY,WAAW,SAAS,GAAgB,QAAQ;AAC1E,iBAAS,GAAG,SAAS,IAAa,gBAAgB,EAAE,aAAa,MAAM,CAAC;AAAA,MAC1E;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,IAAM,qBAAqB,CAChC,aACA,YACA,aACG;AACH,MAAI,QAAQ,WAAW,KAAK,QAAQ,UAAU,EAAG;AAEjD,SAAO,KAAK,WAAW,EAAE,QAAQ,eAAa;AAC5C,UAAM,EAAE,cAAc,OAAO,IAAI,YAAY,SAAS;AACtD,QAAI,CAAC,OAAO,YAAY,KAAK,OAAO,WAAW,SAAS,CAAC,KAAK,CAAC,QAAQ;AACrE,eAAS,GAAG,SAAS,IAAa,cAAc,EAAE,aAAa,KAAK,CAAC;AAAA,IACvE;AAAA,EACF,CAAC;AACH;AAEO,IAAM,wBAAwB,CACnC,YACA,QACA,eACA,cACA,QACA,UACA,kBAMkE;AAClE,QAAM,iBAA8B,EAAE,GAAG,eAAe,QAAQ,EAAE,GAAG,aAAa,EAAE;AAGpF,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,QAAI,OAAO,iBAAiB,OAAO,qBAAqB;AACtD,YAAM,SAAS;AAAA,QACb,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,WAAW,QAAW;AACxB,iBAAS,GAAG,SAAS,IAAa,MAAM;AACxC,uBAAe,SAAS,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,OAAO,iBAAiB,UAAa,OAAO,eAAe,SAAS,CAAC,GAAG;AAC1E,eAAS,GAAG,SAAS,IAAa,OAAO,YAAY;AACrD,qBAAe,SAAS,IAAI,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,cAAc,YAAY,gBAAgB,QAAQ,KAAK;AAAA,IAClE;AAAA,EACF;AACF;AAEO,IAAM,sBAAsB,CACjC,YACA,QACA,eACA,sBACA,kBAMkE;AAClE,SAAO;AAAA,IACL,WAAW,cAAc,YAAY,eAAe,QAAQ,oBAAoB;AAAA,IAChF,gBAAgB;AAAA,EAClB;AACF;AAEO,IAAM,YAAY,CAAC,YAAqB,OAAuB,UAA4B;AAChG,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,WAAW,KAAK,UAAU,KAAK,GAAG,YAAY;AACpD,QAAM,WAAW,OAAO,YAAY;AACpC,UAAQ,UAAU,SAAS,WAAW,YAAY,CAAC,KAAK,WACrD,UAAU,SAAS,WAAW,YAAY,CAAC,KAAK;AACrD;AAEO,IAAM,oBAAoB,CAC/B,kBACA,YACA,gBACqB;AACrB,MAAI,kBAAkB;AACpB,UAAM,iBAAmC,CAAC;AAC1C,QAAI,QAAQ;AACZ,eAAW,QAAQ,eAAa;AAC9B,UAAI,cAAc,SAAS,GAAG,OAAQ;AACtC,UAAI,UAAU,kBAAkB;AAC9B,uBAAe,KAAK,EAAE,WAAW,YAAY,KAAK,CAAC;AAAA,MACrD,OAAO;AACL,uBAAe,KAAK,EAAE,WAAW,YAAY,MAAM,CAAC;AACpD,iBAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AACA,SAAO,YAAY,IAAI,gBAAc,EAAE,WAAW,YAAY,MAAM,EAAE;AACxE;AAGO,IAAM,cAAc,CAAC,YAAkC;AAC5D,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACjC,UAAM,SAAS,EAAE,OAAO,YAAY,KAAK;AACzC,UAAM,SAAS,EAAE,OAAO,YAAY,KAAK;AACzC,WAAO,SAAS,SAAS,KAAK,SAAS,SAAS,IAAI;AAAA,EACtD,CAAC;AACH;;;AC3RO,SAASC,aAAY,SAA+B;AACzD,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACjC,UAAM,SAAS,EAAE,OAAO,YAAY,KAAK;AACzC,UAAM,SAAS,EAAE,OAAO,YAAY,KAAK;AACzC,WAAO,SAAS,SAAS,KAAK,SAAS,SAAS,IAAI;AAAA,EACtD,CAAC;AACH;;;ACKO,SAAS,uBACd,QACe;AACf,QAAM,SAAwB,CAAC;AAC/B,QAAM,QAAQ,qBAAqB,MAAM;AACzC,QAAM,EAAE,UAAU,YAAY,IAAI,gBAAgB,KAAK;AAEvD,MAAI,UAAU;AACZ,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,8CAA8C,YAAY,KAAK,IAAI,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKO,SAAS,uBACd,QACe;AACf,QAAM,SAAwB,CAAC;AAE/B,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,QAAI,CAAC,OAAO,MAAO;AACnB,eAAW,QAAQ,OAAO,OAAO;AAE/B,YAAM,WAAW,6BAA6B,KAAK,IAAI;AACvD,YAAM,kBAAkB,SAAS,SAAS,SAAS;AAEnD,UAAI,mBAAmB,KAAK,KAAK,SAAS,SAAS,GAAG;AACpD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,QAAQ,CAAC,SAAS;AAAA,UAClB,SAAS,UAAU,SAAS;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,wBACd,QACe;AACf,QAAM,SAAwB,CAAC;AAE/B,SAAO,KAAK,GAAG,uBAAuB,MAAM,CAAC;AAC7C,SAAO,KAAK,GAAG,uBAAuB,MAAM,CAAC;AAG7C,MAAI;AACF,QAAI,OAAO,eAAe,eAAgB,WAAuC,YAAY,OAAO;AAClG,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,KAAK,iBAAiB,MAAM,OAAO,EAAE;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;;;ACtDO,SAAS,qBACd,QACA,sBAC0B;AAC1B,QAAM,SAAmC,CAAC;AAC1C,QAAM,aAAa,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AAE9C,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AAExD,QAAI,OAAO,OAAO;AAChB,iBAAW,QAAQ,OAAO,OAAO;AAC/B,cAAM,WAAW,6BAA6B,KAAK,IAAI;AACvD,mBAAW,OAAO,UAAU;AAC1B,cAAI,CAAC,WAAW,IAAI,GAAG,GAAG;AACxB,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,cACA,SAAS,UAAU,SAAS,0DAA0D,GAAG;AAAA,cACzF,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AAGA,YAAI,KAAK,KAAK,QAAQ;AACpB,qBAAW,UAAU,OAAO,KAAK,KAAK,KAAK,MAAM,GAAG;AAClD,gBAAI,CAAC,WAAW,IAAI,MAAM,GAAG;AAC3B,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN;AAAA,gBACA,SAAS,UAAU,SAAS,qDAAqD,MAAM;AAAA,gBACvF,SAAS;AAAA,cACX,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AACA,YAAI,KAAK,MAAM,QAAQ;AACrB,qBAAW,UAAU,OAAO,KAAK,KAAK,KAAK,MAAM,GAAG;AAClD,gBAAI,CAAC,WAAW,IAAI,MAAM,GAAG;AAC3B,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN;AAAA,gBACA,SAAS,UAAU,SAAS,0DAA0D,MAAM;AAAA,gBAC5F,SAAS;AAAA,cACX,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,wBAAwB,OAAO,QAAQ,CAAC,qBAAqB,IAAI,OAAO,IAAI,GAAG;AACjF,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN;AAAA,QACA,SAAS,UAAU,SAAS,uCAAuC,OAAO,IAAI,iBAAiB,CAAC,GAAG,oBAAoB,EAAE,KAAK,IAAI,CAAC;AAAA,QACnI,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,UAAU;AACnB,iBAAW,QAAQ,OAAO,UAAU;AAClC,YAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC5B,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN;AAAA,YACA,SAAS,UAAU,SAAS,wCAAwC,KAAK,IAAI;AAAA,YAC7E,SAAS,KAAK;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,SACG,OAAO,SAAS,cAAc,OAAO,SAAS,oBAAoB,OAAO,SAAS,mBAClF,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,MAC9C,CAAC,wBAAwB,WAAW,MAAM,GAC1C;AACA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN;AAAA,QACA,SAAS,UAAU,SAAS,UAAU,OAAO,IAAI;AAAA,MACnD,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,cAAc,uBAAuB,MAAM;AACjD,aAAW,cAAc,aAAa;AACpC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,WAAW,WAAW,OAAO,CAAC,KAAK;AAAA,MACnC,SAAS,WAAW;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,uBAAuB,MAAM;AAChD,aAAW,aAAa,YAAY;AAClC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,WAAW,UAAU,OAAO,CAAC,KAAK;AAAA,MAClC,SAAS,UAAU;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAGA,SAAS,wBACP,iBACA,QACS;AACT,aAAW,UAAU,OAAO,OAAO,MAAM,GAAG;AAC1C,QAAI,OAAO,OAAO;AAChB,iBAAW,QAAQ,OAAO,OAAO;AAC/B,YAAI,KAAK,KAAK,SAAS,eAAe,GAAG,QAAS,QAAO;AACzD,YAAI,KAAK,MAAM,SAAS,eAAe,GAAG,QAAS,QAAO;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC3JA,IAAAC,gBAAkB;;;ACKX,SAAS,gBACd,OACA,YACe;AACf,SAAO,MAAM,OAAO,UAAQ;AAC1B,QAAI,CAAC,KAAK,YAAa,QAAO;AAC9B,WAAO,kBAAkB,KAAK,aAAa,UAAU;AAAA,EACvD,CAAC;AACH;AAEO,SAAS,cACd,MACA,aACU;AACV,MAAI,CAAC,YAAa,QAAO,KAAK;AAC9B,SAAO,KAAK,OAAO,OAAO,eAAa;AACrC,UAAM,QAAQ,YAAY,SAAS;AACnC,WAAO,CAAC,OAAO;AAAA,EACjB,CAAC;AACH;AAEO,SAAS,kBACd,OACA,YACU;AACV,QAAM,eAAe,gBAAgB,OAAO,UAAU;AACtD,SAAO,aAAa,QAAQ,UAAQ,KAAK,MAAM;AACjD;AAEO,SAAS,mBACd,MACA,QACU;AACV,SAAO,KAAK,OAAO,OAAO,eAAa,aAAa,MAAM;AAC5D;AAEO,SAAS,YACd,MACA,QACS;AACT,SAAO,mBAAmB,MAAM,MAAM,EAAE,WAAW;AACrD;AAEO,SAAS,aACd,OACA,QACQ;AACR,SAAO,MAAM,UAAU,OAAK,EAAE,OAAO,MAAM;AAC7C;;;ADuBI,IAAAC,sBAAA;AAxCG,IAAM,aAAyC,CAAC,UAAU;AAC/D,QAAM;AAAA,IACJ;AAAA,IAAc;AAAA,IAAY;AAAA,IAAa;AAAA,IACvC;AAAA,IAAmB;AAAA,IAAsB;AAAA,IAAkB;AAAA,IAAc;AAAA,EAC3E,IAAI;AAEJ,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,cAAAC,QAAM,SAAS,CAAC;AAEhE,QAAM,eAAe,cAAAA,QAAM;AAAA,IACzB,MAAM,gBAAgB,aAAa,OAAO,UAAU;AAAA,IACpD,CAAC,aAAa,OAAO,UAAU;AAAA,EACjC;AAEA,QAAM,cAAc,aAAa,gBAAgB;AACjD,QAAM,gBAAgB,cAAc,cAAc,aAAa,WAAW,IAAI,CAAC;AAC/E,QAAM,YAAY,mBAAmB,aAAa,SAAS;AAC3D,QAAM,YAAY,mBAAmB;AAErC,QAAM,WAAW,cAAAA,QAAM,YAAY,CAAC,UAAkB;AACpD,QAAI,SAAS,KAAK,QAAQ,aAAa,QAAQ;AAC7C,UAAI,aAAa,wBAAwB,UAAU,aAAa;AAC9D,YAAI,CAAC,YAAY,aAAa,MAAM,EAAG;AAAA,MACzC;AACA,YAAM,YAAY;AAClB,0BAAoB,KAAK;AACzB,qBAAe,WAAW,KAAK;AAC/B,8BAAwB,WAAW,KAAK;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,aAAa,QAAQ,kBAAkB,aAAa,sBAAsB,QAAQ,aAAa,cAAc,qBAAqB,CAAC;AAEvI,QAAM,SAAS,cAAAA,QAAM,YAAY,MAAM;AAAE,QAAI,UAAW,UAAS,mBAAmB,CAAC;AAAA,EAAG,GAAG,CAAC,WAAW,kBAAkB,QAAQ,CAAC;AAClI,QAAM,SAAS,cAAAA,QAAM,YAAY,MAAM;AAAE,QAAI,UAAW,UAAS,mBAAmB,CAAC;AAAA,EAAG,GAAG,CAAC,WAAW,kBAAkB,QAAQ,CAAC;AAElI,QAAM,mBAAmB,cACrB,GAAG,YAAY,OAAO,mBAAmB,GAAG,aAAa,MAAM,CAAC,GAAG,YAAY,QAAQ,KAAK,YAAY,KAAK,KAAK,EAAE,KACpH;AAEJ,MAAI,CAAC,YAAa,QAAO;AAEzB,SACE,8CAAC,SAAI,WAAU,eAAc,MAAK,SAAQ,cAAY,YAAY,YAChE;AAAA,iDAAC,SAAI,MAAK,UAAS,aAAU,UAAS,WAAU,WAAU,OAAO,EAAE,UAAU,YAAY,OAAO,OAAO,QAAQ,OAAO,SAAS,GAAG,QAAQ,QAAQ,UAAU,UAAU,MAAM,oBAAoB,YAAY,UAAU,QAAQ,EAAE,GAAG,eAAY,2BAC5O,4BACH;AAAA,IACC,mBAAmB,EAAE,MAAM,aAAa,WAAW,kBAAkB,YAAY,aAAa,OAAO,CAAC;AAAA,IACvG,6CAAC,SAAI,WAAU,uBAAsB,gBAAa,QAC/C,4BAAkB,aAAa,GAClC;AAAA,IACC,uBAAuB,EAAE,OAAO,cAAc,kBAAkB,UAAU,WAAW,WAAW,QAAQ,OAAO,CAAC;AAAA,KACnH;AAEJ;;;AEvFA,IAAAC,gBAAkB;AAClB,6BAA8C;AAiC1C,IAAAC,sBAAA;AAtBG,IAAM,aAAyC,CAAC,UAAU;AAC/D,QAAM,EAAE,WAAW,QAAQ,YAAY,gBAAgB,IAAI;AAC3D,QAAM,EAAE,QAAQ,QAAI,uCAAe;AACnC,QAAM,EAAE,QAAQ,QAAQ,OAAO,QAAI,sCAAc,EAAE,SAAS,MAAM,UAAU,CAAC;AAE7E,QAAM,SAAS,OAAO,WAAW,OAAO,SAAS,OAAO,WAAW;AACnE,QAAM,YAAY,OAAO,WAAW,OAAO,SAAS,OAAO,WAAW;AAEtE,QAAM,eAAe,cAAAC,QAAM,YAAY,MAAM;AAC3C,QAAI,OAAQ,QAAO,CAAC,CAAC;AAAA,EACvB,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,QAAM,eAAe,cAAAA,QAAM,YAAY,CAAC,UAAkB;AACxD,QAAI,UAAW,QAAO,KAAK;AAAA,EAC7B,GAAG,CAAC,WAAW,MAAM,CAAC;AAEtB,QAAM,iBAAiB,cAAAA,QAAM;AAAA,IAC3B,MAAM,OAAO,QAAQ,OAAO,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,IAClD,CAAC,OAAO,KAAK;AAAA,EACf;AAEA,SACE,8CAAC,SAAI,WAAU,eAAc,MAAK,SAAQ,cAAY,OAAO,SAAS,WACnE;AAAA,WAAO,IAAI,CAAC,OAAO,UAClB,6CAAC,SAAmB,WAAU,oBAAmB,MAAK,SAAQ,cAAY,YAAY,YAAY,QAAQ,GAAG,OAAO,QAAQ,OAAO,SAAS,SAAS,GAClJ;AAAA,MACC,eAAe,IAAI,UAAQ,GAAG,SAAS,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,MAC1D;AAAA,MACA,MAAM,aAAa,KAAK;AAAA,IAC1B,KALQ,MAAM,EAMhB,CACD;AAAA,IACA,kBAAkB,cAAc,MAAM;AAAA,KACzC;AAEJ;;;AC9CA,IAAAC,iBAAkB;AAClB,IAAAC,0BAAiD;;;ACFjD,IAAAC,gBAAgC;AAwBzB,SAAS,iBAAiB,WAAiD;AAChF,QAAM,oBAAgB,sBAAO,KAAK,IAAI,CAAC,EAAE;AACzC,QAAM,iBAAa,sBAA+B,CAAC,CAAC;AACpD,QAAM,mBAAe,sBAAO,SAAS;AACrC,eAAa,UAAU;AAEvB,aAAO,uBAAwB,OAAO;AAAA,IACpC;AAAA,IAEA,gBAAgB,WAAmB;AACjC,iBAAW,QAAQ,SAAS,IAAI,KAAK,IAAI;AACzC,mBAAa,SAAS,eAAe,SAAS;AAAA,IAChD;AAAA,IAEA,eAAe,WAAmB;AAChC,YAAM,QAAQ,WAAW,QAAQ,SAAS;AAC1C,YAAM,cAAc,QAAQ,KAAK,IAAI,IAAI,QAAQ;AACjD,aAAO,WAAW,QAAQ,SAAS;AACnC,mBAAa,SAAS,cAAc,WAAW,WAAW;AAAA,IAC5D;AAAA,IAEA,iBAAiB,WAAmB,UAAmB,UAAmB;AACxE,mBAAa,SAAS,gBAAgB,WAAW,UAAU,QAAQ;AAAA,IACrE;AAAA,IAEA,qBAAqB,WAAmB,QAAkB;AACxD,mBAAa,SAAS,oBAAoB,WAAW,MAAM;AAAA,IAC7D;AAAA,IAEA,gBAAgB,QAAiC;AAC/C,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,mBAAa,SAAS,eAAe,QAAQ,UAAU;AAAA,IACzD;AAAA,IAEA,qBAAqB,cAAwB,qBAA+B;AAC1E,mBAAa,SAAS,oBAAoB,cAAc,mBAAmB;AAAA,IAC7E;AAAA,IAEA,sBAAsB,UAAkB,QAAgB;AACtD,mBAAa,SAAS,qBAAqB,UAAU,MAAM;AAAA,IAC7D;AAAA,IAEA,mBAAmB,OAAwE;AACzF,mBAAa,SAAS,kBAAkB,KAAK;AAAA,IAC/C;AAAA,EACF,IAAI,CAAC,aAAa,CAAC;AACrB;;;ACtEA,IAAAC,gBAAkB;AAClB,IAAAC,0BAA+B;;;ACA/B,IAAAC,gBAAkB;AAClB,IAAAC,0BAA2C;;;ACF3C,IAAAC,gBAAkB;AA8CG,IAAAC,sBAAA;AAnBd,IAAM,eAAqF,cAAAC,QAAM,KAAK,CAC3G,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IAAI,UAAAC;AAAA,IAAU;AAAA,IAAO;AAAA,IAAY;AAAA,IAAa;AAAA,IAC9C;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAAmB;AAAA,IACnD;AAAA,IAAW;AAAA,IAAiB;AAAA,IAC5B;AAAA,IAAgB;AAAA,IAAyB;AAAA,IACzC;AAAA,IAAa;AAAA,IAAa;AAAA,EAC5B,IAAI;AAEJ,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,iBAAiB,GAAG,EAAE;AAC5B,QAAM,WAAY,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC,MAAM,QAAQ;AAElF,QAAM,eACJ,8CAAC,SAAI,WAAW,kBAAkB,IAChC;AAAA,kDAAC,WAAM,IAAI,SAAS,SAAS,IAAI,WAAU,eACxC;AAAA;AAAA,MACAA,aAAY,8EAAE;AAAA,qDAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO,OAAO,EAAE,OAAO,oCAAoC,GAAG,gBAAE;AAAA,QAAO,6CAAC,UAAK,WAAU,WAAU,OAAO,EAAE,UAAU,YAAY,OAAO,OAAO,QAAQ,OAAO,SAAS,GAAG,QAAQ,QAAQ,UAAU,UAAU,MAAM,oBAAoB,YAAY,UAAU,QAAQ,EAAE,GAAG,yBAAW;AAAA,SAAO;AAAA,OAC9V;AAAA,IACC;AAAA,IACA,CAAC,2BAA2B,kBAC3B,6CAAC,UAAK,WAAU,mBAAkB,OAAO,gBAAgB,oBAAO;AAAA,KAEpE;AAGF,QAAM,wBACJ,6CAAC,SAAI,WAAU,WACZ,kBACC,8EACE;AAAA,iDAAC,UAAK,WAAU,cAAa,eAAY,QAAO,OAAO,EAAE,OAAO,iCAAiC,GAAG,oBAAQ;AAAA,IAC5G,6CAAC,UAAK,WAAU,iBAAgB,IAAI,gBAAgB,MAAK,SAAQ,OAAO,EAAE,OAAO,iCAAiC,GAC/G,gBAAM,WAAW,SACpB;AAAA,KACF,IACE,cACF,8EACE;AAAA,iDAAC,UAAK,WAAU,gBAAe,eAAY,QAAO,OAAO,EAAE,OAAO,mCAAmC,GAAG,oBAAO;AAAA,IAC/G,8CAAC,UAAK,WAAU,mBAAkB,IAAI,gBAAgB,MAAK,UAAS,OAAO,EAAE,OAAO,mCAAmC,GACpH;AAAA,OAAC,eAAe,YAAY,kBAAkB,YAAY;AAAA,MAAY;AAAA,MAAG,GAAG,UAAU,IAAI,YAAY,SAAS;AAAA,MAAG;AAAA,OACrH;AAAA,KACF,IACE,SACF,8EACE;AAAA,iDAAC,UAAK,WAAU,gBAAe,eAAY,QAAO,OAAO,EAAE,OAAO,kCAAkC,GAAG,oBAAO;AAAA,IAC9G,6CAAC,UAAK,WAAU,gBAAe,IAAI,gBAAgB,MAAK,UAAS,OAAO,EAAE,OAAO,kCAAkC,GAChH,sBAAY,QACf;AAAA,KACF,IACE,6EAAE,GACR;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,cAAc,oBAAoB,YAAY,EAAE,IAAI,sBAAsB,EAAE,IAAI,SAAS,WAAW,EAAE;AAAA,MACjH,aAAW,SAAS,SAAS;AAAA,MAE5B;AAAA,sBAAc,YAAY,EAAE,IAAI,MAAM,IAAI,SAAS,OAAO,UAAAA,UAAS,CAAC,IAAI;AAAA,QACzE,6CAAC,SAAI,WAAW,4CAA4C,kBAAkB,EAAE,IAC7E,mBAAS,IAAI,CAAC,OAAO,UAAU;AAC9B,cAAI,SAAS,MAAM,OAAO;AACxB,kBAAM,aAAsC;AAAA,cAC1C;AAAA,cACA,mBAAmB,YAAY,SAAY;AAAA,cAC3C,cAAc,aAAa;AAAA,cAC3B,iBAAiBA;AAAA,cACjB,gBAAgB,CAAC,CAAC;AAAA,cAClB,oBAAoB;AAAA,cACpB,KAAK;AAAA,cACL,WAAW,MAAM,MAAM;AAAA,YACzB;AACA,gBAAI,mBAAmB,CAAC,OAAO;AAC7B,yBAAW,kBAAkB,IAAI;AAAA,YACnC;AACA,gBAAI,UAAU,GAAG;AACf,qBAAO,cAAAD,QAAM,aAAa,OAAO,UAAU;AAAA,YAC7C;AACA,kBAAM,eAAwC;AAAA,cAC5C,KAAK;AAAA,cACL,mBAAmB,WAAW,iBAAiB;AAAA,cAC/C,cAAc,WAAW,YAAY;AAAA,cACrC,iBAAiB,WAAW,eAAe;AAAA,cAC3C,gBAAgB,WAAW,cAAc;AAAA,cACzC,oBAAoB,WAAW,kBAAkB;AAAA,cACjD,WAAW,MAAM,MAAM;AAAA,YACzB;AACA,gBAAI,WAAW,kBAAkB,GAAG;AAClC,2BAAa,kBAAkB,IAAI,WAAW,kBAAkB;AAAA,YAClE;AACA,mBAAO,cAAAA,QAAM,aAAa,OAAO,YAAY;AAAA,UAC/C;AACA,iBAAO,6CAAC,cAAAA,QAAM,UAAN,IAAoB,KAAO;AAAA,QACrC,CAAC,GACH;AAAA,QACC,cACG,YAAY,EAAE,IAAI,MAAM,IAAI,OAAO,WAAW,CAAC,IAC/C,eACE,aAAa,EAAE,IAAI,MAAM,IAAI,QAAQ,aAAa,YAAY,aAAa,CAAC,IAC5E;AAAA;AAAA;AAAA,EACR;AAEJ,CAAC;;;AC7HD,IAAM,eAAoC,oBAAI,IAAI;AAClD,IAAI,qBAAkC,oBAAI,IAAI;AAC9C,IAAI,wBAAqC,oBAAI,IAAI;AACjD,IAAI,mBAAmB;AAKhB,SAAS,YAAY,WAAyB;AACnD,eAAa,IAAI,YAAY,aAAa,IAAI,SAAS,KAAK,KAAK,CAAC;AAClE,wBAAsB,IAAI,SAAS;AACrC;AAKO,SAAS,mBAAyB;AACvC,uBAAqB;AACrB,0BAAwB,oBAAI,IAAI;AAChC;AACF;AAKO,SAAS,kBAAuC;AACrD,SAAO,IAAI,IAAI,YAAY;AAC7B;AAKO,SAAS,wBAAqC;AACnD,SAAO,IAAI,IAAI,kBAAkB;AACnC;AAKO,SAAS,sBAA8B;AAC5C,SAAO;AACT;AAKO,SAAS,qBAA2B;AACzC,eAAa,MAAM;AACnB,qBAAmB,MAAM;AACzB,wBAAsB,MAAM;AAC5B,qBAAmB;AACrB;;;AFeqD,IAAAE,sBAAA;AAzBrD,IAAM,cAAc,CAAC,UAA6B;AAChD,QAAM;AAAA,IACJ;AAAA,IAAM;AAAA,IAAW;AAAA,IAAU;AAAA,IAAY;AAAA,IACvC;AAAA,IAAQ,UAAAC;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAS;AAAA,IAAgB;AAAA,IAC/D;AAAA,IAAgB;AAAA,IAAkB;AAAA,IAClC;AAAA,IAAe;AAAA,IAAU;AAAA,IAAY;AAAA,IACrC;AAAA,IAAO;AAAA,IAAoB;AAAA,IAAc;AAAA,IACzC;AAAA,IAAa;AAAA,IAAa;AAAA,IAC1B;AAAA,IAAa;AAAA,IAAa;AAAA,IAAc;AAAA,EAC1C,IAAI;AAEJ,QAAM,EAAE,eAAe,IAAI,wBAAwB;AACnD,QAAM,EAAE,SAAS,UAAU,QAAI,wCAAe;AAC9C,QAAM,mBAAmB,cAAAC,QAAM,OAAgB,MAAS;AAExD,gBAAAA,QAAM,UAAU,MAAM;AACpB,gBAAY,SAAS;AAAA,EACvB,CAAC;AAED,QAAM,aAAa,YAAY;AAC/B,QAAM,iBAAiB,GAAG,SAAS;AAEnC,QAAM,iBAAiB,cAAAA,QAAM,QAAQ,MAAM;AACzC,UAAM,aAAa,YAAa,eAAe,OAAO,kBAAkB,KAAM,CAAC,OAAO,kBAAkB,KAAK,CAAC;AAE9G,QAAK,YAAY,gBAAiB,OAAQ,QAAO,6EAAE;AAEnD,QAAI,CAAC,QAAQ,cAAc,KAAK,eAAe,IAAI,GAAG;AACpD,YAAM,OAAO,eAAe,IAAI;AAChC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,YACL,UAAUD,aAAY,SAAS,eAAe,UAAU,CAAC,aACrD,EAAE,OAAO,MAAM,SAAS,YAAY,SAAS,IAC7C;AAAA,YACJ,UAAU,OAAO,UAAU;AACzB,kBAAI,CAAC,YAAY,SAAS,WAAW,KAAK,cAAc,CAAC,MAAO,QAAO;AAEvE,oBAAM,aAAiC,EAAE,SAAS;AAClD,oBAAM,YAAY,0BAA0B,OAAO,WAAW,UAAU,GAAG,UAAU;AACrF,kBAAI,UAAW,QAAO;AACtB,qBAAO,+BAA+B,OAAO,WAAW,UAAU,GAAG,UAAU;AAAA,YACjF;AAAA,UACF;AAAA,UACA,QAAQ,CAAC;AAAA,YACP,OAAO,EAAE,MAAM;AAAA,YACf,YAAY,EAAE,OAAO,QAAQ;AAAA,YAC7B,WAAW,EAAE,cAAc,oBAAoB,OAAO;AAAA,UACxD,MAAM;AACJ,kBAAM,aAAa,SAAS,OAAO,KAAK,MAAM,EAAE,SAAS;AACzD,kBAAM,SAAS,YAAY,gBAAgB;AAC3C,kBAAM,cAAc,WAAW,aAAa,KAAK,CAAC,gBAAgB,CAAC;AACnE,gBAAI,SAAS,WAAW;AACtB,wBAAU,qBAAqB,WAAW,CAAC,MAAM,WAAW,OAAO,CAAC;AAAA,YACtE;AACA,gBAAI,iBAAiB,YAAY,UAAa,iBAAiB,YAAY,SAAS,WAAW;AAC7F,wBAAU,iBAAiB,WAAW,iBAAiB,SAAS,KAAK;AAAA,YACvE;AACA,6BAAiB,UAAU;AAC3B,mBAAO,SAAS,oBACd,6EAAG,wBAAAC,QAAM,aAAa,MAAM,EAAE,MAAM,CAAC,GAAE,IACrC,UAAU,YAAY,OAAO,KAAK,KAAK,CAAC,aAC1C;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,UAAUD;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,gBAAe;AAAA,gBACf;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBAEC,wBAAAC,QAAM,aAAa,MAAM;AAAA,kBACxB;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UAAU;AAAA,kBACV,UAAAD;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,SAAS,YAAY,MAAM,UAAU,gBAAgB,SAAS,IAAI;AAAA,kBAClE,QAAQ,YAAY,MAAM,UAAU,eAAe,SAAS,IAAI;AAAA,gBAClE,CAAC;AAAA;AAAA,YACH,IACE,6EAAE;AAAA,UACR;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,UAAM,YAAY,CAAC,QAAQ,cAAc,IAAI,OAAO,KAAK,cAAc,EAAE,KAAK,IAAI,IAAI;AACtF,WACE,8CAAC,SAAI,OAAO,EAAE,OAAO,OAAO,UAAU,UAAU,SAAS,MAAM,GAAG;AAAA;AAAA,MACvC;AAAA,MAAK;AAAA,MAAwB;AAAA,MAAU;AAAA,MAAqB;AAAA,MAAU;AAAA,OACjG;AAAA,EAEJ,GAAG;AAAA,IAAC;AAAA,IAAM;AAAA,IAAQA;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAS;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IAC7G;AAAA,IAAW;AAAA,IAAgB;AAAA,IAAO;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAa;AAAA,IAAa;AAAA,IAC9E;AAAA,IAAU;AAAA,IAAc;AAAA,IAAc;AAAA,IACtC;AAAA,IAAU;AAAA,IAAY;AAAA,IAAa;AAAA,IAAgB;AAAA,IACnD;AAAA,IAAgB;AAAA,IAAW;AAAA,IAAS;AAAA,IAAW;AAAA,EAAa,CAAC;AAE/D,SAAO;AACT;AAEA,IAAO,sBAAQ,cAAAC,QAAM,KAAK,WAAW;;;ADvFvB,IAAAC,sBAAA;AAlEd,SAAS,qBAAqB,WAAuC;AACnE,QAAM,WAAW;AACjB,SAAO,MAAM,KAAK,UAAU,iBAA8B,QAAQ,CAAC;AACrE;AAEA,IAAM,qBAAqB,CAAC,UAAoC;AAC9D,QAAM;AAAA,IACJ;AAAA,IAAQ;AAAA,IAAY;AAAA,IAAU;AAAA,IAAY;AAAA,IAC1C;AAAA,IAAQ;AAAA,IAAoB;AAAA,IAC5B;AAAA,IAA0B;AAAA,EAC5B,IAAI;AAEJ,QAAM,EAAE,UAAU,QAAQ,QAAI,wCAAe;AAC7C,QAAM,EAAE,WAAW,IAAI,sBAAsB;AAE7C,QAAM,YAAY,cAAAC,QAAM,OAA0B,IAAI;AACtD,QAAM,uBAAuB,cAAAA,QAAM,OAAuB,IAAI;AAC9D,QAAM,gBAAgB,cAAAA,QAAM,OAA0B,IAAI;AAE1D,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,UAAU,UAAU,WAAW,CAAC,UAAU,QAAQ,MAAM;AAC1D,2BAAqB,UAAU,SAAS;AACxC,gBAAU,QAAQ,UAAU;AAC5B,oBAAc,SAAS,MAAM;AAAA,IAC/B,WAAW,CAAC,UAAU,UAAU,SAAS,MAAM;AAC7C,gBAAU,QAAQ,MAAM;AACxB,UAAI,qBAAqB,mBAAmB,YAAa,sBAAqB,QAAQ,MAAM;AAC5F,2BAAqB,UAAU;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,gBAAAA,QAAM,UAAU,MAAM;AACpB,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,eAAe,CAAC,MAAa;AAAE,QAAE,eAAe;AAAG,+BAAyB;AAAA,IAAG;AACrF,WAAO,iBAAiB,UAAU,YAAY;AAC9C,WAAO,MAAM;AAAE,aAAO,oBAAoB,UAAU,YAAY;AAAA,IAAG;AAAA,EACrE,GAAG,CAAC,wBAAwB,CAAC;AAE7B,QAAM,gBAAgB,cAAAA,QAAM,YAAY,CAAC,MAA8C;AACrF,QAAI,EAAE,QAAQ,SAAS,CAAC,UAAU,QAAS;AAC3C,UAAM,oBAAoB,qBAAqB,UAAU,OAAO;AAChE,QAAI,kBAAkB,WAAW,EAAG;AACpC,UAAM,QAAQ,kBAAkB,CAAC;AACjC,UAAM,OAAO,kBAAkB,kBAAkB,SAAS,CAAC;AAC3D,QAAI,EAAE,UAAU;AACd,UAAI,SAAS,kBAAkB,OAAO;AAAE,UAAE,eAAe;AAAG,aAAK,MAAM;AAAA,MAAG;AAAA,IAC5E,OAAO;AACL,UAAI,SAAS,kBAAkB,MAAM;AAAE,UAAE,eAAe;AAAG,cAAM,MAAM;AAAA,MAAG;AAAA,IAC5E;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,6BAA6B,CAAC,WAAmB,eAAwB;AAC7E,YAAQ;AACR,aAAS,GAAG,SAAS,IAAa,YAAY,EAAE,aAAa,KAAK,CAAC;AAAA,EACrE;AAEA,QAAM,UACJ,6CAAC,SAAI,WAAU,mBACb,uDAAC,SAAI,WAAU,qBACb,uDAAC,UAAK,WAAU,oBACb,8BAAoB,IAAI,uBAAqB;AAC5C,UAAM,aAAa,WAAW,QAAQ,UAAU,GAAG,YAAY,iBAAiB;AAChF,UAAM,cAAc,OAAO,iBAAiB;AAC5C,QAAI,CAAC,cAAc,CAAC,YAAa,QAAO;AACxC,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,WAAW,QAAQ;AAAA,QACzB,UAAQ;AAAA,QACR,SAAS,WAAW;AAAA,QACpB,UAAU,WAAW;AAAA,QACrB,cAAY;AAAA,QACZ,eAAe;AAAA,QACf,OAAO,YAAY;AAAA,QACnB,oBAAkB;AAAA,QAClB,cAAc,YAAY;AAAA,QAC1B,QAAQ,YAAY;AAAA;AAAA,MAdf,GAAG,iBAAiB,IAAI,QAAQ;AAAA,IAevC;AAAA,EAEJ,CAAC,GACH,GACF,GACF;AAGF,MAAI,cAAc;AAChB,WAAO,aAAa,EAAE,QAAQ,CAAC,CAAC,QAAQ,QAAQ,wBAAwB,UAAU,0BAA0B,UAAU,QAAQ,CAAC;AAAA,EACjI;AAEA,SACE,8CAAC,YAAO,KAAK,WAAW,WAAU,YAAW,MAAK,UAAS,cAAW,QAAO,cAAY,YAAY,SAAS,WAAW,eACtH;AAAA;AAAA,IACD,8CAAC,SAAI,WAAU,oBACb;AAAA,mDAAC,YAAO,MAAK,UAAS,KAAK,eAAe,SAAS,wBAAyB,sBAAY,MAAK;AAAA,MAC7F,6CAAC,YAAO,MAAK,UAAS,SAAS,0BAA2B,sBAAY,QAAO;AAAA,OAC/E;AAAA,KACF;AAEJ;AAEA,IAAO,6BAAQ;;;AI7Hf,IAAAC,iBAAkB;AAClB,IAAAC,0BAA+B;;;ACD/B,IAAAC,gBAAkB;AAoCR,IAAAC,sBAAA;AAvBH,IAAM,oBAAN,cAAgC,cAAAC,QAAM,UAA4D;AAAA,EACvG,YAAY,OAAgC;AAC1C,UAAM,KAAK;AAYb,sBAAa,MAAY;AACvB,WAAK,SAAS,EAAE,UAAU,OAAO,OAAO,KAAK,CAAC;AAAA,IAChD;AAbE,SAAK,QAAQ,EAAE,UAAU,OAAO,OAAO,KAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,yBAAyB,OAAuC;AACrE,WAAO,EAAE,UAAU,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,kBAAkB,OAAc,WAAkC;AAChE,SAAK,MAAM,UAAU,OAAO,SAAS;AAAA,EACvC;AAAA,EAMA,SAA0B;AACxB,QAAI,KAAK,MAAM,YAAY,KAAK,MAAM,OAAO;AAC3C,UAAI,KAAK,MAAM,SAAU,QAAO,KAAK,MAAM,SAAS,KAAK,MAAM,OAAO,KAAK,UAAU;AACrF,aACE,8CAAC,SAAI,WAAU,uBAAsB,MAAK,SACxC;AAAA,sDAAC,UAAK,WAAU,0BAAyB;AAAA;AAAA,UAAuB,KAAK,MAAM,MAAM;AAAA,WAAQ;AAAA,QACzF,6CAAC,YAAO,WAAU,wBAAuB,SAAS,KAAK,YAAY,MAAK,UAAS,mBAAK;AAAA,SACxF;AAAA,IAEJ;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ADyCM,IAAAC,sBAAA;AAlDC,IAAM,aAAa,CAAC,UAA4B;AACrD,QAAM;AAAA,IACJ;AAAA,IAAU;AAAA,IAAY;AAAA,IAAa;AAAA,IAAgB;AAAA,IACnD;AAAA,IAAY;AAAA,IAAe;AAAA,IAAY;AAAA,IAAS;AAAA,IAChD;AAAA,IAAW;AAAA,IAAQ;AAAA,IAAe;AAAA,IAAc;AAAA,IAAU;AAAA,IAC1D;AAAA,IAAkB;AAAA,IAAa;AAAA,IAAa;AAAA,IAAc;AAAA,EAC5D,IAAI;AAGJ,QAAM,CAAC,cAAc,eAAe,IAAI,eAAAC,QAAM,SAAoC,CAAC,CAAC;AAEpF,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,eAAAA,QAAM,SAAkC,CAAC,CAAC;AAEhG,QAAM,mBAAmB,eAAAA,QAAM,OAA+B,CAAC,CAAC;AAEhE,QAAM,EAAE,UAAU,QAAI,wCAAe;AAIrC,iBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,OAAQ;AACb,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,WAAW,MAAM;AACzD,UAAI,CAAC,YAAY,YAAa;AAC9B,YAAM,aAAa,YAAY,oBAAoB,CAAC,GAAG;AAAA,QACrD,CAAC,KAAK,QAAQ;AAAE,cAAI,GAAG,IAAI,UAAU,GAAG;AAAG,iBAAO;AAAA,QAAK;AAAA,QACvD,CAAC;AAAA,MACH;AACA,YAAM,WAAW,KAAK,UAAU,SAAS;AACzC,UAAI,iBAAiB,QAAQ,OAAO,MAAM,SAAU;AACpD,uBAAiB,QAAQ,OAAO,IAAI;AACpC,6BAAuB,WAAS,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,EAAE;AAC7D,kBAAY,YAAY,EAAE,SAAS,QAAQ,UAAU,EAAE,CAAC,EACrD,KAAK,aAAW;AACf,wBAAgB,WAAS,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ,EAAE;AAAA,MAC3D,CAAC,EACA,MAAM,MAAM;AAAA,MAEb,CAAC,EACA,QAAQ,MAAM;AACb,+BAAuB,WAAS,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,EAAE;AAAA,MAChE,CAAC;AAAA,IACL,CAAC;AAAA,EACH,CAAC;AAED,QAAM,iBAAiB,CAAC,eAAe,iBAAiB,kBAAkB,UAAa,cAAc;AACrG,QAAM,iBAAiB,kBAAkB,oBAAoB,GAAG,cAAc,CAAC,GAAG,WAAW,WAAW;AACxG,QAAM,aAAa,GAAG,WAAW,IAAI,UAAU,IAAI,QAAQ;AAE3D,SACE,6CAAC,SAAI,WAAW,qBAAqB,cAAc,IACjD;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,WAAW,cAAc,IAAI,UAAU,aAAa,EAAE;AAAA,MACjE,OAAO,kBAAkB,qBAAqB,EAAE,WAAW,GAAG,kBAAkB,KAAK,IAAI;AAAA,MACzF,eAAa,GAAG,WAAW,IAAI,UAAU,IAAI,QAAQ;AAAA,MAErD;AAAA,qDAAC,WAAM,MAAK,UAAS,IAAI,YAAY,MAAM,YAAY,eAAa,YAAY;AAAA,QAC/E,gBAAgB,IAAI,mBAAiB;AACpC,gBAAM,EAAE,WAAW,WAAW,IAAI;AAClC,gBAAM,aAAa,WAAW,YAAY,SAAS;AACnD,cAAI,CAAC,WAAY,QAAO,6CAAC,eAAAA,QAAM,UAAN,IAAoB,SAAW;AAExD,gBAAM,cAAc,OAAQ,SAAS;AACrC,iBACE,6CAAC,qBACC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,MAAM,WAAW,QAAQ;AAAA,cACzB,QAAQ,WAAW;AAAA,cACnB,UAAU,WAAW;AAAA,cACrB,UAAU,WAAW;AAAA,cACrB,SAAS,aAAa,SAAS,KAAK,WAAW;AAAA,cAC/C,gBAAgB,oBAAoB,SAAS,KAAK;AAAA,cAClD,UAAU,WAAW;AAAA,cACrB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAO,YAAY,SAAS,aAAa;AAAA,cACzC,oBAAoB,aAAa;AAAA,cACjC,cAAc,aAAa;AAAA,cAC3B,QAAQ,aAAa;AAAA,cACrB,aAAa,aAAa;AAAA,cAC1B,aAAa,aAAa;AAAA,cAC1B,UAAU,aAAa;AAAA,cACvB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF,KA/BsB,GAAG,SAAS,IAAI,QAAQ,OAgChD;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH,GACF;AAEJ;;;AN0MM,IAAAC,uBAAA;AA1RC,IAAM,aAAyC,CAAC,UAA+C;AACpG,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,SAAS,YAAY,UAAU,MAAM,gBAAgB,CAAC;AAC5D,QAAM,eAAe,YAAY;AACjC,QAAM,sBAAsB,cAAc,cAAc;AACxD,QAAM,uBAAuB,cAAc,iBAAiB;AAC5D,QAAM,sBAAsB,cAAc,kBAAkB;AAC5D,QAAM,wBAAwB,cAAc,qBAAqB;AACjE,QAAM,YAAY,iBAAiB,cAAc,SAAS;AAE1D,QAAM,WAAW,MAAM,WACnB,MAAM,WACN,MAA4B,QAAQ,QAAQ,CAAC,CAAgB;AAEjE,QAAM,EAAE,eAAe,oBAAoB,WAAW,IAAI,sBAAsB;AAEhF,QAAM,mBAAmB,eAAAC,QAAM,OAA2B,MAAS;AACnE,QAAM,cAAc,eAAAA,QAAM,OAAkD,MAAS;AACrF,QAAM,yBAAyB,eAAAA,QAAM,OAA4C,MAAS;AAC1F,QAAM,yBAAyB,eAAAA,QAAM,OAAoC,MAAS;AAClF,QAAM,CAAC,YAAY,aAAa,IAAI,eAAAA,QAAM,SAAkB,KAAK;AACjE,QAAM,CAAC,eAAe,gBAAgB,IAAI,eAAAA,QAAM,SAAkB;AAClE,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,eAAAA,QAAM,SAAkB,IAAI;AACpF,QAAM,CAAC,YAAY,aAAa,IAAI,eAAAA,QAAM,SAAiB;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAI,eAAAA,QAAM,SAAiB,EAAE;AAEnE,QAAM,kBAAc,iCAAQ,EAAE,MAAM,YAAY,cAAc,CAAC;AAC/D,QAAM,EAAE,OAAO,YAAY,cAAc,SAAS,UAAU,WAAW,UAAU,aAAa,UAAU,IAAI;AAE5G,QAAM,gBAAgB,eAAAA,QAAM,OAA0B,UAAU;AAChE,QAAM,eAAe,eAAAA,QAAM,OAA+B,EAAE,GAAG,UAAU,CAAC;AAC1E,QAAM,mBAAmB,eAAAA,QAAM,OAAkD,MAAS;AAC1F,QAAM,qBAAqB,eAAAA,QAAM,OAAiC,MAAS;AAC3E,QAAM,EAAE,SAAS,SAAS,aAAa,QAAQ,cAAc,mBAAmB,IAAI;AAEpF,iBAAAA,QAAM,UAAU,MAAM;AAAE,kBAAc,UAAU;AAAA,EAAY,GAAG,CAAC,UAAU,CAAC;AAC3E,iBAAAA,QAAM,UAAU,MAAM;AAAE,iBAAa,UAAU;AAAA,EAAW,GAAG,CAAC,SAAS,CAAC;AACxE,iBAAAA,QAAM,UAAU,MAAM;AAAE,aAAS,aAAa;AAAA,EAAG,GAAG,CAAC,oBAAoB,CAAC;AAG1E,iBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,YAAa;AAClB,WAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,WAAW,OAAO,MAAM;AAC5D,eAAS,WAAW,EAAE,MAAM,UAAU,QAAQ,CAAC;AAAA,IACjD,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,WAAW,CAAC,eAA4B;AAC5C,UAAM,EAAE,WAAW,aAAa,eAAe,IAAI,WAC/C,sBAAsB,YAAY,QAAQ,YAAY,gBAAgB,CAAC,GAAG,iBAAiB,IAAI,UAAU,aAAa,IACtH,oBAAoB,YAAY,QAAQ,YAAY,wBAAwB,OAAO,aAAa;AAEpG,qBAAiB,gBAAgB,YAAY,aAAa,qBAAqB,CAAC;AAChF,8BAA0B,YAAY,aAAa,gBAAgB,QAAQ;AAAA,EAC7E;AAEA,iBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,WAAW,QAAQ,UAAU,GAAG;AAClC,YAAM,MAAM,WAAW,QAAQ,UAAU;AACzC,gCAA0B,IAAI,aAAa,UAAU,GAAG,QAAQ;AAChE,yBAAmB,IAAI,aAAa,UAAU,GAAG,QAAQ;AACzD,2BAAqB;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,cAAc,eAAAA,QAAM,YAAY,MAAM;AAC1C,QAAI,YAAY,SAAS;AAAE,mBAAa,YAAY,OAAO;AAAG,kBAAY,UAAU;AAAA,IAAW;AAC/F,gBAAY,UAAU,WAAW,MAAM;AACrC,yBAAmB,UAAU;AAC7B,mBAAa,YAAY,OAAO;AAChC,kBAAY,UAAU;AAAA,IACxB,GAAG,kBAAkB,WAAW,GAAG;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,CAAC,WAAmB,YAAqB,UAAoB,YAAqB;AACtG,qBAAiB,UAAU;AAC3B,aAAS,GAAG,SAAS,IAAa,YAAY,EAAE,aAAa,CAAC,SAAS,CAAC;AACxE,YAAQ,SAAS;AACjB,uBAAmB,UAAU,GAAG,YAAY,WAAW,MAAM;AAC7D,QAAI,CAAC,YAAY,CAAC,qBAAqB;AAAE,kBAAY;AAAA,IAAG;AAAA,EAC1D;AAEA,QAAM,aAAa,eAAAA,QAAM,YAAY,MAAM;AAAE,uBAAmB,UAAU;AAAA,EAAG,GAAG,CAAC,CAAC;AAElF,QAAM,yBAAyB,MAAM;AACnC,YAAQ,EAAE,KAAK,CAAC,UAAmB;AACjC,UAAI,OAAO;AAAE,gCAAwB,IAAI;AAAG,oBAAY;AAAA,MAAG;AAAA,IAC7D,CAAC;AAAA,EACH;AAEA,QAAM,uBAAuB,MAAM;AACjC,UAAM,EAAE,aAAAC,aAAY,IAAI,aAAa;AACrC,UAAM,oBAAoB,cAAc;AACxC,UAAM,MAAM,kBAAkB,QAAQ,UAAU;AAChD,QAAI,CAAC,IAAK;AACV,UAAM,iBAAiB,+BAA+B,OAAO,KAAKA,YAAW,GAAG,IAAI,WAAW;AAC/F,QAAI,eAAe,SAAS,GAAG;AAC7B,qBAAe,QAAQ,QAAM;AAC3B,cAAM,SAAS,qBAAqB,GAAG,YAAY,UAAU,GAAG,GAAG,SAAS;AAC5E,iBAAS,GAAG,GAAG,SAAS,IAAa,QAAmB,EAAE,aAAa,KAAK,CAAC;AAAA,MAC/E,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,OAAO,aAAa,YAAa;AACrC,UAAM,gBAAgB,aAAa,QAAQ;AAC3C,UAAM,kBAAkB,OAAO,KAAK,aAAa;AACjD,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,UAAU,SAAS,eAAe,gBAAgB,CAAC,CAAC,KAAK,SAAS,cAA2B,UAAU,gBAAgB,CAAC,CAAC,IAAI;AACnI,UAAI,WAAW,OAAO,QAAQ,UAAU,WAAY,SAAQ,MAAM;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,UAAM,EAAE,aAAAA,aAAY,IAAI,aAAa;AACrC,UAAM,oBAAoB,cAAc;AACxC,UAAM,MAAM,kBAAkB,QAAQ,UAAU;AAChD,QAAI,KAAK,aAAa;AACpB,aAAO,KAAK,IAAI,WAAW,EAAE,QAAQ,eAAa;AAChD,YAAI,IAAI,YAAY,SAAS,GAAG,OAAQ,aAAY,SAAS;AAAA,MAC/D,CAAC;AAAA,IACH;AAEA,qBAAiB,YAAY,UAAU;AACvC,YAAQ,EAAE,KAAK,CAAC,UAAmB;AACjC,UAAI,CAAC,OAAO;AACV,sBAAc,IAAI;AAClB,yBAAiB,EAAE;AACnB,SAAC,OAAO,0BAA0B,cAAc,wBAAwB,YAAY,MAAM,gBAAgB,CAAC;AAAA,MAC7G,OAAO;AACL,cAAM,4BAA4B,uBAAuB,YAAY,SACjE,0BAA0B,OAAO,KAAKA,YAAW,GAAG,KAAK,eAAe,CAAC,CAAC,IAC1E;AAEJ,YAAI,6BAA6B,CAAC,QAAQ,0BAA0B,wBAAwB,MAAM,0BAA0B,qBAAqB,UAAU,KAAK,GAAG;AACjK,iCAAuB,UAAU;AACjC,kCAAwB,KAAK;AAC7B,2BAAiB,EAAE;AAAA,QACrB,WAAWA,gBAAe,OAAO,KAAKA,YAAW,EAAE,SAAS,GAAG;AAC7D,2BAAiB,YAAY,MAAM;AACnC,uBAAa,UAAU,EAAE;AACzB,iCAAuB,UAAU;AAAA,QACnC,OAAO;AACL,2BAAiB,EAAE;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,qBAAmB,UAAU;AAE7B,QAAM,aAAa,CAAC,SAAsB;AACxC,QAAI,uBAAuB,QAAS,wBAAuB,QAAQ,MAAM;AACzE,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,2BAAuB,UAAU;AACjC,UAAM,kBAAkB,OAAO,KAAK,aAAa,QAAQ,WAAW;AAEpE,UAAM,0BAA0B,OAAO,YAAmC;AACxE,UAAI,gBAAgB,OAAO,QAAS;AACpC,YAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,mBAAW,MAAM,OAAO,IAAI,MAAM,YAAY,WAAW,CAAC,GAAG,oBAAoB;AAAA,MACnF,CAAC;AACD,UAAI;AACF,cAAM,gBAAgB,MAAM,QAAQ,KAAK,CAAC,SAAS,MAAM,eAAe,GAAG,cAAc,CAAC;AAC1F,YAAI,gBAAgB,OAAO,QAAS;AACpC,yBAAiB,YAAY,KAAK;AAClC,kBAAU,gBAAgB,IAA+B;AACzD,YAAI,CAAC,SAAU,mBAAkB,eAAe,IAAI;AAAA,MACtD,SAAS,OAAO;AACd,YAAI,gBAAgB,OAAO,QAAS;AACpC,YAAI,UAAU,qBAAqB;AACjC,gBAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI;AACrC,gBAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,KAAK,CAAC;AACvD,cAAI,gBAAgB,OAAO,QAAS;AACpC,iBAAO,wBAAwB,UAAU,CAAC;AAAA,QAC5C;AACA,yBAAiB,YAAY,UAAU;AACvC,wBAAgB,QAAQ,WAAS;AAAE,mBAAS,OAAO,EAAE,MAAM,UAAU,SAAS,YAAY,UAAU,CAAC;AAAA,QAAG,CAAC;AACzG,sBAAc,GAAG,YAAY,SAAS,GAAG,QAAQ,KAAK,KAAK,KAAK,EAAE,EAAE;AAAA,MACtE;AAAA,IACF;AACA,4BAAwB,CAAC;AAAA,EAC3B;AAEA,QAAM,oBAAoB,CAAC,QAAqB,SAAsB;AACpE,UAAM,EAAE,aAAAA,aAAY,IAAI,aAAa;AACrC,UAAM,mBAAgC,CAAC;AACvC,WAAO,KAAKA,YAAW,EAAE,QAAQ,WAAS;AAAE,uBAAiB,KAAK,IAAI,UAAU,KAAK;AAAA,IAAG,CAAC;AACzF,UAAM,aAAa,gBAAiB,eAAe,UAAU,QAAQ,UAAU,KAAK,SAAU;AAC9F,UAAM,UAAU;AAChB,WAAO,KAAK,gBAAgB,EAAE,QAAQ,WAAS;AAC7C,UAAI,KAAK,UAAU,iBAAiB,KAAK,CAAC,MAAM,KAAK,UAAU,KAAK,KAAK,CAAC,GAAG;AAC3E,sBAAc,OAAO,iBAAiB,KAAK,GAAG,OAAO,kBAAkB,OAAO;AAAA,MAChF;AAAA,IACF,CAAC;AAAA,EACH;AAKA,QAAM,mBAAmB,eAAAD,QAAM,YAAY,MAAM;AAC/C,QAAI,CAAC,aAAc;AACnB,UAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU;AAEpD,QAAI,KAAK,aAAa;AACpB,aAAO,KAAK,IAAI,WAAW,EAAE,QAAQ,eAAa;AAChD,YAAI,IAAI,YAAY,SAAS,GAAG,OAAQ,aAAY,SAAS;AAAA,MAC/D,CAAC;AAAA,IACH;AACA,YAAQ,EAAE,KAAK,CAAC,UAAmB;AACjC,UAAI,CAAC,OAAO;AACV,sBAAc,IAAI;AAClB,SAAC,OAAO,0BAA0B,cAAc,wBAAwB,YAAY,MAAM,gBAAgB,CAAC;AAC3G,wBAAgB,aAAa,QAAQ,MAAM;AAAA,MAC7C,OAAO;AACL,cAAM,SAAS,YAAY,UAAU;AACrC,gBAAQ,QAAQ,aAAa,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,QAAgC,CAAC;AAAA,MACrF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,eAAe,YAAY,SAAS,WAAW,CAAC;AAElE,QAAM,iBAAiB,eAAAA,QAAM,YAAY,CAAC,UAAkB;AAC1D,QAAI,iBAAiB,QAAS,cAAa,iBAAiB,OAAO;AACnE,qBAAiB,UAAU,WAAW,MAAM,cAAc,KAAK,GAAG,GAAG;AAAA,EACvE,GAAG,CAAC,CAAC;AAEL,QAAM,2BAA2B,MAAM;AACrC,UAAM,UAAU,uBAAuB;AACvC,QAAI,WAAW,QAAQ,oBAAoB,QAAQ,iBAAiB,SAAS,GAAG;AAC9E,UAAI,QAAQ,yBAA0B,YAAW,QAAQ,wBAAwB;AACjF,UAAI,QAAQ,oBAAqB,SAAQ,oBAAoB,QAAQ,OAAK,WAAW,CAAC,CAAC;AACvF,eAAS,UAAU,GAAG,QAAQ,gBAAgB,EAAE,KAAK,mBAAiB,SAAS,aAAa,CAAC;AAAA,IAC/F,OAAO;AACL,YAAM;AACN,eAAS,UAAU,CAAC;AAAA,IACtB;AACA,4BAAwB,IAAI;AAC5B,2BAAuB,UAAU;AAAA,EACnC;AAEA,QAAM,SAAS,iBAAiB,CAAC,aAC5B,yBAAyB,cAAc,2BACxC;AAEJ,SACE,+CAAC,wCAAc,GAAG,aAAa,WAAW,EAAE,GAAG,YAAY,WAAW,SAAS,SAAS,aAAa,QAAQ,cAAc,mBAAmB,GAC5I;AAAA,kDAAC,SAAI,MAAK,UAAS,aAAU,UAAS,WAAU,WAAU,OAAO,EAAE,UAAU,YAAY,OAAO,OAAO,QAAQ,OAAO,SAAS,GAAG,QAAQ,QAAQ,UAAU,UAAU,MAAM,oBAAoB,YAAY,UAAU,QAAQ,EAAE,GAAG,eAAY,2BAC5O,yBACH;AAAA,IACC,gBACC,8CAAC,SAAI,WAAU,aACZ,8BAAoB,kBAAkB,EAAE,UAAU,eAAe,CAAC,IACjE,8CAAC,WAAM,MAAK,QAAO,aAAa,YAAY,cAAc,cAAY,YAAY,cAAc,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK,GAAG,WAAU,mBAAkB,GAEjL;AAAA,IAED,cAAc,WAAW,SAAS,KACjC,8CAAC,SAAI,WAAU,eAAc,MAAK,SAAQ,OAAO,EAAE,OAAO,kCAAkC,SAAS,OAAO,cAAc,MAAM,GAC7H,qBAAW,IAAI,CAAC,KAAK,MAAO,8CAAC,SAAY,WAAU,mBAAmB,iBAAhC,CAAoC,CAAO,GACpF;AAAA,IAEF,+CAAC,SAAI,WAAU,mBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,YAAY,QAAQ,UAAU,GAAG;AAAA,UAC7C;AAAA,UACA,WAAW,YAAY,QAAQ,UAAU;AAAA,UACzC;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MACC,kBACC,qBAAqB,mBAAmB,EAAE,YAAY,UAAU,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC,IAChG,8CAAC,YAAO,WAAU,iBAAgB,SAAS,MAAM,cAAc,CAAC,UAAU,GAAG,iBAAe,YAAY,eAAa,GAAG,WAAW,IAAI,UAAU,IAAI,QAAQ,gBAC1J,uBAAa,YAAY,UAAU,YAAY,QAClD;AAAA,MAGH,wBACC,mBAAmB,iBAAiB,EAAE,QAAQ,YAAY,SAAS,SAAS,aAAa,CAAC,IACxF,+CAAC,SAAI,WAAU,mBAAkB,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,KAAK,MAAM,GACvF;AAAA,sDAAC,YAAO,MAAK,UAAS,WAAU,eAAc,SAAS,YAAY,UAAU,CAAC,WAAW,cACtF,qBAAW,YAAY,SAAS,YAAY,MAC/C;AAAA,QACA,8CAAC,YAAO,MAAK,UAAS,WAAU,iBAAgB,SAAS,MAAM;AAAE,gBAAM;AAAG,mBAAS,aAAa;AAAA,QAAG,GAAG,UAAU,CAAC,WAAW,cACzH,sBAAY,QACf;AAAA,SACF;AAAA,MAGH,iBACC,qBAAqB,mBAAmB,EAAE,UAAU,kBAAkB,SAAS,SAAS,aAAa,CAAC,IACpG,8CAAC,SAAI,WAAU,qBAAoB,OAAO,EAAE,WAAW,OAAO,GAC5D,wDAAC,YAAO,MAAK,UAAS,WAAU,iBAAgB,SAAS,kBAAkB,UAAU,cAClF,sBAAY,MACf,GACF;AAAA,OAGN;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,2BAA2B,UAAa,CAAC;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoB,wBAAwB,SAAS,uBAAuB,CAAC;AAAA,QAC7E;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AQlaA,IAAAE,iBAAkB;AAqFR,IAAAC,uBAAA;AArEH,IAAM,eAA6C,CAAC,UAAU;AACnE,QAAM,EAAE,YAAY,WAAW,YAAY,YAAY,aAAa,UAAU,KAAK,IAAI;AAEvF,QAAM,CAAC,QAAQ,SAAS,IAAI,eAAAC,QAAM,SAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,IAAI,eAAAA,QAAM,SAAiB,OAAO;AAChE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,eAAAA,QAAM,SAAS,EAAE;AAC7D,QAAM,CAAC,cAAc,eAAe,IAAI,eAAAA,QAAM,SAA8B,MAAM;AAClF,QAAM,CAAC,EAAE,WAAW,IAAI,eAAAA,QAAM,WAAW,CAAC,MAAc,IAAI,GAAG,CAAC;AAEhE,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,cAAc,WAAW,eAAe,CAAC;AAC/C,QAAM,aAAa,OAAO,KAAK,WAAW;AAE1C,QAAM,kBAAkB,eAAAA,QAAM,QAAQ,MAAM;AAC1C,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACvD,UAAI,MAAM,iBAAiB,QAAQ;AACjC,cAAM,KAAK,GAAG,IAAI,OAAO,MAAM,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,MAC7D;AACA,UAAI,MAAM,iBAAiB,QAAQ;AACjC,cAAM,KAAK,GAAG,IAAI,iBAAiB,MAAM,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,MACvE;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,iBAAsC;AAAA,IAC1C,UAAU;AAAA,IAAS,QAAQ;AAAA,IAAG,OAAO;AAAA,IACrC,OAAO,SAAS,UAAU;AAAA,IAAQ,WAAW,SAAS,SAAS;AAAA,IAC/D,YAAY;AAAA,IAAW,OAAO;AAAA,IAAW,YAAY;AAAA,IAAa,UAAU;AAAA,IAC5E,QAAQ;AAAA,IAAM,qBAAqB;AAAA,IAAO,UAAU;AAAA,IAAU,WAAW;AAAA,EAC3E;AAEA,QAAM,WAAW,CAAC,YAA0C;AAAA,IAC1D,SAAS;AAAA,IAAW,QAAQ;AAAA,IAC5B,YAAY,SAAS,SAAS;AAAA,IAAe,OAAO,SAAS,SAAS;AAAA,IACtE,QAAQ;AAAA,IAAQ,cAAc,SAAS,sBAAsB;AAAA,IAC7D,YAAY;AAAA,IAAa,UAAU;AAAA,EACrC;AAEA,QAAM,UAA+B;AAAA,IACnC,WAAW;AAAA,IAAQ,SAAS;AAAA,IAAW,cAAc;AAAA,IACrD,YAAY;AAAA,IAAQ,OAAO;AAAA,IAAQ,UAAU;AAAA,EAC/C;AAEA,QAAM,UAA+B;AAAA,IACnC,SAAS;AAAA,IAAW,cAAc;AAAA,IAAkB,UAAU;AAAA,EAChE;AAEA,QAAM,WAAgC;AAAA,IACpC,SAAS;AAAA,IAAW,QAAQ;AAAA,IAAS,QAAQ;AAAA,IAC7C,YAAY;AAAA,IAAQ,OAAO;AAAA,IAAW,QAAQ;AAAA,IAC9C,YAAY;AAAA,IAAa,UAAU;AAAA,IAAQ,cAAc;AAAA,EAC3D;AAGA,QAAM,uBAAuB,MAAM;AACjC,UAAM,SAAS,gBAAgB;AAC/B,UAAM,eAAe,sBAAsB;AAC3C,UAAM,eAAe,oBAAoB;AACzC,UAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AACpF,UAAM,WAAW,QAAQ,SAAS,IAC9B,QAAQ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,MAAM,GAAG,CAAC,IAAI,QAAQ,SACrD;AAEJ,WACE,+CAAC,SACC;AAAA,qDAAC,SAAI,OAAO,EAAE,cAAc,OAAO,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GACnF;AAAA,uDAAC,UAAK;AAAA;AAAA,UAAoB,8CAAC,YAAO,OAAO,EAAE,OAAO,UAAU,GAAI,wBAAa;AAAA,WAAS;AAAA,QACtF,8CAAC,YAAO,OAAO,UAAU,SAAS,MAAM;AAAE,6BAAmB;AAAG,sBAAY;AAAA,QAAG,GAAG,mBAAK;AAAA,QACvF,8CAAC,YAAO,OAAO,UAAU,SAAS,MAAM,YAAY,GAAG,qBAAO;AAAA,SAChE;AAAA,MACC,QAAQ,WAAW,IAClB,8CAAC,SAAI,iCAAmB,IAExB,+CAAC,WAAM,OAAO,EAAE,OAAO,QAAQ,gBAAgB,WAAW,GACxD;AAAA,sDAAC,WACC,yDAAC,QACC;AAAA,wDAAC,QAAG,OAAO,SAAS,mBAAK;AAAA,UACzB,8CAAC,QAAG,OAAO,SAAS,qBAAO;AAAA,UAC3B,8CAAC,QAAG,OAAO,SAAS,wBAAU;AAAA,UAC9B,8CAAC,QAAG,OAAO,SAAS,iBAAG;AAAA,WACzB,GACF;AAAA,QACA,8CAAC,WACE,kBAAQ,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM;AACnC,gBAAM,QAAQ,QAAQ,WAAW;AACjC,gBAAM,kBAAkB,aAAa,IAAI,SAAS;AAClD,iBACE,+CAAC,QAAmB,OAAO,QAAQ,EAAE,YAAY,UAAU,IAAI,QAC7D;AAAA,0DAAC,QAAG,OAAO,SAAU,qBAAU;AAAA,YAC/B,8CAAC,QAAG,OAAO,EAAE,GAAG,SAAS,OAAO,QAAQ,YAAY,UAAU,GAAI,iBAAM;AAAA,YACxE,8CAAC,QAAG,OAAO,SAAU,4BAAkB,WAAW,IAAG;AAAA,YACrD,8CAAC,QAAG,OAAO,SAAU,kBAAQ,WAAW,IAAG;AAAA,eAJpC,SAKT;AAAA,QAEJ,CAAC,GACH;AAAA,SACF;AAAA,OAEJ;AAAA,EAEJ;AAGA,QAAM,oBAAoB,MAAM;AAE9B,UAAM,OAKD,CAAC;AAEN,QAAI,YAAY;AAEhB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACvD,YAAM,YAAY,MAAM,mBAAmB,CAAC;AAC5C,YAAM,aAAa,MAAM,mBAAmB,CAAC;AAG7C,YAAM,UAAoB,CAAC;AAC3B,UAAI,MAAM,OAAQ,SAAQ,KAAK,QAAQ;AACvC,UAAI,MAAM,SAAU,SAAQ,KAAK,UAAU;AAC3C,UAAI,MAAM,SAAU,SAAQ,KAAK,UAAU;AAC3C,UAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK,UAAU,SAAS,EAAG,SAAQ,KAAK,SAAS;AAC7F,UAAI,MAAM,cAAe,SAAQ,KAAK,UAAU;AAEhD,WAAK,KAAK,EAAE,MAAM,WAAW,YAAY,QAAQ,CAAC;AAAA,IACpD;AAGA,eAAW,OAAO,MAAM;AACtB,iBAAW,OAAO,IAAI,WAAW;AAC/B,cAAM,SAAS,KAAK,KAAK,OAAK,EAAE,SAAS,GAAG;AAC5C,YAAI,QAAQ,UAAU,SAAS,IAAI,IAAI,GAAG;AACxC,sBAAY;AACZ;AAAA,QACF;AAAA,MACF;AACA,UAAI,UAAW;AAAA,IACjB;AAGA,UAAM,UAAU,KAAK,OAAO,OAAK,EAAE,UAAU,SAAS,KAAK,EAAE,WAAW,SAAS,CAAC;AAGlF,QAAI,iBAAiB,QAAQ;AAC3B,cAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,IACrD,OAAO;AACL,cAAQ,KAAK,CAAC,GAAG,MAAO,EAAE,UAAU,SAAS,EAAE,WAAW,UAAW,EAAE,UAAU,SAAS,EAAE,WAAW,OAAO;AAAA,IAChH;AAEA,UAAM,cAAc,CAAC,YAA2C;AAC9D,UAAI,QAAQ,SAAS,QAAQ,EAAG,QAAO,EAAE,YAAY,UAAU;AAC/D,UAAI,QAAQ,SAAS,UAAU,EAAG,QAAO,EAAE,YAAY,UAAU;AACjE,UAAI,QAAQ,SAAS,UAAU,EAAG,QAAO,EAAE,YAAY,UAAU;AACjE,UAAI,QAAQ,SAAS,SAAS,EAAG,QAAO,EAAE,YAAY,UAAU;AAChE,aAAO,CAAC;AAAA,IACV;AAEA,WACE,+CAAC,SACC;AAAA,qDAAC,SAAI,OAAO,EAAE,cAAc,OAAO,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GACnF;AAAA,sDAAC,UAAK,sBAAQ;AAAA,QACd,8CAAC,YAAO,OAAO,EAAE,GAAG,UAAU,aAAa,iBAAiB,SAAS,YAAY,OAAO,GAAG,SAAS,MAAM,gBAAgB,MAAM,GAAG,kBAAI;AAAA,QACvI,8CAAC,YAAO,OAAO,EAAE,GAAG,UAAU,aAAa,iBAAiB,aAAa,YAAY,OAAO,GAAG,SAAS,MAAM,gBAAgB,UAAU,GAAG,uBAAS;AAAA,QACnJ,aAAa,8CAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,OAAO,GAAG,8BAAgB;AAAA,SACvF;AAAA,MACC,QAAQ,WAAW,IAClB,8CAAC,SAAI,sCAAwB,IAE7B,+CAAC,WAAM,OAAO,EAAE,OAAO,QAAQ,gBAAgB,WAAW,GACxD;AAAA,sDAAC,WACC,yDAAC,QACC;AAAA,wDAAC,QAAG,OAAO,SAAS,mBAAK;AAAA,UACzB,8CAAC,QAAG,OAAO,SAAS,wBAAU;AAAA,UAC9B,8CAAC,QAAG,OAAO,SAAS,yBAAW;AAAA,UAC/B,8CAAC,QAAG,OAAO,SAAS,qBAAO;AAAA,WAC7B,GACF;AAAA,QACA,8CAAC,WACE,kBAAQ,IAAI,SACX,+CAAC,QAAkB,OAAO,YAAY,IAAI,OAAO,GAC/C;AAAA,wDAAC,QAAG,OAAO,SAAU,cAAI,MAAK;AAAA,UAC9B,8CAAC,QAAG,OAAO,SAAU,cAAI,UAAU,KAAK,IAAI,KAAK,UAAS;AAAA,UAC1D,8CAAC,QAAG,OAAO,SAAU,cAAI,WAAW,KAAK,IAAI,KAAK,UAAS;AAAA,UAC3D,8CAAC,QAAG,OAAO,SAAU,cAAI,QAAQ,KAAK,IAAI,KAAK,UAAS;AAAA,aAJjD,IAAI,IAKb,CACD,GACH;AAAA,SACF;AAAA,OAEJ;AAAA,EAEJ;AAGA,QAAM,oBAAoB,MAAM;AAC9B,UAAMC,YAAW,YAAY;AAC7B,UAAM,cAAc,eAAe,YAAY;AAC/C,UAAM,WAAW,cACbA,UAAS,OAAO,OAAK,EAAE,UAAU,YAAY,EAAE,SAAS,WAAW,KAAK,EAAE,KAAK,YAAY,EAAE,SAAS,WAAW,CAAC,IAClHA;AAEJ,UAAM,WAAW,CAAC,GAAG,QAAQ,EAAE,QAAQ;AAEvC,UAAM,YAAY,CAAC,SAAyB;AAC1C,cAAQ,MAAM;AAAA,QACZ,KAAK;AAAgB,iBAAO;AAAA,QAC5B,KAAK;AAAkB,iBAAO;AAAA,QAC9B,KAAK;AAAkB,iBAAO;AAAA,QAC9B,KAAK;AAAe,iBAAO;AAAA,QAC3B;AAAS,iBAAO;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,aAAa,CAAC,OAAuB;AACzC,YAAM,IAAI,IAAI,KAAK,EAAE;AACrB,aAAO,GAAG,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,gBAAgB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IACvL;AAEA,WACE,+CAAC,SACC;AAAA,qDAAC,SAAI,OAAO,EAAE,cAAc,OAAO,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GACnF;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,OAAK,kBAAkB,EAAE,OAAO,KAAK;AAAA,YAC/C,OAAO;AAAA,cACL,SAAS;AAAA,cAAW,YAAY;AAAA,cAAW,OAAO;AAAA,cAClD,QAAQ;AAAA,cAAkB,YAAY;AAAA,cAAa,UAAU;AAAA,cAC7D,cAAc;AAAA,cAAO,MAAM;AAAA,YAC7B;AAAA;AAAA,QACF;AAAA,QACA,8CAAC,YAAO,OAAO,UAAU,SAAS,MAAM;AAAE,wBAAc;AAAG,sBAAY;AAAA,QAAG,GAAG,mBAAK;AAAA,QAClF,8CAAC,YAAO,OAAO,UAAU,SAAS,MAAM,YAAY,GAAG,qBAAO;AAAA,SAChE;AAAA,MACA,+CAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,cAAc,MAAM,GAChE;AAAA,iBAAS;AAAA,QAAO;AAAA,QAAO,SAAS,WAAW,IAAI,MAAM;AAAA,SACxD;AAAA,MACC,SAAS,WAAW,IACnB,8CAAC,SAAI,qCAAuB,IAE5B,+CAAC,WAAM,OAAO,EAAE,OAAO,QAAQ,gBAAgB,WAAW,GACxD;AAAA,sDAAC,WACC,yDAAC,QACC;AAAA,wDAAC,QAAG,OAAO,SAAS,kBAAI;AAAA,UACxB,8CAAC,QAAG,OAAO,SAAS,kBAAI;AAAA,UACxB,8CAAC,QAAG,OAAO,SAAS,mBAAK;AAAA,UACzB,8CAAC,QAAG,OAAO,SAAS,qBAAO;AAAA,WAC7B,GACF;AAAA,QACA,8CAAC,WACE,mBAAS,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,OAAO,MAClC,+CAAC,QACC;AAAA,wDAAC,QAAG,OAAO,EAAE,GAAG,SAAS,YAAY,UAAU,OAAO,OAAO,GAAI,qBAAW,MAAM,SAAS,GAAE;AAAA,UAC7F,8CAAC,QAAG,OAAO,EAAE,GAAG,SAAS,OAAO,UAAU,MAAM,IAAI,GAAG,YAAY,SAAS,GAAI,gBAAM,MAAK;AAAA,UAC3F,8CAAC,QAAG,OAAO,SAAU,gBAAM,WAAU;AAAA,UACrC,8CAAC,QAAG,OAAO,EAAE,GAAG,SAAS,UAAU,SAAS,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS,GAAI,gBAAM,SAAQ;AAAA,aAJ1H,CAKT,CACD,GACH;AAAA,SACF;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,OAAO,gBAAgB,eAAY,iBACtC;AAAA,mDAAC,YAAO,MAAK,UAAS,iBAAe,QAAQ,iBAAc,oBAAmB,OAAO,EAAE,OAAO,QAAQ,SAAS,WAAW,QAAQ,WAAW,YAAY,QAAQ,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,UAAU,QAAQ,QAAQ,OAAO,WAAW,MAAM,UAAU,GAAG,SAAS,MAAM,UAAU,CAAC,MAAM,GAC5T;AAAA,qDAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,OAAO,GAAG;AAAA;AAAA,QAAW;AAAA,SAAW;AAAA,MAC7E,8CAAC,UAAK,eAAY,QAAQ,mBAAS,WAAW,UAAS;AAAA,OACzD;AAAA,IACC,UACC,gFACE;AAAA,qDAAC,SAAI,MAAK,WAAU,cAAW,mBAAkB,OAAO,EAAE,SAAS,QAAQ,cAAc,kBAAkB,UAAU,OAAO,GAC1H;AAAA,uDAAC,YAAO,MAAK,OAAM,iBAAe,cAAc,SAAS,iBAAc,wBAAuB,OAAO,SAAS,cAAc,OAAO,GAAG,SAAS,MAAM,aAAa,OAAO,GAAG;AAAA;AAAA,UAAQ,WAAW;AAAA,UAAO;AAAA,WAAC;AAAA,QACvM,8CAAC,YAAO,MAAK,OAAM,iBAAe,cAAc,UAAU,iBAAc,yBAAwB,OAAO,SAAS,cAAc,QAAQ,GAAG,SAAS,MAAM,aAAa,QAAQ,GAAG,oBAAM;AAAA,QACtL,8CAAC,YAAO,MAAK,OAAM,iBAAe,cAAc,UAAU,iBAAc,yBAAwB,OAAO,SAAS,cAAc,QAAQ,GAAG,SAAS,MAAM,aAAa,QAAQ,GAAG,oBAAM;AAAA,QACtL,8CAAC,YAAO,MAAK,OAAM,iBAAe,cAAc,SAAS,iBAAc,wBAAuB,OAAO,SAAS,cAAc,OAAO,GAAG,SAAS,MAAM,aAAa,OAAO,GAAG,mBAAK;AAAA,QACjL,8CAAC,YAAO,MAAK,OAAM,iBAAe,cAAc,eAAe,iBAAc,8BAA6B,OAAO,SAAS,cAAc,aAAa,GAAG,SAAS,MAAM;AAAE,uBAAa,aAAa;AAAG,sBAAY;AAAA,QAAG,GAAG,kBAAI;AAAA,QAC5N,8CAAC,YAAO,MAAK,OAAM,iBAAe,cAAc,YAAY,iBAAc,2BAA0B,OAAO,SAAS,cAAc,UAAU,GAAG,SAAS,MAAM,aAAa,UAAU,GAAG,kBAAI;AAAA,QAC5L,8CAAC,YAAO,MAAK,OAAM,iBAAe,cAAc,YAAY,iBAAc,2BAA0B,OAAO,SAAS,cAAc,UAAU,GAAG,SAAS,MAAM;AAAE,uBAAa,UAAU;AAAG,sBAAY;AAAA,QAAG,GAAG,sBAAQ;AAAA,SACtN;AAAA,MACA,+CAAC,SAAI,MAAK,YAAW,IAAI,kBAAkB,SAAS,IAAI,cAAY,WAAW,OAAO,EAAE,UAAU,QAAQ,WAAW,qBAAqB,SAAS,MAAM,GACtJ;AAAA,sBAAc,WAAW,WAAW,IAAI,UAAQ;AAC/C,gBAAM,QAAQ,YAAY,IAAI;AAC9B,iBACE,+CAAC,SAAe,OAAO,EAAE,cAAc,OAAO,cAAc,kBAAkB,eAAe,MAAM,GACjG;AAAA,0DAAC,SAAI,OAAO,EAAE,OAAO,UAAU,GAAI,gBAAK;AAAA,YACxC,+CAAC,SAAI;AAAA;AAAA,cAAO,MAAM,QAAQ;AAAA,cAAS;AAAA,cAAc,OAAO,MAAM,YAAY,KAAK;AAAA,cAAE;AAAA,cAAY,OAAO,MAAM,UAAU,KAAK;AAAA,cAAE;AAAA,cAAc,OAAO,MAAM,YAAY,KAAK;AAAA,eAAE;AAAA,YACxK,MAAM,UAAU,SAAS,+CAAC,SAAI;AAAA;AAAA,cAAW,MAAM,SAAS,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,eAAE,IAAS;AAAA,YAC7F,MAAM,gBAAgB,+CAAC,SAAI;AAAA;AAAA,cAAgB,MAAM;AAAA,eAAc,IAAS;AAAA,YACxE,MAAM,eAAe,SAAS,+CAAC,SAAI;AAAA;AAAA,cAAc,MAAM,cAAc,KAAK,IAAI;AAAA,eAAE,IAAS;AAAA,eALlF,IAMV;AAAA,QAEJ,CAAC;AAAA,QACA,cAAc,YAAY,8CAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,YAAY,WAAW,GAAI,eAAK,UAAU,YAAY,MAAM,CAAC,GAAE;AAAA,QAClH,cAAc,YACb,8CAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,YAAY,YAAY,OAAO,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,IAAI,YAAY,UAAU,GAC9H,wBAAc,OAAO,KAAK,UAAU,EAAE,SAAS,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,IAAI,aAC5F;AAAA,QAED,cAAc,YAAY,gBAAgB,SAAS,IAChD,gBAAgB,IAAI,CAAC,MAAM,MAAM,8CAAC,SAAY,OAAO,EAAE,OAAO,UAAU,GAAI,kBAAjC,CAAsC,CAAM,IACvF,8CAAC,SAAI,qCAAuB;AAAA,QAE/B,cAAc,iBAAiB,qBAAqB;AAAA,QACpD,cAAc,cAAc,kBAAkB;AAAA,QAC9C,cAAc,cAAc,kBAAkB;AAAA,SACjD;AAAA,OACF;AAAA,KAEJ;AAEJ;;;ACrUO,SAAS,YAAY,QAA0C;AACpE,QAAM,OAAwC;AAAA,IAC5C,GAAI,OAAO,eAAe,CAAC;AAAA,IAC3B,GAAI,OAAO,SAAS,CAAC;AAAA,EACvB;AAEA,QAAM,WAAW,YAAY,QAAQ,MAAM,oBAAI,IAAY,CAAC;AAG5D,QAAM,EAAE,aAAa,IAAI,OAAO,KAAK,GAAG,MAAM,IAAI;AAClD,SAAO;AACT;AAEA,SAAS,YACP,MACA,MACA,SACiB;AACjB,MAAI,KAAK,MAAM;AACb,UAAM,UAAU,KAAK;AAErB,QAAI,QAAQ,IAAI,OAAO,GAAG;AAExB,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,UAAM,WAAW,UAAU,SAAS,IAAI;AACxC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,YAAQ,IAAI,OAAO;AAGnB,UAAM,EAAE,MAAM,MAAM,GAAG,SAAS,IAAI;AACpC,UAAM,UAAU,YAAY,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,OAAO;AAEvE,YAAQ,OAAO,OAAO;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,SAA0B,CAAC;AAEjC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,QAAQ,iBAAiB,QAAQ,SAAS;AAC5C;AAAA,IACF;AAEA,QAAI,QAAQ,gBAAgB,SAAS,OAAO,UAAU,UAAU;AAC9D,YAAM,QAAyC,CAAC;AAChD,iBAAW,CAAC,UAAU,SAAS,KAAK,OAAO;AAAA,QACzC;AAAA,MACF,GAAG;AACD,cAAM,QAAQ,IAAI,YAAY,WAAW,MAAM,OAAO;AAAA,MACxD;AACA,aAAO,aAAa;AAAA,IACtB,WAAW,QAAQ,SAAS;AAC1B,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAO,QAAQ,MAAM;AAAA,UAAI,CAAC,SACxB,YAAY,MAAM,MAAM,OAAO;AAAA,QACjC;AAAA,MACF,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C,eAAO,QAAQ,YAAY,OAA0B,MAAM,OAAO;AAAA,MACpE;AAAA,IACF,YACG,QAAQ,WAAW,QAAQ,WAAW,QAAQ,YAC/C,MAAM,QAAQ,KAAK,GACnB;AACA,MAAC,OAAmC,GAAG,IAAI,MAAM;AAAA,QAC/C,CAAC,SAA0B,YAAY,MAAM,MAAM,OAAO;AAAA,MAC5D;AAAA,IACF,WAAW,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,QAAQ;AAC3D,UAAI,SAAS,OAAO,UAAU,UAAU;AACtC,QAAC,OAAmC,GAAG,IAAI;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,QAAQ,kBAAkB,SAAS,OAAO,UAAU,UAAU;AACvE,YAAM,OAAmD,CAAC;AAC1D,iBAAW,CAAC,SAAS,QAAQ,KAAK,OAAO;AAAA,QACvC;AAAA,MACF,GAAG;AACD,YAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,eAAK,OAAO,IAAI;AAAA,QAClB,WAAW,OAAO,aAAa,YAAY,aAAa,MAAM;AAC5D,eAAK,OAAO,IAAI;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO,eAAe;AAAA,IACxB,WACE,QAAQ,0BACR,SACA,OAAO,UAAU,UACjB;AACA,aAAO,uBAAuB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,MAAC,OAAmC,GAAG,IAAI;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UACP,KACA,MAC6B;AAE7B,QAAM,QAAQ,IAAI,MAAM,mCAAmC;AAC3D,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,OAAO,MAAM,CAAC;AAEpB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAuC,KAAK,MAAM,CAAC,CAAC;AACxD,WAAS,IAAI,GAAG,IAAI,MAAM,UAAU,SAAS,KAAK;AAChD,cAAW,QAA4C,MAAM,CAAC,CAAC;AAAA,EACjE;AACA,SAAO;AACT;;;ACnIA,IAAM,aAAqC;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAU;AACZ;AAKA,IAAM,gBAAyD;AAAA,EAC7D,UAAU,EAAE,MAAM,WAAW;AAAA,EAC7B,OAAO,EAAE,MAAM,QAAQ;AAAA,EACvB,OAAO,EAAE,SAAS,QAAQ;AAAA,EAC1B,YAAY,EAAE,SAAS,aAAa;AACtC;AAKO,SAAS,wBACd,WACA,MACA,YACc;AACd,QAAM,OAAO,mBAAmB,IAAI;AACpC,QAAM,WAAW,uBAAuB,IAAI;AAC5C,QAAM,UAAU,eAAe,IAAI;AAEnC,QAAM,SAAuB;AAAA,IAC3B;AAAA,IACA,OAAO,KAAK,SAAS;AAAA,IACrB,UAAU;AAAA,EACZ;AAEA,MAAI,SAAS,SAAS,EAAG,QAAO,WAAW;AAC3C,MAAI,QAAS,QAAO,UAAU;AAC9B,MAAI,KAAK,YAAY,OAAW,QAAO,eAAe,KAAK;AAC3D,MAAI,KAAK,YAAa,QAAO,cAAc,KAAK;AAGhD,MAAI,KAAK,UAAU,QAAW;AAC5B,WAAO,WAAW;AAClB,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,SAAO;AACT;AAKO,SAAS,uBACd,MACmB;AACnB,QAAM,QAA2B,CAAC;AAElC,MAAI,KAAK,cAAc,QAAW;AAChC,UAAM,KAAK,EAAE,MAAM,aAAa,QAAQ,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,KAAK,cAAc,QAAW;AAChC,UAAM,KAAK,EAAE,MAAM,aAAa,QAAQ,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,KAAK,SAAS;AAChB,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ,EAAE,SAAS,KAAK,SAAS,SAAS,qBAAqB;AAAA,IACjE,CAAC;AAAA,EACH;AAGA,QAAM,SAAS,KAAK,YAAY;AAChC,QAAM,SAAS,KAAK,YAAY;AAChC,QAAM,aAAa,KAAK,qBAAqB;AAC7C,QAAM,aAAa,KAAK,qBAAqB;AAE7C,MAAI,cAAc,YAAY;AAC5B,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,cAAc,KAAK;AAAA,QACnB,cAAc,KAAK;AAAA,QACnB,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH,WAAW,UAAU,QAAQ;AAC3B,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,KAAK,KAAK,WAAW;AAAA,QACrB,KAAK,KAAK,WAAW;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,KAAK,eAAe,QAAW;AACjC,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ,EAAE,QAAQ,KAAK,WAAW;AAAA,IACpC,CAAC;AAAA,EACH;AAGA,MAAI,KAAK,WAAW,QAAS,OAAM,KAAK,EAAE,MAAM,QAAQ,CAAC;AACzD,MAAI,KAAK,WAAW,SAAS,KAAK,WAAW,MAAO,OAAM,KAAK,EAAE,MAAM,MAAM,CAAC;AAC9E,MAAI,KAAK,WAAW,QAAS,OAAM,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEzD,MAAI,KAAK,aAAa;AACpB,UAAM,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAAA,EACtC;AAEA,SAAO;AACT;AAKO,SAAS,cACd,QACA,UACc;AACd,QAAM,SAAS,EAAE,GAAG,OAAO;AAG3B,QAAM,SAAS,SAAS,WAAW;AACnC,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM,GAAG;AACpD,WAAO,OAAO,WAAW,MAAM;AAE/B,UAAM,cAAc,cAAc,MAAM;AACxC,QAAI,aAAa;AACf,aAAO,SAAS,EAAE,GAAI,OAAO,UAAU,CAAC,GAAI,GAAG,YAAY;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,SAAS,UAAU,EAAG,QAAO,QAAQ,SAAS,UAAU;AAC5D,MAAI,SAAS,gBAAgB;AAC3B,WAAO,cAAc,SAAS,gBAAgB;AAChD,MAAI,SAAS,SAAS,EAAG,QAAO,WAAW,SAAS,SAAS;AAC7D,MAAI,SAAS,gBAAgB;AAC3B,WAAO,cAAc,SAAS,gBAAgB;AAChD,MAAI,SAAS,WAAW,MAAM,KAAM,QAAO,SAAS;AACpD,MAAI,SAAS,aAAa,MAAM,KAAM,QAAO,WAAW;AACxD,MAAI,SAAS,aAAa,MAAM,KAAM,QAAO,WAAW;AAExD,MAAI,SAAS,cAAc,MAAM,MAAM;AACrC,WAAO,SAAS,EAAE,GAAI,OAAO,UAAU,CAAC,GAAI,WAAW,KAAK;AAAA,EAC9D;AACA,MAAI,SAAS,eAAe,GAAG;AAC7B,WAAO,SAAS;AAAA,MACd,GAAI,OAAO,UAAU,CAAC;AAAA,MACtB,WAAW,SAAS,eAAe;AAAA,IACrC;AAAA,EACF;AACA,MAAI,SAAS,YAAY,KAAK,OAAO,SAAS,YAAY,MAAM,UAAU;AACxE,WAAO,SAAS,EAAE,GAAI,OAAO,UAAU,CAAC,GAAI,GAAG,SAAS,YAAY,EAAE;AAAA,EACxE;AACA,MAAI,SAAS,UAAU,MAAM,OAAO;AAClC,WAAO,SAAS,EAAE,GAAI,OAAO,UAAU,CAAC,GAAI,WAAW,KAAK;AAAA,EAC9D;AAGA,QAAM,eAAe,SAAS,iBAAiB;AAC/C,MAAI,MAAM,QAAQ,YAAY,KAAK,OAAO,SAAS;AACjD,WAAO,UAAU,OAAO,QAAQ,IAAI,CAAC,SAAS;AAAA,MAC5C,GAAG;AAAA,MACH,UAAU,aAAa,SAAS,IAAI,KAAK,IAAI,OAAO,IAAI;AAAA,IAC1D,EAAE;AAAA,EACJ;AAGA,QAAM,YAAY,SAAS,cAAc;AACzC,MAAI,MAAM,QAAQ,SAAS,KAAK,OAAO,SAAS;AAC9C,WAAO,UAAU,OAAO,QAAQ,IAAI,CAAC,KAAK,OAAO;AAAA,MAC/C,GAAG;AAAA,MACH,OAAO,UAAU,CAAC,KAAK,OAAO,OAAO,UAAU,CAAC,CAAC,IAAI,IAAI;AAAA,IAC3D,EAAE;AAAA,EACJ;AAEA,SAAO;AACT;AAIA,SAAS,mBAAmB,MAA+B;AAEzD,MAAI,KAAK,KAAM,QAAO;AAGtB,MAAI,KAAK,UAAU,OAAW,QAAO;AAErC,QAAM,OAAO,YAAY,IAAI;AAE7B,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,UAAI,KAAK,WAAW,UAAU,KAAK,WAAW,YAAa,QAAO;AAClE,UAAI,KAAK,WAAW,WAAY,QAAO;AACvC,UAAI,KAAK,aAAa,KAAK,YAAY,IAAK,QAAO;AACnD,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,UAAI,KAAK,YAAY,UAAa,KAAK,YAAY,OAAW,QAAO;AACrE,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,aAAa,IAAI;AAAA,IAC1B,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,MAA+B;AAClD,MAAI,CAAC,KAAK,KAAM,QAAO;AACvB,MAAI,OAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AAE/C,QAAM,UAAU,KAAK,KAAK,OAAO,CAAC,MAAM,MAAM,MAAM;AACpD,SAAO,QAAQ,CAAC,KAAK;AACvB;AAEA,SAAS,aAAa,MAA+B;AACnD,QAAM,QAAQ,KAAK;AACnB,MAAI,CAAC,SAAS,MAAM,QAAQ,KAAK,EAAG,QAAO;AAE3C,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,MAAM,SAAS,YAAY,MAAM,WAAY,QAAO;AACxD,SAAO;AACT;AAEA,SAAS,eAAe,MAA8C;AACpE,MAAI,CAAC,KAAK,KAAM,QAAO;AAEvB,QAAM,QAAQ,KAAK;AACnB,SAAO,KAAK,KAAK,IAAI,CAAC,KAAK,OAAO;AAAA,IAChC,OAAO,OAAO,GAAG;AAAA,IACjB,OAAO,SAAS,MAAM,CAAC,KAAK,OAAO,OAAO,MAAM,CAAC,CAAC,IAAI,OAAO,GAAG;AAAA,EAClE,EAAE;AACJ;;;ACvPO,SAAS,oBACd,cACA,QACA,YACA,UACM;AACN,aAAW,CAAC,aAAa,GAAG,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC7D,QAAI,MAAM,QAAQ,GAAG,GAAG;AAEtB,iBAAW,kBAAkB,KAAK;AAChC,YAAI,CAAC,OAAO,cAAc,EAAG;AAC7B,cAAM,OAAc;AAAA,UAClB,IAAI,GAAG,QAAQ,QAAQ,WAAW,IAAI,cAAc;AAAA,UACpD,MAAM,EAAE,OAAO,aAAa,UAAU,aAAa;AAAA,UACnD,MAAM,EAAE,UAAU,KAAK;AAAA,UACvB,MAAM,EAAE,UAAU,MAAM;AAAA,QAC1B;AACA,eAAO,cAAc,EAAE,QAAQ;AAAA,UAC7B,GAAI,OAAO,cAAc,EAAE,SAAS,CAAC;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AAEL,8BAAwB,aAAa,KAAK,QAAQ,YAAY,QAAQ;AAAA,IACxE;AAAA,EACF;AACF;AAKO,SAAS,kBACd,QACA,QACA,YACA,UACM;AACN,QAAM,YAAY,kBAAkB,OAAO,EAAG;AAC9C,MAAI,CAAC,UAAW;AAEhB,QAAM,aAAa,OAAO;AAC1B,QAAM,aAAa,OAAO;AAG1B,QAAM,iBAAiB,oBAAI,IAAY;AACvC,MAAI,YAAY,YAAY;AAC1B,WAAO,KAAK,WAAW,UAAU,EAAE,QAAQ,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AAAA,EACzE;AACA,MAAI,YAAY,UAAU;AACxB,eAAW,SAAS,QAAQ,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AAAA,EAC1D;AACA,MAAI,YAAY,YAAY;AAC1B,WAAO,KAAK,WAAW,UAAU,EAAE,QAAQ,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AAAA,EACzE;AACA,MAAI,YAAY,UAAU;AACxB,eAAW,SAAS,QAAQ,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AAAA,EAC1D;AAEA,aAAW,aAAa,gBAAgB;AAEtC,QAAI,CAAC,OAAO,SAAS,KAAK,YAAY,aAAa,SAAS,GAAG;AAC7D,aAAO,SAAS,IAAI;AAAA,QAClB;AAAA,QACA,WAAW,WAAW,SAAS;AAAA,QAC/B;AAAA,MACF;AACA,aAAO,SAAS,EAAE,SAAS;AAAA,IAC7B;AACA,QAAI,CAAC,OAAO,SAAS,KAAK,YAAY,aAAa,SAAS,GAAG;AAC7D,aAAO,SAAS,IAAI;AAAA,QAClB;AAAA,QACA,WAAW,WAAW,SAAS;AAAA,QAC/B;AAAA,MACF;AACA,aAAO,SAAS,EAAE,SAAS;AAAA,IAC7B;AACA,QAAI,CAAC,OAAO,SAAS,EAAG;AAExB,UAAM,aAAsC,CAAC;AAC7C,UAAM,aAAsC,CAAC;AAG7C,QAAI,YAAY,aAAa,SAAS,GAAG;AACvC,iBAAW,SAAS;AAAA,IACtB;AACA,QAAI,YAAY,aAAa,SAAS,GAAG;AACvC,iBAAW,SAAS;AAAA,IACtB;AAEA,QAAI,YAAY,aAAa,SAAS,KAAK,CAAC,YAAY,aAAa,SAAS,GAAG;AAC/E,iBAAW,SAAS;AAAA,IACtB;AAEA,QAAI,CAAC,YAAY,aAAa,SAAS,KAAK,YAAY,aAAa,SAAS,GAAG;AAC/E,iBAAW,SAAS;AAAA,IACtB;AAGA,QAAI,YAAY,UAAU,SAAS,SAAS,GAAG;AAC7C,iBAAW,WAAW;AAAA,IACxB;AACA,QAAI,YAAY,UAAU,SAAS,SAAS,GAAG;AAC7C,iBAAW,WAAW;AAAA,IACxB;AAEA,UAAM,OAAc;AAAA,MAClB,IAAI,GAAG,QAAQ,QAAQ,SAAS;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,WAAK,OAAO;AAAA,IACd;AAEA,WAAO,SAAS,EAAE,QAAQ,CAAC,GAAI,OAAO,SAAS,EAAE,SAAS,CAAC,GAAI,IAAI;AAAA,EACrE;AACF;AAKO,SAAS,mBACd,QACA,QACA,YACA,UACM;AACN,QAAM,WAAW,OAAO,SAAS,OAAO;AACxC,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG;AAExC,QAAM,kBAAkB,OAAO,QAAQ,UAAU;AAGjD,QAAM,gBAAgB,kBAAkB,QAAQ;AAEhD,MAAI,eAAe;AACjB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,kBACd,QACmB;AACnB,MAAI,CAAC,OAAQ,QAAO;AAGpB,MAAI,OAAO,KAAK;AACd,UAAM,QAAQ,kBAAkB,OAAO,GAAsB;AAC7D,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,EAAE,UAAU,OAAO,YAAY,CAAC,KAAK,EAAE;AAAA,EAChD;AAGA,MAAI,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AAC3C,UAAM,aAAa,OAAO,MACvB,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC,EAC/B,OAAO,CAAC,MAAuB,MAAM,IAAI;AAC5C,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAI,WAAW,WAAW,EAAG,QAAO,WAAW,CAAC;AAChD,WAAO,EAAE,UAAU,OAAO,WAAW;AAAA,EACvC;AAGA,MAAI,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AAC3C,UAAM,aAAa,OAAO,MACvB,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC,EAC/B,OAAO,CAAC,MAAuB,MAAM,IAAI;AAC5C,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAI,WAAW,WAAW,EAAG,QAAO,WAAW,CAAC;AAChD,WAAO,EAAE,UAAU,MAAM,WAAW;AAAA,EACtC;AAGA,MAAI,OAAO,YAAY,CAAC,OAAO,YAAY;AACzC,UAAM,aAA2B,OAAO,SAAS,IAAI,CAAC,WAAW;AAAA,MAC/D;AAAA,MACA,UAAU;AAAA,IACZ,EAAE;AACF,QAAI,WAAW,WAAW,EAAG,QAAO,WAAW,CAAC;AAChD,WAAO,EAAE,UAAU,OAAO,WAAW;AAAA,EACvC;AAGA,MAAI,OAAO,YAAY;AACrB,UAAM,aAA2B,CAAC;AAElC,eAAW,CAAC,OAAO,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACnE,YAAM,YAAY,0BAA0B,OAAO,UAAU;AAC7D,UAAI,UAAW,YAAW,KAAK,SAAS;AAAA,IAC1C;AAGA,QAAI,OAAO,UAAU;AACnB,iBAAW,SAAS,OAAO,UAAU;AACnC,YAAI,CAAC,OAAO,WAAW,KAAK,GAAG;AAC7B,qBAAW,KAAK,EAAE,OAAO,UAAU,aAAa,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAI,WAAW,WAAW,EAAG,QAAO,WAAW,CAAC;AAChD,WAAO,EAAE,UAAU,OAAO,WAAW;AAAA,EACvC;AAEA,SAAO;AACT;AAIA,SAAS,0BACP,OACA,QACmB;AACnB,MAAI,OAAO,UAAU,QAAW;AAC9B,WAAO,EAAE,OAAO,UAAU,UAAU,OAAO,OAAO,MAAM;AAAA,EAC1D;AACA,MAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,WAAO,EAAE,OAAO,UAAU,MAAM,OAAO,OAAO,KAAK;AAAA,EACrD;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,EAAE,OAAO,UAAU,sBAAsB,OAAO,OAAO,QAAQ;AAAA,EACxE;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,EAAE,OAAO,UAAU,mBAAmB,OAAO,OAAO,QAAQ;AAAA,EACrE;AACA,MAAI,OAAO,cAAc,UAAa,OAAO,YAAY,GAAG;AAC1D,WAAO,EAAE,OAAO,UAAU,aAAa;AAAA,EACzC;AACA,MAAI,OAAO,SAAS;AAClB,WAAO,EAAE,OAAO,UAAU,WAAW,OAAO,OAAO,QAAQ;AAAA,EAC7D;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,aACA,WACA,QACA,YACA,UACM;AACN,QAAM,cAAc,IAAI,IAAI,UAAU,YAAY,CAAC,CAAC;AAEpD,MAAI,UAAU,YAAY;AACxB,eAAW,CAAC,cAAc,cAAc,KAAK,OAAO;AAAA,MAClD,UAAU;AAAA,IACZ,GAAG;AAED,UAAI,CAAC,OAAO,YAAY,GAAG;AACzB,eAAO,YAAY,IAAI;AAAA,UACrB;AAAA,UACA;AAAA,UACA,YAAY,IAAI,YAAY;AAAA,QAC9B;AACA,eAAO,YAAY,EAAE,SAAS;AAAA,MAChC;AAEA,YAAM,OAAc;AAAA,QAClB,IAAI,GAAG,QAAQ,cAAc,WAAW,IAAI,YAAY;AAAA,QACxD,MAAM,EAAE,OAAO,aAAa,UAAU,aAAa;AAAA,QACnD,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,GAAI,YAAY,IAAI,YAAY,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,QAC5D;AAAA,QACA,MAAM;AAAA,UACJ,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,aAAO,YAAY,EAAE,QAAQ;AAAA,QAC3B,GAAI,OAAO,YAAY,EAAE,SAAS,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,UAAU,OAAO;AACnB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,QAAQ,cAAc,WAAW;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,kBACP,UACe;AACf,MAAI,SAAS,SAAS,EAAG,QAAO;AAGhC,QAAM,eAAe,SAAS,CAAC;AAC/B,MAAI,CAAC,aAAa,WAAY,QAAO;AAErC,aAAW,YAAY,OAAO,KAAK,aAAa,UAAU,GAAG;AAC3D,UAAM,OAAO,aAAa,WAAW,QAAQ;AAC7C,QAAI,CAAC,qBAAqB,IAAI,EAAG;AAGjC,UAAM,UAAU,SAAS;AAAA,MACvB,CAAC,MAAM,EAAE,aAAa,QAAQ,KAAK,qBAAqB,EAAE,WAAW,QAAQ,CAAC;AAAA,IAChF;AAEA,QAAI,SAAS;AAEX,YAAM,SAAS,SAAS;AAAA,QAAI,CAAC,MAC3B,cAAc,EAAE,WAAY,QAAQ,CAAC;AAAA,MACvC;AACA,YAAM,SAAS,IAAI,IAAI,OAAO,IAAI,MAAM,CAAC;AACzC,UAAI,OAAO,SAAS,SAAS,OAAQ,QAAO;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAgC;AAC5D,MAAI,KAAK,UAAU,OAAW,QAAO;AACrC,MAAI,KAAK,QAAQ,KAAK,KAAK,WAAW,EAAG,QAAO;AAChD,SAAO;AACT;AAEA,SAAS,cAAc,MAAgC;AACrD,MAAI,KAAK,UAAU,OAAW,QAAO,KAAK;AAC1C,MAAI,KAAK,QAAQ,KAAK,KAAK,WAAW,EAAG,QAAO,KAAK,KAAK,CAAC;AAC3D,SAAO;AACT;AAEA,SAAS,yBACP,oBACA,UACA,QACA,YACA,UACA,iBACM;AAEN,QAAM,YAAY,SAAS;AAAA,IAAI,CAAC,MAC9B,cAAc,EAAE,WAAY,kBAAkB,CAAC;AAAA,EACjD;AACA,MAAI,CAAC,OAAO,kBAAkB,GAAG;AAC/B,WAAO,kBAAkB,IAAI;AAAA,MAC3B,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,UAAU,IAAI,CAAC,OAAO;AAAA,QAC7B,OAAO,OAAO,CAAC;AAAA,QACf,OAAO,OAAO,CAAC;AAAA,MACjB,EAAE;AAAA,IACJ;AAAA,EACF;AAGA,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,QAAQ,WAAY;AACzB,UAAM,eAAe,cAAc,QAAQ,WAAW,kBAAkB,CAAC;AACzE,UAAM,kBAAkB,IAAI,IAAI,QAAQ,YAAY,CAAC,CAAC;AAEtD,eAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,QAAQ,UAAU,GAAG;AACzE,UAAI,cAAc,mBAAoB;AAEtC,UAAI,CAAC,OAAO,SAAS,GAAG;AACtB,eAAO,SAAS,IAAI;AAAA,UAClB;AAAA,UACA;AAAA,UACA,gBAAgB,IAAI,SAAS;AAAA,QAC/B;AACA,eAAO,SAAS,EAAE,SAAS;AAAA,MAC7B;AAEA,YAAM,OAAc;AAAA,QAClB,IAAI,GAAG,QAAQ,IAAI,eAAe,IAAI,kBAAkB,IAAI,SAAS;AAAA,QACrE,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,UAAU;AAAA,UACV,OAAO;AAAA,QACT;AAAA,QACA,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,GAAI,gBAAgB,IAAI,SAAS,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,QAC7D;AAAA,QACA,MAAM,EAAE,QAAQ,KAAK;AAAA,MACvB;AAEA,aAAO,SAAS,EAAE,QAAQ;AAAA,QACxB,GAAI,OAAO,SAAS,EAAE,SAAS,CAAC;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kCACP,UACA,QACA,YACA,UACA,iBACM;AAEN,QAAM,UAAU,SAAS,IAAI,CAAC,GAAG,OAAO;AAAA,IACtC,OAAO,OAAO,CAAC;AAAA,IACf,OAAO,UAAU,IAAI,CAAC;AAAA,EACxB,EAAE;AAEF,SAAO,UAAU,IAAI;AAAA,IACnB,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,EACF;AAGA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,UAAU,SAAS,CAAC;AAC1B,QAAI,CAAC,QAAQ,WAAY;AACzB,UAAM,kBAAkB,IAAI,IAAI,QAAQ,YAAY,CAAC,CAAC;AAEtD,eAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,QAAQ,UAAU,GAAG;AACzE,UAAI,CAAC,OAAO,SAAS,GAAG;AACtB,eAAO,SAAS,IAAI;AAAA,UAClB;AAAA,UACA;AAAA,UACA,gBAAgB,IAAI,SAAS;AAAA,QAC/B;AACA,eAAO,SAAS,EAAE,SAAS;AAAA,MAC7B;AAEA,YAAM,OAAc;AAAA,QAClB,IAAI,GAAG,QAAQ,IAAI,eAAe,WAAW,CAAC,IAAI,SAAS;AAAA,QAC3D,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,UAAU;AAAA,UACV,OAAO,OAAO,CAAC;AAAA,QACjB;AAAA,QACA,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,GAAI,gBAAgB,IAAI,SAAS,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,QAC7D;AAAA,QACA,MAAM,EAAE,QAAQ,KAAK;AAAA,MACvB;AAEA,aAAO,SAAS,EAAE,QAAQ;AAAA,QACxB,GAAI,OAAO,SAAS,EAAE,SAAS,CAAC;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrcO,SAAS,eACd,QACA,UACA,UACA,SACa;AACb,QAAM,WAAW,SAAS,wBAAwB;AAClD,QAAM,WAAW,SAAS,gBAAgB;AAG1C,QAAM,WAAW,YAAY,MAAM;AAGnC,QAAM,SAAS,WAAW,QAAQ;AAGlC,QAAM,SAAuC,CAAC;AAC9C,QAAM,cAAc,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;AAEjD,MAAI,OAAO,YAAY;AACrB;AAAA,MACE,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAKA,MAAI,OAAO,cAAc;AACvB,wBAAoB,OAAO,cAAc,QAAQ,QAAQ,QAAQ;AAAA,EACnE;AAGA,MAAI,OAAO,IAAI;AACb,sBAAkB,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EACpD;AAGA,MAAI,OAAO,SAAS,OAAO,OAAO;AAChC,uBAAmB,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EACrD;AAGA,QAAM,aAAa,kBAAkB,QAAQ,QAAQ;AAErD,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAIA,SAAS,cACP,YACA,aACA,QACA,QACA,UACA,UACA,UACM;AACN,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/D,UAAM,WAAW,SAAS,GAAG,MAAM,IAAI,QAAQ,KAAK;AACpD,UAAM,aAAa,YAAY,IAAI,QAAQ;AAE3C,QAAI,aAAa,UAAU,KAAK,WAAW,YAAY;AACrD,UAAI,aAAa,WAAW;AAE1B,cAAM,iBAAiB,IAAI,IAAI,WAAW,YAAY,CAAC,CAAC;AACxD,cAAM,iBAAiB,WAAW,QAAQ;AAC1C,cAAM,iBAAiB,WAAW,QAAQ;AAG1C;AAAA,UACE,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF,OAAO;AAEL,cAAM,QAAsC,CAAC;AAC7C,cAAM,iBAAiB,IAAI,IAAI,WAAW,YAAY,CAAC,CAAC;AACxD,mBAAW,CAAC,UAAU,UAAU,KAAK,OAAO;AAAA,UAC1C,WAAW;AAAA,QACb,GAAG;AACD,gBAAM,QAAQ,IAAI;AAAA,YAChB;AAAA,YACA;AAAA,YACA,eAAe,IAAI,QAAQ;AAAA,UAC7B;AAAA,QACF;AACA,eAAO,QAAQ,IAAI;AAAA,UACjB,MAAM;AAAA,UACN,OAAO,WAAW,SAAS;AAAA,UAC3B;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,uBAAuB,UAAU,GAAG;AACtC,YAAM,aAAa,WAAW;AAC9B,YAAM,QAAsC,CAAC;AAC7C,YAAM,eAAe,IAAI,IAAI,WAAW,YAAY,CAAC,CAAC;AACtD,UAAI,WAAW,YAAY;AACzB,mBAAW,CAAC,UAAU,cAAc,KAAK,OAAO;AAAA,UAC9C,WAAW;AAAA,QACb,GAAG;AACD,gBAAM,QAAQ,IAAI;AAAA,YAChB;AAAA,YACA;AAAA,YACA,aAAa,IAAI,QAAQ;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AACA,YAAMC,UAAS,wBAAwB,UAAU,YAAY,UAAU;AACvE,MAAAA,QAAO,OAAO;AACd,MAAAA,QAAO,QAAQ;AACf,UAAI,WAAW,aAAa,OAAW,CAAAA,QAAO,WAAW,WAAW;AACpE,UAAI,WAAW,aAAa,OAAW,CAAAA,QAAO,WAAW,WAAW;AACpE,aAAO,QAAQ,IAAIA;AAGnB,YAAMC,iBAAgB,iBAAiB,UAAU,UAAU,MAAM;AACjE,UAAIA,gBAAe;AACjB,eAAO,QAAQ,IAAI,cAAc,OAAO,QAAQ,GAAGA,cAAa;AAAA,MAClE;AAGA,YAAMC,aAAY,iBAAiB,UAAU,QAAQ;AACrD,UAAIA,eAAc,UAAa,OAAO,QAAQ,EAAE,iBAAiB,QAAW;AAC1E,eAAO,QAAQ,EAAE,eAAeA;AAAA,MAClC;AAEA;AAAA,IACF;AAGA,UAAM,SAAS,wBAAwB,UAAU,YAAY,UAAU;AACvE,WAAO,QAAQ,IAAI;AAGnB,UAAM,gBAAgB,iBAAiB,UAAU,UAAU,MAAM;AACjE,QAAI,eAAe;AACjB,aAAO,QAAQ,IAAI,cAAc,OAAO,QAAQ,GAAG,aAAa;AAAA,IAClE;AAGA,UAAM,YAAY,iBAAiB,UAAU,QAAQ;AACrD,QAAI,cAAc,UAAa,OAAO,QAAQ,EAAE,iBAAiB,QAAW;AAC1E,aAAO,QAAQ,EAAE,eAAe;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,QAA0C;AAC5D,MAAI,CAAC,OAAO,SAAS,OAAO,MAAM,WAAW,EAAG,QAAO;AAEvD,QAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,MAAI,SAAS,EAAE,GAAG,KAAK;AAEvB,aAAW,aAAa,OAAO;AAC7B,aAAS,aAAa,QAAQ,SAAS;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,SAAS,aACP,GACA,GACiB;AACjB,QAAM,SAAS,EAAE,GAAG,EAAE;AAEtB,MAAI,EAAE,YAAY;AAChB,WAAO,aAAa,EAAE,GAAI,OAAO,cAAc,CAAC,GAAI,GAAG,EAAE,WAAW;AAAA,EACtE;AACA,MAAI,EAAE,UAAU;AACd,UAAM,WAAW,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;AAC9C,eAAW,KAAK,EAAE,SAAU,UAAS,IAAI,CAAC;AAC1C,WAAO,WAAW,CAAC,GAAG,QAAQ;AAAA,EAChC;AACA,MAAI,EAAE,GAAI,QAAO,KAAK,EAAE;AACxB,MAAI,EAAE,KAAM,QAAO,OAAO,EAAE;AAC5B,MAAI,EAAE,KAAM,QAAO,OAAO,EAAE;AAC5B,MAAI,EAAE,cAAc;AAClB,WAAO,eAAe;AAAA,MACpB,GAAI,OAAO,gBAAgB,CAAC;AAAA,MAC5B,GAAG,EAAE;AAAA,IACP;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAgC;AACpD,MAAI,KAAK,SAAS,SAAU,QAAO;AACnC,MAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,QAAQ,EAAG,QAAO;AACrE,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAgC;AAC9D,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK;AAC5D,MAAI,SAAS,QAAS,QAAO;AAC7B,QAAM,QAAQ,KAAK;AACnB,MAAI,CAAC,SAAS,MAAM,QAAQ,KAAK,EAAG,QAAO;AAC3C,SAAO,MAAM,SAAS,YAAY,CAAC,CAAC,MAAM;AAC5C;AAEA,SAAS,iBACP,UACA,WACA,QAC2B;AAC3B,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,QAAQ;AACV,UAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,QAAI,UAAqC;AACzC,eAAW,QAAQ,OAAO;AACxB,gBAAU,UAAU,IAAI;AAAA,IAC1B;AACA,WAAO,UAAU,SAAS;AAAA,EAC5B;AACA,SAAO,SAAS,SAAS;AAC3B;AAEA,SAAS,iBACP,UACA,WACS;AACT,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAAS,SAAS;AAC3B;AAEA,SAAS,kBACP,QACA,UACU;AACV,QAAM,UAAU,WAAW,UAAU;AACrC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,OAAO,KAAK,MAAM;AAEtD,QAAM,YAAY,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AAC7C,QAAM,QAAkB,CAAC;AACzB,QAAM,cAAc,QAAQ,QAAQ,GAAG;AAEvC,aAAW,QAAQ,SAAS;AAC1B,QAAI,SAAS,IAAK;AAClB,QAAI,UAAU,IAAI,IAAI,GAAG;AACvB,YAAM,KAAK,IAAI;AACf,gBAAU,OAAO,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,gBAAgB,IAAI;AAEtB,UAAM,YAAY,CAAC,GAAG,SAAS;AAC/B,UAAM,OAAO,aAAa,GAAG,GAAG,SAAS;AAAA,EAC3C,OAAO;AAEL,UAAM,KAAK,GAAG,SAAS;AAAA,EACzB;AAEA,SAAO;AACT;;;ACzSO,SAAS,aAAa,QAG3B;AACA,QAAM,aAA8C,CAAC;AACrD,QAAMC,YAAqB,CAAC;AAC5B,QAAM,WAA0B,CAAC;AAEjC,aAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAEpE,QAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,wBAAkB,YAAYA,WAAU,UAAU,WAAW,WAAW;AACxE;AAAA,IACF;AAEA,eAAW,SAAS,IAAI,wBAAwB,WAAW;AAC3D,QAAI,YAAY,SAAU,CAAAA,UAAS,KAAK,SAAS;AAEjD,UAAM,UAAU,sBAAsB,WAAW;AACjD,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,eAAS,SAAS,IAAI;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,OAAO,WAAW,SAAS,GAAG;AACrD,aAAS,UAAU,IAAI,OAAO;AAAA,EAChC;AAEA,QAAM,SAA0B;AAAA,IAC9B,MAAM;AAAA,IACN;AAAA,EACF;AACA,MAAIA,UAAS,SAAS,EAAG,QAAO,WAAWA;AAE3C,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAIA,IAAM,mBAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AACnB;AAEA,IAAM,qBAA6C;AAAA,EACjD,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AACjB;AAEA,SAAS,wBAAwB,QAAuC;AACtE,QAAM,OAAwB,CAAC;AAG/B,QAAM,WAAW,iBAAiB,OAAO,IAAI,KAAK;AAClD,OAAK,OAAO;AAEZ,MAAI,OAAO,MAAO,MAAK,QAAQ,OAAO;AACtC,MAAI,OAAO,YAAa,MAAK,cAAc,OAAO;AAClD,MAAI,OAAO,iBAAiB,OAAW,MAAK,UAAU,OAAO;AAG7D,MAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAAG;AAC/C,SAAK,OAAO,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;AAC7C,UAAM,SAAS,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;AAChD,UAAM,kBAAkB,OAAO,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC;AAEjE,QAAI,OAAO,KAAK,CAAC,GAAG,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG;AACnD,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,OAAO,UAAU;AACnB,eAAW,QAAQ,OAAO,UAAU;AAClC,8BAAwB,MAAM,KAAK,MAAM,KAAK,MAAM;AAAA,IACtD;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,gBAAgB,OAAO,OAAO;AAChD,SAAK,OAAO;AACZ,UAAM,iBAAkD,CAAC;AACzD,UAAM,eAAyB,CAAC;AAChC,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AACjE,qBAAe,QAAQ,IAAI,wBAAwB,UAAU;AAC7D,UAAI,WAAW,SAAU,cAAa,KAAK,QAAQ;AAAA,IACrD;AACA,SAAK,QAAQ;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,GAAI,aAAa,SAAS,IAAI,EAAE,UAAU,aAAa,IAAI,CAAC;AAAA,IAC9D;AACA,QAAI,OAAO,aAAa,OAAW,MAAK,WAAW,OAAO;AAC1D,QAAI,OAAO,aAAa,OAAW,MAAK,WAAW,OAAO;AAAA,EAC5D;AAGA,MAAI,OAAO,SAAS,iBAAiB,OAAO,SAAS;AACnD,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,MACX,MAAM;AAAA,MACN,MAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,IACzC;AAEA,WAAO,KAAK;AACZ,WAAO,KAAK;AAAA,EACd;AAGA,MAAI,OAAO,SAAS,eAAe;AACjC,SAAK,SAAS;AAAA,EAChB;AACA,MAAI,OAAO,SAAS,iBAAiB;AACnC,SAAK,SAAS;AAAA,EAChB;AAGA,MAAI,OAAO,QAAQ,SAAS,cAAc,OAAO,QAAQ,SAAS,SAAS;AAAA,EAE3E;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAqC;AAClE,QAAM,KAAoB,CAAC;AAG3B,QAAM,SAAS,mBAAmB,OAAO,IAAI;AAC7C,MAAI,OAAQ,IAAG,WAAW,IAAI;AAG9B,MAAI,OAAO,QAAQ,SAAS,WAAY,IAAG,WAAW,IAAI;AAC1D,MAAI,OAAO,QAAQ,SAAS,QAAS,IAAG,WAAW,IAAI;AACvD,MAAI,OAAO,QAAQ,YAAY,QAAS,IAAG,WAAW,IAAI;AAC1D,MAAI,OAAO,QAAQ,YAAY,aAAc,IAAG,WAAW,IAAI;AAE/D,MAAI,OAAO,YAAa,IAAG,gBAAgB,IAAI,OAAO;AACtD,MAAI,OAAO,SAAU,IAAG,SAAS,IAAI,OAAO;AAC5C,MAAI,OAAO,OAAQ,IAAG,WAAW,IAAI;AACrC,MAAI,OAAO,SAAU,IAAG,aAAa,IAAI;AACzC,MAAI,OAAO,SAAU,IAAG,aAAa,IAAI;AACzC,MAAI,OAAO,QAAQ,UAAW,IAAG,cAAc,IAAI;AACnD,MAAI,OAAO,QAAQ,UAAW,IAAG,eAAe,IAAI,OAAO,OAAO;AAClE,MAAI,OAAO,QAAQ,UAAW,IAAG,UAAU,IAAI;AAG/C,MAAI,OAAO,SAAS;AAClB,UAAM,WAAW,OAAO,QACrB,OAAO,CAAC,MAAM,EAAE,QAAQ,EACxB,IAAI,CAAC,MAAM,EAAE,KAAK;AACrB,QAAI,SAAS,SAAS,EAAG,IAAG,iBAAiB,IAAI;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,MACA,MACA,QACM;AACN,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,WAAK,YAAY,OAAO,QAAQ,OAAO,CAAC;AACxC;AAAA,IACF,KAAK;AACH,WAAK,YAAY,OAAO,QAAQ,OAAO,CAAC;AACxC;AAAA,IACF,KAAK;AACH,WAAK,UAAU,OAAO,QAAQ,WAAW,EAAE;AAC3C;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,QAAQ,UAAa,OAAO,QAAQ;AAC9C,aAAK,UAAU,OAAO,OAAO,GAAG;AAClC,UAAI,QAAQ,QAAQ,UAAa,OAAO,QAAQ;AAC9C,aAAK,UAAU,OAAO,OAAO,GAAG;AAClC;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,iBAAiB;AAC3B,aAAK,mBAAmB,OAAO,OAAO,YAAY;AACpD,UAAI,QAAQ,iBAAiB;AAC3B,aAAK,mBAAmB,OAAO,OAAO,YAAY;AACpD;AAAA,IACF,KAAK;AACH,WAAK,aAAa,OAAO,QAAQ,UAAU,CAAC;AAC5C;AAAA,IACF,KAAK;AACH,WAAK,SAAS;AACd;AAAA,IACF,KAAK;AACH,WAAK,SAAS;AACd;AAAA,IACF,KAAK;AACH,WAAK,cAAc;AACnB;AAAA,EACJ;AACF;AAEA,SAAS,kBACP,YACAA,WACA,UACA,SACA,QACM;AACN,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,MAAI,eAAe;AACnB,MAAI,YAAY;AAEhB,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,aAAa,IAAI,GAAG;AACvB,mBAAa,IAAI,IAAI;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AACA,QAAI,CAAC,aAAa,IAAI,EAAE,YAAY;AAClC,mBAAa,IAAI,EAAE,aAAa,CAAC;AAAA,IACnC;AACA,mBAAe,aAAa,IAAI,EAAE;AAElC,QAAI,CAAC,UAAU,IAAI,GAAG;AACpB,gBAAU,IAAI,IAAI,CAAC;AAAA,IACrB;AACA,gBAAY,UAAU,IAAI;AAAA,EAC5B;AAEA,QAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,eAAa,QAAQ,IAAI,wBAAwB,MAAM;AACvD,MAAI,OAAO,UAAU;AAEnB,UAAM,aAAa,MAAM,MAAM,GAAG,EAAE;AACpC,QAAI;AACJ,QAAI,QAAQ;AACZ,eAAW,KAAK,YAAY;AAC1B,mBAAa,MAAM,CAAC;AACpB,cAAQ,YAAY,cAAc,CAAC;AAAA,IACrC;AACA,QAAI,YAAY;AACd,iBAAW,WAAW,CAAC,GAAI,WAAW,YAAY,CAAC,GAAI,QAAQ;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,UAAU,sBAAsB,MAAM;AAC5C,MAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,cAAU,QAAQ,IAAI;AAAA,EACxB;AACF;;;ACvQO,SAAS,uBAAuB,WAAkD;AACvF,QAAM,UAAwC,CAAC;AAC/C,QAAM,QAAQ,YAAY,SAAS;AACnC,MAAI,CAAC,MAAO,QAAO;AAEnB,aAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC5D,YAAQ,SAAS,IAAI,iBAAiB,WAAW,WAAqB;AAAA,EACxE;AAEA,SAAO;AACT;AAaA,SAAS,YAAY,QAAiD;AACpE,QAAM,IAAI;AACV,MAAI,GAAG,QAAQ,OAAO,EAAE,SAAS,UAAU;AACzC,UAAM,MAAM,EAAE;AACd,QAAI,OAAO,IAAI,UAAU,WAAY,QAAQ,IAAI,MAAwC;AACzF,QAAI,OAAO,IAAI,UAAU,YAAY,IAAI,UAAU,KAAM,QAAO,IAAI;AAAA,EACtE;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,WAAmB,OAA6B;AACxE,QAAM,EAAE,UAAU,WAAW,IAAI,cAAc,KAAK;AACpD,QAAM,SAAS,aAAa,KAAK;AAEjC,QAAM,SAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,OAAO,YAAY,SAAS;AAAA,IAC5B,UAAU,CAAC;AAAA,EACb;AAEA,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AACd,UAAI,OAAO,KAAK,OAAK,EAAE,SAAS,OAAO,GAAG;AACxC,eAAO,WAAW,CAAC,GAAI,OAAO,YAAY,CAAC,GAAI,EAAE,MAAM,QAAQ,CAAC;AAAA,MAClE;AACA,UAAI,OAAO,KAAK,OAAK,EAAE,SAAS,KAAK,GAAG;AACtC,eAAO,WAAW,CAAC,GAAI,OAAO,YAAY,CAAC,GAAI,EAAE,MAAM,MAAM,CAAC;AAAA,MAChE;AACA;AAAA,IACF,KAAK;AACH,aAAO,OAAO;AACd;AAAA,IACF,KAAK;AACH,aAAO,OAAO;AACd;AAAA,IACF,KAAK;AAAA,IACL,KAAK,iBAAiB;AACpB,aAAO,OAAO;AACd,YAAM,SAAS,iBAAiB,KAAK;AACrC,UAAI,QAAQ;AACV,eAAO,UAAU,OAAO,IAAI,QAAM,EAAE,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,EAAE;AAAA,MAC3E;AACA;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,OAAO;AACd;AAAA,IACF,KAAK;AACH,aAAO,OAAO;AACd;AAAA,IACF;AACE,aAAO,OAAO;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAA0D;AAC/E,MAAI,UAAU;AACd,MAAI,aAAa;AACjB,SAAO,SAAS,MAAM;AACpB,UAAM,KAAK,QAAQ,KAAK;AACxB,QAAI,OAAO,iBAAiB,OAAO,eAAe;AAChD,mBAAa;AACb,gBAAU,QAAQ,KAAK;AAAA,IACzB,WAAW,OAAO,cAAc;AAC9B,gBAAU,QAAQ,KAAK;AAAA,IACzB,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,UAAU,SAAS,MAAM,YAAY,aAAa,WAAW;AACxE;AAEA,SAAS,aAAa,OAAyD;AAC7E,MAAI,UAAU;AACd,SAAO,SAAS,MAAM;AACpB,QAAI,QAAQ,KAAK,OAAQ,QAAO,QAAQ,KAAK;AAC7C,QAAI,QAAQ,KAAK,WAAW;AAAE,gBAAU,QAAQ,KAAK;AAAA,IAAqB,OAAO;AAAE;AAAA,IAAO;AAAA,EAC5F;AACA,SAAO,CAAC;AACV;AAEA,SAAS,iBAAiB,OAAgC;AACxD,MAAI,UAAU;AACd,SAAO,SAAS,MAAM;AACpB,QAAI,QAAQ,KAAK,OAAQ,QAAO,QAAQ,KAAK;AAC7C,QAAI,QAAQ,KAAK,WAAW;AAAE,gBAAU,QAAQ,KAAK;AAAA,IAAqB,OAAO;AAAE;AAAA,IAAO;AAAA,EAC5F;AACA,SAAO;AACT;AAEA,SAAS,YAAY,WAA2B;AAC9C,SAAO,UAAU,QAAQ,YAAY,KAAK,EAAE,QAAQ,MAAM,OAAK,EAAE,YAAY,CAAC,EAAE,KAAK;AACvF;;;AC7HA,IAAAC,iBAAkB;AAeX,SAAS,wBACd,SAC+B;AAC/B,QAAM,WAA0C,CAAC;AAEjD,aAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG;AACrD,UAAM,gBAAgB,eAAAC,QAAM,KAAK,QAAQ;AACzC,aAAS,GAAG,IAAI,eAAAA,QAAM;AAAA,MACpB,eAAAA,QAAM;AAAA,MACN,EAAE,UAAU,eAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,gBAAgB,GAAG,YAAY,EAAE;AAAA,MACtF,eAAAA,QAAM,cAAc,aAAa;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;;;AC9BA,IAAAC,iBAAyD;;;ACUzD,SAAS,UAAU,OAAgB,UAAU,oBAAI,QAAQ,GAAY;AACnE,MAAI,iBAAiB,MAAM;AACzB,WAAO,EAAE,QAAQ,QAAQ,OAAO,MAAM,YAAY,EAAE;AAAA,EACtD;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,QAAQ,IAAI,KAAK,EAAG,QAAO;AAC/B,YAAQ,IAAI,KAAK;AACjB,WAAO,MAAM,IAAI,CAAC,SAAS,UAAU,MAAM,OAAO,CAAC;AAAA,EACrD;AACA,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,QAAI,QAAQ,IAAI,KAAe,EAAG,QAAO;AACzC,YAAQ,IAAI,KAAe;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,OAAO,OAAO,KAAK,KAAgC,GAAG;AAC/D,aAAO,GAAG,IAAI,UAAW,MAAkC,GAAG,GAAG,OAAO;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,mBAAmB,MAA2B;AAC5D,SAAO,KAAK,UAAU,UAAU,IAAI,CAAC;AACvC;AAMO,SAAS,qBAAqB,MAA2B;AAC9D,SAAO,KAAK,MAAM,MAAM,CAAC,MAAM,UAAU;AACvC,QAAI,SAAS,OAAO,UAAU,YAAY,MAAM,WAAW,QAAQ;AACjE,aAAO,IAAI,KAAK,MAAM,KAAK;AAAA,IAC7B;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;ADjBA,SAAS,cAAc,QAAgB,QAAwB;AAC7D,SAAO,GAAG,MAAM,GAAG,MAAM;AAC3B;AAEA,SAAS,aAAkC;AACzC,MAAI;AACF,WAAO,OAAO,iBAAiB,cAAc,eAAe;AAAA,EAC9D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,oBAAoB,SAA+D;AACjG,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB,IAAI;AAEJ,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAkB,KAAK;AACvD,QAAM,cAAU,uBAAoB,IAAI;AACxC,QAAM,kBAAc,uBAAmD,MAAS;AAGhF,gCAAU,MAAM;AACd,YAAQ,UAAU;AAAA,EACpB,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAa,cAAc,QAAQ,gBAAgB;AAEzD,QAAM,gBAAY,4BAAY,MAAM;AAClC,QAAI;AACF,YAAM,UAAU,WAAW;AAC3B,UAAI,CAAC,QAAS;AACd,YAAM,aAA0B;AAAA,QAC9B,MAAM,QAAQ;AAAA,QACd,WAAW,KAAK,IAAI;AAAA,MACtB;AACA,cAAQ,QAAQ,YAAY,mBAAmB,UAAoC,CAAC;AACpF,kBAAY,IAAI;AAAA,IAClB,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,mBAAe,4BAAY,MAA0B;AACzD,QAAI;AACF,YAAM,UAAU,WAAW;AAC3B,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,SAAS,QAAQ,QAAQ,UAAU;AACzC,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,SAAS,qBAAqB,MAAM;AAC1C,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,iBAAa,4BAAY,MAAM;AACnC,QAAI;AACF,YAAM,UAAU,WAAW;AAC3B,UAAI,CAAC,QAAS;AACd,cAAQ,WAAW,UAAU;AAC7B,kBAAY,KAAK;AAAA,IACnB,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAGf,gCAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,QAAI;AACF,YAAM,UAAU,WAAW;AAC3B,UAAI,CAAC,SAAS;AAAE,oBAAY,KAAK;AAAG;AAAA,MAAQ;AAC5C,YAAM,SAAS,QAAQ,QAAQ,UAAU;AACzC,kBAAY,WAAW,IAAI;AAAA,IAC7B,QAAQ;AACN,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,SAAS,UAAU,CAAC;AAGxB,gCAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,gBAAY,UAAU,YAAY,MAAM;AACtC,gBAAU;AAAA,IACZ,GAAG,cAAc;AAEjB,WAAO,MAAM;AACX,UAAI,YAAY,YAAY,QAAW;AACrC,sBAAc,YAAY,OAAO;AACjC,oBAAY,UAAU;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,gBAAgB,SAAS,CAAC;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEhJA,IAAAC,iBAAkC;AAS3B,SAAS,gBACd,YACA,SACA,eACM;AACN,QAAM,uBAAmB,uBAAO,aAAa;AAC7C,mBAAiB,UAAU;AAE3B,gCAAU,MAAM;AACd,QAAI,CAAC,cAAc,OAAO,WAAW,YAAa;AAElD,UAAM,UAAU,CAAC,MAAyB;AACxC,QAAE,eAAe;AACjB,uBAAiB,UAAU;AAE3B,aAAQ,EAAE,cAAc,WAAW;AAAA,IACrC;AAEA,WAAO,iBAAiB,gBAAgB,OAAO;AAC/C,WAAO,MAAM,OAAO,oBAAoB,gBAAgB,OAAO;AAAA,EACjE,GAAG,CAAC,YAAY,OAAO,CAAC;AAC1B;;;ACxBO,IAAM,qBAAqB,CAChC,WACA,aACA,YACA,aACW;AACX,SAAO,GAAG,WAAW,IAAI,UAAU,IAAI,QAAQ,IAAI,SAAS;AAC9D;AAMO,IAAM,iBAAiB,CAAC,WAAmB,UAA+B;AAC/E,SAAO,QAAQ,GAAG,SAAS,WAAW;AACxC;AAMO,SAAS,cAAc,OAKP;AACrB,MAAI,MAAM,MAAO,QAAO;AACxB,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,SAAU,QAAO;AAC3B,SAAO;AACT;AAMO,SAAS,eAAe,SAAiB,SAA+C;AAC7F,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,MAAI,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAClC,MAAI,SAAS,eAAe;AAC1B,WAAO,KAAK,mBAAmB,QAAW,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,EAC/F;AACA,SAAO,KAAK,eAAe,QAAW,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,WAAW,MAAM,WAAW,QAAQ,UAAU,CAAC;AAC/H;AAKO,SAAS,oBAAoB,OAAwB;AAC1D,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,WAAO,eAAe,KAAe;AAAA,EACvC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAMO,SAAS,gBAAgB,OAAwB;AACtD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI;AACV,MAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAK,QAAO;AAC/B,MAAI,EAAE,SAAS,EAAE,IAAK,QAAO,GAAG,EAAE,KAAK,WAAM,EAAE,GAAG;AAClD,SAAO,EAAE,SAAS,EAAE;AACtB;AAKO,SAAS,aAAa,OAAwB;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAQ,MAAiB,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAC7E,SAAQ,MAAe,QAAQ;AACjC;AAKO,SAAS,cAAc,OAAuB;AACnD,SAAO,MAAM,QAAQ,OAAO,EAAE;AAChC;AAMO,SAAS,YAAY,QAAgB,QAAgD;AAC1F,MAAI,WAAW,MAAO,QAAO;AAE7B,MAAI,WAAW,iBAAiB;AAE9B,UAAMC,KAAI,OAAO,MAAM,GAAG,EAAE;AAC5B,QAAIA,GAAE,WAAW,EAAG,QAAO;AAC3B,QAAIA,GAAE,UAAU,EAAG,QAAO,IAAIA,EAAC;AAC/B,QAAIA,GAAE,UAAU,EAAG,QAAO,IAAIA,GAAE,CAAC,CAAC,IAAIA,GAAE,MAAM,CAAC,CAAC;AAChD,QAAIA,GAAE,UAAU,EAAG,QAAO,IAAIA,GAAE,CAAC,CAAC,IAAIA,GAAE,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAE,MAAM,CAAC,CAAC;AACjE,WAAO,IAAIA,GAAE,CAAC,CAAC,IAAIA,GAAE,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAE,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAE,MAAM,CAAC,CAAC;AAAA,EACjE;AAGA,QAAM,IAAI,OAAO,MAAM,GAAG,EAAE;AAC5B,MAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,MAAI,EAAE,UAAU,EAAG,QAAO,IAAI,CAAC;AAC/B,MAAI,EAAE,UAAU,EAAG,QAAO,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC1D,SAAO,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1D;AAKO,SAAS,cAAc,OAAe,UAA0B;AACrE,MAAI,CAAC,SAAS,MAAM,UAAU,SAAU,QAAO,SAAS;AACxD,QAAM,SAAS,WAAW;AAC1B,SAAO,GAAG,MAAM,UAAU,GAAG,MAAM,CAAC;AACtC;AAGO,IAAM,2BAA2B;AAGjC,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AACR;;;ACjIA,IAAI,eAAe;AACnB,IAAI,WAA8B,CAAC;AACnC,IAAI,gBAA2D;AAExD,SAAS,kBAAkB,UAAmD;AACnF,iBAAe;AACf,aAAW,CAAC;AACZ,kBAAgB,YAAY;AAC9B;AAEO,SAAS,qBAA2B;AACzC,iBAAe;AACf,kBAAgB;AAClB;AAEO,SAAS,eAAe,OAAiD;AAC9E,MAAI,CAAC,aAAc;AACnB,QAAM,YAAY,EAAE,GAAG,OAAO,WAAW,KAAK,IAAI,EAAE;AACpD,WAAS,KAAK,SAAS;AACvB,kBAAgB,SAAS;AAC3B;AAEO,SAAS,kBAAqC;AACnD,SAAO,CAAC,GAAG,QAAQ;AACrB;AAEO,SAAS,oBAA0B;AACxC,aAAW,CAAC;AACd;AAEO,SAAS,uBAAgC;AAC9C,SAAO;AACT;","names":["SortOptions","RulesEngineActionType","maxKb","getNestedValue","React","import_react","import_jsx_runtime","React","pattern","SortOptions","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_react_hook_form","import_react","import_react","import_react_hook_form","import_react","import_react_hook_form","import_react","import_jsx_runtime","React","required","import_jsx_runtime","required","React","import_jsx_runtime","React","import_react","import_react_hook_form","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","dirtyFields","import_react","import_jsx_runtime","React","timeline","config","fieldUiSchema","dataValue","required","import_react","React","import_react","import_react","d"]}