el-form-core
Version:
Framework-agnostic form validation engine - schema-first validation core for TypeScript applications. Supports Zod, Yup, Valibot and custom validators.
1 lines • 39.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/validation.ts","../src/utils.ts","../src/validators/adapters.ts","../src/validators/engine.ts","../src/validators/fileValidators.ts","../src/compatibility.ts"],"sourcesContent":["// Core validation utilities that can be shared across frameworks\nimport { z } from \"zod\";\n\nexport function parseZodErrors(error: z.ZodError): Record<string, string> {\n const errors: Record<string, string> = {};\n\n error.errors.forEach((err) => {\n const path = err.path.join(\".\");\n errors[path] = err.message;\n });\n\n return errors;\n}\n\nexport function flattenObject(obj: any, prefix = \"\"): Record<string, any> {\n const flattened: Record<string, any> = {};\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (\n typeof obj[key] === \"object\" &&\n obj[key] !== null &&\n !Array.isArray(obj[key])\n ) {\n Object.assign(flattened, flattenObject(obj[key], newKey));\n } else {\n flattened[newKey] = obj[key];\n }\n }\n }\n\n return flattened;\n}\n","// Core utility functions\nexport function setNestedValue(obj: any, path: string, value: any): any {\n const result = { ...obj };\n\n // Handle array notation like employees[0].name\n const normalizedPath = path.replace(/\\[(\\d+)\\]/g, \".$1\");\n const keys = normalizedPath.split(\".\").filter((key) => key !== \"\");\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n const nextKey = keys[i + 1];\n\n // Check if current key is numeric (array index)\n if (!isNaN(Number(key))) {\n // We're accessing an array index, current should already be an array\n if (!Array.isArray(current)) {\n current = [];\n }\n // Ensure we have a copy of the array\n if (!current[Number(key)]) {\n current[Number(key)] = !isNaN(Number(nextKey)) ? [] : {};\n } else {\n current[Number(key)] = Array.isArray(current[Number(key)])\n ? [...current[Number(key)]]\n : { ...current[Number(key)] };\n }\n current = current[Number(key)];\n } else {\n // Check if next key is an array index\n if (!isNaN(Number(nextKey))) {\n if (!Array.isArray(current[key])) {\n current[key] = [];\n } else {\n current[key] = [...current[key]];\n }\n } else {\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n } else {\n current[key] = { ...current[key] };\n }\n }\n current = current[key];\n }\n }\n\n const finalKey = keys[keys.length - 1];\n if (!isNaN(Number(finalKey))) {\n current[Number(finalKey)] = value;\n } else {\n current[finalKey] = value;\n }\n\n return result;\n}\n\nexport function getNestedValue(obj: any, path: string): any {\n // Handle array notation like employees[0].name\n const normalizedPath = path.replace(/\\[(\\d+)\\]/g, \".$1\");\n const keys = normalizedPath.split(\".\").filter((key) => key !== \"\");\n\n return keys.reduce((current, key) => {\n if (current === null || current === undefined) return undefined;\n\n if (!isNaN(Number(key))) {\n return Array.isArray(current) ? current[Number(key)] : undefined;\n }\n\n return current[key];\n }, obj);\n}\n\nexport function removeArrayItem(obj: any, path: string, index: number): any {\n const result = { ...obj };\n\n // Handle array notation like employees[0].name\n const normalizedPath = path.replace(/\\[(\\d+)\\]/g, \".$1\");\n const keys = normalizedPath.split(\".\").filter((key) => key !== \"\");\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n\n if (!isNaN(Number(key))) {\n // Array index\n if (Array.isArray(current)) {\n current[Number(key)] = Array.isArray(current[Number(key)])\n ? [...current[Number(key)]]\n : { ...current[Number(key)] };\n current = current[Number(key)];\n }\n } else {\n // Object key\n if (typeof current[key] === \"object\" && current[key] !== null) {\n current[key] = Array.isArray(current[key])\n ? [...current[key]]\n : { ...current[key] };\n }\n current = current[key];\n }\n }\n\n const arrayKey = keys[keys.length - 1];\n if (!isNaN(Number(arrayKey))) {\n // Removing from a numeric index (shouldn't happen with this function)\n if (Array.isArray(current)) {\n current.splice(Number(arrayKey), 1);\n }\n } else {\n // Removing from an array property\n if (Array.isArray(current[arrayKey])) {\n current[arrayKey] = [...current[arrayKey]];\n current[arrayKey].splice(index, 1);\n }\n }\n\n return result;\n}\n","import { ValidationResult, ValidatorContext } from \"./types\";\n\n// Schema type detection utilities\nexport function isZodSchema(schema: any): boolean {\n return (\n schema &&\n typeof schema === \"object\" &&\n typeof schema.parse === \"function\" &&\n typeof schema.safeParse === \"function\" &&\n schema._def !== undefined\n );\n}\n\nexport function isYupSchema(schema: any): boolean {\n return (\n schema &&\n typeof schema === \"object\" &&\n typeof schema.validate === \"function\" &&\n typeof schema.validateSync === \"function\" &&\n schema.__isYupSchema__ === true\n );\n}\n\nexport function isValibotSchema(schema: any): boolean {\n return (\n schema &&\n typeof schema === \"object\" &&\n schema._types !== undefined &&\n schema.kind !== undefined\n );\n}\n\nexport function isArkTypeSchema(schema: any): boolean {\n return (\n schema &&\n typeof schema === \"object\" &&\n typeof schema.assert === \"function\" &&\n schema.kind !== undefined\n );\n}\n\nexport function isEffectSchema(schema: any): boolean {\n return (\n schema &&\n typeof schema === \"object\" &&\n typeof schema.validate === \"function\" &&\n schema._schema !== undefined\n );\n}\n\nexport function isValidatorFunction(validator: any): boolean {\n return typeof validator === \"function\";\n}\n\nexport function isStandardSchema(schema: any): boolean {\n return (\n schema &&\n typeof schema === \"object\" &&\n typeof schema[\"~standard\"] === \"object\"\n );\n}\n\n// Schema adapter class\nexport class SchemaAdapter {\n static validate(\n schema: any,\n value: any,\n context?: ValidatorContext\n ): ValidationResult {\n try {\n // Handle validator functions first\n if (isValidatorFunction(schema)) {\n return this.validateFunction(schema, value, context);\n }\n\n // Handle Standard Schema compliant libraries\n if (isStandardSchema(schema)) {\n return this.validateStandardSchema(schema, value);\n }\n\n // Handle specific schema types\n if (isZodSchema(schema)) {\n return this.validateZod(schema, value);\n }\n\n if (isYupSchema(schema)) {\n return this.validateYup(schema, value);\n }\n\n if (isValibotSchema(schema)) {\n return this.validateValibot(schema, value);\n }\n\n if (isArkTypeSchema(schema)) {\n return this.validateArkType(schema, value);\n }\n\n if (isEffectSchema(schema)) {\n return this.validateEffect(schema, value);\n }\n\n throw new Error(\"Unsupported schema type\");\n } catch (error) {\n return {\n isValid: false,\n errors: {\n [context?.fieldName || \"form\"]:\n error instanceof Error ? error.message : \"Validation failed\",\n },\n };\n }\n }\n\n static async validateAsync(\n schema: any,\n value: any,\n context?: ValidatorContext\n ): Promise<ValidationResult> {\n try {\n // Handle async validator functions\n if (isValidatorFunction(schema)) {\n return await this.validateAsyncFunction(schema, value, context);\n }\n\n // For schemas, we can often use the same sync validation\n // since most schema libraries handle async validation internally\n return this.validate(schema, value, context);\n } catch (error) {\n return {\n isValid: false,\n errors: {\n [context?.fieldName || \"form\"]:\n error instanceof Error ? error.message : \"Validation failed\",\n },\n };\n }\n }\n\n private static validateFunction(\n validator: Function,\n value: any,\n context?: ValidatorContext\n ): ValidationResult {\n const result = validator(context || { value, values: {}, fieldName: \"\" });\n\n if (result === undefined || result === null) {\n return { isValid: true, errors: {} };\n }\n\n if (typeof result === \"string\") {\n return {\n isValid: false,\n errors: { [context?.fieldName || \"form\"]: result },\n };\n }\n\n // Handle form-level validation that returns field errors\n if (typeof result === \"object\" && result.fields) {\n return {\n isValid: false,\n errors: result.fields,\n };\n }\n\n return {\n isValid: false,\n errors: { [context?.fieldName || \"form\"]: String(result) },\n };\n }\n\n private static async validateAsyncFunction(\n validator: Function,\n value: any,\n context?: ValidatorContext\n ): Promise<ValidationResult> {\n const result = await validator(\n context || { value, values: {}, fieldName: \"\" }\n );\n return this.validateFunction(() => result, value, context);\n }\n\n private static validateStandardSchema(\n schema: any,\n value: any\n ): ValidationResult {\n const result = schema[\"~standard\"].validate(value);\n\n if (result.issues && result.issues.length > 0) {\n const errors: Record<string, string> = {};\n result.issues.forEach((issue: any) => {\n const path = issue.path?.join(\".\") || \"form\";\n errors[path] = issue.message;\n });\n return { isValid: false, errors };\n }\n\n return { isValid: true, errors: {} };\n }\n\n private static validateZod(schema: any, value: any): ValidationResult {\n const result = schema.safeParse(value);\n\n if (!result.success) {\n const errors: Record<string, string> = {};\n result.error.errors.forEach((err: any) => {\n const path = err.path.join(\".\") || \"form\";\n errors[path] = err.message;\n });\n\n return { isValid: false, errors };\n }\n\n return { isValid: true, errors: {} };\n }\n\n private static validateYup(schema: any, value: any): ValidationResult {\n try {\n schema.validateSync(value, { abortEarly: false });\n return { isValid: true, errors: {} };\n } catch (error: any) {\n const errors: Record<string, string> = {};\n\n if (error.inner && error.inner.length > 0) {\n error.inner.forEach((err: any) => {\n errors[err.path || \"form\"] = err.message;\n });\n } else {\n errors[error.path || \"form\"] = error.message;\n }\n\n return { isValid: false, errors };\n }\n }\n\n private static validateValibot(schema: any, value: any): ValidationResult {\n // Valibot validation implementation\n // This is a simplified version - actual implementation would depend on Valibot's API\n try {\n if (schema.parse) {\n schema.parse(value);\n }\n return { isValid: true, errors: {} };\n } catch (error: any) {\n return {\n isValid: false,\n errors: { form: error.message || \"Validation failed\" },\n };\n }\n }\n\n private static validateArkType(schema: any, value: any): ValidationResult {\n try {\n schema.assert(value);\n return { isValid: true, errors: {} };\n } catch (error: any) {\n return {\n isValid: false,\n errors: { form: error.message || \"Validation failed\" },\n };\n }\n }\n\n private static validateEffect(schema: any, value: any): ValidationResult {\n try {\n const result = schema.validate(value);\n if (result._tag === \"Success\") {\n return { isValid: true, errors: {} };\n } else {\n return {\n isValid: false,\n errors: { form: \"Validation failed\" },\n };\n }\n } catch (error: any) {\n return {\n isValid: false,\n errors: { form: error.message || \"Validation failed\" },\n };\n }\n }\n}\n","import {\n ValidatorConfig,\n ValidatorContext,\n ValidationResult,\n ValidatorEvent,\n FormLevelValidator,\n} from \"./types\";\nimport { SchemaAdapter } from \"./adapters\";\n\n// Framework-agnostic timer type that works in both browser and Node.js\ntype Timer = number | any;\n\nexport class ValidationEngine {\n private debounceTimers: Map<string, Timer> = new Map();\n\n /**\n * Validates a single field using the provided validator configuration\n */\n async validateField(\n fieldName: string,\n value: any,\n values: Record<string, any>,\n config: ValidatorConfig,\n event: ValidatorEvent\n ): Promise<ValidationResult> {\n const context: ValidatorContext = {\n value,\n values,\n fieldName,\n };\n\n const validatorKey = event.isAsync ? `${event.type}Async` : event.type;\n const validator = config[validatorKey as keyof ValidatorConfig];\n\n if (!validator) {\n return { isValid: true, errors: {} };\n }\n\n if (event.isAsync) {\n return this.validateAsync(validator, context, config, event);\n } else {\n return SchemaAdapter.validate(validator, value, context);\n }\n }\n\n /**\n * Validates the entire form using form-level validators\n */\n async validateForm(\n values: Record<string, any>,\n config: ValidatorConfig,\n event: ValidatorEvent\n ): Promise<ValidationResult> {\n const validatorKey = event.isAsync ? `${event.type}Async` : event.type;\n const validator = config[validatorKey as keyof ValidatorConfig];\n\n if (!validator) {\n return { isValid: true, errors: {} };\n }\n\n const context = { value: values };\n\n let result;\n if (event.isAsync) {\n result = await this.validateFormAsync(validator, context, config, event);\n } else {\n result = this.validateFormSync(validator, context);\n }\n\n return result;\n }\n\n /**\n * Validates multiple fields at once\n */\n async validateFields(\n fieldNames: string[],\n values: Record<string, any>,\n fieldConfigs: Record<string, ValidatorConfig>,\n event: ValidatorEvent\n ): Promise<ValidationResult> {\n const results = await Promise.all(\n fieldNames.map((fieldName) => {\n const config = fieldConfigs[fieldName];\n if (!config) return { isValid: true, errors: {} };\n\n return this.validateField(\n fieldName,\n values[fieldName],\n values,\n config,\n event\n );\n })\n );\n\n // Combine all results\n const combinedErrors: Record<string, string> = {};\n let isValid = true;\n\n results.forEach((result) => {\n if (!result.isValid) {\n isValid = false;\n Object.assign(combinedErrors, result.errors);\n }\n });\n\n return { isValid, errors: combinedErrors };\n }\n\n /**\n * Clears debounce timer for a specific field\n */\n clearDebounce(fieldName: string, eventType: string): void {\n const key = `${fieldName}-${eventType}`;\n const timer = this.debounceTimers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.debounceTimers.delete(key);\n }\n }\n\n /**\n * Clears all debounce timers\n */\n clearAllDebounce(): void {\n this.debounceTimers.forEach((timer) => clearTimeout(timer));\n this.debounceTimers.clear();\n }\n\n private async validateAsync(\n validator: any,\n context: ValidatorContext,\n config: ValidatorConfig,\n event: ValidatorEvent\n ): Promise<ValidationResult> {\n // Get debounce time\n const specificDebounceKey =\n `${event.type}AsyncDebounceMs` as keyof ValidatorConfig;\n const debounceMs =\n (config[specificDebounceKey] as number) || config.asyncDebounceMs || 0;\n\n if (debounceMs > 0) {\n return this.validateWithDebounce(\n validator,\n context,\n config,\n event,\n debounceMs\n );\n }\n\n return SchemaAdapter.validateAsync(validator, context.value, context);\n }\n\n private async validateWithDebounce(\n validator: any,\n context: ValidatorContext,\n _config: ValidatorConfig,\n event: ValidatorEvent,\n debounceMs: number\n ): Promise<ValidationResult> {\n const key = `${context.fieldName}-${event.type}`;\n\n // Clear existing timer\n this.clearDebounce(context.fieldName, event.type);\n\n return new Promise((resolve) => {\n const timer = setTimeout(async () => {\n this.debounceTimers.delete(key);\n const result = await SchemaAdapter.validateAsync(\n validator,\n context.value,\n context\n );\n resolve(result);\n }, debounceMs);\n\n this.debounceTimers.set(key, timer);\n });\n }\n\n private validateFormSync(\n validator: any,\n context: { value: Record<string, any> }\n ): ValidationResult {\n if (typeof validator === \"function\") {\n const result = (validator as FormLevelValidator)(context);\n\n if (result === undefined || result === null) {\n return { isValid: true, errors: {} };\n }\n\n if (typeof result === \"string\") {\n return {\n isValid: false,\n errors: { form: result },\n };\n }\n\n if (typeof result === \"object\" && result.fields) {\n return {\n isValid: false,\n errors: result.fields,\n };\n }\n }\n\n // For schema validators at form level, validate the entire form values\n return SchemaAdapter.validate(validator, context.value);\n }\n\n private async validateFormAsync(\n validator: any,\n context: { value: Record<string, any> },\n config: ValidatorConfig,\n event: ValidatorEvent\n ): Promise<ValidationResult> {\n const debounceMs = config.asyncDebounceMs || 0;\n\n if (debounceMs > 0) {\n const key = `form-${event.type}`;\n this.clearDebounce(\"form\", event.type);\n\n return new Promise((resolve) => {\n const timer = setTimeout(async () => {\n this.debounceTimers.delete(key);\n const result = await this.executeFormAsyncValidation(\n validator,\n context\n );\n resolve(result);\n }, debounceMs);\n\n this.debounceTimers.set(key, timer);\n });\n }\n\n return this.executeFormAsyncValidation(validator, context);\n }\n\n private async executeFormAsyncValidation(\n validator: any,\n context: { value: Record<string, any> }\n ): Promise<ValidationResult> {\n if (typeof validator === \"function\") {\n const result = await (validator as FormLevelValidator)(context);\n\n if (result === undefined || result === null) {\n return { isValid: true, errors: {} };\n }\n\n if (typeof result === \"string\") {\n return {\n isValid: false,\n errors: { form: result },\n };\n }\n\n if (typeof result === \"object\" && result.fields) {\n return {\n isValid: false,\n errors: result.fields,\n };\n }\n }\n\n // For schema validators at form level\n return SchemaAdapter.validateAsync(validator, context.value);\n }\n}\n\n// Export a singleton instance for use across the application\nexport const validationEngine = new ValidationEngine();\n","import { ValidatorFunction } from \"./types\";\n\nexport interface FileValidationOptions {\n maxSize?: number;\n minSize?: number;\n maxFiles?: number;\n minFiles?: number;\n acceptedTypes?: string[];\n acceptedExtensions?: string[];\n}\n\n/**\n * Format file size for human-readable error messages\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\n/**\n * Get file extension from filename\n */\nfunction getFileExtension(fileName: string): string {\n return fileName.slice(((fileName.lastIndexOf(\".\") - 1) >>> 0) + 2);\n}\n\n/**\n * Validate a single file against options\n */\nexport function validateFile(\n file: File,\n options: FileValidationOptions\n): string | undefined {\n if (options.maxSize && file.size > options.maxSize) {\n return `File size must be less than ${formatFileSize(options.maxSize)}`;\n }\n\n if (options.minSize && file.size < options.minSize) {\n return `File size must be at least ${formatFileSize(options.minSize)}`;\n }\n\n if (options.acceptedTypes && !options.acceptedTypes.includes(file.type)) {\n return `File type ${file.type} is not allowed`;\n }\n\n if (options.acceptedExtensions) {\n const ext = getFileExtension(file.name).toLowerCase();\n if (!options.acceptedExtensions.includes(ext)) {\n return `File extension .${ext} is not allowed`;\n }\n }\n\n return undefined;\n}\n\n/**\n * Validate multiple files against options\n */\nexport function validateFiles(\n files: FileList | File[],\n options: FileValidationOptions\n): string | undefined {\n const fileArray = Array.from(files);\n\n if (options.maxFiles && fileArray.length > options.maxFiles) {\n return `Maximum ${options.maxFiles} files allowed`;\n }\n\n if (options.minFiles && fileArray.length < options.minFiles) {\n return `Minimum ${options.minFiles} files required`;\n }\n\n // Validate each file\n for (const file of fileArray) {\n const error = validateFile(file, options);\n if (error) return error;\n }\n\n return undefined;\n}\n\n/**\n * Create a file validator function for el-form's validation system\n */\nexport function createFileValidator(\n options: FileValidationOptions\n): ValidatorFunction {\n return ({ value }) => {\n if (!value) return undefined;\n\n if (value instanceof File) {\n return validateFile(value, options);\n }\n\n if (value instanceof FileList || Array.isArray(value)) {\n return validateFiles(value, options);\n }\n\n return undefined;\n };\n}\n\n/**\n * Preset file validators for common use cases\n */\nexport const fileValidators = {\n /**\n * Image files (JPEG, PNG, GIF, WebP) up to 5MB\n */\n image: createFileValidator({\n acceptedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\n maxSize: 5 * 1024 * 1024, // 5MB\n }),\n\n /**\n * Avatar images (JPEG, PNG) up to 2MB, single file only\n */\n avatar: createFileValidator({\n acceptedTypes: [\"image/jpeg\", \"image/png\"],\n maxSize: 2 * 1024 * 1024, // 2MB\n maxFiles: 1,\n }),\n\n /**\n * Document files (PDF, Word, Text) up to 10MB\n */\n document: createFileValidator({\n acceptedTypes: [\n \"application/pdf\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"text/plain\",\n ],\n maxSize: 10 * 1024 * 1024, // 10MB\n }),\n\n /**\n * Image gallery (multiple images) up to 5MB each, max 10 files\n */\n gallery: createFileValidator({\n acceptedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\"],\n maxSize: 5 * 1024 * 1024, // 5MB each\n maxFiles: 10,\n }),\n\n /**\n * Video files (MP4, WebM, MOV) up to 50MB\n */\n video: createFileValidator({\n acceptedTypes: [\"video/mp4\", \"video/webm\", \"video/quicktime\"],\n maxSize: 50 * 1024 * 1024, // 50MB\n }),\n\n /**\n * Audio files (MP3, WAV, OGG) up to 20MB\n */\n audio: createFileValidator({\n acceptedTypes: [\"audio/mpeg\", \"audio/wav\", \"audio/ogg\"],\n maxSize: 20 * 1024 * 1024, // 20MB\n }),\n};\n\n/**\n * Helper to create custom file validator with specific options\n */\nexport function fileValidator(\n options: FileValidationOptions\n): ValidatorFunction {\n return createFileValidator(options);\n}\n","// Backward compatibility utilities for migrating from zod-only validation\nimport { SchemaAdapter } from \"./validators\";\nimport { ValidationResult } from \"./validators/types\";\n\n/**\n * @deprecated Use SchemaAdapter.validate instead\n * Validates form data using a zod schema (backward compatibility)\n */\nexport function validateForm<T>(\n schema: any,\n data: T\n): { success: boolean; data?: T; errors?: Record<string, string> } {\n const result = SchemaAdapter.validate(schema, data);\n\n if (result.isValid) {\n return { success: true, data };\n } else {\n return { success: false, errors: result.errors };\n }\n}\n\n/**\n * Creates a validator config from a zod schema for easy migration\n */\nexport function createValidatorFromSchema(\n schema: any,\n events: (\"onChange\" | \"onBlur\" | \"onSubmit\")[] = [\"onSubmit\"]\n) {\n const config: any = {};\n\n events.forEach((event) => {\n config[event] = schema;\n });\n\n return config;\n}\n\n/**\n * Utility to check if a validation result has errors\n */\nexport function hasValidationErrors(result: ValidationResult): boolean {\n return !result.isValid && Object.keys(result.errors).length > 0;\n}\n\n/**\n * Utility to get the first validation error message\n */\nexport function getFirstValidationError(\n result: ValidationResult\n): string | undefined {\n if (result.isValid) return undefined;\n\n const firstKey = Object.keys(result.errors)[0];\n return firstKey ? result.errors[firstKey] : undefined;\n}\n"],"mappings":";;;;;AAGO,SAAS,eAAe,OAA2C;AACxE,QAAM,SAAiC,CAAC;AAExC,QAAM,OAAO,QAAQ,CAAC,QAAQ;AAC5B,UAAM,OAAO,IAAI,KAAK,KAAK,GAAG;AAC9B,WAAO,IAAI,IAAI,IAAI;AAAA,EACrB,CAAC;AAED,SAAO;AACT;AAEO,SAAS,cAAc,KAAU,SAAS,IAAyB;AACxE,QAAM,YAAiC,CAAC;AAExC,aAAW,OAAO,KAAK;AACrB,QAAI,IAAI,eAAe,GAAG,GAAG;AAC3B,YAAM,SAAS,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAE7C,UACE,OAAO,IAAI,GAAG,MAAM,YACpB,IAAI,GAAG,MAAM,QACb,CAAC,MAAM,QAAQ,IAAI,GAAG,CAAC,GACvB;AACA,eAAO,OAAO,WAAW,cAAc,IAAI,GAAG,GAAG,MAAM,CAAC;AAAA,MAC1D,OAAO;AACL,kBAAU,MAAM,IAAI,IAAI,GAAG;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACjCO,SAAS,eAAe,KAAU,MAAc,OAAiB;AACtE,QAAM,SAAS,EAAE,GAAG,IAAI;AAGxB,QAAM,iBAAiB,KAAK,QAAQ,cAAc,KAAK;AACvD,QAAM,OAAO,eAAe,MAAM,GAAG,EAAE,OAAO,CAAC,QAAQ,QAAQ,EAAE;AACjE,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,UAAU,KAAK,IAAI,CAAC;AAG1B,QAAI,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG;AAEvB,UAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,kBAAU,CAAC;AAAA,MACb;AAEA,UAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,GAAG;AACzB,gBAAQ,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,MACzD,OAAO;AACL,gBAAQ,OAAO,GAAG,CAAC,IAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG,CAAC,CAAC,IACrD,CAAC,GAAG,QAAQ,OAAO,GAAG,CAAC,CAAC,IACxB,EAAE,GAAG,QAAQ,OAAO,GAAG,CAAC,EAAE;AAAA,MAChC;AACA,gBAAU,QAAQ,OAAO,GAAG,CAAC;AAAA,IAC/B,OAAO;AAEL,UAAI,CAAC,MAAM,OAAO,OAAO,CAAC,GAAG;AAC3B,YAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG,CAAC,GAAG;AAChC,kBAAQ,GAAG,IAAI,CAAC;AAAA,QAClB,OAAO;AACL,kBAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC;AAAA,QACjC;AAAA,MACF,OAAO;AACL,YAAI,OAAO,QAAQ,GAAG,MAAM,YAAY,QAAQ,GAAG,MAAM,MAAM;AAC7D,kBAAQ,GAAG,IAAI,CAAC;AAAA,QAClB,OAAO;AACL,kBAAQ,GAAG,IAAI,EAAE,GAAG,QAAQ,GAAG,EAAE;AAAA,QACnC;AAAA,MACF;AACA,gBAAU,QAAQ,GAAG;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,KAAK,SAAS,CAAC;AACrC,MAAI,CAAC,MAAM,OAAO,QAAQ,CAAC,GAAG;AAC5B,YAAQ,OAAO,QAAQ,CAAC,IAAI;AAAA,EAC9B,OAAO;AACL,YAAQ,QAAQ,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,KAAU,MAAmB;AAE1D,QAAM,iBAAiB,KAAK,QAAQ,cAAc,KAAK;AACvD,QAAM,OAAO,eAAe,MAAM,GAAG,EAAE,OAAO,CAAC,QAAQ,QAAQ,EAAE;AAEjE,SAAO,KAAK,OAAO,CAAC,SAAS,QAAQ;AACnC,QAAI,YAAY,QAAQ,YAAY,OAAW,QAAO;AAEtD,QAAI,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG;AACvB,aAAO,MAAM,QAAQ,OAAO,IAAI,QAAQ,OAAO,GAAG,CAAC,IAAI;AAAA,IACzD;AAEA,WAAO,QAAQ,GAAG;AAAA,EACpB,GAAG,GAAG;AACR;AAEO,SAAS,gBAAgB,KAAU,MAAc,OAAoB;AAC1E,QAAM,SAAS,EAAE,GAAG,IAAI;AAGxB,QAAM,iBAAiB,KAAK,QAAQ,cAAc,KAAK;AACvD,QAAM,OAAO,eAAe,MAAM,GAAG,EAAE,OAAO,CAAC,QAAQ,QAAQ,EAAE;AACjE,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG;AAEvB,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,gBAAQ,OAAO,GAAG,CAAC,IAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG,CAAC,CAAC,IACrD,CAAC,GAAG,QAAQ,OAAO,GAAG,CAAC,CAAC,IACxB,EAAE,GAAG,QAAQ,OAAO,GAAG,CAAC,EAAE;AAC9B,kBAAU,QAAQ,OAAO,GAAG,CAAC;AAAA,MAC/B;AAAA,IACF,OAAO;AAEL,UAAI,OAAO,QAAQ,GAAG,MAAM,YAAY,QAAQ,GAAG,MAAM,MAAM;AAC7D,gBAAQ,GAAG,IAAI,MAAM,QAAQ,QAAQ,GAAG,CAAC,IACrC,CAAC,GAAG,QAAQ,GAAG,CAAC,IAChB,EAAE,GAAG,QAAQ,GAAG,EAAE;AAAA,MACxB;AACA,gBAAU,QAAQ,GAAG;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,KAAK,SAAS,CAAC;AACrC,MAAI,CAAC,MAAM,OAAO,QAAQ,CAAC,GAAG;AAE5B,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,cAAQ,OAAO,OAAO,QAAQ,GAAG,CAAC;AAAA,IACpC;AAAA,EACF,OAAO;AAEL,QAAI,MAAM,QAAQ,QAAQ,QAAQ,CAAC,GAAG;AACpC,cAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,QAAQ,CAAC;AACzC,cAAQ,QAAQ,EAAE,OAAO,OAAO,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;;;ACnHO,SAAS,YAAY,QAAsB;AAChD,SACE,UACA,OAAO,WAAW,YAClB,OAAO,OAAO,UAAU,cACxB,OAAO,OAAO,cAAc,cAC5B,OAAO,SAAS;AAEpB;AAEO,SAAS,YAAY,QAAsB;AAChD,SACE,UACA,OAAO,WAAW,YAClB,OAAO,OAAO,aAAa,cAC3B,OAAO,OAAO,iBAAiB,cAC/B,OAAO,oBAAoB;AAE/B;AAEO,SAAS,gBAAgB,QAAsB;AACpD,SACE,UACA,OAAO,WAAW,YAClB,OAAO,WAAW,UAClB,OAAO,SAAS;AAEpB;AAEO,SAAS,gBAAgB,QAAsB;AACpD,SACE,UACA,OAAO,WAAW,YAClB,OAAO,OAAO,WAAW,cACzB,OAAO,SAAS;AAEpB;AAEO,SAAS,eAAe,QAAsB;AACnD,SACE,UACA,OAAO,WAAW,YAClB,OAAO,OAAO,aAAa,cAC3B,OAAO,YAAY;AAEvB;AAEO,SAAS,oBAAoB,WAAyB;AAC3D,SAAO,OAAO,cAAc;AAC9B;AAEO,SAAS,iBAAiB,QAAsB;AACrD,SACE,UACA,OAAO,WAAW,YAClB,OAAO,OAAO,WAAW,MAAM;AAEnC;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACzB,OAAO,SACL,QACA,OACA,SACkB;AAClB,QAAI;AAEF,UAAI,oBAAoB,MAAM,GAAG;AAC/B,eAAO,KAAK,iBAAiB,QAAQ,OAAO,OAAO;AAAA,MACrD;AAGA,UAAI,iBAAiB,MAAM,GAAG;AAC5B,eAAO,KAAK,uBAAuB,QAAQ,KAAK;AAAA,MAClD;AAGA,UAAI,YAAY,MAAM,GAAG;AACvB,eAAO,KAAK,YAAY,QAAQ,KAAK;AAAA,MACvC;AAEA,UAAI,YAAY,MAAM,GAAG;AACvB,eAAO,KAAK,YAAY,QAAQ,KAAK;AAAA,MACvC;AAEA,UAAI,gBAAgB,MAAM,GAAG;AAC3B,eAAO,KAAK,gBAAgB,QAAQ,KAAK;AAAA,MAC3C;AAEA,UAAI,gBAAgB,MAAM,GAAG;AAC3B,eAAO,KAAK,gBAAgB,QAAQ,KAAK;AAAA,MAC3C;AAEA,UAAI,eAAe,MAAM,GAAG;AAC1B,eAAO,KAAK,eAAe,QAAQ,KAAK;AAAA,MAC1C;AAEA,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,CAAC,SAAS,aAAa,MAAM,GAC3B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,cACX,QACA,OACA,SAC2B;AAC3B,QAAI;AAEF,UAAI,oBAAoB,MAAM,GAAG;AAC/B,eAAO,MAAM,KAAK,sBAAsB,QAAQ,OAAO,OAAO;AAAA,MAChE;AAIA,aAAO,KAAK,SAAS,QAAQ,OAAO,OAAO;AAAA,IAC7C,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,CAAC,SAAS,aAAa,MAAM,GAC3B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,iBACb,WACA,OACA,SACkB;AAClB,UAAM,SAAS,UAAU,WAAW,EAAE,OAAO,QAAQ,CAAC,GAAG,WAAW,GAAG,CAAC;AAExE,QAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,aAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,IACrC;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,CAAC,SAAS,aAAa,MAAM,GAAG,OAAO;AAAA,MACnD;AAAA,IACF;AAGA,QAAI,OAAO,WAAW,YAAY,OAAO,QAAQ;AAC/C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,EAAE,CAAC,SAAS,aAAa,MAAM,GAAG,OAAO,MAAM,EAAE;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,aAAqB,sBACnB,WACA,OACA,SAC2B;AAC3B,UAAM,SAAS,MAAM;AAAA,MACnB,WAAW,EAAE,OAAO,QAAQ,CAAC,GAAG,WAAW,GAAG;AAAA,IAChD;AACA,WAAO,KAAK,iBAAiB,MAAM,QAAQ,OAAO,OAAO;AAAA,EAC3D;AAAA,EAEA,OAAe,uBACb,QACA,OACkB;AAClB,UAAM,SAAS,OAAO,WAAW,EAAE,SAAS,KAAK;AAEjD,QAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,YAAM,SAAiC,CAAC;AACxC,aAAO,OAAO,QAAQ,CAAC,UAAe;AACpC,cAAM,OAAO,MAAM,MAAM,KAAK,GAAG,KAAK;AACtC,eAAO,IAAI,IAAI,MAAM;AAAA,MACvB,CAAC;AACD,aAAO,EAAE,SAAS,OAAO,OAAO;AAAA,IAClC;AAEA,WAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,EACrC;AAAA,EAEA,OAAe,YAAY,QAAa,OAA8B;AACpE,UAAM,SAAS,OAAO,UAAU,KAAK;AAErC,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,SAAiC,CAAC;AACxC,aAAO,MAAM,OAAO,QAAQ,CAAC,QAAa;AACxC,cAAM,OAAO,IAAI,KAAK,KAAK,GAAG,KAAK;AACnC,eAAO,IAAI,IAAI,IAAI;AAAA,MACrB,CAAC;AAED,aAAO,EAAE,SAAS,OAAO,OAAO;AAAA,IAClC;AAEA,WAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,EACrC;AAAA,EAEA,OAAe,YAAY,QAAa,OAA8B;AACpE,QAAI;AACF,aAAO,aAAa,OAAO,EAAE,YAAY,MAAM,CAAC;AAChD,aAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,IACrC,SAAS,OAAY;AACnB,YAAM,SAAiC,CAAC;AAExC,UAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,cAAM,MAAM,QAAQ,CAAC,QAAa;AAChC,iBAAO,IAAI,QAAQ,MAAM,IAAI,IAAI;AAAA,QACnC,CAAC;AAAA,MACH,OAAO;AACL,eAAO,MAAM,QAAQ,MAAM,IAAI,MAAM;AAAA,MACvC;AAEA,aAAO,EAAE,SAAS,OAAO,OAAO;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,OAAe,gBAAgB,QAAa,OAA8B;AAGxE,QAAI;AACF,UAAI,OAAO,OAAO;AAChB,eAAO,MAAM,KAAK;AAAA,MACpB;AACA,aAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,IACrC,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,MAAM,MAAM,WAAW,oBAAoB;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,gBAAgB,QAAa,OAA8B;AACxE,QAAI;AACF,aAAO,OAAO,KAAK;AACnB,aAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,IACrC,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,MAAM,MAAM,WAAW,oBAAoB;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,eAAe,QAAa,OAA8B;AACvE,QAAI;AACF,YAAM,SAAS,OAAO,SAAS,KAAK;AACpC,UAAI,OAAO,SAAS,WAAW;AAC7B,eAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,MACrC,OAAO;AACL,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,EAAE,MAAM,oBAAoB;AAAA,QACtC;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,MAAM,MAAM,WAAW,oBAAoB;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACF;;;AC5QO,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACL,wBAAQ,kBAAqC,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrD,MAAM,cACJ,WACA,OACA,QACA,QACA,OAC2B;AAC3B,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,UAAU,GAAG,MAAM,IAAI,UAAU,MAAM;AAClE,UAAM,YAAY,OAAO,YAAqC;AAE9D,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,IACrC;AAEA,QAAI,MAAM,SAAS;AACjB,aAAO,KAAK,cAAc,WAAW,SAAS,QAAQ,KAAK;AAAA,IAC7D,OAAO;AACL,aAAO,cAAc,SAAS,WAAW,OAAO,OAAO;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,QACA,QACA,OAC2B;AAC3B,UAAM,eAAe,MAAM,UAAU,GAAG,MAAM,IAAI,UAAU,MAAM;AAClE,UAAM,YAAY,OAAO,YAAqC;AAE9D,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,IACrC;AAEA,UAAM,UAAU,EAAE,OAAO,OAAO;AAEhC,QAAI;AACJ,QAAI,MAAM,SAAS;AACjB,eAAS,MAAM,KAAK,kBAAkB,WAAW,SAAS,QAAQ,KAAK;AAAA,IACzE,OAAO;AACL,eAAS,KAAK,iBAAiB,WAAW,OAAO;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,YACA,QACA,cACA,OAC2B;AAC3B,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,WAAW,IAAI,CAAC,cAAc;AAC5B,cAAM,SAAS,aAAa,SAAS;AACrC,YAAI,CAAC,OAAQ,QAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAEhD,eAAO,KAAK;AAAA,UACV;AAAA,UACA,OAAO,SAAS;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,iBAAyC,CAAC;AAChD,QAAI,UAAU;AAEd,YAAQ,QAAQ,CAAC,WAAW;AAC1B,UAAI,CAAC,OAAO,SAAS;AACnB,kBAAU;AACV,eAAO,OAAO,gBAAgB,OAAO,MAAM;AAAA,MAC7C;AAAA,IACF,CAAC;AAED,WAAO,EAAE,SAAS,QAAQ,eAAe;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,WAAmB,WAAyB;AACxD,UAAM,MAAM,GAAG,SAAS,IAAI,SAAS;AACrC,UAAM,QAAQ,KAAK,eAAe,IAAI,GAAG;AACzC,QAAI,OAAO;AACT,mBAAa,KAAK;AAClB,WAAK,eAAe,OAAO,GAAG;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAyB;AACvB,SAAK,eAAe,QAAQ,CAAC,UAAU,aAAa,KAAK,CAAC;AAC1D,SAAK,eAAe,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAc,cACZ,WACA,SACA,QACA,OAC2B;AAE3B,UAAM,sBACJ,GAAG,MAAM,IAAI;AACf,UAAM,aACH,OAAO,mBAAmB,KAAgB,OAAO,mBAAmB;AAEvE,QAAI,aAAa,GAAG;AAClB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,cAAc,cAAc,WAAW,QAAQ,OAAO,OAAO;AAAA,EACtE;AAAA,EAEA,MAAc,qBACZ,WACA,SACA,SACA,OACA,YAC2B;AAC3B,UAAM,MAAM,GAAG,QAAQ,SAAS,IAAI,MAAM,IAAI;AAG9C,SAAK,cAAc,QAAQ,WAAW,MAAM,IAAI;AAEhD,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,YAAM,QAAQ,WAAW,YAAY;AACnC,aAAK,eAAe,OAAO,GAAG;AAC9B,cAAM,SAAS,MAAM,cAAc;AAAA,UACjC;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF;AACA,gBAAQ,MAAM;AAAA,MAChB,GAAG,UAAU;AAEb,WAAK,eAAe,IAAI,KAAK,KAAK;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEQ,iBACN,WACA,SACkB;AAClB,QAAI,OAAO,cAAc,YAAY;AACnC,YAAM,SAAU,UAAiC,OAAO;AAExD,UAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,eAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,MACrC;AAEA,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,EAAE,MAAM,OAAO;AAAA,QACzB;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,YAAY,OAAO,QAAQ;AAC/C,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAGA,WAAO,cAAc,SAAS,WAAW,QAAQ,KAAK;AAAA,EACxD;AAAA,EAEA,MAAc,kBACZ,WACA,SACA,QACA,OAC2B;AAC3B,UAAM,aAAa,OAAO,mBAAmB;AAE7C,QAAI,aAAa,GAAG;AAClB,YAAM,MAAM,QAAQ,MAAM,IAAI;AAC9B,WAAK,cAAc,QAAQ,MAAM,IAAI;AAErC,aAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,cAAM,QAAQ,WAAW,YAAY;AACnC,eAAK,eAAe,OAAO,GAAG;AAC9B,gBAAM,SAAS,MAAM,KAAK;AAAA,YACxB;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,MAAM;AAAA,QAChB,GAAG,UAAU;AAEb,aAAK,eAAe,IAAI,KAAK,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,WAAO,KAAK,2BAA2B,WAAW,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAc,2BACZ,WACA,SAC2B;AAC3B,QAAI,OAAO,cAAc,YAAY;AACnC,YAAM,SAAS,MAAO,UAAiC,OAAO;AAE9D,UAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,eAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,MACrC;AAEA,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,EAAE,MAAM,OAAO;AAAA,QACzB;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,YAAY,OAAO,QAAQ;AAC/C,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAGA,WAAO,cAAc,cAAc,WAAW,QAAQ,KAAK;AAAA,EAC7D;AACF;AAGO,IAAM,mBAAmB,IAAI,iBAAiB;;;ACnQrD,SAAS,eAAe,OAAuB;AAC7C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,SAAS,MAAM,MAAM,IAAI;AACxC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AACxE;AAKA,SAAS,iBAAiB,UAA0B;AAClD,SAAO,SAAS,OAAQ,SAAS,YAAY,GAAG,IAAI,MAAO,KAAK,CAAC;AACnE;AAKO,SAAS,aACd,MACA,SACoB;AACpB,MAAI,QAAQ,WAAW,KAAK,OAAO,QAAQ,SAAS;AAClD,WAAO,+BAA+B,eAAe,QAAQ,OAAO,CAAC;AAAA,EACvE;AAEA,MAAI,QAAQ,WAAW,KAAK,OAAO,QAAQ,SAAS;AAClD,WAAO,8BAA8B,eAAe,QAAQ,OAAO,CAAC;AAAA,EACtE;AAEA,MAAI,QAAQ,iBAAiB,CAAC,QAAQ,cAAc,SAAS,KAAK,IAAI,GAAG;AACvE,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B;AAEA,MAAI,QAAQ,oBAAoB;AAC9B,UAAM,MAAM,iBAAiB,KAAK,IAAI,EAAE,YAAY;AACpD,QAAI,CAAC,QAAQ,mBAAmB,SAAS,GAAG,GAAG;AAC7C,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,cACd,OACA,SACoB;AACpB,QAAM,YAAY,MAAM,KAAK,KAAK;AAElC,MAAI,QAAQ,YAAY,UAAU,SAAS,QAAQ,UAAU;AAC3D,WAAO,WAAW,QAAQ,QAAQ;AAAA,EACpC;AAEA,MAAI,QAAQ,YAAY,UAAU,SAAS,QAAQ,UAAU;AAC3D,WAAO,WAAW,QAAQ,QAAQ;AAAA,EACpC;AAGA,aAAW,QAAQ,WAAW;AAC5B,UAAM,QAAQ,aAAa,MAAM,OAAO;AACxC,QAAI,MAAO,QAAO;AAAA,EACpB;AAEA,SAAO;AACT;AAKO,SAAS,oBACd,SACmB;AACnB,SAAO,CAAC,EAAE,MAAM,MAAM;AACpB,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,iBAAiB,MAAM;AACzB,aAAO,aAAa,OAAO,OAAO;AAAA,IACpC;AAEA,QAAI,iBAAiB,YAAY,MAAM,QAAQ,KAAK,GAAG;AACrD,aAAO,cAAc,OAAO,OAAO;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;AAKO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAI5B,OAAO,oBAAoB;AAAA,IACzB,eAAe,CAAC,cAAc,aAAa,aAAa,YAAY;AAAA,IACpE,SAAS,IAAI,OAAO;AAAA;AAAA,EACtB,CAAC;AAAA;AAAA;AAAA;AAAA,EAKD,QAAQ,oBAAoB;AAAA,IAC1B,eAAe,CAAC,cAAc,WAAW;AAAA,IACzC,SAAS,IAAI,OAAO;AAAA;AAAA,IACpB,UAAU;AAAA,EACZ,CAAC;AAAA;AAAA;AAAA;AAAA,EAKD,UAAU,oBAAoB;AAAA,IAC5B,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS,KAAK,OAAO;AAAA;AAAA,EACvB,CAAC;AAAA;AAAA;AAAA;AAAA,EAKD,SAAS,oBAAoB;AAAA,IAC3B,eAAe,CAAC,cAAc,aAAa,WAAW;AAAA,IACtD,SAAS,IAAI,OAAO;AAAA;AAAA,IACpB,UAAU;AAAA,EACZ,CAAC;AAAA;AAAA;AAAA;AAAA,EAKD,OAAO,oBAAoB;AAAA,IACzB,eAAe,CAAC,aAAa,cAAc,iBAAiB;AAAA,IAC5D,SAAS,KAAK,OAAO;AAAA;AAAA,EACvB,CAAC;AAAA;AAAA;AAAA;AAAA,EAKD,OAAO,oBAAoB;AAAA,IACzB,eAAe,CAAC,cAAc,aAAa,WAAW;AAAA,IACtD,SAAS,KAAK,OAAO;AAAA;AAAA,EACvB,CAAC;AACH;AAKO,SAAS,cACd,SACmB;AACnB,SAAO,oBAAoB,OAAO;AACpC;;;ACpKO,SAAS,aACd,QACA,MACiE;AACjE,QAAM,SAAS,cAAc,SAAS,QAAQ,IAAI;AAElD,MAAI,OAAO,SAAS;AAClB,WAAO,EAAE,SAAS,MAAM,KAAK;AAAA,EAC/B,OAAO;AACL,WAAO,EAAE,SAAS,OAAO,QAAQ,OAAO,OAAO;AAAA,EACjD;AACF;AAKO,SAAS,0BACd,QACA,SAAiD,CAAC,UAAU,GAC5D;AACA,QAAM,SAAc,CAAC;AAErB,SAAO,QAAQ,CAAC,UAAU;AACxB,WAAO,KAAK,IAAI;AAAA,EAClB,CAAC;AAED,SAAO;AACT;AAKO,SAAS,oBAAoB,QAAmC;AACrE,SAAO,CAAC,OAAO,WAAW,OAAO,KAAK,OAAO,MAAM,EAAE,SAAS;AAChE;AAKO,SAAS,wBACd,QACoB;AACpB,MAAI,OAAO,QAAS,QAAO;AAE3B,QAAM,WAAW,OAAO,KAAK,OAAO,MAAM,EAAE,CAAC;AAC7C,SAAO,WAAW,OAAO,OAAO,QAAQ,IAAI;AAC9C;","names":[]}