@kyro-cms/core 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -589
- package/dist/{WebhookService-118ZTFis.d.ts → WebhookService-CUTb9XOy.d.ts} +1 -1
- package/dist/{WebhookService-AefJfqX0.d.cts → WebhookService-Yg2UEOB4.d.cts} +1 -1
- package/dist/api-handler-graphql.cjs +44 -0
- package/dist/api-handler-graphql.cjs.map +1 -0
- package/dist/api-handler-graphql.d.cts +6 -0
- package/dist/api-handler-graphql.d.ts +6 -0
- package/dist/api-handler-graphql.js +41 -0
- package/dist/api-handler-graphql.js.map +1 -0
- package/dist/api-handler-trpc.cjs +38 -0
- package/dist/api-handler-trpc.cjs.map +1 -0
- package/dist/api-handler-trpc.d.cts +5 -0
- package/dist/api-handler-trpc.d.ts +5 -0
- package/dist/api-handler-trpc.js +36 -0
- package/dist/api-handler-trpc.js.map +1 -0
- package/dist/api-handler.cjs +31 -97
- package/dist/api-handler.cjs.map +1 -1
- package/dist/api-handler.d.cts +2 -1
- package/dist/api-handler.d.ts +2 -1
- package/dist/api-handler.js +19 -95
- package/dist/api-handler.js.map +1 -1
- package/dist/{tenant-B1YB0Jy8.d.ts → base-B71y_EAF.d.cts} +6 -12
- package/dist/{tenant-Cpeveji6.d.cts → base-DaqY2GhA.d.ts} +6 -12
- package/dist/bootstrap-5NLASFOG.cjs +32 -0
- package/dist/{bootstrap-AKAUP6F6.cjs.map → bootstrap-5NLASFOG.cjs.map} +1 -1
- package/dist/bootstrap-T5BK77LD.js +7 -0
- package/dist/{bootstrap-JCML6NFO.js.map → bootstrap-T5BK77LD.js.map} +1 -1
- package/dist/{chunk-35U3FROB.js → chunk-22M4O4ZJ.js} +607 -63
- package/dist/chunk-22M4O4ZJ.js.map +1 -0
- package/dist/chunk-2HZRBATX.cjs +253 -0
- package/dist/chunk-2HZRBATX.cjs.map +1 -0
- package/dist/{chunk-VJT6P4N6.cjs → chunk-3HR772HI.cjs} +199 -32
- package/dist/chunk-3HR772HI.cjs.map +1 -0
- package/dist/chunk-3KTWGODI.cjs +178 -0
- package/dist/chunk-3KTWGODI.cjs.map +1 -0
- package/dist/{chunk-QXIQWPAP.js → chunk-3UK5XBVJ.js} +4 -134
- package/dist/chunk-3UK5XBVJ.js.map +1 -0
- package/dist/{chunk-FXYP2HA6.js → chunk-4AO3A3JM.js} +48 -4
- package/dist/chunk-4AO3A3JM.js.map +1 -0
- package/dist/chunk-4M7X5HAB.cjs +173 -0
- package/dist/chunk-4M7X5HAB.cjs.map +1 -0
- package/dist/chunk-5EPFQUQD.js +3243 -0
- package/dist/chunk-5EPFQUQD.js.map +1 -0
- package/dist/{chunk-Y3N7UUDO.js → chunk-7OGPN7MP.js} +5 -2
- package/dist/chunk-7OGPN7MP.js.map +1 -0
- package/dist/{chunk-WOWUL7ZY.js → chunk-AL5KX63J.js} +4 -3
- package/dist/chunk-AL5KX63J.js.map +1 -0
- package/dist/{chunk-2OL4O2TH.cjs → chunk-C36TMDTY.cjs} +66 -61
- package/dist/chunk-C36TMDTY.cjs.map +1 -0
- package/dist/{chunk-ES5HNFFT.js → chunk-CF7OL6HR.js} +4 -2
- package/dist/chunk-CF7OL6HR.js.map +1 -0
- package/dist/chunk-CJONKRHJ.js +162 -0
- package/dist/chunk-CJONKRHJ.js.map +1 -0
- package/dist/{chunk-2KVHZE6O.cjs → chunk-COIASRDK.cjs} +202 -46
- package/dist/chunk-COIASRDK.cjs.map +1 -0
- package/dist/chunk-DEVFAKCQ.cjs +3291 -0
- package/dist/chunk-DEVFAKCQ.cjs.map +1 -0
- package/dist/{chunk-3ZFYL34R.js → chunk-DYTZ6FQ7.js} +12 -185
- package/dist/chunk-DYTZ6FQ7.js.map +1 -0
- package/dist/{chunk-QPPDLRNR.js → chunk-EJN2PAOE.js} +197 -41
- package/dist/chunk-EJN2PAOE.js.map +1 -0
- package/dist/chunk-FAXU7BMP.js +220 -0
- package/dist/chunk-FAXU7BMP.js.map +1 -0
- package/dist/{chunk-OHVB4AJ7.js → chunk-FOPGUM27.js} +22 -17
- package/dist/chunk-FOPGUM27.js.map +1 -0
- package/dist/chunk-GAOXD3XT.js +175 -0
- package/dist/chunk-GAOXD3XT.js.map +1 -0
- package/dist/{chunk-4DA7QPLA.cjs → chunk-GXFOGU7N.cjs} +5 -2
- package/dist/chunk-GXFOGU7N.cjs.map +1 -0
- package/dist/{chunk-I7HHI6QV.cjs → chunk-IDVRRRAK.cjs} +17 -9
- package/dist/chunk-IDVRRRAK.cjs.map +1 -0
- package/dist/{chunk-WQBRWOQT.cjs → chunk-JOPVMWTM.cjs} +3 -2
- package/dist/chunk-JOPVMWTM.cjs.map +1 -0
- package/dist/chunk-KC2GDBLS.cjs +84 -0
- package/dist/chunk-KC2GDBLS.cjs.map +1 -0
- package/dist/{chunk-K7JPTH3G.cjs → chunk-KNRSROWB.cjs} +132 -74
- package/dist/chunk-KNRSROWB.cjs.map +1 -0
- package/dist/{chunk-3AJE4SEG.js → chunk-KPA4AN4R.js} +125 -67
- package/dist/chunk-KPA4AN4R.js.map +1 -0
- package/dist/{chunk-QUW2RZTM.cjs → chunk-L46ROHUS.cjs} +51 -7
- package/dist/chunk-L46ROHUS.cjs.map +1 -0
- package/dist/chunk-L4EZKIEX.js +185 -0
- package/dist/chunk-L4EZKIEX.js.map +1 -0
- package/dist/{chunk-REK7AYOC.js → chunk-L5UKKZQN.js} +199 -32
- package/dist/chunk-L5UKKZQN.js.map +1 -0
- package/dist/chunk-NKPKR5BW.cjs +188 -0
- package/dist/chunk-NKPKR5BW.cjs.map +1 -0
- package/dist/{chunk-Y3QQN7PN.js → chunk-P2HKJ7P5.js} +13 -4
- package/dist/chunk-P2HKJ7P5.js.map +1 -0
- package/dist/{chunk-SA7NSSIQ.cjs → chunk-PI73NNOK.cjs} +13 -187
- package/dist/chunk-PI73NNOK.cjs.map +1 -0
- package/dist/{chunk-HXRD4B37.js → chunk-PU2Z5VWF.js} +1279 -556
- package/dist/chunk-PU2Z5VWF.js.map +1 -0
- package/dist/{chunk-H727JIG7.js → chunk-Q72BOAPK.js} +16 -8
- package/dist/chunk-Q72BOAPK.js.map +1 -0
- package/dist/{chunk-IBG6V56E.cjs → chunk-QFLB4EIJ.cjs} +2 -139
- package/dist/chunk-QFLB4EIJ.cjs.map +1 -0
- package/dist/{chunk-YVUJBEXE.cjs → chunk-RAMGUDJN.cjs} +16 -7
- package/dist/chunk-RAMGUDJN.cjs.map +1 -0
- package/dist/{chunk-LINKCEG4.cjs → chunk-ROJHKAQ4.cjs} +617 -73
- package/dist/chunk-ROJHKAQ4.cjs.map +1 -0
- package/dist/{chunk-5KVM3WEY.cjs → chunk-RSF3UU7H.cjs} +1330 -602
- package/dist/chunk-RSF3UU7H.cjs.map +1 -0
- package/dist/{chunk-V3LKPM3O.cjs → chunk-SHTTJMLT.cjs} +4 -2
- package/dist/chunk-SHTTJMLT.cjs.map +1 -0
- package/dist/chunk-SPBTLUN6.js +92 -0
- package/dist/chunk-SPBTLUN6.js.map +1 -0
- package/dist/{chunk-57P6MJKC.js → chunk-TXSZFA4G.js} +3 -3
- package/dist/chunk-TXSZFA4G.js.map +1 -0
- package/dist/chunk-UERVXYVK.cjs +99 -0
- package/dist/chunk-UERVXYVK.cjs.map +1 -0
- package/dist/{chunk-PDYFVNUX.cjs → chunk-V2TVSCV5.cjs} +16 -23
- package/dist/chunk-V2TVSCV5.cjs.map +1 -0
- package/dist/{chunk-DXHRBMGB.js → chunk-VO35MNPH.js} +12 -19
- package/dist/chunk-VO35MNPH.js.map +1 -0
- package/dist/{chunk-IA6AU5PI.cjs → chunk-WNCYAKF3.cjs} +3 -3
- package/dist/chunk-WNCYAKF3.cjs.map +1 -0
- package/dist/chunk-XEB7PH2E.js +81 -0
- package/dist/chunk-XEB7PH2E.js.map +1 -0
- package/dist/cli/index.cjs +5 -5
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +5 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/client.cjs +3 -3
- package/dist/client.d.cts +3 -3
- package/dist/client.d.ts +3 -3
- package/dist/client.js +1 -1
- package/dist/drizzle/index.cjs +14 -13
- package/dist/drizzle/index.d.cts +9 -7
- package/dist/drizzle/index.d.ts +9 -7
- package/dist/drizzle/index.js +5 -4
- package/dist/fields/index.cjs +21 -37
- package/dist/fields/index.d.cts +2 -22
- package/dist/fields/index.d.ts +2 -22
- package/dist/fields/index.js +1 -1
- package/dist/graphql/index.cjs +5 -4
- package/dist/graphql/index.d.cts +5 -3
- package/dist/graphql/index.d.ts +5 -3
- package/dist/graphql/index.js +3 -2
- package/dist/index-CJXPB_ot.d.ts +276 -0
- package/dist/index-CaTNnLGd.d.cts +276 -0
- package/dist/index.cjs +304 -162
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +129 -205
- package/dist/index.d.ts +129 -205
- package/dist/index.js +172 -33
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +2 -2
- package/dist/integration.js +1 -1
- package/dist/mongo-auth-adapter-ISOM7FSS.cjs +17 -0
- package/dist/{mongo-auth-adapter-NHHUJHVH.cjs.map → mongo-auth-adapter-ISOM7FSS.cjs.map} +1 -1
- package/dist/mongo-auth-adapter-MO6STCV3.js +4 -0
- package/dist/{mongo-auth-adapter-NJQUUCTP.js.map → mongo-auth-adapter-MO6STCV3.js.map} +1 -1
- package/dist/mongodb/index.cjs +8 -7
- package/dist/mongodb/index.d.cts +5 -7
- package/dist/mongodb/index.d.ts +5 -7
- package/dist/mongodb/index.js +4 -3
- package/dist/postgres-auth-adapter-DWDR7P5G.js +5 -0
- package/dist/{postgres-auth-adapter-3T2NKTSE.js.map → postgres-auth-adapter-DWDR7P5G.js.map} +1 -1
- package/dist/postgres-auth-adapter-WRWSJD4E.cjs +14 -0
- package/dist/{postgres-auth-adapter-7IEENCKQ.cjs.map → postgres-auth-adapter-WRWSJD4E.cjs.map} +1 -1
- package/dist/redis-adapter-HGTPWIGV.js +4 -0
- package/dist/{redis-adapter-VQXD7ESY.js.map → redis-adapter-HGTPWIGV.js.map} +1 -1
- package/dist/redis-adapter-KJ3YOOT6.cjs +13 -0
- package/dist/{redis-adapter-D2E2S3GB.cjs.map → redis-adapter-KJ3YOOT6.cjs.map} +1 -1
- package/dist/rest/index.cjs +15 -14
- package/dist/rest/index.d.cts +4 -4
- package/dist/rest/index.d.ts +4 -4
- package/dist/rest/index.js +13 -12
- package/dist/{schema-5PHL5IVB.js → schema-6I5OFR4Z.js} +3 -3
- package/dist/{schema-5PHL5IVB.js.map → schema-6I5OFR4Z.js.map} +1 -1
- package/dist/{schema-37SE2F4B.cjs → schema-TTFE4467.cjs} +14 -14
- package/dist/{schema-37SE2F4B.cjs.map → schema-TTFE4467.cjs.map} +1 -1
- package/dist/sqlite-adapter-6GEUSVXQ.js +4 -0
- package/dist/{sqlite-adapter-TR3U3W6Q.js.map → sqlite-adapter-6GEUSVXQ.js.map} +1 -1
- package/dist/sqlite-adapter-CSIZE5SX.cjs +13 -0
- package/dist/{sqlite-adapter-LVK5PS4T.cjs.map → sqlite-adapter-CSIZE5SX.cjs.map} +1 -1
- package/dist/templates/index.cjs +133 -31
- package/dist/templates/index.d.cts +52 -9
- package/dist/templates/index.d.ts +52 -9
- package/dist/templates/index.js +3 -1
- package/dist/trpc/index.cjs +13 -12
- package/dist/trpc/index.d.cts +55 -49
- package/dist/trpc/index.d.ts +55 -49
- package/dist/trpc/index.js +4 -3
- package/dist/{types-D6ZLRGbH.d.cts → types-CpjuXbe7.d.cts} +2 -0
- package/dist/{types-D6ZLRGbH.d.ts → types-CpjuXbe7.d.ts} +2 -0
- package/dist/{types-Bs1up4yP.d.ts → types-CyCQ6SAI.d.ts} +28 -2
- package/dist/{types-J3R9nVsZ.d.cts → types-DJxD9394.d.cts} +28 -2
- package/dist/{types-VtjUxIMp.d.cts → types-Z6FBiqa2.d.cts} +35 -14
- package/dist/{types-VtjUxIMp.d.ts → types-Z6FBiqa2.d.ts} +35 -14
- package/package.json +22 -4
- package/dist/bootstrap-AKAUP6F6.cjs +0 -32
- package/dist/bootstrap-JCML6NFO.js +0 -7
- package/dist/chunk-2KVHZE6O.cjs.map +0 -1
- package/dist/chunk-2OL4O2TH.cjs.map +0 -1
- package/dist/chunk-35U3FROB.js.map +0 -1
- package/dist/chunk-3AJE4SEG.js.map +0 -1
- package/dist/chunk-3J4MFTI3.js +0 -3872
- package/dist/chunk-3J4MFTI3.js.map +0 -1
- package/dist/chunk-3ZFYL34R.js.map +0 -1
- package/dist/chunk-4DA7QPLA.cjs.map +0 -1
- package/dist/chunk-57P6MJKC.js.map +0 -1
- package/dist/chunk-5KVM3WEY.cjs.map +0 -1
- package/dist/chunk-6IMPH6WV.cjs +0 -3897
- package/dist/chunk-6IMPH6WV.cjs.map +0 -1
- package/dist/chunk-ATBOUGQP.cjs +0 -513
- package/dist/chunk-ATBOUGQP.cjs.map +0 -1
- package/dist/chunk-DXHRBMGB.js.map +0 -1
- package/dist/chunk-ES5HNFFT.js.map +0 -1
- package/dist/chunk-FXYP2HA6.js.map +0 -1
- package/dist/chunk-H727JIG7.js.map +0 -1
- package/dist/chunk-HXRD4B37.js.map +0 -1
- package/dist/chunk-I7HHI6QV.cjs.map +0 -1
- package/dist/chunk-IA6AU5PI.cjs.map +0 -1
- package/dist/chunk-IBG6V56E.cjs.map +0 -1
- package/dist/chunk-K7JPTH3G.cjs.map +0 -1
- package/dist/chunk-LINKCEG4.cjs.map +0 -1
- package/dist/chunk-OHVB4AJ7.js.map +0 -1
- package/dist/chunk-PDYFVNUX.cjs.map +0 -1
- package/dist/chunk-Q23JB3KL.js +0 -488
- package/dist/chunk-Q23JB3KL.js.map +0 -1
- package/dist/chunk-QPPDLRNR.js.map +0 -1
- package/dist/chunk-QUW2RZTM.cjs.map +0 -1
- package/dist/chunk-QXIQWPAP.js.map +0 -1
- package/dist/chunk-R3XIBBAW.cjs +0 -34
- package/dist/chunk-R3XIBBAW.cjs.map +0 -1
- package/dist/chunk-REK7AYOC.js.map +0 -1
- package/dist/chunk-SA7NSSIQ.cjs.map +0 -1
- package/dist/chunk-SDMNUYVU.js +0 -30
- package/dist/chunk-SDMNUYVU.js.map +0 -1
- package/dist/chunk-V3LKPM3O.cjs.map +0 -1
- package/dist/chunk-VJT6P4N6.cjs.map +0 -1
- package/dist/chunk-WOWUL7ZY.js.map +0 -1
- package/dist/chunk-WQBRWOQT.cjs.map +0 -1
- package/dist/chunk-Y3N7UUDO.js.map +0 -1
- package/dist/chunk-Y3QQN7PN.js.map +0 -1
- package/dist/chunk-YVUJBEXE.cjs.map +0 -1
- package/dist/index-CLp-DRKA.d.ts +0 -64
- package/dist/index-DfO7G4kN.d.cts +0 -64
- package/dist/mongo-auth-adapter-NHHUJHVH.cjs +0 -17
- package/dist/mongo-auth-adapter-NJQUUCTP.js +0 -4
- package/dist/postgres-auth-adapter-3T2NKTSE.js +0 -5
- package/dist/postgres-auth-adapter-7IEENCKQ.cjs +0 -14
- package/dist/redis-adapter-D2E2S3GB.cjs +0 -13
- package/dist/redis-adapter-VQXD7ESY.js +0 -4
- package/dist/sqlite-adapter-LVK5PS4T.cjs +0 -13
- package/dist/sqlite-adapter-TR3U3W6Q.js +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/secret.ts","../src/api/rest/auth-session.ts","../src/api/rest/auth-middleware.ts","../src/auth/security/in-memory-rate-limit.ts","../src/auth/security/audit-log-types.ts","../src/auth/security/audit-log.ts","../src/auth/security/in-memory-audit-log.ts","../src/api/rest/auth-routes.ts","../src/storage/local.ts","../src/storage/imgix.ts","../src/storage/bunny.ts","../src/storage/registry.ts","../src/storage/s3.ts","../src/storage/cloudinary.ts","../src/storage/ftp.ts","../src/storage/index.ts","../src/storage/processor.ts","../src/storage/MediaService.ts","../src/api/rest/hono-app.ts"],"names":["crypto","createAuditContext","randomBytes","process","path","getUrlPrefix","getUrl","storage","row","totalDocs","user","collections","usersCollection","result","join","existsSync","sharp","db","registry","computeDiff"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,SAAS,aAAa,OAAA,EAAc;AACzC,EAAA,SAAA,GAAY,OAAA;AACd;AAMA,eAAsB,WAAA,GAA6B;AAEjD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA,CAAQ;AAAA,QACrC,UAAA,EAAY,UAAA;AAAA,QACZ,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,OACzB,CAAA;AAED,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,aAAA,GAAgB;AAAA,UACd,SAAA,EAAW,OAAO,SAAA,IAAa,IAAA;AAAA,UAC/B,aAAA,EAAe,OAAO,aAAA,IAAiB,IAAA;AAAA,UACvC,aAAA,EAAe,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,kBAAA,GAC1C;AAAA,YACE,SAAS,MAAA,CAAO,aAAA,IAAiB,CAAA,IAAK,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAAA,YACrD,kBAAA,EAAoB,OAAO,kBAAA,IAAsB;AAAA,WACnD,GACA;AAAA,SACN;AACA,QAAA,OAAA,CAAQ,IAAI,wCAAiC,CAAA;AAC7C,QAAA;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAI,yEAA+D,CAAA;AAAA,IAC7E;AAAA,EACF;AAGA,EAAA,aAAA,GAAgB;AAAA,IACd,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,wBAAA;AAAA,IACrC,aAAA,EAAe,IAAA;AAAA;AAAA,IACf,aAAA,EAAe;AAAA;AAAA,GACjB;AACF;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,IAAA,OAAO,aAAA,CAAc,SAAA;AAAA,EACvB;AACA,EAAA,OAAO,OAAA,CAAQ,IAAI,UAAA,IAAc,wBAAA;AACnC;AAEO,SAAS,gBAAA,GAA2B;AACzC,EAAA,IAAI,eAAe,aAAA,EAAe;AAChC,IAAA,OAAO,aAAA,CAAc,aAAA;AAAA,EACvB;AAEA,EAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,EAAA,OAAO,MAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAChE;AAEO,SAAS,gBAAA,GAAmB;AACjC,EAAA,IAAI,eAAe,aAAA,EAAe;AAChC,IAAA,OAAO,aAAA,CAAc,aAAA;AAAA,EACvB;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,IAC3B,kBAAA,EAAoB;AAAA,GACtB;AACF;AAtFA,IAOI,SAAA,EACA,aAAA;AARJ,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAOA,IAAI,SAAA,GAAiB,IAAA;AACrB,IAAI,aAAA,GAOO,IAAA;AAAA,EAAA;AAAA,CAAA;;;ACfX,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAuDA,eAAe,UAAA,GAAa;AAC1B,EAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,EAAA,OAAA,GAAU,aAAA,CAAc;AAAA,IACtB,MAAA,EAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,mBAAmB;AAAA,GAC7C,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAOA,OAAO,UAAA,EAAW;AAC3B;AAEA,SAAS,eAAe,SAAA,EAItB;AACA,EAAA,IAAI,OAAA,GAAU,SAAA;AACd,EAAA,IAAI,MAAA,GAAS,SAAA;AACb,EAAA,IAAI,QAAA,GAAW,SAAA;AAEf,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACjC,IAAA,OAAA,GAAU,SAAA;AAAA,EACZ,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvC,IAAA,OAAA,GAAU,QAAA;AAAA,EACZ,CAAA,MAAA,IAAW,UAAU,QAAA,CAAS,QAAQ,KAAK,CAAC,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AACxE,IAAA,OAAA,GAAU,QAAA;AAAA,EACZ;AAEA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,GAAS,QAAA;AACT,IAAA,QAAA,GAAW,KAAA;AAAA,EACb,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,IAAA,MAAA,GAAS,MAAA;AACT,IAAA,QAAA,GAAW,KAAA;AAAA,EACb,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,IAAA,MAAA,GAAS,SAAA;AACT,IAAA,QAAA,GAAW,OAAA;AAAA,EACb,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,IAAA,MAAA,GAAS,YAAA;AACT,IAAA,QAAA,GAAW,SAAA;AAAA,EACb,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AACtC,IAAA,MAAA,GAAS,UAAA;AACT,IAAA,QAAA,GAAW,OAAA;AAAA,EACb,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,IAAA,MAAA,GAAS,eAAA;AACT,IAAA,QAAA,GAAW,SAAA;AAAA,EACb;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAS;AACrC;AAEA,SAAS,oBAAoB,UAAA,EAAgD;AAC3E,EAAA,IAAI,CAAC,YAAY,SAAA,EAAW;AAC1B,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,cAAA,CAAe,WAAW,SAAS,CAAA;AAC/D,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AAC/B;AAEO,SAAS,wBAAwB,OAAA,EAAiC;AACvE,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACjD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,MAAM,UAAU,MAAA,CAAO,WAAA;AAAA,IACrB,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC;AAAA,GAClD;AAEA,EAAA,OAAO,OAAA,CAAQ,mBAAmB,CAAA,IAAK,IAAA;AACzC;AAEO,SAAS,YAAY,OAAA,EAA0B;AACpD,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AACvD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,UAAU,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,IAAA,EAAK;AAAA,EACtC;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAAK,SAAA;AAC7C;AAEO,SAAS,gBAAA,CACd,UACA,SAAA,EACU;AACV,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC5C,EAAA,OAAA,CAAQ,MAAA;AAAA,IACN,YAAA;AAAA,IACA,GAAG,mBAAmB,CAAA,CAAA,EAAI,SAAS,CAAA,4BAAA,EAA+B,cAAA,CAAe,iBAAiB,GAAI,CAAA,iBAAA;AAAA,GACxG;AACA,EAAA,OAAO,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,IACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,YAAY,QAAA,CAAS,UAAA;AAAA,IACrB;AAAA,GACD,CAAA;AACH;AAEO,SAAS,mBAAmB,QAAA,EAA8B;AAC/D,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC5C,EAAA,OAAA,CAAQ,MAAA;AAAA,IACN,YAAA;AAAA,IACA,GAAG,mBAAmB,CAAA,+CAAA;AAAA,GACxB;AACA,EAAA,OAAO,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,IACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,YAAY,QAAA,CAAS,UAAA;AAAA,IACrB;AAAA,GACD,CAAA;AACH;AAEA,eAAe,mBAAmB,MAAA,EAAmC;AACnE,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,MAAM,WAAW,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AACrD,EAAA,OAAO,YAAY,EAAC;AACtB;AAEA,eAAe,kBAAA,CACb,QACA,UAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAA,KAAA,EAAQ,MAAM,IAAI,UAAU,CAAA;AAAA,EAClD,CAAA,MAAO;AACL,IAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EACzC;AACF;AAEA,eAAsB,aAAA,CACpB,MAOA,OAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAG/B,EAAA,MAAM,gBAAA,GAAmB,MAAM,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AAGzD,EAAA,OAAO,gBAAA,CAAiB,MAAA,IAAU,cAAA,CAAe,kBAAA,EAAoB;AACnE,IAAA,MAAM,eAAA,GAAkB,iBAAiB,KAAA,EAAM;AAC/C,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,QAAA,EAAW,eAAe,CAAA,CAAE,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,iBAAA,EAAkB;AACpC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,OAAA,GAAU,WAAA,CAAY,OAAO,CAAA,GAAI,SAAA;AAElD,EAAA,MAAM,aAAa,SAAA,GACf;AAAA,IACE,SAAA;AAAA,IACA,EAAA,EAAI,QAAA;AAAA,IACJ,GAAG,eAAe,SAAS;AAAA,GAC7B,GACA,EAAE,EAAA,EAAI,QAAA,EAAS;AAEnB,EAAA,MAAM,WAAA,GAA2B;AAAA,IAC/B,EAAA,EAAI,SAAA;AAAA,IACJ,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW,MAAM,cAAA,CAAe,cAAA;AAAA,IAChC,cAAA,EAAgB,GAAA;AAAA,IAChB,UAAA;AAAA,IACA,WAAA,EAAa,oBAAoB,UAAU;AAAA,GAC7C;AAEA,EAAA,MAAM,KAAA,CAAM,OAAA;AAAA,IACV,WAAW,SAAS,CAAA,CAAA;AAAA,IACpB,WAAA;AAAA,IACA,EAAE,GAAA,EAAK,IAAA,CAAK,MAAM,cAAA,CAAe,cAAA,GAAiB,GAAI,CAAA;AAAE,GAC1D;AAGA,EAAA,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAC/B,EAAA,MAAM,kBAAA,CAAmB,IAAA,CAAK,EAAA,EAAI,gBAAgB,CAAA;AAElD,EAAA,OAAO,SAAA;AACT;AAEA,eAAsB,WACpB,SAAA,EAC6B;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,MAAM,UAAU,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAA,QAAA,EAAW,SAAS,CAAA,CAAE,CAAA;AAC1D,EAAA,OAAO,OAAA,IAAW,IAAA;AACpB;AAEA,eAAsB,gBACpB,SAAA,EAC8C;AAC9C,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAS,CAAA;AAE1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,mBAAA,EAAoB;AAAA,EACrD;AAGA,EAAA,IAAI,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,EAAG;AAClC,IAAA,MAAM,cAAc,SAAS,CAAA;AAC7B,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,iBAAA,EAAkB;AAAA,EACnD;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAEA,eAAsB,cAAA,CACpB,WACA,OAAA,EAC6B;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAS,CAAA;AAE1C,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAGrB,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,aAAA,GAAgB,QAAQ,SAAA,GAAY,GAAA;AAG1C,EAAA,IAAI,aAAa,OAAA,CAAQ,UAAA;AACzB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,KAAA,GAAQ,YAAY,OAAO,CAAA;AACjC,IAAA,IAAI,KAAA,KAAU,OAAA,CAAQ,UAAA,EAAY,EAAA,EAAI;AACpC,MAAA,UAAA,GAAa,EAAE,GAAG,OAAA,CAAQ,UAAA,EAAY,IAAI,KAAA,EAAM;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAA8B;AAAA,IAClC,GAAG,OAAA;AAAA,IACH,cAAA,EAAgB,GAAA;AAAA,IAChB,WACE,aAAA,GAAgB,cAAA,CAAe,mBAC3B,GAAA,GAAM,cAAA,CAAe,iBACrB,OAAA,CAAQ,SAAA;AAAA,IACd;AAAA,GACF;AAEA,EAAA,MAAM,GAAA,GACJ,aAAA,GAAgB,cAAA,CAAe,gBAAA,GAC3B,eAAe,cAAA,GACf,MAAA;AAEN,EAAA,MAAM,KAAA,CAAM,OAAA;AAAA,IACV,WAAW,SAAS,CAAA,CAAA;AAAA,IACpB,cAAA;AAAA,IACA,GAAA,GAAM,EAAE,GAAA,EAAK,IAAA,CAAK,MAAM,GAAA,GAAM,GAAI,GAAE,GAAI;AAAA,GAC1C;AAEA,EAAA,OAAO,cAAA;AACT;AAEA,eAAsB,cAAc,SAAA,EAAkC;AACpE,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,MAAM,MAAM,OAAA,CAAQ,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA;AACzD;AAEA,eAAsB,cAAc,SAAA,EAAkC;AACpE,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAS,CAAA;AAE1C,EAAA,IAAI,OAAA,EAAS;AAEX,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,OAAA,CAAQ,MAAM,CAAA;AACxD,IAAA,MAAM,kBAAkB,QAAA,CAAS,MAAA,CAAO,CAAC,EAAA,KAAO,OAAO,SAAS,CAAA;AAChE,IAAA,MAAM,kBAAA,CAAmB,OAAA,CAAQ,MAAA,EAAQ,eAAe,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,QAAA,EAAW,SAAS,CAAA,CAAE,CAAA;AAC7C,EAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,CAAA;AAChD;AAEA,eAAsB,0BAA0B,MAAA,EAA+B;AAC7E,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAE/B,EAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,IAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,QAAA,EAAW,SAAS,CAAA,CAAE,CAAA;AAC7C,IAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,kBAAA,CAAmB,MAAA,EAAQ,EAAE,CAAA;AACrC;AAEA,eAAsB,eAAA,CACpB,QACA,gBAAA,EAC4B;AAC5B,EAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAClD,EAAA,MAAM,WAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAS,CAAA;AAC1C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,WAAA,EAAa,QAAQ,WAAA,IAAe,SAAA;AAAA,QACpC,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,QACxB,cAAA,EAAgB,QAAQ,EAAA,KAAO;AAAA,OAChC,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,cAAA,GAAiB,EAAE,cAAc,CAAA;AAE3D,EAAA,OAAO,QAAA;AACT;AAEA,eAAsB,iBAAA,CACpB,WACA,IAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI,EAAE,GAAG,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,CAAA;AAE7E,EAAA,OAAO,IAAA;AACT;AAEA,eAAsB,eACpB,OAAA,EAC6B;AAC7B,EAAA,MAAM,SAAA,GAAY,wBAAwB,OAAO,CAAA;AACjD,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,SAAS,CAAA;AAClD,EAAA,IAAI,CAAC,UAAA,CAAW,KAAA,EAAO,OAAO,IAAA;AAE9B,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAGrB,EAAA,MAAM,cAAA,CAAe,WAAW,OAAO,CAAA;AAEvC,EAAA,OAAO,OAAA;AACT;AA7ZA,IAMM,aAAA,EAEO,gBAQP,mBAAA,EAqCF,OAAA;AArDJ,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AACA,IAAA,WAAA,EAAA;AAKA,IAAM,gBAAgB,gBAAA,EAAiB;AAEhC,IAAM,cAAA,GAAiB;AAAA,MAC5B,gBAAgB,aAAA,CAAc,MAAA;AAAA,MAC9B,oBAAoB,aAAA,CAAc,kBAAA;AAAA,MAClC,gBAAA,EAAkB,IAAI,EAAA,GAAK,GAAA;AAAA,MAC3B,kBAAkB,EAAA,GAAK,GAAA;AAAA,MACvB,cAAc,EAAA,GAAK;AAAA,KACrB;AAEA,IAAM,mBAAA,GAAsB,cAAA;AAqC5B,IAAI,OAAA,GAAe,IAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5CnB,iBAAA,EAAA;AAiCO,SAAS,qBAAqB,MAAA,EAA8B;AACjE,EAAA,MAAM;AAAA,IAEJ,EAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAA;AAEJ,EAAA,OAAO,eAAe,eACpB,GAAA,EAC+B;AAE/B,IAAA,MAAM,SAAA,GAAY,yBAAyB,GAAG,CAAA;AAE9C,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,SAAA,EAAW,IAAI,UAAU,CAAA;AAC7D,MAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,IAAA,EAAM;AAC/B,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,aAAA,EAAe,2BAAA,CAA4B,MAAA,CAAO,IAAI,CAAA;AAAA,UACtD,aAAA,EAAe,oBAAoB,MAAM,CAAA;AAAA,UACzC,MAAA,EAAQ,GAAA;AAAA,UACR,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AACA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,GAAA;AAAA,UACR,OAAO,MAAA,CAAO;AAAA,SAChB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,wBAAwB,GAAG,CAAA;AAC7C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AAEF,QAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,SAAS,CAAA;AAElD,QAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,GAAA;AAAA,YACR,KAAA,EAAO,WAAW,MAAA,IAAU;AAAA,WAC9B;AAAA,QACF;AAEA,QAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,QAAA,IAAI,OAAA,EAAS;AAEX,UAAA,MAAM,OAAO,UAAA,GACT,MAAM,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,GAC/B,IAAA;AAEJ,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,OAAO;AAAA,cACL,IAAA;AAAA,cACA,aAAA,EAAe,4BAA4B,IAAI,CAAA;AAAA,cAC/C,MAAA,EAAQ,GAAA;AAAA,cACR,QAAA,EAAU;AAAA,aACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA;AACF;AAIO,SAAS,4BACd,IAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAK,QAAA,IAAY,SAAA;AAAA,IAC3B,MAAA,EAAQ,KAAK,EAAA,IAAM,WAAA;AAAA,IACnB,IAAA,EAAM,KAAK,IAAA,IAAQ,OAAA;AAAA,IACnB,KAAA,EAAO,CAAC,IAAA,CAAK,IAAA,IAAQ,OAAO,CAAA;AAAA,IAC5B,aAAa,EAAC;AAAA,IACd,YAAA,EAAc,KAAK,IAAA,KAAS;AAAA,GAC9B;AACF;;;AChIO,IAAM,sBAAN,MAA0B;AAAA,EACvB,OAAA,uBACF,GAAA,EAAI;AAAA,EACF,WAAA,uBAGA,GAAA,EAAI;AAAA,EACJ,MAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CACE,QACA,UAAA,EACA;AACA,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,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAAA,EAC9B;AAAA,EAEQ,UAAA,CAAW,IAAA,EAAc,MAAA,EAAgB,UAAA,EAA4B;AAC3E,IAAA,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,UAAU,CAAA,CAAA;AAAA,EAC7C;AAAA,EAEQ,iBAAA,CACN,SACA,MAAA,EACM;AACN,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,cAAc,GAAA,GAAM,MAAA;AAG1B,IAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,IAAK,QAAQ,CAAC,CAAA,CAAE,YAAY,WAAA,EAAa;AAC/D,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,EACF;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,IAAI,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,EAAC;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAE7C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA;AAGjE,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAEzC,IAAA,IAAI,KAAA,IAAS,OAAO,GAAA,EAAK;AAEvB,MAAA,MAAM,cAAc,OAAA,CAAQ,MAAA;AAAA,QAC1B,CAAC,MAAA,EAAQ,OAAA,KACP,OAAO,SAAA,GAAY,OAAA,CAAQ,YAAY,MAAA,GAAS,OAAA;AAAA,QAClD,QAAQ,CAAC;AAAA,OACX;AAEA,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,SAAA,GAAY,MAAA,CAAO,MAAA;AAE/C,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,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AAC3C,IAAA,IAAI,UAAkD,EAAC;AAEvD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,GAAU,OAAA,CAAQ,IAAI,IAAA,CAAK,MAAA,CAAO,MAAM,UAAU,CAAC,KAAK,EAAC;AAAA,IAC3D,CAAA,MAAO;AAEL,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,kBAAQ,IAAI,KAAK,CAAA;AAAA,MACxC;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,CAAG,GAAA,CAAI,KAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA,EAAG,OAAO,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAE7C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA;AAGjE,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAEzC,IAAA,IAAI,KAAA,IAAS,OAAO,GAAA,EAAK;AAEvB,MAAA,MAAM,cAAc,OAAA,CAAQ,MAAA;AAAA,QAC1B,CAAC,MAAA,EAAQ,OAAA,KACP,OAAO,SAAA,GAAY,OAAA,CAAQ,YAAY,MAAA,GAAS,OAAA;AAAA,QAClD,QAAQ,CAAC;AAAA,OACX;AAEA,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,SAAA,GAAY,MAAA,CAAO,MAAA;AAE/C,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,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,MAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AACxC,MAAA,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;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,IAAI,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,EAAC;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAE7C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA;AAEjE,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;AASA,IAAM,mBAAA,GAAuD;AAAA,EAC3D,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;;;ACrJO,IAAM,wBAAA,GAAiD;AAAA,EAC5D,aAAA,EAAe,EAEjB,CAAA;;;AChDO,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,GAAK,WAAA,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,WAAW,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,WAAA,EAAY;AAAA,MAC/C,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,SAASC,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;;;ACxUO,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,GAAKC,WAAAA,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;;;AC7KA,iBAAA,EAAA;AAiCO,IAAM,aAAN,MAAiB;AAAA,EACd,WAAA;AAAA,EACA,KAAA;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,cAAA,GAAiB,MAAA,CAAO,cAAA,IAAkB,IAAI,cAAA,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,GAAI,mBAAmB,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,GAAoBA,WAAAA,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,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAChE,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,GAAI,mBAAmB,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;AAEnC,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,QAAA,EAAU;AAC3B,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,MAAA,EAAQ;AACf,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,YACzB,MAAA,EAAQ,cAAA;AAAA,YACR,QAAQ,IAAA,CAAK,EAAA;AAAA,YACb,WAAW,IAAA,CAAK,KAAA;AAAA,YAChB,QAAA,EAAU,MAAA;AAAA,YACV,SAAA;AAAA,YACA,SAAA;AAAA,YACA,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AACA,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,UACV,2CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;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,YAAA,GAAe,MAAM,IAAA,CAAK,WAAA,CAAY,cAAA;AAAA,QAC1C,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AACA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,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,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,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc;AAAA,QACpC,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI;AAAA,OAC9B;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA;AAC/C,MAAA,OAAO,gBAAA,CAAiB,UAAU,SAAS,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,GAAG,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,GAAA,EAAiC;AAC5C,IAAA,MAAM,SAAA,GAAY,wBAAwB,GAAG,CAAA;AAC7C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,sBAAA,EAAwB,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,cAAc,SAAS,CAAA;AAE7B,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,YACzB,MAAA,EAAQ,QAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,MAAA;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,MAAM,QAAA,GAAW,KAAK,YAAA,CAAa;AAAA,QACjC,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,OAAO,mBAAmB,QAAQ,CAAA;AAAA,IACpC,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,SAAA,GAAY,wBAAwB,GAAG,CAAA;AAC7C,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,CAAe,SAAA,EAAW,GAAG,CAAA;AAC1D,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,MACpD;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,cAAA,CAAe;AAAA,OAC3B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,GAAG,GAAA,EAAiC;AACxC,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,KAAK,YAAA,CAAa;AAAA,MACvB,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAI,OAAA,CAAQ,MAAA;AAAA,QACZ,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,UAAU,OAAA,CAAQ;AAAA;AACpB,KACD,CAAA;AAAA,EACH;AAAA,EAIA,MAAM,eAAe,GAAA,EAAiC;AACpD,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI;AACF,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,MAAM,CAAA;AAC/D,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,GAAI,mBAAmB,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,GAAaA,WAAAA,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,gBAAA;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,EAEA,MAAM,aAAa,GAAA,EAAiC;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,OAAA,CAAQ,QAAQ,uBAAA,CAAwB,GAAG,KAAK,KAAA,CAAS,CAAA;AAChG,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,EAAE,QAAA,EAAU,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,yBAAA,EAA2B,GAAG,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,GAAA,EAAc,SAAA,EAAsC;AACtE,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AACxD,MAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,SAAS,CAAA;AAE9D,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,MACpD;AAEA,MAAA,IAAI,cAAc,cAAA,EAAgB;AAChC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,+BAAA,EAAiC,GAAG,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,cAAc,SAAS,CAAA;AAE7B,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,0BAAA,EAA4B,GAAG,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,GAAA,EAAiC;AACzD,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AACxD,MAAA,MAAM,gBAAA,GAAmB,wBAAwB,GAAG,CAAA;AAEpD,MAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,QAAA,IAAI,CAAC,EAAE,cAAA,EAAgB;AACrB,UAAA,MAAM,aAAA,CAAc,EAAE,EAAE,CAAA;AAAA,QAC1B;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,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAC9D,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,2BAAA,EAA6B,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,GAAA,EAAc,SAAA,EAAsC;AACtE,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAG,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AACxD,MAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,SAAS,CAAA;AAE9D,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AAEjB,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AACjE,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,sBAAA,EAAwB,GAAG,CAAA;AAAA,MACvD;AAEA,MAAA,MAAM,iBAAA,CAAkB,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,CAAA;AAE9C,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,0BAAA,EAA4B,GAAG,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,GAAA,EAAiC;AACpD,IAAA,MAAM,SAAA,GAAY,wBAAwB,GAAG,CAAA;AAC7C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,YAAA,EAAc,GAAG,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,MAAM,CAAA,iBAAA,EAAA,EAAA,YAAA,CAAA,oBAAA,CAAA,EAA6B,cAAA,CAAe,WAAW,GAAG,CAAA;AACvF,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,MACpD;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,cAAA,CAAe;AAAA,OAC3B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,2BAAA,EAA6B,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF;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,EAEA,MAAc,kBAAkB,KAAA,EAAmD;AACjF,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;ACpqBO,SAAS,mBACd,MAAA,EACiB;AACjB,EAAA,MAAM,EAAE,SAAA,GAAY,IAAA,CAAKC,QAAAA,CAAQ,GAAA,EAAI,EAAG,QAAA,EAAU,SAAS,CAAA,EAAG,OAAA,GAAU,UAAA,EAAW,GAAI,MAAA;AAEvF,EAAA,eAAe,UAAU,GAAA,EAAa;AACpC,IAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACpB,MAAA,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,SAAS,YAAY,QAAA,EAA0B;AAC7C,IAAA,MAAM,GAAA,GAAM,OAAA,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,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,iBAAA;AAAA,MACR,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,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,iBAAA;AAAA,MACR,MAAA,EAAQ,mBAAA;AAAA,MACR,KAAA,EAAO,kBAAA;AAAA,MACP,MAAA,EAAQ,qBAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;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,GAAO,WAAW,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1D,MAAA,MAAM,GAAA,GAAM,OAAA,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,GAAS,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA,GAAI,SAAA;AAErD,MAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AACzC,MAAA,MAAM,SAAA,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,GAAW,QAAA,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,GAAW,KAAK,SAAA,EAAW,GAAA,CAAI,QAAQ,OAAA,GAAU,GAAA,EAAK,EAAE,CAAC,CAAA;AAC/D,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,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,GAAU,KAAK,SAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,GAAU,GAAA,EAAK,EAAE,CAAC,CAAA;AACjE,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAC3C,MAAA,MAAM,MAAA,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,GAAS,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA,GAAI,SAAA;AAC/C,MAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,SAAU,EAAC;AAE9B,MAAA,MAAM,QAAwB,EAAC;AAC/B,MAAA,MAAM,UAAU,MAAM,OAAA,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,GAAW,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACrC,UAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,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,EAAI,WAAW,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,GAAW,KAAK,SAAA,EAAW,GAAA,CAAI,QAAQ,OAAA,GAAU,GAAA,EAAK,EAAE,CAAC,CAAA;AAC/D,MAAA,OAAO,WAAW,QAAQ,CAAA;AAAA,IAC5B,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AAClC,MAAA,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AAClC,MAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,QAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,QAAA,MAAM,GAAG,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,GACF;AACF;;;AC3OO,SAAS,mBAAmB,MAAA,EAAsC;AACvE,EAAA,MAAM,OAAA,GAAU,CAACC,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,CAAA;AAAA,IAEA,MAAM,YAAA,GAA8B;AAAA,IAAC,CAAA;AAAA,IACrC,MAAM,YAAA,GAA8B;AAAA,IAAC;AAAA,GACvC;AACF;;;AClIA,SAAS,MAAA,CAAO,KAAa,MAAA,EAAoC;AAC/D,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,CAAA,EAAG,OAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAC,IAAI,GAAG,CAAA,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,WAAW,CAAA,WAAA,EAAc,GAAG,CAAA,CAAA;AACvD;AAEA,SAAS,aAAa,MAAA,EAAoC;AACxD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,GAAA;AAAA,EAC5C;AACA,EAAA,OAAO,CAAA,QAAA,EAAW,OAAO,WAAW,CAAA,WAAA,CAAA;AACtC;AAEO,SAAS,mBACd,MAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAU,CAAA,6BAAA,EAAgC,MAAA,CAAO,WAAW,CAAA,CAAA;AAElE,EAAA,MAAM,MAAA,GAAS,CAACA,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,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,mBAAA;AAAA,IACb,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,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO,MAAA;AAAA,UAClB,gBAAgB,IAAA,CAAK;AAAA,SACvB;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,yBAAA,EAA4B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,SAC1D;AAAA,MACF;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,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAAA,QACvB,YAAA,EAAc,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GACvC,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA,GAClB,MAAA;AAAA,QACJ,QAAQ,OAAA,EAAS,MAAA;AAAA,QACjB,QAAA,EAAU,OAAA;AAAA,QACV,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,MAAM,GAAA,CAAI,OAAA,CAAQ,YAAA,CAAa,MAAM,GAAG,EAAE,CAAA;AAEhD,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QAChD,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO;AAAA;AACpB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3C,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,yBAAA,EAA4B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,SAC1D;AAAA,MACF;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,QAAA,GAAW,OAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAEhE,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI;AAAA,QACnD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO;AAAA;AACpB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,CAAA,gDAAA,CAAkD,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,WAAA,EAAY;AAE3C,MAAA,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI;AAAA,QACpC,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO,MAAA;AAAA,UAClB,cAAA,EACE,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK;AAAA,SAC5C;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,OAAO,MAAM,CAAA;AAExB,MAAA,OAAO,MAAA,CAAO,UAAU,MAAM,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;AAE/B,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO;AAAA;AACpB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,SACxD;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAMnC,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1B,EAAA,EAAI,OAAO,IAAA,CAAK,IAAA,CAAK,cAAc,EAAE,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,QAC3D,UAAU,IAAA,CAAK,UAAA,EAAY,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AAAA,QAC/C,cAAc,IAAA,CAAK,UAAA,EAAY,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AAAA,QACnD,QAAA,EAAU,0BAAA;AAAA,QACV,IAAA,EAAM,KAAK,MAAA,IAAU,CAAA;AAAA,QACrB,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,IAAI,MAAM,CAAA;AAAA,QACzC,QAAA,EAAU,OAAA;AAAA,QACV,WAAW,IAAA,CAAK,WAAA,IAAA,iBAAe,IAAI,IAAA,IAAO,WAAA;AAAY,OACxD,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,MAAA,MAAM,MAAM,GAAA,CAAI,OAAA,CAAQ,YAAA,CAAa,MAAM,GAAG,EAAE,CAAA;AAEhD,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QAChD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO;AAAA;AACpB,OACD,CAAA;AAED,MAAA,OAAO,QAAA,CAAS,EAAA;AAAA,IAClB,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AAC/B,MAAA,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QAC/B,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO,MAAA;AAAA,UAClB,gBAAA,EAAkB;AAAA,SACpB;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AAC/B,MAAA,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QAC/B,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAW,MAAA,CAAO;AAAA;AACpB,OACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACnNO,IAAM,0BAAN,MAA8B;AAAA,EAC3B,SAAA,uBAAgB,GAAA,EAAyC;AAAA,EACzD,gBAAA,uBAAuB,GAAA,EAAoB;AAAA,EAC3C,eAAA,uBAAsB,GAAA,EAAY;AAAA,EAE1C,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAa,cAAA;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAc;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,kBAAA;AAAA,UACP,YAAA,EAAc;AAAA,SAChB;AAAA,QACA;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,UAAA;AAAA,UACP,YAAA,EAAc;AAAA;AAChB,OACF;AAAA,MACA,eAAe,CAAC,EAAA,EAAI,QAAS,EAAA,CAAW,GAAG,KAAK,EAAC;AAAA,MACjD,gBAAA,EAAkB,CAAC,CAAA,KAAM;AACvB,QAAA,MAAM,WAAA,GAAc,GAAG,KAAA,IAAS,CAAA;AAChC,QAAA,MAAM,cAAA,GAAA,CAAkB,WAAA,EAAa,SAAA,IAAa,EAAA,EAAI,IAAA,EAAK;AAC3D,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,IAAI,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA,EAAG;AACnC,YAAA,SAAA,GAAY,cAAA;AAAA,UACd,CAAA,MAAA,IACE,eAAe,QAAA,CAAS,GAAG,KAC3B,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAC5B;AACA,YAAA,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,cAAc,CAAA;AAAA,UACxD,CAAA,MAAO;AACL,YAAA,SAAA,GAAY,KAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,cAAc,CAAA;AAAA,UAC/D;AAAA,QACF,CAAA,MAAO;AACL,UAAA,SAAA,GAAY,KAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,SAAS,CAAA;AAAA,QAC1D;AACA,QAAA,MAAM,YAAA,GAAA,CAAgB,WAAA,EAAa,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACvD,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAA,GAAU,aAAa,UAAA,CAAW,GAAG,CAAA,GACjC,YAAA,GACA,IAAI,YAAY,CAAA,CAAA;AAAA,QACtB,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,UAAA;AAAA,QACZ;AACA,QAAA,OAAO,EAAE,WAAW,OAAA,EAAQ;AAAA,MAC9B,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAC;AAAA,KACrC,CAAA;AAAA,EACH;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAa,OAAA;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAc;AAAA,QACZ,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,KAAA,EAAO,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,QAChE,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,OAAO,UAAA;AAAW,OACzD;AAAA,MACA,eAAe,CAAC,EAAA,EAAI,QAAS,EAAA,CAAW,GAAG,KAAK,EAAC;AAAA,MACjD,gBAAA,EAAkB,CAAC,CAAA,KAAM,CAAA,EAAG,KAAA,IAAS,CAAA;AAAA,MACrC,OAAA,EAAS,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAC;AAAA,KACrC,CAAA;AAAA,EACH;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAa,WAAA;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAc;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,aAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,cAAA;AAAA,UACP,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,YAAY,KAAA,EAAO,SAAA,EAAW,UAAU,IAAA,EAAK;AAAA,QACrE,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,QACjD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,aAAA;AAAc,OACvD;AAAA,MACA,eAAe,CAAC,EAAA,EAAI,QAAS,EAAA,CAAW,GAAG,KAAK,EAAC;AAAA,MACjD,gBAAA,EAAkB,CAAC,CAAA,KAAM,CAAA,EAAG,KAAA,IAAS,CAAA;AAAA,MACrC,OAAA,EAAS,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAC;AAAA,KACrC,CAAA;AAAA,EACH;AAAA,EAEA,SAAS,YAAA,EAAiD;AACxD,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACzC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,4BAAA,EAA+B,aAAa,IAAI,CAAA,8BAAA;AAAA,OAClD;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,aAAa,UAAU,CAAA;AAAA,IACtE;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAAA,EACpD;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,IAAA,EAAuD;AACzD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAA,GAAwC;AACtC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,EAC3C;AAAA,EAEA,gBAAgB,eAAA,EAA4E;AAC1F,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,EAAO;AACxB,IAAA,IAAI,CAAC,iBAAiB,OAAO,GAAA;AAC7B,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM;AACvB,MAAA,IAAI,CAAC,CAAA,CAAE,UAAA,EAAY,OAAO,IAAA;AAC1B,MAAA,OAAO,eAAA,CAAgB,EAAE,UAAU,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,OAAA,CACJ,IAAA,EACA,aAAA,EAC0B;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mCAAmC,IAAI,CAAA,0CAAA;AAAA,OACzC;AAAA,IACF;AACA,IAAA,IAAI,IAAI,UAAA,IAAc,IAAA,CAAK,gBAAgB,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AAC9D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,IAAI,CAAA,4BAAA,EAA+B,GAAA,CAAI,UAAU,CAAA,cAAA;AAAA,OACxE;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,IAAI,SAAA,IAAa,IAAA;AACnC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,aAAA,CAAc,aAAA,EAAe,SAAS,CAAA;AACzD,IAAA,OAAO,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,iBAAA,CAAkB,IAAA,EAAc,MAAA,EAAuC;AAC3E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mCAAmC,IAAI,CAAA,0CAAA;AAAA,OACzC;AAAA,IACF;AACA,IAAA,IAAI,IAAI,UAAA,IAAc,IAAA,CAAK,gBAAgB,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AAC9D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,IAAI,CAAA,4BAAA,EAA+B,GAAA,CAAI,UAAU,CAAA,cAAA;AAAA,OACxE;AAAA,IACF;AACA,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,gBAAA,CAAiB,MAAM,CAAA;AAClD,IAAA,OAAO,GAAA,CAAI,QAAQ,cAAc,CAAA;AAAA,EACnC;AAAA,EAEA,sBAAsB,IAAA,EAAkC;AACtD,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA;AAAA,EACvC;AAAA,EAEA,iBAAA,GAA8B;AAC5B,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,GAAA,CAAI,KAAK,gBAAA,CAAiB,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC3D;AAAA,EAEA,gBAAA,CAAiB,MAAc,OAAA,EAAwB;AACrD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,gBAAgB,IAAA,EAAuB;AACrC,IAAA,OAAO,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAAA,EACvC;AACF,CAAA;AAEA,IAAI,QAAA,GAA2C,IAAA;AAExC,SAAS,kBAAA,GAA8C;AAC5D,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,uBAAA,EAAwB;AAAA,EACzC;AACA,EAAA,OAAO,QAAA;AACT;AChMA,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,SAASC,cAAa,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,IAAI,QAAA,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,SAAA,CAAQ,2BAA2B,GAAE,eAAA,CAAiB;AAAA,QACzD,iBAAA,EAAmB,GAAA;AAAA,QACnB,aAAA,EAAe;AAAA,OAChB;AAAA;AACL,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,CAACD,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,MAAME,OAAAA,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,IAAI,gBAAA,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,IAAI,iBAAA,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,EAAKA,QAAO,GAAG,CAAA;AAAA,QACf,YAAA,EAAc,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAIA,OAAAA,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,CAAQD,aAAAA,CAAa,MAAM,GAAG,EAAE,CAAA;AAChD,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,IAAI,mBAAA,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,CAAQA,aAAAA,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,IAAI,iBAAA,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,IAAI,mBAAA,CAAoB;AAAA,UACtB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAA,EAAK;AAAA,SACN;AAAA,OACH;AAEA,MAAA,OAAOC,QAAO,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,IAAI,oBAAA,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,EAAKA,OAAAA,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,CAAQD,aAAAA,CAAa,MAAM,GAAG,EAAE,CAAA;AAChD,QAAA,MAAM,MAAA,CAAO,IAAA;AAAA,UACX,IAAI,iBAAA,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,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AAC/B,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,IAAI,gBAAA,CAAiB;AAAA,UACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAA,EAAK,GAAA;AAAA,UACL,IAAA,EAAM;AAAA,SACP;AAAA,OACH;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AAClC,MAAA,IAAI,iBAAA;AACJ,MAAA,GAAG;AACD,QAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,IAAA;AAAA,UAChC,IAAI,oBAAA,CAAqB;AAAA,YACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,MAAA,EAAQ,MAAA;AAAA,YACR,iBAAA,EAAmB;AAAA,WACpB;AAAA,SACH;AACA,QAAA,IAAI,YAAA,CAAa,UAAU,MAAA,EAAQ;AACjC,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,YACnD,KAAK,IAAA,CAAK;AAAA,WACZ,CAAE,CAAA;AACF,UAAA,MAAM,MAAA,CAAO,IAAA;AAAA,YACX,IAAI,oBAAA,CAAqB;AAAA,cACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,cACf,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAA;AAAQ,aAC5B;AAAA,WACH;AAAA,QACF;AACA,QAAA,iBAAA,GAAoB,YAAA,CAAa,WAAA,GAC7B,YAAA,CAAa,qBAAA,GACb,MAAA;AAAA,MACN,CAAA,QAAS,iBAAA;AACT,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,IAAI,mBAAA,CAAoB;AAAA,UACtB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAA,EAAK;AAAA,SACN;AAAA,OACH;AAAA,IACF;AAAA,GACF;AACF;;;ACnVO,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,MAAML,OAAAA,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,OAAOA,OAAAA,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,MAAMA,OAAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AACpC,QAAA,MAAM,SAAA,GAAYA,OAAAA,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,MAAMA,OAAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AACpC,QAAA,MAAM,SAAA,GAAYA,OAAAA,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,CAAA;AAAA,IAEA,MAAM,YAAA,GAA8B;AAAA,IAEpC,CAAA;AAAA,IAEA,MAAM,YAAA,GAA8B;AAAA,IAEpC;AAAA,GACF;AACF;AC5VO,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,IAAI,MAAA,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,CAACI,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,MAAME,OAAAA,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,MAAMD,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,QAAA,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,EAAKC,QAAO,GAAG,CAAA;AAAA,QACf,YAAA,EAAc,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAIA,OAAAA,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,CAAQD,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,OAAOC,QAAO,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,EAAKA,OAAAA,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,CAAQD,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,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,MAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,MAAA,MAAM,GAAA,CAAI,UAAU,GAAG,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,MAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,MAAA,MAAM,GAAA,CAAI,UAAU,GAAG,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AC1HA,eAAsB,gBACpB,aAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,GAAS,cAAc,gBAAA,EAAiB;AAC9C,EAAA,MAAM,WAAW,kBAAA,EAAmB;AAEpC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,EACnD,SAAS,GAAA,EAAU;AACjB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,kBAAA,EAAqB,IAAI,OAAO,CAAA,qCAAA;AAAA,KAClC;AACA,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACxB,WAAWD,IAAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,SAAS,CAAA;AAAA,MACvD,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACF;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,IAAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,SAAS,CAAA;AAAA,MACvD,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,OAAA;AAC5B,EAAA,MAAM,WAAW,kBAAA,EAAmB;AAEpC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAA,CAAS,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAAA,EACtD,SAAS,GAAA,EAAU;AACjB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,4BAAA,EAA+B,IAAI,OAAO,CAAA,qCAAA;AAAA,KAC5C;AACA,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACxB,WAAWA,IAAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,SAAS,CAAA;AAAA,MACvD,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACF;AC7HA,eAAsB,aACpB,MAAA,EACyB;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAM,EAAE,QAAA,EAAS;AAG9C,EAAA,MAAM,SAAA,GAAY,MAAM,MAAM,CAAA,CAC3B,KAAK,EAAE,OAAA,EAAS,IAAI,CAAA;AAGvB,EAAA,MAAM,YAAY,KAAA,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;;;ACpBA,IAAI,mBAAA,GAAsB,KAAA;AAgCnB,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,EACAG,QAAAA,EACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,OAAA,GAAUA,QAAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,OAAA,IAAW,QAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAAA,EACjC;AAAA,EAEA,aAAa,IAAA,CACX,EAAA,EACA,OAAA,EACuB;AACvB,IAAA,IAAIA,QAAAA;AAEJ,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAAA,QAAAA,GAAU,MAAM,yBAAA,CAA0B,OAAA,CAAQ,aAAa,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,CAAc,EAAE,CAAA;AAC1C,MAAA,IAAI,OAAO,EAAA,EAAI,MAAA,KAAW,UAAA,EAAY;AACpC,QAAA,MAAM,cAAc,IAAA,EAAK;AAAA,MAC3B;AACA,MAAAA,QAAAA,GAAU,MAAM,eAAA,CAAgB,aAAa,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAa,EAAA,EAAIA,UAAS,OAAO,CAAA;AACrD,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,GAAG,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAuBZ,CAAA;AAED,MAAA,IAAA,CAAK,GAAG,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CASZ,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,KAAY,UAAA,EAAY;AACtC,MAAA,IAAI,mBAAA,EAAqB;AACzB,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,OAAO,aAAa,CAAA;AAC1C,MAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAoBrB,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAA,mEAAA,CAAwE,CAAA;AAC9F,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAA,uEAAA,CAA4E,CAAA;AAClG,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAA,uEAAA,CAA4E,CAAA;AAElG,MAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAQrB,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAA,+EAAA,CAAoF,CAAA;AAC1G,MAAA,mBAAA,GAAsB,IAAA;AAAA,IACxB;AAAA,EACF;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,OAAA,GACJ,MAAA,CAAO,MAAA,KAAW,MAAA,GACd,UACA,MAAA,CAAO,MAAA,KAAW,WAAA,GAChB,YAAA,GACA,MAAA,CAAO,MAAA,KAAW,WAAA,GAChB,YAAA,GACA,OAAO,MAAA,IAAU,YAAA;AAC3B,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,MAAM,OACnC,qBACF,CAAA;AACA,MAAA,MAAM,OAAO,aAAA,CAAc,QAAA;AAC3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAI,OAAA,GAC1C,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAI,OAAA,GAC5B,IAAA,CAAK,WAAW,QAAQ,CAAA,GAAI,OAAA,GAC5B,IAAA,CAAK,UAAA,CAAW,iBAAiB,CAAA,GAAI,UAAA,GACrC,CAAC,iBAAA,EAAkB,mBAAA,EAAoB,mBAAA,EAAoB,kBAAA,EAAmB,kBAAkB,CAAA,CAAE,QAAA,CAAS,IAAI,IAAI,SAAA,GACnH,OAAA;AACJ,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,QAAA,EAAU,IAAA;AAAA,QACV,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,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,GAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,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,aAAA,CAAc,GAAA,EAAa,MAAA,GAAiB,EAAA,EAAuB;AACvE,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,eAAe,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,WAAA;AAC7C,IAAA,MAAM,WAAW,QAAA,CAAS,OAAA,CAAQ,IAAI,cAAc,CAAA,IAAK,KAAK,IAAA,IAAQ,0BAAA;AACtE,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,GAAG,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AAC9D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,EACjC;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,MAAM,OACnC,qBACF,CAAA;AACA,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,MAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,IAAA,CAAK,GACtB,MAAA,EAAO,CACP,IAAA,CAAK,WAAW,EAChB,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,EAAA,EAAI,EAAE,CAAC,CAAA;AAC/B,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,MAAM,OACnC,qBACF,CAAA;AACA,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,WAAW,CAAA,CAAE,MAAM,EAAA,CAAG,WAAA,CAAY,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IAChE;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,MAAM,OACnC,qBACF,CAAA;AACA,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,MAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,IAAA,CAAK,GACtB,MAAA,EAAO,CACP,IAAA,CAAK,WAAW,EAChB,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,EAAA,EAAI,EAAE,CAAC,CAAA;AAC/B,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,MAAM,OACnC,qBACF,CAAA;AACA,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,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,GAAG,WAAA,CAAY,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IACjC;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,SAAS,EAAA,EAAsC;AACnD,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAMC,OAAM,IAAA,CAAK,SAAA;AAAA,QACf,CAAA,cAAA,EAAiB,KAAK,UAAU,CAAA,aAAA,CAAA;AAAA,QAChC,CAAC,EAAE;AAAA,OACL;AACA,MAAA,OAAOA,IAAAA,GAAM,IAAA,CAAK,UAAA,CAAWA,IAAG,CAAA,GAAI,IAAA;AAAA,IACtC;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,OACnC,qBACF,CAAA;AACA,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AAEzC,IAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,IAAA,CAAK,GACtB,MAAA,EAAO,CACP,IAAA,CAAK,WAAW,EAChB,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,EAAA,EAAI,EAAE,CAAC,CAAA;AAE/B,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA;AAAA,EACtC;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,MAAM,OACnC,qBACF,CAAA;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,GAAA,EAAI,GAAI,MAAM,OAClD,aACF,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,OAAA,GAAkC;AAAA,MACtC,UAAA,EAAY,WAAA;AAAA,MACZ,UAAA,EAAY,WAAA;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,UAAA;AAAA,MACX,SAAA,EAAW,UAAA;AAAA,MACX,aAAA,EAAe;AAAA,KACjB;AACA,IAAA,MAAM,GAAA,GAAO,WAAA,CAAoB,OAAA,CAAQ,OAAO,KAAK,WAAW,CAAA;AAChE,IAAA,MAAM,QAAQ,OAAA,KAAY,KAAA,GAAQ,IAAI,GAAG,CAAA,GAAI,KAAK,GAAG,CAAA;AAErD,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,MAAM,OACnC,qBACF,CAAA;AACA,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,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,EAAA,CAAG,WAAA,CAAY,EAAA,EAAI,EAAE,CAAC,CAAA,CAC5B,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,MAAM,OACnC,qBACF,CAAA;AACA,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAO,aAAa,CAAA;AACzC,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,GAAG,WAAA,CAAY,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,MACjC;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,OAAO,WAAA,EAAa,YAAA,EAAc,cAAa,GAAI,MAAM,OAC/D,qBACF,CAAA;AACA,IAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAI,GAAI,MAAM,OACxB,aACF,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,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,QAAQ,CAAA;AAE1C,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,MAAM,OAC3C,qBACF,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,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,MAAM,CAAA;AAExC,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,MAAM,OAC3C,qBACF,CAAA;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,IAAG,GAAI,MAAM,OAC7B,aACF,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;AAAA,EACF;AACF;AC9xBA,SAAS,gBAAgB,MAAA,EAAuB;AAC9C,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACvE;AAEA,SAAS,qBAAA,CAAsB,QAAe,IAAA,EAAiB;AAC7D,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,IAAA,EAAM;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,CAAC,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AAAA,MACtE,WAAW,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,IAAI,IAAA,KAAS,KAAA,IAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACpH,QAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,GAAA,CAAI,OAAA;AAAA,MACzB;AAAA,IACF;AACA,IAAA,IAAI,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,IAAQ,KAAA,CAAM,QAAQ,KAAA,CAAM,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,OAAO,KAAK,KAAA,CAAM,IAAI,MAAM,QAAA,EAAU;AAChI,MAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG,qBAAA,CAAsB,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MACnF;AAAA,IACF,CAAA,MAAA,IAAA,CAAY,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,aAAA,KAAkB,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,MAAM,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,KAAM,QAAA,EAAU;AAC5K,MAAA,qBAAA,CAAsB,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IACtD,WAAW,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG;AACjH,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,QAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,UAAU,qBAAA,CAAsB,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AACF;AA2CA,IAAM,oBAAA,GAGF;AAAA,EACF,MAAA,EAAQ;AAAA,IACN,QAAQ,cAAA,CAAe,YAAA;AAAA,IACvB,QAAQ,cAAA,CAAe,YAAA;AAAA,IACvB,QAAQ,cAAA,CAAe;AAAA;AAE3B,CAAA;AAEA,SAAS,eAAA,CACP,YACA,SAAA,EACc;AACd,EAAA,MAAM,MAAA,GAAS,qBAAqB,UAAU,CAAA;AAC9C,EAAA,IAAI,MAAA,EAAQ,OAAO,MAAA,CAAO,SAAS,CAAA;AACnC,EAAA,OAAO,cAAc,SAAS,CAAA,CAAA;AAChC;AAYA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AACnD,EAAA,IAAI,SAAA,SAAkB,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,IAAA,EAAK;AACnD,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAAK,SAAA;AACzC;AAEA,SAAS,gBAAA,CACP,kBAAA,EACA,aAAA,EACA,QAAA,EACA,QACA,GAAA,EACA;AACA,EAAA,IAAI,aAAA,EAAe,YAAY,kBAAA,EAAoB;AACjD,IAAA,kBAAA,CAAmB,cAAA,CAAe;AAAA,MAChC,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ,cAAc,MAAA,IAAU,EAAA;AAAA,MAChC,QAAA,EAAU,SAAA;AAAA,MACV,YAAY,aAAA,CAAc,QAAA;AAAA,MAC1B,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,QAAA;AAAA,QACA,MAAA;AAAA,QACA,EAAA,EAAI,UAAU,GAAG;AAAA;AACnB,KACD,CAAA;AAAA,EACH;AACF;AAEA,SAAS,kBAAkB,IAAA,EAAsD;AAC/E,EAAA,OAAO,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AACpC;AAEA,SAAS,mBAAkD,IAAA,EAAY;AACrE,EAAA,MAAM,EAAE,aAAA,EAAe,cAAA,EAAgB,GAAG,MAAK,GAAI,IAAA;AACnD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,qBAAA,CACP,mBACA,UAAA,EACA;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,gDAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,mBAAmB,iBAAA,IAAqB,IAAA;AAAA,MACxC,eAAA,EAAiB,WAAW,SAAA,IAAa,IAAA;AAAA,MACzC,OAAA,EAAS;AAAA;AACX,GACF;AACF;AAEA,eAAe,qBAAA,CACb,UAAA,EACA,SAAA,EACA,GAAA,EACA,OAAA,EACA,aACA,aAAA,EACA,kBAAA,GAA8B,IAAA,EAC9B,uBAAA,GAAkC,MAAA,EACN;AAC5B,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,MAAA,GAAS,SAAS,CAAA;AAEhD,EAAA,MAAM,YAAA,GAAwC;AAAA,IAC5C,IAAA,EAAM,KAAA;AAAA,IACN,MAAM,SAAA,KAAc,MAAA;AAAA,IACpB,MAAA,EAAQ,SAAA,KAAc,MAAA,IAAU,SAAA,KAAc,QAAA;AAAA,IAC9C,MAAA,EACE,SAAA,KAAc,MAAA,IAAU,SAAA,KAAc,YAAY,SAAA,KAAc,QAAA;AAAA,IAClE,QACE,SAAA,KAAc,MAAA,IACd,cAAc,QAAA,IACd,SAAA,KAAc,YACd,SAAA,KAAc,QAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AACA,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,uBAAuB,CAAA,IAAK,KAAA;AAElE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,UAAA,EAAY;AAAA,MAC/C,GAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,eAAA,EAAiB,QAAQ,GAAA,EAAI;AAAA,IAC/D;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,OAAA,EAAS;AACnB,IAAA,MAAM,UAAU,kBAAA,IAAsB,gBAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,yBAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,EAAe,WAAA,EAAa,MAAA,GAAS,CAAA,EAAG;AAC1C,IAAA,MAAM,WAAW,UAAA,CAAW,IAAA;AAC5B,IAAA,MAAM,SACJ,SAAA,KAAc,MAAA,GACV,MAAA,GACA,SAAA,KAAc,WACZ,QAAA,GACA,QAAA;AACR,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAExC,IAAA,IACE,CAAC,mBAAA,CAAoB,aAAA,CAAc,WAAA,EAAa,UAAU,CAAA,IAC1D,CAAC,mBAAA,CAAoB,aAAA,CAAc,WAAA,EAAa,CAAA,EAAG,QAAQ,QAAQ,CAAA,EACnE;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,uBAAuB,UAAU,CAAA,CAAA;AAAA,QACxC,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,WAAW,UAAA,CAAW,IAAA;AAC5B,IAAA,MAAM,MAAA,GACJ,cAAc,MAAA,GACV,MAAA,GACA,cAAc,QAAA,GACZ,QAAA,GACA,SAAA,KAAc,QAAA,GACZ,QAAA,GACA,QAAA;AACV,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAExC,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,iBAAA,GAAoB,aAAA;AAAA,QACxB,EAAE,IAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,QAC3D;AAAA,OACF;AAEA,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,MAAM,eAAA,GAAkB,aAAA;AAAA,UACtB,EAAE,IAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,UAC3D,GAAG,QAAQ,CAAA,MAAA;AAAA,SACb;AACA,QAAA,IAAI,iBAAiB,WAAA,GAAc,IAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,gBAAA,IAAoB,CAAC,UAAA,EAAY;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,4BAA4B,UAAU,CAAA,CAAA;AAAA,QAC7C,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;AAEA,eAAe,kBACb,MAAA,EACA,SAAA,EACA,KACA,OAAA,EACA,WAAA,EACA,qBAA8B,IAAA,EACF;AAC5B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,GAAS,SAAS,CAAA;AAE5C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,UAAA,EAAY;AAAA,MAC/C,GAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,eAAA,EAAiB,QAAQ,GAAA,EAAI;AAAA,IAC/D;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,OAAA,EAAS;AACnB,IAAA,MAAM,YAAA,GAAwC;AAAA,MAC5C,IAAA,EAAM,KAAA;AAAA,MACN,MAAM,SAAA,KAAc,MAAA;AAAA,MACpB,MAAA,EAAQ,SAAA,KAAc,MAAA,IAAU,SAAA,KAAc;AAAA,KAChD;AACA,IAAA,MAAM,UACJ,kBAAA,IACA,YAAA,CAAa,SAAA,KAAc,MAAA,GAAS,SAAS,OAAO,CAAA;AACtD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,yBAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;AAMA,eAAe,kBAAA,CACb,GAAA,EACA,MAAA,EACA,UAAA,EACA,cAAA,EAMC;AACD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,cAAA;AAAA,MACV,aAAA,EAAe,MAAA;AAAA,MACf,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,GAAG,CAAA;AAC5B,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,IAAO,GAAA,CAAI,IAAA,EAAM;AAClC,MAAA,OAAO;AAAA,QACL,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAA,EAAU,IAAI,aAAA,EAAe,QAAA;AAAA,QAC7B,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,UAAU,GAAA,CAAI;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA,IACV,aAAA,EAAe,MAAA;AAAA,IACf,QAAA,EAAU;AAAA,GACZ;AACF;AAMA,SAAS,wBAAA,CACP,IACA,OAAA,EACK;AACL,EAAA,IAAI,EAAA,YAAc,cAAA,IAAkB,EAAA,CAAG,OAAA,KAAY,UAAA,EAAY;AAC7D,IAAA,OAAO,IAAI,mBAAA,CAAoB,EAAE,EAAA,EAAI,EAAA,CAAG,QAAQ,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,cAAc,cAAA,EAAgB;AAChC,IAAA,OAAO,IAAI,kBAAA,CAAmB,EAAE,EAAA,EAAI,EAAA,CAAG,IAAI,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,OAAA,EAAS,MAAA,EAAQ,SAAS,CAAA;AAC5D,EAAA,OAAO,IAAI,iBAAA,CAAkB;AAAA,IAC3B,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB;AAAA,GACxC,CAAA;AACH;AAMO,SAAS,cAAc,OAAA,EAA+B;AAC3D,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,EAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AACJ,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,EAAK;AAGrB,EAAA,MAAM,SAAA,GAAY,UAAU,MAAA,EAAQ,SAAA;AACpC,EAAA,IAAI,SAAA,EAAW,gBAAgB,KAAA,EAAO;AACpC,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA,KAAM;AACvB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAA,GAAqB,QAAA,EAAU,MAAA,EAAQ,kBAAA,IAAsB,KAAA;AACnE,EAAA,MAAM,uBAAA,GACJ,QAAA,EAAU,MAAA,EAAQ,uBAAA,IAA2B,MAAA;AAE/C,EAAoB,SAAA,EAAW;AAG/B,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,OAAA,GAAU,IAAI,QAAA,CAAS,OAAO,IAAI,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA,GAAI,GAAA;AAG7D,EAAA,MAAM,kBAAA,GAAqB,WAAA,IAAe,wBAAA,CAAyB,EAAA,EAAI,OAAO,CAAA;AAQ9E,EAAA,MAAM,MAAA,GAAS,aACX,oBAAA,CAAqB;AAAA,IAErB,EAAA;AAAA,IACA,UAAA,EAAY,OAAO,MAAA,KAAmB;AACpC,MAAA,MAAMC,KAAAA,GAAO,MAAM,kBAAA,CAAmB,YAAA,CAAa,MAAM,CAAA;AACzD,MAAA,OAAOA,KAAAA,IAAQ,IAAA;AAAA,IACjB,CAgCF,CAAC,CAAA,GACC,IAAA;AAGJ,EAAA,MAAM,eAAA,GAAkB,WAAW,IAAA,EAAM,cAAA;AACzC,EAAA,MAAM,cAAc,IAAA,EAAM,OAAA;AAC1B,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,GAC9C,kBACA,OAAO,eAAA,KAAoB,QAAA,IAAY,eAAA,GACrC,eAAA,CACC,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,OAAO,CAAA,GACf,EAAC;AACP,EAAA,MAAM,iBACJ,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,eAAe,EAAC;AAC3D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,GAAS,CAAA,IAAK,CAAC,CAAC,IAAA;AAEnD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AAC9B,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,IAAK,GAAA;AAEzC,MAAA,IAAI,eAAe,MAAA,GAAS,CAAA,IAAK,CAAC,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EAAG;AACjE,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,GAAA;AACzD,MAAA,CAAA,CAAE,MAAA,CAAO,+BAA+B,WAAW,CAAA;AACnD,MAAA,CAAA,CAAE,MAAA;AAAA,QACA,8BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,CAAA,CAAE,MAAA;AAAA,QACA,8BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,CAAA,CAAE,MAAA,CAAO,oCAAoC,MAAM,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW;AAC9B,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,MAClB;AACA,MAAA,MAAM,IAAA,EAAK;AAAA,IACb,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAA,GAAe,UAAU,MAAA,EAAQ,YAAA;AACvC,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,cAAc,OAAA,EAAS;AACzB,IAAA,MAAM,WAAA,GAAc,aAAa,WAAA,IAAe,GAAA;AAChD,IAAA,MAAM,QAAA,GAAW,aAAa,QAAA,IAAY,GAAA;AAE1C,IAAA,WAAA,GAAc,IAAI,mBAAA,CAAoB;AAAA,MACpC,aAAA,EAAe,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAK,WAAA;AAAY,KACrD,CAAA;AAED,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,EAAG,IAAA,KAAS;AACnC,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAEA,MAAA,MAAM,EAAA,GACJ,EAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,CAAA,IAC/B,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA,EAAG,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,MAChD,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA,IACxB,SAAA;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,KAAA,CAAM,eAAe,EAAE,CAAA;AAExD,MAAA,CAAA,CAAE,MAAA,CAAO,mBAAA,EAAqB,MAAA,CAAO,WAAW,CAAC,CAAA;AACjD,MAAA,CAAA,CAAE,MAAA,CAAO,uBAAA,EAAyB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAC1D,MAAA,CAAA,CAAE,MAAA,CAAO,mBAAA,EAAqB,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAEpD,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO,CAAA,CAAE,IAAA;AAAA,UACP;AAAA,YACE,KAAA,EAAO,mBAAA;AAAA,YACP,YAAY,MAAA,CAAO;AAAA,WACrB;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,EAAK;AAAA,IACb,CAAC,CAAA;AAAA,EACH;AAUA,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,IAChC,KAAA,EAAO,kBAAA;AAAA;AAAA,IACP,WAAW,UAAA,IAAc,WAAA;AAAA,IACzB,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB,uBAAA;AAAA,IACtC;AAAA,GACD,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK,mBAAmB,OAAO,CAAA,KAAM,WAAW,KAAA,CAAM,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AACpE,EAAA,GAAA,CAAI,IAAA,CAAK,sBAAsB,OAAO,CAAA,KAAM,WAAW,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AAC1E,EAAA,GAAA,CAAI,IAAA,CAAK,oBAAoB,OAAO,CAAA,KAAM,WAAW,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AACtE,EAAA,GAAA,CAAI,IAAA,CAAK,qBAAqB,OAAO,CAAA,KAAM,WAAW,OAAA,CAAQ,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AACxE,EAAA,GAAA,CAAI,GAAA,CAAI,gBAAgB,OAAO,CAAA,KAAM,WAAW,EAAA,CAAG,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AAG7D,EAAA,GAAA,CAAI,GAAA,CAAI,sBAAsB,OAAO,CAAA,KAAM,WAAW,YAAA,CAAa,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AAC7E,EAAA,GAAA,CAAI,IAAA,CAAK,8BAA8B,OAAO,CAAA,KAAM,WAAW,cAAA,CAAe,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AACxF,EAAA,GAAA,CAAI,MAAA,CAAO,sBAAsB,OAAO,CAAA,KAAM,WAAW,mBAAA,CAAoB,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AACvF,EAAA,GAAA,CAAI,MAAA,CAAO,wBAAA,EAA0B,OAAO,CAAA,KAAM,WAAW,aAAA,CAAc,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AAC1G,EAAA,GAAA,CAAI,GAAA,CAAI,6BAAA,EAA+B,OAAO,CAAA,KAAM,WAAW,aAAA,CAAc,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AAExG,EAAA,GAAA,CAAI,GAAA,CAAI,kBAAA,EAAoB,OAAO,CAAA,KAAM;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,MACnD;AAEA,MAAA,MAAMC,eAAmC,EAAC;AAC1C,MAAA,MAAM,UAA+B,EAAC;AAEtC,MAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,cAAA,EAAe,EAAG;AAC3C,QAAA,MAAM,WAAA,GAAc;AAAA,UAClB,OACE,MAAM,qBAAA;AAAA,YACJ,GAAA;AAAA,YACA,MAAA;AAAA,YACA,EAAE,GAAA,CAAI,GAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF,EACA,OAAA;AAAA,UACF,SACE,MAAM,qBAAA;AAAA,YACJ,GAAA;AAAA,YACA,QAAA;AAAA,YACA,EAAE,GAAA,CAAI,GAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF,EACA,OAAA;AAAA,UACF,SACE,MAAM,qBAAA;AAAA,YACJ,GAAA;AAAA,YACA,QAAA;AAAA,YACA,EAAE,GAAA,CAAI,GAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF,EACA,OAAA;AAAA,UACF,SACE,MAAM,qBAAA;AAAA,YACJ,GAAA;AAAA,YACA,QAAA;AAAA,YACA,EAAE,GAAA,CAAI,GAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF,EACA;AAAA,SACJ;AACA,QAAAA,YAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,GAAI,WAAA;AAAA,MAC1B;AAEA,MAAA,KAAA,MAAW,YAAA,IAAgB,QAAA,CAAS,UAAA,EAAW,EAAG;AAChD,QAAA,MAAM,WAAA,GAAc;AAAA,UAClB,OACE,MAAM,iBAAA;AAAA,YACJ,YAAA;AAAA,YACA,MAAA;AAAA,YACA,EAAE,GAAA,CAAI,GAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA;AAAA,WACF,EACA,OAAA;AAAA,UACF,SACE,MAAM,iBAAA;AAAA,YACJ,YAAA;AAAA,YACA,QAAA;AAAA,YACA,EAAE,GAAA,CAAI,GAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA;AAAA,WACF,EACA;AAAA,SACJ;AACA,QAAA,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA,GAAI,WAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,WAAA,EAAAA,YAAAA,EAAa,SAAS,CAAA;AAAA,IACxC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAMC,gBAAAA,GAAmB,OAAO,QAAA,CAAS,aAAA,KAAkB,UAAA,IAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,GACnG,QAAA,CAAS,aAAA,CAAc,OAAO,KAC7B,MAAM;AACL,IAAA,IAAI;AACF,MAAA,OAAO,QAAA,CAAS,cAAc,OAAO,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,eAAA;AAAA,IACT;AAAA,EACF,CAAA,GAAG;AAEP,EAAA,GAAA,CAAI,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,QACnBA,gBAAAA;AAAA,QACA,MAAA;AAAA,QACA,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,OAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA,CAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAI,CAAA,EAAG,GAAG,CAAA;AAClE,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,KAAA,CAAA;AAExC,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,SAAA,CAAU;AAAA,QAChD,IAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,MAAM,MAAA,CAAO,KAAA;AAAA,QACb,WAAW,MAAA,CAAO,KAAA;AAAA,QAClB,KAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,QAC1C,IAAA;AAAA,QACA,aAAA,EAAA,CAAgB,IAAA,GAAO,CAAA,IAAK,KAAA,GAAQ,CAAA;AAAA,QACpC,aAAa,IAAA,GAAO,CAAA;AAAA,QACpB,aAAa,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,QAClD,QAAA,EAAU,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,IAAA;AAAA,QAChC,QAAA,EAAU,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,GAAQ,KAAK,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI;AAAA,OAC/D,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,gBAAA,EAAkB,OAAO,CAAA,KAAM;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,MAAM,kBAAA,CAAmB,YAAA,CAAa,EAAE,CAAA;AACtD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,IAAoB,GAAG,CAAA;AAAA,MAChD;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,IAC/B,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA,KAAM;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,QACnBA,gBAAAA;AAAA,QACA,QAAA;AAAA,QACA,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,OAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA,CAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,QAAA,EAAU;AACjC,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,iCAAA,IAAqC,GAAG,CAAA;AAAA,MACjE;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,eAAA,CAAgB,KAAK,KAAK,CAAA;AACpE,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,UAAA,CAAW;AAAA,QAClD,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAM,KAAK,IAAA,IAAQ,UAAA;AAAA,QACnB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,UACjC,MAAA,EAAQ,aAAA;AAAA,UACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,UAChB,QAAA,EAAU,OAAA;AAAA,UACV,YAAY,OAAA,CAAQ,EAAA;AAAA,UACpB,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA;AAAA,QACP,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,2BAAA,EAA4B;AAAA,QACtD;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,KAAA,CAAM,gBAAA,EAAkB,OAAO,CAAA,KAAM;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,QACnBA,gBAAAA;AAAA,QACA,QAAA;AAAA,QACA,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,OAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA,CAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAE9B,MAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,YAAA,CAAa,EAAE,CAAA;AACzD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,IAAoB,GAAG,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,CAAA,EAAW,UAAA,CAAW,OAAO,IAAA,CAAK,IAAA;AACpD,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,KAAA,CAAA,EAAW,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAA;AACtD,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,CAAA,EAAW,UAAA,CAAW,OAAO,IAAA,CAAK,IAAA;AACpD,MAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAA,EAAW;AAC7B,QAAA,UAAA,CAAW,MAAA,GAAS,OAAO,IAAA,CAAK,MAAA,KAAW,YAAY,IAAA,CAAK,MAAA,KAAW,IAAA,GAClE,IAAA,CAAK,OAAO,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,MAAM,IACrC,IAAA,CAAK,MAAA;AAAA,MACX;AACA,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,KAAA,CAAA,EAAW,UAAA,CAAW,WAAW,IAAA,CAAK,QAAA;AAC5D,MAAA,IAAI,KAAK,aAAA,KAAkB,KAAA,CAAA;AACzB,QAAA,UAAA,CAAW,gBAAgB,IAAA,CAAK,aAAA;AAClC,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,KAAA,CAAA,EAAW,UAAA,CAAW,SAAS,IAAA,CAAK,MAAA;AACxD,MAAA,IAAI,KAAK,mBAAA,KAAwB,KAAA,CAAA;AAC/B,QAAA,UAAA,CAAW,sBAAsB,IAAA,CAAK,mBAAA;AACxC,MAAA,IAAI,IAAA,CAAK,SAAA,KAAc,KAAA,CAAA,EAAW,UAAA,CAAW,YAAY,IAAA,CAAK,SAAA;AAE9D,MAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,UAAA,CAAW,IAAI,UAAU,CAAA;AAClE,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,MACpD;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,UACjC,MAAA,EAAQ,aAAA;AAAA,UACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,UAChB,QAAA,EAAU,OAAA;AAAA,UACV,UAAA,EAAY,EAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,IAAA,KAAS,KAAK,IAAA,EAAM;AAC5C,UAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,YACjC,MAAA,EAAQ,aAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,OAAA;AAAA,YACV,UAAA,EAAY,EAAA;AAAA,YACZ,OAAA,EAAS,IAAA;AAAA,YACT,UAAU,EAAE,OAAA,EAAS,SAAS,IAAA,EAAM,OAAA,EAAS,KAAK,IAAA;AAAK,WACxD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,6BAA6B,CAAA;AAAA,IACvE,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAkB,OAAO,CAAA,KAAM;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,QACnBA,gBAAAA;AAAA,QACA,QAAA;AAAA,QACA,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,OAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA,CAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAE3B,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,EAAA,KAAO,EAAA,EAAI;AAChC,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oCAAA,IAAwC,GAAG,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,YAAA,CAAa,EAAE,CAAA;AACzD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,IAAoB,GAAG,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,UAAA,CAAW,EAAE,CAAA;AACtD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,UACjC,MAAA,EAAQ,aAAA;AAAA,UACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,UAChB,QAAA,EAAU,OAAA;AAAA,UACV,UAAA,EAAY,EAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,6BAA6B,CAAA;AAAA,IACxE,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,sBAAA,EAAwB,OAAO,CAAA,KAAM;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,mBAAA,GAAsB,QAAA,CAAS,aAAA,CAAc,YAAY,CAAA;AAC/D,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,mBAAA;AAAA,UACA,MAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,KAAA,CAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,OAAA,EAAS;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAI,CAAA,EAAG,GAAG,CAAA;AAClE,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,KAAA,CAAA;AACxC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,KAAA,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAAK,KAAA,CAAA;AAE5C,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,aAAA,CAAc;AAAA,QACpD,MAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA,EAAA,CAAS,OAAO,CAAA,IAAK;AAAA,OACtB,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,WAAW,MAAA,CAAO,KAAA;AAAA,QAClB,KAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,QAC1C,IAAA;AAAA,QACA,aAAA,EAAA,CAAgB,IAAA,GAAO,CAAA,IAAK,KAAA,GAAQ,CAAA;AAAA,QACpC,aAAa,IAAA,GAAO,CAAA;AAAA,QACpB,aAAa,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,QAClD,QAAA,EAAU,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,IAAA;AAAA,QAChC,QAAA,EAAU,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,GAAQ,KAAK,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI;AAAA,OAC/D,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAKD,EAAA,IAAI,YAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,qBAAA,GAA6B,IAAA;AAEjC,EAAA,MAAM,WAAW,YAAY;AAC3B,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAM,qBAAA;AAAA,IACR;AACA,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,EAAA,YAAc,cAAA,GAAiB,EAAA,CAAG,OAAA,GAAU,QAAA;AAC5D,QAAA,MAAM,UAAU,OAAA,KAAY,UAAA,IAAc,EAAA,YAAc,cAAA,GAAiB,GAAG,MAAA,GAAS,EAAA;AACrF,QAAA,YAAA,GAAe,MAAM,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,EAAE,SAAS,CAAA;AAAA,MAC7D,SAAS,KAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,QAAA,qBAAA,GAAwB,KAAA;AACxB,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,OAAO,YAAA;AAAA,EACT,CAAA;AAMA,EAAA,GAAA,CAAI,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,MAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,IAAI,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAA;AACxC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,EAAA;AACpC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAA;AAExC,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAM,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,CAAA;AACvE,MAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IACtB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK,mBAAA,EAAqB,OAAO,CAAA,KAAM;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA,IAAK,EAAA;AAEpD,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAC/C,QAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAChC,QAAA,MAAM,MAAA,GAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,IAAgB,EAAA;AAErD,QAAA,IAAI,CAAC,MAAM,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,kBAAA,EAAmB,EAAG,GAAG,CAAA;AAE3D,QAAA,MAAMC,OAAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,MAAM,CAAA;AAChD,QAAA,OAAO,CAAA,CAAE,KAAKA,OAAM,CAAA;AAAA,MACtB;AAEA,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,CAAA,CAAE,IAAI,IAAA,EAAK;AACjC,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,iBAAA,EAAkB,EAAG,GAAG,CAAA;AACzD,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAA,CAAc,GAAG,CAAA;AAC9C,MAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IACtB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,oBAAA,EAAsB,OAAO,CAAA,KAAM;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,WAAA,EAAY;AAC1C,MAAA,OAAO,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IACvB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK,oBAAA,EAAsB,OAAO,CAAA,KAAM;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,IAAA;AAC7B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AACA,MAAA,MAAM,OAAA,CAAQ,YAAA,CAAa,IAAA,EAAM,UAAA,IAAc,EAAE,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,gBAAA;AAAA,QACT,MAAM,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK;AAAA,OAC9C,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,MAAA,CAAO,oBAAA,EAAsB,OAAO,CAAA,KAAM;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAMT,KAAAA,GAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAC/B,MAAA,IAAI,CAACA,KAAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,IAAsB,GAAG,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,OAAA,CAAQ,aAAaA,KAAI,CAAA;AAC/B,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,kBAAkB,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAkB,OAAO,CAAA,KAAM;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,OAAA,CAAQ,OAAO,EAAE,CAAA;AACvB,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACjC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,mBAAA,EAAqB,OAAO,CAAA,KAAM;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,GAAG,KAAK,GAAG,CAAA;AAC1C,MAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,GAAG,KAAK,GAAG,CAAA;AAC1C,MAAA,MAAM,GAAA,GAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,OAAA;AAEnC,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,iBAAA,EAAkB,EAAG,GAAG,CAAA;AAEzD,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAMG,WAAgB,OAAA,CAAgB,OAAA;AAEtC,MAAA,IAAIA,QAAAA,CAAQ,SAAS,OAAA,EAAS;AAC5B,QAAA,OAAO,CAAA,CAAE,SAAS,GAAG,CAAA;AAAA,MACvB;AAEA,MAAA,MAAM,SAAA,GAAYA,SAAQ,MAAA,EAAQ,SAAA,IAAaO,KAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,QAAA,EAAU,SAAS,CAAA;AACtF,MAAA,MAAM,OAAA,GAAUP,QAAAA,CAAQ,MAAA,EAAQ,OAAA,IAAW,UAAA;AAE3C,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,QAAA,OAAO,CAAA,CAAE,SAAS,GAAG,CAAA;AAAA,MACvB;AAEA,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAC5C,MAAA,MAAM,YAAA,GAAeO,IAAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AAEjD,MAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,IAAoB,GAAG,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,WAAA,GAAc,aAAa,YAAY,CAAA;AAC7C,MAAA,IAAI,SAAA,GAAYC,MAAM,WAAW,CAAA;AAEjC,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AAClB,QAAA,SAAA,GAAY,UAAU,MAAA,CAAO;AAAA,UAC3B,KAAA,EAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAA,CAAA;AAAA,UACnB,MAAA,EAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAA,CAAA;AAAA,UACpB;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,SAAA,CAAU,QAAA,EAAS;AAC9C,MAAA,MAAM,QAAA,GAAW,MAAMA,KAAAA,CAAM,WAAW,EAAE,QAAA,EAAS;AAEnD,MAAA,CAAA,CAAE,OAAO,cAAA,EAAgB,CAAA,MAAA,EAAS,QAAA,CAAS,MAAA,IAAU,MAAM,CAAA,CAAE,CAAA;AAC7D,MAAA,CAAA,CAAE,MAAA,CAAO,iBAAiB,qCAAqC,CAAA;AAC/D,MAAA,OAAO,CAAA,CAAE,KAAK,YAAmB,CAAA;AAAA,IACnC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,gBAAA,EAAkB,OAAO,CAAA,KAAM;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA;AACrC,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,iBAAA,EAAkB,EAAG,GAAG,CAAA;AACzD,MAAA,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACnB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,KAAA,CAAM,gBAAA,EAAkB,OAAO,CAAA,KAAM;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAA,EAAW;AAC7B,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAChE,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,GAAA,EAAK,SAAS,CAAA;AAAA,MAChC;AACA,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,iBAAA,EAAmB,OAAO,CAAA,KAAM;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,MAAA,EAAQ,UAAU,aAAA,GAAgB,QAAA;AAAA,QAClC,WAAA,EAAa,SAAS,WAAA,EAAa;AAAA,OACpC,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,MAAA,OAAO,CAAA,CAAE,IAAA;AAAA,QACP;AAAA,UACE,OAAO,KAAA,CAAM,OAAA;AAAA,UACb,IAAA,EAAM,MAAM,WAAA,EAAa,IAAA;AAAA,UACzB,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,qBAAA,EAAuB,OAAO,CAAA,KAAM;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,IAAI,QAAA,GAAW,OAAA;AAEf,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAO,EAAA,CACV,OAAA,CAAQ,CAAA,wDAAA,CAA0D,EAClE,GAAA,EAAI;AACP,UAAA,IAAI,GAAA,IAAO,IAAI,QAAA,EAAU;AACvB,YAAA,UAAA,GAAa,IAAA;AACb,YAAA,QAAA,GAAW,GAAA,CAAI,QAAA,KAAa,KAAA,GAAQ,IAAA,GAAO,GAAA,CAAI,QAAA;AAAA,UACjD;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAO,EAAA,CAAW,OAAA,CAAQ;AAAA,cACvC,UAAA,EAAY,2BAAA;AAAA,cACZ,OAAO;AAAC,aACT,CAAA;AACD,YAAA,IAAI,MAAA,IAAU,OAAO,QAAA,EAAU;AAC7B,cAAA,UAAA,GAAa,IAAA;AACb,cAAA,QAAA,GAAW,MAAA,CAAO,QAAA,KAAa,KAAA,GAAQ,IAAA,GAAO,MAAA,CAAO,QAAA;AAAA,YACvD;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAAE;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,QAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA,KAAM;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AAErE,MAAA,MAAM,OAAA,GAAU,SAAS,UAAA,EAAW;AACpC,MAAA,MAAM,kBAAkB,QAAA,CAAS,gBAAA;AAEjC,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC/B,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,KAAM;AACvB,UAAA,IAAI,OAAA,GAAU,IAAA;AACd,UAAA,MAAM,aAAa,CAAA,CAAE,IAAA;AAGrB,UAAA,IAAI,SAAkC,EAAC;AACvC,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA,cAC3B,UAAA,EAAY,0BAAA;AAAA,cACZ,OAAO;AAAC,aACT,CAAA;AACD,YAAA,IAAI,GAAA,IAAO,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,GAAA,CAAI,MAAA;AAAA,UACtC,CAAA,CAAA,MAAQ;AAAA,UAAC;AAET,UAAA,IAAI,MAAA,CAAO,UAAU,CAAA,KAAM,KAAA,CAAA,EAAW;AACpC,YAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAAA,UAC7B;AAGA,UAAA,eAAA,CAAgB,gBAAA,CAAiB,YAAY,OAAO,CAAA;AAEpD,UAAA,OAAO;AAAA,YACL,EAAA,EAAI,UAAA;AAAA,YACJ,IAAA,EAAM,UAAA;AAAA,YACN,OAAA,EAAS,EAAE,OAAA,IAAW,OAAA;AAAA,YACtB,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,YAC9B,OAAA;AAAA,YACA,MAAA,EAAQ,UAAU,QAAA,GAAW;AAAA,WAC/B;AAAA,QACF,CAAC;AAAA,OACH;AAEA,MAAA,OAAO,CAAA,CAAE,KAAK,UAAU,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,2BAAA,EAA6B,OAAO,CAAA,KAAM;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AAErE,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACrC,MAAA,MAAM,kBAAkB,QAAA,CAAS,gBAAA;AACjC,MAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,eAAA,CAAgB,UAAU,CAAA;AACjE,MAAA,MAAM,aAAa,CAAC,cAAA;AAGpB,MAAA,MAAM,oBAA8B,EAAC;AACrC,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,KAAA,MAAW,CAAA,IAAK,eAAA,CAAgB,MAAA,EAAO,EAAG;AACxC,UAAA,IAAI,CAAA,CAAE,eAAe,UAAA,EAAY;AAC/B,YAAA,iBAAA,CAAkB,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,KAAM,GAAA;AACvC,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,UAAA,IAAc,iBAAA,CAAkB,SAAS,CAAA,EAAG;AACzD,QAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAO,EAAA,EACT,OAAA,GAAU,CAAA,wDAAA,CAA0D,GACpE,GAAA,EAAI;AACR,UAAA,IAAI,GAAA,EAAK,QAAA,EAAU,cAAA,GAAiB,GAAA,CAAI,QAAA;AAAA,QAC1C,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAO,EAAA,EAAY,OAAA,GAAU;AAAA,cAC1C,UAAA,EAAY,2BAAA;AAAA,cACZ,OAAO;AAAC,aACT,CAAA;AACD,YAAA,IAAI,MAAA,EAAQ,QAAA,EAAU,cAAA,GAAiB,MAAA,CAAO,QAAA;AAAA,UAChD,CAAA,CAAA,MAAQ;AAAA,UAAC;AAAA,QACX;AAEA,QAAA,IAAI,iBAAA,CAAkB,QAAA,CAAS,cAAc,CAAA,EAAG;AAC9C,UAAA,OAAO,EAAE,IAAA,CAAK;AAAA,YACZ,KAAA,EAAO,CAAA,gBAAA,EAAmB,UAAU,CAAA,2BAAA,EAAyB,cAAc,CAAA,qDAAA,CAAA;AAAA,YAC3E,cAAA,EAAgB,IAAA;AAAA,YAChB;AAAA,aACC,GAAG,CAAA;AAAA,QACR;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,IAAI,SAAkC,EAAC;AACvC,QAAA,IAAI,KAAA,GAAQ,QAAA;AAEZ,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA,UAC3B,UAAA,EAAY,0BAAA;AAAA,UACZ,OAAO;AAAC,SACT,CAAA;AACD,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAA,GAAS,GAAA,CAAI,UAAU,EAAC;AACxB,UAAA,KAAA,GAAQ,GAAA,CAAI,EAAA;AAAA,QACd;AAEA,QAAA,MAAA,CAAO,UAAU,CAAA,GAAI,UAAA;AAErB,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAM,GAAG,MAAA,CAAO;AAAA,YACd,UAAA,EAAY,0BAAA;AAAA,YACZ,EAAA,EAAI,KAAA;AAAA,YACJ,IAAA,EAAM,EAAE,MAAA;AAAO,WAChB,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,MAAM,GAAG,MAAA,CAAO;AAAA,YACd,UAAA,EAAY,0BAAA;AAAA,YACZ,IAAA,EAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAA;AAAS,WAC9B,CAAA;AAAA,QACH;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uCAAA,EAA0C,UAAU,CAAA,EAAA,CAAA,EAAM,CAAC,CAAA;AAAA,MAC1E;AAEA,MAAA,eAAA,CAAgB,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAEvD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,UAAA,EAAY,OAAA,EAAS,YAAY,CAAA;AAAA,IACzD,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,aAAA,EAAe,CAAC,CAAA,KAAM;AAC5B,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS,OAAA;AAAA,MACT,WAAA,EAAa,SAAS,kBAAA,EAAmB;AAAA,MACzC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,kBAAA,EAAoB,OAAO,CAAA,KAAM;AACvC,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,IAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AAErE,IAAA,MAAM,gBAAgB,CAAC,MAAA,KACrB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAW;AACrB,MAAA,MAAM,IAAA,GAAY;AAAA,QAChB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,EAAE,QAAA,IAAY,KAAA;AAAA,QACxB,MAAA,EAAQ,EAAE,MAAA,IAAU,KAAA;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA,IAAW,KAAA;AAAA,QACtB,cAAc,CAAA,CAAE,YAAA;AAAA,QAChB,OAAO,CAAA,CAAE,KAAA,GAAQ,EAAE,GAAG,CAAA,CAAE,OAAM,GAAI;AAAA,OACpC;AACA,MAAA,IAAI,CAAA,CAAE,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,SAAA;AAClD,MAAA,IAAI,CAAA,CAAE,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,SAAA;AAClD,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA;AAC9C,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA;AAC9C,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA;AAC9C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA;AACtC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA;AACtC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AACxC,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA;AAC9C,MAAA,IAAI,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,CAAA,CAAE,OAAA;AAChC,MAAA,IAAI,CAAA,CAAE,UAAA,EAAY,IAAA,CAAK,UAAA,GAAa,CAAA,CAAE,UAAA;AACtC,MAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,CAAA,CAAE,QAAA;AAChD,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA;AAC9C,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA;AAC9C,MAAA,IAAI,CAAA,CAAE,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,SAAA;AAClD,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,CAAA,CAAE,QAAA;AAClC,MAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,MAAA;AAC9B,MAAA,IAAI,CAAA,CAAE,YAAA,EAAc,IAAA,CAAK,YAAA,GAAe,CAAA,CAAE,YAAA;AAC1C,MAAA,IAAI,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,CAAA,CAAE,OAAA;AAEhC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,IAAA,KAAS,aAAA,IAAiB,CAAA,CAAE,MAAA,EAAQ;AAClF,QAAA,IAAA,CAAK,MAAA,GAAS,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAAA,MACtC;AACA,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,MAAA,EAAQ;AAClC,QAAA,IAAA,CAAK,MAAA,GAAS,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAAA,MACtC;AACA,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,MAAA,EAAQ;AACnC,QAAA,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UACtC,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,MAAA,EAAQ,aAAA,CAAc,CAAA,CAAE,MAAM;AAAA,SAChC,CAAE,CAAA;AAAA,MACJ;AACA,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,EAAM;AAC/B,QAAA,IAAA,CAAK,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UAClC,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAA,EAAQ,aAAA,CAAc,CAAA,CAAE,MAAM;AAAA,SAChC,CAAE,CAAA;AAAA,MACJ;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAEH,IAAA,MAAM,OAAY,EAAE,WAAA,EAAa,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAEjD,IAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,cAAA,EAAe,EAAG;AAC3C,MAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GAAI;AAAA,UACvB,IAAA;AAAA,UACA,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,UACpB,MAAA,EAAQ,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAAA,UAChC,UAAA,EAAY,gBAAgB,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,UAC/E,YAAA,EAAc,gBAAgB,QAAA,CAAS,kBAAA,CAAmB,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,UACvF,YAAA,EAAc,gBAAgB,QAAA,CAAS,kBAAA,CAAmB,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,UACvF,UAAA,EAAY;AAAA,YACV,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,sBAAsB,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,QAAA,EAAU,KAAA,EAAO,UAAU,MAAA,EAAQ,UAAA,EAAY,OAAO,SAAA,EAAU;AAAA,YAC9J,QAAA,EAAU,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,SAAA,EAAU;AAAA,YAClG,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,EAAM,MAAM,oBAAA,EAAsB,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAW;AAAA,YAC5F,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,eAAe,QAAA,EAAS;AAAA,YACnI,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,EAAM,IAAI,QAAA,EAAS;AAAA,YACzC,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,EAAM,OAAO,oBAAA;AAAqB;AACzD,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAyC;AAAA,IACnD;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,QAAA,CAAS,UAAA,EAAW,EAAG;AAC1C,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,GAAI;AAAA,UACnB,IAAA;AAAA,UACA,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,UACvB,MAAA,EAAQ,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA;AAAA,UACnC,UAAA,EAAY,gBAAgB,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,UAC/E,UAAA,EAAY;AAAA,YACV,KAAK,EAAC;AAAA,YACN,MAAA,EAAQ,EAAE,IAAA,EAAM,oBAAA;AAAqB;AACvC,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAqC;AAAA,IAC/C;AAEA,IAAA,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACpB,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,kBAAA,EAAoB,OAAO,CAAA,KAAM;AACvC,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,IAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AACrE,IAAA,MAAML,eAAc,QAAA,CAAS,cAAA,EAAe,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC1D,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAAA,MACxB,MAAA,EAAQ,GAAA,CAAI,MAAA,CACT,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACpB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACX,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,OAAO,CAAA,CAAE;AAAA,OACX,CAAE;AAAA,KACN,CAAE,CAAA;AACF,IAAA,OAAO,CAAA,CAAE,KAAKA,YAAW,CAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,SAAS,eAAA,CAAgB,MAAA,EAAe,GAAA,EAAU,SAAA,EAAwB;AACxE,IAAA,IAAI,SAAA,IAAa,GAAA,EAAK,OAAO,GAAA,CAAI,SAAS,CAAA;AAC1C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACjB,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,EAAM;AACvC,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,EAAM,OAAO,KAAK,SAAS,CAAA;AAAA,MAClF;AACA,MAAA,IAAA,CAAK,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,aAAA,KAAkB,MAAM,MAAA,EAAQ;AAC5E,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,UAAA,IAAI,SAAA,IAAa,IAAA,EAAM,OAAO,IAAA,CAAK,SAAS,CAAA;AAC5C,UAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,CAAM,MAAA,EAAQ,MAAM,SAAS,CAAA;AAC5D,UAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,SAAS,0BAA0B,MAAA,EAAsB;AACvD,IAAA,MAAM,YAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,QAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,EAAM;AAC9C,QAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,UAAA,SAAA,CAAU,KAAK,GAAG,yBAAA,CAA0B,IAAI,MAAA,IAAU,EAAE,CAAC,CAAA;AAAA,QAC/D;AAAA,MACF,CAAA,MAAA,IAAA,CAAY,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,aAAA,KAAkB,MAAM,MAAA,EAAQ;AACnF,QAAA,SAAA,CAAU,KAAK,GAAG,yBAAA,CAA0B,MAAM,MAAA,IAAU,EAAE,CAAC,CAAA;AAAA,MACjE;AAAA,IACF;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,SAAS,gBAAgB,KAAA,EAAsB;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,CAAC,KAAK,CAAA;AAC5C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAY,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,CAAE,KAAA,IAAS,IAAI,CAAE,CAAA;AACjG,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,CAAA,GAAI,MAAM,KAAA,IAAS,KAAA;AACzB,MAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,GAAI,EAAC;AAAA,IAC/D;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,eAAe,qBAAA,CACb,IAAA,EACA,UAAA,EACAM,GAAAA,EACAC,SAAAA,EACe;AACf,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,SAAA,GAAY,yBAAA,CAA0B,UAAA,CAAW,MAAM,CAAA;AAC7D,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE5B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,WAAA,GAAwB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,IAAI,QAAA,CAAS,UAAA,GAAa,CAAC,QAAA,CAAS,UAAU,CAAA;AAC7G,MAAA,MAAM,YAAyC,EAAC;AAEhD,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,SAAA,CAAU,IAAI,CAAA,mBAAI,IAAI,GAAA,EAAY;AAAA,MACpC;AAEA,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,MAAM,eAAA,CAAgB,UAAA,CAAW,MAAA,EAAQ,GAAA,EAAK,SAAS,IAAI,CAAA;AACjE,QAAA,MAAM,GAAA,GAAM,gBAAgB,GAAG,CAAA;AAC/B,QAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,YAAA,SAAA,CAAU,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,UAClC,CAAA,MAAO;AACL,YAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,cAAA,SAAA,CAAU,IAAI,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3D,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACtB,QAAA,MAAM,gBAAA,GAAmBA,SAAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAC1D,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACvB,QAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,EAAO,UAAA,IAAc,OAAA;AAEzD,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC9B,QAAA,MAAM,cAAqB,EAAC;AAC5B,QAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAMD,GAAAA,CAAG,QAAA,CAAS,EAAE,YAAY,UAAA,EAAY,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,CAAA;AAC5E,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,QAAQ,eAAA,CAAgB,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAe,UAAU,CAAA,IAAK,EAAA;AACrF,cAAA,WAAA,CAAY,KAAK,EAAE,EAAA,EAAI,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,YAC/C;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,IAAI,CAAA;AAAA,UACpC;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAEhE,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,MAAM,MAAM,eAAA,CAAgB,UAAA,CAAW,MAAA,EAAQ,GAAA,EAAK,SAAS,IAAI,CAAA;AACjE,UAAA,IAAI,CAAC,GAAA,EAAK;AAEV,UAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAa;AAC7B,YAAA,IAAI,QAAA,CAAS,QAAQ,GAAA,EAAK;AACxB,cAAA,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,GAAI,GAAA;AAAA,YACvB,CAAA,MAAO;AACL,cAAA,KAAA,MAAW,CAAA,IAAK,WAAW,MAAA,EAAQ;AACjC,gBAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAW,CAAA,CAAU,IAAA,EAAM;AACxC,kBAAA,KAAA,MAAW,GAAA,IAAQ,EAAU,IAAA,EAAM;AACjC,oBAAA,IAAI,GAAA,CAAI,QAAQ,IAAA,CAAK,CAAC,OAAY,EAAA,CAAG,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5D,sBAAA,MAAM,OAAA,GAAU,GAAA,CAAI,CAAA,CAAE,IAAK,CAAA;AAC3B,sBAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC1C,wBAAA,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAAI,GAAA;AAAA,sBAC3B;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAA;AAEA,UAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,YAAA,QAAA,CAAS,EAAE,IAAI,GAAA,EAAK,KAAA,EAAO,SAAS,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,EAAK,CAAA;AAAA,UACvD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,YAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAW;AAC3B,cAAA,MAAM,KAAK,OAAO,CAAA,KAAM,WAAY,CAAA,CAAE,KAAA,IAAS,EAAE,EAAA,GAAM,CAAA;AACvD,cAAA,OAAO,EAAE,EAAA,EAAQ,KAAA,EAAO,SAAS,GAAA,CAAI,EAAE,KAAK,EAAA,EAAG;AAAA,YACjD,CAAC,CAAC,CAAA;AAAA,UACJ,CAAA,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,EAAA;AAC5B,YAAA,QAAA,CAAS,EAAE,IAAI,KAAA,EAAO,QAAA,CAAS,IAAI,EAAE,CAAA,IAAK,IAAI,CAAA;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA,KAAM;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,IAAK,EAAA;AAClC,MAAA,MAAM,gBAAA,GAAmB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA,IAAK,EAAA;AACvD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAI,CAAA,EAAG,EAAE,CAAA;AAEjE,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,EAAC,EAAG,OAAA,EAAS,mBAAmB,CAAA;AAAA,MAC3D;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,KAAgB,MAAM,kBAAA;AAAA,QACrD,EAAE,GAAA,CAAI,GAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,iBAAA,GAAoB,gBAAA,GACtB,gBAAA,CAAiB,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,GAC1C,QAAA,CAAS,kBAAA,EAAmB;AAEhC,MAAA,MAAM,UAMD,EAAC;AAEN,MAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,QAChB,KAAA,CAAM,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAAA,QAC3C;AAAA,OACF;AAEA,MAAA,KAAA,MAAW,UAAA,IAAc,QAAA,CAAS,cAAA,EAAe,EAAG;AAClD,QAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,EAAG;AAElD,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,MAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,KAAA,CAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAErB,QAAA,MAAM,gBAAA,GAAmB,WAAW,MAAA,CACjC,MAAA;AAAA,UACC,CAAC,MACC,CAAA,CAAE,IAAA,IACF,EAAE,IAAA,KAAS,IAAA,KACV,CAAA,CAAE,IAAA,KAAS,MAAA,IACV,CAAA,CAAE,SAAS,OAAA,IACX,CAAA,CAAE,IAAA,KAAS,UAAA,IACX,CAAA,CAAE,IAAA,KAAS,cACX,CAAA,CAAE,OAAA,CAAA,IACJ,CAAC,CAAA,CAAE,KAAA,EAAO;AAAA,SACd,CACC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAK,CAAA;AAErB,QAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AAEnC,QAAA,IAAI;AACF,UAAA,MAAM,eAAsC,gBAAA,CAAiB,GAAA;AAAA,YAC3D,CAAC,KAAA,KAAU;AACT,cAAA,MAAM,YAAiC,EAAC;AACxC,cAAA,SAAA,CAAU,KAAK,CAAA,GAAI,EAAE,IAAA,EAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,EAAI;AACxC,cAAA,OAAO,SAAA;AAAA,YACT;AAAA,WACF;AAEA,UAAA,MAAM,YAAA,GAAe,MAAM,EAAA,CAAG,IAAA,CAAK;AAAA,YACjC,YAAY,UAAA,CAAW,IAAA;AAAA,YACvB,KAAA,EAAO,EAAE,EAAA,EAAI,YAAA,EAAa;AAAA,YAC1B,KAAA;AAAA,YACA,QAAA,EAAU;AAAA,WACX,CAAA;AAED,UAAA,MAAM,qBAAA,CAAsB,YAAA,CAAa,IAAA,EAAe,UAAA,EAAY,IAAmB,QAAQ,CAAA;AAE/F,UAAA,KAAA,MAAW,GAAA,IAAO,aAAa,IAAA,EAAe;AAC5C,YAAA,MAAM,UAAA,GACJ,UAAA,CAAW,KAAA,EAAO,UAAA,IAClB,gBAAA,CAAiB,IAAA;AAAA,cACf,CAAC,MACC,CAAA,KAAM,OAAA,IACN,MAAM,MAAA,IACN,CAAA,KAAM,aACN,CAAA,KAAM;AAAA,aACV;AACF,YAAA,MAAM,KAAA,GAAQ,UAAA,GAAc,eAAA,CAAgB,UAAA,CAAW,MAAA,EAAQ,KAAK,UAAU,CAAA,IAAK,GAAA,CAAI,EAAA,GAAM,GAAA,CAAI,EAAA;AAEjG,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,YAAY,UAAA,CAAW,IAAA;AAAA,cACvB,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,IAAA;AAAA,cACtC,IAAI,GAAA,CAAI,EAAA;AAAA,cACR,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,UAAU,CAAA;AAAA,cACjC;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoB,UAAA,CAAW,IAAI,KAAK,GAAG,CAAA;AAAA,QAC3D;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAC,CAAA;AAErD,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,OAAA,EAAS,EAAC,EAAE,EAAG,GAAG,CAAA;AAAA,IAC1D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,YAAY,CAAA,EAAG;AAC5D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAI,CAAA,EAAG,GAAG,CAAA;AAClE,MAAA,OAAA,CAAQ,IAAI,oBAAA,EAAsB,kBAAA,EAAoB,EAAE,IAAA,EAAM,OAAO,CAAA;AACrE,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAA,CAAK,EAAE,UAAA,EAAY,kBAAA,EAAoB,KAAA,EAAO,EAAC,EAAG,IAAA,EAAM,KAAA,EAAO,CAAA;AACvF,MAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqB,MAAM,CAAA;AACvC,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,QAClD,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,WAAA,EAAa,GAAA,CAAI,WAAA,IAAe,EAAC;AAAA,QACjC,UAAU,GAAA,CAAI,UAAA;AAAA,QACd,WAAW,GAAA,CAAI;AAAA,OACjB,CAAE,CAAA;AACF,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,MAAA,EAAQ,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,GAAG,CAAA;AAAA,IACxG,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AAC/C,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,IAAsB,GAAG,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,MAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,QAC1B,UAAA,EAAY,kBAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,QAAQ,OAAA,CAAQ,EAAA;AAAA,UAChB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAW,qBAAqB,MAAM,CAAA;AAAA,UACtC,WAAA,EAAa,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,WAAA,GAAc,CAAC,GAAG,CAAA;AAAA,UACtE,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,UAC7B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACpC,OACD,CAAA;AACD,MAAA,MAAM,oBAAoB,cAAA,CAAe;AAAA,QACvC,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,QAAA,EAAU,SAAA;AAAA,QACV,YAAa,GAAA,CAAY,EAAA;AAAA,QACzB,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,CAAK,IAAA;AAAK,OAChC,CAAA;AACD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,GAAI,GAAA;AAAA,QACJ,GAAA,EAAK,MAAA;AAAA,QACL,WAAA,EAAa,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,WAAA,GAAc,CAAC,GAAG;AAAA,SACrE,GAAG,CAAA;AAAA,IACR,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,MAAA,CAAO,eAAA,EAAiB,OAAO,CAAA,KAAM;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,QAAA,CAAS,EAAE,UAAA,EAAY,kBAAA,EAAoB,IAAI,CAAA;AACzE,MAAA,IAAI,CAAC,UAAU,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAChE,MAAA,MAAM,GAAG,MAAA,CAAO,EAAE,UAAA,EAAY,kBAAA,EAAoB,IAAI,CAAA;AACtD,MAAA,MAAM,oBAAoB,cAAA,CAAe;AAAA,QACvC,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,QAAA,EAAU,SAAA;AAAA,QACV,UAAA,EAAY,EAAA;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,EAAE,OAAA,EAAU,QAAA,CAAiB,IAAA;AAAK,OAC7C,CAAA;AACD,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,mBAAmB,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,KAAA,CAAM,eAAA,EAAiB,OAAO,CAAA,KAAM;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,QAAA,CAAS,EAAE,UAAA,EAAY,kBAAA,EAAoB,IAAI,CAAA;AACzE,MAAA,IAAI,CAAC,UAAU,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAChE,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,EAAG,UAAA,CAAW,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AACxF,MAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,EAAG,UAAA,CAAW,cAAc,IAAA,CAAK,WAAA;AACnE,MAAA,IAAI,KAAK,SAAA,KAAc,KAAA,CAAA,EAAW,UAAA,CAAW,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AAC3E,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAC3F,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,MAAA,CAAO,EAAE,YAAY,kBAAA,EAAoB,EAAA,EAAI,IAAA,EAAM,UAAA,EAAY,CAAA;AACxF,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,GAAI,SAAiB,SAAA,EAAY,QAAA,CAAiB,WAAW,CAAA;AAAA,IAC/E,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,IAAA,CAAK,sBAAA,EAAwB,OAAO,CAAA,KAAM;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,QAAA,CAAS,EAAE,UAAA,EAAY,kBAAA,EAAoB,IAAI,CAAA;AACzE,MAAA,IAAI,CAAC,UAAU,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAChE,MAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,QAC9B,UAAA,EAAY,kBAAA;AAAA,QACZ,EAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,GAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAW,qBAAqB,MAAM,CAAA;AAAA,UACtC,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AACD,MAAA,MAAM,oBAAoB,cAAA,CAAe;AAAA,QACvC,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,QAAA,EAAU,SAAA;AAAA,QACV,UAAA,EAAY,EAAA;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,EAAE,OAAA,EAAU,QAAA,CAAiB,IAAA;AAAK,OAC7C,CAAA;AACD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,GAAI,OAAA;AAAA,QACJ,GAAA,EAAK,MAAA;AAAA,QACL,aAAc,QAAA,CAAiB,WAAA;AAAA,QAC/B,WAAY,QAAA,CAAiB;AAAA,OAC9B,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAA,KAAM;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,YAAY,CAAA,EAAG;AAC5D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,CAAC,gBAAgB,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,+BAAA,EAAgC,EAAG,GAAG,CAAA;AAElF,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,WAAA,EAAY;AAClD,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,IAClC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA,KAAM;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,CAAC,gBAAgB,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,+BAAA,EAAgC,EAAG,GAAG,CAAA;AAElF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,aAAA,CAAc,IAAI,CAAA;AAEvD,MAAA,MAAM,oBAAoB,cAAA,CAAe;AAAA,QACvC,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,QAAA,EAAU,SAAA;AAAA,QACV,YAAY,OAAA,CAAQ,EAAA;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,UAAU,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,EAAK,QAAQ,GAAA;AAAI,OAClD,CAAA;AAED,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,mBAAA,EAAqB,OAAO,CAAA,KAAM;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,YAAY,CAAA,EAAG;AAC5D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,CAAC,gBAAgB,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,+BAAA,EAAgC,EAAG,GAAG,CAAA;AAElF,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,cAAA,CAAe,EAAE,CAAA;AACtD,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAE/D,MAAA,OAAO,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IACvB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,KAAA,CAAM,mBAAA,EAAqB,OAAO,CAAA,KAAM;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,CAAC,gBAAgB,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,+BAAA,EAAgC,EAAG,GAAG,CAAA;AAElF,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,aAAA,CAAc,IAAI,IAAI,CAAA;AAC3D,MAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAE/D,MAAA,MAAM,oBAAoB,cAAA,CAAe;AAAA,QACvC,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,QAAA,EAAU,SAAA;AAAA,QACV,UAAA,EAAY,EAAA;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA;AAAK,OAChC,CAAA;AAED,MAAA,OAAO,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IACvB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,MAAA,CAAO,mBAAA,EAAqB,OAAO,CAAA,KAAM;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,CAAC,gBAAgB,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,+BAAA,EAAgC,EAAG,GAAG,CAAA;AAElF,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,cAAA,CAAe,EAAE,CAAA;AACvD,MAAA,IAAI,CAAC,UAAU,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAEhE,MAAA,MAAM,cAAA,CAAe,cAAc,EAAE,CAAA;AAErC,MAAA,MAAM,oBAAoB,cAAA,CAAe;AAAA,QACvC,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,QAAA,EAAU,SAAA;AAAA,QACV,UAAA,EAAY,EAAA;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA;AAAK,OACjC,CAAA;AAED,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,mBAAmB,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK,wBAAA,EAA0B,OAAO,CAAA,KAAM;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,aAAa,CAAA,EAAG;AAC7D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,CAAC,gBAAgB,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,+BAAA,EAAgC,EAAG,GAAG,CAAA;AAElF,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,WAAA,CAAY,EAAE,CAAA;AAClD,MAAA,IAAI,CAAC,QAAQ,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAE9D,MAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IACtB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,2BAAA,EAA6B,OAAO,CAAA,KAAM;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AACpF,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,EAAgB,YAAY,CAAA,EAAG;AAC5D,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,CAAC,gBAAgB,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,+BAAA,EAAgC,EAAG,GAAG,CAAA;AAElF,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAI,CAAA,EAAG,GAAG,CAAA;AAClE,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,kBAAA,CAAmB,IAAI,KAAK,CAAA;AAEjE,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,IACjC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,WAAA,GAAc,SAAS,cAAA,EAAe;AAE5C,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AAkRpC,IAAA,IAASE,YAAAA,GAAT,SAAqB,CAAA,EAAwB,CAAA,EAA2E;AACtH,MAAA,MAAM,QAA2D,EAAC;AAClE,MAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAC9D,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,WAAA,IAAe,QAAQ,WAAA,EAAa;AAChE,QAAA,IAAI,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,GAAG,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,GAAG,CAAC,CAAA,EAAG;AACrD,UAAA,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,KAAK,QAAA,EAAU,GAAA,IAAO,IAAI,CAAA,CAAE,GAAG,CAAA,GAAI,MAAA,EAAW,UAAU,GAAA,IAAO,CAAA,GAAI,EAAE,GAAG,CAAA,GAAI,QAAW,CAAA;AAAA,QAC7G;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AA3RA,IAAA,MAAM,OAAO,UAAA,CAAW,IAAA;AAExB,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,YAAA,EAAc;AAE/C,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAI,CAAA,CAAA;AAG7B,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,MAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,EAAA,CAAG,gBAAA,CAAiB,EAAE,QAAA,EAAU,WAAA,EAAa,QAAQ,OAAA,EAAS,EAAA,IAAM,EAAA,EAAI,IAAA,EAAM,SAAS,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,IAAA,KAAS,eAAe,CAAA;AAAA,QAC9I;AAEA,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,QAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,aAAa,GAAA,CAAI,MAAM,KAAK,GAAG,CAAA;AACzD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,IAAI,CAAA,EAAG,GAAG,CAAA;AAC3E,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,KAAA,CAAA;AAC7C,QAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,aAAa,GAAA,CAAI,OAAO,KAAK,GAAG,CAAA;AAC3D,QAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAA;AAC7D,QAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,OAAA;AAEzB,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAA,CAAK;AAAA,UAC3B,UAAA,EAAY,IAAA;AAAA,UACZ,OAAO,EAAC;AAAA,UACR,IAAA;AAAA,UACA,KAAA;AAAA,UACA,IAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,MAAA;AAAA,UACA,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,MAAM,qBAAA,CAAsB,MAAA,CAAO,IAAA,EAAe,UAAA,EAAY,IAAmB,QAAQ,CAAA;AAEzF,QAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,MACtB,SAAS,KAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,aAAA,CAAA,EAAiB,OAAO,CAAA,KAAM;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,MAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,qBAAA,IAAyB,GAAG,CAAA;AAAA,QACrD;AACA,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAChD,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAEhD,QAAA,gBAAA,CAAiB,kBAAA,EAAoB,aAAA,EAAe,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,SAAA,CAAA,EAAa,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAGlG,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,MAAM,CAAC,QAAA,EAAU,QAAQ,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,YAC7C,EAAA,CAAG,gBAAgB,EAAE,UAAA,EAAY,MAAM,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,CAAA;AAAA,YACnF,EAAA,CAAG,gBAAgB,EAAE,UAAA,EAAY,MAAM,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa;AAAA,WACpF,CAAA;AACD,UAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,YAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,UACnD;AACA,UAAA,MAAM,KAAA,GAAQA,YAAAA,CAAY,QAAA,CAAS,IAAA,EAAM,SAAS,IAAI,CAAA;AACtD,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA;AAAA,QACzB;AAEA,QAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,aAAa,GAAA,CAAI,MAAM,KAAK,GAAG,CAAA;AACzD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,IAAI,CAAA,EAAG,GAAG,CAAA;AAE3E,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,YAAA,CAAa;AAAA,UACnC,UAAA,EAAY,IAAA;AAAA,UACZ,UAAA,EAAY,EAAA;AAAA,UACZ,IAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,MACtB,SAAS,KAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc,OAAO,CAAA,KAAM;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,MAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,SAAA,CAAU;AAAA,UAC/B,UAAA,EAAY,IAAA;AAAA,UACZ,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAAA,UAC5B,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,MAC/B,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc,OAAO,CAAA,KAAM;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,QAAA,MAAM,aAAA,GAAgB,kBAAkB,IAAI,CAAA;AAE5C,QAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,QAAA,CAA8B;AAAA,UACzD,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAA,SAAA,GAAY,EAAE,GAAG,WAAA,EAAa,GAAG,KAAK,KAAA,EAAM;AAAA,QAC9C,CAAA,MAAO;AACL,UAAA,SAAA,GAAY,IAAA,CAAK,IAAA,IAAQ,kBAAA,CAAmB,IAAI,CAAA;AAAA,QAClD;AAEA,QAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,WAAA,CAAY;AAAA,UACjC,UAAA,EAAY,IAAA;AAAA,UACZ,UAAA,EAAY,EAAA;AAAA,UACZ,QAAA,EAAU,WAAA;AAAA,UACV,IAAA,EAAM,SAAA;AAAA,UACN,aAAA;AAAA,UACA,gBAAgB,IAAA,CAAK;AAAA,SACtB,CAAA;AAED,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,YACjC,MAAA,EAAQ,iBAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,IAAA;AAAA,YACV,UAAA,EAAY,EAAA;AAAA,YACZ,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,EAAE,IAAA,EAAM,YAAA;AAAa,WAChC,CAAA;AAAA,QACH;AACA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,4BAA4B,CAAA;AAAA,MACpE,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc,OAAO,CAAA,KAAM;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,GAAG,WAAA,CAAY;AAAA,UACnB,UAAA,EAAY,IAAA;AAAA,UACZ,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAAA,UAC5B,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,YACjC,MAAA,EAAQ,iBAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,IAAA;AAAA,YACV,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAAA,YAC5B,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,EAAE,IAAA,EAAM,eAAA;AAAgB,WACnC,CAAA;AAAA,QACH;AACA,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,gCAAgC,CAAA;AAAA,MAC3D,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAeD,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAA,EAAQ,OAAO,CAAA,KAAM;AACtC,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,MAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,QAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,aAAa,GAAA,CAAI,OAAO,KAAK,GAAG,CAAA;AAC3D,QAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAA;AAE7D,QAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,OAAA;AAEzB,QAAA,IAAI,GAAA,GAAM,MAAM,EAAA,CAAG,QAAA,CAAS;AAAA,UAC1B,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,MAAA;AAAA,UACA,KAAA,EAAO;AAAA,SACR,CAAA;AAGD,QAAA,IAAI,CAAC,GAAA,IAAO,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,EAAG;AACjE,UAAA,GAAA,GAAM,MAAM,GAAG,OAAA,CAAQ;AAAA,YACrB,UAAA,EAAY,IAAA;AAAA,YACZ,KAAA,EAAO,EAAE,IAAA,EAAM,EAAA,EAAG;AAAA,YAClB,QAAA,EAAU,WAAA;AAAA,YACV,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,QACpD;AAEA,QAAA,MAAM,sBAAsB,CAAC,GAAU,CAAA,EAAG,UAAA,EAAY,IAAmB,QAAQ,CAAA;AAEjF,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,MAC7B,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,KAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,EAAA,CAAG,gBAAA,CAAiB,EAAE,QAAA,EAAU,WAAA,EAAa,QAAQ,OAAA,EAAS,EAAA,IAAM,EAAA,EAAI,IAAA,EAAM,SAAS,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,IAAA,KAAS,eAAe,CAAA;AAAA,QAC9I;AAEA,QAAA,gBAAA,CAAiB,oBAAoB,aAAA,EAAe,QAAA,EAAU,MAAA,EAAQ,CAAA,CAAE,IAAI,GAAG,CAAA;AAE/E,QAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,QAAA,IAAI,SAAA,GAAY,IAAA;AAGhB,QAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,UAAA,IAAI,MAAM,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,MAAM,EAAA,EAAI;AAC9C,YAAA,MAAM,SAAA,GAAY,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,OAAA;AACpM,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAGA,QAAA,qBAAA,CAAsB,UAAA,CAAW,QAAQ,SAAS,CAAA;AAElD,QAAA,MAAM,OAAA,GAAU,EAAE,GAAA,CAAI,GAAA;AAEtB,QAAA,IAAI,UAAA,CAAW,OAAO,cAAA,EAAgB;AACpC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,cAAA,EAAgB;AAClD,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK;AAAA,cAC5B,UAAA,EAAY,IAAA;AAAA,cACZ,IAAA,EAAM,SAAA;AAAA,cACN,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA,IAAI,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,UAAU,CAAA;AAAA,UACrD;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,kBAAA,CAAmB,IAAI,CAAA;AAC/C,QAAA,IAAI;AACF,UAAA,SAAA,GAAY,MAAA,CAAO,MAAM,SAAS,CAAA;AAAA,QACpC,SAAS,MAAA,EAAa;AACpB,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAsB,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,EAAS,MAAA,CAAO,MAAA,IAAU,GAAG,CAAA;AAAA,QAC9G;AAEA,QAAA,IAAI,UAAA,CAAW,gBAAgB,WAAA,EAAa;AAC1C,UAAA,SAAA,CAAU,QAAA,GAAW,WAAA;AAAA,QACvB;AAEA,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,QAAA,EAAU,MAAA,KAAW,IAAA;AACvD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,SAAA,CAAU,aAAA,GAAgB,OAAA;AAC1B,UAAA,SAAA,CAAU,QAAA,GAAW,KAAA;AAAA,QACvB;AAEA,QAAA,IAAI,UAAA,CAAW,OAAO,YAAA,EAAc;AAClC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,YAAA,EAAc;AAChD,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK;AAAA,cAC5B,UAAA,EAAY,IAAA;AAAA,cACZ,IAAA,EAAM,SAAA;AAAA,cACN,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA,IAAI,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,UAAU,CAAA;AAAA,UACrD;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,IAAA;AAAA,UACZ,IAAA,EAAM,SAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,UAAA,CAAW,OAAO,WAAA,EAAa;AACjC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,WAAA,EAAa;AAC/C,YAAA,MAAM,IAAA,CAAK;AAAA,cACT,UAAA,EAAY,IAAA;AAAA,cACZ,GAAA;AAAA,cACA,IAAA,EAAM,SAAA;AAAA,cACN,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,CACG,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA,EAAG;AAAA,YACxC,UAAA,EAAY,IAAA;AAAA,YACZ,SAAA,EAAW,QAAA;AAAA,YACX,IAAA,EAAM,GAAA;AAAA,YACN,IAAA,EAAM,OAAA,GACF,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAC3D,KAAA,CAAA;AAAA,YACJ,QAAA,EAAU;AAAA,WACX,EACA,KAAA,CAAM,CAAC,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,CAAA,EAAgC,GAAG,CAAC,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,YACjC,MAAA,EAAQ,iBAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,IAAA;AAAA,YACV,YAAa,GAAA,CAAY,EAAA;AAAA,YACzB,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,IAAA,EAAM,KAAK,OAAA,EAAS,sBAAA,IAA0B,GAAG,CAAA;AAAA,MACnE,SAAS,KAAA,EAAY;AACnB,QAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,UAAA,OAAO,CAAA,CAAE,IAAA;AAAA,YACP,EAAE,KAAA,EAAO,CAAA,mBAAA,EAAsB,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,EAAS,KAAA,CAAM,MAAA,EAAO;AAAA,YACtF;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAA,EAAQ,OAAO,CAAA,KAAM;AACxC,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,QAAA,MAAM,aAAA,GAAgB,kBAAkB,IAAI,CAAA;AAE5C,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI;AAAA,UACnC,aAAA;AAAA,UACA,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,UAC1B,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,QAAA,CAA8B;AAAA,UACzD,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,aAAA,IAAiB,WAAA,CAAY,SAAA,IAAa,aAAA,KAAkB,YAAY,SAAA,EAAW;AACrF,UAAA,OAAO,EAAE,IAAA,CAAK,qBAAA,CAAsB,aAAA,EAAe,WAAW,GAAG,GAAG,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,YAAY,MAAA,CAAO,WAAA;AAAA,UACrB,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,MAAA;AAAA,YACvC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,KAAM,UAAU,CAAA,KAAM,KAAA;AAAA;AACpC,SACF;AAIA,QAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,UAAA,IAAI,MAAM,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,MAAM,EAAA,EAAI;AAC9C,YAAA,MAAM,SAAA,GAAY,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,OAAA;AACpM,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAGA,QAAA,qBAAA,CAAsB,UAAA,CAAW,QAAQ,SAAS,CAAA;AAElD,QAAA,MAAM,OAAA,GAAU,EAAE,GAAA,CAAI,GAAA;AAEtB,QAAA,IAAI,UAAA,CAAW,OAAO,cAAA,EAAgB;AACpC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,cAAA,EAAgB;AAClD,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK;AAAA,cAC5B,UAAA,EAAY,IAAA;AAAA,cACZ,IAAA,EAAM,SAAA;AAAA,cACN,WAAA;AAAA,cACA,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA,IAAI,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,UAAU,CAAA;AAAA,UACrD;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,kBAAA,CAAmB,IAAI,CAAA;AAC/C,QAAA,SAAA,GAAY,MAAA,CAAO,MAAM,SAAS,CAAA;AAElC,QAAA,IAAI,UAAA,CAAW,OAAO,YAAA,EAAc;AAClC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,YAAA,EAAc;AAChD,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK;AAAA,cAC5B,UAAA,EAAY,IAAA;AAAA,cACZ,IAAA,EAAM,SAAA;AAAA,cACN,WAAA;AAAA,cACA,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA,IAAI,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,UAAU,CAAA;AAAA,UACrD;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,CAAA,EAA2B,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAE7D,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,QAAA,EAAU,MAAA,KAAW,IAAA;AACvD,QAAA,MAAM,kBAAA,GAAqB,YAAY,aAAA,KAAkB,WAAA;AAEzD,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,kBAAkB,kBAAA,EAAoB;AAExC,UAAA,MAAM,GAAG,aAAA,CAAc;AAAA,YACrB,UAAA,EAAY,IAAA;AAAA,YACZ,UAAA,EAAY,EAAA;AAAA,YACZ,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,OAAA;AAAA,YACR,WAAW,OAAA,EAAS,EAAA;AAAA,YACpB,iBAAA,EAAmB,qBAAA;AAAA,YACnB,QAAA,EAAU;AAAA,WACX,CAAA;AAGD,UAAA,MAAM,GAAG,MAAA,CAAO;AAAA,YACd,UAAA,EAAY,IAAA;AAAA,YACZ,EAAA;AAAA,YACA,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA;AAAA,YACvB,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH,CAAA,MAAO;AAEL,UAAA,MAAM,QAAA,GAAW,iBACb,EAAE,GAAG,WAAW,aAAA,EAAe,OAAA,EAAS,QAAA,EAAU,KAAA,EAAM,GACxD,SAAA;AAEJ,UAAA,OAAA,CAAQ,GAAA,CAAI,uCAAuC,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,WAAA,CAAA,EAAe,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AACjG,UAAA,MAAM,GAAG,MAAA,CAAO;AAAA,YACd,UAAA,EAAY,IAAA;AAAA,YACZ,EAAA;AAAA,YACA,IAAA,EAAM,QAAA;AAAA,YACN,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAAA,QAC7D;AAGA,QAAA,GAAA,GAAM,MAAM,GAAG,QAAA,CAAS;AAAA,UACtB,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,YAAA,MAAM,GAAG,aAAA,CAAc;AAAA,cACrB,UAAA,EAAY,IAAA;AAAA,cACZ,UAAA,EAAY,EAAA;AAAA,cACZ,IAAA,EAAM,SAAA;AAAA,cACN,MAAA,EAAQ,OAAA;AAAA,cACR,WAAW,OAAA,EAAS,EAAA;AAAA,cACpB,iBAAA,EAAmB,aAAA;AAAA,cACnB,QAAA,EAAU;AAAA,aACX,CAAA;AAAA,UACH;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,GAAG,WAAA,CAAY;AAAA,YACnB,UAAA,EAAY,IAAA;AAAA,YACZ,UAAA,EAAY,EAAA;AAAA,YACZ,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,UAAA,CAAW,OAAO,WAAA,EAAa;AACjC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,WAAA,EAAa;AAC/C,YAAA,MAAM,IAAA,CAAK;AAAA,cACT,UAAA,EAAY,IAAA;AAAA,cACZ,GAAA;AAAA,cACA,IAAA,EAAM,SAAA;AAAA,cACN,WAAA;AAAA,cACA,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,CACG,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA,EAAG;AAAA,YACxC,UAAA,EAAY,IAAA;AAAA,YACZ,SAAA,EAAW,QAAA;AAAA,YACX,IAAA,EAAM,GAAA;AAAA,YACN,YAAA,EAAc,WAAA;AAAA,YACd,IAAA,EAAM,OAAA,GACF,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAC3D,KAAA,CAAA;AAAA,YACJ,QAAA,EAAU;AAAA,WACX,EACA,KAAA,CAAM,CAAC,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,CAAA,EAAgC,GAAG,CAAC,CAAA;AAAA,QACtE;AAEA,QAAA,gBAAA,CAAiB,kBAAA,EAAoB,aAAA,EAAe,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAE3F,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,YACjC,MAAA,EAAQ,iBAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,IAAA;AAAA,YACV,UAAA,EAAY,EAAA;AAAA,YACZ,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,IAAA,EAAM,KAAK,OAAA,EAAS,cAAA,GAAiB,aAAA,GAAgB,sBAAA,EAAwB,CAAA;AAAA,MAC/F,SAAS,KAAA,EAAY;AACnB,QAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,wBAAA,CAAA,EAA4B,MAAM,MAAM,CAAA;AACxE,UAAA,OAAO,CAAA,CAAE,IAAA;AAAA,YACP,EAAE,KAAA,EAAO,CAAA,mBAAA,EAAsB,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,EAAS,KAAA,CAAM,MAAA,EAAO;AAAA,YACtF;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,YAAA,CAAA,EAAgB,MAAM,OAAA,EAAS,CAAA,MAAA,CAAA,EAAU,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,KAAA,CAAM,KAAA,EAAO,CAAA,MAAA,CAAA,EAAU,MAAM,KAAK,CAAA;AACnI,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGL,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAA,EAAQ,OAAO,CAAA,KAAM;AACzC,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,EAAA,CAAG,gBAAA,CAAiB,EAAE,QAAA,EAAU,WAAA,EAAa,QAAQ,OAAA,EAAS,EAAA,IAAM,EAAA,EAAI,IAAA,EAAM,SAAS,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,IAAA,KAAS,eAAe,CAAA;AAAA,QAC9I;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAE7C,QAAA,MAAM,OAAA,GAAU,EAAE,GAAA,CAAI,GAAA;AAEtB,QAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,QAAA,CAAS;AAAA,UACpC,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,UAAA,CAAW,OAAO,YAAA,EAAc;AAClC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,YAAA,EAAc;AAChD,YAAA,MAAM,IAAA,CAAK;AAAA,cACT,UAAA,EAAY,IAAA;AAAA,cACZ,GAAA,EAAK,WAAA;AAAA,cACL,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,MAAM,GAAG,WAAA,CAAY;AAAA,UACnB,UAAA,EAAY,IAAA;AAAA,UACZ,UAAA,EAAY,EAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,UAAA,CAAW,OAAO,WAAA,EAAa;AACjC,UAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,WAAA,EAAa;AAC/C,YAAA,MAAM,IAAA,CAAK;AAAA,cACT,UAAA,EAAY,IAAA;AAAA,cACZ,GAAA;AAAA,cACA,WAAA;AAAA,cACA,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAW;AAAA,aACZ,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,CACG,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA,EAAG;AAAA,YACxC,UAAA,EAAY,IAAA;AAAA,YACZ,SAAA,EAAW,QAAA;AAAA,YACX,IAAA,EAAM,GAAA;AAAA,YACN,YAAA,EAAc,WAAA;AAAA,YACd,IAAA,EAAM,OAAA,GACF,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAC3D,KAAA,CAAA;AAAA,YACJ,QAAA,EAAU;AAAA,WACX,EACA,KAAA,CAAM,CAAC,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,CAAA,EAAgC,GAAG,CAAC,CAAA;AAAA,QACtE;AAEA,QAAA,gBAAA,CAAiB,kBAAA,EAAoB,aAAA,EAAe,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAE5F,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,YACjC,MAAA,EAAQ,iBAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,IAAA;AAAA,YACV,UAAA,EAAY,EAAA;AAAA,YACZ,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,wBAAwB,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACvD,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,WAAW,MAAA,CAAO,KAAK,CAAA,EAAE,EAAG,GAAG,CAAA;AAAA,MAC9D;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,cAAA,CAAA,EAAkB,OAAO,CAAA,KAAM;AACjD,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAA;AAE7C,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAA,CAAQ,GAAA,CAAI,4BAAA,EAA8B,MAAA,CAAO,KAAK,CAAA;AACtD,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAGnC,QAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,QAAA,CAAc;AAAA,UACzC,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,QACpD;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,WAAW,CAAA;AAGpD,QAAA,MAAM,EAAE,IAAI,MAAA,EAAQ,SAAA,EAAW,aAAa,SAAA,EAAW,WAAA,EAAa,GAAG,OAAA,EAAQ,GAAI,WAAA;AAGnF,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,QAAA,MAAM,UAAU,CAAA,EAAG,WAAA,CAAY,IAAA,IAAQ,UAAU,SAAS,SAAS,CAAA,CAAA;AAEnE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAE,CAAA;AAG9C,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC7B,UAAA,EAAY,IAAA;AAAA,UACZ,IAAA,EAAM;AAAA,YACJ,GAAG,OAAA;AAAA,YACH,IAAA,EAAM,OAAA;AAAA,YACN,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,CAAA,EAAsC,MAAA,CAAe,EAAE,CAAA;AACnE,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,oCAAoC,CAAA;AAAA,MAC7E,SAAS,KAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,WAAW,MAAA,CAAO,KAAK,CAAA,EAAE,EAAG,GAAG,CAAA;AAAA,MAC9D;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,gCAAA,CAAA,EAAoC,OAAO,CAAA,KAAM;AACnE,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AAEzC,QAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,eAAA,CAAgB;AAAA,UACvC,UAAA,EAAY,IAAA;AAAA,UACZ,SAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,QACnD;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,IAAA,EAAM,EAAE,GAAG,OAAA,CAAQ,MAAM,aAAA,EAAe,OAAA,EAAS,UAAU,KAAA,EAAM;AAAA,UACjE,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,GAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,aAAA,CAAA,EAAiB,OAAO,CAAA,KAAM;AAChD,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,QAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,IAAA;AAE9B,QAAA,IAAI,MAAA,KAAW,aAAa,SAAA,EAAW;AACrC,UAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,eAAA,CAAgB;AAAA,YACvC,UAAA,EAAY,IAAA;AAAA,YACZ,SAAA;AAAA,YACA,QAAA,EAAU;AAAA,WACX,CAAA;AAED,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,UACnD;AAEA,UAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,YAC1B,UAAA,EAAY,IAAA;AAAA,YACZ,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAAA,YACpB,IAAA,EAAM,EAAE,GAAG,OAAA,CAAQ,MAAM,aAAA,EAAe,OAAA,EAAS,UAAU,KAAA,EAAM;AAAA,YACjE,QAAA,EAAU;AAAA,WACX,CAAA;AAED,UAAA,OAAO,EAAE,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,GAAA;AAAA,YACN,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,IAAoB,GAAG,CAAA;AAAA,MAChD,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,YAAA,CAAA,EAAgB,OAAO,CAAA,KAAM;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,EAAA,CAAG,gBAAA,CAAiB,EAAE,QAAA,EAAU,WAAA,EAAa,QAAQ,OAAA,EAAS,EAAA,IAAM,EAAA,EAAI,IAAA,EAAM,SAAS,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,IAAA,KAAS,eAAe,CAAA;AAAA,QAC9I;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,QAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAChD,QAAA,MAAM,aAAA,GAAgB,kBAAkB,IAAI,CAAA;AAG5C,QAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,QAAA,CAA8B;AAAA,UACzD,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,aAAA,IAAiB,WAAA,CAAY,SAAA,IAAa,aAAA,KAAkB,YAAY,SAAA,EAAW;AACrF,UAAA,OAAO,EAAE,IAAA,CAAK,qBAAA,CAAsB,aAAA,EAAe,WAAW,GAAG,GAAG,CAAA;AAAA,QACtE;AAGA,QAAA,IAAI,WAAA,GAAc,EAAE,aAAA,EAAe,WAAA,EAAa,UAAU,KAAA,EAAM;AAChE,QAAA,IAAI,YAAA,GAAe,WAAA;AAEnB,QAAA,IAAI,YAAY,QAAA,EAAU;AAExB,UAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,YAAA,CAAa;AAAA,YACrC,UAAA,EAAY,IAAA;AAAA,YACZ,UAAA,EAAY,EAAA;AAAA,YACZ,KAAA,EAAO,CAAA;AAAA,YACP,IAAA,EAAM,YAAA;AAAA,YACN,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,IAAI,QAAA,CAAS,KAAK,MAAA,GAAS,CAAA,IAAK,SAAS,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,KAAW,OAAA,EAAS;AACnE,YAAA,YAAA,GAAe,EAAE,GAAG,WAAA,EAAa,GAAG,SAAS,IAAA,CAAK,CAAC,EAAE,IAAA,EAAK;AAC1D,YAAA,WAAA,GAAc,EAAE,GAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAM,GAAG,WAAA,EAAY;AAAA,UAC3D;AAAA,QACF;AAGA,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,IAAA,EAAM,WAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AAGD,QAAA,IAAI,UAAA,CAAW,UAAU,MAAA,EAAQ;AAC/B,UAAA,MAAM,GAAG,aAAA,CAAc;AAAA,YACrB,UAAA,EAAY,IAAA;AAAA,YACZ,UAAA,EAAY,EAAA;AAAA,YACZ,IAAA,EAAM,EAAE,GAAG,YAAA,EAAc,eAAe,WAAA,EAAY;AAAA,YACpD,MAAA,EAAQ,WAAA;AAAA,YACR,WAAW,OAAA,EAAS,EAAA;AAAA,YACpB,iBAAA,EAAmB,WAAA;AAAA,YACnB,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,GAAG,WAAA,CAAY;AAAA,UACnB,UAAA,EAAY,IAAA;AAAA,UACZ,UAAA,EAAY,EAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,CACG,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA,EAAG;AAAA,YACxC,UAAA,EAAY,IAAA;AAAA,YACZ,SAAA,EAAW,QAAA;AAAA,YACX,IAAA,EAAM,GAAA;AAAA,YACN,IAAA,EAAM,OAAA,GACF,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAC3D,KAAA,CAAA;AAAA,YACJ,QAAA,EAAU;AAAA,WACX,EACA,KAAA,CAAM,CAAC,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,CAAA,EAAgC,GAAG,CAAC,CAAA;AAAA,QACtE;AAEA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,0BAA0B,CAAA;AAAA,MAChE,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,cAAA,CAAA,EAAkB,OAAO,CAAA,KAAM;AACjD,MAAA,IAAI;AACF,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACF,GAAI,MAAM,kBAAA,CAAmB,CAAA,CAAE,IAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE9D,QAAA,MAAM,SAAS,MAAM,qBAAA;AAAA,UACnB,UAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAE3B,QAAA,MAAM,UAAA,GAAa,MAAM,EAAA,CAAG,QAAA,CAA8B;AAAA,UACxD,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,QACpD;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,IAAA;AAAA,UACZ,EAAA;AAAA,UACA,IAAA,EAAM,EAAE,aAAA,EAAe,OAAA,EAAQ;AAAA,UAC/B,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,CACG,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA,EAAG;AAAA,YACxC,UAAA,EAAY,IAAA;AAAA,YACZ,SAAA,EAAW,QAAA;AAAA,YACX,IAAA,EAAM,GAAA;AAAA,YACN,IAAA,EAAM,OAAA,GACF,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAC3D,KAAA,CAAA;AAAA,YACJ,QAAA,EAAU;AAAA,WACX,EACA,KAAA,CAAM,CAAC,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,CAAA,EAAgC,GAAG,CAAC,CAAA;AAAA,QACtE;AAEA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,4BAA4B,CAAA;AAAA,MAClE,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAAA,EACC;AAGF,EAAA,KAAA,MAAW,YAAA,IAAgB,QAAA,CAAS,UAAA,EAAW,EAAG;AAChD,IAAA,MAAM,OAAO,YAAA,CAAa,IAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,gBAAgB,IAAI,CAAA,CAAA;AAGrC,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,QAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,UACnB,YAAA;AAAA,UACA,MAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,cAAA,GAAiB,EAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,KAAM,MAAA,IAAU,CAAC,CAAC,OAAA;AAE5D,QAAA,IAAI,GAAA,GAAM,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA,UACzB,UAAA,EAAY,YAAY,IAAI,CAAA,CAAA;AAAA,UAC5B,OAAO,EAAC;AAAA,UACR,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,MAAM,YAAYnB,MAAAA,CAAO,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACvD,UAAA,IAAI,CAAC,GAAA,EAAK;AACR,YAAA,GAAA,GAAM,MAAM,GAAG,MAAA,CAAO;AAAA,cACpB,UAAA,EAAY,YAAY,IAAI,CAAA,CAAA;AAAA,cAC5B,IAAA,EAAM,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,SAAA,EAAU;AAAA,cACvC,QAAA,EAAU;AAAA,aACX,CAAA;AAAA,UACH,CAAA,MAAA,IAAW,CAAC,GAAA,CAAI,SAAA,EAAW;AACzB,YAAA,MAAM,GAAG,MAAA,CAAO;AAAA,cACd,UAAA,EAAY,YAAY,IAAI,CAAA,CAAA;AAAA,cAC5B,EAAA,EAAI,IAAA;AAAA,cACJ,IAAA,EAAM,EAAE,SAAA,EAAW,SAAA,EAAU;AAAA,cAC7B,QAAA,EAAU;AAAA,aACX,CAAA;AACD,YAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAAA,UAClB;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,IAAO,IAAI,CAAA;AAAA,MACnC,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAW;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,QAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,UACnB,YAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,MAAA,CAAO,MAAA,IAAU,GAAW,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,OAAO,kBAAA,CAAmB,MAAM,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAClD,QAAA,MAAM,UAAU,MAAA,CAAO,WAAA;AAAA,UACrB,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,OAAO,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,IAAU,MAAM,KAAA,CAAS;AAAA,SACvF;AAGA,QAAA,KAAA,MAAW,KAAA,IAAS,aAAa,MAAA,EAAQ;AACvC,UAAA,IAAI,MAAM,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,MAAM,EAAA,EAAI;AAC5C,YAAA,MAAM,SAAA,GAAY,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,KAAS,OAAA;AACpM,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAGA,QAAA,qBAAA,CAAsB,YAAA,CAAa,QAAQ,OAAO,CAAA;AAElD,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAEzC,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI;AACF,UAAA,SAAA,GAAY,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,QAClC,SAAS,MAAA,EAAa;AACpB,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAsB,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,EAAS,MAAA,CAAO,MAAA,IAAU,GAAG,CAAA;AAAA,QAC9G;AAGA,QAAA,MAAM,aAAA,mBAAgB,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,eAAA,EAAiB,UAAA,EAAY,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAC9H,QAAA,MAAM,WAAW,MAAA,CAAO,WAAA;AAAA,UACtB,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC;AAAA,SACjE;AAEA,QAAA,MAAM,cAAA,GAAiB,YAAY,IAAI,CAAA,CAAA;AACvC,QAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA,UACnC,UAAA,EAAY,cAAA;AAAA,UACZ,OAAO,EAAC;AAAA,UACR,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,QAAA,EAAU,MAAA,KAAW,IAAA;AACzD,QAAA,MAAM,kBAAA,GAAqB,aAAa,aAAA,KAAkB,WAAA;AAE1D,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,kBAAkB,kBAAA,EAAoB;AACxC,UAAA,MAAM,GAAG,aAAA,CAAc;AAAA,YACrB,UAAA,EAAY,cAAA;AAAA,YACZ,UAAA,EAAY,IAAA;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,MAAA,EAAQ,OAAA;AAAA,YACR,WAAW,OAAA,EAAS,EAAA;AAAA,YACpB,iBAAA,EAAmB,qBAAA;AAAA,YACnB,QAAA,EAAU;AAAA,WACX,CAAA;AAED,UAAA,GAAA,GAAM,MAAM,GAAG,MAAA,CAAO;AAAA,YACpB,UAAA,EAAY,cAAA;AAAA,YACZ,EAAA,EAAI,IAAA;AAAA,YACJ,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,YACvB,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,MAAM,WAAW,cAAA,GACb,EAAE,GAAG,QAAA,EAAU,eAAe,OAAA,EAAS,QAAA,EAAU,KAAA,EAAM,GACvD,EAAE,GAAG,QAAA,EAAU,aAAA,EAAe,WAAA,EAAa,UAAU,KAAA,EAAM;AAE/D,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,GAAA,GAAM,MAAM,GAAG,MAAA,CAAO;AAAA,cACpB,UAAA,EAAY,cAAA;AAAA,cACZ,EAAA,EAAI,IAAA;AAAA,cACJ,IAAA,EAAM,QAAA;AAAA,cACN,QAAA,EAAU;AAAA,aACX,CAAA;AAAA,UACH,CAAA,MAAO;AACL,YAAA,GAAA,GAAM,MAAM,GAAG,MAAA,CAAO;AAAA,cACpB,UAAA,EAAY,cAAA;AAAA,cACZ,IAAA,EAAM,EAAE,GAAG,QAAA,EAAU,IAAI,IAAA,EAAK;AAAA,cAC9B,QAAA,EAAU;AAAA,aACX,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,MAAM,GAAG,aAAA,CAAc;AAAA,cACrB,UAAA,EAAY,cAAA;AAAA,cACZ,UAAA,EAAY,IAAA;AAAA,cACZ,IAAA,EAAM,QAAA;AAAA,cACN,MAAA,EAAQ,OAAA;AAAA,cACR,WAAW,OAAA,EAAS,EAAA;AAAA,cACpB,iBAAA,EAAmB,aAAA;AAAA,cACnB,QAAA,EAAU;AAAA,aACX,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,UAAA,YAAA,GAAe,IAAA;AACf,UAAA,qBAAA,GAAwB,IAAA;AAAA,QAC1B;AAEA,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,kBAAA,EAAoB,cAAA,CAAe;AAAA,YACjC,MAAA,EAAQ,iBAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,UAAU,IAAI,CAAA,CAAA;AAAA,YACxB,UAAA,EAAY,IAAA;AAAA,YACZ,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,wBAAwB,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,CAAA,SAAA,CAAA,EAAa,KAAK,CAAA;AAC1D,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,MAAM,OAAA,IAAW,aAAA;AAAA,UACxB,OAAO,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,GAAgB,MAAM,KAAA,GAAQ;AAAA,WAC7D,GAAG,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK,UAAU,YAAY,CAAA;AAC/B,IAAA,GAAA,CAAI,KAAA,CAAM,UAAU,YAAY,CAAA;AAGhC,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,QAAA,CAAA,EAAY,OAAO,CAAA,KAAM;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,QAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,YAAA,EAAc,QAAA,EAAU,EAAE,GAAA,CAAI,GAAA,EAAK,OAAA,EAAS,WAAA,EAAa,kBAAkB,CAAA;AAClH,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,EAAG,GAAG,CAAA;AAE/D,QAAA,MAAM,cAAA,GAAiB,YAAY,IAAI,CAAA,CAAA;AACvC,QAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA,UACnC,UAAA,EAAY,cAAA;AAAA,UACZ,OAAO,EAAC;AAAA,UACR,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,CAAC,aAAa,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,kBAAA,EAAmB,EAAG,GAAG,CAAA;AAElE,QAAA,IAAI,WAAA,GAAc,EAAE,aAAA,EAAe,WAAA,EAAa,UAAU,KAAA,EAAM;AAChE,QAAA,IAAI,YAAA,GAAe,WAAA;AAEnB,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,YAAA,CAAa;AAAA,YACrC,UAAA,EAAY,cAAA;AAAA,YACZ,UAAA,EAAY,IAAA;AAAA,YACZ,KAAA,EAAO,CAAA;AAAA,YACP,IAAA,EAAM,YAAA;AAAA,YACN,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,IAAI,QAAA,CAAS,KAAK,MAAA,GAAS,CAAA,IAAK,SAAS,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,KAAW,OAAA,EAAS;AACnE,YAAA,YAAA,GAAe,EAAE,GAAG,WAAA,EAAa,GAAG,SAAS,IAAA,CAAK,CAAC,EAAE,IAAA,EAAK;AAC1D,YAAA,WAAA,GAAc,EAAE,GAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAM,GAAG,WAAA,EAAY;AAAA,UAC3D;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,cAAA;AAAA,UACZ,EAAA,EAAI,IAAA;AAAA,UACJ,IAAA,EAAM,WAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,YAAA,CAAa,UAAU,MAAA,EAAQ;AACjC,UAAA,MAAM,GAAG,aAAA,CAAc;AAAA,YACrB,UAAA,EAAY,cAAA;AAAA,YACZ,UAAA,EAAY,IAAA;AAAA,YACZ,IAAA,EAAM,EAAE,GAAG,YAAA,EAAc,eAAe,WAAA,EAAY;AAAA,YACpD,MAAA,EAAQ,WAAA;AAAA,YACR,WAAW,OAAA,EAAS,EAAA;AAAA,YACpB,iBAAA,EAAmB,WAAA;AAAA,YACnB,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,0BAA0B,CAAA;AAAA,MAChE,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc,OAAO,CAAA,KAAM;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,QAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,YAAA,EAAc,QAAA,EAAU,EAAE,GAAA,CAAI,GAAA,EAAK,OAAA,EAAS,WAAA,EAAa,kBAAkB,CAAA;AAClH,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,EAAG,GAAG,CAAA;AAE/D,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,YAAY,IAAI,CAAA,CAAA;AAAA,UAC5B,EAAA,EAAI,IAAA;AAAA,UACJ,IAAA,EAAM,EAAE,aAAA,EAAe,OAAA,EAAS,UAAU,KAAA,EAAM;AAAA,UAChD,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,4BAA4B,CAAA;AAAA,MAClE,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,SAAA,CAAA,EAAa,OAAO,CAAA,KAAM;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,QAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,YAAA,EAAc,MAAA,EAAQ,EAAE,GAAA,CAAI,GAAA,EAAK,OAAA,EAAS,WAAA,EAAa,kBAAkB,CAAA;AAChH,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,EAAG,GAAG,CAAA;AAE/D,QAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,IAAI,CAAA;AACnD,QAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAEhD,QAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,YAAA,CAAa;AAAA,UACrC,UAAA,EAAY,YAAY,IAAI,CAAA,CAAA;AAAA,UAC5B,UAAA,EAAY,IAAA;AAAA,UACZ,KAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAO,CAAA,CAAE,KAAK,QAAQ,CAAA;AAAA,MACxB,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,oBAAA,CAAA,EAAwB,OAAO,CAAA,KAAM;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,QAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,YAAA,EAAc,MAAA,EAAQ,EAAE,GAAA,CAAI,GAAA,EAAK,OAAA,EAAS,WAAA,EAAa,kBAAkB,CAAA;AAChH,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,EAAG,GAAG,CAAA;AAE/D,QAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,eAAA,CAAgB;AAAA,UACvC,UAAA,EAAY,YAAY,IAAI,CAAA,CAAA;AAAA,UAC5B,SAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAC/D,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,MACjC,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,4BAAA,CAAA,EAAgC,OAAO,CAAA,KAAM;AAC/D,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,QAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,YAAA,EAAc,QAAA,EAAU,EAAE,GAAA,CAAI,GAAA,EAAK,OAAA,EAAS,WAAA,EAAa,kBAAkB,CAAA;AAClH,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,EAAG,GAAG,CAAA;AAE/D,QAAA,MAAM,cAAA,GAAiB,YAAY,IAAI,CAAA,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,eAAA,CAAgB;AAAA,UACvC,UAAA,EAAY,cAAA;AAAA,UACZ,SAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,CAAA;AAE/D,QAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,UAC1B,UAAA,EAAY,cAAA;AAAA,UACZ,EAAA,EAAI,IAAA;AAAA,UACJ,IAAA,EAAM,EAAE,GAAG,OAAA,CAAQ,MAAM,aAAA,EAAe,OAAA,EAAS,UAAU,KAAA,EAAM;AAAA,UACjE,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,yBAAyB,CAAA;AAAA,MAC/D,SAAS,KAAA,EAAY;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA,EAAS,OAAO,CAAA,KAAM;AACxC,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAC3C,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE5D,UAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,YACnB,YAAA;AAAA,YACA,QAAA;AAAA,YACA,EAAE,GAAA,CAAI,GAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,OAAO,CAAA,CAAE,IAAA;AAAA,cACP,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM;AAAA,cACrB,OAAO,MAAA,IAAU;AAAA,aACpB;AAAA,UACF;AAEA,UAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAI9B,UAAA,MAAM,eAAA,GAAuB;AAAA,YAC3B,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,IAAA,EAAM,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,IAAA;AAAA,YAC7B,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,IAAA,EAAM,KAAK,IAAA,GACP;AAAA,cACA,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,cAChB,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,cAChB,MAAA,EAAQ,KAAK,IAAA,CAAK,MAAA;AAAA,cAClB,IAAA,EAAM;AAAA,gBACJ,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,KAAK,IAAA,CAAK,IAAA;AAAA,gBACtC,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,KAAK,IAAA,CAAK;AAAA;AACxC,aACF,GACE,KAAA,CAAA;AAAA,YACJ,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,KAAK,IAAA,CAAK;AAAA,WACZ;AAEA,UAAA,MAAM,SAAA,GAAY,IAAI,cAAA,CAAe,eAAe,CAAA;AAIpD,UAAA,MAAM,YACJ,IAAA,CAAK,SAAA,IACJ,IAAA,CAAK,gBAAA,IAAoB,KAAK,gBAAA,CAAiB,SAAA;AAElD,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kCAAA,IAAsC,GAAG,CAAA;AAAA,UAClE;AAEA,UAAA,MAAM,UAAU,IAAA,CAAK;AAAA,YACnB,EAAA,EAAI,SAAA;AAAA,YACJ,OAAA,EAAS,uBAAA;AAAA,YACT,IAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAAA,EAQuB,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa;AAAA;AAAA;AAAA,oCAAA,EAAA,iBAG5B,IAAI,IAAA,EAAK,EAAE,cAAA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,YAQvD,IAAA,EAAM,CAAA;;AAAA,UAAA,EAAgF,KAAK,QAAQ;AAAA,SAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,cAAA,EAAgB,CAAA;AAAA,WAC7I,CAAA;AAED,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,iCAAiC,CAAA;AAAA,QAC5D,SAAS,KAAA,EAAY;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,UAAA,OAAO,CAAA,CAAE,IAAA;AAAA,YACP,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,2BAAA,EAA4B;AAAA,YACtD;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACP;AAMO,SAAS,aAAA,CACd,QAAA,EACA,EAAA,EACA,OAAA,EAWM;AACN,EAAA,OAAO,aAAA,CAAc;AAAA,IACnB,QAAA;AAAA,IACA,EAAA;AAAA,IACA,YAAY,OAAA,EAAS,UAAA;AAAA,IACrB,MAAM,OAAA,EAAS,IAAA;AAAA,IACf,KAAK,OAAA,EAAS,GAAA;AAAA,IACd,UAAU,OAAA,EAAS,QAAA;AAAA,IACnB,MAAM,OAAA,EAAS,IAAA;AAAA,IACf,gBAAgB,OAAA,EAAS;AAAA,GAC1B,CAAA;AACH","file":"chunk-PU2Z5VWF.js","sourcesContent":["// ============================================================================\n// Secret Management Utility\n// Reads secrets from DB (system global) with env fallback\n// ============================================================================\n\nimport crypto from 'crypto';\n\nlet dbAdapter: any = null;\nlet cachedSecrets: {\n appSecret: string | null;\n encryptionKey: string | null;\n sessionConfig: {\n maxAge: number;\n maxSessionsPerUser: number;\n } | null;\n} | null = null;\n\nexport function setDbAdapter(adapter: any) {\n dbAdapter = adapter;\n}\n\nfunction generateEncryptionKey(): string {\n return crypto.randomBytes(32).toString('hex');\n}\n\nexport async function loadSecrets(): Promise<void> {\n // Try to load from DB first\n if (dbAdapter) {\n try {\n const result = await dbAdapter.findOne({\n collection: '_globals',\n where: { slug: 'system' },\n });\n\n if (result) {\n cachedSecrets = {\n appSecret: result.appSecret || null,\n encryptionKey: result.encryptionKey || null,\n sessionConfig: result.sessionMaxAge || result.maxSessionsPerUser\n ? {\n maxAge: (result.sessionMaxAge || 7) * 24 * 60 * 60 * 1000,\n maxSessionsPerUser: result.maxSessionsPerUser || 3,\n }\n : null,\n };\n console.log('🔐 Loaded secrets from database');\n return;\n }\n } catch (e) {\n console.log('⚠️ Could not load system settings from DB, using env fallback');\n }\n }\n\n // Fall back to environment\n cachedSecrets = {\n appSecret: process.env.APP_SECRET || 'development-secret-key',\n encryptionKey: null, // Will be generated\n sessionConfig: null, // Will use defaults\n };\n}\n\nexport function getAppSecret(): string {\n if (cachedSecrets?.appSecret) {\n return cachedSecrets.appSecret;\n }\n return process.env.APP_SECRET || 'development-secret-key';\n}\n\nexport function getEncryptionKey(): string {\n if (cachedSecrets?.encryptionKey) {\n return cachedSecrets.encryptionKey;\n }\n // Derive from app secret if not in DB\n const secret = getAppSecret();\n return crypto.createHash('sha256').update(secret).digest('hex');\n}\n\nexport function getSessionConfig() {\n if (cachedSecrets?.sessionConfig) {\n return cachedSecrets.sessionConfig;\n }\n // Return defaults\n return {\n maxAge: 7 * 24 * 60 * 60 * 1000,\n maxSessionsPerUser: 3,\n };\n}\n\nexport function getDerivedEncryptionKey(secret?: string): string {\n const appSecret = secret || getAppSecret();\n return crypto.createHash('sha256').update(appSecret).digest('hex');\n}","import crypto from \"crypto\";\nimport { getSessionConfig } from \"../../lib/secret.js\";\nimport { createStorage } from \"unstorage\";\nimport fsDriver from \"unstorage/drivers/fs\";\n\n// Get session config from DB or defaults\nconst sessionConfig = getSessionConfig();\n\nexport const SESSION_CONFIG = {\n absoluteMaxAge: sessionConfig.maxAge,\n maxSessionsPerUser: sessionConfig.maxSessionsPerUser,\n refreshThreshold: 5 * 60 * 1000,\n activityDebounce: 30 * 1000,\n pollInterval: 30 * 1000,\n};\n\nconst SESSION_COOKIE_NAME = \"kyro-session\";\n\nexport interface SessionData {\n id: string;\n userId: string;\n email: string;\n role: string;\n tenantId?: string;\n permissions?: string[];\n createdAt: number;\n expiresAt: number;\n lastActivityAt: number;\n deviceInfo?: {\n userAgent?: string;\n ip?: string;\n platform?: string;\n browser?: string;\n device?: string;\n };\n sessionName?: string;\n}\n\nexport interface UserSessionInfo {\n id: string;\n sessionName: string;\n deviceInfo?: {\n userAgent?: string;\n ip?: string;\n platform?: string;\n browser?: string;\n device?: string;\n };\n createdAt: number;\n lastActivityAt: number;\n currentSession: boolean;\n}\n\nlet storage: any = null;\n\nasync function getStorage() {\n if (storage) return storage;\n\n storage = createStorage({\n driver: fsDriver({ base: \".astro/sessions\" }),\n });\n\n return storage;\n}\n\nfunction generateSessionId(): string {\n return crypto.randomUUID();\n}\n\nfunction parseUserAgent(userAgent: string): {\n browser: string;\n device: string;\n platform: string;\n} {\n let browser = \"Unknown\";\n let device = \"Unknown\";\n let platform = \"Unknown\";\n\n if (userAgent.includes(\"Firefox\")) {\n browser = \"Firefox\";\n } else if (userAgent.includes(\"Edg/\")) {\n browser = \"Edge\";\n } else if (userAgent.includes(\"Chrome\")) {\n browser = \"Chrome\";\n } else if (userAgent.includes(\"Safari\") && !userAgent.includes(\"Chrome\")) {\n browser = \"Safari\";\n }\n\n if (userAgent.includes(\"iPhone\")) {\n device = \"iPhone\";\n platform = \"iOS\";\n } else if (userAgent.includes(\"iPad\")) {\n device = \"iPad\";\n platform = \"iOS\";\n } else if (userAgent.includes(\"Mac\")) {\n device = \"MacBook\";\n platform = \"macOS\";\n } else if (userAgent.includes(\"Windows\")) {\n device = \"Windows PC\";\n platform = \"Windows\";\n } else if (userAgent.includes(\"Linux\")) {\n device = \"Linux PC\";\n platform = \"Linux\";\n } else if (userAgent.includes(\"Android\")) {\n device = \"Android Phone\";\n platform = \"Android\";\n }\n\n return { browser, device, platform };\n}\n\nfunction generateSessionName(deviceInfo?: SessionData[\"deviceInfo\"]): string {\n if (!deviceInfo?.userAgent) {\n return \"Session\";\n }\n\n const { browser, device } = parseUserAgent(deviceInfo.userAgent);\n return `${device} - ${browser}`;\n}\n\nexport function getSessionIdFromRequest(request: Request): string | null {\n const cookieHeader = request.headers.get(\"Cookie\");\n if (!cookieHeader) return null;\n\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => c.split(\"=\")),\n );\n\n return cookies[SESSION_COOKIE_NAME] || null;\n}\n\nexport function getClientIp(request: Request): string {\n const forwarded = request.headers.get(\"x-forwarded-for\");\n if (forwarded) {\n return forwarded.split(\",\")[0].trim();\n }\n return request.headers.get(\"x-real-ip\") || \"unknown\";\n}\n\nexport function setSessionCookie(\n response: Response,\n sessionId: string,\n): Response {\n const headers = new Headers(response.headers);\n headers.append(\n \"Set-Cookie\",\n `${SESSION_COOKIE_NAME}=${sessionId}; HttpOnly; Path=/; Max-Age=${SESSION_CONFIG.absoluteMaxAge / 1000}; SameSite=Strict`,\n );\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function clearSessionCookie(response: Response): Response {\n const headers = new Headers(response.headers);\n headers.append(\n \"Set-Cookie\",\n `${SESSION_COOKIE_NAME}=; HttpOnly; Path=/; Max-Age=0; SameSite=Strict`,\n );\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nasync function getUserSessionList(userId: string): Promise<string[]> {\n const store = await getStorage();\n const sessions = await store.getItem(`user:${userId}`);\n return sessions || [];\n}\n\nasync function setUserSessionList(\n userId: string,\n sessionIds: string[],\n): Promise<void> {\n const store = await getStorage();\n if (sessionIds.length > 0) {\n await store.setItem(`user:${userId}`, sessionIds);\n } else {\n await store.removeItem(`user:${userId}`);\n }\n}\n\nexport async function createSession(\n user: {\n id: string;\n email: string;\n role: string;\n tenantId?: string;\n permissions?: string[];\n },\n request?: Request,\n): Promise<string> {\n const store = await getStorage();\n\n // Get existing sessions for user\n const existingSessions = await getUserSessionList(user.id);\n\n // Enforce max sessions - remove oldest if at limit\n while (existingSessions.length >= SESSION_CONFIG.maxSessionsPerUser) {\n const oldestSessionId = existingSessions.shift();\n if (oldestSessionId) {\n await store.removeItem(`session:${oldestSessionId}`);\n }\n }\n\n const sessionId = generateSessionId();\n const now = Date.now();\n\n const userAgent = request?.headers.get(\"user-agent\");\n const clientIp = request ? getClientIp(request) : \"unknown\";\n\n const deviceInfo = userAgent\n ? {\n userAgent,\n ip: clientIp,\n ...parseUserAgent(userAgent),\n }\n : { ip: clientIp };\n\n const sessionData: SessionData = {\n id: sessionId,\n userId: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n permissions: user.permissions,\n createdAt: now,\n expiresAt: now + SESSION_CONFIG.absoluteMaxAge,\n lastActivityAt: now,\n deviceInfo,\n sessionName: generateSessionName(deviceInfo),\n };\n\n await store.setItem(\n `session:${sessionId}`,\n sessionData,\n { ttl: Math.floor(SESSION_CONFIG.absoluteMaxAge / 1000) },\n );\n\n // Add to user's session list\n existingSessions.push(sessionId);\n await setUserSessionList(user.id, existingSessions);\n\n return sessionId;\n}\n\nexport async function getSession(\n sessionId: string,\n): Promise<SessionData | null> {\n const store = await getStorage();\n const session = await store.getItem(`session:${sessionId}`);\n return session || null;\n}\n\nexport async function validateSession(\n sessionId: string,\n): Promise<{ valid: boolean; reason?: string }> {\n const session = await getSession(sessionId);\n\n if (!session) {\n return { valid: false, reason: \"Session not found\" };\n }\n\n // Check absolute expiration\n if (session.expiresAt < Date.now()) {\n await deleteSession(sessionId);\n return { valid: false, reason: \"Session expired\" };\n }\n\n return { valid: true };\n}\n\nexport async function refreshSession(\n sessionId: string,\n request?: Request,\n): Promise<SessionData | null> {\n const store = await getStorage();\n const session = await getSession(sessionId);\n\n if (!session) return null;\n\n // Update last activity and extend TTL if needed\n const now = Date.now();\n const timeRemaining = session.expiresAt - now;\n\n // Update device info if IP changed\n let deviceInfo = session.deviceInfo;\n if (request) {\n const newIp = getClientIp(request);\n if (newIp !== session.deviceInfo?.ip) {\n deviceInfo = { ...session.deviceInfo, ip: newIp };\n }\n }\n\n const updatedSession: SessionData = {\n ...session,\n lastActivityAt: now,\n expiresAt:\n timeRemaining < SESSION_CONFIG.refreshThreshold\n ? now + SESSION_CONFIG.absoluteMaxAge\n : session.expiresAt,\n deviceInfo,\n };\n\n const ttl =\n timeRemaining < SESSION_CONFIG.refreshThreshold\n ? SESSION_CONFIG.absoluteMaxAge\n : undefined;\n\n await store.setItem(\n `session:${sessionId}`,\n updatedSession,\n ttl ? { ttl: Math.floor(ttl / 1000) } : undefined,\n );\n\n return updatedSession;\n}\n\nexport async function trackActivity(sessionId: string): Promise<void> {\n const session = await getSession(sessionId);\n if (!session) return;\n\n const store = await getStorage();\n await store.setItem(`activity:${sessionId}`, Date.now());\n}\n\nexport async function deleteSession(sessionId: string): Promise<void> {\n const store = await getStorage();\n const session = await getSession(sessionId);\n\n if (session) {\n // Remove from user's session list\n const sessions = await getUserSessionList(session.userId);\n const updatedSessions = sessions.filter((id) => id !== sessionId);\n await setUserSessionList(session.userId, updatedSessions);\n }\n\n await store.removeItem(`session:${sessionId}`);\n await store.removeItem(`activity:${sessionId}`);\n}\n\nexport async function invalidateAllUserSessions(userId: string): Promise<void> {\n const sessions = await getUserSessionList(userId);\n const store = await getStorage();\n\n for (const sessionId of sessions) {\n await store.removeItem(`session:${sessionId}`);\n await store.removeItem(`activity:${sessionId}`);\n }\n\n await setUserSessionList(userId, []);\n}\n\nexport async function getUserSessions(\n userId: string,\n currentSessionId?: string,\n): Promise<UserSessionInfo[]> {\n const sessionIds = await getUserSessionList(userId);\n const sessions: UserSessionInfo[] = [];\n\n for (const sessionId of sessionIds) {\n const session = await getSession(sessionId);\n if (session) {\n sessions.push({\n id: session.id,\n sessionName: session.sessionName || \"Session\",\n deviceInfo: session.deviceInfo,\n createdAt: session.createdAt,\n lastActivityAt: session.lastActivityAt,\n currentSession: session.id === currentSessionId,\n });\n }\n }\n\n // Sort by last activity (most recent first)\n sessions.sort((a, b) => b.lastActivityAt - a.lastActivityAt);\n\n return sessions;\n}\n\nexport async function updateSessionName(\n sessionId: string,\n name: string,\n): Promise<boolean> {\n const session = await getSession(sessionId);\n if (!session) return false;\n\n const store = await getStorage();\n await store.setItem(`session:${sessionId}`, { ...session, sessionName: name });\n\n return true;\n}\n\nexport async function getCurrentUser(\n request: Request,\n): Promise<SessionData | null> {\n const sessionId = getSessionIdFromRequest(request);\n if (!sessionId) return null;\n\n const validation = await validateSession(sessionId);\n if (!validation.valid) return null;\n\n const session = await getSession(sessionId);\n if (!session) return null;\n\n // Update activity on each request\n await refreshSession(sessionId, request);\n\n return session;\n}\n\n\n","import type { AuthUser, JWTPayload } from \"../../auth/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\nimport type { BaseAdapter } from \"../../registry/types.js\";\nimport {\n validateApiKey,\n extractApiKeyFromRequest,\n createApiKeyContext,\n hasApiKeyPermission,\n} from \"../../auth/api-key.js\";\nimport { \n getCurrentUser, \n getSessionIdFromRequest, \n validateSession,\n SESSION_CONFIG \n} from \"./auth-session.js\";\n\nexport interface AuthMiddlewareConfig {\n secret: string;\n issuer?: string;\n audience?: string;\n db?: BaseAdapter;\n userLookup?: (userId: string) => Promise<Partial<AuthUser> | null>;\n checkSession?: (userId: string, token: string, req?: Request, payload?: JWTPayload) => Promise<boolean>;\n}\n\nexport interface AuthenticatedContext {\n user?: AuthUser;\n token?: string;\n tenantContext?: TenantContext;\n apiKeyContext?: ReturnType<typeof createApiKeyContext>;\n}\n\nexport interface AuthMiddlewareResult {\n user?: Partial<AuthUser>;\n token?: string;\n tenantContext?: TenantContext;\n apiKeyContext?: ReturnType<typeof createApiKeyContext>;\n error?: string;\n status: number;\n authType?: \"session\" | \"apikey\";\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n db,\n userLookup,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\n // Check API Key first (keep for headless CMS)\n const apiKeyRaw = extractApiKeyFromRequest(req);\n\n if (apiKeyRaw && db) {\n const result = await validateApiKey(apiKeyRaw, db, userLookup);\n if (result.valid && result.user) {\n return {\n user: result.user,\n tenantContext: createTenantContextFromUser(result.user),\n apiKeyContext: createApiKeyContext(result),\n status: 200,\n authType: \"apikey\",\n };\n }\n if (result.error) {\n return {\n status: 401,\n error: result.error,\n };\n }\n }\n\n // Check session (Astro sessions with Keyv)\n const sessionId = getSessionIdFromRequest(req);\n if (sessionId) {\n try {\n // Validate session\n const validation = await validateSession(sessionId);\n \n if (!validation.valid) {\n return {\n status: 401,\n error: validation.reason || \"Session invalid\",\n };\n }\n \n const session = await getCurrentUser(req);\n if (session) {\n // Get user from database using session userId\n const user = userLookup \n ? await userLookup(session.userId)\n : null;\n \n if (user) {\n return {\n user: user as AuthUser,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n authType: \"session\",\n };\n }\n }\n } catch (e) {\n console.error(\"Session validation error:\", e);\n }\n }\n\n // No valid authentication found\n return {\n status: 401,\n error: \"Authentication required\",\n };\n };\n}\n\nexport { hasApiKeyPermission };\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 decodeToken(token: string): JWTPayload | null {\n try {\n const jwt = require(\"jsonwebtoken\");\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\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","export 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_update\"\n | \"api_key_rotate\"\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","import type {\n AuditAction,\n AuditLog,\n AuditLogFilter,\n AuditRetentionConfig,\n} from \"./audit-log-types.js\";\nimport type { Redis } from \"ioredis\";\nimport { randomBytes } from \"crypto\";\n\nexport {\n type AuditAction,\n type AuditLog,\n type AuditLogFilter,\n type AuditRetentionConfig,\n DEFAULT_RETENTION_CONFIG,\n} from \"./audit-log-types.js\";\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: new Date(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 { 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\nimport { createAuditContext } from \"./context.js\";\nexport { createAuditContext };\n","import { 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 {\n createSession,\n deleteSession,\n getCurrentUser,\n setSessionCookie,\n clearSessionCookie,\n getSessionIdFromRequest,\n refreshSession,\n getUserSessions,\n updateSessionName,\n invalidateAllUserSessions,\n} from \"./auth-session.js\";\nimport type {\n AuthUser,\n LoginCredentials,\n RegisterData,\n} from \"../../auth/types.js\";\n\nexport interface AuthRoutesConfig {\n redis: AuthAdapter;\n jwtSecret?: string;\n jwtExpiresIn?: string;\n jwtIssuer?: string;\n jwtAudience?: string;\n email?: EmailTransport;\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 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.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 console.error(\"[AuthRoutes.register] Registration error:\", 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\nif (!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 (user.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. Contact an administrator.\",\n 403,\n );\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 verifiedUser = await this.authAdapter.verifyPassword(\n body.email,\n body.password,\n );\n if (!verifiedUser) {\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 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 const sessionId = await createSession({\n id: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n });\n\n const responseData = {\n success: true,\n user: this.sanitizeUser(user),\n };\n\n const response = this.jsonResponse(responseData);\n return setSessionCookie(response, sessionId);\n } catch (error) {\n console.error(\"[Auth] Login error:\", error);\n return this.errorResponse(\"Login failed\", 500);\n }\n }\n\n async logout(req: Request): Promise<Response> {\n const sessionId = getSessionIdFromRequest(req);\n if (!sessionId) {\n return this.errorResponse(\"No session to logout\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const session = await getCurrentUser(req);\n if (session) {\n await deleteSession(sessionId);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"logout\",\n userId: session.userId,\n userEmail: session.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n }\n\n const response = this.jsonResponse({\n success: true,\n message: \"Logged out successfully\",\n });\n\n return clearSessionCookie(response);\n } catch (error) {\n return this.errorResponse(\"Logout failed\", 500);\n }\n }\n\n async refresh(req: Request): Promise<Response> {\n try {\n const sessionId = getSessionIdFromRequest(req);\n if (!sessionId) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const updatedSession = await refreshSession(sessionId, req);\n if (!updatedSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n return this.jsonResponse({\n success: true,\n expiresAt: updatedSession.expiresAt,\n });\n } catch (error) {\n console.error(\"[Auth] Session refresh error:\", error);\n return this.errorResponse(\"Session refresh failed\", 500);\n }\n }\n\n async me(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n return this.jsonResponse({\n success: true,\n user: {\n id: session.userId,\n email: session.email,\n role: session.role,\n tenantId: session.tenantId,\n },\n });\n }\n\n\n\n async changePassword(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\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(session.userId);\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\",\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 async listSessions(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const sessions = await getUserSessions(session.userId, getSessionIdFromRequest(req) ?? undefined);\n return this.jsonResponse({ sessions });\n } catch (error) {\n console.error(\"[AuthRoutes.listSessions] Error:\", error);\n return this.errorResponse(\"Failed to list sessions\", 500);\n }\n }\n\n async revokeSession(req: Request, sessionId: string): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const allSessions = await getUserSessions(session.userId);\n const targetSession = allSessions.find(s => s.id === sessionId);\n \n if (!targetSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n if (targetSession.currentSession) {\n return this.errorResponse(\"Cannot revoke current session\", 400);\n }\n\n await deleteSession(sessionId);\n \n return this.jsonResponse({ \n success: true, \n message: \"Session revoked\" \n });\n } catch (error) {\n console.error(\"[AuthRoutes.revokeSession] Error:\", error);\n return this.errorResponse(\"Failed to revoke session\", 500);\n }\n }\n\n async revokeOtherSessions(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const allSessions = await getUserSessions(session.userId);\n const currentSessionId = getSessionIdFromRequest(req);\n \n for (const s of allSessions) {\n if (!s.currentSession) {\n await deleteSession(s.id);\n }\n }\n \n return this.jsonResponse({ \n success: true, \n message: \"Other sessions revoked\" \n });\n } catch (error) {\n console.error(\"[AuthRoutes.revokeOtherSessions] Error:\", error);\n return this.errorResponse(\"Failed to revoke sessions\", 500);\n }\n }\n\n async renameSession(req: Request, sessionId: string): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const allSessions = await getUserSessions(session.userId);\n const targetSession = allSessions.find(s => s.id === sessionId);\n \n if (!targetSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n const body = await req.json() as any;\n const { name } = body;\n \n if (!name || typeof name !== 'string' || name.trim().length === 0) {\n return this.errorResponse(\"Invalid session name\", 400);\n }\n\n await updateSessionName(sessionId, name.trim());\n \n return this.jsonResponse({ \n success: true, \n message: \"Session renamed\" \n });\n } catch (error) {\n console.error(\"[AuthRoutes.renameSession] Error:\", error);\n return this.errorResponse(\"Failed to rename session\", 500);\n }\n }\n\n async refreshSession(req: Request): Promise<Response> {\n const sessionId = getSessionIdFromRequest(req);\n if (!sessionId) {\n return this.errorResponse(\"No session\", 401);\n }\n\n try {\n const updatedSession = await require('./auth-session.js').refreshSession(sessionId, req);\n if (!updatedSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n return this.jsonResponse({ \n success: true, \n expiresAt: updatedSession.expiresAt \n });\n } catch (error) {\n console.error(\"[AuthRoutes.refreshSession] Error:\", error);\n return this.errorResponse(\"Failed to refresh session\", 500);\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 async rateLimitResponse(limit: { retryAfter?: number }): Promise<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 { writeFile, mkdir, unlink, readdir, stat, rename } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join, extname, basename } from \"path\";\nimport process from \"process\";\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 = join(process.cwd(), \"public\", \"uploads\"), 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 \".avif\": \"image/avif\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".avi\": \"video/x-msvideo\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\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 \".tar\": \"application/x-tar\",\n \".gz\": \"application/gzip\",\n \".rar\": \"application/vnd.rar\",\n \".7z\": \"application/x-7z-compressed\",\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 async createFolder(folder: string): Promise<void> {\n const dir = join(uploadDir, folder);\n await mkdir(dir, { recursive: true });\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const dir = join(uploadDir, folder);\n if (existsSync(dir)) {\n const { rm } = await import(\"fs/promises\");\n await rm(dir, { recursive: true, force: true });\n }\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 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 async createFolder(): Promise<void> {},\n async deleteFolder(): Promise<void> {},\n };\n}\n","import type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface BunnyStorageConfig {\n storageZone: string;\n apiKey: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nfunction getUrl(key: string, config: BunnyStorageConfig): string {\n if (config.cdnUrl) {\n return `${config.cdnUrl.replace(/\\/$/, \"\")}/${key}`;\n }\n return `https://${config.storageZone}.b-cdn.net/${key}`;\n}\n\nfunction getUrlPrefix(config: BunnyStorageConfig): string {\n if (config.cdnUrl) {\n return config.cdnUrl.replace(/\\/$/, \"\") + \"/\";\n }\n return `https://${config.storageZone}.b-cdn.net/`;\n}\n\nexport function createBunnyStorage(\n config: BunnyStorageConfig,\n): StorageProvider {\n const baseUrl = `https://storage.bunnycdn.com/${config.storageZone}`;\n\n const getKey = (path: string) => {\n const prefix = config.prefix ? `${config.prefix}/` : \"\";\n return `${prefix}${path}`.replace(/\\/+/g, \"/\");\n };\n\n return {\n name: \"bunny\",\n displayName: \"Bunny.net Storage\",\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 const response = await fetch(`${baseUrl}/${key}`, {\n method: \"PUT\",\n headers: {\n AccessKey: config.apiKey,\n \"Content-Type\": file.type,\n },\n body: buffer,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Bunny.net upload failed: ${response.status} ${errorText}`,\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, config),\n thumbnailUrl: file.type.startsWith(\"image/\")\n ? getUrl(key, config)\n : undefined,\n folder: options?.folder,\n provider: \"bunny\",\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 key = url.replace(getUrlPrefix(config), \"\");\n\n const response = await fetch(`${baseUrl}/${key}`, {\n method: \"DELETE\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n if (!response.ok && response.status !== 404) {\n const errorText = await response.text();\n throw new Error(\n `Bunny.net delete failed: ${response.status} ${errorText}`,\n );\n }\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n const oldKey = oldUrl.replace(getUrlPrefix(config), \"\");\n const fullPath = config.prefix ? `${config.prefix}/${newKey}` : newKey;\n\n const response = await fetch(`${baseUrl}/${oldKey}`, {\n method: \"GET\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Bunny.net rename failed: could not read old file`);\n }\n\n const content = await response.arrayBuffer();\n\n await fetch(`${baseUrl}/${fullPath}`, {\n method: \"PUT\",\n headers: {\n AccessKey: config.apiKey,\n \"Content-Type\":\n response.headers.get(\"Content-Type\") || \"application/octet-stream\",\n },\n body: content,\n });\n\n await this.delete(oldUrl);\n\n return getUrl(fullPath, config);\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\n const response = await fetch(`${baseUrl}/${key}`, {\n method: \"GET\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Bunny.net list failed: ${response.status} ${errorText}`,\n );\n }\n\n const items = (await response.json()) as Array<{\n ObjectName?: string;\n Length?: number;\n LastChanged?: string;\n }>;\n\n return items.map((item) => ({\n id: Buffer.from(item.ObjectName || \"\").toString(\"base64url\"),\n filename: item.ObjectName?.split(\"/\").pop() || \"\",\n originalName: item.ObjectName?.split(\"/\").pop() || \"\",\n mimeType: \"application/octet-stream\",\n size: item.Length || 0,\n url: getUrl(item.ObjectName || \"\", config),\n provider: \"bunny\",\n createdAt: item.LastChanged || new Date().toISOString(),\n }));\n },\n\n async exists(url: string): Promise<boolean> {\n const key = url.replace(getUrlPrefix(config), \"\");\n\n const response = await fetch(`${baseUrl}/${key}`, {\n method: \"HEAD\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n return response.ok;\n },\n\n async createFolder(folder: string): Promise<void> {\n const key = getKey(`${folder}/`);\n await fetch(`${baseUrl}/${key}`, {\n method: \"PUT\",\n headers: {\n AccessKey: config.apiKey,\n \"Content-Length\": \"0\",\n },\n body: \"\",\n });\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const key = getKey(`${folder}/`);\n await fetch(`${baseUrl}/${key}`, {\n method: \"DELETE\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n },\n };\n}\n","import type { Field } from \"../fields/types.js\";\nimport type { StorageProvider } from \"./index.js\";\nimport type { StorageConfig } from \"../config/ConfigService.js\";\nimport { createLocalStorage } from \"./local.js\";\nimport { createImgixStorage } from \"./imgix.js\";\nimport { createBunnyStorage } from \"./bunny.js\";\nimport path from \"path\";\n\nexport interface StorageProviderRegistration {\n type: string;\n displayName: string;\n pluginName?: string;\n configFields: Field[];\n configKey?: string;\n extractConfig: (storageConfig: StorageConfig, configKey: string) => any;\n extractRawConfig: (config: any) => any;\n factory: (config: any) => StorageProvider;\n}\n\nexport class StorageProviderRegistry {\n private providers = new Map<string, StorageProviderRegistration>();\n private providerToPlugin = new Map<string, string>();\n private disabledPlugins = new Set<string>();\n\n constructor() {\n this.registerLocal();\n this.registerImgix();\n this.registerBunny();\n }\n\n private registerLocal(): void {\n this.register({\n type: \"local\",\n displayName: \"Local Server\",\n configKey: \"local\",\n configFields: [\n {\n name: \"uploadDir\",\n type: \"text\",\n label: \"Upload Directory\",\n defaultValue: \"./public/uploads\",\n },\n {\n name: \"baseUrl\",\n type: \"text\",\n label: \"Base URL\",\n defaultValue: \"/uploads\",\n },\n ],\n extractConfig: (sc, key) => (sc as any)[key] || {},\n extractRawConfig: (c) => {\n const localConfig = c?.local || c;\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 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 return { uploadDir, baseUrl };\n },\n factory: (c) => createLocalStorage(c),\n });\n }\n\n private registerImgix(): void {\n this.register({\n type: \"imgix\",\n displayName: \"Imgix\",\n configKey: \"imgix\",\n configFields: [\n { name: \"domain\", type: \"text\", label: \"Domain\", required: true },\n { name: \"signKey\", type: \"password\", label: \"Sign Key\" },\n ],\n extractConfig: (sc, key) => (sc as any)[key] || {},\n extractRawConfig: (c) => c?.imgix || c,\n factory: (c) => createImgixStorage(c),\n });\n }\n\n private registerBunny(): void {\n this.register({\n type: \"bunny\",\n displayName: \"Bunny.net\",\n configKey: \"bunny\",\n configFields: [\n {\n name: \"storageZone\",\n type: \"text\",\n label: \"Storage Zone\",\n required: true,\n },\n { name: \"apiKey\", type: \"password\", label: \"API Key\", required: true },\n { name: \"cdnUrl\", type: \"text\", label: \"CDN URL\" },\n { name: \"prefix\", type: \"text\", label: \"Path Prefix\" },\n ],\n extractConfig: (sc, key) => (sc as any)[key] || {},\n extractRawConfig: (c) => c?.bunny || c,\n factory: (c) => createBunnyStorage(c),\n });\n }\n\n register(registration: StorageProviderRegistration): void {\n if (this.providers.has(registration.type)) {\n console.warn(\n `[StorageRegistry] Provider \"${registration.type}\" already registered, skipping`,\n );\n return;\n }\n if (registration.pluginName) {\n this.providerToPlugin.set(registration.type, registration.pluginName);\n }\n this.providers.set(registration.type, registration);\n }\n\n unregister(type: string): void {\n this.providers.delete(type);\n this.providerToPlugin.delete(type);\n }\n\n get(type: string): StorageProviderRegistration | undefined {\n return this.providers.get(type);\n }\n\n getAll(): StorageProviderRegistration[] {\n return Array.from(this.providers.values());\n }\n\n getAllAvailable(isPluginEnabled?: (name: string) => boolean): StorageProviderRegistration[] {\n const all = this.getAll();\n if (!isPluginEnabled) return all;\n return all.filter((p) => {\n if (!p.pluginName) return true;\n return isPluginEnabled(p.pluginName);\n });\n }\n\n has(type: string): boolean {\n return this.providers.has(type);\n }\n\n async resolve(\n type: string,\n storageConfig: StorageConfig,\n ): Promise<StorageProvider> {\n const reg = this.providers.get(type);\n if (!reg) {\n throw new Error(\n `Unknown storage provider type: \"${type}\". Is the plugin that provides it enabled?`,\n );\n }\n if (reg.pluginName && this.disabledPlugins.has(reg.pluginName)) {\n throw new Error(\n `Storage provider \"${type}\" is not available (plugin \"${reg.pluginName}\" is disabled)`,\n );\n }\n const configKey = reg.configKey || type;\n const config = reg.extractConfig(storageConfig, configKey);\n return reg.factory(config);\n }\n\n async resolveWithConfig(type: string, config: any): Promise<StorageProvider> {\n const reg = this.providers.get(type);\n if (!reg) {\n throw new Error(\n `Unknown storage provider type: \"${type}\". Is the plugin that provides it enabled?`,\n );\n }\n if (reg.pluginName && this.disabledPlugins.has(reg.pluginName)) {\n throw new Error(\n `Storage provider \"${type}\" is not available (plugin \"${reg.pluginName}\" is disabled)`,\n );\n }\n const providerConfig = reg.extractRawConfig(config);\n return reg.factory(providerConfig);\n }\n\n getProviderPluginName(type: string): string | undefined {\n return this.providerToPlugin.get(type);\n }\n\n getAllPluginNames(): string[] {\n return Array.from(new Set(this.providerToPlugin.values()));\n }\n\n setPluginEnabled(name: string, enabled: boolean): void {\n if (enabled) {\n this.disabledPlugins.delete(name);\n } else {\n this.disabledPlugins.add(name);\n }\n }\n\n isPluginEnabled(name: string): boolean {\n return !this.disabledPlugins.has(name);\n }\n}\n\nlet instance: StorageProviderRegistry | null = null;\n\nexport function getDefaultRegistry(): StorageProviderRegistry {\n if (!instance) {\n instance = new StorageProviderRegistry();\n }\n return instance;\n}\n\nexport function resetStorageProviderRegistry(): void {\n instance = null;\n}\n","import {\n S3Client,\n PutObjectCommand,\n DeleteObjectCommand,\n DeleteObjectsCommand,\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 async createFolder(folder: string): Promise<void> {\n const key = getKey(`${folder}/`);\n await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: key,\n Body: \"\",\n }),\n );\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const prefix = getKey(`${folder}/`);\n let continuationToken: string | undefined;\n do {\n const listResponse = await client.send(\n new ListObjectsV2Command({\n Bucket: config.bucket,\n Prefix: prefix,\n ContinuationToken: continuationToken,\n }),\n );\n if (listResponse.Contents?.length) {\n const objects = listResponse.Contents.map((item) => ({\n Key: item.Key,\n }));\n await client.send(\n new DeleteObjectsCommand({\n Bucket: config.bucket,\n Delete: { Objects: objects },\n }),\n );\n }\n continuationToken = listResponse.IsTruncated\n ? listResponse.NextContinuationToken\n : undefined;\n } while (continuationToken);\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: prefix,\n }),\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 async createFolder(): Promise<void> {\n // Cloudinary creates folders implicitly on upload\n },\n\n async deleteFolder(): Promise<void> {\n // Requires Cloudinary Admin API (not available from frontend)\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 async createFolder(folder: string): Promise<void> {\n const ftp = await getClient();\n const key = getKey(folder);\n await ftp.ensureDir(key);\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const ftp = await getClient();\n const key = getKey(folder);\n await ftp.removeDir(key);\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 createFolder?(folder: string): Promise<void>;\n deleteFolder?(folder: string): Promise<void>;\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\";\nimport { getDefaultRegistry } from \"./registry.js\";\n\nexport async function resolveProvider(\n configService: ConfigService,\n): Promise<StorageProvider> {\n const config = configService.getStorageConfig();\n const registry = getDefaultRegistry();\n\n try {\n return await registry.resolve(config.type, config);\n } catch (err: any) {\n console.warn(\n `[resolveProvider] ${err.message} — falling back to local storage`,\n );\n return createLocalStorage({\n uploadDir: path.join(process.cwd(), \"public\", \"uploads\"),\n 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 const type = config.type || \"local\";\n const registry = getDefaultRegistry();\n\n try {\n return await registry.resolveWithConfig(type, config);\n } catch (err: any) {\n console.warn(\n `[resolveProviderWithConfig] ${err.message} — falling back to local storage`,\n );\n return createLocalStorage({\n uploadDir: path.join(process.cwd(), \"public\", \"uploads\"),\n baseUrl: \"/uploads\",\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\nlet _mediaTablesEnsured = false;\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 storage = await resolveProviderWithConfig(options.storageConfig);\n } else {\n const configService = new ConfigService(db);\n if (typeof db?.select === \"function\") {\n await configService.load();\n }\n storage = await resolveProvider(configService);\n }\n\n const service = new MediaService(db, storage, options);\n await service.ensureTables();\n return service;\n }\n\n private async ensureTables(): Promise<void> {\n if (this.dialect === \"sqlite\") {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS media (\n id TEXT PRIMARY KEY,\n filename TEXT NOT NULL UNIQUE,\n title TEXT,\n original_name TEXT NOT NULL,\n mime_type TEXT NOT NULL,\n file_size INTEGER NOT NULL,\n width INTEGER,\n height INTEGER,\n url TEXT NOT NULL UNIQUE,\n thumbnail_url TEXT,\n folder TEXT,\n provider TEXT NOT NULL,\n alt TEXT,\n caption TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\n CREATE INDEX IF NOT EXISTS idx_media_provider ON media(provider);\n CREATE INDEX IF NOT EXISTS idx_media_filename ON media(filename);\n `);\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS media_folders (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n parent_path TEXT,\n created_at TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_media_folders_path ON media_folders(path);\n `);\n } else if (this.dialect === \"postgres\") {\n if (_mediaTablesEnsured) return;\n const { sql } = await import(\"drizzle-orm\");\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"media\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"filename\" VARCHAR(255) NOT NULL UNIQUE,\n \"title\" VARCHAR(255),\n \"original_name\" VARCHAR(255) NOT NULL,\n \"mime_type\" VARCHAR(100),\n \"file_size\" INTEGER,\n \"width\" INTEGER,\n \"height\" INTEGER,\n \"url\" TEXT NOT NULL UNIQUE,\n \"thumbnail_url\" TEXT,\n \"folder\" VARCHAR(255),\n \"provider\" VARCHAR(50) NOT NULL,\n \"alt\" TEXT,\n \"caption\" TEXT,\n \"metadata\" JSONB,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW(),\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_folder\" ON \"media\" (\"folder\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_provider\" ON \"media\" (\"provider\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_filename\" ON \"media\" (\"filename\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"media_folders\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"name\" VARCHAR(255) NOT NULL,\n \"path\" TEXT NOT NULL,\n \"parent_path\" TEXT,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_folders_path\" ON \"media_folders\" (\"path\")`);\n _mediaTablesEnsured = true;\n }\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\"\n ? \"title\"\n : params.sortBy === \"createdAt\"\n ? \"created_at\"\n : params.sortBy === \"updatedAt\"\n ? \"updated_at\"\n : 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 \"../database/drizzle/schema/media.js\"\n );\n const mime = storageResult.mimeType;\n const mediaType = mime.startsWith(\"image/\") ? \"image\"\n : mime.startsWith(\"video/\") ? \"video\"\n : mime.startsWith(\"audio/\") ? \"audio\"\n : mime.startsWith(\"application/pdf\") ? \"document\"\n : [\"application/zip\",\"application/x-zip\",\"application/x-tar\",\"application/gzip\",\"application/x-7z\"].includes(mime) ? \"archive\"\n : \"other\";\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: mime,\n fileSize: storageResult.size,\n width,\n height,\n url: storageResult.url,\n thumbnailUrl,\n folder: folder || \"\",\n provider: this.storage.name,\n type: mediaType,\n status: \"active\",\n alt: null,\n caption: null,\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 uploadFromUrl(url: string, folder: string = \"\"): Promise<MediaRow> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status}`);\n }\n const blob = await response.blob();\n const originalName = url.split(\"/\").pop() || \"url-image\";\n const mimeType = response.headers.get(\"content-type\") || blob.type || \"application/octet-stream\";\n const file = new File([blob], originalName, { type: mimeType });\n return this.upload(file, folder);\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 \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(eq(mediaSchema.id, 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 \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n await this.db.delete(mediaSchema).where(eq(mediaSchema.id, 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 \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(eq(mediaSchema.id, 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 \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n await this.db\n .update(mediaSchema)\n .set({ ...updateData, updatedAt: this.now() })\n .where(eq(mediaSchema.id, id));\n }\n\n return {\n ...item,\n ...updateData,\n updatedAt: this.now(),\n thumbnailUrl: updateData.thumbnailUrl ?? null,\n };\n }\n\n async findById(id: string): Promise<MediaRow | null> {\n if (this.dialect === \"sqlite\") {\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 \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(eq(mediaSchema.id, id));\n\n return row ? this.rowToMedia(row) : null;\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 \"../database/drizzle/schema/media.js\"\n );\n const { like, or, and, asc, desc, eq, sql } = await import(\n \"drizzle-orm\"\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 sortKey: Record<string, string> = {\n created_at: \"createdAt\",\n updated_at: \"updatedAt\",\n title: \"title\",\n filename: \"filename\",\n file_size: \"fileSize\",\n mime_type: \"mimeType\",\n original_name: \"originalName\",\n };\n const col = (mediaSchema as any)[sortKey[sortCol] || \"createdAt\"];\n const order = sortDir === \"asc\" ? asc(col) : desc(col);\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 \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n const [updated] = await this.db\n .update(mediaSchema)\n .set({ ...data, updatedAt: new Date() })\n .where(eq(mediaSchema.id, 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 \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n for (const id of ids) {\n await this.db\n .update(mediaSchema)\n .set({ ...data, updatedAt: new Date() })\n .where(eq(mediaSchema.id, 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 \"../database/drizzle/schema/media.js\"\n );\n const { eq, sql } = await import(\n \"drizzle-orm\"\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 await this.storage.createFolder?.(fullPath);\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 \"../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 await this.storage.deleteFolder?.(folder);\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 \"../database/drizzle/schema/media.js\"\n );\n const { like, or, eq } = await import(\n \"drizzle-orm\"\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}\n","import crypto from \"crypto\";\nimport { Hono } from \"hono\";\nimport { resolve, join } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\nimport sharp from \"sharp\";\nimport type {\n BaseAdapter,\n CollectionConfig,\n GlobalConfig,\n} from \"../../registry/types.js\";\nimport { Registry } from \"../../registry/index.js\";\nimport { evaluateAccess } from \"../../access/types.js\";\nimport type { User, Request as KyroRequest } from \"../../hooks/types.js\";\nimport {\n createAuthMiddleware,\n type AuthMiddlewareResult,\n hasApiKeyPermission,\n} from \"./auth-middleware.js\";\nimport {\n createWebhookService,\n WEBHOOK_EVENTS,\n type WebhookEvent,\n} from \"../../webhooks/index.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { InMemoryRateLimiter } from \"../../auth/security/in-memory-rate-limit.js\";\nimport { AuthRoutes } from \"./auth-routes.js\";\nimport { SQLiteAuthAdapter } from \"../../auth/sqlite-adapter.js\";\nimport { DrizzleAdapter } from \"../../database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"../../database/drizzle/postgres-auth-adapter.js\";\nimport { MongoDBAdapter } from \"../../database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"../../database/mongodb/mongo-auth-adapter.js\";\nimport { MediaService } from \"../../storage/MediaService.js\";\nimport { hasPermission } from \"../../auth/rbac/checker.js\";\nimport { JWTPayload } from \"../../auth/types.js\";\nimport { generateApiKey, generateApiKeyPrefix, API_KEY_COLLECTION } from \"../../auth/api-key.js\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { usersCollection as defaultUsersCollection } from \"../../templates/auth.js\";\n\nfunction formatZodErrors(errors: any[]): string {\n return errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n}\n\nfunction convertRichtextFields(fields: any[], data: any): void {\n if (!data || typeof data !== 'object') return;\n for (const field of fields) {\n if (field.type === 'richtext' && field.name) {\n const val = data[field.name];\n if (typeof val === 'string') {\n data[field.name] = [{ type: \"paragraph\", children: [{ text: val }] }];\n } else if (val && typeof val === 'object' && !Array.isArray(val) && val.type === 'doc' && Array.isArray(val.content)) {\n data[field.name] = val.content;\n }\n }\n if (field.type === 'tabs' && field.name && Array.isArray(field.tabs) && data[field.name] && typeof data[field.name] === 'object') {\n for (const tab of field.tabs) {\n if (Array.isArray(tab.fields)) convertRichtextFields(tab.fields, data[field.name]);\n }\n } else if ((field.type === 'group' || field.type === 'collapsible') && field.name && Array.isArray(field.fields) && data[field.name] && typeof data[field.name] === 'object') {\n convertRichtextFields(field.fields, data[field.name]);\n } else if (field.type === 'array' && field.name && Array.isArray(field.fields) && Array.isArray(data[field.name])) {\n for (const item of data[field.name]) {\n if (item && typeof item === 'object') convertRichtextFields(field.fields, item);\n }\n }\n }\n}\n\n// ============================================================================\n// REST API Factory\n// ============================================================================\n\nexport interface HonoAppOptions {\n registry: Registry;\n db: BaseAdapter;\n authSecret?: string;\n authAdapter?: any; // NEW\n checkSession?: boolean; // NEW - default true\n user?: User;\n req?: any;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n webhookService?: ReturnType<typeof createWebhookService>;\n settings?: {\n access?: {\n enablePublicAccess?: boolean;\n defaultCollectionAccess?: string;\n apiAccess?: {\n restEnabled?: boolean;\n graphqlEnabled?: boolean;\n trpcEnabled?: boolean;\n websocketEnabled?: boolean;\n requireAuth?: boolean;\n cors?: {\n allowedOrigins?: string[] | string;\n };\n };\n rateLimiting?: {\n enabled?: boolean;\n maxRequests?: number;\n windowMs?: number;\n };\n };\n };\n}\n\nconst COLLECTION_EVENT_MAP: Record<\n string,\n { create: WebhookEvent; update: WebhookEvent; delete: WebhookEvent }\n> = {\n _media: {\n create: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n update: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n delete: WEBHOOK_EVENTS.MEDIA_DELETE,\n },\n};\n\nfunction getWebhookEvent(\n collection: string,\n operation: \"create\" | \"update\" | \"delete\",\n): WebhookEvent {\n const mapped = COLLECTION_EVENT_MAP[collection];\n if (mapped) return mapped[operation];\n return `collection.${operation}` as WebhookEvent;\n}\n\n// ============================================================================\n// Access Check Helper\n// ============================================================================\n\ninterface AccessCheckResult {\n allowed: boolean;\n error?: string;\n status?: number;\n}\n\nfunction extractIp(req: Request): string {\n const forwarded = req.headers.get(\"x-forwarded-for\");\n if (forwarded) return forwarded.split(\",\")[0].trim();\n return req.headers.get(\"x-real-ip\") || \"unknown\";\n}\n\nfunction auditApiKeyUsage(\n sessionAuthAdapter: any,\n apiKeyContext: any,\n endpoint: string,\n method: string,\n req: Request,\n) {\n if (apiKeyContext?.apiKeyId && sessionAuthAdapter) {\n sessionAuthAdapter.createAuditLog({\n action: \"api_request\",\n userId: apiKeyContext.userId || \"\",\n resource: \"api_key\",\n resourceId: apiKeyContext.apiKeyId,\n success: true,\n metadata: {\n endpoint,\n method,\n ip: extractIp(req),\n },\n });\n }\n}\n\nfunction readBaseUpdatedAt(body: Record<string, any>): string | null | undefined {\n return body.baseUpdatedAt ?? body._baseUpdatedAt;\n}\n\nfunction omitRevisionFields<T extends Record<string, any>>(body: T): T {\n const { baseUpdatedAt, _baseUpdatedAt, ...rest } = body;\n return rest as T;\n}\n\nfunction buildConflictResponse(\n expectedUpdatedAt: string | null | undefined,\n currentDoc: Record<string, any>,\n) {\n return {\n error: \"Document has changed since you started editing\",\n code: \"REVISION_CONFLICT\",\n conflict: {\n expectedUpdatedAt: expectedUpdatedAt ?? null,\n actualUpdatedAt: currentDoc.updatedAt ?? null,\n current: currentDoc,\n },\n };\n}\n\nasync function checkCollectionAccess(\n collection: CollectionConfig,\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n req: any,\n ctxUser?: User,\n ctxTenantID?: string,\n apiKeyContext?: any,\n enablePublicAccess: boolean = true,\n defaultCollectionAccess: string = \"none\",\n): Promise<AccessCheckResult> {\n const accessRule = collection.access?.[operation];\n\n const accessLevels: Record<string, boolean> = {\n none: false,\n read: operation === \"read\",\n create: operation === \"read\" || operation === \"create\",\n update:\n operation === \"read\" || operation === \"create\" || operation === \"update\",\n delete:\n operation === \"read\" ||\n operation === \"create\" ||\n operation === \"update\" ||\n operation === \"delete\",\n admin: true,\n };\n const isDefaultAllowed = accessLevels[defaultCollectionAccess] || false;\n\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req,\n user: ctxUser,\n tenantID: ctxTenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n } else if (!ctxUser) {\n const allowed = enablePublicAccess && isDefaultAllowed;\n if (!allowed) {\n return {\n allowed: false,\n error: \"Authentication required\",\n status: 401,\n };\n }\n }\n\n if (apiKeyContext?.permissions?.length > 0) {\n const resource = collection.slug;\n const action =\n operation === \"read\"\n ? \"read\"\n : operation === \"create\"\n ? \"create\"\n : \"update\";\n const permission = `${resource}:${action}`;\n\n if (\n !hasApiKeyPermission(apiKeyContext.permissions, permission) &&\n !hasApiKeyPermission(apiKeyContext.permissions, `${resource}:admin`)\n ) {\n return {\n allowed: false,\n error: `Missing permission: ${permission}`,\n status: 403,\n };\n }\n }\n\n if (ctxUser) {\n const resource = collection.slug;\n const action =\n operation === \"read\"\n ? \"read\"\n : operation === \"create\"\n ? \"create\"\n : operation === \"update\"\n ? \"update\"\n : \"delete\";\n const permission = `${resource}:${action}`;\n\n let rbacAllowed = false;\n if (ctxUser.role) {\n const userHasPermission = hasPermission(\n { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role } as any,\n permission,\n );\n\n if (userHasPermission) {\n rbacAllowed = true;\n } else {\n const adminPermission = hasPermission(\n { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role } as any,\n `${resource}:admin`,\n );\n if (adminPermission) rbacAllowed = true;\n }\n }\n\n if (!rbacAllowed && !isDefaultAllowed && !accessRule) {\n return {\n allowed: false,\n error: `Missing RBAC permission: ${permission}`,\n status: 403,\n };\n }\n }\n\n return { allowed: true };\n}\n\nasync function checkGlobalAccess(\n global: GlobalConfig,\n operation: \"read\" | \"update\",\n req: any,\n ctxUser?: User,\n ctxTenantID?: string,\n enablePublicAccess: boolean = true,\n): Promise<AccessCheckResult> {\n const accessRule = global.access?.[operation];\n\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req,\n user: ctxUser,\n tenantID: ctxTenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n } else if (!ctxUser) {\n const accessLevels: Record<string, boolean> = {\n none: false,\n read: operation === \"read\",\n update: operation === \"read\" || operation === \"update\",\n };\n const allowed =\n enablePublicAccess &&\n accessLevels[operation === \"read\" ? \"read\" : \"admin\"];\n if (!allowed) {\n return {\n allowed: false,\n error: \"Authentication required\",\n status: 401,\n };\n }\n }\n\n return { allowed: true };\n}\n\n// ============================================================================\n// Auth Context Resolution\n// ============================================================================\n\nasync function resolveAuthContext(\n req: globalThis.Request,\n authMw: ReturnType<typeof createAuthMiddleware> | null,\n staticUser?: User,\n staticTenantID?: string,\n): Promise<{\n user: User | undefined;\n tenantID: string | undefined;\n apiKeyContext: any;\n authType?: string;\n}> {\n if (staticUser) {\n return {\n user: staticUser,\n tenantID: staticTenantID,\n apiKeyContext: undefined,\n authType: \"static\",\n };\n }\n\n if (authMw) {\n const res = await authMw(req);\n if (res.status === 200 && res.user) {\n return {\n user: res.user as any,\n tenantID: res.tenantContext?.tenantId,\n apiKeyContext: res.apiKeyContext,\n authType: res.authType,\n };\n }\n }\n\n return {\n user: undefined,\n tenantID: undefined,\n apiKeyContext: undefined,\n authType: undefined,\n };\n}\n\n// ============================================================================\n// Auth Adapter Factory (auto-detect dialect)\n// ============================================================================\n\nfunction createDefaultAuthAdapter(\n db: BaseAdapter,\n rootDir: string,\n): any {\n if (db instanceof DrizzleAdapter && db.dialect === \"postgres\") {\n return new PostgresAuthAdapter({ db: db.client });\n }\n if (db instanceof MongoDBAdapter) {\n return new MongoDBAuthAdapter({ db: db.db });\n }\n const defaultAuthDbPath = resolve(rootDir, \"data\", \"kyro.db\");\n return new SQLiteAuthAdapter({\n path: process.env.KYRO_AUTH_DB_PATH || defaultAuthDbPath,\n });\n}\n\n// ============================================================================\n// Hono App Factory\n// ============================================================================\n\nexport function createHonoApp(options: HonoAppOptions): Hono {\n const {\n registry,\n db,\n authSecret,\n authAdapter,\n checkSession,\n user,\n tenantID,\n cors,\n webhookService,\n settings,\n } = options;\n const app = new Hono();\n\n // Check if REST API is disabled in settings\n const apiAccess = settings?.access?.apiAccess;\n if (apiAccess?.restEnabled === false) {\n app.all(\"/api/*\", (c) => {\n return c.json({ error: \"REST API is disabled\" }, 503);\n });\n return app;\n }\n\n const enablePublicAccess = settings?.access?.enablePublicAccess ?? false;\n const defaultCollectionAccess =\n settings?.access?.defaultCollectionAccess ?? \"none\";\n\n const requireAuth = apiAccess?.requireAuth;\n\n // Resolve the true project root dynamically\n const cwd = process.cwd();\n const rootDir = cwd.endsWith(\"admin\") ? resolve(cwd, \"..\") : cwd;\n\n // Create auth adapter early for session checking\n const sessionAuthAdapter = authAdapter || createDefaultAuthAdapter(db, rootDir);\n\n // Always create auth middleware if authSecret is provided\n // This enables auth-based access for collection routes\n // checkSession defaults to true unless explicitly set to false\n const shouldCheckSession = checkSession !== false;\n // Use sessionAuthAdapter for session checking (created below)\n const sessionChecker = sessionAuthAdapter;\n const authMw = authSecret\n ? createAuthMiddleware({\n secret: authSecret,\n db,\n userLookup: async (userId: string) => {\n const user = await sessionAuthAdapter.findUserById(userId);\n return user || null;\n },\n checkSession: shouldCheckSession\n ? async (\n userId: string,\n token: string,\n req?: Request,\n payload?: JWTPayload,\n ) => {\n // Check session if sessionAuthAdapter exists\n if (!sessionChecker) return true;\n try {\n const sessionToken = payload?.sid || token;\n\n let session =\n await sessionChecker.findSessionByToken(sessionToken);\n\n if (!session && req) {\n const cookieHeader = req.headers.get(\"Cookie\") || \"\";\n const match = cookieHeader.match(/refresh_token=([^;]+)/);\n if (match) {\n session = await sessionChecker.findSessionByRefreshToken(\n match[1],\n );\n }\n }\n\n return !!session;\n } catch {\n return false;\n }\n }\n : undefined,\n })\n : null;\n\n // CORS middleware\n const settingsCorsRaw = apiAccess?.cors?.allowedOrigins;\n const optionsCors = cors?.origins;\n const settingsCors = Array.isArray(settingsCorsRaw)\n ? settingsCorsRaw\n : typeof settingsCorsRaw === \"string\" && settingsCorsRaw\n ? settingsCorsRaw\n .split(\"\\n\")\n .map((s: string) => s.trim())\n .filter(Boolean)\n : [];\n const allowedOrigins: string[] =\n settingsCors.length > 0 ? settingsCors : optionsCors || [];\n const corsEnabled = allowedOrigins.length > 0 || !!cors;\n\n if (corsEnabled) {\n app.use(\"*\", async (c, next) => {\n const origin = c.req.header(\"Origin\") || \"*\";\n\n if (allowedOrigins.length > 0 && !allowedOrigins.includes(origin)) {\n return c.json({ error: \"Origin not allowed\" }, 403);\n }\n\n const allowOrigin = allowedOrigins.length > 0 ? origin : \"*\";\n c.header(\"Access-Control-Allow-Origin\", allowOrigin);\n c.header(\n \"Access-Control-Allow-Methods\",\n \"GET, POST, PATCH, DELETE, OPTIONS\",\n );\n c.header(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, Authorization, X-API-Key\",\n );\n if (cors?.credentials) {\n c.header(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (c.req.method === \"OPTIONS\") {\n return c.text(\"\");\n }\n await next();\n });\n }\n\n // Rate limiting middleware\n const rateLimiting = settings?.access?.rateLimiting;\n let rateLimiter: InMemoryRateLimiter | undefined;\n\n if (rateLimiting?.enabled) {\n const maxRequests = rateLimiting.maxRequests || 100;\n const windowMs = rateLimiting.windowMs || 60000;\n\n rateLimiter = new InMemoryRateLimiter({\n \"api:general\": { window: windowMs, max: maxRequests },\n });\n\n app.use(\"/api/*\", async (c, next) => {\n if (!rateLimiter) {\n return next();\n }\n\n const ip =\n c.req.header(\"CF-Connecting-IP\") ||\n c.req.header(\"X-Forwarded-For\")?.split(\",\")[0]?.trim() ||\n c.req.header(\"X-Real-IP\") ||\n \"unknown\";\n\n const result = await rateLimiter.check(\"api:general\", ip);\n\n c.header(\"X-RateLimit-Limit\", String(maxRequests));\n c.header(\"X-RateLimit-Remaining\", String(result.remaining));\n c.header(\"X-RateLimit-Reset\", String(result.resetAt));\n\n if (!result.allowed) {\n return c.json(\n {\n error: \"Too many requests\",\n retryAfter: result.retryAfter,\n },\n 429,\n );\n }\n\n await next();\n });\n }\n\n // ============================================================================\n // Auth & Media Routes\n // ============================================================================\n\n // Auth Routes - uses single DB with absolute path\n // Lazy initialization handled in auth-routes to avoid top-level await issues\n // sessionAuthAdapter already created above for session checking\n\n const authRoutes = new AuthRoutes({\n redis: sessionAuthAdapter as any, // Using redis property for AuthAdapter\n jwtSecret: authSecret || \"change-me\",\n baseUrl: process.env.KYRO_BASE_URL || \"http://localhost:4321\",\n rateLimiter,\n });\n\n app.post(\"/api/auth/login\", async (c) => authRoutes.login(c.req.raw));\n app.post(\"/api/auth/register\", async (c) => authRoutes.register(c.req.raw));\n app.post(\"/api/auth/logout\", async (c) => authRoutes.logout(c.req.raw));\n app.post(\"/api/auth/refresh\", async (c) => authRoutes.refresh(c.req.raw));\n app.get(\"/api/auth/me\", async (c) => authRoutes.me(c.req.raw));\n\n // Session management\n app.get(\"/api/auth/sessions\", async (c) => authRoutes.listSessions(c.req.raw));\n app.post(\"/api/auth/sessions/refresh\", async (c) => authRoutes.refreshSession(c.req.raw));\n app.delete(\"/api/auth/sessions\", async (c) => authRoutes.revokeOtherSessions(c.req.raw));\n app.delete(\"/api/auth/sessions/:id\", async (c) => authRoutes.revokeSession(c.req.raw, c.req.param(\"id\")));\napp.put(\"/api/auth/sessions/:id/name\", async (c) => authRoutes.renameSession(c.req.raw, c.req.param(\"id\")));\n\n app.get(\"/api/auth/access\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n if (!ctxUser) {\n return c.json({ error: \"Not authenticated\" }, 401);\n }\n\n const collections: Record<string, any> = {};\n const globals: Record<string, any> = {};\n\n for (const col of registry.getCollections()) {\n const permissions = {\n read: (\n await checkCollectionAccess(\n col,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n create: (\n await checkCollectionAccess(\n col,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n update: (\n await checkCollectionAccess(\n col,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n delete: (\n await checkCollectionAccess(\n col,\n \"delete\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n };\n collections[col.slug] = permissions;\n }\n\n for (const globalConfig of registry.getGlobals()) {\n const permissions = {\n read: (\n await checkGlobalAccess(\n globalConfig,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n )\n ).allowed,\n update: (\n await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n )\n ).allowed,\n };\n globals[globalConfig.slug] = permissions;\n }\n\n return c.json({ collections, globals });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Dedicated Users Routes (backed by auth adapter, not main DB)\n const usersCollection = (typeof registry.hasCollection === \"function\" && registry.hasCollection(\"users\"))\n ? registry.getCollection(\"users\")\n : (() => {\n try {\n return registry.getCollection(\"users\");\n } catch {\n return defaultUsersCollection;\n }\n })();\n\n app.get(\"/api/users\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"10\"), 100);\n const search = c.req.query(\"search\") || undefined;\n\n const result = await sessionAuthAdapter.findUsers({\n page,\n limit,\n search,\n });\n\n return c.json({\n docs: result.users,\n totalDocs: result.total,\n limit,\n totalPages: Math.ceil(result.total / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(result.total / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(result.total / limit) ? page + 1 : null,\n });\n } catch (error: any) {\n console.error(\"[API] Error listing users:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/users/:id\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const id = c.req.param(\"id\");\n const found = await sessionAuthAdapter.findUserById(id);\n if (!found) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n return c.json({ data: found });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/users\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = await c.req.json();\n if (!body.email || !body.password) {\n return c.json({ error: \"Email and password are required\" }, 400);\n }\n\n const existing = await sessionAuthAdapter.findUserByEmail(body.email);\n if (existing) {\n return c.json({ error: \"Email already in use\" }, 400);\n }\n\n const created = await sessionAuthAdapter.createUser({\n email: body.email,\n password: body.password,\n name: body.name,\n role: body.role || \"customer\",\n avatar: body.avatar,\n tenantId: body.tenantId,\n });\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"user_create\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: created.id,\n success: true,\n });\n }\n\n return c.json(\n { data: created, message: \"User created successfully\" },\n 201,\n );\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.patch(\"/api/users/:id\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n\n const existing = await sessionAuthAdapter.findUserById(id);\n if (!existing) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n const updateData: Record<string, unknown> = {};\n if (body.name !== undefined) updateData.name = body.name;\n if (body.email !== undefined) updateData.email = body.email;\n if (body.role !== undefined) updateData.role = body.role;\n if (body.avatar !== undefined) {\n updateData.avatar = typeof body.avatar === \"object\" && body.avatar !== null\n ? (body.avatar.id || String(body.avatar))\n : body.avatar;\n }\n if (body.tenantId !== undefined) updateData.tenantId = body.tenantId;\n if (body.emailVerified !== undefined)\n updateData.emailVerified = body.emailVerified;\n if (body.locked !== undefined) updateData.locked = body.locked;\n if (body.failedLoginAttempts !== undefined)\n updateData.failedLoginAttempts = body.failedLoginAttempts;\n if (body.lastLogin !== undefined) updateData.lastLogin = body.lastLogin;\n\n const updated = await sessionAuthAdapter.updateUser(id, updateData);\n if (!updated) {\n return c.json({ error: \"User update failed\" }, 500);\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"user_update\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: id,\n success: true,\n });\n if (body.role && existing.role !== body.role) {\n sessionAuthAdapter?.createAuditLog({\n action: \"role_change\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: id,\n success: true,\n metadata: { oldRole: existing.role, newRole: body.role }\n });\n }\n }\n\n return c.json({ data: updated, message: \"User updated successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/users/:id\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"delete\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n\n if (ctxUser && ctxUser.id === id) {\n return c.json({ error: \"You cannot delete your own account\" }, 403);\n }\n\n const existing = await sessionAuthAdapter.findUserById(id);\n if (!existing) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n const deleted = await sessionAuthAdapter.deleteUser(id);\n if (!deleted) {\n return c.json({ error: \"User deletion failed\" }, 500);\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"user_delete\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: id,\n success: true,\n });\n }\n\n return c.json({ data: existing, message: \"User deleted successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Audit Logs Route (backed by auth adapter)\n app.get(\"/api/auth/audit-logs\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const auditLogsCollection = registry.getCollection(\"audit_logs\");\n if (auditLogsCollection) {\n const access = await checkCollectionAccess(\n auditLogsCollection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n } else if (!ctxUser) {\n return c.json({ error: \"Authentication required\" }, 401);\n }\n\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"50\"), 100);\n const action = c.req.query(\"action\") || undefined;\n const userId = c.req.query(\"userId\") || undefined;\n const resource = c.req.query(\"resource\") || undefined;\n\n const result = await sessionAuthAdapter.findAuditLogs({\n action,\n userId,\n resource,\n limit,\n offset: (page - 1) * limit,\n });\n\n return c.json({\n docs: result.logs,\n totalDocs: result.total,\n limit,\n totalPages: Math.ceil(result.total / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(result.total / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(result.total / limit) ? page + 1 : null,\n });\n } catch (error: any) {\n console.error(\"[API] Error listing audit logs:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Media Routes\n // Note: MediaService.init is async, so we'll lazy-load or assume it's ready.\n // In a real production app, we'd handle the async init better.\n let mediaService: MediaService | null = null;\n let mediaServiceInitError: any = null;\n\n const getMedia = async () => {\n if (mediaServiceInitError) {\n throw mediaServiceInitError;\n }\n if (!mediaService) {\n try {\n const dialect = db instanceof DrizzleAdapter ? db.dialect : \"sqlite\";\n const mediaDb = dialect === \"postgres\" && db instanceof DrizzleAdapter ? db.client : db;\n mediaService = await MediaService.init(mediaDb, { dialect });\n } catch (error: any) {\n console.error(\"[getMedia] Init error:\", error);\n mediaServiceInitError = error;\n throw error;\n }\n }\n return mediaService;\n };\n\n // ============================================================================\n // Media Routes (authenticated)\n // ============================================================================\n\n app.get(\"/api/media\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = parseInt(c.req.query(\"limit\") || \"30\");\n const search = c.req.query(\"search\") || \"\";\n const type = c.req.query(\"type\") || \"\";\n const folder = c.req.query(\"folder\") || \"\";\n\n const result = await service.find({ page, limit, search, type, folder });\n return c.json(result);\n } catch (error: any) {\n console.error(\"[Media] find error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/media/upload\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const contentType = c.req.header(\"content-type\") || \"\";\n\n if (contentType.includes(\"multipart/form-data\")) {\n const formData = await c.req.formData();\n const file = formData.get(\"file\") as File;\n const folder = (formData.get(\"folder\") as string) || \"\";\n\n if (!file) return c.json({ error: \"No file uploaded\" }, 400);\n\n const result = await service.upload(file, folder);\n return c.json(result);\n }\n\n const { url } = await c.req.json();\n if (!url) return c.json({ error: \"No URL provided\" }, 400);\n const result = await service.uploadFromUrl(url);\n return c.json(result);\n } catch (error: any) {\n console.error(\"[Media] upload error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/media/folders\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const folders = await service.listFolders();\n return c.json(folders);\n } catch (error: any) {\n console.error(\"[Media] folders error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/media/folders\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const body = await c.req.json();\n const { name, parentPath } = body;\n if (!name) {\n return c.json({ error: \"Folder name is required\" }, 400);\n }\n await service.createFolder(name, parentPath || \"\");\n return c.json({\n message: \"Folder created\",\n path: parentPath ? `${parentPath}/${name}` : name,\n });\n } catch (error: any) {\n console.error(\"[Media] create folder error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/media/folders\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const path = c.req.query(\"path\");\n if (!path) {\n return c.json({ error: \"Path is required\" }, 400);\n }\n await service.deleteFolder(path);\n return c.json({ message: \"Folder deleted\" });\n } catch (error: any) {\n console.error(\"[Media] delete folder error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/media/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const id = c.req.param(\"id\");\n await service.delete(id);\n return c.json({ success: true });\n } catch (error: any) {\n console.error(\"[Media] delete error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/media/resize\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const url = c.req.query(\"url\");\n const w = parseInt(c.req.query(\"w\") || \"0\");\n const h = parseInt(c.req.query(\"h\") || \"0\");\n const fit = (c.req.query(\"fit\") || \"cover\") as any;\n\n if (!url) return c.json({ error: \"URL is required\" }, 400);\n\n const service = await getMedia();\n const storage: any = (service as any).storage;\n\n if (storage.name !== \"local\") {\n return c.redirect(url);\n }\n\n const uploadDir = storage.config?.uploadDir || join(process.cwd(), \"public\", \"uploads\");\n const baseUrl = storage.config?.baseUrl || \"/uploads\";\n\n if (!url.startsWith(baseUrl)) {\n return c.redirect(url);\n }\n\n const relativePath = url.replace(baseUrl, \"\");\n const physicalPath = join(uploadDir, relativePath);\n\n if (!existsSync(physicalPath)) {\n return c.json({ error: \"File not found\" }, 404);\n }\n\n const imageBuffer = readFileSync(physicalPath);\n let transform = sharp(imageBuffer);\n\n if (w > 0 || h > 0) {\n transform = transform.resize({\n width: w > 0 ? w : undefined,\n height: h > 0 ? h : undefined,\n fit: fit\n });\n }\n\n const outputBuffer = await transform.toBuffer();\n const metadata = await sharp(imageBuffer).metadata();\n\n c.header(\"Content-Type\", `image/${metadata.format || \"webp\"}`);\n c.header(\"Cache-Control\", \"public, max-age=31536000, immutable\");\n return c.body(outputBuffer as any);\n } catch (error: any) {\n console.error(\"[Media] resize error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/media/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const id = c.req.param(\"id\");\n const doc = await service.findById(id);\n if (!doc) return c.json({ error: \"Media not found\" }, 404);\n return c.json(doc);\n } catch (error: any) {\n console.error(\"[Media] get error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.patch(\"/api/media/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n if (body.folder !== undefined) {\n const updated = await service.update(id, { folder: body.folder });\n return c.json({ doc: updated });\n }\n return c.json({ error: \"No valid fields to update\" }, 400);\n } catch (error: any) {\n console.error(\"[Media] update error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/media/test - Test media service initialization (authenticated)\n app.get(\"/api/media/test\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n return c.json({\n status: service ? \"initialized\" : \"failed\",\n serviceType: service?.constructor?.name,\n });\n } catch (error: any) {\n console.error(\"[test] Error:\", error);\n return c.json(\n {\n error: error.message,\n type: error.constructor?.name,\n stack: error.stack,\n },\n 500,\n );\n }\n });\n\n // GET /api/storage-status - Storage status info (authenticated)\n app.get(\"/api/storage-status\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n let configured = false;\n let provider = \"local\";\n\n if (db) {\n try {\n const row = (db as any)\n .prepare(`SELECT provider FROM \"_globals_storage-settings\" LIMIT 1`)\n .get() as any;\n if (row && row.provider) {\n configured = true;\n provider = row.provider === \"aws\" ? \"s3\" : row.provider;\n }\n } catch {\n try {\n const result = await (db as any).findOne({\n collection: \"_globals_storage-settings\",\n where: {},\n });\n if (result && result.provider) {\n configured = true;\n provider = result.provider === \"aws\" ? \"s3\" : result.provider;\n }\n } catch { }\n }\n }\n\n return c.json({\n provider,\n configured,\n usage: 0,\n limit: \"unlimited\",\n });\n } catch (error: any) {\n console.error(\"[Storage] status error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/plugins — list all registered plugins with enabled state\n app.get(\"/api/plugins\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n\n const plugins = registry.getPlugins();\n const storageRegistry = registry.storageProviders;\n\n const pluginList = await Promise.all(\n plugins.map(async (p) => {\n let enabled = true;\n const pluginName = p.name;\n\n // Try to read enabled state from settings table\n let states: Record<string, boolean> = {};\n try {\n const doc = await db.findOne({\n collection: \"_globals_plugin-settings\",\n where: {},\n });\n if (doc && doc.states) states = doc.states;\n } catch {}\n\n if (states[pluginName] !== undefined) {\n enabled = states[pluginName];\n }\n\n // Also sync registry\n storageRegistry.setPluginEnabled(pluginName, enabled);\n\n return {\n id: pluginName,\n name: pluginName,\n version: p.version || \"1.0.0\",\n description: p.description || \"\",\n enabled,\n status: enabled ? \"active\" : \"disabled\",\n };\n }),\n );\n\n return c.json(pluginList);\n } catch (error: any) {\n console.error(\"[Plugins] list error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PUT /api/plugins/:name/toggle — toggle plugin enabled state\n app.put(\"/api/plugins/:name/toggle\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n\n const pluginName = c.req.param(\"name\");\n const storageRegistry = registry.storageProviders;\n const currentEnabled = storageRegistry.isPluginEnabled(pluginName);\n const newEnabled = !currentEnabled;\n\n // Determine which storage providers would be affected\n const affectedProviders: string[] = [];\n if (!newEnabled) {\n for (const p of storageRegistry.getAll()) {\n if (p.pluginName === pluginName) {\n affectedProviders.push(p.type);\n }\n }\n }\n\n // If disabling and not forced, check if any affected provider is currently active\n const force = c.req.query(\"force\") === \"1\";\n if (!force && !newEnabled && affectedProviders.length > 0) {\n let activeProvider = \"local\";\n try {\n const row = (db as any)\n ?.prepare?.(`SELECT provider FROM \"_globals_storage-settings\" LIMIT 1`)\n ?.get() as any;\n if (row?.provider) activeProvider = row.provider;\n } catch {\n try {\n const result = await (db as any)?.findOne?.({\n collection: \"_globals_storage-settings\",\n where: {},\n });\n if (result?.provider) activeProvider = result.provider;\n } catch {}\n }\n\n if (affectedProviders.includes(activeProvider)) {\n return c.json({\n error: `Cannot disable \"${pluginName}\" — storage provider \"${activeProvider}\" is currently active. Switch to Local storage first.`,\n requiresAction: true,\n activeProvider,\n }, 409);\n }\n }\n\n // Persist to settings table\n try {\n let states: Record<string, boolean> = {};\n let docId = \"global\";\n\n const doc = await db.findOne({\n collection: \"_globals_plugin-settings\",\n where: {},\n });\n if (doc) {\n states = doc.states || {};\n docId = doc.id;\n }\n\n states[pluginName] = newEnabled;\n\n if (doc) {\n await db.update({\n collection: \"_globals_plugin-settings\",\n id: docId,\n data: { states },\n });\n } else {\n await db.create({\n collection: \"_globals_plugin-settings\",\n data: { states, id: \"global\" },\n });\n }\n } catch (e) {\n console.warn(`[Plugins] Could not persist state for \"${pluginName}\":`, e);\n }\n\n storageRegistry.setPluginEnabled(pluginName, newEnabled);\n\n return c.json({ name: pluginName, enabled: newEnabled });\n } catch (error: any) {\n console.error(\"[Plugins] toggle error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Health check (public)\n app.get(\"/api/health\", (c) => {\n return c.json({\n status: \"ok\",\n version: \"0.1.0\",\n collections: registry.getCollectionSlugs(),\n timestamp: new Date().toISOString(),\n });\n });\n\n // Kyro schema — exposes field metadata + JSON Schema for codegen\n app.get(\"/api/kyro/schema\", async (c) => {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n\n const extractFields = (fields: any[]): any[] =>\n fields.map((f: any) => {\n const meta: any = {\n name: f.name,\n type: f.type,\n label: f.label,\n required: f.required ?? false,\n unique: f.unique ?? false,\n indexed: f.indexed ?? false,\n defaultValue: f.defaultValue,\n admin: f.admin ? { ...f.admin } : undefined,\n };\n if (f.minLength !== undefined) meta.minLength = f.minLength;\n if (f.maxLength !== undefined) meta.maxLength = f.maxLength;\n if (f.pattern !== undefined) meta.pattern = f.pattern;\n if (f.variant !== undefined) meta.variant = f.variant;\n if (f.hasMany !== undefined) meta.hasMany = f.hasMany;\n if (f.min !== undefined) meta.min = f.min;\n if (f.max !== undefined) meta.max = f.max;\n if (f.step !== undefined) meta.step = f.step;\n if (f.integer !== undefined) meta.integer = f.integer;\n if (f.options) meta.options = f.options;\n if (f.relationTo) meta.relationTo = f.relationTo;\n if (f.maxDepth !== undefined) meta.maxDepth = f.maxDepth;\n if (f.minRows !== undefined) meta.minRows = f.minRows;\n if (f.maxRows !== undefined) meta.maxRows = f.maxRows;\n if (f.localized !== undefined) meta.localized = f.localized;\n if (f.language) meta.language = f.language;\n if (f.format) meta.format = f.format;\n if (f.allowedTypes) meta.allowedTypes = f.allowedTypes;\n if (f.maxSize) meta.maxSize = f.maxSize;\n\n if (f.type === \"group\" || f.type === \"row\" || f.type === \"collapsible\" && f.fields) {\n meta.fields = extractFields(f.fields);\n }\n if (f.type === \"array\" && f.fields) {\n meta.fields = extractFields(f.fields);\n }\n if (f.type === \"blocks\" && f.blocks) {\n meta.blocks = f.blocks.map((b: any) => ({\n slug: b.slug,\n label: b.label,\n fields: extractFields(b.fields),\n }));\n }\n if (f.type === \"tabs\" && f.tabs) {\n meta.tabs = f.tabs.map((t: any) => ({\n label: t.label,\n name: t.name,\n fields: extractFields(t.fields),\n }));\n }\n return meta;\n });\n\n const data: any = { collections: {}, globals: {} };\n\n for (const col of registry.getCollections()) {\n const slug = col.slug;\n try {\n data.collections[slug] = {\n slug,\n label: col.label || slug,\n fields: extractFields(col.fields),\n jsonSchema: zodToJsonSchema(registry.getZodSchema(slug), { target: \"openApi3\" }),\n createSchema: zodToJsonSchema(registry.getCreateZodSchema(slug), { target: \"openApi3\" }),\n updateSchema: zodToJsonSchema(registry.getUpdateZodSchema(slug), { target: \"openApi3\" }),\n procedures: {\n find: { collection: slug, where: \"Record<string,any>\", sort: \"string\", limit: \"number\", page: \"number\", depth: \"number\", select: \"string[]\", draft: \"boolean\" },\n findByID: { collection: slug, id: \"string\", depth: \"number\", select: \"string[]\", draft: \"boolean\" },\n create: { collection: slug, data: \"Record<string,any>\", depth: \"number\", select: \"string[]\" },\n update: { collection: slug, id: \"string\", data: \"Record<string,any>\", depth: \"number\", select: \"string[]\", baseUpdatedAt: \"string\" },\n delete: { collection: slug, id: \"string\" },\n count: { collection: slug, where: \"Record<string,any>\" },\n },\n };\n } catch { /* skip collections without schemas */ }\n }\n\n for (const global of registry.getGlobals()) {\n const slug = global.slug;\n try {\n data.globals[slug] = {\n slug,\n label: global.label || slug,\n fields: extractFields(global.fields),\n jsonSchema: zodToJsonSchema(registry.getZodSchema(slug), { target: \"openApi3\" }),\n procedures: {\n get: {},\n update: { data: \"Record<string,any>\" },\n },\n };\n } catch { /* skip globals without schemas */ }\n }\n\n return c.json(data);\n });\n\n // List collections (authenticated)\n app.get(\"/api/collections\", async (c) => {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const collections = registry.getCollections().map((col) => ({\n slug: col.slug,\n label: col.label || col.slug,\n fields: col.fields\n .filter((f) => f.name)\n .map((f) => ({\n name: f.name,\n type: f.type,\n required: f.required,\n label: f.label,\n })),\n }));\n return c.json(collections);\n });\n\n function resolveDocField(fields: any[], doc: any, fieldName: string): any {\n if (fieldName in doc) return doc[fieldName];\n for (const field of fields) {\n if (!field.name) continue;\n if (field.type === \"tabs\" && field.tabs) {\n const data = doc[field.name];\n if (data && typeof data === \"object\" && fieldName in data) return data[fieldName];\n }\n if ((field.type === \"group\" || field.type === \"collapsible\") && field.fields) {\n const data = doc[field.name];\n if (data && typeof data === \"object\") {\n if (fieldName in data) return data[fieldName];\n const nested = resolveDocField(field.fields, data, fieldName);\n if (nested !== undefined) return nested;\n }\n }\n }\n return undefined;\n }\n\n function flattenRelationshipFields(fields: any[]): any[] {\n const relFields: any[] = [];\n for (const field of fields) {\n if (field.type === \"relationship\") {\n relFields.push(field);\n } else if (field.type === \"tabs\" && field.tabs) {\n for (const tab of field.tabs) {\n relFields.push(...flattenRelationshipFields(tab.fields || []));\n }\n } else if ((field.type === \"group\" || field.type === \"collapsible\") && field.fields) {\n relFields.push(...flattenRelationshipFields(field.fields || []));\n }\n }\n return relFields;\n }\n\n function extractRelValue(value: any): string[] {\n if (!value) return [];\n if (typeof value === \"string\") return [value];\n if (Array.isArray(value)) return value.map((v: any) => (typeof v === \"object\" ? v.value ?? v : v));\n if (typeof value === \"object\") {\n const v = value.value ?? value;\n return typeof v === \"string\" ? [v] : Array.isArray(v) ? v : [];\n }\n return [];\n }\n\n async function populateRelationships(\n docs: any[],\n collection: CollectionConfig,\n db: BaseAdapter,\n registry: Registry,\n ): Promise<void> {\n if (docs.length === 0) return;\n const relFields = flattenRelationshipFields(collection.fields);\n if (relFields.length === 0) return;\n\n for (const relField of relFields) {\n const targetSlugs: string[] = Array.isArray(relField.relationTo) ? relField.relationTo : [relField.relationTo];\n const idsBySlug: Record<string, Set<string>> = {};\n\n for (const slug of targetSlugs) {\n idsBySlug[slug] = new Set<string>();\n }\n\n for (const doc of docs) {\n const raw = resolveDocField(collection.fields, doc, relField.name);\n const ids = extractRelValue(raw);\n for (const id of ids) {\n if (!id) continue;\n if (targetSlugs.length === 1) {\n idsBySlug[targetSlugs[0]].add(id);\n } else {\n for (const slug of targetSlugs) {\n idsBySlug[slug].add(id);\n }\n }\n }\n }\n\n for (const [targetSlug, idSet] of Object.entries(idsBySlug)) {\n if (idSet.size === 0) continue;\n const targetCollection = registry.getCollection(targetSlug);\n if (!targetCollection) continue;\n const titleField = targetCollection.admin?.useAsTitle || \"title\";\n\n const idArr = Array.from(idSet);\n const relatedDocs: any[] = [];\n for (const id of idArr) {\n try {\n const relDoc = await db.findByID({ collection: targetSlug, id, draft: true });\n if (relDoc) {\n const title = resolveDocField(targetCollection.fields, relDoc as any, titleField) ?? id;\n relatedDocs.push({ id, title: String(title) });\n }\n } catch {\n relatedDocs.push({ id, title: id });\n }\n }\n\n const titleMap = new Map(relatedDocs.map((d) => [d.id, d.title]));\n\n for (const doc of docs) {\n const raw = resolveDocField(collection.fields, doc, relField.name);\n if (!raw) continue;\n\n const setValue = (val: any) => {\n if (relField.name in doc) {\n doc[relField.name] = val;\n } else {\n for (const f of collection.fields) {\n if (f.type === \"tabs\" && (f as any).tabs) {\n for (const tab of (f as any).tabs) {\n if (tab.fields?.some((tf: any) => tf.name === relField.name)) {\n const tabData = doc[f.name!];\n if (tabData && typeof tabData === \"object\") {\n tabData[relField.name] = val;\n }\n }\n }\n }\n }\n }\n };\n\n if (typeof raw === \"string\") {\n setValue({ id: raw, title: titleMap.get(raw) || raw });\n } else if (Array.isArray(raw)) {\n setValue(raw.map((v: any) => {\n const id = typeof v === \"object\" ? (v.value ?? v.id) : v;\n return { id: id, title: titleMap.get(id) || id };\n }));\n } else if (typeof raw === \"object\") {\n const id = raw.value ?? raw.id;\n setValue({ id, title: titleMap.get(id) || id });\n }\n }\n }\n }\n }\n\n // Global search - searches across all collections, media, and system content\n app.get(\"/api/search\", async (c) => {\n try {\n const query = c.req.query(\"q\") || \"\";\n const collectionsParam = c.req.query(\"collections\") || \"\";\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"10\"), 50);\n\n if (!query || query.length < 2) {\n return c.json({ results: [], message: \"Query too short\" });\n }\n\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const targetCollections = collectionsParam\n ? collectionsParam.split(\",\").filter(Boolean)\n : registry.getCollectionSlugs();\n\n const results: Array<{\n collection: string;\n label: string;\n id: string;\n title: string;\n doc: any;\n }> = [];\n\n const regex = new RegExp(\n query.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n \"i\",\n );\n\n for (const collection of registry.getCollections()) {\n if (!targetCollections.includes(collection.slug)) continue;\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) continue;\n\n const searchableFields = collection.fields\n .filter(\n (f) =>\n f.name &&\n f.name !== \"id\" &&\n (f.type === \"text\" ||\n f.type === \"email\" ||\n f.type === \"textarea\" ||\n f.type === \"richtext\" ||\n f.indexed) &&\n !f.admin?.hidden,\n )\n .map((f) => f.name!);\n\n if (searchableFields.length === 0) continue;\n\n try {\n const orConditions: Record<string, any>[] = searchableFields.map(\n (field) => {\n const condition: Record<string, any> = {};\n condition[field] = { like: `%${query}%` };\n return condition;\n },\n );\n\n const searchResult = await db.find({\n collection: collection.slug,\n where: { OR: orConditions },\n limit,\n tenantID: ctxTenantID,\n });\n\n await populateRelationships(searchResult.docs as any[], collection, db as BaseAdapter, registry);\n\n for (const doc of searchResult.docs as any[]) {\n const titleField =\n collection.admin?.useAsTitle ||\n searchableFields.find(\n (f) =>\n f === \"title\" ||\n f === \"name\" ||\n f === \"heading\" ||\n f === \"slug\",\n );\n const title = titleField ? (resolveDocField(collection.fields, doc, titleField) ?? doc.id) : doc.id;\n\n results.push({\n collection: collection.slug,\n label: collection.label || collection.slug,\n id: doc.id,\n title: String(title || \"Untitled\"),\n doc,\n });\n }\n } catch (err) {\n console.error(`Search error for ${collection.slug}:`, err);\n }\n }\n\n results.sort((a, b) => a.label.localeCompare(b.label));\n\n return c.json({ results });\n } catch (error: any) {\n return c.json({ error: error.message, results: [] }, 500);\n }\n });\n\n // API Key management — requires users:admin permission\n app.get(\"/api/keys\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"50\"), 100);\n console.log(\"[ApiKeys] Querying\", API_KEY_COLLECTION, { page, limit });\n const result = await db.find({ collection: API_KEY_COLLECTION, where: {}, page, limit });\n console.log(\"[ApiKeys] Result:\", result);\n const docs = (result.docs || []).map((doc: any) => ({\n id: doc.id,\n name: doc.name,\n keyPrefix: doc.keyPrefix,\n permissions: doc.permissions || [],\n lastUsed: doc.lastUsedAt,\n createdAt: doc.createdAt,\n }));\n return c.json({ docs, totalDocs: result.totalDocs || docs.length, totalPages: result.totalPages || 1 });\n } catch (error: any) {\n console.error(\"[ApiKeys] GET error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/keys\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const body = await c.req.json();\n if (!body.name || typeof body.name !== \"string\") {\n return c.json({ error: \"name is required\" }, 400);\n }\n const rawKey = generateApiKey();\n const doc = await db.create({\n collection: API_KEY_COLLECTION,\n data: {\n userId: ctxUser.id,\n name: body.name,\n key: rawKey,\n keyPrefix: generateApiKeyPrefix(rawKey),\n permissions: Array.isArray(body.permissions) ? body.permissions : [\"*\"],\n expiresAt: body.expiresAt || null,\n createdAt: new Date().toISOString(),\n },\n });\n await sessionAuthAdapter?.createAuditLog({\n action: \"api_key_create\",\n userId: ctxUser.id,\n resource: \"api_key\",\n resourceId: (doc as any).id,\n success: true,\n metadata: { keyName: body.name },\n });\n return c.json({\n ...(doc as any),\n key: rawKey,\n permissions: Array.isArray(body.permissions) ? body.permissions : [\"*\"],\n }, 201);\n } catch (error: any) {\n console.error(\"[ApiKeys] POST error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/keys/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const id = c.req.param(\"id\");\n const existing = await db.findByID({ collection: API_KEY_COLLECTION, id });\n if (!existing) return c.json({ error: \"API key not found\" }, 404);\n await db.delete({ collection: API_KEY_COLLECTION, id });\n await sessionAuthAdapter?.createAuditLog({\n action: \"api_key_delete\",\n userId: ctxUser.id,\n resource: \"api_key\",\n resourceId: id,\n success: true,\n metadata: { keyName: (existing as any).name },\n });\n return c.json({ message: \"API key deleted\" });\n } catch (error: any) {\n console.error(\"[ApiKeys] DELETE error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PATCH /api/keys/:id — update name / permissions / expires\n app.patch(\"/api/keys/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const existing = await db.findByID({ collection: API_KEY_COLLECTION, id });\n if (!existing) return c.json({ error: \"API key not found\" }, 404);\n const updateData: Record<string, unknown> = {};\n if (typeof body.name === \"string\" && body.name.trim()) updateData.name = body.name.trim();\n if (Array.isArray(body.permissions)) updateData.permissions = body.permissions;\n if (body.expiresAt !== undefined) updateData.expiresAt = body.expiresAt || null;\n if (Object.keys(updateData).length === 0) return c.json({ error: \"Nothing to update\" }, 400);\n const updated = await db.update({ collection: API_KEY_COLLECTION, id, data: updateData });\n return c.json({ ...(updated as any), keyPrefix: (existing as any).keyPrefix });\n } catch (error: any) {\n console.error(\"[ApiKeys] PATCH error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/keys/:id/rotate — regenerate key, keep name/metadata\n app.post(\"/api/keys/:id/rotate\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const id = c.req.param(\"id\");\n const existing = await db.findByID({ collection: API_KEY_COLLECTION, id });\n if (!existing) return c.json({ error: \"API key not found\" }, 404);\n const rawKey = generateApiKey();\n const updated = await db.update({\n collection: API_KEY_COLLECTION,\n id,\n data: {\n key: rawKey,\n keyPrefix: generateApiKeyPrefix(rawKey),\n lastUsedAt: null,\n },\n });\n await sessionAuthAdapter?.createAuditLog({\n action: \"api_key_rotate\",\n userId: ctxUser.id,\n resource: \"api_key\",\n resourceId: id,\n success: true,\n metadata: { keyName: (existing as any).name },\n });\n return c.json({\n ...(updated as any),\n key: rawKey,\n permissions: (existing as any).permissions,\n expiresAt: (existing as any).expiresAt,\n });\n } catch (error: any) {\n console.error(\"[ApiKeys] rotate error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Webhook management — requires users:admin permission\n app.get(\"/api/webhooks\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n \n const webhooks = await webhookService.getWebhooks();\n return c.json({ docs: webhooks });\n } catch (error: any) {\n console.error(\"[Webhooks] GET error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/webhooks\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const body = await c.req.json();\n const webhook = await webhookService.createWebhook(body);\n \n await sessionAuthAdapter?.createAuditLog({\n action: \"webhook_create\",\n userId: ctxUser.id,\n resource: \"webhook\",\n resourceId: webhook.id,\n success: true,\n metadata: { name: webhook.name, url: webhook.url },\n });\n \n return c.json(webhook, 201);\n } catch (error: any) {\n console.error(\"[Webhooks] POST error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/webhooks/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const webhook = await webhookService.getWebhookById(id);\n if (!webhook) return c.json({ error: \"Webhook not found\" }, 404);\n \n return c.json(webhook);\n } catch (error: any) {\n console.error(\"[Webhooks] GET :id error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.patch(\"/api/webhooks/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const updated = await webhookService.updateWebhook(id, body);\n if (!updated) return c.json({ error: \"Webhook not found\" }, 404);\n \n await sessionAuthAdapter?.createAuditLog({\n action: \"webhook_update\",\n userId: ctxUser.id,\n resource: \"webhook\",\n resourceId: id,\n success: true,\n metadata: { name: updated.name },\n });\n \n return c.json(updated);\n } catch (error: any) {\n console.error(\"[Webhooks] PATCH error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/webhooks/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const existing = await webhookService.getWebhookById(id);\n if (!existing) return c.json({ error: \"Webhook not found\" }, 404);\n \n await webhookService.deleteWebhook(id);\n \n await sessionAuthAdapter?.createAuditLog({\n action: \"webhook_delete\",\n userId: ctxUser.id,\n resource: \"webhook\",\n resourceId: id,\n success: true,\n metadata: { name: existing.name },\n });\n \n return c.json({ message: \"Webhook deleted\" });\n } catch (error: any) {\n console.error(\"[Webhooks] DELETE error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/webhooks/:id/test\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const result = await webhookService.testWebhook(id);\n if (!result) return c.json({ error: \"Webhook not found\" }, 404);\n \n return c.json(result);\n } catch (error: any) {\n console.error(\"[Webhooks] test error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/webhooks/:id/history\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"50\"), 100);\n const history = await webhookService.getDeliveryHistory(id, limit);\n \n return c.json({ docs: history });\n } catch (error: any) {\n console.error(\"[Webhooks] history error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Dynamic collection routes\n const collections = registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\n\n if (slug === \"users\" || slug === \"audit_logs\") continue;\n\n const basePath = `/api/${slug}`;\n\n // GET /api/:collection - List\n app.get(basePath, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const url = new URL(c.req.url);\n const page = parseInt(url.searchParams.get(\"page\") || \"1\");\n const limit = Math.min(parseInt(url.searchParams.get(\"limit\") || \"10\"), 100);\n const sort = url.searchParams.get(\"sort\") || undefined;\n const depth = parseInt(url.searchParams.get(\"depth\") || \"0\");\n const select = url.searchParams.get(\"select\")?.split(\",\") || undefined;\n const isDraftRequest = !!ctxUser;\n\n const result = await db.find({\n collection: slug,\n where: {},\n sort,\n limit,\n page,\n depth,\n tenantID: ctxTenantID,\n select,\n draft: isDraftRequest,\n });\n\n await populateRelationships(result.docs as any[], collection, db as BaseAdapter, registry);\n\n return c.json(result);\n } catch (error: any) {\n console.error(\"[API] list error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/:collection/:id/versions - List/compare versions\n app.get(`${basePath}/:id/versions`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n if (!id) {\n return c.json({ error: \"Missing document ID\" }, 400);\n }\n const url = new URL(c.req.url);\n const compareA = url.searchParams.get(\"compareA\");\n const compareB = url.searchParams.get(\"compareB\");\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, `${basePath}/${id}/versions`, \"GET\", c.req.raw);\n\n // Compare two versions\n if (compareA && compareB) {\n const [versionA, versionB] = await Promise.all([\n db.findVersionByID({ collection: slug, versionId: compareA, tenantID: ctxTenantID }),\n db.findVersionByID({ collection: slug, versionId: compareB, tenantID: ctxTenantID }),\n ]);\n if (!versionA || !versionB) {\n return c.json({ error: \"Version not found\" }, 404);\n }\n const diffs = computeDiff(versionA.data, versionB.data);\n return c.json({ diffs });\n }\n\n const page = parseInt(url.searchParams.get(\"page\") || \"1\");\n const limit = Math.min(parseInt(url.searchParams.get(\"limit\") || \"10\"), 100);\n\n const result = await db.findVersions({\n collection: slug,\n documentId: id,\n page,\n limit,\n tenantID: ctxTenantID,\n });\n\n return c.json(result);\n } catch (error: any) {\n console.error(\"[API] versions error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(`${basePath}/:id/draft`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const draft = await db.findDraft({\n collection: slug,\n documentId: c.req.param(\"id\"),\n tenantID: ctxTenantID,\n });\n\n return c.json({ data: draft });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.put(`${basePath}/:id/draft`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const baseUpdatedAt = readBaseUpdatedAt(body);\n\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n let finalData;\n if (body.delta) {\n finalData = { ...originalDoc, ...body.delta };\n } else {\n finalData = body.data ?? omitRevisionFields(body);\n }\n\n const draft = await db.upsertDraft({\n collection: slug,\n documentId: id,\n tenantID: ctxTenantID,\n data: finalData,\n baseUpdatedAt,\n draftUpdatedAt: body.draftUpdatedAt,\n });\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_update\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: id,\n success: true,\n metadata: { type: \"draft_save\" }\n });\n }\n return c.json({ data: draft, message: \"Draft saved successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(`${basePath}/:id/draft`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n await db.deleteDraft({\n collection: slug,\n documentId: c.req.param(\"id\"),\n tenantID: ctxTenantID,\n });\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_update\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: c.req.param(\"id\"),\n success: true,\n metadata: { type: \"draft_discard\" }\n });\n }\n return c.json({ message: \"Draft discarded successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n function computeDiff(a: Record<string, any>, b: Record<string, any>): { field: string; oldValue: any; newValue: any }[] {\n const diffs: { field: string; oldValue: any; newValue: any }[] = [];\n const allKeys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const key of allKeys) {\n if (key === \"id\" || key === \"createdAt\" || key === \"updatedAt\") continue;\n if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) {\n diffs.push({ field: key, oldValue: key in a ? a[key] : undefined, newValue: key in b ? b[key] : undefined });\n }\n }\n return diffs;\n }\n\n // GET /api/:collection/:id - Find by ID\n app.get(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const url = new URL(c.req.url);\n const depth = parseInt(url.searchParams.get(\"depth\") || \"0\");\n const select = url.searchParams.get(\"select\")?.split(\",\") || undefined;\n // Admin always sees the current doc state regardless of publish status\n const isDraftRequest = !!ctxUser;\n\n let doc = await db.findByID({\n collection: slug,\n id,\n depth,\n tenantID: ctxTenantID,\n select,\n draft: isDraftRequest,\n });\n\n // Fallback to slug lookup if ID lookup fails and collection has a slug field\n if (!doc && collection.fields.some((f: any) => f.name === \"slug\")) {\n doc = await db.findOne({\n collection: slug,\n where: { slug: id },\n tenantID: ctxTenantID,\n draft: isDraftRequest,\n });\n }\n\n if (!doc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n await populateRelationships([doc as any], collection, db as BaseAdapter, registry);\n\n return c.json({ data: doc });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/:collection - Create\n app.post(basePath, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, basePath, \"POST\", c.req.raw);\n\n const body = await c.req.json();\n let validated = body;\n\n // Convert empty strings to null for non-textual field types\n for (const field of collection.fields) {\n if (field.name && validated[field.name] === \"\") {\n const isTextual = field.type === 'text' || field.type === 'textarea' || field.type === 'code' || field.type === 'markdown' || field.type === 'email' || field.type === 'password' || field.type === 'color';\n if (!isTextual) {\n validated[field.name] = null;\n }\n }\n }\n\n // Convert legacy string values to richtext format; unwrap TipTap doc objects\n convertRichtextFields(collection.fields, validated);\n\n const hookReq = c.req.raw as unknown as KyroRequest;\n\n if (collection.hooks?.beforeValidate) {\n for (const hook of collection.hooks.beforeValidate) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"create\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n const schema = registry.getCreateZodSchema(slug);\n try {\n validated = schema.parse(validated);\n } catch (zodErr: any) {\n return c.json({ error: `Validation failed: ${formatZodErrors(zodErr.errors)}`, details: zodErr.errors }, 400);\n }\n\n if (collection.tenantScoped && ctxTenantID) {\n validated.tenantID = ctxTenantID;\n }\n\n const isDraftEnabled = collection.versions?.drafts === true;\n if (isDraftEnabled) {\n validated.publishStatus = 'draft';\n validated.hasDraft = false;\n }\n\n if (collection.hooks?.beforeChange) {\n for (const hook of collection.hooks.beforeChange) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"create\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n const doc = await db.create({\n collection: slug,\n data: validated,\n tenantID: ctxTenantID,\n });\n\n if (collection.hooks?.afterChange) {\n for (const hook of collection.hooks.afterChange) {\n await hook({\n collection: slug,\n doc,\n data: validated,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"create\",\n });\n }\n }\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"create\"), {\n collection: slug,\n operation: \"create\",\n data: doc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_create\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: (doc as any).id,\n success: true,\n });\n }\n return c.json({ data: doc, message: \"Created successfully\" }, 201);\n } catch (error: any) {\n if (error.name === \"ZodError\") {\n return c.json(\n { error: `Validation failed: ${formatZodErrors(error.errors)}`, details: error.errors },\n 400,\n );\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PATCH /api/:collection/:id - Update\n app.patch(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const baseUpdatedAt = readBaseUpdatedAt(body);\n\n console.log(`[PATCH] ${slug}/${id}`, {\n baseUpdatedAt,\n bodyKeys: Object.keys(body),\n tenantID: ctxTenantID\n });\n\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n if (baseUpdatedAt && originalDoc.updatedAt && baseUpdatedAt !== originalDoc.updatedAt) {\n return c.json(buildConflictResponse(baseUpdatedAt, originalDoc), 409);\n }\n\n let validated = Object.fromEntries(\n Object.entries(omitRevisionFields(body)).filter(\n ([_, v]) => v !== \"null\" && v !== undefined,\n ),\n );\n\n // Convert empty strings to null for non-textual field types\n // (PostgreSQL rejects '' for timestamp, jsonb, decimal, boolean columns)\n for (const field of collection.fields) {\n if (field.name && validated[field.name] === \"\") {\n const isTextual = field.type === 'text' || field.type === 'textarea' || field.type === 'code' || field.type === 'markdown' || field.type === 'email' || field.type === 'password' || field.type === 'color';\n if (!isTextual) {\n validated[field.name] = null;\n }\n }\n }\n\n // Convert legacy string values to richtext format; unwrap TipTap doc objects\n convertRichtextFields(collection.fields, validated);\n\n const hookReq = c.req.raw as unknown as KyroRequest;\n\n if (collection.hooks?.beforeValidate) {\n for (const hook of collection.hooks.beforeValidate) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"update\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n const schema = registry.getUpdateZodSchema(slug);\n validated = schema.parse(validated);\n\n if (collection.hooks?.beforeChange) {\n for (const hook of collection.hooks.beforeChange) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"update\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n console.log(`[PATCH] Validated data:`, Object.keys(validated));\n\n const isDraftEnabled = collection.versions?.drafts === true;\n const isAlreadyPublished = originalDoc.publishStatus === 'published';\n\n let doc;\n if (isDraftEnabled && isAlreadyPublished) {\n // Non-destructive draft: Create version but don't overwrite main doc data\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: validated,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save (Draft)',\n tenantID: ctxTenantID,\n });\n\n // Mark main doc as having a draft\n await db.update({\n collection: slug,\n id,\n data: { hasDraft: true }, // Keep old data, just set flag\n tenantID: ctxTenantID,\n });\n } else {\n // Destructive save or first-time draft\n const saveData = isDraftEnabled\n ? { ...validated, publishStatus: 'draft', hasDraft: false }\n : validated;\n\n console.log(`[PATCH] About to call db.update for ${slug}/${id} with keys:`, Object.keys(saveData));\n await db.update({\n collection: slug,\n id,\n data: saveData,\n tenantID: ctxTenantID,\n });\n console.log(`[PATCH] db.update SUCCEEDED for ${slug}/${id}`);\n }\n\n // Refetch with draft: true to ensure we return the latest merged data\n doc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (isDraftEnabled) {\n if (!isAlreadyPublished) {\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: validated,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save',\n tenantID: ctxTenantID,\n });\n }\n } else {\n await db.deleteDraft({\n collection: slug,\n documentId: id,\n tenantID: ctxTenantID,\n });\n }\n\n if (collection.hooks?.afterChange) {\n for (const hook of collection.hooks.afterChange) {\n await hook({\n collection: slug,\n doc,\n data: validated,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"update\",\n });\n }\n }\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"update\"), {\n collection: slug,\n operation: \"update\",\n data: doc,\n previousData: originalDoc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, `${basePath}/${id}`, \"PATCH\", c.req.raw);\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_update\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: id,\n success: true,\n });\n }\n return c.json({ data: doc, message: isDraftEnabled ? \"Draft saved\" : \"Updated successfully\" });\n } catch (error: any) {\n if (error.name === \"ZodError\") {\n console.error(`[PATCH ${basePath}/:id] Validation failed:`, error.errors);\n return c.json(\n { error: `Validation failed: ${formatZodErrors(error.errors)}`, details: error.errors },\n 400,\n );\n }\n console.error(`[PATCH ${basePath}/:id] ERROR:`, error.message, `CAUSE:`, error.cause?.message || error.cause, `QUERY:`, error.query);\n return c.json({ error: error.message }, 500);\n }\n });\n\n// DELETE /api/:collection/:id - Delete\napp.delete(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"delete\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const id = c.req.param(\"id\");\n console.log(`[DELETE] Deleting ${slug}/${id}`);\n\n const hookReq = c.req.raw as unknown as KyroRequest;\n\n const originalDoc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n if (collection.hooks?.beforeDelete) {\n for (const hook of collection.hooks.beforeDelete) {\n await hook({\n collection: slug,\n doc: originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"delete\",\n });\n }\n }\n\n const doc = await db.delete({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n await db.deleteDraft({\n collection: slug,\n documentId: id,\n tenantID: ctxTenantID,\n });\n\n if (collection.hooks?.afterDelete) {\n for (const hook of collection.hooks.afterDelete) {\n await hook({\n collection: slug,\n doc,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"delete\",\n });\n }\n }\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"delete\"), {\n collection: slug,\n operation: \"delete\",\n data: doc,\n previousData: originalDoc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, `${basePath}/${id}`, \"DELETE\", c.req.raw);\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_delete\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: id,\n success: true,\n });\n }\n return c.json({ data: doc, message: \"Deleted successfully\" });\n } catch (error: any) {\n console.error(`[DELETE] Error deleting ${slug}:`, error);\n return c.json({ error: error.message || String(error) }, 500);\n }\n});\n\n// POST /api/:collection/:id/duplicate - Duplicate document\napp.post(`${basePath}/:id/duplicate`, async (c) => {\n try {\n console.log(`[Duplicate] Request for ${slug}`);\n\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n console.log(\"[Duplicate] Access denied:\", access.error);\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n console.log(`[Duplicate] ID: ${id}`);\n\n // Get the original document\n const originalDoc = await db.findByID<any>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n console.log(\"[Duplicate] Document not found\");\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n console.log(`[Duplicate] Original doc:`, originalDoc);\n\n // Create a copy with new ID and modified slug\n const { id: _oldId, createdAt: _oldCreated, updatedAt: _oldUpdated, ...docData } = originalDoc as any;\n\n // Generate new slug - ensure it's unique\n const timestamp = Date.now().toString(36);\n const newSlug = `${originalDoc.slug || \"document\"}-copy-${timestamp}`;\n\n console.log(`[Duplicate] New slug: ${newSlug}`);\n\n // Create the duplicate\n const newDoc = await db.create({\n collection: slug,\n data: {\n ...docData,\n slug: newSlug,\n status: \"draft\",\n },\n tenantID: ctxTenantID,\n });\n\n console.log(`[Duplicate] Created successfully:`, (newDoc as any).id);\n return c.json({ data: newDoc, message: \"Document duplicated successfully\" });\n } catch (error: any) {\n console.error(\"[Duplicate] Error:\", error);\n return c.json({ error: error.message || String(error) }, 500);\n }\n});\n\n// POST /api/:collection/:id/versions/:versionId/restore - Restore version (RESTful)\napp.post(`${basePath}/:id/versions/:versionId/restore`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const versionId = c.req.param(\"versionId\");\n\n const version = await db.findVersionByID({\n collection: slug,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) {\n return c.json({ error: \"Version not found\" }, 404);\n }\n\n const doc = await db.update({\n collection: slug,\n id,\n data: { ...version.data, publishStatus: 'draft', hasDraft: false },\n tenantID: ctxTenantID,\n });\n\n return c.json({\n data: doc,\n message: \"Version restored successfully\",\n });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n\n// POST /api/:collection/:id/versions - Restore version (Legacy)\napp.post(`${basePath}/:id/versions`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = await c.req.json();\n const { versionId, action } = body;\n\n if (action === \"restore\" && versionId) {\n const version = await db.findVersionByID({\n collection: slug,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) {\n return c.json({ error: \"Version not found\" }, 404);\n }\n\n const doc = await db.update({\n collection: slug,\n id: c.req.param(\"id\"),\n data: { ...version.data, publishStatus: 'draft', hasDraft: false },\n tenantID: ctxTenantID,\n });\n\n return c.json({\n data: doc,\n message: \"Version restored successfully\",\n });\n }\n\n return c.json({ error: \"Invalid action\" }, 400);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n\n// POST /api/:collection/:id/publish - Publish document\napp.post(`${basePath}/:id/publish`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json().catch(() => ({}));\n const baseUpdatedAt = readBaseUpdatedAt(body);\n\n // Fetch the current doc regardless of status (bypass public filter)\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n if (baseUpdatedAt && originalDoc.updatedAt && baseUpdatedAt !== originalDoc.updatedAt) {\n return c.json(buildConflictResponse(baseUpdatedAt, originalDoc), 409);\n }\n\n // Determine what data to publish\n let publishData = { publishStatus: 'published', hasDraft: false };\n let finalContent = originalDoc;\n\n if (originalDoc.hasDraft) {\n // Pull latest data from version history\n const versions = await db.findVersions({\n collection: slug,\n documentId: id,\n limit: 1,\n sort: '-createdAt',\n tenantID: ctxTenantID,\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n finalContent = { ...originalDoc, ...versions.docs[0].data };\n publishData = { ...versions.docs[0].data, ...publishData };\n }\n }\n\n // Update main doc\n const doc = await db.update({\n collection: slug,\n id,\n data: publishData,\n tenantID: ctxTenantID,\n });\n\n // Create a formal 'published' version record\n if (collection.versions?.drafts) {\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: { ...finalContent, publishStatus: 'published' },\n status: 'published',\n createdBy: ctxUser?.id,\n changeDescription: 'Published',\n tenantID: ctxTenantID,\n });\n }\n\n // Clear the ephemeral autosave draft\n await db.deleteDraft({\n collection: slug,\n documentId: id,\n tenantID: ctxTenantID,\n });\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"update\"), {\n collection: slug,\n operation: \"update\",\n data: doc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n return c.json({ data: doc, message: \"Published successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n\n// POST /api/:collection/:id/unpublish - Unpublish document\napp.post(`${basePath}/:id/unpublish`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n // Fetch current doc bypassing status filter\n const currentDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n if (!currentDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n const doc = await db.update({\n collection: slug,\n id,\n data: { publishStatus: 'draft' },\n tenantID: ctxTenantID,\n });\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"update\"), {\n collection: slug,\n operation: \"update\",\n data: doc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n return c.json({ data: doc, message: \"Unpublished successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n }\n\n// Dynamic global routes\nfor (const globalConfig of registry.getGlobals()) {\n const slug = globalConfig.slug;\n const basePath = `/api/globals/${slug}`;\n\n // GET /api/globals/:slug\n app.get(basePath, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const isDraftRequest = c.req.query(\"draft\") === \"true\" && !!ctxUser;\n\n let doc = await db.findOne({\n collection: `_globals_${slug}`,\n where: {},\n tenantID: ctxTenantID,\n draft: isDraftRequest,\n });\n\n if (slug === \"system\") {\n const newSecret = crypto.randomBytes(32).toString(\"hex\");\n if (!doc) {\n doc = await db.create({\n collection: `_globals_${slug}`,\n data: { id: slug, appSecret: newSecret },\n tenantID: ctxTenantID,\n });\n } else if (!doc.appSecret) {\n await db.update({\n collection: `_globals_${slug}`,\n id: slug,\n data: { appSecret: newSecret },\n tenantID: ctxTenantID,\n });\n doc.appSecret = newSecret;\n }\n }\n\n return c.json({ data: doc || {} });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST & PATCH /api/globals/:slug - Update\n const upsertGlobal = async (c: any) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = omitRevisionFields(await c.req.json());\n const cleaned = Object.fromEntries(\n Object.entries(body).filter(([_, v]) => v !== null && v !== \"null\" && v !== undefined),\n );\n\n // Convert empty strings to null for non-textual field types\n for (const field of globalConfig.fields) {\n if (field.name && cleaned[field.name] === \"\") {\n const isTextual = field.type === 'text' || field.type === 'textarea' || field.type === 'code' || field.type === 'markdown' || field.type === 'email' || field.type === 'password' || field.type === 'color';\n if (!isTextual) {\n cleaned[field.name] = null;\n }\n }\n }\n\n // Convert legacy string values to richtext format; unwrap TipTap doc objects\n convertRichtextFields(globalConfig.fields, cleaned);\n\n const schema = registry.getZodSchema(slug);\n\n let validated;\n try {\n validated = schema.parse(cleaned);\n } catch (zodErr: any) {\n return c.json({ error: `Validation failed: ${formatZodErrors(zodErr.errors)}`, details: zodErr.errors }, 400);\n }\n\n // Strip system-managed fields — they are auto-set by the database\n const SYSTEM_FIELDS = new Set([\"id\", \"createdAt\", \"updatedAt\", \"publishStatus\", \"hasDraft\", \"baseUpdatedAt\", \"_baseUpdatedAt\"]);\n const userData = Object.fromEntries(\n Object.entries(validated).filter(([k]) => !SYSTEM_FIELDS.has(k)),\n );\n\n const collectionSlug = `_globals_${slug}`;\n const originalDoc = await db.findOne({\n collection: collectionSlug,\n where: {},\n tenantID: ctxTenantID,\n draft: true,\n });\n\n const isDraftEnabled = globalConfig.versions?.drafts === true;\n const isAlreadyPublished = originalDoc?.publishStatus === 'published';\n\n let doc;\n if (isDraftEnabled && isAlreadyPublished) {\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: userData,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save (Draft)',\n tenantID: ctxTenantID,\n });\n\n doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: { hasDraft: true },\n tenantID: ctxTenantID,\n });\n } else {\n const saveData = isDraftEnabled\n ? { ...userData, publishStatus: 'draft', hasDraft: false }\n : { ...userData, publishStatus: 'published', hasDraft: false };\n\n if (originalDoc) {\n doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: saveData,\n tenantID: ctxTenantID,\n });\n } else {\n doc = await db.create({\n collection: collectionSlug,\n data: { ...saveData, id: slug },\n tenantID: ctxTenantID,\n });\n }\n\n if (isDraftEnabled) {\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: userData,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save',\n tenantID: ctxTenantID,\n });\n }\n }\n\n if (slug === \"storage-settings\") {\n mediaService = null;\n mediaServiceInitError = null;\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"settings_change\",\n userId: ctxUser.id,\n resource: `global:${slug}`,\n resourceId: slug,\n success: true,\n });\n }\n return c.json({ data: doc, message: \"Updated successfully\" });\n } catch (error: any) {\n console.error(`[API] Save global \"${slug}\" failed:`, error);\n return c.json({\n error: error.message || \"Save failed\",\n stack: process.env.NODE_ENV === 'development' ? error.stack : undefined\n }, 500);\n }\n };\n\n app.post(basePath, upsertGlobal);\n app.patch(basePath, upsertGlobal);\n\n // POST /api/globals/:slug/publish\n app.post(`${basePath}/publish`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"update\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const collectionSlug = `_globals_${slug}`;\n const originalDoc = await db.findOne({\n collection: collectionSlug,\n where: {},\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) return c.json({ error: \"Global not found\" }, 404);\n\n let publishData = { publishStatus: 'published', hasDraft: false };\n let finalContent = originalDoc;\n\n if (originalDoc.hasDraft) {\n const versions = await db.findVersions({\n collection: collectionSlug,\n documentId: slug,\n limit: 1,\n sort: '-createdAt',\n tenantID: ctxTenantID,\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n finalContent = { ...originalDoc, ...versions.docs[0].data };\n publishData = { ...versions.docs[0].data, ...publishData };\n }\n }\n\n const doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: publishData,\n tenantID: ctxTenantID,\n });\n\n if (globalConfig.versions?.drafts) {\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: { ...finalContent, publishStatus: 'published' },\n status: 'published',\n createdBy: ctxUser?.id,\n changeDescription: 'Published',\n tenantID: ctxTenantID,\n });\n }\n\n return c.json({ data: doc, message: \"Published successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/globals/:slug/unpublish\n app.post(`${basePath}/unpublish`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"update\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const doc = await db.update({\n collection: `_globals_${slug}`,\n id: slug,\n data: { publishStatus: 'draft', hasDraft: false },\n tenantID: ctxTenantID,\n });\n\n return c.json({ data: doc, message: \"Unpublished successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/globals/:slug/versions\n app.get(`${basePath}/versions`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"read\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const limit = parseInt(c.req.query(\"limit\") || \"10\");\n const page = parseInt(c.req.query(\"page\") || \"1\");\n\n const versions = await db.findVersions({\n collection: `_globals_${slug}`,\n documentId: slug,\n limit,\n page,\n tenantID: ctxTenantID,\n });\n\n return c.json(versions);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/globals/:slug/versions/:id\n app.get(`${basePath}/versions/:versionId`, async (c) => {\n try {\n const versionId = c.req.param(\"versionId\");\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"read\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const version = await db.findVersionByID({\n collection: `_globals_${slug}`,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) return c.json({ error: \"Version not found\" }, 404);\n return c.json({ data: version });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/globals/:slug/versions/:id/restore\n app.post(`${basePath}/versions/:versionId/restore`, async (c) => {\n try {\n const versionId = c.req.param(\"versionId\");\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"update\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const collectionSlug = `_globals_${slug}`;\n const version = await db.findVersionByID({\n collection: collectionSlug,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) return c.json({ error: \"Version not found\" }, 404);\n\n const doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: { ...version.data, publishStatus: 'draft', hasDraft: false },\n tenantID: ctxTenantID,\n });\n\n return c.json({ data: doc, message: \"Restored successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Special handler for email settings test\n if (slug === \"email-settings\") {\n app.post(`${basePath}/test`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json(\n { error: access.error },\n (access.status || 403) as any,\n );\n }\n\n const body = await c.req.json();\n\n // Map the raw body to the EmailConfig structure\n // AutoForm sends the same structure as defined in email.ts\n const transportConfig: any = {\n provider: body.provider,\n from: body.fromEmail || body.from,\n fromName: body.fromName,\n replyTo: body.replyTo,\n smtp: body.smtp\n ? {\n host: body.smtp.host,\n port: body.smtp.port,\n secure: body.smtp.secure,\n auth: {\n user: body.smtp.username || body.smtp.user,\n pass: body.smtp.password || body.smtp.pass,\n },\n }\n : undefined,\n resend: body.resend,\n sendgrid: body.sendgrid,\n mailgun: body.mailgun,\n ses: body.ses,\n };\n\n const transport = new EmailTransport(transportConfig);\n\n // Attempt to send a test email\n // The recipient is taken from the form body (testEmailSection.testEmail or testEmail)\n const recipient =\n body.testEmail ||\n (body.testEmailSection && body.testEmailSection.testEmail);\n\n if (!recipient) {\n return c.json({ error: \"No test recipient email provided\" }, 400);\n }\n\n await transport.send({\n to: recipient,\n subject: \"Kyro CMS - Test Email\",\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e2e8f0; border-radius: 8px;\">\n <h1 style=\"color: #0b1222; margin-bottom: 16px;\">Success! 🚀</h1>\n <p style=\"font-size: 16px; color: #334155; line-height: 1.6;\">\n Your email settings in <b>Kyro CMS</b> are working correctly.\n </p>\n <div style=\"background: #f8fafc; padding: 16px; border-radius: 6px; margin: 24px 0;\">\n <p style=\"margin: 0; font-size: 14px; color: #64748b;\">\n <b>Provider:</b> ${body.provider.toUpperCase()}\n </p>\n <p style=\"margin: 8px 0 0; font-size: 14px; color: #64748b;\">\n <b>Sent at:</b> ${new Date().toLocaleString()}\n </p>\n </div>\n <p style=\"font-size: 12px; color: #94a3b8; margin-top: 32px; border-top: 1px solid #f1f5f9; padding-top: 16px;\">\n This is a test email sent from the Kyro CMS Admin Panel.\n </p>\n </div>\n `,\n text: `Success! Your email settings in Kyro CMS are working correctly.\\n\\nProvider: ${body.provider}\\nSent at: ${new Date().toLocaleString()}`,\n });\n\n return c.json({ message: \"Test email sent successfully!\" });\n } catch (error: any) {\n console.error(\"[Email Test] Failed:\", error);\n return c.json(\n { error: error.message || \"Failed to send test email\" },\n 500,\n );\n }\n });\n }\n}\n\nreturn app;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createRESTAPI(\n registry: Registry,\n db: BaseAdapter,\n options?: {\n authSecret?: string;\n user?: User;\n req?: Request;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n webhookService?: ReturnType<typeof createWebhookService>;\n },\n): Hono {\n return createHonoApp({\n registry,\n db,\n authSecret: options?.authSecret,\n user: options?.user,\n req: options?.req,\n tenantID: options?.tenantID,\n cors: options?.cors,\n webhookService: options?.webhookService,\n });\n}\n"]}
|