@riverbankcms/sdk 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +54 -0
  2. package/dist/client/bookings.d.mts +2 -0
  3. package/dist/client/bookings.d.ts +2 -0
  4. package/dist/client/bookings.js +2956 -104
  5. package/dist/client/bookings.js.map +1 -1
  6. package/dist/client/bookings.mjs +2929 -70
  7. package/dist/client/bookings.mjs.map +1 -1
  8. package/dist/client/client.d.mts +2 -2
  9. package/dist/client/client.d.ts +2 -2
  10. package/dist/client/client.js +80 -11
  11. package/dist/client/client.js.map +1 -1
  12. package/dist/client/client.mjs +87 -11
  13. package/dist/client/client.mjs.map +1 -1
  14. package/dist/client/hooks.d.mts +2 -2
  15. package/dist/client/hooks.d.ts +2 -2
  16. package/dist/client/rendering/client.js +3070 -259
  17. package/dist/client/rendering/client.js.map +1 -1
  18. package/dist/client/rendering/client.mjs +3212 -395
  19. package/dist/client/rendering/client.mjs.map +1 -1
  20. package/dist/client/spam-protection.d.mts +55 -0
  21. package/dist/client/spam-protection.d.ts +55 -0
  22. package/dist/client/spam-protection.js +2915 -0
  23. package/dist/client/spam-protection.js.map +1 -0
  24. package/dist/client/spam-protection.mjs +2893 -0
  25. package/dist/client/spam-protection.mjs.map +1 -0
  26. package/dist/client/{usePage-Db9kzA41.d.ts → usePage-BYmJCCm1.d.ts} +14 -2
  27. package/dist/client/{usePage-C9tJpuKa.d.mts → usePage-DZtrWajy.d.mts} +14 -2
  28. package/dist/server/{Layout-Ce7PU9I5.d.ts → Layout-Yluyb6sK.d.ts} +1 -1
  29. package/dist/server/{Layout-WllR8Zug.d.mts → Layout-qWLdVm5-.d.mts} +1 -1
  30. package/dist/server/chunk-2IZ6S225.js +122 -0
  31. package/dist/server/chunk-2IZ6S225.js.map +1 -0
  32. package/dist/server/chunk-4CV4JOE5.js +27 -0
  33. package/dist/server/chunk-4CV4JOE5.js.map +1 -0
  34. package/dist/server/{chunk-AET56TQX.mjs → chunk-5LRR64Y6.mjs} +32 -5
  35. package/dist/server/chunk-5LRR64Y6.mjs.map +1 -0
  36. package/dist/server/{chunk-VODFQMUW.js → chunk-NBTRDLCM.js} +32 -5
  37. package/dist/server/chunk-NBTRDLCM.js.map +1 -0
  38. package/dist/server/chunk-NFEGQTCC.mjs +27 -0
  39. package/dist/server/{chunk-5JT452F2.mjs → chunk-NFQLH5IA.mjs} +340 -19
  40. package/dist/server/chunk-NFQLH5IA.mjs.map +1 -0
  41. package/dist/server/chunk-PPHZV6YD.mjs +122 -0
  42. package/dist/server/chunk-PPHZV6YD.mjs.map +1 -0
  43. package/dist/server/{chunk-HMENX4Y7.js → chunk-VLXTNB2C.js} +370 -49
  44. package/dist/server/chunk-VLXTNB2C.js.map +1 -0
  45. package/dist/server/{components-RPzRQve6.d.mts → components-DNHfSCML.d.mts} +3 -3
  46. package/dist/server/{components--LT61IKp.d.ts → components-Di5ME6He.d.ts} +3 -3
  47. package/dist/server/components.d.mts +5 -5
  48. package/dist/server/components.d.ts +5 -5
  49. package/dist/server/components.js +1 -0
  50. package/dist/server/components.js.map +1 -1
  51. package/dist/server/components.mjs +1 -0
  52. package/dist/server/config-validation.js +1 -0
  53. package/dist/server/config-validation.js.map +1 -1
  54. package/dist/server/config-validation.mjs +1 -0
  55. package/dist/server/config.js +1 -0
  56. package/dist/server/config.js.map +1 -1
  57. package/dist/server/config.mjs +1 -0
  58. package/dist/server/config.mjs.map +1 -1
  59. package/dist/server/data.d.mts +2 -2
  60. package/dist/server/data.d.ts +2 -2
  61. package/dist/server/data.js +1 -0
  62. package/dist/server/data.js.map +1 -1
  63. package/dist/server/data.mjs +1 -0
  64. package/dist/server/env.d.mts +91 -5
  65. package/dist/server/env.d.ts +91 -5
  66. package/dist/server/env.js +9 -2
  67. package/dist/server/env.js.map +1 -1
  68. package/dist/server/env.mjs +8 -1
  69. package/dist/server/{index-BL66CU6d.d.mts → index--Oyunk_B.d.mts} +2 -2
  70. package/dist/server/{index-CJk9iQQW.d.ts → index-C9Ra8dza.d.ts} +2 -2
  71. package/dist/server/{index-Bkva0WAj.d.mts → index-Clm3skz_.d.mts} +1 -1
  72. package/dist/server/{index-CSBWKA3r.d.ts → index-DLvNddi-.d.ts} +1 -1
  73. package/dist/server/index.d.mts +215 -4
  74. package/dist/server/index.d.ts +215 -4
  75. package/dist/server/index.js +301 -3
  76. package/dist/server/index.js.map +1 -1
  77. package/dist/server/index.mjs +301 -3
  78. package/dist/server/index.mjs.map +1 -1
  79. package/dist/server/{loadContent-CXUWMuzY.d.ts → loadContent-D7LQwI0o.d.ts} +3 -3
  80. package/dist/server/{loadContent-F_tAS0Nl.d.mts → loadContent-DVfuBLiZ.d.mts} +3 -3
  81. package/dist/server/{loadPage-6I7F6GRF.js → loadPage-AXNAERDS.js} +2 -1
  82. package/dist/server/loadPage-AXNAERDS.js.map +1 -0
  83. package/dist/server/{loadPage-i2r-X5b9.d.ts → loadPage-BmYJCe_V.d.ts} +2 -2
  84. package/dist/server/{loadPage-CxlYLe5K.d.mts → loadPage-BucnLHmE.d.mts} +2 -2
  85. package/dist/server/{loadPage-JI2SML4M.mjs → loadPage-XR7ORQ2E.mjs} +2 -1
  86. package/dist/server/loadPage-XR7ORQ2E.mjs.map +1 -0
  87. package/dist/server/metadata.d.mts +4 -4
  88. package/dist/server/metadata.d.ts +4 -4
  89. package/dist/server/metadata.js +1 -0
  90. package/dist/server/metadata.js.map +1 -1
  91. package/dist/server/metadata.mjs +1 -0
  92. package/dist/server/navigation.d.mts +2 -2
  93. package/dist/server/navigation.d.ts +2 -2
  94. package/dist/server/navigation.js +1 -0
  95. package/dist/server/navigation.js.map +1 -1
  96. package/dist/server/navigation.mjs +1 -0
  97. package/dist/server/next/revalidate.js +5 -4
  98. package/dist/server/next/revalidate.js.map +1 -1
  99. package/dist/server/next/revalidate.mjs +3 -2
  100. package/dist/server/next/revalidate.mjs.map +1 -1
  101. package/dist/server/next/tags.d.mts +3 -0
  102. package/dist/server/next/tags.d.ts +3 -0
  103. package/dist/server/next/tags.js +3 -1
  104. package/dist/server/next/tags.js.map +1 -1
  105. package/dist/server/next/tags.mjs +2 -0
  106. package/dist/server/next/tags.mjs.map +1 -1
  107. package/dist/server/next.d.mts +5 -5
  108. package/dist/server/next.d.ts +5 -5
  109. package/dist/server/next.js +5 -4
  110. package/dist/server/next.js.map +1 -1
  111. package/dist/server/next.mjs +3 -2
  112. package/dist/server/next.mjs.map +1 -1
  113. package/dist/server/rendering/server.d.mts +4 -4
  114. package/dist/server/rendering/server.d.ts +4 -4
  115. package/dist/server/rendering/server.js +1 -0
  116. package/dist/server/rendering/server.js.map +1 -1
  117. package/dist/server/rendering/server.mjs +1 -0
  118. package/dist/server/rendering.d.mts +7 -7
  119. package/dist/server/rendering.d.ts +7 -7
  120. package/dist/server/rendering.js +1 -0
  121. package/dist/server/rendering.js.map +1 -1
  122. package/dist/server/rendering.mjs +1 -0
  123. package/dist/server/routing.d.mts +3 -3
  124. package/dist/server/routing.d.ts +3 -3
  125. package/dist/server/routing.js +4 -2
  126. package/dist/server/routing.js.map +1 -1
  127. package/dist/server/routing.mjs +3 -1
  128. package/dist/server/routing.mjs.map +1 -1
  129. package/dist/server/server.d.mts +5 -5
  130. package/dist/server/server.d.ts +5 -5
  131. package/dist/server/server.js +3 -2
  132. package/dist/server/server.js.map +1 -1
  133. package/dist/server/server.mjs +2 -1
  134. package/dist/server/theme-bridge.js +1 -0
  135. package/dist/server/theme-bridge.js.map +1 -1
  136. package/dist/server/theme-bridge.mjs +1 -0
  137. package/dist/server/theme-bridge.mjs.map +1 -1
  138. package/dist/server/theme.js +3 -1
  139. package/dist/server/theme.js.map +1 -1
  140. package/dist/server/theme.mjs +2 -0
  141. package/dist/server/theme.mjs.map +1 -1
  142. package/dist/server/{types-DnkRh0UL.d.ts → types-BRQyLrQU.d.ts} +14 -2
  143. package/dist/server/{types-Dsu9wsUh.d.mts → types-BSV6Vc-P.d.mts} +2 -2
  144. package/dist/server/{types-MF2AWoKv.d.mts → types-C-LShyIg.d.mts} +14 -2
  145. package/dist/server/{types-CVykEqXN.d.ts → types-Dt98DeYa.d.ts} +2 -2
  146. package/dist/server/webhooks.d.mts +8 -2
  147. package/dist/server/webhooks.d.ts +8 -2
  148. package/dist/server/webhooks.js +3 -2
  149. package/dist/server/webhooks.js.map +1 -1
  150. package/dist/server/webhooks.mjs +2 -1
  151. package/package.json +7 -1
  152. package/dist/client/resolver-BhueZVxZ.d.mts +0 -61
  153. package/dist/client/resolver-BhueZVxZ.d.ts +0 -61
  154. package/dist/client/usePage--fGlyrgj.d.mts +0 -6439
  155. package/dist/client/usePage-BBcFCxOU.d.ts +0 -6297
  156. package/dist/client/usePage-BC8Q2E3t.d.mts +0 -6431
  157. package/dist/client/usePage-BTPnCuWC.d.mts +0 -6511
  158. package/dist/client/usePage-BXjk8BhD.d.mts +0 -6704
  159. package/dist/client/usePage-BafOS9UT.d.mts +0 -6512
  160. package/dist/client/usePage-BcjWPXvh.d.mts +0 -6388
  161. package/dist/client/usePage-BiOReg0_.d.ts +0 -6704
  162. package/dist/client/usePage-Bnx-kA6x.d.mts +0 -6670
  163. package/dist/client/usePage-BvKAa3Zw.d.mts +0 -366
  164. package/dist/client/usePage-BvKAa3Zw.d.ts +0 -366
  165. package/dist/client/usePage-BydHcMYB.d.mts +0 -6297
  166. package/dist/client/usePage-C3ZKNwY7.d.mts +0 -6393
  167. package/dist/client/usePage-CE7X5NcN.d.ts +0 -6439
  168. package/dist/client/usePage-CHEybPMD.d.ts +0 -6429
  169. package/dist/client/usePage-CrKw1H6Y.d.ts +0 -6338
  170. package/dist/client/usePage-CyYpOJud.d.ts +0 -6388
  171. package/dist/client/usePage-D4fxZbRR.d.mts +0 -6429
  172. package/dist/client/usePage-DMI8ImsU.d.mts +0 -6338
  173. package/dist/client/usePage-DoPI6b8V.d.ts +0 -6511
  174. package/dist/client/usePage-DpRNZUtP.d.ts +0 -6431
  175. package/dist/client/usePage-QNWArrVO.d.ts +0 -6670
  176. package/dist/client/usePage-fBgPB6Oq.d.ts +0 -6512
  177. package/dist/client/usePage-gpVaeWDy.d.ts +0 -6393
  178. package/dist/server/chunk-5JT452F2.mjs.map +0 -1
  179. package/dist/server/chunk-AET56TQX.mjs.map +0 -1
  180. package/dist/server/chunk-HMENX4Y7.js.map +0 -1
  181. package/dist/server/chunk-LQUKXIW7.mjs +0 -13
  182. package/dist/server/chunk-LQUKXIW7.mjs.map +0 -1
  183. package/dist/server/chunk-VODFQMUW.js.map +0 -1
  184. package/dist/server/chunk-WYNEYDXO.js +0 -13
  185. package/dist/server/chunk-WYNEYDXO.js.map +0 -1
  186. package/dist/server/loadPage-6I7F6GRF.js.map +0 -1
  187. /package/dist/server/{loadPage-JI2SML4M.mjs.map → chunk-NFEGQTCC.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-HMENX4Y7.js","../../../api/src/endpoints.ts","../../../api/src/url.ts","../../../api/src/request.ts","../../../api/src/common/envelope.ts","../../src/client/cache.ts","../../src/version.ts","../../src/client/error.ts","../../src/client/resilience.ts","../../src/client/index.ts"],"names":["buildEndpointURL","generateRequestId"],"mappings":"AAAA;ACEA,IAAM,qBAAA,EAAuB;AAAA;AAAA,EAE3B,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,yBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,cAAc,CAAA;AAAA,IACrB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,uCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,6BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,wCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,2BAAA,EAA6B;AAAA,IAC3B,IAAA,EAAM,0CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,8BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,KAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,IACjB,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,oCAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,0BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAU,CAAA;AAAA,IAClC,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,0BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAU,CAAA;AAAA,IAClC,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAU,CAAA;AAAA,IAClC,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAA,EAAY,aAAa,CAAA;AAAA,IACjD,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,6CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAA,EAAY,aAAa,CAAA;AAAA,IACjD,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,sCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAA,EAAY,aAAa,CAAA;AAAA,IACjD,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,qCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAA,EAAY,iBAAiB,CAAA;AAAA,IACrD,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,qCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAA,EAAY,iBAAiB,CAAA;AAAA,IACrD,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,qCAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,eAAA,EAAiB,UAAA,EAAY,iBAAiB,CAAA;AAAA,IACrD,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,mCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,mCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,oCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,oCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,iDAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,iDAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,iDAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,mCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,mCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,+CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,+CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,+CAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,+BAAA,EAAiC;AAAA,IAC/B,IAAA,EAAM,6CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gCAAA,EAAkC;AAAA,IAChC,IAAA,EAAM,8CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAGA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,0DAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,0DAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,yDAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,yDAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAGA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,8DAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,8DAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,uEAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,2DAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,2DAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,wEAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,6CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,uCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,MAAA,EAAQ,aAAa,CAAA;AAAA,IAC5B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,MAAA,EAAQ,sBAAsB,CAAA;AAAA,IACrC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,cAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,MAAM,CAAA;AAAA,IACtB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,eAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAA,EAAQ,eAAe,CAAA;AAAA,IAC9B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,yBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAuB,CAAA;AAAA,IAC/C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,yBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAuB,CAAA;AAAA,IAC/C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,oCAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAA,EAAyB,wBAAwB,CAAA;AAAA,IACzE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,oBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,qBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,qBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,cAAc,CAAA;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,cAAc,CAAA;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,cAAc,CAAA;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,cAAc,CAAA;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,IAAA,EAAM,qCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,cAAc,CAAA;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,oCAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAA,EAAyB,wBAAwB,CAAA;AAAA,IACzE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,oDAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAA,EAAyB,4BAA4B,CAAA;AAAA,IAC7E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,4CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAuB,CAAA;AAAA,IAC/C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAyB,CAAA;AAAA,IACjD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,+CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,kCAAkC,CAAA;AAAA,IAC1D,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,IAAA,EAAM,gEAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,kCAAA,EAAoC,kCAAkC,CAAA;AAAA,IAC9F,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,sDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,kCAAkC,CAAA;AAAA,IAC1D,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kCAAA,EAAoC;AAAA,IAClC,IAAA,EAAM,yEAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,kCAAA,EAAoC,kCAAkC,CAAA;AAAA,IAC9F,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,sDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,kCAAkC,CAAA;AAAA,IAC1D,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,gEAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,kCAAA,EAAoC,kCAAkC,CAAA;AAAA,IAC9F,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,8DAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,kCAAkC,CAAA;AAAA,IAC1D,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,aAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,IACnB,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAyB,CAAA;AAAA,IACjD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,0CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,IAC5E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,0CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,IAC5E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,kDAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,IAC5E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,2CAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,iBAAiB,CAAA;AAAA,IACzC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,kDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,IAC5E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,kDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,IAC5E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,oDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,IAC5E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAe,CAAA;AAAA,IACvC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,4CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAA,EAAiB,oBAAoB,CAAA;AAAA,IAC7D,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,2CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAA,EAAiB,oBAAoB,CAAA;AAAA,IAC7D,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,0CAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,IAC5E,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,wBAAwB,CAAA;AAAA,IAChD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,iCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,wBAAwB,CAAA;AAAA,IAChD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,iCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,wBAAwB,CAAA;AAAA,IAChD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,sCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,wBAAwB,CAAA;AAAA,IAChD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,sCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,wBAAwB,CAAA;AAAA,IAChD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,mCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAe,CAAA;AAAA,IACvC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,4BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAA,EAAW,mBAAmB,CAAA;AAAA,IACrC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,4BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,eAAe,CAAA;AAAA,IAC/B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,eAAe,CAAA;AAAA,IAC/B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,qBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IACvB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,qBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IACvB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,qBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,sBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,yBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,8BAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,wBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,wBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,wBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,0BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,0BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,cAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IACvB,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,wBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,wBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,mCAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,qBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACvB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,kBAAkB,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAY,CAAA;AAAA,IACpC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAY,CAAA;AAAA,IACpC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,2CAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAA,EAAc,0BAA0B,CAAA;AAAA,IAChE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,2CAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAA,EAAc,0BAA0B,CAAA;AAAA,IAChE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,iDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAA,EAAc,0BAA0B,CAAA;AAAA,IAChE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,0DAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAA,EAAc,0BAAA,EAA4B,0BAA0B,CAAA;AAAA,IAC5F,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,0DAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAA,EAAc,0BAAA,EAA4B,0BAA0B,CAAA;AAAA,IAC5F,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,yDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAA,EAAc,0BAA0B,CAAA;AAAA,IAChE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,2BAA2B,CAAA;AAAA,IACnD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,gDAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,gCAAgC,CAAA;AAAA,IACvC,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,yCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,yBAAyB,CAAA;AAAA,IAChC,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,uCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,2BAA2B,CAAA;AAAA,IAClC,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,UAAA,EAAY,MAAM,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,IAC1B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,2BAAA,EAA6B;AAAA,IAC3B,IAAA,EAAM,iCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,aAAa,CAAA;AAAA,IAC7B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,4BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,OAAO,CAAA;AAAA,IAC/B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,IACrB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,aAAa,CAAA;AAAA,IAC7B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,kBAAkB,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,oBAAoB,CAAA;AAAA,IAC5C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,8BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAuB,CAAA;AAAA,IAC/C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,oBAAoB,CAAA;AAAA,IAC5C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,6BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,sBAAsB,CAAA;AAAA,IAC9C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,sCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,+BAA+B,CAAA;AAAA,IACvD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,kBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,kBAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,kBAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,oBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,6BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,eAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,eAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,cAAc,CAAA;AAAA,IAC9B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,gBAAgB,CAAA;AAAA,IACvB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,gBAAgB,CAAA;AAAA,IACvB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,eAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,cAAc,CAAA;AAAA,IACrB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,oBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,aAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,qBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,8BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAA,EAAQ,SAAS,CAAA;AAAA,IACxB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAA,EAAmB,SAAS,CAAA;AAAA,IAC5C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,iBAAA,EAAmB,SAAS,CAAA;AAAA,IAC5C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,uCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAA,EAAiB,QAAQ,CAAA;AAAA,IACjD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,+CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAA,EAAiB,QAAQ,CAAA;AAAA,IACjD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,iDAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAA,EAAiB,QAAQ,CAAA;AAAA,IACjD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,uCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAA,EAAiB,QAAQ,CAAA;AAAA,IACjD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,iBAAA,EAAmB,SAAS,CAAA;AAAA,IACnC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,IAClB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,eAAe,CAAA;AAAA,IACvC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,2BAA2B,CAAA;AAAA,IACnD,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAe,CAAA;AAAA,IACtB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,OAAO,CAAA;AAAA,IAC/B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,OAAO,CAAA;AAAA,IAC/B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,OAAO,CAAA;AAAA,IAC/B,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,8BAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,OAAA,EAAS,aAAa,CAAA;AAAA,IAC9C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,8BAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,OAAA,EAAS,aAAa,CAAA;AAAA,IAC9C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,0CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,aAAA,EAAe,yBAAyB,CAAA;AAAA,IAChE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,eAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,cAAc,CAAA;AAAA,IACrB,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,wBAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAe,CAAA;AAAA,IACtB,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,2BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAe,CAAA;AAAA,IACtB,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,8BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,wBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,wBAAwB,CAAA;AAAA,IAC/B,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,mDAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,wBAAA,EAA0B,kBAAkB,CAAA;AAAA,IACnD,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,wCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,wBAAA,EAA0B,oBAAoB,CAAA;AAAA,IACrD,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,wBAAwB,CAAA;AAAA,IAChD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,8CAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAuB,CAAA;AAAA,IAC/C,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,wBAAwB,CAAA;AAAA,IAChD,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,8CAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAA,EAAyB,wBAAwB,CAAA;AAAA,IACzE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,8CAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAA,EAAyB,wBAAwB,CAAA;AAAA,IACzE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,wDAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,uBAAA,EAAyB,wBAAwB,CAAA;AAAA,IACzE,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,cAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IACvB,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,oCAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAY,CAAA;AAAA,IACpC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,2CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,gBAAgB,CAAA;AAAA,IACxC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,wCAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,gBAAgB,CAAA;AAAA,IACxC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,IAAA,EAAM,4CAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,gBAAgB,CAAA;AAAA,IACxC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,IACf,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,6BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACvB,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA;AAAA,EAEA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,SAAA,EAAW,gBAAgB,CAAA;AAAA,IAC3C,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,SAAA,EAAW,gBAAgB,CAAA;AAAA,IAC3C,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB,CAAA;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,IAAA,EAAM,+BAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,CAAC,OAAA,EAAS,SAAA,EAAW,gBAAgB,CAAA;AAAA,IAC3C,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc;AAAA,EAChB;AACF,CAAA;AAEO,IAAM,cAAA,EAAgB,oBAAA;AA+BtB,SAAS,gBAAA,CAAiB,OAAA,EAAiB,QAAA,EAAsC;AACtF,EAAA,OAAO,QAAA,EAAU,aAAA,CAAc,QAAQ,CAAA,CAAE,IAAA;AAC3C;ADxBA;AACA;AEhjDO,SAAS,YAAA,CAAA,EAAuB;AAGrC,EAAA,GAAA,CAAI,OAAO,OAAA,IAAW,WAAA,EAAa;AACjC,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,YAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,WAAA;AAChC,EAAA,GAAA,CAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,EACtC;AAGA,EAAA,MAAM,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,yBAAA;AACjC,EAAA,GAAA,CAAI,YAAA,EAAc;AAChB,IAAA,MAAM,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC3C,IAAA,OAAO,CAAA,EAAA;AACT,EAAA;AAGM,EAAA;AACF,EAAA;AACK,IAAA;AACT,EAAA;AAEU,EAAA;AACR,IAAA;AAEF,EAAA;AACF;AAMgB;AACP,EAAA;AACT;AFmiDY;AACA;AG1mDR;AAOO;AACL,EAAA;AACI,IAAA;AACA,IAAA;AACN,IAAA;AACM,EAAA;AAER,EAAA;AACF;AAGI;AAKK;AAEH,EAAA;AACK,IAAA;AACT,EAAA;AAEO,EAAA;AACC,IAAA;AACA,IAAA;AACC,IAAA;AACR,EAAA;AACH;AAMgB;AACd,EAAA;AACF;AAoCa;AAaX,EAAA;AACQ,IAAA;AACD,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACP,EAAA;AACF;AAWgB;AACT,EAAA;AAID,EAAA;AACI,IAAA;AACC,IAAA;AACT,EAAA;AAGM,EAAA;AACD,EAAA;AACG,IAAA;AAEC,IAAA;AACT,EAAA;AAEO,EAAA;AACT;AAGSA;AACA,EAAA;AACT;AAKS;AAEH,EAAA;AAEC,EAAA;AAEC,IAAA;AACA,IAAA;AACF,MAAA;AACE,QAAA;AACD,MAAA;AACH,IAAA;AAEI,IAAA;AACF,MAAA;AACM,IAAA;AAER,IAAA;AACD,EAAA;AACH;AAEA;AACQ,EAAA;AACA,EAAA;AACF,EAAA;AACE,IAAA;AACF,MAAA;AACM,IAAA;AAER,IAAA;AACF,EAAA;AAEI,EAAA;AACI,IAAA;AACC,IAAA;AACD,EAAA;AACC,IAAA;AACT,EAAA;AACF;AAKS;AACA,EAAA;AACL,IAAA;AACA,IAAA;AACM,IAAA;AACJ,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAKS;AAMA,EAAA;AACL,IAAA;AACO,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAQA;AAKQ,EAAA;AACA,EAAA;AACA,EAAA;AAEE,EAAA;AACD,IAAA;AAEC,MAAA;AACF,QAAA;AACF,MAAA;AAEM,MAAA;AACD,MAAA;AACH,QAAA;AACF,MAAA;AAEI,MAAA;AACA,MAAA;AACF,QAAA;AACF,MAAA;AAEE,QAAA;AACE,UAAA;AACA,UAAA;AACE,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AAIE,MAAA;AAMA,QAAA;AACF,MAAA;AAGA,MAAA;AACF,IAAA;AACK,IAAA;AACG,MAAA;AACN,MAAA;AACF,IAAA;AACK,IAAA;AACG,MAAA;AACD,MAAA;AACH,QAAA;AACE,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AACM,MAAA;AACN,MAAA;AACF,IAAA;AACK,IAAA;AACH,MAAA;AACF,IAAA;AACA,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAYS;AAC+B,EAAA;AACpC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACyC,EAAA;AACnC,IAAA;AACF,IAAA;AACE,IAAA;AAGA,IAAA;AACF,IAAA;AACF,MAAA;AACE,QAAA;AACI,QAAA;AAEF,UAAA;AACF,QAAA;AAEE,UAAA;AACF,QAAA;AACD,MAAA;AACH,IAAA;AAEM,IAAA;AACA,IAAA;AACA,IAAA;AAGF,IAAA;AACI,MAAA;AAGN,MAAA;AACM,QAAA;AACF,UAAA;AACF,QAAA;AACD,MAAA;AAGG,MAAA;AACF,QAAA;AACE,UAAA;AACE,YAAA;AACF,UAAA;AACD,QAAA;AACH,MAAA;AAEM,MAAA;AACF,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAEM,IAAA;AAGA,IAAA;AAEJ,IAAA;AAIA,MAAA;AACF,IAAA;AACI,IAAA;AAEF,MAAA;AACM,QAAA;AACA,QAAA;AACF,UAAA;AACE,YAAA;AACD,UAAA;AACH,QAAA;AACA,QAAA;AACD,MAAA;AACH,IAAA;AAEM,IAAA;AACJ,MAAA;AACG,MAAA;AAAA;AAEH,MAAA;AAAa;AAEP,MAAA;AACN,MAAA;AACK,QAAA;AACA,QAAA;AAAA;AAEC,QAAA;AAA4C;AAE5C,QAAA;AACN,MAAA;AAAA;AAEM,MAAA;AACR,IAAA;AAGM,IAAA;AAGD,IAAA;AACG,MAAA;AACN,MAAA;AACM,QAAA;AACF,UAAA;AACF,QAAA;AACA,QAAA;AACD,MAAA;AACH,IAAA;AAEO,IAAA;AACT,EAAA;AACF;AAES;AACA,EAAA;AACC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAED,IAAA;AACG,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACJ,QAAA;AACA,QAAA;AACE,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AACF;AAEgB;AACP,EAAA;AACT;AAmBgB;AACR,EAAA;AACJ,IAAA;AACF,EAAA;AACO,EAAA;AACT;AHw6CY;AACA;AI9zDI;AACP,EAAA;AACT;AAEgB;AACP,EAAA;AACT;AAMa;AAOX,EAAA;AACQ,IAAA;AACD,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACP,EAAA;AACF;AAWgB;AACV,EAAA;AACK,IAAA;AACT,EAAA;AACU,EAAA;AACZ;AJ0yDY;AACA;AK54DC;AAMX,EAAA;AALQ,IAAA;AAMD,IAAA;AACA,IAAA;AACA,IAAA;AACP,EAAA;AAAA;AAAA;AAAA;AAAA;AAMS,EAAA;AACD,IAAA;AACD,IAAA;AAEC,IAAA;AACF,IAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAMS,EAAA;AACD,IAAA;AACD,IAAA;AAEC,IAAA;AAGF,IAAA;AACG,MAAA;AACL,MAAA;AACF,IAAA;AAGM,IAAA;AAIC,IAAA;AACL,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKiB,EAAA;AACT,IAAA;AACA,IAAA;AACA,IAAA;AAGF,IAAA;AACG,MAAA;AACP,IAAA;AAEK,IAAA;AACH,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACH,EAAA;AAAA;AAAA;AAAA;AAAA;AAMiB,EAAA;AACX,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAEJ,IAAA;AACM,MAAA;AAEE,QAAA;AACF,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AAEM,QAAA;AACF,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAGM,IAAA;AACF,IAAA;AACG,MAAA;AACP,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKc,EAAA;AACN,IAAA;AACN,IAAA;AACM,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKc,EAAA;AACP,IAAA;AACP,EAAA;AAAA;AAAA;AAAA;AAK0B,EAAA;AAClB,IAAA;AACD,IAAA;AAEC,IAAA;AACF,IAAA;AACG,MAAA;AACL,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AACF;AL+2DY;AACA;AM9hEC;ANgiED;AACA;AOp/DC;AA6BX,EAAA;AACQ,IAAA;AACD,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAGE,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASQ,EAAA;AAEF,IAAA;AAEA,IAAA;AAEA,IAAA;AAEG,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,EAAA;AACS,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYgC,EAAA;AACvB,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,EAAA;AACS,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,EAAA;AACS,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,EAAA;AACS,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAKA,EAAA;AACS,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAKA,EAAA;AACS,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAKA,EAAA;AACS,IAAA;AACT,EAAA;AACF;AP28DY;AACA;AQxnEC;AACX,EAAA;AACA,EAAA;AACA,EAAA;AACQ,EAAA;AACV;AAEa;AACX,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAkBgB;AACV,EAAA;AAEE,IAAA;AAGA,IAAA;AAGA,IAAA;AAGG,IAAA;AACT,EAAA;AAGO,EAAA;AACT;AAYgB;AAIR,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AAGA,EAAA;AAGF,EAAA;AACK,IAAA;AACT,EAAA;AAEO,EAAA;AACT;AAca;AAQX,EAAA;AAPQ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAID,IAAA;AACH,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAMkB,EAAA;AACZ,IAAA;AACG,MAAA;AACP,IAAA;AACO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,EAAA;AACM,IAAA;AACA,IAAA;AAEG,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAKA,EAAA;AACM,IAAA;AACG,MAAA;AACP,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKA,EAAA;AACM,IAAA;AACG,MAAA;AACD,MAAA;AACF,QAAA;AACF,MAAA;AACK,IAAA;AAEA,MAAA;AACP,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AAEO,IAAA;AAEA,IAAA;AAED,IAAA;AACG,MAAA;AACP,IAAA;AACO,MAAA;AACP,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKA,EAAA;AACS,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKQ,EAAA;AACD,IAAA;AAED,IAAA;AACG,MAAA;AACP,IAAA;AACO,MAAA;AACA,MAAA;AACP,IAAA;AACO,MAAA;AACA,MAAA;AACA,MAAA;AACP,IAAA;AACF,EAAA;AACF;AA0BA;AAIQ,EAAA;AACA,EAAA;AAEF,EAAA;AAEK,EAAA;AACH,IAAA;AACI,MAAA;AACA,MAAA;AAEF,MAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AACE,QAAA;AACF,MAAA;AACF,IAAA;AACE,MAAA;AAGM,MAAA;AAED,MAAA;AACH,QAAA;AACF,MAAA;AAGI,MAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAEM,EAAA;AACR;AAKS;AAKH,EAAA;AACI,IAAA;AACC,IAAA;AACT,EAAA;AAGO,EAAA;AACT;AAKS;AAEH,EAAA;AACK,IAAA;AACT,EAAA;AAGO,EAAA;AACT;AAKS;AACA,EAAA;AACT;AASa;AAGX,EAAA;AACQ,IAAA;AACD,IAAA;AACA,IAAA;AACP,EAAA;AACF;AR0+DY;AACA;ASryEZ;AAGM;AACA;AAKGC;AACA,EAAA;AACT;AAKS;AAEH,EAAA;AACK,IAAA;AACT,EAAA;AAEI,EAAA;AACK,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAKS;AACD,EAAA;AACF,EAAA;AACK,IAAA;AACT,EAAA;AACI,EAAA;AACK,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAUS;AAEH,EAAA;AACI,IAAA;AACR,EAAA;AAGI,EAAA;AACI,IAAA;AACE,MAAA;AACN,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACH,EAAA;AAGI,EAAA;AACI,IAAA;AACF,IAAA;AAEI,MAAA;AACA,MAAA;AACD,QAAA;AACH,QAAA;AACD,MAAA;AACH,IAAA;AACF,EAAA;AAII,EAAA;AACI,IAAA;AACA,IAAA;AACE,MAAA;AACN,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AAAQ;AACT,IAAA;AACH,EAAA;AAGM,EAAA;AACR;AAgBgB;AACT,EAAA;AACG,IAAA;AACJ,MAAA;AAEF,IAAA;AACF,EAAA;AAGK,EAAA;AACG,IAAA;AACJ,MAAA;AAEF,IAAA;AACF,EAAA;AAMM,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACQ,IAAA;AACR,IAAA;AACF,EAAA;AAEM,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAOM,EAAA;AAGA,EAAA;AACJ,IAAA;AACK,IAAA;AACL,IAAA;AACD,EAAA;AAGK,EAAA;AAGF,EAAA;AAGA,EAAA;AASK,EAAA;AAYD,IAAA;AACJ,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA;AAGO,oBAAA;AAGD,IAAA;AACF,IAAA;AACF,MAAA;AACA,sBAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AASA,EAAA;AAKQ,IAAA;AACA,IAAA;AACA,IAAA;AAGA,IAAA;AACJ,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACG,MAAA;AACL,IAAA;AAKI,IAAA;AACI,MAAA;AACF,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAKI,IAAA;AAEG,MAAA;AACH,QAAA;AACI,QAAA;AACF,UAAA;AACE,YAAA;AACA,YAAA;AACA,UAAA;AACJ,QAAA;AACF,MAAA;AAGK,MAAA;AACH,QAAA;AACA,QAAA;AACE,UAAA;AACA,QAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAKI,IAAA;AACE,MAAA;AAEA,MAAA;AAEE,QAAA;AACF,UAAA;AACF,QAAA;AAGA,QAAA;AACE,UAAA;AAEE,YAAA;AAIA,YAAA;AACE,cAAA;AACA,cAAA;AACF,YAAA;AACE,cAAA;AACF,YAAA;AACF,UAAA;AACA,UAAA;AACE,YAAA;AACA,YAAA;AACF,UAAA;AACF,QAAA;AAEA,QAAA;AACF,MAAA;AAEM,QAAA;AACF,UAAA;AACA,UAAA;AACF,QAAA;AACE,UAAA;AACF,QAAA;AACF,MAAA;AAGI,MAAA;AACF,QAAA;AACF,MAAA;AAEA,MAAA;AACF,IAAA;AAEM,MAAA;AACF,QAAA;AACF,MAAA;AAKK,MAAA;AACH,QAAA;AACI,QAAA;AACF,UAAA;AAIA,UAAA;AACE,YAAA;AACA,YAAA;AACA,UAAA;AACJ,QAAA;AACF,MAAA;AAKM,MAAA;AAIN,MAAA;AACM,MAAA;AACR,IAAA;AACF,EAAA;AASS,EAAA;AACD,IAAA;AAEN,IAAA;AACM,MAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAMO,EAAA;AACC,IAAA;AACE,MAAA;AAED,MAAA;AACH,QAAA;AACE,UAAA;AAEF,QAAA;AACF,MAAA;AAEM,MAAA;AAEN,MAAA;AACE,QAAA;AACI,QAAA;AACA,QAAA;AACA,QAAA;AACJ,QAAA;AACG,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AACA,MAAA;AAEN,MAAA;AACE,QAAA;AACG,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AAEA,MAAA;AACA,MAAA;AAEN,MAAA;AACM,QAAA;AACA,QAAA;AACF,UAAA;AACF,QAAA;AACE,UAAA;AACF,QAAA;AACE,UAAA;AACF,QAAA;AAEA,QAAA;AACE,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACE,YAAA;AACA,YAAA;AACF,UAAA;AACF,QAAA;AAEA,QAAA;AACG,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AACA,MAAA;AAEN,MAAA;AACE,QAAA;AACG,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AACD,MAAA;AACH,QAAA;AACF,MAAA;AACM,MAAA;AACN,MAAA;AACE,QAAA;AACG,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AACD,MAAA;AACH,QAAA;AACF,MAAA;AACM,MAAA;AACN,MAAA;AACE,QAAA;AACE,UAAA;AACA,UAAA;AACF,QAAA;AACA,QAAA;AACG,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AACD,MAAA;AACH,QAAA;AACF,MAAA;AACM,MAAA;AACN,MAAA;AACE,QAAA;AACE,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACF,QAAA;AACA,QAAA;AACG,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AACD,MAAA;AACH,QAAA;AACF,MAAA;AACM,MAAA;AACN,MAAA;AACE,QAAA;AACE,UAAA;AACA,UAAA;AACA,UAAA;AACD,QAAA;AACE,MAAA;AACP,IAAA;AAEM,IAAA;AACE,MAAA;AACD,MAAA;AACH,QAAA;AACF,MAAA;AACM,MAAA;AACN,MAAA;AACE,QAAA;AACE,UAAA;AACA,UAAA;AACA,UAAA;AACD,QAAA;AACE,MAAA;AACP,IAAA;AAEA,IAAA;AACQ,MAAA;AACR,IAAA;AAEA,IAAA;AACE,MAAA;AACF,IAAA;AAEA,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AACF;ATmmEY;AACA;AACA;AACA;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-HMENX4Y7.js","sourcesContent":[null,"import type { APIEndpoints } from \"./types\";\n\nconst ENDPOINT_DEFINITIONS = {\n // AI endpoints - no cache due to dynamic nature\n aiContentUpdateChat: {\n path: \"/ai/content-update-chat\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'stream',\n },\n aiChat: {\n path: \"/ai/chat\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'stream',\n },\n applySeoChanges: {\n path: \"/seo/apply\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiCreateBriefChat: {\n path: \"/ai/chat/create-brief\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiPrototypeChat: {\n path: \"/ai/chat/create-prototype\",\n method: \"POST\",\n revalidate: 30, // Short cache for AI responses to avoid duplicate calls\n tags: [\"ai-prototype\"],\n auth: 'user',\n responseKind: 'json',\n },\n aiPatchDryRun: {\n path: \"/ai/patch/dry-run\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiPatchApply: {\n path: \"/ai/patch/apply\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiPlaygroundPropose: {\n path: \"/sites/{siteId}/ai/playground/propose\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n // Admin SEO\n listGscPropertiesAdmin: {\n path: \"/admin/seo/gsc/properties\",\n method: \"GET\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminSetGscPersist: {\n path: \"/admin/seo/gsc/meta/persist\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminStartGscVerification: {\n path: \"/admin/seo/gsc/properties/verify/start\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminConfirmGscVerification: {\n path: \"/admin/seo/gsc/properties/verify/confirm\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminRunGscIngest: {\n path: \"/admin/seo/ingest/run\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n getSeoVerificationMeta: {\n path: \"/public/seo/verification/meta\",\n method: \"GET\",\n auth: 'public',\n responseKind: 'json',\n },\n checkRedirect: {\n path: \"/api/public/content/redirect\",\n method: \"GET\",\n revalidate: 86400, // 24 hours - redirects rarely change\n tags: ['redirect'],\n auth: 'public',\n responseKind: 'json',\n },\n listRedirectRules: {\n path: \"/sites/{siteId}/redirects\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createRedirectRule: {\n path: \"/sites/{siteId}/redirects\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteRedirectRule: {\n path: \"/sites/{siteId}/redirects/{ruleId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n // API Keys (Account-level - DEPRECATED, use site-scoped endpoints)\n listApiKeys: {\n path: \"/account/api-keys\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createApiKey: {\n path: \"/account/api-keys\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n revokeApiKey: {\n path: \"/account/api-keys/{keyId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n // API Keys (Site-scoped - preferred)\n listSiteApiKeys: {\n path: \"/sites/{siteId}/api-keys\",\n method: \"GET\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys'],\n responseKind: 'json',\n },\n createSiteApiKey: {\n path: \"/sites/{siteId}/api-keys\",\n method: \"POST\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys'],\n responseKind: 'json',\n },\n revokeSiteApiKey: {\n path: \"/sites/{siteId}/api-keys/{keyId}\",\n method: \"DELETE\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys'],\n responseKind: 'json',\n },\n getSitePreviewKey: {\n path: \"/sites/{siteId}/api-keys/preview\",\n method: \"GET\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'preview-key'],\n responseKind: 'json',\n },\n regenerateSitePreviewKey: {\n path: \"/sites/{siteId}/api-keys/preview/regenerate\",\n method: \"POST\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'preview-key'],\n responseKind: 'json',\n },\n getSiteApiKeyAccessLogs: {\n path: \"/sites/{siteId}/api-keys/access-logs\",\n method: \"GET\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'access-logs'],\n responseKind: 'json',\n },\n // Management API Keys (SDK write operations)\n listManagementKeys: {\n path: \"/sites/{siteId}/api-keys/management\",\n method: \"GET\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'management-keys'],\n responseKind: 'json',\n },\n createManagementKey: {\n path: \"/sites/{siteId}/api-keys/management\",\n method: \"POST\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'management-keys'],\n responseKind: 'json',\n },\n revokeManagementKey: {\n path: \"/sites/{siteId}/api-keys/management\",\n method: \"DELETE\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'management-keys'],\n responseKind: 'json',\n },\n getBookingSettings: {\n path: \"/sites/{siteId}/bookings/settings\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateBookingSettings: {\n path: \"/sites/{siteId}/bookings/settings\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n listAppointmentResources: {\n path: \"/sites/{siteId}/bookings/resources\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n listAppointmentServices: {\n path: \"/sites/{siteId}/bookings/services\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createAppointmentService: {\n path: \"/sites/{siteId}/bookings/services\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentService: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateAppointmentService: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteAppointmentService: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentServicesReference: {\n path: \"/sites/{siteId}/bookings/services/reference\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentResourcesReference: {\n path: \"/sites/{siteId}/bookings/resources/reference\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n\n // Service-Resource linking\n getResourceServices: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/services\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateResourceServices: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/services\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n getServiceResources: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}/resources\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateServiceResources: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}/resources\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n\n // Availability management\n listAvailabilityRules: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/availability\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n upsertAvailabilityRule: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/availability\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteAvailabilityRule: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/availability/{ruleId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n listBlackouts: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/blackouts\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createBlackout: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/blackouts\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteBlackout: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/blackouts/{blackoutId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n getAvailableSlots: {\n path: \"/sites/{siteId}/bookings/availability/slots\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createAppointment: {\n path: \"/sites/{siteId}/bookings/appointments\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n\n // Data retrieval endpoints - good candidates for caching\n getBrief: {\n path: \"/briefs\",\n method: \"GET\",\n revalidate: 120, // 2 minutes\n tags: [\"brief\"],\n auth: 'user',\n responseKind: 'json',\n },\n // Unified site data endpoint - use this for all site lookups\n getSite: {\n path: \"/sites\",\n method: \"GET\",\n revalidate: 900, // 15 minutes - site data changes less frequently\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n // DEPRECATED: Use getSite with ?slug={slug} instead\n getSiteBySlug: {\n path: \"/sites/by-slug/{slug}\",\n method: \"GET\",\n revalidate: 900, // 15 minutes - site data changes less frequently\n tags: [\"site\", \"site-{slug}\"],\n auth: 'user',\n responseKind: 'json',\n },\n // DEPRECATED: Use getSite with ?domain={domain} instead\n getSiteByDomain: {\n path: \"/sites/by-domain/{domain}\",\n method: \"GET\",\n revalidate: 900, // 15 minutes - site data changes less frequently\n tags: [\"site\", \"site-domain-{domain}\"],\n auth: 'user',\n responseKind: 'json',\n },\n createBriefTurn: {\n path: \"/brief-turns\",\n method: \"POST\",\n tags: [\"brief\"], // Tags for invalidation after mutation\n auth: 'user',\n responseKind: 'json',\n },\n upsertBrief: {\n path: \"/briefs\",\n method: \"PUT\",\n tags: [\"brief\"],\n auth: 'user',\n responseKind: 'json',\n },\n aiBriefToSpec: {\n path: \"/ai/actions/brief-to-spec\",\n method: \"POST\",\n tags: [\"brief\", \"spec\"],\n auth: 'user',\n responseKind: 'json',\n },\n createSite: {\n path: \"/sites\",\n method: \"POST\",\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n createSiteManual: {\n path: \"/sites/manual\",\n method: \"POST\",\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n updateSite: {\n path: '/sites',\n method: 'PUT',\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n deleteSite: {\n path: '/sites/{siteId}',\n method: 'DELETE',\n tags: ['site', 'site-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n listSiteMembers: {\n path: '/sites/{siteId}/members',\n method: 'GET',\n tags: ['site-{siteId}', 'site-members-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n inviteSiteMember: {\n path: '/sites/{siteId}/members',\n method: 'POST',\n tags: ['site-{siteId}', 'site-members-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateSiteMemberRole: {\n path: '/sites/{siteId}/members/{memberId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'site-members-{siteId}', 'site-member-{memberId}'],\n auth: 'user',\n responseKind: 'json',\n },\n authLogin: {\n path: '/auth/login/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n authForgotPassword: {\n path: '/auth/forgot/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n authRegister: {\n path: '/auth/register/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n authReauthenticate: {\n path: '/auth/reauth/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n lookupSiteDomains: {\n path: '/sites/{siteId}/domains/lookup',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n registerSiteDomain: {\n path: '/sites/{siteId}/domains/register',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n addCustomDomain: {\n path: '/sites/{siteId}/domains/custom',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n removeCustomDomain: {\n path: '/sites/{siteId}/domains/custom',\n method: 'DELETE',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n syncCustomDomainToEdgeConfig: {\n path: '/sites/{siteId}/domains/custom/sync',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n removeSiteMember: {\n path: '/sites/{siteId}/members/{memberId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'site-members-{siteId}', 'site-member-{memberId}'],\n auth: 'user',\n responseKind: 'json',\n },\n revokeSiteInvitation: {\n path: '/sites/{siteId}/members/invitations/{invitationId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'site-members-{siteId}', 'site-invite-{invitationId}'],\n auth: 'user',\n responseKind: 'json',\n },\n transferSiteOwnership: {\n path: '/sites/{siteId}/members/transfer-ownership',\n method: 'POST',\n tags: ['site-{siteId}', 'site-members-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n listContentEntries: {\n path: '/sites/{siteId}/content/{type}',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentTemplate: {\n path: '/sites/{siteId}/content/types/{type}/template',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentTemplateBlock: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/{blockId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}', 'content-template-block-{blockId}'],\n auth: 'user',\n responseKind: 'json',\n },\n applyContentTemplateAddon: {\n path: '/sites/{siteId}/content/types/{type}/template/addons',\n method: 'POST',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentTemplateBlockBindings: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/{blockId}/bindings',\n method: 'PATCH',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}', 'content-template-block-{blockId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createTemplateBlock: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks',\n method: 'POST',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteTemplateBlock: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/{blockId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}', 'content-template-block-{blockId}'],\n auth: 'user',\n responseKind: 'json',\n },\n reorderTemplateBlocks: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/reorder',\n method: 'POST',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n getTransforms: {\n path: '/transforms',\n method: 'GET',\n revalidate: 3600,\n tags: ['transforms'],\n auth: 'public',\n responseKind: 'json',\n },\n createContentEntry: {\n path: '/sites/{siteId}/content/{type}',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}',\n method: 'GET',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}',\n method: 'PUT',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentEntryContent: {\n path: '/sites/{siteId}/content/{type}/{entryId}/content',\n method: 'PUT',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateRouteMetadata: {\n path: '/sites/{siteId}/routes/{routeId}/metadata',\n method: 'PATCH',\n tags: ['site-{siteId}', 'route-{routeId}'],\n auth: 'user',\n responseKind: 'json',\n },\n publishContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}/publish',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n discardContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}/discard',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n unpublishContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}/unpublish',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Content types: enable + setup\n listContentTypes: {\n path: '/sites/{siteId}/content-types',\n method: 'GET',\n revalidate: 120, // 2 minutes\n tags: ['site-{siteId}', 'content-types'],\n auth: 'user',\n responseKind: 'json',\n },\n enableContentType: {\n path: '/sites/{siteId}/content-types/{key}/enable',\n method: 'POST',\n tags: ['site-{siteId}', 'content-types', 'content-type-{key}'],\n auth: 'user',\n responseKind: 'json',\n },\n setupContentType: {\n path: '/sites/{siteId}/content-types/{key}/setup',\n method: 'POST',\n tags: ['site-{siteId}', 'content-types', 'content-type-{key}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateSiteGeneralSettings: {\n path: '/sites/{siteId}/settings/general',\n method: 'POST',\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSiteLayoutSettings: {\n path: '/sites/{siteId}/settings/layout',\n method: 'GET',\n revalidate: 120,\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateSiteLayoutSettings: {\n path: '/sites/{siteId}/settings/layout',\n method: 'POST',\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getMaintenanceSettings: {\n path: '/sites/{siteId}/settings/maintenance',\n method: 'GET',\n revalidate: 120,\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateMaintenanceSettings: {\n path: '/sites/{siteId}/settings/maintenance',\n method: 'POST',\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n setHomepage: {\n path: '/sites/{siteId}/settings/homepage',\n method: 'POST',\n tags: ['site-{siteId}', 'site-homepage'],\n auth: 'user',\n responseKind: 'json',\n },\n listAccountDomains: {\n path: '/domains',\n method: 'GET',\n tags: ['domains'],\n auth: 'user',\n responseKind: 'json',\n },\n searchDomains: {\n path: '/domains/search',\n method: 'POST',\n tags: ['domains'],\n auth: 'user',\n responseKind: 'json',\n },\n registerDomain: {\n path: '/domains/register',\n method: 'POST',\n tags: ['domains'],\n auth: 'user',\n responseKind: 'json',\n },\n assignDomain: {\n path: '/domains/{domainId}/assign',\n method: 'POST',\n tags: ['domains', 'domain-{domainId}'],\n auth: 'user',\n responseKind: 'json',\n },\n adminStartImpersonation: {\n path: '/admin/impersonation/start',\n method: 'POST',\n tags: ['admin', 'impersonation'],\n auth: 'user',\n responseKind: 'json',\n },\n adminStopImpersonation: {\n path: '/admin/impersonation/stop',\n method: 'POST',\n tags: ['admin', 'impersonation'],\n auth: 'user',\n responseKind: 'json',\n },\n adminAssignRole: {\n path: '/admin/roles/assign',\n method: 'POST',\n tags: ['admin', 'roles'],\n auth: 'user',\n responseKind: 'json',\n },\n adminRevokeRole: {\n path: '/admin/roles/revoke',\n method: 'POST',\n tags: ['admin', 'roles'],\n auth: 'user',\n responseKind: 'json',\n },\n adminChangePlan: {\n path: '/admin/billing/plan',\n method: 'POST',\n tags: ['admin', 'billing'],\n auth: 'user',\n responseKind: 'json',\n },\n changePlan: {\n path: '/billing/plan/change',\n method: 'POST',\n tags: ['billing'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaTotpEnroll: {\n path: '/auth/mfa/totp/enroll',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaTotpVerify: {\n path: '/auth/mfa/totp/verify',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaTotpActivate: {\n path: '/auth/mfa/totp/activate',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaDeleteFactor: {\n path: '/auth/mfa/factors/{factorId}',\n method: 'DELETE',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaBackupCodesGet: {\n path: '/auth/mfa/backup-codes',\n method: 'GET',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaBackupCodesRotate: {\n path: '/auth/mfa/backup-codes/rotate',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaPhoneEnroll: {\n path: '/auth/mfa/phone/enroll',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaPhoneChallenge: {\n path: '/auth/mfa/phone/challenge',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaPhoneVerify: {\n path: '/auth/mfa/phone/verify',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n accountUpdatePassword: {\n path: '/account/password/update',\n method: 'POST',\n tags: ['account'],\n auth: 'user',\n responseKind: 'json',\n },\n accountRevokeSessions: {\n path: '/account/sessions/revoke',\n method: 'POST',\n tags: ['account'],\n auth: 'user',\n responseKind: 'json',\n },\n adminListInvites: {\n path: '/admin/invites',\n method: 'GET',\n tags: ['admin', 'invites'],\n auth: 'user',\n responseKind: 'json',\n },\n adminCreateInvite: {\n path: '/admin/invites',\n method: 'POST',\n tags: ['admin', 'invites'],\n auth: 'user',\n responseKind: 'json',\n },\n adminRevokeInvite: {\n path: '/admin/invites/{inviteId}',\n method: 'DELETE',\n tags: ['admin', 'invites'],\n auth: 'user',\n responseKind: 'json',\n },\n adminCreateUser: {\n path: '/admin/users',\n method: 'POST',\n tags: ['admin', 'users'],\n auth: 'admin',\n responseKind: 'json',\n },\n adminListAllowedDomains: {\n path: '/admin/allowed-domains',\n method: 'GET',\n tags: ['admin', 'allowed-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n adminAddAllowedDomain: {\n path: '/admin/allowed-domains',\n method: 'POST',\n tags: ['admin', 'allowed-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n adminDeleteAllowedDomain: {\n path: '/admin/allowed-domains/{domainId}',\n method: 'DELETE',\n tags: ['admin', 'allowed-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n authAcceptInvite: {\n path: '/auth/invite/accept',\n method: 'POST',\n tags: ['auth', 'invite'],\n auth: 'user',\n responseKind: 'json',\n },\n acceptSiteInvitation: {\n path: '/sites/invitations/accept',\n method: 'POST',\n tags: ['site-invitations'],\n auth: 'user',\n responseKind: 'json',\n },\n getNavigationMenus: {\n path: '/sites/{siteId}/navigation/menus',\n method: 'GET',\n tags: ['site-{siteId}', 'navigation'],\n auth: 'user',\n responseKind: 'json',\n },\n createNavigationMenu: {\n path: '/sites/{siteId}/navigation/menus',\n method: 'POST',\n tags: ['site-{siteId}', 'navigation'],\n auth: 'user',\n responseKind: 'json',\n },\n updateNavigationMenu: {\n path: '/sites/{siteId}/navigation/menus/{menuId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteNavigationMenu: {\n path: '/sites/{siteId}/navigation/menus/{menuId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createNavigationItem: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items',\n method: 'POST',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateNavigationItem: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items/{itemId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}', 'navigation-item-{itemId}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteNavigationItem: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items/{itemId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}', 'navigation-item-{itemId}'],\n auth: 'user',\n responseKind: 'json',\n },\n reorderNavigationItems: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items/reorder',\n method: 'POST',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getRoutableContent: {\n path: '/sites/{siteId}/routable-content',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'routable-content-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Generic public content preview (preferred)\n getPublishedEntryPreview: {\n path: '/public/content/{siteId}/{type}/{slug}/preview',\n method: 'GET',\n revalidate: 60,\n tags: ['content-{siteId}-{type}-{slug}'],\n auth: 'public',\n responseKind: 'json',\n },\n listPublishedEntries: {\n path: '/public/content/{siteId}/{type}/entries',\n method: 'GET',\n revalidate: 60,\n tags: ['content-{siteId}-{type}'],\n auth: 'public',\n responseKind: 'json',\n },\n getPublishedPostPreview: {\n path: '/public/posts/{siteId}/{slug}/preview',\n method: 'GET',\n revalidate: 60,\n tags: ['blog-post:{siteId}:{slug}'],\n auth: 'public',\n responseKind: 'json',\n },\n proposalsSelect: {\n path: '/proposals/select',\n method: 'POST',\n tags: [\"proposal\", \"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n createTheme: {\n path: '/ai/chat/create-theme',\n method: 'POST',\n revalidate: 60, // 1 minute cache for theme creation to avoid duplicate requests\n tags: [\"theme\", \"ai-theme\"],\n auth: 'user',\n responseKind: 'json',\n },\n generateThemes: {\n path: '/theme/generate',\n method: 'POST',\n tags: [\"theme\"],\n auth: 'user',\n responseKind: 'json',\n },\n extractThemeFromInspiration: {\n path: '/theme/extract-from-inspiration',\n method: 'POST',\n tags: [\"theme\", \"preferences\"],\n auth: 'user',\n responseKind: 'json',\n },\n saveSiteTheme: {\n path: '/sites/{siteId}/theme/save',\n method: 'POST',\n tags: ['site-{siteId}', 'theme'],\n auth: 'user',\n responseKind: 'json',\n },\n uploadSiteLogo: {\n path: '/storage/upload-site-logo',\n method: 'POST',\n tags: [\"site\", \"logo\"],\n auth: 'user',\n responseKind: 'json',\n },\n upsertThemePreferences: {\n path: '/theme-preferences/upsert',\n method: 'POST',\n tags: [\"theme\", \"preferences\"],\n auth: 'user',\n responseKind: 'json',\n },\n finalizeSite: {\n path: '/sites/finalize',\n method: 'POST',\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n instagramUploadZip: {\n path: '/api/instagram/upload-zip',\n method: 'POST',\n tags: ['instagram-import'],\n auth: 'user',\n responseKind: 'json',\n },\n getAnalyticsReport: {\n path: '/sites/{siteId}/analytics/report',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'analytics-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSeoOverview: {\n path: '/sites/{siteId}/seo/overview',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'seo-overview-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSeoPages: {\n path: '/sites/{siteId}/seo/pages',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'seo-pages-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSeoQueries: {\n path: '/sites/{siteId}/seo/queries',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'seo-queries-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getPerformanceOverview: {\n path: '/sites/{siteId}/performance/overview',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'performance-overview-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createMediaAsset: {\n path: '/media',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaList: {\n path: '/media',\n method: 'GET',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaGet: {\n path: '/media/{assetId}',\n method: 'GET',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaUpdate: {\n path: '/media/{assetId}',\n method: 'PATCH',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaDelete: {\n path: '/media/{assetId}',\n method: 'DELETE',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'void',\n },\n mediaBulkDelete: {\n path: '/media/bulk-delete',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaGetSignedUrl: {\n path: '/media/{assetId}/signed-url',\n method: 'GET',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaUpload: {\n path: '/media/upload',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n getMediaLabels: {\n path: '/media/labels',\n method: 'GET',\n tags: ['media', 'media-labels'],\n auth: 'user',\n responseKind: 'json',\n },\n getMediaSettings: {\n path: '/media/settings',\n method: 'GET',\n tags: ['media-settings'],\n auth: 'user',\n responseKind: 'json',\n },\n updateMediaSettings: {\n path: '/media/settings',\n method: 'POST',\n tags: ['media-settings'],\n auth: 'user',\n responseKind: 'json',\n },\n // Media endpoints\n mediaSearch: {\n path: '/media/search',\n method: 'POST',\n tags: ['media-search'],\n auth: 'user',\n responseKind: 'json',\n },\n classifyMediaAsset: {\n path: '/media/{assetId}/classify',\n method: 'POST',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n classifyMediaBatch: {\n path: '/media/classify',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaJobsStatus: {\n path: '/media/jobs/status',\n method: 'GET',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n enqueueMediaClassifyJob: {\n path: '/media/jobs',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n runMediaClassifyJob: {\n path: '/media/jobs/run',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n runAllMediaClassifyJobs: {\n path: '/media/jobs/run-all',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n initSiteContent: {\n path: '/sites/{siteId}/content/init',\n method: 'POST',\n tags: [\"site\", \"content\"],\n auth: 'user',\n responseKind: 'json',\n },\n updateBlockContent: {\n path: '/blocks/{blockId}/content',\n method: 'POST',\n tags: ['block', 'block-{blockId}', 'content'],\n auth: 'user',\n responseKind: 'json',\n },\n saveBlockContent: {\n path: '/blocks/{blockId}/content',\n method: 'POST',\n tags: ['block', 'block-{blockId}', 'content'],\n auth: 'user',\n responseKind: 'json',\n },\n createBlock: {\n path: '/sites/{siteId}/pages/{pageId}/blocks',\n method: 'POST',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n reorderBlocks: {\n path: '/sites/{siteId}/pages/{pageId}/blocks/reorder',\n method: 'POST',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteBlock: {\n path: '/sites/{siteId}/pages/{pageId}/blocks/{blockId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n listBlocks: {\n path: '/sites/{siteId}/pages/{pageId}/blocks',\n method: 'GET',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n getBlockContent: {\n path: '/blocks/{blockId}/content',\n method: 'GET',\n tags: ['block-{blockId}', 'content'],\n auth: 'user',\n responseKind: 'json',\n },\n // DEPRECATED: Use getSite with ?id={id} instead\n getSiteById: {\n path: '/sites/by-id/{id}',\n method: 'GET',\n revalidate: 900, // 15 minutes\n tags: ['site-{id}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Page data endpoints\n getPageById: {\n path: '/sites/{siteId}/pages/{pageId}',\n method: 'GET',\n revalidate: 900, // 15 minutes\n tags: ['site-{siteId}', 'page-{pageId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentByPath: {\n path: '/sites/{siteId}/pages',\n method: 'GET',\n tags: ['site-{siteId}', 'routable-content-{siteId}'],\n auth: 'public',\n responseKind: 'json',\n },\n getPageByPath: {\n path: '/sites/{siteId}/pages',\n method: 'GET',\n tags: ['site-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Forms CRUD\n listForms: {\n path: '/sites/{siteId}/forms',\n method: 'GET',\n tags: ['site-{siteId}', 'forms'],\n auth: 'user',\n responseKind: 'json',\n },\n listBookingForms: {\n path: '/sites/{siteId}/bookings/forms',\n method: 'GET',\n tags: ['site-{siteId}', 'forms'],\n auth: 'user',\n responseKind: 'json',\n },\n \n createForm: {\n path: '/sites/{siteId}/forms',\n method: 'POST',\n tags: ['site-{siteId}', 'forms'],\n auth: 'user',\n responseKind: 'json',\n },\n updateForm: {\n path: '/sites/{siteId}/forms/{slug}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'forms', 'form-{slug}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteForm: {\n path: '/sites/{siteId}/forms/{slug}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'forms', 'form-{slug}'],\n auth: 'user',\n responseKind: 'json',\n },\n listFormSubmissions: {\n path: '/sites/{siteId}/forms/{slug}/submissions',\n method: 'GET',\n revalidate: 30,\n tags: ['site-{siteId}', 'form-{slug}', 'form-submissions-{slug}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Public submit\n submitForm: {\n path: '/forms/submit',\n method: 'POST',\n tags: ['forms-submit'],\n auth: 'public',\n responseKind: 'json',\n },\n // Public forms\n getPublicFormById: {\n path: '/public/forms/{formId}',\n method: 'GET',\n revalidate: 60,\n tags: ['form-{formId}'],\n auth: 'public',\n responseKind: 'json',\n },\n // Public booking services\n getPublicBookingServices: {\n path: '/public/bookings/services',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}'],\n auth: 'public',\n responseKind: 'json',\n },\n devToolsImpersonateAdmin: {\n path: '/dev-tools/impersonate/admin',\n method: 'POST',\n auth: 'admin',\n responseKind: 'json',\n },\n devToolsImpersonateRandom: {\n path: '/dev-tools/impersonate/random',\n method: 'POST',\n auth: 'admin',\n responseKind: 'json',\n },\n devToolsSeedDemoData: {\n path: '/dev-tools/seed',\n method: 'POST',\n auth: 'admin',\n responseKind: 'json',\n },\n // Public analytics collection endpoint\n analyticsCollect: {\n path: '/api/analytics/collect',\n method: 'POST',\n auth: 'public',\n responseKind: 'json',\n },\n // Public events for event calendar block\n listPublicEvents: {\n path: '/public/sites/{siteId}/events',\n method: 'GET',\n revalidate: 60,\n tags: ['public-events-{siteId}'],\n auth: 'public',\n responseKind: 'json',\n },\n // Resolve event occurrence by URL segment (date or UUID)\n resolveEventOccurrence: {\n path: '/public/sites/{siteId}/events/occurrences/resolve',\n method: 'GET',\n revalidate: 60,\n tags: ['public-events-{siteId}', 'event-occurrence'],\n auth: 'public',\n responseKind: 'json',\n },\n // Public event registration\n registerForEvent: {\n path: '/public/sites/{siteId}/events/register',\n method: 'POST',\n tags: ['public-events-{siteId}', 'event-registration'],\n auth: 'public',\n responseKind: 'json',\n },\n // Content Types CRUD\n listSiteContentTypes: {\n path: '/sites/{siteId}/content-types',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-type-{typeId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createContentType: {\n path: '/sites/{siteId}/content-types',\n method: 'POST',\n tags: ['site-{siteId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'content-type-{typeId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'content-type-{typeId}', 'content-types-{sideId}'],\n auth: 'user',\n responseKind: 'json',\n },\n duplicateContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}/duplicate',\n method: 'POST',\n tags: ['site-{siteId}', 'content-type-{typeId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Admin site creation\n adminCreateSite: {\n path: '/admin/sites',\n method: 'POST',\n tags: ['admin', 'sites'],\n auth: 'admin',\n responseKind: 'json',\n },\n // SDK Config\n refreshSdkConfig: {\n path: '/sites/{siteId}/refresh-sdk-config',\n method: 'POST',\n tags: ['site-{siteId}', 'sdk-config'],\n auth: 'user',\n responseKind: 'json',\n },\n // Stripe Connect - Site billing\n stripeConnectAuthorize: {\n path: '/sites/{siteId}/billing/connect/authorize',\n method: 'POST',\n tags: ['site-{siteId}', 'stripe-connect'],\n auth: 'user',\n responseKind: 'json',\n },\n stripeConnectStatus: {\n path: '/sites/{siteId}/billing/connect/status',\n method: 'GET',\n tags: ['site-{siteId}', 'stripe-connect'],\n auth: 'user',\n responseKind: 'json',\n },\n stripeConnectDisconnect: {\n path: '/sites/{siteId}/billing/connect/disconnect',\n method: 'DELETE',\n tags: ['site-{siteId}', 'stripe-connect'],\n auth: 'user',\n responseKind: 'json',\n },\n // Backup\n importSiteBackup: {\n path: '/sites/{siteId}/backup/import',\n method: 'POST',\n tags: ['site-{siteId}', 'backup'],\n auth: 'user',\n responseKind: 'json',\n },\n previewBackup: {\n path: '/backup/preview',\n method: 'POST',\n tags: ['backup'],\n auth: 'user',\n responseKind: 'json',\n },\n importBackupAsNewSite: {\n path: '/sites/backup/import-as-new',\n method: 'POST',\n tags: ['site', 'backup'],\n auth: 'user',\n responseKind: 'json',\n },\n // Admin billing price overrides\n adminGetPriceOverride: {\n path: '/admin/billing/price-override',\n method: 'GET',\n tags: ['admin', 'billing', 'price-override'],\n auth: 'admin',\n responseKind: 'json',\n },\n adminUpsertPriceOverride: {\n path: '/admin/billing/price-override',\n method: 'POST',\n tags: ['admin', 'billing', 'price-override'],\n auth: 'admin',\n responseKind: 'json',\n },\n adminDeletePriceOverride: {\n path: '/admin/billing/price-override',\n method: 'DELETE',\n tags: ['admin', 'billing', 'price-override'],\n auth: 'admin',\n responseKind: 'json',\n },\n} as const satisfies APIEndpoints;\n\nexport const API_ENDPOINTS = ENDPOINT_DEFINITIONS;\n\ntype IsUnknown<T> = unknown extends T ? ([T] extends [unknown] ? true : false) : false;\n\ntype MissingResponseTypes = {\n [K in keyof APIEndpoints]: IsUnknown<NonNullable<APIEndpoints[K]['response']>> extends true ? K : never;\n}[keyof APIEndpoints];\n\ntype MissingResponseKindMetadata = {\n [K in keyof typeof ENDPOINT_DEFINITIONS]: typeof ENDPOINT_DEFINITIONS[K] extends { responseKind: infer RK }\n ? RK extends import('./types').ApiResponseKind\n ? never\n : K\n : K;\n}[keyof typeof ENDPOINT_DEFINITIONS];\n\ntype MissingAuthMetadata = {\n [K in keyof typeof ENDPOINT_DEFINITIONS]: typeof ENDPOINT_DEFINITIONS[K] extends { auth: infer A }\n ? A extends import('./types').ApiAuthRequirement\n ? never\n : K\n : K;\n}[keyof typeof ENDPOINT_DEFINITIONS];\n\ntype AssertTrue<T extends true> = T;\n\ntype _EnsureResponseTypes = AssertTrue<MissingResponseTypes extends never ? true : false>;\ntype _EnsureResponseKindMetadata = AssertTrue<MissingResponseKindMetadata extends never ? true : false>;\ntype _EnsureAuthMetadata = AssertTrue<MissingAuthMetadata extends never ? true : false>;\n\n// Helper function to build full URL\nexport function buildEndpointURL(baseURL: string, endpoint: keyof APIEndpoints): string {\n return baseURL + API_ENDPOINTS[endpoint].path;\n}\n","/**\n * URL construction helpers for dashboard and API URLs.\n *\n * These functions ensure consistent URL construction across the codebase\n * and derive the API URL from the dashboard URL to avoid duplicate env vars.\n */\n\n/**\n * Get the base dashboard URL from environment\n * @returns Dashboard base URL (e.g., 'http://dashboard.local:4000')\n * @throws Error if neither NEXT_PUBLIC_DASHBOARD_URL nor NEXT_PUBLIC_CMS_API_URL is configured\n */\nexport function getDashboardBaseUrl(): string {\n const internalUrl = process.env.CMS_API_URL;\n if (internalUrl) {\n return internalUrl.replace(/\\/api\\/?$/, '').replace(/\\/$/, '');\n }\n\n const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;\n\n if (dashboardUrl) {\n // Remove trailing slash for consistency\n return dashboardUrl.replace(/\\/$/, '');\n }\n\n // Legacy fallback: derive from NEXT_PUBLIC_CMS_API_URL\n const legacyApiUrl = process.env.NEXT_PUBLIC_CMS_API_URL;\n if (legacyApiUrl) {\n // Strip /api suffix if present\n return legacyApiUrl.replace(/\\/$/, '').replace(/\\/api$/, '');\n }\n\n throw new Error(\n 'NEXT_PUBLIC_DASHBOARD_URL is not configured. ' +\n 'Set it to your dashboard URL (e.g., http://dashboard.local:4000)'\n );\n}\n\n/**\n * Get the CMS API URL by appending /api to the dashboard URL\n * @returns API base URL (e.g., 'http://dashboard.local:4000/api' or '/api' in browser)\n * @throws Error if neither NEXT_PUBLIC_DASHBOARD_URL nor NEXT_PUBLIC_CMS_API_URL is configured (server-side only)\n */\nexport function getCmsApiUrl(): string {\n // In browser, always use relative URL to avoid CORS issues\n // (e.g., www.example.com calling example.com/api would be cross-origin)\n if (typeof window !== 'undefined') {\n return '/api';\n }\n\n // Server-side: use explicit URLs for SSR/API routes\n const internalUrl = process.env.CMS_API_URL;\n if (internalUrl) {\n return internalUrl.replace(/\\/$/, '');\n }\n\n // Check for NEXT_PUBLIC_DASHBOARD_URL first (new standard)\n const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;\n if (dashboardUrl) {\n const base = dashboardUrl.replace(/\\/$/, '');\n return `${base}/api`;\n }\n\n // Legacy: Use NEXT_PUBLIC_CMS_API_URL directly if available\n const legacyApiUrl = process.env.NEXT_PUBLIC_CMS_API_URL;\n if (legacyApiUrl) {\n return legacyApiUrl.replace(/\\/$/, '');\n }\n\n throw new Error(\n 'NEXT_PUBLIC_DASHBOARD_URL is not configured. ' +\n 'Set it to your dashboard URL (e.g., http://dashboard.local:4000)'\n );\n}\n\n/**\n * Legacy: Get API URL, supporting old NEXT_PUBLIC_CMS_API_URL env var\n * @deprecated Use getCmsApiUrl() instead - this function is maintained for backwards compatibility\n */\nexport function resolveApiBaseUrl(): string {\n return getCmsApiUrl();\n}\n","import SupabaseClient from \"@supabase/supabase-js/dist/module/SupabaseClient\";\nimport { API_ENDPOINTS } from \"./endpoints\";\nimport { AuthHeaders, getAuthHeaders } from \"./token\";\nimport { APICallParams, APIEndpoints, ApiAuthRequirement, ApiResponseKind, HTTPMethod } from \"./types\";\nimport { resolveApiBaseUrl } from \"./url\";\nimport { normalizeCmsApiKey } from \"./env\";\nimport type { ApiErrorCode, ApiResult, ApiResponse, ApiError } from \"./common/envelope\";\n\n// Optional Next.js imports - only available when Next.js is present\n// Next.js 16 requires a cacheLife profile as the second argument\ntype RevalidateTagFn = (tag: string, cacheLifeProfile: string) => void;\nlet revalidateTag: RevalidateTagFn | null = null;\n\n// Dynamically load Next.js cache helpers on the server\n// We use Function constructor to create a require call that esbuild won't transform\n// to __require shim, which causes \"dynamic usage of require is not supported\" in Turbopack.\n// This is necessary because @riverbankcms/api is bundled into the SDK, and direct\n// require() calls get wrapped even when 'next' is marked as external.\nif (typeof window === 'undefined') {\n try {\n const dynamicRequire = new Function('modulePath', 'return require(modulePath)') as (path: string) => unknown;\n const nextCache = dynamicRequire('next/cache') as { revalidateTag?: RevalidateTagFn };\n revalidateTag = nextCache.revalidateTag ?? null;\n } catch {\n // Next.js not available - revalidation functions will be no-ops\n }\n}\n\n// SDK version tracking - set by the SDK to include in request headers\nlet sdkVersion: string | undefined;\n\n/**\n * Generate a UUID, with fallback for environments where crypto.randomUUID isn't available.\n */\nfunction generateRequestId(): string {\n // crypto.randomUUID is available in modern browsers and Node 19+\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // Fallback: generate a pseudo-random UUID v4\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Set the SDK version to be included in API request headers\n * Called by the SDK during initialization\n */\nexport function setSdkVersion(version: string): void {\n sdkVersion = version;\n}\n\n/**\n * Get the currently set SDK version\n */\nexport function getSdkVersion(): string | undefined {\n return sdkVersion;\n}\n\ntype RawApiClient = <E extends keyof APIEndpoints>(params: APICallParams<E>) => Promise<Response>;\ntype EndpointResponse<E extends keyof APIEndpoints> = APIEndpoints[E]['response'];\ntype ApiResponseFor<E extends keyof APIEndpoints> =\n EndpointResponse<E> extends undefined ? void : NonNullable<EndpointResponse<E>>;\n\n/**\n * API client that returns typed envelope responses.\n * Consumers must use isApiSuccess/isApiError type guards or unwrapResponse helper.\n */\nexport type ApiClient = <E extends keyof APIEndpoints>(\n params: APICallParams<E>\n) => Promise<ApiResult<ApiResponseFor<E>>>;\n\nexport interface ApiRequestErrorOptions {\n endpoint: keyof APIEndpoints;\n status: number;\n method: HTTPMethod;\n auth?: ApiAuthRequirement;\n requestId?: string;\n body?: unknown;\n cause?: unknown;\n /** Typed error code from envelope error responses */\n errorCode?: ApiErrorCode;\n /** Retry delay from Retry-After header, in milliseconds */\n retryAfterMs?: number;\n}\n\nexport class ApiRequestError extends Error {\n readonly endpoint: keyof APIEndpoints;\n readonly status: number;\n readonly method: HTTPMethod;\n readonly auth?: ApiAuthRequirement;\n readonly requestId?: string;\n readonly body?: unknown;\n readonly cause?: unknown;\n /** Typed error code from envelope error responses (e.g., 'auth:forbidden', 'validation:invalid_input') */\n readonly errorCode?: ApiErrorCode;\n /** Retry delay from Retry-After header, in milliseconds */\n readonly retryAfterMs?: number;\n\n constructor(message: string, options: ApiRequestErrorOptions) {\n super(message);\n this.name = 'ApiRequestError';\n this.endpoint = options.endpoint;\n this.status = options.status;\n this.method = options.method;\n this.auth = options.auth;\n this.requestId = options.requestId;\n this.body = options.body;\n this.cause = options.cause;\n this.errorCode = options.errorCode;\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\n/**\n * Parse the Retry-After header value to milliseconds.\n * The header can be either:\n * - A number of seconds (e.g., \"120\")\n * - An HTTP-date (e.g., \"Wed, 21 Oct 2025 07:28:00 GMT\")\n *\n * @returns milliseconds to wait, or undefined if header is missing/invalid.\n * Returns 0 for \"Retry-After: 0\" (meaning retry immediately).\n */\nexport function parseRetryAfterHeader(headerValue: string | null): number | undefined {\n if (!headerValue) return undefined;\n\n // Try parsing as seconds first (most common)\n // Use strict regex to ensure entire string is numeric (not \"120abc\")\n if (/^\\d+$/.test(headerValue)) {\n const seconds = parseInt(headerValue, 10);\n return seconds * 1000;\n }\n\n // Try parsing as HTTP-date\n const date = new Date(headerValue);\n if (!isNaN(date.getTime())) {\n const delayMs = date.getTime() - Date.now();\n // Only return if the date is in the future\n return delayMs > 0 ? delayMs : undefined;\n }\n\n return undefined;\n}\n\n// Helper function to build full URL\nfunction buildEndpointURL(baseURL: string, endpoint: keyof APIEndpoints): string {\n return baseURL + API_ENDPOINTS[endpoint].path;\n}\n\nexport const getApiUrl = (endpoint: keyof APIEndpoints) => buildEndpointURL(resolveApiBaseUrl(), endpoint);\n\n// Simple cache invalidation helper\nfunction invalidateCacheTags(tags?: string[], params?: Record<string, string | number>): void {\n // Only run on the server, and only when Next.js provides a revalidateTag function\n if (typeof window !== 'undefined' || !revalidateTag || !tags) return;\n\n tags.forEach(tag => {\n // Replace parameter placeholders in tags\n let processedTag = tag;\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n processedTag = processedTag.replace(`{${key}}`, String(value));\n });\n }\n\n try {\n revalidateTag(processedTag, 'max');\n } catch {\n // If static generation store is not available in this context, skip\n }\n });\n}\n\nexport async function parseErrorBody(response: Response): Promise<unknown> {\n const clone = response.clone();\n const contentType = clone.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await clone.json();\n } catch {\n // fall through to attempt plain text parsing\n }\n }\n\n try {\n const text = await clone.text();\n return text.length ? text : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Build a success envelope response.\n */\nfunction buildSuccessEnvelope<T>(data: T, requestId: string | undefined): ApiResponse<T> {\n return {\n success: true,\n data,\n meta: {\n requestId: requestId ?? generateRequestId(),\n timestamp: new Date().toISOString(),\n apiVersion: '2025-01-01',\n },\n };\n}\n\n/**\n * Build an error envelope response.\n */\nfunction buildErrorEnvelope(\n code: ApiErrorCode,\n message: string,\n status: number,\n requestId: string | undefined,\n): ApiError {\n return {\n success: false,\n error: {\n code,\n message,\n requestId: requestId ?? generateRequestId(),\n timestamp: new Date().toISOString(),\n status,\n },\n };\n}\n\n/**\n * Parse a successful HTTP response and return an ApiResult envelope.\n *\n * This function ALWAYS returns an ApiResult - it never throws for API-level errors.\n * HTTP-level errors (network failures, JSON parse errors) still throw ApiRequestError.\n */\nexport async function parseSuccessResponse<E extends keyof APIEndpoints>(\n endpoint: E,\n response: Response,\n config: APIEndpoints[E],\n): Promise<ApiResult<ApiResponseFor<E>>> {\n const responseKind: ApiResponseKind = config.responseKind ?? 'json';\n const auth = config.auth ?? 'user';\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n switch (responseKind) {\n case 'json': {\n // Empty responses\n if (response.status === 204 || response.status === 205 || response.status === 304) {\n return buildSuccessEnvelope(undefined as ApiResponseFor<E>, requestId);\n }\n\n const raw = await response.text();\n if (!raw.trim()) {\n return buildSuccessEnvelope(undefined as ApiResponseFor<E>, requestId);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (cause) {\n // JSON parse error is a fatal error - throw, don't return envelope\n throw new ApiRequestError(\n `Failed to parse JSON response for endpoint ${String(endpoint)}`,\n {\n endpoint,\n status: response.status,\n method: config.method,\n auth,\n requestId,\n body: raw,\n cause,\n },\n );\n }\n\n // Check if response is already in envelope format\n if (\n parsed &&\n typeof parsed === 'object' &&\n 'success' in parsed &&\n typeof (parsed as { success: unknown }).success === 'boolean'\n ) {\n // Already an envelope - return as-is (properly typed)\n return parsed as ApiResult<ApiResponseFor<E>>;\n }\n\n // Legacy format - wrap in success envelope\n return buildSuccessEnvelope(parsed as ApiResponseFor<E>, requestId);\n }\n case 'text': {\n const text = await response.text();\n return buildSuccessEnvelope(text as ApiResponseFor<E>, requestId);\n }\n case 'stream': {\n const body = response.body;\n if (!body) {\n return buildErrorEnvelope(\n 'server:internal_error',\n `Expected a streamed body for endpoint ${String(endpoint)}`,\n response.status,\n requestId,\n );\n }\n const stream = body as ReadableStream<Uint8Array>;\n return buildSuccessEnvelope(stream as unknown as ApiResponseFor<E>, requestId);\n }\n case 'void': {\n return buildSuccessEnvelope(undefined as ApiResponseFor<E>, requestId);\n }\n default: {\n return buildSuccessEnvelope(undefined as ApiResponseFor<E>, requestId);\n }\n }\n}\n\nexport async function createAuthenticatedApiClient(supabase: SupabaseClient): Promise<ApiClient> {\n const authHeaders = await getAuthHeaders(supabase)\n\n if (!authHeaders) {\n throw new Error('No authentication token available')\n }\n \n return createCMSClient(authHeaders);\n}\n\nfunction createRawCMSClient(headers: AuthHeaders | {} = {}, baseUrl?: string): RawApiClient {\n return <E extends keyof APIEndpoints>({\n endpoint,\n body,\n params,\n options = {}\n }: APICallParams<E>): Promise<Response> => {\n const resolvedBaseUrl = baseUrl ?? resolveApiBaseUrl();\n let url = buildEndpointURL(resolvedBaseUrl, endpoint);\n const originalPath = API_ENDPOINTS[endpoint].path;\n\n // Handle URL path parameters and collect unused params for query string\n const unusedParams: Record<string, string> = {};\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n const placeholder = `{${key}}`;\n if (originalPath.includes(placeholder)) {\n // This param is used in the path - substitute it\n url = url.replace(placeholder, value);\n } else {\n // This param is not used in the path - save for query string\n unusedParams[key] = value;\n }\n });\n }\n\n const endpointConfig = API_ENDPOINTS[endpoint];\n const method = endpointConfig.method as HTTPMethod;\n const isGetOrHead = method === 'GET' || method === 'HEAD';\n\n // For GET/HEAD requests, convert body and unused params to query parameters\n if (isGetOrHead) {\n const queryParams = new URLSearchParams();\n\n // Add unused params (not used in path) to query string\n Object.entries(unusedParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n\n // Add body params to query string\n if (body) {\n Object.entries(body as Record<string, any>).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n\n const queryString = queryParams.toString();\n if (queryString) {\n url += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n // Detect if body is FormData (for file uploads)\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData;\n \n // Build Next.js cache options for read operations\n const nextOptions: { revalidate?: number; tags?: string[] } = {};\n if (\n isGetOrHead &&\n 'revalidate' in endpointConfig &&\n typeof endpointConfig.revalidate === 'number'\n ) {\n nextOptions.revalidate = endpointConfig.revalidate;\n }\n if ('tags' in endpointConfig && Array.isArray(endpointConfig.tags)) {\n // Process tags with parameter replacement\n nextOptions.tags = endpointConfig.tags.map<string>((tag) => {\n let processedTag = tag as string;\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n processedTag = processedTag.replace(`{${key}}`, String(value));\n });\n }\n return processedTag;\n });\n }\n \n const requestInit: RequestInit & { next?: { revalidate?: number; tags?: string[] } } = {\n method,\n ...options,\n // Include credentials for same-origin requests (sends cookies for auth)\n credentials: 'same-origin',\n // Don't include body for GET/HEAD requests\n body: isGetOrHead ? undefined : (isFormData ? (body as unknown as BodyInit) : (body ? JSON.stringify(body) : undefined)),\n headers: {\n ...options.headers,\n ...headers,\n // Include SDK version if set\n ...(sdkVersion && { 'x-sdk-version': sdkVersion }),\n // Don't set Content-Type for GET/HEAD requests without body\n ...(isGetOrHead ? {} : (isFormData ? {} : { 'Content-Type': 'application/json' })),\n },\n // Add Next.js caching options\n next: Object.keys(nextOptions).length > 0 ? nextOptions : undefined,\n };\n\n // Make the fetch request\n const fetchPromise = fetch(url, requestInit);\n \n // For mutation requests, invalidate cache after successful response\n if (!isGetOrHead && 'tags' in endpointConfig && Array.isArray(endpointConfig.tags)) {\n const tags = endpointConfig.tags.map((tag) => tag as string);\n return fetchPromise.then(response => {\n if (response.ok) {\n invalidateCacheTags(tags, params);\n }\n return response;\n });\n }\n \n return fetchPromise;\n }\n}\n\nfunction createParsedClient(rawClient: RawApiClient): ApiClient {\n return async <E extends keyof APIEndpoints>(params: APICallParams<E>) => {\n const response = await rawClient(params);\n const endpoint = params.endpoint;\n const config = API_ENDPOINTS[endpoint];\n const auth = config.auth ?? 'user';\n\n if (!response.ok) {\n const body = await parseErrorBody(response);\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const retryAfterMs = parseRetryAfterHeader(response.headers.get('retry-after'));\n throw new ApiRequestError(\n `Request to ${String(endpoint)} failed with status ${response.status}`,\n {\n endpoint,\n status: response.status,\n method: config.method,\n auth,\n requestId,\n body,\n retryAfterMs,\n },\n );\n }\n\n return parseSuccessResponse(endpoint, response, config);\n };\n}\n\nexport function createCMSClient(headers: AuthHeaders | {} = {}, baseUrl?: string): ApiClient {\n return createParsedClient(createRawCMSClient(headers, baseUrl));\n}\n\nexport const createServerAPIClient = (apiKey: string, baseUrl?: string): ApiClient => {\n const normalizedApiKey = normalizeCmsApiKey(apiKey);\n\n if (!normalizedApiKey) {\n throw new Error('No API key provided for server API client')\n }\n const authHeaders = {\n Authorization: `Bearer ${normalizedApiKey}`,\n }\n return createCMSClient(authHeaders, baseUrl);\n}\n\nexport function createInternalAPIClient(baseUrl?: string): ApiClient {\n return createCMSClient({}, baseUrl);\n}\n\n// Bearer-token client for preview-auth flows\nexport function createBearerAPIClient(token: string, baseUrl?: string): ApiClient {\n const authHeaders = {\n Authorization: `Bearer ${token}`,\n };\n return createCMSClient(authHeaders, baseUrl);\n}\n","/**\n * API Response Envelope Types\n *\n * Provides standardized response format for all API endpoints:\n * - Success: { success: true, data, meta }\n * - Error: { success: false, error: { code, message, requestId, ... } }\n */\n\n// API version - update when breaking changes are made\nexport type ApiVersion = '2025-01-01';\nexport const CURRENT_API_VERSION: ApiVersion = '2025-01-01';\n\n// Response metadata\nexport interface ResponseMeta {\n requestId: string;\n timestamp: string;\n apiVersion: ApiVersion;\n deprecations?: DeprecationWarning[];\n}\n\nexport interface DeprecationWarning {\n feature: string;\n message: string;\n sunsetDate: string;\n alternative?: string;\n}\n\n// Success envelope\nexport interface ApiResponse<TData> {\n success: true;\n data: TData;\n meta: ResponseMeta;\n}\n\n// Error codes - namespaced by domain\nexport type ApiErrorCode =\n // Auth (401, 403)\n | 'auth:unauthenticated'\n | 'auth:token_expired'\n | 'auth:token_invalid'\n | 'auth:forbidden'\n | 'auth:mfa_required'\n | 'auth:sudo_required'\n | 'auth:insufficient_permissions'\n | 'auth:impersonation_restricted'\n // Validation (400, 413)\n | 'validation:invalid_input'\n | 'validation:missing_field'\n | 'validation:invalid_format'\n | 'validation:payload_too_large'\n // Resources (404, 409, 410)\n | 'resource:not_found'\n | 'resource:already_exists'\n | 'resource:conflict'\n | 'resource:gone'\n // Rate limiting (429)\n | 'rate_limit:exceeded'\n // Billing (402)\n | 'billing:payment_required'\n | 'billing:plan_limit_exceeded'\n // Server (500+)\n | 'server:internal_error'\n | 'server:unavailable'\n // External service errors (502)\n | 'external:service_error'\n // Network errors (no HTTP response - status 0)\n | 'network:connection_error'\n | 'network:timeout'\n | 'network:dns_error';\n\n// Field-level validation error\nexport interface FieldError {\n field: string;\n code: string;\n message: string;\n}\n\n// Error response\nexport interface ApiError {\n success: false;\n error: {\n code: ApiErrorCode;\n message: string;\n requestId: string;\n timestamp: string;\n status: number;\n fieldErrors?: FieldError[];\n };\n}\n\n// Union type for any response\nexport type ApiResult<TData> = ApiResponse<TData> | ApiError;\n\n// Type guards\nexport function isApiError(result: ApiResult<unknown>): result is ApiError {\n return result.success === false;\n}\n\nexport function isApiSuccess<T>(result: ApiResult<T>): result is ApiResponse<T> {\n return result.success === true;\n}\n\n/**\n * Error class for API failures that can be thrown from unwrapResponse.\n * Preserves all error metadata from the envelope.\n */\nexport class ApiEnvelopeError extends Error {\n readonly code: ApiErrorCode;\n readonly requestId: string;\n readonly timestamp: string;\n readonly status: number;\n readonly fieldErrors?: FieldError[];\n\n constructor(error: ApiError['error']) {\n super(error.message);\n this.name = 'ApiEnvelopeError';\n this.code = error.code;\n this.requestId = error.requestId;\n this.timestamp = error.timestamp;\n this.status = error.status;\n this.fieldErrors = error.fieldErrors;\n }\n}\n\n/**\n * Unwrap a successful API response or throw on error.\n *\n * @example\n * ```typescript\n * const response = await apiClient({ endpoint: 'getUser', params: { id } });\n * const user = unwrapResponse(response); // Throws if not success\n * ```\n */\nexport function unwrapResponse<T>(result: ApiResult<T>): T {\n if (isApiSuccess(result)) {\n return result.data;\n }\n throw new ApiEnvelopeError(result.error);\n}\n\n/**\n * Unwrap a successful API response or return a default value on error.\n *\n * @example\n * ```typescript\n * const response = await apiClient({ endpoint: 'getUser', params: { id } });\n * const user = unwrapResponseOr(response, null);\n * ```\n */\nexport function unwrapResponseOr<T>(result: ApiResult<T>, defaultValue: T): T {\n return isApiSuccess(result) ? result.data : defaultValue;\n}\n","/**\n * Simple in-memory cache with TTL and stale support\n *\n * Supports:\n * - Fresh entries: Within TTL, returned immediately\n * - Stale entries: Past TTL but within staleTtl, returned as fallback\n * - Automatic eviction: Stale entries evicted first, then oldest fresh\n */\n\n/**\n * Cache entry with freshness and stale windows\n */\ninterface CacheEntry<T> {\n value: T;\n /** Timestamp when entry was created */\n createdAt: number;\n /** Timestamp until which entry is fresh */\n freshUntil: number;\n /** Timestamp until which entry can be served as stale */\n staleUntil: number;\n}\n\n/**\n * Result from getStale() with age information\n */\nexport interface StaleResult<T> {\n value: T;\n /** Seconds since the entry's TTL expired (0 if still fresh) */\n staleAgeSec: number;\n}\n\n/**\n * Options for cache.set()\n */\nexport interface CacheSetOptions {\n /** Time-to-live in milliseconds (overrides default) */\n ttl?: number;\n /** Additional time after TTL during which stale data can be served (overrides default) */\n staleTtl?: number;\n}\n\nexport class SimpleCache<T> {\n private cache = new Map<string, CacheEntry<T>>();\n private maxSize: number;\n private ttl: number;\n private staleTtl: number;\n\n constructor(options: { maxSize?: number; ttl?: number; staleTtl?: number } = {}) {\n this.maxSize = options.maxSize ?? 100;\n this.ttl = options.ttl ?? 300000; // 5 minutes in milliseconds\n this.staleTtl = options.staleTtl ?? 300000; // 5 minutes additional stale window\n }\n\n /**\n * Get a fresh value (within TTL)\n * @returns The value if fresh, null otherwise\n */\n getFresh(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n\n const now = Date.now();\n if (now <= entry.freshUntil) {\n return entry.value;\n }\n\n return null;\n }\n\n /**\n * Get a value that may be stale (past TTL but within staleTtl)\n * @returns Object with value and stale age, or null if expired\n */\n getStale(key: string): StaleResult<T> | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n\n const now = Date.now();\n\n // Completely expired\n if (now > entry.staleUntil) {\n this.cache.delete(key);\n return null;\n }\n\n // Calculate stale age (0 if still fresh)\n const staleAgeSec = now <= entry.freshUntil\n ? 0\n : Math.floor((now - entry.freshUntil) / 1000);\n\n return {\n value: entry.value,\n staleAgeSec,\n };\n }\n\n /**\n * Store a value with TTL and stale window\n */\n set(key: string, value: T, options?: CacheSetOptions): void {\n const ttl = options?.ttl ?? this.ttl;\n const staleTtl = options?.staleTtl ?? this.staleTtl;\n const now = Date.now();\n\n // Enforce max size with smart eviction\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n this.evictOne(now);\n }\n\n this.cache.set(key, {\n value,\n createdAt: now,\n freshUntil: now + ttl,\n staleUntil: now + ttl + staleTtl,\n });\n }\n\n /**\n * Evict one entry to make room for a new one\n * Priority: oldest stale entry, then oldest fresh entry\n */\n private evictOne(now: number): void {\n let oldestStaleKey: string | null = null;\n let oldestStaleTime = Infinity;\n let oldestFreshKey: string | null = null;\n let oldestFreshTime = Infinity;\n\n for (const [key, entry] of this.cache) {\n if (now > entry.freshUntil) {\n // Stale entry\n if (entry.createdAt < oldestStaleTime) {\n oldestStaleTime = entry.createdAt;\n oldestStaleKey = key;\n }\n } else {\n // Fresh entry\n if (entry.createdAt < oldestFreshTime) {\n oldestFreshTime = entry.createdAt;\n oldestFreshKey = key;\n }\n }\n }\n\n // Evict oldest stale first, then oldest fresh\n const keyToEvict = oldestStaleKey ?? oldestFreshKey;\n if (keyToEvict) {\n this.cache.delete(keyToEvict);\n }\n }\n\n /**\n * Remove all fully expired entries (past staleUntil)\n */\n prune(): void {\n const now = Date.now();\n for (const [key, entry] of this.cache) {\n if (now > entry.staleUntil) {\n this.cache.delete(key);\n }\n }\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Check if a key exists and is not fully expired\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n const now = Date.now();\n if (now > entry.staleUntil) {\n this.cache.delete(key);\n return false;\n }\n\n return now <= entry.freshUntil;\n }\n}\n","/**\n * SDK version - MUST match version in package.json\n *\n * This version is sent to the API in the x-sdk-version header\n * to help with debugging and compatibility tracking.\n *\n * IMPORTANT: When releasing a new SDK version, update BOTH:\n * 1. This constant\n * 2. The \"version\" field in package.json\n */\nexport const SDK_VERSION = '0.7.2';\n","/**\n * SDK API Error Class\n *\n * Thrown when the API returns an error response with the new envelope format.\n * Provides typed access to error details including code, message, request ID, and field errors.\n */\n\nimport type { ApiErrorCode, FieldError, ApiError } from '@riverbankcms/api/public';\n\n/**\n * Error options for creating RiverbankApiError\n */\nexport interface RiverbankApiErrorOptions {\n code: ApiErrorCode;\n message: string;\n requestId: string;\n status: number;\n timestamp: string;\n fieldErrors?: FieldError[];\n /** Retry delay from Retry-After header, in milliseconds */\n retryAfterMs?: number;\n}\n\n/**\n * Error thrown by SDK when API returns an error response\n *\n * @example\n * ```ts\n * try {\n * await client.getSite({ slug: 'my-site' });\n * } catch (error) {\n * if (error instanceof RiverbankApiError) {\n * console.log('Error code:', error.code);\n * console.log('Request ID:', error.requestId);\n *\n * if (error.isAuthError()) {\n * // Handle authentication error\n * }\n *\n * if (error.isValidationError() && error.fieldErrors) {\n * // Handle field-level validation errors\n * error.fieldErrors.forEach(fe => {\n * console.log(`${fe.field}: ${fe.message}`);\n * });\n * }\n *\n * // Check if error can be retried\n * if (error.isRetryable) {\n * const delay = error.retryAfterMs ?? 1000;\n * console.log(`Retrying after ${delay}ms...`);\n * }\n * }\n * }\n * ```\n */\nexport class RiverbankApiError extends Error {\n /** Namespaced error code (e.g., 'auth:unauthenticated', 'validation:invalid_input') */\n readonly code: ApiErrorCode;\n\n /** Unique request ID for debugging/support */\n readonly requestId: string;\n\n /** HTTP status code */\n readonly status: number;\n\n /** Field-level validation errors (only present for validation errors) */\n readonly fieldErrors?: FieldError[];\n\n /** ISO timestamp when the error occurred */\n readonly timestamp: string;\n\n /**\n * Whether this error is safe to retry.\n * True for: 429 rate limit, 5xx server errors\n * False for: 4xx client errors (except 429)\n */\n readonly isRetryable: boolean;\n\n /**\n * Suggested retry delay from Retry-After header, in milliseconds.\n * Only present when the server provides a Retry-After header.\n */\n readonly retryAfterMs?: number;\n\n constructor(apiError: ApiError['error'] | RiverbankApiErrorOptions) {\n super(apiError.message);\n this.name = 'RiverbankApiError';\n this.code = apiError.code;\n this.requestId = apiError.requestId;\n this.status = apiError.status;\n this.fieldErrors = apiError.fieldErrors;\n this.timestamp = apiError.timestamp;\n this.retryAfterMs = 'retryAfterMs' in apiError ? apiError.retryAfterMs : undefined;\n this.isRetryable = this.computeRetryable();\n\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, RiverbankApiError.prototype);\n }\n\n /**\n * Compute whether this error is retryable based on HTTP status code.\n * - 0 (network errors - no HTTP response): retryable\n * - 429 (rate limit): retryable\n * - 5xx (server errors): retryable\n * - 4xx (client errors, except 429): NOT retryable\n */\n private computeRetryable(): boolean {\n // Network errors (no HTTP response) are retryable\n if (this.status === 0) return true;\n // Rate limiting is retryable\n if (this.status === 429) return true;\n // Server errors are retryable\n if (this.status >= 500) return true;\n // Client errors (4xx except 429) are not retryable\n return false;\n }\n\n /**\n * Check if this is a network error (no HTTP response received)\n *\n * Matches: network:connection_error, network:timeout, network:dns_error\n */\n isNetworkError(): boolean {\n return this.code.startsWith('network:');\n }\n\n /**\n * Check if this error matches a specific error code\n *\n * @example\n * ```ts\n * if (error.is('auth:unauthenticated')) {\n * // Redirect to login\n * }\n * ```\n */\n is(code: ApiErrorCode): boolean {\n return this.code === code;\n }\n\n /**\n * Check if this is an authentication or authorization error\n *\n * Matches: auth:unauthenticated, auth:token_expired, auth:token_invalid,\n * auth:forbidden, auth:mfa_required, auth:insufficient_permissions\n */\n isAuthError(): boolean {\n return this.code.startsWith('auth:');\n }\n\n /**\n * Check if this is a validation error\n *\n * Matches: validation:invalid_input, validation:missing_field, validation:invalid_format\n */\n isValidationError(): boolean {\n return this.code.startsWith('validation:');\n }\n\n /**\n * Check if this is a resource error (not found, conflict, etc.)\n *\n * Matches: resource:not_found, resource:already_exists, resource:conflict, resource:gone\n */\n isResourceError(): boolean {\n return this.code.startsWith('resource:');\n }\n\n /**\n * Check if this is a rate limiting error\n */\n isRateLimitError(): boolean {\n return this.code.startsWith('rate_limit:');\n }\n\n /**\n * Check if this is a billing/payment error\n */\n isBillingError(): boolean {\n return this.code.startsWith('billing:');\n }\n\n /**\n * Check if this is a server error\n */\n isServerError(): boolean {\n return this.code.startsWith('server:');\n }\n}\n","/**\n * Resilience utilities for the SDK client\n *\n * Provides:\n * - Circuit breaker pattern for fail-fast behavior\n * - Retry with exponential backoff and jitter\n * - Timeout handling\n */\n\nimport type { RetryConfig, CircuitBreakerConfig, CircuitState } from './types';\nimport { RiverbankApiError } from './error';\n\n// ============================================================================\n// Default Configurations\n// ============================================================================\n\nexport const DEFAULT_RETRY_CONFIG: Required<Omit<RetryConfig, 'retryOn'>> = {\n maxAttempts: 3,\n baseDelayMs: 200,\n maxDelayMs: 2000,\n jitter: 'full',\n};\n\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: Required<CircuitBreakerConfig> = {\n failureThreshold: 5,\n resetTimeoutMs: 30000,\n halfOpenMaxRequests: 2,\n};\n\n// ============================================================================\n// Error Classification\n// ============================================================================\n\n/**\n * Determine if an error is transient and should trigger circuit breaker / retry\n *\n * Transient (opens circuit, triggers retry):\n * - Network errors (status 0)\n * - 5xx server errors\n * - 429 rate limit\n *\n * Permanent (does NOT open circuit, no retry):\n * - 4xx client errors (400, 401, 403, 404)\n * - Validation errors\n */\nexport function isTransientError(error: Error): boolean {\n if (error instanceof RiverbankApiError) {\n // Network errors are transient\n if (error.status === 0) return true;\n\n // 429 rate limit is transient\n if (error.status === 429) return true;\n\n // 5xx server errors are transient\n if (error.status >= 500) return true;\n\n // 4xx client errors are permanent\n return false;\n }\n\n // Generic errors (TypeError, etc.) are treated as transient (likely network issues)\n return true;\n}\n\n// ============================================================================\n// Backoff Calculation\n// ============================================================================\n\n/**\n * Calculate backoff delay for retry attempt\n *\n * Uses exponential backoff with optional full jitter.\n * Formula: min(maxDelay, baseDelay * 2^(attempt-1)) * random()\n */\nexport function calculateBackoff(\n attempt: number,\n config: Partial<Pick<RetryConfig, 'baseDelayMs' | 'maxDelayMs' | 'jitter'>>\n): number {\n const baseDelayMs = config.baseDelayMs ?? DEFAULT_RETRY_CONFIG.baseDelayMs;\n const maxDelayMs = config.maxDelayMs ?? DEFAULT_RETRY_CONFIG.maxDelayMs;\n const jitter = config.jitter ?? DEFAULT_RETRY_CONFIG.jitter;\n\n // Exponential: baseDelay * 2^(attempt-1)\n const exponential = baseDelayMs * Math.pow(2, attempt - 1);\n\n // Cap at maxDelay\n const capped = Math.min(exponential, maxDelayMs);\n\n // Apply jitter\n if (jitter === 'full') {\n return Math.random() * capped;\n }\n\n return capped;\n}\n\n// ============================================================================\n// Circuit Breaker\n// ============================================================================\n\n/**\n * Circuit breaker for fail-fast behavior\n *\n * States:\n * - closed: Normal operation, requests allowed\n * - open: Too many failures, requests blocked\n * - half-open: Testing if service recovered, limited requests allowed\n */\nexport class CircuitBreaker {\n private state: 'closed' | 'open' | 'half-open' = 'closed';\n private failureCount = 0;\n private successCount = 0;\n private openUntil = 0;\n private halfOpenRequests = 0;\n private config: Required<CircuitBreakerConfig>;\n\n constructor(config?: CircuitBreakerConfig) {\n this.config = {\n failureThreshold: config?.failureThreshold ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.failureThreshold,\n resetTimeoutMs: config?.resetTimeoutMs ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.resetTimeoutMs,\n halfOpenMaxRequests: config?.halfOpenMaxRequests ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.halfOpenMaxRequests,\n };\n }\n\n /**\n * Check if circuit is open (requests should be blocked)\n * Also handles automatic transition from open to half-open after timeout\n */\n isOpen(): boolean {\n if (this.state === 'open' && Date.now() >= this.openUntil) {\n this.transitionTo('half-open');\n }\n return this.state === 'open';\n }\n\n /**\n * Check if a request can be attempted\n * - closed: always yes\n * - open: always no\n * - half-open: limited number of probes\n */\n canAttempt(): boolean {\n if (this.state === 'closed') return true;\n if (this.state === 'open') return false;\n // half-open: allow limited probes\n return this.halfOpenRequests < this.config.halfOpenMaxRequests;\n }\n\n /**\n * Increment half-open request counter (call before making request in half-open)\n */\n incrementHalfOpenRequests(): void {\n if (this.state === 'half-open') {\n this.halfOpenRequests++;\n }\n }\n\n /**\n * Record a successful request\n */\n recordSuccess(): void {\n if (this.state === 'half-open') {\n this.successCount++;\n if (this.successCount >= this.config.halfOpenMaxRequests) {\n this.transitionTo('closed');\n }\n } else {\n // Reset consecutive failures on any success\n this.failureCount = 0;\n }\n }\n\n /**\n * Record a failed request\n * Only counts transient failures toward circuit breaker threshold\n */\n recordFailure(error: Error): void {\n // Only count transient failures\n if (!isTransientError(error)) return;\n\n this.failureCount++;\n\n if (this.state === 'half-open') {\n this.transitionTo('open');\n } else if (this.failureCount >= this.config.failureThreshold) {\n this.transitionTo('open');\n }\n }\n\n /**\n * Get current circuit state\n */\n getState(): CircuitState {\n return {\n state: this.state,\n failureCount: this.failureCount,\n openUntil: this.state === 'open' ? this.openUntil : undefined,\n };\n }\n\n /**\n * Transition to a new state\n */\n private transitionTo(newState: 'closed' | 'open' | 'half-open'): void {\n this.state = newState;\n\n if (newState === 'open') {\n this.openUntil = Date.now() + this.config.resetTimeoutMs;\n } else if (newState === 'half-open') {\n this.halfOpenRequests = 0;\n this.successCount = 0;\n } else if (newState === 'closed') {\n this.failureCount = 0;\n this.successCount = 0;\n this.halfOpenRequests = 0;\n }\n }\n}\n\n// ============================================================================\n// Retry with Timeout\n// ============================================================================\n\n/**\n * Configuration for fetchWithTimeoutAndRetry\n */\nexport interface FetchWithRetryConfig {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n jitter?: 'full' | 'none';\n requestTimeoutMs?: number;\n retryOn?: (error: Error, statusCode?: number) => boolean;\n}\n\n/**\n * Fetch with timeout and retry logic\n *\n * @param fetcher - Function that performs the fetch, receives AbortSignal for timeout\n * @param config - Retry configuration\n * @returns Result from successful fetch\n * @throws Last error after all retries exhausted\n */\nexport async function fetchWithTimeoutAndRetry<T>(\n fetcher: (signal: AbortSignal) => Promise<T>,\n config: FetchWithRetryConfig\n): Promise<T> {\n const maxAttempts = config.maxAttempts ?? DEFAULT_RETRY_CONFIG.maxAttempts;\n const requestTimeoutMs = config.requestTimeoutMs ?? 8000;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeoutMs);\n\n try {\n const result = await fetcher(controller.signal);\n return result;\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n const shouldRetry = shouldRetryError(error as Error, config.retryOn);\n\n if (!shouldRetry) {\n throw error;\n }\n\n // Don't delay after last attempt\n if (attempt < maxAttempts) {\n const delay = getRetryDelay(error as Error, attempt, config);\n await sleep(delay);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Check if an error should be retried\n */\nfunction shouldRetryError(\n error: Error,\n customRetryOn?: (error: Error, statusCode?: number) => boolean\n): boolean {\n // Custom retry logic takes precedence\n if (customRetryOn) {\n const statusCode = error instanceof RiverbankApiError ? error.status : undefined;\n return customRetryOn(error, statusCode);\n }\n\n // Default: retry transient errors\n return isTransientError(error);\n}\n\n/**\n * Get delay before retrying, respecting Retry-After if present\n */\nfunction getRetryDelay(error: Error, attempt: number, config: FetchWithRetryConfig): number {\n // Check for Retry-After from rate limiting\n if (error instanceof RiverbankApiError && error.retryAfterMs) {\n return error.retryAfterMs;\n }\n\n // Use exponential backoff\n return calculateBackoff(attempt, config);\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// Circuit Open Error\n// ============================================================================\n\n/**\n * Error thrown when circuit breaker is open\n */\nexport class CircuitOpenError extends Error {\n readonly circuitState: CircuitState;\n\n constructor(state: CircuitState) {\n super('Circuit breaker is open');\n this.name = 'CircuitOpenError';\n this.circuitState = state;\n }\n}\n","import { createBearerAPIClient, setSdkVersion, ApiRequestError, isApiError, unwrapResponse, ApiEnvelopeError } from '@riverbankcms/api/public';\nimport type { ApiResult, ApiError } from '@riverbankcms/api/public';\nimport type {\n RiverbankClient,\n RiverbankClientConfig,\n GetEntriesBaseParams,\n ResilienceStatus,\n ResilienceSource,\n CircuitState,\n} from './types';\nimport { SimpleCache } from './cache';\nimport { SDK_VERSION } from '../version';\nimport { RiverbankApiError } from './error';\nimport {\n CircuitBreaker,\n CircuitOpenError,\n fetchWithTimeoutAndRetry,\n DEFAULT_RETRY_CONFIG,\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n} from './resilience';\n\n// Set SDK version for all API requests from this SDK\nsetSdkVersion(SDK_VERSION);\n\n// Default timeout values - shorter for browsers (user is waiting), longer for servers\nconst DEFAULT_BROWSER_TIMEOUT_MS = 5000;\nconst DEFAULT_SERVER_TIMEOUT_MS = 8000;\n\n/**\n * Generate a unique request ID for tracing\n */\nfunction generateRequestId(): string {\n return `req-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Check if an error is an AbortError (from AbortController.abort())\n */\nfunction isAbortError(error: unknown): boolean {\n // DOMException with name 'AbortError' (browsers)\n if (error instanceof DOMException && error.name === 'AbortError') {\n return true;\n }\n // Node.js AbortError\n if (error instanceof Error && error.name === 'AbortError') {\n return true;\n }\n return false;\n}\n\n/**\n * Determine the network error code based on the error type/message\n */\nfunction getNetworkErrorCode(error: Error): 'network:connection_error' | 'network:timeout' | 'network:dns_error' {\n const message = error.message.toLowerCase();\n if (message.includes('timeout') || message.includes('timed out')) {\n return 'network:timeout';\n }\n if (message.includes('dns') || message.includes('getaddrinfo') || message.includes('enotfound')) {\n return 'network:dns_error';\n }\n return 'network:connection_error';\n}\n\n/**\n * Convert API errors to RiverbankApiError for consistent SDK error handling.\n * Handles:\n * - ApiEnvelopeError (from unwrapResponse)\n * - ApiRequestError (from fetch with HTTP error)\n * - Network errors (TypeError, etc. - wrapped with status 0)\n * - AbortError (let propagate raw for consumer detection)\n */\nfunction convertToTypedError(error: unknown): never {\n // Let AbortError propagate raw - it's intentional cancellation, not an error to retry\n if (isAbortError(error)) {\n throw error;\n }\n\n // Handle ApiEnvelopeError from unwrapResponse (error envelope in successful HTTP response)\n if (error instanceof ApiEnvelopeError) {\n throw new RiverbankApiError({\n code: error.code,\n message: error.message,\n requestId: error.requestId,\n timestamp: error.timestamp,\n status: error.status,\n fieldErrors: error.fieldErrors,\n });\n }\n\n // Handle ApiRequestError with envelope body (HTTP error with envelope format)\n if (error instanceof ApiRequestError && error.body && typeof error.body === 'object') {\n const body = error.body as ApiResult<unknown>;\n if (isApiError(body)) {\n // Merge envelope error with retryAfterMs from ApiRequestError\n const envelopeError = (body as ApiError).error;\n throw new RiverbankApiError({\n ...envelopeError,\n retryAfterMs: error.retryAfterMs,\n });\n }\n }\n\n // Wrap network errors (TypeError: Failed to fetch, etc.) as RiverbankApiError\n // These are transient errors that should be retryable\n if (error instanceof TypeError || (error instanceof Error && !('status' in error))) {\n const networkError = error as Error;\n throw new RiverbankApiError({\n code: getNetworkErrorCode(networkError),\n message: networkError.message || 'Network request failed',\n requestId: `local-${Date.now()}`,\n timestamp: new Date().toISOString(),\n status: 0, // No HTTP response received\n });\n }\n\n // Re-throw original error if not in envelope format\n throw error;\n}\n\n\n/**\n * Create a Riverbank CMS client for fetching content\n *\n * @example\n * ```ts\n * const client = createRiverbankClient({\n * apiKey: 'bld_live_sk_...',\n * baseUrl: 'https://dashboard.example.com/api',\n * });\n *\n * const site = await client.getSite({ slug: 'my-site' });\n * ```\n */\nexport function createRiverbankClient(config: RiverbankClientConfig): RiverbankClient {\n if (!config.baseUrl) {\n throw new Error(\n 'baseUrl is required when creating a Riverbank client. ' +\n 'Expected format: https://dashboard.example.com/api (must include /api path)'\n );\n }\n\n // Validate baseUrl format\n if (!config.baseUrl.endsWith('/api')) {\n throw new Error(\n `baseUrl must end with '/api'. Received: ${config.baseUrl}. ` +\n 'Expected format: https://dashboard.example.com/api'\n );\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n const cacheEnabled = config.cache?.enabled ?? true;\n const cacheTTL = (config.cache?.ttl ?? 300) * 1000; // Convert seconds to milliseconds\n const cacheMaxSize = config.cache?.maxSize ?? 100;\n\n // Resilience config with defaults\n const resilienceEnabled = config.resilience?.enabled ?? true;\n const staleIfError = config.resilience?.staleIfError ?? true;\n const staleTtlMs = (config.resilience?.staleTtlSec ?? 300) * 1000;\n const requestTimeoutMs = config.resilience?.requestTimeoutMs ??\n (typeof window !== 'undefined' ? DEFAULT_BROWSER_TIMEOUT_MS : DEFAULT_SERVER_TIMEOUT_MS);\n\n const retryConfig = {\n maxAttempts: config.resilience?.retry?.maxAttempts ?? DEFAULT_RETRY_CONFIG.maxAttempts,\n baseDelayMs: config.resilience?.retry?.baseDelayMs ?? DEFAULT_RETRY_CONFIG.baseDelayMs,\n maxDelayMs: config.resilience?.retry?.maxDelayMs ?? DEFAULT_RETRY_CONFIG.maxDelayMs,\n jitter: config.resilience?.retry?.jitter ?? DEFAULT_RETRY_CONFIG.jitter,\n retryOn: config.resilience?.retry?.retryOn,\n };\n\n const circuitBreakerConfig = {\n failureThreshold: config.resilience?.circuitBreaker?.failureThreshold ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.failureThreshold,\n resetTimeoutMs: config.resilience?.circuitBreaker?.resetTimeoutMs ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.resetTimeoutMs,\n halfOpenMaxRequests: config.resilience?.circuitBreaker?.halfOpenMaxRequests ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.halfOpenMaxRequests,\n };\n\n // ============================================================================\n // State\n // ============================================================================\n\n // Create internal API client with Bearer token auth\n const apiClient = createBearerAPIClient(config.apiKey, config.baseUrl);\n\n // Create cache instance with stale support\n const cache = new SimpleCache<unknown>({\n maxSize: cacheMaxSize,\n ttl: cacheTTL,\n staleTtl: staleTtlMs,\n });\n\n // Create circuit breaker\n const circuitBreaker = new CircuitBreaker(circuitBreakerConfig);\n\n // Last request status (for getResilienceStatus())\n let lastStatus: ResilienceStatus | null = null;\n\n // Track degraded mode for onDegradedMode callback\n let isDegraded = false;\n\n // ============================================================================\n // Status Emission\n // ============================================================================\n\n /**\n * Emit a status update and trigger callbacks\n */\n function emitStatus<T>(\n source: ResilienceSource,\n data: T | null,\n details: {\n requestId: string;\n cacheKey: string;\n isPreview: boolean;\n durationMs: number;\n error?: { code?: string; message: string };\n staleAgeSec?: number;\n }\n ): T {\n const status: ResilienceStatus = {\n source,\n isPreview: details.isPreview,\n cacheKey: details.cacheKey,\n error: details.error,\n staleAgeSec: details.staleAgeSec,\n circuit: circuitBreaker.getState(),\n requestId: details.requestId,\n durationMs: details.durationMs,\n };\n\n lastStatus = status;\n\n // Fire onStatusChange callback\n config.resilience?.onStatusChange?.(status);\n\n // Fire onDegradedMode callback on transitions\n const nowDegraded = source === 'stale' || source === 'error';\n if (nowDegraded !== isDegraded) {\n isDegraded = nowDegraded;\n config.resilience?.onDegradedMode?.(nowDegraded, status);\n }\n\n return data as T;\n }\n\n // ============================================================================\n // Resilient Fetch\n // ============================================================================\n\n /**\n * Fetch with resilience features: cache, stale fallback, retry, circuit breaker\n */\n async function resilientFetch<T>(\n cacheKey: string,\n fetcher: (signal: AbortSignal) => Promise<ApiResult<T>>,\n options: { preview?: boolean; force?: boolean; signal?: AbortSignal }\n ): Promise<T> {\n const requestId = generateRequestId();\n const startTime = Date.now();\n const isPreview = options.preview ?? false;\n\n // Helper to create status details\n const statusDetails = (extra: Partial<Parameters<typeof emitStatus>[2]> = {}) => ({\n requestId,\n cacheKey,\n isPreview,\n durationMs: Date.now() - startTime,\n ...extra,\n });\n\n // -------------------------------------------------------------------------\n // 1. Check fresh cache (unless force refresh)\n // -------------------------------------------------------------------------\n if (cacheEnabled && !options.force) {\n const fresh = cache.getFresh(cacheKey) as T | null;\n if (fresh !== null) {\n return emitStatus('cache', fresh, statusDetails());\n }\n }\n\n // -------------------------------------------------------------------------\n // 2. Circuit breaker check\n // -------------------------------------------------------------------------\n if (resilienceEnabled && circuitBreaker.isOpen()) {\n // Try stale fallback (non-preview only)\n if (!isPreview && staleIfError) {\n const stale = cache.getStale(cacheKey);\n if (stale) {\n return emitStatus('stale', stale.value as T, statusDetails({\n staleAgeSec: stale.staleAgeSec,\n error: { code: 'circuit_open', message: 'Circuit breaker is open' },\n }));\n }\n }\n\n // If force=true with circuit open, try anyway (user explicitly wants fresh)\n if (!options.force) {\n const circuitState = circuitBreaker.getState();\n emitStatus('error', null, statusDetails({\n error: { code: 'circuit_open', message: 'Circuit breaker is open' },\n }));\n throw new CircuitOpenError(circuitState);\n }\n }\n\n // -------------------------------------------------------------------------\n // 3. Attempt live fetch with retries\n // -------------------------------------------------------------------------\n try {\n let data: T;\n\n if (resilienceEnabled) {\n // Track half-open requests\n if (circuitBreaker.getState().state === 'half-open') {\n circuitBreaker.incrementHalfOpenRequests();\n }\n\n // Fetch with timeout and retry\n data = await fetchWithTimeoutAndRetry(\n async (timeoutSignal) => {\n // Combine timeout signal with user-provided signal\n const combinedSignal = options.signal\n ? combineAbortSignals(timeoutSignal, options.signal)\n : timeoutSignal;\n\n try {\n const response = await fetcher(combinedSignal);\n return unwrapResponse(response);\n } catch (error) {\n convertToTypedError(error);\n }\n },\n {\n ...retryConfig,\n requestTimeoutMs,\n }\n );\n\n circuitBreaker.recordSuccess();\n } else {\n // Non-resilient path (resilience disabled)\n try {\n const response = await fetcher(options.signal ?? new AbortController().signal);\n data = unwrapResponse(response);\n } catch (error) {\n convertToTypedError(error);\n }\n }\n\n // Store in cache\n if (cacheEnabled) {\n cache.set(cacheKey, data);\n }\n\n return emitStatus('live', data, statusDetails());\n } catch (error) {\n // Record failure for circuit breaker\n if (resilienceEnabled && error instanceof Error) {\n circuitBreaker.recordFailure(error);\n }\n\n // -----------------------------------------------------------------------\n // 4. Stale fallback (published only, not preview)\n // -----------------------------------------------------------------------\n if (!isPreview && staleIfError && cacheEnabled) {\n const stale = cache.getStale(cacheKey);\n if (stale) {\n const errorInfo = error instanceof RiverbankApiError\n ? { code: error.code, message: error.message }\n : { message: (error as Error).message };\n\n return emitStatus('stale', stale.value as T, statusDetails({\n staleAgeSec: stale.staleAgeSec,\n error: errorInfo,\n }));\n }\n }\n\n // -----------------------------------------------------------------------\n // 5. No fallback available - propagate error\n // -----------------------------------------------------------------------\n const errorInfo = error instanceof RiverbankApiError\n ? { code: error.code, message: error.message }\n : { message: (error as Error).message };\n\n emitStatus('error', null, statusDetails({ error: errorInfo }));\n throw error;\n }\n }\n\n // ============================================================================\n // Helper: Combine AbortSignals\n // ============================================================================\n\n /**\n * Combine multiple AbortSignals into one that aborts when any input aborts\n */\n function combineAbortSignals(...signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n break;\n }\n signal.addEventListener('abort', () => controller.abort(signal.reason), { once: true });\n }\n\n return controller.signal;\n }\n\n // ============================================================================\n // Client Methods\n // ============================================================================\n\n return {\n async getSite(params) {\n const { slug, domain, id, signal } = params;\n\n if (!slug && !domain && !id) {\n throw new Error(\n 'getSite() requires at least one identifier: slug, domain, or id. ' +\n `Received: ${JSON.stringify(params)}`\n );\n }\n\n const cacheKey = `site:${slug || domain || id}`;\n\n return resilientFetch(cacheKey, async (sig) => {\n const apiParams: Record<string, string> = {};\n if (params.slug) apiParams.slug = params.slug;\n if (params.domain) apiParams.domain = params.domain;\n if (params.id) apiParams.id = params.id;\n return await apiClient({ endpoint: 'getSite', params: apiParams, options: { signal: sig } });\n }, { signal });\n },\n\n async getPage(params) {\n const { siteId, path, preview = false, signal } = params;\n const cacheKey = `page:${siteId}:${path}:${preview}`;\n\n return resilientFetch(cacheKey, async (sig) => {\n return await apiClient({ endpoint: 'getContentByPath', params: { siteId }, body: { path, preview }, options: { signal: sig } });\n }, { preview, signal });\n },\n\n async getEntries(params: GetEntriesBaseParams & { includeMeta?: boolean }) {\n const { siteId, contentType, limit, offset, order, preview = false, mode, entryIds, includeMeta, signal } = params;\n\n const entryIdsCacheKey = mode === 'manual' && entryIds?.length ? entryIds.join(',') : '';\n const cacheKey = `entries:${siteId}:${contentType}:${limit ?? ''}:${offset ?? ''}:${order ?? ''}:${preview}:${mode ?? ''}:${entryIdsCacheKey}:${includeMeta ?? ''}`;\n\n return resilientFetch(cacheKey, async (sig) => {\n let orderParam: string | undefined;\n if (order === 'newest') {\n orderParam = 'published_at.desc';\n } else if (order === 'oldest') {\n orderParam = 'published_at.asc';\n } else if (order === 'title') {\n orderParam = 'title.asc';\n }\n\n const apiParams = {\n siteId,\n type: contentType,\n ...(typeof limit === 'number' && { limit: String(limit) }),\n ...(typeof offset === 'number' && { offset: String(offset) }),\n ...(includeMeta && { meta: 'true' }),\n ...(orderParam && { order: orderParam }),\n ...(preview && { stage: 'preview' as const }),\n ...(mode === 'manual' && entryIds?.length && {\n mode: 'manual' as const,\n entryIds: JSON.stringify(entryIds),\n }),\n };\n\n return await apiClient({ endpoint: 'listPublishedEntries', params: apiParams, options: { signal: sig } });\n }, { preview, signal });\n },\n\n async getEntry(params) {\n const { siteId, contentType, slug, signal } = params;\n const cacheKey = `entry:${siteId}:${contentType}:${slug}`;\n\n return resilientFetch(cacheKey, async (sig) => {\n return await apiClient({ endpoint: 'getPublishedEntryPreview', params: { siteId, type: contentType, slug }, options: { signal: sig } });\n }, { signal });\n },\n\n async getPublicFormById(params) {\n const { formId, signal } = params;\n if (!formId) {\n throw new Error('getPublicFormById() requires formId');\n }\n const cacheKey = `public-form:${formId}`;\n return resilientFetch(cacheKey, async (sig) => {\n return await apiClient({ endpoint: 'getPublicFormById', params: { formId }, options: { signal: sig } });\n }, { signal });\n },\n\n async getPublicBookingServices(params) {\n const { siteId, ids, signal } = params;\n if (!siteId) {\n throw new Error('getPublicBookingServices() requires siteId');\n }\n const cacheKey = `public-booking-services:${siteId}:${ids ?? ''}`;\n return resilientFetch(cacheKey, async (sig) => {\n const apiParams = {\n siteId,\n ...(ids && { ids }),\n };\n return await apiClient({ endpoint: 'getPublicBookingServices', params: apiParams, options: { signal: sig } });\n }, { signal });\n },\n\n async listPublicEvents(params) {\n const { siteId, limit, from, to, stage, signal } = params;\n if (!siteId) {\n throw new Error('listPublicEvents() requires siteId');\n }\n const cacheKey = `public-events:${siteId}:${limit ?? ''}:${from ?? ''}:${to ?? ''}:${stage ?? ''}`;\n return resilientFetch(cacheKey, async (sig) => {\n const apiParams = {\n siteId,\n ...(typeof limit === 'number' && { limit: String(limit) }),\n ...(from && { from }),\n ...(to && { to }),\n ...(stage && { stage }),\n };\n return await apiClient({ endpoint: 'listPublicEvents', params: apiParams, options: { signal: sig } });\n }, { signal });\n },\n\n async resolveEventOccurrence(params) {\n const { siteId, entryId, segment, signal } = params;\n if (!siteId || !entryId || !segment) {\n throw new Error('resolveEventOccurrence() requires siteId, entryId, and segment');\n }\n const cacheKey = `event-occurrence:${siteId}:${entryId}:${segment}`;\n return resilientFetch(cacheKey, async (sig) => {\n return await apiClient({\n endpoint: 'resolveEventOccurrence',\n params: { siteId, entryId, segment },\n options: { signal: sig },\n });\n }, { signal });\n },\n\n async checkRedirect(params) {\n const { siteId, path, signal } = params;\n if (!siteId || !path) {\n throw new Error('checkRedirect() requires siteId and path');\n }\n const cacheKey = `redirect:${siteId}:${path}`;\n return resilientFetch(cacheKey, async (sig) => {\n return await apiClient({\n endpoint: 'checkRedirect',\n params: { site: siteId, path },\n options: { signal: sig },\n });\n }, { signal });\n },\n\n clearCache() {\n cache.clear();\n },\n\n getLastEmittedStatus(): ResilienceStatus | null {\n return lastStatus;\n },\n\n getCircuitState(): CircuitState {\n return circuitBreaker.getState();\n },\n } as RiverbankClient;\n}\n\n// Re-export types\nexport type { RiverbankClient, RiverbankClientConfig, ResilienceConfig, ResilienceStatus } from './types';\n\n// Re-export error class\nexport { RiverbankApiError } from './error';\n\n// Re-export CircuitOpenError for consumer detection\nexport { CircuitOpenError } from './resilience';\n"]}
@@ -1,13 +0,0 @@
1
- // src/env.ts
2
- function isPreviewMode() {
3
- const explicit = process.env.RIVERBANK_PREVIEW;
4
- if (explicit !== void 0 && explicit !== "") {
5
- return explicit === "true";
6
- }
7
- return process.env.VERCEL_ENV === "preview";
8
- }
9
-
10
- export {
11
- isPreviewMode
12
- };
13
- //# sourceMappingURL=chunk-LQUKXIW7.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/env.ts"],"sourcesContent":["/**\n * Environment detection utilities for SDK\n *\n * Provides helpers for detecting preview mode and other environment states.\n */\n\n/**\n * Detects if the current environment is in preview mode.\n *\n * Precedence:\n * 1. RIVERBANK_PREVIEW env var (explicit override) - 'true' or 'false'\n * 2. VERCEL_ENV === 'preview' (Vercel preview deployments)\n * 3. Default: false (production behavior)\n *\n * In preview mode:\n * - Draft content is visible\n * - ISR revalidation is more aggressive\n * - Cache bypass may be enabled\n *\n * @returns true if in preview mode, false otherwise\n */\nexport function isPreviewMode(): boolean {\n const explicit = process.env.RIVERBANK_PREVIEW;\n\n // Explicit override takes precedence\n if (explicit !== undefined && explicit !== '') {\n return explicit === 'true';\n }\n\n // Fall back to Vercel environment detection\n return process.env.VERCEL_ENV === 'preview';\n}\n"],"mappings":";AAqBO,SAAS,gBAAyB;AACvC,QAAM,WAAW,QAAQ,IAAI;AAG7B,MAAI,aAAa,UAAa,aAAa,IAAI;AAC7C,WAAO,aAAa;AAAA,EACtB;AAGA,SAAO,QAAQ,IAAI,eAAe;AACpC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-VODFQMUW.js","../../src/webhooks/verify.ts"],"names":[],"mappings":"AAAA;ACMA,gFAAmB;AACnB,0BAAkB;AAKX,IAAM,qBAAA,EAAuB,MAAA,CAAE,MAAA,CAAO;AAAA;AAAA,EAE3C,KAAA,EAAO,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA;AAAA,EAEhB,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA;AAAA,EAEpB,MAAA,EAAQ,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA;AAAA,EAEjB,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,MAAA,CAAE,MAAA,CAAO,CAAA,EAAG,MAAA,CAAE,GAAA,CAAI,CAAC,CAAA;AAAA;AAAA,EAElC,IAAA,EAAM,MAAA,CAAE,KAAA,CAAM,MAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS;AACrC,CAAC,CAAA;AA4BM,SAAS,sBAAA,CACd,OAAA,EACA,SAAA,EACA,MAAA,EACS;AACT,EAAA,MAAM,kBAAA,EAAoB,gBAAA,CACvB,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA,CAC3B,MAAA,CAAO,OAAO,CAAA,CACd,MAAA,CAAO,KAAK,CAAA;AAIf,EAAA,GAAA,CAAI,SAAA,CAAU,OAAA,IAAW,iBAAA,CAAkB,MAAA,EAAQ;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,gBAAA,CAAO,eAAA;AAAA,IACZ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IACrB,MAAA,CAAO,IAAA,CAAK,iBAAiB;AAAA,EAC/B,CAAA;AACF;AA2BO,SAAS,mBAAA,CAAoB,IAAA,EAAkC;AACpE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EAC1B,EAAA,UAAQ;AACN,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,eAAe,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,OAAA,EAAS,oBAAA,CAAqB,SAAA,CAAU,MAAM,CAAA;AACpD,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,OAAA,EAAS;AACnB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,iBAAA,EAAoB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAA;AAC1E,EAAA;AAE6C,EAAA;AAC/C;AD3E6E;AACA;AACA;AACA;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-VODFQMUW.js","sourcesContent":[null,"/**\n * Webhook verification utilities for Riverbank SDK\n *\n * Provides framework-agnostic webhook signature verification and payload parsing.\n */\n\nimport crypto from 'crypto';\nimport { z } from 'zod';\n\n/**\n * Zod schema for webhook payload validation.\n */\nexport const WebhookPayloadSchema = z.object({\n /** Event type (e.g., 'page.published', 'entry.published') */\n event: z.string(),\n /** ISO timestamp of when the event occurred */\n timestamp: z.string(),\n /** Site ID that triggered the event */\n siteId: z.string(),\n /** Event-specific data (varies by event type) */\n data: z.record(z.string(), z.any()),\n /** Cache invalidation tags (for tag-based revalidation) */\n tags: z.array(z.string()).optional(),\n});\n\n/**\n * Webhook payload structure sent by the CMS.\n */\nexport type WebhookPayload = z.infer<typeof WebhookPayloadSchema>;\n\n/**\n * Verify a webhook signature using HMAC-SHA256.\n *\n * Uses timing-safe comparison to prevent timing attacks.\n *\n * @param payload - The raw request body as a string\n * @param signature - The X-Riverbank-Signature header value\n * @param secret - The webhook signing secret (RIVERBANK_WEBHOOK_SECRET)\n * @returns true if signature is valid, false otherwise\n *\n * @example\n * ```ts\n * const body = await request.text();\n * const signature = request.headers.get('x-riverbank-signature');\n * const secret = process.env.RIVERBANK_WEBHOOK_SECRET;\n *\n * if (!verifyWebhookSignature(body, signature, secret)) {\n * return new Response('Invalid signature', { status: 401 });\n * }\n * ```\n */\nexport function verifyWebhookSignature(\n payload: string,\n signature: string,\n secret: string\n): boolean {\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(payload)\n .digest('hex');\n\n // Length check before timing-safe comparison\n // timingSafeEqual throws if lengths differ\n if (signature.length !== expectedSignature.length) {\n return false;\n }\n\n // Timing-safe comparison to prevent timing attacks\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n}\n\n/**\n * Result type for webhook payload parsing.\n */\nexport type ParseWebhookResult =\n | { success: true; payload: WebhookPayload }\n | { success: false; error: string };\n\n/**\n * Parse and validate a webhook payload from the request body.\n *\n * Uses Zod schema validation to ensure the payload has the expected structure.\n *\n * @param body - The raw request body as a string\n * @returns A result object with either the validated payload or an error message\n *\n * @example\n * ```ts\n * const body = await request.text();\n * const result = parseWebhookPayload(body);\n * if (!result.success) {\n * return new Response(result.error, { status: 400 });\n * }\n * console.log(`Received ${result.payload.event} for site ${result.payload.siteId}`);\n * ```\n */\nexport function parseWebhookPayload(body: string): ParseWebhookResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return { success: false, error: 'Invalid JSON' };\n }\n\n const result = WebhookPayloadSchema.safeParse(parsed);\n if (!result.success) {\n return { success: false, error: `Invalid payload: ${result.error.message}` };\n }\n\n return { success: true, payload: result.data };\n}\n"]}
@@ -1,13 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/env.ts
2
- function isPreviewMode() {
3
- const explicit = process.env.RIVERBANK_PREVIEW;
4
- if (explicit !== void 0 && explicit !== "") {
5
- return explicit === "true";
6
- }
7
- return process.env.VERCEL_ENV === "preview";
8
- }
9
-
10
-
11
-
12
- exports.isPreviewMode = isPreviewMode;
13
- //# sourceMappingURL=chunk-WYNEYDXO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-WYNEYDXO.js","../../src/env.ts"],"names":[],"mappings":"AAAA;ACqBO,SAAS,aAAA,CAAA,EAAyB;AACvC,EAAA,MAAM,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,iBAAA;AAG7B,EAAA,GAAA,CAAI,SAAA,IAAa,KAAA,EAAA,GAAa,SAAA,IAAa,EAAA,EAAI;AAC7C,IAAA,OAAO,SAAA,IAAa,MAAA;AAAA,EACtB;AAGA,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,WAAA,IAAe,SAAA;AACpC;ADvBA;AACA;AACE;AACF,sCAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-WYNEYDXO.js","sourcesContent":[null,"/**\n * Environment detection utilities for SDK\n *\n * Provides helpers for detecting preview mode and other environment states.\n */\n\n/**\n * Detects if the current environment is in preview mode.\n *\n * Precedence:\n * 1. RIVERBANK_PREVIEW env var (explicit override) - 'true' or 'false'\n * 2. VERCEL_ENV === 'preview' (Vercel preview deployments)\n * 3. Default: false (production behavior)\n *\n * In preview mode:\n * - Draft content is visible\n * - ISR revalidation is more aggressive\n * - Cache bypass may be enabled\n *\n * @returns true if in preview mode, false otherwise\n */\nexport function isPreviewMode(): boolean {\n const explicit = process.env.RIVERBANK_PREVIEW;\n\n // Explicit override takes precedence\n if (explicit !== undefined && explicit !== '') {\n return explicit === 'true';\n }\n\n // Fall back to Vercel environment detection\n return process.env.VERCEL_ENV === 'preview';\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/loadPage-6I7F6GRF.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,6CAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/loadPage-6I7F6GRF.js"}