@kyro-cms/core 0.1.6 → 0.1.7

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 (170) hide show
  1. package/dist/WebhookService-BCgL1bLF.d.cts +112 -0
  2. package/dist/WebhookService-BPVJUgTl.d.ts +112 -0
  3. package/dist/{base-DlhVlwnN.d.cts → base-B0Y6isUJ.d.cts} +1 -1
  4. package/dist/{base-CQkFzqQl.d.ts → base-DaP-5PPG.d.ts} +1 -1
  5. package/dist/bootstrap-BMWVB2T6.cjs +31 -0
  6. package/dist/{bootstrap-WMWQ4DBX.cjs.map → bootstrap-BMWVB2T6.cjs.map} +1 -1
  7. package/dist/bootstrap-LL6O7PWO.js +6 -0
  8. package/dist/{bootstrap-WOVGAKZP.js.map → bootstrap-LL6O7PWO.js.map} +1 -1
  9. package/dist/{chunk-3VZCX4DF.cjs → chunk-42JPONZU.cjs} +77 -14
  10. package/dist/chunk-42JPONZU.cjs.map +1 -0
  11. package/dist/{chunk-3EVLFWH2.cjs → chunk-4M5PHMUE.cjs} +60 -346
  12. package/dist/chunk-4M5PHMUE.cjs.map +1 -0
  13. package/dist/chunk-4PWRCMTQ.cjs +15 -0
  14. package/dist/chunk-4PWRCMTQ.cjs.map +1 -0
  15. package/dist/chunk-6COM32WF.js +47 -0
  16. package/dist/chunk-6COM32WF.js.map +1 -0
  17. package/dist/chunk-6MSSF46R.js +941 -0
  18. package/dist/chunk-6MSSF46R.js.map +1 -0
  19. package/dist/{chunk-TZFJMPCH.cjs → chunk-7YITG2US.cjs} +9 -18
  20. package/dist/chunk-7YITG2US.cjs.map +1 -0
  21. package/dist/{chunk-A3RQWHKD.cjs → chunk-BLMFBDBG.cjs} +56 -6
  22. package/dist/chunk-BLMFBDBG.cjs.map +1 -0
  23. package/dist/{chunk-EINVJPFM.js → chunk-BTOE3VUK.js} +65 -3
  24. package/dist/chunk-BTOE3VUK.js.map +1 -0
  25. package/dist/chunk-E5X75WNB.js +497 -0
  26. package/dist/chunk-E5X75WNB.js.map +1 -0
  27. package/dist/chunk-E63IF3MD.cjs +951 -0
  28. package/dist/chunk-E63IF3MD.cjs.map +1 -0
  29. package/dist/{chunk-K7QF2QCM.cjs → chunk-FTSSDDZQ.cjs} +7 -3
  30. package/dist/chunk-FTSSDDZQ.cjs.map +1 -0
  31. package/dist/chunk-G7VZBCD6.cjs +35 -0
  32. package/dist/{chunk-5BLDMQED.cjs.map → chunk-G7VZBCD6.cjs.map} +1 -1
  33. package/dist/{chunk-VMSRTAH7.js → chunk-GLCPGZPM.js} +56 -6
  34. package/dist/chunk-GLCPGZPM.js.map +1 -0
  35. package/dist/{chunk-V3B25QOK.cjs → chunk-GVFB5C6O.cjs} +74 -2
  36. package/dist/chunk-GVFB5C6O.cjs.map +1 -0
  37. package/dist/chunk-HVSQDZZJ.cjs +765 -0
  38. package/dist/chunk-HVSQDZZJ.cjs.map +1 -0
  39. package/dist/chunk-HYC4GNHX.js +758 -0
  40. package/dist/chunk-HYC4GNHX.js.map +1 -0
  41. package/dist/chunk-KDVDIZ4Y.cjs +3479 -0
  42. package/dist/chunk-KDVDIZ4Y.cjs.map +1 -0
  43. package/dist/{chunk-OG3KX56O.js → chunk-KWGNR4HM.js} +7 -3
  44. package/dist/chunk-KWGNR4HM.js.map +1 -0
  45. package/dist/chunk-LIJVWQKU.cjs +256 -0
  46. package/dist/chunk-LIJVWQKU.cjs.map +1 -0
  47. package/dist/{chunk-XTZSUDSI.js → chunk-LTRCYJAG.js} +3 -18
  48. package/dist/chunk-LTRCYJAG.js.map +1 -0
  49. package/dist/{chunk-UEYC46RL.js → chunk-OUGKLCYF.js} +71 -8
  50. package/dist/chunk-OUGKLCYF.js.map +1 -0
  51. package/dist/chunk-RONAX6UU.js +3456 -0
  52. package/dist/chunk-RONAX6UU.js.map +1 -0
  53. package/dist/{chunk-5Y7QGIHD.js → chunk-RRYXQMZG.js} +60 -344
  54. package/dist/chunk-RRYXQMZG.js.map +1 -0
  55. package/dist/{chunk-QUJ4OLSC.js → chunk-U74F3YZU.js} +87 -7
  56. package/dist/chunk-U74F3YZU.js.map +1 -0
  57. package/dist/chunk-VIONYQ2K.cjs +517 -0
  58. package/dist/chunk-VIONYQ2K.cjs.map +1 -0
  59. package/dist/chunk-VSTRLXMQ.cjs +50 -0
  60. package/dist/chunk-VSTRLXMQ.cjs.map +1 -0
  61. package/dist/chunk-YT7HXXVN.js +13 -0
  62. package/dist/chunk-YT7HXXVN.js.map +1 -0
  63. package/dist/chunk-Z6ZWNWWR.js +30 -0
  64. package/dist/{chunk-NSBPE2FW.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
  65. package/dist/cli/index.cjs +11 -7
  66. package/dist/cli/index.cjs.map +1 -1
  67. package/dist/cli/index.js +11 -7
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/drizzle/index.cjs +20 -17
  70. package/dist/drizzle/index.d.cts +4 -4
  71. package/dist/drizzle/index.d.ts +4 -4
  72. package/dist/drizzle/index.js +4 -5
  73. package/dist/graphql/index.cjs +4 -4
  74. package/dist/graphql/index.d.cts +3 -2
  75. package/dist/graphql/index.d.ts +3 -2
  76. package/dist/graphql/index.js +2 -2
  77. package/dist/{index-DI0DRPNv.d.cts → index-BwE4NueJ.d.cts} +1 -1
  78. package/dist/{index-CMUNCIWQ.d.ts → index-DUKmDSeC.d.cts} +96 -24
  79. package/dist/{index-BMySjW6o.d.cts → index-DtBi3zP0.d.ts} +96 -24
  80. package/dist/{index-4fJKLFK2.d.ts → index-DupWTmW6.d.ts} +1 -1
  81. package/dist/index.cjs +3317 -352
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.cts +379 -105
  84. package/dist/index.d.ts +379 -105
  85. package/dist/index.js +3211 -310
  86. package/dist/index.js.map +1 -1
  87. package/dist/media-HOT3O7RW.js +4 -0
  88. package/dist/media-HOT3O7RW.js.map +1 -0
  89. package/dist/media-WKP5AOX2.cjs +17 -0
  90. package/dist/media-WKP5AOX2.cjs.map +1 -0
  91. package/dist/mongodb/index.cjs +1 -1
  92. package/dist/mongodb/index.d.cts +2 -2
  93. package/dist/mongodb/index.d.ts +2 -2
  94. package/dist/mongodb/index.js +1 -1
  95. package/dist/mysql-media-AI6YK767.cjs +48 -0
  96. package/dist/mysql-media-AI6YK767.cjs.map +1 -0
  97. package/dist/mysql-media-CDZUS7YX.js +45 -0
  98. package/dist/mysql-media-CDZUS7YX.js.map +1 -0
  99. package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +14 -0
  100. package/dist/{postgres-auth-adapter-VK6GY7LX.cjs.map → postgres-auth-adapter-EVRPO7BQ.cjs.map} +1 -1
  101. package/dist/postgres-auth-adapter-OTRWSTT5.js +5 -0
  102. package/dist/{postgres-auth-adapter-REJFUMP7.js.map → postgres-auth-adapter-OTRWSTT5.js.map} +1 -1
  103. package/dist/redis-adapter-2N6VA7BI.cjs +13 -0
  104. package/dist/{redis-adapter-LBLNKGNS.cjs.map → redis-adapter-2N6VA7BI.cjs.map} +1 -1
  105. package/dist/redis-adapter-RA24FNCX.js +4 -0
  106. package/dist/{redis-adapter-4YDY4LWE.js.map → redis-adapter-RA24FNCX.js.map} +1 -1
  107. package/dist/rest/index.cjs +7 -5
  108. package/dist/rest/index.d.cts +29 -3
  109. package/dist/rest/index.d.ts +29 -3
  110. package/dist/rest/index.js +5 -3
  111. package/dist/schema-CNB2DDTX.js +6 -0
  112. package/dist/schema-CNB2DDTX.js.map +1 -0
  113. package/dist/schema-Y777CQQS.cjs +67 -0
  114. package/dist/schema-Y777CQQS.cjs.map +1 -0
  115. package/dist/templates/index.cjs +24 -28
  116. package/dist/templates/index.d.cts +2 -4
  117. package/dist/templates/index.d.ts +2 -4
  118. package/dist/templates/index.js +2 -2
  119. package/dist/trpc/index.cjs +12 -12
  120. package/dist/trpc/index.d.cts +19 -14
  121. package/dist/trpc/index.d.ts +19 -14
  122. package/dist/trpc/index.js +3 -3
  123. package/dist/{types-BGM5MV_K.d.cts → types-BM0s_YOy.d.cts} +67 -35
  124. package/dist/{types-BGM5MV_K.d.ts → types-BM0s_YOy.d.ts} +67 -35
  125. package/dist/ws/index.cjs +1 -1
  126. package/dist/ws/index.js +1 -1
  127. package/package.json +11 -1
  128. package/dist/bootstrap-WMWQ4DBX.cjs +0 -29
  129. package/dist/bootstrap-WOVGAKZP.js +0 -4
  130. package/dist/chunk-3EVLFWH2.cjs.map +0 -1
  131. package/dist/chunk-3QX6KG2S.js +0 -2125
  132. package/dist/chunk-3QX6KG2S.js.map +0 -1
  133. package/dist/chunk-3VZCX4DF.cjs.map +0 -1
  134. package/dist/chunk-5BLDMQED.cjs +0 -18
  135. package/dist/chunk-5Y7QGIHD.js.map +0 -1
  136. package/dist/chunk-7G6EVYCU.cjs +0 -94
  137. package/dist/chunk-7G6EVYCU.cjs.map +0 -1
  138. package/dist/chunk-A3RQWHKD.cjs.map +0 -1
  139. package/dist/chunk-EINVJPFM.js.map +0 -1
  140. package/dist/chunk-F5B64H5S.cjs +0 -2149
  141. package/dist/chunk-F5B64H5S.cjs.map +0 -1
  142. package/dist/chunk-K7QF2QCM.cjs.map +0 -1
  143. package/dist/chunk-LRTZJJPD.js +0 -86
  144. package/dist/chunk-LRTZJJPD.js.map +0 -1
  145. package/dist/chunk-NSBPE2FW.js +0 -15
  146. package/dist/chunk-OG3KX56O.js.map +0 -1
  147. package/dist/chunk-QUJ4OLSC.js.map +0 -1
  148. package/dist/chunk-R3XIBBAW.cjs +0 -34
  149. package/dist/chunk-R3XIBBAW.cjs.map +0 -1
  150. package/dist/chunk-SDMNUYVU.js +0 -30
  151. package/dist/chunk-SDMNUYVU.js.map +0 -1
  152. package/dist/chunk-TZFJMPCH.cjs.map +0 -1
  153. package/dist/chunk-UEG7KMKC.cjs +0 -228
  154. package/dist/chunk-UEG7KMKC.cjs.map +0 -1
  155. package/dist/chunk-UEYC46RL.js.map +0 -1
  156. package/dist/chunk-V3B25QOK.cjs.map +0 -1
  157. package/dist/chunk-VMSRTAH7.js.map +0 -1
  158. package/dist/chunk-XTZSUDSI.js.map +0 -1
  159. package/dist/chunk-YD7Y25W7.cjs +0 -176
  160. package/dist/chunk-YD7Y25W7.cjs.map +0 -1
  161. package/dist/chunk-YPAFJ7EV.js +0 -225
  162. package/dist/chunk-YPAFJ7EV.js.map +0 -1
  163. package/dist/database-7CJOXEZR.js +0 -5
  164. package/dist/database-7CJOXEZR.js.map +0 -1
  165. package/dist/database-QOIV44GT.cjs +0 -22
  166. package/dist/database-QOIV44GT.cjs.map +0 -1
  167. package/dist/postgres-auth-adapter-REJFUMP7.js +0 -5
  168. package/dist/postgres-auth-adapter-VK6GY7LX.cjs +0 -14
  169. package/dist/redis-adapter-4YDY4LWE.js +0 -4
  170. package/dist/redis-adapter-LBLNKGNS.cjs +0 -13
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry/validator.ts","../src/registry/zod-builder.ts","../src/registry/index.ts","../src/createKyro.ts","../src/fields/types.ts","../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/styling/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/security/audit-log.ts","../src/auth/in-memory-adapter.ts","../src/auth/security/in-memory-rate-limit.ts","../src/auth/security/in-memory-lockout.ts","../src/auth/security/in-memory-audit-log.ts","../src/api/rest/auth-middleware.ts","../src/api/rest/auth-routes.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts"],"names":["z","fields","KyroPubSub","createHonoApp","buildGraphQLSchema","createKyroServer","createWSServer","AbstractBaseAdapter","randomBytes","bcrypt","DEFAULT_RATE_LIMITS","createAuditContext","jwt","PasswordPolicy","__require","SQLiteAuthAdapter","RedisAuthAdapter","EmailTransport"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CollectionConfig, GlobalConfig } from './types.js';\nimport type { Field, Block } from '../fields/types.js';\n\n// ============================================================================\n// Validation Errors\n// ============================================================================\n\nexport class ConfigValidationError extends Error {\n public errors: string[];\n \n constructor(errors: string[]) {\n super(`Configuration validation failed:\\n${errors.join('\\n')}`);\n this.name = 'ConfigValidationError';\n this.errors = errors;\n }\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\nexport function validateCollection(config: CollectionConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Collection is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Collection slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Collection \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, config.slug);\n errors.push(...fieldErrors);\n }\n \n // Access validation\n if (config.access) {\n for (const [action, handler] of Object.entries(config.access)) {\n if (typeof handler !== 'boolean' && typeof handler !== 'function') {\n errors.push(`Collection \"${config.slug}\" has invalid access.${action} (must be boolean or function)`);\n }\n }\n }\n \n // Admin validation\n if (config.admin?.useAsTitle) {\n const fieldExists = config.fields.some(f => f.name === config.admin!.useAsTitle);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.useAsTitle references unknown field \"${config.admin.useAsTitle}\"`);\n }\n }\n \n if (config.admin?.defaultColumns) {\n for (const col of config.admin.defaultColumns) {\n const fieldExists = config.fields.some(f => f.name === col);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.defaultColumns references unknown field \"${col}\"`);\n }\n }\n }\n \n // Upload validation\n if (config.upload) {\n if (config.upload.fileSize && config.upload.fileSize <= 0) {\n errors.push(`Collection \"${config.slug}\" upload.fileSize must be positive`);\n }\n }\n \n // Versions validation\n if (config.versions) {\n if (config.versions.maxPerDoc && config.versions.maxPerDoc <= 0) {\n errors.push(`Collection \"${config.slug}\" versions.maxPerDoc must be positive`);\n }\n }\n \n // Auth validation\n if (config.auth) {\n const hasEmailField = config.fields.some(f => f.name === 'email');\n const hasPasswordField = config.fields.some(f => f.name === 'password');\n if (!hasEmailField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires an \"email\" field`);\n }\n if (!hasPasswordField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires a \"password\" field`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Global Validation\n// ============================================================================\n\nexport function validateGlobal(config: GlobalConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Global is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Global slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Global \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, `global:${config.slug}`);\n errors.push(...fieldErrors);\n }\n \n return errors;\n}\n\n// ============================================================================\n// Field Validation\n// ============================================================================\n\nexport function validateFields(fields: Field[], context: string): string[] {\n const errors: string[] = [];\n const fieldNames = new Set<string>();\n \n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n \n // Skip layout fields without names\n if (field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs') {\n // Validate nested fields\n if ('fields' in field && field.fields) {\n const nestedErrors = validateFields(field.fields, context);\n errors.push(...nestedErrors);\n } else if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateFields(tab.fields, context);\n errors.push(...tabErrors);\n }\n }\n continue;\n }\n \n // Name validation\n const fieldName = field.name as string | undefined;\n if (!fieldName) {\n errors.push(`${context}: Field at index ${i} is missing a \"name\" property`);\n continue;\n }\n \n if (fieldNames.has(fieldName)) {\n errors.push(`${context}: Duplicate field name \"${fieldName}\"`);\n }\n fieldNames.add(fieldName);\n \n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(fieldName)) {\n errors.push(`${context}: Field name \"${fieldName}\" must be alphanumeric with underscores`);\n }\n \n // Type validation\n if (!field.type) {\n errors.push(`${context}: Field \"${fieldName}\" is missing a \"type\" property`);\n continue;\n }\n \n // Field-specific validation\n switch (field.type) {\n case 'relationship':\n if (!field.relationTo) {\n errors.push(`${context}: Relationship field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n \n case 'array':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Array field \"${fieldName}\" has no fields defined`);\n } else {\n const arrayErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...arrayErrors);\n }\n break;\n \n case 'group':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Group field \"${fieldName}\" has no fields defined`);\n } else {\n const groupErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...groupErrors);\n }\n break;\n \n case 'blocks':\n if (!field.blocks || field.blocks.length === 0) {\n errors.push(`${context}: Blocks field \"${fieldName}\" has no blocks defined`);\n } else {\n const blockErrors = validateBlocks(field.blocks, `${context}.${fieldName}`);\n errors.push(...blockErrors);\n }\n break;\n \n case 'select':\n case 'radio':\n if (!field.options || field.options.length === 0) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has no options defined`);\n } else {\n const values = field.options.map((o: any) => o.value);\n const uniqueValues = new Set(values);\n if (values.length !== uniqueValues.size) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has duplicate option values`);\n }\n }\n break;\n \n case 'upload':\n if (!field.relationTo) {\n errors.push(`${context}: Upload field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n }\n \n // Min/Max validation\n if ('min' in field && 'max' in field && (field as any).min > (field as any).max) {\n errors.push(`${context}: Field \"${fieldName}\" has min greater than max`);\n }\n \n if ('minLength' in field && 'maxLength' in field && (field as any).minLength > (field as any).maxLength) {\n errors.push(`${context}: Field \"${fieldName}\" has minLength greater than maxLength`);\n }\n \n if ('minRows' in field && 'maxRows' in field && (field as any).minRows > (field as any).maxRows) {\n errors.push(`${context}: Field \"${fieldName}\" has minRows greater than maxRows`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Block Validation\n// ============================================================================\n\nexport function validateBlocks(blocks: Block[], context: string): string[] {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n for (const block of blocks) {\n if (!block.slug) {\n errors.push(`${context}: Block is missing a \"slug\" property`);\n continue;\n }\n \n if (slugs.has(block.slug)) {\n errors.push(`${context}: Duplicate block slug \"${block.slug}\"`);\n }\n slugs.add(block.slug);\n \n if (!block.label) {\n errors.push(`${context}: Block \"${block.slug}\" is missing a \"label\" property`);\n }\n \n if (!block.fields || block.fields.length === 0) {\n errors.push(`${context}: Block \"${block.slug}\" has no fields defined`);\n } else {\n const blockErrors = validateFields(block.fields, `${context}.${block.slug}`);\n errors.push(...blockErrors);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Full Configuration Validation\n// ============================================================================\n\nexport function validateConfig(collections: CollectionConfig[], globals: GlobalConfig[] = []): void {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n // Check for duplicate collection slugs\n for (const collection of collections) {\n if (slugs.has(collection.slug)) {\n errors.push(`Duplicate collection slug \"${collection.slug}\"`);\n }\n slugs.add(collection.slug);\n }\n \n // Check for duplicate global slugs\n for (const global of globals) {\n if (slugs.has(global.slug)) {\n errors.push(`Duplicate global slug \"${global.slug}\"`);\n }\n slugs.add(global.slug);\n }\n \n // Validate all collections\n for (const collection of collections) {\n const collectionErrors = validateCollection(collection);\n errors.push(...collectionErrors);\n }\n \n // Validate all globals\n for (const global of globals) {\n const globalErrors = validateGlobal(global);\n errors.push(...globalErrors);\n }\n \n // Validate relationships reference existing collections\n for (const collection of collections) {\n const relationshipErrors = validateRelationships(collection.fields, collections);\n errors.push(...relationshipErrors);\n }\n \n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n}\n\nfunction validateRelationships(fields: Field[], collections: CollectionConfig[]): string[] {\n const errors: string[] = [];\n const collectionSlugs = new Set(collections.map(c => c.slug));\n \n for (const field of fields) {\n if (field.type === 'relationship') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Relationship field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if (field.type === 'upload') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Upload field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if ('fields' in field && field.fields) {\n const nestedErrors = validateRelationships(field.fields, collections);\n errors.push(...nestedErrors);\n }\n \n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateRelationships(tab.fields, collections);\n errors.push(...tabErrors);\n }\n }\n \n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n const blockErrors = validateRelationships(block.fields, collections);\n errors.push(...blockErrors);\n }\n }\n }\n \n return errors;\n}\n","import { z, type ZodTypeAny } from 'zod';\nimport type {\n Field,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n RichTextField,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n RowField,\n CollapsibleField,\n TabsField,\n ValidateOptions,\n} from '../fields/types.js';\nimport type { CollectionConfig, GlobalConfig } from './types.js';\n\n// ============================================================================\n// Field → Zod Schema Generator\n// ============================================================================\n\nexport function fieldToZod(field: Field): ZodTypeAny {\n switch (field.type) {\n case 'text':\n return textToZod(field);\n case 'number':\n return numberToZod(field);\n case 'checkbox':\n return checkboxToZod(field);\n case 'date':\n return dateToZod(field);\n case 'email':\n return emailToZod(field);\n case 'password':\n return passwordToZod(field);\n case 'textarea':\n return textareaToZod(field);\n case 'select':\n return selectToZod(field);\n case 'radio':\n return radioToZod(field);\n case 'color':\n return colorToZod(field);\n case 'richtext':\n return richTextToZod(field);\n case 'json':\n return jsonToZod(field);\n case 'code':\n return codeToZod(field);\n case 'upload':\n return uploadToZod(field);\n case 'markdown':\n return markdownToZod(field);\n case 'relationship':\n return relationshipToZod(field);\n case 'array':\n return arrayToZod(field);\n case 'group':\n return groupToZod(field);\n case 'blocks':\n return blocksToZod(field);\n case 'row':\n return rowToZod(field);\n case 'collapsible':\n return collapsibleToZod(field);\n case 'tabs':\n return tabsToZod(field);\n default:\n return z.any();\n }\n}\n\n// ============================================================================\n// Primitive Field Schemas\n// ============================================================================\n\nfunction textToZod(field: TextField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (field.pattern) schema = (schema as any).regex(new RegExp(field.pattern));\n if (field.variant === 'email') schema = (schema as any).email();\n if (field.variant === 'url') schema = (schema as any).url();\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction numberToZod(field: NumberField): ZodTypeAny {\n let schema: ZodTypeAny = field.integer ? z.number().int() : z.number();\n if (field.min !== undefined) schema = (schema as any).min(field.min);\n if (field.max !== undefined) schema = (schema as any).max(field.max);\n if (field.step) {\n schema = (schema as any).refine(\n (val: number) => Number.isInteger(val / field.step!),\n `Value must be divisible by ${field.step}`\n );\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction checkboxToZod(field: CheckboxField): ZodTypeAny {\n let schema: ZodTypeAny = z.boolean();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction dateToZod(field: DateField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().refine(\n (val) => !isNaN(Date.parse(val)),\n 'Invalid date format'\n );\n if (field.minDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) >= new Date(field.minDate!),\n `Date must be after ${field.minDate}`\n );\n }\n if (field.maxDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) <= new Date(field.maxDate!),\n `Date must be before ${field.maxDate}`\n );\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction emailToZod(field: EmailField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().email('Invalid email');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction passwordToZod(field: PasswordField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().min(6, 'Password must be at least 6 characters');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction textareaToZod(field: TextareaField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction selectToZod(field: SelectField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny;\n if (field.hasMany) {\n schema = z.array(z.enum(values as [string, ...string[]]));\n } else {\n schema = z.enum(values as [string, ...string[]]);\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction radioToZod(field: RadioField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny = z.enum(values as [string, ...string[]]);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction colorToZod(field: ColorField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.format === 'hex') schema = (schema as any).regex(/^#[0-9A-Fa-f]{6}$/);\n if (field.format === 'rgb') schema = (schema as any).regex(/^rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)$/);\n if (field.format === 'hsl') schema = (schema as any).regex(/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Complex Field Schemas\n// ============================================================================\n\nfunction richTextToZod(field: RichTextField): ZodTypeAny {\n let schema: ZodTypeAny = z.array(z.object({\n type: z.string(),\n data: z.record(z.any()),\n children: z.array(z.any()).optional(),\n }));\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction jsonToZod(field: JSONField): ZodTypeAny {\n let schema: ZodTypeAny = z.record(z.any());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction codeToZod(field: CodeField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction uploadToZod(field: UploadField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.hasMany) schema = z.array(z.string());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction markdownToZod(field: MarkdownField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Relational Field Schemas\n// ============================================================================\n\nfunction relationshipToZod(field: RelationshipField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (Array.isArray(field.relationTo)) {\n schema = z.object({\n relationTo: z.enum(field.relationTo as [string, ...string[]]),\n value: z.string(),\n });\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = schema.optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction arrayToZod(field: ArrayField): ZodTypeAny {\n const itemSchema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n let schema: ZodTypeAny = z.array(itemSchema);\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction groupToZod(field: GroupField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n if (!field.required) return (schema as any).optional();\n return schema;\n}\n\nfunction blocksToZod(field: BlocksField): ZodTypeAny {\n const blockSchemas = field.blocks.map(block => {\n return z.object({\n blockType: z.literal(block.slug),\n ...Object.fromEntries(\n block.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n ),\n });\n });\n let schema: ZodTypeAny = z.array(z.discriminatedUnion('blockType', blockSchemas as any));\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction rowToZod(field: RowField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction collapsibleToZod(field: CollapsibleField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction tabsToZod(field: TabsField): ZodTypeAny {\n const schemas: Record<string, ZodTypeAny> = {};\n for (const tab of field.tabs) {\n for (const f of tab.fields) {\n if (f.name) {\n schemas[f.name] = fieldToZod(f);\n }\n }\n }\n return z.object(schemas);\n}\n\n// ============================================================================\n// Custom Validation Helper\n// ============================================================================\n\nfunction addCustomValidation(schema: ZodTypeAny, validate: (value: any, options: ValidateOptions) => string | true | Promise<string | true>): ZodTypeAny {\n return schema.refine(\n async (val: any) => {\n const result = await validate(val, { required: false });\n return result === true;\n },\n {\n message: 'Custom validation failed',\n }\n );\n}\n\n// ============================================================================\n// Collection Schema Generator\n// ============================================================================\n\nexport function collectionToZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n if (collection.timestamps) {\n shape['createdAt'] = z.string().optional();\n shape['updatedAt'] = z.string().optional();\n }\n \n if (collection.tenantScoped) {\n shape['tenantID'] = z.string().optional();\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n\nexport function collectionToCreateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToUpdateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field).optional();\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToWhereZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = z.object({\n equals: z.any().optional(),\n not_equals: z.any().optional(),\n in: z.array(z.any()).optional(),\n not_in: z.array(z.any()).optional(),\n greater_than: z.number().optional(),\n greater_than_equal: z.number().optional(),\n less_than: z.number().optional(),\n less_than_equal: z.number().optional(),\n like: z.string().optional(),\n not_like: z.string().optional(),\n contains: z.string().optional(),\n exists: z.boolean().optional(),\n }).optional();\n }\n }\n \n shape['AND'] = z.array(z.lazy(() => z.object(shape))).optional();\n shape['OR'] = z.array(z.lazy(() => z.object(shape))).optional();\n \n return z.object(shape).optional();\n}\n\n// ============================================================================\n// Global Schema Generator\n// ============================================================================\n\nexport function globalToZod(global: GlobalConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of global.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n","import type { CollectionConfig, GlobalConfig, BaseAdapter, PluginConfig } from './types.js';\nimport type { Field } from '../fields/types.js';\nimport { validateConfig, validateCollection, validateGlobal } from './validator.js';\nimport { collectionToZod, collectionToCreateZod, collectionToUpdateZod, collectionToWhereZod, globalToZod, fieldToZod } from './zod-builder.js';\nimport type { ZodTypeAny } from 'zod';\n\n// ============================================================================\n// Registry Class\n// ============================================================================\n\nexport class Registry {\n private collections: Map<string, CollectionConfig> = new Map();\n private globals: Map<string, GlobalConfig> = new Map();\n private plugins: PluginConfig[] = [];\n private schemaCache: Map<string, ZodTypeAny> = new Map();\n private initialized = false;\n\n // ========================================================================\n // Collection Management\n // ========================================================================\n\n addCollection(config: CollectionConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add collections after Registry has been initialized');\n }\n\n // Apply plugin extensions\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendCollection) {\n finalConfig = plugin.extendCollection(finalConfig.slug, finalConfig);\n }\n }\n\n // Add default fields (id, createdAt, etc.) before validation\n finalConfig.fields = this.applyFieldDefaults(finalConfig);\n\n const errors = validateCollection(finalConfig);\n if (errors.length > 0) {\n throw new Error(`Invalid collection config: ${errors.join(', ')}`);\n }\n\n this.collections.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(finalConfig.slug);\n }\n\n addCollections(configs: CollectionConfig[]): void {\n for (const config of configs) {\n this.addCollection(config);\n }\n }\n\n getCollection(slug: string): CollectionConfig | undefined {\n return this.collections.get(slug);\n }\n\n getCollections(): CollectionConfig[] {\n return Array.from(this.collections.values());\n }\n\n getCollectionSlugs(): string[] {\n return Array.from(this.collections.keys());\n }\n\n hasCollection(slug: string): boolean {\n return this.collections.has(slug);\n }\n\n removeCollection(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove collections after Registry has been initialized');\n }\n this.clearSchemaCache(slug);\n return this.collections.delete(slug);\n }\n\n // ========================================================================\n // Global Management\n // ========================================================================\n\n addGlobal(config: GlobalConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add globals after Registry has been initialized');\n }\n\n const errors = validateGlobal(config);\n if (errors.length > 0) {\n throw new Error(`Invalid global config: ${errors.join(', ')}`);\n }\n\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendGlobal) {\n finalConfig = plugin.extendGlobal(finalConfig.slug, finalConfig);\n }\n }\n\n this.globals.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(`global:${finalConfig.slug}`);\n }\n\n addGlobals(configs: GlobalConfig[]): void {\n for (const config of configs) {\n this.addGlobal(config);\n }\n }\n\n getGlobal(slug: string): GlobalConfig | undefined {\n return this.globals.get(slug);\n }\n\n getGlobals(): GlobalConfig[] {\n return Array.from(this.globals.values());\n }\n\n getGlobalSlugs(): string[] {\n return Array.from(this.globals.keys());\n }\n\n hasGlobal(slug: string): boolean {\n return this.globals.has(slug);\n }\n\n removeGlobal(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove globals after Registry has been initialized');\n }\n this.clearSchemaCache(`global:${slug}`);\n return this.globals.delete(slug);\n }\n\n // ========================================================================\n // Plugin Management\n // ========================================================================\n\n addPlugin(plugin: PluginConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add plugins after Registry has been initialized');\n }\n this.plugins.push(plugin);\n }\n\n getPlugins(): PluginConfig[] {\n return [...this.plugins];\n }\n\n // ========================================================================\n // Schema Generation\n // ========================================================================\n\n getZodSchema(slug: string): ZodTypeAny {\n const cached = this.schemaCache.get(slug);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToZod(collection);\n this.schemaCache.set(slug, schema);\n return schema;\n }\n\n const global = this.globals.get(slug);\n if (global) {\n const schema = globalToZod(global);\n this.schemaCache.set(`global:${slug}`, schema);\n return schema;\n }\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getCreateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:create`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToCreateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getUpdateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:update`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToUpdateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getWhereZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:where`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToWhereZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getFieldZodSchema(field: Field): ZodTypeAny {\n return fieldToZod(field);\n }\n\n private clearSchemaCache(slug: string): void {\n this.schemaCache.delete(slug);\n this.schemaCache.delete(`${slug}:create`);\n this.schemaCache.delete(`${slug}:update`);\n this.schemaCache.delete(`${slug}:where`);\n }\n\n // ========================================================================\n // Field Helpers\n // ========================================================================\n\n private applyFieldDefaults(config: CollectionConfig): Field[] {\n const fields = [...config.fields];\n\n // Add id field if not present\n if (!fields.some(f => f.name === 'id')) {\n fields.unshift({\n name: 'id',\n type: 'text',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add tenantID field if tenantScoped\n if (config.tenantScoped && !fields.some(f => f.name === 'tenantID')) {\n fields.push({\n name: 'tenantID',\n type: 'text',\n required: true,\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add timestamp fields if enabled\n if (config.timestamps && !fields.some(f => f.name === 'createdAt')) {\n fields.push({\n name: 'createdAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n return fields;\n }\n\n getFields(slug: string): Field[] {\n const collection = this.collections.get(slug);\n if (collection) return collection.fields;\n\n const global = this.globals.get(slug);\n if (global) return global.fields;\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getFieldMap(slug: string): Map<string, Field> {\n const fields = this.getFields(slug);\n const map = new Map<string, Field>();\n\n const addFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n if ('fields' in field && field.fields) {\n addFields(field.fields);\n }\n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n addFields(tab.fields);\n }\n }\n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n addFields(block.fields);\n }\n }\n }\n };\n\n addFields(fields);\n return map;\n }\n\n getVisibleFields(slug: string): Field[] {\n const fields = this.getFields(slug);\n return fields.filter(f => !f.admin?.hidden);\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n validate(): void {\n const collections = this.getCollections();\n const globals = this.getGlobals();\n validateConfig(collections, globals);\n }\n\n async init(): Promise<void> {\n this.validate();\n\n // Initialize plugins\n for (const plugin of this.plugins) {\n if (plugin.init) {\n await plugin.init(this);\n }\n }\n\n this.initialized = true;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // ========================================================================\n // Query Helpers\n // ========================================================================\n\n getPaginationDefaults(slug: string): { defaultLimit: number; limits: number[] } {\n const collection = this.collections.get(slug);\n return {\n defaultLimit: collection?.admin?.pagination?.defaultLimit || 10,\n limits: collection?.admin?.pagination?.limits || [10, 25, 50, 100],\n };\n }\n\n getDefaultSort(slug: string): string {\n const collection = this.collections.get(slug);\n const useAsTitle = collection?.admin?.useAsTitle;\n if (useAsTitle) return useAsTitle;\n return 'createdAt';\n }\n\n getDefaultColumns(slug: string): string[] {\n const collection = this.collections.get(slug);\n if (collection?.admin?.defaultColumns) {\n return collection.admin.defaultColumns;\n }\n const fields = this.getVisibleFields(slug);\n return fields.slice(0, 4).map(f => f.name!);\n }\n\n // ========================================================================\n // Admin Helpers\n // ========================================================================\n\n getAdminTitle(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.label || collection?.admin?.description || slug;\n }\n\n getAdminLabel(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.singularLabel || collection?.label || slug;\n }\n\n getAdminGroup(slug: string): string | undefined {\n return this.collections.get(slug)?.admin?.group;\n }\n\n // ========================================================================\n // Debug / Stats\n // ========================================================================\n\n getStats(): {\n collections: number;\n globals: number;\n plugins: number;\n fields: number;\n } {\n let totalFields = 0;\n for (const collection of this.collections.values()) {\n totalFields += collection.fields.length;\n }\n for (const global of this.globals.values()) {\n totalFields += global.fields.length;\n }\n\n return {\n collections: this.collections.size,\n globals: this.globals.size,\n plugins: this.plugins.length,\n fields: totalFields,\n };\n }\n\n toJSON(): {\n collections: CollectionConfig[];\n globals: GlobalConfig[];\n } {\n return {\n collections: this.getCollections(),\n globals: this.getGlobals(),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet instance: Registry | null = null;\n\nexport function getRegistry(): Registry {\n if (!instance) {\n instance = new Registry();\n }\n return instance;\n}\n\nexport function resetRegistry(): void {\n instance = null;\n}\n\nexport function createRegistry(): Registry {\n instance = new Registry();\n return instance;\n}\n","import { Registry, createRegistry } from './registry/index.js';\nimport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n} from './registry/types.js';\nimport { KyroPubSub, createWSServer, type KyroWSServer } from './api/ws/index.js';\nimport { createHonoApp } from './api/rest/index.js';\nimport { buildGraphQLSchema } from './api/graphql/index.js';\nimport { createKyroServer } from './api/trpc/index.js';\nimport type { User, Request } from './hooks/types.js';\n\n// ============================================================================\n// Kyro Instance\n// ============================================================================\n\nexport class Kyro {\n public registry: Registry;\n public db: BaseAdapter;\n public pubsub: KyroPubSub;\n private wsServer?: KyroWSServer;\n private config: KyroConfig;\n\n constructor(config: KyroConfig) {\n this.config = config;\n this.registry = createRegistry();\n this.db = config.adapter;\n this.pubsub = new KyroPubSub(this.registry);\n\n // Register collections\n if (config.collections) {\n this.registry.addCollections(config.collections);\n }\n\n // Register globals\n if (config.globals) {\n this.registry.addGlobals(config.globals);\n }\n\n // Register plugins\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.registry.addPlugin(plugin);\n }\n }\n }\n\n async init(): Promise<void> {\n // Initialize registry\n await this.registry.init();\n\n // Initialize database adapter\n await this.db.init(this.registry.getCollections(), this.registry.getGlobals());\n\n // Auto-register PubSub hooks\n this.pubsub.autoRegisterHooks();\n\n console.log('✅ Kyro CMS initialized');\n console.log(` Collections: ${this.registry.getCollections().length}`);\n console.log(` Globals: ${this.registry.getGlobals().length}`);\n }\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n getREST(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createHonoApp({\n registry: this.registry,\n db: this.db,\n ...options,\n cors: this.config.cors,\n });\n }\n\n getGraphQL(options?: { user?: User; req?: Request; tenantID?: string }) {\n return buildGraphQLSchema({\n registry: this.registry,\n db: this.db,\n ...options,\n });\n }\n\n getTRPC(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createKyroServer({\n registry: this.registry,\n db: this.db,\n req: options?.req || { headers: {} },\n ...options,\n });\n }\n\n async startWebSocket(options?: { port?: number; requireAuth?: boolean; verifyToken?: (token: string) => Promise<any> }) {\n this.wsServer = createWSServer({\n pubsub: this.pubsub,\n port: options?.port || 8080,\n requireAuth: options?.requireAuth,\n verifyToken: options?.verifyToken,\n });\n console.log(`🔌 WebSocket server started on port ${options?.port || 8080}`);\n return this.wsServer;\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async shutdown(): Promise<void> {\n if (this.wsServer) {\n await this.wsServer.close();\n }\n await this.db.disconnect();\n console.log('👋 Kyro CMS shut down');\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createKyro(config: KyroConfig): Kyro {\n return new Kyro(config);\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\nexport { Registry, createRegistry, getRegistry, resetRegistry } from './registry/index.js';\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from './registry/types.js';\nexport type { Field, FieldType } from './fields/index.js';\nexport type { AccessControl, AccessArgs, WhereClause } from './access/index.js';\nexport type { Hook, HookArgs, User, Request } from './hooks/index.js';\nexport { DrizzleAdapter, createDrizzleAdapter } from './database/drizzle/index.js';\nexport { MongoDBAdapter, createMongoDBAdapter } from './database/mongodb/index.js';\nexport { KyroPubSub, KyroWSServer, createWSServer } from './api/ws/index.js';\nexport { createHonoApp } from './api/rest/index.js';\nexport { buildGraphQLSchema, createGraphQLSchema } from './api/graphql/index.js';\nexport { createKyroServer } from './api/trpc/index.js';\nexport { z } from 'zod';\n","// ============================================================================\n// Base Field Interface\n// ============================================================================\n\nexport interface FieldAdmin {\n description?: string;\n placeholder?: string;\n readOnly?: boolean;\n hidden?: boolean;\n width?: string;\n condition?: (data: Record<string, any>, siblingData: Record<string, any>) => boolean;\n position?: 'sidebar' | 'main';\n}\n\nexport interface BaseField {\n name: string;\n label?: string;\n required?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: any;\n admin?: FieldAdmin;\n validate?: (value: any, options: ValidateOptions) => string | true | Promise<string | true>;\n hooks?: {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n };\n}\n\nexport interface ValidateOptions {\n data?: Record<string, any>;\n siblingData?: Record<string, any>;\n user?: any;\n operation?: string;\n required?: boolean;\n}\n\nexport type Hook = (args: any) => Promise<any> | any;\n\n// ============================================================================\n// Primitive Fields\n// ============================================================================\n\nexport type TextFieldVariant = 'text' | 'email' | 'password' | 'url' | 'id';\n\nexport interface TextField extends BaseField {\n type: 'text';\n variant?: TextFieldVariant;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n hasMany?: boolean;\n localized?: boolean;\n}\n\nexport interface NumberField extends BaseField {\n type: 'number';\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n hasMany?: boolean;\n}\n\nexport interface CheckboxField extends BaseField {\n type: 'checkbox';\n}\n\nexport interface DateField extends BaseField {\n type: 'date';\n minDate?: string;\n maxDate?: string;\n time?: boolean;\n}\n\nexport interface EmailField extends BaseField {\n type: 'email';\n}\n\nexport interface PasswordField extends BaseField {\n type: 'password';\n}\n\nexport interface TextareaField extends BaseField {\n type: 'textarea';\n minLength?: number;\n maxLength?: number;\n rows?: number;\n localized?: boolean;\n}\n\nexport interface SelectField extends BaseField {\n type: 'select';\n options: Array<{ label: string; value: string }>;\n hasMany?: boolean;\n defaultValue?: string | string[];\n}\n\nexport interface RadioField extends BaseField {\n type: 'radio';\n options: Array<{ label: string; value: string }>;\n defaultValue?: string;\n}\n\nexport interface ColorField extends BaseField {\n type: 'color';\n format?: 'hex' | 'rgb' | 'hsl';\n defaultValue?: string;\n}\n\n// ============================================================================\n// Complex Fields\n// ============================================================================\n\nexport interface RichTextBlock {\n type: string;\n data: Record<string, any>;\n children?: RichTextBlock[];\n}\n\nexport interface RichTextField extends BaseField {\n type: 'richtext';\n editor?: 'lexical' | 'slate' | 'blocks';\n defaultValue?: RichTextBlock[];\n localized?: boolean;\n}\n\nexport interface JSONField extends BaseField {\n type: 'json';\n defaultValue?: Record<string, any>;\n}\n\nexport interface CodeField extends BaseField {\n type: 'code';\n language?: string;\n defaultValue?: string;\n}\n\nexport interface UploadField extends BaseField {\n type: 'upload';\n relationTo: string;\n hasMany?: boolean;\n maxDepth?: number;\n defaultValue?: string;\n}\n\nexport interface MarkdownField extends BaseField {\n type: 'markdown';\n localized?: boolean;\n defaultValue?: string;\n}\n\n// ============================================================================\n// Relational Fields\n// ============================================================================\n\nexport interface RelationshipField extends BaseField {\n type: 'relationship';\n relationTo: string | string[];\n hasMany?: boolean;\n maxDepth?: number;\n filterOptions?: (args: { data: any; user: any }) => Record<string, any>;\n defaultValue?: string | string[];\n}\n\nexport interface ArrayField extends BaseField {\n type: 'array';\n fields: Field[];\n minRows?: number;\n maxRows?: number;\n labels?: { singular?: string; plural?: string };\n defaultValue?: Record<string, any>[];\n}\n\nexport interface GroupField extends BaseField {\n type: 'group';\n fields: Field[];\n defaultValue?: Record<string, any>;\n}\n\nexport interface Block {\n slug: string;\n label: string;\n fields: Field[];\n imageURL?: string;\n}\n\nexport interface BlocksField extends BaseField {\n type: 'blocks';\n blocks: Block[];\n minRows?: number;\n maxRows?: number;\n defaultValue?: Array<{ blockType: string; [key: string]: any }>;\n}\n\nexport interface RowField extends Omit<BaseField, 'name'> {\n type: 'row';\n fields: Field[];\n name?: string;\n}\n\nexport interface CollapsibleField extends Omit<BaseField, 'name'> {\n type: 'collapsible';\n fields: Field[];\n label: string;\n name?: string;\n}\n\nexport interface TabsField extends Omit<BaseField, 'name'> {\n type: 'tabs';\n tabs: Array<{\n label: string;\n fields: Field[];\n name?: string;\n }>;\n name?: string;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\nexport type Field =\n | TextField\n | NumberField\n | CheckboxField\n | DateField\n | EmailField\n | PasswordField\n | TextareaField\n | SelectField\n | RadioField\n | ColorField\n | RichTextField\n | JSONField\n | CodeField\n | UploadField\n | MarkdownField\n | RelationshipField\n | ArrayField\n | GroupField\n | BlocksField\n | RowField\n | CollapsibleField\n | TabsField;\n\nexport type FieldType = Field['type'];\n\n// ============================================================================\n// Field Type Guards\n// ============================================================================\n\nexport function isTextField(field: Field): field is TextField {\n return field.type === 'text';\n}\n\nexport function isNumberField(field: Field): field is NumberField {\n return field.type === 'number';\n}\n\nexport function isRelationshipField(field: Field): field is RelationshipField {\n return field.type === 'relationship';\n}\n\nexport function isArrayField(field: Field): field is ArrayField {\n return field.type === 'array';\n}\n\nexport function isGroupField(field: Field): field is GroupField {\n return field.type === 'group';\n}\n\nexport function isBlocksField(field: Field): field is BlocksField {\n return field.type === 'blocks';\n}\n\nexport function isUploadField(field: Field): field is UploadField {\n return field.type === 'upload';\n}\n\nexport function isRichTextField(field: Field): field is RichTextField {\n return field.type === 'richtext';\n}\n\nexport function isSelectField(field: Field): field is SelectField {\n return field.type === 'select';\n}\n\nexport function isLayoutField(field: Field): field is RowField | CollapsibleField | TabsField {\n return field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs';\n}\n\n// ============================================================================\n// Field Type List\n// ============================================================================\n\nexport const PRIMITIVE_FIELD_TYPES = [\n 'text', 'number', 'checkbox', 'date', 'email', 'password',\n 'textarea', 'select', 'radio', 'color',\n] as const;\n\nexport const COMPLEX_FIELD_TYPES = [\n 'richtext', 'json', 'code', 'upload', 'markdown',\n] as const;\n\nexport const RELATIONAL_FIELD_TYPES = [\n 'relationship', 'array', 'group', 'blocks',\n] as const;\n\nexport const LAYOUT_FIELD_TYPES = [\n 'row', 'collapsible', 'tabs',\n] as const;\n\nexport const ALL_FIELD_TYPES = [\n ...PRIMITIVE_FIELD_TYPES,\n ...COMPLEX_FIELD_TYPES,\n ...RELATIONAL_FIELD_TYPES,\n ...LAYOUT_FIELD_TYPES,\n] as const;\n","// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import type Database from 'better-sqlite3';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private path?: string;\n private migrations: Map<string, boolean> = new Map();\n\n constructor(options: {\n db?: any;\n path?: string;\n }) {\n super();\n this.path = options.path;\n\n if (options.db) {\n this.db = options.db;\n } else {\n this.db = null;\n }\n }\n\n async connect(): Promise<void> {\n if (!this.db) {\n const Database = (await import('better-sqlite3')).default;\n this.db = new Database(this.path || ':memory:');\n }\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.connected = true;\n console.log(`[LocalAdapter] Connected to SQLite (${this.path || 'memory'})`);\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n this.connected = false;\n console.log('[LocalAdapter] Disconnected');\n }\n\n // ========================================================================\n // Schema Management\n // ========================================================================\n\n private ensureTable(config: CollectionConfig): void {\n const tableName = this.getTableNameFor(config.slug);\n\n if (this.migrations.has(tableName)) return;\n\n const columns: string[] = [\n `id TEXT PRIMARY KEY`,\n ];\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n const colDef = this.fieldToSQL(field);\n if (colDef) columns.push(colDef);\n }\n\n if (config.timestamps) {\n columns.push(`created_at TEXT DEFAULT (datetime('now'))`);\n columns.push(`updated_at TEXT DEFAULT (datetime('now'))`);\n }\n\n if (config.tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const createSQL = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(', ')})`;\n this.db.exec(createSQL);\n\n // Create indexes\n for (const field of config.fields) {\n if (field.name && field.indexed) {\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${field.name} ON ${tableName}(${field.name})`);\n }\n if (field.name && field.unique) {\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_${field.name}_unique ON ${tableName}(${field.name})`);\n }\n }\n\n this.migrations.set(tableName, true);\n }\n\n private fieldToSQL(field: any): string | null {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'url':\n return `${field.name} TEXT`;\n case 'number':\n return `${field.name} REAL`;\n case 'checkbox':\n return `${field.name} INTEGER DEFAULT 0`;\n case 'date':\n return `${field.name} TEXT`;\n case 'select':\n case 'radio':\n return `${field.name} TEXT`;\n case 'relationship':\n case 'upload':\n return `${field.name} TEXT`;\n case 'json':\n case 'richtext':\n case 'array':\n case 'group':\n case 'blocks':\n return `${field.name} TEXT`;\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n if (tenantID && config.tenantScoped) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' || key === 'OR') continue;\n \n if (typeof value === 'object' && value !== null) {\n if (value.equals !== undefined) {\n conditions.push(`${key} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${key} IN (${value.in.map(() => '?').join(', ')})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${key} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${key} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n const sortField = sort?.replace('-', '') || 'created_at';\n const sortDir = sort?.startsWith('-') ? 'DESC' : 'ASC';\n sql += ` ORDER BY ${sortField} ${sortDir}`;\n\n const countSql = sql.replace('SELECT *', 'SELECT COUNT(*) as count');\n const countResult = this.db.prepare(countSql).get(...params) as { count: number };\n const totalDocs = countResult?.count || 0;\n\n sql += ` LIMIT ? OFFSET ?`;\n params.push(limit, (page - 1) * limit);\n\n const rows = this.db.prepare(sql).all(...params);\n const docs = rows.map((row: any) => this.rowToDoc(row, config));\n\n return {\n docs: docs as T[],\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n const row = this.db.prepare(sql).get(...params);\n if (!row) return null;\n\n return this.rowToDoc(row as any, config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const id = data.id || this.generateId();\n \n const insertData = this.prepareData(data, config);\n insertData.id = id;\n insertData.created_at = new Date().toISOString();\n insertData.updated_at = new Date().toISOString();\n\n if (tenantID && config.tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n const placeholders = columns.map(() => '?').join(', ');\n const values = Object.values(insertData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n this.db.prepare(\n `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`\n ).run(...values);\n\n return { ...insertData, id } as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n const columns = Object.keys(updateData);\n const setClause = columns.map(c => `${c} = ?`).join(', ');\n const values = Object.values(updateData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return this.findByID<T>({ collection: slug, id, tenantID }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const doc = await this.findByID<T>({ collection: slug, id, tenantID });\n if (!doc) throw new Error(`Document not found: ${slug}/${id}`);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return doc;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && config.tenantScoped) {\n sql += ` WHERE tenant_id = ?`;\n params.push(tenantID);\n }\n\n const result = this.db.prepare(sql).get(...params) as { count: number };\n return result?.count || 0;\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version Support (Placeholder)\n // ========================================================================\n\n async findVersions(): Promise<FindResult<any>> {\n return { docs: [], totalDocs: 0, limit: 10, totalPages: 0, page: 1, pagingCounter: 0, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null };\n }\n\n async findVersionByID(): Promise<any> {\n return null;\n }\n\n async createVersion(): Promise<any> {\n return {};\n }\n\n async deleteVersions(): Promise<void> {}\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n private rowToDoc(row: any, config: CollectionConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n let value = row[field.name];\n\n if (field.type === 'json' || field.type === 'richtext' || \n field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (field.type === 'checkbox') {\n value = Boolean(value);\n }\n\n if (field.type === 'date' && value) {\n value = new Date(value).toISOString();\n }\n\n doc[field.name] = value;\n }\n\n if (config.timestamps) {\n doc.createdAt = row.created_at;\n doc.updatedAt = row.updated_at;\n }\n\n if (config.tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, '_');\n }\n\n // ========================================================================\n // Migrations\n // ========================================================================\n\n async migrate(): Promise<void> {\n for (const config of this.collections.values()) {\n this.ensureTable(config);\n }\n console.log('[LocalAdapter] Migrations complete');\n }\n\n async rollback(): Promise<void> {\n console.log('[LocalAdapter] Rollback not supported for schema changes');\n }\n\n // ========================================================================\n // Transaction Support\n // ========================================================================\n\n async transaction<T>(fn: (tx: any) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const tx = this.db.transaction(async () => {\n return fn({ db: this.db });\n });\n\n try {\n const result = tx();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ========================================================================\n // Direct DB Access\n // ========================================================================\n\n getDatabase(): any {\n return this.db;\n }\n\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n prepare(sql: string) {\n return this.db.prepare(sql);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createLocalAdapter(options?: {\n db?: any;\n path?: string;\n}): LocalAdapter {\n return new LocalAdapter(options || {});\n}\n","import type { CollectionConfig, GlobalConfig } from '../registry/types.js';\nimport type { Field } from '../fields/types.js';\nimport type { Hook } from '../hooks/types.js';\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (slug: string, extension: Partial<CollectionConfig>) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super('seo');\n this.description = 'Advanced SEO features including sitemaps, robots.txt, and structured data';\n \n this.collections.push({\n slug: 'seo-settings',\n label: 'SEO Settings',\n fields: [\n { name: 'sitemap', type: 'checkbox', label: 'Enable Sitemap', defaultValue: true },\n { name: 'robotsTxt', type: 'textarea', label: 'robots.txt Content' },\n { name: 'canonicalUrl', type: 'text', variant: 'url' as any, label: 'Canonical URL' },\n { name: 'ogImage', type: 'text', label: 'Default OG Image URL' },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super('analytics');\n this.description = 'Analytics integration for tracking page views and events';\n \n this.collections.push({\n slug: 'analytics-events',\n label: 'Analytics Events',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'properties', type: 'json', label: 'Event Properties' },\n { name: 'timestamp', type: 'date', required: true },\n { name: 'userId', type: 'text', label: 'User ID' },\n { name: 'sessionId', type: 'text', label: 'Session ID' },\n ],\n });\n\n this.adminComponents['AnalyticsDashboard'] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super('comments');\n this.description = 'Commenting system for products and posts';\n \n this.collections.push({\n slug: 'comments',\n label: 'Comments',\n fields: [\n { name: 'content', type: 'textarea', required: true },\n { name: 'author', type: 'text', required: true },\n { name: 'email', type: 'email' },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'parent', type: 'text', label: 'Parent Comment ID' },\n { name: 'resourceType', type: 'text', required: true },\n { name: 'resourceId', type: 'text', required: true },\n ],\n });\n\n this.adminComponents['CommentModeration'] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super('reviews');\n this.description = 'Product reviews and ratings';\n \n this.collections.push({\n slug: 'reviews',\n label: 'Reviews',\n fields: [\n { name: 'rating', type: 'number', required: true, min: 1, max: 5 },\n { name: 'title', type: 'text' },\n { name: 'content', type: 'textarea', required: true },\n { name: 'author', type: 'relationship', relationTo: 'customers' },\n { name: 'product', type: 'relationship', relationTo: 'products', required: true },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'verified', type: 'checkbox', label: 'Verified Purchase' },\n { name: 'helpful', type: 'number', label: 'Helpful Count', defaultValue: 0 },\n ],\n });\n\n this.adminComponents['ReviewModeration'] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super('wishlist');\n this.description = 'Customer wishlists';\n \n this.collections.push({\n slug: 'wishlists',\n label: 'Wishlists',\n fields: [\n { name: 'customer', type: 'relationship', relationTo: 'customers', required: true },\n { name: 'name', type: 'text', label: 'Wishlist Name', defaultValue: 'My Wishlist' },\n { name: 'items', type: 'blocks', label: 'Items', blocks: [\n {\n slug: 'wishlist-item',\n label: 'Item',\n fields: [\n { name: 'product', type: 'relationship', relationTo: 'products' },\n { name: 'quantity', type: 'number', defaultValue: 1 },\n { name: 'addedAt', type: 'date' },\n { name: 'priority', type: 'select', options: [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' },\n ]},\n ],\n },\n ]},\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","// ============================================================================\n// Styling System Abstraction\n// ============================================================================\n\nexport type StylingMode = 'css' | 'tailwind' | 'css-in-js' | 'styled-components' | 'vanilla-extract';\n\nexport interface StylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customProperties?: Record<string, string>;\n}\n\nexport interface ThemeConfig {\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeBorderRadius;\n shadows?: ThemeShadows;\n breakpoints?: Record<string, string>;\n}\n\nexport interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n error?: string;\n warning?: string;\n success?: string;\n info?: string;\n}\n\nexport interface ThemeFonts {\n sans?: string;\n serif?: string;\n mono?: string;\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n '3xl'?: string;\n '4xl'?: string;\n}\n\nexport interface ThemeBorderRadius {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\n// ============================================================================\n// CSS Generator\n// ============================================================================\n\nexport class CSSGenerator {\n private css: string[] = [];\n\n constructor(private config: StylingConfig) {}\n\n addRule(selector: string, properties: Record<string, string>): this {\n const props = Object.entries(properties)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n this.css.push(`${selector} {\\n${props}\\n}`);\n return this;\n }\n\n addMediaQuery(breakpoint: string, rules: string[]): this {\n this.css.push(`@media (min-width: ${breakpoint}) {\\n ${rules.join('\\n ')}\\n}`);\n return this;\n }\n\n generate(): string {\n return this.css.join('\\n\\n');\n }\n}\n\n// ============================================================================\n// Tailwind Config Generator\n// ============================================================================\n\nexport function generateTailwindConfig(theme: ThemeConfig): Record<string, any> {\n return {\n theme: {\n extend: {\n colors: theme.colors || {},\n fontFamily: theme.fonts || {},\n spacing: theme.spacing || {},\n borderRadius: theme.borderRadius || {},\n boxShadow: theme.shadows || {},\n screens: theme.breakpoints || {},\n },\n },\n };\n}\n\n// ============================================================================\n// Default Themes\n// ============================================================================\n\nexport const defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#3b82f6',\n secondary: '#6366f1',\n accent: '#ec4899',\n background: '#ffffff',\n surface: '#f9fafb',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n warning: '#f59e0b',\n success: '#10b981',\n info: '#3b82f6',\n },\n fonts: {\n sans: 'system-ui, -apple-system, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Menlo, monospace',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n '2xl': '3rem',\n '3xl': '4rem',\n },\n borderRadius: {\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',\n },\n};\n\nexport const defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#60a5fa',\n secondary: '#818cf8',\n accent: '#f472b6',\n background: '#111827',\n surface: '#1f2937',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n warning: '#fbbf24',\n success: '#34d399',\n info: '#60a5fa',\n },\n fonts: defaultLightTheme.fonts,\n spacing: defaultLightTheme.spacing,\n borderRadius: defaultLightTheme.borderRadius,\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.3)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.4)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.5)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.6)',\n },\n};\n\n// ============================================================================\n// E-Commerce Theme (2026 Design Engine)\n// ============================================================================\n\nexport const ecommerce2026Theme: ThemeConfig = {\n colors: {\n primary: '#FF6B35',\n secondary: '#1A1A2E',\n accent: '#16C79A',\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A2E',\n textMuted: '#6B7280',\n border: '#E5E7EB',\n error: '#EF4444',\n warning: '#F59E0B',\n success: '#16C79A',\n info: '#3B82F6',\n },\n fonts: {\n sans: '\"Inter\", \"Satoshi\", system-ui, sans-serif',\n serif: '\"Playfair Display\", Georgia, serif',\n mono: '\"JetBrains Mono\", monospace',\n },\n spacing: {\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '1rem',\n xl: '1.5rem',\n '2xl': '2rem',\n '3xl': '3rem',\n '4xl': '4rem',\n },\n borderRadius: {\n sm: '0',\n md: '0',\n lg: '0',\n xl: '0',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.05)',\n md: '0 4px 6px rgba(0,0,0,0.07)',\n lg: '0 10px 15px rgba(0,0,0,0.1)',\n xl: '0 20px 25px rgba(0,0,0,0.15)',\n },\n};\n\n// ============================================================================\n// CSS Variables Generator\n// ============================================================================\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const variables: string[] = [];\n\n // Colors\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n variables.push(` --color-${key}: ${value};`);\n }\n }\n\n // Fonts\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n variables.push(` --font-${key}: ${value};`);\n }\n }\n\n // Spacing\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n variables.push(` --spacing-${key}: ${value};`);\n }\n }\n\n // Border Radius\n if (theme.borderRadius) {\n for (const [key, value] of Object.entries(theme.borderRadius)) {\n variables.push(` --radius-${key}: ${value};`);\n }\n }\n\n // Shadows\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n variables.push(` --shadow-${key}: ${value};`);\n }\n }\n\n return `:root {\\n${variables.join('\\n')}\\n}`;\n}\n\n// ============================================================================\n// Admin Styling Config\n// ============================================================================\n\nexport interface AdminStylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customStyles?: string;\n componentOverrides?: Record<string, Record<string, string>>;\n}\n\nexport function createAdminStyling(config: AdminStylingConfig): string {\n const cssVars = generateCSSVariables(config.theme || defaultLightTheme);\n const componentStyles: string[] = [];\n\n // Generate component overrides\n if (config.componentOverrides) {\n for (const [selector, styles] of Object.entries(config.componentOverrides)) {\n const props = Object.entries(styles)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n componentStyles.push(`${selector} {\\n${props}\\n}`);\n }\n }\n\n return `\n ${cssVars}\n ${config.customStyles || ''}\n ${componentStyles.join('\\n')}\n `;\n}\n\n// ============================================================================\n// Field Styling\n// ============================================================================\n\nexport interface FieldStyling {\n wrapper?: Record<string, string>;\n label?: Record<string, string>;\n input?: Record<string, string>;\n error?: Record<string, string>;\n description?: Record<string, string>;\n}\n\nexport const defaultFieldStyling: Record<string, FieldStyling> = {\n text: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { \n display: 'block', \n marginBottom: 'var(--spacing-xs)',\n fontWeight: '500',\n color: 'var(--color-text)',\n },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n fontSize: '0.875rem',\n },\n error: {\n color: 'var(--color-error)',\n fontSize: '0.75rem',\n marginTop: 'var(--spacing-xs)',\n },\n },\n number: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { display: 'block', marginBottom: 'var(--spacing-xs)', fontWeight: '500' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n },\n },\n checkbox: {\n wrapper: { display: 'flex', alignItems: 'center', gap: 'var(--spacing-sm)' },\n input: { width: '1rem', height: '1rem' },\n label: { cursor: 'pointer' },\n },\n select: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n backgroundColor: 'white',\n },\n },\n};\n","import Redis from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import Redis from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import Redis from \"ioredis\";\nimport { randomBytes } from \"crypto\";\n\nexport type AuditAction =\n | \"login\"\n | \"logout\"\n | \"login_failed\"\n | \"register\"\n | \"verify_email\"\n | \"password_change\"\n | \"password_reset\"\n | \"password_reset_request\"\n | \"role_change\"\n | \"permission_change\"\n | \"document_create\"\n | \"document_update\"\n | \"document_delete\"\n | \"settings_change\"\n | \"user_lockout\"\n | \"user_unlock\"\n | \"user_create\"\n | \"user_update\"\n | \"user_delete\"\n | \"api_request\"\n | \"api_key_create\"\n | \"api_key_delete\"\n | \"tenant_create\"\n | \"tenant_delete\";\n\nexport interface AuditLog {\n id: string;\n timestamp: Date;\n action: AuditAction;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n changes?: { field: string; old: any; new: any }[];\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface AuditLogFilter {\n userId?: string;\n action?: AuditAction | AuditAction[];\n resource?: string;\n resourceId?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n}\n\nexport interface AuditRetentionConfig {\n retentionDays: number;\n cleanupIntervalHours: number;\n}\n\nexport const DEFAULT_RETENTION_CONFIG: AuditRetentionConfig = {\n retentionDays: 30,\n cleanupIntervalHours: 24,\n};\n\nexport class AuditLogger {\n private redis: Redis;\n private prefix: string;\n private retentionDays: number;\n\n constructor(\n redis: Redis,\n retentionDays: number = 30,\n prefix: string = \"kyro:audit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n const key = this.getKeyForDate(timestamp);\n const hashKey = `${this.prefix}log:${id}`;\n\n await this.redis.hset(hashKey, this.serializeLog(log));\n await this.redis.expire(hashKey, this.retentionDays * 24 * 60 * 60 + 3600);\n\n await this.redis.zadd(key, timestamp.getTime(), id);\n await this.redis.expire(key, this.retentionDays * 24 * 60 * 60 + 3600);\n\n const userIndex = data.userId ? `${this.prefix}user:${data.userId}` : null;\n if (userIndex) {\n await this.redis.zadd(userIndex, timestamp.getTime(), id);\n await this.redis.expire(\n userIndex,\n this.retentionDays * 24 * 60 * 60 + 3600,\n );\n }\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n const hashKey = `${this.prefix}log:${id}`;\n const data = await this.redis.hgetall(hashKey);\n\n if (!data || Object.keys(data).length === 0) {\n return null;\n }\n\n return this.deserializeLog(data);\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let keys: string[] = [];\n\n if (filter.userId) {\n keys.push(`${this.prefix}user:${filter.userId}`);\n } else if (filter.startDate || filter.endDate) {\n keys = this.getKeysForDateRange(filter.startDate, filter.endDate);\n } else {\n const now = new Date();\n keys = this.getKeysForDateRange(\n new Date(now.getTime() - this.retentionDays * 24 * 60 * 60 * 1000),\n now,\n );\n }\n\n let idScores: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n idScores.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n idScores.sort((a, b) => b[1] - a[1]);\n\n const total = idScores.length;\n idScores = idScores.slice(offset, offset + limit);\n\n const logs: AuditLog[] = [];\n for (const [id] of idScores) {\n const log = await this.get(id);\n if (log) {\n if (this.matchesFilter(log, filter)) {\n logs.push(log);\n }\n }\n }\n\n return { logs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const logs: AuditLog[] = [];\n const now = new Date();\n const keys = this.getKeysForDateRange(\n new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000),\n now,\n );\n\n let allIds: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n allIds.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n allIds.sort((a, b) => b[1] - a[1]);\n\n for (const [id] of allIds.slice(0, limit)) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const key = `${this.prefix}user:${userId}`;\n const ids = await this.redis.zrange(key, 0, limit - 1);\n\n const logs: AuditLog[] = [];\n for (const id of ids) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const keys = this.getKeysForDateRange(\n startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n endDate || new Date(),\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const key of keys) {\n const ids = await this.redis.zrange(key, 0, -1);\n\n for (const id of ids) {\n const log = await this.get(id);\n if (log) {\n totalEvents++;\n\n byAction[log.action] = (byAction[log.action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000;\n\n const keys = await this.redis.keys(`${this.prefix}date:*`);\n let deleted = 0;\n\n for (const key of keys) {\n const timestamp = await this.redis.zrangebyscore(key, 0, cutoff);\n\n for (const id of timestamp) {\n await this.redis.del(`${this.prefix}log:${id}`);\n deleted++;\n }\n\n await this.redis.zremrangebyscore(key, 0, cutoff);\n }\n\n return deleted;\n }\n\n private getKeyForDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${this.prefix}date:${year}-${month}-${day}`;\n }\n\n private getKeysForDateRange(start?: Date, end?: Date): string[] {\n const keys: string[] = [];\n const startDate =\n start || new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000);\n const endDate = end || new Date();\n\n const current = new Date(startDate);\n while (current <= endDate) {\n keys.push(this.getKeyForDate(current));\n current.setDate(current.getDate() + 1);\n }\n\n return keys;\n }\n\n private matchesFilter(log: AuditLog, filter: AuditLogFilter): boolean {\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n if (!actions.includes(log.action)) return false;\n }\n\n if (filter.resource && log.resource !== filter.resource) return false;\n\n if (filter.resourceId && log.resourceId !== filter.resourceId) return false;\n\n if (filter.success !== undefined && log.success !== filter.success)\n return false;\n\n return true;\n }\n\n private serializeLog(log: AuditLog): Record<string, string> {\n const result: Record<string, string> = {\n id: log.id,\n timestamp: log.timestamp.toISOString(),\n action: log.action,\n resource: log.resource,\n success: log.success ? \"1\" : \"0\",\n };\n\n if (log.userId) result.userId = log.userId;\n if (log.userEmail) result.userEmail = log.userEmail;\n if (log.role) result.role = log.role;\n if (log.resourceId) result.resourceId = log.resourceId;\n if (log.ipAddress) result.ipAddress = log.ipAddress;\n if (log.userAgent) result.userAgent = log.userAgent;\n if (log.error) result.error = log.error;\n if (log.changes) result.changes = JSON.stringify(log.changes);\n if (log.metadata) result.metadata = JSON.stringify(log.metadata);\n\n return result;\n }\n\n private deserializeLog(data: Record<string, string>): AuditLog {\n return {\n id: data.id,\n timestamp: new Date(data.timestamp),\n action: data.action as AuditAction,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success === \"1\",\n error: data.error,\n changes: data.changes ? JSON.parse(data.changes) : undefined,\n metadata: data.metadata ? JSON.parse(data.metadata) : undefined,\n };\n }\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport class InMemoryAuthAdapter implements AuthAdapter {\n private users: Map<string, AuthUser> = new Map();\n private sessions: Map<string, Session> = new Map();\n private refreshTokens: Map<string, string> = new Map(); // refreshToken -> sessionId\n private emailToUserId: Map<string, string> = new Map();\n private passwordHistory: Map<string, string[]> = new Map(); // userId -> passwordHash[]\n private externalDb: boolean = false;\n\n constructor() {}\n\n async connect(): Promise<void> {\n // No connection needed for in-memory adapter\n }\n\n async disconnect(): Promise<void> {\n // No disconnection needed for in-memory adapter\n this.users.clear();\n this.sessions.clear();\n this.refreshTokens.clear();\n this.emailToUserId.clear();\n this.passwordHistory.clear();\n }\n\n async createUser(data: {\n email: string;\n passwordHash: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash: data.passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.users.set(userId, user);\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n this.passwordHistory.set(userId, []);\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = this.emailToUserId.get(email.toLowerCase());\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n return this.users.get(userId) || null;\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n // Handle email change\n if (data.email && data.email !== existing.email) {\n this.emailToUserId.delete(existing.email.toLowerCase());\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n }\n\n this.users.set(userId, updated);\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n this.users.delete(userId);\n this.emailToUserId.delete(user.email.toLowerCase());\n this.refreshTokens.forEach((sessionId, refreshToken) => {\n if (this.sessions.get(sessionId)?.userId === userId) {\n this.refreshTokens.delete(refreshToken);\n this.sessions.delete(sessionId);\n }\n });\n this.passwordHistory.delete(userId);\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n this.sessions.delete(sessionId);\n }\n });\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.compare(password, hash);\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(now.getTime() + 86400 * 1000).toISOString(), // 24 hours\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.sessions.set(sessionId, session);\n this.refreshTokens.set(refreshToken, sessionId);\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n return this.sessions.get(token) || null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n let deleted = 0;\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n deleted++;\n }\n });\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n const history = this.passwordHistory.get(userId) || [];\n history.push(passwordHash);\n // Keep only last 5 passwords\n if (history.length > 5) {\n history.splice(0, history.length - 5);\n }\n this.passwordHistory.set(userId, history);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.passwordHistory.get(userId) || [];\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n const bcrypt = (await import(\"bcryptjs\")).default;\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n return this.users.size > 0;\n }\n}\n\nexport function createInMemoryAuthAdapter() {\n return new InMemoryAuthAdapter();\n}\n","import type { RateLimitConfig, RateLimitResult } from \"./rate-limit.js\";\n\nexport class InMemoryRateLimiter {\n private storage: Map<string, { timestamp: number; count: number }[]> =\n new Map();\n private userStorage: Map<\n string,\n Map<string, { timestamp: number; count: number }[]>\n > = new Map();\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n ) {\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${type}:${identifier}`;\n }\n\n private getUserKey(type: string, userId: string, identifier: string): string {\n return `user:${type}:${userId}:${identifier}`;\n }\n\n private cleanupOldEntries(\n entries: { timestamp: number; count: number }[],\n window: number,\n ): void {\n const now = Date.now();\n const windowStart = now - window;\n\n // Remove entries older than the window\n while (entries.length > 0 && entries[0].timestamp < windowStart) {\n entries.shift();\n }\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const userMap = this.userStorage.get(userId);\n let entries: { timestamp: number; count: number }[] = [];\n\n if (userMap) {\n entries = userMap.get(this.getKey(type, identifier)) || [];\n } else {\n // Initialize user storage if not exists\n if (!this.userStorage.has(userId)) {\n this.userStorage.set(userId, new Map());\n }\n this.userStorage.get(userId)!.set(this.getKey(type, identifier), entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n this.storage.delete(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const userMap = this.userStorage.get(userId);\n if (userMap) {\n const key = this.getKey(type, identifier);\n userMap.delete(key);\n }\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createInMemoryRateLimiter(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n) {\n return new InMemoryRateLimiter(limits, userLimits);\n}\n\nconst DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n","import type { LockoutConfig, LockoutStatus } from \"./lockout.js\";\n\nexport class InMemoryAccountLockout {\n private storage: Map<\n string,\n {\n attempts: number;\n lastAttempt: number | null;\n lockedAt: number | null;\n lockedUntil: number | null;\n }\n > = new Map();\n private history: Map<string, number[]> = new Map(); // userId -> attempt timestamps\n private config: LockoutConfig;\n\n constructor(config: Partial<LockoutConfig> = {}) {\n this.config = {\n maxAttempts: 5,\n lockDuration: 900000, // 15 minutes\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n ...config,\n };\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId);\n\n // Clear expired locks\n if (record && record.lockedUntil !== null && record.lockedUntil <= now) {\n await this.resetAttempts(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n if (!record) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const { attempts, lockedUntil } = record;\n\n if (lockedUntil !== null && lockedUntil > now) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockedUntil),\n totalAttempts: attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts += 1;\n record.lastAttempt = now;\n\n // Add to history\n let history = this.history.get(userId) || [];\n history.push(now);\n // Keep only last 100 attempts\n if (history.length > 100) {\n history.splice(0, history.length - 100);\n }\n this.history.set(userId, history);\n\n this.storage.set(userId, record);\n\n // Check if we should lock the account\n if (record.attempts >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: record.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - record.attempts),\n totalAttempts: record.attempts,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts = this.config.maxAttempts;\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n }\n\n async unlockAccount(userId: string): Promise<void> {\n await this.resetAttempts(userId);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const record = this.storage.get(userId);\n if (record) {\n record.attempts = 0;\n record.lockedAt = null;\n record.lockedUntil = null;\n this.storage.set(userId, record);\n }\n\n // Clear history for this user\n this.history.delete(userId);\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const history = this.history.get(userId) || [];\n return history\n .slice(-limit)\n .reverse()\n .map((timestamp) => new Date(timestamp));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const history = this.history.get(userId) || [];\n const totalFailedAttempts = history.length;\n const lockoutCount = Math.floor(\n totalFailedAttempts / this.config.maxAttempts,\n );\n\n let lastLockout: Date | null = null;\n const record = this.storage.get(userId);\n if (record && record.lockedAt !== null) {\n lastLockout = new Date(record.lockedAt);\n }\n\n // Average attempts before lockout is just the threshold for simplicity\n const averageAttemptsBeforeLockout =\n lockoutCount > 0 ? this.config.maxAttempts : 0;\n\n return {\n totalFailedAttempts,\n lockoutCount,\n lastLockout,\n averageAttemptsBeforeLockout,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport function createInMemoryAccountLockout(\n config: Partial<LockoutConfig> = {},\n) {\n return new InMemoryAccountLockout(config);\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuditLog, AuditAction, AuditLogFilter } from \"./audit-log.js\";\nimport { DEFAULT_RETENTION_CONFIG } from \"./audit-log.js\";\n\nexport class InMemoryAuditLogger {\n private logs: AuditLog[] = [];\n private retentionDays: number;\n\n constructor(retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays) {\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n this.logs.push(log);\n this.cleanupOldLogs();\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n return this.logs.find((log) => log.id === id) || null;\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let filteredLogs = [...this.logs]; // Create a copy to avoid modifying original\n\n if (filter.userId) {\n filteredLogs = filteredLogs.filter((log) => log.userId === filter.userId);\n }\n\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n filteredLogs = filteredLogs.filter((log) => actions.includes(log.action));\n }\n\n if (filter.resource) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resource === filter.resource,\n );\n }\n\n if (filter.resourceId) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resourceId === filter.resourceId,\n );\n }\n\n if (filter.success !== undefined) {\n filteredLogs = filteredLogs.filter(\n (log) => log.success === filter.success,\n );\n }\n\n const startDate = filter.startDate;\n const endDate = filter.endDate;\n\n if (startDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp >= startDate);\n }\n\n if (endDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp <= endDate);\n }\n\n // Sort by timestamp descending (newest first)\n filteredLogs.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n const total = filteredLogs.length;\n const paginatedLogs = filteredLogs.slice(offset, offset + limit);\n\n return { logs: paginatedLogs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const cutoffDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // Last 7 days\n\n const recentLogs = this.logs\n .filter((log) => log.timestamp >= cutoffDate)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return recentLogs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const userLogs = this.logs\n .filter((log) => log.userId === userId)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return userLogs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const start = startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // Last 30 days\n const end = endDate || new Date();\n\n const filteredLogs = this.logs.filter(\n (log) => log.timestamp >= start && log.timestamp <= end,\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const log of filteredLogs) {\n totalEvents++;\n\n const action = log.action;\n byAction[action] = (byAction[action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n\n return initialCount - this.logs.length;\n }\n\n private cleanupOldLogs(): void {\n // This is called automatically after each log entry\n // In a production system, you might want to run this less frequently\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n }\n}\n\nexport function createInMemoryAuditLogger(\n retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays,\n) {\n return new InMemoryAuditLogger(retentionDays);\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import jwt from \"jsonwebtoken\";\nimport type { AuthUser, JWTPayload } from \"../../auth/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\n\nexport interface AuthMiddlewareConfig {\n secret: string;\n issuer?: string;\n audience?: string;\n extractToken?: (req: Request) => string | null;\n}\n\nexport interface AuthenticatedContext {\n user?: AuthUser;\n token?: string;\n tenantContext?: TenantContext;\n}\n\nexport interface AuthMiddlewareResult {\n user?: Partial<AuthUser>;\n token?: string;\n tenantContext?: TenantContext;\n error?: string;\n status: number;\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n issuer,\n audience,\n extractToken = defaultExtractToken,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\n const token = extractToken(req);\n\n if (!token) {\n return {\n status: 401,\n error: \"No authentication token provided\",\n };\n }\n\n try {\n const payload = jwt.verify(token, secret, {\n issuer,\n audience,\n }) as JWTPayload;\n\n const user: Partial<AuthUser> = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n tenantId: payload.tenantId,\n };\n\n return {\n user,\n token,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n };\n } catch (error) {\n if (error instanceof jwt.TokenExpiredError) {\n return {\n status: 401,\n error: \"Token has expired\",\n };\n }\n\n if (error instanceof jwt.JsonWebTokenError) {\n return {\n status: 401,\n error: \"Invalid token\",\n };\n }\n\n return {\n status: 401,\n error: \"Authentication failed\",\n };\n }\n };\n}\n\nexport function defaultExtractToken(req: Request): string | null {\n const authHeader = req.headers.get(\"Authorization\");\n if (authHeader?.startsWith(\"Bearer \")) {\n return authHeader.slice(7);\n }\n\n const cookieHeader = req.headers.get(\"Cookie\");\n if (cookieHeader) {\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => {\n const [key, ...val] = c.split(\"=\");\n return [key.trim(), val.join(\"=\")];\n }),\n );\n return cookies[\"auth_token\"] || null;\n }\n\n return null;\n}\n\nexport function createTenantContextFromUser(\n user: Partial<AuthUser>,\n): TenantContext {\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id || \"anonymous\",\n role: user.role || \"guest\",\n roles: [user.role || \"guest\"],\n permissions: [],\n isSuperAdmin: user.role === \"super_admin\",\n };\n}\n\nexport function generateToken(\n payload: JWTPayload,\n secret: string,\n options: {\n expiresIn?: string | number;\n issuer?: string;\n audience?: string;\n } = {},\n): string {\n return jwt.sign(payload, secret, {\n expiresIn: (options.expiresIn || \"24h\") as jwt.SignOptions[\"expiresIn\"],\n issuer: options.issuer,\n audience: options.audience,\n });\n}\n\nexport function verifyToken(\n token: string,\n secret: string,\n options: {\n issuer?: string;\n audience?: string;\n } = {},\n): JWTPayload | null {\n try {\n return jwt.verify(token, secret, options) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpiringSoon(\n token: string,\n secret: string,\n thresholdMinutes: number = 30,\n): boolean {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return true;\n }\n\n const expirationTime = payload.exp * 1000;\n const thresholdTime = Date.now() + thresholdMinutes * 60 * 1000;\n\n return expirationTime < thresholdTime;\n}\n\nexport function getTokenExpiration(token: string, secret: string): Date | null {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n\nexport function extractUserFromRequest(\n req: Request,\n config: AuthMiddlewareConfig,\n): Promise<AuthMiddlewareResult> {\n const middleware = createAuthMiddleware(config);\n return middleware(req);\n}\n","import jwt from \"jsonwebtoken\";\nimport { randomBytes } from \"crypto\";\nimport type { AuthAdapter } from \"../../auth/types.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../../auth/security/password-policy.js\";\nimport { InMemoryAccountLockout } from \"../../auth/security/in-memory-lockout.js\";\nimport { InMemoryRateLimiter } from \"../../auth/security/in-memory-rate-limit.js\";\nimport {\n InMemoryAuditLogger,\n createAuditContext,\n} from \"../../auth/security/in-memory-audit-log.js\";\nimport type { AuditAction } from \"../../auth/security/audit-log.js\";\nimport { generateToken, defaultExtractToken } from \"./auth-middleware.js\";\nimport type {\n AuthUser,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n Session,\n} from \"../../auth/types.js\";\n\nexport interface AuthRoutesConfig {\n redis: AuthAdapter;\n email?: EmailTransport;\n jwtSecret: string;\n jwtExpiresIn?: string;\n jwtIssuer?: string;\n jwtAudience?: string;\n passwordPolicy?: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n baseUrl?: string;\n emailVerificationRequired?: boolean;\n}\n\nexport class AuthRoutes {\n private authAdapter: AuthAdapter;\n private email?: EmailTransport;\n private jwtSecret: string;\n private jwtExpiresIn: string;\n private jwtIssuer?: string;\n private jwtAudience?: string;\n private passwordPolicy: PasswordPolicy;\n private lockout?: InMemoryAccountLockout;\n private rateLimiter?: InMemoryRateLimiter;\n private auditLogger?: InMemoryAuditLogger;\n private baseUrl: string;\n private emailVerificationRequired: boolean;\n\n constructor(config: AuthRoutesConfig) {\n this.authAdapter = config.redis;\n this.email = config.email;\n this.jwtSecret = config.jwtSecret;\n this.jwtExpiresIn = config.jwtExpiresIn || \"24h\";\n this.jwtIssuer = config.jwtIssuer;\n this.jwtAudience = config.jwtAudience;\n this.passwordPolicy = config.passwordPolicy || new PasswordPolicy();\n this.lockout = config.lockout;\n this.rateLimiter = config.rateLimiter;\n this.auditLogger = config.auditLogger;\n this.baseUrl = config.baseUrl || \"http://localhost:3000\";\n this.emailVerificationRequired = config.emailVerificationRequired ?? true;\n }\n\n async register(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:register\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as RegisterData & {\n confirmPassword?: string;\n };\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n if (body.password !== body.confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(body.password);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const existingUser = await this.authAdapter.findUserByEmail(body.email);\n if (existingUser) {\n return this.errorResponse(\"Email already registered\", 400);\n }\n\n const passwordHash = await this.authAdapter.hashPassword(body.password);\n const user = await this.authAdapter.createUser({\n email: body.email,\n passwordHash,\n role: body.role || \"customer\",\n tenantId: body.tenantId,\n });\n\n if (this.emailVerificationRequired && this.email) {\n const verificationToken = randomBytes(32).toString(\"hex\");\n const verificationUrl = `${this.baseUrl}/api/auth/verify?token=${verificationToken}`;\n\n await this.authAdapter.createSession(user.id, { ipAddress, userAgent });\n const template = this.email\n .getTemplates()\n .verifyEmail(verificationUrl, body.email);\n await this.email.send({ to: body.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"register\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse(\n {\n success: true,\n message: \"Registration successful\",\n user: this.sanitizeUser(user),\n requiresVerification: this.emailVerificationRequired && !!this.email,\n },\n 201,\n );\n } catch (error) {\n return this.errorResponse(\"Registration failed\", 500);\n }\n }\n\n async login(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:login\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as LoginCredentials;\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(body.email);\n if (!user) {\n await this.recordFailedLogin(ipAddress, userAgent);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n const lockoutStatus = await this.lockout.checkLockout(user.id);\n if (lockoutStatus.locked) {\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Account locked\",\n });\n }\n return this.errorResponse(\n `Account locked. Try again in ${Math.ceil((lockoutStatus.lockedUntil!.getTime() - Date.now()) / 60000)} minutes`,\n 423,\n );\n }\n }\n\n const validPassword = user.passwordHash\n ? await this.authAdapter.verifyPassword(\n body.password,\n user.passwordHash,\n )\n : false;\n if (!validPassword) {\n await this.recordFailedLogin(ipAddress, userAgent, user.id, user.email);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n await this.lockout.resetAttempts(user.id);\n }\n\n const session = await this.authAdapter.createSession(user.id, {\n ipAddress,\n userAgent,\n });\n\n const payload: JWTPayload = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 86400,\n };\n\n const accessToken = generateToken(payload, this.jwtSecret, {\n expiresIn: this.jwtExpiresIn,\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n });\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login\",\n userId: user.id,\n userEmail: user.email,\n role: user.role,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n await this.authAdapter.updateUser(user.id, {\n lastLogin: new Date().toISOString(),\n });\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n accessToken,\n refreshToken: session.refreshToken,\n expiresIn: this.jwtExpiresIn,\n });\n } catch (error) {\n return this.errorResponse(\"Login failed\", 500);\n }\n }\n\n async logout(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"No session to logout\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.decode(token) as JWTPayload;\n if (payload && payload.sub) {\n await this.authAdapter.deleteUserSessions(payload.sub);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"logout\",\n userId: payload.sub,\n userEmail: payload.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Logged out successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Logout failed\", 500);\n }\n }\n\n async refresh(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as { refreshToken?: string };\n const { refreshToken } = body;\n\n if (!refreshToken) {\n return this.errorResponse(\"Refresh token required\", 400);\n }\n\n return this.jsonResponse({ success: true, accessToken: \"\" });\n } catch (error) {\n return this.errorResponse(\"Token refresh failed\", 500);\n }\n }\n\n async me(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const payload = jwt.verify(token, this.jwtSecret, {\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n }) as JWTPayload;\n\n const user = await this.authAdapter.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n });\n } catch (error) {\n return this.errorResponse(\"Authentication failed\", 401);\n }\n }\n\n async changePassword(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.verify(token, this.jwtSecret) as JWTPayload;\n const body = (await req.json()) as {\n currentPassword?: string;\n newPassword?: string;\n confirmPassword?: string;\n };\n const { currentPassword, newPassword, confirmPassword } = body;\n\n if (!currentPassword || !newPassword) {\n return this.errorResponse(\"Current and new password required\", 400);\n }\n\n if (newPassword !== confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(newPassword);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const user = await this.authAdapter.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n const validPassword = user.passwordHash\n ? await this.authAdapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n )\n : false;\n if (!validPassword) {\n return this.errorResponse(\"Current password is incorrect\", 401);\n }\n\n const passwordHistory = await this.authAdapter.getPasswordHistory?.(\n user.id,\n 5,\n );\n const isReused = await this.authAdapter.isPasswordInHistory?.(\n newPassword,\n user.id,\n 5,\n );\n if (isReused) {\n return this.errorResponse(\n \"Password was recently used. Please choose a different password\",\n 400,\n );\n }\n\n const newPasswordHash = await this.authAdapter.hashPassword(newPassword);\n if (user.passwordHash) {\n await this.authAdapter.addPasswordToHistory?.(\n user.id,\n user.passwordHash,\n );\n }\n await this.authAdapter.updateUser(user.id, {\n passwordHash: newPasswordHash,\n });\n\n await this.authAdapter.deleteUserSessions(user.id);\n\n if (this.email && this.email.getTemplates) {\n const template = this.email.getTemplates().passwordChanged(user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_change\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Password change failed\", 500);\n }\n }\n\n async forgotPassword(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:forgot\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as { email?: string };\n const { email } = body;\n\n if (!email) {\n return this.errorResponse(\"Email required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(email);\n if (!user) {\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n }\n\n if (this.email) {\n const resetToken = randomBytes(32).toString(\"hex\");\n const resetUrl = `${this.baseUrl}/api/auth/reset-password?token=${resetToken}`;\n const template = this.email\n .getTemplates()\n .resetPassword(resetUrl, user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_reset_request\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n } catch (error) {\n return this.errorResponse(\"Password reset request failed\", 500);\n }\n }\n\n async verifyEmail(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const token = url.searchParams.get(\"token\");\n\n if (!token) {\n return this.errorResponse(\"Verification token required\", 400);\n }\n\n try {\n return this.jsonResponse({ success: true, message: \"Email verified\" });\n } catch (error) {\n return this.errorResponse(\"Email verification failed\", 500);\n }\n }\n\n private async recordFailedLogin(\n ipAddress: string,\n userAgent: string,\n userId?: string,\n userEmail?: string,\n ): Promise<void> {\n if (this.lockout) {\n await this.lockout.recordFailedAttempt(userId || ipAddress);\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId,\n userEmail,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Invalid credentials\",\n });\n }\n }\n\n private sanitizeUser(user: AuthUser): Partial<AuthUser> {\n const { passwordHash, ...sanitized } = user;\n return sanitized;\n }\n\n private jsonResponse(data: any, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private errorResponse(message: string, status: number): Response {\n return new Response(JSON.stringify({ success: false, error: message }), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private rateLimitResponse(limit: { retryAfter?: number }): Response {\n return new Response(\n JSON.stringify({\n success: false,\n error: \"Too many requests\",\n retryAfter: limit.retryAfter,\n }),\n {\n status: 429,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": String(limit.retryAfter || 60),\n },\n },\n );\n }\n}\n","import type { AuthAdapter } from \"./types.js\";\nimport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nimport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nimport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nimport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\nimport { RedisAuthAdapter } from \"./redis-adapter.js\";\nimport { AccountLockout } from \"./security/lockout.js\";\nimport { RateLimiter } from \"./security/rate-limit.js\";\nimport { AuditLogger } from \"./security/audit-log.js\";\n\nexport type DatabaseType =\n | \"sqlite\"\n | \"postgres\"\n | \"mysql\"\n | \"mongodb\"\n | \"memory\";\n\nexport interface KyroAuthConfig {\n authAdapter: AuthAdapter;\n // Optional; when using distributed mode this can be set to 'distributed' or other markers\n databaseType?: string;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nfunction detectDatabaseType(): DatabaseType {\n // Check environment variable first\n const envDb = process.env.KYRO_AUTH_DATABASE?.toLowerCase();\n if (\n envDb &&\n [\"sqlite\", \"postgres\", \"mysql\", \"mongodb\", \"memory\"].includes(envDb)\n ) {\n return envDb as DatabaseType;\n }\n\n // Try to detect from main kyro.config.ts\n try {\n const { readFileSync } = require(\"fs\");\n const { join } = require(\"path\");\n const configPath = join(process.cwd(), \"kyro.config.ts\");\n const configContent = readFileSync(configPath, \"utf8\");\n\n if (configContent.includes(\"createLocalAdapter\")) {\n return \"sqlite\";\n } else if (configContent.includes(\"createDrizzleAdapter\")) {\n // Check connection string for database type hints\n if (\n configContent.includes(\"postgres\") ||\n configContent.includes(\"postgresql\")\n ) {\n return \"postgres\";\n } else if (configContent.includes(\"mysql\")) {\n return \"mysql\";\n }\n return \"postgres\"; // Default for drizzle\n } else if (configContent.includes(\"createMongoDBAdapter\")) {\n return \"mongodb\";\n }\n } catch {\n // If we can't read config, default to memory\n }\n\n return \"memory\";\n}\n\nasync function createAuthAdapter(\n databaseType: DatabaseType,\n): Promise<AuthAdapter> {\n switch (databaseType) {\n case \"sqlite\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"postgres\":\n case \"mysql\":\n // Use SQLite for auth when using SQL databases (simpler than Redis)\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"mongodb\":\n // Use SQLite for auth when using MongoDB\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"memory\":\n default:\n return new InMemoryAuthAdapter();\n }\n}\n\nexport async function createAuthConfig(\n databaseType?: string,\n): Promise<KyroAuthConfig> {\n const distributed = getEnvBool(\"KYRO_DISTRIBUTED\", false);\n let authAdapter: AuthAdapter;\n // Distributed mode uses Redis for shared state\n if (distributed) {\n // Dynamically import to avoid pulling Redis on dev builds\n const { RedisAuthAdapter } = await import(\"./redis-adapter.js\");\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisTls = getEnvBool(\"REDIS_TLS\", false);\n const redisAdapter = new RedisAuthAdapter({ url: redisUrl, tls: redisTls });\n await redisAdapter.connect?.();\n authAdapter = redisAdapter as any;\n } else {\n const initialDbType = (databaseType || detectDatabaseType()) as any;\n authAdapter = await createAuthAdapter(initialDbType);\n if ((authAdapter as any).connect) {\n await (authAdapter as any).connect();\n }\n }\n\n const emailConfig = getEmailConfig();\n const email = emailConfig ? new EmailTransport(emailConfig) : undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: any;\n let rateLimiter: any;\n let auditLogger: any;\n if (distributed) {\n // Redis-backed security features\n const redis = authAdapter as any;\n const redisClient = (redis as any).redis;\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n } else {\n lockout = new InMemoryAccountLockout({\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new InMemoryRateLimiter({\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = getEnvBool(\"AUDIT_LOG_ENABLED\", true)\n ? new InMemoryAuditLogger(getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30))\n : undefined;\n }\n\n const routes = new AuthRoutes({\n redis: authAdapter as any,\n email,\n jwtSecret: getEnv(\"JWT_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n const actualDbType = distributed\n ? \"distributed\"\n : ((databaseType || detectDatabaseType()) as string);\n return {\n authAdapter,\n databaseType: actualDbType,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nfunction getEmailConfig():\n | ConstructorParameters<typeof EmailTransport>[0]\n | undefined {\n const host = getEnv(\"SMTP_HOST\");\n if (!host) return undefined;\n\n return {\n host,\n port: getEnvNum(\"SMTP_PORT\", 587),\n secure: getEnvBool(\"SMTP_SECURE\", false),\n auth: {\n user: getEnv(\"SMTP_USER\"),\n pass: getEnv(\"SMTP_PASS\"),\n },\n from: getEnv(\"SMTP_FROM\", \"noreply@example.com\"),\n fromName: getEnv(\"SMTP_FROM_NAME\", \"Kyro CMS\"),\n };\n}\n\nexport const authConfig = createAuthConfig();\n","import bcrypt from \"bcrypt\";\nimport jwt from \"jsonwebtoken\";\nimport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const passwordHash = await this.hashPassword(data.password);\n const user = await this.adapter.createUser({\n email: data.email,\n passwordHash,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(credentials.email);\n if (!user || !user.passwordHash) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n credentials.password,\n user.passwordHash,\n );\n if (!valid) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const decoded = jwt.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user || !user.passwordHash) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n const newHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(userId, { passwordHash: newHash });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const passwordHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(user.id, { passwordHash });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private generateToken(user: AuthUser): string {\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwt.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig, DatabaseType } from \"./config.js\";\n\nexport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nexport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nexport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nexport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n"]}
1
+ {"version":3,"sources":["../node_modules/@smithy/protocol-http/dist-es/extensions/httpExtensionConfiguration.js","../node_modules/@smithy/protocol-http/dist-es/extensions/index.js","../node_modules/@smithy/protocol-http/dist-es/Field.js","../node_modules/@smithy/protocol-http/dist-es/Fields.js","../node_modules/@smithy/protocol-http/dist-es/httpHandler.js","../node_modules/@smithy/protocol-http/dist-es/httpRequest.js","../node_modules/@smithy/protocol-http/dist-es/httpResponse.js","../node_modules/@smithy/protocol-http/dist-es/isValidHostname.js","../node_modules/@smithy/protocol-http/dist-es/types.js","../node_modules/@smithy/protocol-http/dist-es/index.js","../node_modules/@smithy/util-uri-escape/dist-es/escape-uri.js","../node_modules/@smithy/util-uri-escape/dist-es/escape-uri-path.js","../node_modules/@smithy/util-uri-escape/dist-es/index.js","../node_modules/@smithy/querystring-builder/dist-es/index.js","../node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js","../node_modules/@smithy/node-http-handler/dist-es/constants.js","../node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js","../node_modules/@smithy/node-http-handler/dist-es/timing.js","../node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js","../node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js","../node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js","../node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js","../node_modules/@smithy/node-http-handler/dist-es/write-request-body.js","../node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js","../node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js","../node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js","../node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js","../node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js","../node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js","../node_modules/@smithy/node-http-handler/dist-es/index.js","../src/registry/validator.ts","../src/registry/zod-builder.ts","../src/registry/index.ts","../src/createKyro.ts","../src/fields/types.ts","../src/fields/richtext.ts","../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/styling/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/security/audit-log.ts","../src/auth/in-memory-adapter.ts","../src/auth/security/in-memory-lockout.ts","../src/auth/security/in-memory-audit-log.ts","../src/api/rest/auth-routes.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/storage/local.ts","../src/storage/s3.ts","../src/storage/cloudinary.ts","../src/storage/imgix.ts","../src/storage/ftp.ts","../src/storage/index.ts","../src/storage/processor.ts","../src/storage/MediaService.ts","../src/registry/config.ts"],"names":["__esm","init_dist_es","abortError","DEFER_EVENT_LISTENER_TIME","Readable","hsAgent","path","hsRequest","http2","constants","Writable","__export","z","fields","KyroPubSub","createHonoApp","buildGraphQLSchema","createKyroServer","createWSServer","AbstractBaseAdapter","randomBytes","bcrypt","createAuditContext","PasswordPolicy","generateToken","defaultExtractToken","jwt","__require","join","SQLiteAuthAdapter","RedisAuthAdapter","EmailTransport","InMemoryRateLimiter","existsSync","mkdir","extname","createHash","writeFile","basename","unlink","rename","readdir","stat","S3Client","__toCommonJS","PutObjectCommand","HeadObjectCommand","DeleteObjectCommand","CopyObjectCommand","ListObjectsV2Command","Client","getUrlPrefix","sharp","genId","ConfigService","totalDocs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,+BAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,qFAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,eAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,gEAAA,GAAA;AAAA,IAAA,+BAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,UAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,WAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,sDAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,gBAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,2DAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,gBAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,2DAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAa,YAAA;AAAb,IAAA,iBAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,4DAAA,GAAA;AAAO,IAAM,eAAN,MAAmB;AAAA,MACtB,UAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAY,OAAA,EAAS;AACjB,QAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,QAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AACnC,QAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,MACxB;AAAA,MACA,OAAO,WAAW,QAAA,EAAU;AACxB,QAAA,IAAI,CAAC,QAAA;AACD,UAAA,OAAO,KAAA;AACX,QAAA,MAAM,IAAA,GAAO,QAAA;AACb,QAAA,OAAO,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,IAAY,OAAO,KAAK,OAAA,KAAY,QAAA;AAAA,MAC1E;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjBA,IAAA,oBAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,+DAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,UAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,YAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AAAA,IAAA,eAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACPA,IAAa,SAAA,EACP,SAAA;AADN,IAAA,eAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,4DAAA,GAAA;AAAO,IAAM,SAAA,GAAY,CAAC,GAAA,KAAQ,kBAAA,CAAmB,GAAG,CAAA,CAAE,OAAA,CAAQ,YAAY,SAAS,CAAA;AACvF,IAAM,SAAA,GAAY,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACDvE,IAAA,oBAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,iEAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAAC,aAAAA,GAAAD,uBAAA,CAAA;AAAA,EAAA,uDAAA,GAAA;AAAA,IAAA,eAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAO,SAAS,iBAAiB,KAAA,EAAO;AACpC,EAAA,MAAM,QAAQ,EAAC;AACf,EAAA,KAAA,IAAS,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAK,EAAG;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,IAAA,GAAA,GAAM,UAAU,GAAG,CAAA;AACnB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,IAAA,GAAO,MAAM,MAAA,EAAQ,CAAA,GAAI,MAAM,CAAA,EAAA,EAAK;AAChD,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,GAAG,CAAA,CAAA,EAAI,UAAU,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9C;AAAA,IACJ,CAAA,MACK;AACD,MAAA,IAAI,OAAA,GAAU,GAAA;AACd,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,QAAA,OAAA,IAAW,CAAA,CAAA,EAAI,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AAAA,MACnC;AACA,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IACtB;AAAA,EACJ;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACzB;AApBA,IAAAC,aAAAA,GAAAD,uBAAA,CAAA;AAAA,EAAA,2DAAA,GAAA;AAAA,IAAAC,aAAAA,EAAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAO,SAAS,gBAAgB,WAAA,EAAa;AACzC,EAAA,MAAM,MAAA,GAAS,eAAe,OAAO,WAAA,KAAgB,YAAY,QAAA,IAAY,WAAA,GACvE,YAAY,MAAA,GACZ,MAAA;AACN,EAAA,IAAI,MAAA,EAAQ;AACR,IAAA,IAAI,kBAAkB,KAAA,EAAO;AACzB,MAAA,MAAMC,WAAAA,GAAa,IAAI,KAAA,CAAM,iBAAiB,CAAA;AAC9C,MAAAA,YAAW,IAAA,GAAO,YAAA;AAClB,MAAAA,YAAW,KAAA,GAAQ,MAAA;AACnB,MAAA,OAAOA,WAAAA;AAAA,IACX;AACA,IAAA,MAAMA,WAAAA,GAAa,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC3C,IAAAA,YAAW,IAAA,GAAO,YAAA;AAClB,IAAA,OAAOA,WAAAA;AAAA,EACX;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAM,iBAAiB,CAAA;AAC9C,EAAA,UAAA,CAAW,IAAA,GAAO,YAAA;AAClB,EAAA,OAAO,UAAA;AACX;AAlBA,IAAA,sBAAA,GAAAF,uBAAA,CAAA;AAAA,EAAA,qEAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAa,0BAAA;AAAb,IAAA,cAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,6DAAA,GAAA;AAAO,IAAM,0BAAA,GAA6B,CAAC,YAAA,EAAc,OAAA,EAAS,WAAW,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACA7E,IAAM,qBAAA;AAAN,IAAA,4BAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,2EAAA,GAAA;AAAA,IAAM,qBAAA,GAAwB,CAAC,OAAA,KAAY;AACvC,MAAA,MAAM,qBAAqB,EAAC;AAC5B,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACrC,QAAA,MAAM,YAAA,GAAe,QAAQ,IAAI,CAAA;AACjC,QAAA,kBAAA,CAAmB,IAAI,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,YAAA;AAAA,MACtF;AACA,MAAA,OAAO,kBAAA;AAAA,IACX,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACPA,IAAa,MAAA;AAAb,IAAA,WAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,0DAAA,GAAA;AAAO,IAAM,MAAA,GAAS;AAAA,MAClB,YAAY,CAAC,EAAA,EAAI,EAAA,KAAO,UAAA,CAAW,IAAI,EAAE,CAAA;AAAA,MACzC,YAAA,EAAc,CAAC,SAAA,KAAc,YAAA,CAAa,SAAS;AAAA,KACvD;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHA,IACM,yBAAA,EACO,oBAAA;AAFb,IAAA,2BAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,0EAAA,GAAA;AAAA,IAAA,WAAA,EAAA;AACA,IAAM,yBAAA,GAA4B,GAAA;AAC3B,IAAM,oBAAA,GAAuB,CAAC,OAAA,EAAS,MAAA,EAAQ,cAAc,CAAA,KAAM;AACtE,MAAA,IAAI,CAAC,WAAA,EAAa;AACd,QAAA,OAAO,EAAA;AAAA,MACX;AACA,MAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAAW;AAChC,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,MAAM;AACtC,UAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,UAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAI,MAAM,CAAA,+HAAA,EAAkI,WAAW,MAAM,CAAA,EAAG;AAAA,YACjL,IAAA,EAAM;AAAA,WACT,CAAC,CAAA;AAAA,QACN,CAAA,EAAG,cAAc,MAAM,CAAA;AACvB,QAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAW;AAC7B,UAAA,IAAI,QAAQ,UAAA,EAAY;AACpB,YAAA,MAAA,CAAO,EAAA,CAAG,WAAW,MAAM;AACvB,cAAA,MAAA,CAAO,aAAa,SAAS,CAAA;AAAA,YACjC,CAAC,CAAA;AAAA,UACL,CAAA,MACK;AACD,YAAA,MAAA,CAAO,aAAa,SAAS,CAAA;AAAA,UACjC;AAAA,QACJ,CAAA;AACA,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,UAAA,YAAA,CAAa,QAAQ,MAAM,CAAA;AAAA,QAC/B,CAAA,MACK;AACD,UAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,YAAY,CAAA;AAAA,QACrC;AAAA,MACJ,CAAA;AACA,MAAA,IAAI,cAAc,GAAA,EAAM;AACpB,QAAA,eAAA,CAAgB,CAAC,CAAA;AACjB,QAAA,OAAO,CAAA;AAAA,MACX;AACA,MAAA,OAAO,OAAO,UAAA,CAAW,eAAA,CAAgB,KAAK,IAAA,EAAM,yBAAyB,GAAG,yBAAyB,CAAA;AAAA,IAC7G,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnCA,IACa,iBAAA;AADb,IAAA,wBAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,uEAAA,GAAA;AAAA,IAAA,WAAA,EAAA;AACO,IAAM,oBAAoB,CAAC,GAAA,EAAK,QAAQ,WAAA,GAAc,CAAA,EAAG,uBAAuB,MAAA,KAAW;AAC9F,MAAA,IAAI,WAAA,EAAa;AACb,QAAA,OAAO,MAAA,CAAO,WAAW,MAAM;AAC3B,UAAA,IAAI,MAAM,CAAA,6BAAA,EAAgC,qBAAA,GAAwB,OAAA,GAAU,MAAM,2CAA2C,WAAW,CAAA,mBAAA,CAAA;AACxI,UAAA,IAAI,qBAAA,EAAuB;AACvB,YAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AAAA,cACxC,IAAA,EAAM,cAAA;AAAA,cACN,IAAA,EAAM;AAAA,aACT,CAAA;AACD,YAAA,GAAA,CAAI,QAAQ,KAAK,CAAA;AACjB,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UAChB,CAAA,MACK;AACD,YAAA,GAAA,IAAO,CAAA,uFAAA,CAAA;AACP,YAAA,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,UACtB;AAAA,QACJ,GAAG,WAAW,CAAA;AAAA,MAClB;AACA,MAAA,OAAO,EAAA;AAAA,IACX,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpBA,IACMG,0BAAAA,EACO,kBAAA;AAFb,IAAA,0BAAA,GAAAH,uBAAA,CAAA;AAAA,EAAA,yEAAA,GAAA;AAAA,IAAA,WAAA,EAAA;AACA,IAAMG,0BAAAA,GAA4B,GAAA;AAC3B,IAAM,kBAAA,GAAqB,CAAC,OAAA,EAAS,EAAE,WAAW,cAAA,EAAe,EAAG,cAAcA,0BAAAA,KAA8B;AACnH,MAAA,IAAI,cAAc,IAAA,EAAM;AACpB,QAAA,OAAO,EAAA;AAAA,MACX;AACA,MAAA,MAAM,mBAAmB,MAAM;AAC3B,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,SAAA,EAAW,cAAA,IAAkB,CAAC,CAAA;AAAA,QAC9D,CAAA,MACK;AACD,UAAA,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,CAAC,MAAA,KAAW;AAC7B,YAAA,MAAA,CAAO,YAAA,CAAa,SAAA,EAAW,cAAA,IAAkB,CAAC,CAAA;AAAA,UACtD,CAAC,CAAA;AAAA,QACL;AAAA,MACJ,CAAA;AACA,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACnB,QAAA,gBAAA,EAAiB;AACjB,QAAA,OAAO,CAAA;AAAA,MACX;AACA,MAAA,OAAO,MAAA,CAAO,UAAA,CAAW,gBAAA,EAAkB,WAAW,CAAA;AAAA,IAC1D,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrBA,IACMA,0BAAAA,EACO,gBAAA;AAFb,IAAA,uBAAA,GAAAH,uBAAA,CAAA;AAAA,EAAA,sEAAA,GAAA;AAAA,IAAA,WAAA,EAAA;AACA,IAAMG,0BAAAA,GAA4B,GAAA;AAC3B,IAAM,gBAAA,GAAmB,CAAC,OAAA,EAAS,MAAA,EAAQ,cAAc,CAAA,KAAM;AAClE,MAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAAW;AAChC,QAAA,MAAM,UAAU,WAAA,GAAc,MAAA;AAC9B,QAAA,MAAM,YAAY,MAAM;AACpB,UAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,UAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,+DAAA,EAAkE,WAAW,CAAA,wDAAA,CAA0D,CAAA,EAAG,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAC,CAAA;AAAA,QACtM,CAAA;AACA,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,UAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,SAAS,CAAA;AAC5C,UAAA,OAAA,CAAQ,EAAA,CAAG,SAAS,MAAM,OAAA,CAAQ,QAAQ,cAAA,CAAe,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,QAClF,CAAA,MACK;AACD,UAAA,OAAA,CAAQ,UAAA,CAAW,SAAS,SAAS,CAAA;AAAA,QACzC;AAAA,MACJ,CAAA;AACA,MAAA,IAAI,CAAA,GAAI,WAAA,IAAe,WAAA,GAAc,GAAA,EAAM;AACvC,QAAA,eAAA,CAAgB,CAAC,CAAA;AACjB,QAAA,OAAO,CAAA;AAAA,MACX;AACA,MAAA,OAAO,MAAA,CAAO,UAAA,CAAW,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,gBAAgB,CAAA,GAAI,CAAA,GAAIA,0BAAyB,CAAA,EAAGA,0BAAyB,CAAA;AAAA,IACrI,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACnBA,eAAsB,iBAAiB,WAAA,EAAa,OAAA,EAAS,oBAAA,GAAuB,aAAA,EAAe,gBAAgB,KAAA,EAAO;AACtH,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AACpC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA;AACzC,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,QAAA,GAAW,IAAA;AACf,EAAA,IAAI,CAAC,aAAA,IAAiB,MAAA,KAAW,cAAA,EAAgB;AAC7C,IAAA,QAAA,GAAW,MAAM,QAAQ,IAAA,CAAK;AAAA,MAC1B,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AACrB,QAAA,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,oBAAoB,CAAC,CAAC,CAAA;AAAA,MAC5G,CAAC,CAAA;AAAA,MACD,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AACrB,QAAA,WAAA,CAAY,EAAA,CAAG,YAAY,MAAM;AAC7B,UAAA,MAAA,CAAO,aAAa,SAAS,CAAA;AAC7B,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QAChB,CAAC,CAAA;AACD,QAAA,WAAA,CAAY,EAAA,CAAG,YAAY,MAAM;AAC7B,UAAA,MAAA,CAAO,aAAa,SAAS,CAAA;AAC7B,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACjB,CAAC,CAAA;AACD,QAAA,WAAA,CAAY,EAAA,CAAG,SAAS,MAAM;AAC1B,UAAA,MAAA,CAAO,aAAa,SAAS,CAAA;AAC7B,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACjB,CAAC,CAAA;AAAA,MACL,CAAC;AAAA,KACJ,CAAA;AAAA,EACL;AACA,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,SAAA,CAAU,WAAA,EAAa,QAAQ,IAAI,CAAA;AAAA,EACvC;AACJ;AACA,SAAS,SAAA,CAAU,aAAa,IAAA,EAAM;AAClC,EAAA,IAAI,gBAAgBC,eAAA,EAAU;AAC1B,IAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AACrB,IAAA;AAAA,EACJ;AACA,EAAA,IAAI,IAAA,EAAM;AACN,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA;AACjC,IAAA,IAAI,YAAY,QAAA,EAAU;AACtB,MAAA,IAAI,QAAA,IAAY,IAAA,CAAK,UAAA,KAAe,CAAA,EAAG;AACnC,QAAA,WAAA,CAAY,GAAA,EAAI;AAAA,MACpB,CAAA,MACK;AACD,QAAA,WAAA,CAAY,IAAI,IAAI,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA;AACd,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,CAAM,MAAA,IACN,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,IAC5B,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,EAAU;AACtC,MAAA,WAAA,CAAY,GAAA,CAAI,OAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,UAAU,CAAC,CAAA;AAC7E,MAAA;AAAA,IACJ;AACA,IAAA,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AACjC,IAAA;AAAA,EACJ;AACA,EAAA,WAAA,CAAY,GAAA,EAAI;AACpB;AA9DA,IAEM,aAAA;AAFN,IAAA,uBAAA,GAAAJ,uBAAA,CAAA;AAAA,EAAA,sEAAA,GAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAM,aAAA,GAAgB,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACFtB,IAYa,uBAAA,EACT,QACA,QAAA,EACS,eAAA;AAfb,IAAA,sBAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,qEAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AACA,IAAAC,aAAAA,EAAAA;AAEA,IAAA,sBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,4BAAA,EAAA;AACA,IAAA,2BAAA,EAAA;AACA,IAAA,wBAAA,EAAA;AACA,IAAA,0BAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACO,IAAM,uBAAA,GAA0B,CAAA;AACvC,IAAI,MAAA,GAAS,MAAA;AACb,IAAI,QAAA,GAAW,MAAA;AACR,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,MACzB,MAAA;AAAA,MACA,cAAA;AAAA,MACA,sBAAA,GAAyB,CAAA;AAAA,MACzB,aAAA,GAAgB,KAAA;AAAA,MAChB,QAAA,GAAW,EAAE,eAAA,EAAiB,UAAA,EAAW;AAAA,MACzC,OAAO,OAAO,iBAAA,EAAmB;AAC7B,QAAA,IAAI,OAAO,iBAAA,EAAmB,MAAA,KAAW,UAAA,EAAY;AACjD,UAAA,OAAO,iBAAA;AAAA,QACX;AACA,QAAA,OAAO,IAAI,iBAAgB,iBAAiB,CAAA;AAAA,MAChD;AAAA,MACA,OAAO,gBAAA,CAAiB,KAAA,EAAO,sBAAA,EAAwB,SAAS,OAAA,EAAS;AACrE,QAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,UAAA,EAAW,GAAI,KAAA;AAC1C,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,QAAA,EAAU;AAC3D,UAAA,OAAO,sBAAA;AAAA,QACX;AACA,QAAA,MAAM,QAAA,GAAW,IAAA;AACjB,QAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,GAAW,sBAAA,EAAwB;AAChD,UAAA,OAAO,sBAAA;AAAA,QACX;AACA,QAAA,IAAI,WAAW,QAAA,EAAU;AACrB,UAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC1B,YAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,MAAM,CAAA,EAAG,MAAA,IAAU,CAAA;AAChD,YAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,MAAM,CAAA,EAAG,MAAA,IAAU,CAAA;AACrD,YAAA,IAAI,YAAA,IAAgB,UAAA,IAAc,gBAAA,IAAoB,CAAA,GAAI,UAAA,EAAY;AAClE,cAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,0DAAA,EAA6D,YAAY,CAAA,KAAA,EAAQ,gBAAgB,CAAA;AAAA;AAAA,mFAAA,CAEhD,CAAA;AAChE,cAAA,OAAO,KAAK,GAAA,EAAI;AAAA,YACpB;AAAA,UACJ;AAAA,QACJ;AACA,QAAA,OAAO,sBAAA;AAAA,MACX;AAAA,MACA,YAAY,OAAA,EAAS;AACjB,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,OAAA,CAAQ,CAAC,SAAS,MAAA,KAAW;AACnD,UAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AAC/B,YAAA,OAAA,EAAQ,CACH,IAAA,CAAK,CAAC,QAAA,KAAa;AACpB,cAAA,OAAA,CAAQ,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAC,CAAA;AAAA,YAC/C,CAAC,CAAA,CACI,KAAA,CAAM,MAAM,CAAA;AAAA,UACrB,CAAA,MACK;AACD,YAAA,OAAA,CAAQ,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAAA,UAC9C;AAAA,QACJ,CAAC,CAAA;AAAA,MACL;AAAA,MACA,OAAA,GAAU;AACN,QAAA,IAAA,CAAK,MAAA,EAAQ,WAAW,OAAA,EAAQ;AAChC,QAAA,IAAA,CAAK,MAAA,EAAQ,YAAY,OAAA,EAAQ;AAAA,MACrC;AAAA,MACA,MAAM,OAAO,OAAA,EAAS,EAAE,aAAa,cAAA,EAAe,GAAI,EAAC,EAAG;AACxD,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,UAAA,IAAA,CAAK,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA;AAAA,QAC7B;AACA,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,KAAa,QAAA;AACnC,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,OAAO,SAAA,EAAW;AAClC,UAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,MAAM,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAAA,QAChE;AACA,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,QAAA,EAAU,OAAA,KAAY;AACtC,UAAA,IAAI,uBAAA,GAA0B,MAAA;AAC9B,UAAA,MAAM,WAAW,EAAC;AAClB,UAAA,MAAM,OAAA,GAAU,OAAO,GAAA,KAAQ;AAC3B,YAAA,MAAM,uBAAA;AACN,YAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,YAAY,CAAA;AACpC,YAAA,QAAA,CAAS,GAAG,CAAA;AAAA,UAChB,CAAA;AACA,UAAA,MAAM,MAAA,GAAS,OAAO,GAAA,KAAQ;AAC1B,YAAA,MAAM,uBAAA;AACN,YAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,YAAY,CAAA;AACpC,YAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,UACf,CAAA;AACA,UAAA,IAAI,aAAa,OAAA,EAAS;AACtB,YAAA,MAAM,UAAA,GAAa,gBAAgB,WAAW,CAAA;AAC9C,YAAA,MAAA,CAAO,UAAU,CAAA;AACjB,YAAA;AAAA,UACJ;AACA,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AACpC,UAAA,MAAM,cAAA,GAAA,CAAkB,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,MAAY,cAAA;AAC9D,UAAA,IAAI,KAAA,GAAQ,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,SAAA;AAC/C,UAAA,IAAI,cAAA,IAAkB,CAAC,IAAA,CAAK,aAAA,EAAe;AACvC,YAAA,KAAA,GAAQ,KAAK,KAAA,GAAQI,WAAA,GAAU,MAAA,EAAQ;AAAA,cACnC,SAAA,EAAW,KAAA;AAAA,cACX,UAAA,EAAY;AAAA,aACf,CAAA;AAAA,UACL;AACA,UAAA,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,MAAM;AAClC,YAAA,IAAA,CAAK,yBAAyB,gBAAA,CAAgB,gBAAA,CAAiB,OAAO,IAAA,CAAK,sBAAA,EAAwB,OAAO,MAAM,CAAA;AAAA,UACpH,CAAA,EAAG,OAAO,+BAAA,IAAA,CAAoC,MAAA,CAAO,kBAAkB,GAAA,KAAS,MAAA,CAAO,iBAAA,IAAqB,GAAA,CAAK,CAAC,CAAA;AAClH,UAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AACxD,UAAA,IAAI,IAAA,GAAO,MAAA;AACX,UAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,EAAM;AACtD,YAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,YAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,YAAA,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,UAClC;AACA,UAAA,IAAIC,QAAO,OAAA,CAAQ,IAAA;AACnB,UAAA,IAAI,WAAA,EAAa;AACb,YAAAA,KAAAA,IAAQ,IAAI,WAAW,CAAA,CAAA;AAAA,UAC3B;AACA,UAAA,IAAI,QAAQ,QAAA,EAAU;AAClB,YAAAA,KAAAA,IAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,UAChC;AACA,UAAA,IAAI,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACnC,UAAA,IAAI,SAAS,CAAC,CAAA,KAAM,OAAO,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/C,YAAA,QAAA,GAAW,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,UAC3C,CAAA,MACK;AACD,YAAA,QAAA,GAAW,OAAA,CAAQ,QAAA;AAAA,UACvB;AACA,UAAA,MAAM,gBAAA,GAAmB;AAAA,YACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,IAAA,EAAM,QAAA;AAAA,YACN,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,IAAA,EAAAA,KAAAA;AAAA,YACA,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,KAAA;AAAA,YACA;AAAA,WACJ;AACA,UAAA,MAAM,WAAA,GAAc,QAAQC,aAAA,GAAY,QAAA;AACxC,UAAA,MAAM,GAAA,GAAM,WAAA,CAAY,gBAAA,EAAkB,CAAC,GAAA,KAAQ;AAC/C,YAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,cAClC,UAAA,EAAY,IAAI,UAAA,IAAc,EAAA;AAAA,cAC9B,QAAQ,GAAA,CAAI,aAAA;AAAA,cACZ,OAAA,EAAS,qBAAA,CAAsB,GAAA,CAAI,OAAO,CAAA;AAAA,cAC1C,IAAA,EAAM;AAAA,aACT,CAAA;AACD,YAAA,OAAA,CAAQ,EAAE,QAAA,EAAU,YAAA,EAAc,CAAA;AAAA,UACtC,CAAC,CAAA;AACD,UAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACrB,YAAA,IAAI,0BAAA,CAA2B,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/C,cAAA,MAAA,CAAO,OAAO,MAAA,CAAO,GAAA,EAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAC,CAAA;AAAA,YACvD,CAAA,MACK;AACD,cAAA,MAAA,CAAO,GAAG,CAAA;AAAA,YACd;AAAA,UACJ,CAAC,CAAA;AACD,UAAA,IAAI,WAAA,EAAa;AACb,YAAA,MAAM,UAAU,MAAM;AAClB,cAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,cAAA,MAAM,UAAA,GAAa,gBAAgB,WAAW,CAAA;AAC9C,cAAA,MAAA,CAAO,UAAU,CAAA;AAAA,YACrB,CAAA;AACA,YAAA,IAAI,OAAO,WAAA,CAAY,gBAAA,KAAqB,UAAA,EAAY;AACpD,cAAA,MAAM,MAAA,GAAS,WAAA;AACf,cAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACxD,cAAA,GAAA,CAAI,KAAK,OAAA,EAAS,MAAM,OAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,YACxE,CAAA,MACK;AACD,cAAA,WAAA,CAAY,OAAA,GAAU,OAAA;AAAA,YAC1B;AAAA,UACJ;AACA,UAAA,MAAM,uBAAA,GAA0B,kBAAkB,MAAA,CAAO,cAAA;AACzD,UAAA,QAAA,CAAS,KAAK,oBAAA,CAAqB,GAAA,EAAK,MAAA,EAAQ,MAAA,CAAO,iBAAiB,CAAC,CAAA;AACzE,UAAA,QAAA,CAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,MAAA,EAAQ,uBAAA,EAAyB,OAAO,qBAAA,EAAuB,MAAA,CAAO,MAAA,IAAU,OAAO,CAAC,CAAA;AAC7H,UAAA,QAAA,CAAS,KAAK,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,MAAA,CAAO,aAAa,CAAC,CAAA;AACjE,UAAA,MAAM,YAAY,gBAAA,CAAiB,KAAA;AACnC,UAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,WAAA,IAAe,SAAA,EAAW;AAC3D,YAAA,QAAA,CAAS,IAAA,CAAK,mBAAmB,GAAA,EAAK;AAAA,cAClC,WAAW,SAAA,CAAU,SAAA;AAAA,cACrB,gBAAgB,SAAA,CAAU;AAAA,aAC7B,CAAC,CAAA;AAAA,UACN;AACA,UAAA,uBAAA,GAA0B,gBAAA,CAAiB,KAAK,OAAA,EAAS,uBAAA,EAAyB,KAAK,aAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AAC/G,YAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,YAAY,CAAA;AACpC,YAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,UACpB,CAAC,CAAA;AAAA,QACL,CAAC,CAAA;AAAA,MACL;AAAA,MACA,sBAAA,CAAuB,KAAK,KAAA,EAAO;AAC/B,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,CAAC,MAAA,KAAW;AACvD,UAAA,OAAO;AAAA,YACH,GAAG,MAAA;AAAA,YACH,CAAC,GAAG,GAAG;AAAA,WACX;AAAA,QACJ,CAAC,CAAA;AAAA,MACL;AAAA,MACA,kBAAA,GAAqB;AACjB,QAAA,OAAO,IAAA,CAAK,UAAU,EAAC;AAAA,MAC3B;AAAA,MACA,qBAAqB,OAAA,EAAS;AAC1B,QAAA,MAAM,EAAE,cAAA,EAAgB,iBAAA,EAAmB,aAAA,EAAe,+BAAA,EAAiC,SAAA,EAAW,UAAA,EAAY,qBAAA,EAAuB,MAAA,EAAQ,GAAI,OAAA,IAAW,EAAC;AACjK,QAAA,MAAM,SAAA,GAAY,IAAA;AAClB,QAAA,MAAM,UAAA,GAAa,EAAA;AACnB,QAAA,OAAO;AAAA,UACH,iBAAA;AAAA,UACA,cAAA;AAAA,UACA,aAAA;AAAA,UACA,+BAAA;AAAA,UACA,qBAAA;AAAA,UACA,mBAAmB,YAAY;AAC3B,YAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,MAAM,OAAO,MAAW,CAAA;AACnD,YAAA,QAAA,GAAW,OAAA;AACX,YAAA,MAAA,GAAS,KAAA;AACT,YAAA,IAAI,SAAA,YAAqB,MAAA,IAAU,OAAO,SAAA,EAAW,YAAY,UAAA,EAAY;AACzE,cAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,cAAA,OAAO,SAAA;AAAA,YACX;AACA,YAAA,OAAO,IAAI,MAAA,CAAO,EAAE,WAAW,UAAA,EAAY,GAAG,WAAW,CAAA;AAAA,UAC7D,CAAA;AAAA,UACA,aAAa,MAAM;AACf,YAAA,IAAI,UAAA,YAAsBF,WAAA,IAAW,OAAO,UAAA,EAAY,YAAY,UAAA,EAAY;AAC5E,cAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,cAAA,OAAO,UAAA;AAAA,YACX;AACA,YAAA,OAAO,IAAIA,WAAA,CAAQ,EAAE,WAAW,UAAA,EAAY,GAAG,YAAY,CAAA;AAAA,UAC/D,CAAA,GAAG;AAAA,UACH;AAAA,SACJ;AAAA,MACJ;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrOA,IAAa,uBAAA;AAAb,IAAA,+BAAA,GAAAL,uBAAA,CAAA;AAAA,EAAA,8EAAA,GAAA;AAAO,IAAM,0BAAN,MAA8B;AAAA,MACjC,WAAW,EAAC;AAAA,MACZ,YAAY,QAAA,EAAU;AAClB,QAAA,IAAA,CAAK,QAAA,GAAW,YAAY,EAAC;AAAA,MACjC;AAAA,MACA,IAAA,GAAO;AACH,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC1B,UAAA,OAAO,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,QAC/B;AAAA,MACJ;AAAA,MACA,UAAU,OAAA,EAAS;AACf,QAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MAC9B;AAAA,MACA,SAAS,OAAA,EAAS;AACd,QAAA,OAAO,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA;AAAA,MACzC;AAAA,MACA,OAAO,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,MAAM,OAAO,CAAA;AAAA,MAC7D;AAAA,MACA,CAAC,MAAA,CAAO,QAAQ,CAAA,GAAI;AAChB,QAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA,MAC1C;AAAA,MACA,QAAQ,UAAA,EAAY;AAChB,QAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACjC,UAAA,IAAI,YAAY,UAAA,EAAY;AACxB,YAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACpB,cAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,YACpB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;AC/BA,IAEa,0BAAA;AAFb,IAAA,kCAAA,GAAAA,uBAAA,CAAA;AAAA,EAAA,iFAAA,GAAA;AACA,IAAA,+BAAA,EAAA;AACO,IAAM,6BAAN,MAAiC;AAAA,MACpC,YAAY,MAAA,EAAQ;AAChB,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAI,KAAK,MAAA,CAAO,cAAA,IAAkB,IAAA,CAAK,MAAA,CAAO,kBAAkB,CAAA,EAAG;AAC/D,UAAA,MAAM,IAAI,WAAW,2CAA2C,CAAA;AAAA,QACpE;AAAA,MACJ;AAAA,MACA,MAAA;AAAA,MACA,YAAA,uBAAmB,GAAA,EAAI;AAAA,MACvB,KAAA,CAAM,gBAAgB,uBAAA,EAAyB;AAC3C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,cAAc,CAAA;AAC5C,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAC9C,QAAA,IAAI,YAAA,EAAc;AACd,UAAA,MAAM,eAAA,GAAkB,aAAa,IAAA,EAAK;AAC1C,UAAA,IAAI,eAAA,IAAmB,CAAC,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAoB;AACpD,YAAA,OAAO,eAAA;AAAA,UACX;AAAA,QACJ;AACA,QAAA,MAAM,OAAA,GAAUQ,sBAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,OAAO,cAAA,EAAgB;AAC5B,UAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,oBAAA,EAAsB,IAAA,CAAK,OAAO,cAAA,EAAe,EAAG,CAAC,GAAA,KAAQ;AAC5E,YAAA,IAAI,GAAA,EAAK;AACL,cAAA,MAAM,IAAI,KAAA,CAAM,sCAAA,GACZ,IAAA,CAAK,MAAA,CAAO,iBACZ,gCAAA,GACA,cAAA,CAAe,WAAA,CAAY,QAAA,EAAU,CAAA;AAAA,YAC7C;AAAA,UACJ,CAAC,CAAA;AAAA,QACL;AACA,QAAA,OAAA,CAAQ,KAAA,EAAM;AACd,QAAA,MAAM,mBAAmB,MAAM;AAC3B,UAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,UAAA,IAAA,CAAK,aAAA,CAAc,KAAK,OAAO,CAAA;AAAA,QACnC,CAAA;AACA,QAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,gBAAgB,CAAA;AACrC,QAAA,OAAA,CAAQ,EAAA,CAAG,SAAS,gBAAgB,CAAA;AACpC,QAAA,OAAA,CAAQ,EAAA,CAAG,cAAc,gBAAgB,CAAA;AACzC,QAAA,OAAA,CAAQ,GAAG,OAAA,EAAS,MAAM,KAAK,aAAA,CAAc,GAAA,EAAK,OAAO,CAAC,CAAA;AAC1D,QAAA,IAAI,wBAAwB,cAAA,EAAgB;AACxC,UAAA,OAAA,CAAQ,UAAA,CAAW,uBAAA,CAAwB,cAAA,EAAgB,gBAAgB,CAAA;AAAA,QAC/E;AACA,QAAA,MAAM,iBAAiB,IAAA,CAAK,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,IAAI,uBAAA,EAAwB;AACjF,QAAA,cAAA,CAAe,UAAU,OAAO,CAAA;AAChC,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,cAAc,CAAA;AACzC,QAAA,OAAO,OAAA;AAAA,MACX;AAAA,MACA,aAAA,CAAc,WAAW,OAAA,EAAS;AAC9B,QAAA,MAAM,sBAAA,GAAyB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AAC9D,QAAA,IAAI,CAAC,sBAAA,EAAwB;AACzB,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,CAAC,sBAAA,CAAuB,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3C,UAAA;AAAA,QACJ;AACA,QAAA,sBAAA,CAAuB,OAAO,OAAO,CAAA;AACrC,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,sBAAsB,CAAA;AAAA,MAC3D;AAAA,MACA,OAAA,CAAQ,gBAAgB,OAAA,EAAS;AAC7B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,cAAc,CAAA;AACjD,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG,UAAU,OAAO,CAAA;AAAA,MACtD;AAAA,MACA,OAAA,GAAU;AACN,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,cAAc,CAAA,IAAK,KAAK,YAAA,EAAc;AACnD,UAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AAClC,YAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACpB,cAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,YACpB;AACA,YAAA,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA,UACjC;AACA,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,GAAG,CAAA;AAAA,QAChC;AAAA,MACJ;AAAA,MACA,wBAAwB,oBAAA,EAAsB;AAC1C,QAAA,IAAI,oBAAA,IAAwB,wBAAwB,CAAA,EAAG;AACnD,UAAA,MAAM,IAAI,WAAW,iDAAiD,CAAA;AAAA,QAC1E;AACA,QAAA,IAAA,CAAK,OAAO,cAAA,GAAiB,oBAAA;AAAA,MACjC;AAAA,MACA,4BAA4B,wBAAA,EAA0B;AAClD,QAAA,IAAA,CAAK,OAAO,kBAAA,GAAqB,wBAAA;AAAA,MACrC;AAAA,MACA,aAAa,OAAA,EAAS;AAClB,QAAA,OAAO,OAAA,CAAQ,YAAY,QAAA,EAAS;AAAA,MACxC;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;ACtFA,IAOa,gBAAA;AAPb,IAAA,uBAAA,GAAAR,uBAAA,CAAA;AAAA,EAAA,sEAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AACA,IAAAC,aAAAA,EAAAA;AAEA,IAAA,sBAAA,EAAA;AACA,IAAA,4BAAA,EAAA;AACA,IAAA,kCAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,MAC1B,MAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA,GAAW,EAAE,eAAA,EAAiB,IAAA,EAAK;AAAA,MACnC,iBAAA,GAAoB,IAAI,0BAAA,CAA2B,EAAE,CAAA;AAAA,MACrD,OAAO,OAAO,iBAAA,EAAmB;AAC7B,QAAA,IAAI,OAAO,iBAAA,EAAmB,MAAA,KAAW,UAAA,EAAY;AACjD,UAAA,OAAO,iBAAA;AAAA,QACX;AACA,QAAA,OAAO,IAAI,kBAAiB,iBAAiB,CAAA;AAAA,MACjD;AAAA,MACA,YAAY,OAAA,EAAS;AACjB,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,OAAA,CAAQ,CAAC,SAAS,MAAA,KAAW;AACnD,UAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AAC/B,YAAA,OAAA,EAAQ,CACH,IAAA,CAAK,CAAC,IAAA,KAAS;AAChB,cAAA,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AAAA,YACtB,CAAC,CAAA,CACI,KAAA,CAAM,MAAM,CAAA;AAAA,UACrB,CAAA,MACK;AACD,YAAA,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAAA,UACzB;AAAA,QACJ,CAAC,CAAA;AAAA,MACL;AAAA,MACA,OAAA,GAAU;AACN,QAAA,IAAA,CAAK,kBAAkB,OAAA,EAAQ;AAAA,MACnC;AAAA,MACA,MAAM,OAAO,OAAA,EAAS,EAAE,aAAa,cAAA,EAAe,GAAI,EAAC,EAAG;AACxD,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,UAAA,IAAA,CAAK,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA;AACzB,UAAA,IAAA,CAAK,iBAAA,CAAkB,2BAAA,CAA4B,IAAA,CAAK,MAAA,CAAO,4BAA4B,KAAK,CAAA;AAChG,UAAA,IAAI,IAAA,CAAK,OAAO,oBAAA,EAAsB;AAClC,YAAA,IAAA,CAAK,iBAAA,CAAkB,uBAAA,CAAwB,IAAA,CAAK,MAAA,CAAO,oBAAoB,CAAA;AAAA,UACnF;AAAA,QACJ;AACA,QAAA,MAAM,EAAE,cAAA,EAAgB,oBAAA,EAAsB,wBAAA,KAA6B,IAAA,CAAK,MAAA;AAChF,QAAA,MAAM,0BAA0B,cAAA,IAAkB,oBAAA;AAClD,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,QAAA,EAAU,OAAA,KAAY;AACtC,UAAA,IAAI,SAAA,GAAY,KAAA;AAChB,UAAA,IAAI,uBAAA,GAA0B,MAAA;AAC9B,UAAA,MAAM,OAAA,GAAU,OAAO,GAAA,KAAQ;AAC3B,YAAA,MAAM,uBAAA;AACN,YAAA,QAAA,CAAS,GAAG,CAAA;AAAA,UAChB,CAAA;AACA,UAAA,MAAM,MAAA,GAAS,OAAO,GAAA,KAAQ;AAC1B,YAAA,MAAM,uBAAA;AACN,YAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,UACf,CAAA;AACA,UAAA,IAAI,aAAa,OAAA,EAAS;AACtB,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA,MAAM,UAAA,GAAa,gBAAgB,WAAW,CAAA;AAC9C,YAAA,MAAA,CAAO,UAAU,CAAA;AACjB,YAAA;AAAA,UACJ;AACA,UAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,OAAM,GAAI,OAAA;AACpD,UAAA,IAAI,IAAA,GAAO,EAAA;AACX,UAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,EAAM;AACtD,YAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,YAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,YAAA,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,UAClC;AACA,UAAA,MAAM,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAC1E,UAAA,MAAM,iBAAiB,EAAE,WAAA,EAAa,IAAI,GAAA,CAAI,SAAS,CAAA,EAAE;AACzD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,cAAA,EAAgB;AAAA,YACzD,cAAA,EAAgB,KAAK,MAAA,EAAQ,cAAA;AAAA,YAC7B,0BAA0B,wBAAA,IAA4B;AAAA,WACzD,CAAA;AACD,UAAA,MAAM,iBAAA,GAAoB,CAAC,GAAA,KAAQ;AAC/B,YAAA,IAAI,wBAAA,EAA0B;AAC1B,cAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,YAC/B;AACA,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA,MAAA,CAAO,GAAG,CAAA;AAAA,UACd,CAAA;AACA,UAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,KAAA,IAAS,EAAE,CAAA;AAChD,UAAA,IAAIK,QAAO,OAAA,CAAQ,IAAA;AACnB,UAAA,IAAI,WAAA,EAAa;AACb,YAAAA,KAAAA,IAAQ,IAAI,WAAW,CAAA,CAAA;AAAA,UAC3B;AACA,UAAA,IAAI,QAAQ,QAAA,EAAU;AAClB,YAAAA,KAAAA,IAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,UAChC;AACA,UAAA,MAAM,GAAA,GAAM,QAAQ,OAAA,CAAQ;AAAA,YACxB,GAAG,OAAA,CAAQ,OAAA;AAAA,YACX,CAACG,eAAA,CAAU,iBAAiB,GAAGH,KAAAA;AAAA,YAC/B,CAACG,eAAA,CAAU,mBAAmB,GAAG;AAAA,WACpC,CAAA;AACD,UAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,UAAA,GAAA,CAAI,EAAA,CAAG,UAAA,EAAY,CAAC,OAAA,KAAY;AAC5B,YAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,cAClC,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA,IAAK,EAAA;AAAA,cAClC,OAAA,EAAS,sBAAsB,OAAO,CAAA;AAAA,cACtC,IAAA,EAAM;AAAA,aACT,CAAA;AACD,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA,OAAA,CAAQ,EAAE,QAAA,EAAU,YAAA,EAAc,CAAA;AAClC,YAAA,IAAI,wBAAA,EAA0B;AAC1B,cAAA,OAAA,CAAQ,KAAA,EAAM;AACd,cAAA,IAAA,CAAK,iBAAA,CAAkB,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA;AAAA,YAC3D;AAAA,UACJ,CAAC,CAAA;AACD,UAAA,IAAI,uBAAA,EAAyB;AACzB,YAAA,GAAA,CAAI,UAAA,CAAW,yBAAyB,MAAM;AAC1C,cAAA,GAAA,CAAI,KAAA,EAAM;AACV,cAAA,MAAM,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA+C,uBAAuB,CAAA,GAAA,CAAK,CAAA;AAC1G,cAAA,YAAA,CAAa,IAAA,GAAO,cAAA;AACpB,cAAA,iBAAA,CAAkB,YAAY,CAAA;AAAA,YAClC,CAAC,CAAA;AAAA,UACL;AACA,UAAA,IAAI,WAAA,EAAa;AACb,YAAA,MAAM,UAAU,MAAM;AAClB,cAAA,GAAA,CAAI,KAAA,EAAM;AACV,cAAA,MAAM,UAAA,GAAa,gBAAgB,WAAW,CAAA;AAC9C,cAAA,iBAAA,CAAkB,UAAU,CAAA;AAAA,YAChC,CAAA;AACA,YAAA,IAAI,OAAO,WAAA,CAAY,gBAAA,KAAqB,UAAA,EAAY;AACpD,cAAA,MAAM,MAAA,GAAS,WAAA;AACf,cAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACxD,cAAA,GAAA,CAAI,KAAK,OAAA,EAAS,MAAM,OAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,YACxE,CAAA,MACK;AACD,cAAA,WAAA,CAAY,OAAA,GAAU,OAAA;AAAA,YAC1B;AAAA,UACJ;AACA,UAAA,GAAA,CAAI,EAAA,CAAG,YAAA,EAAc,CAAC,IAAA,EAAM,MAAM,EAAA,KAAO;AACrC,YAAA,iBAAA,CAAkB,IAAI,MAAM,CAAA,cAAA,EAAiB,IAAI,iBAAiB,EAAE,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,UACzG,CAAC,CAAA;AACD,UAAA,GAAA,CAAI,EAAA,CAAG,SAAS,iBAAiB,CAAA;AACjC,UAAA,GAAA,CAAI,EAAA,CAAG,WAAW,MAAM;AACpB,YAAA,iBAAA,CAAkB,IAAI,KAAA,CAAM,CAAA,0EAAA,EAA6E,GAAA,CAAI,OAAO,GAAG,CAAC,CAAA;AAAA,UAC5H,CAAC,CAAA;AACD,UAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM;AAClB,YAAA,OAAA,CAAQ,KAAA,EAAM;AACd,YAAA,IAAI,wBAAA,EAA0B;AAC1B,cAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,YACpB;AACA,YAAA,IAAI,CAAC,SAAA,EAAW;AACZ,cAAA,iBAAA,CAAkB,IAAI,KAAA,CAAM,wDAAwD,CAAC,CAAA;AAAA,YACzF;AAAA,UACJ,CAAC,CAAA;AACD,UAAA,uBAAA,GAA0B,gBAAA,CAAiB,GAAA,EAAK,OAAA,EAAS,uBAAuB,CAAA;AAAA,QACpF,CAAC,CAAA;AAAA,MACL;AAAA,MACA,sBAAA,CAAuB,KAAK,KAAA,EAAO;AAC/B,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,CAAC,MAAA,KAAW;AACvD,UAAA,OAAO;AAAA,YACH,GAAG,MAAA;AAAA,YACH,CAAC,GAAG,GAAG;AAAA,WACX;AAAA,QACJ,CAAC,CAAA;AAAA,MACL;AAAA,MACA,kBAAA,GAAqB;AACjB,QAAA,OAAO,IAAA,CAAK,UAAU,EAAC;AAAA,MAC3B;AAAA,MACA,eAAe,OAAA,EAAS;AACpB,QAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACpB,UAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,QACpB;AAAA,MACJ;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;ACxKA,IACa,SAAA;AADb,IAAA,cAAA,GAAAT,uBAAA,CAAA;AAAA,EAAA,8EAAA,GAAA;AACO,IAAM,SAAA,GAAN,cAAwBU,eAAA,CAAS;AAAA,MACpC,gBAAgB,EAAC;AAAA,MACjB,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,aAAA,CAAc,KAAK,KAAK,CAAA;AAC7B,QAAA,QAAA,EAAS;AAAA,MACb;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACaA,eAAe,sBAAsB,MAAA,EAAQ;AACzC,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,OAAO,CAAC,MAAA,EAAQ;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,IACpB;AACA,IAAA,MAAA,GAAS,IAAA;AAAA,EACb;AACA,EAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,MAAM,CAAA;AACvC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,SAAA,CAAU,GAAA,CAAI,OAAO,MAAM,CAAA;AAC3B,IAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,EACpB;AACA,EAAA,OAAO,SAAA;AACX;AAxCA,IACa,eAAA,EAkBP,wBAAA;AAnBN,IAAA,qBAAA,GAAAV,uBAAA,CAAA;AAAA,EAAA,0EAAA,GAAA;AAAA,IAAA,cAAA,EAAA;AACO,IAAM,eAAA,GAAkB,CAAC,MAAA,KAAW;AACvC,MAAA,IAAI,wBAAA,CAAyB,MAAM,CAAA,EAAG;AAClC,QAAA,OAAO,sBAAsB,MAAM,CAAA;AAAA,MACvC;AACA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACpC,QAAA,MAAM,SAAA,GAAY,IAAI,SAAA,EAAU;AAChC,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,QAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACxB,UAAA,SAAA,CAAU,GAAA,EAAI;AACd,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACd,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,EAAA,CAAG,SAAS,MAAM,CAAA;AAC5B,QAAA,SAAA,CAAU,EAAA,CAAG,UAAU,WAAY;AAC/B,UAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,OAAO,MAAA,CAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AAC9D,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACjB,CAAC,CAAA;AAAA,MACL,CAAC,CAAA;AAAA,IACL,CAAA;AACA,IAAM,2BAA2B,CAAC,MAAA,KAAW,OAAO,cAAA,KAAmB,cAAc,MAAA,YAAkB,cAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnBvG,IAAA,eAAA,GAAA,EAAA;AAAAW,0BAAA,CAAA,eAAA,EAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAAAV,aAAAA,GAAAD,uBAAA,CAAA;AAAA,EAAA,yDAAA,GAAA;AAAA,IAAA,sBAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACA,IAAA,qBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACKO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EACxC,MAAA;AAAA,EAEP,YAAY,MAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,CAAA;AAAA,EAAqC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC9D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAMO,SAAS,mBAAmB,MAAA,EAAoC;AACrE,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAA,CAAO,KAAK,CAAA,uCAAA,CAAyC,CAAA;AAAA,EACvD,WAAW,CAAC,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,MAAA,CAAO,IAAI,CAAA,4CAAA,CAA8C,CAAA;AAAA,EAC3F;AAGA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,EACjE,CAAA,MAAO;AACL,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC7D,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,CAAC,QAAQ,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAC7D,MAAA,IAAI,OAAO,OAAA,KAAY,SAAA,IAAa,OAAO,YAAY,UAAA,EAAY;AACjE,QAAA,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,qBAAA,EAAwB,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAAA,MACtG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,KAAA,CAAO,UAAU,CAAA;AAC/E,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,MAAA,CAAO,IAAI,gDAAgD,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IAClH;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,OAAO,cAAA,EAAgB;AAChC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB;AAC7C,MAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,GAAG,CAAA;AAC1D,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,iDAAA,EAAoD,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,IAAI,OAAO,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,EAAG;AACzD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAC5E;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,IAAI,OAAO,QAAA,CAAS,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AAC/D,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,qCAAA,CAAuC,CAAA;AAAA,IAC/E;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,OAAO,CAAA;AAChE,IAAA,MAAM,mBAAmB,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,UAAU,CAAA;AACtE,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,6CAAA,CAA+C,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,+CAAA,CAAiD,CAAA;AAAA,IACzF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,eAAe,MAAA,EAAgC;AAC7D,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAA,CAAO,KAAK,CAAA,mCAAA,CAAqC,CAAA;AAAA,EACnD,WAAW,CAAC,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAI,CAAA,4CAAA,CAA8C,CAAA;AAAA,EACvF;AAGA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,EAC7D,CAAA,MAAO;AACL,IAAA,MAAM,cAAc,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACzE,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,cAAA,CAAe,QAAiB,OAAA,EAA2B;AACzE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AAGtB,IAAA,IAAI,KAAA,CAAM,SAAS,KAAA,IAAS,KAAA,CAAM,SAAS,aAAA,IAAiB,KAAA,CAAM,SAAS,MAAA,EAAQ;AAEjF,MAAA,IAAI,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ;AACrC,QAAA,MAAM,YAAA,GAAe,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AACzD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,UAAU,KAAA,EAAO;AAC1B,QAAA,KAAA,MAAW,GAAA,IAAQ,MAAc,IAAA,EAAM;AACrC,UAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AACpD,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,QAC1B;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,iBAAA,EAAoB,CAAC,CAAA,6BAAA,CAA+B,CAAA;AAC1E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/D;AACA,IAAA,UAAA,CAAW,IAAI,SAAS,CAAA;AAExB,IAAA,IAAI,CAAC,yBAAA,CAA0B,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,cAAA,EAAiB,SAAS,CAAA,uCAAA,CAAyC,CAAA;AAAA,IAC3F;AAGA,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAC3E,MAAA;AAAA,IACF;AAGA,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,cAAA;AACH,QAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,sBAAA,EAAyB,SAAS,CAAA,yBAAA,CAA2B,CAAA;AAAA,QACrF;AACA,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,uBAAA,CAAyB,CAAA;AAAA,QAC5E,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC1E,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,uBAAA,CAAyB,CAAA;AAAA,QAC5E,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC1E,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,uBAAA,CAAyB,CAAA;AAAA,QAC7E,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC1E,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MAEF,KAAK,QAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAChD,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAO,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,QAAA,EAAW,SAAS,CAAA,wBAAA,CAA0B,CAAA;AAAA,QACrF,CAAA,MAAO;AACL,UAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAW,EAAE,KAAK,CAAA;AACpD,UAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,MAAM,CAAA;AACnC,UAAA,IAAI,MAAA,CAAO,MAAA,KAAW,YAAA,CAAa,IAAA,EAAM;AACvC,YAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAO,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,QAAA,EAAW,SAAS,CAAA,6BAAA,CAA+B,CAAA;AAAA,UAC1F;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,yBAAA,CAA2B,CAAA;AAAA,QAC/E;AACA,QAAA;AAAA;AAIJ,IAAA,IAAI,SAAS,KAAA,IAAS,KAAA,IAAS,SAAU,KAAA,CAAc,GAAA,GAAO,MAAc,GAAA,EAAK;AAC/E,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAAA,IACzE;AAEA,IAAA,IAAI,eAAe,KAAA,IAAS,WAAA,IAAe,SAAU,KAAA,CAAc,SAAA,GAAa,MAAc,SAAA,EAAW;AACvG,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,sCAAA,CAAwC,CAAA;AAAA,IACrF;AAEA,IAAA,IAAI,aAAa,KAAA,IAAS,SAAA,IAAa,SAAU,KAAA,CAAc,OAAA,GAAW,MAAc,OAAA,EAAS;AAC/F,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,kCAAA,CAAoC,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,cAAA,CAAe,QAAiB,OAAA,EAA2B;AACzE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,oCAAA,CAAsC,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,CAAA,wBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,IAAI,CAAA;AAEpB,IAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,+BAAA,CAAiC,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACvE,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC3E,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,cAAA,CAAe,WAAA,EAAiC,OAAA,GAA0B,EAAC,EAAS;AAClG,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAG9B,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8B,UAAA,CAAW,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9D;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,EAC3B;AAGA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACtD;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,EACvB;AAGA,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,gBAAA,GAAmB,mBAAmB,UAAU,CAAA;AACtD,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAAA,EACjC;AAGA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,YAAA,GAAe,eAAe,MAAM,CAAA;AAC1C,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,EAC7B;AAGA,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,UAAA,CAAW,MAAA,EAAQ,WAAW,CAAA;AAC/E,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,kBAAkB,CAAA;AAAA,EACnC;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,sBAAsB,MAAM,CAAA;AAAA,EACxC;AACF;AAEA,SAAS,qBAAA,CAAsB,QAAiB,WAAA,EAA2C;AACzF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAE5D,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,IAAI,KAAA,CAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAU,CAAA;AACtF,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,EAAG;AAChC,UAAA,MAAA,CAAO,KAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,IAAI,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QAC5F;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,IAAI,KAAA,CAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAU,CAAA;AACtF,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,EAAG;AAChC,UAAA,MAAA,CAAO,KAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,IAAI,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ;AACrC,MAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,KAAA,CAAM,MAAA,EAAQ,WAAW,CAAA;AACpE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,KAAA,MAAW,GAAA,IAAQ,MAAc,IAAA,EAAM;AACrC,QAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,GAAA,CAAI,MAAA,EAAQ,WAAW,CAAA;AAC/D,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,KAAA,MAAW,KAAA,IAAU,MAAc,MAAA,EAAQ;AACzC,QAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,KAAA,CAAM,MAAA,EAAQ,WAAW,CAAA;AACnE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AC3UO,SAAS,WAAW,KAAA,EAA0B;AACnD,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,cAAA;AACH,MAAA,OAAO,kBAAkB,KAAK,CAAA;AAAA,IAChC,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,KAAA;AACH,MAAA,OAAO,SAAS,KAAK,CAAA;AAAA,IACvB,KAAK,aAAA;AACH,MAAA,OAAO,iBAAiB,KAAK,CAAA;AAAA,IAC/B,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB;AACE,MAAA,OAAOY,MAAE,GAAA,EAAI;AAAA;AAEnB;AAMA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqBA,MAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,GAAU,MAAA,CAAe,MAAM,IAAI,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,OAAA,EAAS,MAAA,GAAU,OAAe,KAAA,EAAM;AAC9D,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,KAAA,EAAO,MAAA,GAAU,OAAe,GAAA,EAAI;AAC1D,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,GAASA,KAAA,CAAE,MAAM,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,IAAI,MAAA,GAAqB,MAAM,OAAA,GAAUA,KAAA,CAAE,QAAO,CAAE,GAAA,EAAI,GAAIA,KAAA,CAAE,MAAA,EAAO;AACrE,EAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,WAAqB,MAAA,CAAe,GAAA,CAAI,MAAM,GAAG,CAAA;AACnE,EAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,WAAqB,MAAA,CAAe,GAAA,CAAI,MAAM,GAAG,CAAA;AACnE,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,MAAA,GAAU,MAAA,CAAe,MAAA;AAAA,MACvB,CAAC,GAAA,KAAgB,MAAA,CAAO,SAAA,CAAU,GAAA,GAAM,MAAM,IAAK,CAAA;AAAA,MACnD,CAAA,2BAAA,EAA8B,MAAM,IAAI,CAAA;AAAA,KAC1C;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,GAASA,KAAA,CAAE,MAAM,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,MAAA,GAAqBA,MAAE,OAAA,EAAQ;AACnC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqBA,KAAA,CACtB,MAAA,EAAO,CACP,OAAO,CAAC,GAAA,KAAQ,CAAC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,GAAG,qBAAqB,CAAA;AACjE,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,GAAU,MAAA,CAAe,MAAA;AAAA,MACvB,CAAC,QAAgB,IAAI,IAAA,CAAK,GAAG,CAAA,IAAK,IAAI,IAAA,CAAK,KAAA,CAAM,OAAQ,CAAA;AAAA,MACzD,CAAA,mBAAA,EAAsB,MAAM,OAAO,CAAA;AAAA,KACrC;AAAA,EACF;AACA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,GAAU,MAAA,CAAe,MAAA;AAAA,MACvB,CAAC,QAAgB,IAAI,IAAA,CAAK,GAAG,CAAA,IAAK,IAAI,IAAA,CAAK,KAAA,CAAM,OAAQ,CAAA;AAAA,MACzD,CAAA,oBAAA,EAAuB,MAAM,OAAO,CAAA;AAAA,KACtC;AAAA,EACF;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,MAAA,GAAqBA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,eAAe,CAAA;AACzD,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,SAAqBA,KAAA,CACtB,MAAA,EAAO,CACP,GAAA,CAAI,GAAG,wCAAwC,CAAA;AAClD,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,MAAA,GAAqBA,MAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,GAAA,KAAQ,IAAI,KAAK,CAAA;AACnD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,GAASA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,IAAA,CAAK,MAA+B,CAAC,CAAA;AAAA,EAC1D,CAAA,MAAO;AACL,IAAA,MAAA,GAASA,KAAA,CAAE,KAAK,MAA+B,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,GAAA,KAAQ,IAAI,KAAK,CAAA;AACnD,EAAA,IAAI,MAAA,GAAqBA,KAAA,CAAE,IAAA,CAAK,MAA+B,CAAA;AAC/D,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,MAAA,GAAqBA,MAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,MAAA,KAAW,KAAA;AACnB,IAAA,MAAA,GAAU,MAAA,CAAe,MAAM,mBAAmB,CAAA;AACpD,EAAA,IAAI,MAAM,MAAA,KAAW,KAAA;AACnB,IAAA,MAAA,GAAU,MAAA,CAAe,KAAA;AAAA,MACvB;AAAA,KACF;AACF,EAAA,IAAI,MAAM,MAAA,KAAW,KAAA;AACnB,IAAA,MAAA,GAAU,MAAA,CAAe,KAAA;AAAA,MACvB;AAAA,KACF;AACF,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,SAAqBA,KAAA,CAAE,KAAA;AAAA,IACzBA,MAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,MACf,IAAA,EAAMA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,KAAK,CAAA;AAAA,MACtB,UAAUA,KAAA,CAAE,KAAA,CAAMA,MAAE,GAAA,EAAK,EAAE,QAAA;AAAS,KACrC;AAAA,GACH;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,KAAK,CAAA;AACzC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqBA,MAAE,MAAA,EAAO;AAClC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,IAAI,MAAA,GAAqBA,MAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAASA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,MAAA,GAAqBA,MAAE,MAAA,EAAO;AAClC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,kBAAkB,KAAA,EAAsC;AAC/D,EAAA,IAAI,MAAA,GAAqBA,MAAE,MAAA,EAAO;AAClC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,EAAG;AACnC,IAAA,MAAA,GAASA,MAAE,MAAA,CAAO;AAAA,MAChB,UAAA,EAAYA,KAAA,CAAE,IAAA,CAAK,KAAA,CAAM,UAAmC,CAAA;AAAA,MAC5D,KAAA,EAAOA,MAAE,MAAA;AAAO,KACjB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,GAASA,KAAA,CAAE,MAAM,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAS,OAAO,QAAA,EAAS;AAC9C,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,MAAM,aAAaA,KAAA,CAAE,MAAA;AAAA,IACnB,MAAA,CAAO,WAAA;AAAA,MACL,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,MAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACxE,GACF;AACA,EAAA,IAAI,MAAA,GAAqBA,KAAA,CAAE,KAAA,CAAM,UAAU,CAAA;AAC3C,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,MAAM,SAASA,KAAA,CAAE,MAAA;AAAA,IACf,MAAA,CAAO,WAAA;AAAA,MACL,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,MAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACxE,GACF;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,OAAQ,OAAe,QAAA,EAAS;AACrD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,EAAC;AAChC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACzC,IAAA,OAAOA,MAAE,MAAA,CAAO;AAAA,MACd,SAAA,EAAWA,KAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,MAC/B,GAAG,MAAA,CAAO,WAAA;AAAA,QACR,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,MAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACxE,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,IAAI,SAAqBA,KAAA,CAAE,KAAA;AAAA,IACzBA,KAAA,CAAE,kBAAA,CAAmB,WAAA,EAAa,YAAmB;AAAA,GACvD;AACA,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAA6B;AAC7C,EAAA,MAAM,SAASA,KAAA,CAAE,MAAA;AAAA,IACf,MAAA,CAAO,WAAA;AAAA,MACL,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,MAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACxE,GACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,KAAA,EAAqC;AAC7D,EAAA,MAAM,SAASA,KAAA,CAAE,MAAA;AAAA,IACf,MAAA,CAAO,WAAA;AAAA,MACL,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,MAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACxE,GACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,MAAA,IAAI,EAAE,IAAA,EAAM;AACV,QAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAOA,KAAA,CAAE,OAAO,OAAO,CAAA;AACzB;AAMA,SAAS,mBAAA,CACP,QACA,QAAA,EAIY;AACZ,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACZ,OAAO,GAAA,KAAa;AAClB,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAK,EAAE,QAAA,EAAU,OAAO,CAAA;AACtD,MAAA,OAAO,MAAA,KAAW,IAAA;AAAA,IACpB,CAAA;AAAA,IACA;AAAA,MACE,OAAA,EAAS;AAAA;AACX,GACF;AACF;AAMO,SAAS,gBAAgB,UAAA,EAA0C;AACxE,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,KAAA,CAAM,WAAW,CAAA,GAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AACzC,IAAA,KAAA,CAAM,WAAW,CAAA,GAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,EAC3C;AAEA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,KAAA,CAAM,UAAU,CAAA,GAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,EAC1C;AAEA,EAAA,KAAA,CAAM,IAAI,CAAA,GAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAElC,EAAA,OAAOA,KAAA,CAAE,OAAO,KAAK,CAAA;AACvB;AAEO,SAAS,sBACd,UAAA,EACY;AACZ,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAOA,KAAA,CAAE,OAAO,KAAK,CAAA;AACvB;AAEO,SAAS,sBACd,UAAA,EACY;AACZ,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,MAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,EAAE,QAAA,EAAS;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,OAAOA,KAAA,CAAE,OAAO,KAAK,CAAA;AACvB;AAEO,SAAS,qBAAqB,UAAA,EAA0C;AAC7E,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAIA,KAAA,CACjB,MAAA,CAAO;AAAA,QACN,MAAA,EAAQA,KAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,QACzB,UAAA,EAAYA,KAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,QAC7B,IAAIA,KAAA,CAAE,KAAA,CAAMA,MAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,QAC9B,QAAQA,KAAA,CAAE,KAAA,CAAMA,MAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,QAClC,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAClC,kBAAA,EAAoBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACxC,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,eAAA,EAAiBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACrC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC1B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC9B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC9B,MAAA,EAAQA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,OAC9B,EACA,QAAA,EAAS;AAAA,IACd;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,GAAIA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,IAAA,CAAK,MAAMA,KAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,QAAA,EAAS;AAC/D,EAAA,KAAA,CAAM,IAAI,CAAA,GAAIA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,IAAA,CAAK,MAAMA,KAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,QAAA,EAAS;AAE9D,EAAA,OAAOA,KAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,EAAS;AAClC;AAMO,SAAS,YAAY,MAAA,EAAkC;AAC5D,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAI,CAAA,GAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAElC,EAAA,OAAOA,KAAA,CAAE,OAAO,KAAK,CAAA;AACvB;;;AC3cO,IAAM,WAAN,MAAe;AAAA,EACZ,WAAA,uBAAiD,GAAA,EAAI;AAAA,EACrD,OAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,UAA0B,EAAC;AAAA,EAC3B,WAAA,uBAA2C,GAAA,EAAI;AAAA,EAC/C,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA,EAMtB,cAAc,MAAA,EAAgC;AAC5C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,IAC9E;AAGA,IAAA,IAAI,WAAA,GAAc,EAAE,GAAG,MAAA,EAAO;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,QAAA,WAAA,GAAc,MAAA,CAAO,gBAAA,CAAiB,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,MACrE;AAAA,IACF;AAGA,IAAA,WAAA,CAAY,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAA;AAExD,IAAA,MAAM,MAAA,GAAS,mBAAmB,WAAW,CAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,IAAI,CAAA;AAAA,EACxC;AAAA,EAEA,eAAe,OAAA,EAAmC;AAChD,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,cAAc,IAAA,EAA4C;AACxD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,cAAA,GAAqC;AACnC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,kBAAA,GAA+B;AAC7B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,cAAc,IAAA,EAAuB;AACnC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,iBAAiB,IAAA,EAAuB;AACtC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,IACjF;AACA,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAA4B;AACpC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,WAAA,GAAc,EAAE,GAAG,MAAA,EAAO;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,WAAA,GAAc,MAAA,CAAO,YAAA,CAAa,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,MACjE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAC9C,IAAA,IAAA,CAAK,gBAAA,CAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,EACpD;AAAA,EAEA,WAAW,OAAA,EAA+B;AACxC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,UAAU,IAAA,EAAwC;AAChD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,UAAA,GAA6B;AAC3B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,cAAA,GAA2B;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,EACvC;AAAA,EAEA,UAAU,IAAA,EAAuB;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,aAAa,IAAA,EAAuB;AAClC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,IAC7E;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAA4B;AACpC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEA,UAAA,GAA6B;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,IAAA,EAA0B;AACrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACxC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,gBAAgB,UAAU,CAAA;AACzC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,OAAA,EAAU,IAAI,IAAI,MAAM,CAAA;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACrE;AAAA,EAEA,mBAAmB,IAAA,EAA0B;AAC3C,IAAA,MAAM,QAAA,GAAW,GAAG,IAAI,CAAA,OAAA,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,sBAAsB,UAAU,CAAA;AAC/C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACrC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAAA,EAEA,mBAAmB,IAAA,EAA0B;AAC3C,IAAA,MAAM,QAAA,GAAW,GAAG,IAAI,CAAA,OAAA,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,sBAAsB,UAAU,CAAA;AAC/C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACrC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAAA,EAEA,kBAAkB,IAAA,EAA0B;AAC1C,IAAA,MAAM,QAAA,GAAW,GAAG,IAAI,CAAA,MAAA,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,qBAAqB,UAAU,CAAA;AAC9C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACrC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAAA,EAEA,kBAAkB,KAAA,EAA0B;AAC1C,IAAA,OAAO,WAAW,KAAK,CAAA;AAAA,EACzB;AAAA,EAEQ,iBAAiB,IAAA,EAAoB;AAC3C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,MAAA,EAAmC;AAC5D,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA;AAGhC,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,QACb,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAA,CAAO,gBAAgB,CAAC,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,EAAG;AACnE,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAA,CAAO,cAAc,CAAC,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,EAAG;AAClE,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AACD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,UAAU,IAAA,EAAuB;AAC/B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,SAAmB,UAAA,CAAW,MAAA;AAElC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,MAAA,SAAe,MAAA,CAAO,MAAA;AAE1B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACrE;AAAA,EAEA,YAAY,IAAA,EAAkC;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAClC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAmB;AAEnC,IAAA,MAAM,SAAA,GAAY,CAACC,OAAAA,KAAoB;AACrC,MAAA,KAAA,MAAW,SAASA,OAAAA,EAAQ;AAC1B,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,QAC3B;AACA,QAAA,IAAI,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ;AACrC,UAAA,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,QACxB;AACA,QAAA,IAAI,UAAU,KAAA,EAAO;AACnB,UAAA,KAAA,MAAW,GAAA,IAAQ,MAAc,IAAA,EAAM;AACrC,YAAA,SAAA,CAAU,IAAI,MAAM,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,IAAI,YAAY,KAAA,EAAO;AACrB,UAAA,KAAA,MAAW,KAAA,IAAU,MAAc,MAAA,EAAQ;AACzC,YAAA,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,iBAAiB,IAAA,EAAuB;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAClC,IAAA,OAAO,OAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAiB;AACf,IAAA,MAAM,WAAA,GAAc,KAAK,cAAA,EAAe;AACxC,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,cAAA,CAAe,aAAa,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAGd,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,MAAM,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,IAAA,EAA0D;AAC9E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,YAAA,IAAgB,EAAA;AAAA,MAC7D,MAAA,EAAQ,YAAY,KAAA,EAAO,UAAA,EAAY,UAAU,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG;AAAA,KACnE;AAAA,EACF;AAAA,EAEA,eAAe,IAAA,EAAsB;AACnC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,YAAY,KAAA,EAAO,UAAA;AACtC,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,kBAAkB,IAAA,EAAwB;AACxC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY,OAAO,cAAA,EAAgB;AACrC,MAAA,OAAO,WAAW,KAAA,CAAM,cAAA;AAAA,IAC1B;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AACzC,IAAA,OAAO,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAK,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,IAAA,EAAsB;AAClC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,OAAO,UAAA,EAAY,KAAA,IAAS,UAAA,EAAY,KAAA,EAAO,WAAA,IAAe,IAAA;AAAA,EAChE;AAAA,EAEA,cAAc,IAAA,EAAsB;AAClC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,OAAO,UAAA,EAAY,aAAA,IAAiB,UAAA,EAAY,KAAA,IAAS,IAAA;AAAA,EAC3D;AAAA,EAEA,cAAc,IAAA,EAAkC;AAC9C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,GAAG,KAAA,EAAO,KAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAKE;AACA,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAClD,MAAA,WAAA,IAAe,WAAW,MAAA,CAAO,MAAA;AAAA,IACnC;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,WAAA,IAAe,OAAO,MAAA,CAAO,MAAA;AAAA,IAC/B;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,WAAA,CAAY,IAAA;AAAA,MAC9B,OAAA,EAAS,KAAK,OAAA,CAAQ,IAAA;AAAA,MACtB,OAAA,EAAS,KAAK,OAAA,CAAQ,MAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,MAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,cAAA,EAAe;AAAA,MACjC,OAAA,EAAS,KAAK,UAAA;AAAW,KAC3B;AAAA,EACF;AACF;AAMA,IAAI,QAAA,GAA4B,IAAA;AAEzB,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,QAAA,EAAS;AAAA,EAC1B;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,aAAA,GAAsB;AACpC,EAAA,QAAA,GAAW,IAAA;AACb;AAEO,SAAS,cAAA,GAA2B;AACzC,EAAA,QAAA,GAAW,IAAI,QAAA,EAAS;AACxB,EAAA,OAAO,QAAA;AACT;ACtaO,IAAM,OAAN,MAAW;AAAA,EACT,QAAA;AAAA,EACA,EAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACC,QAAA;AAAA,EACA,MAAA;AAAA,EAER,YAAY,MAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAW,cAAA,EAAe;AAC/B,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,OAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAIC,4BAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAG1C,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,QAAA,IAAA,CAAK,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAsB;AAE1B,IAAA,MAAM,IAAA,CAAK,SAAS,IAAA,EAAK;AAGzB,IAAA,MAAM,KAAK,EAAA,CAAG,IAAA;AAAA,MACZ,IAAA,CAAK,SAAS,cAAA,EAAe;AAAA,MAC7B,IAAA,CAAK,SAAS,UAAA;AAAW,KAC3B;AAGA,IAAA,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAE9B,IAAA,OAAA,CAAQ,IAAI,6BAAwB,CAAA;AACpC,IAAA,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,IAAA,CAAK,SAAS,cAAA,EAAe,CAAE,MAAM,CAAA,CAAE,CAAA;AACtE,IAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,UAAA,EAAW,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,GAAe;AACnB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAE/B,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA,QAC3C,UAAA,EAAY,UAAA;AAAA,QACZ,KAAA,EAAO,EAAE,IAAA,EAAM,iBAAA;AAAkB,OAClC,CAAA;AAED,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,WAAW,cAAA,CAAe,IAAA;AAAA,MACjC;AAAA,IACF,SAAS,CAAA,EAAG;AAEV,MAAA,OAAA,CAAQ,IAAI,uDAA6C,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,EAAC;AAAA,EAC3B;AAAA,EAEA,QAAQ,OAAA,EAA6D;AACnE,IAAA,OAAOC,+BAAA,CAAc;AAAA,MACnB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA,EAEA,WAAW,OAAA,EAA6D;AACtE,IAAA,OAAOC,oCAAA,CAAmB;AAAA,MACxB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,GAAG,OAAA;AAAA,MACH,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA,EAEA,QAAQ,OAAA,EAA6D;AACnE,IAAA,OAAOC,kCAAA,CAAiB;AAAA,MACtB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,KAAK,OAAA,EAAS,GAAA,IAAO,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,MACnC,GAAG,OAAA;AAAA,MACH,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,OAAA,EAIlB;AAED,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,SAAA;AACzC,IAAA,IAAI,SAAA,EAAW,qBAAqB,KAAA,EAAO;AACzC,MAAA,OAAA,CAAQ,IAAI,gDAAsC,CAAA;AAClD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,WAAWC,gCAAA,CAAe;AAAA,MAC7B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,IAAA,EAAM,SAAS,IAAA,IAAQ,IAAA;AAAA,MACvB,WAAA,EAAa,OAAA,EAAS,WAAA,IAAe,SAAA,EAAW,WAAA;AAAA,MAChD,aAAa,OAAA,EAAS;AAAA,KACvB,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAAuC,OAAA,EAAS,IAAA,IAAQ,IAAI,CAAA,CAAE,CAAA;AAC1E,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,IAC5B;AACA,IAAA,MAAM,IAAA,CAAK,GAAG,UAAA,EAAW;AACzB,IAAA,OAAA,CAAQ,IAAI,8BAAuB,CAAA;AAAA,EACrC;AACF;AAMO,SAAS,WAAW,MAAA,EAA0B;AACnD,EAAA,OAAO,IAAI,KAAK,MAAM,CAAA;AACxB;;;ACgIO,SAAS,YAAY,KAAA,EAAkC;AAC5D,EAAA,OAAO,MAAM,IAAA,KAAS,MAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,oBAAoB,KAAA,EAA0C;AAC5E,EAAA,OAAO,MAAM,IAAA,KAAS,cAAA;AACxB;AAEO,SAAS,aAAa,KAAA,EAAmC;AAC9D,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAEO,SAAS,aAAa,KAAA,EAAmC;AAC9D,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,gBAAgB,KAAA,EAAsC;AACpE,EAAA,OAAO,MAAM,IAAA,KAAS,UAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,cACd,KAAA,EACkD;AAClD,EAAA,OACE,MAAM,IAAA,KAAS,KAAA,IACf,MAAM,IAAA,KAAS,aAAA,IACf,MAAM,IAAA,KAAS,MAAA;AAEnB;AAMO,IAAM,qBAAA,GAAwB;AAAA,EACnC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAEO,IAAM,sBAAA,GAAyB;AAAA,EACpC,cAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;AAEO,IAAM,kBAAA,GAAqB,CAAC,KAAA,EAAO,aAAA,EAAe,MAAM;AAExD,IAAM,eAAA,GAAkB;AAAA,EAC7B,GAAG,qBAAA;AAAA,EACH,GAAG,mBAAA;AAAA,EACH,GAAG,sBAAA;AAAA,EACH,GAAG;AACL;;;AC7XA,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,WAAA,GAAc,CAAA;AAqBb,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAmH5B,IAAA;AAEK,SAAS,wBAAA,GAAyC;AACvD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,SAAS;AAAC,GACZ;AACF;AAEO,SAAS,gBAAA,CAAiB,OAAA,GAA0B,CAAC,wBAAA,EAA0B,CAAA,EAAiB;AACrG,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,SAAS,OAAA,CAAQ,MAAA,GAAS,IAAI,OAAA,GAAU,CAAC,0BAA0B;AAAA,GACrE;AACF;AAEO,SAAS,iBAAA,CAAkB,UAAU,CAAA,EAAiB;AAC3D,EAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,IACxB,OAAA,EAAS,MAAM,IAAA,CAAK,EAAE,QAAQ,KAAA,EAAM,EAAG,MAAM,gBAAA,EAAkB;AAAA,GACjE;AACF;AAEO,SAAS,0BAA0B,KAAA,EAAkC;AAC1E,EAAA,MAAM,YAAA,GAAe,mBAAmB,KAAK,CAAA;AAC7C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,cAAA,CAAe,YAAA,CAAa,OAAO;AAAA,GAC9C;AACF;AAEO,SAAS,uBAA0B,KAAA,EAAa;AACrD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,yBAAA,CAA0B,KAAK,CAAA,CAAE,OAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,IAAM,KAAA,CAAuB,SAAS,KAAA,EAAO;AAC7D,IAAA,OAAO,0BAA0B,KAAK,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,8BAA8B,KAAK,CAAA,MAAA,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,YAAA,GAAe,0BAA0B,KAAK,CAAA;AACpD,EAAA,OAAO,CAAA,2BAAA,EAA8B,WAAA,CAAY,YAAA,CAAa,OAAO,CAAC,CAAA,MAAA,CAAA;AACxE;AAEA,SAAS,mBAAmB,KAAA,EAAkC;AAC5D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,eAAe,KAAuB;AAAA,KACjD;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,IAAM,KAAA,CAAuB,SAAS,KAAA,EAAO;AAC7D,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAA,IAAW,EAAE;AAAA,KAC3C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,SAAS;AAAC,GACZ;AACF;AAEA,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,OAAO,MACJ,MAAA,CAAO,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,KAAS,QAAQ,CAAA,CAChE,GAAA,CAAI,CAAC,IAAA,KAAS,aAAA,CAAc,IAAI,CAAC,CAAA;AACtC;AAEA,SAAS,cAAc,IAAA,EAAkC;AACvD,EAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,IAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAC9B,IAAA,MAAM,iBAAA,GAAoB,cAAA;AAAA,MACxB,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU;AAAC,MAC9C,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,aAAa,CAAA;AAEhD,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SACE,iBAAA,CAAkB,MAAA,GAAS,IACvB,iBAAA,GACA,CAAC,0BAA0B;AAAA,KACnC;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,cAAA,CAAe,IAAA,CAAK,OAAO;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG;AAAA,GACL;AACF;AAEA,SAAS,qBAAqB,IAAA,EAAkC;AAC9D,EAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU,EAAC;AAClE,EAAA,MAAM,uBAAuB,WAAA,CAAY,KAAA,CAAM,CAAC,KAAA,KAAU,KAAA,EAAO,SAAS,YAAY,CAAA;AACtF,EAAA,MAAM,aAAA,GAAgB,YAAA;AAAA,IACpB,OAAO,IAAA,CAAK,KAAA,EAAO,OAAA,KAAY,QAAA,GAC3B,IAAA,CAAK,KAAA,CAAM,OAAA,GACX,oBAAA,IAAwB,WAAA,CAAY,MAAA,GAAS,CAAA,GAC3C,YAAY,MAAA,GACZ;AAAA,GACR;AAEA,EAAA,MAAM,OAAA,GAAU,uBACZ,0BAAA,CAA2B,WAAA,EAAa,aAAa,CAAA,GACrD,sBAAA,CAAuB,aAAa,aAAa,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,KAAA,EAAO;AAAA,MACL,GAAI,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,MACnB,SAAS,OAAA,CAAQ;AAAA,KACnB;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,0BAAA,CACP,SACA,aAAA,EACgB;AAChB,EAAA,MAAM,aAAa,OAAA,CAChB,KAAA,CAAM,GAAG,WAAW,CAAA,CACpB,IAAI,CAAC,MAAA,KAAW,aAAA,CAAc,MAAM,CAAC,CAAA,CACrC,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,SAAS,YAAY,CAAA;AAElD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,eAAc,EAAG,MAAM,kBAAkB,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,aAAA,EAAe;AACrC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,aAAa,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,aAAa,CAAA;AAC7C,IAAA,MAAM,aAAa,MAAA,CAAO,OAAA;AAAA,MAAQ,CAAC,MAAA,KACjC,uBAAA,CAAwB,MAAA,CAAO,OAAO;AAAA,KACxC;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,GAAS,CAAA;AAChC,IAAA,IAAA,CAAK,SAAS,IAAI,gBAAA,CAAiB;AAAA,MACjC,GAAG,uBAAA,CAAwB,IAAA,CAAK,SAAS,EAAE,OAAO,CAAA;AAAA,MAClD,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,aAAA,EAAe;AACrC,IAAA,OAAO;AAAA,MACL,GAAG,UAAA;AAAA,MACH,GAAG,KAAA,CAAM,IAAA;AAAA,QAAK,EAAE,MAAA,EAAQ,aAAA,GAAgB,UAAA,CAAW,MAAA,EAAO;AAAA,QAAG,MAC3D,gBAAA;AAAiB;AACnB,KACF;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,sBAAA,CACP,QACA,aAAA,EACgB;AAChB,EAAA,MAAM,gBAAA,GAAmB,eAAe,MAAM,CAAA;AAE9C,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,eAAc,EAAG,CAAC,GAAG,KAAA,KAAU;AACzD,IAAA,IAAI,KAAA,GAAQ,gBAAgB,CAAA,EAAG;AAC7B,MAAA,MAAM,KAAA,GAAQ,iBAAiB,KAAK,CAAA;AACpC,MAAA,OAAO,QAAQ,gBAAA,CAAiB,CAAC,KAAK,CAAC,IAAI,gBAAA,EAAiB;AAAA,IAC9D;AAEA,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA;AACzC,IAAA,OAAO,gBAAA,CAAiB,KAAK,MAAA,GAAS,CAAA,GAAI,OAAO,CAAC,wBAAA,EAA0B,CAAC,CAAA;AAAA,EAC/E,CAAC,CAAA;AACH;AAEA,SAAS,wBAAwB,OAAA,EAAkC;AACjE,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,OAAO,IAAI,cAAA,CAAe,OAAyB,IAAI,EAAC;AACvF,EAAA,MAAM,WAAW,QAAA,CAAS,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,aAAa,CAAA;AACxE,EAAA,OAAO,SAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,CAAC,0BAA0B,CAAA;AACrE;AAEA,SAAS,YAAY,KAAA,EAA+B;AAClD,EAAA,OAAO,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,WAAW,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACtD;AAEA,SAAS,WAAW,IAAA,EAA4B;AAC9C,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,GAAA,EAAM,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAC,CAAA,IAAA,CAAA;AAAA,IAChD,KAAK,MAAA;AACH,MAAA,OAAO,eAAe,IAAI,CAAA;AAAA,IAC5B,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACjD,MAAA,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,mBAAA,CAAoB,KAAK,OAAO,CAAC,MAAM,KAAK,CAAA,CAAA,CAAA;AAAA,IACnE;AAAA,IACA,KAAK,YAAA;AACH,MAAA,OAAO,OAAO,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,KAAA,CAAA;AAAA,IAC/C,KAAK,aAAA;AACH,MAAA,OAAO,OAAO,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,KAAA,CAAA;AAAA,IAC/C,KAAK,UAAA;AACH,MAAA,OAAO,OAAO,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,KAAA,CAAA;AAAA,IAC/C,KAAK,YAAA;AACH,MAAA,OAAO,eAAe,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,aAAA,CAAA;AAAA,IACvD,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,WAAA,EAAc,WAAW,WAAA,CAAY,IAAA,CAAK,WAAW,EAAE,CAAC,CAAC,CAAA,aAAA,CAAA;AAAA,IAClE,KAAK,gBAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,gBAAgB,IAAI,CAAA;AAAA,IAC7B,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,OAAA,GAAU,YAAA;AAAA,QACd,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,QAAQ,MAAA,GAAS;AAAA,OACtD;AACA,MAAA,OAAO,CAAA,4BAAA,EAA+B,OAAO,CAAA,8BAAA,EAAiC,OAAO,CAAA,EAAA,EAAK,YAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,eAAA,CAAA;AAAA,IAC3H;AAAA,IACA,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,cAAA,CAAA;AAAA,IACxD,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,WAAA,EAAc,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAC,CAAA,YAAA,CAAA;AAAA,IACxD,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,cAAA,EAAiB,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAC,CAAA,eAAA,CAAA;AAAA,IAC3D,KAAK,aAAA;AACH,MAAA,OAAO,6BAAA;AAAA,IACT,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,cAAA,EAAiB,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAC,CAAA,eAAA,CAAA;AAAA,IAC3D,KAAK,WAAA;AACH,MAAA,OAAO,eAAe,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,aAAA,CAAA;AAAA,IACvD,KAAK,WAAA;AACH,MAAA,OAAO,qBAAA,CAAsB,cAAc,IAAI,CAAA;AAAA,IACjD,KAAK,WAAA;AACH,MAAA,OAAO,qBAAA,CAAsB,cAAc,IAAI,CAAA;AAAA,IACjD;AACE,MAAA,OAAO,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AAAA;AAE3C;AAEA,SAAS,oBAAoB,OAAA,EAAkC;AAC7D,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAC;AAC1B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,WAAW,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACtD;AAEA,SAAS,eAAe,IAAA,EAA4B;AAClD,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,IAAA,KAAS,WAAW,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AACrE,EAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,GAAA,EAAK,IAAA,KAAS,SAAA,CAAU,GAAA,EAAK,IAAI,CAAA,EAAG,IAAI,CAAA;AAC5E;AAEA,SAAS,gBAAgB,IAAA,EAA4B;AACnD,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,QAAA,GAAW,IAAA,CAAK,MAAM,GAAA,GAAM,EAAA;AACnE,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,QAAA,GAAW,IAAA,CAAK,MAAM,GAAA,GAAM,EAAA;AACnE,EAAA,OAAO,aAAa,eAAA,CAAgB,GAAG,CAAC,CAAA,OAAA,EAAU,eAAA,CAAgB,GAAG,CAAC,CAAA,IAAA,CAAA;AACxE;AAEA,SAAS,qBAAA,CAAsB,SAAiB,IAAA,EAA4B;AAC1E,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,EAAG,KAAK,MAAM,OAAO,CAAA,CAAA,CAAA;AACzC;AAEA,SAAS,gBAAA,CACP,KAAA,EACA,UAAA,GAAuB,EAAC,EAChB;AACR,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,EACjC,MAAA,CAAO,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAC,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,IAAK,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,CAAA,CAC3F,GAAA,CAAI,CAAC,CAAC,KAAK,KAAK,CAAA,KAAM,CAAA,EAAG,GAAG,KAAK,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAErE,EAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAA,CAAA,EAAI,QAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AACxD;AAEA,SAAS,SAAA,CAAU,SAAiB,IAAA,EAA4B;AAC9D,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA;AACH,MAAA,OAAO,WAAW,OAAO,CAAA,SAAA,CAAA;AAAA,IAC3B,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,KAAA,CAAA;AAAA,IACvB,KAAK,WAAA;AACH,MAAA,OAAO,MAAM,OAAO,CAAA,IAAA,CAAA;AAAA,IACtB,KAAK,QAAA;AACH,MAAA,OAAO,MAAM,OAAO,CAAA,IAAA,CAAA;AAAA,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,SAAS,OAAO,CAAA,OAAA,CAAA;AAAA,IACzB,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GACJ,OAAO,IAAA,CAAK,KAAA,EAAO,IAAA,KAAS,WAAW,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,GAAA;AAC5E,MAAA,OAAO,CAAA,SAAA,EAAY,IAAI,CAAA,4CAAA,EAA+C,OAAO,CAAA,IAAA,CAAA;AAAA,IAC/E;AAAA,IACA;AACE,MAAA,OAAO,OAAA;AAAA;AAEb;AAEA,SAAS,YAAY,KAAA,EAA+B;AAClD,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,EAAA;AAAA,IACrD;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,WAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AAAA,EACvC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,MAAM,eAAe,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AACrE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,EAAG;AAClC,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,aAAa,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAC,CAAA;AAC9E;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,MAAM,eAAe,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AACrE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,EAAG;AAClC,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAC,CAAA;AAC1D;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CACJ,UAAA,CAAW,GAAA,EAAK,OAAO,CAAA,CACvB,UAAA,CAAW,GAAA,EAAK,MAAM,CAAA,CACtB,UAAA,CAAW,GAAA,EAAK,MAAM,CAAA;AAC3B;AAEA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,OAAO,UAAA,CAAW,KAAK,CAAA,CAAE,UAAA,CAAW,KAAK,QAAQ,CAAA;AACnD;AAEA,SAAS,SAAS,KAAA,EAA8C;AAC9D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;;;AC/aA,eAAsB,QAAA,CACpB,OACA,IAAA,EACc;AACd,EAAA,IAAI,SAAS,IAAA,CAAK,IAAA;AAElB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK;AAAA,MAC5B,GAAG,IAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,MAAA,GAAS,UAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,aAAA,CACpB,OACA,IAAA,EACc;AACd,EAAA,OAAO,QAAA,CAAS,OAAO,IAAI,CAAA;AAC7B;;;AClFO,IAAM,YAAA,GAAN,cAA2BC,qCAAA,CAAoB;AAAA,EAC5C,EAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA,uBAAuC,GAAA,EAAI;AAAA,EAEnD,YAAY,OAAA,EAGT;AACD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAEpB,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,MAAM,QAAA,GAAA,CAAY,MAAM,OAAO,gBAAgB,CAAA,EAAG,OAAA;AAClD,MAAA,IAAA,CAAK,EAAA,GAAK,IAAI,QAAA,CAAS,IAAA,CAAK,QAAQ,UAAU,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,oBAAoB,CAAA;AACnC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,mBAAmB,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,IAAA,CAAK,IAAA,IAAQ,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,MAAA,EAAgC;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AAElD,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,EAAG;AAEpC,IAAA,MAAM,OAAA,GAAoB;AAAA,MACxB,CAAA,mBAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,SAAS,IAAA,EAAM;AAExC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACpC,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,OAAA,CAAQ,KAAK,CAAA,yCAAA,CAA2C,CAAA;AACxD,MAAA,OAAA,CAAQ,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,OAAA,CAAQ,KAAK,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,YAAY,CAAA,2BAAA,EAA8B,SAAS,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAChF,IAAA,IAAA,CAAK,EAAA,CAAG,KAAK,SAAS,CAAA;AAGtB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,OAAA,EAAS;AAC/B,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MACzG;AACA,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,MAAA,EAAQ;AAC9B,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,sCAAA,EAAyC,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MACvH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAA,EAAW,IAAI,CAAA;AAAA,EACrC;AAAA,EAEQ,WAAW,KAAA,EAA2B;AAC5C,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,MAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,KAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,UAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,kBAAA,CAAA;AAAA,MACtB,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,QAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,cAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,MAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAQ,IAAA,EAAwC;AACpD,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,KAAA,GAAQ,EAAC,EAAG,IAAA,EAAM,KAAA,GAAQ,EAAA,EAAI,IAAA,GAAO,CAAA,EAAG,QAAA,EAAS,GAAI,IAAA;AAC/E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,iBAAiB,SAAS,CAAA,CAAA;AACpC,IAAA,MAAM,SAAgB,EAAC;AACvB,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,UAAA,CAAW,KAAK,CAAA,aAAA,CAAe,CAAA;AAC/B,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,IAAA,EAAM;AAEnC,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,QAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAA,CAAM,CAAA;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,QAC1B;AACA,QAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAW;AAC1B,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,KAAA,EAAQ,KAAA,CAAM,EAAA,CAAG,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACnE,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,EAAE,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,KAAA,CAAO,CAAA;AAC7B,UAAA,MAAA,CAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAA,CAAM,CAAA;AAC5B,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,GAAA,IAAO,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,EAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,IAAK,YAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,EAAM,UAAA,CAAW,GAAG,IAAI,MAAA,GAAS,KAAA;AACjD,IAAA,GAAA,IAAO,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAExC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,0BAA0B,CAAA;AACnE,IAAA,MAAM,WAAA,GAAc,KAAK,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,aAAa,KAAA,IAAS,CAAA;AAExC,IAAA,GAAA,IAAO,CAAA,iBAAA,CAAA;AACP,IAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAA,CAAQ,IAAA,GAAO,CAAA,IAAK,KAAK,CAAA;AAErC,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,QAAa,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,MAAM,CAAC,CAAA;AAE9D,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK,CAAA;AAAA,MACvC,IAAA;AAAA,MACA,aAAA,EAAA,CAAgB,IAAA,GAAO,CAAA,IAAK,KAAA,GAAQ,CAAA;AAAA,MACpC,aAAa,IAAA,GAAO,CAAA;AAAA,MACpB,WAAA,EAAa,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MAC/C,QAAA,EAAU,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,IAAA;AAAA,MAChC,QAAA,EAAU,OAAO,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA,GAAI,OAAO,CAAA,GAAI;AAAA,KAC7D;AAAA,EACF;AAAA,EAEA,MAAM,SAAY,IAAA,EAAuC;AACvD,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,UAAS,GAAI,IAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,iBAAiB,SAAS,CAAA,aAAA,CAAA;AACpC,IAAA,MAAM,MAAA,GAAgB,CAAC,EAAE,CAAA;AAEzB,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,kBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAC9C,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,EAAY,MAAM,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,OAAU,IAAA,EAA8B;AAC5C,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,UAAS,GAAI,IAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,UAAA,CAAW,EAAA,GAAK,EAAA;AAChB,IAAA,UAAA,CAAW,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC/C,IAAA,UAAA,CAAW,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAE/C,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,UAAA,CAAW,SAAA,GAAY,QAAA;AAAA,IACzB;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AACtC,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,MAC5C,OAAO,CAAA,KAAM,WAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,GAAI;AAAA,KAC9C;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACN,CAAA,YAAA,EAAe,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,IAAI,CAAC,aAAa,YAAY,CAAA,CAAA;AAAA,KAC1E,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAEf,IAAA,OAAO,EAAE,GAAG,UAAA,EAAY,EAAA,EAAG;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAU,IAAA,EAA8B;AAC5C,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,UAAS,GAAI,IAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,UAAA,CAAW,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAE/C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAC,CAAA,IAAA,CAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,MAC5C,OAAO,CAAA,KAAM,WAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,GAAI;AAAA,KAC9C;AAEA,IAAA,IAAI,GAAA,GAAM,CAAA,OAAA,EAAU,SAAS,CAAA,KAAA,EAAQ,SAAS,CAAA,aAAA,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,EAAQ,EAAE,CAAA;AAE7B,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,kBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAElC,IAAA,OAAO,KAAK,QAAA,CAAY,EAAE,YAAY,IAAA,EAAM,EAAA,EAAI,UAAU,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,OAAU,IAAA,EAA8B;AAC5C,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,UAAS,GAAI,IAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,CAAY,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,CAAA;AACrE,IAAA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAE7D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,eAAe,SAAS,CAAA,aAAA,CAAA;AAClC,IAAA,MAAM,MAAA,GAAgB,CAAC,EAAE,CAAA;AAEzB,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,kBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAElC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,IAAA,EAA+F;AACzG,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAS,GAAI,IAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,iCAAiC,SAAS,CAAA,CAAA;AACpD,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,oBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AACjD,IAAA,OAAO,QAAQ,KAAA,IAAS,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAQ,IAAA,EAA2F;AACvG,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,CAAA;AACpD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,GAAyC;AAC7C,IAAA,OAAO,EAAE,MAAM,EAAC,EAAG,WAAW,CAAA,EAAG,KAAA,EAAO,IAAI,UAAA,EAAY,CAAA,EAAG,MAAM,CAAA,EAAG,aAAA,EAAe,GAAG,WAAA,EAAa,KAAA,EAAO,aAAa,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,EAC/J;AAAA,EAEA,MAAM,eAAA,GAAgC;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,GAA8B;AAClC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,MAAM,cAAA,GAAgC;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAM/B,QAAA,CAAS,KAAU,MAAA,EAA+B;AACxD,IAAA,MAAM,GAAA,GAAW,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAG;AAE9B,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,SAAS,IAAA,EAAM;AAExC,MAAA,IAAI,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAE1B,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,UAAA,IACxC,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,SAAS,QAAA,EAAU;AAC/E,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AAAA,QACtC,CAAA,CAAA,MAAQ;AACN,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,QAAA,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAAA,MACvB;AAEA,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,EAAO;AAClC,QAAA,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,WAAA,EAAY;AAAA,MACtC;AAEA,MAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAAA,IACpB;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,GAAA,CAAI,YAAY,GAAA,CAAI,UAAA;AACpB,MAAA,GAAA,CAAI,YAAY,GAAA,CAAI,UAAA;AAAA,IACtB;AAEA,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,GAAA,CAAI,WAAW,GAAA,CAAI,SAAA;AAAA,IACrB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,GAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC7E;AAAA,EAEQ,gBAAgB,IAAA,EAAsB;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IACzB;AACA,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAe,EAAA,EAAyC;AAC5D,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,YAAY;AACzC,QAAA,OAAO,EAAA,CAAG,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAAA,MAC3B,CAAC,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,EAAA,EAAG;AAClB,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AAAA,EAEA,KAAK,GAAA,EAAmB;AACtB,IAAA,IAAA,CAAK,EAAA,CAAG,KAAK,GAAG,CAAA;AAAA,EAClB;AAAA,EAEA,QAAQ,GAAA,EAAa;AACnB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC5B;AACF;AAMO,SAAS,mBAAmB,OAAA,EAGlB;AACf,EAAA,OAAO,IAAI,YAAA,CAAa,OAAA,IAAW,EAAE,CAAA;AACvC;;;AC1YO,IAAe,aAAf,MAA0B;AAAA,EACxB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAqB,EAAC;AAAA,EACtB,cAA2C,EAAC;AAAA,EAC5C,UAAmC,EAAC;AAAA,EACpC,SAAiC,EAAC;AAAA,EAClC,aAGH,EAAE,WAAA,EAAa,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EAC5B,kBAAuC,EAAC;AAAA,EACxC,cAAwB,EAAC;AAAA,EACzB,gBAAA;AAAA,EACA,gBAAA;AAAA,EAEP,YAAY,IAAA,EAAc;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAM,GAAA,EAA+B;AAAA,EAE3C;AAAA,EAEA,MAAM,WAAY,GAAA,EAA+B;AAAA,EAEjD;AAAA,EAEA,MAAM,UAAW,GAAA,EAA+B;AAAA,EAEhD;AAAA,EAEA,cAAA,GAA+C;AAC7C,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,UAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF;AAMO,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA,uBAAuC,GAAA,EAAI;AAAA,EAC3C,KAAA,uBAAiC,GAAA,EAAI;AAAA,EAE7C,SAAS,MAAA,EAA0B;AACjC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACjE;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAGpC,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,IAAW,IAAK,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC3D,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAsC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EACjE;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,IAAW,IAAK,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC3D,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,IAAI,CAAA,CAAE,CAAA;AAAA,EAC5D;AAAA,EAEA,IAAI,IAAA,EAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,YAAA,CAAa,OAAe,OAAA,EAAqB;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IAC1B;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,CAAG,KAAK,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,cAAA,CAAe,OAAe,OAAA,EAAqB;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AACrC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AACtC,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,KAAA,EAAe,IAAA,EAA0B;AACzD,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,EAAC;AAC3C,IAAA,IAAI,MAAA,GAAS,IAAA;AAEb,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAC1D,QAAA,IAAI,eAAe,KAAA,CAAA,EAAW;AAC5B,UAAA,MAAA,GAAS,UAAA;AAAA,QACX;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAiD;AAC/C,IAAA,MAAM,cAA2C,EAAC;AAElD,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,cAAA,IAAiB,IAAK,EAAC;AACxD,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,iBAAiB,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,aAAA,GAAyC;AACvC,IAAA,MAAM,UAAmC,EAAC;AAE1C,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,UAAA,IAAa,IAAK,EAAC;AAChD,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,YAAA,GAAuC;AACrC,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,kBAAA,GAA0C;AACxC,IAAA,MAAM,aAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,eAAe,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,cAAA,GAA2B;AACzB,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,WAAW,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAOO,IAAM,SAAA,GAAN,cAAwB,UAAA,CAAW;AAAA,EACxC,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,WAAA,GACH,2EAAA;AAEF,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,gBAAA;AAAA,UACP,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,OAAO,oBAAA,EAAqB;AAAA,QACnE;AAAA,UACE,IAAA,EAAM,cAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,QACA,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,OAAO,sBAAA;AAAuB;AACjE,KACD,CAAA;AAAA,EACH;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,UAAA,CAAW;AAAA,EAC9C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,WAAW,CAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GACH,0DAAA;AAEF,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,kBAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC7C,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,OAAO,kBAAA,EAAmB;AAAA,QAC9D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAClD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,QACjD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa;AACzD,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,CAAgB,oBAAoB,CAAA,GAAI,EAAC;AAAA,EAChD;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,UAAU,CAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,0CAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,QACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC/C,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,QAC/B,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,cAAc,KAAA,EAAM;AAAA,QAC1D,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,mBAAA,EAAoB;AAAA,QAC3D,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QACrD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA;AAAK;AACrD,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,CAAgB,mBAAmB,CAAA,GAAI,EAAC;AAAA,EAC/C;AACF;AAGO,IAAM,aAAA,GAAN,cAA4B,UAAA,CAAW;AAAA,EAC5C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,SAAS,CAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,6BAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,QACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,QAC9B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,QACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAA,EAAgB,YAAY,WAAA,EAAY;AAAA,QAChE;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,cAAA;AAAA,UACN,UAAA,EAAY,UAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,cAAc,KAAA,EAAM;AAAA,QAC1D,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,OAAO,mBAAA,EAAoB;AAAA,QACjE;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,eAAA;AAAA,UACP,YAAA,EAAc;AAAA;AAChB;AACF,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,CAAgB,kBAAkB,CAAA,GAAI,EAAC;AAAA,EAC9C;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,UAAU,CAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,oBAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,cAAA;AAAA,UACN,UAAA,EAAY,WAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,eAAA;AAAA,UACP,YAAA,EAAc;AAAA,SAChB;AAAA,QACA;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ;AAAA,YACN;AAAA,cACE,IAAA,EAAM,eAAA;AAAA,cACN,KAAA,EAAO,MAAA;AAAA,cACP,MAAA,EAAQ;AAAA,gBACN;AAAA,kBACE,IAAA,EAAM,SAAA;AAAA,kBACN,IAAA,EAAM,cAAA;AAAA,kBACN,UAAA,EAAY;AAAA,iBACd;AAAA,gBACA,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,cAAc,CAAA,EAAE;AAAA,gBACpD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAO;AAAA,gBAChC;AAAA,kBACE,IAAA,EAAM,UAAA;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,OAAA,EAAS;AAAA,oBACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,oBAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,oBACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC;AACF;AACF;AACF;AACF;AACF;AACF,KACD,CAAA;AAAA,EACH;AACF;AAGO,IAAM,aAAA,GAAgB;AAAA,EAC3B,GAAA,EAAK,SAAA;AAAA,EACL,SAAA,EAAW,eAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,aAAA;AAAA,EACT,QAAA,EAAU;AACZ;;;AChXO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA,EAAxB,MAAA;AAAA,EAFZ,MAAgB,EAAC;AAAA,EAIzB,OAAA,CAAQ,UAAkB,UAAA,EAA0C;AAClE,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CACpC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAC/B,KAAK,IAAI,CAAA;AACZ,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA;AAAA,EAAO,KAAK;AAAA,CAAA,CAAK,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,YAAoB,KAAA,EAAuB;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,mBAAA,EAAsB,UAAU,CAAA;AAAA,EAAA,EAAU,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA,CAAK,CAAA;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7B;AACF;AAMO,SAAS,uBAAuB,KAAA,EAAyC;AAC9E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,QACzB,UAAA,EAAY,KAAA,CAAM,KAAA,IAAS,EAAC;AAAA,QAC5B,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,QAC3B,YAAA,EAAc,KAAA,CAAM,YAAA,IAAgB,EAAC;AAAA,QACrC,SAAA,EAAW,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,QAC7B,OAAA,EAAS,KAAA,CAAM,WAAA,IAAe;AAAC;AACjC;AACF,GACF;AACF;AAMO,IAAM,iBAAA,GAAiC;AAAA,EAC5C,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,sCAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,+BAAA;AAAA,IACJ,EAAA,EAAI,iCAAA;AAAA,IACJ,EAAA,EAAI,mCAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER;AAEO,IAAM,gBAAA,GAAgC;AAAA,EAC3C,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAO,iBAAA,CAAkB,KAAA;AAAA,EACzB,SAAS,iBAAA,CAAkB,OAAA;AAAA,EAC3B,cAAc,iBAAA,CAAkB,YAAA;AAAA,EAChC,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,8BAAA;AAAA,IACJ,EAAA,EAAI,iCAAA;AAAA,IACJ,EAAA,EAAI,mCAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER;AAMO,IAAM,kBAAA,GAAkC;AAAA,EAC7C,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,2CAAA;AAAA,IACN,KAAA,EAAO,oCAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,GAAA;AAAA,IACJ,EAAA,EAAI,GAAA;AAAA,IACJ,EAAA,EAAI,GAAA;AAAA,IACJ,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,4BAAA;AAAA,IACJ,EAAA,EAAI,4BAAA;AAAA,IACJ,EAAA,EAAI,6BAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER;AAMO,SAAS,qBAAqB,KAAA,EAA4B;AAC/D,EAAA,MAAM,YAAsB,EAAC;AAG7B,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,EAAG;AACvD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9C;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACtD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,SAAA,EAAY,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7C;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAChD;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAC7D,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AAAA,EAAY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,CAAA;AACzC;AAaO,SAAS,mBAAmB,MAAA,EAAoC;AACrE,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,MAAA,CAAO,KAAA,IAAS,iBAAiB,CAAA;AACtE,EAAA,MAAM,kBAA4B,EAAC;AAGnC,EAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,kBAAkB,CAAA,EAAG;AAC1E,MAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAChC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAC/B,KAAK,IAAI,CAAA;AACZ,MAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,EAAO,KAAK;AAAA,CAAA,CAAK,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IAAA,EACH,OAAO;AAAA,IAAA,EACP,MAAA,CAAO,gBAAgB,EAAE;AAAA,IAAA,EACzB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC;AAAA,EAAA,CAAA;AAEhC;AAcO,IAAM,mBAAA,GAAoD;AAAA,EAC/D,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,EAAE,YAAA,EAAc,mBAAA,EAAoB;AAAA,IAC7C,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,YAAA,EAAc,mBAAA;AAAA,MACd,UAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,qCAAA;AAAA,MACT,MAAA,EAAQ,+BAAA;AAAA,MACR,YAAA,EAAc,kBAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,oBAAA;AAAA,MACP,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,EAAE,YAAA,EAAc,mBAAA,EAAoB;AAAA,IAC7C,OAAO,EAAE,OAAA,EAAS,SAAS,YAAA,EAAc,mBAAA,EAAqB,YAAY,KAAA,EAAM;AAAA,IAChF,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,qCAAA;AAAA,MACT,MAAA,EAAQ,+BAAA;AAAA,MACR,YAAA,EAAc;AAAA;AAChB,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,SAAS,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,KAAK,mBAAA,EAAoB;AAAA,IAC3E,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,IACvC,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA;AAAU,GAC7B;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,EAAE,YAAA,EAAc,mBAAA,EAAoB;AAAA,IAC7C,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,qCAAA;AAAA,MACT,MAAA,EAAQ,+BAAA;AAAA,MACR,YAAA,EAAc,kBAAA;AAAA,MACd,eAAA,EAAiB;AAAA;AACnB;AAEJ;;;AC5VO,IAAM,sBAAA,GAAwC;AAAA,EACnD,WAAA,EAAa,CAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,UAAA,EAAY,IAAA;AAAA,EACZ,WAAA,EAAa,IAAA;AAAA,EACb,gBAAA,EAAkB;AACpB,CAAA;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EAER,YACE,KAAA,EACA,MAAA,GAAiC,EAAC,EAClC,SAAiB,eAAA,EACjB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AAAA,EACvD;AAAA,EAEQ,QAAQ,MAAA,EAAwB;AACtC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,EAChC;AAAA,EAEQ,WAAW,MAAA,EAAwB;AACzC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,aAAa,MAAA,EAAwC;AACzD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAEzC,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3C,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,iBAAA,EAAmB,KAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAC3C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,GACrB,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,WAAA,EAAa,EAAE,CAAC,CAAA,GACvC,MAAA;AAEJ,IAAA,IAAI,WAAA,IAAe,WAAA,mBAAc,IAAI,IAAA,EAAK,EAAG;AAC3C,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,iBAAA,EAAmB,CAAA;AAAA,QACnB,WAAA;AAAA,QACA,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,IAAe,WAAA,oBAAe,IAAI,IAAA,EAAK,EAAG;AAC5C,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,iBAAA,EAAmB,KAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,mBAAmB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,cAAc,QAAQ,CAAA;AAAA,MACjE,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAwC;AAChE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAC,CAAA;AAC3D,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,aAAA,EAAe,GAAA,CAAI,UAAU,CAAA;AAExD,IAAA,MAAM,KAAK,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,GAAA,CAAI,UAAU,CAAA;AACjD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,GAAG,EAAE,CAAA;AAExC,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa;AACtC,MAAA,MAAM,cAAc,IAAI,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAC3D,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,QACzB,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,QACvB,WAAA,EAAa,WAAA,CAAY,OAAA,EAAQ,CAAE,QAAA;AAAS,OAC7C,CAAA;AACD,MAAA,MAAM,KAAK,KAAA,CAAM,MAAA;AAAA,QACf,GAAA;AAAA,QACA,KAAK,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,YAAA,GAAe,GAAI,CAAA,GAAI;AAAA,OAC/C;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,iBAAA,EAAmB,CAAA;AAAA,QACnB,WAAA;AAAA,QACA,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,mBAAmB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,MAChE,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAkC;AAClE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,YAAA,GAAe,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,YAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,GAAA,GAAM,YAAY,CAAA;AAE/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,QAAA,CAAS,KAAK,GAAA,EAAK;AAAA,MACjB,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,QAAA,EAAS;AAAA,MAC3C,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,MACvB,WAAA,EAAa,WAAA,CAAY,OAAA,EAAQ,CAAE,QAAA;AAAS,KAC7C,CAAA;AACD,IAAA,QAAA,CAAS,OAAO,GAAA,EAAK,IAAA,CAAK,KAAK,YAAA,GAAe,GAAI,IAAI,IAAI,CAAA;AAC1D,IAAA,MAAM,SAAS,IAAA,EAAK;AAAA,EACtB;AAAA,EAEA,MAAM,cAAc,MAAA,EAA+B;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,cAAc,MAAA,EAA+B;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAEzC,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,QACzB,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,EAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CAAkB,MAAA,EAAgB,KAAA,GAAgB,EAAA,EAAqB;AAC3E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,UAAA,EAAY,CAAA,EAAG,QAAQ,CAAC,CAAA;AACnE,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO,IAAI,KAAK,QAAA,CAAS,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAKnB;AACD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACzC,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,UAAA,EAAY,GAAG,EAAE,CAAA;AAE5D,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM;AAC3C,MAAA,MAAM,aAAa,CAAA,GAAI,CAAA;AACvB,MAAA,OAAO,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,WAAA,KAAgB,CAAA;AAAA,IAClD,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,MACvC,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,MACnB;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,qBAAqB,UAAA,CAAW,MAAA;AAAA,MAChC,YAAA,EAAc,QAAA;AAAA,MACd,WAAA,EAAa,kBACT,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB,EAAE,CAAC,CAAA,GACtC,IAAA;AAAA,MACJ,4BAAA,EAA8B,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,OAAO,WAAA,GAAc;AAAA,KACzE;AAAA,EACF;AAAA,EAEA,kBAAkB,eAAA,EAAkC;AAClD,IAAA,OACE,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,eAAA,IAAmB,KAAK,MAAA,CAAO,gBAAA;AAAA,EAE9D;AAAA,EAEA,SAAA,GAA2B;AACzB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA,EAEA,UAAU,MAAA,EAAsC;AAC9C,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AACF;;;AC7MO,IAAM,mBAAA,GAAuD;AAAA,EAClE,YAAA,EAAc,EAAE,MAAA,EAAQ,GAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACvC,eAAA,EAAiB,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EAC3C,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACzC,YAAA,EAAc,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACzC,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAA,EAAO,KAAK,GAAA,EAAI;AAAA,EACzC,mBAAA,EAAqB,EAAE,MAAA,EAAQ,GAAA,EAAO,KAAK,GAAA;AAC7C,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CACE,KAAA,EACA,MAAA,EACA,UAAA,EACA,SAAiB,iBAAA,EACjB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,mBAAA,EAAqB,GAAG,MAAA,EAAO;AAClD,IAAA,IAAA,CAAK,aAAa,UAAA,IAAc;AAAA,MAC9B,UAAA,EAAY,EAAE,MAAA,EAAQ,GAAA,EAAO,KAAK,GAAA,EAAI;AAAA,MACtC,YAAA,EAAc,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,GAAA;AAAI,KAC5C;AAAA,EACF;AAAA,EAEQ,MAAA,CAAO,MAAc,UAAA,EAA4B;AACvD,IAAA,OAAO,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG,IAAI,IAAI,UAAU,CAAA,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,UAAA,EAA8C;AACtE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA,CAAK,OAAO,aAAa,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AAExC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA;AAEjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,QAAA,CAAS,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA;AAC7C,IAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,KAAK,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,CAAA;AACjD,IAAA,QAAA,CAAS,MAAA,CAAO,KAAK,IAAA,CAAK,IAAA,CAAK,OAAO,MAAA,GAAS,GAAI,IAAI,CAAC,CAAA;AAExD,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,KAAA,GAAS,OAAA,GAAU,CAAC,CAAA,GAAI,CAAC,CAAA,IAAgB,CAAA;AAE/C,IAAA,IAAI,KAAA,IAAS,OAAO,GAAA,EAAK;AACvB,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,GAAG,YAAY,CAAA;AACvE,MAAA,MAAM,OAAA,GACJ,eAAA,CAAgB,MAAA,GAAS,CAAA,GACrB,QAAA,CAAS,eAAA,CAAgB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,GAC1C,MAAM,MAAA,CAAO,MAAA;AAEnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,CAAA;AAAA,QACX,OAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAA,CAAM,OAAA,GAAU,OAAO,GAAI;AAAA,OAC9C;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,MAAA,CAAO,GAAA,GAAM,KAAA,GAAQ,CAAA;AAAA,MAChC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,MAAA,EACA,UAAA,EAC0B;AAC1B,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,UAAU,CAAA;AAClE,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,UAAU,CAAA;AAE5D,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA;AAEjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,QAAA,CAAS,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA;AAC7C,IAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,KAAK,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,CAAA;AACjD,IAAA,QAAA,CAAS,MAAA,CAAO,KAAK,IAAA,CAAK,IAAA,CAAK,OAAO,MAAA,GAAS,GAAI,IAAI,CAAC,CAAA;AAExD,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,KAAA,GAAS,OAAA,GAAU,CAAC,CAAA,GAAI,CAAC,CAAA,IAAgB,CAAA;AAE/C,IAAA,IAAI,KAAA,IAAS,OAAO,GAAA,EAAK;AACvB,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,GAAG,YAAY,CAAA;AACvE,MAAA,MAAM,OAAA,GACJ,eAAA,CAAgB,MAAA,GAAS,CAAA,GACrB,QAAA,CAAS,eAAA,CAAgB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,GAC1C,MAAM,MAAA,CAAO,MAAA;AAEnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,CAAA;AAAA,QACX,OAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAA,CAAM,OAAA,GAAU,OAAO,GAAI;AAAA,OAC9C;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,MAAA,CAAO,GAAA,GAAM,KAAA,GAAQ,CAAA;AAAA,MAChC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,UAAA,EAAmC;AAC3D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,MAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,UAAU,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,UAAA,EAMC;AACD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA,CAAK,OAAO,aAAa,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AAExC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA;AAEjC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,GAAA,EAAK,GAAG,WAAW,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAO,MAAA,CAAO,GAAA;AAAA,MACd,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,MACzC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,MAAc,MAAA,EAA+B;AACpD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,EACtB;AAAA,EAEA,YAAA,CAAa,MAAc,MAAA,EAA+B;AACxD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,MAAA;AAAA,EAC1B;AACF;ACjHO,IAAM,wBAAA,GAAiD;AAAA,EAC5D,aAAA,EAAe,EAEjB,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf,KAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EAER,WAAA,CACE,KAAA,EACA,aAAA,GAAwB,EAAA,EACxB,SAAiB,aAAA,EACjB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA,EAEA,MAAM,IAAI,IAAA,EAA2D;AACnE,IAAA,MAAM,EAAA,GAAKC,kBAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACzC,IAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAE3B,IAAA,MAAM,GAAA,GAAgB;AAAA,MACpB,GAAG,IAAA;AAAA,MACH,EAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACxC,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,MAAM,OAAO,EAAE,CAAA,CAAA;AAEvC,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AACrD,IAAA,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,OAAA,EAAS,KAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA;AAEzE,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA,EAAK,KAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA;AAErE,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,GAAS,CAAA,EAAG,KAAK,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA,GAAK,IAAA;AACtE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,WAAW,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AACxD,MAAA,MAAM,KAAK,KAAA,CAAM,MAAA;AAAA,QACf,SAAA;AAAA,QACA,IAAA,CAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK;AAAA,OACtC;AAAA,IACF;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAsC;AAC9C,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,MAAM,OAAO,EAAE,CAAA,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,OAAO,CAAA;AAE7C,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,GAAyB,EAAC,EAGnC;AACD,IAAA,MAAM,EAAE,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,MAAA;AAEnC,IAAA,IAAI,OAAiB,EAAC;AAEtB,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,KAAA,EAAQ,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,OAAA,EAAS;AAC7C,MAAA,IAAA,GAAO,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,IAAA,GAAO,IAAA,CAAK,mBAAA;AAAA,QACV,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,QACjE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,WAA+B,EAAC;AAEpC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,IAAI,YAAY,CAAA;AAC9D,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEnC,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AACvB,IAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAA;AAEhD,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,CAAC,EAAE,CAAA,IAAK,QAAA,EAAU;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA,EAAG;AACnC,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,EACvB;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,GAAgB,EAAA,EAAyB;AACvD,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,OAAO,IAAA,CAAK,mBAAA;AAAA,MAChB,IAAI,KAAK,GAAA,CAAI,OAAA,KAAY,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,MAChD;AAAA,KACF;AAEA,IAAA,IAAI,SAA6B,EAAC;AAElC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,IAAI,YAAY,CAAA;AAC9D,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEjC,IAAA,KAAA,MAAW,CAAC,EAAE,CAAA,IAAK,OAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAA,CACJ,MAAA,EACA,KAAA,GAAgB,EAAA,EACK;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,QAAQ,MAAM,CAAA,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAC,CAAA;AAErD,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CACJ,SAAA,EACA,OAAA,EAOC;AACD,IAAA,MAAM,OAAO,IAAA,CAAK,mBAAA;AAAA,MAChB,SAAA,IAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,MAC3D,OAAA,wBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAM,WAAmC,EAAC;AAC1C,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA,EAAK,GAAG,EAAE,CAAA;AAE9C,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,WAAA,EAAA;AAEA,UAAA,QAAA,CAAS,IAAI,MAAM,CAAA,GAAA,CAAK,SAAS,GAAA,CAAI,MAAM,KAAK,CAAA,IAAK,CAAA;AAErD,UAAA,IAAI,IAAI,OAAA,EAAS;AACf,YAAA,YAAA,EAAA;AAAA,UACF;AAEA,UAAA,IAAI,GAAA,CAAI,WAAW,cAAA,EAAgB;AACjC,YAAA,YAAA,EAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,WAAA,CAAY,GAAA,CAAI,IAAI,MAAM,CAAA;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA,EAAa,WAAA,GAAc,CAAA,GAAI,YAAA,GAAe,WAAA,GAAc,CAAA;AAAA,MAC5D,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAA2B;AAC/B,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,EAAI,GAAI,KAAK,aAAA,GAAgB,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAEhE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,MAAA,CAAQ,CAAA;AACzD,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,MAAM,aAAA,CAAc,GAAA,EAAK,GAAG,MAAM,CAAA;AAE/D,MAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,QAAA,MAAM,IAAA,CAAK,MAAM,GAAA,CAAI,CAAA,EAAG,KAAK,MAAM,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAA;AAC9C,QAAA,OAAA,EAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,GAAA,EAAK,GAAG,MAAM,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,cAAc,IAAA,EAAoB;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACzD,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,IAAA,OAAO,CAAA,EAAG,KAAK,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,GAAG,CAAA,CAAA;AAAA,EACnD;AAAA,EAEQ,mBAAA,CAAoB,OAAc,GAAA,EAAsB;AAC9D,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,SAAA,GACJ,KAAA,IAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AACzE,IAAA,MAAM,OAAA,GAAU,GAAA,oBAAO,IAAI,IAAA,EAAK;AAEhC,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,SAAS,CAAA;AAClC,IAAA,OAAO,WAAW,OAAA,EAAS;AACzB,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAO,CAAC,CAAA;AACrC,MAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAQ,GAAI,CAAC,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CAAc,KAAe,MAAA,EAAiC;AACpE,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,IACvC,MAAA,CAAO,MAAA,GACP,CAAC,MAAA,CAAO,MAAM,CAAA;AAClB,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,OAAO,KAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,OAAO,QAAA,IAAY,GAAA,CAAI,QAAA,KAAa,MAAA,CAAO,UAAU,OAAO,KAAA;AAEhE,IAAA,IAAI,OAAO,UAAA,IAAc,GAAA,CAAI,UAAA,KAAe,MAAA,CAAO,YAAY,OAAO,KAAA;AAEtE,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,YAAY,MAAA,CAAO,OAAA;AACzD,MAAA,OAAO,KAAA;AAET,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAa,GAAA,EAAuC;AAC1D,IAAA,MAAM,MAAA,GAAiC;AAAA,MACrC,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,WAAA,EAAY;AAAA,MACrC,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAA,EAAS,GAAA,CAAI,OAAA,GAAU,GAAA,GAAM;AAAA,KAC/B;AAEA,IAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,GAAA,CAAI,MAAA;AACpC,IAAA,IAAI,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,SAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,GAAA,CAAI,IAAA;AAChC,IAAA,IAAI,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,UAAA,GAAa,GAAA,CAAI,UAAA;AAC5C,IAAA,IAAI,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,SAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,SAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,GAAA,CAAI,KAAA;AAClC,IAAA,IAAI,IAAI,OAAA,EAAS,MAAA,CAAO,UAAU,IAAA,CAAK,SAAA,CAAU,IAAI,OAAO,CAAA;AAC5D,IAAA,IAAI,IAAI,QAAA,EAAU,MAAA,CAAO,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAE/D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAe,IAAA,EAAwC;AAC7D,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAAA,MAClC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAA,EAAS,KAAK,OAAA,KAAY,GAAA;AAAA,MAC1B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA,GAAU,KAAK,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AAAA,MACnD,UAAU,IAAA,CAAK,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAI;AAAA,KACxD;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,GAAA,EAGjC;AACA,EAAA,OAAO;AAAA,IACL,WACE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,iBAAiB,GAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,IAAA,EAAK,IACxD,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAC3B,SAAA;AAAA,IACF,SAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IAAK;AAAA,GAC9C;AACF;AC5XO,IAAM,sBAAN,MAAiD;AAAA,EAC9C,KAAA,uBAAmC,GAAA,EAAI;AAAA,EACvC,QAAA,uBAAqC,GAAA,EAAI;AAAA,EACzC,aAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,aAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,eAAA,uBAA6C,GAAA,EAAI;AAAA,EACjD,YAA4C,EAAC;AAAA,EAC7C,UAAA,GAAsB,KAAA;AAAA,EAE9B,WAAA,GAAc;AAAA,EAAC;AAAA,EAEf,MAAM,OAAA,GAAyB;AAAA,EAE/B;AAAA,EAEA,MAAM,UAAA,GAA4B;AAEhC,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC7B;AAAA,EAEA,MAAM,WAAW,IAAA,EAKK;AACpB,IAAA,MAAM,MAAA,GAASA,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AAC7C,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,QAAQ,CAAA;AAE1D,IAAA,MAAM,IAAA,GAAiB;AAAA,MACrB,EAAA,EAAI,MAAA;AAAA,MACJ,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY;AAAA,MAC9B,YAAA;AAAA,MACA,IAAA,EAAO,KAAK,IAAA,IAAQ,UAAA;AAAA,MACpB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,cAAc,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,WAAA,IAAe,MAAM,CAAA;AACvD,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA;AAEnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAyC;AAC7D,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA;AACzD,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,aAAa,MAAA,EAA0C;AAC3D,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,EACnC;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,IAAA,EAC0B;AAC1B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC/C,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,OAAA,GAAoB;AAAA,MACxB,GAAG,QAAA;AAAA,MACH,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,MAAA;AAAA,MACJ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,KAAU,SAAS,KAAA,EAAO;AAC/C,MAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AACtD,MAAA,IAAA,CAAK,cAAc,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,WAAA,IAAe,MAAM,CAAA;AAAA,IACzD;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAAkC;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA;AACxB,IAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,CAAC,SAAA,EAAW,YAAA,KAAiB;AACtD,MAAA,IAAI,KAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG,WAAW,MAAA,EAAQ;AACnD,QAAA,IAAA,CAAK,aAAA,CAAc,OAAO,YAAY,CAAA;AACtC,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,MAChC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,SAAA,KAAc;AAC5C,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,MAChC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,QAAA,EAAmC;AACpD,IAAA,MAAMC,OAAAA,GAAAA,CAAU,MAAM,OAAO,UAAU,CAAA,EAAG,OAAA;AAC1C,IAAA,OAAOA,OAAAA,CAAO,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,cAAA,CACJ,KAAA,EACA,QAAA,EAC0B;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,cAAc,OAAO,IAAA;AACxC,IAAA,MAAMA,OAAAA,GAAAA,CAAU,MAAM,OAAO,UAAU,CAAA,EAAG,OAAA;AAC1C,IAAA,MAAM,QAAQ,MAAMA,OAAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,KAAK,YAAY,CAAA;AAC9D,IAAA,OAAO,QAAQ,IAAA,GAAO,IAAA;AAAA,EACxB;AAAA,EAEA,MAAM,aAAA,CACJ,MAAA,EACA,IAAA,GAGI,EAAC,EACa;AAClB,IAAA,MAAM,SAAA,GAAYD,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQA,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,WAAW,CAAA;AAClD,IAAA,MAAM,YAAA,GAAeA,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,WAAW,CAAA;AACzD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,OAAA,GAAmB;AAAA,MACvB,EAAA,EAAI,SAAA;AAAA,MACJ,MAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,SAAQ,GAAI,KAAA,GAAQ,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA;AAAA,MAC9D,SAAA,EAAW,IAAI,WAAA,EAAY;AAAA,MAC3B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KAClB;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AACpC,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,YAAA,EAAc,SAAS,CAAA;AAE9C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAAwC;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA;AAAA,EACrC;AAAA,EAEA,MAAM,cAAc,SAAA,EAAqC;AACvD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAAiC;AACxD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,SAAA,KAAc;AAC5C,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,QAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,UAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,QAChD;AACA,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAC9B,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,oBAAA,CACJ,MAAA,EACA,YAAA,EACe;AACf,IAAA,MAAM,UAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,KAAK,EAAC;AACrD,IAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AAEzB,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAG,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,kBAAA,CACJ,MAAA,EACA,KAAA,GAAgB,CAAA,EACG;AACnB,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,KAAK,EAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,mBAAA,CACJ,QAAA,EACA,MAAA,EACA,eAAuB,CAAA,EACL;AAClB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,QAAQ,YAAY,CAAA;AAClE,IAAA,MAAMC,OAAAA,GAAAA,CAAU,MAAM,OAAO,UAAU,CAAA,EAAG,OAAA;AAE1C,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,IAAI,MAAMA,OAAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA,EAAG;AACxC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,GAAgC;AACpC,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAc,MAAA,EAOwB;AAC1C,IAAA,MAAM,EAAE,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,MAAA;AACnC,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAA,GAAQ,OAAA,EAAQ;AAC1C,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,MAAM,CAAA;AACvE,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAChC,QAAA,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,MAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MACtD;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,QAAA;AACT,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,OAAO,QAAQ,CAAA;AAC1D,IAAA,IAAI,OAAO,OAAA,KAAY,MAAA;AACrB,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,OAAO,OAAO,CAAA;AACxD,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,SAAS,KAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,MAAA,EAAO;AAAA,EACxE;AAAA,EAEA,MAAM,eAAe,IAAA,EAAyB;AAC5C,IAAA,MAAM,EAAA,GAAKD,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACzC,IAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,IAAA,MAAM,GAAA,GAAM,EAAE,GAAG,IAAA,EAAM,IAAI,SAAA,EAAU;AACrC,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,GAAG,CAAA;AACvB,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;AC9PO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,OAAA,uBAQA,GAAA,EAAI;AAAA,EACJ,OAAA,uBAAqC,GAAA,EAAI;AAAA;AAAA,EACzC,MAAA;AAAA,EAER,WAAA,CAAY,MAAA,GAAiC,EAAC,EAAG;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,GAAA;AAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,gBAAA,EAAkB,CAAA;AAAA,MAClB,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAA,EAAwC;AACzD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAGtC,IAAA,IAAI,UAAU,MAAA,CAAO,WAAA,KAAgB,IAAA,IAAQ,MAAA,CAAO,eAAe,GAAA,EAAK;AACtE,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,iBAAA,EAAmB,KAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,iBAAA,EAAmB,KAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,MAAA;AAElC,IAAA,IAAI,WAAA,KAAgB,IAAA,IAAQ,WAAA,GAAc,GAAA,EAAK;AAC7C,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,iBAAA,EAAmB,CAAA;AAAA,QACnB,WAAA,EAAa,IAAI,IAAA,CAAK,WAAW,CAAA;AAAA,QACjC,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,mBAAmB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,cAAc,QAAQ,CAAA;AAAA,MACjE,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAwC;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,MACzC,QAAA,EAAU,CAAA;AAAA,MACV,WAAA,EAAa,IAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa;AAAA,KACf;AAEA,IAAA,MAAA,CAAO,QAAA,IAAY,CAAA;AACnB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AAGrB,IAAA,IAAI,UAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,KAAK,EAAC;AAC3C,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAEhB,IAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAG,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAEhC,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAG/B,IAAA,IAAI,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa;AAC9C,MAAA,MAAM,cAAc,IAAI,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAC3D,MAAA,MAAA,CAAO,QAAA,GAAW,GAAA;AAClB,MAAA,MAAA,CAAO,WAAA,GAAc,YAAY,OAAA,EAAQ;AACzC,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAE/B,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,iBAAA,EAAmB,CAAA;AAAA,QACnB,WAAA;AAAA,QACA,eAAe,MAAA,CAAO;AAAA,OACxB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,iBAAA,EAAmB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,MAAA,CAAO,WAAA,GAAc,OAAO,QAAQ,CAAA;AAAA,MACxE,eAAe,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAkC;AAClE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,YAAA,GAAe,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,YAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,GAAA,GAAM,YAAY,CAAA;AAE/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,MACzC,QAAA,EAAU,CAAA;AAAA,MACV,WAAA,EAAa,IAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa;AAAA,KACf;AAEA,IAAA,MAAA,CAAO,QAAA,GAAW,KAAK,MAAA,CAAO,WAAA;AAC9B,IAAA,MAAA,CAAO,QAAA,GAAW,GAAA;AAClB,IAAA,MAAA,CAAO,WAAA,GAAc,YAAY,OAAA,EAAQ;AACzC,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,cAAc,MAAA,EAA+B;AACjD,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,cAAc,MAAA,EAA+B;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,QAAA,GAAW,CAAA;AAClB,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAClB,MAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AACrB,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAAA,IACjC;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,iBAAA,CAAkB,MAAA,EAAgB,KAAA,GAAgB,EAAA,EAAqB;AAC3E,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,KAAK,EAAC;AAC7C,IAAA,OAAO,OAAA,CACJ,KAAA,CAAM,CAAC,KAAK,CAAA,CACZ,OAAA,EAAQ,CACR,GAAA,CAAI,CAAC,SAAA,KAAc,IAAI,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAKnB;AACD,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,KAAK,EAAC;AAC7C,IAAA,MAAM,sBAAsB,OAAA,CAAQ,MAAA;AACpC,IAAA,MAAM,eAAe,IAAA,CAAK,KAAA;AAAA,MACxB,mBAAA,GAAsB,KAAK,MAAA,CAAO;AAAA,KACpC;AAEA,IAAA,IAAI,WAAA,GAA2B,IAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACtC,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,QAAA,KAAa,IAAA,EAAM;AACtC,MAAA,WAAA,GAAc,IAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,4BAAA,GACJ,YAAA,GAAe,CAAA,GAAI,IAAA,CAAK,OAAO,WAAA,GAAc,CAAA;AAE/C,IAAA,OAAO;AAAA,MACL,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,kBAAkB,eAAA,EAAkC;AAClD,IAAA,OACE,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,eAAA,IAAmB,KAAK,MAAA,CAAO,gBAAA;AAAA,EAE9D;AAAA,EAEA,SAAA,GAA2B;AACzB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA,EAEA,UAAU,MAAA,EAAsC;AAC9C,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AACF;ACjMO,IAAM,sBAAN,MAA0B;AAAA,EACvB,OAAmB,EAAC;AAAA,EACpB,aAAA;AAAA,EAER,WAAA,CAAY,aAAA,GAAwB,wBAAA,CAAyB,aAAA,EAAe;AAC1E,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA,EAEA,MAAM,IAAI,IAAA,EAA2D;AACnE,IAAA,MAAM,EAAA,GAAKA,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACzC,IAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAE3B,IAAA,MAAM,GAAA,GAAgB;AAAA,MACpB,GAAG,IAAA;AAAA,MACH,EAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,GAAG,CAAA;AAClB,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAsC;AAC9C,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AAAA,EACnD;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,GAAyB,EAAC,EAGnC;AACD,IAAA,MAAM,EAAE,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,MAAA;AAEnC,IAAA,IAAI,YAAA,GAAe,CAAC,GAAG,IAAA,CAAK,IAAI,CAAA;AAEhC,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,YAAA,GAAe,aAAa,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,IACvC,MAAA,CAAO,MAAA,GACP,CAAC,MAAA,CAAO,MAAM,CAAA;AAClB,MAAA,YAAA,GAAe,YAAA,CAAa,OAAO,CAAC,GAAA,KAAQ,QAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,GAAe,YAAA,CAAa,MAAA;AAAA,QAC1B,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,KAAa,MAAA,CAAO;AAAA,OACnC;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,YAAA,GAAe,YAAA,CAAa,MAAA;AAAA,QAC1B,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAA,KAAe,MAAA,CAAO;AAAA,OACrC;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,MAAA,YAAA,GAAe,YAAA,CAAa,MAAA;AAAA,QAC1B,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,KAAY,MAAA,CAAO;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAEvB,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,YAAA,GAAe,aAAa,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,aAAa,SAAS,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,YAAA,GAAe,aAAa,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,aAAa,OAAO,CAAA;AAAA,IACtE;AAGA,IAAA,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,OAAA,EAAS,CAAA;AAEzE,IAAA,MAAM,QAAQ,YAAA,CAAa,MAAA;AAC3B,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,CAAM,MAAA,EAAQ,SAAS,KAAK,CAAA;AAE/D,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAM;AAAA,EACtC;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,GAAgB,EAAA,EAAyB;AACvD,IAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAEhE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CACrB,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,SAAA,IAAa,UAAU,CAAA,CAC3C,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,OAAA,EAAS,CAAA,CAC5D,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAEjB,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAA,CACJ,MAAA,EACA,KAAA,GAAgB,EAAA,EACK;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CACnB,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,MAAA,KAAW,MAAM,CAAA,CACrC,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,OAAA,EAAS,CAAA,CAC5D,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAEjB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CACJ,SAAA,EACA,OAAA,EAOC;AACD,IAAA,MAAM,KAAA,GAAQ,SAAA,IAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AACzE,IAAA,MAAM,GAAA,GAAM,OAAA,oBAAW,IAAI,IAAA,EAAK;AAEhC,IAAA,MAAM,YAAA,GAAe,KAAK,IAAA,CAAK,MAAA;AAAA,MAC7B,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAA,IAAa,KAAA,IAAS,IAAI,SAAA,IAAa;AAAA,KACtD;AAEA,IAAA,MAAM,WAAmC,EAAC;AAC1C,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,WAAA,EAAA;AAEA,MAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,MAAA,QAAA,CAAS,MAAM,CAAA,GAAA,CAAK,QAAA,CAAS,MAAM,KAAK,CAAA,IAAK,CAAA;AAE7C,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,YAAA,EAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,cAAA,EAAgB;AACjC,QAAA,YAAA,EAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,WAAA,CAAY,GAAA,CAAI,IAAI,MAAM,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA,EAAa,WAAA,GAAc,CAAA,GAAI,YAAA,GAAe,WAAA,GAAc,CAAA;AAAA,MAC5D,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAA2B;AAC/B,IAAA,MAAM,aAAa,IAAI,IAAA;AAAA,MACrB,KAAK,GAAA,EAAI,GAAI,KAAK,aAAA,GAAgB,EAAA,GAAK,KAAK,EAAA,GAAK;AAAA,KACnD;AACA,IAAA,MAAM,YAAA,GAAe,KAAK,IAAA,CAAK,MAAA;AAE/B,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,aAAa,UAAU,CAAA;AAEjE,IAAA,OAAO,YAAA,GAAe,KAAK,IAAA,CAAK,MAAA;AAAA,EAClC;AAAA,EAEQ,cAAA,GAAuB;AAG7B,IAAA,MAAM,aAAa,IAAI,IAAA;AAAA,MACrB,KAAK,GAAA,EAAI,GAAI,KAAK,aAAA,GAAgB,EAAA,GAAK,KAAK,EAAA,GAAK;AAAA,KACnD;AACA,IAAqB,KAAK,IAAA,CAAK;AAE/B,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,aAAa,UAAU,CAAA;AAAA,EACnE;AACF;AAQO,SAASE,oBAAmB,GAAA,EAGjC;AACA,EAAA,OAAO;AAAA,IACL,WACE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,iBAAiB,GAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,IAAA,EAAK,IACxD,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAC3B,SAAA;AAAA,IACF,SAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IAAK;AAAA,GAC9C;AACF;ACtKO,IAAM,aAAN,MAAiB;AAAA,EACd,WAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,yBAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,KAAA;AAC1B,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,KAAA;AAC3C,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,cAAA,IAAkB,IAAIC,gCAAA,EAAe;AAClE,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,uBAAA;AACjC,IAAA,IAAA,CAAK,yBAAA,GAA4B,OAAO,yBAAA,IAA6B,IAAA;AAAA,EACvE;AAAA,EAEA,MAAM,SAAS,GAAA,EAAiC;AAC9C,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAID,oBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,iBAAiB,SAAS,CAAA;AACrE,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,QAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAI7B,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,QAAA,EAAU;AACjC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,iCAAA,EAAmC,GAAG,CAAA;AAAA,MAClE;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,eAAA,EAAiB;AAC1C,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,KAAK,QAAQ,CAAA;AACrE,MAAA,IAAI,CAAC,mBAAmB,KAAA,EAAO;AAC7B,QAAA,OAAO,KAAK,aAAA,CAAc,kBAAA,CAAmB,OAAO,IAAA,CAAK,IAAI,GAAG,GAAG,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,WAAA,CAAY,eAAA,CAAgB,KAAK,KAAK,CAAA;AACtE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,0BAAA,EAA4B,GAAG,CAAA;AAAA,MAC3D;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW;AAAA,QAC7C,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,IAAA,EAAM,KAAK,IAAA,IAAQ,UAAA;AAAA,QACnB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,IAAA,CAAK,yBAAA,IAA6B,IAAA,CAAK,KAAA,EAAO;AAChD,QAAA,MAAM,iBAAA,GAAoBF,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACxD,QAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,IAAA,CAAK,OAAO,0BAA0B,iBAAiB,CAAA,CAAA;AAElF,QAAA,MAAM,IAAA,CAAK,YAAY,aAAA,CAAc,IAAA,CAAK,IAAI,EAAE,SAAA,EAAW,WAAW,CAAA;AACtE,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CACnB,YAAA,GACA,WAAA,CAAY,eAAA,EAAiB,KAAK,KAAK,CAAA;AAC1C,QAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,CAAK,KAAA,EAAO,GAAG,QAAA,EAAU,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,UAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,QACV;AAAA,UACE,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,yBAAA;AAAA,UACT,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAAA,UAC5B,oBAAA,EAAsB,IAAA,CAAK,yBAAA,IAA6B,CAAC,CAAC,IAAA,CAAK;AAAA,SACjE;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,EAAuB,GAAG,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,GAAA,EAAiC;AAC3C,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAIE,oBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,cAAc,SAAS,CAAA;AAClE,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,QAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAE7B,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,QAAA,EAAU;AACjC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,iCAAA,EAAmC,GAAG,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,eAAA,CAAgB,KAAK,KAAK,CAAA;AAC9D,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,SAAS,CAAA;AACjD,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,EAAuB,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,EAAE,CAAA;AAC7D,QAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,UAAA,IAAI,KAAK,WAAA,EAAa;AACpB,YAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,cACzB,MAAA,EAAQ,cAAA;AAAA,cACR,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,WAAW,IAAA,CAAK,KAAA;AAAA,cAChB,QAAA,EAAU,MAAA;AAAA,cACV,SAAA;AAAA,cACA,SAAA;AAAA,cACA,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO;AAAA,aACR,CAAA;AAAA,UACH;AACA,UAAA,OAAO,IAAA,CAAK,aAAA;AAAA,YACV,CAAA,6BAAA,EAAgC,IAAA,CAAK,IAAA,CAAA,CAAM,aAAA,CAAc,WAAA,CAAa,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAI,IAAK,GAAK,CAAC,CAAA,QAAA,CAAA;AAAA,YACtG;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,GACvB,MAAM,KAAK,WAAA,CAAY,cAAA;AAAA,QACrB,IAAA,CAAK,QAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP,GACA,KAAA;AACJ,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,MAAM,KAAK,iBAAA,CAAkB,SAAA,EAAW,WAAW,IAAA,CAAK,EAAA,EAAI,KAAK,KAAK,CAAA;AACtE,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,EAAuB,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,EAAE,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,WAAA,CAAY,aAAA,CAAc,KAAK,EAAA,EAAI;AAAA,QAC5D,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAsB;AAAA,QAC1B,KAAK,IAAA,CAAK,EAAA;AAAA,QACV,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,QACjC,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI;AAAA,OACvC;AAEA,MAAA,MAAM,WAAA,GAAcE,+BAAA,CAAc,OAAA,EAAS,IAAA,CAAK,SAAA,EAAW;AAAA,QACzD,WAAW,IAAA,CAAK,YAAA;AAAA,QAChB,QAAQ,IAAA,CAAK,SAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,OAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI;AAAA,QACzC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACnC,CAAA;AAED,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAAA,QAC5B,WAAA;AAAA,QACA,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,GAAG,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,GAAA,EAAiC;AAC5C,IAAA,MAAM,KAAA,GAAQC,sCAAoB,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,sBAAA,EAAwB,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAIH,oBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUI,oBAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAChC,MAAA,IAAI,OAAA,IAAW,QAAQ,GAAA,EAAK;AAC1B,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,kBAAA,CAAmB,OAAA,CAAQ,GAAG,CAAA;AAErD,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,YACzB,MAAA,EAAQ,QAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,GAAA;AAAA,YAChB,WAAW,OAAA,CAAQ,KAAA;AAAA,YACnB,QAAA,EAAU,MAAA;AAAA,YACV,SAAA;AAAA,YACA,SAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,eAAA,EAAiB,GAAG,CAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAiC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,EAAE,cAAa,GAAI,IAAA;AAEzB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa,EAAE,SAAS,IAAA,EAAM,WAAA,EAAa,IAAI,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,sBAAA,EAAwB,GAAG,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,GAAG,GAAA,EAAiC;AACxC,IAAA,MAAM,KAAA,GAAQD,sCAAoB,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUC,oBAAA,CAAI,MAAA,CAAO,KAAA,EAAO,KAAK,SAAA,EAAW;AAAA,QAChD,QAAQ,IAAA,CAAK,SAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,QAAQ,GAAG,CAAA;AAC5D,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI;AAAA,OAC7B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,uBAAA,EAAyB,GAAG,CAAA;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,GAAA,EAAiC;AACpD,IAAA,MAAM,KAAA,GAAQD,sCAAoB,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAIH,oBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUI,oBAAA,CAAI,MAAA,CAAO,KAAA,EAAO,KAAK,SAAS,CAAA;AAChD,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAK7B,MAAA,MAAM,EAAE,eAAA,EAAiB,WAAA,EAAa,eAAA,EAAgB,GAAI,IAAA;AAE1D,MAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,WAAA,EAAa;AACpC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mCAAA,EAAqC,GAAG,CAAA;AAAA,MACpE;AAEA,MAAA,IAAI,gBAAgB,eAAA,EAAiB;AACnC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,WAAW,CAAA;AACnE,MAAA,IAAI,CAAC,mBAAmB,KAAA,EAAO;AAC7B,QAAA,OAAO,KAAK,aAAA,CAAc,kBAAA,CAAmB,OAAO,IAAA,CAAK,IAAI,GAAG,GAAG,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,QAAQ,GAAG,CAAA;AAC5D,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,GACvB,MAAM,KAAK,WAAA,CAAY,cAAA;AAAA,QACrB,eAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP,GACA,KAAA;AACJ,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,+BAAA,EAAiC,GAAG,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,WAAA,CAAY,kBAAA;AAAA,QAC7C,IAAA,CAAK,EAAA;AAAA,QACL;AAAA,OACF;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,mBAAA;AAAA,QACtC,WAAA;AAAA,QACA,IAAA,CAAK,EAAA;AAAA,QACL;AAAA,OACF;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,UACV,gEAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,WAAA,CAAY,aAAa,WAAW,CAAA;AACvE,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,KAAK,WAAA,CAAY,oBAAA;AAAA,UACrB,IAAA,CAAK,EAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI;AAAA,QACzC,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AAEjD,MAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc;AACzC,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,cAAa,CAAE,eAAA,CAAgB,KAAK,KAAK,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,CAAK,KAAA,EAAO,GAAG,QAAA,EAAU,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,iBAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,GAAA,EAAiC;AACpD,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAIJ,oBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,eAAe,SAAS,CAAA;AACnE,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,QAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAElB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,gBAAgB,KAAK,CAAA;AACzD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,UAAA,GAAaF,kBAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACjD,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,OAAO,kCAAkC,UAAU,CAAA,CAAA;AAC5E,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CACnB,YAAA,GACA,aAAA,CAAc,QAAA,EAAU,KAAK,KAAK,CAAA;AACrC,QAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,CAAK,KAAA,EAAO,GAAG,QAAA,EAAU,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,wBAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,+BAAA,EAAiC,GAAG,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,GAAA,EAAiC;AACjD,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAE1C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,6BAAA,EAA+B,GAAG,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,KAAK,YAAA,CAAa,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAkB,CAAA;AAAA,IACvE,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,2BAAA,EAA6B,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,CACZ,SAAA,EACA,SAAA,EACA,QACA,SAAA,EACe;AACf,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,MAAA,IAAU,SAAS,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,QACzB,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA,EAAU,MAAA;AAAA,QACV,SAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa,IAAA,EAAmC;AACtD,IAAA,MAAM,EAAE,YAAA,EAAc,GAAG,SAAA,EAAU,GAAI,IAAA;AACvC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,IAAA,EAAW,MAAA,GAAiB,GAAA,EAAe;AAC9D,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,MACxC,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,aAAA,CAAc,SAAiB,MAAA,EAA0B;AAC/D,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,MACtE,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,kBAAkB,KAAA,EAA0C;AAClE,IAAA,OAAO,IAAI,QAAA;AAAA,MACT,KAAK,SAAA,CAAU;AAAA,QACb,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,mBAAA;AAAA,QACP,YAAY,KAAA,CAAM;AAAA,OACnB,CAAA;AAAA,MACD;AAAA,QACE,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,MAAA,CAAO,KAAA,CAAM,UAAA,IAAc,EAAE;AAAA;AAC9C;AACF,KACF;AAAA,EACF;AACF,CAAA;;;ACjhBA,SAAS,MAAA,CAAO,GAAA,EAAa,QAAA,GAAmB,EAAA,EAAY;AAC1D,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,IAAK,QAAA;AAC7B;AAEA,SAAS,UAAA,CAAW,GAAA,EAAa,QAAA,GAAoB,KAAA,EAAgB;AACnE,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,EAAA,OAAO,GAAA,CAAI,aAAY,KAAM,MAAA;AAC/B;AAEA,SAAS,SAAA,CAAU,GAAA,EAAa,QAAA,GAAmB,CAAA,EAAW;AAC5D,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,EAAA,OAAO,QAAA,CAAS,KAAK,EAAE,CAAA;AACzB;AAEA,SAAS,kBAAA,GAAmC;AAE1C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,WAAA,EAAY;AAC1D,EAAA,IACE,KAAA,IACA,CAAC,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,WAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EACnE;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,YAAA,EAAa,GAAIO,2BAAA,CAAQ,IAAI,CAAA;AACrC,IAAA,MAAM,EAAE,IAAA,EAAAC,KAAAA,EAAK,GAAID,4BAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAaC,KAAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,gBAAgB,CAAA;AACvD,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,UAAA,EAAY,MAAM,CAAA;AAErD,IAAA,IAAI,aAAA,CAAc,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAChD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,MAAA,IAAW,aAAA,CAAc,QAAA,CAAS,sBAAsB,CAAA,EAAG;AAEzD,MAAA,IACE,cAAc,QAAA,CAAS,UAAU,KACjC,aAAA,CAAc,QAAA,CAAS,YAAY,CAAA,EACnC;AACA,QAAA,OAAO,UAAA;AAAA,MACT,CAAA,MAAA,IAAW,aAAA,CAAc,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1C,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA,MAAA,IAAW,aAAA,CAAc,QAAA,CAAS,sBAAsB,CAAA,EAAG;AACzD,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,eAAe,kBACb,YAAA,EACsB;AACtB,EAAA,QAAQ,YAAA;AAAc,IACpB,KAAK,QAAA;AACH,MAAA,OAAO,IAAIC,mCAAA,CAAkB;AAAA,QAC3B,IAAA,EAAM,MAAA,CAAO,mBAAA,EAAqB,gBAAgB;AAAA,OACnD,CAAA;AAAA,IACH,KAAK,UAAA;AAAA,IACL,KAAK,OAAA;AAEH,MAAA,OAAO,IAAIA,mCAAA,CAAkB;AAAA,QAC3B,IAAA,EAAM,MAAA,CAAO,mBAAA,EAAqB,gBAAgB;AAAA,OACnD,CAAA;AAAA,IACH,KAAK,SAAA;AAEH,MAAA,OAAO,IAAIA,mCAAA,CAAkB;AAAA,QAC3B,IAAA,EAAM,MAAA,CAAO,mBAAA,EAAqB,gBAAgB;AAAA,OACnD,CAAA;AAAA,IACH,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAO,IAAI,mBAAA,EAAoB;AAAA;AAErC;AAEA,eAAsB,iBACpB,YAAA,EACyB;AACzB,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,kBAAA,EAAoB,KAAK,CAAA;AACxD,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,WAAA,EAAa;AAEf,IAAA,MAAM,EAAE,gBAAA,EAAAC,iBAAAA,EAAiB,GAAI,MAAM,OAAO,8BAAoB,CAAA;AAC9D,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,EAAa,wBAAwB,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,WAAA,EAAa,KAAK,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,IAAIA,iBAAAA,CAAiB,EAAE,KAAK,QAAA,EAAU,GAAA,EAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,aAAa,OAAA,IAAU;AAC7B,IAAA,WAAA,GAAc,YAAA;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,MAAM,aAAA,GAAiB,gBAAgB,kBAAA,EAAmB;AAC1D,IAAA,WAAA,GAAc,MAAM,kBAAkB,aAAa,CAAA;AACnD,IAAA,IAAK,YAAoB,OAAA,EAAS;AAChC,MAAA,MAAO,YAAoB,OAAA,EAAQ;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQC,gCAAA,CAAe,OAAA,EAAQ,IAAK,MAAA;AAE1C,EAAA,MAAM,cAAA,GAAiB,IAAIR,gCAAA,CAAe;AAAA,IACxC,SAAA,EAAW,SAAA,CAAU,qBAAA,EAAuB,EAAE,CAAA;AAAA,IAC9C,gBAAA,EAAkB,UAAA,CAAW,4BAAA,EAA8B,IAAI,CAAA;AAAA,IAC/D,gBAAA,EAAkB,UAAA,CAAW,4BAAA,EAA8B,IAAI,CAAA;AAAA,IAC/D,cAAA,EAAgB,UAAA,CAAW,0BAAA,EAA4B,IAAI,CAAA;AAAA,IAC3D,mBAAA,EAAqB,UAAA,CAAW,0BAAA,EAA4B,IAAI,CAAA;AAAA,IAChE,YAAA,EAAc,SAAA,CAAU,wBAAA,EAA0B,CAAC,CAAA;AAAA,IACnD,SAAA,EAAW,SAAA,CAAU,qBAAA,EAAuB,GAAG;AAAA,GAChD,CAAA;AAED,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,WAAA,EAAa;AAEf,IAAA,MAAM,KAAA,GAAQ,WAAA;AACd,IAAA,MAAM,cAAe,KAAA,CAAc,KAAA;AACnC,IAAA,OAAA,GAAU,IAAI,eAAe,WAAA,EAAa;AAAA,MACxC,WAAA,EAAa,SAAA,CAAU,sBAAA,EAAwB,CAAC,CAAA;AAAA,MAChD,YAAA,EAAc,SAAA,CAAU,0BAAA,EAA4B,EAAE,IAAI,EAAA,GAAK;AAAA,KAChE,CAAA;AACD,IAAA,WAAA,GAAc,IAAI,YAAY,WAAA,EAAa;AAAA,MACzC,YAAA,EAAc;AAAA,QACZ,MAAA,EAAQ,SAAA,CAAU,2BAAA,EAA6B,GAAM,CAAA;AAAA,QACrD,GAAA,EAAK,SAAA,CAAU,8BAAA,EAAgC,EAAE;AAAA,OACnD;AAAA,MACA,aAAA,EAAe;AAAA,QACb,MAAA,EAAQ,SAAA,CAAU,sBAAA,EAAwB,GAAK,CAAA;AAAA,QAC/C,GAAA,EAAK,SAAA,CAAU,yBAAA,EAA2B,GAAG;AAAA;AAC/C,KACD,CAAA;AACD,IAAA,WAAA,GAAc,IAAI,WAAA;AAAA,MAChB,WAAA;AAAA,MACA,SAAA,CAAU,4BAA4B,EAAE;AAAA,KAC1C;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,IAAI,sBAAA,CAAuB;AAAA,MACnC,WAAA,EAAa,SAAA,CAAU,sBAAA,EAAwB,CAAC,CAAA;AAAA,MAChD,YAAA,EAAc,SAAA,CAAU,0BAAA,EAA4B,EAAE,IAAI,EAAA,GAAK;AAAA,KAChE,CAAA;AACD,IAAA,WAAA,GAAc,IAAIS,qCAAA,CAAoB;AAAA,MACpC,YAAA,EAAc;AAAA,QACZ,MAAA,EAAQ,SAAA,CAAU,2BAAA,EAA6B,GAAM,CAAA;AAAA,QACrD,GAAA,EAAK,SAAA,CAAU,8BAAA,EAAgC,EAAE;AAAA,OACnD;AAAA,MACA,aAAA,EAAe;AAAA,QACb,MAAA,EAAQ,SAAA,CAAU,sBAAA,EAAwB,GAAK,CAAA;AAAA,QAC/C,GAAA,EAAK,SAAA,CAAU,yBAAA,EAA2B,GAAG;AAAA;AAC/C,KACD,CAAA;AACD,IAAA,WAAA,GAAc,UAAA,CAAW,mBAAA,EAAqB,IAAI,CAAA,GAC9C,IAAI,oBAAoB,SAAA,CAAU,0BAAA,EAA4B,EAAE,CAAC,CAAA,GACjE,MAAA;AAAA,EACN;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW;AAAA,IAC5B,KAAA,EAAO,WAAA;AAAA,IACP,KAAA;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,YAAA,EAAc,WAAW,CAAA;AAAA,IAC3C,YAAA,EAAc,MAAA,CAAO,gBAAA,EAAkB,KAAK,CAAA;AAAA,IAC5C,SAAA,EAAW,MAAA,CAAO,YAAA,EAAc,UAAU,CAAA;AAAA,IAC1C,WAAA,EAAa,MAAA,CAAO,cAAA,EAAgB,iBAAiB,CAAA;AAAA,IACrD,cAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,MAAA,CAAO,gBAAA,EAAkB,uBAAuB,CAAA;AAAA,IACzD,yBAAA,EAA2B,UAAA,CAAW,6BAAA,EAA+B,IAAI;AAAA,GAC1E,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,WAAA,GACjB,aAAA,GACE,YAAA,IAAgB,kBAAA,EAAmB;AACzC,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,YAAA,EAAc,YAAA;AAAA,IACd,KAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,IAAM,aAAa,gBAAA;;;ACrM1B,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,kBAAA,GAAqB,KAAA;AAC3B,IAAM,0BAAA,GAA6B,IAAA;AAE5B,IAAM,OAAN,MAAW;AAAA,EACR,OAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,SAAsB,MAAA,EAAyB;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAA,EAAW,OAAO,SAAA,IAAa,kBAAA;AAAA,MAC/B,gBAAA,EAAkB,OAAO,gBAAA,IAAoB,0BAAA;AAAA,MAC7C,MAAA,EAAQ,OAAO,MAAA,IAAU,UAAA;AAAA,MACzB,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,MAC9B,UAAA,EAAY,OAAO,UAAA,IAAc;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,IAAA,EAAyC;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,KAAK,CAAA;AAC9D,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,0BAAA,EAA2B;AAAA,MAC7D;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW;AAAA,QACzC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,IAAA,EAAM,KAAK,IAAA,IAAQ,UAAA;AAAA,QACnB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,WAAA,EAAoD;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA;AAAA,QAC9B,WAAA,CAAY,KAAA;AAAA,QACZ,WAAA,CAAY;AAAA,OACd;AACA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AAAA,MACxD;AAEA,MAAA,OAAO,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAAA,EAA8B;AACzC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,aAAa,YAAA,EAA2C;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAmB,YAAY,CAAA;AAClE,MAAA,IAAI,CAAC,WAAW,IAAI,IAAA,CAAK,QAAQ,SAAS,CAAA,mBAAI,IAAI,IAAA,EAAK,EAAG;AACxD,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,MACrE;AAEA,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,MAAM,CAAA;AAC3D,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,YAAY,CAAA;AAC7C,MAAA,OAAO,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,KAAA,EAA2C;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,UAAUN,oBAAAA,CAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAO,MAAA,EAAQ;AAAA,QACpD,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,QACpB,QAAA,EACE,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA;AAAA,OAC/D,CAAA;AACD,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAyC;AAC9D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,cAAA,CACJ,MAAA,EACA,eAAA,EACA,WAAA,EACqB;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,MAAM,CAAA;AACnD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA;AAAA,QAC/B,IAAA,CAAK,KAAA;AAAA,QACL;AAAA,OACF;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,MAClE;AAEA,MAAA,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,QAAQ,EAAE,QAAA,EAAU,aAAa,CAAA;AAC/D,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA;AAE5C,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,KAAA,EAAe,WAAA,EAA0C;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AACrD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,CAAW,IAAA,CAAK,IAAI,EAAE,QAAA,EAAU,aAAa,CAAA;AAChE,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AAE7C,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,MAAA,EAAqC;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,MAAM,CAAA;AACnD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA;AAC5C,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAEpC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,IAAA,EAAqC;AACtE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAErC,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,EAAE,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,cAAc,IAAA,EAAwB;AAC5C,IAAA,MAAM,OAAA,GAA2C;AAAA,MAC/C,KAAK,IAAA,CAAK,EAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK;AAAA,KACjB;AAEA,IAAA,MAAM,WAAA,GAA+B;AAAA,MACnC,WAAW,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA;AAAA,MACxD,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,KACtB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,WAAA,CAAY,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAOA,qBAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,QAAQ,WAAW,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAc,aAAa,QAAA,EAAmC;AAC5D,IAAA,OAAOL,uBAAA,CAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EACrD;AAAA,EAEQ,eAAe,KAAA,EAAgC;AACrD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,iBAAiB,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACjC,IAAA,QAAQ,KAAA,CAAM,CAAC,CAAA;AAAG,MAChB,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,GAAA;AAAA,MACf,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,GAAA;AAAA,MACf,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,IAAA;AAAA,MACf,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,KAAA;AAAA,MACf;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AACF;AAEO,SAAS,UAAA,CACd,SACA,MAAA,EACM;AACN,EAAA,OAAO,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AACjC;;;ACtKO,SAAS,4BAAA,GAA6D;AAC3E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,aAAA,EAAe,IAAA;AAAA,IACf,cAAA,EAAgB,IAAA;AAAA,IAChB,eAAA,EAAiB,KAAA;AAAA,IACjB,iBAAA,EAAmB,IAAA;AAAA,IACnB,sBAAA,EAAwB,EAAA;AAAA,IACxB,WAAA,EAAa,KAAA;AAAA,IACb,wBAAA,EAA0B;AAAA,GAC5B;AACF;;;AC7DO,IAAM,iBAAN,MAAkD;AAAA,EAC/C,OAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,SAAyB,MAAA,EAA6B;AAChE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,4BAAA,EAA6B,EAAG,GAAG,MAAA,EAAO;AAAA,EAC/D;AAAA,EAEA,MAAM,cAAc,OAAA,EAAwE;AAC1F,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAiB,OAAA,CAAQ,UAAA,EAAY,QAAQ,UAAU,CAAA;AAChG,IAAA,MAAM,WAAA,GAAA,CAAe,aAAA,EAAe,OAAA,IAAW,CAAA,IAAK,CAAA;AAEpD,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAc,cAAc,CAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,sBAAA,GAAyB,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,UAAA,EAAY,QAAQ,UAAU,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,OAAA,EAA+C;AAClE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,OAAA,CAAQ,UAAA,EAAY,QAAQ,SAAS,CAAA;AACnF,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,iBAAA,CAAkB,UAAA,EAAoB,UAAA,EAAmC;AAC7E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY;AAAA,MAC9C,UAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,MAAM,KAAK,aAAA,CAAc;AAAA,UACvB,UAAA;AAAA,UACA,UAAA;AAAA,UACA,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,MAAA,EAAQ,OAAA;AAAA,UACR,SAAA,EAAW,QAAA;AAAA,UACX,iBAAA,EAAmB;AAAA,SACpB,CAAA;AACD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CACJ,UAAA,EACA,UAAA,EACA,WACA,MAAA,EACqB;AACrB,IAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,YAAY,SAAS,CAAA;AACzE,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB;AAAA,MACpD,UAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAA,CACJ,UAAA,EACA,YACA,KAAA,GAAQ,EAAA,EACR,SAAS,CAAA,EACc;AACvB,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,UAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,kBAAA,CACJ,UAAA,EACA,UAAA,EACA,UACA,QAAA,EACwB;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,eAAA,CAAgB;AAAA,MAClC,UAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,cAAA,CACJ,UAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,mBAAA,CACJ,UAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,UAAA,EAAY,UAAU,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,UAAA,CACJ,UAAA,EACA,SAAA,EAC4B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,UAAA,EAAY,SAAS,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,eAAA,CACJ,UAAA,EACA,UAAA,EACA,WACA,YAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB;AAChC,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,YAAY,SAAS,CAAA;AACnE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CACJ,UAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,UAAA,EAAY,UAAU,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAc,gBAAA,CACZ,UAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY;AAAA,MAC9C,UAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,sBAAA,GAAyB;AAAA,KAC7C,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,sBAAA,EAAwB;AACzD,MAAA;AAAA,IACF;AAEA,IAAqB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,sBAAsB;AACzE,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,OAAO,sBAAsB,CAAA;AAE1E,IAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,UAAA,EAAY,UAAU,CAAA;AACxD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAA,CACd,SACA,MAAA,EACmB;AACnB,EAAA,OAAO,IAAI,cAAA,CAAkB,OAAA,EAAS,MAAM,CAAA;AAC9C;AAEO,SAAS,YAAY,MAAA,EAAgC;AAC1D,EAAA,OAAO,MAAA,KAAW,WAAA;AACpB;AAEO,SAAS,QAAQ,MAAA,EAAgC;AACtD,EAAA,OAAO,MAAA,KAAW,OAAA;AACpB;AAEO,SAAS,WAAW,MAAA,EAAgC;AACzD,EAAA,OAAO,MAAA,KAAW,UAAA;AACpB;ACpNO,SAAS,mBACd,MAAA,EACiB;AACjB,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,GAAU,UAAA,EAAW,GAAI,MAAA;AAE5C,EAAA,eAAe,UAAU,GAAA,EAAa;AACpC,IAAA,IAAI,CAACY,aAAA,CAAW,GAAG,CAAA,EAAG;AACpB,MAAA,MAAMC,cAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,SAAS,YAAY,QAAA,EAA0B;AAC7C,IAAA,MAAM,GAAA,GAAMC,YAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC1C,IAAA,MAAM,SAAA,GAAoC;AAAA,MACxC,MAAA,EAAQ,YAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,eAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,oBAAA;AAAA,MACR,OAAA,EACE,yEAAA;AAAA,MACF,MAAA,EAAQ,0BAAA;AAAA,MACR,OAAA,EACE,mEAAA;AAAA,MACF,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,OAAO,SAAA,CAAU,GAAG,CAAA,IAAK,0BAAA;AAAA,EAC3B;AAEA,EAAA,eAAe,mBACb,MAAA,EAC8C;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,GAAG,CAAC,CAAA;AAC1C,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA,EAAG;AACjC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AACpC,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AACrC,QAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,MACzB;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AAC7B,QAAA,IAAI,MAAA,GAAS,CAAA;AACb,QAAA,OAAO,MAAA,GAAS,OAAO,MAAA,EAAQ;AAC7B,UAAA,IAAI,MAAA,CAAO,MAAM,CAAA,KAAM,GAAA,EAAM;AAC7B,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAChC,UAAA,IAAI,MAAA,KAAW,GAAA,IAAQ,MAAA,KAAW,GAAA,EAAM;AACtC,YAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AAC7C,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AAC5C,YAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,UACzB;AACA,UAAA,MAAA,IAAU,CAAA,GAAI,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,eAAA;AAAA,IACb,qBAAA,EAAuB,IAAA;AAAA,IAEvB,MAAM,MAAA,CAAO,IAAA,EAAY,OAAA,EAAgD;AACvE,MAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,MAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,aAAa,CAAA;AACnD,MAAA,MAAM,IAAA,GAAOC,kBAAW,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1D,MAAA,MAAM,GAAA,GAAMD,YAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC7B,MAAA,MAAM,WAAW,OAAA,EAAS,QAAA,IAAY,CAAA,EAAG,IAAI,GAAG,GAAG,CAAA,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,EAAA;AAClC,MAAA,MAAM,SAAA,GAAY,MAAA,GAASP,SAAA,CAAK,SAAA,EAAW,MAAM,CAAA,GAAI,SAAA;AAErD,MAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,MAAA,MAAM,QAAA,GAAWA,SAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AACzC,MAAA,MAAMS,kBAAA,CAAU,UAAU,MAAM,CAAA;AAEhC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,IAC5C,MAAM,kBAAA,CAAmB,MAAM,CAAA,GAC/B,EAAC;AAEL,MAAA,MAAM,oBAAoB,OAAA,IAAW,UAAA;AACrC,MAAA,MAAM,OAAA,GAAU,SAAS,CAAA,CAAA,EAAI,MAAM,IAAI,QAAQ,CAAA,CAAA,GAAK,IAAI,QAAQ,CAAA,CAAA;AAChE,MAAA,MAAM,MAAM,iBAAA,GAAoB,OAAA;AAEhC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,QAAA;AAAA,QACA,cAAc,IAAA,CAAK,IAAA;AAAA,QACnB,QAAA,EAAU,IAAA,CAAK,IAAA,IAAQ,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,QAC5C,MAAM,MAAA,CAAO,MAAA;AAAA,QACb,GAAA;AAAA,QACA,cAAc,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,IAAI,GAAA,GAAM,MAAA;AAAA,QACrD,QAAQ,MAAA,IAAU,MAAA;AAAA,QAClB,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU;AAAA,UACR,GAAG,UAAA;AAAA,UACH,GAAG,OAAA,EAAS;AAAA,SACd;AAAA,QACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,aAAA,CACJ,GAAA,EACA,OAAA,EACuB;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AACrE,MAAA,IAAI,WAAW,OAAA,EAAS,QAAA;AAExB,MAAA,IAAI,CAAC,YAAY,kBAAA,EAAoB;AACnC,QAAA,MAAM,QAAQ,kBAAA,CAAmB,KAAA;AAAA,UAC/B;AAAA,SACF;AACA,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,QACzC;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,QAAA,GAAWC,aAAA,CAAS,IAAI,GAAA,CAAI,GAAG,EAAE,QAAQ,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,CAAC,IAAI,GAAG,QAAA,EAAU;AAAA,QACtC,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,WAAA,CAAY,QAAQ;AAAA,OACxC,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,MAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA4B;AACvC,MAAA,MAAM,QAAA,GAAWV,UAAK,SAAA,EAAW,GAAA,CAAI,QAAQ,OAAA,GAAU,GAAA,EAAK,EAAE,CAAC,CAAA;AAC/D,MAAA,IAAI;AACF,QAAA,MAAMW,gBAAO,QAAQ,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,MAAA,EAAgB,WAAA,EAAsC;AACjE,MAAA,MAAM,OAAA,GAAUX,UAAK,SAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,GAAU,GAAA,EAAK,EAAE,CAAC,CAAA;AACjE,MAAA,MAAM,OAAA,GAAUA,SAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAC3C,MAAA,MAAMY,eAAA,CAAO,SAAS,OAAO,CAAA;AAC7B,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAClC,CAAA;AAAA,IAEA,WAAA,CAAY,KAAa,UAAA,EAAsC;AAC7D,MAAA,IAAI,CAAC,cAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,GAAA;AAEhE,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,KAAK,CAAA;AAC1C,MAAA,IAAI,UAAA,CAAW,OAAO,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,KAAK,CAAC,CAAA;AAC9D,MAAA,IAAI,UAAA,CAAW,QAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,MAAA,IAAI,UAAA,CAAW,SAAS,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,OAAO,CAAC,CAAA;AAClE,MAAA,IAAI,WAAW,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,WAAW,MAAM,CAAA;AAExD,MAAA,OAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,MAAM,kBAAkB,IAAA,EAAqC;AAC3D,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,QAAQ,GAAG,OAAO,EAAA;AAChD,MAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D,CAAA;AAAA,IAEA,MAAM,KAAK,MAAA,EAA0C;AACnD,MAAA,MAAM,GAAA,GAAM,MAAA,GAASZ,SAAA,CAAK,SAAA,EAAW,MAAM,CAAA,GAAI,SAAA;AAC/C,MAAA,IAAI,CAACK,aAAA,CAAW,GAAG,CAAA,SAAU,EAAC;AAE9B,MAAA,MAAM,QAAwB,EAAC;AAC/B,MAAA,MAAM,UAAU,MAAMQ,gBAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE1D,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,KAAA,CAAM,QAAO,EAAG;AAClB,UAAA,MAAM,QAAA,GAAWb,SAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACrC,UAAA,MAAM,KAAA,GAAQ,MAAMc,aAAA,CAAK,QAAQ,CAAA;AACjC,UAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,GAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA;AAEjE,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,EAAA,EAAIN,kBAAW,KAAK,CAAA,CAAE,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,YACrD,UAAU,KAAA,CAAM,IAAA;AAAA,YAChB,cAAc,KAAA,CAAM,IAAA;AAAA,YACpB,QAAA,EAAU,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,YAChC,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,GAAA;AAAA,YACA,QAAA,EAAU,OAAA;AAAA,YACV,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA;AAAY,WACxC,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,MAAA,MAAM,QAAA,GAAWR,UAAK,SAAA,EAAW,GAAA,CAAI,QAAQ,OAAA,GAAU,GAAA,EAAK,EAAE,CAAC,CAAA;AAC/D,MAAA,OAAOK,cAAW,QAAQ,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;AClMA,SAAS,sBAAsB,GAAA,EAAsB;AACnD,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,GAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,mBAAmB,CAAA;AAC3C,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AAC5B;AAeA,SAAS,YAAA,CAAa,KAAa,MAAA,EAAiC;AAElE,EAAA,MAAM,aAAA,GAAgB,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAE3D,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3C,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,EAChC;AAEA,EAAA,QAAQ,OAAO,QAAA;AAAU,IACvB,KAAK,IAAA,EAAM;AAET,MAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,MAAA,CAAO,YAAY,CAAA;AACvD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,CAAA,QAAA,EAAW,KAAK,CAAA,QAAA,EAAW,aAAa,CAAA,CAAA;AAAA,MACjD;AACA,MAAA,OAAO,WAAW,MAAA,CAAO,MAAM,IAAI,MAAA,CAAO,SAAS,6BAA6B,aAAa,CAAA,CAAA;AAAA,IAC/F;AAAA,IACA,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,+BAAA,EAAkC,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,IACzE,KAAK,cAAA;AACH,MAAA,OAAO,WAAW,MAAA,CAAO,MAAM,IAAI,MAAA,CAAO,MAAM,+BAA+B,aAAa,CAAA,CAAA;AAAA,IAC9F,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,oBAAA,EAAuB,aAAa,CAAA,CAAA;AAAA,IACrE,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,kBAAA,EAAqB,aAAa,CAAA,CAAA;AAAA,IACnE,KAAK,KAAA;AAAA,IACL;AACE,MAAA,OAAO,WAAW,MAAA,CAAO,MAAM,OAAO,MAAA,CAAO,MAAM,kBAAkB,aAAa,CAAA,CAAA;AAAA;AAExF;AAEA,SAAS,aAAa,MAAA,EAAiC;AACrD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AAAA,EAC5C;AAEA,EAAA,QAAQ,OAAO,QAAA;AAAU,IACvB,KAAK,IAAA,EAAM;AACT,MAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,MAAA,CAAO,YAAY,CAAA;AACvD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,WAAW,KAAK,CAAA,QAAA,CAAA;AAAA,MACzB;AACA,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,OAAO,SAAS,CAAA,0BAAA,CAAA;AAAA,IACrD;AAAA,IACA,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,+BAAA,EAAkC,OAAO,MAAM,CAAA,CAAA,CAAA;AAAA,IACxD,KAAK,cAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,4BAAA,CAAA;AAAA,IAClD,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA,oBAAA,CAAA;AAAA,IACjC,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA,kBAAA,CAAA;AAAA,IACjC,KAAK,KAAA;AAAA,IACL;AACE,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,IAAA,EAAO,OAAO,MAAM,CAAA,eAAA,CAAA;AAAA;AAEzD;AAEA,SAAS,eAAe,QAAA,EAAkC;AACxD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,IAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,sBAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AAEO,SAAS,gBAAgB,MAAA,EAA0C;AACxE,EAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAwC,MAAA,CAAO,QAAQ,CAAA;AACnE,EAAA,OAAA,CAAQ,IAAI,gCAAA,EAAkC;AAAA,IAC5C,WAAA,EAAa,MAAA,CAAO,WAAA,GAAc,KAAA,GAAQ,WAAA;AAAA,IAC1C,eAAA,EAAiB,MAAA,CAAO,eAAA,GAAkB,KAAA,GAAQ,WAAA;AAAA,IAClD,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,UAAU,MAAA,CAAO;AAAA,GAClB,CAAA;AAGD,EAAA,MAAM,MAAA,GAAS,IAAIU,iBAAA,CAAS;AAAA,IAC1B,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,IACzB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,WAAA,EAAa;AAAA,MACX,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,iBAAiB,MAAA,CAAO;AAAA,KAC1B;AAAA,IACA,cAAA,EAAgB,IAAA;AAAA,IAChB,GAAA,EAAK,IAAA;AAAA;AAAA,IAEL,GAAI,MAAA,CAAO,QAAA,KAAa,IAAA,IAAQ;AAAA,MAC9B,cAAA,EACE,IAAK,CAAA,aAAA,EAAA,EAAAC,8BAAA,CAAA,eAAA,CAAA,EAAqC,eAAA,CAAiB;AAAA,QACzD,iBAAA,EAAmB,GAAA;AAAA,QACnB,aAAA,EAAe;AAAA,OAChB;AAAA;AACL,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,CAACtC,KAAAA,KAAiB;AAC/B,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AACrD,IAAA,OAAO,GAAG,MAAM,CAAA,EAAGA,KAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB,YAAA,CAAa,KAAK,MAAM,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,QAAA;AAAA,IACb,WAAA,EAAa,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC3C,qBAAA,EAAuB,IAAA;AAAA,IAEvB,MAAM,MAAA,CAAO,IAAA,EAAY,OAAA,EAAgD;AACvE,MAAA,MAAM,GAAA,GAAM,MAAA;AAAA,QACV,CAAA,EAAG,OAAA,EAAS,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,OAAA,EAAS,QAAA,IAAY,IAAA,CAAK,IAAI,CAAA;AAAA,OACjF;AAEA,MAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,aAAa,CAAA;AAEnD,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,IAAIuC,yBAAA,CAAiB;AAAA,UACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAA,EAAK,GAAA;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,aAAa,IAAA,CAAK,IAAA;AAAA,UAClB,UAAU,OAAA,EAAS;AAAA,SACpB;AAAA,OACH;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA;AAAA,QACxB,IAAIC,0BAAA,CAAkB;AAAA,UACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAA,EAAK;AAAA,SACN;AAAA,OACH;AAEA,MAAA,OAAO;AAAA,QACL,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,QACzC,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,IAAA,CAAK,IAAA;AAAA,QACpC,cAAc,IAAA,CAAK,IAAA;AAAA,QACnB,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,MAAM,MAAA,CAAO,MAAA;AAAA,QACb,GAAA,EAAK,OAAO,GAAG,CAAA;AAAA,QACf,YAAA,EAAc,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AAAA,QAC7D,QAAQ,OAAA,EAAS,MAAA;AAAA,QACjB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,QAAA,EAAU;AAAA,UACR,GAAG,OAAA,EAAS,QAAA;AAAA,UACZ,MAAM,IAAA,CAAK;AAAA,SACb;AAAA,QACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,cAAc,GAAA,EAAoC;AACtD,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAC3D;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AACzC,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,QAAA,EAAU,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,OAAQ,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA4B;AACvC,MAAA,MAAM,MAAM,GAAA,CAAI,OAAA,CAAQ,YAAA,CAAa,MAAM,GAAG,EAAE,CAAA;AAChD,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,IAAIC,4BAAA,CAAoB;AAAA,UACtB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAA,EAAK;AAAA,SACN;AAAA,OACH;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,MAAA,EAAgB,MAAA,EAAiC;AAC5D,MAAA,MAAM,SAAS,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,GAAG,EAAE,CAAA;AACtD,MAAA,MAAM,gBAAA,GAAmB,OAAO,MAAA,GAC5B,CAAA,EAAG,OAAO,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAC1B,MAAA;AAEJ,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,IAAIC,0BAAA,CAAkB;AAAA,UACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,UAAA,EAAY,CAAA,EAAG,MAAA,CAAO,MAAM,IAAI,MAAM,CAAA,CAAA;AAAA,UACtC,GAAA,EAAK;AAAA,SACN;AAAA,OACH;AAEA,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,IAAID,4BAAA,CAAoB;AAAA,UACtB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAA,EAAK;AAAA,SACN;AAAA,OACH;AAEA,MAAA,OAAO,OAAO,gBAAgB,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,WAAA,CAAY,KAAa,UAAA,EAAsC;AAC7D,MAAA,IAAI,CAAC,cAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,GAAA;AAEhE,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,KAAK,CAAA;AAC1C,MAAA,IAAI,UAAA,CAAW,OAAO,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,KAAK,CAAC,CAAA;AAC9D,MAAA,IAAI,UAAA,CAAW,QAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,MAAA,IAAI,UAAA,CAAW,SAAS,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,OAAO,CAAC,CAAA;AAClE,MAAA,IAAI,WAAW,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,WAAW,MAAM,CAAA;AAExD,MAAA,OAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,MAAM,kBAAkB,IAAA,EAAqC;AAC3D,MAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D,CAAA;AAAA,IAEA,MAAM,KAAK,MAAA,EAA0C;AACnD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA;AAC/B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,IAAIE,6BAAA,CAAqB;AAAA,UACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,MAAA,EAAQ;AAAA,SACT;AAAA,OACH;AAEA,MAAA,OAAA,CAAQ,SAAS,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC9C,EAAA,EAAI,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,EAAE,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,QACpD,UAAU,IAAA,CAAK,GAAA,EAAK,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AAAA,QACxC,cAAc,IAAA,CAAK,GAAA,EAAK,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AAAA,QAC5C,QAAA,EAAU,0BAAA;AAAA,QACV,IAAA,EAAM,KAAK,IAAA,IAAQ,CAAA;AAAA,QACnB,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAA,IAAO,EAAE,CAAA;AAAA,QAC1B,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,SAAA,EAAW,KAAK,YAAA,EAAc,WAAA,uBAAiB,IAAI,IAAA,IAAO,WAAA;AAAY,OACxE,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAA,CAAI,OAAA,CAAQ,YAAA,CAAa,MAAM,GAAG,EAAE,CAAA;AAChD,QAAA,MAAM,MAAA,CAAO,IAAA;AAAA,UACX,IAAIH,0BAAA,CAAkB;AAAA,YACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,GAAA,EAAK;AAAA,WACN;AAAA,SACH;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACrSO,SAAS,wBACd,MAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,MACjB,CAAA,gCAAA,EAAmC,MAAA,CAAO,SAAS,CAAA,OAAA,CAAA;AAGrD,EAAA,MAAM,iBAAA,GAAoB,OACxB,MAAA,KACoB;AACpB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AAIpC,IAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CACpC,IAAA,GACA,GAAA,CAAI,CAAC,QAAQ,CAAA,EAAG,GAAG,IAAI,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA,CACpC,KAAK,GAAG,CAAA;AAGX,IAAA,OAAO,MAAA,CACJ,UAAA,CAAW,QAAQ,CAAA,CACnB,MAAA,CAAO,eAAe,MAAA,CAAO,SAAS,CAAA,CACtC,MAAA,CAAO,KAAK,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,YAAA;AAAA,IACb,qBAAA,EAAuB,IAAA;AAAA,IAEvB,MAAM,MAAA,CAAO,IAAA,EAAY,OAAA,EAAgD;AACvE,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAG5B,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,QAAA,CAAS,MAAA,CAAO,eAAA,EAAiB,MAAA,CAAO,YAAY,CAAA;AAAA,MACtD,CAAA,MAAO;AAEL,QAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAG9C,QAAA,MAAM,eAAA,GAA0C;AAAA,UAC9C,SAAA,EAAW,OAAO,SAAS;AAAA,SAC7B;AACA,QAAA,IAAI,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ;AACpC,UAAA,eAAA,CAAgB,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,IAAU,EAAA;AAAA,QAC/D;AAGA,QAAA,MAAM,SAAA,GAAY,MAAM,iBAAA,CAAkB,eAAe,CAAA;AAEzD,QAAA,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AAC9C,QAAA,QAAA,CAAS,MAAA,CAAO,aAAa,SAAS,CAAA;AACtC,QAAA,QAAA,CAAS,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA;AAAA,MAC1C;AAEA,MAAA,IAAI,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ;AACpC,QAAA,QAAA,CAAS,OAAO,QAAA,EAAU,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,UAAU,EAAE,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAA,EAAW,EAAG;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAGnC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0BAAA,EAA6B,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,SAAS,UAAU,CAAA;AAAA,SAC1E;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAUlC,MAAA,OAAO;AAAA,QACL,IAAI,IAAA,CAAK,SAAA;AAAA,QACT,UAAU,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA;AAAA,QAC1C,YAAA,EAAc,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,IAAA;AAAA,QAC7C,QAAA,EAAU,IAAA,CAAK,IAAA,IAAQ,CAAA,MAAA,EAAS,KAAK,MAAM,CAAA,CAAA;AAAA,QAC3C,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,KAAK,IAAA,CAAK,UAAA;AAAA,QACV,YAAA,EAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY;AAAA,UAC9C,KAAA,EAAO,GAAA;AAAA,UACP,MAAA,EAAQ,GAAA;AAAA,UACR,GAAA,EAAK;AAAA,SACN,CAAA;AAAA,QACD,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA;AAAA,QAClC,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,aAAA,CACJ,GAAA,EACA,OAAA,EACuB;AACvB,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC3B,MAAA,QAAA,CAAS,MAAA,CAAO,iBAAiB,YAAY,CAAA;AAC7C,MAAA,IAAI,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ;AACpC,QAAA,QAAA,CAAS,OAAO,QAAA,EAAU,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,UAAU,EAAE,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAA,EAAW,EAAG;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC5D,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAUlC,MAAA,OAAO;AAAA,QACL,IAAI,IAAA,CAAK,SAAA;AAAA,QACT,UAAU,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA;AAAA,QAC1C,YAAA,EAAc,KAAK,iBAAA,IAAqB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAAA,QAChE,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,QAC9B,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,KAAK,IAAA,CAAK,UAAA;AAAA,QACV,YAAA,EAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY;AAAA,UAC9C,KAAA,EAAO,GAAA;AAAA,UACP,MAAA,EAAQ,GAAA;AAAA,UACR,GAAA,EAAK;AAAA,SACN,CAAA;AAAA,QACD,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,IAAI;AAEF,QAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,gBAAgB,CAAA;AACvC,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,EAAE,CAAA;AAC3D,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CACrB,OAAA,CAAQ,WAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAGzB,QAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC9C,QAAA,MAAM,eAAA,GAA0C;AAAA,UAC9C,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,UAC3B,SAAA,EAAW;AAAA,SACb;AAEA,QAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAC7C,IAAA,GACA,GAAA,CAAI,CAAC,QAAQ,CAAA,EAAG,GAAG,IAAI,eAAA,CAAgB,GAAG,CAAC,CAAA,CAAE,CAAA,CAC7C,KAAK,GAAG,CAAA;AAEX,QAAA,MAAM,MAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AACpC,QAAA,MAAM,SAAA,GAAY,MAAA,CACf,UAAA,CAAW,QAAQ,CAAA,CACnB,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAS,CAAA,CACtC,MAAA,CAAO,KAAK,CAAA;AAGf,QAAA,MAAM,SAAA,GAAY,CAAA,gCAAA,EAAmC,MAAA,CAAO,SAAS,CAAA,cAAA,CAAA;AACrE,QAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,QAAA,QAAA,CAAS,MAAA,CAAO,aAAa,QAAQ,CAAA;AACrC,QAAA,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AAC9C,QAAA,QAAA,CAAS,MAAA,CAAO,aAAa,SAAS,CAAA;AACtC,QAAA,QAAA,CAAS,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA;AAExC,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,UACtC,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACP,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,UAAA,OAAA,CAAQ,IAAA,CAAK,+BAA+B,KAAK,CAAA;AAAA,QACnD;AAAA,MACF,SAAS,CAAA,EAAQ;AACf,QAAA,OAAA,CAAQ,IAAA,CAAK,4BAAA,EAA8B,CAAA,CAAE,OAAO,CAAA;AAAA,MACtD;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,MAAA,EAAgB,MAAA,EAAiC;AAC5D,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC/C,MAAA,IAAI,MAAA,GAAS,EAAA;AAEb,MAAA,IAAI;AAEF,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA;AAC3C,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,MAAM,CAAA;AACnE,UAAA,OAAO,MAAA;AAAA,QACT;AAGA,QAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AAGvB,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AAC9C,QAAA,OAAA,GAAU,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,GAAI,EAAA;AAG3C,QAAA,MAAM,sBAAA,GAAyB,QAC5B,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,YAAY,EAAE,CAAA;AAGzB,QAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,KAAA,CAAM,GAAG,CAAA;AACpD,QAAA,MAAA,GACE,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AAGhE,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AACjD,QAAA,WAAA,GAAc,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,WAAA;AAEpD,QAAA,OAAA,CAAQ,IAAI,qBAAA,EAAuB;AAAA,UACjC,OAAA;AAAA,UACA,OAAA;AAAA,UACA,sBAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAGD,QAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC9C,QAAA,MAAM,eAAA,GAA0C;AAAA,UAC9C,cAAA,EAAgB,sBAAA;AAAA,UAChB,YAAA,EAAc,WAAA;AAAA,UACd,SAAA,EAAW,OAAO,SAAS;AAAA,SAC7B;AAEA,QAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAC7C,IAAA,GACA,GAAA,CAAI,CAAC,QAAQ,CAAA,EAAG,GAAG,IAAI,eAAA,CAAgB,GAAG,CAAC,CAAA,CAAE,CAAA,CAC7C,KAAK,GAAG,CAAA;AAEX,QAAA,MAAM,MAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AACpC,QAAA,MAAM,SAAA,GAAY,MAAA,CACf,UAAA,CAAW,QAAQ,CAAA,CACnB,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAS,CAAA,CACtC,MAAA,CAAO,KAAK,CAAA;AAGf,QAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,QAAA,QAAA,CAAS,MAAA,CAAO,kBAAkB,sBAAsB,CAAA;AACxD,QAAA,QAAA,CAAS,MAAA,CAAO,gBAAgB,WAAW,CAAA;AAC3C,QAAA,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AAC9C,QAAA,QAAA,CAAS,MAAA,CAAO,aAAa,SAAS,CAAA;AACtC,QAAA,QAAA,CAAS,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA;AAExC,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,gCAAA,EAAmC,OAAO,SAAS,CAAA,aAAA,CAAA;AAAA,UACnD;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAM;AAAA;AACR,SACF;AAEA,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,UAAA,OAAA,CAAQ,GAAA,CAAI,8BAAA,EAAgC,IAAA,CAAK,UAAU,CAAA;AAC3D,UAAA,OAAO,IAAA,CAAK,UAAA;AAAA,QACd,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,UAAA,OAAA,CAAQ,IAAA,CAAK,+BAA+B,KAAK,CAAA;AAEjD,UAAA,MAAM,UAAA,GAAa,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA,GAAM,GAAA;AAC9C,UAAA,OAAO,CAAA,2BAAA,EAA8B,MAAA,CAAO,SAAS,CAAA,aAAA,EAAgB,UAAU,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,QAC1H;AAAA,MACF,SAAS,CAAA,EAAQ;AACf,QAAA,OAAA,CAAQ,IAAA,CAAK,4BAAA,EAA8B,CAAA,CAAE,OAAO,CAAA;AAEpD,QAAA,MAAM,UAAA,GAAa,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA,GAAM,GAAA;AAC9C,QAAA,OAAO,CAAA,2BAAA,EAA8B,MAAA,CAAO,SAAS,CAAA,aAAA,EAAgB,UAAU,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,MAC1H;AAAA,IACF,CAAA;AAAA,IAEA,WAAA,CAAY,KAAa,UAAA,EAAsC;AAC7D,MAAA,IAAI,CAAC,YAAY,OAAO,GAAA;AAIxB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAClC,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAE/B,MAAA,MAAM,oBAA8B,EAAC;AACrC,MAAA,IAAI,WAAW,KAAA,EAAO,iBAAA,CAAkB,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAA,CAAE,CAAA;AACpE,MAAA,IAAI,WAAW,MAAA,EAAQ,iBAAA,CAAkB,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AACtE,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,MAAM,MAAA,GAAiC;AAAA,UACrC,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AACA,QAAA,iBAAA,CAAkB,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,GAAG,KAAK,SAAS,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,WAAW,OAAA,EAAS,iBAAA,CAAkB,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AACxE,MAAA,IAAI,WAAW,MAAA,EAAQ,iBAAA,CAAkB,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAEtE,MAAA,MAAM,iBAAA,GAAoB,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAA;AACpD,MAAA,OAAO,CAAA,EAAG,MAAM,CAAC,CAAC,WAAW,iBAAiB,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,IAC5D,CAAA;AAAA,IAEA,MAAM,kBAAkB,IAAA,EAAqC;AAC3D,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,GAAA,EAAK;AAAA,QAChC,KAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAQ,GAAA;AAAA,QACR,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAA,GAAgC;AACpC,MAAA,OAAO,EAAC;AAAA,IACV,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,QAAQ,CAAA;AACpD,MAAA,OAAO,QAAA,CAAS,EAAA;AAAA,IAClB;AAAA,GACF;AACF;;;AC3VO,SAAS,mBAAmB,MAAA,EAAsC;AACvE,EAAA,MAAM,OAAA,GAAU,CAACxC,KAAAA,EAAc,MAAA,KAAoC;AACjE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAOA,KAAAA;AAE5B,IAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AACxC,IAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAOA,KAAAA,GAAO,MAAA,CAAO,UAAU,CAAA;AAEnD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,MAAM,WAAW,IAAI,UAAA,CAAW,GAAA,CAAI,MAAA,GAAS,KAAK,MAAM,CAAA;AACxD,IAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAChB,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAE7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,CAAA,IAAK,IAAA,GAAO,QAAA,CAAS,CAAC,CAAA,GAAK,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA;AAC3C,IAAA,OAAOA,KAAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,OAAA;AAAA,IACb,qBAAA,EAAuB,IAAA;AAAA,IAEvB,MAAM,MAAA,CAAO,KAAA,EAAa,QAAA,EAAiD;AACzE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,aAAA,CACJ,GAAA,EACA,OAAA,EACuB;AACvB,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAC9D,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAC3D;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAa,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,QAAA,EAAU,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM;AAE3D,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,QACnD,QAAA;AAAA,QACA,YAAA,EAAc,QAAA;AAAA,QACd,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,GAAA,EAAK,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAAA,QACzB,YAAA,EAAc,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK;AAAA,UAClC,KAAA,EAAO,GAAA;AAAA,UACP,MAAA,EAAQ,GAAA;AAAA,UACR,GAAA,EAAK;AAAA,SACN,CAAA;AAAA,QACD,QAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA6B;AAAA,IAE1C,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,OAAA,EAAiB,MAAA,EAAiC;AAG7D,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,IAC3C,CAAA;AAAA,IAEA,WAAA,CAAY,KAAa,UAAA,EAAsC;AAC7D,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAGhD,MAAA,IAAI,OAAO,iBAAA,EAAmB;AAC5B,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,iBAAiB,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACjE,UAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACpB,YAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,UACvB;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAI,UAAA,CAAW,OAAO,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,KAAK,CAAC,CAAA;AAC9D,QAAA,IAAI,UAAA,CAAW,QAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,QAAA,IAAI,UAAA,CAAW,SAAS,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,OAAO,CAAC,CAAA;AAClE,QAAA,IAAI,WAAW,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,WAAW,MAAM,CAAA;AACzD,QAAA,IAAI,WAAW,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,WAAW,GAAG,CAAA;AACpD,QAAA,IAAI,UAAA,CAAW,MAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA;AAC/D,QAAA,IAAI,UAAA,CAAW,SAAS,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,MACxE;AAGA,MAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,iBAAiB,CAAA;AAGpC,MAAW,MAAA,CAAO,QAAA,GAAW,GAAA,GAAM,OAAO,QAAA;AAC1C,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAO,OAAA,CAAQ,MAAA,CAAO,WAAW,MAAA,CAAO,QAAA,IAAY,MAAM,CAAA;AAAA,MAC5D;AAEA,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,EAAG,OAAO,QAAQ,CAAA,EAAG,MAAA,CAAO,QAAA,EAAS,GAAI,GAAA,GAAM,MAAA,CAAO,QAAA,KAAa,EAAE,CAAA,CAAA;AAAA,IACtG,CAAA;AAAA,IAEA,MAAM,kBAAkB,IAAA,EAAqC;AAC3D,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,GAAA,EAAK;AAAA,QAChC,KAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAQ,GAAA;AAAA,QACR,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAA,GAAgC;AACpC,MAAA,OAAO,EAAC;AAAA,IACV,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,QAAQ,CAAA;AACpD,QAAA,OAAO,QAAA,CAAS,EAAA;AAAA,MAClB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;ACzHO,SAAS,iBAAiB,MAAA,EAA2C;AAC1E,EAAA,IAAI,MAAA,GAA6C,IAAA;AAEjD,EAAA,eAAe,SAAA,GAAkD;AAC/D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS,IAAI4C,eAAA,CAAO,GAAA,EAAO,EAAE,yBAAA,EAA2B,MAAM,CAAA;AAC9D,MAAA,MAAA,CAAO,IAAI,OAAA,GAAU,KAAA;AAErB,MAAA,MAAM,OAAO,MAAA,CAAO;AAAA,QAClB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,IAAA,EAAM,OAAO,IAAA,IAAQ,EAAA;AAAA,QACrB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,eAAe;AAAC,OACjB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC5C,KAAAA,KAAiB;AAC/B,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AACrD,IAAA,OAAO,GAAG,MAAM,CAAA,EAAGA,KAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC7C,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM6C,gBAAe,MAAM;AACzB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC7C,IAAA,OAAO,IAAA,GAAO,GAAA;AAAA,EAChB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,WAAA,EAAa,MAAA,CAAO,IAAA,KAAS,MAAA,GAAS,cAAA,GAAiB,aAAA;AAAA,IACvD,qBAAA,EAAuB,KAAA;AAAA,IAEvB,MAAM,MAAA,CAAO,IAAA,EAAY,OAAA,EAAgD;AACvE,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,MAAA,MAAM,GAAA,GAAM,MAAA;AAAA,QACV,CAAA,EAAG,OAAA,EAAS,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,OAAA,EAAS,QAAA,IAAY,IAAA,CAAK,IAAI,CAAA;AAAA,OACjF;AAEA,MAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,aAAa,CAAA;AAGnD,MAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACxC,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,WAAA,GAAc,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AACvD,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,CAAI,UAAU,WAAW,CAAA;AAAA,QACjC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW/C,eAAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACrC,MAAA,MAAM,GAAA,CAAI,UAAA,CAAW,QAAA,EAAU,GAAG,CAAA;AAElC,MAAA,OAAO;AAAA,QACL,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,QACzC,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,IAAA,CAAK,IAAA;AAAA,QACpC,cAAc,IAAA,CAAK,IAAA;AAAA,QACnB,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,MAAM,MAAA,CAAO,MAAA;AAAA,QACb,GAAA,EAAK,OAAO,GAAG,CAAA;AAAA,QACf,YAAA,EAAc,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AAAA,QAC7D,QAAQ,OAAA,EAAS,MAAA;AAAA,QACjB,UAAU,MAAA,CAAO,IAAA;AAAA,QACjB,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,cAAc,GAAA,EAAoC;AACtD,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAC3D;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AACzC,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,QAAA,EAAU,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,OAAQ,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA4B;AACvC,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ+C,aAAAA,IAAgB,EAAE,CAAA;AAC1C,MAAA,MAAM,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,IACtB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,MAAA,EAAgB,MAAA,EAAiC;AAC5D,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQA,aAAAA,IAAgB,EAAE,CAAA;AAChD,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAEhE,MAAA,MAAM,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,QAAQ,CAAA;AAEjC,MAAA,OAAO,OAAO,QAAQ,CAAA;AAAA,IACxB,CAAA;AAAA,IAEA,WAAA,CAAY,KAAa,UAAA,EAAsC;AAC7D,MAAA,IAAI,CAAC,cAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,GAAA;AAEhE,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,KAAK,CAAA;AAC1C,MAAA,IAAI,UAAA,CAAW,OAAO,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,KAAK,CAAC,CAAA;AAC9D,MAAA,IAAI,UAAA,CAAW,QAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,MAAA,IAAI,UAAA,CAAW,SAAS,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAO,UAAA,CAAW,OAAO,CAAC,CAAA;AAClE,MAAA,IAAI,WAAW,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,WAAW,MAAM,CAAA;AAExD,MAAA,OAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,MAAM,kBAAkB,IAAA,EAAqC;AAC3D,MAAA,OAAO,IAAA,CAAK,GAAA;AAAA,IACd,CAAA;AAAA,IAEA,MAAM,KAAK,MAAA,EAA0C;AACnD,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA;AAE/B,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAAA,MAC5B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAO,KAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA,CAChC,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACd,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA;AAAA,QAC3D,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,cAAc,IAAA,CAAK,IAAA;AAAA,QACnB,QAAA,EAAU,0BAAA;AAAA,QACV,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAA,QAC3B,GAAA,EAAK,MAAA,CAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,QACtD,UAAU,MAAA,CAAO,IAAA;AAAA,QACjB,SAAA,EAAW,IAAA,CAAK,UAAA,GACZ,IAAA,CAAK,UAAA,CAAW,aAAY,GAAA,iBAC5B,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OAC7B,CAAE,CAAA;AAAA,IACN,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQA,aAAAA,IAAgB,EAAE,CAAA;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAK,GAAG,CAAA;AAClB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACjHA,eAAsB,gBACpB,aAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,GAAS,cAAc,gBAAA,EAAiB;AAE9C,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,EAAA,CAAG,MAAA,IAAU,EAAA;AAAA,QAC5B,MAAA,EAAQ,MAAA,CAAO,EAAA,CAAG,MAAA,IAAU,WAAA;AAAA,QAC5B,WAAA,EAAa,MAAA,CAAO,EAAA,CAAG,WAAA,IAAe,EAAA;AAAA,QACtC,eAAA,EAAiB,MAAA,CAAO,EAAA,CAAG,eAAA,IAAmB,EAAA;AAAA,QAC9C,QAAA,EAAU,OAAO,EAAA,CAAG,QAAA;AAAA,QACpB,MAAA,EAAQ,OAAO,EAAA,CAAG,MAAA;AAAA,QAClB,MAAA,EAAQ,OAAO,EAAA,CAAG;AAAA,OACnB,CAAA;AAAA,IAEH,KAAK,IAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,EAAA,CAAG,MAAA,IAAU,EAAA;AAAA,QAC5B,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,MAAA,CAAO,EAAA,CAAG,WAAA,IAAe,EAAA;AAAA,QACtC,eAAA,EAAiB,MAAA,CAAO,EAAA,CAAG,eAAA,IAAmB,EAAA;AAAA,QAC9C,SAAA,EAAW,MAAA,CAAO,EAAA,CAAG,SAAA,IAAa,EAAA;AAAA,QAClC,YAAA,EAAc,OAAO,EAAA,CAAG,YAAA;AAAA,QACxB,QAAA,EAAU,CAAA,QAAA,EAAW,MAAA,CAAO,EAAA,CAAG,aAAa,EAAE,CAAA,yBAAA,CAAA;AAAA,QAC9C,MAAA,EAAQ,OAAO,EAAA,CAAG,MAAA;AAAA,QAClB,MAAA,EAAQ,OAAO,EAAA,CAAG;AAAA,OACnB,CAAA;AAAA,IAEH,KAAK,KAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAA;AAAA,QAC7B,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,SAAA,IAAa,MAAA;AAAA,QAChC,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,WAAA,IAAe,EAAA;AAAA,QACvC,eAAA,EAAiB,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,EAAA;AAAA,QAC1C,MAAA,EAAQ,OAAO,GAAA,CAAI,MAAA;AAAA,QACnB,MAAA,EAAQ,OAAO,GAAA,CAAI;AAAA,OACpB,CAAA;AAAA,IAEH,KAAK,cAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,cAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,MAAA,IAAU,EAAA;AAAA,QACtC,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,MAAA,IAAU,MAAA;AAAA,QACtC,WAAA,EAAa,MAAA,CAAO,YAAA,CAAa,WAAA,IAAe,EAAA;AAAA,QAChD,eAAA,EAAiB,MAAA,CAAO,YAAA,CAAa,eAAA,IAAmB,EAAA;AAAA,QACxD,QAAA,EAAU,CAAA,QAAA,EAAW,MAAA,CAAO,YAAA,CAAa,UAAU,MAAM,CAAA,uBAAA,CAAA;AAAA,QACzD,MAAA,EAAQ,OAAO,YAAA,CAAa,MAAA;AAAA,QAC5B,MAAA,EAAQ,OAAO,YAAA,CAAa;AAAA,OAC7B,CAAA;AAAA,IAEH,KAAK,WAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,WAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,SAAA,CAAU,MAAA,IAAU,EAAA;AAAA,QACnC,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,MAAA,CAAO,SAAA,CAAU,gBAAA,IAAoB,EAAA;AAAA,QAClD,eAAA,EAAiB,MAAA,CAAO,SAAA,CAAU,cAAA,IAAkB,EAAA;AAAA,QACpD,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,SAAA,IAAa,EAAA;AAAA,QACzC,QAAA,EAAU,CAAA,0BAAA,CAAA;AAAA,QACV,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAA;AAAA,QACzB,MAAA,EAAQ,OAAO,SAAA,CAAU;AAAA,OAC1B,CAAA;AAAA,IAEH,KAAK,QAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,EAAA;AAAA,QAChC,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,WAAA;AAAA,QAChC,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,WAAA,IAAe,EAAA;AAAA,QAC1C,eAAA,EAAiB,MAAA,CAAO,MAAA,CAAO,eAAA,IAAmB,EAAA;AAAA,QAClD,QAAA,EAAU,CAAA,WAAA,EAAc,MAAA,CAAO,MAAA,CAAO,UAAU,WAAW,CAAA,cAAA,CAAA;AAAA,QAC3D,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,QACtB,MAAA,EAAQ,OAAO,MAAA,CAAO;AAAA,OACvB,CAAA;AAAA,IAEH,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,gBAAA,CAAiB;AAAA,QACtB,IAAA,EAAM,MAAA,CAAO,GAAA,EAAK,IAAA,IAAQ,EAAA;AAAA,QAC1B,IAAA,EAAM,MAAA,CAAO,GAAA,EAAK,IAAA,IAAQ,EAAA;AAAA,QAC1B,IAAA,EAAM,MAAA,CAAO,GAAA,EAAK,IAAA,IAAQ,EAAA;AAAA,QAC1B,QAAA,EAAU,MAAA,CAAO,GAAA,EAAK,QAAA,IAAY,EAAA;AAAA,QAClC,MAAA,EAAQ,MAAA,CAAO,GAAA,EAAK,MAAA,IAAU,KAAA;AAAA,QAC9B,OAAA,EAAS,MAAA,CAAO,GAAA,EAAK,OAAA,IAAW,EAAA;AAAA,QAChC,MAAA,EAAQ,OAAO,GAAA,EAAK,MAAA;AAAA,QACpB,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IAEH,KAAK,YAAA;AACH,MAAA,OAAO,uBAAA,CAAwB;AAAA,QAC7B,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,SAAA,IAAa,EAAA;AAAA,QAC1C,MAAA,EAAQ,MAAA,CAAO,UAAA,CAAW,MAAA,IAAU,EAAA;AAAA,QACpC,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,SAAA,IAAa,EAAA;AAAA,QAC1C,MAAA,EAAQ,OAAO,UAAA,CAAW;AAAA,OAC3B,CAAA;AAAA,IAEH,KAAK,OAAA;AACH,MAAA,OAAO,kBAAA,CAAmB;AAAA,QACxB,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,EAAA;AAAA,QAC/B,OAAA,EAAS,OAAO,KAAA,CAAM;AAAA,OACvB,CAAA;AAAA,IAEH,KAAK,OAAA;AAAA,IACL;AACE,MAAA,OAAO,kBAAA,CAAmB;AAAA,QACxB,SAAA,EACE,MAAA,CAAO,KAAA,CAAM,SAAA,IACb7C,qBAAA,CAAK,KAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,QAAA,EAAU,SAAS,CAAA;AAAA,QAC9C,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW;AAAA,OAClC,CAAA;AAAA;AAEP;AAwBA,eAAsB,0BACpB,MAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,oDAAoD,CAAA;AACjE,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACxB,WAAWA,qBAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,SAAS,CAAA;AAAA,MACvD,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,gDAAA,EAAkD,MAAA,CAAO,IAAI,CAAA;AACzE,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,EAAA,EAAI,MAAA,IAAU,EAAA;AAAA,QAC7B,MAAA,EAAQ,MAAA,CAAO,EAAA,EAAI,MAAA,IAAU,WAAA;AAAA,QAC7B,WAAA,EAAa,MAAA,CAAO,EAAA,EAAI,WAAA,IAAe,EAAA;AAAA,QACvC,eAAA,EAAiB,MAAA,CAAO,EAAA,EAAI,eAAA,IAAmB,EAAA;AAAA,QAC/C,QAAA,EAAU,OAAO,EAAA,EAAI,QAAA;AAAA,QACrB,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA;AAAA,QACnB,MAAA,EAAQ,OAAO,EAAA,EAAI;AAAA,OACpB,CAAA;AAAA,IACH,KAAK,IAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,EAAA,EAAI,MAAA,IAAU,EAAA;AAAA,QAC7B,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,MAAA,CAAO,EAAA,EAAI,WAAA,IAAe,EAAA;AAAA,QACvC,eAAA,EAAiB,MAAA,CAAO,EAAA,EAAI,eAAA,IAAmB,EAAA;AAAA,QAC/C,SAAA,EAAW,MAAA,CAAO,EAAA,EAAI,SAAA,IAAa,EAAA;AAAA,QACnC,YAAA,EAAc,OAAO,EAAA,EAAI,YAAA;AAAA,QACzB,QAAA,EAAU,CAAA,QAAA,EAAW,MAAA,CAAO,EAAA,EAAI,aAAa,EAAE,CAAA,yBAAA,CAAA;AAAA,QAC/C,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA;AAAA,QACnB,MAAA,EAAQ,OAAO,EAAA,EAAI;AAAA,OACpB,CAAA;AAAA,IACH,KAAK,KAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,GAAA,EAAK,MAAA,IAAU,EAAA;AAAA,QAC9B,MAAA,EAAQ,MAAA,CAAO,GAAA,EAAK,SAAA,IAAa,MAAA;AAAA,QACjC,WAAA,EAAa,MAAA,CAAO,GAAA,EAAK,WAAA,IAAe,EAAA;AAAA,QACxC,eAAA,EAAiB,MAAA,CAAO,GAAA,EAAK,UAAA,IAAc,EAAA;AAAA,QAC3C,MAAA,EAAQ,OAAO,GAAA,EAAK,MAAA;AAAA,QACpB,MAAA,EAAQ,OAAO,GAAA,EAAK;AAAA,OACrB,CAAA;AAAA,IACH,KAAK,cAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,cAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAc,MAAA,IAAU,EAAA;AAAA,QACvC,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAc,MAAA,IAAU,MAAA;AAAA,QACvC,WAAA,EAAa,MAAA,CAAO,YAAA,EAAc,WAAA,IAAe,EAAA;AAAA,QACjD,eAAA,EAAiB,MAAA,CAAO,YAAA,EAAc,eAAA,IAAmB,EAAA;AAAA,QACzD,MAAA,EAAQ,OAAO,YAAA,EAAc,MAAA;AAAA,QAC7B,MAAA,EAAQ,OAAO,YAAA,EAAc;AAAA,OAC9B,CAAA;AAAA,IACH,KAAK,WAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,WAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,SAAA,EAAW,MAAA,IAAU,EAAA;AAAA,QACpC,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,MAAA,CAAO,SAAA,EAAW,gBAAA,IAAoB,EAAA;AAAA,QACnD,eAAA,EAAiB,MAAA,CAAO,SAAA,EAAW,cAAA,IAAkB,EAAA;AAAA,QACrD,MAAA,EAAQ,OAAO,SAAA,EAAW,MAAA;AAAA,QAC1B,MAAA,EAAQ,OAAO,SAAA,EAAW;AAAA,OAC3B,CAAA;AAAA,IACH,KAAK,QAAA;AACH,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,EAAA;AAAA,QACjC,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,WAAA;AAAA,QACjC,WAAA,EAAa,MAAA,CAAO,MAAA,EAAQ,WAAA,IAAe,EAAA;AAAA,QAC3C,eAAA,EAAiB,MAAA,CAAO,MAAA,EAAQ,eAAA,IAAmB,EAAA;AAAA,QACnD,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA;AAAA,QACvB,MAAA,EAAQ,OAAO,MAAA,EAAQ;AAAA,OACxB,CAAA;AAAA,IACH,KAAK,YAAA;AACH,MAAA,OAAO,uBAAA,CAAwB;AAAA,QAC7B,SAAA,EAAW,MAAA,CAAO,UAAA,EAAY,SAAA,IAAa,EAAA;AAAA,QAC3C,MAAA,EAAQ,MAAA,CAAO,UAAA,EAAY,MAAA,IAAU,EAAA;AAAA,QACrC,SAAA,EAAW,MAAA,CAAO,UAAA,EAAY,SAAA,IAAa,EAAA;AAAA,QAC3C,MAAA,EAAQ,OAAO,UAAA,EAAY;AAAA,OAC5B,CAAA;AAAA,IACH,KAAK,KAAA;AAAA,IACL,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,OAAA,GAAU,OAAO,GAAA,IAAO,MAAA;AAC9B,MAAA,OAAO,gBAAA,CAAiB;AAAA,QACtB,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,QACtB,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,QACtB,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,QACtB,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,QAC9B,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,QAC1B,OAAA,EAAS,QAAQ,OAAA,IAAW,EAAA;AAAA,QAC5B,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,IACA,KAAK,OAAA;AAAA,IACL,SAAS;AACP,MAAA,MAAM,WAAA,GAAe,OAAe,KAAA,IAAS;AAAA,QAC3C,SAAA,EAAY,OAAe,iBAAiB,CAAA;AAAA,QAC5C,OAAA,EAAU,OAAe,eAAe;AAAA,OAC1C;AAEA,MAAA,MAAM,cAAA,GAAA,CAAkB,WAAA,EAAa,SAAA,IAAa,EAAA,EAAI,IAAA,EAAK;AAC3D,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAIA,qBAAA,CAAK,UAAA,CAAW,cAAc,CAAA,EAAG;AACnC,UAAA,SAAA,GAAY,cAAA;AAAA,QACd,CAAA,MAAA,IACE,eAAe,QAAA,CAAS,GAAG,KAC3B,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAC5B;AACA,UAAA,SAAA,GAAYA,qBAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,cAAc,CAAA;AAAA,QACxD,CAAA,MAAO;AACL,UAAA,SAAA,GAAYA,sBAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,cAAc,CAAA;AAAA,QAC/D;AAAA,MACF,CAAA,MAAO;AACL,QAAA,SAAA,GAAYA,sBAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,SAAS,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,YAAA,GAAA,CAAgB,WAAA,EAAa,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACvD,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAA,GAAU,aAAa,UAAA,CAAW,GAAG,CAAA,GACjC,YAAA,GACA,IAAI,YAAY,CAAA,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,UAAA;AAAA,MACZ;AAEA,MAAA,OAAO,kBAAA,CAAmB,EAAE,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,IAClD;AAAA;AAEJ;AC3UA,eAAsB,aACpB,MAAA,EACyB;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM8C,sBAAA,CAAM,MAAM,EAAE,QAAA,EAAS;AAG9C,EAAA,MAAM,SAAA,GAAYA,uBAAM,MAAM,CAAA,CAC3B,KAAK,EAAE,OAAA,EAAS,IAAI,CAAA;AAGvB,EAAA,MAAM,YAAYA,sBAAA,CAAM,MAAM,CAAA,CAC3B,MAAA,CAAO,EAAE,KAAA,EAAO,GAAA,EAAK,kBAAA,EAAoB,IAAA,EAAM,CAAA,CAC/C,IAAA,CAAK,EAAE,OAAA,EAAS,IAAI,CAAA;AAEvB,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAM,SAAA,CAAU,QAAA,EAAS;AAAA,IACjC,eAAA,EAAiB,MAAM,SAAA,CAAU,QAAA,EAAS;AAAA,IAC1C,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,GACV;AACF;;;ACUO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAChB,EAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA,GAAqB,OAAA;AAAA,EACrB,YAAA,GAAuB,eAAA;AAAA,EAE/B,WAAA,CACE,EAAA,EACA,OAAA,EACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,OAAA,IAAW,QAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAASC,uBAAA;AAAA,EACjC;AAAA,EAEA,aAAa,IAAA,CACX,EAAA,EACA,OAAA,EACuB;AACvB,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,mDAAA;AAAA,QACA,QAAQ,aAAA,CAAc;AAAA,OACxB;AACA,MAAA,OAAA,GAAU,MAAM,yBAAA,CAA0B,OAAA,CAAQ,aAAa,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,MAAM,aAAA,GAAgB,IAAIC,+BAAA,CAAc,EAAE,CAAA;AAC1C,MAAA,MAAM,cAAc,IAAA,EAAK;AACzB,MAAA,OAAA,GAAU,MAAM,gBAAgB,aAAa,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,IAAI,aAAA,CAAa,EAAA,EAAI,OAAA,EAAS,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEQ,GAAA,GAAc;AACpB,IAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,EAChC;AAAA,EAEQ,oBAAoB,MAAA,EAK1B;AACA,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,IAAW,EAAC;AAClB,IAAA,MAAM,UACJ,MAAA,CAAO,MAAA,KAAW,MAAA,GAAS,OAAA,GAAU,OAAO,MAAA,IAAU,YAAA;AACxD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,KAAY,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAEnD,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,CAAA,uEAAA;AAAA,OACF;AACA,MAAA,MAAM,CAAA,GAAI,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA;AAC3B,MAAA,CAAA,CAAE,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACnB;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,KAAS,KAAA,EAAO;AACxC,MAAA,UAAA,CAAW,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAClC,MAAA,CAAA,CAAE,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,UAAA,CAAW,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC/C,MAAA,CAAA,CAAE,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,KAAA,GACJ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAChE,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,SAAS,OAAA,EAAQ;AAAA,EACvD;AAAA,EAEQ,WAAW,GAAA,EAAoB;AACrC,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,MACpB,YAAA,EAAc,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,YAAA;AAAA,MACvC,QAAA,EAAU,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,QAAA;AAAA,MAC/B,QAAA,EAAU,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,QAAA;AAAA,MAC/B,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,MACpB,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,MACtB,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,YAAA,EAAc,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,YAAA,IAAgB,IAAA;AAAA,MACvD,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,MACtB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,GAAA,EAAK,IAAI,GAAA,IAAO,IAAA;AAAA,MAChB,OAAA,EAAS,IAAI,OAAA,IAAW,IAAA;AAAA,MACxB,QAAA,EAAU,IAAI,QAAA,IAAY,IAAA;AAAA,MAC1B,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA;AAAA,MACjC,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,MAAc,SAAA,CAAU,GAAA,EAAa,MAAA,GAAgB,EAAC,EAAiB;AACrE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAGxC,IAAA,IACE,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,IAC5B,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,IAC5B,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAC5B;AACA,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,IAC3B;AAGA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,EAC3B;AAAA,EAEQ,SAAA,CAAU,GAAA,EAAa,MAAA,GAAgB,EAAC,EAAQ;AACtD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,MAAA,CAAO,IAAA,EAAY,MAAA,GAAiB,EAAA,EAAuB;AAC/D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAC7C,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA,GAAmB,IAAA;AACvB,IAAA,IAAI,WAAW,IAAA,CAAK,IAAA;AACpB,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI,MAAA,GAAwB,IAAA;AAE5B,IAAA,IAAI,WAAW,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,aAAa,CAAA;AACnD,MAAA,SAAA,GAAY,MAAM,aAAa,MAAM,CAAA;AACrC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,aAAa,EAAE,CAAA;AACtD,MAAA,MAAM,QAAA,GAAW,YAAA,CACd,WAAA,EAAY,CACZ,QAAQ,YAAA,EAAc,GAAG,CAAA,CACzB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,SAAA,CAAU,GAAG,EAAE,CAAA;AAClB,MAAA,QAAA,GAAW,GAAG,QAAQ,CAAA,KAAA,CAAA;AACtB,MAAA,KAAA,GAAQ,UAAU,KAAA,IAAS,IAAA;AAC3B,MAAA,MAAA,GAAS,UAAU,MAAA,IAAU,IAAA;AAC7B,MAAA,UAAA,GAAa,IAAI,IAAA,CAAK,CAAC,SAAA,CAAU,MAAM,GAAG,QAAA,EAAU;AAAA,QAClD,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,aAAA,GAA8B,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAA,EAAY;AAAA,MACxE,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA;AAAA,MACtC;AAAA,QACE,GAAG,aAAA;AAAA,QACH,EAAA,EAAI,EAAA;AAAA,QACJ,QAAA,EAAU,KAAK,OAAA,CAAQ,IAAA;AAAA,QACvB,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAAA,MACA,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA;AAAI,KAC5B;AAEA,IAAA,MAAM,EAAA,GAAK,KAAK,KAAA,EAAM;AACtB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,CAAK,SAAA;AAAA,QACT,CAAA,YAAA,EAAe,KAAK,UAAU;AAAA;AAAA,mEAAA,CAAA;AAAA,QAG9B;AAAA,UACE,EAAA;AAAA,UACA,aAAA,CAAc,QAAA;AAAA,UACd,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAAA,UACjC,IAAA,CAAK,IAAA;AAAA,UACL,aAAA,CAAc,QAAA;AAAA,UACd,aAAA,CAAc,IAAA;AAAA,UACd,KAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA,CAAc,GAAA;AAAA,UACd,YAAA;AAAA,UACA,MAAA,IAAU,IAAA;AAAA,UACV,KAAK,OAAA,CAAQ,IAAA;AAAA,UACb,IAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,MAAA,CAAO,WAAW,EAClB,MAAA,CAAO;AAAA,QACN,EAAA;AAAA,QACA,UAAU,aAAA,CAAc,QAAA;AAAA,QACxB,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,aAAa,EAAE,CAAA;AAAA,QACxC,cAAc,IAAA,CAAK,IAAA;AAAA,QACnB,UAAU,aAAA,CAAc,QAAA;AAAA,QACxB,UAAU,aAAA,CAAc,IAAA;AAAA,QACxB,KAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAK,aAAA,CAAc,GAAA;AAAA,QACnB,YAAA;AAAA,QACA,QAAQ,MAAA,IAAU,EAAA;AAAA,QAClB,QAAA,EAAU,KAAK,OAAA,CAAQ,IAAA;AAAA,QACvB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,SAAA,sBAAe,IAAA;AAAK,OACrB,EACA,SAAA,EAAU;AAAA,IACf;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,UAAU,aAAA,CAAc,QAAA;AAAA,MACxB,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,aAAa,EAAE,CAAA;AAAA,MACxC,cAAc,IAAA,CAAK,IAAA;AAAA,MACnB,UAAU,aAAA,CAAc,QAAA;AAAA,MACxB,UAAU,aAAA,CAAc,IAAA;AAAA,MACxB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAK,aAAA,CAAc,GAAA;AAAA,MACnB,YAAA;AAAA,MACA,QAAQ,MAAA,IAAU,IAAA;AAAA,MAClB,QAAA,EAAU,KAAK,OAAA,CAAQ,IAAA;AAAA,MACvB,GAAA,EAAK,IAAA;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,IAAI,IAAA,GAAwB,IAAA;AAE5B,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAA,cAAA,EAAiB,IAAA,CAAK,UAAU,CAAA,aAAA,CAAA,EAAiB;AAAA,QACrE;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,MAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,IAAA,CAAK,GACtB,MAAA,EAAO,CACP,IAAA,CAAK,WAAW,EAChB,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,MAAA,CAAO,EAAE,CAAC,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAE9B,IAAA,IACE,IAAA,CAAK,YAAA,IACL,IAAA,CAAK,YAAA,KAAiB,IAAA,CAAK,OAC3B,IAAA,CAAK,YAAA,KAAiB,IAAA,CAAK,GAAA,GAAM,QAAA,EACjC;AACA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,CAAK,UAAU,CAAA,YAAA,EAAe,IAAA,CAAK,UAAU,CAAA,aAAA,CAAA,EAAiB,CAAC,EAAE,CAAC,CAAA;AAAA,IAC1E,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,WAAW,CAAA,CAAE,MAAM,WAAA,CAAY,EAAA,CAAG,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAA,CAAO,EAAA,EAAY,MAAA,EAA0C;AACjE,IAAA,IAAI,IAAA,GAAwB,IAAA;AAE5B,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAA,cAAA,EAAiB,IAAA,CAAK,UAAU,CAAA,aAAA,CAAA,EAAiB;AAAA,QACrE;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,MAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,IAAA,CAAK,GACtB,MAAA,EAAO,CACP,IAAA,CAAK,WAAW,EAChB,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,MAAA,CAAO,EAAE,CAAC,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,MAAM,CAAA;AAGzD,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,OAAA,CAAQ,SAAS,YAAA,EAAc;AAE3D,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,oBAAoB,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,YAAA,GAAe,YAAA,CAAa,CAAC,IAAI,GAAA,GAAM,EAAA;AAGvD,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,iBAAiB,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,eACZ,YAAA,CAAa,CAAC,IACd,6BAAA,GACG,IAAA,CAAK,OAAA,CAAgB,MAAA,EAAQ,SAAA,IAAa,SAAA;AAGjD,MAAA,eAAA,GAAkB,CAAA,EAAG,OAAO,CAAA,2BAAA,EAA8B,OAAO,GAAG,MAAM,CAAA,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AACzC,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,GAAG,IAAI,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAEpE,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,GAAA,EAAK,MAAA;AAAA,MACL,QAAA,EAAU,WAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAE7B,MAAA,MAAM,gBAAA,GAAwC,EAAE,GAAG,UAAA,EAAW;AAC9D,MAAA,IAAI,kBAAkB,gBAAA,EAAkB;AACtC,QAAA,gBAAA,CAAiB,gBAAgB,gBAAA,CAAiB,YAAA;AAClD,QAAA,OAAO,gBAAA,CAAiB,YAAA;AAAA,MAC1B;AAEA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CACtC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,IAAA,CAAM,CAAA,CACrB,KAAK,IAAI,CAAA;AACZ,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA;AAC3C,MAAA,MAAM,IAAA,CAAK,SAAA;AAAA,QACT,CAAA,OAAA,EAAU,IAAA,CAAK,UAAU,CAAA,KAAA,EAAQ,IAAI,CAAA,6BAAA,CAAA;AAAA,QACrC,CAAC,GAAG,IAAA,EAAM,IAAA,CAAK,GAAA,IAAO,EAAE;AAAA,OAC1B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,MAAA,MAAM,IAAA,CAAK,GACR,MAAA,CAAO,WAAW,EAClB,GAAA,CAAI,EAAE,GAAG,UAAA,EAAY,SAAA,EAAW,KAAK,GAAA,EAAI,EAAG,CAAA,CAC5C,KAAA,CAAM,YAAY,EAAA,CAAG,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,GAAG,UAAA;AAAA,MACH,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,YAAA,EAAc,WAAW,YAAA,IAAgB;AAAA,KAC3C;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,MAAA,GAA4B,EAAC,EAMrC;AACD,IAAA,MAAM;AAAA,MACJ,IAAA,GAAO,CAAA;AAAA,MACP,KAAA,GAAQ,EAAA;AAAA,MACR,MAAA,GAAS,EAAA;AAAA,MACT,IAAA,GAAO,EAAA;AAAA,MACP,MAAA,GAAS,EAAA;AAAA,MACT,MAAA,GAAS,WAAA;AAAA,MACT,OAAA,GAAU;AAAA,KACZ,GAAI,MAAA;AAEJ,IAAA,MAAM;AAAA,MACJ,KAAA;AAAA,MACA,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAK,mBAAA,CAAoB;AAAA,MAC3B,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,KAAA;AAE5B,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AAAA,QACpB,CAAA,4BAAA,EAA+B,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,QACvD;AAAA,OACF;AACA,MAAA,MAAMC,UAAAA,GAAY,UAAU,GAAA,IAAO,CAAA;AAEnC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA;AAAA,QACtB,CAAA,cAAA,EAAiB,KAAK,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,UAAA,EAAa,OAAO,IAAI,OAAO,CAAA,iBAAA,CAAA;AAAA,QACxE,CAAC,GAAG,CAAA,EAAG,KAAA,EAAO,MAAM;AAAA,OACtB;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAK,GAAA,CAAI,CAAC,MAAW,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,QAC7C,SAAA,EAAAA,UAAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAKA,UAAAA,GAAY,KAAK;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,MAAM,EAAA,EAAI,GAAA,EAAI,GAAI,OAC5C,KAAK,OAAA,KAAY,OAAA,GADiC,OAE9C,wBAEN,CAAA,GAJoD,OAG9C,qBACN,CAAA,CAAA;AAEA,IAAA,MAAM,aAAoB,EAAC;AAC3B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,EAAA;AAAA,UACE,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,UACrC,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,UACxC,IAAA,CAAK,WAAA,CAAY,YAAA,EAAc,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,UAC5C,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG;AAAA;AACrC,OACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,IAAQ,SAAS,KAAA,EAAO;AAC1B,MAAA,UAAA,CAAW,KAAK,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA,EAAG,IAAI,IAAI,CAAC,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,EAAA;AAAA,UACE,EAAA,CAAG,WAAA,CAAY,MAAA,EAAQ,MAAM,CAAA;AAAA,UAC7B,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI;AAAA;AACxC,OACF;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,UAAA,CAAW,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,UAAU,CAAA,GAAI,MAAA;AACjE,IAAA,MAAM,KAAA,GACJ,OAAA,KAAY,KAAA,GACR,GAAA,CAAI,WAAA,CAAY,OAAmC,CAAC,CAAA,GACpD,IAAA,CAAK,WAAA,CAAY,OAAmC,CAAC,CAAA;AAE3D,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,GACrB,MAAA,EAAO,CACP,KAAK,WAAW,CAAA,CAChB,MAAM,WAAW,CAAA,CACjB,QAAQ,KAAK,CAAA,CACb,MAAM,KAAK,CAAA,CACX,OAAO,MAAM,CAAA;AAEhB,IAAA,MAAM,CAAC,EAAE,KAAA,EAAO,CAAA,GAAI,MAAM,KAAK,EAAA,CAC5B,MAAA,CAAO,EAAE,KAAA,EAAO,eAAe,CAAA,CAC/B,KAAK,WAAW,CAAA,CAChB,MAAM,WAAW,CAAA;AAEpB,IAAA,MAAM,SAAA,GAAY,OAAO,KAAK,CAAA;AAC9B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,GAAA,CAAI,CAAC,MAAW,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,MAC7C,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK;AAAA,KACzC;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CACJ,EAAA,EACA,IAAA,EAC0B;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,GAAiB,CAAC,gBAAgB,CAAA;AACxC,MAAA,MAAM,CAAA,GAAW,CAAC,GAAG,CAAA;AACrB,MAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,QAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AACrB,QAAA,CAAA,CAAE,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,MACnB;AACA,MAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,QAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,QAAA,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,MACjB;AACA,MAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,QAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AACvB,QAAA,CAAA,CAAE,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,MACrB;AACA,MAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,QAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AACtB,QAAA,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,IAAI,CAAA;AAAA,MAC5B;AACA,MAAA,CAAA,CAAE,KAAK,EAAE,CAAA;AACT,MAAA,MAAM,IAAA,CAAK,SAAA;AAAA,QACT,UAAU,IAAA,CAAK,UAAU,QAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,CAAA;AAAA,QAChD;AAAA,OACF;AACA,MAAA,MAAM,MAAM,IAAA,CAAK,SAAA;AAAA,QACf,CAAA,cAAA,EAAiB,KAAK,UAAU,CAAA,aAAA,CAAA;AAAA,QAChC,CAAC,EAAE;AAAA,OACL;AACA,MAAA,OAAO,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA;AAAA,IACtC;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,IAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,EAAA,CAC1B,MAAA,CAAO,WAAW,CAAA,CAClB,GAAA,CAAI,EAAE,GAAG,IAAA,EAAM,2BAAW,IAAI,IAAA,EAAK,EAAG,CAAA,CACtC,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,MAAA,CAAO,EAAE,CAAC,CAAA,CAC/B,SAAA,EAAU;AACb,IAAA,OAAO,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,UAAA,CAAW,GAAA,EAAe,IAAA,EAA0C;AACxE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,MAAM,IAAA,GAAO,CAAC,gBAAgB,CAAA;AAC9B,QAAA,MAAM,CAAA,GAAW,CAAC,GAAG,CAAA;AACrB,QAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,UAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AACtB,UAAA,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,IAAI,CAAA;AAAA,QAC5B;AACA,QAAA,CAAA,CAAE,KAAK,EAAE,CAAA;AACT,QAAA,MAAM,IAAA,CAAK,SAAA;AAAA,UACT,UAAU,IAAA,CAAK,UAAU,QAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,CAAA;AAAA,UAChD;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,OAC7B,IAAA,CAAK,OAAA,KAAY,OAAA,GADkB,OAE/B,4BAEN,CAAA,GAJqC,OAG/B,sBACN,CAAA,CAAA;AACA,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,MAAM,IAAA,CAAK,GACR,MAAA,CAAO,WAAW,EAClB,GAAA,CAAI,EAAE,GAAG,IAAA,EAAM,SAAA,sBAAe,IAAA,EAAK,EAAG,CAAA,CACtC,KAAA,CAAM,YAAY,EAAA,CAAG,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAAiC;AACrC,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA;AAAA,QACtB,CAAA,iBAAA,EAAoB,KAAK,YAAY,CAAA;AAAA,oCAAA,EACP,KAAK,UAAU,CAAA,0CAAA;AAAA,OAC/C;AACA,MAAA,OAAO,IAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA,CACtB,MAAA,CAAO,CAAC,CAAA,KAAW,CAAA,IAAK,CAAA,KAAM,EAAE,EAChC,IAAA,EAAK;AAAA,IACV;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,YAAA,EAAc,cAAa,GAAI,OACzD,IAAA,CAAK,OAAA,KAAY,OAAA,GAD8C,OAE3D,4BAEN,CAAA,GAJiE,OAG3D,sBACN,CAAA,CAAA;AACA,IAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAI,GAAI,OAClB,IAAA,CAAK,OAAA,KAAY,OAAA,GADO,OAEpB,wBAEN,CAAA,GAJ0B,OAGpB,qBACN,CAAA,CAAA;AAEA,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,EAAA,CAC1B,MAAA,CAAO,EAAE,MAAA,EAAQ,WAAA,CAAY,MAAA,EAAQ,EACrC,IAAA,CAAK,WAAW,CAAA,CAChB,OAAA,CAAQ,YAAY,MAAM,CAAA;AAE7B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAC5B,MAAA,CAAO,EAAE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,CAAA,CAClC,IAAA,CAAK,YAAY,CAAA;AAEpB,IAAA,MAAM,QAAA,uBAAe,GAAA,CAAI;AAAA,MACvB,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,MAAM,CAAA;AAAA,MACrC,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAI;AAAA,KACtC,CAAA;AAED,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CACvB,MAAA,CAAO,CAAC,CAAA,KAAW,CAAA,IAAK,CAAA,KAAM,EAAE,CAAA,CAChC,IAAA,EAAK;AAAA,EACV;AAAA,EAEA,MAAM,YAAA,CAAa,IAAA,EAAc,UAAA,GAAqB,EAAA,EAAmB;AACvE,IAAA,MAAM,WAAW,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAExD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACjC,MAAA,MAAM,EAAE,KAAA,EAAArB,MAAAA,EAAM,GAAI,MAAM,OAAO,aAAa,CAAA;AAC5C,MAAA,MAAM,EAAE,IAAA,EAAAN,KAAAA,EAAK,GAAI,MAAM,OAAO,MAAM,CAAA;AACpC,MAAA,MAAMM,MAAAA,CAAMN,MAAK,OAAA,CAAQ,GAAA,IAAO,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA,EAAG;AAAA,QAC9D,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,CAAK,SAAA;AAAA,QACT,CAAA,sBAAA,EAAyB,KAAK,YAAY,CAAA,0DAAA,CAAA;AAAA,QAC1C,CAAC,QAAA,EAAU,IAAA,EAAM,UAAA,IAAc,MAAM,GAAG;AAAA,OAC1C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,OACrC,IAAA,CAAK,OAAA,KAAY,OAAA,GAD0B,OAEvC,4BAEN,CAAA,GAJ6C,OAGvC,sBACN,CAAA,CAAA;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,MAAA,CAAO,YAAY,EACnB,MAAA,CAAO;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA;AAAA,QACA,YAAY,UAAA,IAAc,IAAA;AAAA,QAC1B,SAAA,sBAAe,IAAA;AAAK,OACrB,EACA,mBAAA,EAAoB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAO,CAAA;AACvD,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,IAAA,EAAM;AAC9B,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,CAAK,SAAA;AAAA,QACT,CAAA,YAAA,EAAe,KAAK,YAAY,CAAA,8BAAA,CAAA;AAAA,QAChC,CAAC,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI;AAAA,OACxB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,OACrC,IAAA,CAAK,OAAA,KAAY,OAAA,GAD0B,OAEvC,4BAEN,CAAA,GAJ6C,OAGvC,sBACN,CAAA,CAAA;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,EAAA,EAAG,GAAI,OACvB,IAAA,CAAK,OAAA,KAAY,OAAA,GADY,OAEzB,wBAEN,CAAA,GAJ+B,OAGzB,qBACN,CAAA,CAAA;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,MAAA,CAAO,YAAY,CAAA,CACnB,KAAA;AAAA,QACC,EAAA;AAAA,UACE,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAAA,UAC5B,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI;AAAA;AACvC,OACF;AAAA,IACJ;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACjC,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,MAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAK,GAAI,MAAM,OAAO,MAAM,CAAA;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,CAAGA,MAAK,OAAA,CAAQ,GAAA,IAAO,QAAA,EAAU,SAAA,EAAW,MAAM,CAAA,EAAG;AAAA,UACzD,SAAA,EAAW,IAAA;AAAA,UACX,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AACF;;;AC5tBA,SAAS,qBACP,WAAA,EAIoB;AACpB,EAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAC;AAC1B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,WAAA;AACvC,EAAA,OAAO,MAAA,CAAO,OAAO,WAAW,CAAA;AAClC;AAEA,SAAS,iBACP,OAAA,EACgB;AAChB,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAO,OAAA;AACnC,EAAA,OAAO,MAAA,CAAO,OAAO,OAAO,CAAA;AAC9B;AAEO,SAAS,aAAa,MAAA,EAcd;AACb,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,oBAAA,CAAqB,MAAA,CAAO,WAAW,CAAA;AAAA,IACpD,OAAA,EAAS,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA;AAAA,IACxC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,MAAA,CAAO;AAAA,GAChB;AACF","file":"index.cjs","sourcesContent":["export const getHttpHandlerExtensionConfiguration = (runtimeConfig) => {\n return {\n setHttpHandler(handler) {\n runtimeConfig.httpHandler = handler;\n },\n httpHandler() {\n return runtimeConfig.httpHandler;\n },\n updateHttpClientConfig(key, value) {\n runtimeConfig.httpHandler?.updateHttpClientConfig(key, value);\n },\n httpHandlerConfigs() {\n return runtimeConfig.httpHandler.httpHandlerConfigs();\n },\n };\n};\nexport const resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => {\n return {\n httpHandler: httpHandlerExtensionConfiguration.httpHandler(),\n };\n};\n","export * from \"./httpExtensionConfiguration\";\n","import { FieldPosition } from \"@smithy/types\";\nexport class Field {\n name;\n kind;\n values;\n constructor({ name, kind = FieldPosition.HEADER, values = [] }) {\n this.name = name;\n this.kind = kind;\n this.values = values;\n }\n add(value) {\n this.values.push(value);\n }\n set(values) {\n this.values = values;\n }\n remove(value) {\n this.values = this.values.filter((v) => v !== value);\n }\n toString() {\n return this.values.map((v) => (v.includes(\",\") || v.includes(\" \") ? `\"${v}\"` : v)).join(\", \");\n }\n get() {\n return this.values;\n }\n}\n","export class Fields {\n entries = {};\n encoding;\n constructor({ fields = [], encoding = \"utf-8\" }) {\n fields.forEach(this.setField.bind(this));\n this.encoding = encoding;\n }\n setField(field) {\n this.entries[field.name.toLowerCase()] = field;\n }\n getField(name) {\n return this.entries[name.toLowerCase()];\n }\n removeField(name) {\n delete this.entries[name.toLowerCase()];\n }\n getByType(kind) {\n return Object.values(this.entries).filter((field) => field.kind === kind);\n }\n}\n","export {};\n","export class HttpRequest {\n method;\n protocol;\n hostname;\n port;\n path;\n query;\n headers;\n username;\n password;\n fragment;\n body;\n constructor(options) {\n this.method = options.method || \"GET\";\n this.hostname = options.hostname || \"localhost\";\n this.port = options.port;\n this.query = options.query || {};\n this.headers = options.headers || {};\n this.body = options.body;\n this.protocol = options.protocol\n ? options.protocol.slice(-1) !== \":\"\n ? `${options.protocol}:`\n : options.protocol\n : \"https:\";\n this.path = options.path ? (options.path.charAt(0) !== \"/\" ? `/${options.path}` : options.path) : \"/\";\n this.username = options.username;\n this.password = options.password;\n this.fragment = options.fragment;\n }\n static clone(request) {\n const cloned = new HttpRequest({\n ...request,\n headers: { ...request.headers },\n });\n if (cloned.query) {\n cloned.query = cloneQuery(cloned.query);\n }\n return cloned;\n }\n static isInstance(request) {\n if (!request) {\n return false;\n }\n const req = request;\n return (\"method\" in req &&\n \"protocol\" in req &&\n \"hostname\" in req &&\n \"path\" in req &&\n typeof req[\"query\"] === \"object\" &&\n typeof req[\"headers\"] === \"object\");\n }\n clone() {\n return HttpRequest.clone(this);\n }\n}\nfunction cloneQuery(query) {\n return Object.keys(query).reduce((carry, paramName) => {\n const param = query[paramName];\n return {\n ...carry,\n [paramName]: Array.isArray(param) ? [...param] : param,\n };\n }, {});\n}\n","export class HttpResponse {\n statusCode;\n reason;\n headers;\n body;\n constructor(options) {\n this.statusCode = options.statusCode;\n this.reason = options.reason;\n this.headers = options.headers || {};\n this.body = options.body;\n }\n static isInstance(response) {\n if (!response)\n return false;\n const resp = response;\n return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n }\n}\n","export function isValidHostname(hostname) {\n const hostPattern = /^[a-z0-9][a-z0-9\\.\\-]*[a-z0-9]$/;\n return hostPattern.test(hostname);\n}\n","export {};\n","export * from \"./extensions\";\nexport * from \"./Field\";\nexport * from \"./Fields\";\nexport * from \"./httpHandler\";\nexport * from \"./httpRequest\";\nexport * from \"./httpResponse\";\nexport * from \"./isValidHostname\";\nexport * from \"./types\";\n","export const escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","import { escapeUri } from \"./escape-uri\";\nexport const escapeUriPath = (uri) => uri.split(\"/\").map(escapeUri).join(\"/\");\n","export * from \"./escape-uri\";\nexport * from \"./escape-uri-path\";\n","import { escapeUri } from \"@smithy/util-uri-escape\";\nexport function buildQueryString(query) {\n const parts = [];\n for (let key of Object.keys(query).sort()) {\n const value = query[key];\n key = escapeUri(key);\n if (Array.isArray(value)) {\n for (let i = 0, iLen = value.length; i < iLen; i++) {\n parts.push(`${key}=${escapeUri(value[i])}`);\n }\n }\n else {\n let qsEntry = key;\n if (value || typeof value === \"string\") {\n qsEntry += `=${escapeUri(value)}`;\n }\n parts.push(qsEntry);\n }\n }\n return parts.join(\"&\");\n}\n","export function buildAbortError(abortSignal) {\n const reason = abortSignal && typeof abortSignal === \"object\" && \"reason\" in abortSignal\n ? abortSignal.reason\n : undefined;\n if (reason) {\n if (reason instanceof Error) {\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n abortError.cause = reason;\n return abortError;\n }\n const abortError = new Error(String(reason));\n abortError.name = \"AbortError\";\n return abortError;\n }\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n return abortError;\n}\n","export const NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n","const getTransformedHeaders = (headers) => {\n const transformedHeaders = {};\n for (const name of Object.keys(headers)) {\n const headerValues = headers[name];\n transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n }\n return transformedHeaders;\n};\nexport { getTransformedHeaders };\n","export const timing = {\n setTimeout: (cb, ms) => setTimeout(cb, ms),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n};\n","import { timing } from \"./timing\";\nconst DEFER_EVENT_LISTENER_TIME = 1000;\nexport const setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n if (!timeoutInMs) {\n return -1;\n }\n const registerTimeout = (offset) => {\n const timeoutId = timing.setTimeout(() => {\n request.destroy();\n reject(Object.assign(new Error(`@smithy/node-http-handler - the request socket did not establish a connection with the server within the configured timeout of ${timeoutInMs} ms.`), {\n name: \"TimeoutError\",\n }));\n }, timeoutInMs - offset);\n const doWithSocket = (socket) => {\n if (socket?.connecting) {\n socket.on(\"connect\", () => {\n timing.clearTimeout(timeoutId);\n });\n }\n else {\n timing.clearTimeout(timeoutId);\n }\n };\n if (request.socket) {\n doWithSocket(request.socket);\n }\n else {\n request.on(\"socket\", doWithSocket);\n }\n };\n if (timeoutInMs < 2000) {\n registerTimeout(0);\n return 0;\n }\n return timing.setTimeout(registerTimeout.bind(null, DEFER_EVENT_LISTENER_TIME), DEFER_EVENT_LISTENER_TIME);\n};\n","import { timing } from \"./timing\";\nexport const setRequestTimeout = (req, reject, timeoutInMs = 0, throwOnRequestTimeout, logger) => {\n if (timeoutInMs) {\n return timing.setTimeout(() => {\n let msg = `@smithy/node-http-handler - [${throwOnRequestTimeout ? \"ERROR\" : \"WARN\"}] a request has exceeded the configured ${timeoutInMs} ms requestTimeout.`;\n if (throwOnRequestTimeout) {\n const error = Object.assign(new Error(msg), {\n name: \"TimeoutError\",\n code: \"ETIMEDOUT\",\n });\n req.destroy(error);\n reject(error);\n }\n else {\n msg += ` Init client requestHandler with throwOnRequestTimeout=true to turn this into an error.`;\n logger?.warn?.(msg);\n }\n }, timeoutInMs);\n }\n return -1;\n};\n","import { timing } from \"./timing\";\nconst DEFER_EVENT_LISTENER_TIME = 3000;\nexport const setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }, deferTimeMs = DEFER_EVENT_LISTENER_TIME) => {\n if (keepAlive !== true) {\n return -1;\n }\n const registerListener = () => {\n if (request.socket) {\n request.socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n }\n else {\n request.on(\"socket\", (socket) => {\n socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n });\n }\n };\n if (deferTimeMs === 0) {\n registerListener();\n return 0;\n }\n return timing.setTimeout(registerListener, deferTimeMs);\n};\n","import { timing } from \"./timing\";\nconst DEFER_EVENT_LISTENER_TIME = 3000;\nexport const setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n const registerTimeout = (offset) => {\n const timeout = timeoutInMs - offset;\n const onTimeout = () => {\n request.destroy();\n reject(Object.assign(new Error(`@smithy/node-http-handler - the request socket timed out after ${timeoutInMs} ms of inactivity (configured by client requestHandler).`), { name: \"TimeoutError\" }));\n };\n if (request.socket) {\n request.socket.setTimeout(timeout, onTimeout);\n request.on(\"close\", () => request.socket?.removeListener(\"timeout\", onTimeout));\n }\n else {\n request.setTimeout(timeout, onTimeout);\n }\n };\n if (0 < timeoutInMs && timeoutInMs < 6000) {\n registerTimeout(0);\n return 0;\n }\n return timing.setTimeout(registerTimeout.bind(null, timeoutInMs === 0 ? 0 : DEFER_EVENT_LISTENER_TIME), DEFER_EVENT_LISTENER_TIME);\n};\n","import { Readable } from \"node:stream\";\nimport { timing } from \"./timing\";\nconst MIN_WAIT_TIME = 6_000;\nexport async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME, externalAgent = false) {\n const headers = request.headers ?? {};\n const expect = headers.Expect || headers.expect;\n let timeoutId = -1;\n let sendBody = true;\n if (!externalAgent && expect === \"100-continue\") {\n sendBody = await Promise.race([\n new Promise((resolve) => {\n timeoutId = Number(timing.setTimeout(() => resolve(true), Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n }),\n new Promise((resolve) => {\n httpRequest.on(\"continue\", () => {\n timing.clearTimeout(timeoutId);\n resolve(true);\n });\n httpRequest.on(\"response\", () => {\n timing.clearTimeout(timeoutId);\n resolve(false);\n });\n httpRequest.on(\"error\", () => {\n timing.clearTimeout(timeoutId);\n resolve(false);\n });\n }),\n ]);\n }\n if (sendBody) {\n writeBody(httpRequest, request.body);\n }\n}\nfunction writeBody(httpRequest, body) {\n if (body instanceof Readable) {\n body.pipe(httpRequest);\n return;\n }\n if (body) {\n const isBuffer = Buffer.isBuffer(body);\n const isString = typeof body === \"string\";\n if (isBuffer || isString) {\n if (isBuffer && body.byteLength === 0) {\n httpRequest.end();\n }\n else {\n httpRequest.end(body);\n }\n return;\n }\n const uint8 = body;\n if (typeof uint8 === \"object\" &&\n uint8.buffer &&\n typeof uint8.byteOffset === \"number\" &&\n typeof uint8.byteLength === \"number\") {\n httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength));\n return;\n }\n httpRequest.end(Buffer.from(body));\n return;\n }\n httpRequest.end();\n}\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { buildQueryString } from \"@smithy/querystring-builder\";\nimport { Agent as hsAgent, request as hsRequest } from \"node:https\";\nimport { buildAbortError } from \"./build-abort-error\";\nimport { NODEJS_TIMEOUT_ERROR_CODES } from \"./constants\";\nimport { getTransformedHeaders } from \"./get-transformed-headers\";\nimport { setConnectionTimeout } from \"./set-connection-timeout\";\nimport { setRequestTimeout } from \"./set-request-timeout\";\nimport { setSocketKeepAlive } from \"./set-socket-keep-alive\";\nimport { setSocketTimeout } from \"./set-socket-timeout\";\nimport { timing } from \"./timing\";\nimport { writeRequestBody } from \"./write-request-body\";\nexport const DEFAULT_REQUEST_TIMEOUT = 0;\nlet hAgent = undefined;\nlet hRequest = undefined;\nexport class NodeHttpHandler {\n config;\n configProvider;\n socketWarningTimestamp = 0;\n externalAgent = false;\n metadata = { handlerProtocol: \"http/1.1\" };\n static create(instanceOrOptions) {\n if (typeof instanceOrOptions?.handle === \"function\") {\n return instanceOrOptions;\n }\n return new NodeHttpHandler(instanceOrOptions);\n }\n static checkSocketUsage(agent, socketWarningTimestamp, logger = console) {\n const { sockets, requests, maxSockets } = agent;\n if (typeof maxSockets !== \"number\" || maxSockets === Infinity) {\n return socketWarningTimestamp;\n }\n const interval = 15_000;\n if (Date.now() - interval < socketWarningTimestamp) {\n return socketWarningTimestamp;\n }\n if (sockets && requests) {\n for (const origin in sockets) {\n const socketsInUse = sockets[origin]?.length ?? 0;\n const requestsEnqueued = requests[origin]?.length ?? 0;\n if (socketsInUse >= maxSockets && requestsEnqueued >= 2 * maxSockets) {\n logger?.warn?.(`@smithy/node-http-handler:WARN - socket usage at capacity=${socketsInUse} and ${requestsEnqueued} additional requests are enqueued.\nSee https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html\nor increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.`);\n return Date.now();\n }\n }\n }\n return socketWarningTimestamp;\n }\n constructor(options) {\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((_options) => {\n resolve(this.resolveDefaultConfig(_options));\n })\n .catch(reject);\n }\n else {\n resolve(this.resolveDefaultConfig(options));\n }\n });\n }\n destroy() {\n this.config?.httpAgent?.destroy();\n this.config?.httpsAgent?.destroy();\n }\n async handle(request, { abortSignal, requestTimeout } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n }\n const config = this.config;\n const isSSL = request.protocol === \"https:\";\n if (!isSSL && !this.config.httpAgent) {\n this.config.httpAgent = await this.config.httpAgentProvider();\n }\n return new Promise((_resolve, _reject) => {\n let writeRequestBodyPromise = undefined;\n const timeouts = [];\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n timeouts.forEach(timing.clearTimeout);\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n timeouts.forEach(timing.clearTimeout);\n _reject(arg);\n };\n if (abortSignal?.aborted) {\n const abortError = buildAbortError(abortSignal);\n reject(abortError);\n return;\n }\n const headers = request.headers ?? {};\n const expectContinue = (headers.Expect ?? headers.expect) === \"100-continue\";\n let agent = isSSL ? config.httpsAgent : config.httpAgent;\n if (expectContinue && !this.externalAgent) {\n agent = new (isSSL ? hsAgent : hAgent)({\n keepAlive: false,\n maxSockets: Infinity,\n });\n }\n timeouts.push(timing.setTimeout(() => {\n this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp, config.logger);\n }, config.socketAcquisitionWarningTimeout ?? (config.requestTimeout ?? 2000) + (config.connectionTimeout ?? 1000)));\n const queryString = buildQueryString(request.query || {});\n let auth = undefined;\n if (request.username != null || request.password != null) {\n const username = request.username ?? \"\";\n const password = request.password ?? \"\";\n auth = `${username}:${password}`;\n }\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n let hostname = request.hostname ?? \"\";\n if (hostname[0] === \"[\" && hostname.endsWith(\"]\")) {\n hostname = request.hostname.slice(1, -1);\n }\n else {\n hostname = request.hostname;\n }\n const nodeHttpsOptions = {\n headers: request.headers,\n host: hostname,\n method: request.method,\n path,\n port: request.port,\n agent,\n auth,\n };\n const requestFunc = isSSL ? hsRequest : hRequest;\n const req = requestFunc(nodeHttpsOptions, (res) => {\n const httpResponse = new HttpResponse({\n statusCode: res.statusCode || -1,\n reason: res.statusMessage,\n headers: getTransformedHeaders(res.headers),\n body: res,\n });\n resolve({ response: httpResponse });\n });\n req.on(\"error\", (err) => {\n if (NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n reject(Object.assign(err, { name: \"TimeoutError\" }));\n }\n else {\n reject(err);\n }\n });\n if (abortSignal) {\n const onAbort = () => {\n req.destroy();\n const abortError = buildAbortError(abortSignal);\n reject(abortError);\n };\n if (typeof abortSignal.addEventListener === \"function\") {\n const signal = abortSignal;\n signal.addEventListener(\"abort\", onAbort, { once: true });\n req.once(\"close\", () => signal.removeEventListener(\"abort\", onAbort));\n }\n else {\n abortSignal.onabort = onAbort;\n }\n }\n const effectiveRequestTimeout = requestTimeout ?? config.requestTimeout;\n timeouts.push(setConnectionTimeout(req, reject, config.connectionTimeout));\n timeouts.push(setRequestTimeout(req, reject, effectiveRequestTimeout, config.throwOnRequestTimeout, config.logger ?? console));\n timeouts.push(setSocketTimeout(req, reject, config.socketTimeout));\n const httpAgent = nodeHttpsOptions.agent;\n if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n timeouts.push(setSocketKeepAlive(req, {\n keepAlive: httpAgent.keepAlive,\n keepAliveMsecs: httpAgent.keepAliveMsecs,\n }));\n }\n writeRequestBodyPromise = writeRequestBody(req, request, effectiveRequestTimeout, this.externalAgent).catch((e) => {\n timeouts.forEach(timing.clearTimeout);\n return _reject(e);\n });\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n return this.config ?? {};\n }\n resolveDefaultConfig(options) {\n const { requestTimeout, connectionTimeout, socketTimeout, socketAcquisitionWarningTimeout, httpAgent, httpsAgent, throwOnRequestTimeout, logger, } = options || {};\n const keepAlive = true;\n const maxSockets = 50;\n return {\n connectionTimeout,\n requestTimeout,\n socketTimeout,\n socketAcquisitionWarningTimeout,\n throwOnRequestTimeout,\n httpAgentProvider: async () => {\n const { Agent, request } = await import(\"node:http\");\n hRequest = request;\n hAgent = Agent;\n if (httpAgent instanceof hAgent || typeof httpAgent?.destroy === \"function\") {\n this.externalAgent = true;\n return httpAgent;\n }\n return new hAgent({ keepAlive, maxSockets, ...httpAgent });\n },\n httpsAgent: (() => {\n if (httpsAgent instanceof hsAgent || typeof httpsAgent?.destroy === \"function\") {\n this.externalAgent = true;\n return httpsAgent;\n }\n return new hsAgent({ keepAlive, maxSockets, ...httpsAgent });\n })(),\n logger,\n };\n }\n}\n","export class NodeHttp2ConnectionPool {\n sessions = [];\n constructor(sessions) {\n this.sessions = sessions ?? [];\n }\n poll() {\n if (this.sessions.length > 0) {\n return this.sessions.shift();\n }\n }\n offerLast(session) {\n this.sessions.push(session);\n }\n contains(session) {\n return this.sessions.includes(session);\n }\n remove(session) {\n this.sessions = this.sessions.filter((s) => s !== session);\n }\n [Symbol.iterator]() {\n return this.sessions[Symbol.iterator]();\n }\n destroy(connection) {\n for (const session of this.sessions) {\n if (session === connection) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n }\n }\n}\n","import http2 from \"node:http2\";\nimport { NodeHttp2ConnectionPool } from \"./node-http2-connection-pool\";\nexport class NodeHttp2ConnectionManager {\n constructor(config) {\n this.config = config;\n if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) {\n throw new RangeError(\"maxConcurrency must be greater than zero.\");\n }\n }\n config;\n sessionCache = new Map();\n lease(requestContext, connectionConfiguration) {\n const url = this.getUrlString(requestContext);\n const existingPool = this.sessionCache.get(url);\n if (existingPool) {\n const existingSession = existingPool.poll();\n if (existingSession && !this.config.disableConcurrency) {\n return existingSession;\n }\n }\n const session = http2.connect(url);\n if (this.config.maxConcurrency) {\n session.settings({ maxConcurrentStreams: this.config.maxConcurrency }, (err) => {\n if (err) {\n throw new Error(\"Fail to set maxConcurrentStreams to \" +\n this.config.maxConcurrency +\n \"when creating new session for \" +\n requestContext.destination.toString());\n }\n });\n }\n session.unref();\n const destroySessionCb = () => {\n session.destroy();\n this.deleteSession(url, session);\n };\n session.on(\"goaway\", destroySessionCb);\n session.on(\"error\", destroySessionCb);\n session.on(\"frameError\", destroySessionCb);\n session.on(\"close\", () => this.deleteSession(url, session));\n if (connectionConfiguration.requestTimeout) {\n session.setTimeout(connectionConfiguration.requestTimeout, destroySessionCb);\n }\n const connectionPool = this.sessionCache.get(url) || new NodeHttp2ConnectionPool();\n connectionPool.offerLast(session);\n this.sessionCache.set(url, connectionPool);\n return session;\n }\n deleteSession(authority, session) {\n const existingConnectionPool = this.sessionCache.get(authority);\n if (!existingConnectionPool) {\n return;\n }\n if (!existingConnectionPool.contains(session)) {\n return;\n }\n existingConnectionPool.remove(session);\n this.sessionCache.set(authority, existingConnectionPool);\n }\n release(requestContext, session) {\n const cacheKey = this.getUrlString(requestContext);\n this.sessionCache.get(cacheKey)?.offerLast(session);\n }\n destroy() {\n for (const [key, connectionPool] of this.sessionCache) {\n for (const session of connectionPool) {\n if (!session.destroyed) {\n session.destroy();\n }\n connectionPool.remove(session);\n }\n this.sessionCache.delete(key);\n }\n }\n setMaxConcurrentStreams(maxConcurrentStreams) {\n if (maxConcurrentStreams && maxConcurrentStreams <= 0) {\n throw new RangeError(\"maxConcurrentStreams must be greater than zero.\");\n }\n this.config.maxConcurrency = maxConcurrentStreams;\n }\n setDisableConcurrentStreams(disableConcurrentStreams) {\n this.config.disableConcurrency = disableConcurrentStreams;\n }\n getUrlString(request) {\n return request.destination.toString();\n }\n}\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { buildQueryString } from \"@smithy/querystring-builder\";\nimport { constants } from \"node:http2\";\nimport { buildAbortError } from \"./build-abort-error\";\nimport { getTransformedHeaders } from \"./get-transformed-headers\";\nimport { NodeHttp2ConnectionManager } from \"./node-http2-connection-manager\";\nimport { writeRequestBody } from \"./write-request-body\";\nexport class NodeHttp2Handler {\n config;\n configProvider;\n metadata = { handlerProtocol: \"h2\" };\n connectionManager = new NodeHttp2ConnectionManager({});\n static create(instanceOrOptions) {\n if (typeof instanceOrOptions?.handle === \"function\") {\n return instanceOrOptions;\n }\n return new NodeHttp2Handler(instanceOrOptions);\n }\n constructor(options) {\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((opts) => {\n resolve(opts || {});\n })\n .catch(reject);\n }\n else {\n resolve(options || {});\n }\n });\n }\n destroy() {\n this.connectionManager.destroy();\n }\n async handle(request, { abortSignal, requestTimeout } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n this.connectionManager.setDisableConcurrentStreams(this.config.disableConcurrentStreams || false);\n if (this.config.maxConcurrentStreams) {\n this.connectionManager.setMaxConcurrentStreams(this.config.maxConcurrentStreams);\n }\n }\n const { requestTimeout: configRequestTimeout, disableConcurrentStreams } = this.config;\n const effectiveRequestTimeout = requestTimeout ?? configRequestTimeout;\n return new Promise((_resolve, _reject) => {\n let fulfilled = false;\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (abortSignal?.aborted) {\n fulfilled = true;\n const abortError = buildAbortError(abortSignal);\n reject(abortError);\n return;\n }\n const { hostname, method, port, protocol, query } = request;\n let auth = \"\";\n if (request.username != null || request.password != null) {\n const username = request.username ?? \"\";\n const password = request.password ?? \"\";\n auth = `${username}:${password}@`;\n }\n const authority = `${protocol}//${auth}${hostname}${port ? `:${port}` : \"\"}`;\n const requestContext = { destination: new URL(authority) };\n const session = this.connectionManager.lease(requestContext, {\n requestTimeout: this.config?.sessionTimeout,\n disableConcurrentStreams: disableConcurrentStreams || false,\n });\n const rejectWithDestroy = (err) => {\n if (disableConcurrentStreams) {\n this.destroySession(session);\n }\n fulfilled = true;\n reject(err);\n };\n const queryString = buildQueryString(query || {});\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const req = session.request({\n ...request.headers,\n [constants.HTTP2_HEADER_PATH]: path,\n [constants.HTTP2_HEADER_METHOD]: method,\n });\n session.ref();\n req.on(\"response\", (headers) => {\n const httpResponse = new HttpResponse({\n statusCode: headers[\":status\"] || -1,\n headers: getTransformedHeaders(headers),\n body: req,\n });\n fulfilled = true;\n resolve({ response: httpResponse });\n if (disableConcurrentStreams) {\n session.close();\n this.connectionManager.deleteSession(authority, session);\n }\n });\n if (effectiveRequestTimeout) {\n req.setTimeout(effectiveRequestTimeout, () => {\n req.close();\n const timeoutError = new Error(`Stream timed out because of no activity for ${effectiveRequestTimeout} ms`);\n timeoutError.name = \"TimeoutError\";\n rejectWithDestroy(timeoutError);\n });\n }\n if (abortSignal) {\n const onAbort = () => {\n req.close();\n const abortError = buildAbortError(abortSignal);\n rejectWithDestroy(abortError);\n };\n if (typeof abortSignal.addEventListener === \"function\") {\n const signal = abortSignal;\n signal.addEventListener(\"abort\", onAbort, { once: true });\n req.once(\"close\", () => signal.removeEventListener(\"abort\", onAbort));\n }\n else {\n abortSignal.onabort = onAbort;\n }\n }\n req.on(\"frameError\", (type, code, id) => {\n rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`));\n });\n req.on(\"error\", rejectWithDestroy);\n req.on(\"aborted\", () => {\n rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`));\n });\n req.on(\"close\", () => {\n session.unref();\n if (disableConcurrentStreams) {\n session.destroy();\n }\n if (!fulfilled) {\n rejectWithDestroy(new Error(\"Unexpected error: http2 request did not get a response\"));\n }\n });\n writeRequestBodyPromise = writeRequestBody(req, request, effectiveRequestTimeout);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n return this.config ?? {};\n }\n destroySession(session) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n}\n","import { Writable } from \"node:stream\";\nexport class Collector extends Writable {\n bufferedBytes = [];\n _write(chunk, encoding, callback) {\n this.bufferedBytes.push(chunk);\n callback();\n }\n}\n","import { Collector } from \"./collector\";\nexport const streamCollector = (stream) => {\n if (isReadableStreamInstance(stream)) {\n return collectReadableStream(stream);\n }\n return new Promise((resolve, reject) => {\n const collector = new Collector();\n stream.pipe(collector);\n stream.on(\"error\", (err) => {\n collector.end();\n reject(err);\n });\n collector.on(\"error\", reject);\n collector.on(\"finish\", function () {\n const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes));\n resolve(bytes);\n });\n });\n};\nconst isReadableStreamInstance = (stream) => typeof ReadableStream === \"function\" && stream instanceof ReadableStream;\nasync function collectReadableStream(stream) {\n const chunks = [];\n const reader = stream.getReader();\n let isDone = false;\n let length = 0;\n while (!isDone) {\n const { done, value } = await reader.read();\n if (value) {\n chunks.push(value);\n length += value.length;\n }\n isDone = done;\n }\n const collected = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n collected.set(chunk, offset);\n offset += chunk.length;\n }\n return collected;\n}\n","export * from \"./node-http-handler\";\nexport * from \"./node-http2-handler\";\nexport * from \"./stream-collector\";\n","import type { CollectionConfig, GlobalConfig } from './types.js';\nimport type { Field, Block } from '../fields/types.js';\n\n// ============================================================================\n// Validation Errors\n// ============================================================================\n\nexport class ConfigValidationError extends Error {\n public errors: string[];\n \n constructor(errors: string[]) {\n super(`Configuration validation failed:\\n${errors.join('\\n')}`);\n this.name = 'ConfigValidationError';\n this.errors = errors;\n }\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\nexport function validateCollection(config: CollectionConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Collection is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Collection slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Collection \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, config.slug);\n errors.push(...fieldErrors);\n }\n \n // Access validation\n if (config.access) {\n for (const [action, handler] of Object.entries(config.access)) {\n if (typeof handler !== 'boolean' && typeof handler !== 'function') {\n errors.push(`Collection \"${config.slug}\" has invalid access.${action} (must be boolean or function)`);\n }\n }\n }\n \n // Admin validation\n if (config.admin?.useAsTitle) {\n const fieldExists = config.fields.some(f => f.name === config.admin!.useAsTitle);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.useAsTitle references unknown field \"${config.admin.useAsTitle}\"`);\n }\n }\n \n if (config.admin?.defaultColumns) {\n for (const col of config.admin.defaultColumns) {\n const fieldExists = config.fields.some(f => f.name === col);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.defaultColumns references unknown field \"${col}\"`);\n }\n }\n }\n \n // Upload validation\n if (config.upload) {\n if (config.upload.fileSize && config.upload.fileSize <= 0) {\n errors.push(`Collection \"${config.slug}\" upload.fileSize must be positive`);\n }\n }\n \n // Versions validation\n if (config.versions) {\n if (config.versions.maxPerDoc && config.versions.maxPerDoc <= 0) {\n errors.push(`Collection \"${config.slug}\" versions.maxPerDoc must be positive`);\n }\n }\n \n // Auth validation\n if (config.auth) {\n const hasEmailField = config.fields.some(f => f.name === 'email');\n const hasPasswordField = config.fields.some(f => f.name === 'password');\n if (!hasEmailField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires an \"email\" field`);\n }\n if (!hasPasswordField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires a \"password\" field`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Global Validation\n// ============================================================================\n\nexport function validateGlobal(config: GlobalConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Global is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Global slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Global \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, `global:${config.slug}`);\n errors.push(...fieldErrors);\n }\n \n return errors;\n}\n\n// ============================================================================\n// Field Validation\n// ============================================================================\n\nexport function validateFields(fields: Field[], context: string): string[] {\n const errors: string[] = [];\n const fieldNames = new Set<string>();\n \n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n \n // Skip layout fields without names\n if (field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs') {\n // Validate nested fields\n if ('fields' in field && field.fields) {\n const nestedErrors = validateFields(field.fields, context);\n errors.push(...nestedErrors);\n } else if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateFields(tab.fields, context);\n errors.push(...tabErrors);\n }\n }\n continue;\n }\n \n // Name validation\n const fieldName = field.name as string | undefined;\n if (!fieldName) {\n errors.push(`${context}: Field at index ${i} is missing a \"name\" property`);\n continue;\n }\n \n if (fieldNames.has(fieldName)) {\n errors.push(`${context}: Duplicate field name \"${fieldName}\"`);\n }\n fieldNames.add(fieldName);\n \n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(fieldName)) {\n errors.push(`${context}: Field name \"${fieldName}\" must be alphanumeric with underscores`);\n }\n \n // Type validation\n if (!field.type) {\n errors.push(`${context}: Field \"${fieldName}\" is missing a \"type\" property`);\n continue;\n }\n \n // Field-specific validation\n switch (field.type) {\n case 'relationship':\n if (!field.relationTo) {\n errors.push(`${context}: Relationship field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n \n case 'array':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Array field \"${fieldName}\" has no fields defined`);\n } else {\n const arrayErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...arrayErrors);\n }\n break;\n \n case 'group':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Group field \"${fieldName}\" has no fields defined`);\n } else {\n const groupErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...groupErrors);\n }\n break;\n \n case 'blocks':\n if (!field.blocks || field.blocks.length === 0) {\n errors.push(`${context}: Blocks field \"${fieldName}\" has no blocks defined`);\n } else {\n const blockErrors = validateBlocks(field.blocks, `${context}.${fieldName}`);\n errors.push(...blockErrors);\n }\n break;\n \n case 'select':\n case 'radio':\n if (!field.options || field.options.length === 0) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has no options defined`);\n } else {\n const values = field.options.map((o: any) => o.value);\n const uniqueValues = new Set(values);\n if (values.length !== uniqueValues.size) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has duplicate option values`);\n }\n }\n break;\n \n case 'upload':\n if (!field.relationTo) {\n errors.push(`${context}: Upload field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n }\n \n // Min/Max validation\n if ('min' in field && 'max' in field && (field as any).min > (field as any).max) {\n errors.push(`${context}: Field \"${fieldName}\" has min greater than max`);\n }\n \n if ('minLength' in field && 'maxLength' in field && (field as any).minLength > (field as any).maxLength) {\n errors.push(`${context}: Field \"${fieldName}\" has minLength greater than maxLength`);\n }\n \n if ('minRows' in field && 'maxRows' in field && (field as any).minRows > (field as any).maxRows) {\n errors.push(`${context}: Field \"${fieldName}\" has minRows greater than maxRows`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Block Validation\n// ============================================================================\n\nexport function validateBlocks(blocks: Block[], context: string): string[] {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n for (const block of blocks) {\n if (!block.slug) {\n errors.push(`${context}: Block is missing a \"slug\" property`);\n continue;\n }\n \n if (slugs.has(block.slug)) {\n errors.push(`${context}: Duplicate block slug \"${block.slug}\"`);\n }\n slugs.add(block.slug);\n \n if (!block.label) {\n errors.push(`${context}: Block \"${block.slug}\" is missing a \"label\" property`);\n }\n \n if (!block.fields || block.fields.length === 0) {\n errors.push(`${context}: Block \"${block.slug}\" has no fields defined`);\n } else {\n const blockErrors = validateFields(block.fields, `${context}.${block.slug}`);\n errors.push(...blockErrors);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Full Configuration Validation\n// ============================================================================\n\nexport function validateConfig(collections: CollectionConfig[], globals: GlobalConfig[] = []): void {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n // Check for duplicate collection slugs\n for (const collection of collections) {\n if (slugs.has(collection.slug)) {\n errors.push(`Duplicate collection slug \"${collection.slug}\"`);\n }\n slugs.add(collection.slug);\n }\n \n // Check for duplicate global slugs\n for (const global of globals) {\n if (slugs.has(global.slug)) {\n errors.push(`Duplicate global slug \"${global.slug}\"`);\n }\n slugs.add(global.slug);\n }\n \n // Validate all collections\n for (const collection of collections) {\n const collectionErrors = validateCollection(collection);\n errors.push(...collectionErrors);\n }\n \n // Validate all globals\n for (const global of globals) {\n const globalErrors = validateGlobal(global);\n errors.push(...globalErrors);\n }\n \n // Validate relationships reference existing collections\n for (const collection of collections) {\n const relationshipErrors = validateRelationships(collection.fields, collections);\n errors.push(...relationshipErrors);\n }\n \n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n}\n\nfunction validateRelationships(fields: Field[], collections: CollectionConfig[]): string[] {\n const errors: string[] = [];\n const collectionSlugs = new Set(collections.map(c => c.slug));\n \n for (const field of fields) {\n if (field.type === 'relationship') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Relationship field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if (field.type === 'upload') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Upload field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if ('fields' in field && field.fields) {\n const nestedErrors = validateRelationships(field.fields, collections);\n errors.push(...nestedErrors);\n }\n \n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateRelationships(tab.fields, collections);\n errors.push(...tabErrors);\n }\n }\n \n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n const blockErrors = validateRelationships(block.fields, collections);\n errors.push(...blockErrors);\n }\n }\n }\n \n return errors;\n}\n","import { z, type ZodTypeAny } from \"zod\";\nimport type {\n Field,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n RichTextField,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n RowField,\n CollapsibleField,\n TabsField,\n ValidateOptions,\n} from \"../fields/types.js\";\nimport type { CollectionConfig, GlobalConfig } from \"./types.js\";\n\n// ============================================================================\n// Field → Zod Schema Generator\n// ============================================================================\n\nexport function fieldToZod(field: Field): ZodTypeAny {\n switch (field.type) {\n case \"text\":\n return textToZod(field);\n case \"number\":\n return numberToZod(field);\n case \"checkbox\":\n return checkboxToZod(field);\n case \"date\":\n return dateToZod(field);\n case \"email\":\n return emailToZod(field);\n case \"password\":\n return passwordToZod(field);\n case \"textarea\":\n return textareaToZod(field);\n case \"select\":\n return selectToZod(field);\n case \"radio\":\n return radioToZod(field);\n case \"color\":\n return colorToZod(field);\n case \"richtext\":\n return richTextToZod(field);\n case \"json\":\n return jsonToZod(field);\n case \"code\":\n return codeToZod(field);\n case \"upload\":\n return uploadToZod(field);\n case \"markdown\":\n return markdownToZod(field);\n case \"relationship\":\n return relationshipToZod(field);\n case \"array\":\n return arrayToZod(field);\n case \"group\":\n return groupToZod(field);\n case \"blocks\":\n return blocksToZod(field);\n case \"row\":\n return rowToZod(field);\n case \"collapsible\":\n return collapsibleToZod(field);\n case \"tabs\":\n return tabsToZod(field);\n default:\n return z.any();\n }\n}\n\n// ============================================================================\n// Primitive Field Schemas\n// ============================================================================\n\nfunction textToZod(field: TextField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (field.pattern) schema = (schema as any).regex(new RegExp(field.pattern));\n if (field.variant === \"email\") schema = (schema as any).email();\n if (field.variant === \"url\") schema = (schema as any).url();\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction numberToZod(field: NumberField): ZodTypeAny {\n let schema: ZodTypeAny = field.integer ? z.number().int() : z.number();\n if (field.min !== undefined) schema = (schema as any).min(field.min);\n if (field.max !== undefined) schema = (schema as any).max(field.max);\n if (field.step) {\n schema = (schema as any).refine(\n (val: number) => Number.isInteger(val / field.step!),\n `Value must be divisible by ${field.step}`,\n );\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction checkboxToZod(field: CheckboxField): ZodTypeAny {\n let schema: ZodTypeAny = z.boolean();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction dateToZod(field: DateField): ZodTypeAny {\n let schema: ZodTypeAny = z\n .string()\n .refine((val) => !isNaN(Date.parse(val)), \"Invalid date format\");\n if (field.minDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) >= new Date(field.minDate!),\n `Date must be after ${field.minDate}`,\n );\n }\n if (field.maxDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) <= new Date(field.maxDate!),\n `Date must be before ${field.maxDate}`,\n );\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction emailToZod(field: EmailField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().email(\"Invalid email\");\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction passwordToZod(field: PasswordField): ZodTypeAny {\n let schema: ZodTypeAny = z\n .string()\n .min(6, \"Password must be at least 6 characters\");\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction textareaToZod(field: TextareaField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction selectToZod(field: SelectField): ZodTypeAny {\n const values = field.options.map((opt) => opt.value);\n let schema: ZodTypeAny;\n if (field.hasMany) {\n schema = z.array(z.enum(values as [string, ...string[]]));\n } else {\n schema = z.enum(values as [string, ...string[]]);\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction radioToZod(field: RadioField): ZodTypeAny {\n const values = field.options.map((opt) => opt.value);\n let schema: ZodTypeAny = z.enum(values as [string, ...string[]]);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction colorToZod(field: ColorField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.format === \"hex\")\n schema = (schema as any).regex(/^#[0-9A-Fa-f]{6}$/);\n if (field.format === \"rgb\")\n schema = (schema as any).regex(\n /^rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)$/,\n );\n if (field.format === \"hsl\")\n schema = (schema as any).regex(\n /^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/,\n );\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Complex Field Schemas\n// ============================================================================\n\nfunction richTextToZod(field: RichTextField): ZodTypeAny {\n let schema: ZodTypeAny = z.array(\n z.object({\n type: z.string(),\n data: z.record(z.any()),\n children: z.array(z.any()).optional(),\n }),\n );\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction jsonToZod(field: JSONField): ZodTypeAny {\n let schema: ZodTypeAny = z.record(z.any());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction codeToZod(field: CodeField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction uploadToZod(field: UploadField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.hasMany) schema = z.array(z.string());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction markdownToZod(field: MarkdownField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Relational Field Schemas\n// ============================================================================\n\nfunction relationshipToZod(field: RelationshipField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (Array.isArray(field.relationTo)) {\n schema = z.object({\n relationTo: z.enum(field.relationTo as [string, ...string[]]),\n value: z.string(),\n });\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = schema.optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction arrayToZod(field: ArrayField): ZodTypeAny {\n const itemSchema = z.object(\n Object.fromEntries(\n field.fields.filter((f) => f.name).map((f) => [f.name!, fieldToZod(f)]),\n ),\n );\n let schema: ZodTypeAny = z.array(itemSchema);\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction groupToZod(field: GroupField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields.filter((f) => f.name).map((f) => [f.name!, fieldToZod(f)]),\n ),\n );\n if (!field.required) return (schema as any).optional();\n return schema;\n}\n\nfunction blocksToZod(field: BlocksField): ZodTypeAny {\n const blocks = field.blocks || [];\n const blockSchemas = blocks.map((block) => {\n return z.object({\n blockType: z.literal(block.slug),\n ...Object.fromEntries(\n block.fields.filter((f) => f.name).map((f) => [f.name!, fieldToZod(f)]),\n ),\n });\n });\n let schema: ZodTypeAny = z.array(\n z.discriminatedUnion(\"blockType\", blockSchemas as any),\n );\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction rowToZod(field: RowField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields.filter((f) => f.name).map((f) => [f.name!, fieldToZod(f)]),\n ),\n );\n return schema;\n}\n\nfunction collapsibleToZod(field: CollapsibleField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields.filter((f) => f.name).map((f) => [f.name!, fieldToZod(f)]),\n ),\n );\n return schema;\n}\n\nfunction tabsToZod(field: TabsField): ZodTypeAny {\n const schemas: Record<string, ZodTypeAny> = {};\n for (const tab of field.tabs) {\n for (const f of tab.fields) {\n if (f.name) {\n schemas[f.name] = fieldToZod(f);\n }\n }\n }\n return z.object(schemas);\n}\n\n// ============================================================================\n// Custom Validation Helper\n// ============================================================================\n\nfunction addCustomValidation(\n schema: ZodTypeAny,\n validate: (\n value: any,\n options: ValidateOptions,\n ) => string | true | Promise<string | true>,\n): ZodTypeAny {\n return schema.refine(\n async (val: any) => {\n const result = await validate(val, { required: false });\n return result === true;\n },\n {\n message: \"Custom validation failed\",\n },\n );\n}\n\n// ============================================================================\n// Collection Schema Generator\n// ============================================================================\n\nexport function collectionToZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n\n if (collection.timestamps) {\n shape[\"createdAt\"] = z.string().optional();\n shape[\"updatedAt\"] = z.string().optional();\n }\n\n if (collection.tenantScoped) {\n shape[\"tenantID\"] = z.string().optional();\n }\n\n shape[\"id\"] = z.string().optional();\n\n return z.object(shape);\n}\n\nexport function collectionToCreateZod(\n collection: CollectionConfig,\n): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n\n return z.object(shape);\n}\n\nexport function collectionToUpdateZod(\n collection: CollectionConfig,\n): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field).optional();\n }\n }\n\n return z.object(shape);\n}\n\nexport function collectionToWhereZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = z\n .object({\n equals: z.any().optional(),\n not_equals: z.any().optional(),\n in: z.array(z.any()).optional(),\n not_in: z.array(z.any()).optional(),\n greater_than: z.number().optional(),\n greater_than_equal: z.number().optional(),\n less_than: z.number().optional(),\n less_than_equal: z.number().optional(),\n like: z.string().optional(),\n not_like: z.string().optional(),\n contains: z.string().optional(),\n exists: z.boolean().optional(),\n })\n .optional();\n }\n }\n\n shape[\"AND\"] = z.array(z.lazy(() => z.object(shape))).optional();\n shape[\"OR\"] = z.array(z.lazy(() => z.object(shape))).optional();\n\n return z.object(shape).optional();\n}\n\n// ============================================================================\n// Global Schema Generator\n// ============================================================================\n\nexport function globalToZod(global: GlobalConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const field of global.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n\n shape[\"id\"] = z.string().optional();\n\n return z.object(shape);\n}\n","import type { CollectionConfig, GlobalConfig, BaseAdapter, PluginConfig } from './types.js';\nimport type { Field } from '../fields/types.js';\nimport { validateConfig, validateCollection, validateGlobal } from './validator.js';\nimport { collectionToZod, collectionToCreateZod, collectionToUpdateZod, collectionToWhereZod, globalToZod, fieldToZod } from './zod-builder.js';\nimport type { ZodTypeAny } from 'zod';\n\n// ============================================================================\n// Registry Class\n// ============================================================================\n\nexport class Registry {\n private collections: Map<string, CollectionConfig> = new Map();\n private globals: Map<string, GlobalConfig> = new Map();\n private plugins: PluginConfig[] = [];\n private schemaCache: Map<string, ZodTypeAny> = new Map();\n private initialized = false;\n\n // ========================================================================\n // Collection Management\n // ========================================================================\n\n addCollection(config: CollectionConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add collections after Registry has been initialized');\n }\n\n // Apply plugin extensions\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendCollection) {\n finalConfig = plugin.extendCollection(finalConfig.slug, finalConfig);\n }\n }\n\n // Add default fields (id, createdAt, etc.) before validation\n finalConfig.fields = this.applyFieldDefaults(finalConfig);\n\n const errors = validateCollection(finalConfig);\n if (errors.length > 0) {\n throw new Error(`Invalid collection config: ${errors.join(', ')}`);\n }\n\n this.collections.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(finalConfig.slug);\n }\n\n addCollections(configs: CollectionConfig[]): void {\n for (const config of configs) {\n this.addCollection(config);\n }\n }\n\n getCollection(slug: string): CollectionConfig | undefined {\n return this.collections.get(slug);\n }\n\n getCollections(): CollectionConfig[] {\n return Array.from(this.collections.values());\n }\n\n getCollectionSlugs(): string[] {\n return Array.from(this.collections.keys());\n }\n\n hasCollection(slug: string): boolean {\n return this.collections.has(slug);\n }\n\n removeCollection(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove collections after Registry has been initialized');\n }\n this.clearSchemaCache(slug);\n return this.collections.delete(slug);\n }\n\n // ========================================================================\n // Global Management\n // ========================================================================\n\n addGlobal(config: GlobalConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add globals after Registry has been initialized');\n }\n\n const errors = validateGlobal(config);\n if (errors.length > 0) {\n throw new Error(`Invalid global config: ${errors.join(', ')}`);\n }\n\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendGlobal) {\n finalConfig = plugin.extendGlobal(finalConfig.slug, finalConfig);\n }\n }\n\n this.globals.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(`global:${finalConfig.slug}`);\n }\n\n addGlobals(configs: GlobalConfig[]): void {\n for (const config of configs) {\n this.addGlobal(config);\n }\n }\n\n getGlobal(slug: string): GlobalConfig | undefined {\n return this.globals.get(slug);\n }\n\n getGlobals(): GlobalConfig[] {\n return Array.from(this.globals.values());\n }\n\n getGlobalSlugs(): string[] {\n return Array.from(this.globals.keys());\n }\n\n hasGlobal(slug: string): boolean {\n return this.globals.has(slug);\n }\n\n removeGlobal(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove globals after Registry has been initialized');\n }\n this.clearSchemaCache(`global:${slug}`);\n return this.globals.delete(slug);\n }\n\n // ========================================================================\n // Plugin Management\n // ========================================================================\n\n addPlugin(plugin: PluginConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add plugins after Registry has been initialized');\n }\n this.plugins.push(plugin);\n }\n\n getPlugins(): PluginConfig[] {\n return [...this.plugins];\n }\n\n // ========================================================================\n // Schema Generation\n // ========================================================================\n\n getZodSchema(slug: string): ZodTypeAny {\n const cached = this.schemaCache.get(slug);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToZod(collection);\n this.schemaCache.set(slug, schema);\n return schema;\n }\n\n const global = this.globals.get(slug);\n if (global) {\n const schema = globalToZod(global);\n this.schemaCache.set(`global:${slug}`, schema);\n return schema;\n }\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getCreateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:create`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToCreateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getUpdateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:update`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToUpdateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getWhereZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:where`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToWhereZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getFieldZodSchema(field: Field): ZodTypeAny {\n return fieldToZod(field);\n }\n\n private clearSchemaCache(slug: string): void {\n this.schemaCache.delete(slug);\n this.schemaCache.delete(`${slug}:create`);\n this.schemaCache.delete(`${slug}:update`);\n this.schemaCache.delete(`${slug}:where`);\n }\n\n // ========================================================================\n // Field Helpers\n // ========================================================================\n\n private applyFieldDefaults(config: CollectionConfig): Field[] {\n const fields = [...config.fields];\n\n // Add id field if not present\n if (!fields.some(f => f.name === 'id')) {\n fields.unshift({\n name: 'id',\n type: 'text',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add tenantID field if tenantScoped\n if (config.tenantScoped && !fields.some(f => f.name === 'tenantID')) {\n fields.push({\n name: 'tenantID',\n type: 'text',\n required: true,\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add timestamp fields if enabled\n if (config.timestamps && !fields.some(f => f.name === 'createdAt')) {\n fields.push({\n name: 'createdAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n return fields;\n }\n\n getFields(slug: string): Field[] {\n const collection = this.collections.get(slug);\n if (collection) return collection.fields;\n\n const global = this.globals.get(slug);\n if (global) return global.fields;\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getFieldMap(slug: string): Map<string, Field> {\n const fields = this.getFields(slug);\n const map = new Map<string, Field>();\n\n const addFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n if ('fields' in field && field.fields) {\n addFields(field.fields);\n }\n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n addFields(tab.fields);\n }\n }\n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n addFields(block.fields);\n }\n }\n }\n };\n\n addFields(fields);\n return map;\n }\n\n getVisibleFields(slug: string): Field[] {\n const fields = this.getFields(slug);\n return fields.filter(f => !f.admin?.hidden);\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n validate(): void {\n const collections = this.getCollections();\n const globals = this.getGlobals();\n validateConfig(collections, globals);\n }\n\n async init(): Promise<void> {\n this.validate();\n\n // Initialize plugins\n for (const plugin of this.plugins) {\n if (plugin.init) {\n await plugin.init(this);\n }\n }\n\n this.initialized = true;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // ========================================================================\n // Query Helpers\n // ========================================================================\n\n getPaginationDefaults(slug: string): { defaultLimit: number; limits: number[] } {\n const collection = this.collections.get(slug);\n return {\n defaultLimit: collection?.admin?.pagination?.defaultLimit || 10,\n limits: collection?.admin?.pagination?.limits || [10, 25, 50, 100],\n };\n }\n\n getDefaultSort(slug: string): string {\n const collection = this.collections.get(slug);\n const useAsTitle = collection?.admin?.useAsTitle;\n if (useAsTitle) return useAsTitle;\n return 'createdAt';\n }\n\n getDefaultColumns(slug: string): string[] {\n const collection = this.collections.get(slug);\n if (collection?.admin?.defaultColumns) {\n return collection.admin.defaultColumns;\n }\n const fields = this.getVisibleFields(slug);\n return fields.slice(0, 4).map(f => f.name!);\n }\n\n // ========================================================================\n // Admin Helpers\n // ========================================================================\n\n getAdminTitle(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.label || collection?.admin?.description || slug;\n }\n\n getAdminLabel(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.singularLabel || collection?.label || slug;\n }\n\n getAdminGroup(slug: string): string | undefined {\n return this.collections.get(slug)?.admin?.group;\n }\n\n // ========================================================================\n // Debug / Stats\n // ========================================================================\n\n getStats(): {\n collections: number;\n globals: number;\n plugins: number;\n fields: number;\n } {\n let totalFields = 0;\n for (const collection of this.collections.values()) {\n totalFields += collection.fields.length;\n }\n for (const global of this.globals.values()) {\n totalFields += global.fields.length;\n }\n\n return {\n collections: this.collections.size,\n globals: this.globals.size,\n plugins: this.plugins.length,\n fields: totalFields,\n };\n }\n\n toJSON(): {\n collections: CollectionConfig[];\n globals: GlobalConfig[];\n } {\n return {\n collections: this.getCollections(),\n globals: this.getGlobals(),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet instance: Registry | null = null;\n\nexport function getRegistry(): Registry {\n if (!instance) {\n instance = new Registry();\n }\n return instance;\n}\n\nexport function resetRegistry(): void {\n instance = null;\n}\n\nexport function createRegistry(): Registry {\n instance = new Registry();\n return instance;\n}\n","import { Registry, createRegistry } from \"./registry/index.js\";\nimport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n} from \"./registry/types.js\";\nimport {\n KyroPubSub,\n createWSServer,\n type KyroWSServer,\n} from \"./api/ws/index.js\";\nimport { createHonoApp } from \"./api/rest/index.js\";\nimport { buildGraphQLSchema } from \"./api/graphql/index.js\";\nimport { createKyroServer } from \"./api/trpc/index.js\";\nimport type { User, Request } from \"./hooks/types.js\";\n\n// ============================================================================\n// Kyro Instance\n// ============================================================================\n\nexport class Kyro {\n public registry: Registry;\n public db: BaseAdapter;\n public pubsub: KyroPubSub;\n public settings?: Record<string, any>;\n private wsServer?: KyroWSServer;\n private config: KyroConfig;\n\n constructor(config: KyroConfig) {\n this.config = config;\n this.registry = createRegistry();\n this.db = config.adapter;\n this.pubsub = new KyroPubSub(this.registry);\n\n // Register collections\n if (config.collections) {\n this.registry.addCollections(config.collections);\n }\n\n // Register globals\n if (config.globals) {\n this.registry.addGlobals(config.globals);\n }\n\n // Register plugins\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.registry.addPlugin(plugin);\n }\n }\n }\n\n async init(): Promise<void> {\n // Initialize registry\n await this.registry.init();\n\n // Initialize database adapter\n await this.db.init(\n this.registry.getCollections(),\n this.registry.getGlobals(),\n );\n\n // Auto-register PubSub hooks\n this.pubsub.autoRegisterHooks();\n\n console.log(\"✅ Kyro CMS initialized\");\n console.log(` Collections: ${this.registry.getCollections().length}`);\n console.log(` Globals: ${this.registry.getGlobals().length}`);\n }\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n // Load settings from globals if not already loaded\n async loadSettings() {\n if (this.settings) return this.settings;\n\n try {\n // Try to find access-settings in the database\n const accessSettings = await this.db.findOne({\n collection: \"_globals\",\n where: { slug: \"access-settings\" },\n });\n\n if (accessSettings) {\n this.settings = accessSettings.data;\n }\n } catch (e) {\n // Settings not found - use defaults\n console.log(\"⚠️ No access-settings found, using defaults\");\n }\n\n return this.settings || {};\n }\n\n getREST(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createHonoApp({\n registry: this.registry,\n db: this.db,\n ...options,\n cors: this.config.cors,\n settings: this.settings,\n });\n }\n\n getGraphQL(options?: { user?: User; req?: Request; tenantID?: string }) {\n return buildGraphQLSchema({\n registry: this.registry,\n db: this.db,\n ...options,\n settings: this.settings,\n });\n }\n\n getTRPC(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createKyroServer({\n registry: this.registry,\n db: this.db,\n req: options?.req || { headers: {} },\n ...options,\n settings: this.settings,\n });\n }\n\n async startWebSocket(options?: {\n port?: number;\n requireAuth?: boolean;\n verifyToken?: (token: string) => Promise<any>;\n }) {\n // Check if WebSocket is enabled in settings\n const apiAccess = this.settings?.access?.apiAccess;\n if (apiAccess?.websocketEnabled === false) {\n console.log(\"⚠️ WebSocket is disabled in settings\");\n return null;\n }\n\n this.wsServer = createWSServer({\n pubsub: this.pubsub,\n port: options?.port || 8080,\n requireAuth: options?.requireAuth ?? apiAccess?.requireAuth,\n verifyToken: options?.verifyToken,\n });\n console.log(`🔌 WebSocket server started on port ${options?.port || 8080}`);\n return this.wsServer;\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async shutdown(): Promise<void> {\n if (this.wsServer) {\n await this.wsServer.close();\n }\n await this.db.disconnect();\n console.log(\"👋 Kyro CMS shut down\");\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createKyro(config: KyroConfig): Kyro {\n return new Kyro(config);\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\nexport {\n Registry,\n createRegistry,\n getRegistry,\n resetRegistry,\n} from \"./registry/index.js\";\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from \"./registry/types.js\";\nexport type { Field, FieldType } from \"./fields/index.js\";\nexport type { AccessControl, AccessArgs, WhereClause } from \"./access/index.js\";\nexport type { Hook, HookArgs, User, Request } from \"./hooks/index.js\";\nexport {\n DrizzleAdapter,\n createDrizzleAdapter,\n} from \"./database/drizzle/index.js\";\nexport {\n MongoDBAdapter,\n createMongoDBAdapter,\n} from \"./database/mongodb/index.js\";\nexport { KyroPubSub, KyroWSServer, createWSServer } from \"./api/ws/index.js\";\nexport { createHonoApp } from \"./api/rest/index.js\";\nexport {\n buildGraphQLSchema,\n createGraphQLSchema,\n} from \"./api/graphql/index.js\";\nexport { createKyroServer } from \"./api/trpc/index.js\";\nexport { z } from \"zod\";\n","// ============================================================================\n// Base Field Interface\n// ============================================================================\n\nexport interface FieldAdmin {\n description?: string;\n placeholder?: string;\n readOnly?: boolean;\n hidden?: boolean;\n width?: string;\n position?: \"sidebar\" | \"main\";\n autoGenerate?: string;\n action?: string;\n method?: string;\n inline?: boolean;\n condition?: (\n data: Record<string, any>,\n siblingData: Record<string, any>,\n ) => boolean;\n}\n\nexport interface BaseField {\n name: string;\n label?: string;\n required?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: any;\n admin?: FieldAdmin;\n validate?: (\n value: any,\n options: ValidateOptions,\n ) => string | true | Promise<string | true>;\n hooks?: {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n };\n}\n\nexport interface ValidateOptions {\n data?: Record<string, any>;\n siblingData?: Record<string, any>;\n user?: any;\n operation?: string;\n required?: boolean;\n}\n\nexport type Hook = (args: any) => Promise<any> | any;\n\n// ============================================================================\n// Primitive Fields\n// ============================================================================\n\nexport type TextFieldVariant = \"text\" | \"email\" | \"password\" | \"url\" | \"id\";\n\nexport interface TextField extends BaseField {\n type: \"text\";\n variant?: TextFieldVariant;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n hasMany?: boolean;\n localized?: boolean;\n}\n\nexport interface NumberField extends BaseField {\n type: \"number\";\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n hasMany?: boolean;\n}\n\nexport interface CheckboxField extends BaseField {\n type: \"checkbox\";\n}\n\nexport interface DateField extends BaseField {\n type: \"date\";\n minDate?: string;\n maxDate?: string;\n time?: boolean;\n}\n\nexport interface EmailField extends BaseField {\n type: \"email\";\n}\n\nexport interface PasswordField extends BaseField {\n type: \"password\";\n}\n\nexport interface TextareaField extends BaseField {\n type: \"textarea\";\n minLength?: number;\n maxLength?: number;\n rows?: number;\n localized?: boolean;\n}\n\nexport interface SelectField extends BaseField {\n type: \"select\";\n options: Array<{ label: string; value: string }>;\n hasMany?: boolean;\n defaultValue?: string | string[];\n}\n\nexport interface RadioField extends BaseField {\n type: \"radio\";\n options: Array<{ label: string; value: string }>;\n defaultValue?: string;\n}\n\nexport interface ColorField extends BaseField {\n type: \"color\";\n format?: \"hex\" | \"rgb\" | \"hsl\";\n defaultValue?: string;\n}\n\nexport interface ImageField extends BaseField {\n type: \"image\";\n minCount?: number;\n maxCount?: number;\n allowedTypes?: string[];\n maxSize?: number;\n}\n\n// ============================================================================\n// Complex Fields\n// ============================================================================\n\nexport interface RichTextBlock {\n type: string;\n data: Record<string, any>;\n children?: RichTextBlock[];\n}\n\nexport interface RichTextField extends BaseField {\n type: \"richtext\";\n editor?: \"lexical\" | \"slate\" | \"blocks\";\n hasBlocks?: boolean;\n defaultValue?: RichTextBlock[];\n localized?: boolean;\n}\n\nexport interface JSONField extends BaseField {\n type: \"json\";\n defaultValue?: Record<string, any>;\n}\n\nexport interface CodeField extends BaseField {\n type: \"code\";\n language?: string;\n defaultValue?: string;\n}\n\nexport interface UploadField extends BaseField {\n type: \"upload\";\n relationTo: string;\n hasMany?: boolean;\n maxDepth?: number;\n defaultValue?: string;\n}\n\nexport interface MarkdownField extends BaseField {\n type: \"markdown\";\n localized?: boolean;\n defaultValue?: string;\n}\n\n// ============================================================================\n// Relational Fields\n// ============================================================================\n\nexport interface RelationshipField extends BaseField {\n type: \"relationship\";\n relationTo: string | string[];\n hasMany?: boolean;\n maxDepth?: number;\n filterOptions?: (args: { data: any; user: any }) => Record<string, any>;\n defaultValue?: string | string[];\n}\n\nexport interface ArrayField extends BaseField {\n type: \"array\";\n fields: Field[];\n minRows?: number;\n maxRows?: number;\n labels?: { singular?: string; plural?: string };\n defaultValue?: Record<string, any>[];\n}\n\nexport interface GroupField extends BaseField {\n type: \"group\";\n fields: Field[];\n defaultValue?: Record<string, any>;\n}\n\nexport interface BlockImage {\n url: string;\n alt?: string;\n}\n\nexport interface BlockAdmin {\n group?: string;\n images?: {\n icon?: BlockImage | string;\n thumbnail?: BlockImage | string;\n };\n}\n\nexport interface Block {\n slug: string;\n label: string;\n fields: Field[];\n imageURL?: string;\n admin?: BlockAdmin;\n}\n\nexport interface BlocksField extends BaseField {\n type: \"blocks\";\n blocks?: Block[];\n minRows?: number;\n maxRows?: number;\n defaultValue?: Array<{ blockType: string; [key: string]: any }>;\n}\n\nexport interface RowField extends Omit<BaseField, \"name\"> {\n type: \"row\";\n fields: Field[];\n name?: string;\n}\n\nexport interface CollapsibleField extends Omit<BaseField, \"name\"> {\n type: \"collapsible\";\n fields: Field[];\n label: string;\n name?: string;\n}\n\nexport interface TabsField extends Omit<BaseField, \"name\"> {\n type: \"tabs\";\n tabs: Array<{\n label: string;\n fields: Field[];\n name?: string;\n }>;\n name?: string;\n}\n\nexport interface ButtonField extends BaseField {\n type: \"button\";\n label: string;\n action?: string;\n method?: string;\n inline?: boolean;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\nexport type Field =\n | TextField\n | NumberField\n | CheckboxField\n | DateField\n | EmailField\n | PasswordField\n | TextareaField\n | SelectField\n | RadioField\n | ColorField\n | RichTextField\n | JSONField\n | CodeField\n | UploadField\n | MarkdownField\n | RelationshipField\n | ArrayField\n | GroupField\n | BlocksField\n | RowField\n | CollapsibleField\n | TabsField\n | ButtonField;\n\nexport type FieldType = Field[\"type\"];\n\n// ============================================================================\n// Field Type Guards\n// ============================================================================\n\nexport function isTextField(field: Field): field is TextField {\n return field.type === \"text\";\n}\n\nexport function isNumberField(field: Field): field is NumberField {\n return field.type === \"number\";\n}\n\nexport function isRelationshipField(field: Field): field is RelationshipField {\n return field.type === \"relationship\";\n}\n\nexport function isArrayField(field: Field): field is ArrayField {\n return field.type === \"array\";\n}\n\nexport function isGroupField(field: Field): field is GroupField {\n return field.type === \"group\";\n}\n\nexport function isBlocksField(field: Field): field is BlocksField {\n return field.type === \"blocks\";\n}\n\nexport function isUploadField(field: Field): field is UploadField {\n return field.type === \"upload\";\n}\n\nexport function isRichTextField(field: Field): field is RichTextField {\n return field.type === \"richtext\";\n}\n\nexport function isSelectField(field: Field): field is SelectField {\n return field.type === \"select\";\n}\n\nexport function isLayoutField(\n field: Field,\n): field is RowField | CollapsibleField | TabsField {\n return (\n field.type === \"row\" ||\n field.type === \"collapsible\" ||\n field.type === \"tabs\"\n );\n}\n\n// ============================================================================\n// Field Type List\n// ============================================================================\n\nexport const PRIMITIVE_FIELD_TYPES = [\n \"text\",\n \"number\",\n \"checkbox\",\n \"date\",\n \"email\",\n \"password\",\n \"textarea\",\n \"select\",\n \"radio\",\n \"color\",\n] as const;\n\nexport const COMPLEX_FIELD_TYPES = [\n \"richtext\",\n \"json\",\n \"code\",\n \"upload\",\n \"markdown\",\n] as const;\n\nexport const RELATIONAL_FIELD_TYPES = [\n \"relationship\",\n \"array\",\n \"group\",\n \"blocks\",\n] as const;\n\nexport const LAYOUT_FIELD_TYPES = [\"row\", \"collapsible\", \"tabs\"] as const;\n\nexport const ALL_FIELD_TYPES = [\n ...PRIMITIVE_FIELD_TYPES,\n ...COMPLEX_FIELD_TYPES,\n ...RELATIONAL_FIELD_TYPES,\n ...LAYOUT_FIELD_TYPES,\n] as const;\n\n// ============================================================================\n// Field Factory Functions\n// ============================================================================\n\nexport function createRelationshipFieldConfig(\n name: string,\n relationTo: string | string[],\n options?: Partial<Omit<RelationshipField, \"type\" | \"name\" | \"relationTo\">>,\n): RelationshipField {\n return {\n name,\n type: \"relationship\",\n relationTo,\n ...options,\n required: options?.required ?? false,\n };\n}\n","const MIN_COLUMNS = 1;\nconst MAX_COLUMNS = 6;\n\nexport interface RichTextMark {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nexport interface RichTextNode {\n type?: string;\n attrs?: Record<string, unknown>;\n content?: RichTextNode[];\n text?: string;\n marks?: RichTextMark[];\n [key: string]: unknown;\n}\n\nexport interface RichTextDocument extends RichTextNode {\n type: \"doc\";\n content: RichTextNode[];\n}\n\nexport const richTextStyles = `\n.kyro-richtext {\n color: inherit;\n line-height: 1.7;\n}\n\n.kyro-richtext > *:first-child {\n margin-top: 0;\n}\n\n.kyro-richtext > *:last-child {\n margin-bottom: 0;\n}\n\n.kyro-richtext p,\n.kyro-richtext ul,\n.kyro-richtext ol,\n.kyro-richtext blockquote,\n.kyro-richtext pre,\n.kyro-richtext kyro-callout,\n.kyro-richtext kyro-hero,\n.kyro-richtext kyro-heading,\n.kyro-richtext kyro-stack,\n.kyro-richtext kyro-columns {\n margin: 0 0 1rem;\n}\n\n.kyro-richtext h1,\n.kyro-richtext h2,\n.kyro-richtext h3,\n.kyro-richtext h4,\n.kyro-richtext h5,\n.kyro-richtext h6 {\n margin: 0 0 0.75rem;\n line-height: 1.2;\n}\n\n.kyro-richtext ul,\n.kyro-richtext ol {\n padding-left: 1.5rem;\n}\n\n.kyro-richtext blockquote {\n border-left: 4px solid rgba(148, 163, 184, 0.5);\n margin-left: 0;\n padding-left: 1rem;\n font-style: italic;\n}\n\n.kyro-richtext pre {\n overflow-x: auto;\n border-radius: 0.75rem;\n background: rgba(15, 23, 42, 0.92);\n color: #f8fafc;\n padding: 1rem;\n}\n\n.kyro-richtext code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n.kyro-richtext img {\n display: block;\n max-width: 100%;\n height: auto;\n border-radius: 0.75rem;\n}\n\n.kyro-richtext kyro-columns {\n display: grid;\n grid-template-columns: repeat(var(--kyro-columns-count, 1), minmax(0, 1fr));\n gap: 1rem;\n}\n\n.kyro-richtext kyro-column {\n display: block;\n min-width: 0;\n}\n\n.kyro-richtext kyro-column > *:last-child {\n margin-bottom: 0;\n}\n\n.kyro-richtext kyro-hero,\n.kyro-richtext kyro-callout,\n.kyro-richtext kyro-stack,\n.kyro-richtext kyro-heading {\n display: block;\n}\n\n.kyro-richtext kyro-hero {\n border: 1px solid rgba(148, 163, 184, 0.25);\n border-radius: 1rem;\n padding: 1.5rem;\n text-align: center;\n background: linear-gradient(to bottom, rgba(148, 163, 184, 0.12), transparent);\n}\n\n.kyro-richtext kyro-heading {\n font-size: 1.125rem;\n font-weight: 700;\n}\n\n.kyro-richtext kyro-callout {\n border: 1px solid rgba(59, 130, 246, 0.25);\n border-radius: 0.875rem;\n padding: 0.875rem 1rem;\n background: rgba(59, 130, 246, 0.06);\n}\n\n@media (max-width: 720px) {\n .kyro-richtext kyro-columns {\n grid-template-columns: 1fr;\n }\n}\n`.trim();\n\nexport function createEmptyParagraphNode(): RichTextNode {\n return {\n type: \"paragraph\",\n content: [],\n };\n}\n\nexport function createColumnNode(content: RichTextNode[] = [createEmptyParagraphNode()]): RichTextNode {\n return {\n type: \"kyroColumn\",\n content: content.length > 0 ? content : [createEmptyParagraphNode()],\n };\n}\n\nexport function createColumnsNode(columns = 2): RichTextNode {\n const count = clampColumns(columns);\n return {\n type: \"kyroColumns\",\n attrs: { columns: count },\n content: Array.from({ length: count }, () => createColumnNode()),\n };\n}\n\nexport function normalizeRichTextDocument(value: unknown): RichTextDocument {\n const documentNode = toRichTextDocument(value);\n return {\n type: \"doc\",\n content: normalizeNodes(documentNode.content),\n };\n}\n\nexport function normalizeRichTextValue<T>(value: T): T {\n if (Array.isArray(value)) {\n return normalizeRichTextDocument(value).content as T;\n }\n\n if (isObject(value) && (value as RichTextNode).type === \"doc\") {\n return normalizeRichTextDocument(value) as T;\n }\n\n return value;\n}\n\nexport function renderRichText(value: unknown): string {\n if (typeof value === \"string\") {\n return `<div class=\"kyro-richtext\">${value}</div>`;\n }\n\n const documentNode = normalizeRichTextDocument(value);\n return `<div class=\"kyro-richtext\">${renderNodes(documentNode.content)}</div>`;\n}\n\nfunction toRichTextDocument(value: unknown): RichTextDocument {\n if (Array.isArray(value)) {\n return {\n type: \"doc\",\n content: normalizeNodes(value as RichTextNode[]),\n };\n }\n\n if (isObject(value) && (value as RichTextNode).type === \"doc\") {\n const doc = value as RichTextDocument;\n return {\n type: \"doc\",\n content: normalizeNodes(doc.content ?? []),\n };\n }\n\n return {\n type: \"doc\",\n content: [],\n };\n}\n\nfunction normalizeNodes(nodes: RichTextNode[]): RichTextNode[] {\n return nodes\n .filter((node) => isObject(node) && typeof node.type === \"string\")\n .map((node) => normalizeNode(node));\n}\n\nfunction normalizeNode(node: RichTextNode): RichTextNode {\n if (node.type === \"kyroColumns\") {\n return normalizeColumnsNode(node);\n }\n\n if (node.type === \"kyroColumn\") {\n const normalizedContent = normalizeNodes(\n Array.isArray(node.content) ? node.content : [],\n ).filter((child) => child.type !== \"kyroColumns\");\n\n return {\n ...node,\n content:\n normalizedContent.length > 0\n ? normalizedContent\n : [createEmptyParagraphNode()],\n };\n }\n\n if (Array.isArray(node.content)) {\n return {\n ...node,\n content: normalizeNodes(node.content),\n };\n }\n\n return {\n ...node,\n };\n}\n\nfunction normalizeColumnsNode(node: RichTextNode): RichTextNode {\n const rawChildren = Array.isArray(node.content) ? node.content : [];\n const hasStructuredColumns = rawChildren.every((child) => child?.type === \"kyroColumn\");\n const targetColumns = clampColumns(\n typeof node.attrs?.columns === \"number\"\n ? node.attrs.columns\n : hasStructuredColumns && rawChildren.length > 0\n ? rawChildren.length\n : 2,\n );\n\n const content = hasStructuredColumns\n ? normalizeStructuredColumns(rawChildren, targetColumns)\n : normalizeLegacyColumns(rawChildren, targetColumns);\n\n return {\n ...node,\n attrs: {\n ...(node.attrs ?? {}),\n columns: content.length,\n },\n content,\n };\n}\n\nfunction normalizeStructuredColumns(\n columns: RichTextNode[],\n targetColumns: number,\n): RichTextNode[] {\n const normalized = columns\n .slice(0, MAX_COLUMNS)\n .map((column) => normalizeNode(column))\n .filter((column) => column.type === \"kyroColumn\");\n\n if (normalized.length === 0) {\n return Array.from({ length: targetColumns }, () => createColumnNode());\n }\n\n if (normalized.length > targetColumns) {\n const kept = normalized.slice(0, targetColumns);\n const extras = normalized.slice(targetColumns);\n const mergedTail = extras.flatMap((column) =>\n normalizeColumnChildren(column.content),\n );\n\n const lastIndex = kept.length - 1;\n kept[lastIndex] = createColumnNode([\n ...normalizeColumnChildren(kept[lastIndex].content),\n ...mergedTail,\n ]);\n return kept;\n }\n\n if (normalized.length < targetColumns) {\n return [\n ...normalized,\n ...Array.from({ length: targetColumns - normalized.length }, () =>\n createColumnNode(),\n ),\n ];\n }\n\n return normalized;\n}\n\nfunction normalizeLegacyColumns(\n blocks: RichTextNode[],\n targetColumns: number,\n): RichTextNode[] {\n const normalizedBlocks = normalizeNodes(blocks);\n\n return Array.from({ length: targetColumns }, (_, index) => {\n if (index < targetColumns - 1) {\n const block = normalizedBlocks[index];\n return block ? createColumnNode([block]) : createColumnNode();\n }\n\n const tail = normalizedBlocks.slice(index);\n return createColumnNode(tail.length > 0 ? tail : [createEmptyParagraphNode()]);\n });\n}\n\nfunction normalizeColumnChildren(content: unknown): RichTextNode[] {\n const children = Array.isArray(content) ? normalizeNodes(content as RichTextNode[]) : [];\n const filtered = children.filter((child) => child.type !== \"kyroColumns\");\n return filtered.length > 0 ? filtered : [createEmptyParagraphNode()];\n}\n\nfunction renderNodes(nodes: RichTextNode[]): string {\n return nodes.map((node) => renderNode(node)).join(\"\");\n}\n\nfunction renderNode(node: RichTextNode): string {\n switch (node.type) {\n case \"paragraph\":\n return `<p>${renderInlineContent(node.content)}</p>`;\n case \"text\":\n return renderTextNode(node);\n case \"heading\": {\n const level = clampHeadingLevel(node.attrs?.level);\n return `<h${level}>${renderInlineContent(node.content)}</h${level}>`;\n }\n case \"bulletList\":\n return `<ul>${renderNodes(node.content ?? [])}</ul>`;\n case \"orderedList\":\n return `<ol>${renderNodes(node.content ?? [])}</ol>`;\n case \"listItem\":\n return `<li>${renderNodes(node.content ?? [])}</li>`;\n case \"blockquote\":\n return `<blockquote>${renderNodes(node.content ?? [])}</blockquote>`;\n case \"codeBlock\":\n return `<pre><code>${escapeHtml(extractText(node.content ?? []))}</code></pre>`;\n case \"horizontalRule\":\n return \"<hr />\";\n case \"hardBreak\":\n return \"<br />\";\n case \"image\":\n return renderImageNode(node);\n case \"kyroColumns\": {\n const columns = clampColumns(\n Array.isArray(node.content) ? node.content.length : 1,\n );\n return `<kyro-columns data-columns=\"${columns}\" style=\"--kyro-columns-count:${columns}\">${renderNodes(node.content ?? [])}</kyro-columns>`;\n }\n case \"kyroColumn\":\n return `<kyro-column>${renderNodes(node.content ?? [])}</kyro-column>`;\n case \"kyroHero\":\n return `<kyro-hero>${renderInlineContent(node.content)}</kyro-hero>`;\n case \"kyroHeading\":\n return `<kyro-heading>${renderInlineContent(node.content)}</kyro-heading>`;\n case \"kyroDivider\":\n return \"<hr class=\\\"kyro-divider\\\" />\";\n case \"kyroCallout\":\n return `<kyro-callout>${renderInlineContent(node.content)}</kyro-callout>`;\n case \"kyroStack\":\n return `<kyro-stack>${renderNodes(node.content ?? [])}</kyro-stack>`;\n case \"kyroImage\":\n return renderCustomMediaNode(\"kyro-image\", node);\n case \"kyroVideo\":\n return renderCustomMediaNode(\"kyro-video\", node);\n default:\n return renderNodes(node.content ?? []);\n }\n}\n\nfunction renderInlineContent(content?: RichTextNode[]): string {\n const nodes = content ?? [];\n if (nodes.length === 0) {\n return \"<br />\";\n }\n return nodes.map((node) => renderNode(node)).join(\"\");\n}\n\nfunction renderTextNode(node: RichTextNode): string {\n const text = typeof node.text === \"string\" ? escapeHtml(node.text) : \"\";\n return (node.marks ?? []).reduce((acc, mark) => applyMark(acc, mark), text);\n}\n\nfunction renderImageNode(node: RichTextNode): string {\n const src = typeof node.attrs?.src === \"string\" ? node.attrs.src : \"\";\n if (!src) {\n return \"\";\n }\n\n const alt = typeof node.attrs?.alt === \"string\" ? node.attrs.alt : \"\";\n return `<img src=\"${escapeAttribute(src)}\" alt=\"${escapeAttribute(alt)}\" />`;\n}\n\nfunction renderCustomMediaNode(tagName: string, node: RichTextNode): string {\n const attrs = renderAttributes(node.attrs);\n return `<${tagName}${attrs}></${tagName}>`;\n}\n\nfunction renderAttributes(\n attrs: Record<string, unknown> | undefined,\n keysToSkip: string[] = [],\n): string {\n if (!attrs) {\n return \"\";\n }\n\n const entries = Object.entries(attrs)\n .filter(([key, value]) => !keysToSkip.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => `${key}=\"${escapeAttribute(String(value))}\"`);\n\n return entries.length > 0 ? ` ${entries.join(\" \")}` : \"\";\n}\n\nfunction applyMark(content: string, mark: RichTextMark): string {\n switch (mark.type) {\n case \"bold\":\n return `<strong>${content}</strong>`;\n case \"italic\":\n return `<em>${content}</em>`;\n case \"underline\":\n return `<u>${content}</u>`;\n case \"strike\":\n return `<s>${content}</s>`;\n case \"code\":\n return `<code>${content}</code>`;\n case \"link\": {\n const href =\n typeof mark.attrs?.href === \"string\" ? escapeAttribute(mark.attrs.href) : \"#\";\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${content}</a>`;\n }\n default:\n return content;\n }\n}\n\nfunction extractText(nodes: RichTextNode[]): string {\n return nodes\n .map((node) => {\n if (node.type === \"text\") {\n return typeof node.text === \"string\" ? node.text : \"\";\n }\n\n if (node.type === \"hardBreak\") {\n return \"\\n\";\n }\n\n return extractText(node.content ?? []);\n })\n .join(\"\");\n}\n\nfunction clampColumns(value: unknown): number {\n const numericValue = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return 2;\n }\n return Math.max(MIN_COLUMNS, Math.min(MAX_COLUMNS, Math.round(numericValue)));\n}\n\nfunction clampHeadingLevel(level: unknown): number {\n const numericLevel = typeof level === \"number\" ? level : Number(level);\n if (!Number.isFinite(numericLevel)) {\n return 2;\n }\n return Math.max(1, Math.min(6, Math.round(numericLevel)));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHtml(value).replaceAll('\"', \"&quot;\");\n}\n\nfunction isObject(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null;\n}\n","// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import type Database from 'better-sqlite3';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private path?: string;\n private migrations: Map<string, boolean> = new Map();\n\n constructor(options: {\n db?: any;\n path?: string;\n }) {\n super();\n this.path = options.path;\n\n if (options.db) {\n this.db = options.db;\n } else {\n this.db = null;\n }\n }\n\n async connect(): Promise<void> {\n if (!this.db) {\n const Database = (await import('better-sqlite3')).default;\n this.db = new Database(this.path || ':memory:');\n }\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.connected = true;\n console.log(`[LocalAdapter] Connected to SQLite (${this.path || 'memory'})`);\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n this.connected = false;\n console.log('[LocalAdapter] Disconnected');\n }\n\n // ========================================================================\n // Schema Management\n // ========================================================================\n\n private ensureTable(config: CollectionConfig): void {\n const tableName = this.getTableNameFor(config.slug);\n\n if (this.migrations.has(tableName)) return;\n\n const columns: string[] = [\n `id TEXT PRIMARY KEY`,\n ];\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n const colDef = this.fieldToSQL(field);\n if (colDef) columns.push(colDef);\n }\n\n if (config.timestamps) {\n columns.push(`created_at TEXT DEFAULT (datetime('now'))`);\n columns.push(`updated_at TEXT DEFAULT (datetime('now'))`);\n }\n\n if (config.tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const createSQL = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(', ')})`;\n this.db.exec(createSQL);\n\n // Create indexes\n for (const field of config.fields) {\n if (field.name && field.indexed) {\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${field.name} ON ${tableName}(${field.name})`);\n }\n if (field.name && field.unique) {\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_${field.name}_unique ON ${tableName}(${field.name})`);\n }\n }\n\n this.migrations.set(tableName, true);\n }\n\n private fieldToSQL(field: any): string | null {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'url':\n return `${field.name} TEXT`;\n case 'number':\n return `${field.name} REAL`;\n case 'checkbox':\n return `${field.name} INTEGER DEFAULT 0`;\n case 'date':\n return `${field.name} TEXT`;\n case 'select':\n case 'radio':\n return `${field.name} TEXT`;\n case 'relationship':\n case 'upload':\n return `${field.name} TEXT`;\n case 'json':\n case 'richtext':\n case 'array':\n case 'group':\n case 'blocks':\n return `${field.name} TEXT`;\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n if (tenantID && config.tenantScoped) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' || key === 'OR') continue;\n \n if (typeof value === 'object' && value !== null) {\n if (value.equals !== undefined) {\n conditions.push(`${key} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${key} IN (${value.in.map(() => '?').join(', ')})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${key} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${key} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n const sortField = sort?.replace('-', '') || 'created_at';\n const sortDir = sort?.startsWith('-') ? 'DESC' : 'ASC';\n sql += ` ORDER BY ${sortField} ${sortDir}`;\n\n const countSql = sql.replace('SELECT *', 'SELECT COUNT(*) as count');\n const countResult = this.db.prepare(countSql).get(...params) as { count: number };\n const totalDocs = countResult?.count || 0;\n\n sql += ` LIMIT ? OFFSET ?`;\n params.push(limit, (page - 1) * limit);\n\n const rows = this.db.prepare(sql).all(...params);\n const docs = rows.map((row: any) => this.rowToDoc(row, config));\n\n return {\n docs: docs as T[],\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n const row = this.db.prepare(sql).get(...params);\n if (!row) return null;\n\n return this.rowToDoc(row as any, config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const id = data.id || this.generateId();\n \n const insertData = this.prepareData(data, config);\n insertData.id = id;\n insertData.created_at = new Date().toISOString();\n insertData.updated_at = new Date().toISOString();\n\n if (tenantID && config.tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n const placeholders = columns.map(() => '?').join(', ');\n const values = Object.values(insertData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n this.db.prepare(\n `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`\n ).run(...values);\n\n return { ...insertData, id } as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n const columns = Object.keys(updateData);\n const setClause = columns.map(c => `${c} = ?`).join(', ');\n const values = Object.values(updateData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return this.findByID<T>({ collection: slug, id, tenantID }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const doc = await this.findByID<T>({ collection: slug, id, tenantID });\n if (!doc) throw new Error(`Document not found: ${slug}/${id}`);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return doc;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && config.tenantScoped) {\n sql += ` WHERE tenant_id = ?`;\n params.push(tenantID);\n }\n\n const result = this.db.prepare(sql).get(...params) as { count: number };\n return result?.count || 0;\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version Support (Placeholder)\n // ========================================================================\n\n async findVersions(): Promise<FindResult<any>> {\n return { docs: [], totalDocs: 0, limit: 10, totalPages: 0, page: 1, pagingCounter: 0, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null };\n }\n\n async findVersionByID(): Promise<any> {\n return null;\n }\n\n async createVersion(): Promise<any> {\n return {};\n }\n\n async deleteVersions(): Promise<void> {}\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n private rowToDoc(row: any, config: CollectionConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n let value = row[field.name];\n\n if (field.type === 'json' || field.type === 'richtext' || \n field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (field.type === 'checkbox') {\n value = Boolean(value);\n }\n\n if (field.type === 'date' && value) {\n value = new Date(value).toISOString();\n }\n\n doc[field.name] = value;\n }\n\n if (config.timestamps) {\n doc.createdAt = row.created_at;\n doc.updatedAt = row.updated_at;\n }\n\n if (config.tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, '_');\n }\n\n // ========================================================================\n // Migrations\n // ========================================================================\n\n async migrate(): Promise<void> {\n for (const config of this.collections.values()) {\n this.ensureTable(config);\n }\n console.log('[LocalAdapter] Migrations complete');\n }\n\n async rollback(): Promise<void> {\n console.log('[LocalAdapter] Rollback not supported for schema changes');\n }\n\n // ========================================================================\n // Transaction Support\n // ========================================================================\n\n async transaction<T>(fn: (tx: any) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const tx = this.db.transaction(async () => {\n return fn({ db: this.db });\n });\n\n try {\n const result = tx();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ========================================================================\n // Direct DB Access\n // ========================================================================\n\n getDatabase(): any {\n return this.db;\n }\n\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n prepare(sql: string) {\n return this.db.prepare(sql);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createLocalAdapter(options?: {\n db?: any;\n path?: string;\n}): LocalAdapter {\n return new LocalAdapter(options || {});\n}\n","import type { CollectionConfig, GlobalConfig } from \"../registry/types.js\";\nimport type { Field } from \"../fields/types.js\";\nimport type { Hook } from \"../hooks/types.js\";\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (\n slug: string,\n extension: Partial<CollectionConfig>,\n ) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super(\"seo\");\n this.description =\n \"Advanced SEO features including sitemaps, robots.txt, and structured data\";\n\n this.collections.push({\n slug: \"seo-settings\",\n label: \"SEO Settings\",\n fields: [\n {\n name: \"sitemap\",\n type: \"checkbox\",\n label: \"Enable Sitemap\",\n defaultValue: true,\n },\n { name: \"robotsTxt\", type: \"richtext\", label: \"robots.txt Content\" },\n {\n name: \"canonicalUrl\",\n type: \"text\",\n variant: \"url\" as any,\n label: \"Canonical URL\",\n },\n { name: \"ogImage\", type: \"text\", label: \"Default OG Image URL\" },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super(\"analytics\");\n this.description =\n \"Analytics integration for tracking page views and events\";\n\n this.collections.push({\n slug: \"analytics-events\",\n label: \"Analytics Events\",\n fields: [\n { name: \"name\", type: \"text\", required: true },\n { name: \"properties\", type: \"json\", label: \"Event Properties\" },\n { name: \"timestamp\", type: \"date\", required: true },\n { name: \"userId\", type: \"text\", label: \"User ID\" },\n { name: \"sessionId\", type: \"text\", label: \"Session ID\" },\n ],\n });\n\n this.adminComponents[\"AnalyticsDashboard\"] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super(\"comments\");\n this.description = \"Commenting system for products and posts\";\n\n this.collections.push({\n slug: \"comments\",\n label: \"Comments\",\n fields: [\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"text\", required: true },\n { name: \"email\", type: \"email\" },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"parent\", type: \"text\", label: \"Parent Comment ID\" },\n { name: \"resourceType\", type: \"text\", required: true },\n { name: \"resourceId\", type: \"text\", required: true },\n ],\n });\n\n this.adminComponents[\"CommentModeration\"] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super(\"reviews\");\n this.description = \"Product reviews and ratings\";\n\n this.collections.push({\n slug: \"reviews\",\n label: \"Reviews\",\n fields: [\n { name: \"rating\", type: \"number\", required: true, min: 1, max: 5 },\n { name: \"title\", type: \"text\" },\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"relationship\", relationTo: \"customers\" },\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n required: true,\n },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"verified\", type: \"checkbox\", label: \"Verified Purchase\" },\n {\n name: \"helpful\",\n type: \"number\",\n label: \"Helpful Count\",\n defaultValue: 0,\n },\n ],\n });\n\n this.adminComponents[\"ReviewModeration\"] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super(\"wishlist\");\n this.description = \"Customer wishlists\";\n\n this.collections.push({\n slug: \"wishlists\",\n label: \"Wishlists\",\n fields: [\n {\n name: \"customer\",\n type: \"relationship\",\n relationTo: \"customers\",\n required: true,\n },\n {\n name: \"name\",\n type: \"text\",\n label: \"Wishlist Name\",\n defaultValue: \"My Wishlist\",\n },\n {\n name: \"items\",\n type: \"blocks\",\n label: \"Items\",\n blocks: [\n {\n slug: \"wishlist-item\",\n label: \"Item\",\n fields: [\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n },\n { name: \"quantity\", type: \"number\", defaultValue: 1 },\n { name: \"addedAt\", type: \"date\" },\n {\n name: \"priority\",\n type: \"select\",\n options: [\n { label: \"Low\", value: \"low\" },\n { label: \"Medium\", value: \"medium\" },\n { label: \"High\", value: \"high\" },\n ],\n },\n ],\n },\n ],\n },\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","// ============================================================================\n// Styling System Abstraction\n// ============================================================================\n\nexport type StylingMode = 'css' | 'tailwind' | 'css-in-js' | 'styled-components' | 'vanilla-extract';\n\nexport interface StylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customProperties?: Record<string, string>;\n}\n\nexport interface ThemeConfig {\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeBorderRadius;\n shadows?: ThemeShadows;\n breakpoints?: Record<string, string>;\n}\n\nexport interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n error?: string;\n warning?: string;\n success?: string;\n info?: string;\n}\n\nexport interface ThemeFonts {\n sans?: string;\n serif?: string;\n mono?: string;\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n '3xl'?: string;\n '4xl'?: string;\n}\n\nexport interface ThemeBorderRadius {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\n// ============================================================================\n// CSS Generator\n// ============================================================================\n\nexport class CSSGenerator {\n private css: string[] = [];\n\n constructor(private config: StylingConfig) {}\n\n addRule(selector: string, properties: Record<string, string>): this {\n const props = Object.entries(properties)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n this.css.push(`${selector} {\\n${props}\\n}`);\n return this;\n }\n\n addMediaQuery(breakpoint: string, rules: string[]): this {\n this.css.push(`@media (min-width: ${breakpoint}) {\\n ${rules.join('\\n ')}\\n}`);\n return this;\n }\n\n generate(): string {\n return this.css.join('\\n\\n');\n }\n}\n\n// ============================================================================\n// Tailwind Config Generator\n// ============================================================================\n\nexport function generateTailwindConfig(theme: ThemeConfig): Record<string, any> {\n return {\n theme: {\n extend: {\n colors: theme.colors || {},\n fontFamily: theme.fonts || {},\n spacing: theme.spacing || {},\n borderRadius: theme.borderRadius || {},\n boxShadow: theme.shadows || {},\n screens: theme.breakpoints || {},\n },\n },\n };\n}\n\n// ============================================================================\n// Default Themes\n// ============================================================================\n\nexport const defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#3b82f6',\n secondary: '#6366f1',\n accent: '#ec4899',\n background: '#ffffff',\n surface: '#f9fafb',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n warning: '#f59e0b',\n success: '#10b981',\n info: '#3b82f6',\n },\n fonts: {\n sans: 'system-ui, -apple-system, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Menlo, monospace',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n '2xl': '3rem',\n '3xl': '4rem',\n },\n borderRadius: {\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',\n },\n};\n\nexport const defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#60a5fa',\n secondary: '#818cf8',\n accent: '#f472b6',\n background: '#111827',\n surface: '#1f2937',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n warning: '#fbbf24',\n success: '#34d399',\n info: '#60a5fa',\n },\n fonts: defaultLightTheme.fonts,\n spacing: defaultLightTheme.spacing,\n borderRadius: defaultLightTheme.borderRadius,\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.3)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.4)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.5)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.6)',\n },\n};\n\n// ============================================================================\n// E-Commerce Theme (2026 Design Engine)\n// ============================================================================\n\nexport const ecommerce2026Theme: ThemeConfig = {\n colors: {\n primary: '#FF6B35',\n secondary: '#1A1A2E',\n accent: '#16C79A',\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A2E',\n textMuted: '#6B7280',\n border: '#E5E7EB',\n error: '#EF4444',\n warning: '#F59E0B',\n success: '#16C79A',\n info: '#3B82F6',\n },\n fonts: {\n sans: '\"Inter\", \"Satoshi\", system-ui, sans-serif',\n serif: '\"Playfair Display\", Georgia, serif',\n mono: '\"JetBrains Mono\", monospace',\n },\n spacing: {\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '1rem',\n xl: '1.5rem',\n '2xl': '2rem',\n '3xl': '3rem',\n '4xl': '4rem',\n },\n borderRadius: {\n sm: '0',\n md: '0',\n lg: '0',\n xl: '0',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.05)',\n md: '0 4px 6px rgba(0,0,0,0.07)',\n lg: '0 10px 15px rgba(0,0,0,0.1)',\n xl: '0 20px 25px rgba(0,0,0,0.15)',\n },\n};\n\n// ============================================================================\n// CSS Variables Generator\n// ============================================================================\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const variables: string[] = [];\n\n // Colors\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n variables.push(` --color-${key}: ${value};`);\n }\n }\n\n // Fonts\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n variables.push(` --font-${key}: ${value};`);\n }\n }\n\n // Spacing\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n variables.push(` --spacing-${key}: ${value};`);\n }\n }\n\n // Border Radius\n if (theme.borderRadius) {\n for (const [key, value] of Object.entries(theme.borderRadius)) {\n variables.push(` --radius-${key}: ${value};`);\n }\n }\n\n // Shadows\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n variables.push(` --shadow-${key}: ${value};`);\n }\n }\n\n return `:root {\\n${variables.join('\\n')}\\n}`;\n}\n\n// ============================================================================\n// Admin Styling Config\n// ============================================================================\n\nexport interface AdminStylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customStyles?: string;\n componentOverrides?: Record<string, Record<string, string>>;\n}\n\nexport function createAdminStyling(config: AdminStylingConfig): string {\n const cssVars = generateCSSVariables(config.theme || defaultLightTheme);\n const componentStyles: string[] = [];\n\n // Generate component overrides\n if (config.componentOverrides) {\n for (const [selector, styles] of Object.entries(config.componentOverrides)) {\n const props = Object.entries(styles)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n componentStyles.push(`${selector} {\\n${props}\\n}`);\n }\n }\n\n return `\n ${cssVars}\n ${config.customStyles || ''}\n ${componentStyles.join('\\n')}\n `;\n}\n\n// ============================================================================\n// Field Styling\n// ============================================================================\n\nexport interface FieldStyling {\n wrapper?: Record<string, string>;\n label?: Record<string, string>;\n input?: Record<string, string>;\n error?: Record<string, string>;\n description?: Record<string, string>;\n}\n\nexport const defaultFieldStyling: Record<string, FieldStyling> = {\n text: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { \n display: 'block', \n marginBottom: 'var(--spacing-xs)',\n fontWeight: '500',\n color: 'var(--color-text)',\n },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n fontSize: '0.875rem',\n },\n error: {\n color: 'var(--color-error)',\n fontSize: '0.75rem',\n marginTop: 'var(--spacing-xs)',\n },\n },\n number: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { display: 'block', marginBottom: 'var(--spacing-xs)', fontWeight: '500' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n },\n },\n checkbox: {\n wrapper: { display: 'flex', alignItems: 'center', gap: 'var(--spacing-sm)' },\n input: { width: '1rem', height: '1rem' },\n label: { cursor: 'pointer' },\n },\n select: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n backgroundColor: 'white',\n },\n },\n};\n","import Redis from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import Redis from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import Redis from \"ioredis\";\nimport { randomBytes } from \"crypto\";\n\nexport type AuditAction =\n | \"login\"\n | \"logout\"\n | \"login_failed\"\n | \"register\"\n | \"verify_email\"\n | \"password_change\"\n | \"password_reset\"\n | \"password_reset_request\"\n | \"role_change\"\n | \"permission_change\"\n | \"document_create\"\n | \"document_update\"\n | \"document_delete\"\n | \"settings_change\"\n | \"user_lockout\"\n | \"user_unlock\"\n | \"user_create\"\n | \"user_update\"\n | \"user_delete\"\n | \"api_request\"\n | \"api_key_create\"\n | \"api_key_delete\"\n | \"tenant_create\"\n | \"tenant_delete\";\n\nexport interface AuditLog {\n id: string;\n timestamp: Date;\n action: AuditAction;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n changes?: { field: string; old: any; new: any }[];\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface AuditLogFilter {\n userId?: string;\n action?: AuditAction | AuditAction[];\n resource?: string;\n resourceId?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n}\n\nexport interface AuditRetentionConfig {\n retentionDays: number;\n cleanupIntervalHours: number;\n}\n\nexport const DEFAULT_RETENTION_CONFIG: AuditRetentionConfig = {\n retentionDays: 30,\n cleanupIntervalHours: 24,\n};\n\nexport class AuditLogger {\n private redis: Redis;\n private prefix: string;\n private retentionDays: number;\n\n constructor(\n redis: Redis,\n retentionDays: number = 30,\n prefix: string = \"kyro:audit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n const key = this.getKeyForDate(timestamp);\n const hashKey = `${this.prefix}log:${id}`;\n\n await this.redis.hset(hashKey, this.serializeLog(log));\n await this.redis.expire(hashKey, this.retentionDays * 24 * 60 * 60 + 3600);\n\n await this.redis.zadd(key, timestamp.getTime(), id);\n await this.redis.expire(key, this.retentionDays * 24 * 60 * 60 + 3600);\n\n const userIndex = data.userId ? `${this.prefix}user:${data.userId}` : null;\n if (userIndex) {\n await this.redis.zadd(userIndex, timestamp.getTime(), id);\n await this.redis.expire(\n userIndex,\n this.retentionDays * 24 * 60 * 60 + 3600,\n );\n }\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n const hashKey = `${this.prefix}log:${id}`;\n const data = await this.redis.hgetall(hashKey);\n\n if (!data || Object.keys(data).length === 0) {\n return null;\n }\n\n return this.deserializeLog(data);\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let keys: string[] = [];\n\n if (filter.userId) {\n keys.push(`${this.prefix}user:${filter.userId}`);\n } else if (filter.startDate || filter.endDate) {\n keys = this.getKeysForDateRange(filter.startDate, filter.endDate);\n } else {\n const now = new Date();\n keys = this.getKeysForDateRange(\n new Date(now.getTime() - this.retentionDays * 24 * 60 * 60 * 1000),\n now,\n );\n }\n\n let idScores: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n idScores.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n idScores.sort((a, b) => b[1] - a[1]);\n\n const total = idScores.length;\n idScores = idScores.slice(offset, offset + limit);\n\n const logs: AuditLog[] = [];\n for (const [id] of idScores) {\n const log = await this.get(id);\n if (log) {\n if (this.matchesFilter(log, filter)) {\n logs.push(log);\n }\n }\n }\n\n return { logs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const logs: AuditLog[] = [];\n const now = new Date();\n const keys = this.getKeysForDateRange(\n new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000),\n now,\n );\n\n let allIds: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n allIds.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n allIds.sort((a, b) => b[1] - a[1]);\n\n for (const [id] of allIds.slice(0, limit)) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const key = `${this.prefix}user:${userId}`;\n const ids = await this.redis.zrange(key, 0, limit - 1);\n\n const logs: AuditLog[] = [];\n for (const id of ids) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const keys = this.getKeysForDateRange(\n startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n endDate || new Date(),\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const key of keys) {\n const ids = await this.redis.zrange(key, 0, -1);\n\n for (const id of ids) {\n const log = await this.get(id);\n if (log) {\n totalEvents++;\n\n byAction[log.action] = (byAction[log.action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000;\n\n const keys = await this.redis.keys(`${this.prefix}date:*`);\n let deleted = 0;\n\n for (const key of keys) {\n const timestamp = await this.redis.zrangebyscore(key, 0, cutoff);\n\n for (const id of timestamp) {\n await this.redis.del(`${this.prefix}log:${id}`);\n deleted++;\n }\n\n await this.redis.zremrangebyscore(key, 0, cutoff);\n }\n\n return deleted;\n }\n\n private getKeyForDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${this.prefix}date:${year}-${month}-${day}`;\n }\n\n private getKeysForDateRange(start?: Date, end?: Date): string[] {\n const keys: string[] = [];\n const startDate =\n start || new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000);\n const endDate = end || new Date();\n\n const current = new Date(startDate);\n while (current <= endDate) {\n keys.push(this.getKeyForDate(current));\n current.setDate(current.getDate() + 1);\n }\n\n return keys;\n }\n\n private matchesFilter(log: AuditLog, filter: AuditLogFilter): boolean {\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n if (!actions.includes(log.action)) return false;\n }\n\n if (filter.resource && log.resource !== filter.resource) return false;\n\n if (filter.resourceId && log.resourceId !== filter.resourceId) return false;\n\n if (filter.success !== undefined && log.success !== filter.success)\n return false;\n\n return true;\n }\n\n private serializeLog(log: AuditLog): Record<string, string> {\n const result: Record<string, string> = {\n id: log.id,\n timestamp: log.timestamp.toISOString(),\n action: log.action,\n resource: log.resource,\n success: log.success ? \"1\" : \"0\",\n };\n\n if (log.userId) result.userId = log.userId;\n if (log.userEmail) result.userEmail = log.userEmail;\n if (log.role) result.role = log.role;\n if (log.resourceId) result.resourceId = log.resourceId;\n if (log.ipAddress) result.ipAddress = log.ipAddress;\n if (log.userAgent) result.userAgent = log.userAgent;\n if (log.error) result.error = log.error;\n if (log.changes) result.changes = JSON.stringify(log.changes);\n if (log.metadata) result.metadata = JSON.stringify(log.metadata);\n\n return result;\n }\n\n private deserializeLog(data: Record<string, string>): AuditLog {\n return {\n id: data.id,\n timestamp: new Date(data.timestamp),\n action: data.action as AuditAction,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success === \"1\",\n error: data.error,\n changes: data.changes ? JSON.parse(data.changes) : undefined,\n metadata: data.metadata ? JSON.parse(data.metadata) : undefined,\n };\n }\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport class InMemoryAuthAdapter implements AuthAdapter {\n private users: Map<string, AuthUser> = new Map();\n private sessions: Map<string, Session> = new Map();\n private refreshTokens: Map<string, string> = new Map();\n private emailToUserId: Map<string, string> = new Map();\n private passwordHistory: Map<string, string[]> = new Map();\n private auditLogs: Array<Record<string, unknown>> = [];\n private externalDb: boolean = false;\n\n constructor() {}\n\n async connect(): Promise<void> {\n // No connection needed for in-memory adapter\n }\n\n async disconnect(): Promise<void> {\n // No disconnection needed for in-memory adapter\n this.users.clear();\n this.sessions.clear();\n this.refreshTokens.clear();\n this.emailToUserId.clear();\n this.passwordHistory.clear();\n }\n\n async createUser(data: {\n email: string;\n password: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.users.set(userId, user);\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n this.passwordHistory.set(userId, []);\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = this.emailToUserId.get(email.toLowerCase());\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n return this.users.get(userId) || null;\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n // Handle email change\n if (data.email && data.email !== existing.email) {\n this.emailToUserId.delete(existing.email.toLowerCase());\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n }\n\n this.users.set(userId, updated);\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n this.users.delete(userId);\n this.emailToUserId.delete(user.email.toLowerCase());\n this.refreshTokens.forEach((sessionId, refreshToken) => {\n if (this.sessions.get(sessionId)?.userId === userId) {\n this.refreshTokens.delete(refreshToken);\n this.sessions.delete(sessionId);\n }\n });\n this.passwordHistory.delete(userId);\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n this.sessions.delete(sessionId);\n }\n });\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const user = await this.findUserByEmail(email);\n if (!user || !user.passwordHash) return null;\n const bcrypt = (await import(\"bcryptjs\")).default;\n const valid = await bcrypt.compare(password, user.passwordHash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(now.getTime() + 86400 * 1000).toISOString(), // 24 hours\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.sessions.set(sessionId, session);\n this.refreshTokens.set(refreshToken, sessionId);\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n return this.sessions.get(token) || null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n let deleted = 0;\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n deleted++;\n }\n });\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n const history = this.passwordHistory.get(userId) || [];\n history.push(passwordHash);\n // Keep only last 5 passwords\n if (history.length > 5) {\n history.splice(0, history.length - 5);\n }\n this.passwordHistory.set(userId, history);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.passwordHistory.get(userId) || [];\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n const bcrypt = (await import(\"bcryptjs\")).default;\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n return this.users.size > 0;\n }\n\n async findAuditLogs(filter: {\n userId?: string;\n action?: string | string[];\n resource?: string;\n success?: boolean;\n limit?: number;\n offset?: number;\n }): Promise<{ logs: any[]; total: number }> {\n const { limit = 50, offset = 0 } = filter;\n let logs = this.auditLogs.slice().reverse();\n if (filter.userId) logs = logs.filter((l) => l.userId === filter.userId);\n if (filter.action) {\n if (Array.isArray(filter.action)) {\n logs = logs.filter((l) => filter.action!.includes(String(l.action)));\n } else {\n logs = logs.filter((l) => l.action === filter.action);\n }\n }\n if (filter.resource)\n logs = logs.filter((l) => l.resource === filter.resource);\n if (filter.success !== undefined)\n logs = logs.filter((l) => l.success === filter.success);\n return { logs: logs.slice(offset, offset + limit), total: logs.length };\n }\n\n async createAuditLog(data: any): Promise<any> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n const log = { ...data, id, timestamp };\n this.auditLogs.push(log);\n return log;\n }\n}\n\nexport function createInMemoryAuthAdapter() {\n return new InMemoryAuthAdapter();\n}\n","import type { LockoutConfig, LockoutStatus } from \"./lockout.js\";\n\nexport class InMemoryAccountLockout {\n private storage: Map<\n string,\n {\n attempts: number;\n lastAttempt: number | null;\n lockedAt: number | null;\n lockedUntil: number | null;\n }\n > = new Map();\n private history: Map<string, number[]> = new Map(); // userId -> attempt timestamps\n private config: LockoutConfig;\n\n constructor(config: Partial<LockoutConfig> = {}) {\n this.config = {\n maxAttempts: 5,\n lockDuration: 900000, // 15 minutes\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n ...config,\n };\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId);\n\n // Clear expired locks\n if (record && record.lockedUntil !== null && record.lockedUntil <= now) {\n await this.resetAttempts(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n if (!record) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const { attempts, lockedUntil } = record;\n\n if (lockedUntil !== null && lockedUntil > now) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockedUntil),\n totalAttempts: attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts += 1;\n record.lastAttempt = now;\n\n // Add to history\n let history = this.history.get(userId) || [];\n history.push(now);\n // Keep only last 100 attempts\n if (history.length > 100) {\n history.splice(0, history.length - 100);\n }\n this.history.set(userId, history);\n\n this.storage.set(userId, record);\n\n // Check if we should lock the account\n if (record.attempts >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: record.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - record.attempts),\n totalAttempts: record.attempts,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts = this.config.maxAttempts;\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n }\n\n async unlockAccount(userId: string): Promise<void> {\n await this.resetAttempts(userId);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const record = this.storage.get(userId);\n if (record) {\n record.attempts = 0;\n record.lockedAt = null;\n record.lockedUntil = null;\n this.storage.set(userId, record);\n }\n\n // Clear history for this user\n this.history.delete(userId);\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const history = this.history.get(userId) || [];\n return history\n .slice(-limit)\n .reverse()\n .map((timestamp) => new Date(timestamp));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const history = this.history.get(userId) || [];\n const totalFailedAttempts = history.length;\n const lockoutCount = Math.floor(\n totalFailedAttempts / this.config.maxAttempts,\n );\n\n let lastLockout: Date | null = null;\n const record = this.storage.get(userId);\n if (record && record.lockedAt !== null) {\n lastLockout = new Date(record.lockedAt);\n }\n\n // Average attempts before lockout is just the threshold for simplicity\n const averageAttemptsBeforeLockout =\n lockoutCount > 0 ? this.config.maxAttempts : 0;\n\n return {\n totalFailedAttempts,\n lockoutCount,\n lastLockout,\n averageAttemptsBeforeLockout,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport function createInMemoryAccountLockout(\n config: Partial<LockoutConfig> = {},\n) {\n return new InMemoryAccountLockout(config);\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuditLog, AuditAction, AuditLogFilter } from \"./audit-log.js\";\nimport { DEFAULT_RETENTION_CONFIG } from \"./audit-log.js\";\n\nexport class InMemoryAuditLogger {\n private logs: AuditLog[] = [];\n private retentionDays: number;\n\n constructor(retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays) {\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n this.logs.push(log);\n this.cleanupOldLogs();\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n return this.logs.find((log) => log.id === id) || null;\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let filteredLogs = [...this.logs]; // Create a copy to avoid modifying original\n\n if (filter.userId) {\n filteredLogs = filteredLogs.filter((log) => log.userId === filter.userId);\n }\n\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n filteredLogs = filteredLogs.filter((log) => actions.includes(log.action));\n }\n\n if (filter.resource) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resource === filter.resource,\n );\n }\n\n if (filter.resourceId) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resourceId === filter.resourceId,\n );\n }\n\n if (filter.success !== undefined) {\n filteredLogs = filteredLogs.filter(\n (log) => log.success === filter.success,\n );\n }\n\n const startDate = filter.startDate;\n const endDate = filter.endDate;\n\n if (startDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp >= startDate);\n }\n\n if (endDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp <= endDate);\n }\n\n // Sort by timestamp descending (newest first)\n filteredLogs.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n const total = filteredLogs.length;\n const paginatedLogs = filteredLogs.slice(offset, offset + limit);\n\n return { logs: paginatedLogs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const cutoffDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // Last 7 days\n\n const recentLogs = this.logs\n .filter((log) => log.timestamp >= cutoffDate)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return recentLogs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const userLogs = this.logs\n .filter((log) => log.userId === userId)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return userLogs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const start = startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // Last 30 days\n const end = endDate || new Date();\n\n const filteredLogs = this.logs.filter(\n (log) => log.timestamp >= start && log.timestamp <= end,\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const log of filteredLogs) {\n totalEvents++;\n\n const action = log.action;\n byAction[action] = (byAction[action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n\n return initialCount - this.logs.length;\n }\n\n private cleanupOldLogs(): void {\n // This is called automatically after each log entry\n // In a production system, you might want to run this less frequently\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n }\n}\n\nexport function createInMemoryAuditLogger(\n retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays,\n) {\n return new InMemoryAuditLogger(retentionDays);\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import jwt from \"jsonwebtoken\";\nimport { randomBytes } from \"crypto\";\nimport type { AuthAdapter } from \"../../auth/types.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../../auth/security/password-policy.js\";\nimport { InMemoryAccountLockout } from \"../../auth/security/in-memory-lockout.js\";\nimport { InMemoryRateLimiter } from \"../../auth/security/in-memory-rate-limit.js\";\nimport {\n InMemoryAuditLogger,\n createAuditContext,\n} from \"../../auth/security/in-memory-audit-log.js\";\nimport type { AuditAction } from \"../../auth/security/audit-log.js\";\nimport { generateToken, defaultExtractToken } from \"./auth-middleware.js\";\nimport type {\n AuthUser,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n Session,\n} from \"../../auth/types.js\";\n\nexport interface AuthRoutesConfig {\n redis: AuthAdapter;\n email?: EmailTransport;\n jwtSecret: string;\n jwtExpiresIn?: string;\n jwtIssuer?: string;\n jwtAudience?: string;\n passwordPolicy?: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n baseUrl?: string;\n emailVerificationRequired?: boolean;\n}\n\nexport class AuthRoutes {\n private authAdapter: AuthAdapter;\n private email?: EmailTransport;\n private jwtSecret: string;\n private jwtExpiresIn: string;\n private jwtIssuer?: string;\n private jwtAudience?: string;\n private passwordPolicy: PasswordPolicy;\n private lockout?: InMemoryAccountLockout;\n private rateLimiter?: InMemoryRateLimiter;\n private auditLogger?: InMemoryAuditLogger;\n private baseUrl: string;\n private emailVerificationRequired: boolean;\n\n constructor(config: AuthRoutesConfig) {\n this.authAdapter = config.redis;\n this.email = config.email;\n this.jwtSecret = config.jwtSecret;\n this.jwtExpiresIn = config.jwtExpiresIn || \"24h\";\n this.jwtIssuer = config.jwtIssuer;\n this.jwtAudience = config.jwtAudience;\n this.passwordPolicy = config.passwordPolicy || new PasswordPolicy();\n this.lockout = config.lockout;\n this.rateLimiter = config.rateLimiter;\n this.auditLogger = config.auditLogger;\n this.baseUrl = config.baseUrl || \"http://localhost:3000\";\n this.emailVerificationRequired = config.emailVerificationRequired ?? true;\n }\n\n async register(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:register\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as RegisterData & {\n confirmPassword?: string;\n };\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n if (body.password !== body.confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(body.password);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const existingUser = await this.authAdapter.findUserByEmail(body.email);\n if (existingUser) {\n return this.errorResponse(\"Email already registered\", 400);\n }\n\n const user = await this.authAdapter.createUser({\n email: body.email,\n password: body.password,\n role: body.role || \"customer\",\n tenantId: body.tenantId,\n });\n\n if (this.emailVerificationRequired && this.email) {\n const verificationToken = randomBytes(32).toString(\"hex\");\n const verificationUrl = `${this.baseUrl}/api/auth/verify?token=${verificationToken}`;\n\n await this.authAdapter.createSession(user.id, { ipAddress, userAgent });\n const template = this.email\n .getTemplates()\n .verifyEmail(verificationUrl, body.email);\n await this.email.send({ to: body.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"register\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse(\n {\n success: true,\n message: \"Registration successful\",\n user: this.sanitizeUser(user),\n requiresVerification: this.emailVerificationRequired && !!this.email,\n },\n 201,\n );\n } catch (error) {\n return this.errorResponse(\"Registration failed\", 500);\n }\n }\n\n async login(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:login\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as LoginCredentials;\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(body.email);\n if (!user) {\n await this.recordFailedLogin(ipAddress, userAgent);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n const lockoutStatus = await this.lockout.checkLockout(user.id);\n if (lockoutStatus.locked) {\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Account locked\",\n });\n }\n return this.errorResponse(\n `Account locked. Try again in ${Math.ceil((lockoutStatus.lockedUntil!.getTime() - Date.now()) / 60000)} minutes`,\n 423,\n );\n }\n }\n\n const validPassword = user.passwordHash\n ? await this.authAdapter.verifyPassword(\n body.password,\n user.passwordHash,\n )\n : false;\n if (!validPassword) {\n await this.recordFailedLogin(ipAddress, userAgent, user.id, user.email);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n await this.lockout.resetAttempts(user.id);\n }\n\n const session = await this.authAdapter.createSession(user.id, {\n ipAddress,\n userAgent,\n });\n\n const payload: JWTPayload = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 86400,\n };\n\n const accessToken = generateToken(payload, this.jwtSecret, {\n expiresIn: this.jwtExpiresIn,\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n });\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login\",\n userId: user.id,\n userEmail: user.email,\n role: user.role,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n await this.authAdapter.updateUser(user.id, {\n lastLogin: new Date().toISOString(),\n });\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n accessToken,\n refreshToken: session.refreshToken,\n expiresIn: this.jwtExpiresIn,\n });\n } catch (error) {\n return this.errorResponse(\"Login failed\", 500);\n }\n }\n\n async logout(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"No session to logout\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.decode(token) as JWTPayload;\n if (payload && payload.sub) {\n await this.authAdapter.deleteUserSessions(payload.sub);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"logout\",\n userId: payload.sub,\n userEmail: payload.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Logged out successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Logout failed\", 500);\n }\n }\n\n async refresh(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as { refreshToken?: string };\n const { refreshToken } = body;\n\n if (!refreshToken) {\n return this.errorResponse(\"Refresh token required\", 400);\n }\n\n return this.jsonResponse({ success: true, accessToken: \"\" });\n } catch (error) {\n return this.errorResponse(\"Token refresh failed\", 500);\n }\n }\n\n async me(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const payload = jwt.verify(token, this.jwtSecret, {\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n }) as JWTPayload;\n\n const user = await this.authAdapter.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n });\n } catch (error) {\n return this.errorResponse(\"Authentication failed\", 401);\n }\n }\n\n async changePassword(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.verify(token, this.jwtSecret) as JWTPayload;\n const body = (await req.json()) as {\n currentPassword?: string;\n newPassword?: string;\n confirmPassword?: string;\n };\n const { currentPassword, newPassword, confirmPassword } = body;\n\n if (!currentPassword || !newPassword) {\n return this.errorResponse(\"Current and new password required\", 400);\n }\n\n if (newPassword !== confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(newPassword);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const user = await this.authAdapter.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n const validPassword = user.passwordHash\n ? await this.authAdapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n )\n : false;\n if (!validPassword) {\n return this.errorResponse(\"Current password is incorrect\", 401);\n }\n\n const passwordHistory = await this.authAdapter.getPasswordHistory?.(\n user.id,\n 5,\n );\n const isReused = await this.authAdapter.isPasswordInHistory?.(\n newPassword,\n user.id,\n 5,\n );\n if (isReused) {\n return this.errorResponse(\n \"Password was recently used. Please choose a different password\",\n 400,\n );\n }\n\n const newPasswordHash = await this.authAdapter.hashPassword(newPassword);\n if (user.passwordHash) {\n await this.authAdapter.addPasswordToHistory?.(\n user.id,\n user.passwordHash,\n );\n }\n await this.authAdapter.updateUser(user.id, {\n passwordHash: newPasswordHash,\n });\n\n await this.authAdapter.deleteUserSessions(user.id);\n\n if (this.email && this.email.getTemplates) {\n const template = this.email.getTemplates().passwordChanged(user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_change\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Password change failed\", 500);\n }\n }\n\n async forgotPassword(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:forgot\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as { email?: string };\n const { email } = body;\n\n if (!email) {\n return this.errorResponse(\"Email required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(email);\n if (!user) {\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n }\n\n if (this.email) {\n const resetToken = randomBytes(32).toString(\"hex\");\n const resetUrl = `${this.baseUrl}/api/auth/reset-password?token=${resetToken}`;\n const template = this.email\n .getTemplates()\n .resetPassword(resetUrl, user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_reset_request\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n } catch (error) {\n return this.errorResponse(\"Password reset request failed\", 500);\n }\n }\n\n async verifyEmail(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const token = url.searchParams.get(\"token\");\n\n if (!token) {\n return this.errorResponse(\"Verification token required\", 400);\n }\n\n try {\n return this.jsonResponse({ success: true, message: \"Email verified\" });\n } catch (error) {\n return this.errorResponse(\"Email verification failed\", 500);\n }\n }\n\n private async recordFailedLogin(\n ipAddress: string,\n userAgent: string,\n userId?: string,\n userEmail?: string,\n ): Promise<void> {\n if (this.lockout) {\n await this.lockout.recordFailedAttempt(userId || ipAddress);\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId,\n userEmail,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Invalid credentials\",\n });\n }\n }\n\n private sanitizeUser(user: AuthUser): Partial<AuthUser> {\n const { passwordHash, ...sanitized } = user;\n return sanitized;\n }\n\n private jsonResponse(data: any, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private errorResponse(message: string, status: number): Response {\n return new Response(JSON.stringify({ success: false, error: message }), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private rateLimitResponse(limit: { retryAfter?: number }): Response {\n return new Response(\n JSON.stringify({\n success: false,\n error: \"Too many requests\",\n retryAfter: limit.retryAfter,\n }),\n {\n status: 429,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": String(limit.retryAfter || 60),\n },\n },\n );\n }\n}\n","import type { AuthAdapter } from \"./types.js\";\nimport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nimport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nimport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nimport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\nimport { RedisAuthAdapter } from \"./redis-adapter.js\";\nimport { AccountLockout } from \"./security/lockout.js\";\nimport { RateLimiter } from \"./security/rate-limit.js\";\nimport { AuditLogger } from \"./security/audit-log.js\";\n\nexport type DatabaseType =\n | \"sqlite\"\n | \"postgres\"\n | \"mysql\"\n | \"mongodb\"\n | \"memory\";\n\nexport interface KyroAuthConfig {\n authAdapter: AuthAdapter;\n // Optional; when using distributed mode this can be set to 'distributed' or other markers\n databaseType?: string;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nfunction detectDatabaseType(): DatabaseType {\n // Check environment variable first\n const envDb = process.env.KYRO_AUTH_DATABASE?.toLowerCase();\n if (\n envDb &&\n [\"sqlite\", \"postgres\", \"mysql\", \"mongodb\", \"memory\"].includes(envDb)\n ) {\n return envDb as DatabaseType;\n }\n\n // Try to detect from main kyro.config.ts\n try {\n const { readFileSync } = require(\"fs\");\n const { join } = require(\"path\");\n const configPath = join(process.cwd(), \"kyro.config.ts\");\n const configContent = readFileSync(configPath, \"utf8\");\n\n if (configContent.includes(\"createLocalAdapter\")) {\n return \"sqlite\";\n } else if (configContent.includes(\"createDrizzleAdapter\")) {\n // Check connection string for database type hints\n if (\n configContent.includes(\"postgres\") ||\n configContent.includes(\"postgresql\")\n ) {\n return \"postgres\";\n } else if (configContent.includes(\"mysql\")) {\n return \"mysql\";\n }\n return \"postgres\"; // Default for drizzle\n } else if (configContent.includes(\"createMongoDBAdapter\")) {\n return \"mongodb\";\n }\n } catch {\n // If we can't read config, default to memory\n }\n\n return \"memory\";\n}\n\nasync function createAuthAdapter(\n databaseType: DatabaseType,\n): Promise<AuthAdapter> {\n switch (databaseType) {\n case \"sqlite\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"postgres\":\n case \"mysql\":\n // Use SQLite for auth when using SQL databases (simpler than Redis)\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"mongodb\":\n // Use SQLite for auth when using MongoDB\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"memory\":\n default:\n return new InMemoryAuthAdapter();\n }\n}\n\nexport async function createAuthConfig(\n databaseType?: string,\n): Promise<KyroAuthConfig> {\n const distributed = getEnvBool(\"KYRO_DISTRIBUTED\", false);\n let authAdapter: AuthAdapter;\n // Distributed mode uses Redis for shared state\n if (distributed) {\n // Dynamically import to avoid pulling Redis on dev builds\n const { RedisAuthAdapter } = await import(\"./redis-adapter.js\");\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisTls = getEnvBool(\"REDIS_TLS\", false);\n const redisAdapter = new RedisAuthAdapter({ url: redisUrl, tls: redisTls });\n await redisAdapter.connect?.();\n authAdapter = redisAdapter as any;\n } else {\n const initialDbType = (databaseType || detectDatabaseType()) as any;\n authAdapter = await createAuthAdapter(initialDbType);\n if ((authAdapter as any).connect) {\n await (authAdapter as any).connect();\n }\n }\n\n const email = EmailTransport.fromEnv() || undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: any;\n let rateLimiter: any;\n let auditLogger: any;\n if (distributed) {\n // Redis-backed security features\n const redis = authAdapter as any;\n const redisClient = (redis as any).redis;\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n } else {\n lockout = new InMemoryAccountLockout({\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new InMemoryRateLimiter({\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = getEnvBool(\"AUDIT_LOG_ENABLED\", true)\n ? new InMemoryAuditLogger(getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30))\n : undefined;\n }\n\n const routes = new AuthRoutes({\n redis: authAdapter as any,\n email,\n jwtSecret: getEnv(\"JWT_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n const actualDbType = distributed\n ? \"distributed\"\n : ((databaseType || detectDatabaseType()) as string);\n return {\n authAdapter,\n databaseType: actualDbType,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nexport const authConfig = createAuthConfig();\n","import bcrypt from \"bcrypt\";\nimport jwt from \"jsonwebtoken\";\nimport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const user = await this.adapter.createUser({\n email: data.email,\n password: data.password,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.verifyPassword(\n credentials.email,\n credentials.password,\n );\n if (!user) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const decoded = jwt.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n user.email,\n currentPassword,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n await this.adapter.updateUser(userId, { password: newPassword });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.updateUser(user.id, { password: newPassword });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private generateToken(user: AuthUser): string {\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwt.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig, DatabaseType } from \"./config.js\";\n\nexport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nexport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nexport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nexport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import { writeFile, mkdir, unlink, readdir, stat, rename } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join, extname, basename } from \"path\";\nimport { createHash } from \"crypto\";\nimport type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface LocalStorageConfig {\n uploadDir: string;\n baseUrl?: string;\n}\n\nexport function createLocalStorage(\n config: LocalStorageConfig,\n): StorageProvider {\n const { uploadDir, baseUrl = \"/uploads\" } = config;\n\n async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n }\n\n function getMimeType(filename: string): string {\n const ext = extname(filename).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".png\": \"image/png\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\":\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\":\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".zip\": \"application/zip\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n }\n\n async function getImageDimensions(\n buffer: Buffer,\n ): Promise<{ width?: number; height?: number }> {\n try {\n const header = buffer.toString(\"hex\", 0, 8);\n if (header.startsWith(\"89504e47\")) {\n const width = buffer.readUInt32BE(16);\n const height = buffer.readUInt32BE(20);\n return { width, height };\n }\n if (header.startsWith(\"ffd8\")) {\n let offset = 2;\n while (offset < buffer.length) {\n if (buffer[offset] !== 0xff) break;\n const marker = buffer[offset + 1];\n if (marker === 0xc0 || marker === 0xc2) {\n const height = buffer.readUInt16BE(offset + 5);\n const width = buffer.readUInt16BE(offset + 7);\n return { width, height };\n }\n offset += 2 + buffer.readUInt16BE(offset + 2);\n }\n }\n } catch {\n // Ignore errors\n }\n return {};\n }\n\n return {\n name: \"local\",\n displayName: \"Local Storage\",\n supportsDynamicResize: true,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n await ensureDir(uploadDir);\n\n const buffer = Buffer.from(await file.arrayBuffer());\n const hash = createHash(\"md5\").update(buffer).digest(\"hex\");\n const ext = extname(file.name);\n const filename = options?.filename || `${hash}${ext}`;\n const folder = options?.folder || \"\";\n const targetDir = folder ? join(uploadDir, folder) : uploadDir;\n\n await ensureDir(targetDir);\n\n const filepath = join(targetDir, filename);\n await writeFile(filepath, buffer);\n\n const dimensions = file.type.startsWith(\"image/\")\n ? await getImageDimensions(buffer)\n : {};\n\n const normalizedBaseUrl = baseUrl || \"/uploads\";\n const urlPath = folder ? `/${folder}/${filename}` : `/${filename}`;\n const url = normalizedBaseUrl + urlPath;\n\n return {\n id: hash,\n filename,\n originalName: file.name,\n mimeType: file.type || getMimeType(file.name),\n size: buffer.length,\n url,\n thumbnailUrl: file.type.startsWith(\"image/\") ? url : undefined,\n folder: folder || undefined,\n provider: \"local\",\n metadata: {\n ...dimensions,\n ...options?.metadata,\n },\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(\n url: string,\n options?: UploadOptions,\n ): Promise<UploadedFile> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.statusText}`);\n }\n\n const blob = await response.blob();\n const contentDisposition = response.headers.get(\"content-disposition\");\n let filename = options?.filename;\n\n if (!filename && contentDisposition) {\n const match = contentDisposition.match(\n /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/,\n );\n if (match) {\n filename = match[1].replace(/['\"]/g, \"\");\n }\n }\n\n if (!filename) {\n filename = basename(new URL(url).pathname);\n }\n\n const file = new File([blob], filename, {\n type: blob.type || getMimeType(filename),\n });\n return this.upload!(file, options);\n },\n\n async delete(url: string): Promise<void> {\n const filepath = join(uploadDir, url.replace(baseUrl + \"/\", \"\"));\n try {\n await unlink(filepath);\n } catch {\n // Ignore if file doesn't exist\n }\n },\n\n async rename(oldUrl: string, newFilename: string): Promise<string> {\n const oldPath = join(uploadDir, oldUrl.replace(baseUrl + \"/\", \"\"));\n const newPath = join(uploadDir, newFilename);\n await rename(oldPath, newPath);\n return `${baseUrl}/${newFilename}`;\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms || Object.keys(transforms).length === 0) return url;\n\n const params = new URLSearchParams({ url });\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"f\", transforms.format);\n\n return `/api/media/resize?${params.toString()}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n if (!file.mimeType.startsWith(\"image/\")) return \"\";\n return this.getImageUrl(file.url, { width: 400, height: 400 });\n },\n\n async list(prefix?: string): Promise<UploadedFile[]> {\n const dir = prefix ? join(uploadDir, prefix) : uploadDir;\n if (!existsSync(dir)) return [];\n\n const files: UploadedFile[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const filepath = join(dir, entry.name);\n const stats = await stat(filepath);\n const url = `${baseUrl}${prefix ? `/${prefix}` : \"\"}/${entry.name}`;\n\n files.push({\n id: createHash(\"md5\").update(entry.name).digest(\"hex\"),\n filename: entry.name,\n originalName: entry.name,\n mimeType: getMimeType(entry.name),\n size: stats.size,\n url,\n provider: \"local\",\n createdAt: stats.birthtime.toISOString(),\n });\n }\n }\n\n return files;\n },\n\n async exists(url: string): Promise<boolean> {\n const filepath = join(uploadDir, url.replace(baseUrl + \"/\", \"\"));\n return existsSync(filepath);\n },\n };\n}\n\nfunction getMimeType(filename: string): string {\n const ext = extname(filename).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".png\": \"image/png\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".pdf\": \"application/pdf\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n}\n","import {\n S3Client,\n PutObjectCommand,\n DeleteObjectCommand,\n CopyObjectCommand,\n ListObjectsV2Command,\n HeadObjectCommand,\n} from \"@aws-sdk/client-s3\";\nimport type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport type S3ProviderType =\n | \"aws\"\n | \"r2\"\n | \"gcs\"\n | \"digitalocean\"\n | \"backblaze\"\n | \"wasabi\";\n\n/**\n * Extract the Public Dev URL ID from either a full URL or just the ID.\n * Handles formats like:\n * - https://bucket.pub-xxx.r2.dev -> pub-xxx\n * - pub-xxx -> pub-xxx\n * - empty/undefined -> \"\"\n */\nfunction extractPublicDevUrlId(url?: string): string {\n if (!url) return \"\";\n if (url.startsWith(\"pub-\")) return url;\n const match = url.match(/pub-[a-zA-Z0-9]+/i);\n return match ? match[0] : \"\";\n}\n\nexport interface S3StorageConfig {\n provider: S3ProviderType;\n bucket: string;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n endpoint?: string;\n cdnUrl?: string;\n prefix?: string;\n accountId?: string;\n publicDevUrl?: string;\n}\n\nfunction getPublicUrl(key: string, config: S3StorageConfig): string {\n // Ensure key has proper path format\n const normalizedKey = key.startsWith(\"/\") ? key.slice(1) : key;\n\n if (config.cdnUrl) {\n const cdn = config.cdnUrl.replace(/\\/$/, \"\");\n return `${cdn}/${normalizedKey}`;\n }\n\n switch (config.provider) {\n case \"r2\": {\n // Handle both ID and full URL for publicDevUrl\n const pubId = extractPublicDevUrlId(config.publicDevUrl);\n if (pubId) {\n return `https://${pubId}.r2.dev/${normalizedKey}`;\n }\n return `https://${config.bucket}.${config.accountId}.r2.cloudflarestorage.com/${normalizedKey}`;\n }\n case \"gcs\":\n return `https://storage.googleapis.com/${config.bucket}/${normalizedKey}`;\n case \"digitalocean\":\n return `https://${config.bucket}.${config.region}.cdn.digitaloceanspaces.com/${normalizedKey}`;\n case \"backblaze\":\n return `https://${config.bucket}.s3.backblazeb2.com/${normalizedKey}`;\n case \"wasabi\":\n return `https://${config.bucket}.s3.wasabisys.com/${normalizedKey}`;\n case \"aws\":\n default:\n return `https://${config.bucket}.s3.${config.region}.amazonaws.com/${normalizedKey}`;\n }\n}\n\nfunction getUrlPrefix(config: S3StorageConfig): string {\n if (config.cdnUrl) {\n return config.cdnUrl.replace(/\\/$/, \"\") + \"/\";\n }\n\n switch (config.provider) {\n case \"r2\": {\n const pubId = extractPublicDevUrlId(config.publicDevUrl);\n if (pubId) {\n return `https://${pubId}.r2.dev/`;\n }\n return `https://${config.bucket}.${config.accountId}.r2.cloudflarestorage.com/`;\n }\n case \"gcs\":\n return `https://storage.googleapis.com/${config.bucket}/`;\n case \"digitalocean\":\n return `https://${config.bucket}.${config.region}.cdn.digitaloceanspaces.com/`;\n case \"backblaze\":\n return `https://${config.bucket}.s3.backblazeb2.com/`;\n case \"wasabi\":\n return `https://${config.bucket}.s3.wasabisys.com/`;\n case \"aws\":\n default:\n return `https://${config.bucket}.s3.${config.region}.amazonaws.com/`;\n }\n}\n\nfunction getDisplayName(provider: S3ProviderType): string {\n switch (provider) {\n case \"r2\":\n return \"Cloudflare R2\";\n case \"gcs\":\n return \"Google Cloud Storage\";\n case \"digitalocean\":\n return \"DigitalOcean Spaces\";\n case \"backblaze\":\n return \"Backblaze B2\";\n case \"wasabi\":\n return \"Wasabi\";\n case \"aws\":\n default:\n return \"AWS S3\";\n }\n}\n\nexport function createS3Storage(config: S3StorageConfig): StorageProvider {\n console.log(\"[createS3Storage] Creating provider:\", config.provider);\n console.log(\"[createS3Storage] Credentials:\", {\n accessKeyId: config.accessKeyId ? \"SET\" : \"UNDEFINED\",\n secretAccessKey: config.secretAccessKey ? \"SET\" : \"UNDEFINED\",\n bucket: config.bucket,\n accountId: config.accountId,\n endpoint: config.endpoint,\n });\n\n // For R2 and other S3-compatible providers, use custom HTTP client with proper TLS\n const client = new S3Client({\n region: config.region || \"auto\",\n endpoint: config.endpoint,\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n forcePathStyle: true,\n tls: true,\n // R2 requires specific SSL configuration\n ...(config.provider === \"r2\" && {\n requestHandler:\n new (require(\"@smithy/node-http-handler\").NodeHttpHandler)({\n connectionTimeout: 10000,\n socketTimeout: 10000,\n }),\n }),\n });\n\n const getKey = (path: string) => {\n const prefix = config.prefix ? `${config.prefix}/` : \"\";\n return `${prefix}${path}`.replace(/\\/+/g, \"/\");\n };\n\n const getUrl = (key: string) => getPublicUrl(key, config);\n\n return {\n name: config.provider,\n displayName: getDisplayName(config.provider),\n supportsDynamicResize: true,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n const key = getKey(\n `${options?.folder ? `${options.folder}/` : \"\"}${options?.filename || file.name}`,\n );\n\n const buffer = Buffer.from(await file.arrayBuffer());\n\n await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: key,\n Body: buffer,\n ContentType: file.type,\n Metadata: options?.metadata as Record<string, string>,\n }),\n );\n\n const head = await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: key,\n }),\n );\n\n return {\n id: Buffer.from(key).toString(\"base64url\"),\n filename: options?.filename || file.name,\n originalName: file.name,\n mimeType: file.type,\n size: buffer.length,\n url: getUrl(key),\n thumbnailUrl: file.type.startsWith(\"image/\") ? getUrl(key) : undefined,\n folder: options?.folder,\n provider: config.provider,\n metadata: {\n ...options?.metadata,\n etag: head.ETag,\n },\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(url: string): Promise<UploadedFile> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const blob = await response.blob();\n const filename = url.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n return this.upload!(file);\n },\n\n async delete(url: string): Promise<void> {\n const key = url.replace(getUrlPrefix(config), \"\");\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: key,\n }),\n );\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n const oldKey = oldUrl.replace(getUrlPrefix(config), \"\");\n const newKeyWithPrefix = config.prefix\n ? `${config.prefix}/${newKey}`\n : newKey;\n\n await client.send(\n new CopyObjectCommand({\n Bucket: config.bucket,\n CopySource: `${config.bucket}/${oldKey}`,\n Key: newKeyWithPrefix,\n }),\n );\n\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: oldKey,\n }),\n );\n\n return getUrl(newKeyWithPrefix);\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms || Object.keys(transforms).length === 0) return url;\n\n const params = new URLSearchParams({ url });\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"f\", transforms.format);\n\n return `/api/media/resize?${params.toString()}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return this.getImageUrl(file.url, { width: 400, height: 400 });\n },\n\n async list(prefix?: string): Promise<UploadedFile[]> {\n const key = getKey(prefix || \"\");\n const response = await client.send(\n new ListObjectsV2Command({\n Bucket: config.bucket,\n Prefix: key,\n }),\n );\n\n return (response.Contents || []).map((item) => ({\n id: Buffer.from(item.Key || \"\").toString(\"base64url\"),\n filename: item.Key?.split(\"/\").pop() || \"\",\n originalName: item.Key?.split(\"/\").pop() || \"\",\n mimeType: \"application/octet-stream\",\n size: item.Size || 0,\n url: getUrl(item.Key || \"\"),\n provider: config.provider,\n createdAt: item.LastModified?.toISOString() || new Date().toISOString(),\n }));\n },\n\n async exists(url: string): Promise<boolean> {\n try {\n const key = url.replace(getUrlPrefix(config), \"\");\n await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: key,\n }),\n );\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n","import type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface CloudinaryConfig {\n cloudName: string;\n apiKey: string;\n apiSecret: string;\n folder?: string;\n uploadPreset?: string;\n}\n\nexport function createCloudinaryStorage(\n config: CloudinaryConfig,\n): StorageProvider {\n const getBaseUrl = () =>\n `https://api.cloudinary.com/v1_1/${config.cloudName}/upload`;\n\n // Generate signature for signed uploads\n const generateSignature = async (\n params: Record<string, string>,\n ): Promise<string> => {\n const crypto = await import(\"crypto\");\n\n // Cloudinary signs all parameters EXCEPT 'file', 'resource_type', and 'api_key'\n // Sort keys alphabetically\n const sortedParams = Object.keys(params)\n .sort()\n .map((key) => `${key}=${params[key]}`)\n .join(\"&\");\n\n // Sign with api_secret\n return crypto\n .createHash(\"sha256\")\n .update(sortedParams + config.apiSecret)\n .digest(\"hex\");\n };\n\n return {\n name: \"cloudinary\",\n displayName: \"Cloudinary\",\n supportsDynamicResize: true,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n const formData = new FormData();\n formData.append(\"file\", file);\n\n // Use upload preset if provided, otherwise try signed upload\n if (config.uploadPreset) {\n formData.append(\"upload_preset\", config.uploadPreset);\n } else {\n // Use signed upload with timestamp\n const timestamp = Math.round(Date.now() / 1000);\n\n // Build params for signature (excluding file and api_key)\n const signatureParams: Record<string, string> = {\n timestamp: String(timestamp),\n };\n if (options?.folder || config.folder) {\n signatureParams.folder = options?.folder || config.folder || \"\";\n }\n\n // Generate signature\n const signature = await generateSignature(signatureParams);\n\n formData.append(\"timestamp\", String(timestamp));\n formData.append(\"signature\", signature);\n formData.append(\"api_key\", config.apiKey);\n }\n\n if (options?.folder || config.folder) {\n formData.append(\"folder\", options?.folder || config.folder || \"\");\n }\n\n const response = await fetch(getBaseUrl(), {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n const error = (await response.json()) as {\n error?: { message?: string };\n };\n throw new Error(\n `Cloudinary upload failed: ${error.error?.message || response.statusText}`,\n );\n }\n\n const data = (await response.json()) as {\n public_id: string;\n format: string;\n original_filename?: string;\n bytes: number;\n secure_url: string;\n width: number;\n height: number;\n };\n\n return {\n id: data.public_id,\n filename: `${data.public_id}.${data.format}`,\n originalName: data.original_filename || file.name,\n mimeType: file.type || `image/${data.format}`,\n size: data.bytes,\n url: data.secure_url,\n thumbnailUrl: this.getImageUrl(data.secure_url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n }),\n width: data.width,\n height: data.height,\n folder: options?.folder || config.folder,\n provider: \"cloudinary\",\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(\n url: string,\n options?: UploadOptions,\n ): Promise<UploadedFile> {\n const formData = new FormData();\n formData.append(\"file\", url);\n formData.append(\"upload_preset\", \"ml_default\");\n if (options?.folder || config.folder) {\n formData.append(\"folder\", options?.folder || config.folder || \"\");\n }\n\n const response = await fetch(getBaseUrl(), {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) throw new Error(\"Cloudinary upload failed\");\n const data = (await response.json()) as {\n public_id: string;\n format: string;\n original_filename?: string;\n bytes: number;\n secure_url: string;\n width: number;\n height: number;\n };\n\n return {\n id: data.public_id,\n filename: `${data.public_id}.${data.format}`,\n originalName: data.original_filename || url.split(\"/\").pop() || \"file\",\n mimeType: `image/${data.format}`,\n size: data.bytes,\n url: data.secure_url,\n thumbnailUrl: this.getImageUrl(data.secure_url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n }),\n width: data.width,\n height: data.height,\n provider: \"cloudinary\",\n createdAt: new Date().toISOString(),\n };\n },\n\n async delete(id: string): Promise<void> {\n try {\n // Extract public_id from URL (id is actually the full URL in our case)\n const parts = id.split(\"/image/upload/\");\n if (parts.length !== 2) {\n console.warn(\"[Cloudinary delete] Could not parse URL:\", id);\n return;\n }\n\n const publicId = parts[1]\n .replace(/^v\\d+\\//, \"\")\n .replace(/\\.[^.]+$/, \"\");\n\n // Generate signature for deletion\n const timestamp = Math.round(Date.now() / 1000);\n const signatureParams: Record<string, string> = {\n timestamp: String(timestamp),\n public_id: publicId,\n };\n\n const sortedParams = Object.keys(signatureParams)\n .sort()\n .map((key) => `${key}=${signatureParams[key]}`)\n .join(\"&\");\n\n const crypto = await import(\"crypto\");\n const signature = crypto\n .createHash(\"sha256\")\n .update(sortedParams + config.apiSecret)\n .digest(\"hex\");\n\n // Delete using Cloudinary destroy API\n const deleteUrl = `https://api.cloudinary.com/v1_1/${config.cloudName}/image/destroy`;\n const formData = new FormData();\n formData.append(\"public_id\", publicId);\n formData.append(\"timestamp\", String(timestamp));\n formData.append(\"signature\", signature);\n formData.append(\"api_key\", config.apiKey);\n\n const response = await fetch(deleteUrl, {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.warn(\"[Cloudinary delete] Failed:\", error);\n }\n } catch (e: any) {\n console.warn(\"[Cloudinary delete] Error:\", e.message);\n }\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n let version = \"\";\n let newPublicId = newKey.replace(/\\.[^.]+$/, \"\");\n let folder = \"\";\n\n try {\n // Extract old public_id from URL\n const parts = oldUrl.split(\"/image/upload/\");\n if (parts.length !== 2) {\n console.warn(\"[Cloudinary rename] Could not parse old URL:\", oldUrl);\n return oldUrl;\n }\n\n // Extract folder path and filename from old public_id\n const urlPath = parts[1];\n\n // First remove version (e.g., v1776872613/) from the path\n const versionMatch = urlPath.match(/^(v\\d+)\\//);\n version = versionMatch ? versionMatch[1] : \"\";\n\n // Now remove version from urlPath to get clean public_id\n const publicIdWithoutVersion = urlPath\n .replace(/^v\\d+\\//, \"\")\n .replace(/\\.[^.]+$/, \"\");\n\n // Extract folder path (everything before the last segment)\n const folderParts = publicIdWithoutVersion.split(\"/\");\n folder =\n folderParts.length > 1 ? folderParts.slice(0, -1).join(\"/\") : \"\";\n\n // Build new public_id: folder + new filename (without extension)\n const newFilename = newKey.replace(/\\.[^.]+$/, \"\");\n newPublicId = folder ? `${folder}/${newFilename}` : newFilename;\n\n console.log(\"[Cloudinary rename]\", {\n urlPath,\n version,\n publicIdWithoutVersion,\n folder,\n newPublicId,\n });\n\n // Generate signature for rename operation\n const timestamp = Math.round(Date.now() / 1000);\n const signatureParams: Record<string, string> = {\n from_public_id: publicIdWithoutVersion,\n to_public_id: newPublicId,\n timestamp: String(timestamp),\n };\n\n const sortedParams = Object.keys(signatureParams)\n .sort()\n .map((key) => `${key}=${signatureParams[key]}`)\n .join(\"&\");\n\n const crypto = await import(\"crypto\");\n const signature = crypto\n .createHash(\"sha256\")\n .update(sortedParams + config.apiSecret)\n .digest(\"hex\");\n\n // Rename using Cloudinary rename API\n const formData = new FormData();\n formData.append(\"from_public_id\", publicIdWithoutVersion);\n formData.append(\"to_public_id\", newPublicId);\n formData.append(\"timestamp\", String(timestamp));\n formData.append(\"signature\", signature);\n formData.append(\"api_key\", config.apiKey);\n\n const response = await fetch(\n `https://api.cloudinary.com/v1_1/${config.cloudName}/image/rename`,\n {\n method: \"POST\",\n body: formData,\n },\n );\n\n if (response.ok) {\n const data = (await response.json()) as { secure_url: string };\n console.log(\"[Cloudinary rename] Success:\", data.secure_url);\n return data.secure_url;\n } else {\n const error = await response.json();\n console.warn(\"[Cloudinary rename] Failed:\", error);\n // Return new URL with version\n const versionStr = version ? `/${version}/` : \"/\";\n return `https://res.cloudinary.com/${config.cloudName}/image/upload${versionStr}${newPublicId}.${newKey.split(\".\").pop()}`;\n }\n } catch (e: any) {\n console.warn(\"[Cloudinary rename] Error:\", e.message);\n // Return new URL on error with version\n const versionStr = version ? `/${version}/` : \"/\";\n return `https://res.cloudinary.com/${config.cloudName}/image/upload${versionStr}${newPublicId}.${newKey.split(\".\").pop()}`;\n }\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms) return url;\n\n // Cloudinary transformation URL structure:\n // res.cloudinary.com/cloud_name/image/upload/t_transform/v1/public_id.jpg\n const parts = url.split(\"/upload/\");\n if (parts.length !== 2) return url;\n\n const transformationArr: string[] = [];\n if (transforms.width) transformationArr.push(`w_${transforms.width}`);\n if (transforms.height) transformationArr.push(`h_${transforms.height}`);\n if (transforms.fit) {\n const fitMap: Record<string, string> = {\n crop: \"c_fill\",\n clip: \"c_fit\",\n scale: \"c_scale\",\n fill: \"c_fill\",\n };\n transformationArr.push(fitMap[transforms.fit] || \"c_limit\");\n }\n if (transforms.quality) transformationArr.push(`q_${transforms.quality}`);\n if (transforms.format) transformationArr.push(`f_${transforms.format}`);\n\n const transformationStr = transformationArr.join(\",\");\n return `${parts[0]}/upload/${transformationStr}/${parts[1]}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return this.getImageUrl(file.url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n });\n },\n\n async list(): Promise<UploadedFile[]> {\n return []; // Requires Admin API\n },\n\n async exists(url: string): Promise<boolean> {\n const response = await fetch(url, { method: \"HEAD\" });\n return response.ok;\n },\n };\n}\n","import type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface ImgixConfig {\n domain: string;\n signKey?: string;\n defaultParameters?: Record<string, string>;\n}\n\nexport function createImgixStorage(config: ImgixConfig): StorageProvider {\n const signUrl = (path: string, params: URLSearchParams): string => {\n if (!config.signKey) return path;\n\n const signer = new TextEncoder();\n const key = signer.encode(config.signKey);\n const data = signer.encode(path + params.toString());\n\n let hash = 0;\n const combined = new Uint8Array(key.length + data.length);\n combined.set(key);\n combined.set(data, key.length);\n\n for (let i = 0; i < combined.length; i++) {\n hash = ((hash << 5) - hash + combined[i]) | 0;\n }\n\n params.set(\"s\", Math.abs(hash).toString(16));\n return path;\n };\n\n return {\n name: \"imgix\",\n displayName: \"Imgix\",\n supportsDynamicResize: true,\n\n async upload(_file: File, _options?: UploadOptions): Promise<UploadedFile> {\n throw new Error(\n \"Imgix is a transformation service. Use another provider for uploads.\",\n );\n },\n\n async uploadFromUrl(\n url: string,\n options?: UploadOptions,\n ): Promise<UploadedFile> {\n const filename = options?.filename || url.split(\"/\").pop() || \"file\";\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const blob = await response.blob();\n const file = new File([blob], filename, { type: blob.type });\n\n return {\n id: Buffer.from(url).toString(\"base64\").slice(0, 20),\n filename,\n originalName: filename,\n mimeType: blob.type,\n size: blob.size,\n url: this.getImageUrl(url),\n thumbnailUrl: this.getImageUrl(url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n }),\n provider: \"imgix\",\n createdAt: new Date().toISOString(),\n };\n },\n\n async delete(_url: string): Promise<void> {\n // Imgix doesn't delete - it's a proxy/transformation service\n },\n\n async rename(_oldUrl: string, newKey: string): Promise<string> {\n // Imgix is a proxy service, not a storage provider\n // Return new URL derived from newKey\n return `https://${config.domain}/${newKey}`;\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n const parsed = new URL(url);\n const params = new URLSearchParams(parsed.search);\n\n // Apply default parameters\n if (config.defaultParameters) {\n Object.entries(config.defaultParameters).forEach(([key, value]) => {\n if (!params.has(key)) {\n params.set(key, value);\n }\n });\n }\n\n // Apply transformations\n if (transforms) {\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"fm\", transforms.format);\n if (transforms.fit) params.set(\"fit\", transforms.fit);\n if (transforms.blur) params.set(\"blur\", String(transforms.blur));\n if (transforms.sharpen) params.set(\"sharp\", String(transforms.sharpen));\n }\n\n // Ensure secure URLs\n params.set(\"auto\", \"compress,format\");\n\n // Sign the URL if needed\n let path = parsed.pathname + \"?\" + params.toString();\n if (config.signKey) {\n path = signUrl(parsed.pathname + params.toString(), params);\n }\n\n return `https://${config.domain}${parsed.pathname}${params.toString() ? \"?\" + params.toString() : \"\"}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return this.getImageUrl(file.url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n });\n },\n\n async list(): Promise<UploadedFile[]> {\n return [];\n },\n\n async exists(url: string): Promise<boolean> {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n return response.ok;\n } catch {\n return false;\n }\n },\n };\n}\n","import { Readable } from \"stream\";\nimport { Client, FileInfo } from \"basic-ftp\";\nimport type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface FtpStorageConfig {\n host: string;\n port: number;\n user: string;\n password: string;\n secure: boolean;\n baseUrl: string;\n prefix?: string;\n type: \"ftp\" | \"sftp\";\n}\n\nexport function createFtpStorage(config: FtpStorageConfig): StorageProvider {\n let client: InstanceType<typeof Client> | null = null;\n\n async function getClient(): Promise<InstanceType<typeof Client>> {\n if (!client) {\n client = new Client(60000, { allowSeparateTransferHost: true });\n client.ftp.verbose = false;\n\n await client.access({\n host: config.host,\n port: config.port || 21,\n user: config.user,\n password: config.password,\n secure: config.secure,\n secureOptions: {},\n });\n }\n return client;\n }\n\n const getKey = (path: string) => {\n const prefix = config.prefix ? `${config.prefix}/` : \"\";\n return `${prefix}${path}`.replace(/\\/+/g, \"/\");\n };\n\n const getUrl = (key: string) => {\n const base = config.baseUrl.replace(/\\/$/, \"\");\n return `${base}/${key}`;\n };\n\n const getUrlPrefix = () => {\n const base = config.baseUrl.replace(/\\/$/, \"\");\n return base + \"/\";\n };\n\n return {\n name: config.type,\n displayName: config.type === \"sftp\" ? \"SFTP Storage\" : \"FTP Storage\",\n supportsDynamicResize: false,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n const ftp = await getClient();\n const key = getKey(\n `${options?.folder ? `${options.folder}/` : \"\"}${options?.filename || file.name}`,\n );\n\n const buffer = Buffer.from(await file.arrayBuffer());\n\n // Create directory structure if needed\n const parts = key.split(\"/\").slice(0, -1);\n let currentPath = \"\";\n for (const part of parts) {\n currentPath = currentPath ? `${currentPath}/${part}` : part;\n try {\n await ftp.ensureDir(currentPath);\n } catch {\n // Directory may already exist\n }\n }\n\n const readable = Readable.from(buffer);\n await ftp.uploadFrom(readable, key);\n\n return {\n id: Buffer.from(key).toString(\"base64url\"),\n filename: options?.filename || file.name,\n originalName: file.name,\n mimeType: file.type,\n size: buffer.length,\n url: getUrl(key),\n thumbnailUrl: file.type.startsWith(\"image/\") ? getUrl(key) : undefined,\n folder: options?.folder,\n provider: config.type,\n metadata: options?.metadata,\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(url: string): Promise<UploadedFile> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const blob = await response.blob();\n const filename = url.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n return this.upload!(file);\n },\n\n async delete(url: string): Promise<void> {\n const ftp = await getClient();\n const key = url.replace(getUrlPrefix(), \"\");\n await ftp.remove(key);\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n const ftp = await getClient();\n const oldKey = oldUrl.replace(getUrlPrefix(), \"\");\n const fullPath = config.prefix ? `${config.prefix}/${newKey}` : newKey;\n\n await ftp.rename(oldKey, fullPath);\n\n return getUrl(fullPath);\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms || Object.keys(transforms).length === 0) return url;\n\n const params = new URLSearchParams({ url });\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"f\", transforms.format);\n\n return `/api/media/resize?${params.toString()}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return file.url;\n },\n\n async list(prefix?: string): Promise<UploadedFile[]> {\n const ftp = await getClient();\n const key = getKey(prefix || \"\");\n\n let items: FileInfo[];\n try {\n items = await ftp.list(key);\n } catch {\n return [];\n }\n\n return items\n .filter((item) => item.type === 0)\n .map((item) => ({\n id: Buffer.from(`${key}/${item.name}`).toString(\"base64url\"),\n filename: item.name,\n originalName: item.name,\n mimeType: \"application/octet-stream\",\n size: Number(item.size) || 0,\n url: getUrl(`${key}/${item.name}`.replace(/\\/+/g, \"/\")),\n provider: config.type,\n createdAt: item.modifiedAt\n ? item.modifiedAt.toISOString()\n : new Date().toISOString(),\n }));\n },\n\n async exists(url: string): Promise<boolean> {\n const ftp = await getClient();\n const key = url.replace(getUrlPrefix(), \"\");\n try {\n await ftp.size(key);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n","// ============================================================================\n// Storage Provider Interface\n// ============================================================================\n\nexport interface UploadOptions {\n folder?: string;\n filename?: string;\n mimeType?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UploadedFile {\n id: string;\n filename: string;\n originalName: string;\n mimeType: string;\n size: number;\n url: string;\n thumbnailUrl?: string;\n width?: number;\n height?: number;\n folder?: string;\n provider: string;\n metadata?: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface ImageTransforms {\n width?: number;\n height?: number;\n fit?: \"clip\" | \"crop\" | \"fill\" | \"fillmax\" | \"scale\" | \"max\" | \"min\";\n format?: \"webp\" | \"avif\" | \"jpeg\" | \"jpg\" | \"png\" | \"gif\";\n quality?: number;\n blur?: number;\n sharpen?: number;\n}\n\nexport interface StorageProvider {\n name: string;\n displayName: string;\n supportsDynamicResize: boolean;\n\n upload(file: File, options?: UploadOptions): Promise<UploadedFile>;\n uploadFromUrl(url: string, options?: UploadOptions): Promise<UploadedFile>;\n delete(url: string): Promise<void>;\n rename(oldUrl: string, newKey: string): Promise<string>;\n\n getImageUrl(url: string, transforms?: ImageTransforms): string;\n generateThumbnail(\n file: UploadedFile,\n size: { width: number; height: number },\n ): Promise<string>;\n\n list(prefix?: string): Promise<UploadedFile[]>;\n exists(url: string): Promise<boolean>;\n}\n\nimport type { ConfigService } from \"../config/ConfigService.js\";\nimport path from \"path\";\nimport { createLocalStorage } from \"./local.js\";\nimport { createS3Storage, type S3ProviderType } from \"./s3.js\";\nimport { createCloudinaryStorage } from \"./cloudinary.js\";\nimport { createImgixStorage } from \"./imgix.js\";\nimport { createBunnyStorage } from \"./bunny.js\";\nimport { createFtpStorage } from \"./ftp.js\";\n\nexport async function resolveProvider(\n configService: ConfigService,\n): Promise<StorageProvider> {\n const config = configService.getStorageConfig();\n\n switch (config.type) {\n case \"aws\":\n return createS3Storage({\n provider: \"aws\",\n bucket: config.s3.bucket || \"\",\n region: config.s3.region || \"us-east-1\",\n accessKeyId: config.s3.accessKeyId || \"\",\n secretAccessKey: config.s3.secretAccessKey || \"\",\n endpoint: config.s3.endpoint,\n cdnUrl: config.s3.cdnUrl,\n prefix: config.s3.prefix,\n });\n\n case \"r2\":\n return createS3Storage({\n provider: \"r2\",\n bucket: config.r2.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.r2.accessKeyId || \"\",\n secretAccessKey: config.r2.secretAccessKey || \"\",\n accountId: config.r2.accountId || \"\",\n publicDevUrl: config.r2.publicDevUrl,\n endpoint: `https://${config.r2.accountId || \"\"}.r2.cloudflarestorage.com`,\n cdnUrl: config.r2.cdnUrl,\n prefix: config.r2.prefix,\n });\n\n case \"gcs\":\n return createS3Storage({\n provider: \"gcs\",\n bucket: config.gcs.bucket || \"\",\n region: config.gcs.projectId || \"auto\",\n accessKeyId: config.gcs.clientEmail || \"\",\n secretAccessKey: config.gcs.privateKey || \"\",\n cdnUrl: config.gcs.cdnUrl,\n prefix: config.gcs.prefix,\n });\n\n case \"digitalocean\":\n return createS3Storage({\n provider: \"digitalocean\",\n bucket: config.digitalocean.bucket || \"\",\n region: config.digitalocean.region || \"nyc3\",\n accessKeyId: config.digitalocean.accessKeyId || \"\",\n secretAccessKey: config.digitalocean.secretAccessKey || \"\",\n endpoint: `https://${config.digitalocean.region || \"nyc3\"}.digitaloceanspaces.com`,\n cdnUrl: config.digitalocean.cdnUrl,\n prefix: config.digitalocean.prefix,\n });\n\n case \"backblaze\":\n return createS3Storage({\n provider: \"backblaze\",\n bucket: config.backblaze.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.backblaze.applicationKeyId || \"\",\n secretAccessKey: config.backblaze.applicationKey || \"\",\n accountId: config.backblaze.accountId || \"\",\n endpoint: `https://s3.backblazeb2.com`,\n cdnUrl: config.backblaze.cdnUrl,\n prefix: config.backblaze.prefix,\n });\n\n case \"wasabi\":\n return createS3Storage({\n provider: \"wasabi\",\n bucket: config.wasabi.bucket || \"\",\n region: config.wasabi.region || \"us-east-1\",\n accessKeyId: config.wasabi.accessKeyId || \"\",\n secretAccessKey: config.wasabi.secretAccessKey || \"\",\n endpoint: `https://s3.${config.wasabi.region || \"us-east-1\"}.wasabisys.com`,\n cdnUrl: config.wasabi.cdnUrl,\n prefix: config.wasabi.prefix,\n });\n\n case \"ftp\":\n case \"sftp\":\n return createFtpStorage({\n host: config.ftp?.host || \"\",\n port: config.ftp?.port || 21,\n user: config.ftp?.user || \"\",\n password: config.ftp?.password || \"\",\n secure: config.ftp?.secure || false,\n baseUrl: config.ftp?.baseUrl || \"\",\n prefix: config.ftp?.prefix,\n type: \"ftp\" as const,\n });\n\n case \"cloudinary\":\n return createCloudinaryStorage({\n cloudName: config.cloudinary.cloudName || \"\",\n apiKey: config.cloudinary.apiKey || \"\",\n apiSecret: config.cloudinary.apiSecret || \"\",\n folder: config.cloudinary.folder,\n });\n\n case \"imgix\":\n return createImgixStorage({\n domain: config.imgix.domain || \"\",\n signKey: config.imgix.signKey,\n });\n\n case \"local\":\n default:\n return createLocalStorage({\n uploadDir:\n config.local.uploadDir ||\n path.join(process.cwd(), \"public\", \"uploads\"),\n baseUrl: config.local.baseUrl || \"/uploads\",\n });\n }\n}\n\n// ============================================================================\n// Base Adapter\n// ============================================================================\n\nexport function createBaseStorageAdapter(): Partial<StorageProvider> {\n return {\n upload: async (file: File, options?: UploadOptions) => {\n throw new Error(\"Not implemented\");\n },\n uploadFromUrl: async (url: string) => {\n throw new Error(\"Not implemented\");\n },\n delete: async (url: string) => {\n throw new Error(\"Not implemented\");\n },\n getImageUrl: (url: string) => url,\n generateThumbnail: async (file: UploadedFile) => file.url,\n list: async () => [],\n exists: async () => false,\n };\n}\n\nexport async function resolveProviderWithConfig(\n config: any,\n): Promise<StorageProvider> {\n if (!config) {\n console.warn(\"[resolveProviderWithConfig] No config, using local\");\n return createLocalStorage({\n uploadDir: path.join(process.cwd(), \"public\", \"uploads\"),\n baseUrl: \"/uploads\",\n });\n }\n\n console.log(\"[resolveProviderWithConfig] Creating provider:\", config.type);\n switch (config.type) {\n case \"aws\":\n return createS3Storage({\n provider: \"aws\",\n bucket: config.s3?.bucket || \"\",\n region: config.s3?.region || \"us-east-1\",\n accessKeyId: config.s3?.accessKeyId || \"\",\n secretAccessKey: config.s3?.secretAccessKey || \"\",\n endpoint: config.s3?.endpoint,\n cdnUrl: config.s3?.cdnUrl,\n prefix: config.s3?.prefix,\n });\n case \"r2\":\n return createS3Storage({\n provider: \"r2\",\n bucket: config.r2?.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.r2?.accessKeyId || \"\",\n secretAccessKey: config.r2?.secretAccessKey || \"\",\n accountId: config.r2?.accountId || \"\",\n publicDevUrl: config.r2?.publicDevUrl,\n endpoint: `https://${config.r2?.accountId || \"\"}.r2.cloudflarestorage.com`,\n cdnUrl: config.r2?.cdnUrl,\n prefix: config.r2?.prefix,\n });\n case \"gcs\":\n return createS3Storage({\n provider: \"gcs\",\n bucket: config.gcs?.bucket || \"\",\n region: config.gcs?.projectId || \"auto\",\n accessKeyId: config.gcs?.clientEmail || \"\",\n secretAccessKey: config.gcs?.privateKey || \"\",\n cdnUrl: config.gcs?.cdnUrl,\n prefix: config.gcs?.prefix,\n });\n case \"digitalocean\":\n return createS3Storage({\n provider: \"digitalocean\",\n bucket: config.digitalocean?.bucket || \"\",\n region: config.digitalocean?.region || \"nyc3\",\n accessKeyId: config.digitalocean?.accessKeyId || \"\",\n secretAccessKey: config.digitalocean?.secretAccessKey || \"\",\n cdnUrl: config.digitalocean?.cdnUrl,\n prefix: config.digitalocean?.prefix,\n });\n case \"backblaze\":\n return createS3Storage({\n provider: \"backblaze\",\n bucket: config.backblaze?.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.backblaze?.applicationKeyId || \"\",\n secretAccessKey: config.backblaze?.applicationKey || \"\",\n cdnUrl: config.backblaze?.cdnUrl,\n prefix: config.backblaze?.prefix,\n });\n case \"wasabi\":\n return createS3Storage({\n provider: \"wasabi\",\n bucket: config.wasabi?.bucket || \"\",\n region: config.wasabi?.region || \"us-east-1\",\n accessKeyId: config.wasabi?.accessKeyId || \"\",\n secretAccessKey: config.wasabi?.secretAccessKey || \"\",\n cdnUrl: config.wasabi?.cdnUrl,\n prefix: config.wasabi?.prefix,\n });\n case \"cloudinary\":\n return createCloudinaryStorage({\n cloudName: config.cloudinary?.cloudName || \"\",\n apiKey: config.cloudinary?.apiKey || \"\",\n apiSecret: config.cloudinary?.apiSecret || \"\",\n folder: config.cloudinary?.folder,\n });\n case \"ftp\":\n case \"sftp\": {\n const ftpConf = config.ftp || config;\n return createFtpStorage({\n type: \"ftp\" as const,\n host: ftpConf.host || \"\",\n port: ftpConf.port || 21,\n user: ftpConf.user || \"\",\n password: ftpConf.password || \"\",\n secure: ftpConf.secure || false,\n baseUrl: ftpConf.baseUrl || \"\",\n prefix: ftpConf.prefix,\n });\n }\n case \"local\":\n default: {\n const localConfig = (config as any).local || {\n uploadDir: (config as any)[\"local.uploadDir\"],\n baseUrl: (config as any)[\"local.baseUrl\"],\n };\n\n const savedUploadDir = (localConfig?.uploadDir || \"\").trim();\n let uploadDir: string;\n if (savedUploadDir) {\n if (path.isAbsolute(savedUploadDir)) {\n uploadDir = savedUploadDir;\n } else if (\n savedUploadDir.includes(\"/\") ||\n savedUploadDir.includes(\"\\\\\")\n ) {\n uploadDir = path.resolve(process.cwd(), savedUploadDir);\n } else {\n uploadDir = path.join(process.cwd(), \"public\", savedUploadDir);\n }\n } else {\n uploadDir = path.join(process.cwd(), \"public\", \"uploads\");\n }\n\n const savedBaseUrl = (localConfig?.baseUrl || \"\").trim();\n let baseUrl: string;\n if (savedBaseUrl) {\n baseUrl = savedBaseUrl.startsWith(\"/\")\n ? savedBaseUrl\n : `/${savedBaseUrl}`;\n } else {\n baseUrl = \"/uploads\";\n }\n\n return createLocalStorage({ uploadDir, baseUrl });\n }\n }\n}\n\n// Storage Provider Exports\nexport { createLocalStorage, type LocalStorageConfig } from \"./local.js\";\nexport {\n createS3Storage,\n type S3StorageConfig,\n type S3ProviderType,\n} from \"./s3.js\";\nexport {\n createCloudinaryStorage,\n type CloudinaryConfig,\n} from \"./cloudinary.js\";\nexport { createImgixStorage, type ImgixConfig } from \"./imgix.js\";\nexport { createBunnyStorage, type BunnyStorageConfig } from \"./bunny.js\";\nexport { createFtpStorage, type FtpStorageConfig } from \"./ftp.js\";\n","import sharp from \"sharp\";\n\nexport interface ProcessedImage {\n buffer: Buffer;\n thumbnailBuffer: Buffer;\n width?: number;\n height?: number;\n format: string;\n}\n\nexport async function processImage(\n buffer: Buffer,\n): Promise<ProcessedImage> {\n const metadata = await sharp(buffer).metadata();\n \n // Create main optimized version (WebP)\n const mainImage = sharp(buffer)\n .webp({ quality: 85 });\n \n // Create thumbnail (WebP, fixed width)\n const thumbnail = sharp(buffer)\n .resize({ width: 500, withoutEnlargement: true })\n .webp({ quality: 80 });\n\n return {\n buffer: await mainImage.toBuffer(),\n thumbnailBuffer: await thumbnail.toBuffer(),\n width: metadata.width,\n height: metadata.height,\n format: \"webp\",\n };\n}\n","import {\n resolveProvider,\n resolveProviderWithConfig,\n type StorageProvider,\n type UploadedFile,\n} from \"./index.js\";\nimport { processImage } from \"./processor.js\";\nimport { ConfigService } from \"../config/ConfigService.js\";\nimport { genId as defaultGenId } from \"../database/drizzle/database.js\";\nimport type { Dialect } from \"../database/drizzle/database.js\";\n\nexport interface MediaSearchParams {\n page?: number;\n limit?: number;\n search?: string;\n type?: string;\n folder?: string;\n sortBy?: string;\n sortDir?: \"asc\" | \"desc\";\n}\n\ninterface MediaRow {\n id: string;\n filename: string;\n title: string | null;\n originalName: string;\n mimeType: string;\n fileSize: number;\n width: number | null;\n height: number | null;\n url: string;\n thumbnailUrl: string | null;\n folder: string | null;\n provider: string;\n alt: string | null;\n caption: string | null;\n metadata: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport class MediaService {\n private db: any;\n private storage: StorageProvider;\n private dialect: Dialect;\n private genId: () => string;\n private mediaTable: string = \"media\";\n private foldersTable: string = \"media_folders\";\n\n constructor(\n db: any,\n storage: StorageProvider,\n options?: { dialect?: Dialect; genId?: () => string },\n ) {\n this.db = db;\n this.storage = storage;\n this.dialect = options?.dialect || \"sqlite\";\n this.genId = options?.genId || defaultGenId;\n }\n\n static async init(\n db: any,\n options?: { dialect?: Dialect; genId?: () => string; storageConfig?: any },\n ): Promise<MediaService> {\n let storage: StorageProvider;\n\n if (options?.storageConfig) {\n console.log(\n \"[MediaService.init] Using provided storageConfig:\",\n options.storageConfig.type,\n );\n storage = await resolveProviderWithConfig(options.storageConfig);\n } else {\n const configService = new ConfigService(db);\n await configService.load();\n storage = await resolveProvider(configService);\n }\n\n return new MediaService(db, storage, options);\n }\n\n private now(): string {\n return new Date().toISOString();\n }\n\n private buildFindConditions(params: MediaSearchParams): {\n where: string;\n params: any[];\n orderBy: string;\n sortCol: string;\n } {\n const conditions: string[] = [];\n const p: any[] = [];\n const sortCol =\n params.sortBy === \"name\" ? \"title\" : params.sortBy || \"created_at\";\n const sortDir = params.sortDir === \"asc\" ? \"ASC\" : \"DESC\";\n\n if (params.search) {\n conditions.push(\n `(title LIKE ? OR filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)`,\n );\n const s = `%${params.search}%`;\n p.push(s, s, s, s);\n }\n if (params.type && params.type !== \"all\") {\n conditions.push(`mime_type LIKE ?`);\n p.push(`${params.type}/%`);\n }\n if (params.folder) {\n conditions.push(`(folder = ? OR folder LIKE ?)`);\n p.push(params.folder, `${params.folder}/%`);\n }\n\n const where =\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n return { where, params: p, orderBy: sortDir, sortCol };\n }\n\n private rowToMedia(row: any): MediaRow {\n return {\n id: row.id,\n filename: row.filename,\n title: row.title ?? null,\n originalName: row.original_name ?? row.originalName,\n mimeType: row.mime_type ?? row.mimeType,\n fileSize: row.file_size ?? row.fileSize,\n width: row.width ?? null,\n height: row.height ?? null,\n url: row.url,\n thumbnailUrl: row.thumbnail_url ?? row.thumbnailUrl ?? null,\n folder: row.folder ?? null,\n provider: row.provider,\n alt: row.alt ?? null,\n caption: row.caption ?? null,\n metadata: row.metadata ?? null,\n createdAt: row.created_at ?? row.createdAt,\n updatedAt: row.updated_at ?? row.updatedAt,\n };\n }\n\n private async sqliteRun(sql: string, params: any[] = []): Promise<any> {\n const stmt = this.db.prepare(sql);\n const sqlLower = sql.trim().toLowerCase();\n\n // For INSERT/UPDATE/DELETE statements, use .run() instead of .all()\n if (\n sqlLower.startsWith(\"insert\") ||\n sqlLower.startsWith(\"update\") ||\n sqlLower.startsWith(\"delete\")\n ) {\n return stmt.run(...params);\n }\n\n // For SELECT statements, use .all()\n return stmt.all(...params);\n }\n\n private sqliteGet(sql: string, params: any[] = []): any {\n const stmt = this.db.prepare(sql);\n return stmt.get(...params);\n }\n\n async upload(file: File, folder: string = \"\"): Promise<MediaRow> {\n const isImage = file.type.startsWith(\"image/\");\n let processed;\n let uploadFile: File = file;\n let filename = file.name;\n let width: number | null = null;\n let height: number | null = null;\n\n if (isImage && !file.type.includes(\"svg\")) {\n const buffer = Buffer.from(await file.arrayBuffer());\n processed = await processImage(buffer);\n const originalName = file.name.replace(/\\.[^/.]+$/, \"\");\n const safeName = originalName\n .toLowerCase()\n .replace(/[^a-z0-9]/g, \"-\")\n .replace(/-+/g, \"-\")\n .substring(0, 50);\n filename = `${safeName}.webp`;\n width = processed.width ?? null;\n height = processed.height ?? null;\n uploadFile = new File([processed.buffer], filename, {\n type: \"image/webp\",\n });\n }\n\n const storageResult: UploadedFile = await this.storage.upload(uploadFile, {\n folder,\n filename,\n });\n\n const thumbnailUrl = await this.storage.generateThumbnail(\n {\n ...storageResult,\n id: \"\",\n provider: this.storage.name,\n createdAt: this.now(),\n },\n { width: 400, height: 400 },\n );\n\n const id = this.genId();\n const now = this.now();\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(\n `INSERT INTO ${this.mediaTable}\n (id, filename, title, original_name, mime_type, file_size, width, height, url, thumbnail_url, folder, provider, alt, caption, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n storageResult.filename,\n file.name.replace(/\\.[^/.]+$/, \"\"),\n file.name,\n storageResult.mimeType,\n storageResult.size,\n width,\n height,\n storageResult.url,\n thumbnailUrl,\n folder || null,\n this.storage.name,\n null,\n null,\n null,\n now,\n now,\n ],\n );\n } else {\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n await this.db\n .insert(mediaSchema)\n .values({\n id,\n filename: storageResult.filename,\n title: file.name.replace(/\\.[^/.]+$/, \"\"),\n originalName: file.name,\n mimeType: storageResult.mimeType,\n fileSize: storageResult.size,\n width,\n height,\n url: storageResult.url,\n thumbnailUrl,\n folder: folder || \"\",\n provider: this.storage.name,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n .returning();\n }\n\n return {\n id,\n filename: storageResult.filename,\n title: file.name.replace(/\\.[^/.]+$/, \"\"),\n originalName: file.name,\n mimeType: storageResult.mimeType,\n fileSize: storageResult.size,\n width,\n height,\n url: storageResult.url,\n thumbnailUrl,\n folder: folder || null,\n provider: this.storage.name,\n alt: null,\n caption: null,\n metadata: null,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n async delete(id: string): Promise<void> {\n let item: MediaRow | null = null;\n\n if (this.dialect === \"sqlite\") {\n item = this.sqliteGet(`SELECT * FROM ${this.mediaTable} WHERE id = ?`, [\n id,\n ]) as MediaRow | null;\n } else {\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(mediaSchema.id.equals(id));\n if (row) item = this.rowToMedia(row);\n }\n\n if (!item) return;\n await this.deleteFile(item.url);\n\n if (\n item.thumbnailUrl &&\n item.thumbnailUrl !== item.url &&\n item.thumbnailUrl !== item.url + \"?thumb\"\n ) {\n try {\n await this.deleteFile(item.thumbnailUrl);\n } catch {}\n }\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(`DELETE FROM ${this.mediaTable} WHERE id = ?`, [id]);\n } else {\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n await this.db.delete(mediaSchema).where(mediaSchema.id.equals(id));\n }\n }\n\n async deleteFile(url: string): Promise<void> {\n await this.storage.delete(url);\n }\n\n async rename(id: string, newKey: string): Promise<MediaRow | null> {\n let item: MediaRow | null = null;\n\n if (this.dialect === \"sqlite\") {\n item = this.sqliteGet(`SELECT * FROM ${this.mediaTable} WHERE id = ?`, [\n id,\n ]) as MediaRow | null;\n } else {\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(mediaSchema.id.equals(id));\n if (row) item = this.rowToMedia(row);\n }\n\n if (!item) return null;\n\n const newUrl = await this.storage.rename(item.url, newKey);\n\n // For Cloudinary, construct thumbnail URL with transformations\n let newThumbnailUrl: string | undefined;\n if (item.thumbnailUrl || this.storage.name === \"cloudinary\") {\n // Get version from newUrl (format: .../upload/v{version}/...)\n const versionMatch = newUrl.match(/\\/upload\\/(v\\d+)\\//);\n const version = versionMatch ? versionMatch[1] + \"/\" : \"\";\n\n // Extract base URL (everything before /upload/)\n const baseUrlMatch = newUrl.match(/(.+?)\\/upload\\//);\n const baseUrl = baseUrlMatch\n ? baseUrlMatch[1]\n : \"https://res.cloudinary.com/\" +\n (this.storage as any).config?.cloudName || \"unknown\";\n\n // newKey already includes folder path\n newThumbnailUrl = `${baseUrl}/upload/w_200,h_200,c_fill/${version}${newKey}`;\n }\n\n const ext = item.filename.split(\".\").pop();\n const newFilename = newKey.includes(\".\") ? newKey : `${newKey}.${ext}`;\n\n const updateData = {\n url: newUrl,\n filename: newFilename,\n thumbnailUrl: newThumbnailUrl,\n };\n\n if (this.dialect === \"sqlite\") {\n // Map thumbnailUrl to thumbnail_url for SQLite\n const sqliteUpdateData: Record<string, any> = { ...updateData };\n if (\"thumbnailUrl\" in sqliteUpdateData) {\n sqliteUpdateData.thumbnail_url = sqliteUpdateData.thumbnailUrl;\n delete sqliteUpdateData.thumbnailUrl;\n }\n\n const sets = Object.keys(sqliteUpdateData)\n .map((k) => `${k} = ?`)\n .join(\", \");\n const vals = Object.values(sqliteUpdateData);\n await this.sqliteRun(\n `UPDATE ${this.mediaTable} SET ${sets}, updated_at = ? WHERE id = ?`,\n [...vals, this.now(), id],\n );\n } else {\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n await this.db\n .update(mediaSchema)\n .set({ ...updateData, updatedAt: this.now() })\n .where(mediaSchema.id.equals(id));\n }\n\n return {\n ...item,\n ...updateData,\n updatedAt: this.now(),\n thumbnailUrl: updateData.thumbnailUrl ?? null,\n };\n }\n\n async find(params: MediaSearchParams = {}): Promise<{\n docs: MediaRow[];\n totalDocs: number;\n page: number;\n limit: number;\n totalPages: number;\n }> {\n const {\n page = 1,\n limit = 30,\n search = \"\",\n type = \"\",\n folder = \"\",\n sortBy = \"createdAt\",\n sortDir = \"desc\",\n } = params;\n\n const {\n where,\n params: p,\n orderBy,\n sortCol,\n } = this.buildFindConditions({\n page,\n limit,\n search,\n type,\n folder,\n sortBy,\n sortDir,\n });\n\n const offset = (page - 1) * limit;\n\n if (this.dialect === \"sqlite\") {\n const countRow = this.sqliteGet(\n `SELECT COUNT(*) as cnt FROM ${this.mediaTable} ${where}`,\n p,\n );\n const totalDocs = countRow?.cnt ?? 0;\n\n const rows = await this.sqliteRun(\n `SELECT * FROM ${this.mediaTable} ${where} ORDER BY ${sortCol} ${orderBy} LIMIT ? OFFSET ?`,\n [...p, limit, offset],\n );\n\n return {\n docs: rows.map((r: any) => this.rowToMedia(r)),\n totalDocs,\n page,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n };\n }\n\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n const { like, or, and, asc, desc, eq, sql } = await import(\n this.dialect === \"mysql\"\n ? \"drizzle-orm/mysql-core\"\n : \"drizzle-orm/pg-core\"\n );\n\n const conditions: any[] = [];\n if (search) {\n conditions.push(\n or(\n like(mediaSchema.title, `%${search}%`),\n like(mediaSchema.filename, `%${search}%`),\n like(mediaSchema.originalName, `%${search}%`),\n like(mediaSchema.alt, `%${search}%`),\n ),\n );\n }\n if (type && type !== \"all\") {\n conditions.push(like(mediaSchema.mimeType, `${type}/%`));\n }\n if (folder) {\n conditions.push(\n or(\n eq(mediaSchema.folder, folder),\n like(mediaSchema.folder, `${folder}/%`),\n ),\n );\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined;\n const order =\n sortDir === \"asc\"\n ? asc(mediaSchema[sortCol as keyof typeof mediaSchema])\n : desc(mediaSchema[sortCol as keyof typeof mediaSchema]);\n\n const docs = await this.db\n .select()\n .from(mediaSchema)\n .where(whereClause)\n .orderBy(order)\n .limit(limit)\n .offset(offset);\n\n const [{ count }] = await this.db\n .select({ count: sql`count(*)` })\n .from(mediaSchema)\n .where(whereClause);\n\n const totalDocs = Number(count);\n return {\n docs: docs.map((r: any) => this.rowToMedia(r)),\n totalDocs,\n page,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n };\n }\n\n async update(\n id: string,\n data: { title?: string; alt?: string; caption?: string; folder?: string },\n ): Promise<MediaRow | null> {\n const now = this.now();\n\n if (this.dialect === \"sqlite\") {\n const sets: string[] = [\"updated_at = ?\"];\n const p: any[] = [now];\n if (data.title !== undefined) {\n sets.push(\"title = ?\");\n p.push(data.title);\n }\n if (data.alt !== undefined) {\n sets.push(\"alt = ?\");\n p.push(data.alt);\n }\n if (data.caption !== undefined) {\n sets.push(\"caption = ?\");\n p.push(data.caption);\n }\n if (data.folder !== undefined) {\n sets.push(\"folder = ?\");\n p.push(data.folder || null);\n }\n p.push(id);\n await this.sqliteRun(\n `UPDATE ${this.mediaTable} SET ${sets.join(\", \")} WHERE id = ?`,\n p,\n );\n const row = this.sqliteGet(\n `SELECT * FROM ${this.mediaTable} WHERE id = ?`,\n [id],\n );\n return row ? this.rowToMedia(row) : null;\n }\n\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n const [updated] = await this.db\n .update(mediaSchema)\n .set({ ...data, updatedAt: new Date() })\n .where(mediaSchema.id.equals(id))\n .returning();\n return updated ? this.rowToMedia(updated) : null;\n }\n\n async updateMany(ids: string[], data: { folder?: string }): Promise<void> {\n const now = this.now();\n if (this.dialect === \"sqlite\") {\n for (const id of ids) {\n const sets = [\"updated_at = ?\"];\n const p: any[] = [now];\n if (data.folder !== undefined) {\n sets.push(\"folder = ?\");\n p.push(data.folder || null);\n }\n p.push(id);\n await this.sqliteRun(\n `UPDATE ${this.mediaTable} SET ${sets.join(\", \")} WHERE id = ?`,\n p,\n );\n }\n } else {\n const { media: mediaSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n for (const id of ids) {\n await this.db\n .update(mediaSchema)\n .set({ ...data, updatedAt: new Date() })\n .where(mediaSchema.id.equals(id));\n }\n }\n }\n\n async listFolders(): Promise<string[]> {\n if (this.dialect === \"sqlite\") {\n const rows = await this.sqliteRun(\n `SELECT path FROM ${this.foldersTable} UNION\n SELECT folder as path FROM ${this.mediaTable} WHERE folder IS NOT NULL AND folder != ''`,\n );\n return rows\n .map((r: any) => r.path)\n .filter((f: any) => f && f !== \"\")\n .sort();\n }\n\n const { media: mediaSchema, mediaFolders: folderSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n const { eq, sql } = await import(\n this.dialect === \"mysql\"\n ? \"drizzle-orm/mysql-core\"\n : \"drizzle-orm/pg-core\"\n );\n\n const fromMedia = await this.db\n .select({ folder: mediaSchema.folder })\n .from(mediaSchema)\n .groupBy(mediaSchema.folder);\n\n const fromFolders = await this.db\n .select({ path: folderSchema.path })\n .from(folderSchema);\n\n const allPaths = new Set([\n ...fromMedia.map((r: any) => r.folder),\n ...fromFolders.map((r: any) => r.path),\n ]);\n\n return Array.from(allPaths)\n .filter((f: any) => f && f !== \"\")\n .sort() as string[];\n }\n\n async createFolder(name: string, parentPath: string = \"\"): Promise<void> {\n const fullPath = parentPath ? `${parentPath}/${name}` : name;\n\n if (this.storage.name === \"local\") {\n const { mkdir } = await import(\"fs/promises\");\n const { join } = await import(\"path\");\n await mkdir(join(process.cwd(), \"public\", \"uploads\", fullPath), {\n recursive: true,\n });\n }\n\n const now = this.now();\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(\n `INSERT OR IGNORE INTO ${this.foldersTable} (path, name, parent_path, created_at) VALUES (?, ?, ?, ?)`,\n [fullPath, name, parentPath || null, now],\n );\n } else {\n const { mediaFolders: folderSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n await this.db\n .insert(folderSchema)\n .values({\n path: fullPath,\n name,\n parentPath: parentPath || null,\n createdAt: new Date(),\n })\n .onConflictDoNothing();\n }\n }\n\n async deleteFolder(folder: string): Promise<void> {\n const result = await this.find({ folder, limit: 10000 });\n for (const item of result.docs) {\n await this.delete(item.id);\n }\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(\n `DELETE FROM ${this.foldersTable} WHERE path = ? OR path LIKE ?`,\n [folder, `${folder}/%`],\n );\n } else {\n const { mediaFolders: folderSchema } = await import(\n this.dialect === \"mysql\"\n ? \"../database/drizzle/schema/mysql-media.js\"\n : \"../database/drizzle/schema/media.js\"\n );\n const { like, or, eq } = await import(\n this.dialect === \"mysql\"\n ? \"drizzle-orm/mysql-core\"\n : \"drizzle-orm/pg-core\"\n );\n await this.db\n .delete(folderSchema)\n .where(\n or(\n eq(folderSchema.path, folder),\n like(folderSchema.path, `${folder}/%`),\n ),\n );\n }\n\n if (this.storage.name === \"local\") {\n const { rm } = await import(\"fs/promises\");\n const { join } = await import(\"path\");\n try {\n await rm(join(process.cwd(), \"public\", \"uploads\", folder), {\n recursive: true,\n force: true,\n });\n } catch {}\n }\n }\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n"]}