@plasius/schema 1.1.0 → 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.
Files changed (59) hide show
  1. package/README.md +31 -18
  2. package/dist/index.cjs +2370 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +627 -0
  5. package/dist/index.d.ts +627 -0
  6. package/dist/index.js +2308 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +18 -6
  9. package/.eslintrc.cjs +0 -7
  10. package/.github/workflows/cd.yml +0 -236
  11. package/.github/workflows/ci.yml +0 -16
  12. package/.nvmrc +0 -1
  13. package/.vscode/launch.json +0 -15
  14. package/CHANGELOG.md +0 -120
  15. package/CODE_OF_CONDUCT.md +0 -79
  16. package/CONTRIBUTING.md +0 -201
  17. package/CONTRIBUTORS.md +0 -27
  18. package/SECURITY.md +0 -17
  19. package/docs/adrs/adr-0001: schema.md +0 -45
  20. package/docs/adrs/adr-template.md +0 -67
  21. package/legal/CLA-REGISTRY.csv +0 -2
  22. package/legal/CLA.md +0 -22
  23. package/legal/CORPORATE_CLA.md +0 -57
  24. package/legal/INDIVIDUAL_CLA.md +0 -91
  25. package/sbom.cdx.json +0 -66
  26. package/src/components.ts +0 -39
  27. package/src/field.builder.ts +0 -239
  28. package/src/field.ts +0 -153
  29. package/src/index.ts +0 -7
  30. package/src/infer.ts +0 -34
  31. package/src/pii.ts +0 -165
  32. package/src/schema.ts +0 -893
  33. package/src/types.ts +0 -156
  34. package/src/validation/countryCode.ISO3166.ts +0 -256
  35. package/src/validation/currencyCode.ISO4217.ts +0 -191
  36. package/src/validation/dateTime.ISO8601.ts +0 -60
  37. package/src/validation/email.RFC5322.ts +0 -9
  38. package/src/validation/generalText.OWASP.ts +0 -39
  39. package/src/validation/index.ts +0 -13
  40. package/src/validation/languageCode.BCP47.ts +0 -299
  41. package/src/validation/name.OWASP.ts +0 -25
  42. package/src/validation/percentage.ISO80000-1.ts +0 -8
  43. package/src/validation/phone.E.164.ts +0 -9
  44. package/src/validation/richtext.OWASP.ts +0 -34
  45. package/src/validation/url.WHATWG.ts +0 -16
  46. package/src/validation/user.MS-GOOGLE-APPLE.ts +0 -31
  47. package/src/validation/uuid.RFC4122.ts +0 -10
  48. package/src/validation/version.SEMVER2.0.0.ts +0 -10
  49. package/tests/field.builder.test.ts +0 -81
  50. package/tests/fields.test.ts +0 -213
  51. package/tests/pii.test.ts +0 -139
  52. package/tests/schema.test.ts +0 -501
  53. package/tests/test-utils.ts +0 -97
  54. package/tests/validate.test.ts +0 -97
  55. package/tests/validation.test.ts +0 -98
  56. package/tsconfig.build.json +0 -19
  57. package/tsconfig.json +0 -7
  58. package/tsup.config.ts +0 -10
  59. package/vitest.config.js +0 -20
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/field.builder.ts","../src/validation/email.RFC5322.ts","../src/validation/phone.E.164.ts","../src/validation/url.WHATWG.ts","../src/validation/uuid.RFC4122.ts","../src/validation/dateTime.ISO8601.ts","../src/validation/countryCode.ISO3166.ts","../src/validation/currencyCode.ISO4217.ts","../src/validation/generalText.OWASP.ts","../src/validation/version.SEMVER2.0.0.ts","../src/validation/percentage.ISO80000-1.ts","../src/validation/richtext.OWASP.ts","../src/validation/name.OWASP.ts","../src/validation/user.MS-GOOGLE-APPLE.ts","../src/validation/languageCode.BCP47.ts","../src/field.ts","../src/pii.ts","../src/schema.ts","../src/components.ts"],"sourcesContent":["export type { Infer } from \"./infer.js\";\nexport { field } from \"./field.js\";\nexport {\n createSchema,\n getSchemaForType,\n getAllSchemas,\n renderSchemaDescription,\n} from \"./schema.js\";\nexport type * from \"./types.js\";\nexport * from \"./components.js\";\nexport * from \"./validation/index.js\";\nexport * from \"./field.builder.js\";\n","type FieldType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"ref\";\n\nimport { type PII } from \"./pii.js\";\nimport { getSchemaForType } from \"./schema.js\";\n\nexport class FieldBuilder<TExternal = unknown, TInternal = TExternal> {\n _type!: TExternal;\n _storageType!: TInternal;\n isSystem = false;\n isImmutable = false;\n isRequired = true;\n _validator?: (value: any) => boolean;\n _description: string = \"\";\n _version: string = \"1.0.0\";\n _default?: TInternal | (() => TInternal);\n _upgrade?: (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string };\n _shape?: Record<string, FieldBuilder<any>>;\n itemType?: FieldBuilder<any>;\n refType?: string;\n _pii: PII = {\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"an ordinary value\",\n };\n enumValues?: readonly TInternal[];\n\n constructor(\n public type: FieldType,\n options: {\n shape?: Record<string, FieldBuilder<any>>;\n itemType?: FieldBuilder<any>;\n refType?: string;\n } = {}\n ) {\n this._shape = options.shape;\n this.itemType = options.itemType;\n this.refType = options.refType;\n }\n\n immutable(): FieldBuilder<TExternal, TInternal> {\n this.isImmutable = true;\n return this;\n }\n\n system(): FieldBuilder<TExternal, TInternal> {\n this.isSystem = true;\n return this;\n }\n\n required(): FieldBuilder<TExternal, TInternal> {\n this.isRequired = true;\n return this;\n }\n\n optional(): FieldBuilder<TExternal, TInternal> {\n this.isRequired = false;\n return this;\n }\n\n validator(\n fn: (value: TInternal) => boolean\n ): FieldBuilder<TExternal, TInternal> {\n this._validator = fn;\n return this;\n }\n\n description(desc: string): FieldBuilder<TExternal, TInternal> {\n this._description = desc;\n return this;\n }\n\n default(\n value: TInternal | (() => TInternal)\n ): FieldBuilder<TExternal, TInternal> {\n this._default = value;\n // Supplying a default implies the value may be omitted at input time.\n // Do not couple defaulting with validation.\n this.isRequired = false;\n return this;\n }\n\n /**\n * Configure an upgrader used when validating older entities against a newer schema.\n * The upgrader receives the current field value and version context, and should\n * return { ok: true, value } with the upgraded value, or { ok: false, error }.\n */\n upgrade(\n fn: (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string }\n ): FieldBuilder<TExternal, TInternal> {\n this._upgrade = fn;\n return this;\n }\n\n getDefault(): TInternal | undefined {\n const v = this._default;\n return typeof v === \"function\" ? (v as () => TInternal)() : v;\n }\n\n version(ver: string): FieldBuilder<TExternal, TInternal> {\n this._version = ver;\n return this;\n }\n\n /// PID informs the schema PII handling of the manner in\n /// which to handle data relating to this field.\n PID(pii: PII): FieldBuilder<TExternal, TInternal> {\n this._pii = pii;\n return this;\n }\n\n min(min: number): FieldBuilder<TExternal, TInternal> {\n if (this.type === \"number\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"number\" && value >= min;\n return prevValidator ? prevValidator(value) && valid : valid;\n };\n } else if (this.type === \"string\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && value.length >= min;\n return prevValidator ? prevValidator(value) && valid : valid;\n };\n } else if (this.type === \"array\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = Array.isArray(value) && value.length >= min;\n return prevValidator ? prevValidator(value) && valid : valid;\n };\n } else {\n throw new Error(\n \"Min is only supported on number, string, or array fields.\"\n );\n }\n return this;\n }\n\n max(max: number): FieldBuilder<TExternal, TInternal> {\n if (this.type === \"number\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"number\" && value <= max;\n return prevValidator ? prevValidator(value) && valid : valid;\n };\n } else if (this.type === \"string\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && value.length <= max;\n return prevValidator ? prevValidator(value) && valid : valid;\n };\n } else if (this.type === \"array\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = Array.isArray(value) && value.length <= max;\n return prevValidator ? prevValidator(value) && valid : valid;\n };\n } else {\n throw new Error(\n \"Max is only supported on number, string, or array fields.\"\n );\n }\n return this;\n }\n\n pattern(regex: RegExp): FieldBuilder<TExternal, TInternal> {\n if (this.type !== \"string\") {\n throw new Error(\"Pattern is only supported on string fields.\");\n }\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && regex.test(value);\n return prevValidator ? prevValidator(value) && valid : valid;\n };\n return this;\n }\n\n enum<const U extends readonly TInternal[]>(\n values: U\n ): FieldBuilder<U[number]> {\n if (\n this.type !== \"string\" &&\n this.type !== \"number\" &&\n !(\n this.type === \"array\" &&\n (this.itemType?.type === \"string\" || this.itemType?.type === \"number\")\n )\n ) {\n throw new Error(\n \"Enums are only supported on string or number fields or arrays of strings or numbers.\"\n );\n }\n this.enumValues = values;\n return this as any;\n }\n\n /**\n * Create a shallow clone with a different external type parameter.\n * Note: shape and itemType are passed by reference (shallow). If you need\n * deep isolation of nested FieldBuilders, clone them explicitly.\n */\n as<U>(): FieldBuilder<U, TInternal> {\n const clone = new FieldBuilder<U, TInternal>(this.type, {\n shape: this._shape,\n itemType: this.itemType,\n refType: this.refType,\n });\n clone.enumValues = this.enumValues;\n clone.isImmutable = this.isImmutable;\n clone.isSystem = this.isSystem;\n clone.isRequired = this.isRequired;\n clone._description = this._description;\n clone._version = this._version;\n clone._pii = this._pii;\n clone._validator = this._validator as any;\n clone._default = this._default as any;\n clone._upgrade = this._upgrade;\n // refType already provided in constructor options above\n return clone;\n }\n}\n\nexport default FieldBuilder;\n","/**\n * Validates an email string using a simplified RFC 5322-compliant regex.\n * Returns true if the input is a string in the format `name@domain.tld`.\n */\nexport const validateEmail = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n};\n","/**\n * Validates a phone number string in strict E.164 format.\n * Returns true for strings like \"+441632960960\" (max 15 digits, starting with a '+').\n */\nexport const validatePhone = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const phoneRegex = /^\\+[1-9]\\d{1,14}$/; // E.164 format\n return phoneRegex.test(value);\n};\n","/**\n * Validates a URL string using the WHATWG URL API.\n * Accepts only 'http' or 'https' protocols.\n * Returns true if the URL is syntactically valid.\n */\nexport const validateUrl = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n try {\n const url = new URL(value);\n // Enforce scheme:\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n return true;\n } catch {\n return false;\n }\n};\n","/** \n * Validates a string against the RFC 4122 format for UUIDs. \n * Matches UUIDs of versions 1 to 5, e.g., \"123e4567-e89b-12d3-a456-426614174000\".\n */ \nexport const validateUUID = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(value);\n};\n","/**\n * Validates whether a string is a properly formatted ISO 8601 datetime, date, or time.\n * \n * @param value - The value to validate.\n * @param options - Optional settings for validation mode.\n * @param options.mode - The mode of validation:\n * - \"datetime\" (default): Checks full ISO 8601 datetime and equality with toISOString().\n * - \"date\": Validates that the string is in YYYY-MM-DD format and represents a valid date.\n * - \"time\": Validates that the string matches a valid HH:MM:SS(.sss)?Z? ISO 8601 time pattern.\n * @returns True if the value is valid according to the specified mode; otherwise, false.\n */\nexport const validateDateTimeISO = (\n value: unknown,\n options?: { mode?: \"datetime\" | \"date\" | \"time\" }\n): boolean => {\n const mode = options?.mode ?? \"datetime\";\n\n if (typeof value !== \"string\") return false;\n\n if (mode === \"datetime\") {\n // Strict ISO 8601 date-time: YYYY-MM-DDTHH:mm:ss(.fraction)?(Z|±HH:MM)\n const isoDateTimeRegex =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\n if (!isoDateTimeRegex.test(value)) return false;\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return false;\n\n // We purposely do NOT require `value === date.toISOString()` because\n // valid ISO8601 inputs may include offsets (e.g., \"+01:00\") or omit\n // milliseconds, both of which produce a different canonical ISO string.\n // The regex ensures strict shape; Date parsing ensures it is a real moment.\n return true;\n }\n\n if (mode === \"date\") {\n // YYYY-MM-DD format\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value)) return false;\n const date = new Date(value);\n if (isNaN(date.getTime())) return false;\n // Ensure the date parts match exactly (to avoid 2023-02-30 being accepted)\n const [year, month, day] = value.split(\"-\").map(Number);\n return (\n date.getUTCFullYear() === year &&\n date.getUTCMonth() + 1 === month &&\n date.getUTCDate() === day\n );\n }\n\n if (mode === \"time\") {\n // HH:MM:SS(.sss)?Z?\n // Hours: 00-23, Minutes: 00-59, Seconds: 00-59, optional fractional seconds, optional Z\n const timeRegex = /^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?Z?$/;\n return timeRegex.test(value);\n }\n\n return false;\n};\n","export const isoCountryCodes = new Set([\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\",\n]);\n\n/**\n * Validates whether a string is a valid ISO 3166-1 alpha-2 country code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCountryCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCountryCodes.has(value.toUpperCase());\n};\n","export const isoCurrencyCodes = new Set([\n \"AED\",\n \"AFN\",\n \"ALL\",\n \"AMD\",\n \"ANG\",\n \"AOA\",\n \"ARS\",\n \"AUD\",\n \"AWG\",\n \"AZN\",\n \"BAM\",\n \"BBD\",\n \"BDT\",\n \"BGN\",\n \"BHD\",\n \"BIF\",\n \"BMD\",\n \"BND\",\n \"BOB\",\n \"BOV\",\n \"BRL\",\n \"BSD\",\n \"BTN\",\n \"BWP\",\n \"BYN\",\n \"BZD\",\n \"CAD\",\n \"CDF\",\n \"CHE\",\n \"CHF\",\n \"CHW\",\n \"CLF\",\n \"CLP\",\n \"CNY\",\n \"COP\",\n \"COU\",\n \"CRC\",\n \"CUC\",\n \"CUP\",\n \"CVE\",\n \"CZK\",\n \"DJF\",\n \"DKK\",\n \"DOP\",\n \"DZD\",\n \"EGP\",\n \"ERN\",\n \"ETB\",\n \"EUR\",\n \"FJD\",\n \"FKP\",\n \"GBP\",\n \"GEL\",\n \"GHS\",\n \"GIP\",\n \"GMD\",\n \"GNF\",\n \"GTQ\",\n \"GYD\",\n \"HKD\",\n \"HNL\",\n \"HRK\",\n \"HTG\",\n \"HUF\",\n \"IDR\",\n \"ILS\",\n \"INR\",\n \"IQD\",\n \"IRR\",\n \"ISK\",\n \"JMD\",\n \"JOD\",\n \"JPY\",\n \"KES\",\n \"KGS\",\n \"KHR\",\n \"KMF\",\n \"KPW\",\n \"KRW\",\n \"KWD\",\n \"KYD\",\n \"KZT\",\n \"LAK\",\n \"LBP\",\n \"LKR\",\n \"LRD\",\n \"LSL\",\n \"LYD\",\n \"MAD\",\n \"MDL\",\n \"MGA\",\n \"MKD\",\n \"MMK\",\n \"MNT\",\n \"MOP\",\n \"MRU\",\n \"MUR\",\n \"MVR\",\n \"MWK\",\n \"MXN\",\n \"MXV\",\n \"MYR\",\n \"MZN\",\n \"NAD\",\n \"NGN\",\n \"NIO\",\n \"NOK\",\n \"NPR\",\n \"NZD\",\n \"OMR\",\n \"PAB\",\n \"PEN\",\n \"PGK\",\n \"PHP\",\n \"PKR\",\n \"PLN\",\n \"PYG\",\n \"QAR\",\n \"RON\",\n \"RSD\",\n \"RUB\",\n \"RWF\",\n \"SAR\",\n \"SBD\",\n \"SCR\",\n \"SDG\",\n \"SEK\",\n \"SGD\",\n \"SHP\",\n \"SLE\",\n \"SLL\",\n \"SOS\",\n \"SRD\",\n \"SSP\",\n \"STN\",\n \"SVC\",\n \"SYP\",\n \"SZL\",\n \"THB\",\n \"TJS\",\n \"TMT\",\n \"TND\",\n \"TOP\",\n \"TRY\",\n \"TTD\",\n \"TWD\",\n \"TZS\",\n \"UAH\",\n \"UGX\",\n \"USD\",\n \"USN\",\n \"UYI\",\n \"UYU\",\n \"UYW\",\n \"UZS\",\n \"VES\",\n \"VND\",\n \"VUV\",\n \"WST\",\n \"XAF\",\n \"XAG\",\n \"XAU\",\n \"XBA\",\n \"XBB\",\n \"XBC\",\n \"XBD\",\n \"XCD\",\n \"XDR\",\n \"XOF\",\n \"XPD\",\n \"XPF\",\n \"XPT\",\n \"XSU\",\n \"XTS\",\n \"XUA\",\n \"XXX\",\n \"YER\",\n \"ZAR\",\n \"ZMW\",\n \"ZWL\",\n]);\n\n\n/** \n * Validates whether a string is a valid ISO 4217 currency code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCurrencyCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCurrencyCodes.has(value.toUpperCase());\n};\n","/**\n * Validates that a text field is safe for storage (per OWASP guidelines).\n * Applies to general text fields: names, descriptions, titles, etc.\n * Global Standard: OWASP Input Validation Cheat Sheet (2024)\n */\nexport function validateSafeText(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n // Trimmed version should not be empty\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Reject control chars\n for (let i = 0; i < trimmed.length; i++) {\n const code = trimmed.codePointAt(i);\n if (code !== undefined && (code >= 0x00 && code <= 0x1F || code === 0x7F)) {\n return false;\n }\n }\n\n // Reject dangerous characters\n if (/['\"<>\\\\{}();]/.test(trimmed)) return false;\n\n // Reject SQL-style injection patterns\n if (\n /(--|\\b(SELECT|UPDATE|DELETE|INSERT|DROP|ALTER|EXEC|UNION|GRANT|REVOKE)\\b|\\/\\*|\\*\\/|@@)/i.test(\n trimmed\n )\n )\n return false;\n\n // Reject null char\n if (trimmed.includes(\"\\u0000\")) return false;\n\n // Optional: limit length\n if (trimmed.length > 1024) return false;\n\n return true;\n}\n","/**\n * Validates that a version string conforms to Semantic Versioning (SemVer 2.0.0).\n * Global Standard: https://semver.org/\n */\nexport function validateSemVer(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/.test(\n value\n );\n}\n","/**\n * Validates that a number is a percentage value (0 to 100 inclusive).\n * Global Standard: ISO 80000-1 percentage definition.\n */\nexport function validatePercentage(value: unknown): boolean {\n if (typeof value !== \"number\") return false;\n return value >= 0 && value <= 100;\n}\n","/**\n * Validates rich text input to ensure it contains only safe HTML/Markdown.\n * Global Standard: OWASP HTML Sanitization Guidelines (2024).\n * This validator checks for dangerous patterns — does not sanitize — assumes text will be sanitized downstream.\n */\nexport function validateRichText(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n const trimmed = value.trim();\n if (trimmed.length === 0) return true; // Allow empty rich text\n\n // Reject known dangerous tags\n if (\n /<(script|iframe|object|embed|style|link|meta|base|form|input|button|textarea|select)\\b/i.test(\n trimmed\n )\n ) {\n return false;\n }\n\n // Reject javascript: links\n if (/javascript:/i.test(trimmed)) {\n return false;\n }\n\n // Reject event handlers (onload, onclick, etc)\n if (/on\\w+=[\"']?/i.test(trimmed)) {\n return false;\n }\n\n // Optionally: limit max length (e.g. 10,000 chars)\n if (trimmed.length > 10000) return false;\n\n return true;\n}\n","/**\n * Validates that a name is safe, culturally inclusive, and matches global best practice.\n * Global Standard: OWASP Input Validation Cheat Sheet + ICAO Doc 9303 + IETF PRECIS\n */\nexport function validateName(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Limit length (ISO guidance: max 256 is typical)\n if (trimmed.length > 256) return false;\n\n // Reject ASCII control chars (U+0000–U+001F and U+007F)\n for (const ch of trimmed) {\n const cp = ch.codePointAt(0)!;\n if ((cp >= 0x00 && cp <= 0x1F) || cp === 0x7F) return false;\n }\n\n // Core pattern\n const namePattern = /^[\\p{L}\\p{M}'\\- ]+$/u;\n if (!namePattern.test(trimmed)) return false;\n\n return true;\n}\n","/**\n * Validates that a user ID is a valid `sub` from one of the supported identity providers.\n * Global Standard: OpenID Connect Core 1.0 `sub` claim.\n */\nexport function validateUserId(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Google: all digits\n const googlePattern = /^\\d{21,22}$/;\n\n // Microsoft: UUID v4\n const microsoftPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n // Apple: opaque, usually UUID but allow any printable string up to 255 chars\n const applePattern = /^[\\w\\-.]{6,255}$/; // Alphanumeric + - . _ (common safe characters)\n\n return (\n googlePattern.test(trimmed) ||\n microsoftPattern.test(trimmed) ||\n applePattern.test(trimmed)\n );\n}\n\nexport function validateUserIdArray(value: unknown): boolean {\n if (!Array.isArray(value)) return false;\n return value.every(validateUserId);\n}","/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\n/**\n * ISO 639-1 language codes (two-letter).\n * Tip: Keep this list as source of truth for supported languages in your app.\n */\nexport enum IsoLanguageCode {\n Afar = \"aa\",\n Abkhazian = \"ab\",\n Afrikaans = \"af\",\n Akan = \"ak\",\n Albanian = \"sq\",\n Amharic = \"am\",\n Arabic = \"ar\",\n Aragonese = \"an\",\n Armenian = \"hy\",\n Assamese = \"as\",\n Avaric = \"av\",\n Aymara = \"ay\",\n Azerbaijani = \"az\",\n Bashkir = \"ba\",\n Bambara = \"bm\",\n Basque = \"eu\",\n Belarusian = \"be\",\n Bengali = \"bn\",\n Bislama = \"bi\",\n Bosnian = \"bs\",\n Breton = \"br\",\n Bulgarian = \"bg\",\n Burmese = \"my\",\n Catalan = \"ca\",\n Chamorro = \"ch\",\n Chechen = \"ce\",\n Chinese = \"zh\",\n ChurchSlavic = \"cu\",\n Chuvash = \"cv\",\n Cornish = \"kw\",\n Corsican = \"co\",\n Cree = \"cr\",\n Croatian = \"hr\",\n Czech = \"cs\",\n Danish = \"da\",\n Divehi = \"dv\",\n Dutch = \"nl\",\n Dzongkha = \"dz\",\n English = \"en\",\n Esperanto = \"eo\",\n Estonian = \"et\",\n Ewe = \"ee\",\n Faroese = \"fo\",\n Fijian = \"fj\",\n Finnish = \"fi\",\n French = \"fr\",\n WesternFrisian = \"fy\",\n Fulah = \"ff\",\n Gaelic = \"gd\",\n Galician = \"gl\",\n Ganda = \"lg\",\n Georgian = \"ka\",\n German = \"de\",\n Greek = \"el\",\n Kalaallisut = \"kl\",\n Guarani = \"gn\",\n Gujarati = \"gu\",\n Haitian = \"ht\",\n Hausa = \"ha\",\n Hebrew = \"he\",\n Herero = \"hz\",\n Hindi = \"hi\",\n HiriMotu = \"ho\",\n Hungarian = \"hu\",\n Icelandic = \"is\",\n Ido = \"io\",\n Igbo = \"ig\",\n Indonesian = \"id\",\n Interlingua = \"ia\",\n Interlingue = \"ie\",\n Inuktitut = \"iu\",\n Inupiaq = \"ik\",\n Irish = \"ga\",\n Italian = \"it\",\n Japanese = \"ja\",\n Javanese = \"jv\",\n Kannada = \"kn\",\n Kanuri = \"kr\",\n Kashmiri = \"ks\",\n Kazakh = \"kk\",\n CentralKhmer = \"km\",\n Kikuyu = \"ki\",\n Kinyarwanda = \"rw\",\n Kyrgyz = \"ky\",\n Komi = \"kv\",\n Kongo = \"kg\",\n Korean = \"ko\",\n Kuanyama = \"kj\",\n Kurdish = \"ku\",\n Lao = \"lo\",\n Latin = \"la\",\n Latvian = \"lv\",\n Limburgan = \"li\",\n Lingala = \"ln\",\n Lithuanian = \"lt\",\n LubaKatanga = \"lu\",\n Luxembourgish = \"lb\",\n Macedonian = \"mk\",\n Malagasy = \"mg\",\n Malay = \"ms\",\n Malayalam = \"ml\",\n Maltese = \"mt\",\n Manx = \"gv\",\n Maori = \"mi\",\n Marathi = \"mr\",\n Marshallese = \"mh\",\n Mongolian = \"mn\",\n Nauru = \"na\",\n Navajo = \"nv\",\n NorthNdebele = \"nd\",\n SouthNdebele = \"nr\",\n Ndonga = \"ng\",\n Nepali = \"ne\",\n Norwegian = \"no\",\n NorwegianBokmal = \"nb\",\n NorwegianNynorsk = \"nn\",\n SichuanYi = \"ii\",\n Occitan = \"oc\",\n Ojibwa = \"oj\",\n Oriya = \"or\",\n Oromo = \"om\",\n Ossetian = \"os\",\n Pali = \"pi\",\n Pashto = \"ps\",\n Persian = \"fa\",\n Polish = \"pl\",\n Portuguese = \"pt\",\n Punjabi = \"pa\",\n Quechua = \"qu\",\n Romansh = \"rm\",\n Romanian = \"ro\",\n Rundi = \"rn\",\n Russian = \"ru\",\n Samoan = \"sm\",\n Sango = \"sg\",\n Sanskrit = \"sa\",\n Sardinian = \"sc\",\n Serbian = \"sr\",\n Shona = \"sn\",\n Sindhi = \"sd\",\n Sinhala = \"si\",\n Slovak = \"sk\",\n Slovenian = \"sl\",\n Somali = \"so\",\n SouthernSotho = \"st\",\n Spanish = \"es\",\n Sundanese = \"su\",\n Swahili = \"sw\",\n Swati = \"ss\",\n Swedish = \"sv\",\n Tagalog = \"tl\",\n Tahitian = \"ty\",\n Tajik = \"tg\",\n Tamil = \"ta\",\n Tatar = \"tt\",\n Telugu = \"te\",\n Thai = \"th\",\n Tibetan = \"bo\",\n Tigrinya = \"ti\",\n Tonga = \"to\",\n Tsonga = \"ts\",\n Tswana = \"tn\",\n Turkish = \"tr\",\n Turkmen = \"tk\",\n Twi = \"tw\",\n Uighur = \"ug\",\n Ukrainian = \"uk\",\n Urdu = \"ur\",\n Uzbek = \"uz\",\n Venda = \"ve\",\n Vietnamese = \"vi\",\n Volapuk = \"vo\",\n Walloon = \"wa\",\n Welsh = \"cy\",\n Wolof = \"wo\",\n Xhosa = \"xh\",\n Yiddish = \"yi\",\n Yoruba = \"yo\",\n Zhuang = \"za\",\n Zulu = \"zu\",\n}\n\n/** Fast lookup set for enum values (lowercase 2-letter codes). */\nconst ISO_LANGUAGE_SET: ReadonlySet<string> = new Set<string>(\n Object.values(IsoLanguageCode)\n);\n\n/** Type guard: primary language must be one of the enum values. */\nexport function isIsoLanguageCode(value: unknown): value is IsoLanguageCode {\n return typeof value === \"string\" && ISO_LANGUAGE_SET.has(value.toLowerCase());\n}\n\n/**\n * Region validator per BCP 47:\n * - ISO 3166-1 alpha-2: 2 uppercase letters (e.g., GB, US)\n * - UN M.49 numeric: 3 digits (e.g., 419 for Latin America)\n *\n * NOTE: This validates *shape* not membership against the 3166 list.\n * If you want hard membership, we can add a Set of all alpha-2 regions.\n */\nexport function isRegionSubtag(value: string): boolean {\n return /^[A-Z]{2}$/.test(value) || /^\\d{3}$/.test(value);\n}\n\n/** Script subtag per ISO 15924: one capital + three lowercase (e.g., Latn, Cyrl, Hans). */\nexport function isScriptSubtag(value: string): boolean {\n return /^[A-Z][a-z]{3}$/.test(value);\n}\n\n/** Variant subtag per BCP 47: 5–8 alnum, or 4 starting with a digit. */\nexport function isVariantSubtag(value: string): boolean {\n return /^([0-9][A-Za-z0-9]{3}|[A-Za-z0-9]{5,8})$/.test(value);\n}\n\n/** Extension sequence: singleton (alnum except 'x') + one or more 2–8 alnum subtags. */\nexport function isExtensionSingleton(value: string): boolean {\n return /^[0-9A-WY-Za-wy-z]$/.test(value); // any alnum except 'x' (private-use)\n}\nexport function isExtensionSubtag(value: string): boolean {\n return /^[A-Za-z0-9]{2,8}$/.test(value);\n}\n\n/** Private-use subtag: 'x' then one or more 1–8 alnum subtags. */\nexport function isPrivateUseSingleton(value: string): boolean {\n return value.toLowerCase() === \"x\";\n}\nexport function isPrivateUseSubtag(value: string): boolean {\n return /^[A-Za-z0-9]{1,8}$/.test(value);\n}\n\n/**\n * Validates:\n * - plain language: \"en\"\n * - language + region: \"en-GB\"\n * - language + script + region: \"sr-Cyrl-RS\"\n * - language + variants: \"sl-rozaj-biske\", \"de-CH-1996\"\n * - extensions: \"en-GB-u-ca-gregory\"\n * - private-use: \"en-x-klingon\" or just \"x-piglatin\"\n *\n * Returns true only if the primary language is in IsoLanguageCode\n * and the rest of the tag conforms to BCP 47 structure.\n */\nexport function validateLanguage(value: unknown): boolean {\n if (typeof value !== \"string\" || value.length === 0) return false;\n\n const parts = value.split(\"-\");\n let i = 0;\n\n // 1) primary language (must be enum member; we use lowercase for comparison)\n const lang = parts[i];\n if (!lang || !isIsoLanguageCode(lang)) return false;\n i += 1;\n\n // 2) optional script\n if (i < parts.length && isScriptSubtag(parts[i] as string)) {\n i += 1;\n }\n\n // 3) optional region\n if (i < parts.length && isRegionSubtag((parts[i] as string).toUpperCase())) {\n // region must be uppercase if alpha; we normalize for check only\n i += 1;\n }\n\n // 4) zero or more variants\n while (i < parts.length && isVariantSubtag((parts[i] as string))) {\n i += 1;\n }\n\n // 5) zero or more extensions\n // extension = singleton ; 2–8 ; ( ; 2–8 )*\n while (i < parts.length && isExtensionSingleton((parts[i] as string))) {\n i += 1;\n // must have at least one following subtag of length 2–8\n if (!(i < parts.length && isExtensionSubtag(parts[i]!))) return false;\n while (i < parts.length && isExtensionSubtag(parts[i]!)) {\n i += 1;\n }\n }\n\n // 6) optional private-use: 'x' 1*('-' (1*8alnum))\n if (i < parts.length && isPrivateUseSingleton(parts[i]!)) {\n i += 1;\n if (!(i < parts.length && isPrivateUseSubtag(parts[i]!))) return false;\n while (i < parts.length && isPrivateUseSubtag(parts[i]!)) {\n i += 1;\n }\n }\n\n // no leftovers\n return i === parts.length;\n}\n","import { version } from \"os\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { Infer } from \"./infer.js\";\nimport { SchemaShape } from \"./types.js\";\nimport {\n validateCountryCode,\n validateDateTimeISO,\n validateEmail,\n validatePhone,\n validateRichText,\n validateSafeText,\n validateSemVer,\n validateUrl,\n validateUUID,\n} from \"./validation/index.js\";\nimport { validateLanguage } from \"./validation/languageCode.BCP47.js\";\n\nexport const field = {\n string: () => new FieldBuilder<string>(\"string\"),\n number: () => new FieldBuilder<number>(\"number\"),\n boolean: () => new FieldBuilder<boolean>(\"boolean\"),\n object: <T extends Record<string, FieldBuilder>>(fields: T) =>\n new FieldBuilder<T>(\"object\", { shape: fields }),\n array: (itemType: FieldBuilder) => new FieldBuilder(\"array\", { itemType }),\n ref: <S extends SchemaShape>(refType: string) =>\n new FieldBuilder<Infer<S>>(\"ref\", { refType }),\n email: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateEmail)\n .PID({\n classification: \"high\",\n action: \"encrypt\",\n logHandling: \"redact\",\n purpose: \"an email address\",\n })\n .description(\"An email address\"),\n phone: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validatePhone)\n .PID({\n classification: \"high\",\n action: \"encrypt\",\n logHandling: \"redact\",\n purpose: \"a phone number\",\n })\n .description(\"A phone number\"),\n url: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateUrl)\n .PID({\n classification: \"low\",\n action: \"hash\",\n logHandling: \"pseudonym\",\n purpose: \"a URL\",\n })\n .description(\"A URL\"),\n uuid: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"low\",\n action: \"hash\",\n logHandling: \"pseudonym\",\n purpose: \"a UUID\",\n })\n .validator(validateUUID)\n .description(\"A UUID\"),\n dateTimeISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a date string\",\n })\n .validator(validateDateTimeISO)\n .description(\"A date string in ISO 8601 format\"),\n dateISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a date string\",\n })\n .validator((s) => validateDateTimeISO(s, { mode: \"date\" }))\n .description(\"A date string in ISO 8601 format (date only)\"),\n timeISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a time string\",\n })\n .validator((s) => validateDateTimeISO(s, { mode: \"time\" }))\n .description(\"A time string in ISO 8601 format (time only)\"),\n richText: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"rich text content\",\n })\n .validator(validateRichText)\n .description(\"Rich text content, may include basic HTML formatting\"),\n generalText: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"Plain text content\",\n })\n .validator(validateSafeText)\n .description(\"Standard text content, no HTML allowed\"),\n latitude: () =>\n new FieldBuilder<number>(\"number\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"Latitude in decimal degrees, WGS 84 (ISO 6709)\",\n })\n .min(-90)\n .max(90)\n .description(\"Latitude in decimal degrees, WGS 84 (ISO 6709)\"),\n longitude: () =>\n new FieldBuilder<number>(\"number\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"Longitude in decimal degrees, WGS 84 (ISO 6709)\",\n })\n .min(-180)\n .max(180)\n .description(\"Longitude in decimal degrees, WGS 84 (ISO 6709)\"),\n version: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateSemVer)\n .description(\"A semantic version string, e.g. '1.0.0'\"),\n countryCode: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateCountryCode)\n .description(\"An ISO 3166 country code, e.g. 'US', 'GB', 'FR'\"),\n languageCode: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateLanguage)\n .description(\n \"An BCP 47 structured language code, primarily ISO 639-1 and optionally with ISO 3166-1 alpha-2 country code, e.g. 'en', 'en-US', 'fr', 'fr-FR'\"\n ),\n};\n","export type PIIClassification = \"none\" | \"low\" | \"high\";\n\nexport type PIIAction = \"encrypt\" | \"hash\" | \"clear\" | \"none\";\n\nexport type PIILogHandling = \"redact\" | \"omit\" | \"pseudonym\" | \"plain\";\n\nexport type PiiEnforcement = \"strict\" | \"warn\" | \"none\";\n\nexport interface PII {\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling; // How should this PII be handled in logs?\n purpose?: string; // optional, for audit: e.g. \"user contact\", \"analytics\"\n}\n\n/**\n * Centralized PII enforcement for field-level validation.\n * Returns { shortCircuit: true } when in strict mode and value is missing for high PII.\n */\nexport function enforcePIIField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n enforcement: PiiEnforcement = \"none\",\n errors?: string[],\n logger?: { warn: (msg: string) => void }\n): { shortCircuit: boolean } {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (def?._pii?.classification === \"high\" && (def?.isRequired ?? true)) {\n const missing = value === undefined || value === null || value === \"\";\n if (missing) {\n const msg = `High PII field must not be empty: ${path}`;\n if (enforcement === \"strict\") {\n errors?.push(msg);\n return { shortCircuit: true };\n }\n if (enforcement === \"warn\") {\n logger?.warn?.(`WARN (PII Enforcement): ${msg}`);\n }\n }\n }\n return { shortCircuit: false };\n}\n\n/**\n * Apply storage-time PII transforms based on field definitions in shape.\n */\nexport function prepareForStorage(\n shape: Record<string, any>,\n input: Record<string, any>,\n encryptFn: (value: any) => string,\n hashFn: (value: any) => string\n): Record<string, any> {\n const build = (\n def: any,\n value: any,\n key: string,\n out: any,\n ctx: { parentKey?: string; isArrayItem?: boolean } = {}\n ) => {\n if (!def) return;\n const isMissing = value === undefined || value === null;\n\n // Leaf handling with PII transforms\n if (def._pii?.action === \"encrypt\") {\n if (!isMissing) out[key + \"Encrypted\"] = encryptFn(value);\n return;\n }\n if (def._pii?.action === \"hash\") {\n if (!isMissing) out[key + \"Hash\"] = hashFn(value);\n return;\n }\n if (def._pii?.action === \"clear\") {\n if (!isMissing) out[key] = null;\n return;\n }\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n for (const [childKey, childDef] of Object.entries(def._shape)) {\n build(childDef, value?.[childKey], childKey, obj, { parentKey: key });\n }\n out[key] = obj;\n return;\n }\n\n if (def.type === \"array\" && def.itemType && Array.isArray(value)) {\n out[key] = value.map((item: any) => {\n const obj: any = {};\n // Use the array field name for primitive items; unwrap object items\n build(def.itemType, item, key, obj, {\n parentKey: key,\n isArrayItem: true,\n });\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return obj[key];\n }\n return Object.keys(obj).length > 0 ? obj : item;\n });\n return;\n }\n\n if (def.type === \"ref\") {\n const ref: any = { ...value };\n const refShape = def._shape;\n if (refShape && value) {\n for (const [childKey, childDef] of Object.entries(refShape)) {\n build(childDef, value[childKey], childKey, ref, { parentKey: key });\n }\n }\n out[key] = ref;\n return;\n }\n\n out[key] = value;\n };\n\n const result: any = {};\n for (const key in shape) {\n build(shape[key], input?.[key], key, result);\n }\n return result;\n}\n\n/**\n * Apply read-time PII transforms (e.g., decrypt) based on field definitions in shape.\n */\nexport function prepareForRead(\n shape: Record<string, any>,\n stored: Record<string, any>,\n decryptFn: (value: string) => any\n): Record<string, any> {\n const readValue = (\n def: any,\n key: string,\n container: any,\n ctx: { parentKey?: string; isArrayItem?: boolean } = {}\n ): any => {\n if (!def) return container?.[key];\n const action = def._pii?.action;\n if (action === \"encrypt\") {\n const enc =\n container?.[key + \"Encrypted\"] ??\n container?.[`${ctx.parentKey ?? key}Encrypted`];\n return enc === undefined ? undefined : decryptFn(enc);\n }\n if (action === \"hash\") {\n const h =\n container?.[key + \"Hash\"] ?? container?.[`${ctx.parentKey ?? key}Hash`];\n return h === undefined ? undefined : h;\n }\n if (action === \"clear\")\n return container?.hasOwnProperty(key) ? null : undefined;\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n const source =\n container && Object.prototype.hasOwnProperty.call(container, key)\n ? container[key]\n : container ?? {};\n for (const [childKey, childDef] of Object.entries(def._shape)) {\n obj[childKey] = readValue(childDef, childKey, source);\n }\n return obj;\n }\n\n if (def.type === \"array\" && def.itemType) {\n const arr = container?.[key];\n if (!Array.isArray(arr)) return arr;\n return arr.map((item: any) =>\n readValue(def.itemType, key, item, { parentKey: key, isArrayItem: true })\n );\n }\n\n if (def.type === \"ref\") {\n const ref = { ...(container?.[key] ?? {}) };\n const refShape = def._shape;\n if (refShape) {\n for (const [childKey, childDef] of Object.entries(refShape)) {\n ref[childKey] = readValue(childDef, childKey, ref);\n }\n }\n return ref;\n }\n\n return container?.[key];\n };\n\n const result: any = {};\n for (const key in shape) {\n result[key] = readValue(shape[key], key, stored);\n }\n return result;\n}\n\n/**\n * Sanitize data for logging according to PII logHandling.\n */\nexport function sanitizeForLog(\n shape: Record<string, any>,\n data: Record<string, any>,\n pseudonymFn: (value: any) => string\n): Record<string, any> {\n const visit = (\n def: any,\n value: any,\n ctx: { parentKey?: string } = {}\n ): any => {\n if (!def) return undefined;\n const handling = def._pii?.logHandling as PIILogHandling | undefined;\n if (handling === \"omit\") return undefined;\n if (handling === \"redact\") return \"[REDACTED]\";\n if (handling === \"pseudonym\") return pseudonymFn(value);\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n const src = value ?? {};\n for (const [k, childDef] of Object.entries(def._shape)) {\n const child = visit(childDef, src[k], { parentKey: k });\n if (child !== undefined) obj[k] = child;\n }\n return obj;\n }\n\n if (def.type === \"array\" && def.itemType) {\n if (!Array.isArray(value)) return undefined;\n const arr = value\n .map((v: any) => visit(def.itemType, v, { parentKey: ctx.parentKey }))\n .filter((v) => v !== undefined);\n return arr;\n }\n\n if (def.type === \"ref\") {\n const ref: any = value ? { type: value.type, id: value.id } : {};\n const refShape = def._shape;\n const src = value ?? {};\n if (refShape) {\n for (const [k, childDef] of Object.entries(refShape)) {\n const child = visit(childDef, src[k]);\n if (child !== undefined) ref[k] = child;\n }\n } else if (value) {\n // no nested shape: keep original ref fields\n ref.type = value.type;\n ref.id = value.id;\n }\n return ref;\n }\n\n return value;\n };\n\n const output: any = {};\n for (const key in shape) {\n const child = visit(shape[key], data?.[key]);\n if (child !== undefined) output[key] = child;\n }\n return output;\n}\n\n/**\n * Produce a PII audit list for the given shape.\n */\nexport function getPiiAudit(shape: Record<string, any>): Array<{\n field: string;\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling;\n purpose?: string;\n}> {\n const piiFields: Array<any> = [];\n for (const key in shape) {\n const def = shape[key];\n if (!def) continue;\n if (def._pii && def._pii.classification !== \"none\") {\n piiFields.push({\n field: key,\n classification: def._pii.classification,\n action: def._pii.action,\n logHandling: def._pii.logHandling,\n purpose: def._pii.purpose,\n });\n }\n }\n return piiFields;\n}\n\n/**\n * Scrub PII fields for delete/retention workflows.\n */\nexport function scrubPiiForDelete(\n shape: Record<string, any>,\n stored: Record<string, any>\n): Record<string, any> {\n const result: any = Array.isArray(stored) ? [...stored] : { ...stored };\n\n const setAtPath = (target: any, path: Array<string | number>, val: any) => {\n let cur = target;\n for (let i = 0; i < path.length - 1; i++) {\n const p = path[i];\n if (p === undefined) return;\n if (cur[p] === undefined) {\n const next = path[i + 1];\n cur[p] = typeof next === \"number\" ? [] : {};\n }\n cur = cur[p];\n }\n const last = path[path.length - 1];\n if (last === undefined) return;\n cur[last] = val;\n };\n\n const visit = (\n def: any,\n host: any,\n path: Array<string | number>,\n keyName: string | number\n ) => {\n if (!def) return;\n\n const applyPath = (targetKey: string) => {\n const last = path[path.length - 1];\n if (last === undefined) return;\n if (typeof last === \"number\") {\n setAtPath(result, [...path, targetKey], null);\n } else {\n setAtPath(result, [...path.slice(0, -1), targetKey], null);\n }\n };\n\n if (def._pii?.action === \"encrypt\") {\n const targetKey = `${keyName}Encrypted`;\n if (host && Object.prototype.hasOwnProperty.call(host, targetKey)) {\n applyPath(targetKey);\n }\n return;\n }\n if (def._pii?.action === \"hash\") {\n const targetKey = `${keyName}Hash`;\n if (host && Object.prototype.hasOwnProperty.call(host, targetKey)) {\n applyPath(targetKey);\n }\n return;\n }\n if (def._pii?.action === \"clear\") {\n if (host && Object.prototype.hasOwnProperty.call(host, keyName)) {\n setAtPath(result, path, null);\n }\n return;\n }\n\n if (def.type === \"object\" && def._shape) {\n const obj =\n host && Object.prototype.hasOwnProperty.call(host, keyName)\n ? host[keyName]\n : host;\n for (const [k, childDef] of Object.entries(def._shape)) {\n visit(childDef, obj, [...path, k], k);\n }\n return;\n }\n\n if (def.type === \"array\" && def.itemType) {\n const arr = host?.[keyName];\n if (Array.isArray(arr)) {\n arr.forEach((item, idx) =>\n visit(def.itemType, item, [...path, idx], keyName)\n );\n }\n return;\n }\n\n if (def.type === \"ref\") {\n const refShape = def._shape;\n const ref = host?.[keyName];\n if (refShape && ref) {\n for (const [k, childDef] of Object.entries(refShape)) {\n visit(childDef, ref, [...path, k], k);\n }\n }\n }\n };\n\n for (const key in shape) {\n visit(shape[key], stored, [key], key);\n }\n\n return result;\n}\n","import { Infer } from \"./infer.js\";\nimport {\n FieldType,\n Schema,\n SchemaOptions,\n SchemaShape,\n PIIEnforcement,\n SchemaUpgradeResult,\n SchemaUpgradeSpec,\n} from \"./types.js\";\nimport { field } from \"./field.js\";\nimport { PIIAction, PIIClassification, PIILogHandling } from \"./pii.js\";\nimport {\n enforcePIIField,\n prepareForStorage as piiPrepareForStorage,\n prepareForRead as piiPrepareForRead,\n sanitizeForLog as piiSanitizeForLog,\n getPiiAudit as piiGetPiiAudit,\n scrubPiiForDelete as piiScrubPiiForDelete,\n} from \"./pii.js\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { validateSemVer } from \"./validation/version.SEMVER2.0.0.js\";\n\nconst globalSchemaRegistry = new Map<string, Schema<any>>();\n\nfunction deepClone<T>(value: T): T {\n const seen = new WeakMap();\n const cloneAny = (val: any): any => {\n if (val === null || typeof val !== \"object\") return val;\n if (seen.has(val)) throw new TypeError(\"Cannot clone circular structures\");\n if (val instanceof Date) return new Date(val.getTime());\n if (Array.isArray(val)) {\n const arr: any[] = [];\n seen.set(val, arr);\n val.forEach((item) => arr.push(cloneAny(item)));\n return arr;\n }\n const out: any = {};\n seen.set(val, out);\n for (const [k, v] of Object.entries(val)) out[k] = cloneAny(v);\n return out;\n };\n return cloneAny(value);\n}\n\nfunction cmpSemver(a: string, b: string): number {\n const pa = a.split(\".\").map((n) => parseInt(n, 10));\n const pb = b.split(\".\").map((n) => parseInt(n, 10));\n for (let i = 0; i < 3; i++) {\n const ai = pa[i] ?? 0;\n const bi = pb[i] ?? 0;\n if (ai > bi) return 1;\n if (ai < bi) return -1;\n }\n return 0;\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helper: apply schema upgrade using SchemaUpgradeSpec (function or cascading steps)\n// ──────────────────────────────────────────────────────────────────────────────\nfunction applySchemaUpgrade(\n spec: SchemaUpgradeSpec,\n input: Record<string, any>,\n ctx: {\n from: string;\n to: string;\n entityType: string;\n describe: () => { entityType: string; version: string; shape: Record<string, any> };\n log?: (msg: string) => void;\n }\n): SchemaUpgradeResult {\n // Single universal upgrader\n if (typeof spec === \"function\") {\n return spec(input, ctx);\n }\n\n // Cascading steps: sort by target version, then apply those between from..to\n const steps = [...spec].sort((s1, s2) => cmpSemver(s1.to, s2.to));\n let working: Record<string, any> = { ...input };\n let fromVersion = ctx.from;\n\n for (const step of steps) {\n // Apply step if it advances beyond current `from` and does not exceed target `to`\n if (cmpSemver(fromVersion, step.to) < 0 && cmpSemver(step.to, ctx.to) <= 0) {\n ctx.log?.(`Upgrading entity from v${fromVersion} → v${step.to}`);\n const res = step.run(working, { ...ctx, from: fromVersion, to: step.to });\n if (!res || res.ok !== true || !res.value) {\n return {\n ok: false,\n errors: res?.errors?.length\n ? res.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${step.to}`],\n };\n }\n working = res.value;\n fromVersion = step.to;\n }\n }\n\n // If no steps applied or we stopped before ctx.to, the caller will normalize type/version.\n return { ok: true, value: working };\n}\n\nfunction validateEnum(\n parentKey: string,\n value: any,\n enumValues?: Array<string | number>\n): string | undefined {\n if (!enumValues) return;\n\n const values = Array.isArray(enumValues)\n ? enumValues\n : Array.from(enumValues);\n\n if (Array.isArray(value)) {\n const invalid = value.filter((v) => !values.includes(v));\n if (invalid.length > 0) {\n return `Field ${parentKey} contains invalid enum values: ${invalid.join(\n \", \"\n )}`;\n }\n } else {\n if (!values.includes(value)) {\n return `Field ${parentKey} must be one of: ${values.join(\", \")}`;\n }\n }\n}\n\n// Helper: some builders may store enum/optional/validator under different keys\n// schema.ts\nfunction getEnumValues(def: any): Array<string | number> | undefined {\n const src = Array.isArray(def?.enum)\n ? def.enum\n : Array.isArray(def?.enumValues)\n ? def.enumValues\n : Array.isArray(def?._enum)\n ? def._enum\n : Array.isArray(def?._enumValues)\n ? def._enumValues\n : def?._enumSet instanceof Set\n ? Array.from(def._enumSet)\n : undefined;\n\n if (!src) return undefined;\n const ok = src.every(\n (v: unknown) => typeof v === \"string\" || typeof v === \"number\"\n );\n return ok ? (src as Array<string | number>) : undefined;\n}\n\n// Apply default value when provided and input is nullish\nfunction applyDefault(\n def: any,\n current: any\n): { value: any; applied: boolean } {\n if (\n (current === undefined || current === null) &&\n typeof def?.getDefault === \"function\"\n ) {\n const next = def.getDefault();\n if (next !== undefined) {\n return { value: next, applied: true };\n }\n }\n return { value: current, applied: false };\n}\n\nfunction isOptional(def: any): boolean {\n return def?.isRequired === false;\n}\n\nfunction getValidator(def: any): ((v: any) => boolean) | undefined {\n return def?._validator ?? undefined;\n}\n\nfunction getShape(def: any): Record<string, any> | undefined {\n return def?._shape ?? def?.shape ?? undefined;\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Validation helpers (extracted from validate())\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction checkMissingRequired(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n): { missing: boolean } {\n if (value === undefined || value === null) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!isOptional(def)) {\n errors.push(`Missing required field: ${path}`);\n }\n return { missing: true };\n }\n return { missing: false };\n}\n\nfunction checkImmutable(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n existing: Record<string, any> | undefined,\n errors: string[]\n): { immutableViolation: boolean } {\n if (\n def.isImmutable &&\n existing &&\n existing[key] !== undefined &&\n value !== existing[key]\n ) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n errors.push(`Field is immutable: ${path}`);\n return { immutableViolation: true };\n }\n return { immutableViolation: false };\n}\n\nfunction runCustomValidator(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n): { invalid: boolean } {\n const validator = getValidator(def);\n if (validator && value !== undefined && value !== null) {\n const valid = validator(value);\n if (!valid) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n errors.push(`Invalid value for field: ${path}`);\n return { invalid: true };\n }\n }\n return { invalid: false };\n}\n\nfunction validateStringField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"string\") {\n errors.push(`Field ${path} must be string`);\n return;\n }\n\n const enumValues = getEnumValues(def);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, value, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n}\n\nfunction validateNumberField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"number\") {\n errors.push(`Field ${path} must be number`);\n return;\n }\n\n const enumValues = getEnumValues(def);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, value, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n}\n\nfunction validateBooleanField(\n parentKey: string,\n key: string,\n value: any,\n _def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"boolean\") {\n errors.push(`Field ${path} must be boolean`);\n }\n}\n\nfunction validateObjectChildren(\n parentKey: string,\n obj: any,\n shape: Record<string, any>,\n errors: string[],\n existing: Record<string, any> | undefined,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n for (const [childKey, childDef] of Object.entries(shape) as [\n string,\n FieldBuilder<any>\n ][]) {\n let childValue = obj[childKey];\n const existingChild =\n existing && typeof existing === \"object\" ? (existing as any)[childKey] : undefined;\n\n // Apply defaults before required checks\n const { value: withDefault, applied } = applyDefault(childDef, childValue);\n if (applied) {\n obj[childKey] = withDefault;\n childValue = withDefault;\n }\n\n // Required check\n const { missing } = checkMissingRequired(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (missing) continue;\n\n const { immutableViolation } = checkImmutable(\n parentKey,\n childKey,\n childValue,\n childDef,\n existing,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n parentKey,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n // Custom validator (per-field)\n const { invalid } = runCustomValidator(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (invalid) continue;\n\n // Type-specific validation (string/number/boolean/object/array/ref)\n // This will recurse into nested objects via validateObjectField → validateObjectChildren\n validateByType(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n}\n\nfunction validateObjectField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n existing: Record<string, any> | undefined,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n errors.push(`Field ${path} must be object`);\n return;\n }\n const objShape = getShape(def);\n if (objShape)\n validateObjectChildren(path, value, objShape, errors, existing, piiEnforcement, logger);\n}\n\nfunction validateArrayOfStrings(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"string\")) {\n errors.push(`Field ${path} must be string[]`);\n return;\n }\n const enumValues = getEnumValues(itemDef);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, arr, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n\n const validator = getValidator(itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfNumbers(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"number\")) {\n errors.push(`Field ${path} must be number[]`);\n }\n\n const enumValues = getEnumValues(itemDef);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, arr, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n\n const validator = getValidator(itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfBooleans(\n parentKey: string,\n key: string,\n arr: any[],\n _itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"boolean\")) {\n errors.push(`Field ${path} must be boolean[]`);\n }\n\n const validator = getValidator(_itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfObjects(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n\n if (\n !Array.isArray(arr) ||\n !arr.every((v) => typeof v === \"object\" && v !== null && !Array.isArray(v))\n ) {\n errors.push(`Field ${path} must be object[]`);\n return;\n }\n\n const itemShape = getShape(itemDef);\n if (!itemShape) return;\n\n arr.forEach((item, idx) => {\n const itemParent = `${path}[${idx}]`;\n const existingItem = Array.isArray(existing) ? existing[idx] : undefined;\n for (const [childKey, childDef] of Object.entries(itemShape) as [\n string,\n FieldBuilder<any>\n ][]) {\n let childValue = (item as any)[childKey];\n const existingChild =\n existingItem && typeof existingItem === \"object\"\n ? (existingItem as any)[childKey]\n : undefined;\n\n const { value: withDefault, applied } = applyDefault(\n childDef,\n childValue\n );\n if (applied) {\n (item as any)[childKey] = withDefault;\n childValue = withDefault;\n }\n\n // Required check (path-aware)\n const { missing } = checkMissingRequired(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (missing) continue;\n\n const { immutableViolation } = checkImmutable(\n itemParent,\n childKey,\n childValue,\n childDef,\n existingItem,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n itemParent,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n // Custom validator (path-aware)\n const { invalid } = runCustomValidator(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (invalid) continue;\n\n // Type-specific validation (recurses into nested object/array/ref)\n validateByType(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n });\n}\n\nfunction validateArrayField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!Array.isArray(value)) {\n errors.push(`Field ${key} must be an array`);\n return;\n }\n const itemType = def.itemType?.type;\n if (itemType === \"string\")\n return validateArrayOfStrings(parentKey, key, value, def.itemType, errors);\n if (itemType === \"number\")\n return validateArrayOfNumbers(parentKey, key, value, def.itemType, errors);\n if (itemType === \"boolean\")\n return validateArrayOfBooleans(parentKey, key, value, def.itemType, errors);\n if (itemType === \"object\")\n return validateArrayOfObjects(\n parentKey,\n key,\n value,\n def.itemType,\n errors,\n existing,\n piiEnforcement,\n logger\n );\n if (itemType === \"ref\") {\n const expectedType = (def.itemType as any).refType;\n value.forEach((ref: any, idx: number) => {\n if (\n !ref ||\n typeof ref !== \"object\" ||\n ref === null ||\n typeof ref.type !== \"string\" ||\n typeof ref.id !== \"string\" ||\n (expectedType && ref.type !== expectedType)\n ) {\n errors.push(\n `Field ${path}[${idx}] must be a reference object with type: ${expectedType}`\n );\n }\n });\n const refShape = getShape(def.itemType);\n if (refShape) {\n const existingRefs = Array.isArray(existing) ? existing : [];\n value.forEach((ref: any, idx: number) => {\n if (ref && typeof ref === \"object\" && ref !== null) {\n const existingRef = existingRefs[idx];\n for (const [childKey, childDef] of Object.entries(refShape) as [\n string,\n FieldBuilder<any>\n ][]) {\n const childPath = `${path}[${idx}].${childKey}`;\n let childValue = ref[childKey];\n const existingChild =\n existingRef && typeof existingRef === \"object\"\n ? (existingRef as any)[childKey]\n : undefined;\n const { value: withDefault, applied } = applyDefault(\n childDef,\n childValue\n );\n if (applied) {\n ref[childKey] = withDefault;\n childValue = withDefault;\n }\n if (\n (childValue === undefined || childValue === null) &&\n !isOptional(childDef)\n ) {\n errors.push(`Missing required field: ${childPath}`);\n continue;\n }\n\n const { immutableViolation } = checkImmutable(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n existingRef,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n const childValidator = getValidator(childDef);\n if (\n childValidator &&\n childValue !== undefined &&\n childValue !== null\n ) {\n const valid = childValidator(childValue);\n if (!valid) {\n errors.push(`Invalid value for field: ${childPath}`);\n continue;\n }\n }\n\n validateByType(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n errors,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n }\n });\n }\n return;\n }\n errors.push(`Field ${path} has unsupported array item type`);\n}\n\nfunction validateRefField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n _existing: any,\n _piiEnforcement: PIIEnforcement,\n _logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (\n typeof value !== \"object\" ||\n value === null ||\n typeof value.type !== \"string\" ||\n typeof value.id !== \"string\"\n ) {\n errors.push(`Field ${path} must be { type: string; id: string }`);\n return;\n }\n\n const expectedType = (def as any).refType;\n if (expectedType && value.type !== expectedType) {\n errors.push(\n `Field ${path} must reference type: ${expectedType} (got ${value.type})`\n );\n }\n}\n\nfunction validateByType(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n switch (def.type) {\n case \"string\":\n return validateStringField(parentKey, key, value, def, errors);\n case \"number\":\n return validateNumberField(parentKey, key, value, def, errors);\n case \"boolean\":\n return validateBooleanField(parentKey, key, value, def, errors);\n case \"object\":\n return validateObjectField(\n parentKey,\n key,\n value,\n def,\n errors,\n existing,\n piiEnforcement,\n logger\n );\n case \"array\":\n return validateArrayField(\n parentKey,\n key,\n value,\n def,\n errors,\n existing,\n piiEnforcement,\n logger\n );\n case \"ref\":\n return validateRefField(parentKey, key, value, def, errors, existing, piiEnforcement, logger);\n default:\n errors.push(`Unknown type for field ${path}: ${def.type}`);\n }\n}\n\nexport function createSchema<S extends SchemaShape>(\n _shape: S,\n entityType: string,\n options: SchemaOptions = {\n version: \"1.0.0\",\n table: \"\",\n schemaValidator: () => true,\n piiEnforcement: \"none\",\n schemaUpgrade: undefined,\n }\n): Schema<S> {\n const systemFields = {\n type: field.string().immutable().system(),\n version: field.string().immutable().system().validator(validateSemVer),\n };\n\n const version = options.version || \"1.0.0\";\n const store = options.table || \"\";\n\n // Optional schema-level upgrader supplied by the caller via options.schemaUpgrade\n const schemaUpgrade: SchemaUpgradeSpec | undefined = (options as any)\n .schemaUpgrade;\n\n const schema: Schema<S> = {\n // 🔗 Define the schema shape\n _shape: {\n ...systemFields,\n ..._shape,\n } as S,\n\n // 🔗 Metadata about the schema\n meta: { entityType, version },\n\n // 🔗 Validate input against the schema\n validate(input: unknown, existing?: Record<string, any>) {\n const errors: string[] = [];\n const result: any = {};\n const piiMode: PIIEnforcement = options.piiEnforcement ?? \"none\";\n\n if (typeof input !== \"object\" || input === null) {\n return { valid: false, errors: [\"Input must be an object\"] } as any;\n }\n // Work on a non-mutating copy that includes system defaults for first-time objects\n const working: Record<string, any> =\n typeof input === \"object\" && input !== null\n ? deepClone(input as any)\n : { ...(input as any) };\n if (working.type == null) working.type = entityType;\n if (working.version == null) working.version = version;\n\n // ── Schema-level upgrade (runs once before any field checks) ─────────────\n const fromVersion = String(working.version ?? \"0.0.0\");\n const toVersion = String(version);\n if (schemaUpgrade && cmpSemver(fromVersion, toVersion) < 0) {\n const upgradeRes = applySchemaUpgrade(schemaUpgrade, { ...working }, {\n from: fromVersion,\n to: toVersion,\n entityType,\n describe: () => schema.describe(),\n });\n if (!upgradeRes || upgradeRes.ok !== true || !upgradeRes.value) {\n const errs = upgradeRes?.errors?.length\n ? upgradeRes.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`];\n errors.push(...errs);\n // Stop early if the schema-level migration itself failed\n return { valid: false, errors } as any;\n }\n // Use the upgraded value as our new working copy\n for (const k of Object.keys(working)) delete (working as any)[k];\n Object.assign(working, upgradeRes.value);\n // Ensure system defaults remain correct after user migration\n working.type = entityType;\n working.version = toVersion;\n }\n\n for (const key in schema._shape) {\n const def = schema._shape[key];\n let value = working[key];\n const existingField =\n existing && typeof existing === \"object\" ? (existing as any)[key] : undefined;\n\n if (!def) {\n errors.push(`Field definition missing for: ${key}`);\n continue;\n }\n\n // Apply defaults before required/validation checks\n const { value: withDefault, applied } = applyDefault(def, value);\n if (applied) {\n working[key] = withDefault;\n value = withDefault;\n }\n\n // 1) Required\n const { missing } = checkMissingRequired(\"\", key, value, def, errors);\n if (missing) continue;\n\n // 2) Immutable\n const { immutableViolation } = checkImmutable(\n \"\",\n key,\n value,\n def,\n existing,\n errors\n );\n if (immutableViolation) continue;\n\n // 3) PII enforcement (may short-circuit)\n const { shortCircuit } = enforcePIIField(\n \"\",\n key,\n value,\n def,\n piiMode,\n errors,\n console\n );\n if (shortCircuit) continue;\n\n // A local validator for this field that returns errors instead of pushing into the outer array\n const validateField = (val: any): string[] => {\n const localErrors: string[] = [];\n const { invalid } = runCustomValidator(\n \"\",\n key,\n val,\n def,\n localErrors\n );\n if (!invalid) {\n validateByType(\"\", key, val, def, localErrors, existingField, piiMode, console);\n }\n return localErrors;\n };\n\n // First pass validation\n let fieldValue = value;\n let fieldErrors = validateField(fieldValue);\n\n // Attempt upgrade if invalid and an upgrader exists and entity is older than schema\n const entityFrom = String(working.version ?? \"0.0.0\");\n const entityTo = String(version);\n const fieldTo = String((def as any)._version ?? entityTo);\n const hasUpgrader = typeof (def as any)._upgrade === \"function\";\n\n if (\n fieldErrors.length > 0 &&\n hasUpgrader &&\n cmpSemver(entityFrom, entityTo) < 0\n ) {\n const up = (def as any)._upgrade as (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string };\n\n const res = up(fieldValue, {\n entityFrom,\n entityTo,\n fieldTo,\n fieldName: key,\n });\n if (res && res.ok) {\n fieldValue = res.value;\n fieldErrors = validateField(fieldValue);\n } else {\n fieldErrors.push(\n res?.error ||\n `Failed to upgrade field ${key} from v${entityFrom} to v${entityTo}`\n );\n }\n }\n\n result[key] = fieldValue;\n // Apply or record errors\n if (fieldErrors.length !== 0) {\n errors.push(...fieldErrors);\n continue;\n }\n }\n\n if (errors.length === 0 && options.schemaValidator) {\n const castValue = result as Infer<S>;\n if (!options.schemaValidator(castValue)) {\n errors.push(\"Schema-level validation failed.\");\n }\n }\n\n return {\n valid: errors.length === 0,\n value: result as Infer<S>,\n errors,\n };\n },\n\n // specific validator for a schema to allow conditional validation\n schemaValidator: options.schemaValidator!, // <== expose it here!\n\n /**\n * Runs the optional schema-level upgrade function once, without validating.\n * Useful for offline migrations or testing migration logic.\n */\n upgrade(\n input: Record<string, any>,\n log?: (msg: string) => void\n ): {\n ok: boolean;\n value?: Record<string, any>;\n errors?: string[];\n } {\n const fromVersion = String((input as any)?.version ?? \"0.0.0\");\n const toVersion = String(version);\n if (!schemaUpgrade || cmpSemver(fromVersion, toVersion) >= 0) {\n // Nothing to do – already current or no upgrader provided.\n return {\n ok: true,\n value: { ...input, type: entityType, version: toVersion },\n };\n }\n const res = applySchemaUpgrade(\n schemaUpgrade,\n { ...(input as any) },\n {\n from: fromVersion,\n to: toVersion,\n entityType,\n describe: () => schema.describe(),\n log,\n }\n );\n if (res && res.ok && res.value) {\n const out = { ...res.value, type: entityType, version: toVersion };\n return { ok: true, value: out };\n }\n return {\n ok: false,\n errors: res?.errors?.length\n ? res.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`],\n };\n },\n\n /**\n * Recursively validates entity references defined in this schema.\n *\n * Traverses fields of type `ref` and arrays of `ref` and resolves each target\n * entity using the provided `resolveEntity` function. When `autoValidate` is\n * enabled (default) and the field's `refPolicy` is `eager`, the referenced\n * entity's schema is fetched and validated via `validateComposition` up to\n * `maxDepth` levels.\n *\n * Skips fields not listed in `onlyFields` when provided. Prevents cycles via\n * a `visited` set in `validatorContext`.\n *\n * @param entity The root entity to validate (must include `type` and `id`).\n * @param options Options controlling traversal and resolution behavior.\n * @param options.resolveEntity Function to resolve a referenced entity by type and id.\n * @param options.validatorContext Internal context (visited set) to prevent cycles.\n * @param options.maxDepth Maximum depth for recursive validation (default: 5).\n * @param options.onlyFields Optional whitelist of field names to validate.\n * @param options.log Optional logger for traversal/debug output.\n *\n * @throws Error if a broken reference is encountered (target cannot be resolved).\n */\n async validateComposition(entity, options) {\n const {\n resolveEntity,\n validatorContext = { visited: new Set() },\n maxDepth = 5,\n log,\n } = options;\n\n const entityKey = `${(entity as any).type}:${(entity as any).id}`;\n if (validatorContext.visited.has(entityKey)) {\n log?.(`Skipping already visited entity ${entityKey}`);\n return;\n }\n validatorContext.visited.add(entityKey);\n log?.(`Validating composition for entity ${entityKey}`);\n\n for (const [key, def] of Object.entries(schema._shape)) {\n // NEW: skip if not in onlyFields\n if (options.onlyFields && !options.onlyFields.includes(key)) {\n log?.(`Skipping field ${key} (not in onlyFields)`);\n continue;\n }\n\n const autoValidate = (def as any).autoValidate !== false;\n const refPolicy = (def as any).refPolicy ?? \"eager\";\n const value = (entity as any)[key];\n if (!value) continue;\n\n if (def.type === \"ref\") {\n const refType = (def as any).refType as string;\n if (!refType)\n throw new Error(`Missing refType for reference field ${key}`);\n const ref = value as { type: string; id: string };\n if (ref.type && ref.type !== refType) {\n throw new Error(\n `Reference type mismatch for field ${key}: expected ${refType}, got ${ref.type}`\n );\n }\n const target = await options.resolveEntity(refType, ref.id);\n if (!target)\n throw new Error(\n `Broken reference: ${refType} ${ref.id} in field ${key}`\n );\n log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n if (autoValidate && refPolicy === \"eager\") {\n const targetSchema = getSchemaForType(refType);\n if (options.maxDepth! > 0 && targetSchema) {\n await targetSchema.validateComposition(target, {\n ...options,\n maxDepth: options.maxDepth! - 1,\n });\n }\n }\n // Handle array of refs: type === \"array\" and itemType?.type === \"ref\"\n } else if (def.type === \"array\" && def.itemType?.type === \"ref\") {\n const refType = (def.itemType as any).refType as string;\n if (!refType)\n throw new Error(`Missing refType for reference array field ${key}`);\n const refs = value as Array<{ type: string; id: string }>;\n for (const ref of refs) {\n if (ref.type && ref.type !== refType) {\n throw new Error(\n `Reference type mismatch for field ${key}: expected ${refType}, got ${ref.type}`\n );\n }\n const target = await options.resolveEntity(refType, ref.id);\n if (!target)\n throw new Error(\n `Broken reference: ${refType} ${ref.id} in field ${key}`\n );\n log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n if (autoValidate && refPolicy === \"eager\") {\n const targetSchema = getSchemaForType(refType);\n if (options.maxDepth! > 0 && targetSchema) {\n await targetSchema.validateComposition(target, {\n ...options,\n maxDepth: options.maxDepth! - 1,\n });\n }\n }\n }\n }\n }\n },\n\n /**\n * Returns the configured table name for this schema.\n *\n * @throws Error if no store/table name has been defined for this schema.\n */\n tableName(): string {\n if (!store || store === \"\") {\n throw new Error(\"Store is not defined for this schema\");\n }\n return store;\n },\n\n /**\n * Transforms an input object for persistence by applying PII protection\n * according to field annotations (e.g., encryption and hashing).\n *\n * @param input The raw entity data.\n * @param encryptFn Function used to encrypt sensitive values.\n * @param hashFn Function used to hash sensitive values.\n * @returns A new object safe to store.\n */\n prepareForStorage(\n input: Record<string, any>,\n encryptFn: (value: any) => string,\n hashFn: (value: any) => string\n ): Record<string, any> {\n return piiPrepareForStorage(_shape, input, encryptFn, hashFn);\n },\n\n /**\n * Reverses storage transformations for read paths (e.g., decrypts values)\n * according to PII annotations, returning a consumer-friendly object.\n *\n * @param stored Data retrieved from storage.\n * @param decryptFn Function used to decrypt values that were encrypted on write.\n * @returns A new object suitable for application consumption.\n */\n prepareForRead(\n stored: Record<string, any>,\n decryptFn: (value: string) => any\n ): Record<string, any> {\n return piiPrepareForRead(_shape, stored, decryptFn);\n },\n\n /**\n * Produces a log-safe copy of the provided data by redacting or pseudonymizing\n * PII fields in accordance with field annotations.\n *\n * @param data Arbitrary data to sanitize for logging.\n * @param pseudonymFn Function producing stable pseudonyms for sensitive values.\n * @returns A copy safe to emit to logs.\n */\n sanitizeForLog(\n data: Record<string, any>,\n pseudonymFn: (value: any) => string\n ): Record<string, any> {\n return piiSanitizeForLog(_shape, data, pseudonymFn);\n },\n\n /**\n * Returns a list of fields annotated with PII metadata for auditing purposes.\n * Each entry includes classification, required action, and optional log policy.\n */\n getPiiAudit(): Array<{\n field: string;\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling;\n purpose?: string;\n }> {\n return piiGetPiiAudit(_shape);\n },\n\n /**\n * Produces a copy of stored data suitable for data deletion flows by scrubbing\n * or blanking PII per field annotations.\n *\n * @param stored Data as persisted.\n * @returns A copy with PII removed or neutralized for deletion.\n */\n scrubPiiForDelete(stored: Record<string, any>): Record<string, any> {\n return piiScrubPiiForDelete(_shape, stored);\n },\n\n /**\n * Returns a normalized description of the schema suitable for documentation\n * or UI rendering (type, optionality, enum values, PII flags, etc.).\n */\n describe() {\n const description: Record<string, any> = {};\n for (const [key, def] of Object.entries(schema._shape)) {\n description[key] = {\n type: def.type,\n optional: isOptional(def),\n immutable: !!def.isImmutable,\n system: !!def.isSystem,\n description: def._description ?? \"\",\n version: def._version ?? \"\",\n deprecated: (def as any).deprecated ?? false,\n deprecatedVersion:\n (def as any).deprecatedVersion === undefined\n ? null\n : (def as any).deprecatedVersion,\n enum: getEnumValues(def as any) ?? null,\n refType: (def as any).refType ?? null,\n pii:\n !def._pii || def._pii.classification === \"none\" ? null : def._pii,\n };\n }\n\n return {\n entityType,\n version,\n hasSchemaUpgrade: !!schemaUpgrade,\n shape: description,\n };\n },\n };\n\n // Register the schema globally\n globalSchemaRegistry.set(entityType, schema);\n return schema;\n}\n\n/**\n * Retrieves a previously registered schema by its `entityType` from the\n * in-process global schema registry.\n */\nexport function getSchemaForType(type: string): Schema<any> | undefined {\n return globalSchemaRegistry.get(type);\n}\n\n/**\n * Returns all schemas registered in the in-process global registry.\n */\nexport function getAllSchemas(): Schema<any>[] {\n return Array.from(globalSchemaRegistry.values());\n}\n\n/**\n * Renders a schema into a simplified descriptor for front-end consumption.\n * Intended for documentation and admin tooling rather than validation.\n */\nexport function renderSchemaDescription(\n schema: Schema<any>\n): {\n title: string;\n fields: Array<{\n name: string;\n type: FieldType;\n optional: boolean;\n description: string;\n deprecated: boolean;\n pii?: string;\n }>;\n} {\n const meta = schema.describe();\n return {\n title: `${meta.entityType} (v${meta.version})`,\n fields: Object.entries(meta.shape).map(([name, def]) => ({\n name,\n type: def.type,\n optional: def.optional,\n description: def.description,\n deprecated: def.deprecated,\n pii: def.pii ? def.pii.classification : undefined,\n })),\n };\n}\n","import { Infer } from \"./infer.js\";\nimport { createSchema } from \"./schema.js\";\nimport { Schema, SchemaShape } from \"./types.js\";\n// This module provides a registry for component schemas, allowing components to be registered and retrieved by type.\nconst componentSchemaRegistry = new Map<string, Schema<SchemaShape>>();\n\nexport function createComponentSchema<T extends SchemaShape>(\n shape: SchemaShape,\n name: string,\n version: string,\n tableName: string = \"\",\n schemaValidator: (entity: Infer<T>) => boolean = () => true\n): Schema<SchemaShape> {\n const schema = createSchema<T>(shape as T, name, {\n version: version,\n piiEnforcement: \"strict\",\n table: tableName,\n schemaValidator,\n });\n registerComponentSchema(name, schema as Schema<SchemaShape>);\n return schema as Schema<SchemaShape>;\n}\n\nexport function registerComponentSchema(\n type: string,\n schema: Schema<SchemaShape>\n) {\n componentSchemaRegistry.set(type, schema);\n}\n\nexport function getComponentSchema(\n type: string\n): Schema<SchemaShape> | undefined {\n return componentSchemaRegistry.get(type);\n}\n\nexport function getAllComponentSchemas(): [string, Schema<SchemaShape>][] {\n return Array.from(componentSchemaRegistry.entries());\n}\n"],"mappings":"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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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;AACF,CAAC;AAMM,IAAM,sBAAsB,CAAC,UAA4B;AAC9D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,gBAAgB,IAAI,MAAM,YAAY,CAAC;AAChD;;;AChQO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;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,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,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,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,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,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,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,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,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,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,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,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;AACF,CAAC;AAOM,IAAM,uBAAuB,CAAC,UAA4B;AAC/D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,iBAAiB,IAAI,MAAM,YAAY,CAAC;AACjD;;;AC1LO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,OAAO,UAAU,SAAU,QAAO;AAGtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,OAAO,QAAQ,YAAY,CAAC;AAClC,QAAI,SAAS,WAAc,QAAQ,KAAQ,QAAQ,MAAQ,SAAS,MAAO;AACzE,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,gBAAgB,KAAK,OAAO,EAAG,QAAO;AAG1C,MACE,0FAA0F;AAAA,IACxF;AAAA,EACF;AAEA,WAAO;AAGT,MAAI,QAAQ,SAAS,IAAQ,EAAG,QAAO;AAGvC,MAAI,QAAQ,SAAS,KAAM,QAAO;AAElC,SAAO;AACT;;;AClCO,SAAS,eAAe,OAAyB;AACtD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,sLAAsL;AAAA,IAC3L;AAAA,EACF;AACF;;;ACLO,SAAS,mBAAmB,OAAyB;AAC1D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,SAAS,KAAK,SAAS;AAChC;;;ACFO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,MACE,0FAA0F;AAAA,IACxF;AAAA,EACF,GACA;AACA,WAAO;AAAA,EACT;AAGA,MAAI,eAAe,KAAK,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,MAAI,eAAe,KAAK,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,MAAI,QAAQ,SAAS,IAAO,QAAO;AAEnC,SAAO;AACT;;;AC7BO,SAAS,aAAa,OAAyB;AACpD,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,MAAI,QAAQ,SAAS,IAAK,QAAO;AAGjC,aAAW,MAAM,SAAS;AACxB,UAAM,KAAK,GAAG,YAAY,CAAC;AAC3B,QAAK,MAAM,KAAQ,MAAM,MAAS,OAAO,IAAM,QAAO;AAAA,EACxD;AAGA,QAAM,cAAc;AACpB,MAAI,CAAC,YAAY,KAAK,OAAO,EAAG,QAAO;AAEvC,SAAO;AACT;;;ACpBO,SAAS,eAAe,OAAyB;AACtD,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,QAAM,gBAAgB;AAGtB,QAAM,mBACJ;AAGF,QAAM,eAAe;AAErB,SACE,cAAc,KAAK,OAAO,KAC1B,iBAAiB,KAAK,OAAO,KAC7B,aAAa,KAAK,OAAO;AAE7B;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,SAAO,MAAM,MAAM,cAAc;AACnC;;;ACxBO,IAAK,kBAAL,kBAAKA,qBAAL;AACL,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,oBAAiB;AACjB,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,mBAAgB;AAChB,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,qBAAkB;AAClB,EAAAA,iBAAA,sBAAmB;AACnB,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,mBAAgB;AAChB,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AApLG,SAAAA;AAAA,GAAA;AAwLZ,IAAM,mBAAwC,IAAI;AAAA,EAChD,OAAO,OAAO,eAAe;AAC/B;AAGO,SAAS,kBAAkB,OAA0C;AAC1E,SAAO,OAAO,UAAU,YAAY,iBAAiB,IAAI,MAAM,YAAY,CAAC;AAC9E;AAUO,SAAS,eAAe,OAAwB;AACrD,SAAO,aAAa,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK;AACzD;AAGO,SAAS,eAAe,OAAwB;AACrD,SAAO,kBAAkB,KAAK,KAAK;AACrC;AAGO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,2CAA2C,KAAK,KAAK;AAC9D;AAGO,SAAS,qBAAqB,OAAwB;AAC3D,SAAO,sBAAsB,KAAK,KAAK;AACzC;AACO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAGO,SAAS,sBAAsB,OAAwB;AAC5D,SAAO,MAAM,YAAY,MAAM;AACjC;AACO,SAAS,mBAAmB,OAAwB;AACzD,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAcO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EAAG,QAAO;AAE5D,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,IAAI;AAGR,QAAM,OAAO,MAAM,CAAC;AACpB,MAAI,CAAC,QAAQ,CAAC,kBAAkB,IAAI,EAAG,QAAO;AAC9C,OAAK;AAGL,MAAI,IAAI,MAAM,UAAU,eAAe,MAAM,CAAC,CAAW,GAAG;AAC1D,SAAK;AAAA,EACP;AAGA,MAAI,IAAI,MAAM,UAAU,eAAgB,MAAM,CAAC,EAAa,YAAY,CAAC,GAAG;AAE1E,SAAK;AAAA,EACP;AAGA,SAAO,IAAI,MAAM,UAAU,gBAAiB,MAAM,CAAC,CAAY,GAAG;AAChE,SAAK;AAAA,EACP;AAIA,SAAO,IAAI,MAAM,UAAU,qBAAsB,MAAM,CAAC,CAAY,GAAG;AACrE,SAAK;AAEL,QAAI,EAAE,IAAI,MAAM,UAAU,kBAAkB,MAAM,CAAC,CAAE,GAAI,QAAO;AAChE,WAAO,IAAI,MAAM,UAAU,kBAAkB,MAAM,CAAC,CAAE,GAAG;AACvD,WAAK;AAAA,IACP;AAAA,EACF;AAGA,MAAI,IAAI,MAAM,UAAU,sBAAsB,MAAM,CAAC,CAAE,GAAG;AACxD,SAAK;AACL,QAAI,EAAE,IAAI,MAAM,UAAU,mBAAmB,MAAM,CAAC,CAAE,GAAI,QAAO;AACjE,WAAO,IAAI,MAAM,UAAU,mBAAmB,MAAM,CAAC,CAAE,GAAG;AACxD,WAAK;AAAA,IACP;AAAA,EACF;AAGA,SAAO,MAAM,MAAM;AACrB;;;ACzRO,IAAM,QAAQ;AAAA,EACnB,QAAQ,MAAM,IAAI,aAAqB,QAAQ;AAAA,EAC/C,QAAQ,MAAM,IAAI,aAAqB,QAAQ;AAAA,EAC/C,SAAS,MAAM,IAAI,aAAsB,SAAS;AAAA,EAClD,QAAQ,CAAyC,WAC/C,IAAI,aAAgB,UAAU,EAAE,OAAO,OAAO,CAAC;AAAA,EACjD,OAAO,CAAC,aAA2B,IAAI,aAAa,SAAS,EAAE,SAAS,CAAC;AAAA,EACzE,KAAK,CAAwB,YAC3B,IAAI,aAAuB,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC/C,OAAO,MACL,IAAI,aAAqB,QAAQ,EAC9B,UAAU,aAAa,EACvB,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,YAAY,kBAAkB;AAAA,EACnC,OAAO,MACL,IAAI,aAAqB,QAAQ,EAC9B,UAAU,aAAa,EACvB,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,YAAY,gBAAgB;AAAA,EACjC,KAAK,MACH,IAAI,aAAqB,QAAQ,EAC9B,UAAU,WAAW,EACrB,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,YAAY,OAAO;AAAA,EACxB,MAAM,MACJ,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,YAAY,EACtB,YAAY,QAAQ;AAAA,EACzB,aAAa,MACX,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,mBAAmB,EAC7B,YAAY,kCAAkC;AAAA,EACnD,SAAS,MACP,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,CAAC,MAAM,oBAAoB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,EACzD,YAAY,8CAA8C;AAAA,EAC/D,SAAS,MACP,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,CAAC,MAAM,oBAAoB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,EACzD,YAAY,8CAA8C;AAAA,EAC/D,UAAU,MACR,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,gBAAgB,EAC1B,YAAY,sDAAsD;AAAA,EACvE,aAAa,MACX,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,gBAAgB,EAC1B,YAAY,wCAAwC;AAAA,EACzD,UAAU,MACR,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,IAAI,GAAG,EACP,IAAI,EAAE,EACN,YAAY,gDAAgD;AAAA,EACjE,WAAW,MACT,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,IAAI,IAAI,EACR,IAAI,GAAG,EACP,YAAY,iDAAiD;AAAA,EAClE,SAAS,MACP,IAAI,aAAqB,QAAQ,EAC9B,UAAU,cAAc,EACxB,YAAY,yCAAyC;AAAA,EAC1D,aAAa,MACX,IAAI,aAAqB,QAAQ,EAC9B,UAAU,mBAAmB,EAC7B,YAAY,iDAAiD;AAAA,EAClE,cAAc,MACZ,IAAI,aAAqB,QAAQ,EAC9B,UAAU,gBAAgB,EAC1B;AAAA,IACC;AAAA,EACF;AACN;;;ACrIO,SAAS,gBACd,WACA,KACA,OACA,KACA,cAA8B,QAC9B,QACA,QAC2B;AAC3B,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,KAAK,MAAM,mBAAmB,WAAW,KAAK,cAAc,OAAO;AACrE,UAAM,UAAU,UAAU,UAAa,UAAU,QAAQ,UAAU;AACnE,QAAI,SAAS;AACX,YAAM,MAAM,qCAAqC,IAAI;AACrD,UAAI,gBAAgB,UAAU;AAC5B,gBAAQ,KAAK,GAAG;AAChB,eAAO,EAAE,cAAc,KAAK;AAAA,MAC9B;AACA,UAAI,gBAAgB,QAAQ;AAC1B,gBAAQ,OAAO,2BAA2B,GAAG,EAAE;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,cAAc,MAAM;AAC/B;AAKO,SAAS,kBACd,OACA,OACA,WACA,QACqB;AACrB,QAAM,QAAQ,CACZ,KACA,OACA,KACA,KACA,MAAqD,CAAC,MACnD;AACH,QAAI,CAAC,IAAK;AACV,UAAM,YAAY,UAAU,UAAa,UAAU;AAGnD,QAAI,IAAI,MAAM,WAAW,WAAW;AAClC,UAAI,CAAC,UAAW,KAAI,MAAM,WAAW,IAAI,UAAU,KAAK;AACxD;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,QAAQ;AAC/B,UAAI,CAAC,UAAW,KAAI,MAAM,MAAM,IAAI,OAAO,KAAK;AAChD;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,SAAS;AAChC,UAAI,CAAC,UAAW,KAAI,GAAG,IAAI;AAC3B;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MAAW,CAAC;AAClB,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC7D,cAAM,UAAU,QAAQ,QAAQ,GAAG,UAAU,KAAK,EAAE,WAAW,IAAI,CAAC;AAAA,MACtE;AACA,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,YAAY,MAAM,QAAQ,KAAK,GAAG;AAChE,UAAI,GAAG,IAAI,MAAM,IAAI,CAAC,SAAc;AAClC,cAAM,MAAW,CAAC;AAElB,cAAM,IAAI,UAAU,MAAM,KAAK,KAAK;AAAA,UAClC,WAAW;AAAA,UACX,aAAa;AAAA,QACf,CAAC;AACD,YAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AAClD,iBAAO,IAAI,GAAG;AAAA,QAChB;AACA,eAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAAA,MAC7C,CAAC;AACD;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,MAAW,EAAE,GAAG,MAAM;AAC5B,YAAM,WAAW,IAAI;AACrB,UAAI,YAAY,OAAO;AACrB,mBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,gBAAM,UAAU,MAAM,QAAQ,GAAG,UAAU,KAAK,EAAE,WAAW,IAAI,CAAC;AAAA,QACpE;AAAA,MACF;AACA,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AAEA,QAAI,GAAG,IAAI;AAAA,EACb;AAEA,QAAM,SAAc,CAAC;AACrB,aAAW,OAAO,OAAO;AACvB,UAAM,MAAM,GAAG,GAAG,QAAQ,GAAG,GAAG,KAAK,MAAM;AAAA,EAC7C;AACA,SAAO;AACT;AAKO,SAAS,eACd,OACA,QACA,WACqB;AACrB,QAAM,YAAY,CAChB,KACA,KACA,WACA,MAAqD,CAAC,MAC9C;AACR,QAAI,CAAC,IAAK,QAAO,YAAY,GAAG;AAChC,UAAM,SAAS,IAAI,MAAM;AACzB,QAAI,WAAW,WAAW;AACxB,YAAM,MACJ,YAAY,MAAM,WAAW,KAC7B,YAAY,GAAG,IAAI,aAAa,GAAG,WAAW;AAChD,aAAO,QAAQ,SAAY,SAAY,UAAU,GAAG;AAAA,IACtD;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM,IACJ,YAAY,MAAM,MAAM,KAAK,YAAY,GAAG,IAAI,aAAa,GAAG,MAAM;AACxE,aAAO,MAAM,SAAY,SAAY;AAAA,IACvC;AACA,QAAI,WAAW;AACb,aAAO,WAAW,eAAe,GAAG,IAAI,OAAO;AAEjD,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MAAW,CAAC;AAClB,YAAM,SACJ,aAAa,OAAO,UAAU,eAAe,KAAK,WAAW,GAAG,IAC5D,UAAU,GAAG,IACb,aAAa,CAAC;AACpB,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC7D,YAAI,QAAQ,IAAI,UAAU,UAAU,UAAU,MAAM;AAAA,MACtD;AACA,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,UAAU;AACxC,YAAM,MAAM,YAAY,GAAG;AAC3B,UAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO;AAChC,aAAO,IAAI;AAAA,QAAI,CAAC,SACd,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,WAAW,KAAK,aAAa,KAAK,CAAC;AAAA,MAC1E;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,MAAM,EAAE,GAAI,YAAY,GAAG,KAAK,CAAC,EAAG;AAC1C,YAAM,WAAW,IAAI;AACrB,UAAI,UAAU;AACZ,mBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,cAAI,QAAQ,IAAI,UAAU,UAAU,UAAU,GAAG;AAAA,QACnD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,GAAG;AAAA,EACxB;AAEA,QAAM,SAAc,CAAC;AACrB,aAAW,OAAO,OAAO;AACvB,WAAO,GAAG,IAAI,UAAU,MAAM,GAAG,GAAG,KAAK,MAAM;AAAA,EACjD;AACA,SAAO;AACT;AAKO,SAAS,eACd,OACA,MACA,aACqB;AACrB,QAAM,QAAQ,CACZ,KACA,OACA,MAA8B,CAAC,MACvB;AACR,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,WAAW,IAAI,MAAM;AAC3B,QAAI,aAAa,OAAQ,QAAO;AAChC,QAAI,aAAa,SAAU,QAAO;AAClC,QAAI,aAAa,YAAa,QAAO,YAAY,KAAK;AAEtD,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MAAW,CAAC;AAClB,YAAM,MAAM,SAAS,CAAC;AACtB,iBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACtD,cAAM,QAAQ,MAAM,UAAU,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC;AACtD,YAAI,UAAU,OAAW,KAAI,CAAC,IAAI;AAAA,MACpC;AACA,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,UAAU;AACxC,UAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,YAAM,MAAM,MACT,IAAI,CAAC,MAAW,MAAM,IAAI,UAAU,GAAG,EAAE,WAAW,IAAI,UAAU,CAAC,CAAC,EACpE,OAAO,CAAC,MAAM,MAAM,MAAS;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,MAAW,QAAQ,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC;AAC/D,YAAM,WAAW,IAAI;AACrB,YAAM,MAAM,SAAS,CAAC;AACtB,UAAI,UAAU;AACZ,mBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACpD,gBAAM,QAAQ,MAAM,UAAU,IAAI,CAAC,CAAC;AACpC,cAAI,UAAU,OAAW,KAAI,CAAC,IAAI;AAAA,QACpC;AAAA,MACF,WAAW,OAAO;AAEhB,YAAI,OAAO,MAAM;AACjB,YAAI,KAAK,MAAM;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,SAAc,CAAC;AACrB,aAAW,OAAO,OAAO;AACvB,UAAM,QAAQ,MAAM,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC;AAC3C,QAAI,UAAU,OAAW,QAAO,GAAG,IAAI;AAAA,EACzC;AACA,SAAO;AACT;AAKO,SAAS,YAAY,OAMzB;AACD,QAAM,YAAwB,CAAC;AAC/B,aAAW,OAAO,OAAO;AACvB,UAAM,MAAM,MAAM,GAAG;AACrB,QAAI,CAAC,IAAK;AACV,QAAI,IAAI,QAAQ,IAAI,KAAK,mBAAmB,QAAQ;AAClD,gBAAU,KAAK;AAAA,QACb,OAAO;AAAA,QACP,gBAAgB,IAAI,KAAK;AAAA,QACzB,QAAQ,IAAI,KAAK;AAAA,QACjB,aAAa,IAAI,KAAK;AAAA,QACtB,SAAS,IAAI,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,kBACd,OACA,QACqB;AACrB,QAAM,SAAc,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,OAAO;AAEtE,QAAM,YAAY,CAAC,QAAa,MAA8B,QAAa;AACzE,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,YAAM,IAAI,KAAK,CAAC;AAChB,UAAI,MAAM,OAAW;AACrB,UAAI,IAAI,CAAC,MAAM,QAAW;AACxB,cAAM,OAAO,KAAK,IAAI,CAAC;AACvB,YAAI,CAAC,IAAI,OAAO,SAAS,WAAW,CAAC,IAAI,CAAC;AAAA,MAC5C;AACA,YAAM,IAAI,CAAC;AAAA,IACb;AACA,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,QAAI,SAAS,OAAW;AACxB,QAAI,IAAI,IAAI;AAAA,EACd;AAEA,QAAM,QAAQ,CACZ,KACA,MACA,MACA,YACG;AACH,QAAI,CAAC,IAAK;AAEV,UAAM,YAAY,CAAC,cAAsB;AACvC,YAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAI,SAAS,OAAW;AACxB,UAAI,OAAO,SAAS,UAAU;AAC5B,kBAAU,QAAQ,CAAC,GAAG,MAAM,SAAS,GAAG,IAAI;AAAA,MAC9C,OAAO;AACL,kBAAU,QAAQ,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI;AAAA,MAC3D;AAAA,IACF;AAEA,QAAI,IAAI,MAAM,WAAW,WAAW;AAClC,YAAM,YAAY,GAAG,OAAO;AAC5B,UAAI,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,SAAS,GAAG;AACjE,kBAAU,SAAS;AAAA,MACrB;AACA;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,QAAQ;AAC/B,YAAM,YAAY,GAAG,OAAO;AAC5B,UAAI,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,SAAS,GAAG;AACjE,kBAAU,SAAS;AAAA,MACrB;AACA;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,SAAS;AAChC,UAAI,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,OAAO,GAAG;AAC/D,kBAAU,QAAQ,MAAM,IAAI;AAAA,MAC9B;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MACJ,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,OAAO,IACtD,KAAK,OAAO,IACZ;AACN,iBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACtD,cAAM,UAAU,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;AAAA,MACtC;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,UAAU;AACxC,YAAM,MAAM,OAAO,OAAO;AAC1B,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,YAAI;AAAA,UAAQ,CAAC,MAAM,QACjB,MAAM,IAAI,UAAU,MAAM,CAAC,GAAG,MAAM,GAAG,GAAG,OAAO;AAAA,QACnD;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,WAAW,IAAI;AACrB,YAAM,MAAM,OAAO,OAAO;AAC1B,UAAI,YAAY,KAAK;AACnB,mBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACpD,gBAAM,UAAU,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO,OAAO;AACvB,UAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG;AAAA,EACtC;AAEA,SAAO;AACT;;;AC9WA,IAAM,uBAAuB,oBAAI,IAAyB;AAE1D,SAAS,UAAa,OAAa;AACjC,QAAM,OAAO,oBAAI,QAAQ;AACzB,QAAM,WAAW,CAAC,QAAkB;AAClC,QAAI,QAAQ,QAAQ,OAAO,QAAQ,SAAU,QAAO;AACpD,QAAI,KAAK,IAAI,GAAG,EAAG,OAAM,IAAI,UAAU,kCAAkC;AACzE,QAAI,eAAe,KAAM,QAAO,IAAI,KAAK,IAAI,QAAQ,CAAC;AACtD,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,YAAM,MAAa,CAAC;AACpB,WAAK,IAAI,KAAK,GAAG;AACjB,UAAI,QAAQ,CAAC,SAAS,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC;AAC9C,aAAO;AAAA,IACT;AACA,UAAM,MAAW,CAAC;AAClB,SAAK,IAAI,KAAK,GAAG;AACjB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,EAAG,KAAI,CAAC,IAAI,SAAS,CAAC;AAC7D,WAAO;AAAA,EACT;AACA,SAAO,SAAS,KAAK;AACvB;AAEA,SAAS,UAAU,GAAW,GAAmB;AAC/C,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAClD,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AAAA,EACtB;AACA,SAAO;AACT;AAKA,SAAS,mBACP,MACA,OACA,KAOqB;AAErB,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO,KAAK,OAAO,GAAG;AAAA,EACxB;AAGA,QAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;AAChE,MAAI,UAA+B,EAAE,GAAG,MAAM;AAC9C,MAAI,cAAc,IAAI;AAEtB,aAAW,QAAQ,OAAO;AAExB,QAAI,UAAU,aAAa,KAAK,EAAE,IAAI,KAAK,UAAU,KAAK,IAAI,IAAI,EAAE,KAAK,GAAG;AAC1E,UAAI,MAAM,0BAA0B,WAAW,YAAO,KAAK,EAAE,EAAE;AAC/D,YAAM,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,KAAK,MAAM,aAAa,IAAI,KAAK,GAAG,CAAC;AACxE,UAAI,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,IAAI,OAAO;AACzC,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,KAAK,QAAQ,SACjB,IAAI,SACJ,CAAC,kCAAkC,WAAW,QAAQ,KAAK,EAAE,EAAE;AAAA,QACrE;AAAA,MACF;AACA,gBAAU,IAAI;AACd,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAGA,SAAO,EAAE,IAAI,MAAM,OAAO,QAAQ;AACpC;AAEA,SAAS,aACP,WACA,OACA,YACoB;AACpB,MAAI,CAAC,WAAY;AAEjB,QAAM,SAAS,MAAM,QAAQ,UAAU,IACnC,aACA,MAAM,KAAK,UAAU;AAEzB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;AACvD,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO,SAAS,SAAS,kCAAkC,QAAQ;AAAA,QACjE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,aAAO,SAAS,SAAS,oBAAoB,OAAO,KAAK,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAIA,SAAS,cAAc,KAA8C;AACnE,QAAM,MAAM,MAAM,QAAQ,KAAK,IAAI,IAC/B,IAAI,OACJ,MAAM,QAAQ,KAAK,UAAU,IAC7B,IAAI,aACJ,MAAM,QAAQ,KAAK,KAAK,IACxB,IAAI,QACJ,MAAM,QAAQ,KAAK,WAAW,IAC9B,IAAI,cACJ,KAAK,oBAAoB,MACzB,MAAM,KAAK,IAAI,QAAQ,IACvB;AAEJ,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,KAAK,IAAI;AAAA,IACb,CAAC,MAAe,OAAO,MAAM,YAAY,OAAO,MAAM;AAAA,EACxD;AACA,SAAO,KAAM,MAAiC;AAChD;AAGA,SAAS,aACP,KACA,SACkC;AAClC,OACG,YAAY,UAAa,YAAY,SACtC,OAAO,KAAK,eAAe,YAC3B;AACA,UAAM,OAAO,IAAI,WAAW;AAC5B,QAAI,SAAS,QAAW;AACtB,aAAO,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,IACtC;AAAA,EACF;AACA,SAAO,EAAE,OAAO,SAAS,SAAS,MAAM;AAC1C;AAEA,SAAS,WAAW,KAAmB;AACrC,SAAO,KAAK,eAAe;AAC7B;AAEA,SAAS,aAAa,KAA6C;AACjE,SAAO,KAAK,cAAc;AAC5B;AAEA,SAAS,SAAS,KAA2C;AAC3D,SAAO,KAAK,UAAU,KAAK,SAAS;AACtC;AAMA,SAAS,qBACP,WACA,KACA,OACA,KACA,QACsB;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,aAAO,KAAK,2BAA2B,IAAI,EAAE;AAAA,IAC/C;AACA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AACA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,eACP,WACA,KACA,OACA,KACA,UACA,QACiC;AACjC,MACE,IAAI,eACJ,YACA,SAAS,GAAG,MAAM,UAClB,UAAU,SAAS,GAAG,GACtB;AACA,UAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,WAAO,KAAK,uBAAuB,IAAI,EAAE;AACzC,WAAO,EAAE,oBAAoB,KAAK;AAAA,EACpC;AACA,SAAO,EAAE,oBAAoB,MAAM;AACrC;AAEA,SAAS,mBACP,WACA,KACA,OACA,KACA,QACsB;AACtB,QAAM,YAAY,aAAa,GAAG;AAClC,MAAI,aAAa,UAAU,UAAa,UAAU,MAAM;AACtD,UAAM,QAAQ,UAAU,KAAK;AAC7B,QAAI,CAAC,OAAO;AACV,YAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,aAAO,KAAK,4BAA4B,IAAI,EAAE;AAC9C,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAAA,EACF;AACA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,oBACP,WACA,KACA,OACA,KACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,SAAS,IAAI,iBAAiB;AAC1C;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,GAAG;AACpC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,OAAO,UAAU;AACtD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,oBACP,WACA,KACA,OACA,KACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,SAAS,IAAI,iBAAiB;AAC1C;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,GAAG;AACpC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,OAAO,UAAU;AACtD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,qBACP,WACA,KACA,OACA,MACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,KAAK,SAAS,IAAI,kBAAkB;AAAA,EAC7C;AACF;AAEA,SAAS,uBACP,WACA,KACA,OACA,QACA,UACA,gBACA,QACA;AACA,aAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAGlD;AACH,QAAI,aAAa,IAAI,QAAQ;AAC7B,UAAM,gBACJ,YAAY,OAAO,aAAa,WAAY,SAAiB,QAAQ,IAAI;AAG3E,UAAM,EAAE,OAAO,aAAa,QAAQ,IAAI,aAAa,UAAU,UAAU;AACzE,QAAI,SAAS;AACX,UAAI,QAAQ,IAAI;AAChB,mBAAa;AAAA,IACf;AAGA,UAAM,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,QAAS;AAEb,UAAM,EAAE,mBAAmB,IAAI;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,mBAAoB;AAExB,UAAM,EAAE,aAAa,IAAI;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,aAAc;AAGlB,UAAM,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,QAAS;AAIb;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBACP,WACA,KACA,OACA,KACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO,KAAK,SAAS,IAAI,iBAAiB;AAC1C;AAAA,EACF;AACA,QAAM,WAAW,SAAS,GAAG;AAC7B,MAAI;AACF,2BAAuB,MAAM,OAAO,UAAU,QAAQ,UAAU,gBAAgB,MAAM;AAC1F;AAEA,SAAS,uBACP,WACA,KACA,KACA,SACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC5C,WAAO,KAAK,SAAS,IAAI,mBAAmB;AAC5C;AAAA,EACF;AACA,QAAM,aAAa,cAAc,OAAO;AACxC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,KAAK,UAAU;AACpD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,YAAY,aAAa,OAAO;AACtC,MAAI,WAAW;AACb,QAAI,QAAQ,CAAC,GAAG,QAAQ;AACtB,UAAI,CAAC,UAAU,CAAC,GAAG;AACjB,eAAO,KAAK,4BAA4B,IAAI,IAAI,GAAG,GAAG;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,uBACP,WACA,KACA,KACA,SACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC5C,WAAO,KAAK,SAAS,IAAI,mBAAmB;AAAA,EAC9C;AAEA,QAAM,aAAa,cAAc,OAAO;AACxC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,KAAK,UAAU;AACpD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,YAAY,aAAa,OAAO;AACtC,MAAI,WAAW;AACb,QAAI,QAAQ,CAAC,GAAG,QAAQ;AACtB,UAAI,CAAC,UAAU,CAAC,GAAG;AACjB,eAAO,KAAK,4BAA4B,IAAI,IAAI,GAAG,GAAG;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBACP,WACA,KACA,KACA,UACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,SAAS,GAAG;AAC7C,WAAO,KAAK,SAAS,IAAI,oBAAoB;AAAA,EAC/C;AAEA,QAAM,YAAY,aAAa,QAAQ;AACvC,MAAI,WAAW;AACb,QAAI,QAAQ,CAAC,GAAG,QAAQ;AACtB,UAAI,CAAC,UAAU,CAAC,GAAG;AACjB,eAAO,KAAK,4BAA4B,IAAI,IAAI,GAAG,GAAG;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,uBACP,WACA,KACA,KACA,SACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AAEjD,MACE,CAAC,MAAM,QAAQ,GAAG,KAClB,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC,GAC1E;AACA,WAAO,KAAK,SAAS,IAAI,mBAAmB;AAC5C;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,OAAO;AAClC,MAAI,CAAC,UAAW;AAEhB,MAAI,QAAQ,CAAC,MAAM,QAAQ;AACzB,UAAM,aAAa,GAAG,IAAI,IAAI,GAAG;AACjC,UAAM,eAAe,MAAM,QAAQ,QAAQ,IAAI,SAAS,GAAG,IAAI;AAC/D,eAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAGtD;AACH,UAAI,aAAc,KAAa,QAAQ;AACvC,YAAM,gBACJ,gBAAgB,OAAO,iBAAiB,WACnC,aAAqB,QAAQ,IAC9B;AAEN,YAAM,EAAE,OAAO,aAAa,QAAQ,IAAI;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AACA,UAAI,SAAS;AACX,QAAC,KAAa,QAAQ,IAAI;AAC1B,qBAAa;AAAA,MACf;AAGA,YAAM,EAAE,QAAQ,IAAI;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,QAAS;AAEb,YAAM,EAAE,mBAAmB,IAAI;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,mBAAoB;AAExB,YAAM,EAAE,aAAa,IAAI;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,aAAc;AAGlB,YAAM,EAAE,QAAQ,IAAI;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,QAAS;AAGb;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBACP,WACA,KACA,OACA,KACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK,SAAS,GAAG,mBAAmB;AAC3C;AAAA,EACF;AACA,QAAM,WAAW,IAAI,UAAU;AAC/B,MAAI,aAAa;AACf,WAAO,uBAAuB,WAAW,KAAK,OAAO,IAAI,UAAU,MAAM;AAC3E,MAAI,aAAa;AACf,WAAO,uBAAuB,WAAW,KAAK,OAAO,IAAI,UAAU,MAAM;AAC3E,MAAI,aAAa;AACf,WAAO,wBAAwB,WAAW,KAAK,OAAO,IAAI,UAAU,MAAM;AAC5E,MAAI,aAAa;AACf,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACF,MAAI,aAAa,OAAO;AACtB,UAAM,eAAgB,IAAI,SAAiB;AAC3C,UAAM,QAAQ,CAAC,KAAU,QAAgB;AACvC,UACE,CAAC,OACD,OAAO,QAAQ,YACf,QAAQ,QACR,OAAO,IAAI,SAAS,YACpB,OAAO,IAAI,OAAO,YACjB,gBAAgB,IAAI,SAAS,cAC9B;AACA,eAAO;AAAA,UACL,SAAS,IAAI,IAAI,GAAG,2CAA2C,YAAY;AAAA,QAC7E;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,WAAW,SAAS,IAAI,QAAQ;AACtC,QAAI,UAAU;AACZ,YAAM,eAAe,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAC3D,YAAM,QAAQ,CAAC,KAAU,QAAgB;AACvC,YAAI,OAAO,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAClD,gBAAM,cAAc,aAAa,GAAG;AACpC,qBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAGrD;AACH,kBAAM,YAAY,GAAG,IAAI,IAAI,GAAG,KAAK,QAAQ;AAC7C,gBAAI,aAAa,IAAI,QAAQ;AAC7B,kBAAM,gBACJ,eAAe,OAAO,gBAAgB,WACjC,YAAoB,QAAQ,IAC7B;AACN,kBAAM,EAAE,OAAO,aAAa,QAAQ,IAAI;AAAA,cACtC;AAAA,cACA;AAAA,YACF;AACA,gBAAI,SAAS;AACX,kBAAI,QAAQ,IAAI;AAChB,2BAAa;AAAA,YACf;AACA,iBACG,eAAe,UAAa,eAAe,SAC5C,CAAC,WAAW,QAAQ,GACpB;AACA,qBAAO,KAAK,2BAA2B,SAAS,EAAE;AAClD;AAAA,YACF;AAEA,kBAAM,EAAE,mBAAmB,IAAI;AAAA,cAC7B,GAAG,IAAI,IAAI,GAAG;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,gBAAI,mBAAoB;AAExB,kBAAM,EAAE,aAAa,IAAI;AAAA,cACvB,GAAG,IAAI,IAAI,GAAG;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,gBAAI,aAAc;AAElB,kBAAM,iBAAiB,aAAa,QAAQ;AAC5C,gBACE,kBACA,eAAe,UACf,eAAe,MACf;AACA,oBAAM,QAAQ,eAAe,UAAU;AACvC,kBAAI,CAAC,OAAO;AACV,uBAAO,KAAK,4BAA4B,SAAS,EAAE;AACnD;AAAA,cACF;AAAA,YACF;AAEA;AAAA,cACE,GAAG,IAAI,IAAI,GAAG;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA;AAAA,EACF;AACA,SAAO,KAAK,SAAS,IAAI,kCAAkC;AAC7D;AAEA,SAAS,iBACP,WACA,KACA,OACA,KACA,QACA,WACA,iBACA,SACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,OAAO,UACpB;AACA,WAAO,KAAK,SAAS,IAAI,uCAAuC;AAChE;AAAA,EACF;AAEA,QAAM,eAAgB,IAAY;AAClC,MAAI,gBAAgB,MAAM,SAAS,cAAc;AAC/C,WAAO;AAAA,MACL,SAAS,IAAI,yBAAyB,YAAY,SAAS,MAAM,IAAI;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,eACP,WACA,KACA,OACA,KACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,aAAO,oBAAoB,WAAW,KAAK,OAAO,KAAK,MAAM;AAAA,IAC/D,KAAK;AACH,aAAO,oBAAoB,WAAW,KAAK,OAAO,KAAK,MAAM;AAAA,IAC/D,KAAK;AACH,aAAO,qBAAqB,WAAW,KAAK,OAAO,KAAK,MAAM;AAAA,IAChE,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,iBAAiB,WAAW,KAAK,OAAO,KAAK,QAAQ,UAAU,gBAAgB,MAAM;AAAA,IAC9F;AACE,aAAO,KAAK,0BAA0B,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,EAC7D;AACF;AAEO,SAAS,aACd,QACA,YACA,UAAyB;AAAA,EACvB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,iBAAiB,MAAM;AAAA,EACvB,gBAAgB;AAAA,EAChB,eAAe;AACjB,GACW;AACX,QAAM,eAAe;AAAA,IACnB,MAAM,MAAM,OAAO,EAAE,UAAU,EAAE,OAAO;AAAA,IACxC,SAAS,MAAM,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,cAAc;AAAA,EACvE;AAEA,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,QAAQ,QAAQ,SAAS;AAG/B,QAAM,gBAAgD,QACnD;AAEH,QAAM,SAAoB;AAAA;AAAA,IAExB,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA;AAAA,IAGA,MAAM,EAAE,YAAY,QAAQ;AAAA;AAAA,IAG5B,SAAS,OAAgB,UAAgC;AACvD,YAAM,SAAmB,CAAC;AAC1B,YAAM,SAAc,CAAC;AACrB,YAAM,UAA0B,QAAQ,kBAAkB;AAE1D,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,eAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,yBAAyB,EAAE;AAAA,MAC7D;AAEA,YAAM,UACJ,OAAO,UAAU,YAAY,UAAU,OACnC,UAAU,KAAY,IACtB,EAAE,GAAI,MAAc;AAC1B,UAAI,QAAQ,QAAQ,KAAM,SAAQ,OAAO;AACzC,UAAI,QAAQ,WAAW,KAAM,SAAQ,UAAU;AAG/C,YAAM,cAAc,OAAO,QAAQ,WAAW,OAAO;AACrD,YAAM,YAAY,OAAO,OAAO;AAChC,UAAI,iBAAiB,UAAU,aAAa,SAAS,IAAI,GAAG;AAC1D,cAAM,aAAa,mBAAmB,eAAe,EAAE,GAAG,QAAQ,GAAG;AAAA,UACnE,MAAM;AAAA,UACN,IAAI;AAAA,UACJ;AAAA,UACA,UAAU,MAAM,OAAO,SAAS;AAAA,QAClC,CAAC;AACD,YAAI,CAAC,cAAc,WAAW,OAAO,QAAQ,CAAC,WAAW,OAAO;AAC9D,gBAAM,OAAO,YAAY,QAAQ,SAC7B,WAAW,SACX,CAAC,kCAAkC,WAAW,QAAQ,SAAS,EAAE;AACrE,iBAAO,KAAK,GAAG,IAAI;AAEnB,iBAAO,EAAE,OAAO,OAAO,OAAO;AAAA,QAChC;AAEA,mBAAW,KAAK,OAAO,KAAK,OAAO,EAAG,QAAQ,QAAgB,CAAC;AAC/D,eAAO,OAAO,SAAS,WAAW,KAAK;AAEvC,gBAAQ,OAAO;AACf,gBAAQ,UAAU;AAAA,MACpB;AAEA,iBAAW,OAAO,OAAO,QAAQ;AAC/B,cAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,YAAI,QAAQ,QAAQ,GAAG;AACvB,cAAM,gBACJ,YAAY,OAAO,aAAa,WAAY,SAAiB,GAAG,IAAI;AAEtE,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,iCAAiC,GAAG,EAAE;AAClD;AAAA,QACF;AAGA,cAAM,EAAE,OAAO,aAAa,QAAQ,IAAI,aAAa,KAAK,KAAK;AAC/D,YAAI,SAAS;AACX,kBAAQ,GAAG,IAAI;AACf,kBAAQ;AAAA,QACV;AAGA,cAAM,EAAE,QAAQ,IAAI,qBAAqB,IAAI,KAAK,OAAO,KAAK,MAAM;AACpE,YAAI,QAAS;AAGb,cAAM,EAAE,mBAAmB,IAAI;AAAA,UAC7B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,mBAAoB;AAGxB,cAAM,EAAE,aAAa,IAAI;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,aAAc;AAGlB,cAAM,gBAAgB,CAAC,QAAuB;AAC5C,gBAAM,cAAwB,CAAC;AAC/B,gBAAM,EAAE,QAAQ,IAAI;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,CAAC,SAAS;AACZ,2BAAe,IAAI,KAAK,KAAK,KAAK,aAAa,eAAe,SAAS,OAAO;AAAA,UAChF;AACA,iBAAO;AAAA,QACT;AAGA,YAAI,aAAa;AACjB,YAAI,cAAc,cAAc,UAAU;AAG1C,cAAM,aAAa,OAAO,QAAQ,WAAW,OAAO;AACpD,cAAM,WAAW,OAAO,OAAO;AAC/B,cAAM,UAAU,OAAQ,IAAY,YAAY,QAAQ;AACxD,cAAM,cAAc,OAAQ,IAAY,aAAa;AAErD,YACE,YAAY,SAAS,KACrB,eACA,UAAU,YAAY,QAAQ,IAAI,GAClC;AACA,gBAAM,KAAM,IAAY;AAUxB,gBAAM,MAAM,GAAG,YAAY;AAAA,YACzB;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AACD,cAAI,OAAO,IAAI,IAAI;AACjB,yBAAa,IAAI;AACjB,0BAAc,cAAc,UAAU;AAAA,UACxC,OAAO;AACL,wBAAY;AAAA,cACV,KAAK,SACH,2BAA2B,GAAG,UAAU,UAAU,QAAQ,QAAQ;AAAA,YACtE;AAAA,UACF;AAAA,QACF;AAEA,eAAO,GAAG,IAAI;AAEd,YAAI,YAAY,WAAW,GAAG;AAC5B,iBAAO,KAAK,GAAG,WAAW;AAC1B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,KAAK,QAAQ,iBAAiB;AAClD,cAAM,YAAY;AAClB,YAAI,CAAC,QAAQ,gBAAgB,SAAS,GAAG;AACvC,iBAAO,KAAK,iCAAiC;AAAA,QAC/C;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO,OAAO,WAAW;AAAA,QACzB,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAGA,iBAAiB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMzB,QACE,OACA,KAKA;AACA,YAAM,cAAc,OAAQ,OAAe,WAAW,OAAO;AAC7D,YAAM,YAAY,OAAO,OAAO;AAChC,UAAI,CAAC,iBAAiB,UAAU,aAAa,SAAS,KAAK,GAAG;AAE5D,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,OAAO,EAAE,GAAG,OAAO,MAAM,YAAY,SAAS,UAAU;AAAA,QAC1D;AAAA,MACF;AACA,YAAM,MAAM;AAAA,QACV;AAAA,QACA,EAAE,GAAI,MAAc;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,IAAI;AAAA,UACJ;AAAA,UACA,UAAU,MAAM,OAAO,SAAS;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,IAAI,MAAM,IAAI,OAAO;AAC9B,cAAM,MAAM,EAAE,GAAG,IAAI,OAAO,MAAM,YAAY,SAAS,UAAU;AACjE,eAAO,EAAE,IAAI,MAAM,OAAO,IAAI;AAAA,MAChC;AACA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,KAAK,QAAQ,SACjB,IAAI,SACJ,CAAC,kCAAkC,WAAW,QAAQ,SAAS,EAAE;AAAA,MACvE;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwBA,MAAM,oBAAoB,QAAQC,UAAS;AACzC,YAAM;AAAA,QACJ;AAAA,QACA,mBAAmB,EAAE,SAAS,oBAAI,IAAI,EAAE;AAAA,QACxC,WAAW;AAAA,QACX;AAAA,MACF,IAAIA;AAEJ,YAAM,YAAY,GAAI,OAAe,IAAI,IAAK,OAAe,EAAE;AAC/D,UAAI,iBAAiB,QAAQ,IAAI,SAAS,GAAG;AAC3C,cAAM,mCAAmC,SAAS,EAAE;AACpD;AAAA,MACF;AACA,uBAAiB,QAAQ,IAAI,SAAS;AACtC,YAAM,qCAAqC,SAAS,EAAE;AAEtD,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAEtD,YAAIA,SAAQ,cAAc,CAACA,SAAQ,WAAW,SAAS,GAAG,GAAG;AAC3D,gBAAM,kBAAkB,GAAG,sBAAsB;AACjD;AAAA,QACF;AAEA,cAAM,eAAgB,IAAY,iBAAiB;AACnD,cAAM,YAAa,IAAY,aAAa;AAC5C,cAAM,QAAS,OAAe,GAAG;AACjC,YAAI,CAAC,MAAO;AAEZ,YAAI,IAAI,SAAS,OAAO;AACtB,gBAAM,UAAW,IAAY;AAC7B,cAAI,CAAC;AACH,kBAAM,IAAI,MAAM,uCAAuC,GAAG,EAAE;AAC9D,gBAAM,MAAM;AACZ,cAAI,IAAI,QAAQ,IAAI,SAAS,SAAS;AACpC,kBAAM,IAAI;AAAA,cACR,qCAAqC,GAAG,cAAc,OAAO,SAAS,IAAI,IAAI;AAAA,YAChF;AAAA,UACF;AACA,gBAAM,SAAS,MAAMA,SAAQ,cAAc,SAAS,IAAI,EAAE;AAC1D,cAAI,CAAC;AACH,kBAAM,IAAI;AAAA,cACR,qBAAqB,OAAO,IAAI,IAAI,EAAE,aAAa,GAAG;AAAA,YACxD;AACF,gBAAM,YAAY,OAAO,IAAI,IAAI,EAAE,eAAe,GAAG,EAAE;AAEvD,cAAI,gBAAgB,cAAc,SAAS;AACzC,kBAAM,eAAe,iBAAiB,OAAO;AAC7C,gBAAIA,SAAQ,WAAY,KAAK,cAAc;AACzC,oBAAM,aAAa,oBAAoB,QAAQ;AAAA,gBAC7C,GAAGA;AAAA,gBACH,UAAUA,SAAQ,WAAY;AAAA,cAChC,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QAEF,WAAW,IAAI,SAAS,WAAW,IAAI,UAAU,SAAS,OAAO;AAC/D,gBAAM,UAAW,IAAI,SAAiB;AACtC,cAAI,CAAC;AACH,kBAAM,IAAI,MAAM,6CAA6C,GAAG,EAAE;AACpE,gBAAM,OAAO;AACb,qBAAW,OAAO,MAAM;AACtB,gBAAI,IAAI,QAAQ,IAAI,SAAS,SAAS;AACpC,oBAAM,IAAI;AAAA,gBACR,qCAAqC,GAAG,cAAc,OAAO,SAAS,IAAI,IAAI;AAAA,cAChF;AAAA,YACF;AACA,kBAAM,SAAS,MAAMA,SAAQ,cAAc,SAAS,IAAI,EAAE;AAC1D,gBAAI,CAAC;AACH,oBAAM,IAAI;AAAA,gBACR,qBAAqB,OAAO,IAAI,IAAI,EAAE,aAAa,GAAG;AAAA,cACxD;AACF,kBAAM,YAAY,OAAO,IAAI,IAAI,EAAE,eAAe,GAAG,EAAE;AAEvD,gBAAI,gBAAgB,cAAc,SAAS;AACzC,oBAAM,eAAe,iBAAiB,OAAO;AAC7C,kBAAIA,SAAQ,WAAY,KAAK,cAAc;AACzC,sBAAM,aAAa,oBAAoB,QAAQ;AAAA,kBAC7C,GAAGA;AAAA,kBACH,UAAUA,SAAQ,WAAY;AAAA,gBAChC,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,YAAoB;AAClB,UAAI,CAAC,SAAS,UAAU,IAAI;AAC1B,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,kBACE,OACA,WACA,QACqB;AACrB,aAAO,kBAAqB,QAAQ,OAAO,WAAW,MAAM;AAAA,IAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,eACE,QACA,WACqB;AACrB,aAAO,eAAkB,QAAQ,QAAQ,SAAS;AAAA,IACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,eACE,MACA,aACqB;AACrB,aAAO,eAAkB,QAAQ,MAAM,WAAW;AAAA,IACpD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,cAMG;AACD,aAAO,YAAe,MAAM;AAAA,IAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,QAAkD;AAClE,aAAO,kBAAqB,QAAQ,MAAM;AAAA,IAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,WAAW;AACT,YAAM,cAAmC,CAAC;AAC1C,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AACtD,oBAAY,GAAG,IAAI;AAAA,UACjB,MAAM,IAAI;AAAA,UACV,UAAU,WAAW,GAAG;AAAA,UACxB,WAAW,CAAC,CAAC,IAAI;AAAA,UACjB,QAAQ,CAAC,CAAC,IAAI;AAAA,UACd,aAAa,IAAI,gBAAgB;AAAA,UACjC,SAAS,IAAI,YAAY;AAAA,UACzB,YAAa,IAAY,cAAc;AAAA,UACvC,mBACG,IAAY,sBAAsB,SAC/B,OACC,IAAY;AAAA,UACnB,MAAM,cAAc,GAAU,KAAK;AAAA,UACnC,SAAU,IAAY,WAAW;AAAA,UACjC,KACE,CAAC,IAAI,QAAQ,IAAI,KAAK,mBAAmB,SAAS,OAAO,IAAI;AAAA,QACjE;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,kBAAkB,CAAC,CAAC;AAAA,QACpB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,uBAAqB,IAAI,YAAY,MAAM;AAC3C,SAAO;AACT;AAMO,SAAS,iBAAiB,MAAuC;AACtE,SAAO,qBAAqB,IAAI,IAAI;AACtC;AAKO,SAAS,gBAA+B;AAC7C,SAAO,MAAM,KAAK,qBAAqB,OAAO,CAAC;AACjD;AAMO,SAAS,wBACd,QAWA;AACA,QAAM,OAAO,OAAO,SAAS;AAC7B,SAAO;AAAA,IACL,OAAO,GAAG,KAAK,UAAU,MAAM,KAAK,OAAO;AAAA,IAC3C,QAAQ,OAAO,QAAQ,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO;AAAA,MACvD;AAAA,MACA,MAAM,IAAI;AAAA,MACV,UAAU,IAAI;AAAA,MACd,aAAa,IAAI;AAAA,MACjB,YAAY,IAAI;AAAA,MAChB,KAAK,IAAI,MAAM,IAAI,IAAI,iBAAiB;AAAA,IAC1C,EAAE;AAAA,EACJ;AACF;;;AC/xCA,IAAM,0BAA0B,oBAAI,IAAiC;AAE9D,SAAS,sBACd,OACA,MACA,SACA,YAAoB,IACpB,kBAAiD,MAAM,MAClC;AACrB,QAAM,SAAS,aAAgB,OAAY,MAAM;AAAA,IAC/C;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AACD,0BAAwB,MAAM,MAA6B;AAC3D,SAAO;AACT;AAEO,SAAS,wBACd,MACA,QACA;AACA,0BAAwB,IAAI,MAAM,MAAM;AAC1C;AAEO,SAAS,mBACd,MACiC;AACjC,SAAO,wBAAwB,IAAI,IAAI;AACzC;AAEO,SAAS,yBAA0D;AACxE,SAAO,MAAM,KAAK,wBAAwB,QAAQ,CAAC;AACrD;","names":["IsoLanguageCode","options"]}