@portaidentity/server 1.7.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/applications/index.d.ts +2 -2
  3. package/dist/applications/index.d.ts.map +1 -1
  4. package/dist/applications/index.js +2 -2
  5. package/dist/applications/index.js.map +1 -1
  6. package/dist/applications/repository.d.ts +49 -4
  7. package/dist/applications/repository.d.ts.map +1 -1
  8. package/dist/applications/repository.js +148 -10
  9. package/dist/applications/repository.js.map +1 -1
  10. package/dist/applications/service.d.ts +35 -17
  11. package/dist/applications/service.d.ts.map +1 -1
  12. package/dist/applications/service.js +144 -35
  13. package/dist/applications/service.js.map +1 -1
  14. package/dist/applications/types.d.ts +1 -1
  15. package/dist/applications/types.d.ts.map +1 -1
  16. package/dist/applications/validators.d.ts +14 -0
  17. package/dist/applications/validators.d.ts.map +1 -0
  18. package/dist/applications/validators.js +14 -0
  19. package/dist/applications/validators.js.map +1 -0
  20. package/dist/auth/effective-branding.d.ts +35 -0
  21. package/dist/auth/effective-branding.d.ts.map +1 -0
  22. package/dist/auth/effective-branding.js +81 -0
  23. package/dist/auth/effective-branding.js.map +1 -0
  24. package/dist/auth/email-service.d.ts +3 -8
  25. package/dist/auth/email-service.d.ts.map +1 -1
  26. package/dist/auth/email-service.js +22 -30
  27. package/dist/auth/email-service.js.map +1 -1
  28. package/dist/auth/i18n.d.ts +5 -0
  29. package/dist/auth/i18n.d.ts.map +1 -1
  30. package/dist/auth/i18n.js +6 -5
  31. package/dist/auth/i18n.js.map +1 -1
  32. package/dist/auth/rate-limiter.d.ts +6 -10
  33. package/dist/auth/rate-limiter.d.ts.map +1 -1
  34. package/dist/auth/rate-limiter.js +12 -16
  35. package/dist/auth/rate-limiter.js.map +1 -1
  36. package/dist/auth/recovery-job-processor.d.ts.map +1 -1
  37. package/dist/auth/recovery-job-processor.js +1 -1
  38. package/dist/auth/recovery-job-processor.js.map +1 -1
  39. package/dist/auth/template-engine.d.ts +3 -1
  40. package/dist/auth/template-engine.d.ts.map +1 -1
  41. package/dist/auth/template-engine.js +1 -1
  42. package/dist/auth/template-engine.js.map +1 -1
  43. package/dist/cli/commands/init.d.ts +1 -1
  44. package/dist/cli/commands/init.d.ts.map +1 -1
  45. package/dist/cli/commands/init.js +12 -12
  46. package/dist/cli/commands/init.js.map +1 -1
  47. package/dist/cli/error-handler.d.ts +3 -2
  48. package/dist/cli/error-handler.d.ts.map +1 -1
  49. package/dist/cli/error-handler.js +9 -2
  50. package/dist/cli/error-handler.js.map +1 -1
  51. package/dist/cli/index.d.ts +1 -1
  52. package/dist/cli/index.d.ts.map +1 -1
  53. package/dist/cli/index.js +1 -1
  54. package/dist/cli/index.js.map +1 -1
  55. package/dist/clients/index.d.ts +1 -1
  56. package/dist/clients/index.js +1 -1
  57. package/dist/clients/repository.d.ts +18 -0
  58. package/dist/clients/repository.d.ts.map +1 -1
  59. package/dist/clients/repository.js +36 -0
  60. package/dist/clients/repository.js.map +1 -1
  61. package/dist/clients/secret-repository.d.ts +35 -8
  62. package/dist/clients/secret-repository.d.ts.map +1 -1
  63. package/dist/clients/secret-repository.js +69 -16
  64. package/dist/clients/secret-repository.js.map +1 -1
  65. package/dist/clients/secret-service.d.ts +5 -9
  66. package/dist/clients/secret-service.d.ts.map +1 -1
  67. package/dist/clients/secret-service.js +13 -22
  68. package/dist/clients/secret-service.js.map +1 -1
  69. package/dist/clients/service.d.ts +10 -13
  70. package/dist/clients/service.d.ts.map +1 -1
  71. package/dist/clients/service.js +112 -40
  72. package/dist/clients/service.js.map +1 -1
  73. package/dist/clients/types.d.ts +1 -1
  74. package/dist/clients/types.d.ts.map +1 -1
  75. package/dist/clients/validators.d.ts +83 -1
  76. package/dist/clients/validators.d.ts.map +1 -1
  77. package/dist/clients/validators.js +110 -0
  78. package/dist/clients/validators.js.map +1 -1
  79. package/dist/config/index.d.ts +1 -0
  80. package/dist/config/index.d.ts.map +1 -1
  81. package/dist/config/index.js +1 -0
  82. package/dist/config/index.js.map +1 -1
  83. package/dist/config/schema.d.ts +1 -0
  84. package/dist/config/schema.d.ts.map +1 -1
  85. package/dist/config/schema.js +23 -1
  86. package/dist/config/schema.js.map +1 -1
  87. package/dist/custom-claims/repository.d.ts +14 -9
  88. package/dist/custom-claims/repository.d.ts.map +1 -1
  89. package/dist/custom-claims/repository.js +38 -11
  90. package/dist/custom-claims/repository.js.map +1 -1
  91. package/dist/custom-claims/service.d.ts +11 -6
  92. package/dist/custom-claims/service.d.ts.map +1 -1
  93. package/dist/custom-claims/service.js +43 -20
  94. package/dist/custom-claims/service.js.map +1 -1
  95. package/dist/index.js +8 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/lib/admin-permissions.d.ts +12 -7
  98. package/dist/lib/admin-permissions.d.ts.map +1 -1
  99. package/dist/lib/admin-permissions.js +26 -16
  100. package/dist/lib/admin-permissions.js.map +1 -1
  101. package/dist/lib/audit-log.d.ts +2 -2
  102. package/dist/lib/audit-log.d.ts.map +1 -1
  103. package/dist/lib/audit-log.js +1 -1
  104. package/dist/lib/audit-log.js.map +1 -1
  105. package/dist/lib/authority-revocation.d.ts +18 -0
  106. package/dist/lib/authority-revocation.d.ts.map +1 -0
  107. package/dist/lib/authority-revocation.js +37 -0
  108. package/dist/lib/authority-revocation.js.map +1 -0
  109. package/dist/lib/branding-assets.d.ts +35 -5
  110. package/dist/lib/branding-assets.d.ts.map +1 -1
  111. package/dist/lib/branding-assets.js +33 -26
  112. package/dist/lib/branding-assets.js.map +1 -1
  113. package/dist/lib/bulk-operations.d.ts +1 -1
  114. package/dist/lib/bulk-operations.d.ts.map +1 -1
  115. package/dist/lib/bulk-operations.js +1 -13
  116. package/dist/lib/bulk-operations.js.map +1 -1
  117. package/dist/lib/cursor.d.ts +2 -0
  118. package/dist/lib/cursor.d.ts.map +1 -1
  119. package/dist/lib/cursor.js +2 -7
  120. package/dist/lib/cursor.js.map +1 -1
  121. package/dist/lib/database.d.ts.map +1 -1
  122. package/dist/lib/database.js +5 -0
  123. package/dist/lib/database.js.map +1 -1
  124. package/dist/lib/deletion-cleanup.d.ts +43 -0
  125. package/dist/lib/deletion-cleanup.d.ts.map +1 -0
  126. package/dist/lib/deletion-cleanup.js +207 -0
  127. package/dist/lib/deletion-cleanup.js.map +1 -0
  128. package/dist/lib/image-validator.d.ts +3 -1
  129. package/dist/lib/image-validator.d.ts.map +1 -1
  130. package/dist/lib/image-validator.js +32 -19
  131. package/dist/lib/image-validator.js.map +1 -1
  132. package/dist/lib/log-format.d.ts +20 -0
  133. package/dist/lib/log-format.d.ts.map +1 -0
  134. package/dist/lib/log-format.js +22 -0
  135. package/dist/lib/log-format.js.map +1 -0
  136. package/dist/lib/logger.d.ts +3 -1
  137. package/dist/lib/logger.d.ts.map +1 -1
  138. package/dist/lib/logger.js +21 -4
  139. package/dist/lib/logger.js.map +1 -1
  140. package/dist/lib/redis.d.ts.map +1 -1
  141. package/dist/lib/redis.js +3 -0
  142. package/dist/lib/redis.js.map +1 -1
  143. package/dist/lib/session-tracking.d.ts +73 -11
  144. package/dist/lib/session-tracking.d.ts.map +1 -1
  145. package/dist/lib/session-tracking.js +76 -32
  146. package/dist/lib/session-tracking.js.map +1 -1
  147. package/dist/lib/signing-key-crypto.d.ts.map +1 -1
  148. package/dist/lib/signing-key-crypto.js +4 -5
  149. package/dist/lib/signing-key-crypto.js.map +1 -1
  150. package/dist/lib/signing-keys.d.ts +3 -4
  151. package/dist/lib/signing-keys.d.ts.map +1 -1
  152. package/dist/lib/signing-keys.js +66 -41
  153. package/dist/lib/signing-keys.js.map +1 -1
  154. package/dist/lib/super-admin-protection.d.ts +5 -5
  155. package/dist/lib/super-admin-protection.d.ts.map +1 -1
  156. package/dist/lib/super-admin-protection.js +6 -9
  157. package/dist/lib/super-admin-protection.js.map +1 -1
  158. package/dist/lib/system-config-catalog.d.ts +268 -0
  159. package/dist/lib/system-config-catalog.d.ts.map +1 -0
  160. package/dist/lib/system-config-catalog.js +90 -0
  161. package/dist/lib/system-config-catalog.js.map +1 -0
  162. package/dist/lib/system-config.d.ts +30 -33
  163. package/dist/lib/system-config.d.ts.map +1 -1
  164. package/dist/lib/system-config.js +78 -93
  165. package/dist/lib/system-config.js.map +1 -1
  166. package/dist/lib/with-timeout.d.ts +32 -0
  167. package/dist/lib/with-timeout.d.ts.map +1 -0
  168. package/dist/lib/with-timeout.js +45 -0
  169. package/dist/lib/with-timeout.js.map +1 -0
  170. package/dist/middleware/admin-auth.d.ts +6 -5
  171. package/dist/middleware/admin-auth.d.ts.map +1 -1
  172. package/dist/middleware/admin-auth.js +30 -20
  173. package/dist/middleware/admin-auth.js.map +1 -1
  174. package/dist/middleware/admin-cors.d.ts +3 -3
  175. package/dist/middleware/admin-cors.js +3 -3
  176. package/dist/middleware/admin-mutation-audit.d.ts +3 -2
  177. package/dist/middleware/admin-mutation-audit.d.ts.map +1 -1
  178. package/dist/middleware/admin-mutation-audit.js +12 -5
  179. package/dist/middleware/admin-mutation-audit.js.map +1 -1
  180. package/dist/middleware/admin-rate-limiter.d.ts +7 -8
  181. package/dist/middleware/admin-rate-limiter.d.ts.map +1 -1
  182. package/dist/middleware/admin-rate-limiter.js +7 -8
  183. package/dist/middleware/admin-rate-limiter.js.map +1 -1
  184. package/dist/middleware/client-secret-hash.d.ts +10 -29
  185. package/dist/middleware/client-secret-hash.d.ts.map +1 -1
  186. package/dist/middleware/client-secret-hash.js +161 -59
  187. package/dist/middleware/client-secret-hash.js.map +1 -1
  188. package/dist/middleware/health.d.ts +17 -0
  189. package/dist/middleware/health.d.ts.map +1 -1
  190. package/dist/middleware/health.js +25 -21
  191. package/dist/middleware/health.js.map +1 -1
  192. package/dist/middleware/ready.d.ts.map +1 -1
  193. package/dist/middleware/ready.js +1 -12
  194. package/dist/middleware/ready.js.map +1 -1
  195. package/dist/middleware/require-existing-organization.d.ts +18 -0
  196. package/dist/middleware/require-existing-organization.d.ts.map +1 -0
  197. package/dist/middleware/require-existing-organization.js +38 -0
  198. package/dist/middleware/require-existing-organization.js.map +1 -0
  199. package/dist/middleware/require-permission.d.ts.map +1 -1
  200. package/dist/middleware/require-permission.js +35 -1
  201. package/dist/middleware/require-permission.js.map +1 -1
  202. package/dist/middleware/require-user-organization.d.ts.map +1 -1
  203. package/dist/middleware/require-user-organization.js +4 -2
  204. package/dist/middleware/require-user-organization.js.map +1 -1
  205. package/dist/middleware/security-headers.d.ts +18 -0
  206. package/dist/middleware/security-headers.d.ts.map +1 -1
  207. package/dist/middleware/security-headers.js +32 -1
  208. package/dist/middleware/security-headers.js.map +1 -1
  209. package/dist/middleware/tenant-resolver.d.ts +1 -2
  210. package/dist/middleware/tenant-resolver.d.ts.map +1 -1
  211. package/dist/middleware/tenant-resolver.js +1 -5
  212. package/dist/middleware/tenant-resolver.js.map +1 -1
  213. package/dist/middleware/token-rate-limiter.d.ts +37 -16
  214. package/dist/middleware/token-rate-limiter.d.ts.map +1 -1
  215. package/dist/middleware/token-rate-limiter.js +126 -54
  216. package/dist/middleware/token-rate-limiter.js.map +1 -1
  217. package/dist/oidc/account-finder.d.ts +5 -5
  218. package/dist/oidc/account-finder.d.ts.map +1 -1
  219. package/dist/oidc/account-finder.js +31 -23
  220. package/dist/oidc/account-finder.js.map +1 -1
  221. package/dist/oidc/adapter-factory.d.ts.map +1 -1
  222. package/dist/oidc/adapter-factory.js +83 -3
  223. package/dist/oidc/adapter-factory.js.map +1 -1
  224. package/dist/oidc/configuration.d.ts +3 -8
  225. package/dist/oidc/configuration.d.ts.map +1 -1
  226. package/dist/oidc/configuration.js +64 -50
  227. package/dist/oidc/configuration.js.map +1 -1
  228. package/dist/oidc/provider.d.ts.map +1 -1
  229. package/dist/oidc/provider.js +7 -0
  230. package/dist/oidc/provider.js.map +1 -1
  231. package/dist/oidc/redis-adapter.d.ts +2 -3
  232. package/dist/oidc/redis-adapter.d.ts.map +1 -1
  233. package/dist/oidc/redis-adapter.js +54 -46
  234. package/dist/oidc/redis-adapter.js.map +1 -1
  235. package/dist/organizations/branding-url.d.ts +17 -0
  236. package/dist/organizations/branding-url.d.ts.map +1 -0
  237. package/dist/organizations/branding-url.js +38 -0
  238. package/dist/organizations/branding-url.js.map +1 -0
  239. package/dist/organizations/index.d.ts +2 -2
  240. package/dist/organizations/index.d.ts.map +1 -1
  241. package/dist/organizations/index.js +1 -1
  242. package/dist/organizations/index.js.map +1 -1
  243. package/dist/organizations/repository.d.ts +22 -32
  244. package/dist/organizations/repository.d.ts.map +1 -1
  245. package/dist/organizations/repository.js +64 -45
  246. package/dist/organizations/repository.js.map +1 -1
  247. package/dist/organizations/service.d.ts +14 -46
  248. package/dist/organizations/service.d.ts.map +1 -1
  249. package/dist/organizations/service.js +60 -112
  250. package/dist/organizations/service.js.map +1 -1
  251. package/dist/organizations/types.d.ts +1 -15
  252. package/dist/organizations/types.d.ts.map +1 -1
  253. package/dist/organizations/validators.d.ts +41 -0
  254. package/dist/organizations/validators.d.ts.map +1 -0
  255. package/dist/organizations/validators.js +48 -0
  256. package/dist/organizations/validators.js.map +1 -0
  257. package/dist/portability/apply.d.ts +15 -0
  258. package/dist/portability/apply.d.ts.map +1 -0
  259. package/dist/portability/apply.js +274 -0
  260. package/dist/portability/apply.js.map +1 -0
  261. package/dist/portability/authorization.d.ts +30 -0
  262. package/dist/portability/authorization.d.ts.map +1 -0
  263. package/dist/portability/authorization.js +130 -0
  264. package/dist/portability/authorization.js.map +1 -0
  265. package/dist/portability/cleanup.d.ts +29 -0
  266. package/dist/portability/cleanup.d.ts.map +1 -0
  267. package/dist/portability/cleanup.js +167 -0
  268. package/dist/portability/cleanup.js.map +1 -0
  269. package/dist/portability/export.d.ts +18 -0
  270. package/dist/portability/export.d.ts.map +1 -0
  271. package/dist/portability/export.js +125 -0
  272. package/dist/portability/export.js.map +1 -0
  273. package/dist/portability/import-repository.d.ts +204 -0
  274. package/dist/portability/import-repository.d.ts.map +1 -0
  275. package/dist/portability/import-repository.js +347 -0
  276. package/dist/portability/import-repository.js.map +1 -0
  277. package/dist/portability/import-user-client-writers.d.ts +40 -0
  278. package/dist/portability/import-user-client-writers.d.ts.map +1 -0
  279. package/dist/portability/import-user-client-writers.js +168 -0
  280. package/dist/portability/import-user-client-writers.js.map +1 -0
  281. package/dist/portability/index.d.ts +8 -0
  282. package/dist/portability/index.d.ts.map +1 -0
  283. package/dist/portability/index.js +8 -0
  284. package/dist/portability/index.js.map +1 -0
  285. package/dist/portability/plan-support.d.ts +137 -0
  286. package/dist/portability/plan-support.d.ts.map +1 -0
  287. package/dist/portability/plan-support.js +336 -0
  288. package/dist/portability/plan-support.js.map +1 -0
  289. package/dist/portability/plan.d.ts +34 -0
  290. package/dist/portability/plan.d.ts.map +1 -0
  291. package/dist/portability/plan.js +450 -0
  292. package/dist/portability/plan.js.map +1 -0
  293. package/dist/portability/repository.d.ts +95 -0
  294. package/dist/portability/repository.d.ts.map +1 -0
  295. package/dist/portability/repository.js +388 -0
  296. package/dist/portability/repository.js.map +1 -0
  297. package/dist/portability/schema.d.ts +589 -0
  298. package/dist/portability/schema.d.ts.map +1 -0
  299. package/dist/portability/schema.js +458 -0
  300. package/dist/portability/schema.js.map +1 -0
  301. package/dist/portability/types.d.ts +381 -0
  302. package/dist/portability/types.d.ts.map +1 -0
  303. package/dist/portability/types.js +19 -0
  304. package/dist/portability/types.js.map +1 -0
  305. package/dist/rbac/errors.d.ts +4 -0
  306. package/dist/rbac/errors.d.ts.map +1 -1
  307. package/dist/rbac/errors.js +7 -0
  308. package/dist/rbac/errors.js.map +1 -1
  309. package/dist/rbac/index.d.ts +3 -3
  310. package/dist/rbac/index.d.ts.map +1 -1
  311. package/dist/rbac/index.js +3 -3
  312. package/dist/rbac/index.js.map +1 -1
  313. package/dist/rbac/mapping-repository.d.ts +84 -9
  314. package/dist/rbac/mapping-repository.d.ts.map +1 -1
  315. package/dist/rbac/mapping-repository.js +222 -55
  316. package/dist/rbac/mapping-repository.js.map +1 -1
  317. package/dist/rbac/permission-repository.d.ts +36 -19
  318. package/dist/rbac/permission-repository.d.ts.map +1 -1
  319. package/dist/rbac/permission-repository.js +93 -35
  320. package/dist/rbac/permission-repository.js.map +1 -1
  321. package/dist/rbac/permission-service.d.ts +18 -19
  322. package/dist/rbac/permission-service.d.ts.map +1 -1
  323. package/dist/rbac/permission-service.js +100 -57
  324. package/dist/rbac/permission-service.js.map +1 -1
  325. package/dist/rbac/role-repository.d.ts +29 -24
  326. package/dist/rbac/role-repository.d.ts.map +1 -1
  327. package/dist/rbac/role-repository.js +66 -43
  328. package/dist/rbac/role-repository.js.map +1 -1
  329. package/dist/rbac/role-service.d.ts +35 -32
  330. package/dist/rbac/role-service.d.ts.map +1 -1
  331. package/dist/rbac/role-service.js +210 -96
  332. package/dist/rbac/role-service.js.map +1 -1
  333. package/dist/rbac/slugs.d.ts +16 -27
  334. package/dist/rbac/slugs.d.ts.map +1 -1
  335. package/dist/rbac/slugs.js +36 -59
  336. package/dist/rbac/slugs.js.map +1 -1
  337. package/dist/rbac/types.d.ts +2 -4
  338. package/dist/rbac/types.d.ts.map +1 -1
  339. package/dist/rbac/types.js.map +1 -1
  340. package/dist/rbac/user-role-service.d.ts +23 -24
  341. package/dist/rbac/user-role-service.d.ts.map +1 -1
  342. package/dist/rbac/user-role-service.js +117 -61
  343. package/dist/rbac/user-role-service.js.map +1 -1
  344. package/dist/routes/applications.d.ts +4 -2
  345. package/dist/routes/applications.d.ts.map +1 -1
  346. package/dist/routes/applications.js +57 -19
  347. package/dist/routes/applications.js.map +1 -1
  348. package/dist/routes/audit.js +1 -1
  349. package/dist/routes/audit.js.map +1 -1
  350. package/dist/routes/branding.d.ts +3 -3
  351. package/dist/routes/branding.d.ts.map +1 -1
  352. package/dist/routes/branding.js +44 -16
  353. package/dist/routes/branding.js.map +1 -1
  354. package/dist/routes/bulk.d.ts +0 -5
  355. package/dist/routes/bulk.d.ts.map +1 -1
  356. package/dist/routes/bulk.js +3 -5
  357. package/dist/routes/bulk.js.map +1 -1
  358. package/dist/routes/clients.d.ts +4 -4
  359. package/dist/routes/clients.d.ts.map +1 -1
  360. package/dist/routes/clients.js +111 -52
  361. package/dist/routes/clients.js.map +1 -1
  362. package/dist/routes/config.d.ts +17 -12
  363. package/dist/routes/config.d.ts.map +1 -1
  364. package/dist/routes/config.js +165 -64
  365. package/dist/routes/config.js.map +1 -1
  366. package/dist/routes/custom-claims.d.ts.map +1 -1
  367. package/dist/routes/custom-claims.js +8 -2
  368. package/dist/routes/custom-claims.js.map +1 -1
  369. package/dist/routes/exports.d.ts +2 -1
  370. package/dist/routes/exports.d.ts.map +1 -1
  371. package/dist/routes/exports.js +57 -1
  372. package/dist/routes/exports.js.map +1 -1
  373. package/dist/routes/imports.d.ts +2 -2
  374. package/dist/routes/imports.d.ts.map +1 -1
  375. package/dist/routes/imports.js +95 -40
  376. package/dist/routes/imports.js.map +1 -1
  377. package/dist/routes/interactions.d.ts.map +1 -1
  378. package/dist/routes/interactions.js +16 -34
  379. package/dist/routes/interactions.js.map +1 -1
  380. package/dist/routes/invitation.d.ts.map +1 -1
  381. package/dist/routes/invitation.js +10 -23
  382. package/dist/routes/invitation.js.map +1 -1
  383. package/dist/routes/keys.d.ts.map +1 -1
  384. package/dist/routes/keys.js +26 -13
  385. package/dist/routes/keys.js.map +1 -1
  386. package/dist/routes/magic-link.d.ts.map +1 -1
  387. package/dist/routes/magic-link.js +5 -17
  388. package/dist/routes/magic-link.js.map +1 -1
  389. package/dist/routes/organizations.d.ts +1 -2
  390. package/dist/routes/organizations.d.ts.map +1 -1
  391. package/dist/routes/organizations.js +43 -104
  392. package/dist/routes/organizations.js.map +1 -1
  393. package/dist/routes/password-reset.d.ts.map +1 -1
  394. package/dist/routes/password-reset.js +13 -35
  395. package/dist/routes/password-reset.js.map +1 -1
  396. package/dist/routes/permissions.d.ts +1 -1
  397. package/dist/routes/permissions.d.ts.map +1 -1
  398. package/dist/routes/permissions.js +58 -17
  399. package/dist/routes/permissions.js.map +1 -1
  400. package/dist/routes/public-branding.d.ts +16 -0
  401. package/dist/routes/public-branding.d.ts.map +1 -0
  402. package/dist/routes/public-branding.js +52 -0
  403. package/dist/routes/public-branding.js.map +1 -0
  404. package/dist/routes/roles.d.ts +1 -1
  405. package/dist/routes/roles.d.ts.map +1 -1
  406. package/dist/routes/roles.js +63 -21
  407. package/dist/routes/roles.js.map +1 -1
  408. package/dist/routes/sessions.d.ts.map +1 -1
  409. package/dist/routes/sessions.js +23 -12
  410. package/dist/routes/sessions.js.map +1 -1
  411. package/dist/routes/two-factor.d.ts.map +1 -1
  412. package/dist/routes/two-factor.js +91 -38
  413. package/dist/routes/two-factor.js.map +1 -1
  414. package/dist/routes/user-roles.d.ts.map +1 -1
  415. package/dist/routes/user-roles.js +56 -9
  416. package/dist/routes/user-roles.js.map +1 -1
  417. package/dist/routes/users.d.ts +4 -8
  418. package/dist/routes/users.d.ts.map +1 -1
  419. package/dist/routes/users.js +108 -265
  420. package/dist/routes/users.js.map +1 -1
  421. package/dist/server.d.ts.map +1 -1
  422. package/dist/server.js +53 -37
  423. package/dist/server.js.map +1 -1
  424. package/dist/two-factor/errors.d.ts +9 -0
  425. package/dist/two-factor/errors.d.ts.map +1 -1
  426. package/dist/two-factor/errors.js +12 -0
  427. package/dist/two-factor/errors.js.map +1 -1
  428. package/dist/two-factor/index.d.ts +5 -4
  429. package/dist/two-factor/index.d.ts.map +1 -1
  430. package/dist/two-factor/index.js +4 -4
  431. package/dist/two-factor/index.js.map +1 -1
  432. package/dist/two-factor/repository.d.ts +17 -6
  433. package/dist/two-factor/repository.d.ts.map +1 -1
  434. package/dist/two-factor/repository.js +37 -9
  435. package/dist/two-factor/repository.js.map +1 -1
  436. package/dist/two-factor/service.d.ts.map +1 -1
  437. package/dist/two-factor/service.js +26 -19
  438. package/dist/two-factor/service.js.map +1 -1
  439. package/dist/two-factor/totp.d.ts +13 -2
  440. package/dist/two-factor/totp.d.ts.map +1 -1
  441. package/dist/two-factor/totp.js +20 -7
  442. package/dist/two-factor/totp.js.map +1 -1
  443. package/dist/two-factor/types.d.ts +3 -0
  444. package/dist/two-factor/types.d.ts.map +1 -1
  445. package/dist/two-factor/types.js +5 -0
  446. package/dist/two-factor/types.js.map +1 -1
  447. package/dist/users/gdpr.d.ts +2 -40
  448. package/dist/users/gdpr.d.ts.map +1 -1
  449. package/dist/users/gdpr.js +3 -110
  450. package/dist/users/gdpr.js.map +1 -1
  451. package/dist/users/index.d.ts +5 -4
  452. package/dist/users/index.d.ts.map +1 -1
  453. package/dist/users/index.js +5 -4
  454. package/dist/users/index.js.map +1 -1
  455. package/dist/users/repository.d.ts +49 -3
  456. package/dist/users/repository.d.ts.map +1 -1
  457. package/dist/users/repository.js +169 -18
  458. package/dist/users/repository.js.map +1 -1
  459. package/dist/users/service.d.ts +19 -51
  460. package/dist/users/service.d.ts.map +1 -1
  461. package/dist/users/service.js +72 -122
  462. package/dist/users/service.js.map +1 -1
  463. package/dist/users/types.d.ts +4 -5
  464. package/dist/users/types.d.ts.map +1 -1
  465. package/dist/users/types.js.map +1 -1
  466. package/dist/users/validators.d.ts +28 -0
  467. package/dist/users/validators.d.ts.map +1 -0
  468. package/dist/users/validators.js +25 -0
  469. package/dist/users/validators.js.map +1 -0
  470. package/locales/default/en/errors.json +2 -1
  471. package/migrations/024_application_client_correction.sql +39 -0
  472. package/migrations/025_record_deletion_lifecycle.sql +26 -0
  473. package/migrations/026_simplify_user_lifecycle.sql +33 -0
  474. package/migrations/027_branding_asset_size_limits.sql +19 -0
  475. package/migrations/028_totp_replay_protection.sql +17 -0
  476. package/migrations/029_public_session_identifiers.sql +16 -0
  477. package/migrations/030_global_configuration_catalog.sql +39 -0
  478. package/migrations/031_monotonic_updated_at.sql +28 -0
  479. package/package.json +2 -2
  480. package/dist/lib/data-import-plan.d.ts +0 -50
  481. package/dist/lib/data-import-plan.d.ts.map +0 -1
  482. package/dist/lib/data-import-plan.js +0 -235
  483. package/dist/lib/data-import-plan.js.map +0 -1
  484. package/dist/lib/data-import.d.ts +0 -276
  485. package/dist/lib/data-import.d.ts.map +0 -1
  486. package/dist/lib/data-import.js +0 -1694
  487. package/dist/lib/data-import.js.map +0 -1
@@ -0,0 +1,388 @@
1
+ /** Explicit PostgreSQL reads used by selective portability export. */
2
+ import { PortabilityError } from './types.js';
3
+ import { validateImage } from '../lib/image-validator.js';
4
+ /** Create the fixed safe rejection used for unavailable or protected export scope. */
5
+ function rejectedScope() {
6
+ return new PortabilityError(409, 'export_scope_rejected', 'Export scope rejected');
7
+ }
8
+ /** Convert an organization database row into its portable representation. */
9
+ function portableOrganization(row) {
10
+ return {
11
+ slug: row.slug,
12
+ name: row.name,
13
+ status: row.status,
14
+ default_locale: row.default_locale,
15
+ default_login_methods: row.default_login_methods,
16
+ two_factor_policy: row.two_factor_policy,
17
+ branding: {
18
+ logo_url: row.branding_logo_url,
19
+ favicon_url: row.branding_favicon_url,
20
+ primary_color: row.branding_primary_color,
21
+ company_name: row.branding_company_name,
22
+ custom_css: row.branding_custom_css,
23
+ logo_asset: null,
24
+ favicon_asset: null,
25
+ },
26
+ };
27
+ }
28
+ /** Convert a user row into the exact portable profile without operational account state. */
29
+ function portableUser(row) {
30
+ return {
31
+ organization_slug: row.organization_slug,
32
+ email: row.email.toLowerCase(),
33
+ email_verified: row.email_verified,
34
+ given_name: row.given_name,
35
+ family_name: row.family_name,
36
+ middle_name: row.middle_name,
37
+ nickname: row.nickname,
38
+ preferred_username: row.preferred_username,
39
+ profile_url: row.profile_url,
40
+ picture_url: row.picture_url,
41
+ website_url: row.website_url,
42
+ gender: row.gender,
43
+ birthdate: row.birthdate,
44
+ zoneinfo: row.zoneinfo,
45
+ locale: row.locale,
46
+ phone_number: row.phone_number,
47
+ phone_number_verified: row.phone_number_verified,
48
+ address_street: row.address_street,
49
+ address_locality: row.address_locality,
50
+ address_region: row.address_region,
51
+ address_postal_code: row.address_postal_code,
52
+ address_country: row.address_country,
53
+ status: row.status === 'locked' ? 'active' : row.status,
54
+ };
55
+ }
56
+ /** Compare already-normalized text with stable code-point ordering. */
57
+ function compareText(left, right) {
58
+ return left < right ? -1 : left > right ? 1 : 0;
59
+ }
60
+ /** Compare records by each natural-key component in order. */
61
+ function compareNaturalKey(left, right) {
62
+ for (let index = 0; index < left.length; index += 1) {
63
+ const result = compareText(left[index] ?? '', right[index] ?? '');
64
+ if (result !== 0)
65
+ return result;
66
+ }
67
+ return 0;
68
+ }
69
+ /**
70
+ * Resolve an organization or environment export scope while excluding the control plane.
71
+ *
72
+ * @param client - Request-owned PostgreSQL client
73
+ * @param scope - Validated public export scope
74
+ * @param controlPlaneOrganizationId - Authenticated control-plane organization identifier
75
+ * @returns Portable organizations and private identifiers for dependent reads
76
+ * @throws PortabilityError when an organization scope is missing or protected
77
+ */
78
+ export async function readOrganizationExportScope(client, scope, controlPlaneOrganizationId) {
79
+ const parameters = scope.kind === 'organization'
80
+ ? [controlPlaneOrganizationId, scope.organization_slug]
81
+ : [controlPlaneOrganizationId];
82
+ const scopePredicate = scope.kind === 'organization' ? 'AND slug = $2' : '';
83
+ const result = await client.query(`SELECT id, slug, name, status, default_locale, default_login_methods,
84
+ two_factor_policy, branding_logo_url, branding_favicon_url,
85
+ branding_primary_color, branding_company_name, branding_custom_css
86
+ FROM organizations
87
+ WHERE is_super_admin = FALSE
88
+ AND id <> $1
89
+ ${scopePredicate}
90
+ ORDER BY slug COLLATE "C"`, parameters);
91
+ if (scope.kind === 'organization' && result.rows.length !== 1)
92
+ throw rejectedScope();
93
+ return {
94
+ organizationIds: result.rows.map((row) => row.id),
95
+ organizations: result.rows
96
+ .map(portableOrganization)
97
+ .sort((left, right) => compareText(left.slug, right.slug)),
98
+ };
99
+ }
100
+ /**
101
+ * Resolve the explicit global application selection and exclude Porta's Admin application.
102
+ *
103
+ * @param client - Request-owned PostgreSQL client
104
+ * @param selection - Validated all-or-explicit application choice
105
+ * @returns Portable applications and private identifiers for dependent reads
106
+ * @throws PortabilityError when an explicit slug is missing or selects the Admin application
107
+ */
108
+ export async function readApplicationExportSelection(client, selection) {
109
+ if (selection.application_slugs.includes('porta-admin'))
110
+ throw rejectedScope();
111
+ const result = await client.query(`SELECT id, slug, name, description, status
112
+ FROM applications
113
+ WHERE slug <> 'porta-admin'
114
+ AND ($1::boolean OR slug = ANY($2::text[]))
115
+ ORDER BY slug COLLATE "C"`, [selection.all_applications, selection.application_slugs]);
116
+ if (!selection.all_applications && result.rows.length !== selection.application_slugs.length) {
117
+ throw rejectedScope();
118
+ }
119
+ return {
120
+ applicationIds: result.rows.map((row) => row.id),
121
+ applications: result.rows
122
+ .map(({ slug, name, description, status }) => ({
123
+ slug,
124
+ name,
125
+ description,
126
+ status,
127
+ }))
128
+ .sort((left, right) => compareText(left.slug, right.slug)),
129
+ };
130
+ }
131
+ /**
132
+ * Read the complete portable authorization graph for selected applications.
133
+ *
134
+ * @param client - Request-owned PostgreSQL client
135
+ * @param applicationIds - Resolved internal application identifiers
136
+ * @returns All portable child collections for those applications
137
+ */
138
+ export async function readAuthorizationExportGraph(client, applicationIds) {
139
+ if (applicationIds.length === 0) {
140
+ return {
141
+ applicationModules: [],
142
+ roles: [],
143
+ permissions: [],
144
+ claimDefinitions: [],
145
+ rolePermissionMappings: [],
146
+ };
147
+ }
148
+ const modules = await client.query(`SELECT a.slug AS application_slug, m.slug, m.name, m.description, m.status
149
+ FROM application_modules m
150
+ JOIN applications a ON a.id = m.application_id
151
+ WHERE m.application_id = ANY($1::uuid[])
152
+ ORDER BY a.slug COLLATE "C", m.slug COLLATE "C"`, [applicationIds]);
153
+ const roles = await client.query(`SELECT a.slug AS application_slug, r.slug, r.name, r.description
154
+ FROM roles r
155
+ JOIN applications a ON a.id = r.application_id
156
+ WHERE r.application_id = ANY($1::uuid[])
157
+ ORDER BY a.slug COLLATE "C", BTRIM(r.slug) COLLATE "C"`, [applicationIds]);
158
+ const permissions = await client.query(`SELECT a.slug AS application_slug, p.slug, m.slug AS module_slug,
159
+ p.name, p.description
160
+ FROM permissions p
161
+ JOIN applications a ON a.id = p.application_id
162
+ LEFT JOIN application_modules m ON m.id = p.module_id
163
+ WHERE p.application_id = ANY($1::uuid[])
164
+ ORDER BY a.slug COLLATE "C", BTRIM(p.slug) COLLATE "C"`, [applicationIds]);
165
+ const claims = await client.query(`SELECT a.slug AS application_slug, c.claim_name, c.claim_type, c.description,
166
+ c.include_in_id_token, c.include_in_access_token, c.include_in_userinfo
167
+ FROM custom_claim_definitions c
168
+ JOIN applications a ON a.id = c.application_id
169
+ WHERE c.application_id = ANY($1::uuid[])
170
+ ORDER BY a.slug COLLATE "C", c.claim_name COLLATE "C"`, [applicationIds]);
171
+ const mappings = await client.query(`SELECT a.slug AS application_slug, r.slug AS role_slug,
172
+ ARRAY_AGG(p.slug ORDER BY BTRIM(p.slug) COLLATE "C") AS permission_slugs
173
+ FROM role_permissions rp
174
+ JOIN roles r ON r.id = rp.role_id
175
+ JOIN permissions p ON p.id = rp.permission_id
176
+ JOIN applications a ON a.id = r.application_id
177
+ WHERE r.application_id = ANY($1::uuid[])
178
+ AND p.application_id = r.application_id
179
+ GROUP BY a.slug, r.slug
180
+ ORDER BY a.slug COLLATE "C", BTRIM(r.slug) COLLATE "C"`, [applicationIds]);
181
+ return {
182
+ applicationModules: modules.rows
183
+ .map(({ application_slug, slug, name, description, status }) => ({
184
+ application_slug,
185
+ slug,
186
+ name,
187
+ description,
188
+ status,
189
+ }))
190
+ .sort((left, right) => compareNaturalKey([left.application_slug, left.slug], [right.application_slug, right.slug])),
191
+ roles: roles.rows
192
+ .map(({ application_slug, slug, name, description }) => ({
193
+ application_slug,
194
+ slug: slug.trim(),
195
+ name,
196
+ description,
197
+ }))
198
+ .sort((left, right) => compareNaturalKey([left.application_slug, left.slug], [right.application_slug, right.slug])),
199
+ permissions: permissions.rows
200
+ .map(({ application_slug, slug, module_slug, name, description }) => ({
201
+ application_slug,
202
+ slug: slug.trim(),
203
+ module_slug,
204
+ name,
205
+ description,
206
+ }))
207
+ .sort((left, right) => compareNaturalKey([left.application_slug, left.slug], [right.application_slug, right.slug])),
208
+ claimDefinitions: claims.rows
209
+ .map(({ application_slug, claim_name, claim_type, description, include_in_id_token, include_in_access_token, include_in_userinfo, }) => ({
210
+ application_slug,
211
+ claim_name,
212
+ claim_type,
213
+ description,
214
+ include_in_id_token,
215
+ include_in_access_token,
216
+ include_in_userinfo,
217
+ }))
218
+ .sort((left, right) => compareNaturalKey([left.application_slug, left.claim_name], [right.application_slug, right.claim_name])),
219
+ rolePermissionMappings: mappings.rows
220
+ .map(({ application_slug, role_slug, permission_slugs }) => ({
221
+ application_slug,
222
+ role_slug: role_slug.trim(),
223
+ permission_slugs: permission_slugs.map((slug) => slug.trim()).sort(compareText),
224
+ }))
225
+ .sort((left, right) => compareNaturalKey([left.application_slug, left.role_slug], [right.application_slug, right.role_slug])),
226
+ };
227
+ }
228
+ /**
229
+ * Attach validated stored branding bytes to portable organization records.
230
+ *
231
+ * @param client - Request-owned PostgreSQL client
232
+ * @param organizations - Portable organizations in the selected scope
233
+ * @param organizationIds - Matching private organization identifiers
234
+ * @returns Organization records with validated logo and favicon content
235
+ * @throws Error when stored bytes no longer satisfy the branding validation boundary
236
+ */
237
+ export async function attachOrganizationBrandingAssets(client, organizations, organizationIds) {
238
+ if (organizationIds.length === 0)
239
+ return organizations;
240
+ const assets = await client.query(`SELECT o.slug AS organization_slug, b.asset_type, b.content_type, b.data
241
+ FROM branding_assets b
242
+ JOIN organizations o ON o.id = b.organization_id
243
+ WHERE b.organization_id = ANY($1::uuid[])
244
+ ORDER BY o.slug COLLATE "C", b.asset_type COLLATE "C"`, [organizationIds]);
245
+ const byOrganization = new Map();
246
+ for (const asset of assets.rows) {
247
+ const validation = validateImage(asset.data, asset.content_type, asset.asset_type);
248
+ if (!validation.valid || validation.data === undefined) {
249
+ throw new Error('Stored branding asset is invalid');
250
+ }
251
+ const organizationAssets = byOrganization.get(asset.organization_slug) ?? {};
252
+ organizationAssets[asset.asset_type] = { ...asset, data: validation.data };
253
+ byOrganization.set(asset.organization_slug, organizationAssets);
254
+ }
255
+ return organizations.map((organization) => {
256
+ const organizationAssets = byOrganization.get(organization.slug);
257
+ const logo = organizationAssets?.logo;
258
+ const favicon = organizationAssets?.favicon;
259
+ return {
260
+ ...organization,
261
+ branding: {
262
+ ...organization.branding,
263
+ logo_asset: logo === undefined
264
+ ? null
265
+ : { media_type: logo.content_type, content_base64: logo.data.toString('base64') },
266
+ favicon_asset: favicon === undefined
267
+ ? null
268
+ : { media_type: favicon.content_type, content_base64: favicon.data.toString('base64') },
269
+ },
270
+ };
271
+ });
272
+ }
273
+ /**
274
+ * Read every scoped user and only relationships owned by selected applications.
275
+ *
276
+ * @param client - Request-owned PostgreSQL client
277
+ * @param organizationIds - Resolved organization scope identifiers
278
+ * @param applicationIds - Resolved application selection identifiers
279
+ * @returns Portable users, role assignments, and claim values
280
+ */
281
+ export async function readUserExportGraph(client, organizationIds, applicationIds) {
282
+ if (organizationIds.length === 0) {
283
+ return { users: [], userRoleAssignments: [], userClaimValues: [] };
284
+ }
285
+ const users = await client.query(`SELECT o.slug AS organization_slug, u.email::text AS email, u.email_verified,
286
+ u.given_name, u.family_name, u.middle_name, u.nickname, u.preferred_username,
287
+ u.profile_url, u.picture_url, u.website_url, u.gender, u.birthdate::text AS birthdate,
288
+ u.zoneinfo, u.locale, u.phone_number, u.phone_number_verified, u.address_street,
289
+ u.address_locality, u.address_region, u.address_postal_code, u.address_country,
290
+ u.status
291
+ FROM users u
292
+ JOIN organizations o ON o.id = u.organization_id
293
+ WHERE u.organization_id = ANY($1::uuid[])
294
+ ORDER BY o.slug COLLATE "C", LOWER(u.email::text) COLLATE "C"`, [organizationIds]);
295
+ const assignments = applicationIds.length === 0
296
+ ? { rows: [] }
297
+ : await client.query(`SELECT o.slug AS organization_slug, u.email::text AS email,
298
+ a.slug AS application_slug, r.slug AS role_slug
299
+ FROM user_roles ur
300
+ JOIN users u ON u.id = ur.user_id
301
+ JOIN organizations o ON o.id = u.organization_id
302
+ JOIN roles r ON r.id = ur.role_id
303
+ JOIN applications a ON a.id = r.application_id
304
+ WHERE u.organization_id = ANY($1::uuid[])
305
+ AND r.application_id = ANY($2::uuid[])
306
+ ORDER BY o.slug COLLATE "C", LOWER(u.email::text) COLLATE "C",
307
+ a.slug COLLATE "C", BTRIM(r.slug) COLLATE "C"`, [organizationIds, applicationIds]);
308
+ const claimValues = applicationIds.length === 0
309
+ ? { rows: [] }
310
+ : await client.query(`SELECT o.slug AS organization_slug, u.email::text AS email,
311
+ a.slug AS application_slug, c.claim_name, v.value
312
+ FROM custom_claim_values v
313
+ JOIN users u ON u.id = v.user_id
314
+ JOIN organizations o ON o.id = u.organization_id
315
+ JOIN custom_claim_definitions c ON c.id = v.claim_id
316
+ JOIN applications a ON a.id = c.application_id
317
+ WHERE u.organization_id = ANY($1::uuid[])
318
+ AND c.application_id = ANY($2::uuid[])
319
+ ORDER BY o.slug COLLATE "C", LOWER(u.email::text) COLLATE "C",
320
+ a.slug COLLATE "C", c.claim_name COLLATE "C"`, [organizationIds, applicationIds]);
321
+ return {
322
+ users: users.rows
323
+ .map(portableUser)
324
+ .sort((left, right) => compareNaturalKey([left.organization_slug, left.email], [right.organization_slug, right.email])),
325
+ userRoleAssignments: assignments.rows
326
+ .map(({ organization_slug, email, application_slug, role_slug }) => ({
327
+ organization_slug,
328
+ email: email.toLowerCase(),
329
+ application_slug,
330
+ role_slug: role_slug.trim(),
331
+ }))
332
+ .sort((left, right) => compareNaturalKey([left.organization_slug, left.email, left.application_slug, left.role_slug], [right.organization_slug, right.email, right.application_slug, right.role_slug])),
333
+ userClaimValues: claimValues.rows
334
+ .map(({ organization_slug, email, application_slug, claim_name, value }) => ({
335
+ organization_slug,
336
+ email: email.toLowerCase(),
337
+ application_slug,
338
+ claim_name,
339
+ value,
340
+ }))
341
+ .sort((left, right) => compareNaturalKey([left.organization_slug, left.email, left.application_slug, left.claim_name], [right.organization_slug, right.email, right.application_slug, right.claim_name])),
342
+ };
343
+ }
344
+ /**
345
+ * Read OIDC clients owned by both the selected organization and application scopes.
346
+ *
347
+ * @param client - Request-owned PostgreSQL client
348
+ * @param organizationIds - Resolved organization scope identifiers
349
+ * @param applicationIds - Resolved application selection identifiers
350
+ * @returns Portable clients without credential material
351
+ */
352
+ export async function readClientExportRecords(client, organizationIds, applicationIds) {
353
+ if (organizationIds.length === 0 || applicationIds.length === 0)
354
+ return [];
355
+ const result = await client.query(`SELECT c.client_id, o.slug AS organization_slug, a.slug AS application_slug,
356
+ c.client_name AS name, c.client_type, c.application_type, c.status,
357
+ c.grant_types, c.response_types, c.scope, c.login_methods,
358
+ c.token_endpoint_auth_method, c.redirect_uris,
359
+ COALESCE(c.post_logout_redirect_uris, '{}') AS post_logout_redirect_uris,
360
+ COALESCE(c.allowed_origins, '{}') AS allowed_origins, c.require_pkce
361
+ FROM clients c
362
+ JOIN organizations o ON o.id = c.organization_id
363
+ JOIN applications a ON a.id = c.application_id
364
+ WHERE c.organization_id = ANY($1::uuid[])
365
+ AND c.application_id = ANY($2::uuid[])
366
+ ORDER BY c.client_id COLLATE "C"`, [organizationIds, applicationIds]);
367
+ return result.rows
368
+ .map(({ client_id, organization_slug, application_slug, name, client_type, application_type, status, grant_types, response_types, scope, login_methods, token_endpoint_auth_method, redirect_uris, post_logout_redirect_uris, allowed_origins, require_pkce, }) => ({
369
+ client_id,
370
+ organization_slug,
371
+ application_slug,
372
+ name,
373
+ client_type,
374
+ application_type,
375
+ status,
376
+ grant_types,
377
+ response_types,
378
+ scope,
379
+ login_methods,
380
+ token_endpoint_auth_method,
381
+ redirect_uris,
382
+ post_logout_redirect_uris,
383
+ allowed_origins,
384
+ require_pkce,
385
+ }))
386
+ .sort((left, right) => compareText(left.client_id, right.client_id));
387
+ }
388
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/portability/repository.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAmBtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAkB,MAAM,2BAA2B,CAAC;AA+H1E,sFAAsF;AACtF,SAAS,aAAa;IACpB,OAAO,IAAI,gBAAgB,CAAC,GAAG,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;AACrF,CAAC;AAED,6EAA6E;AAC7E,SAAS,oBAAoB,CAAC,GAA0B;IACtD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;QAChD,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,QAAQ,EAAE;YACR,QAAQ,EAAE,GAAG,CAAC,iBAAiB;YAC/B,WAAW,EAAE,GAAG,CAAC,oBAAoB;YACrC,aAAa,EAAE,GAAG,CAAC,sBAAsB;YACzC,YAAY,EAAE,GAAG,CAAC,qBAAqB;YACvC,UAAU,EAAE,GAAG,CAAC,mBAAmB;YACnC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;SACpB;KACF,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,SAAS,YAAY,CAAC,GAAkB;IACtC,OAAO;QACL,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;QAC9B,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;QAC1C,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;QAChD,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;KACxD,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,8DAA8D;AAC9D,SAAS,iBAAiB,CAAC,IAAuB,EAAE,KAAwB;IAC1E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAkB,EAClB,KAAuB,EACvB,0BAAkC;IAElC,MAAM,UAAU,GACd,KAAK,CAAC,IAAI,KAAK,cAAc;QAC3B,CAAC,CAAC,CAAC,0BAA0B,EAAE,KAAK,CAAC,iBAAiB,CAAC;QACvD,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACnC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;;;;;;UAMM,cAAc;gCACQ,EAC5B,UAAU,CACX,CAAC;IAEF,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,aAAa,EAAE,CAAC;IACrF,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,aAAa,EAAE,MAAM,CAAC,IAAI;aACvB,GAAG,CAAC,oBAAoB,CAAC;aACzB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAkB,EAClB,SAA0C;IAE1C,IAAI,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,MAAM,aAAa,EAAE,CAAC;IAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;;;;gCAI4B,EAC5B,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAC1D,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,gBAAgB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;QAC7F,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC;IACD,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,YAAY,EAAE,MAAM,CAAC,IAAI;aACtB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,MAAM;SACP,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAkB,EAClB,cAAiC;IAEjC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,kBAAkB,EAAE,EAAE;YACtB,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,EAAE;YACpB,sBAAsB,EAAE,EAAE;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAChC;;;;wDAIoD,EACpD,CAAC,cAAc,CAAC,CACjB,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAC9B;;;;+DAI2D,EAC3D,CAAC,cAAc,CAAC,CACjB,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CACpC;;;;;;+DAM2D,EAC3D,CAAC,cAAc,CAAC,CACjB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;;;;;8DAK0D,EAC1D,CAAC,cAAc,CAAC,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC;;;;;;;;;+DAS2D,EAC3D,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,IAAI;aAC7B,GAAG,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/D,gBAAgB;YAChB,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,MAAM;SACP,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAC5F;QACH,KAAK,EAAE,KAAK,CAAC,IAAI;aACd,GAAG,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YACvD,gBAAgB;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,IAAI;YACJ,WAAW;SACZ,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAC5F;QACH,WAAW,EAAE,WAAW,CAAC,IAAI;aAC1B,GAAG,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YACpE,gBAAgB;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,WAAW;YACX,IAAI;YACJ,WAAW;SACZ,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAC5F;QACH,gBAAgB,EAAE,MAAM,CAAC,IAAI;aAC1B,GAAG,CACF,CAAC,EACC,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,EAAE,EAAE,CAAC,CAAC;YACL,gBAAgB;YAChB,UAAU;YACV,UAAU;YACV,WAAW;YACX,mBAAmB;YACnB,uBAAuB;YACvB,mBAAmB;SACpB,CAAC,CACH;aACA,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CACf,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,EACxC,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,UAAU,CAAC,CAC3C,CACF;QACH,sBAAsB,EAAE,QAAQ,CAAC,IAAI;aAClC,GAAG,CAAC,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3D,gBAAgB;YAChB,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE;YAC3B,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;SAChF,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CACf,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,EACvC,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,CAC1C,CACF;KACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,MAAkB,EAClB,aAAiD,EACjD,eAAkC;IAElC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;;;;4DAIwD,EACxD,CAAC,eAAe,CAAC,CAClB,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,GAAG,EAA8D,CAAC;IAC7F,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,kBAAkB,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAC7E,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;QAC3E,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACxC,MAAM,kBAAkB,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,kBAAkB,EAAE,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,kBAAkB,EAAE,OAAO,CAAC;QAC5C,OAAO;YACL,GAAG,YAAY;YACf,QAAQ,EAAE;gBACR,GAAG,YAAY,CAAC,QAAQ;gBACxB,UAAU,EACR,IAAI,KAAK,SAAS;oBAChB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBACrF,aAAa,EACX,OAAO,KAAK,SAAS;oBACnB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;aAC5F;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAkB,EAClB,eAAkC,EAClC,cAAiC;IAEjC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAC9B;;;;;;;;;oEASgE,EAChE,CAAC,eAAe,CAAC,CAClB,CAAC;IACF,MAAM,WAAW,GACf,cAAc,CAAC,MAAM,KAAK,CAAC;QACzB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACd,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAChB;;;;;;;;;;qEAU2D,EAC3D,CAAC,eAAe,EAAE,cAAc,CAAC,CAClC,CAAC;IACR,MAAM,WAAW,GACf,cAAc,CAAC,MAAM,KAAK,CAAC;QACzB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACd,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAChB;;;;;;;;;;oEAU0D,EAC1D,CAAC,eAAe,EAAE,cAAc,CAAC,CAClC,CAAC;IACR,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,IAAI;aACd,GAAG,CAAC,YAAY,CAAC;aACjB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CACf,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,EACpC,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,CACvC,CACF;QACH,mBAAmB,EAAE,WAAW,CAAC,IAAI;aAClC,GAAG,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACnE,iBAAiB;YACjB,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;YAC1B,gBAAgB;YAChB,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE;SAC5B,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CACf,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,EAC3E,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,CAChF,CACF;QACH,eAAe,EAAE,WAAW,CAAC,IAAI;aAC9B,GAAG,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3E,iBAAiB;YACjB,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;YAC1B,gBAAgB;YAChB,UAAU;YACV,KAAK;SACN,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,iBAAiB,CACf,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,EAC5E,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,UAAU,CAAC,CACjF,CACF;KACJ,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAkB,EAClB,eAAkC,EAClC,cAAiC;IAEjC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;;;;;;;;;;;uCAWmC,EACnC,CAAC,eAAe,EAAE,cAAc,CAAC,CAClC,CAAC;IACF,OAAO,MAAM,CAAC,IAAI;SACf,GAAG,CACF,CAAC,EACC,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,WAAW,EACX,cAAc,EACd,KAAK,EACL,aAAa,EACb,0BAA0B,EAC1B,aAAa,EACb,yBAAyB,EACzB,eAAe,EACf,YAAY,GACb,EAAE,EAAE,CAAC,CAAC;QACL,SAAS;QACT,iBAAiB;QACjB,gBAAgB;QAChB,IAAI;QACJ,WAAW;QACX,gBAAgB;QAChB,MAAM;QACN,WAAW;QACX,cAAc;QACd,KAAK;QACL,aAAa;QACb,0BAA0B;QAC1B,aAAa;QACb,yBAAyB;QACzB,eAAe;QACf,YAAY;KACb,CAAC,CACH;SACA,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC"}