ttrpg-engine-dnd 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/CONTRIBUTING.md +98 -0
  3. package/DEVELOPMENT.md +70 -0
  4. package/LICENSE +21 -0
  5. package/README.md +247 -0
  6. package/VERSIONING.md +151 -0
  7. package/dist/content/index.d.ts +3 -0
  8. package/dist/content/index.d.ts.map +1 -0
  9. package/dist/content/pack.d.ts +1657 -0
  10. package/dist/content/pack.d.ts.map +1 -0
  11. package/dist/content/packs/starter.d.ts +4 -0
  12. package/dist/content/packs/starter.d.ts.map +1 -0
  13. package/dist/content/validate.d.ts +8 -0
  14. package/dist/content/validate.d.ts.map +1 -0
  15. package/dist/derive/ability-check.d.ts +26 -0
  16. package/dist/derive/ability-check.d.ts.map +1 -0
  17. package/dist/derive/ability.d.ts +9 -0
  18. package/dist/derive/ability.d.ts.map +1 -0
  19. package/dist/derive/ac.d.ts +19 -0
  20. package/dist/derive/ac.d.ts.map +1 -0
  21. package/dist/derive/action-economy.d.ts +17 -0
  22. package/dist/derive/action-economy.d.ts.map +1 -0
  23. package/dist/derive/attack.d.ts +20 -0
  24. package/dist/derive/attack.d.ts.map +1 -0
  25. package/dist/derive/character-view.d.ts +29 -0
  26. package/dist/derive/character-view.d.ts.map +1 -0
  27. package/dist/derive/damage-mitigation.d.ts +18 -0
  28. package/dist/derive/damage-mitigation.d.ts.map +1 -0
  29. package/dist/derive/effect-stack.d.ts +15 -0
  30. package/dist/derive/effect-stack.d.ts.map +1 -0
  31. package/dist/derive/encumbrance.d.ts +17 -0
  32. package/dist/derive/encumbrance.d.ts.map +1 -0
  33. package/dist/derive/index.d.ts +12 -0
  34. package/dist/derive/index.d.ts.map +1 -0
  35. package/dist/derive/save.d.ts +23 -0
  36. package/dist/derive/save.d.ts.map +1 -0
  37. package/dist/derive/spell-dc.d.ts +21 -0
  38. package/dist/derive/spell-dc.d.ts.map +1 -0
  39. package/dist/derive/spell-slots.d.ts +21 -0
  40. package/dist/derive/spell-slots.d.ts.map +1 -0
  41. package/dist/derive/terrain.d.ts +10 -0
  42. package/dist/derive/terrain.d.ts.map +1 -0
  43. package/dist/effects/builder.d.ts +66 -0
  44. package/dist/effects/builder.d.ts.map +1 -0
  45. package/dist/effects/formula.d.ts +12 -0
  46. package/dist/effects/formula.d.ts.map +1 -0
  47. package/dist/effects/index.d.ts +4 -0
  48. package/dist/effects/index.d.ts.map +1 -0
  49. package/dist/effects/predicate.d.ts +12 -0
  50. package/dist/effects/predicate.d.ts.map +1 -0
  51. package/dist/engine/apply.d.ts +5 -0
  52. package/dist/engine/apply.d.ts.map +1 -0
  53. package/dist/engine/commit.d.ts +12 -0
  54. package/dist/engine/commit.d.ts.map +1 -0
  55. package/dist/engine/conveniences.d.ts +7124 -0
  56. package/dist/engine/conveniences.d.ts.map +1 -0
  57. package/dist/engine/ids-utils.d.ts +2 -0
  58. package/dist/engine/ids-utils.d.ts.map +1 -0
  59. package/dist/engine/index.d.ts +107 -0
  60. package/dist/engine/index.d.ts.map +1 -0
  61. package/dist/engine/plan/action-surge.d.ts +10 -0
  62. package/dist/engine/plan/action-surge.d.ts.map +1 -0
  63. package/dist/engine/plan/attack.d.ts +30 -0
  64. package/dist/engine/plan/attack.d.ts.map +1 -0
  65. package/dist/engine/plan/cast-spell.d.ts +18 -0
  66. package/dist/engine/plan/cast-spell.d.ts.map +1 -0
  67. package/dist/engine/plan/checks.d.ts +26 -0
  68. package/dist/engine/plan/checks.d.ts.map +1 -0
  69. package/dist/engine/plan/concentration.d.ts +12 -0
  70. package/dist/engine/plan/concentration.d.ts.map +1 -0
  71. package/dist/engine/plan/contested.d.ts +28 -0
  72. package/dist/engine/plan/contested.d.ts.map +1 -0
  73. package/dist/engine/plan/encounter.d.ts +47 -0
  74. package/dist/engine/plan/encounter.d.ts.map +1 -0
  75. package/dist/engine/plan/falling.d.ts +11 -0
  76. package/dist/engine/plan/falling.d.ts.map +1 -0
  77. package/dist/engine/plan/index.d.ts +20 -0
  78. package/dist/engine/plan/index.d.ts.map +1 -0
  79. package/dist/engine/plan/level-up.d.ts +22 -0
  80. package/dist/engine/plan/level-up.d.ts.map +1 -0
  81. package/dist/engine/plan/movement.d.ts +25 -0
  82. package/dist/engine/plan/movement.d.ts.map +1 -0
  83. package/dist/engine/plan/multiattack.d.ts +12 -0
  84. package/dist/engine/plan/multiattack.d.ts.map +1 -0
  85. package/dist/engine/plan/npc.d.ts +21 -0
  86. package/dist/engine/plan/npc.d.ts.map +1 -0
  87. package/dist/engine/plan/offhand-attack.d.ts +13 -0
  88. package/dist/engine/plan/offhand-attack.d.ts.map +1 -0
  89. package/dist/engine/plan/opportunity-attack.d.ts +14 -0
  90. package/dist/engine/plan/opportunity-attack.d.ts.map +1 -0
  91. package/dist/engine/plan/reactive-spells.d.ts +34 -0
  92. package/dist/engine/plan/reactive-spells.d.ts.map +1 -0
  93. package/dist/engine/plan/rest.d.ts +16 -0
  94. package/dist/engine/plan/rest.d.ts.map +1 -0
  95. package/dist/engine/plan/travel.d.ts +21 -0
  96. package/dist/engine/plan/travel.d.ts.map +1 -0
  97. package/dist/engine/plan/weapon-mastery.d.ts +15 -0
  98. package/dist/engine/plan/weapon-mastery.d.ts.map +1 -0
  99. package/dist/engine/reducers/action-economy.d.ts +12 -0
  100. package/dist/engine/reducers/action-economy.d.ts.map +1 -0
  101. package/dist/engine/reducers/attack.d.ts +6 -0
  102. package/dist/engine/reducers/attack.d.ts.map +1 -0
  103. package/dist/engine/reducers/bastion.d.ts +10 -0
  104. package/dist/engine/reducers/bastion.d.ts.map +1 -0
  105. package/dist/engine/reducers/charges.d.ts +7 -0
  106. package/dist/engine/reducers/charges.d.ts.map +1 -0
  107. package/dist/engine/reducers/checks.d.ts +6 -0
  108. package/dist/engine/reducers/checks.d.ts.map +1 -0
  109. package/dist/engine/reducers/combat.d.ts +12 -0
  110. package/dist/engine/reducers/combat.d.ts.map +1 -0
  111. package/dist/engine/reducers/concentration.d.ts +6 -0
  112. package/dist/engine/reducers/concentration.d.ts.map +1 -0
  113. package/dist/engine/reducers/downtime.d.ts +5 -0
  114. package/dist/engine/reducers/downtime.d.ts.map +1 -0
  115. package/dist/engine/reducers/encounter.d.ts +11 -0
  116. package/dist/engine/reducers/encounter.d.ts.map +1 -0
  117. package/dist/engine/reducers/inventory.d.ts +9 -0
  118. package/dist/engine/reducers/inventory.d.ts.map +1 -0
  119. package/dist/engine/reducers/level-up.d.ts +7 -0
  120. package/dist/engine/reducers/level-up.d.ts.map +1 -0
  121. package/dist/engine/reducers/locations.d.ts +8 -0
  122. package/dist/engine/reducers/locations.d.ts.map +1 -0
  123. package/dist/engine/reducers/mounts-vehicles.d.ts +11 -0
  124. package/dist/engine/reducers/mounts-vehicles.d.ts.map +1 -0
  125. package/dist/engine/reducers/movement.d.ts +7 -0
  126. package/dist/engine/reducers/movement.d.ts.map +1 -0
  127. package/dist/engine/reducers/npc.d.ts +7 -0
  128. package/dist/engine/reducers/npc.d.ts.map +1 -0
  129. package/dist/engine/reducers/party.d.ts +10 -0
  130. package/dist/engine/reducers/party.d.ts.map +1 -0
  131. package/dist/engine/reducers/progression.d.ts +5 -0
  132. package/dist/engine/reducers/progression.d.ts.map +1 -0
  133. package/dist/engine/reducers/quests.d.ts +14 -0
  134. package/dist/engine/reducers/quests.d.ts.map +1 -0
  135. package/dist/engine/reducers/reactive-spells.d.ts +7 -0
  136. package/dist/engine/reducers/reactive-spells.d.ts.map +1 -0
  137. package/dist/engine/reducers/resources.d.ts +7 -0
  138. package/dist/engine/reducers/resources.d.ts.map +1 -0
  139. package/dist/engine/reducers/rest.d.ts +8 -0
  140. package/dist/engine/reducers/rest.d.ts.map +1 -0
  141. package/dist/engine/reducers/resurrection.d.ts +5 -0
  142. package/dist/engine/reducers/resurrection.d.ts.map +1 -0
  143. package/dist/engine/reducers/session.d.ts +8 -0
  144. package/dist/engine/reducers/session.d.ts.map +1 -0
  145. package/dist/engine/reducers/settings.d.ts +5 -0
  146. package/dist/engine/reducers/settings.d.ts.map +1 -0
  147. package/dist/engine/reducers/spellcasting.d.ts +7 -0
  148. package/dist/engine/reducers/spellcasting.d.ts.map +1 -0
  149. package/dist/engine/reducers/transformations.d.ts +8 -0
  150. package/dist/engine/reducers/transformations.d.ts.map +1 -0
  151. package/dist/engine/reducers/travel.d.ts +7 -0
  152. package/dist/engine/reducers/travel.d.ts.map +1 -0
  153. package/dist/engine/reducers/triggers.d.ts +9 -0
  154. package/dist/engine/reducers/triggers.d.ts.map +1 -0
  155. package/dist/engine/reducers/weapon-mastery.d.ts +5 -0
  156. package/dist/engine/reducers/weapon-mastery.d.ts.map +1 -0
  157. package/dist/engine/replay.d.ts +4 -0
  158. package/dist/engine/replay.d.ts.map +1 -0
  159. package/dist/engine/triggers/dispatch.d.ts +13 -0
  160. package/dist/engine/triggers/dispatch.d.ts.map +1 -0
  161. package/dist/engine/undo-redo.d.ts +4 -0
  162. package/dist/engine/undo-redo.d.ts.map +1 -0
  163. package/dist/handlers/context.d.ts +7 -0
  164. package/dist/handlers/context.d.ts.map +1 -0
  165. package/dist/handlers/index.d.ts +12 -0
  166. package/dist/handlers/index.d.ts.map +1 -0
  167. package/dist/ids.d.ts +64 -0
  168. package/dist/ids.d.ts.map +1 -0
  169. package/dist/index.d.ts +72 -0
  170. package/dist/index.d.ts.map +1 -0
  171. package/dist/internal/clock.d.ts +2 -0
  172. package/dist/internal/clock.d.ts.map +1 -0
  173. package/dist/internal/constants.d.ts +6 -0
  174. package/dist/internal/constants.d.ts.map +1 -0
  175. package/dist/internal/immer.d.ts +4 -0
  176. package/dist/internal/immer.d.ts.map +1 -0
  177. package/dist/internal/invariants.d.ts +5 -0
  178. package/dist/internal/invariants.d.ts.map +1 -0
  179. package/dist/migrations/index.d.ts +5 -0
  180. package/dist/migrations/index.d.ts.map +1 -0
  181. package/dist/rng/default.d.ts +6 -0
  182. package/dist/rng/default.d.ts.map +1 -0
  183. package/dist/rng/dice.d.ts +20 -0
  184. package/dist/rng/dice.d.ts.map +1 -0
  185. package/dist/rng/index.d.ts +10 -0
  186. package/dist/rng/index.d.ts.map +1 -0
  187. package/dist/rng/seeded.d.ts +9 -0
  188. package/dist/rng/seeded.d.ts.map +1 -0
  189. package/dist/rng/throw.d.ts +9 -0
  190. package/dist/rng/throw.d.ts.map +1 -0
  191. package/dist/schemas/content/background.d.ts +46 -0
  192. package/dist/schemas/content/background.d.ts.map +1 -0
  193. package/dist/schemas/content/class.d.ts +264 -0
  194. package/dist/schemas/content/class.d.ts.map +1 -0
  195. package/dist/schemas/content/condition.d.ts +90 -0
  196. package/dist/schemas/content/condition.d.ts.map +1 -0
  197. package/dist/schemas/content/feat.d.ts +25 -0
  198. package/dist/schemas/content/feat.d.ts.map +1 -0
  199. package/dist/schemas/content/index.d.ts +9 -0
  200. package/dist/schemas/content/index.d.ts.map +1 -0
  201. package/dist/schemas/content/item.d.ts +602 -0
  202. package/dist/schemas/content/item.d.ts.map +1 -0
  203. package/dist/schemas/content/monster.d.ts +203 -0
  204. package/dist/schemas/content/monster.d.ts.map +1 -0
  205. package/dist/schemas/content/species.d.ts +63 -0
  206. package/dist/schemas/content/species.d.ts.map +1 -0
  207. package/dist/schemas/content/spell.d.ts +253 -0
  208. package/dist/schemas/content/spell.d.ts.map +1 -0
  209. package/dist/schemas/effects.d.ts +175 -0
  210. package/dist/schemas/effects.d.ts.map +1 -0
  211. package/dist/schemas/events/action-economy.d.ts +38 -0
  212. package/dist/schemas/events/action-economy.d.ts.map +1 -0
  213. package/dist/schemas/events/attack.d.ts +139 -0
  214. package/dist/schemas/events/attack.d.ts.map +1 -0
  215. package/dist/schemas/events/bastion.d.ts +227 -0
  216. package/dist/schemas/events/bastion.d.ts.map +1 -0
  217. package/dist/schemas/events/charges.d.ts +110 -0
  218. package/dist/schemas/events/charges.d.ts.map +1 -0
  219. package/dist/schemas/events/checks.d.ts +103 -0
  220. package/dist/schemas/events/checks.d.ts.map +1 -0
  221. package/dist/schemas/events/combat.d.ts +308 -0
  222. package/dist/schemas/events/combat.d.ts.map +1 -0
  223. package/dist/schemas/events/concentration.d.ts +99 -0
  224. package/dist/schemas/events/concentration.d.ts.map +1 -0
  225. package/dist/schemas/events/downtime.d.ts +53 -0
  226. package/dist/schemas/events/downtime.d.ts.map +1 -0
  227. package/dist/schemas/events/encounter.d.ts +260 -0
  228. package/dist/schemas/events/encounter.d.ts.map +1 -0
  229. package/dist/schemas/events/envelope.d.ts +22 -0
  230. package/dist/schemas/events/envelope.d.ts.map +1 -0
  231. package/dist/schemas/events/index.d.ts +4594 -0
  232. package/dist/schemas/events/index.d.ts.map +1 -0
  233. package/dist/schemas/events/inventory.d.ts +253 -0
  234. package/dist/schemas/events/inventory.d.ts.map +1 -0
  235. package/dist/schemas/events/level-up.d.ts +141 -0
  236. package/dist/schemas/events/level-up.d.ts.map +1 -0
  237. package/dist/schemas/events/locations.d.ts +183 -0
  238. package/dist/schemas/events/locations.d.ts.map +1 -0
  239. package/dist/schemas/events/mounts-vehicles.d.ts +233 -0
  240. package/dist/schemas/events/mounts-vehicles.d.ts.map +1 -0
  241. package/dist/schemas/events/movement.d.ts +131 -0
  242. package/dist/schemas/events/movement.d.ts.map +1 -0
  243. package/dist/schemas/events/npc.d.ts +113 -0
  244. package/dist/schemas/events/npc.d.ts.map +1 -0
  245. package/dist/schemas/events/party.d.ts +260 -0
  246. package/dist/schemas/events/party.d.ts.map +1 -0
  247. package/dist/schemas/events/progression.d.ts +698 -0
  248. package/dist/schemas/events/progression.d.ts.map +1 -0
  249. package/dist/schemas/events/quests.d.ts +426 -0
  250. package/dist/schemas/events/quests.d.ts.map +1 -0
  251. package/dist/schemas/events/reactive-spells.d.ts +98 -0
  252. package/dist/schemas/events/reactive-spells.d.ts.map +1 -0
  253. package/dist/schemas/events/resources.d.ts +107 -0
  254. package/dist/schemas/events/resources.d.ts.map +1 -0
  255. package/dist/schemas/events/rest.d.ts +104 -0
  256. package/dist/schemas/events/rest.d.ts.map +1 -0
  257. package/dist/schemas/events/resurrection.d.ts +44 -0
  258. package/dist/schemas/events/resurrection.d.ts.map +1 -0
  259. package/dist/schemas/events/session.d.ts +144 -0
  260. package/dist/schemas/events/session.d.ts.map +1 -0
  261. package/dist/schemas/events/settings.d.ts +47 -0
  262. package/dist/schemas/events/settings.d.ts.map +1 -0
  263. package/dist/schemas/events/spellcasting.d.ts +103 -0
  264. package/dist/schemas/events/spellcasting.d.ts.map +1 -0
  265. package/dist/schemas/events/transformations.d.ts +279 -0
  266. package/dist/schemas/events/transformations.d.ts.map +1 -0
  267. package/dist/schemas/events/travel.d.ts +143 -0
  268. package/dist/schemas/events/travel.d.ts.map +1 -0
  269. package/dist/schemas/events/triggers.d.ts +60 -0
  270. package/dist/schemas/events/triggers.d.ts.map +1 -0
  271. package/dist/schemas/events/weapon-mastery.d.ts +38 -0
  272. package/dist/schemas/events/weapon-mastery.d.ts.map +1 -0
  273. package/dist/schemas/formula.d.ts +103 -0
  274. package/dist/schemas/formula.d.ts.map +1 -0
  275. package/dist/schemas/index.d.ts +8 -0
  276. package/dist/schemas/index.d.ts.map +1 -0
  277. package/dist/schemas/predicate.d.ts +72 -0
  278. package/dist/schemas/predicate.d.ts.map +1 -0
  279. package/dist/schemas/primitives.d.ts +156 -0
  280. package/dist/schemas/primitives.d.ts.map +1 -0
  281. package/dist/schemas/runtime/bastion.d.ts +130 -0
  282. package/dist/schemas/runtime/bastion.d.ts.map +1 -0
  283. package/dist/schemas/runtime/campaign.d.ts +2122 -0
  284. package/dist/schemas/runtime/campaign.d.ts.map +1 -0
  285. package/dist/schemas/runtime/character.d.ts +580 -0
  286. package/dist/schemas/runtime/character.d.ts.map +1 -0
  287. package/dist/schemas/runtime/currency.d.ts +9 -0
  288. package/dist/schemas/runtime/currency.d.ts.map +1 -0
  289. package/dist/schemas/runtime/downtime.d.ts +31 -0
  290. package/dist/schemas/runtime/downtime.d.ts.map +1 -0
  291. package/dist/schemas/runtime/effect-instance.d.ts +65 -0
  292. package/dist/schemas/runtime/effect-instance.d.ts.map +1 -0
  293. package/dist/schemas/runtime/encounter.d.ts +264 -0
  294. package/dist/schemas/runtime/encounter.d.ts.map +1 -0
  295. package/dist/schemas/runtime/in-game-time.d.ts +18 -0
  296. package/dist/schemas/runtime/in-game-time.d.ts.map +1 -0
  297. package/dist/schemas/runtime/index.d.ts +15 -0
  298. package/dist/schemas/runtime/index.d.ts.map +1 -0
  299. package/dist/schemas/runtime/item-instance.d.ts +66 -0
  300. package/dist/schemas/runtime/item-instance.d.ts.map +1 -0
  301. package/dist/schemas/runtime/location.d.ts +111 -0
  302. package/dist/schemas/runtime/location.d.ts.map +1 -0
  303. package/dist/schemas/runtime/party.d.ts +52 -0
  304. package/dist/schemas/runtime/party.d.ts.map +1 -0
  305. package/dist/schemas/runtime/pending-choice.d.ts +77 -0
  306. package/dist/schemas/runtime/pending-choice.d.ts.map +1 -0
  307. package/dist/schemas/runtime/quest.d.ts +207 -0
  308. package/dist/schemas/runtime/quest.d.ts.map +1 -0
  309. package/dist/schemas/runtime/session.d.ts +102 -0
  310. package/dist/schemas/runtime/session.d.ts.map +1 -0
  311. package/dist/schemas/runtime/settings.d.ts +26 -0
  312. package/dist/schemas/runtime/settings.d.ts.map +1 -0
  313. package/dist/schemas/runtime/travel.d.ts +34 -0
  314. package/dist/schemas/runtime/travel.d.ts.map +1 -0
  315. package/dist/schemas/runtime/vehicle.d.ts +49 -0
  316. package/dist/schemas/runtime/vehicle.d.ts.map +1 -0
  317. package/dist/ttrpg-engine-dnd.cjs +6 -0
  318. package/dist/ttrpg-engine-dnd.cjs.map +1 -0
  319. package/dist/ttrpg-engine-dnd.js +10464 -0
  320. package/dist/ttrpg-engine-dnd.js.map +1 -0
  321. package/dist/types/index.d.ts +8 -0
  322. package/dist/types/index.d.ts.map +1 -0
  323. package/dist/version.d.ts +3 -0
  324. package/dist/version.d.ts.map +1 -0
  325. package/docs/api-overview.md +111 -0
  326. package/docs/concepts.md +154 -0
  327. package/docs/getting-started.md +142 -0
  328. package/docs/recipes.md +302 -0
  329. package/package.json +83 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttrpg-engine-dnd.js","sources":["../src/version.ts","../src/ids.ts","../src/schemas/primitives.ts","../src/schemas/formula.ts","../src/schemas/predicate.ts","../src/schemas/effects.ts","../src/schemas/content/condition.ts","../src/schemas/content/species.ts","../src/schemas/content/background.ts","../src/schemas/content/feat.ts","../src/schemas/content/class.ts","../src/schemas/content/spell.ts","../src/schemas/content/item.ts","../src/schemas/content/monster.ts","../src/schemas/runtime/character.ts","../src/schemas/runtime/item-instance.ts","../src/schemas/runtime/effect-instance.ts","../src/schemas/runtime/pending-choice.ts","../src/schemas/runtime/encounter.ts","../src/schemas/runtime/currency.ts","../src/schemas/runtime/party.ts","../src/schemas/runtime/in-game-time.ts","../src/schemas/runtime/session.ts","../src/schemas/runtime/location.ts","../src/schemas/runtime/quest.ts","../src/schemas/events/envelope.ts","../src/schemas/events/quests.ts","../src/schemas/runtime/vehicle.ts","../src/schemas/runtime/travel.ts","../src/schemas/events/downtime.ts","../src/schemas/runtime/downtime.ts","../src/schemas/runtime/bastion.ts","../src/schemas/runtime/settings.ts","../src/schemas/runtime/campaign.ts","../src/schemas/events/combat.ts","../src/schemas/events/resources.ts","../src/schemas/events/rest.ts","../src/schemas/events/progression.ts","../src/schemas/events/encounter.ts","../src/schemas/events/attack.ts","../src/schemas/events/inventory.ts","../src/schemas/events/level-up.ts","../src/schemas/events/checks.ts","../src/schemas/events/spellcasting.ts","../src/schemas/events/concentration.ts","../src/schemas/events/triggers.ts","../src/schemas/events/action-economy.ts","../src/schemas/events/movement.ts","../src/schemas/events/party.ts","../src/schemas/events/session.ts","../src/schemas/events/locations.ts","../src/schemas/events/reactive-spells.ts","../src/schemas/events/weapon-mastery.ts","../src/schemas/events/mounts-vehicles.ts","../src/schemas/events/travel.ts","../src/schemas/events/npc.ts","../src/schemas/events/charges.ts","../src/schemas/events/bastion.ts","../src/schemas/events/settings.ts","../src/schemas/events/resurrection.ts","../src/schemas/events/transformations.ts","../src/schemas/events/index.ts","../src/content/pack.ts","../src/content/validate.ts","../src/content/packs/starter.ts","../src/rng/default.ts","../src/rng/seeded.ts","../src/rng/throw.ts","../src/rng/dice.ts","../src/derive/ability.ts","../src/effects/builder.ts","../src/derive/effect-stack.ts","../src/derive/ac.ts","../src/derive/attack.ts","../src/internal/constants.ts","../src/derive/save.ts","../src/derive/spell-dc.ts","../src/derive/spell-slots.ts","../src/derive/character-view.ts","../src/derive/ability-check.ts","../src/derive/action-economy.ts","../src/derive/terrain.ts","../src/effects/formula.ts","../src/effects/predicate.ts","../src/internal/immer.ts","../src/internal/invariants.ts","../src/engine/reducers/progression.ts","../src/engine/reducers/combat.ts","../src/engine/reducers/action-economy.ts","../src/engine/reducers/resources.ts","../src/engine/reducers/triggers.ts","../src/engine/reducers/rest.ts","../src/engine/reducers/encounter.ts","../src/engine/reducers/inventory.ts","../src/engine/reducers/level-up.ts","../src/engine/reducers/spellcasting.ts","../src/engine/reducers/concentration.ts","../src/engine/reducers/movement.ts","../src/engine/reducers/party.ts","../src/engine/reducers/session.ts","../src/engine/reducers/locations.ts","../src/engine/reducers/quests.ts","../src/engine/reducers/reactive-spells.ts","../src/engine/reducers/weapon-mastery.ts","../src/engine/reducers/mounts-vehicles.ts","../src/engine/reducers/travel.ts","../src/engine/reducers/npc.ts","../src/engine/reducers/downtime.ts","../src/engine/reducers/charges.ts","../src/engine/reducers/bastion.ts","../src/engine/reducers/settings.ts","../src/engine/reducers/resurrection.ts","../src/engine/reducers/transformations.ts","../src/engine/apply.ts","../src/engine/replay.ts","../src/engine/commit.ts","../src/engine/undo-redo.ts","../src/engine/conveniences.ts","../src/internal/clock.ts","../src/engine/plan/rest.ts","../src/derive/damage-mitigation.ts","../src/engine/triggers/dispatch.ts","../src/engine/plan/attack.ts","../src/engine/plan/opportunity-attack.ts","../src/engine/plan/encounter.ts","../src/engine/plan/level-up.ts","../src/engine/plan/checks.ts","../src/engine/plan/cast-spell.ts","../src/engine/plan/concentration.ts","../src/engine/plan/movement.ts","../src/engine/plan/action-surge.ts","../src/engine/plan/offhand-attack.ts","../src/engine/plan/multiattack.ts","../src/engine/plan/falling.ts","../src/engine/plan/contested.ts","../src/engine/plan/reactive-spells.ts","../src/engine/plan/weapon-mastery.ts","../src/engine/plan/travel.ts","../src/engine/plan/npc.ts","../src/engine/index.ts","../src/migrations/index.ts"],"sourcesContent":["export const SCHEMA_VERSION = 1 as const;\n\nexport type SchemaVersion = typeof SCHEMA_VERSION;\n","import { ulid } from 'ulid';\n\ndeclare const brand: unique symbol;\ntype Brand<T, B extends string> = T & { readonly [brand]: B };\n\nexport type CharacterId = Brand<string, 'CharacterId'>;\nexport type CreatureId = Brand<string, 'CreatureId'>;\nexport type CombatantId = CharacterId | CreatureId;\nexport type PartyId = Brand<string, 'PartyId'>;\nexport type EncounterId = Brand<string, 'EncounterId'>;\nexport type CampaignId = Brand<string, 'CampaignId'>;\nexport type SessionId = Brand<string, 'SessionId'>;\nexport type LocationId = Brand<string, 'LocationId'>;\nexport type QuestId = Brand<string, 'QuestId'>;\nexport type JournalEntryId = Brand<string, 'JournalEntryId'>;\nexport type EventId = Brand<string, 'EventId'>;\nexport type ChoiceId = Brand<string, 'ChoiceId'>;\nexport type EffectInstanceId = Brand<string, 'EffectInstanceId'>;\nexport type AppliedConditionId = Brand<string, 'AppliedConditionId'>;\n\nexport type SpeciesId = Brand<string, 'SpeciesId'>;\nexport type BackgroundId = Brand<string, 'BackgroundId'>;\nexport type ClassId = Brand<string, 'ClassId'>;\nexport type SubclassId = Brand<string, 'SubclassId'>;\nexport type ClassFeatureId = Brand<string, 'ClassFeatureId'>;\nexport type FeatId = Brand<string, 'FeatId'>;\nexport type SpellId = Brand<string, 'SpellId'>;\nexport type ConditionId = Brand<string, 'ConditionId'>;\nexport type MonsterStatblockId = Brand<string, 'MonsterStatblockId'>;\nexport type ResourceId = Brand<string, 'ResourceId'>;\n\nexport type ItemDefinitionId = Brand<string, 'ItemDefinitionId'>;\nexport type ItemInstanceId = Brand<string, 'ItemInstanceId'>;\n\nexport type ContentPackId = Brand<string, 'ContentPackId'>;\nexport type HandlerId = Brand<string, 'HandlerId'>;\n\nexport const newCharacterId = (): CharacterId => ulid() as CharacterId;\nexport const newCreatureId = (): CreatureId => ulid() as CreatureId;\nexport const newPartyId = (): PartyId => ulid() as PartyId;\nexport const newEncounterId = (): EncounterId => ulid() as EncounterId;\nexport const newCampaignId = (): CampaignId => ulid() as CampaignId;\nexport const newSessionId = (): SessionId => ulid() as SessionId;\nexport const newLocationId = (): LocationId => ulid() as LocationId;\nexport const newQuestId = (): QuestId => ulid() as QuestId;\nexport const newJournalEntryId = (): JournalEntryId => ulid() as JournalEntryId;\nexport const newEventId = (): EventId => ulid() as EventId;\nexport const newChoiceId = (): ChoiceId => ulid() as ChoiceId;\nexport const newEffectInstanceId = (): EffectInstanceId => ulid() as EffectInstanceId;\nexport const newAppliedConditionId = (): AppliedConditionId => ulid() as AppliedConditionId;\nexport const newItemInstanceId = (): ItemInstanceId => ulid() as ItemInstanceId;\n\nexport const asCharacterId = (s: string): CharacterId => s as CharacterId;\nexport const asCreatureId = (s: string): CreatureId => s as CreatureId;\nexport const asSpeciesId = (s: string): SpeciesId => s as SpeciesId;\nexport const asBackgroundId = (s: string): BackgroundId => s as BackgroundId;\nexport const asClassId = (s: string): ClassId => s as ClassId;\nexport const asSubclassId = (s: string): SubclassId => s as SubclassId;\nexport const asClassFeatureId = (s: string): ClassFeatureId => s as ClassFeatureId;\nexport const asFeatId = (s: string): FeatId => s as FeatId;\nexport const asSpellId = (s: string): SpellId => s as SpellId;\nexport const asConditionId = (s: string): ConditionId => s as ConditionId;\nexport const asMonsterStatblockId = (s: string): MonsterStatblockId => s as MonsterStatblockId;\nexport const asResourceId = (s: string): ResourceId => s as ResourceId;\nexport const asItemDefinitionId = (s: string): ItemDefinitionId => s as ItemDefinitionId;\nexport const asItemInstanceId = (s: string): ItemInstanceId => s as ItemInstanceId;\nexport const asContentPackId = (s: string): ContentPackId => s as ContentPackId;\nexport const asHandlerId = (s: string): HandlerId => s as HandlerId;\n","import { z } from 'zod';\n\nexport const ABILITY_SCORES = ['STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA'] as const;\nexport const AbilityScoreSchema = z.enum(ABILITY_SCORES);\nexport type AbilityScore = z.infer<typeof AbilityScoreSchema>;\n\nexport const ABILITY_SCORE_MIN = 1;\nexport const ABILITY_SCORE_MAX = 30;\nexport const AbilityScoreValueSchema = z\n .number()\n .int()\n .min(ABILITY_SCORE_MIN)\n .max(ABILITY_SCORE_MAX);\n\nexport const AbilityScoresSchema = z.object({\n STR: AbilityScoreValueSchema,\n DEX: AbilityScoreValueSchema,\n CON: AbilityScoreValueSchema,\n INT: AbilityScoreValueSchema,\n WIS: AbilityScoreValueSchema,\n CHA: AbilityScoreValueSchema,\n});\nexport type AbilityScores = z.infer<typeof AbilityScoresSchema>;\n\nexport const SIZES = ['Tiny', 'Small', 'Medium', 'Large', 'Huge', 'Gargantuan'] as const;\nexport const SizeSchema = z.enum(SIZES);\nexport type Size = z.infer<typeof SizeSchema>;\n\nexport const CREATURE_TYPES = [\n 'Aberration',\n 'Beast',\n 'Celestial',\n 'Construct',\n 'Dragon',\n 'Elemental',\n 'Fey',\n 'Fiend',\n 'Giant',\n 'Humanoid',\n 'Monstrosity',\n 'Ooze',\n 'Plant',\n 'Undead',\n] as const;\nexport const CreatureTypeSchema = z.enum(CREATURE_TYPES);\nexport type CreatureType = z.infer<typeof CreatureTypeSchema>;\n\nexport const DAMAGE_TYPES = [\n 'acid',\n 'bludgeoning',\n 'cold',\n 'fire',\n 'force',\n 'lightning',\n 'necrotic',\n 'piercing',\n 'poison',\n 'psychic',\n 'radiant',\n 'slashing',\n 'thunder',\n] as const;\nexport const DamageTypeSchema = z.enum(DAMAGE_TYPES);\nexport type DamageType = z.infer<typeof DamageTypeSchema>;\n\nexport const SKILLS = [\n 'acrobatics',\n 'animal-handling',\n 'arcana',\n 'athletics',\n 'deception',\n 'history',\n 'insight',\n 'intimidation',\n 'investigation',\n 'medicine',\n 'nature',\n 'perception',\n 'performance',\n 'persuasion',\n 'religion',\n 'sleight-of-hand',\n 'stealth',\n 'survival',\n] as const;\nexport const SkillSchema = z.enum(SKILLS);\nexport type Skill = z.infer<typeof SkillSchema>;\n\nexport const SKILL_ABILITY: Record<Skill, AbilityScore> = {\n acrobatics: 'DEX',\n 'animal-handling': 'WIS',\n arcana: 'INT',\n athletics: 'STR',\n deception: 'CHA',\n history: 'INT',\n insight: 'WIS',\n intimidation: 'CHA',\n investigation: 'INT',\n medicine: 'WIS',\n nature: 'INT',\n perception: 'WIS',\n performance: 'CHA',\n persuasion: 'CHA',\n religion: 'INT',\n 'sleight-of-hand': 'DEX',\n stealth: 'DEX',\n survival: 'WIS',\n};\n\nexport const ProficiencyLevelSchema = z.enum(['none', 'half', 'proficient', 'expertise']);\nexport type ProficiencyLevel = z.infer<typeof ProficiencyLevelSchema>;\n\nexport const PROFICIENCY_MULTIPLIER: Record<ProficiencyLevel, number> = {\n none: 0,\n half: 0.5,\n proficient: 1,\n expertise: 2,\n};\n\nexport const HitDieSchema = z.union([\n z.literal(6),\n z.literal(8),\n z.literal(10),\n z.literal(12),\n]);\nexport type HitDie = z.infer<typeof HitDieSchema>;\n\nexport const MovementModeSchema = z.enum(['walk', 'fly', 'swim', 'climb', 'burrow']);\nexport type MovementMode = z.infer<typeof MovementModeSchema>;\n\nexport const SpeedSchema = z.object({\n walk: z.number().int().min(0).default(0),\n fly: z.number().int().min(0).optional(),\n swim: z.number().int().min(0).optional(),\n climb: z.number().int().min(0).optional(),\n burrow: z.number().int().min(0).optional(),\n hover: z.boolean().optional(),\n});\nexport type Speed = z.infer<typeof SpeedSchema>;\n\nexport const SenseSchema = z.enum(['darkvision', 'blindsight', 'tremorsense', 'truesight']);\nexport type Sense = z.infer<typeof SenseSchema>;\n\nexport const SensesSchema = z.object({\n darkvision: z.number().int().min(0).optional(),\n blindsight: z.number().int().min(0).optional(),\n tremorsense: z.number().int().min(0).optional(),\n truesight: z.number().int().min(0).optional(),\n passivePerceptionOverride: z.number().int().min(0).optional(),\n});\nexport type Senses = z.infer<typeof SensesSchema>;\n\nexport const SpellSchoolSchema = z.enum([\n 'abjuration',\n 'conjuration',\n 'divination',\n 'enchantment',\n 'evocation',\n 'illusion',\n 'necromancy',\n 'transmutation',\n]);\nexport type SpellSchool = z.infer<typeof SpellSchoolSchema>;\n\nexport const SPELL_LEVEL_MIN = 0;\nexport const SPELL_LEVEL_MAX = 9;\nexport const SpellLevelSchema = z.number().int().min(SPELL_LEVEL_MIN).max(SPELL_LEVEL_MAX);\nexport type SpellLevel = z.infer<typeof SpellLevelSchema>;\n\nexport const CHARACTER_LEVEL_MIN = 1;\nexport const CHARACTER_LEVEL_MAX = 20;\nexport const CharacterLevelSchema = z\n .number()\n .int()\n .min(CHARACTER_LEVEL_MIN)\n .max(CHARACTER_LEVEL_MAX);\nexport type CharacterLevel = z.infer<typeof CharacterLevelSchema>;\n\nexport const EXHAUSTION_MIN = 0;\nexport const EXHAUSTION_MAX = 6;\nexport const ExhaustionLevelSchema = z\n .number()\n .int()\n .min(EXHAUSTION_MIN)\n .max(EXHAUSTION_MAX);\nexport type ExhaustionLevel = z.infer<typeof ExhaustionLevelSchema>;\n\nexport const ALIGNMENT_LAW_CHAOS = ['lawful', 'neutral', 'chaotic'] as const;\nexport const ALIGNMENT_GOOD_EVIL = ['good', 'neutral', 'evil'] as const;\nexport const AlignmentSchema = z.union([\n z.literal('unaligned'),\n z.literal('any'),\n z.object({\n lawChaos: z.enum(ALIGNMENT_LAW_CHAOS),\n goodEvil: z.enum(ALIGNMENT_GOOD_EVIL),\n }),\n]);\nexport type Alignment = z.infer<typeof AlignmentSchema>;\n\nexport const ULIDSchema = z.string().regex(/^[0-9A-HJKMNP-TV-Z]{26}$/i, 'Expected a ULID');\n\nexport const CurrencySchema = z.object({\n cp: z.number().int().min(0).default(0),\n sp: z.number().int().min(0).default(0),\n ep: z.number().int().min(0).default(0),\n gp: z.number().int().min(0).default(0),\n pp: z.number().int().min(0).default(0),\n});\nexport type Currency = z.infer<typeof CurrencySchema>;\n\nexport const CURRENCY_KEYS = ['cp', 'sp', 'ep', 'gp', 'pp'] as const;\nexport type CurrencyKey = (typeof CURRENCY_KEYS)[number];\n\nexport const RechargeSchema = z.enum([\n 'shortRest',\n 'longRest',\n 'turn',\n 'round',\n 'dawn',\n 'never',\n]);\nexport type Recharge = z.infer<typeof RechargeSchema>;\n\nexport const WEAPON_PROPERTIES = [\n 'ammunition',\n 'finesse',\n 'heavy',\n 'light',\n 'loading',\n 'reach',\n 'thrown',\n 'two-handed',\n 'versatile',\n 'special',\n] as const;\nexport const WeaponPropertySchema = z.enum(WEAPON_PROPERTIES);\nexport type WeaponProperty = z.infer<typeof WeaponPropertySchema>;\n\nexport const WEAPON_MASTERIES = [\n 'Vex',\n 'Topple',\n 'Sap',\n 'Nick',\n 'Push',\n 'Slow',\n 'Cleave',\n 'Graze',\n 'Flex',\n] as const;\nexport const WeaponMasterySchema = z.enum(WEAPON_MASTERIES);\nexport type WeaponMastery = z.infer<typeof WeaponMasterySchema>;\n\nexport const DiceExpressionSchema = z.string().regex(/^\\d+d\\d+(?:[+-]\\d+)?$/, {\n message: 'Expected dice expression like \"2d6\", \"1d8+3\", \"3d6-1\"',\n});\nexport type DiceExpression = z.infer<typeof DiceExpressionSchema>;\n","import { z } from 'zod';\nimport { AbilityScoreSchema, DiceExpressionSchema } from './primitives.js';\n\nconst ConstNodeSchema = z.object({\n kind: z.literal('const'),\n value: z.number(),\n});\n\nconst AbilityNodeSchema = z.object({\n kind: z.literal('ability'),\n ability: AbilityScoreSchema,\n});\n\nconst AbilityModNodeSchema = z.object({\n kind: z.literal('abilityMod'),\n ability: AbilityScoreSchema,\n});\n\nconst ProfBonusNodeSchema = z.object({\n kind: z.literal('profBonus'),\n});\n\nconst LevelNodeSchema = z.object({\n kind: z.literal('level'),\n classId: z.string().optional(),\n});\n\nconst ClassColumnNodeSchema = z.object({\n kind: z.literal('classCol'),\n classId: z.string(),\n column: z.string(),\n});\n\nconst DiceNodeSchema = z.object({\n kind: z.literal('dice'),\n expression: DiceExpressionSchema,\n average: z.boolean().optional(),\n});\n\ninterface AddNode {\n kind: 'add';\n terms: Formula[];\n}\n\ninterface MaxNode {\n kind: 'max';\n terms: Formula[];\n}\n\ninterface MinNode {\n kind: 'min';\n terms: Formula[];\n}\n\ninterface MultiplyNode {\n kind: 'multiply';\n terms: Formula[];\n}\n\ninterface FloorNode {\n kind: 'floor';\n term: Formula;\n}\n\ninterface CeilNode {\n kind: 'ceil';\n term: Formula;\n}\n\nexport type Formula =\n | z.infer<typeof ConstNodeSchema>\n | z.infer<typeof AbilityNodeSchema>\n | z.infer<typeof AbilityModNodeSchema>\n | z.infer<typeof ProfBonusNodeSchema>\n | z.infer<typeof LevelNodeSchema>\n | z.infer<typeof ClassColumnNodeSchema>\n | z.infer<typeof DiceNodeSchema>\n | AddNode\n | MaxNode\n | MinNode\n | MultiplyNode\n | FloorNode\n | CeilNode;\n\nexport const FormulaSchema: z.ZodType<Formula> = z.lazy(() =>\n z.union([\n ConstNodeSchema,\n AbilityNodeSchema,\n AbilityModNodeSchema,\n ProfBonusNodeSchema,\n LevelNodeSchema,\n ClassColumnNodeSchema,\n DiceNodeSchema,\n z.object({\n kind: z.literal('add'),\n terms: z.array(FormulaSchema),\n }),\n z.object({\n kind: z.literal('max'),\n terms: z.array(FormulaSchema).min(1),\n }),\n z.object({\n kind: z.literal('min'),\n terms: z.array(FormulaSchema).min(1),\n }),\n z.object({\n kind: z.literal('multiply'),\n terms: z.array(FormulaSchema),\n }),\n z.object({\n kind: z.literal('floor'),\n term: FormulaSchema,\n }),\n z.object({\n kind: z.literal('ceil'),\n term: FormulaSchema,\n }),\n ]),\n);\n\nexport const isFormula = (value: unknown): value is Formula =>\n FormulaSchema.safeParse(value).success;\n","import { z } from 'zod';\nimport { DamageTypeSchema, WeaponPropertySchema } from './primitives.js';\n\nconst EqNodeSchema = z.object({\n kind: z.literal('eq'),\n path: z.string(),\n value: z.union([z.string(), z.number(), z.boolean(), z.null()]),\n});\n\nconst SelfNodeSchema = z.object({\n kind: z.literal('self'),\n});\n\nconst HasPropertyNodeSchema = z.object({\n kind: z.literal('hasProperty'),\n property: WeaponPropertySchema,\n});\n\nconst HasConditionNodeSchema = z.object({\n kind: z.literal('hasCondition'),\n conditionId: z.string(),\n});\n\nconst DamageTypeNodeSchema = z.object({\n kind: z.literal('damageType'),\n type: DamageTypeSchema,\n});\n\nconst NotNodeSchema = z.lazy(() =>\n z.object({\n kind: z.literal('not'),\n term: PredicateSchema,\n }),\n);\n\ninterface AllNode {\n kind: 'all';\n terms: Predicate[];\n}\ninterface AnyNode {\n kind: 'any';\n terms: Predicate[];\n}\ninterface NotNode {\n kind: 'not';\n term: Predicate;\n}\n\nexport type Predicate =\n | z.infer<typeof EqNodeSchema>\n | z.infer<typeof SelfNodeSchema>\n | z.infer<typeof HasPropertyNodeSchema>\n | z.infer<typeof HasConditionNodeSchema>\n | z.infer<typeof DamageTypeNodeSchema>\n | AllNode\n | AnyNode\n | NotNode\n | { kind: 'always' }\n | { kind: 'never' };\n\nexport const PredicateSchema: z.ZodType<Predicate> = z.lazy(() =>\n z.union([\n EqNodeSchema,\n SelfNodeSchema,\n HasPropertyNodeSchema,\n HasConditionNodeSchema,\n DamageTypeNodeSchema,\n z.object({\n kind: z.literal('all'),\n terms: z.array(PredicateSchema),\n }),\n z.object({\n kind: z.literal('any'),\n terms: z.array(PredicateSchema),\n }),\n NotNodeSchema,\n z.object({ kind: z.literal('always') }),\n z.object({ kind: z.literal('never') }),\n ]),\n);\n\nexport const isPredicate = (value: unknown): value is Predicate =>\n PredicateSchema.safeParse(value).success;\n","import { z } from 'zod';\nimport {\n AbilityScoreSchema,\n type AbilityScore,\n DamageTypeSchema,\n type DamageType,\n DiceExpressionSchema,\n type DiceExpression,\n MovementModeSchema,\n type MovementMode,\n ProficiencyLevelSchema,\n type ProficiencyLevel,\n RechargeSchema,\n type Recharge,\n SenseSchema,\n type Sense,\n SkillSchema,\n type Skill,\n SpellLevelSchema,\n type SpellLevel,\n WeaponMasterySchema,\n type WeaponMastery,\n} from './primitives.js';\nimport { FormulaSchema, type Formula } from './formula.js';\nimport { PredicateSchema, type Predicate } from './predicate.js';\n\nexport type ModifierTarget =\n | 'ac'\n | 'attack'\n | 'damage'\n | 'initiative'\n | 'spellAttack'\n | 'spellSaveDC'\n | 'hpMax'\n | 'speed'\n | 'passivePerception'\n | { kind: 'save'; ability: AbilityScore }\n | { kind: 'check'; ability: AbilityScore }\n | { kind: 'skill'; skill: Skill };\n\nexport const ModifierTargetSchema: z.ZodType<ModifierTarget> = z.union([\n z.literal('ac'),\n z.literal('attack'),\n z.literal('damage'),\n z.literal('initiative'),\n z.literal('spellAttack'),\n z.literal('spellSaveDC'),\n z.literal('hpMax'),\n z.literal('speed'),\n z.literal('passivePerception'),\n z.object({ kind: z.literal('save'), ability: AbilityScoreSchema }),\n z.object({ kind: z.literal('check'), ability: AbilityScoreSchema }),\n z.object({ kind: z.literal('skill'), skill: SkillSchema }),\n]);\n\nexport type RollTarget =\n | 'attack'\n | 'damage'\n | 'initiative'\n | { kind: 'save'; ability: AbilityScore }\n | { kind: 'check'; ability: AbilityScore }\n | { kind: 'skill'; skill: Skill };\n\nexport const RollTargetSchema: z.ZodType<RollTarget> = z.union([\n z.literal('attack'),\n z.literal('damage'),\n z.literal('initiative'),\n z.object({ kind: z.literal('save'), ability: AbilityScoreSchema }),\n z.object({ kind: z.literal('check'), ability: AbilityScoreSchema }),\n z.object({ kind: z.literal('skill'), skill: SkillSchema }),\n]);\n\nexport type TriggerAction =\n | { kind: 'AddDamage'; dice: DiceExpression; damageType: DamageType }\n | { kind: 'Heal'; amount: number | Formula }\n | { kind: 'ApplyCondition'; conditionId: string; durationRounds?: number }\n | { kind: 'SpendResource'; resourceId: string; amount: number }\n | { kind: 'ModifyDamageTaken'; amount: number | Formula; cap?: number }\n | { kind: 'EmitEvent'; eventType: string; payload?: unknown };\n\nexport const TriggerActionSchema: z.ZodType<TriggerAction> = z.union([\n z.object({\n kind: z.literal('AddDamage'),\n dice: DiceExpressionSchema,\n damageType: DamageTypeSchema,\n }),\n z.object({\n kind: z.literal('Heal'),\n amount: z.union([z.number(), FormulaSchema]),\n }),\n z.object({\n kind: z.literal('ApplyCondition'),\n conditionId: z.string(),\n durationRounds: z.number().int().optional(),\n }),\n z.object({\n kind: z.literal('SpendResource'),\n resourceId: z.string(),\n amount: z.number().int().min(1),\n }),\n z.object({\n kind: z.literal('ModifyDamageTaken'),\n amount: z.union([z.number(), FormulaSchema]),\n cap: z.number().optional(),\n }),\n z.object({\n kind: z.literal('EmitEvent'),\n eventType: z.string(),\n payload: z.unknown().optional(),\n }),\n]);\n\nexport interface ChoiceOptionShape {\n id: string;\n label: string;\n effects: Effect[];\n}\n\nexport type Effect =\n | { kind: 'GrantProficiency'; target: 'skill' | 'tool' | 'weapon' | 'armor' | 'save' | 'language'; id: string; level: ProficiencyLevel }\n | { kind: 'GrantSense'; sense: Sense; range: number }\n | { kind: 'ModifySpeed'; mode: MovementMode; op: 'set' | 'add' | 'multiply'; value: number }\n | { kind: 'AddModifier'; target: ModifierTarget; value: number | Formula; condition?: Predicate }\n | { kind: 'SetAdvantage'; on: RollTarget; mode: 'advantage' | 'disadvantage' | 'auto-crit' | 'auto-fail'; condition?: Predicate }\n | { kind: 'GrantResistance'; damageType: DamageType | 'all'; condition?: Predicate }\n | { kind: 'GrantImmunity'; damageType: DamageType | 'all' }\n | { kind: 'GrantVulnerability'; damageType: DamageType }\n | { kind: 'GrantConditionImmunity'; conditionId: string }\n | { kind: 'OverrideACFormula'; base: number | 'dex' | 'con' | 'wis'; abilityModifiers: AbilityScore[]; dexCap?: number; priority?: number }\n | { kind: 'GrantResource'; resourceId: string; max: number | Formula; recharge: Recharge; diceSize?: number }\n | { kind: 'GrantSpellSlots'; level: SpellLevel; count: number; source: 'full' | 'half' | 'third' | 'pact' }\n | { kind: 'GrantSpell'; spellId: string; preparation: 'always-prepared' | 'prepared' | 'known' | 'at-will' | 'oncePerLongRest' | 'oncePerShortRest'; spellcastingAbility?: AbilityScore }\n | { kind: 'OnEvent'; id?: string; trigger: { eventType: string; filter?: Predicate }; actions: TriggerAction[]; oncePer?: 'turn' | 'round' | 'shortRest' | 'longRest'; requiresReaction?: boolean }\n | { kind: 'RecoverResource'; resourceId: string; amount: number | 'all' | Formula; when: 'shortRest' | 'longRest' | 'turnStart' | 'turnEnd' | 'dawn' }\n | { kind: 'GrantAction'; actionId: string; name: string; cost: 'action' | 'bonusAction' | 'reaction' | 'free'; resourceCost?: { resourceId: string; amount: number } }\n | { kind: 'ModifyActionEconomy'; op: 'extraAttack' | 'extraAction' | 'extraBonusAction'; count: number; condition?: Predicate }\n | { kind: 'GrantWeaponMastery'; masteries: WeaponMastery[]; slots: number }\n | { kind: 'ExpandSpellList'; classId: string; spellIds: string[] }\n | { kind: 'SetHPMaxFormula'; formula: Formula }\n | { kind: 'OfferChoice'; choiceId: string; prompt: string; options: ChoiceOptionShape[]; oneOf: number; when: 'onAcquire' | 'onLevelUp' | 'onLongRest' }\n | { kind: 'FlatDamageReduction'; damageTypes: DamageType[]; amount: number }\n | { kind: 'Custom'; handlerId: string; params?: unknown };\n\nexport const EffectSchema: z.ZodType<Effect> = z.lazy(() =>\n z.union([\n z.object({\n kind: z.literal('GrantProficiency'),\n target: z.enum(['skill', 'tool', 'weapon', 'armor', 'save', 'language']),\n id: z.string(),\n level: ProficiencyLevelSchema,\n }),\n z.object({\n kind: z.literal('GrantSense'),\n sense: SenseSchema,\n range: z.number().int().min(0),\n }),\n z.object({\n kind: z.literal('ModifySpeed'),\n mode: MovementModeSchema,\n op: z.enum(['set', 'add', 'multiply']),\n value: z.number(),\n }),\n z.object({\n kind: z.literal('AddModifier'),\n target: ModifierTargetSchema,\n value: z.union([z.number(), FormulaSchema]),\n condition: PredicateSchema.optional(),\n }),\n z.object({\n kind: z.literal('SetAdvantage'),\n on: RollTargetSchema,\n mode: z.enum(['advantage', 'disadvantage', 'auto-crit', 'auto-fail']),\n condition: PredicateSchema.optional(),\n }),\n z.object({\n kind: z.literal('GrantResistance'),\n damageType: z.union([DamageTypeSchema, z.literal('all')]),\n condition: PredicateSchema.optional(),\n }),\n z.object({\n kind: z.literal('GrantImmunity'),\n damageType: z.union([DamageTypeSchema, z.literal('all')]),\n }),\n z.object({\n kind: z.literal('GrantVulnerability'),\n damageType: DamageTypeSchema,\n }),\n z.object({\n kind: z.literal('GrantConditionImmunity'),\n conditionId: z.string(),\n }),\n z.object({\n kind: z.literal('OverrideACFormula'),\n base: z.union([z.number(), z.literal('dex'), z.literal('con'), z.literal('wis')]),\n abilityModifiers: z.array(AbilityScoreSchema),\n dexCap: z.number().optional(),\n priority: z.number().int().optional(),\n }),\n z.object({\n kind: z.literal('GrantResource'),\n resourceId: z.string(),\n max: z.union([z.number().int().min(0), FormulaSchema]),\n recharge: RechargeSchema,\n diceSize: z.number().int().optional(),\n }),\n z.object({\n kind: z.literal('GrantSpellSlots'),\n level: SpellLevelSchema,\n count: z.number().int().min(0),\n source: z.enum(['full', 'half', 'third', 'pact']),\n }),\n z.object({\n kind: z.literal('GrantSpell'),\n spellId: z.string(),\n preparation: z.enum([\n 'always-prepared',\n 'prepared',\n 'known',\n 'at-will',\n 'oncePerLongRest',\n 'oncePerShortRest',\n ]),\n spellcastingAbility: AbilityScoreSchema.optional(),\n }),\n z.object({\n kind: z.literal('OnEvent'),\n id: z.string().optional(),\n trigger: z.object({\n eventType: z.string(),\n filter: PredicateSchema.optional(),\n }),\n actions: z.array(TriggerActionSchema),\n oncePer: z.enum(['turn', 'round', 'shortRest', 'longRest']).optional(),\n requiresReaction: z.boolean().optional(),\n }),\n z.object({\n kind: z.literal('RecoverResource'),\n resourceId: z.string(),\n amount: z.union([z.number(), z.literal('all'), FormulaSchema]),\n when: z.enum(['shortRest', 'longRest', 'turnStart', 'turnEnd', 'dawn']),\n }),\n z.object({\n kind: z.literal('GrantAction'),\n actionId: z.string(),\n name: z.string(),\n cost: z.enum(['action', 'bonusAction', 'reaction', 'free']),\n resourceCost: z\n .object({ resourceId: z.string(), amount: z.number().int().min(1) })\n .optional(),\n }),\n z.object({\n kind: z.literal('ModifyActionEconomy'),\n op: z.enum(['extraAttack', 'extraAction', 'extraBonusAction']),\n count: z.number().int().min(1),\n condition: PredicateSchema.optional(),\n }),\n z.object({\n kind: z.literal('GrantWeaponMastery'),\n masteries: z.array(WeaponMasterySchema),\n slots: z.number().int().min(1),\n }),\n z.object({\n kind: z.literal('ExpandSpellList'),\n classId: z.string(),\n spellIds: z.array(z.string()),\n }),\n z.object({\n kind: z.literal('SetHPMaxFormula'),\n formula: FormulaSchema,\n }),\n z.object({\n kind: z.literal('OfferChoice'),\n choiceId: z.string(),\n prompt: z.string(),\n options: z\n .array(\n z.object({\n id: z.string(),\n label: z.string(),\n effects: z.array(EffectSchema),\n }),\n )\n .min(1),\n oneOf: z.number().int().min(1),\n when: z.enum(['onAcquire', 'onLevelUp', 'onLongRest']),\n }),\n z.object({\n kind: z.literal('FlatDamageReduction'),\n damageTypes: z.array(DamageTypeSchema).min(1),\n amount: z.number().int().min(1),\n }),\n z.object({\n kind: z.literal('Custom'),\n handlerId: z.string(),\n params: z.unknown().optional(),\n }),\n ]),\n);\n\nexport type EffectKind = Effect['kind'];\n\nexport const EFFECT_KINDS = [\n 'GrantProficiency',\n 'GrantSense',\n 'ModifySpeed',\n 'AddModifier',\n 'SetAdvantage',\n 'GrantResistance',\n 'GrantImmunity',\n 'GrantVulnerability',\n 'GrantConditionImmunity',\n 'OverrideACFormula',\n 'GrantResource',\n 'GrantSpellSlots',\n 'GrantSpell',\n 'OnEvent',\n 'RecoverResource',\n 'GrantAction',\n 'ModifyActionEconomy',\n 'GrantWeaponMastery',\n 'ExpandSpellList',\n 'SetHPMaxFormula',\n 'OfferChoice',\n 'FlatDamageReduction',\n 'Custom',\n] as const satisfies ReadonlyArray<EffectKind>;\n","import { z } from 'zod';\nimport { EffectSchema } from '../effects.js';\n\nexport const ConditionSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n effects: z.array(EffectSchema).default([]),\n stackable: z.boolean().default(false),\n endsOn: z\n .array(\n z.union([\n z.object({ kind: z.literal('shortRest') }),\n z.object({ kind: z.literal('longRest') }),\n z.object({ kind: z.literal('turnEnd'), ownerId: z.string().optional() }),\n z.object({ kind: z.literal('saveSuccess'), ability: z.string(), dc: z.number().int() }),\n z.object({ kind: z.literal('damageTaken') }),\n ]),\n )\n .default([]),\n});\nexport type Condition = z.infer<typeof ConditionSchema>;\n","import { z } from 'zod';\nimport { CreatureTypeSchema, SizeSchema, SpeedSchema } from '../primitives.js';\nimport { EffectSchema } from '../effects.js';\n\nexport const SpeciesSchema = z.object({\n id: z.string(),\n name: z.string(),\n size: SizeSchema,\n creatureType: CreatureTypeSchema.default('Humanoid'),\n speed: SpeedSchema,\n languages: z.array(z.string()).default([]),\n traits: z.array(EffectSchema).default([]),\n});\nexport type Species = z.infer<typeof SpeciesSchema>;\n","import { z } from 'zod';\nimport { AbilityScoreSchema, SkillSchema } from '../primitives.js';\nimport { EffectSchema } from '../effects.js';\n\nexport const BackgroundSchema = z.object({\n id: z.string(),\n name: z.string(),\n abilityScoreIncreases: z.object({\n options: z.array(AbilityScoreSchema).min(2),\n pattern: z.enum(['+2/+1', '+1/+1/+1']),\n }),\n skillProficiencies: z.array(SkillSchema).default([]),\n toolProficiencies: z.array(z.string()).default([]),\n languages: z.array(z.string()).default([]),\n originFeatId: z.string(),\n traits: z.array(EffectSchema).default([]),\n});\nexport type Background = z.infer<typeof BackgroundSchema>;\n","import { z } from 'zod';\nimport { EffectSchema } from '../effects.js';\n\nexport const FeatSchema = z.object({\n id: z.string(),\n name: z.string(),\n category: z.enum(['origin', 'general', 'fighting-style', 'epic-boon']),\n repeatable: z.boolean().default(false),\n prerequisites: z.array(z.string()).default([]),\n effects: z.array(EffectSchema).default([]),\n});\nexport type Feat = z.infer<typeof FeatSchema>;\n","import { z } from 'zod';\nimport {\n AbilityScoreSchema,\n CHARACTER_LEVEL_MAX,\n CHARACTER_LEVEL_MIN,\n HitDieSchema,\n SkillSchema,\n} from '../primitives.js';\nimport { EffectSchema } from '../effects.js';\n\nexport const ClassFeatureSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n effects: z.array(EffectSchema).default([]),\n});\nexport type ClassFeature = z.infer<typeof ClassFeatureSchema>;\n\nconst LevelEntrySchema = z.object({\n proficiencyBonus: z.number().int().min(2).max(6),\n features: z.array(ClassFeatureSchema).default([]),\n columns: z.record(z.string(), z.union([z.number(), z.string()])).default({}),\n});\nexport type LevelEntry = z.infer<typeof LevelEntrySchema>;\n\nexport const SpellcastingProgressionSchema = z.object({\n ability: AbilityScoreSchema,\n type: z.enum(['full', 'half', 'third', 'pact']),\n preparedFormula: z.string().optional(),\n});\nexport type SpellcastingProgression = z.infer<typeof SpellcastingProgressionSchema>;\n\nexport const ClassSchema = z.object({\n id: z.string(),\n name: z.string(),\n hitDie: HitDieSchema,\n primaryAbility: z.array(AbilityScoreSchema).min(1),\n savingThrowProficiencies: z.array(AbilityScoreSchema).length(2),\n armorProficiencies: z.array(z.string()).default([]),\n weaponProficiencies: z.array(z.string()).default([]),\n toolProficiencies: z.array(z.string()).default([]),\n skillChoices: z\n .object({\n choices: z.number().int().min(0),\n from: z.array(SkillSchema),\n })\n .optional(),\n levelTable: z\n .record(\n z\n .string()\n .regex(/^([1-9]|1[0-9]|20)$/, 'Level keys must be 1..20'),\n LevelEntrySchema,\n )\n .superRefine((val, ctx) => {\n for (const key of Object.keys(val)) {\n const n = Number.parseInt(key, 10);\n if (n < CHARACTER_LEVEL_MIN || n > CHARACTER_LEVEL_MAX) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Level key ${key} out of range`,\n });\n }\n }\n }),\n subclassLevel: z.number().int().min(1).max(CHARACTER_LEVEL_MAX).optional(),\n spellcasting: SpellcastingProgressionSchema.optional(),\n});\nexport type Class = z.infer<typeof ClassSchema>;\n\nexport const SubclassSchema = z.object({\n id: z.string(),\n parentClassId: z.string(),\n name: z.string(),\n levelGrants: z.record(z.string(), z.array(ClassFeatureSchema)).default({}),\n});\nexport type Subclass = z.infer<typeof SubclassSchema>;\n","import { z } from 'zod';\nimport {\n AbilityScoreSchema,\n DamageTypeSchema,\n DiceExpressionSchema,\n SpellLevelSchema,\n SpellSchoolSchema,\n} from '../primitives.js';\n\nconst CANTRIP_SCALING_THRESHOLDS = [5, 11, 17] as const;\n\nconst SpellAttackMechanicSchema = z.object({\n kind: z.literal('attack'),\n damageDice: DiceExpressionSchema,\n damageType: DamageTypeSchema,\n extraDicePerSlotLevel: z.number().int().min(0).optional(),\n cantripScalingDice: DiceExpressionSchema.optional(),\n});\n\nconst SpellSaveMechanicSchema = z.object({\n kind: z.literal('save'),\n ability: AbilityScoreSchema,\n damageDice: DiceExpressionSchema.optional(),\n damageType: DamageTypeSchema.optional(),\n halfOnSuccess: z.boolean().optional(),\n conditionOnFail: z.string().optional(),\n extraDicePerSlotLevel: z.number().int().min(0).optional(),\n cantripScalingDice: DiceExpressionSchema.optional(),\n});\n\nconst SpellHealMechanicSchema = z.object({\n kind: z.literal('heal'),\n amountDice: DiceExpressionSchema,\n extraDicePerSlotLevel: z.number().int().min(0).optional(),\n});\n\nexport const SPELL_AREA_SHAPES = ['cone', 'cube', 'line', 'sphere', 'cylinder'] as const;\nexport const SpellAreaShapeSchema = z.enum(SPELL_AREA_SHAPES);\nexport type SpellAreaShape = z.infer<typeof SpellAreaShapeSchema>;\n\nexport const SpellTargetingSchema = z.object({\n shape: SpellAreaShapeSchema,\n size: z.number().int().min(1),\n});\nexport type SpellTargeting = z.infer<typeof SpellTargetingSchema>;\n\nexport const cantripExtraDice = (characterLevel: number): number => {\n let extra = 0;\n for (const threshold of CANTRIP_SCALING_THRESHOLDS) {\n if (characterLevel >= threshold) extra += 1;\n }\n return extra;\n};\n\nexport const SpellMechanicSchema = z.discriminatedUnion('kind', [\n SpellAttackMechanicSchema,\n SpellSaveMechanicSchema,\n SpellHealMechanicSchema,\n]);\nexport type SpellMechanic = z.infer<typeof SpellMechanicSchema>;\n\nexport const SpellSchema = z.object({\n id: z.string(),\n name: z.string(),\n level: SpellLevelSchema,\n school: SpellSchoolSchema,\n castingTime: z.string(),\n range: z.string(),\n components: z.object({\n verbal: z.boolean().default(false),\n somatic: z.boolean().default(false),\n material: z.string().optional(),\n }),\n duration: z.string(),\n concentration: z.boolean().default(false),\n ritual: z.boolean().default(false),\n classes: z.array(z.string()).default([]),\n description: z.string().optional(),\n mechanicalEffects: z.array(SpellMechanicSchema).default([]),\n targeting: SpellTargetingSchema.optional(),\n});\nexport type Spell = z.infer<typeof SpellSchema>;\n","import { z } from 'zod';\nimport {\n DamageTypeSchema,\n DiceExpressionSchema,\n RechargeSchema,\n WeaponMasterySchema,\n WeaponPropertySchema,\n} from '../primitives.js';\nimport { EffectSchema } from '../effects.js';\n\nconst ItemBaseSchema = z.object({\n id: z.string(),\n name: z.string(),\n weight: z.number().nonnegative().optional(),\n cost: z\n .object({\n amount: z.number().int().min(0),\n currency: z.enum(['cp', 'sp', 'ep', 'gp', 'pp']),\n })\n .optional(),\n});\n\nexport const WeaponSchema = ItemBaseSchema.extend({\n itemKind: z.literal('weapon'),\n category: z.enum(['simple', 'martial']),\n attackKind: z.enum(['melee', 'ranged']),\n damageType: DamageTypeSchema,\n damageDice: DiceExpressionSchema,\n versatileDice: DiceExpressionSchema.optional(),\n properties: z.array(WeaponPropertySchema).default([]),\n mastery: WeaponMasterySchema.optional(),\n rangeNormal: z.number().int().optional(),\n rangeLong: z.number().int().optional(),\n});\nexport type Weapon = z.infer<typeof WeaponSchema>;\n\nexport const ArmorSchema = ItemBaseSchema.extend({\n itemKind: z.literal('armor'),\n category: z.enum(['light', 'medium', 'heavy', 'shield']),\n baseAC: z.number().int().min(0),\n dexCap: z.number().int().optional(),\n strRequirement: z.number().int().optional(),\n stealthDisadvantage: z.boolean().default(false),\n});\nexport type Armor = z.infer<typeof ArmorSchema>;\n\nexport const ToolSchema = ItemBaseSchema.extend({\n itemKind: z.literal('tool'),\n category: z.enum(['artisan', 'gaming', 'musical', 'other']),\n});\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const MagicItemSchema = ItemBaseSchema.extend({\n itemKind: z.literal('magic'),\n rarity: z.enum(['common', 'uncommon', 'rare', 'very-rare', 'legendary', 'artifact']),\n requiresAttunement: z.boolean().default(false),\n attunementCondition: z.string().optional(),\n charges: z\n .object({\n max: z.number().int().min(1),\n recharge: RechargeSchema,\n rechargeFormula: DiceExpressionSchema.optional(),\n })\n .optional(),\n effects: z.array(EffectSchema).default([]),\n});\nexport type MagicItem = z.infer<typeof MagicItemSchema>;\n\nexport const ConsumableSchema = ItemBaseSchema.extend({\n itemKind: z.literal('consumable'),\n onConsume: z.array(EffectSchema).default([]),\n description: z.string().optional(),\n});\nexport type Consumable = z.infer<typeof ConsumableSchema>;\n\nexport const GearSchema = ItemBaseSchema.extend({\n itemKind: z.literal('gear'),\n description: z.string().optional(),\n});\nexport type Gear = z.infer<typeof GearSchema>;\n\nexport const ItemDefinitionSchema = z.discriminatedUnion('itemKind', [\n WeaponSchema,\n ArmorSchema,\n ToolSchema,\n MagicItemSchema,\n ConsumableSchema,\n GearSchema,\n]);\nexport type ItemDefinition = z.infer<typeof ItemDefinitionSchema>;\n","import { z } from 'zod';\nimport {\n AbilityScoresSchema,\n AlignmentSchema,\n CreatureTypeSchema,\n DamageTypeSchema,\n SensesSchema,\n SizeSchema,\n SkillSchema,\n SpeedSchema,\n} from '../primitives.js';\nimport { EffectSchema } from '../effects.js';\n\nexport const MonsterStatblockSchema = z.object({\n id: z.string(),\n name: z.string(),\n size: SizeSchema,\n type: CreatureTypeSchema,\n subtype: z.string().optional(),\n alignment: AlignmentSchema.default('unaligned'),\n ac: z.number().int().min(0),\n hp: z.object({\n average: z.number().int().min(1),\n formula: z.string(),\n }),\n speed: SpeedSchema,\n abilityScores: AbilityScoresSchema,\n savingThrows: z.record(z.string(), z.number().int()).optional(),\n skills: z.record(SkillSchema, z.number().int()).optional(),\n damageResistances: z.array(DamageTypeSchema).default([]),\n damageImmunities: z.array(DamageTypeSchema).default([]),\n damageVulnerabilities: z.array(DamageTypeSchema).default([]),\n conditionImmunities: z.array(z.string()).default([]),\n senses: SensesSchema.optional(),\n languages: z.array(z.string()).default([]),\n cr: z.number().min(0),\n xp: z.number().int().min(0),\n proficiencyBonus: z.number().int().min(2).max(9),\n traits: z.array(EffectSchema).default([]),\n});\nexport type MonsterStatblock = z.infer<typeof MonsterStatblockSchema>;\n","import { z } from 'zod';\nimport {\n AbilityScoresSchema,\n CharacterLevelSchema,\n ExhaustionLevelSchema,\n ULIDSchema,\n} from '../primitives.js';\n\nexport const ResourceStateSchema = z.object({\n resourceId: z.string(),\n current: z.number().int().min(0),\n max: z.number().int().min(0),\n});\nexport type ResourceState = z.infer<typeof ResourceStateSchema>;\n\nexport const AppliedConditionSchema = z.object({\n id: ULIDSchema,\n conditionId: z.string(),\n sourceEventId: ULIDSchema.optional(),\n level: z.number().int().min(1).optional(),\n expiresOnRound: z.number().int().optional(),\n});\nexport type AppliedCondition = z.infer<typeof AppliedConditionSchema>;\n\nexport const HPSchema = z.object({\n current: z.number().int(),\n max: z.number().int().min(1),\n temp: z.number().int().min(0).default(0),\n});\nexport type HP = z.infer<typeof HPSchema>;\n\nexport const DeathSavesSchema = z.object({\n successes: z.number().int().min(0).max(3).default(0),\n failures: z.number().int().min(0).max(3).default(0),\n stable: z.boolean().default(false),\n});\nexport type DeathSaves = z.infer<typeof DeathSavesSchema>;\n\nexport const ClassEnrollmentSchema = z.object({\n classId: z.string(),\n subclassId: z.string().optional(),\n level: CharacterLevelSchema,\n hitDiceRemaining: z.number().int().min(0),\n});\nexport type ClassEnrollment = z.infer<typeof ClassEnrollmentSchema>;\n\nexport const CHARACTER_KINDS = ['pc', 'npc', 'creature'] as const;\nexport const CharacterKindSchema = z.enum(CHARACTER_KINDS);\nexport type CharacterKind = z.infer<typeof CharacterKindSchema>;\n\nexport const MultiattackPatternSchema = z.object({\n name: z.string(),\n attacks: z.array(\n z.object({\n weaponInstanceId: ULIDSchema,\n count: z.number().int().min(1),\n }),\n ).min(1),\n});\nexport type MultiattackPattern = z.infer<typeof MultiattackPatternSchema>;\n\nexport const CharacterSchema = z.object({\n id: ULIDSchema,\n kind: CharacterKindSchema.default('pc'),\n statblockId: z.string().optional(),\n multiattack: MultiattackPatternSchema.optional(),\n name: z.string().min(1),\n playerId: z.string().optional(),\n speciesId: z.string(),\n backgroundId: z.string(),\n classes: z.array(ClassEnrollmentSchema).min(1),\n abilityScores: AbilityScoresSchema,\n hp: HPSchema,\n deathSaves: DeathSavesSchema.default({ successes: 0, failures: 0, stable: false }),\n exhaustion: ExhaustionLevelSchema.default(0),\n speedFeet: z.number().int().min(0).default(30),\n inventory: z.array(ULIDSchema).default([]),\n equipped: z\n .object({\n mainHand: ULIDSchema.optional(),\n offHand: ULIDSchema.optional(),\n armor: ULIDSchema.optional(),\n shield: ULIDSchema.optional(),\n attuned: z.array(ULIDSchema).max(3).default([]),\n })\n .default({ attuned: [] }),\n resources: z.array(ResourceStateSchema).default([]),\n appliedConditions: z.array(AppliedConditionSchema).default([]),\n knownSpells: z.array(z.string()).default([]),\n preparedSpells: z.array(z.string()).default([]),\n spellSlotsUsed: z\n .record(\n z.string().regex(/^[1-9]$/, 'Slot level keys must be 1..9'),\n z.number().int().min(0),\n )\n .default({}),\n pactSlotsUsed: z.number().int().min(0).default(0),\n concentrationEffectId: ULIDSchema.optional(),\n triggerCounters: z\n .record(\n z.string(),\n z.object({\n firedThisTurn: z.boolean().optional(),\n firedThisRound: z.boolean().optional(),\n firedThisShortRest: z.boolean().optional(),\n firedThisLongRest: z.boolean().optional(),\n }),\n )\n .default({}),\n featsTaken: z.array(z.string()).default([]),\n pendingChoiceIds: z.array(ULIDSchema).default([]),\n xp: z.number().int().min(0).default(0),\n mountedOnId: ULIDSchema.optional(),\n attitude: z.enum(['hostile', 'unfriendly', 'indifferent', 'friendly', 'helpful']).optional(),\n morale: z\n .object({\n current: z.number().int(),\n max: z.number().int().min(1),\n })\n .optional(),\n moraleBroken: z.boolean().default(false),\n polymorphedSnapshot: z\n .object({\n hp: z.object({\n current: z.number().int(),\n max: z.number().int().min(1),\n temp: z.number().int().min(0).default(0),\n }),\n abilityScores: AbilityScoresSchema,\n speedFeet: z.number().int().min(0),\n speciesId: z.string(),\n kind: z.enum(['polymorph', 'wild-shape', 'true-polymorph']),\n formName: z.string(),\n })\n .optional(),\n});\nexport type Character = z.infer<typeof CharacterSchema>;\n\nexport const computeTotalLevel = (character: Character): number =>\n character.classes.reduce((acc, enrollment) => acc + enrollment.level, 0);\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const ItemInstanceSchema = z.object({\n id: ULIDSchema,\n definitionId: z.string(),\n customName: z.string().optional(),\n quantity: z.number().int().min(1).default(1),\n chargesRemaining: z.number().int().min(0).optional(),\n attuned: z.boolean().default(false),\n attunedTo: ULIDSchema.optional(),\n equippedBy: ULIDSchema.optional(),\n containerId: ULIDSchema.optional(),\n acquiredAtEventId: ULIDSchema.optional(),\n identifiedByCharacterIds: z.array(ULIDSchema).default([]),\n maxCharges: z.number().int().min(0).optional(),\n sentient: z\n .object({\n ego: z.number().int().min(0),\n alignment: z.string(),\n personality: z.string().optional(),\n })\n .optional(),\n});\nexport type ItemInstance = z.infer<typeof ItemInstanceSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const AppliedConditionRefSchema = z.object({\n targetId: ULIDSchema,\n conditionId: z.string(),\n appliedConditionId: ULIDSchema,\n});\nexport type AppliedConditionRef = z.infer<typeof AppliedConditionRefSchema>;\n\nexport const EffectInstanceSchema = z.object({\n id: ULIDSchema,\n spellId: z.string(),\n casterId: ULIDSchema,\n targetIds: z.array(ULIDSchema).default([]),\n conditionsApplied: z.array(AppliedConditionRefSchema).default([]),\n requiresConcentration: z.boolean(),\n durationRounds: z.number().int().min(0).optional(),\n startedAtEventId: ULIDSchema,\n});\nexport type EffectInstance = z.infer<typeof EffectInstanceSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { EffectSchema } from '../effects.js';\n\nexport const ChoiceOptionSchema = z.object({\n id: z.string(),\n label: z.string(),\n effects: z.array(EffectSchema).default([]),\n});\nexport type ChoiceOption = z.infer<typeof ChoiceOptionSchema>;\n\nexport const PendingChoiceSchema = z.object({\n id: ULIDSchema,\n prompt: z.string(),\n options: z.array(ChoiceOptionSchema).min(1),\n oneOf: z.number().int().min(1).default(1),\n forCharacterId: ULIDSchema,\n triggerEventId: ULIDSchema,\n resolution: z\n .object({\n selectedOptionIds: z.array(z.string()).min(1),\n atEventId: ULIDSchema,\n })\n .optional(),\n});\nexport type PendingChoice = z.infer<typeof PendingChoiceSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const EncounterStatusSchema = z.enum(['planning', 'active', 'ended']);\nexport type EncounterStatus = z.infer<typeof EncounterStatusSchema>;\n\nexport const PositionSchema = z.object({\n x: z.number(),\n y: z.number(),\n});\nexport type Position = z.infer<typeof PositionSchema>;\n\nexport const TurnUsageSchema = z.object({\n actionUsed: z.boolean().default(false),\n bonusActionUsed: z.boolean().default(false),\n attacksMadeThisTurn: z.number().int().min(0).default(0),\n reactionUsedThisRound: z.boolean().default(false),\n feetMovedThisTurn: z.number().min(0).default(0),\n dashed: z.boolean().default(false),\n disengaged: z.boolean().default(false),\n});\nexport type TurnUsage = z.infer<typeof TurnUsageSchema>;\n\nexport const EMPTY_TURN_USAGE: TurnUsage = {\n actionUsed: false,\n bonusActionUsed: false,\n attacksMadeThisTurn: 0,\n reactionUsedThisRound: false,\n feetMovedThisTurn: 0,\n dashed: false,\n disengaged: false,\n};\n\nexport const CombatantSchema = z.object({\n combatantId: ULIDSchema,\n initiative: z.number().int(),\n initiativeOrder: z.number().int().min(0),\n hasActedThisRound: z.boolean().default(false),\n turnUsage: TurnUsageSchema.default(EMPTY_TURN_USAGE),\n position: PositionSchema.optional(),\n});\nexport type Combatant = z.infer<typeof CombatantSchema>;\n\nexport const EncounterSchema = z.object({\n id: ULIDSchema,\n name: z.string().optional(),\n status: EncounterStatusSchema,\n combatants: z.array(CombatantSchema).default([]),\n round: z.number().int().min(0),\n activeIndex: z.number().int().min(0),\n startedAtEventId: ULIDSchema.optional(),\n endedAtEventId: ULIDSchema.optional(),\n outcome: z.enum(['victory', 'defeat', 'fled', 'parley']).optional(),\n});\nexport type Encounter = z.infer<typeof EncounterSchema>;\n","import { CurrencySchema, type Currency, CURRENCY_KEYS, type CurrencyKey } from '../primitives.js';\n\nexport { CurrencySchema, type Currency };\nexport const CURRENCY_DENOMINATIONS = CURRENCY_KEYS;\nexport type CurrencyDenomination = CurrencyKey;\n\nconst CP_PER_SP = 10;\nconst CP_PER_EP = 50;\nconst CP_PER_GP = 100;\nconst CP_PER_PP = 1000;\n\nconst CP_VALUE_BY_DENOMINATION: Readonly<Record<CurrencyDenomination, number>> = {\n cp: 1,\n sp: CP_PER_SP,\n ep: CP_PER_EP,\n gp: CP_PER_GP,\n pp: CP_PER_PP,\n};\n\nexport const emptyCurrency = (): Currency => ({ cp: 0, sp: 0, ep: 0, gp: 0, pp: 0 });\n\nexport const totalInCopper = (purse: Currency): number =>\n CURRENCY_DENOMINATIONS.reduce(\n (total, denomination) => total + purse[denomination] * CP_VALUE_BY_DENOMINATION[denomination],\n 0,\n );\n\nexport const addCurrency = (a: Currency, b: Currency): Currency => ({\n cp: a.cp + b.cp,\n sp: a.sp + b.sp,\n ep: a.ep + b.ep,\n gp: a.gp + b.gp,\n pp: a.pp + b.pp,\n});\n\nexport const subtractCurrency = (a: Currency, b: Currency): Currency => {\n const result: Currency = {\n cp: a.cp - b.cp,\n sp: a.sp - b.sp,\n ep: a.ep - b.ep,\n gp: a.gp - b.gp,\n pp: a.pp - b.pp,\n };\n for (const denomination of CURRENCY_DENOMINATIONS) {\n if (result[denomination] < 0) {\n throw new Error(`Insufficient ${denomination}: have ${a[denomination]}, need ${b[denomination]}`);\n }\n }\n return result;\n};\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { CurrencySchema, emptyCurrency } from './currency.js';\n\nexport const PartySchema = z.object({\n id: ULIDSchema,\n name: z.string().min(1),\n memberIds: z.array(ULIDSchema).default([]),\n sharedInventory: z.array(ULIDSchema).default([]),\n purse: CurrencySchema.default(emptyCurrency()),\n});\nexport type Party = z.infer<typeof PartySchema>;\n","import { z } from 'zod';\n\nexport const InGameTimeSchema = z.object({\n totalMinutes: z.number().int().min(0).default(0),\n});\nexport type InGameTime = z.infer<typeof InGameTimeSchema>;\n\nconst MINUTES_PER_HOUR = 60;\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_DAY = MINUTES_PER_HOUR * HOURS_PER_DAY;\n\nexport interface InGameClockBreakdown {\n readonly days: number;\n readonly hours: number;\n readonly minutes: number;\n}\n\nexport const breakdownInGameTime = (time: InGameTime): InGameClockBreakdown => ({\n days: Math.floor(time.totalMinutes / MINUTES_PER_DAY),\n hours: Math.floor((time.totalMinutes % MINUTES_PER_DAY) / MINUTES_PER_HOUR),\n minutes: time.totalMinutes % MINUTES_PER_HOUR,\n});\n\nexport const formatInGameTime = (time: InGameTime): string => {\n const { days, hours, minutes } = breakdownInGameTime(time);\n const dd = String(days).padStart(2, '0');\n const hh = String(hours).padStart(2, '0');\n const mm = String(minutes).padStart(2, '0');\n return `Day ${dd} ${hh}:${mm}`;\n};\n\nexport const advanceInGameTime = (time: InGameTime, minutes: number): InGameTime => {\n if (minutes < 0) throw new Error('Cannot advance in-game time by a negative amount');\n return { totalMinutes: time.totalMinutes + minutes };\n};\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { InGameTimeSchema } from './in-game-time.js';\n\nexport const SessionSchema = z.object({\n id: ULIDSchema,\n name: z.string().min(1),\n startedAtIso: z.string(),\n endedAtIso: z.string().optional(),\n inGameStart: InGameTimeSchema,\n inGameEnd: InGameTimeSchema.optional(),\n summary: z.string().optional(),\n journalEntryIds: z.array(ULIDSchema).default([]),\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\nexport const JOURNAL_AUTHOR_KINDS = ['player', 'dm'] as const;\nexport const JournalAuthorKindSchema = z.enum(JOURNAL_AUTHOR_KINDS);\nexport type JournalAuthorKind = z.infer<typeof JournalAuthorKindSchema>;\n\nexport const JOURNAL_VISIBILITIES = ['party', 'dm-only', 'character'] as const;\nexport const JournalVisibilitySchema = z.enum(JOURNAL_VISIBILITIES);\nexport type JournalVisibility = z.infer<typeof JournalVisibilitySchema>;\n\nexport const JournalEntrySchema = z.object({\n id: ULIDSchema,\n sessionId: ULIDSchema.optional(),\n authorKind: JournalAuthorKindSchema,\n authorCharacterId: ULIDSchema.optional(),\n visibility: JournalVisibilitySchema,\n visibleToCharacterIds: z.array(ULIDSchema).default([]),\n title: z.string().min(1),\n body: z.string(),\n createdAtIso: z.string(),\n inGameAt: InGameTimeSchema,\n});\nexport type JournalEntry = z.infer<typeof JournalEntrySchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { PositionSchema } from './encounter.js';\n\nexport const TERRAIN_KINDS = ['normal', 'difficult', 'impassable', 'water'] as const;\nexport const TerrainKindSchema = z.enum(TERRAIN_KINDS);\nexport type TerrainKind = z.infer<typeof TerrainKindSchema>;\n\nexport const DEFAULT_CELL_SIZE_FEET = 5;\nexport const NORMAL_MOVEMENT_COST = 1;\nexport const DIFFICULT_MOVEMENT_COST = 2;\n\nexport const LocationMapSchema = z.object({\n widthCells: z.number().int().min(1),\n heightCells: z.number().int().min(1),\n cellSizeFeet: z.number().int().min(1).default(DEFAULT_CELL_SIZE_FEET),\n terrain: z.array(z.array(TerrainKindSchema)),\n});\nexport type LocationMap = z.infer<typeof LocationMapSchema>;\n\nexport const DOOR_STATES = ['open', 'closed', 'locked'] as const;\nexport const DoorStateSchema = z.enum(DOOR_STATES);\nexport type DoorState = z.infer<typeof DoorStateSchema>;\n\nexport const DoorSchema = z.object({\n id: ULIDSchema,\n locationId: ULIDSchema,\n name: z.string().optional(),\n position: PositionSchema,\n state: DoorStateSchema,\n});\nexport type Door = z.infer<typeof DoorSchema>;\n\nexport const LocationSchema = z.object({\n id: ULIDSchema,\n name: z.string().min(1),\n description: z.string().optional(),\n parentLocationId: ULIDSchema.optional(),\n map: LocationMapSchema.optional(),\n doorIds: z.array(ULIDSchema).default([]),\n});\nexport type Location = z.infer<typeof LocationSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { CurrencySchema, emptyCurrency } from './currency.js';\n\nexport const QUEST_STATUSES = ['active', 'completed', 'failed', 'abandoned'] as const;\nexport const QuestStatusSchema = z.enum(QUEST_STATUSES);\nexport type QuestStatus = z.infer<typeof QuestStatusSchema>;\n\nexport const OBJECTIVE_STATUSES = ['pending', 'completed', 'failed'] as const;\nexport const ObjectiveStatusSchema = z.enum(OBJECTIVE_STATUSES);\nexport type ObjectiveStatus = z.infer<typeof ObjectiveStatusSchema>;\n\nexport const QuestObjectiveSchema = z.object({\n id: ULIDSchema,\n description: z.string().min(1),\n status: ObjectiveStatusSchema.default('pending'),\n optional: z.boolean().default(false),\n progress: z.number().int().min(0).default(0),\n required: z.number().int().min(1).optional(),\n});\nexport type QuestObjective = z.infer<typeof QuestObjectiveSchema>;\n\nexport const QuestRewardSchema = z.object({\n xpPerCharacter: z.number().int().min(0).default(0),\n currency: CurrencySchema.default(emptyCurrency()),\n itemDefinitionIds: z.array(z.string()).default([]),\n});\nexport type QuestReward = z.infer<typeof QuestRewardSchema>;\n\nexport const QuestSchema = z.object({\n id: ULIDSchema,\n title: z.string().min(1),\n description: z.string().optional(),\n status: QuestStatusSchema.default('active'),\n partyId: ULIDSchema.optional(),\n objectives: z.array(QuestObjectiveSchema).default([]),\n reward: QuestRewardSchema.default({\n xpPerCharacter: 0,\n currency: emptyCurrency(),\n itemDefinitionIds: [],\n }),\n rewardClaimed: z.boolean().default(false),\n startedAtIso: z.string().optional(),\n endedAtIso: z.string().optional(),\n});\nexport type Quest = z.infer<typeof QuestSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const EventEnvelopeSchema = z.object({\n id: ULIDSchema,\n at: z.string(),\n sessionId: ULIDSchema.optional(),\n causedByEventId: ULIDSchema.optional(),\n actorId: ULIDSchema.optional(),\n});\nexport type EventEnvelope = z.infer<typeof EventEnvelopeSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { QuestObjectiveSchema, QuestRewardSchema } from '../runtime/quest.js';\n\nexport const QuestStartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('QuestStarted'),\n questId: ULIDSchema,\n title: z.string().min(1),\n description: z.string().optional(),\n partyId: ULIDSchema.optional(),\n objectives: z.array(QuestObjectiveSchema).default([]),\n reward: QuestRewardSchema.optional(),\n});\nexport type QuestStartedEvent = z.infer<typeof QuestStartedEventSchema>;\n\nexport const ObjectiveProgressedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ObjectiveProgressed'),\n questId: ULIDSchema,\n objectiveId: ULIDSchema,\n delta: z.number().int().min(1).default(1),\n});\nexport type ObjectiveProgressedEvent = z.infer<typeof ObjectiveProgressedEventSchema>;\n\nexport const ObjectiveCompletedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ObjectiveCompleted'),\n questId: ULIDSchema,\n objectiveId: ULIDSchema,\n});\nexport type ObjectiveCompletedEvent = z.infer<typeof ObjectiveCompletedEventSchema>;\n\nexport const ObjectiveFailedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ObjectiveFailed'),\n questId: ULIDSchema,\n objectiveId: ULIDSchema,\n});\nexport type ObjectiveFailedEvent = z.infer<typeof ObjectiveFailedEventSchema>;\n\nexport const QuestCompletedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('QuestCompleted'),\n questId: ULIDSchema,\n});\nexport type QuestCompletedEvent = z.infer<typeof QuestCompletedEventSchema>;\n\nexport const QuestFailedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('QuestFailed'),\n questId: ULIDSchema,\n reason: z.string().optional(),\n});\nexport type QuestFailedEvent = z.infer<typeof QuestFailedEventSchema>;\n\nexport const QuestAbandonedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('QuestAbandoned'),\n questId: ULIDSchema,\n reason: z.string().optional(),\n});\nexport type QuestAbandonedEvent = z.infer<typeof QuestAbandonedEventSchema>;\n\nexport const QuestRewardClaimedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('QuestRewardClaimed'),\n questId: ULIDSchema,\n beneficiaryCharacterIds: z.array(ULIDSchema).default([]),\n});\nexport type QuestRewardClaimedEvent = z.infer<typeof QuestRewardClaimedEventSchema>;\n\nexport const XPAwardedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('XPAwarded'),\n characterId: ULIDSchema,\n amount: z.number().int().min(1),\n source: z.string().optional(),\n questId: ULIDSchema.optional(),\n});\nexport type XPAwardedEvent = z.infer<typeof XPAwardedEventSchema>;\n\nexport const MILESTONE_KINDS = ['minor', 'major', 'campaign'] as const;\nexport const MilestoneKindSchema = z.enum(MILESTONE_KINDS);\nexport type MilestoneKind = z.infer<typeof MilestoneKindSchema>;\n\nexport const MilestoneAwardedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('MilestoneAwarded'),\n kind: MilestoneKindSchema,\n title: z.string().min(1),\n partyId: ULIDSchema.optional(),\n questId: ULIDSchema.optional(),\n});\nexport type MilestoneAwardedEvent = z.infer<typeof MilestoneAwardedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const VEHICLE_KINDS = ['land', 'water', 'air'] as const;\nexport const VehicleKindSchema = z.enum(VEHICLE_KINDS);\nexport type VehicleKind = z.infer<typeof VehicleKindSchema>;\n\nexport const VehicleSchema = z.object({\n id: ULIDSchema,\n name: z.string().min(1),\n kind: VehicleKindSchema,\n speedFeet: z.number().int().min(0),\n ac: z.number().int().min(0),\n hp: z.object({\n current: z.number().int(),\n max: z.number().int().min(1),\n }),\n capacity: z.number().int().min(1),\n occupantIds: z.array(ULIDSchema).default([]),\n});\nexport type Vehicle = z.infer<typeof VehicleSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const TRAVEL_PACES = ['slow', 'normal', 'fast'] as const;\nexport const TravelPaceSchema = z.enum(TRAVEL_PACES);\nexport type TravelPace = z.infer<typeof TravelPaceSchema>;\n\nexport const TravelLegSchema = z.object({\n partyId: ULIDSchema,\n pace: TravelPaceSchema,\n hours: z.number().min(0),\n miles: z.number().min(0),\n fromLocationId: ULIDSchema.optional(),\n toLocationId: ULIDSchema.optional(),\n notes: z.string().optional(),\n atIso: z.string(),\n});\nexport type TravelLeg = z.infer<typeof TravelLegSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const DOWNTIME_KINDS = [\n 'crafting',\n 'training',\n 'recuperating',\n 'research',\n 'work',\n 'other',\n] as const;\nexport const DowntimeKindSchema = z.enum(DOWNTIME_KINDS);\nexport type DowntimeKind = z.infer<typeof DowntimeKindSchema>;\n\nexport const DOWNTIME_OUTCOMES = ['success', 'partial', 'failure'] as const;\nexport const DowntimeOutcomeSchema = z.enum(DOWNTIME_OUTCOMES);\nexport type DowntimeOutcome = z.infer<typeof DowntimeOutcomeSchema>;\n\nexport const DowntimeActivityResolvedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('DowntimeActivityResolved'),\n characterId: ULIDSchema,\n kind: DowntimeKindSchema,\n days: z.number().int().min(1),\n outcome: DowntimeOutcomeSchema,\n summary: z.string().min(1),\n producedItemDefinitionId: z.string().optional(),\n toolProficiencyGained: z.string().optional(),\n});\nexport type DowntimeActivityResolvedEvent = z.infer<typeof DowntimeActivityResolvedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { DowntimeKindSchema, DowntimeOutcomeSchema } from '../events/downtime.js';\n\nexport const DowntimeLogEntrySchema = z.object({\n characterId: ULIDSchema,\n kind: DowntimeKindSchema,\n days: z.number().int().min(1),\n outcome: DowntimeOutcomeSchema,\n summary: z.string(),\n atIso: z.string(),\n producedItemDefinitionId: z.string().optional(),\n toolProficiencyGained: z.string().optional(),\n});\nexport type DowntimeLogEntry = z.infer<typeof DowntimeLogEntrySchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const BASTION_FACILITY_KINDS = ['basic', 'special'] as const;\nexport const BastionFacilityKindSchema = z.enum(BASTION_FACILITY_KINDS);\nexport type BastionFacilityKind = z.infer<typeof BastionFacilityKindSchema>;\n\nexport const BASTION_FACILITY_SPACES = ['cramped', 'roomy', 'vast'] as const;\nexport const BastionFacilitySpaceSchema = z.enum(BASTION_FACILITY_SPACES);\nexport type BastionFacilitySpace = z.infer<typeof BastionFacilitySpaceSchema>;\n\nexport const BastionFacilitySchema = z.object({\n id: ULIDSchema,\n name: z.string().min(1),\n kind: BastionFacilityKindSchema,\n space: BastionFacilitySpaceSchema,\n description: z.string().optional(),\n});\nexport type BastionFacility = z.infer<typeof BastionFacilitySchema>;\n\nexport const BastionHirelingSchema = z.object({\n id: ULIDSchema,\n name: z.string().min(1),\n role: z.string().min(1),\n});\nexport type BastionHireling = z.infer<typeof BastionHirelingSchema>;\n\nexport const BastionSchema = z.object({\n id: ULIDSchema,\n name: z.string().min(1),\n ownerCharacterId: ULIDSchema,\n locationId: ULIDSchema.optional(),\n level: z.number().int().min(1).max(9),\n facilities: z.array(BastionFacilitySchema).default([]),\n hirelings: z.array(BastionHirelingSchema).default([]),\n defenders: z.number().int().min(0).default(0),\n treasuryGp: z.number().int().min(0).default(0),\n hpCurrent: z.number().int().min(0),\n hpMax: z.number().int().min(1),\n});\nexport type Bastion = z.infer<typeof BastionSchema>;\n","import { z } from 'zod';\n\nexport const CampaignSettingsSchema = z.object({\n grittyRest: z.boolean().default(false),\n heroPoints: z.boolean().default(false),\n sanity: z.boolean().default(false),\n massCombat: z.boolean().default(false),\n feaCharacterFlaws: z.boolean().default(false),\n customHouserules: z.array(z.string()).default([]),\n});\nexport type CampaignSettings = z.infer<typeof CampaignSettingsSchema>;\n\nexport const defaultCampaignSettings = (): CampaignSettings => ({\n grittyRest: false,\n heroPoints: false,\n sanity: false,\n massCombat: false,\n feaCharacterFlaws: false,\n customHouserules: [],\n});\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { CharacterSchema } from './character.js';\nimport { ItemInstanceSchema } from './item-instance.js';\nimport { PendingChoiceSchema } from './pending-choice.js';\nimport { EncounterSchema } from './encounter.js';\nimport { EffectInstanceSchema } from './effect-instance.js';\nimport { PartySchema } from './party.js';\nimport { SessionSchema, JournalEntrySchema } from './session.js';\nimport { InGameTimeSchema } from './in-game-time.js';\nimport { LocationSchema, DoorSchema } from './location.js';\nimport { QuestSchema } from './quest.js';\nimport { MilestoneKindSchema } from '../events/quests.js';\nimport { VehicleSchema } from './vehicle.js';\nimport { TravelLegSchema } from './travel.js';\nimport { DowntimeLogEntrySchema } from './downtime.js';\nimport { BastionSchema } from './bastion.js';\nimport { CampaignSettingsSchema, defaultCampaignSettings } from './settings.js';\n\nexport const CampaignStateSchema = z.object({\n characters: z.record(ULIDSchema, CharacterSchema).default({}),\n itemInstances: z.record(ULIDSchema, ItemInstanceSchema).default({}),\n pendingChoices: z.record(ULIDSchema, PendingChoiceSchema).default({}),\n encounters: z.record(ULIDSchema, EncounterSchema).default({}),\n effectInstances: z.record(ULIDSchema, EffectInstanceSchema).default({}),\n parties: z.record(ULIDSchema, PartySchema).default({}),\n sessions: z.record(ULIDSchema, SessionSchema).default({}),\n journalEntries: z.record(ULIDSchema, JournalEntrySchema).default({}),\n locations: z.record(ULIDSchema, LocationSchema).default({}),\n doors: z.record(ULIDSchema, DoorSchema).default({}),\n characterLocations: z.record(ULIDSchema, ULIDSchema).default({}),\n quests: z.record(ULIDSchema, QuestSchema).default({}),\n vehicles: z.record(ULIDSchema, VehicleSchema).default({}),\n travelLog: z.array(TravelLegSchema).default([]),\n downtimeLog: z.array(DowntimeLogEntrySchema).default([]),\n toolProficienciesByCharacter: z.record(ULIDSchema, z.array(z.string())).default({}),\n bastions: z.record(ULIDSchema, BastionSchema).default({}),\n settings: CampaignSettingsSchema.default(defaultCampaignSettings()),\n milestones: z\n .array(\n z.object({\n kind: MilestoneKindSchema,\n title: z.string(),\n atIso: z.string(),\n partyId: ULIDSchema.optional(),\n questId: ULIDSchema.optional(),\n }),\n )\n .default([]),\n inGameTime: InGameTimeSchema.default({ totalMinutes: 0 }),\n activeSessionId: ULIDSchema.optional(),\n activeShortRest: z\n .object({\n startedAtEventId: ULIDSchema,\n participantIds: z.array(ULIDSchema),\n })\n .optional(),\n activeLongRest: z\n .object({\n startedAtEventId: ULIDSchema,\n participantIds: z.array(ULIDSchema),\n })\n .optional(),\n activeEncounterId: ULIDSchema.optional(),\n version: z.number().int().min(0).default(0),\n});\nexport type CampaignState = z.infer<typeof CampaignStateSchema>;\n\nexport const emptyCampaignState = (): CampaignState => ({\n characters: {},\n itemInstances: {},\n pendingChoices: {},\n encounters: {},\n effectInstances: {},\n parties: {},\n sessions: {},\n journalEntries: {},\n locations: {},\n doors: {},\n characterLocations: {},\n quests: {},\n vehicles: {},\n travelLog: [],\n downtimeLog: [],\n toolProficienciesByCharacter: {},\n bastions: {},\n settings: defaultCampaignSettings(),\n milestones: [],\n inGameTime: { totalMinutes: 0 },\n version: 0,\n});\n","import { z } from 'zod';\nimport { ULIDSchema, DamageTypeSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const DAMAGE_MITIGATION_KINDS = ['resisted', 'immune', 'vulnerable'] as const;\nexport const DamageMitigationKindSchema = z.enum(DAMAGE_MITIGATION_KINDS);\nexport type DamageMitigationKind = z.infer<typeof DamageMitigationKindSchema>;\n\nexport const DamageComponentSchema = z.object({\n amount: z.number().int().min(0),\n type: DamageTypeSchema,\n rawAmount: z.number().int().min(0).optional(),\n mitigation: DamageMitigationKindSchema.optional(),\n});\nexport type DamageComponent = z.infer<typeof DamageComponentSchema>;\n\nexport const DamageAppliedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('DamageApplied'),\n targetId: ULIDSchema,\n components: z.array(DamageComponentSchema).min(1),\n});\nexport type DamageAppliedEvent = z.infer<typeof DamageAppliedEventSchema>;\n\nexport const HealedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('Healed'),\n targetId: ULIDSchema,\n amount: z.number().int().min(0),\n source: z.string().optional(),\n});\nexport type HealedEvent = z.infer<typeof HealedEventSchema>;\n\nexport const TempHPGrantedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('TempHPGranted'),\n targetId: ULIDSchema,\n amount: z.number().int().min(0),\n source: z.string().optional(),\n});\nexport type TempHPGrantedEvent = z.infer<typeof TempHPGrantedEventSchema>;\n\nexport const ConditionAppliedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ConditionApplied'),\n targetId: ULIDSchema,\n conditionId: z.string(),\n level: z.number().int().min(1).optional(),\n expiresOnRound: z.number().int().optional(),\n appliedConditionId: ULIDSchema.optional(),\n});\nexport type ConditionAppliedEvent = z.infer<typeof ConditionAppliedEventSchema>;\n\nexport const ConditionRemovedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ConditionRemoved'),\n targetId: ULIDSchema,\n conditionId: z.string(),\n});\nexport type ConditionRemovedEvent = z.infer<typeof ConditionRemovedEventSchema>;\n\nexport const ExhaustionChangedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ExhaustionChanged'),\n targetId: ULIDSchema,\n fromLevel: z.number().int().min(0).max(6),\n toLevel: z.number().int().min(0).max(6),\n});\nexport type ExhaustionChangedEvent = z.infer<typeof ExhaustionChangedEventSchema>;\n\nexport const DeathSaveRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('DeathSaveRolled'),\n targetId: ULIDSchema,\n d20: z.number().int().min(1).max(20),\n success: z.boolean(),\n critical: z.boolean().default(false),\n});\nexport type DeathSaveRolledEvent = z.infer<typeof DeathSaveRolledEventSchema>;\n\nexport const StabilizedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('Stabilized'),\n targetId: ULIDSchema,\n});\nexport type StabilizedEvent = z.infer<typeof StabilizedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const ResourceSpentEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ResourceSpent'),\n characterId: ULIDSchema,\n resourceId: z.string(),\n amount: z.number().int().min(1),\n});\nexport type ResourceSpentEvent = z.infer<typeof ResourceSpentEventSchema>;\n\nexport const ResourceRestoredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ResourceRestored'),\n characterId: ULIDSchema,\n resourceId: z.string(),\n amount: z.union([z.number().int().min(0), z.literal('all')]),\n});\nexport type ResourceRestoredEvent = z.infer<typeof ResourceRestoredEventSchema>;\n\nexport const HitDieSpentEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('HitDieSpent'),\n characterId: ULIDSchema,\n die: z.union([z.literal(6), z.literal(8), z.literal(10), z.literal(12)]),\n rolled: z.number().int().min(1),\n conMod: z.number().int(),\n healed: z.number().int().min(0),\n});\nexport type HitDieSpentEvent = z.infer<typeof HitDieSpentEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const ShortRestStartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ShortRestStarted'),\n participantIds: z.array(ULIDSchema).min(1),\n});\nexport type ShortRestStartedEvent = z.infer<typeof ShortRestStartedEventSchema>;\n\nexport const ShortRestEndedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ShortRestEnded'),\n});\nexport type ShortRestEndedEvent = z.infer<typeof ShortRestEndedEventSchema>;\n\nexport const LongRestStartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('LongRestStarted'),\n participantIds: z.array(ULIDSchema).min(1),\n});\nexport type LongRestStartedEvent = z.infer<typeof LongRestStartedEventSchema>;\n\nexport const LongRestEndedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('LongRestEnded'),\n});\nexport type LongRestEndedEvent = z.infer<typeof LongRestEndedEventSchema>;\n","import { z } from 'zod';\nimport { CharacterSchema } from '../runtime/character.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const CharacterCreatedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('CharacterCreated'),\n snapshot: CharacterSchema,\n});\nexport type CharacterCreatedEvent = z.infer<typeof CharacterCreatedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const EncounterCreatedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('EncounterCreated'),\n encounterId: ULIDSchema,\n name: z.string().optional(),\n combatantIds: z.array(ULIDSchema).min(1),\n});\nexport type EncounterCreatedEvent = z.infer<typeof EncounterCreatedEventSchema>;\n\nexport const InitiativeRollSchema = z.object({\n combatantId: ULIDSchema,\n d20: z.number().int().min(1).max(20),\n modifier: z.number().int(),\n total: z.number().int(),\n});\nexport type InitiativeRoll = z.infer<typeof InitiativeRollSchema>;\n\nexport const InitiativeRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('InitiativeRolled'),\n encounterId: ULIDSchema,\n rolls: z.array(InitiativeRollSchema).min(1),\n});\nexport type InitiativeRolledEvent = z.infer<typeof InitiativeRolledEventSchema>;\n\nexport const EncounterStartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('EncounterStarted'),\n encounterId: ULIDSchema,\n});\nexport type EncounterStartedEvent = z.infer<typeof EncounterStartedEventSchema>;\n\nexport const TurnStartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('TurnStarted'),\n encounterId: ULIDSchema,\n combatantId: ULIDSchema,\n round: z.number().int().min(1),\n});\nexport type TurnStartedEvent = z.infer<typeof TurnStartedEventSchema>;\n\nexport const TurnEndedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('TurnEnded'),\n encounterId: ULIDSchema,\n combatantId: ULIDSchema,\n round: z.number().int().min(1),\n});\nexport type TurnEndedEvent = z.infer<typeof TurnEndedEventSchema>;\n\nexport const RoundEndedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('RoundEnded'),\n encounterId: ULIDSchema,\n round: z.number().int().min(1),\n});\nexport type RoundEndedEvent = z.infer<typeof RoundEndedEventSchema>;\n\nexport const EncounterEndedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('EncounterEnded'),\n encounterId: ULIDSchema,\n outcome: z.enum(['victory', 'defeat', 'fled', 'parley']),\n});\nexport type EncounterEndedEvent = z.infer<typeof EncounterEndedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema, DamageTypeSchema, DiceExpressionSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const AttackAdvantageSchema = z.enum(['none', 'advantage', 'disadvantage']);\nexport type AttackAdvantage = z.infer<typeof AttackAdvantageSchema>;\n\nexport const AttackRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('AttackRolled'),\n attackerId: ULIDSchema,\n targetId: ULIDSchema,\n weaponInstanceId: ULIDSchema,\n d20: z.array(z.number().int().min(1).max(20)).min(1).max(2),\n used: AttackAdvantageSchema,\n attackBonus: z.number().int(),\n total: z.number().int(),\n targetAC: z.number().int(),\n hit: z.boolean(),\n critical: z.boolean(),\n});\nexport type AttackRolledEvent = z.infer<typeof AttackRolledEventSchema>;\n\nexport const DamageRollSchema = z.object({\n expression: DiceExpressionSchema,\n rolls: z.array(z.number().int().min(1)),\n modifier: z.number().int(),\n type: DamageTypeSchema,\n});\nexport type DamageRoll = z.infer<typeof DamageRollSchema>;\n\nexport const DamageRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('DamageRolled'),\n attackerId: ULIDSchema,\n targetId: ULIDSchema,\n weaponInstanceId: ULIDSchema,\n rolls: z.array(DamageRollSchema).min(1),\n critical: z.boolean(),\n});\nexport type DamageRolledEvent = z.infer<typeof DamageRolledEventSchema>;\n","import { z } from 'zod';\nimport { ItemInstanceSchema } from '../runtime/item-instance.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const ItemAcquiredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemAcquired'),\n instance: ItemInstanceSchema,\n});\nexport type ItemAcquiredEvent = z.infer<typeof ItemAcquiredEventSchema>;\n\nexport const EQUIP_SLOTS = ['mainHand', 'offHand', 'armor', 'shield'] as const;\nexport const EquipSlotSchema = z.enum(EQUIP_SLOTS);\nexport type EquipSlot = z.infer<typeof EquipSlotSchema>;\n\nexport const ItemEquippedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemEquipped'),\n characterId: ULIDSchema,\n instanceId: ULIDSchema,\n slot: EquipSlotSchema,\n});\nexport type ItemEquippedEvent = z.infer<typeof ItemEquippedEventSchema>;\n\nexport const ItemUnequippedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemUnequipped'),\n characterId: ULIDSchema,\n slot: EquipSlotSchema,\n});\nexport type ItemUnequippedEvent = z.infer<typeof ItemUnequippedEventSchema>;\n\nexport const ItemAttunedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemAttuned'),\n characterId: ULIDSchema,\n instanceId: ULIDSchema,\n});\nexport type ItemAttunedEvent = z.infer<typeof ItemAttunedEventSchema>;\n\nexport const ItemUnattunedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemUnattuned'),\n characterId: ULIDSchema,\n instanceId: ULIDSchema,\n});\nexport type ItemUnattunedEvent = z.infer<typeof ItemUnattunedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { ChoiceOptionSchema } from '../runtime/pending-choice.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const HPStrategySchema = z.enum(['roll', 'average']);\nexport type HPStrategy = z.infer<typeof HPStrategySchema>;\n\nexport const LevelUpResolvedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('LevelUpResolved'),\n characterId: ULIDSchema,\n classId: z.string(),\n newClassLevel: z.number().int().min(2).max(20),\n hpStrategy: HPStrategySchema,\n hpRoll: z.number().int().min(1).optional(),\n hpGained: z.number().int().min(1),\n});\nexport type LevelUpResolvedEvent = z.infer<typeof LevelUpResolvedEventSchema>;\n\nexport const ChoiceRequiredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ChoiceRequired'),\n choiceId: ULIDSchema,\n characterId: ULIDSchema,\n promptKey: z.string(),\n prompt: z.string(),\n options: z.array(ChoiceOptionSchema).min(1),\n oneOf: z.number().int().min(1),\n});\nexport type ChoiceRequiredEvent = z.infer<typeof ChoiceRequiredEventSchema>;\n\nexport const ChoiceResolvedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ChoiceResolved'),\n choiceId: ULIDSchema,\n characterId: ULIDSchema,\n selectedOptionIds: z.array(z.string()).min(1),\n});\nexport type ChoiceResolvedEvent = z.infer<typeof ChoiceResolvedEventSchema>;\n","import { z } from 'zod';\nimport { AbilityScoreSchema, SkillSchema, ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const CheckAdvantageSchema = z.enum(['none', 'advantage', 'disadvantage']);\nexport type CheckAdvantage = z.infer<typeof CheckAdvantageSchema>;\n\nexport const SaveRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SaveRolled'),\n targetId: ULIDSchema,\n ability: AbilityScoreSchema,\n dc: z.number().int().min(1),\n d20: z.array(z.number().int().min(1).max(20)).min(1).max(2),\n used: CheckAdvantageSchema,\n bonus: z.number().int(),\n total: z.number().int(),\n success: z.boolean(),\n});\nexport type SaveRolledEvent = z.infer<typeof SaveRolledEventSchema>;\n\nexport const AbilityCheckRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('AbilityCheckRolled'),\n characterId: ULIDSchema,\n ability: AbilityScoreSchema,\n skill: SkillSchema.optional(),\n dc: z.number().int().min(1).optional(),\n d20: z.array(z.number().int().min(1).max(20)).min(1).max(2),\n used: CheckAdvantageSchema,\n bonus: z.number().int(),\n total: z.number().int(),\n success: z.boolean().optional(),\n});\nexport type AbilityCheckRolledEvent = z.infer<typeof AbilityCheckRolledEventSchema>;\n","import { z } from 'zod';\nimport { SpellLevelSchema, ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const SpellSlotSourceSchema = z.enum(['standard', 'pact']);\nexport type SpellSlotSource = z.infer<typeof SpellSlotSourceSchema>;\n\nexport const SpellCastDeclaredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SpellCastDeclared'),\n characterId: ULIDSchema,\n spellId: z.string(),\n slotLevel: SpellLevelSchema,\n slotSource: SpellSlotSourceSchema,\n targetIds: z.array(ULIDSchema).default([]),\n castAsRitual: z.boolean().default(false),\n});\nexport type SpellCastDeclaredEvent = z.infer<typeof SpellCastDeclaredEventSchema>;\n\nexport const SpellSlotConsumedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SpellSlotConsumed'),\n characterId: ULIDSchema,\n slotLevel: SpellLevelSchema,\n});\nexport type SpellSlotConsumedEvent = z.infer<typeof SpellSlotConsumedEventSchema>;\n\nexport const PactSlotConsumedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('PactSlotConsumed'),\n characterId: ULIDSchema,\n});\nexport type PactSlotConsumedEvent = z.infer<typeof PactSlotConsumedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { AppliedConditionRefSchema } from '../runtime/effect-instance.js';\n\nexport const ConcentrationStartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ConcentrationStarted'),\n effectInstanceId: ULIDSchema,\n casterId: ULIDSchema,\n spellId: z.string(),\n targetIds: z.array(ULIDSchema).default([]),\n conditionsApplied: z.array(AppliedConditionRefSchema).default([]),\n durationRounds: z.number().int().min(0).optional(),\n});\nexport type ConcentrationStartedEvent = z.infer<typeof ConcentrationStartedEventSchema>;\n\nexport const ConcentrationBrokenReasonSchema = z.enum([\n 'failedSave',\n 'newConcentrationSpell',\n 'voluntary',\n 'incapacitated',\n 'dead',\n 'durationEnded',\n]);\nexport type ConcentrationBrokenReason = z.infer<typeof ConcentrationBrokenReasonSchema>;\n\nexport const ConcentrationBrokenEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ConcentrationBroken'),\n effectInstanceId: ULIDSchema,\n casterId: ULIDSchema,\n reason: ConcentrationBrokenReasonSchema,\n});\nexport type ConcentrationBrokenEvent = z.infer<typeof ConcentrationBrokenEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const TriggerFiredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('TriggerFired'),\n characterId: ULIDSchema,\n triggerId: z.string(),\n cadence: z\n .object({\n firedThisTurn: z.boolean().optional(),\n firedThisRound: z.boolean().optional(),\n firedThisShortRest: z.boolean().optional(),\n firedThisLongRest: z.boolean().optional(),\n })\n .default({}),\n});\nexport type TriggerFiredEvent = z.infer<typeof TriggerFiredEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const ACTION_ECONOMY_KINDS = ['action', 'bonusAction', 'reaction', 'attack'] as const;\nexport const ActionEconomyKindSchema = z.enum(ACTION_ECONOMY_KINDS);\nexport type ActionEconomyKind = z.infer<typeof ActionEconomyKindSchema>;\n\nexport const ActionEconomyConsumedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ActionEconomyConsumed'),\n encounterId: ULIDSchema,\n combatantId: ULIDSchema,\n kind: ActionEconomyKindSchema,\n});\nexport type ActionEconomyConsumedEvent = z.infer<typeof ActionEconomyConsumedEventSchema>;\n","import { z } from 'zod';\nimport { ULIDSchema } from '../primitives.js';\nimport { PositionSchema } from '../runtime/encounter.js';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const CombatantMovedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('CombatantMoved'),\n encounterId: ULIDSchema,\n combatantId: ULIDSchema,\n fromPosition: PositionSchema.optional(),\n toPosition: PositionSchema,\n feetTraveled: z.number().min(0),\n});\nexport type CombatantMovedEvent = z.infer<typeof CombatantMovedEventSchema>;\n\nexport const DashedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('Dashed'),\n encounterId: ULIDSchema,\n combatantId: ULIDSchema,\n});\nexport type DashedEvent = z.infer<typeof DashedEventSchema>;\n\nexport const DisengagedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('Disengaged'),\n encounterId: ULIDSchema,\n combatantId: ULIDSchema,\n});\nexport type DisengagedEvent = z.infer<typeof DisengagedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { CurrencySchema } from '../runtime/currency.js';\n\nexport const PartyCreatedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('PartyCreated'),\n partyId: ULIDSchema,\n name: z.string().min(1),\n memberIds: z.array(ULIDSchema).default([]),\n});\nexport type PartyCreatedEvent = z.infer<typeof PartyCreatedEventSchema>;\n\nexport const PartyMembersChangedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('PartyMembersChanged'),\n partyId: ULIDSchema,\n added: z.array(ULIDSchema).default([]),\n removed: z.array(ULIDSchema).default([]),\n});\nexport type PartyMembersChangedEvent = z.infer<typeof PartyMembersChangedEventSchema>;\n\nexport const CurrencyAcquiredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('CurrencyAcquired'),\n partyId: ULIDSchema,\n amounts: CurrencySchema,\n source: z.string().optional(),\n});\nexport type CurrencyAcquiredEvent = z.infer<typeof CurrencyAcquiredEventSchema>;\n\nexport const CurrencySpentEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('CurrencySpent'),\n partyId: ULIDSchema,\n amounts: CurrencySchema,\n purpose: z.string().optional(),\n});\nexport type CurrencySpentEvent = z.infer<typeof CurrencySpentEventSchema>;\n\nexport const ItemDepositedToPartyEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemDepositedToParty'),\n partyId: ULIDSchema,\n itemInstanceId: ULIDSchema,\n sourceCharacterId: ULIDSchema.optional(),\n});\nexport type ItemDepositedToPartyEvent = z.infer<typeof ItemDepositedToPartyEventSchema>;\n\nexport const ItemWithdrawnFromPartyEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemWithdrawnFromParty'),\n partyId: ULIDSchema,\n itemInstanceId: ULIDSchema,\n recipientCharacterId: ULIDSchema.optional(),\n});\nexport type ItemWithdrawnFromPartyEvent = z.infer<typeof ItemWithdrawnFromPartyEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { InGameTimeSchema } from '../runtime/in-game-time.js';\nimport { JournalAuthorKindSchema, JournalVisibilitySchema } from '../runtime/session.js';\n\nexport const SessionStartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SessionStarted'),\n sessionId: ULIDSchema,\n name: z.string().min(1),\n inGameStart: InGameTimeSchema.optional(),\n});\nexport type SessionStartedEvent = z.infer<typeof SessionStartedEventSchema>;\n\nexport const SessionEndedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SessionEnded'),\n sessionId: ULIDSchema,\n summary: z.string().optional(),\n});\nexport type SessionEndedEvent = z.infer<typeof SessionEndedEventSchema>;\n\nexport const JournalEntryAddedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('JournalEntryAdded'),\n entryId: ULIDSchema,\n sessionId: ULIDSchema.optional(),\n authorKind: JournalAuthorKindSchema,\n authorCharacterId: ULIDSchema.optional(),\n visibility: JournalVisibilitySchema,\n visibleToCharacterIds: z.array(ULIDSchema).default([]),\n title: z.string().min(1),\n body: z.string(),\n});\nexport type JournalEntryAddedEvent = z.infer<typeof JournalEntryAddedEventSchema>;\n\nexport const InGameTimeAdvancedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('InGameTimeAdvanced'),\n minutes: z.number().int().min(1),\n reason: z.string().optional(),\n});\nexport type InGameTimeAdvancedEvent = z.infer<typeof InGameTimeAdvancedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { PositionSchema } from '../runtime/encounter.js';\nimport {\n DoorStateSchema,\n LocationMapSchema,\n} from '../runtime/location.js';\n\nexport const LocationCreatedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('LocationCreated'),\n locationId: ULIDSchema,\n name: z.string().min(1),\n description: z.string().optional(),\n parentLocationId: ULIDSchema.optional(),\n map: LocationMapSchema.optional(),\n});\nexport type LocationCreatedEvent = z.infer<typeof LocationCreatedEventSchema>;\n\nexport const DoorAddedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('DoorAdded'),\n doorId: ULIDSchema,\n locationId: ULIDSchema,\n name: z.string().optional(),\n position: PositionSchema,\n state: DoorStateSchema,\n});\nexport type DoorAddedEvent = z.infer<typeof DoorAddedEventSchema>;\n\nexport const DoorStateChangedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('DoorStateChanged'),\n doorId: ULIDSchema,\n toState: DoorStateSchema,\n byCharacterId: ULIDSchema.optional(),\n});\nexport type DoorStateChangedEvent = z.infer<typeof DoorStateChangedEventSchema>;\n\nexport const CharacterLocationChangedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('CharacterLocationChanged'),\n characterId: ULIDSchema,\n toLocationId: ULIDSchema.optional(),\n});\nexport type CharacterLocationChangedEvent = z.infer<typeof CharacterLocationChangedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const SpellCounteredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SpellCountered'),\n originalSpellEventId: ULIDSchema,\n counterCasterId: ULIDSchema,\n targetCasterId: ULIDSchema,\n spellId: z.string(),\n});\nexport type SpellCounteredEvent = z.infer<typeof SpellCounteredEventSchema>;\n\nexport const SpellDispelledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SpellDispelled'),\n effectInstanceId: ULIDSchema,\n dispelledByCharacterId: ULIDSchema,\n});\nexport type SpellDispelledEvent = z.infer<typeof SpellDispelledEventSchema>;\n\nexport const ItemIdentifiedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemIdentified'),\n itemInstanceId: ULIDSchema,\n identifiedByCharacterId: ULIDSchema,\n});\nexport type ItemIdentifiedEvent = z.infer<typeof ItemIdentifiedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema, WeaponMasterySchema } from '../primitives.js';\n\nexport const WeaponMasteryActivatedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('WeaponMasteryActivated'),\n mastery: WeaponMasterySchema,\n attackerId: ULIDSchema,\n targetId: ULIDSchema.optional(),\n weaponInstanceId: ULIDSchema,\n});\nexport type WeaponMasteryActivatedEvent = z.infer<typeof WeaponMasteryActivatedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { VehicleKindSchema } from '../runtime/vehicle.js';\n\nexport const MountedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('Mounted'),\n riderId: ULIDSchema,\n mountId: ULIDSchema,\n});\nexport type MountedEvent = z.infer<typeof MountedEventSchema>;\n\nexport const DismountedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('Dismounted'),\n riderId: ULIDSchema,\n mountId: ULIDSchema,\n voluntary: z.boolean().default(true),\n});\nexport type DismountedEvent = z.infer<typeof DismountedEventSchema>;\n\nexport const VehicleAcquiredEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('VehicleAcquired'),\n vehicleId: ULIDSchema,\n name: z.string().min(1),\n kind: VehicleKindSchema,\n speedFeet: z.number().int().min(0),\n ac: z.number().int().min(0),\n maxHp: z.number().int().min(1),\n capacity: z.number().int().min(1),\n});\nexport type VehicleAcquiredEvent = z.infer<typeof VehicleAcquiredEventSchema>;\n\nexport const VehicleBoardedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('VehicleBoarded'),\n vehicleId: ULIDSchema,\n characterId: ULIDSchema,\n});\nexport type VehicleBoardedEvent = z.infer<typeof VehicleBoardedEventSchema>;\n\nexport const VehicleDepartedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('VehicleDeparted'),\n vehicleId: ULIDSchema,\n characterId: ULIDSchema,\n});\nexport type VehicleDepartedEvent = z.infer<typeof VehicleDepartedEventSchema>;\n\nexport const VehicleDamagedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('VehicleDamaged'),\n vehicleId: ULIDSchema,\n amount: z.number().int().min(0),\n source: z.string().optional(),\n});\nexport type VehicleDamagedEvent = z.infer<typeof VehicleDamagedEventSchema>;\n\nexport const VehicleRepairedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('VehicleRepaired'),\n vehicleId: ULIDSchema,\n amount: z.number().int().min(0),\n});\nexport type VehicleRepairedEvent = z.infer<typeof VehicleRepairedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { TravelPaceSchema } from '../runtime/travel.js';\n\nexport const TravelLegCompletedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('TravelLegCompleted'),\n partyId: ULIDSchema,\n pace: TravelPaceSchema,\n hours: z.number().min(0),\n miles: z.number().min(0),\n fromLocationId: ULIDSchema.optional(),\n toLocationId: ULIDSchema.optional(),\n notes: z.string().optional(),\n});\nexport type TravelLegCompletedEvent = z.infer<typeof TravelLegCompletedEventSchema>;\n\nexport const NavigationCheckRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('NavigationCheckRolled'),\n partyId: ULIDSchema,\n navigatorId: ULIDSchema,\n d20: z.number().int().min(1).max(20),\n bonus: z.number().int(),\n total: z.number().int(),\n dc: z.number().int(),\n success: z.boolean(),\n});\nexport type NavigationCheckRolledEvent = z.infer<typeof NavigationCheckRolledEventSchema>;\n\nexport const ForagedForEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ForagedFor'),\n partyId: ULIDSchema,\n foragerId: ULIDSchema,\n d20: z.number().int().min(1).max(20),\n bonus: z.number().int(),\n total: z.number().int(),\n dc: z.number().int(),\n success: z.boolean(),\n foodPounds: z.number().int().min(0).default(0),\n waterPounds: z.number().int().min(0).default(0),\n});\nexport type ForagedForEvent = z.infer<typeof ForagedForEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const ATTITUDES = ['hostile', 'unfriendly', 'indifferent', 'friendly', 'helpful'] as const;\nexport const AttitudeSchema = z.enum(ATTITUDES);\nexport type Attitude = z.infer<typeof AttitudeSchema>;\n\nexport const AttitudeChangedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('AttitudeChanged'),\n characterId: ULIDSchema,\n fromAttitude: AttitudeSchema.optional(),\n toAttitude: AttitudeSchema,\n cause: z.string().optional(),\n});\nexport type AttitudeChangedEvent = z.infer<typeof AttitudeChangedEventSchema>;\n\nexport const MoraleCheckRolledEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('MoraleCheckRolled'),\n characterId: ULIDSchema,\n d20: z.number().int().min(1).max(20),\n bonus: z.number().int(),\n total: z.number().int(),\n dc: z.number().int(),\n success: z.boolean(),\n});\nexport type MoraleCheckRolledEvent = z.infer<typeof MoraleCheckRolledEventSchema>;\n\nexport const MoraleBrokenEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('MoraleBroken'),\n characterId: ULIDSchema,\n action: z.enum(['flee', 'surrender']),\n});\nexport type MoraleBrokenEvent = z.infer<typeof MoraleBrokenEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const RECHARGE_CADENCES = ['dawn', 'dusk', 'shortRest', 'longRest', 'manual'] as const;\nexport const RechargeCadenceSchema = z.enum(RECHARGE_CADENCES);\nexport type RechargeCadence = z.infer<typeof RechargeCadenceSchema>;\n\nexport const ItemChargeConsumedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemChargeConsumed'),\n itemInstanceId: ULIDSchema,\n amount: z.number().int().min(1),\n byCharacterId: ULIDSchema.optional(),\n forEffect: z.string().optional(),\n});\nexport type ItemChargeConsumedEvent = z.infer<typeof ItemChargeConsumedEventSchema>;\n\nexport const ItemRechargedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('ItemRecharged'),\n itemInstanceId: ULIDSchema,\n amount: z.number().int().min(1),\n cadence: RechargeCadenceSchema,\n});\nexport type ItemRechargedEvent = z.infer<typeof ItemRechargedEventSchema>;\n\nexport const SentientItemConflictEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SentientItemConflict'),\n itemInstanceId: ULIDSchema,\n wielderId: ULIDSchema,\n winner: z.enum(['item', 'wielder']),\n description: z.string().optional(),\n});\nexport type SentientItemConflictEvent = z.infer<typeof SentientItemConflictEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\nimport { BastionFacilityKindSchema, BastionFacilitySpaceSchema } from '../runtime/bastion.js';\n\nexport const BASTION_TURN_ORDERS = ['maintain', 'craft', 'recruit', 'research', 'trade', 'empower'] as const;\nexport const BastionTurnOrderSchema = z.enum(BASTION_TURN_ORDERS);\nexport type BastionTurnOrder = z.infer<typeof BastionTurnOrderSchema>;\n\nexport const BastionFoundedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('BastionFounded'),\n bastionId: ULIDSchema,\n name: z.string().min(1),\n ownerCharacterId: ULIDSchema,\n locationId: ULIDSchema.optional(),\n level: z.number().int().min(1).max(9).default(1),\n hpMax: z.number().int().min(1).default(50),\n});\nexport type BastionFoundedEvent = z.infer<typeof BastionFoundedEventSchema>;\n\nexport const BastionFacilityAddedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('BastionFacilityAdded'),\n bastionId: ULIDSchema,\n facilityId: ULIDSchema,\n name: z.string().min(1),\n kind: BastionFacilityKindSchema,\n space: BastionFacilitySpaceSchema,\n description: z.string().optional(),\n});\nexport type BastionFacilityAddedEvent = z.infer<typeof BastionFacilityAddedEventSchema>;\n\nexport const BastionHirelingAddedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('BastionHirelingAdded'),\n bastionId: ULIDSchema,\n hirelingId: ULIDSchema,\n name: z.string().min(1),\n role: z.string().min(1),\n});\nexport type BastionHirelingAddedEvent = z.infer<typeof BastionHirelingAddedEventSchema>;\n\nexport const BastionTurnTakenEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('BastionTurnTaken'),\n bastionId: ULIDSchema,\n order: BastionTurnOrderSchema,\n treasuryDeltaGp: z.number().int().default(0),\n summary: z.string().optional(),\n});\nexport type BastionTurnTakenEvent = z.infer<typeof BastionTurnTakenEventSchema>;\n\nexport const BastionDamagedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('BastionDamaged'),\n bastionId: ULIDSchema,\n amount: z.number().int().min(0),\n source: z.string().optional(),\n});\nexport type BastionDamagedEvent = z.infer<typeof BastionDamagedEventSchema>;\n\nexport const BastionLevelChangedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('BastionLevelChanged'),\n bastionId: ULIDSchema,\n fromLevel: z.number().int().min(1).max(9),\n toLevel: z.number().int().min(1).max(9),\n});\nexport type BastionLevelChangedEvent = z.infer<typeof BastionLevelChangedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\n\nexport const CampaignSettingsChangedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('CampaignSettingsChanged'),\n grittyRest: z.boolean().optional(),\n heroPoints: z.boolean().optional(),\n sanity: z.boolean().optional(),\n massCombat: z.boolean().optional(),\n feaCharacterFlaws: z.boolean().optional(),\n customHouserulesAdd: z.array(z.string()).optional(),\n customHouserulesRemove: z.array(z.string()).optional(),\n});\nexport type CampaignSettingsChangedEvent = z.infer<typeof CampaignSettingsChangedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema } from '../primitives.js';\n\nexport const RESURRECTION_SPELLS = [\n 'revivify',\n 'raise-dead',\n 'reincarnate',\n 'resurrection',\n 'true-resurrection',\n] as const;\nexport const ResurrectionSpellSchema = z.enum(RESURRECTION_SPELLS);\nexport type ResurrectionSpell = z.infer<typeof ResurrectionSpellSchema>;\n\nexport const CharacterResurrectedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('CharacterResurrected'),\n characterId: ULIDSchema,\n spell: ResurrectionSpellSchema,\n byCharacterId: ULIDSchema.optional(),\n hpAfter: z.number().int().min(1),\n newSpeciesId: z.string().optional(),\n});\nexport type CharacterResurrectedEvent = z.infer<typeof CharacterResurrectedEventSchema>;\n","import { z } from 'zod';\nimport { EventEnvelopeSchema } from './envelope.js';\nimport { ULIDSchema, AbilityScoresSchema } from '../primitives.js';\n\nexport const POLYMORPH_KINDS = ['polymorph', 'wild-shape', 'true-polymorph'] as const;\nexport const PolymorphKindSchema = z.enum(POLYMORPH_KINDS);\nexport type PolymorphKind = z.infer<typeof PolymorphKindSchema>;\n\nexport const PolymorphFormSchema = z.object({\n name: z.string().min(1),\n hp: z.number().int().min(1),\n ac: z.number().int().min(0),\n abilityScores: AbilityScoresSchema,\n speedFeet: z.number().int().min(0),\n speciesId: z.string().optional(),\n});\nexport type PolymorphForm = z.infer<typeof PolymorphFormSchema>;\n\nexport const PolymorphAppliedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('PolymorphApplied'),\n targetId: ULIDSchema,\n casterId: ULIDSchema.optional(),\n kind: PolymorphKindSchema,\n form: PolymorphFormSchema,\n});\nexport type PolymorphAppliedEvent = z.infer<typeof PolymorphAppliedEventSchema>;\n\nexport const PolymorphRevertedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('PolymorphReverted'),\n targetId: ULIDSchema,\n reason: z.enum(['voluntary', 'forced-zero-hp', 'duration-expired']).default('voluntary'),\n});\nexport type PolymorphRevertedEvent = z.infer<typeof PolymorphRevertedEventSchema>;\n\nexport const SimulacrumCreatedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('SimulacrumCreated'),\n simulacrumId: ULIDSchema,\n originalId: ULIDSchema,\n hpMax: z.number().int().min(1),\n});\nexport type SimulacrumCreatedEvent = z.infer<typeof SimulacrumCreatedEventSchema>;\n\nexport const WishGrantedEventSchema = EventEnvelopeSchema.extend({\n type: z.literal('WishGranted'),\n granterId: ULIDSchema,\n description: z.string().min(1),\n stressApplied: z.boolean().default(false),\n});\nexport type WishGrantedEvent = z.infer<typeof WishGrantedEventSchema>;\n","import { z } from 'zod';\nimport {\n DamageAppliedEventSchema,\n HealedEventSchema,\n TempHPGrantedEventSchema,\n ConditionAppliedEventSchema,\n ConditionRemovedEventSchema,\n ExhaustionChangedEventSchema,\n DeathSaveRolledEventSchema,\n StabilizedEventSchema,\n} from './combat.js';\nimport {\n ResourceSpentEventSchema,\n ResourceRestoredEventSchema,\n HitDieSpentEventSchema,\n} from './resources.js';\nimport {\n ShortRestStartedEventSchema,\n ShortRestEndedEventSchema,\n LongRestStartedEventSchema,\n LongRestEndedEventSchema,\n} from './rest.js';\nimport { CharacterCreatedEventSchema } from './progression.js';\nimport {\n EncounterCreatedEventSchema,\n EncounterEndedEventSchema,\n EncounterStartedEventSchema,\n InitiativeRolledEventSchema,\n RoundEndedEventSchema,\n TurnEndedEventSchema,\n TurnStartedEventSchema,\n} from './encounter.js';\nimport {\n AttackRolledEventSchema,\n DamageRolledEventSchema,\n} from './attack.js';\nimport { ItemAcquiredEventSchema } from './inventory.js';\nimport {\n LevelUpResolvedEventSchema,\n ChoiceRequiredEventSchema,\n ChoiceResolvedEventSchema,\n} from './level-up.js';\nimport {\n SaveRolledEventSchema,\n AbilityCheckRolledEventSchema,\n} from './checks.js';\nimport {\n SpellCastDeclaredEventSchema,\n SpellSlotConsumedEventSchema,\n PactSlotConsumedEventSchema,\n} from './spellcasting.js';\nimport {\n ConcentrationStartedEventSchema,\n ConcentrationBrokenEventSchema,\n} from './concentration.js';\nimport { TriggerFiredEventSchema } from './triggers.js';\nimport { ActionEconomyConsumedEventSchema } from './action-economy.js';\nimport {\n CombatantMovedEventSchema,\n DashedEventSchema,\n DisengagedEventSchema,\n} from './movement.js';\nimport {\n ItemEquippedEventSchema,\n ItemUnequippedEventSchema,\n ItemAttunedEventSchema,\n ItemUnattunedEventSchema,\n} from './inventory.js';\nimport {\n PartyCreatedEventSchema,\n PartyMembersChangedEventSchema,\n CurrencyAcquiredEventSchema,\n CurrencySpentEventSchema,\n ItemDepositedToPartyEventSchema,\n ItemWithdrawnFromPartyEventSchema,\n} from './party.js';\nimport {\n SessionStartedEventSchema,\n SessionEndedEventSchema,\n JournalEntryAddedEventSchema,\n InGameTimeAdvancedEventSchema,\n} from './session.js';\nimport {\n LocationCreatedEventSchema,\n DoorAddedEventSchema,\n DoorStateChangedEventSchema,\n CharacterLocationChangedEventSchema,\n} from './locations.js';\nimport {\n QuestStartedEventSchema,\n ObjectiveProgressedEventSchema,\n ObjectiveCompletedEventSchema,\n ObjectiveFailedEventSchema,\n QuestCompletedEventSchema,\n QuestFailedEventSchema,\n QuestAbandonedEventSchema,\n QuestRewardClaimedEventSchema,\n XPAwardedEventSchema,\n MilestoneAwardedEventSchema,\n} from './quests.js';\nimport {\n SpellCounteredEventSchema,\n SpellDispelledEventSchema,\n ItemIdentifiedEventSchema,\n} from './reactive-spells.js';\nimport { WeaponMasteryActivatedEventSchema } from './weapon-mastery.js';\nimport {\n MountedEventSchema,\n DismountedEventSchema,\n VehicleAcquiredEventSchema,\n VehicleBoardedEventSchema,\n VehicleDepartedEventSchema,\n VehicleDamagedEventSchema,\n VehicleRepairedEventSchema,\n} from './mounts-vehicles.js';\nimport {\n TravelLegCompletedEventSchema,\n NavigationCheckRolledEventSchema,\n ForagedForEventSchema,\n} from './travel.js';\nimport {\n AttitudeChangedEventSchema,\n MoraleCheckRolledEventSchema,\n MoraleBrokenEventSchema,\n} from './npc.js';\nimport { DowntimeActivityResolvedEventSchema } from './downtime.js';\nimport {\n ItemChargeConsumedEventSchema,\n ItemRechargedEventSchema,\n SentientItemConflictEventSchema,\n} from './charges.js';\nimport {\n BastionFoundedEventSchema,\n BastionFacilityAddedEventSchema,\n BastionHirelingAddedEventSchema,\n BastionTurnTakenEventSchema,\n BastionDamagedEventSchema,\n BastionLevelChangedEventSchema,\n} from './bastion.js';\nimport { CampaignSettingsChangedEventSchema } from './settings.js';\nimport { CharacterResurrectedEventSchema } from './resurrection.js';\nimport {\n PolymorphAppliedEventSchema,\n PolymorphRevertedEventSchema,\n SimulacrumCreatedEventSchema,\n WishGrantedEventSchema,\n} from './transformations.js';\n\nexport const EventSchema = z.discriminatedUnion('type', [\n CharacterCreatedEventSchema,\n DamageAppliedEventSchema,\n HealedEventSchema,\n TempHPGrantedEventSchema,\n ConditionAppliedEventSchema,\n ConditionRemovedEventSchema,\n ExhaustionChangedEventSchema,\n DeathSaveRolledEventSchema,\n StabilizedEventSchema,\n ResourceSpentEventSchema,\n ResourceRestoredEventSchema,\n HitDieSpentEventSchema,\n ShortRestStartedEventSchema,\n ShortRestEndedEventSchema,\n LongRestStartedEventSchema,\n LongRestEndedEventSchema,\n EncounterCreatedEventSchema,\n EncounterStartedEventSchema,\n InitiativeRolledEventSchema,\n TurnStartedEventSchema,\n TurnEndedEventSchema,\n RoundEndedEventSchema,\n EncounterEndedEventSchema,\n AttackRolledEventSchema,\n DamageRolledEventSchema,\n ItemAcquiredEventSchema,\n LevelUpResolvedEventSchema,\n ChoiceRequiredEventSchema,\n ChoiceResolvedEventSchema,\n SaveRolledEventSchema,\n AbilityCheckRolledEventSchema,\n SpellCastDeclaredEventSchema,\n SpellSlotConsumedEventSchema,\n PactSlotConsumedEventSchema,\n ConcentrationStartedEventSchema,\n ConcentrationBrokenEventSchema,\n TriggerFiredEventSchema,\n ActionEconomyConsumedEventSchema,\n CombatantMovedEventSchema,\n DashedEventSchema,\n DisengagedEventSchema,\n ItemEquippedEventSchema,\n ItemUnequippedEventSchema,\n ItemAttunedEventSchema,\n ItemUnattunedEventSchema,\n PartyCreatedEventSchema,\n PartyMembersChangedEventSchema,\n CurrencyAcquiredEventSchema,\n CurrencySpentEventSchema,\n ItemDepositedToPartyEventSchema,\n ItemWithdrawnFromPartyEventSchema,\n SessionStartedEventSchema,\n SessionEndedEventSchema,\n JournalEntryAddedEventSchema,\n InGameTimeAdvancedEventSchema,\n LocationCreatedEventSchema,\n DoorAddedEventSchema,\n DoorStateChangedEventSchema,\n CharacterLocationChangedEventSchema,\n QuestStartedEventSchema,\n ObjectiveProgressedEventSchema,\n ObjectiveCompletedEventSchema,\n ObjectiveFailedEventSchema,\n QuestCompletedEventSchema,\n QuestFailedEventSchema,\n QuestAbandonedEventSchema,\n QuestRewardClaimedEventSchema,\n XPAwardedEventSchema,\n MilestoneAwardedEventSchema,\n SpellCounteredEventSchema,\n SpellDispelledEventSchema,\n ItemIdentifiedEventSchema,\n WeaponMasteryActivatedEventSchema,\n MountedEventSchema,\n DismountedEventSchema,\n VehicleAcquiredEventSchema,\n VehicleBoardedEventSchema,\n VehicleDepartedEventSchema,\n VehicleDamagedEventSchema,\n VehicleRepairedEventSchema,\n TravelLegCompletedEventSchema,\n NavigationCheckRolledEventSchema,\n ForagedForEventSchema,\n AttitudeChangedEventSchema,\n MoraleCheckRolledEventSchema,\n MoraleBrokenEventSchema,\n DowntimeActivityResolvedEventSchema,\n ItemChargeConsumedEventSchema,\n ItemRechargedEventSchema,\n SentientItemConflictEventSchema,\n BastionFoundedEventSchema,\n BastionFacilityAddedEventSchema,\n BastionHirelingAddedEventSchema,\n BastionTurnTakenEventSchema,\n BastionDamagedEventSchema,\n BastionLevelChangedEventSchema,\n CharacterResurrectedEventSchema,\n PolymorphAppliedEventSchema,\n PolymorphRevertedEventSchema,\n SimulacrumCreatedEventSchema,\n WishGrantedEventSchema,\n CampaignSettingsChangedEventSchema,\n]);\nexport type Event = z.infer<typeof EventSchema>;\nexport type EventType = Event['type'];\n\nexport const EVENT_TYPES = [\n 'CharacterCreated',\n 'DamageApplied',\n 'Healed',\n 'TempHPGranted',\n 'ConditionApplied',\n 'ConditionRemoved',\n 'ExhaustionChanged',\n 'DeathSaveRolled',\n 'Stabilized',\n 'ResourceSpent',\n 'ResourceRestored',\n 'HitDieSpent',\n 'ShortRestStarted',\n 'ShortRestEnded',\n 'LongRestStarted',\n 'LongRestEnded',\n 'EncounterCreated',\n 'EncounterStarted',\n 'InitiativeRolled',\n 'TurnStarted',\n 'TurnEnded',\n 'RoundEnded',\n 'EncounterEnded',\n 'AttackRolled',\n 'DamageRolled',\n 'ItemAcquired',\n 'LevelUpResolved',\n 'ChoiceRequired',\n 'ChoiceResolved',\n 'SaveRolled',\n 'AbilityCheckRolled',\n 'SpellCastDeclared',\n 'SpellSlotConsumed',\n 'PactSlotConsumed',\n 'ConcentrationStarted',\n 'ConcentrationBroken',\n 'TriggerFired',\n 'ActionEconomyConsumed',\n 'CombatantMoved',\n 'Dashed',\n 'Disengaged',\n 'ItemEquipped',\n 'ItemUnequipped',\n 'ItemAttuned',\n 'ItemUnattuned',\n 'PartyCreated',\n 'PartyMembersChanged',\n 'CurrencyAcquired',\n 'CurrencySpent',\n 'ItemDepositedToParty',\n 'ItemWithdrawnFromParty',\n 'SessionStarted',\n 'SessionEnded',\n 'JournalEntryAdded',\n 'InGameTimeAdvanced',\n 'LocationCreated',\n 'DoorAdded',\n 'DoorStateChanged',\n 'CharacterLocationChanged',\n 'QuestStarted',\n 'ObjectiveProgressed',\n 'ObjectiveCompleted',\n 'ObjectiveFailed',\n 'QuestCompleted',\n 'QuestFailed',\n 'QuestAbandoned',\n 'QuestRewardClaimed',\n 'XPAwarded',\n 'MilestoneAwarded',\n 'SpellCountered',\n 'SpellDispelled',\n 'ItemIdentified',\n 'WeaponMasteryActivated',\n 'Mounted',\n 'Dismounted',\n 'VehicleAcquired',\n 'VehicleBoarded',\n 'VehicleDeparted',\n 'VehicleDamaged',\n 'VehicleRepaired',\n 'TravelLegCompleted',\n 'NavigationCheckRolled',\n 'ForagedFor',\n 'AttitudeChanged',\n 'MoraleCheckRolled',\n 'MoraleBroken',\n 'DowntimeActivityResolved',\n 'ItemChargeConsumed',\n 'ItemRecharged',\n 'SentientItemConflict',\n 'BastionFounded',\n 'BastionFacilityAdded',\n 'BastionHirelingAdded',\n 'BastionTurnTaken',\n 'BastionDamaged',\n 'BastionLevelChanged',\n 'CharacterResurrected',\n 'PolymorphApplied',\n 'PolymorphReverted',\n 'SimulacrumCreated',\n 'WishGranted',\n 'CampaignSettingsChanged',\n] as const satisfies ReadonlyArray<EventType>;\n\nexport type {\n DamageAppliedEvent,\n DamageComponent,\n HealedEvent,\n TempHPGrantedEvent,\n ConditionAppliedEvent,\n ConditionRemovedEvent,\n ExhaustionChangedEvent,\n DeathSaveRolledEvent,\n StabilizedEvent,\n} from './combat.js';\nexport type {\n ResourceSpentEvent,\n ResourceRestoredEvent,\n HitDieSpentEvent,\n} from './resources.js';\nexport type {\n ShortRestStartedEvent,\n ShortRestEndedEvent,\n LongRestStartedEvent,\n LongRestEndedEvent,\n} from './rest.js';\nexport type { CharacterCreatedEvent } from './progression.js';\nexport type { EventEnvelope } from './envelope.js';\nexport type {\n EncounterCreatedEvent,\n EncounterStartedEvent,\n InitiativeRolledEvent,\n InitiativeRoll,\n TurnStartedEvent,\n TurnEndedEvent,\n RoundEndedEvent,\n EncounterEndedEvent,\n} from './encounter.js';\nexport type {\n AttackRolledEvent,\n DamageRolledEvent,\n DamageRoll,\n AttackAdvantage,\n} from './attack.js';\nexport {\n DamageAppliedEventSchema,\n HealedEventSchema,\n TempHPGrantedEventSchema,\n ConditionAppliedEventSchema,\n ConditionRemovedEventSchema,\n ExhaustionChangedEventSchema,\n DeathSaveRolledEventSchema,\n StabilizedEventSchema,\n} from './combat.js';\nexport {\n ResourceSpentEventSchema,\n ResourceRestoredEventSchema,\n HitDieSpentEventSchema,\n} from './resources.js';\nexport {\n ShortRestStartedEventSchema,\n ShortRestEndedEventSchema,\n LongRestStartedEventSchema,\n LongRestEndedEventSchema,\n} from './rest.js';\nexport { CharacterCreatedEventSchema } from './progression.js';\nexport { EventEnvelopeSchema } from './envelope.js';\nexport {\n EncounterCreatedEventSchema,\n EncounterStartedEventSchema,\n InitiativeRolledEventSchema,\n InitiativeRollSchema,\n TurnStartedEventSchema,\n TurnEndedEventSchema,\n RoundEndedEventSchema,\n EncounterEndedEventSchema,\n} from './encounter.js';\nexport {\n AttackRolledEventSchema,\n DamageRolledEventSchema,\n DamageRollSchema,\n AttackAdvantageSchema,\n} from './attack.js';\nexport {\n ItemAcquiredEventSchema,\n ItemEquippedEventSchema,\n ItemUnequippedEventSchema,\n ItemAttunedEventSchema,\n ItemUnattunedEventSchema,\n EquipSlotSchema,\n EQUIP_SLOTS,\n} from './inventory.js';\nexport type {\n ItemAcquiredEvent,\n ItemEquippedEvent,\n ItemUnequippedEvent,\n ItemAttunedEvent,\n ItemUnattunedEvent,\n EquipSlot,\n} from './inventory.js';\nexport {\n LevelUpResolvedEventSchema,\n ChoiceRequiredEventSchema,\n ChoiceResolvedEventSchema,\n HPStrategySchema,\n} from './level-up.js';\nexport type {\n LevelUpResolvedEvent,\n ChoiceRequiredEvent,\n ChoiceResolvedEvent,\n HPStrategy,\n} from './level-up.js';\nexport {\n SaveRolledEventSchema,\n AbilityCheckRolledEventSchema,\n CheckAdvantageSchema,\n} from './checks.js';\nexport type {\n SaveRolledEvent,\n AbilityCheckRolledEvent,\n CheckAdvantage,\n} from './checks.js';\nexport {\n SpellCastDeclaredEventSchema,\n SpellSlotConsumedEventSchema,\n PactSlotConsumedEventSchema,\n SpellSlotSourceSchema,\n} from './spellcasting.js';\nexport type {\n SpellCastDeclaredEvent,\n SpellSlotConsumedEvent,\n PactSlotConsumedEvent,\n SpellSlotSource,\n} from './spellcasting.js';\nexport {\n ConcentrationStartedEventSchema,\n ConcentrationBrokenEventSchema,\n ConcentrationBrokenReasonSchema,\n} from './concentration.js';\nexport type {\n ConcentrationStartedEvent,\n ConcentrationBrokenEvent,\n ConcentrationBrokenReason,\n} from './concentration.js';\nexport { TriggerFiredEventSchema } from './triggers.js';\nexport type { TriggerFiredEvent } from './triggers.js';\nexport {\n ActionEconomyConsumedEventSchema,\n ActionEconomyKindSchema,\n ACTION_ECONOMY_KINDS,\n} from './action-economy.js';\nexport type { ActionEconomyConsumedEvent, ActionEconomyKind } from './action-economy.js';\nexport {\n CombatantMovedEventSchema,\n DashedEventSchema,\n DisengagedEventSchema,\n} from './movement.js';\nexport type {\n CombatantMovedEvent,\n DashedEvent,\n DisengagedEvent,\n} from './movement.js';\nexport {\n PartyCreatedEventSchema,\n PartyMembersChangedEventSchema,\n CurrencyAcquiredEventSchema,\n CurrencySpentEventSchema,\n ItemDepositedToPartyEventSchema,\n ItemWithdrawnFromPartyEventSchema,\n} from './party.js';\nexport type {\n PartyCreatedEvent,\n PartyMembersChangedEvent,\n CurrencyAcquiredEvent,\n CurrencySpentEvent,\n ItemDepositedToPartyEvent,\n ItemWithdrawnFromPartyEvent,\n} from './party.js';\nexport {\n SessionStartedEventSchema,\n SessionEndedEventSchema,\n JournalEntryAddedEventSchema,\n InGameTimeAdvancedEventSchema,\n} from './session.js';\nexport type {\n SessionStartedEvent,\n SessionEndedEvent,\n JournalEntryAddedEvent,\n InGameTimeAdvancedEvent,\n} from './session.js';\nexport {\n LocationCreatedEventSchema,\n DoorAddedEventSchema,\n DoorStateChangedEventSchema,\n CharacterLocationChangedEventSchema,\n} from './locations.js';\nexport type {\n LocationCreatedEvent,\n DoorAddedEvent,\n DoorStateChangedEvent,\n CharacterLocationChangedEvent,\n} from './locations.js';\nexport {\n QuestStartedEventSchema,\n ObjectiveProgressedEventSchema,\n ObjectiveCompletedEventSchema,\n ObjectiveFailedEventSchema,\n QuestCompletedEventSchema,\n QuestFailedEventSchema,\n QuestAbandonedEventSchema,\n QuestRewardClaimedEventSchema,\n XPAwardedEventSchema,\n MilestoneAwardedEventSchema,\n MilestoneKindSchema,\n MILESTONE_KINDS,\n} from './quests.js';\nexport type {\n QuestStartedEvent,\n ObjectiveProgressedEvent,\n ObjectiveCompletedEvent,\n ObjectiveFailedEvent,\n QuestCompletedEvent,\n QuestFailedEvent,\n QuestAbandonedEvent,\n QuestRewardClaimedEvent,\n XPAwardedEvent,\n MilestoneAwardedEvent,\n MilestoneKind,\n} from './quests.js';\nexport {\n SpellCounteredEventSchema,\n SpellDispelledEventSchema,\n ItemIdentifiedEventSchema,\n} from './reactive-spells.js';\nexport type {\n SpellCounteredEvent,\n SpellDispelledEvent,\n ItemIdentifiedEvent,\n} from './reactive-spells.js';\nexport { WeaponMasteryActivatedEventSchema } from './weapon-mastery.js';\nexport type { WeaponMasteryActivatedEvent } from './weapon-mastery.js';\nexport {\n MountedEventSchema,\n DismountedEventSchema,\n VehicleAcquiredEventSchema,\n VehicleBoardedEventSchema,\n VehicleDepartedEventSchema,\n VehicleDamagedEventSchema,\n VehicleRepairedEventSchema,\n} from './mounts-vehicles.js';\nexport type {\n MountedEvent,\n DismountedEvent,\n VehicleAcquiredEvent,\n VehicleBoardedEvent,\n VehicleDepartedEvent,\n VehicleDamagedEvent,\n VehicleRepairedEvent,\n} from './mounts-vehicles.js';\nexport {\n TravelLegCompletedEventSchema,\n NavigationCheckRolledEventSchema,\n ForagedForEventSchema,\n} from './travel.js';\nexport type {\n TravelLegCompletedEvent,\n NavigationCheckRolledEvent,\n ForagedForEvent,\n} from './travel.js';\nexport {\n AttitudeChangedEventSchema,\n MoraleCheckRolledEventSchema,\n MoraleBrokenEventSchema,\n AttitudeSchema,\n ATTITUDES,\n} from './npc.js';\nexport type {\n AttitudeChangedEvent,\n MoraleCheckRolledEvent,\n MoraleBrokenEvent,\n Attitude,\n} from './npc.js';\nexport {\n DowntimeActivityResolvedEventSchema,\n DowntimeKindSchema,\n DowntimeOutcomeSchema,\n DOWNTIME_KINDS,\n DOWNTIME_OUTCOMES,\n} from './downtime.js';\nexport type {\n DowntimeActivityResolvedEvent,\n DowntimeKind,\n DowntimeOutcome,\n} from './downtime.js';\nexport {\n ItemChargeConsumedEventSchema,\n ItemRechargedEventSchema,\n SentientItemConflictEventSchema,\n RechargeCadenceSchema,\n RECHARGE_CADENCES,\n} from './charges.js';\nexport type {\n ItemChargeConsumedEvent,\n ItemRechargedEvent,\n SentientItemConflictEvent,\n RechargeCadence,\n} from './charges.js';\nexport {\n BastionFoundedEventSchema,\n BastionFacilityAddedEventSchema,\n BastionHirelingAddedEventSchema,\n BastionTurnTakenEventSchema,\n BastionDamagedEventSchema,\n BastionLevelChangedEventSchema,\n BastionTurnOrderSchema,\n BASTION_TURN_ORDERS,\n} from './bastion.js';\nexport type {\n BastionFoundedEvent,\n BastionFacilityAddedEvent,\n BastionHirelingAddedEvent,\n BastionTurnTakenEvent,\n BastionDamagedEvent,\n BastionLevelChangedEvent,\n BastionTurnOrder,\n} from './bastion.js';\nexport { CampaignSettingsChangedEventSchema } from './settings.js';\nexport type { CampaignSettingsChangedEvent } from './settings.js';\nexport {\n CharacterResurrectedEventSchema,\n ResurrectionSpellSchema,\n RESURRECTION_SPELLS,\n} from './resurrection.js';\nexport type {\n CharacterResurrectedEvent,\n ResurrectionSpell,\n} from './resurrection.js';\nexport {\n PolymorphAppliedEventSchema,\n PolymorphRevertedEventSchema,\n SimulacrumCreatedEventSchema,\n WishGrantedEventSchema,\n PolymorphFormSchema,\n PolymorphKindSchema,\n POLYMORPH_KINDS,\n} from './transformations.js';\nexport type {\n PolymorphAppliedEvent,\n PolymorphRevertedEvent,\n SimulacrumCreatedEvent,\n WishGrantedEvent,\n PolymorphForm,\n PolymorphKind,\n} from './transformations.js';\n","import { z } from 'zod';\nimport {\n BackgroundSchema,\n ClassSchema,\n ConditionSchema,\n FeatSchema,\n ItemDefinitionSchema,\n MonsterStatblockSchema,\n SpeciesSchema,\n SpellSchema,\n SubclassSchema,\n type Background,\n type Class,\n type Condition,\n type Feat,\n type ItemDefinition,\n type MonsterStatblock,\n type Species,\n type Spell,\n type Subclass,\n} from '../schemas/content/index.js';\n\nexport const ContentPackSchema = z.object({\n id: z.string(),\n name: z.string(),\n version: z.string(),\n species: z.array(SpeciesSchema).default([]),\n backgrounds: z.array(BackgroundSchema).default([]),\n classes: z.array(ClassSchema).default([]),\n subclasses: z.array(SubclassSchema).default([]),\n feats: z.array(FeatSchema).default([]),\n spells: z.array(SpellSchema).default([]),\n items: z.array(ItemDefinitionSchema).default([]),\n monsters: z.array(MonsterStatblockSchema).default([]),\n conditions: z.array(ConditionSchema).default([]),\n});\nexport type ContentPack = z.infer<typeof ContentPackSchema>;\n\nexport interface ResolvedContent {\n species: ReadonlyMap<string, Species>;\n backgrounds: ReadonlyMap<string, Background>;\n classes: ReadonlyMap<string, Class>;\n subclasses: ReadonlyMap<string, Subclass>;\n feats: ReadonlyMap<string, Feat>;\n spells: ReadonlyMap<string, Spell>;\n items: ReadonlyMap<string, ItemDefinition>;\n monsters: ReadonlyMap<string, MonsterStatblock>;\n conditions: ReadonlyMap<string, Condition>;\n}\n\nexport const resolveContent = (packs: ReadonlyArray<ContentPack>): ResolvedContent => {\n const species = new Map<string, Species>();\n const backgrounds = new Map<string, Background>();\n const classes = new Map<string, Class>();\n const subclasses = new Map<string, Subclass>();\n const feats = new Map<string, Feat>();\n const spells = new Map<string, Spell>();\n const items = new Map<string, ItemDefinition>();\n const monsters = new Map<string, MonsterStatblock>();\n const conditions = new Map<string, Condition>();\n\n for (const pack of packs) {\n for (const e of pack.species) species.set(e.id, e);\n for (const e of pack.backgrounds) backgrounds.set(e.id, e);\n for (const e of pack.classes) classes.set(e.id, e);\n for (const e of pack.subclasses) subclasses.set(e.id, e);\n for (const e of pack.feats) feats.set(e.id, e);\n for (const e of pack.spells) spells.set(e.id, e);\n for (const e of pack.items) items.set(e.id, e);\n for (const e of pack.monsters) monsters.set(e.id, e);\n for (const e of pack.conditions) conditions.set(e.id, e);\n }\n\n return { species, backgrounds, classes, subclasses, feats, spells, items, monsters, conditions };\n};\n\nconst formatZodPath = (path: ReadonlyArray<PropertyKey>): string =>\n path.length === 0 ? '<root>' : path.map((p) => String(p)).join('.');\n\nexport class ContentPackLoadError extends Error {\n public readonly issues: ReadonlyArray<{ path: string; message: string }>;\n constructor(issues: ReadonlyArray<{ path: string; message: string }>) {\n const summary = issues.length === 1 ? '1 issue' : `${issues.length} issues`;\n const body = issues.map((i) => ` ${i.path}: ${i.message}`).join('\\n');\n super(`Content pack failed validation (${summary}):\\n${body}`);\n this.name = 'ContentPackLoadError';\n this.issues = issues;\n }\n}\n\nexport const loadContentPack = (input: unknown): ContentPack => {\n const result = ContentPackSchema.safeParse(input);\n if (result.success) return result.data;\n const issues = result.error.issues.map((i) => ({\n path: formatZodPath(i.path),\n message: i.message,\n }));\n throw new ContentPackLoadError(issues);\n};\n","import type { ResolvedContent } from './pack.js';\n\nexport interface ContentValidationIssue {\n readonly path: string;\n readonly message: string;\n readonly suggestion?: string;\n}\n\nconst SUGGESTION_DISTANCE_THRESHOLD = 3;\n\nconst levenshtein = (a: string, b: string): number => {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n const prev: number[] = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n let last = i - 1;\n prev[0] = i;\n for (let j = 1; j <= b.length; j++) {\n const temp = prev[j]!;\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n prev[j] = Math.min(prev[j]! + 1, prev[j - 1]! + 1, last + cost);\n last = temp;\n }\n }\n return prev[b.length]!;\n};\n\nconst suggestSimilar = (target: string, candidates: Iterable<string>): string | undefined => {\n let best: { id: string; distance: number } | undefined;\n for (const candidate of candidates) {\n const distance = levenshtein(target, candidate);\n if (distance <= SUGGESTION_DISTANCE_THRESHOLD && (best === undefined || distance < best.distance)) {\n best = { id: candidate, distance };\n }\n }\n return best?.id;\n};\n\nconst buildIssue = (\n path: string,\n message: string,\n missingId: string,\n candidates: Iterable<string>,\n): ContentValidationIssue => {\n const suggestion = suggestSimilar(missingId, candidates);\n return suggestion !== undefined\n ? { path, message, suggestion: `Did you mean \"${suggestion}\"?` }\n : { path, message };\n};\n\nexport const validateCrossReferences = (\n content: ResolvedContent,\n): ReadonlyArray<ContentValidationIssue> => {\n const issues: ContentValidationIssue[] = [];\n\n for (const [id, background] of content.backgrounds) {\n if (!content.feats.has(background.originFeatId)) {\n issues.push(\n buildIssue(\n `backgrounds.${id}.originFeatId`,\n `Origin feat \"${background.originFeatId}\" not found`,\n background.originFeatId,\n content.feats.keys(),\n ),\n );\n }\n }\n\n for (const [id, subclass] of content.subclasses) {\n if (!content.classes.has(subclass.parentClassId)) {\n issues.push(\n buildIssue(\n `subclasses.${id}.parentClassId`,\n `Parent class \"${subclass.parentClassId}\" not found`,\n subclass.parentClassId,\n content.classes.keys(),\n ),\n );\n }\n }\n\n return issues;\n};\n","import starterPackJson from './starter-pack.json';\nimport { loadContentPack, type ContentPack } from '../pack.js';\n\nexport const STARTER_PACK_RAW: unknown = starterPackJson;\n\nexport const loadStarterPack = (): ContentPack => loadContentPack(starterPackJson);\n","import type { RNG } from './index.js';\n\nexport class DefaultRNG implements RNG {\n next(): number {\n return Math.random();\n }\n}\n\nexport const defaultRNG = (): RNG => new DefaultRNG();\n","import type { RNG } from './index.js';\n\nconst SEED_MASK = 0x6d2b79f5;\nconst SEED_ADD = 0x9e3779b9;\nconst STATE_MOD = 0x100000000;\n\nexport class SeededRNG implements RNG {\n private state: number;\n\n constructor(seed: number) {\n this.state = (seed | 0) >>> 0;\n }\n\n next(): number {\n let t = (this.state = (this.state + SEED_ADD) >>> 0);\n t = Math.imul(t ^ (t >>> 15), 1 | t);\n t ^= t + Math.imul(t ^ (t >>> 7), 61 | t);\n return ((t ^ (t >>> 14)) >>> 0) / STATE_MOD;\n }\n\n fork(salt: number): SeededRNG {\n return new SeededRNG((this.state ^ Math.imul(salt | 0, SEED_MASK)) >>> 0);\n }\n}\n\nexport const seededRNG = (seed: number): SeededRNG => new SeededRNG(seed);\n","import type { RNG } from './index.js';\n\nexport class RNGCalledInPureContextError extends Error {\n constructor(message = 'RNG was called inside a context that must be deterministic (e.g. apply()).') {\n super(message);\n this.name = 'RNGCalledInPureContextError';\n }\n}\n\nexport class ThrowOnCallRNG implements RNG {\n next(): number {\n throw new RNGCalledInPureContextError();\n }\n}\n\nexport const throwOnCallRNG = (): RNG => new ThrowOnCallRNG();\n","import type { RNG } from './index.js';\n\nconst DICE_EXPRESSION_RE = /^(\\d+)d(\\d+)([+-]\\d+)?$/i;\n\nexport interface DieRoll {\n readonly die: number;\n readonly value: number;\n}\n\nexport interface DiceRollResult {\n readonly rolls: ReadonlyArray<DieRoll>;\n readonly modifier: number;\n readonly total: number;\n}\n\nexport interface ParsedDiceExpression {\n readonly count: number;\n readonly die: number;\n readonly modifier: number;\n}\n\nexport const parseDiceExpression = (expression: string): ParsedDiceExpression => {\n const match = DICE_EXPRESSION_RE.exec(expression.trim());\n if (!match) {\n throw new Error(`Invalid dice expression: ${expression}`);\n }\n const countStr = match[1];\n const dieStr = match[2];\n const modStr = match[3];\n if (countStr === undefined || dieStr === undefined) {\n throw new Error(`Invalid dice expression: ${expression}`);\n }\n const count = Number.parseInt(countStr, 10);\n const die = Number.parseInt(dieStr, 10);\n const modifier = modStr === undefined ? 0 : Number.parseInt(modStr, 10);\n if (count <= 0) throw new Error(`Dice count must be > 0: ${expression}`);\n if (die <= 1) throw new Error(`Die size must be > 1: ${expression}`);\n return { count, die, modifier };\n};\n\nexport const rollDie = (die: number, rng: RNG): number => {\n if (die <= 1 || !Number.isInteger(die)) {\n throw new Error(`Invalid die size: ${die}`);\n }\n return Math.floor(rng.next() * die) + 1;\n};\n\nexport const rollDice = (count: number, die: number, rng: RNG): ReadonlyArray<DieRoll> => {\n if (count <= 0 || !Number.isInteger(count)) {\n throw new Error(`Invalid dice count: ${count}`);\n }\n const rolls: DieRoll[] = [];\n for (let i = 0; i < count; i++) {\n rolls.push({ die, value: rollDie(die, rng) });\n }\n return rolls;\n};\n\nexport const rollExpression = (expression: string, rng: RNG): DiceRollResult => {\n const parsed = parseDiceExpression(expression);\n const rolls = rollDice(parsed.count, parsed.die, rng);\n const sumOfRolls = rolls.reduce((acc, r) => acc + r.value, 0);\n return {\n rolls,\n modifier: parsed.modifier,\n total: sumOfRolls + parsed.modifier,\n };\n};\n","import type { CharacterLevel } from '../schemas/primitives.js';\n\nexport const ABILITY_SCORE_MIN = 1;\nexport const ABILITY_SCORE_MAX = 30;\nexport const PROFICIENCY_BONUS_LEVEL_MIN = 1;\nexport const PROFICIENCY_BONUS_LEVEL_MAX = 20;\n\nexport const abilityModifier = (score: number): number => {\n if (!Number.isInteger(score)) {\n throw new Error(`abilityModifier requires an integer; got ${score}`);\n }\n if (score < ABILITY_SCORE_MIN || score > ABILITY_SCORE_MAX) {\n throw new Error(\n `abilityModifier: score ${score} out of range [${ABILITY_SCORE_MIN}, ${ABILITY_SCORE_MAX}]`,\n );\n }\n return Math.floor((score - 10) / 2);\n};\n\nexport const proficiencyBonus = (level: number): number => {\n if (!Number.isInteger(level)) {\n throw new Error(`proficiencyBonus requires an integer level; got ${level}`);\n }\n if (level < PROFICIENCY_BONUS_LEVEL_MIN || level > PROFICIENCY_BONUS_LEVEL_MAX) {\n throw new Error(\n `proficiencyBonus: level ${level} out of range [${PROFICIENCY_BONUS_LEVEL_MIN}, ${PROFICIENCY_BONUS_LEVEL_MAX}]`,\n );\n }\n return Math.floor((level - 1) / 4) + 2;\n};\n\nexport const proficiencyBonusForCharacterLevel = (level: CharacterLevel): number =>\n proficiencyBonus(level);\n","import type { Effect, ModifierTarget, RollTarget } from '../schemas/effects.js';\nimport type { AbilityScore, DamageType, Skill } from '../schemas/primitives.js';\n\nconst modifierKey = (target: ModifierTarget): string => {\n if (typeof target === 'string') return target;\n switch (target.kind) {\n case 'save':\n return `save:${target.ability}`;\n case 'check':\n return `check:${target.ability}`;\n case 'skill':\n return `skill:${target.skill}`;\n }\n};\n\nconst rollKey = (target: RollTarget): string => {\n if (typeof target === 'string') return target;\n switch (target.kind) {\n case 'save':\n return `save:${target.ability}`;\n case 'check':\n return `check:${target.ability}`;\n case 'skill':\n return `skill:${target.skill}`;\n }\n};\n\nexport interface ModifierContribution {\n readonly source: string;\n readonly value: number;\n}\n\nexport interface AdvantageState {\n advantage: boolean;\n disadvantage: boolean;\n autoCrit: boolean;\n autoFail: boolean;\n}\n\nconst emptyAdvantage = (): AdvantageState => ({\n advantage: false,\n disadvantage: false,\n autoCrit: false,\n autoFail: false,\n});\n\nexport interface ACOverride {\n readonly base: number | 'dex' | 'con' | 'wis';\n readonly abilityModifiers: ReadonlyArray<AbilityScore>;\n readonly dexCap: number | undefined;\n readonly priority: number;\n readonly source: string;\n}\n\nexport interface ResourceGrant {\n readonly resourceId: string;\n readonly max: number;\n readonly recharge: string;\n readonly source: string;\n}\n\nexport class EffectAccumulator {\n private readonly modifiers = new Map<string, ModifierContribution[]>();\n private readonly advantages = new Map<string, AdvantageState>();\n private readonly resistances = new Set<DamageType | 'all'>();\n private readonly immunities = new Set<DamageType | 'all'>();\n private readonly vulnerabilities = new Set<DamageType>();\n private readonly conditionImmunities = new Set<string>();\n private readonly acOverrides: ACOverride[] = [];\n private readonly resourceGrants: ResourceGrant[] = [];\n private readonly proficiencies = new Map<string, 'half' | 'proficient' | 'expertise'>();\n private readonly actionEconomyMods = new Map<'extraAttack' | 'extraAction' | 'extraBonusAction', number>();\n private readonly flatDamageReductions = new Map<DamageType, number>();\n\n addModifier(target: ModifierTarget, value: number, source: string): void {\n const key = modifierKey(target);\n let list = this.modifiers.get(key);\n if (list === undefined) {\n list = [];\n this.modifiers.set(key, list);\n }\n list.push({ source, value });\n }\n\n setAdvantage(target: RollTarget, mode: 'advantage' | 'disadvantage' | 'auto-crit' | 'auto-fail'): void {\n const key = rollKey(target);\n let state = this.advantages.get(key);\n if (state === undefined) {\n state = emptyAdvantage();\n this.advantages.set(key, state);\n }\n if (mode === 'advantage') state.advantage = true;\n else if (mode === 'disadvantage') state.disadvantage = true;\n else if (mode === 'auto-crit') state.autoCrit = true;\n else state.autoFail = true;\n }\n\n addResistance(type: DamageType | 'all'): void {\n this.resistances.add(type);\n }\n addImmunity(type: DamageType | 'all'): void {\n this.immunities.add(type);\n }\n addVulnerability(type: DamageType): void {\n this.vulnerabilities.add(type);\n }\n addConditionImmunity(id: string): void {\n this.conditionImmunities.add(id);\n }\n addACOverride(override: ACOverride): void {\n this.acOverrides.push(override);\n }\n addResourceGrant(grant: ResourceGrant): void {\n this.resourceGrants.push(grant);\n }\n addProficiency(\n target: 'skill' | 'tool' | 'weapon' | 'armor' | 'save' | 'language',\n id: string,\n level: 'half' | 'proficient' | 'expertise',\n ): void {\n const key = `${target}:${id}`;\n const existing = this.proficiencies.get(key);\n const rank = { half: 1, proficient: 2, expertise: 3 } as const;\n if (existing === undefined || rank[level] > rank[existing]) {\n this.proficiencies.set(key, level);\n }\n }\n\n modifierSum(target: ModifierTarget): number {\n const list = this.modifiers.get(modifierKey(target));\n if (list === undefined) return 0;\n return list.reduce((acc, c) => acc + c.value, 0);\n }\n\n modifierBreakdown(target: ModifierTarget): ReadonlyArray<ModifierContribution> {\n return this.modifiers.get(modifierKey(target)) ?? [];\n }\n\n advantageFor(target: RollTarget): AdvantageState {\n return this.advantages.get(rollKey(target)) ?? emptyAdvantage();\n }\n\n hasResistance(type: DamageType): boolean {\n return this.resistances.has(type) || this.resistances.has('all');\n }\n hasImmunity(type: DamageType): boolean {\n return this.immunities.has(type) || this.immunities.has('all');\n }\n hasVulnerability(type: DamageType): boolean {\n return this.vulnerabilities.has(type);\n }\n hasConditionImmunity(id: string): boolean {\n return this.conditionImmunities.has(id);\n }\n effectiveACOverride(): ACOverride | undefined {\n if (this.acOverrides.length === 0) return undefined;\n return this.acOverrides.reduce((best, current) =>\n current.priority > best.priority ? current : best,\n );\n }\n resources(): ReadonlyArray<ResourceGrant> {\n return this.resourceGrants;\n }\n proficiencyLevel(target: string, id: string): 'none' | 'half' | 'proficient' | 'expertise' {\n return this.proficiencies.get(`${target}:${id}`) ?? 'none';\n }\n\n addActionEconomy(op: 'extraAttack' | 'extraAction' | 'extraBonusAction', count: number): void {\n const prior = this.actionEconomyMods.get(op) ?? 0;\n this.actionEconomyMods.set(op, prior + count);\n }\n actionEconomyTotal(op: 'extraAttack' | 'extraAction' | 'extraBonusAction'): number {\n return this.actionEconomyMods.get(op) ?? 0;\n }\n addFlatDamageReduction(damageType: DamageType, amount: number): void {\n const prior = this.flatDamageReductions.get(damageType) ?? 0;\n this.flatDamageReductions.set(damageType, Math.max(prior, amount));\n }\n flatDamageReductionFor(damageType: DamageType): number {\n return this.flatDamageReductions.get(damageType) ?? 0;\n }\n}\n\nexport interface BuilderContext {\n readonly source: string;\n}\n\nexport const applyEffectToBuilder = (\n effect: Effect,\n acc: EffectAccumulator,\n ctx: BuilderContext,\n): void => {\n switch (effect.kind) {\n case 'AddModifier': {\n if (typeof effect.value === 'number') {\n acc.addModifier(effect.target, effect.value, ctx.source);\n }\n return;\n }\n case 'SetAdvantage':\n acc.setAdvantage(effect.on, effect.mode);\n return;\n case 'GrantResistance':\n acc.addResistance(effect.damageType);\n return;\n case 'GrantImmunity':\n acc.addImmunity(effect.damageType);\n return;\n case 'GrantVulnerability':\n acc.addVulnerability(effect.damageType);\n return;\n case 'GrantConditionImmunity':\n acc.addConditionImmunity(effect.conditionId);\n return;\n case 'OverrideACFormula':\n acc.addACOverride({\n base: effect.base,\n abilityModifiers: effect.abilityModifiers,\n dexCap: effect.dexCap,\n priority: effect.priority ?? 0,\n source: ctx.source,\n });\n return;\n case 'GrantResource':\n if (typeof effect.max === 'number') {\n acc.addResourceGrant({\n resourceId: effect.resourceId,\n max: effect.max,\n recharge: effect.recharge,\n source: ctx.source,\n });\n }\n return;\n case 'GrantProficiency':\n acc.addProficiency(effect.target, effect.id, effect.level === 'none' ? 'proficient' : effect.level);\n return;\n case 'ModifyActionEconomy':\n acc.addActionEconomy(effect.op, effect.count);\n return;\n case 'FlatDamageReduction':\n for (const damageType of effect.damageTypes) {\n acc.addFlatDamageReduction(damageType, effect.amount);\n }\n return;\n case 'GrantSense':\n case 'ModifySpeed':\n case 'GrantSpellSlots':\n case 'GrantSpell':\n case 'OnEvent':\n case 'RecoverResource':\n case 'GrantAction':\n case 'GrantWeaponMastery':\n case 'ExpandSpellList':\n case 'SetHPMaxFormula':\n case 'OfferChoice':\n case 'Custom':\n return;\n default: {\n const _exhaustive: never = effect;\n void _exhaustive;\n return;\n }\n }\n};\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { PendingChoice } from '../schemas/runtime/pending-choice.js';\nimport type { Effect } from '../schemas/effects.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport { EffectAccumulator, applyEffectToBuilder } from '../effects/builder.js';\n\nconst collectResolvedChoiceEffects = (\n character: Character,\n pendingChoices: Readonly<Record<string, PendingChoice>>,\n): Effect[] => {\n const effects: Effect[] = [];\n for (const choiceId of character.pendingChoiceIds) {\n const choice = pendingChoices[choiceId];\n if (!choice?.resolution) continue;\n for (const optionId of choice.resolution.selectedOptionIds) {\n const option = choice.options.find((o) => o.id === optionId);\n if (option) effects.push(...option.effects);\n }\n }\n return effects;\n};\n\nconst collectClassEffects = (character: Character, content: ResolvedContent): Effect[] => {\n const effects: Effect[] = [];\n for (const enrollment of character.classes) {\n const cls = content.classes.get(enrollment.classId);\n if (!cls) continue;\n for (let level = 1; level <= enrollment.level; level++) {\n const entry = cls.levelTable[String(level)];\n if (!entry) continue;\n for (const feature of entry.features) {\n effects.push(...feature.effects);\n }\n }\n if (enrollment.subclassId !== undefined) {\n const subclass = content.subclasses.get(enrollment.subclassId);\n if (subclass) {\n for (let level = 1; level <= enrollment.level; level++) {\n const features = subclass.levelGrants[String(level)] ?? [];\n for (const feature of features) {\n effects.push(...feature.effects);\n }\n }\n }\n }\n }\n return effects;\n};\n\nconst collectFeatEffects = (character: Character, content: ResolvedContent): Effect[] => {\n const effects: Effect[] = [];\n for (const featId of character.featsTaken) {\n const feat = content.feats.get(featId);\n if (feat) effects.push(...feat.effects);\n }\n return effects;\n};\n\nconst collectItemEffects = (\n character: Character,\n itemInstances: Readonly<Record<string, ItemInstance>>,\n content: ResolvedContent,\n): Effect[] => {\n const effects: Effect[] = [];\n for (const instanceId of character.equipped.attuned) {\n const inst = itemInstances[instanceId];\n if (!inst) continue;\n const def = content.items.get(inst.definitionId);\n if (def && def.itemKind === 'magic') {\n effects.push(...def.effects);\n }\n }\n return effects;\n};\n\nconst collectConditionEffects = (character: Character, content: ResolvedContent): Effect[] => {\n const effects: Effect[] = [];\n for (const applied of character.appliedConditions) {\n const condition = content.conditions.get(applied.conditionId);\n if (condition) effects.push(...condition.effects);\n }\n return effects;\n};\n\nexport interface BuildEffectStackInput {\n readonly character: Character;\n readonly content: ResolvedContent;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly pendingChoices?: Readonly<Record<string, PendingChoice>>;\n}\n\nexport const collectEffectsFromCharacter = (input: BuildEffectStackInput): Effect[] => {\n const { character, content, itemInstances, pendingChoices } = input;\n const effects: Effect[] = [];\n const species = content.species.get(character.speciesId);\n if (species) effects.push(...species.traits);\n const background = content.backgrounds.get(character.backgroundId);\n if (background) effects.push(...background.traits);\n effects.push(...collectClassEffects(character, content));\n effects.push(...collectFeatEffects(character, content));\n effects.push(...collectItemEffects(character, itemInstances, content));\n effects.push(...collectConditionEffects(character, content));\n if (pendingChoices) {\n effects.push(...collectResolvedChoiceEffects(character, pendingChoices));\n }\n return effects;\n};\n\nexport const buildEffectStack = (input: BuildEffectStackInput): EffectAccumulator => {\n const { character, content, itemInstances, pendingChoices } = input;\n const acc = new EffectAccumulator();\n\n const species = content.species.get(character.speciesId);\n if (species) {\n for (const effect of species.traits) {\n applyEffectToBuilder(effect, acc, { source: `species:${species.id}` });\n }\n }\n\n const background = content.backgrounds.get(character.backgroundId);\n if (background) {\n for (const effect of background.traits) {\n applyEffectToBuilder(effect, acc, { source: `background:${background.id}` });\n }\n }\n\n for (const effect of collectClassEffects(character, content)) {\n applyEffectToBuilder(effect, acc, { source: 'class' });\n }\n for (const effect of collectFeatEffects(character, content)) {\n applyEffectToBuilder(effect, acc, { source: 'feat' });\n }\n for (const effect of collectItemEffects(character, itemInstances, content)) {\n applyEffectToBuilder(effect, acc, { source: 'item' });\n }\n for (const effect of collectConditionEffects(character, content)) {\n applyEffectToBuilder(effect, acc, { source: 'condition' });\n }\n if (pendingChoices) {\n for (const effect of collectResolvedChoiceEffects(character, pendingChoices)) {\n applyEffectToBuilder(effect, acc, { source: 'choice' });\n }\n }\n\n return acc;\n};\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport { abilityModifier } from './ability.js';\nimport { buildEffectStack } from './effect-stack.js';\nimport type { EffectAccumulator } from '../effects/builder.js';\n\nconst UNARMORED_BASE = 10;\n\nexport interface ACBreakdownEntry {\n readonly source: string;\n readonly value: number;\n}\n\nexport interface ACResult {\n readonly total: number;\n readonly breakdown: ReadonlyArray<ACBreakdownEntry>;\n}\n\nconst computeArmorAC = (\n character: Character,\n itemInstances: Readonly<Record<string, ItemInstance>>,\n content: ResolvedContent,\n): ACBreakdownEntry[] => {\n const breakdown: ACBreakdownEntry[] = [];\n const armorInstanceId = character.equipped.armor;\n const dexMod = abilityModifier(character.abilityScores.DEX);\n\n if (armorInstanceId !== undefined) {\n const armorInstance = itemInstances[armorInstanceId];\n const armorDef = armorInstance ? content.items.get(armorInstance.definitionId) : undefined;\n if (armorDef && armorDef.itemKind === 'armor' && armorDef.category !== 'shield') {\n breakdown.push({ source: `armor:${armorDef.id}`, value: armorDef.baseAC });\n const dexContribution =\n armorDef.dexCap === undefined\n ? dexMod\n : Math.min(dexMod, armorDef.dexCap);\n if (armorDef.category !== 'heavy') {\n breakdown.push({ source: 'DEX', value: dexContribution });\n }\n } else {\n breakdown.push({ source: 'unarmored-base', value: UNARMORED_BASE });\n breakdown.push({ source: 'DEX', value: dexMod });\n }\n } else {\n breakdown.push({ source: 'unarmored-base', value: UNARMORED_BASE });\n breakdown.push({ source: 'DEX', value: dexMod });\n }\n\n const shieldInstanceId = character.equipped.shield;\n if (shieldInstanceId !== undefined) {\n const shieldInstance = itemInstances[shieldInstanceId];\n const shieldDef = shieldInstance ? content.items.get(shieldInstance.definitionId) : undefined;\n if (shieldDef && shieldDef.itemKind === 'armor' && shieldDef.category === 'shield') {\n breakdown.push({ source: `shield:${shieldDef.id}`, value: shieldDef.baseAC });\n }\n }\n return breakdown;\n};\n\nconst computeUnarmoredOverrideAC = (\n character: Character,\n effects: EffectAccumulator,\n): ACBreakdownEntry[] | null => {\n const override = effects.effectiveACOverride();\n if (!override) return null;\n const breakdown: ACBreakdownEntry[] = [];\n const baseValue =\n typeof override.base === 'number'\n ? override.base\n : override.base === 'dex'\n ? abilityModifier(character.abilityScores.DEX)\n : override.base === 'con'\n ? abilityModifier(character.abilityScores.CON)\n : abilityModifier(character.abilityScores.WIS);\n breakdown.push({ source: `override-base:${override.source}`, value: baseValue });\n\n for (const ability of override.abilityModifiers) {\n const mod = abilityModifier(character.abilityScores[ability]);\n const capped = override.dexCap !== undefined && ability === 'DEX'\n ? Math.min(mod, override.dexCap)\n : mod;\n breakdown.push({ source: `${ability}-mod`, value: capped });\n }\n\n const shieldInstanceId = character.equipped.shield;\n if (shieldInstanceId !== undefined) {\n breakdown.push({ source: 'shield', value: 2 });\n }\n return breakdown;\n};\n\nexport interface ComputeACInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly pendingChoices?: Readonly<Record<string, import('../schemas/runtime/pending-choice.js').PendingChoice>>;\n}\n\nexport const computeAC = (input: ComputeACInput): ACResult => {\n const effects = buildEffectStack(input);\n const armorInstanceId = input.character.equipped.armor;\n\n let breakdown: ACBreakdownEntry[];\n if (armorInstanceId === undefined) {\n const override = computeUnarmoredOverrideAC(input.character, effects);\n breakdown = override ?? computeArmorAC(input.character, input.itemInstances, input.content);\n } else {\n breakdown = computeArmorAC(input.character, input.itemInstances, input.content);\n }\n\n const modifierBonus = effects.modifierSum('ac');\n if (modifierBonus !== 0) {\n breakdown.push({ source: 'modifier', value: modifierBonus });\n }\n\n const total = breakdown.reduce((acc, entry) => acc + entry.value, 0);\n return { total, breakdown };\n};\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport { abilityModifier, proficiencyBonus } from './ability.js';\nimport { buildEffectStack } from './effect-stack.js';\nimport { computeTotalLevel } from '../schemas/runtime/character.js';\nimport type { Weapon } from '../schemas/content/item.js';\n\nexport interface AttackBreakdownEntry {\n readonly source: string;\n readonly value: number;\n}\n\nexport interface AttackResult {\n readonly total: number;\n readonly breakdown: ReadonlyArray<AttackBreakdownEntry>;\n}\n\nexport interface ComputeAttackInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly weaponInstanceId: string;\n readonly pendingChoices?: Readonly<Record<string, import('../schemas/runtime/pending-choice.js').PendingChoice>>;\n}\n\nconst chooseAttackAbility = (character: Character, weapon: Weapon): 'STR' | 'DEX' => {\n const isFinesse = weapon.properties.includes('finesse');\n const isRanged = weapon.attackKind === 'ranged';\n if (isRanged && !weapon.properties.includes('thrown')) return 'DEX';\n if (isFinesse) {\n return abilityModifier(character.abilityScores.DEX) >=\n abilityModifier(character.abilityScores.STR)\n ? 'DEX'\n : 'STR';\n }\n return 'STR';\n};\n\nconst isWeaponProficient = (\n character: Character,\n weapon: Weapon,\n content: ResolvedContent,\n): boolean => {\n for (const enrollment of character.classes) {\n const cls = content.classes.get(enrollment.classId);\n if (!cls) continue;\n if (cls.weaponProficiencies.includes(weapon.id)) return true;\n if (cls.weaponProficiencies.includes(weapon.category)) return true;\n if (cls.weaponProficiencies.includes('all')) return true;\n }\n return false;\n};\n\nexport const computeAttackBonus = (input: ComputeAttackInput): AttackResult => {\n const instance = input.itemInstances[input.weaponInstanceId];\n if (!instance) {\n throw new Error(`Unknown weapon instance: ${input.weaponInstanceId}`);\n }\n const def = input.content.items.get(instance.definitionId);\n if (!def || def.itemKind !== 'weapon') {\n throw new Error(\n `Item instance ${input.weaponInstanceId} is not a weapon (definition ${instance.definitionId})`,\n );\n }\n const weapon = def;\n\n const ability = chooseAttackAbility(input.character, weapon);\n const breakdown: AttackBreakdownEntry[] = [\n { source: `${ability}-mod`, value: abilityModifier(input.character.abilityScores[ability]) },\n ];\n\n if (isWeaponProficient(input.character, weapon, input.content)) {\n breakdown.push({\n source: 'proficiency',\n value: proficiencyBonus(computeTotalLevel(input.character)),\n });\n }\n\n const effects = buildEffectStack(input);\n const modifierBonus = effects.modifierSum('attack');\n if (modifierBonus !== 0) breakdown.push({ source: 'modifier', value: modifierBonus });\n\n const total = breakdown.reduce((acc, e) => acc + e.value, 0);\n return { total, breakdown };\n};\n","// Shared engine-internal constants. Anything used by more than one planner\n// or reducer lives here so values stay consistent across the engine.\n\nexport const D20_SIDES = 20;\nexport const NAT_20 = 20;\nexport const NAT_1 = 1;\nexport const EXHAUSTION_SAVE_PENALTY_PER_LEVEL = -2;\nexport const CANTRIP_LEVEL = 0;\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport type { AbilityScore } from '../schemas/primitives.js';\nimport { abilityModifier, proficiencyBonus } from './ability.js';\nimport { buildEffectStack } from './effect-stack.js';\nimport { computeTotalLevel } from '../schemas/runtime/character.js';\nimport { EXHAUSTION_SAVE_PENALTY_PER_LEVEL } from '../internal/constants.js';\n\nexport interface SaveBreakdownEntry {\n readonly source: string;\n readonly value: number;\n}\n\nexport interface SaveResult {\n readonly total: number;\n readonly breakdown: ReadonlyArray<SaveBreakdownEntry>;\n readonly hasAdvantage: boolean;\n readonly hasDisadvantage: boolean;\n}\n\nexport interface ComputeSaveInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly ability: AbilityScore;\n readonly pendingChoices?: Readonly<Record<string, import('../schemas/runtime/pending-choice.js').PendingChoice>>;\n}\n\nconst isSaveProficient = (character: Character, ability: AbilityScore, content: ResolvedContent): boolean => {\n for (const enrollment of character.classes) {\n const cls = content.classes.get(enrollment.classId);\n if (cls?.savingThrowProficiencies.includes(ability)) return true;\n }\n return false;\n};\n\nexport const computeSavingThrow = (input: ComputeSaveInput): SaveResult => {\n const breakdown: SaveBreakdownEntry[] = [];\n const abilityMod = abilityModifier(input.character.abilityScores[input.ability]);\n breakdown.push({ source: `${input.ability}-mod`, value: abilityMod });\n\n const totalLevel = computeTotalLevel(input.character);\n if (isSaveProficient(input.character, input.ability, input.content)) {\n breakdown.push({ source: 'proficiency', value: proficiencyBonus(totalLevel) });\n }\n\n const effects = buildEffectStack(input);\n const target = { kind: 'save', ability: input.ability } as const;\n const modifierBonus = effects.modifierSum(target);\n if (modifierBonus !== 0) {\n breakdown.push({ source: 'modifier', value: modifierBonus });\n }\n\n if (input.character.exhaustion > 0) {\n const penalty = EXHAUSTION_SAVE_PENALTY_PER_LEVEL * input.character.exhaustion;\n breakdown.push({ source: 'exhaustion', value: penalty });\n }\n\n const adv = effects.advantageFor(target);\n const total = breakdown.reduce((acc, e) => acc + e.value, 0);\n return {\n total,\n breakdown,\n hasAdvantage: adv.advantage && !adv.disadvantage,\n hasDisadvantage: adv.disadvantage && !adv.advantage,\n };\n};\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport { abilityModifier, proficiencyBonus } from './ability.js';\nimport { computeTotalLevel } from '../schemas/runtime/character.js';\nimport { buildEffectStack } from './effect-stack.js';\n\nexport interface SpellDCBreakdownEntry {\n readonly source: string;\n readonly value: number;\n}\n\nexport interface SpellDCResult {\n readonly total: number;\n readonly breakdown: ReadonlyArray<SpellDCBreakdownEntry>;\n}\n\nconst SPELL_DC_BASE = 8;\n\nexport interface ComputeSpellDCInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly classId: string;\n readonly pendingChoices?: Readonly<Record<string, import('../schemas/runtime/pending-choice.js').PendingChoice>>;\n}\n\nconst lookupSpellcastingAbility = (input: ComputeSpellDCInput): 'INT' | 'WIS' | 'CHA' | undefined => {\n const cls = input.content.classes.get(input.classId);\n if (!cls?.spellcasting) return undefined;\n const ability = cls.spellcasting.ability;\n if (ability === 'INT' || ability === 'WIS' || ability === 'CHA') return ability;\n return undefined;\n};\n\nexport const computeSpellSaveDC = (input: ComputeSpellDCInput): SpellDCResult => {\n const ability = lookupSpellcastingAbility(input);\n if (ability === undefined) {\n return { total: 0, breakdown: [] };\n }\n const breakdown: SpellDCBreakdownEntry[] = [\n { source: 'base', value: SPELL_DC_BASE },\n { source: 'proficiency', value: proficiencyBonus(computeTotalLevel(input.character)) },\n { source: `${ability}-mod`, value: abilityModifier(input.character.abilityScores[ability]) },\n ];\n const effects = buildEffectStack(input);\n const bonus = effects.modifierSum('spellSaveDC');\n if (bonus !== 0) breakdown.push({ source: 'modifier', value: bonus });\n const total = breakdown.reduce((acc, e) => acc + e.value, 0);\n return { total, breakdown };\n};\n\nexport const computeSpellAttackBonus = (input: ComputeSpellDCInput): SpellDCResult => {\n const ability = lookupSpellcastingAbility(input);\n if (ability === undefined) {\n return { total: 0, breakdown: [] };\n }\n const breakdown: SpellDCBreakdownEntry[] = [\n { source: 'proficiency', value: proficiencyBonus(computeTotalLevel(input.character)) },\n { source: `${ability}-mod`, value: abilityModifier(input.character.abilityScores[ability]) },\n ];\n const effects = buildEffectStack(input);\n const bonus = effects.modifierSum('spellAttack');\n if (bonus !== 0) breakdown.push({ source: 'modifier', value: bonus });\n const total = breakdown.reduce((acc, e) => acc + e.value, 0);\n return { total, breakdown };\n};\n","import type { Class, SpellcastingProgression } from '../schemas/content/class.js';\nimport type { Character, ClassEnrollment } from '../schemas/runtime/character.js';\nimport type { SpellLevel } from '../schemas/primitives.js';\n\nconst FULL_CASTER_SLOTS: ReadonlyArray<ReadonlyArray<number>> = [\n [2, 0, 0, 0, 0, 0, 0, 0, 0],\n [3, 0, 0, 0, 0, 0, 0, 0, 0],\n [4, 2, 0, 0, 0, 0, 0, 0, 0],\n [4, 3, 0, 0, 0, 0, 0, 0, 0],\n [4, 3, 2, 0, 0, 0, 0, 0, 0],\n [4, 3, 3, 0, 0, 0, 0, 0, 0],\n [4, 3, 3, 1, 0, 0, 0, 0, 0],\n [4, 3, 3, 2, 0, 0, 0, 0, 0],\n [4, 3, 3, 3, 1, 0, 0, 0, 0],\n [4, 3, 3, 3, 2, 0, 0, 0, 0],\n [4, 3, 3, 3, 2, 1, 0, 0, 0],\n [4, 3, 3, 3, 2, 1, 0, 0, 0],\n [4, 3, 3, 3, 2, 1, 1, 0, 0],\n [4, 3, 3, 3, 2, 1, 1, 0, 0],\n [4, 3, 3, 3, 2, 1, 1, 1, 0],\n [4, 3, 3, 3, 2, 1, 1, 1, 0],\n [4, 3, 3, 3, 2, 1, 1, 1, 1],\n [4, 3, 3, 3, 3, 1, 1, 1, 1],\n [4, 3, 3, 3, 3, 2, 1, 1, 1],\n [4, 3, 3, 3, 3, 2, 2, 1, 1],\n];\n\nconst PACT_SLOTS: ReadonlyArray<{ level: number; count: number }> = [\n { level: 1, count: 1 },\n { level: 1, count: 2 },\n { level: 2, count: 2 },\n { level: 2, count: 2 },\n { level: 3, count: 2 },\n { level: 3, count: 2 },\n { level: 4, count: 2 },\n { level: 4, count: 2 },\n { level: 5, count: 2 },\n { level: 5, count: 2 },\n { level: 5, count: 3 },\n { level: 5, count: 3 },\n { level: 5, count: 3 },\n { level: 5, count: 3 },\n { level: 5, count: 3 },\n { level: 5, count: 3 },\n { level: 5, count: 4 },\n { level: 5, count: 4 },\n { level: 5, count: 4 },\n { level: 5, count: 4 },\n];\n\nconst casterLevelContribution = (\n enrollment: ClassEnrollment,\n progression: SpellcastingProgression | undefined,\n): number => {\n if (!progression) return 0;\n switch (progression.type) {\n case 'full':\n return enrollment.level;\n case 'half':\n return enrollment.level >= 2 ? Math.floor(enrollment.level / 2) : 0;\n case 'third':\n return enrollment.level >= 3 ? Math.floor(enrollment.level / 3) : 0;\n case 'pact':\n return 0;\n }\n};\n\nexport interface SpellSlotsResult {\n readonly slotsByLevel: ReadonlyArray<number>;\n readonly pactSlots?: { readonly level: number; readonly count: number };\n}\n\nexport const computeSpellSlots = (\n character: Character,\n classesById: ReadonlyMap<string, Class>,\n): SpellSlotsResult => {\n let multiclassCasterLevel = 0;\n let pactLevel = 0;\n let onlyOneFullOrHalfClass: ClassEnrollment | null = null;\n let multipleSpellcasters = false;\n\n for (const enrollment of character.classes) {\n const cls = classesById.get(enrollment.classId);\n const progression = cls?.spellcasting;\n if (!progression) continue;\n\n if (progression.type === 'pact') {\n pactLevel = Math.max(pactLevel, enrollment.level);\n continue;\n }\n\n multiclassCasterLevel += casterLevelContribution(enrollment, progression);\n if (onlyOneFullOrHalfClass === null) {\n onlyOneFullOrHalfClass = enrollment;\n } else {\n multipleSpellcasters = true;\n }\n }\n\n const slotsByLevel: number[] = new Array<number>(9).fill(0);\n\n if (multiclassCasterLevel > 0) {\n let effectiveLevel = multiclassCasterLevel;\n if (\n !multipleSpellcasters &&\n onlyOneFullOrHalfClass !== null\n ) {\n const cls = classesById.get(onlyOneFullOrHalfClass.classId);\n const progression = cls?.spellcasting;\n if (progression?.type === 'half' && onlyOneFullOrHalfClass.level === 1) {\n effectiveLevel = 0;\n }\n if (progression?.type === 'third' && onlyOneFullOrHalfClass.level < 3) {\n effectiveLevel = 0;\n }\n }\n if (effectiveLevel > 0 && effectiveLevel <= FULL_CASTER_SLOTS.length) {\n const row = FULL_CASTER_SLOTS[effectiveLevel - 1];\n if (row !== undefined) {\n for (let i = 0; i < row.length && i < slotsByLevel.length; i++) {\n slotsByLevel[i] = row[i] ?? 0;\n }\n }\n }\n }\n\n const result: SpellSlotsResult = pactLevel > 0\n ? { slotsByLevel, pactSlots: PACT_SLOTS[pactLevel - 1] ?? { level: 1, count: 0 } }\n : { slotsByLevel };\n return result;\n};\n\nexport const spellSlotsForLevel = (\n result: SpellSlotsResult,\n spellLevel: SpellLevel,\n): number => {\n if (spellLevel === 0) return Number.POSITIVE_INFINITY;\n return result.slotsByLevel[spellLevel - 1] ?? 0;\n};\n\nexport interface AvailableSlots {\n readonly standardByLevel: ReadonlyArray<number>;\n readonly pact: { readonly level: number; readonly count: number } | undefined;\n}\n\nexport const computeAvailableSpellSlots = (\n character: Character,\n classesById: ReadonlyMap<string, Class>,\n): AvailableSlots => {\n const max = computeSpellSlots(character, classesById);\n const standardByLevel = max.slotsByLevel.map((count, idx) => {\n const usedKey = String(idx + 1);\n const used = character.spellSlotsUsed[usedKey] ?? 0;\n return Math.max(0, count - used);\n });\n const pact = max.pactSlots\n ? {\n level: max.pactSlots.level,\n count: Math.max(0, max.pactSlots.count - character.pactSlotsUsed),\n }\n : undefined;\n return { standardByLevel, pact };\n};\n","import type { Character, HP } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { PendingChoice } from '../schemas/runtime/pending-choice.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport type { AbilityScore } from '../schemas/primitives.js';\nimport { abilityModifier, proficiencyBonus } from './ability.js';\nimport { computeTotalLevel } from '../schemas/runtime/character.js';\nimport { computeAC, type ACResult } from './ac.js';\nimport { computeSavingThrow, type SaveResult } from './save.js';\nimport { computeSpellSlots, type SpellSlotsResult } from './spell-slots.js';\n\nconst ABILITIES: ReadonlyArray<AbilityScore> = ['STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA'];\n\nexport interface DerivedCharacter {\n readonly id: string;\n readonly name: string;\n readonly totalLevel: number;\n readonly proficiencyBonus: number;\n readonly abilityModifiers: Readonly<Record<AbilityScore, number>>;\n readonly hp: HP;\n readonly ac: ACResult;\n readonly savingThrows: Readonly<Record<AbilityScore, SaveResult>>;\n readonly spellSlots: SpellSlotsResult;\n readonly hasPendingChoices: boolean;\n readonly pendingChoiceIds: ReadonlyArray<string>;\n}\n\nexport interface ComputeDerivedCharacterInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly pendingChoices?: Readonly<Record<string, PendingChoice>>;\n}\n\nexport const computeDerivedCharacter = (\n input: ComputeDerivedCharacterInput,\n): DerivedCharacter => {\n const totalLevel = computeTotalLevel(input.character);\n const abilityMods = Object.fromEntries(\n ABILITIES.map((a) => [a, abilityModifier(input.character.abilityScores[a])]),\n ) as Record<AbilityScore, number>;\n\n const ac = computeAC(input);\n const savingThrows = Object.fromEntries(\n ABILITIES.map((a) => [a, computeSavingThrow({ ...input, ability: a })]),\n ) as Record<AbilityScore, SaveResult>;\n\n return {\n id: input.character.id,\n name: input.character.name,\n totalLevel,\n proficiencyBonus: proficiencyBonus(totalLevel),\n abilityModifiers: abilityMods,\n hp: input.character.hp,\n ac,\n savingThrows,\n spellSlots: computeSpellSlots(input.character, input.content.classes),\n hasPendingChoices: input.character.pendingChoiceIds.some(\n (id) => input.pendingChoices?.[id]?.resolution === undefined,\n ) || (input.pendingChoices === undefined && input.character.pendingChoiceIds.length > 0),\n pendingChoiceIds: [...input.character.pendingChoiceIds],\n };\n};\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { PendingChoice } from '../schemas/runtime/pending-choice.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport type { AbilityScore, Skill } from '../schemas/primitives.js';\nimport { SKILL_ABILITY, PROFICIENCY_MULTIPLIER } from '../schemas/primitives.js';\nimport { abilityModifier, proficiencyBonus } from './ability.js';\nimport { computeTotalLevel } from '../schemas/runtime/character.js';\nimport { buildEffectStack } from './effect-stack.js';\nimport { EXHAUSTION_SAVE_PENALTY_PER_LEVEL } from '../internal/constants.js';\n\nexport interface AbilityCheckBreakdownEntry {\n readonly source: string;\n readonly value: number;\n}\n\nexport interface AbilityCheckResult {\n readonly total: number;\n readonly breakdown: ReadonlyArray<AbilityCheckBreakdownEntry>;\n readonly hasAdvantage: boolean;\n readonly hasDisadvantage: boolean;\n}\n\nexport interface ComputeAbilityCheckInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly ability: AbilityScore;\n readonly skill?: Skill;\n readonly pendingChoices?: Readonly<Record<string, PendingChoice>>;\n}\n\nconst exhaustionPenalty = (level: number): number =>\n EXHAUSTION_SAVE_PENALTY_PER_LEVEL * level;\n\nexport const computeAbilityCheck = (input: ComputeAbilityCheckInput): AbilityCheckResult => {\n const breakdown: AbilityCheckBreakdownEntry[] = [\n { source: `${input.ability}-mod`, value: abilityModifier(input.character.abilityScores[input.ability]) },\n ];\n\n const effects = buildEffectStack(input);\n\n if (input.skill !== undefined) {\n const expectedAbility = SKILL_ABILITY[input.skill];\n if (expectedAbility === input.ability) {\n const profLevel = effects.proficiencyLevel('skill', input.skill);\n const multiplier = PROFICIENCY_MULTIPLIER[profLevel];\n if (multiplier > 0) {\n const bonus = Math.floor(proficiencyBonus(computeTotalLevel(input.character)) * multiplier);\n breakdown.push({ source: `skill-prof(${profLevel})`, value: bonus });\n }\n }\n }\n\n const skillModifier = input.skill !== undefined\n ? effects.modifierSum({ kind: 'skill', skill: input.skill })\n : 0;\n if (skillModifier !== 0) {\n breakdown.push({ source: 'skill-modifier', value: skillModifier });\n }\n\n const checkModifier = effects.modifierSum({ kind: 'check', ability: input.ability });\n if (checkModifier !== 0) {\n breakdown.push({ source: 'check-modifier', value: checkModifier });\n }\n\n if (input.character.exhaustion > 0) {\n breakdown.push({ source: 'exhaustion', value: exhaustionPenalty(input.character.exhaustion) });\n }\n\n const advantageTarget = input.skill !== undefined\n ? { kind: 'skill' as const, skill: input.skill }\n : { kind: 'check' as const, ability: input.ability };\n const adv = effects.advantageFor(advantageTarget);\n const total = breakdown.reduce((sum, e) => sum + e.value, 0);\n return {\n total,\n breakdown,\n hasAdvantage: adv.advantage && !adv.disadvantage,\n hasDisadvantage: adv.disadvantage && !adv.advantage,\n };\n};\n\nexport const computePassiveScore = (input: ComputeAbilityCheckInput): number => {\n const PASSIVE_BASE = 10;\n const check = computeAbilityCheck(input);\n const advantageBonus = check.hasAdvantage ? 5 : check.hasDisadvantage ? -5 : 0;\n return PASSIVE_BASE + check.total + advantageBonus;\n};\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { PendingChoice } from '../schemas/runtime/pending-choice.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport { buildEffectStack } from './effect-stack.js';\n\nconst BASE_ATTACKS_PER_ACTION = 1;\n\nexport interface ComputeActionEconomyInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly pendingChoices?: Readonly<Record<string, PendingChoice>>;\n}\n\nexport interface ActionEconomyBudget {\n readonly maxAttacksPerAction: number;\n readonly extraActionsPerTurn: number;\n readonly extraBonusActionsPerTurn: number;\n}\n\nexport const computeActionEconomyBudget = (\n input: ComputeActionEconomyInput,\n): ActionEconomyBudget => {\n const effects = buildEffectStack(input);\n return {\n maxAttacksPerAction: BASE_ATTACKS_PER_ACTION + effects.actionEconomyTotal('extraAttack'),\n extraActionsPerTurn: effects.actionEconomyTotal('extraAction'),\n extraBonusActionsPerTurn: effects.actionEconomyTotal('extraBonusAction'),\n };\n};\n","import type {\n Door,\n LocationMap,\n TerrainKind,\n} from '../schemas/runtime/location.js';\nimport {\n DEFAULT_CELL_SIZE_FEET,\n DIFFICULT_MOVEMENT_COST,\n NORMAL_MOVEMENT_COST,\n} from '../schemas/runtime/location.js';\nimport type { Position } from '../schemas/runtime/encounter.js';\n\nexport const terrainAt = (map: LocationMap, x: number, y: number): TerrainKind | undefined => {\n if (x < 0 || x >= map.widthCells) return undefined;\n if (y < 0 || y >= map.heightCells) return undefined;\n return map.terrain[y]?.[x];\n};\n\nexport const movementCostFor = (terrain: TerrainKind): number => {\n switch (terrain) {\n case 'normal':\n return NORMAL_MOVEMENT_COST;\n case 'water':\n case 'difficult':\n return DIFFICULT_MOVEMENT_COST;\n case 'impassable':\n return Number.POSITIVE_INFINITY;\n }\n};\n\nexport const movementCostAt = (map: LocationMap, x: number, y: number): number => {\n const terrain = terrainAt(map, x, y);\n if (terrain === undefined) return Number.POSITIVE_INFINITY;\n return movementCostFor(terrain);\n};\n\nconst chebyshevSteps = (a: Position, b: Position): number =>\n Math.max(Math.abs(a.x - b.x), Math.abs(a.y - b.y));\n\nexport const chebyshevDistanceFeet = (\n a: Position,\n b: Position,\n cellSizeFeet: number = DEFAULT_CELL_SIZE_FEET,\n): number => chebyshevSteps(a, b) * cellSizeFeet;\n\nexport const isInRangeFeet = (\n from: Position,\n to: Position,\n rangeFeet: number,\n cellSizeFeet: number = DEFAULT_CELL_SIZE_FEET,\n): boolean => chebyshevDistanceFeet(from, to, cellSizeFeet) <= rangeFeet;\n\ninterface RayCell {\n readonly x: number;\n readonly y: number;\n}\n\nconst bresenhamCells = (from: Position, to: Position): RayCell[] => {\n const cells: RayCell[] = [];\n let x0 = from.x;\n let y0 = from.y;\n const x1 = to.x;\n const y1 = to.y;\n const dx = Math.abs(x1 - x0);\n const dy = -Math.abs(y1 - y0);\n const sx = x0 < x1 ? 1 : -1;\n const sy = y0 < y1 ? 1 : -1;\n let err = dx + dy;\n while (true) {\n cells.push({ x: x0, y: y0 });\n if (x0 === x1 && y0 === y1) break;\n const e2 = 2 * err;\n if (e2 >= dy) {\n err += dy;\n x0 += sx;\n }\n if (e2 <= dx) {\n err += dx;\n y0 += sy;\n }\n }\n return cells;\n};\n\nconst doorBlocksSight = (door: Door): boolean =>\n door.state === 'closed' || door.state === 'locked';\n\nexport const hasLineOfSight = (\n map: LocationMap,\n doorsAtLocation: ReadonlyArray<Door>,\n from: Position,\n to: Position,\n): boolean => {\n const cells = bresenhamCells(from, to);\n for (let i = 1; i < cells.length - 1; i++) {\n const cell = cells[i]!;\n if (terrainAt(map, cell.x, cell.y) === 'impassable') return false;\n for (const door of doorsAtLocation) {\n if (door.position.x === cell.x && door.position.y === cell.y && doorBlocksSight(door)) {\n return false;\n }\n }\n }\n return true;\n};\n\nexport const hasLineOfEffect = hasLineOfSight;\n","import type { AbilityScore } from '../schemas/primitives.js';\nimport { parseDiceExpression } from '../rng/dice.js';\nimport type { Formula } from '../schemas/formula.js';\n\nexport interface FormulaContext {\n readonly abilityScores: Readonly<Record<AbilityScore, number>>;\n readonly proficiencyBonus: number;\n readonly classLevels: ReadonlyMap<string, number>;\n readonly classColumns?: ReadonlyMap<string, ReadonlyMap<string, number>>;\n readonly totalLevel: number;\n}\n\nexport const abilityModifier = (score: number): number => Math.floor((score - 10) / 2);\n\nconst averageOfDiceExpression = (expression: string): number => {\n const parsed = parseDiceExpression(expression);\n const perDieAverage = (parsed.die + 1) / 2;\n return parsed.count * perDieAverage + parsed.modifier;\n};\n\nexport const evaluateFormula = (formula: Formula, ctx: FormulaContext): number => {\n switch (formula.kind) {\n case 'const':\n return formula.value;\n case 'ability':\n return ctx.abilityScores[formula.ability];\n case 'abilityMod':\n return abilityModifier(ctx.abilityScores[formula.ability]);\n case 'profBonus':\n return ctx.proficiencyBonus;\n case 'level': {\n if (formula.classId === undefined) return ctx.totalLevel;\n return ctx.classLevels.get(formula.classId) ?? 0;\n }\n case 'classCol': {\n const col = ctx.classColumns?.get(formula.classId)?.get(formula.column);\n return col ?? 0;\n }\n case 'dice':\n return averageOfDiceExpression(formula.expression);\n case 'add':\n return formula.terms.reduce((acc, term) => acc + evaluateFormula(term, ctx), 0);\n case 'multiply':\n return formula.terms.reduce((acc, term) => acc * evaluateFormula(term, ctx), 1);\n case 'max': {\n const values = formula.terms.map((t) => evaluateFormula(t, ctx));\n return Math.max(...values);\n }\n case 'min': {\n const values = formula.terms.map((t) => evaluateFormula(t, ctx));\n return Math.min(...values);\n }\n case 'floor':\n return Math.floor(evaluateFormula(formula.term, ctx));\n case 'ceil':\n return Math.ceil(evaluateFormula(formula.term, ctx));\n }\n};\n","import type { Predicate } from '../schemas/predicate.js';\nimport type { ConditionId } from '../ids.js';\nimport type { WeaponProperty, DamageType } from '../schemas/primitives.js';\n\nexport interface PredicateContext {\n readonly self?: boolean;\n readonly weaponProperties?: ReadonlySet<WeaponProperty>;\n readonly activeConditions?: ReadonlySet<ConditionId>;\n readonly damageType?: DamageType;\n readonly facts?: ReadonlyMap<string, unknown>;\n}\n\nconst getPath = (facts: ReadonlyMap<string, unknown> | undefined, path: string): unknown =>\n facts?.get(path);\n\nexport const evaluatePredicate = (predicate: Predicate, ctx: PredicateContext): boolean => {\n switch (predicate.kind) {\n case 'always':\n return true;\n case 'never':\n return false;\n case 'self':\n return ctx.self === true;\n case 'eq':\n return getPath(ctx.facts, predicate.path) === predicate.value;\n case 'hasProperty':\n return ctx.weaponProperties?.has(predicate.property) === true;\n case 'hasCondition':\n return ctx.activeConditions?.has(predicate.conditionId as ConditionId) === true;\n case 'damageType':\n return ctx.damageType === predicate.type;\n case 'not':\n return !evaluatePredicate(predicate.term, ctx);\n case 'all':\n return predicate.terms.every((t) => evaluatePredicate(t, ctx));\n case 'any':\n return predicate.terms.some((t) => evaluatePredicate(t, ctx));\n }\n};\n","import type { Draft } from 'immer';\nimport { enableMapSet, freeze, produce } from 'immer';\n\nenableMapSet();\n\nexport const immerProduce = <T>(state: T, recipe: (draft: Draft<T>) => void): T =>\n produce(state, recipe);\n\nexport const immerFreeze = <T>(value: T): T => freeze(value, true) as T;\n","export class InvariantViolationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvariantViolationError';\n }\n}\n\nexport function invariant(condition: unknown, message: string): asserts condition {\n if (!condition) throw new InvariantViolationError(message);\n}\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { CharacterCreatedEvent } from '../../schemas/events/progression.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyCharacterCreated = (\n state: Draft<CampaignState>,\n event: CharacterCreatedEvent,\n): void => {\n invariant(\n state.characters[event.snapshot.id] === undefined,\n `Character ${event.snapshot.id} already exists`,\n );\n state.characters[event.snapshot.id] = event.snapshot;\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n ConditionAppliedEvent,\n ConditionRemovedEvent,\n DamageAppliedEvent,\n DeathSaveRolledEvent,\n ExhaustionChangedEvent,\n HealedEvent,\n StabilizedEvent,\n TempHPGrantedEvent,\n} from '../../schemas/events/combat.js';\nimport type { Character, DeathSaves } from '../../schemas/runtime/character.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { newAppliedConditionId } from '../../ids.js';\nimport { EXHAUSTION_MAX } from '../../schemas/primitives.js';\n\nconst DEATH_SAVE_SUCCESSES_TO_STABILIZE = 3;\nconst DEATH_SAVE_FAILURES_TO_DIE = 3;\nconst DEATH_SAVE_NAT_20 = 20;\nconst DEATH_SAVE_NAT_1 = 1;\nconst DEATH_SAVE_SUCCESS_THRESHOLD = 10;\nconst DEATH_SAVE_NAT_1_FAILURE_COUNT = 2;\nconst NAT_20_REVIVE_HP = 1;\nconst EXHAUSTION_DEFAULT_LEVEL = 1;\n\nconst requireCharacter = (state: Draft<CampaignState>, id: string): Draft<Character> => {\n const c = state.characters[id];\n invariant(c !== undefined, `Character ${id} not found`);\n return c;\n};\n\nconst isMassiveDamage = (\n hpBeforeDamage: number,\n hpAfterDamage: number,\n hpMax: number,\n): boolean => hpBeforeDamage > 0 && hpAfterDamage < 0 && Math.abs(hpAfterDamage) >= hpMax;\n\nconst resetDeathSaves = (saves: Draft<DeathSaves>): void => {\n saves.successes = 0;\n saves.failures = 0;\n saves.stable = false;\n};\n\nconst absorbTempHP = (character: Draft<Character>, rawDamage: number): number => {\n if (character.hp.temp <= 0) return rawDamage;\n const absorbed = Math.min(character.hp.temp, rawDamage);\n character.hp.temp -= absorbed;\n return rawDamage - absorbed;\n};\n\nconst totalDamageOf = (event: DamageAppliedEvent): number =>\n event.components.reduce((sum, c) => sum + c.amount, 0);\n\nconst incrementFailures = (saves: Draft<DeathSaves>, by: number): void => {\n saves.failures = Math.min(saves.failures + by, DEATH_SAVE_FAILURES_TO_DIE);\n};\n\nexport const applyDamageApplied = (\n state: Draft<CampaignState>,\n event: DamageAppliedEvent,\n): void => {\n const character = requireCharacter(state, event.targetId);\n const remainingAfterTemp = absorbTempHP(character, totalDamageOf(event));\n const startedConscious = character.hp.current > 0;\n const hpBeforeClamp = character.hp.current - remainingAfterTemp;\n character.hp.current = Math.max(hpBeforeClamp, -character.hp.max);\n\n const tookDamageWhileDown = !startedConscious && remainingAfterTemp > 0;\n if (tookDamageWhileDown) {\n incrementFailures(character.deathSaves, 1);\n character.deathSaves.stable = false;\n return;\n }\n if (isMassiveDamage(character.hp.current + remainingAfterTemp, hpBeforeClamp, character.hp.max)) {\n character.hp.current = -character.hp.max;\n character.deathSaves.failures = DEATH_SAVE_FAILURES_TO_DIE;\n character.deathSaves.stable = false;\n return;\n }\n const newlyDowned = startedConscious && character.hp.current <= 0;\n if (newlyDowned) {\n resetDeathSaves(character.deathSaves);\n }\n};\n\nexport const applyHealed = (state: Draft<CampaignState>, event: HealedEvent): void => {\n const character = requireCharacter(state, event.targetId);\n if (event.amount <= 0) return;\n const wasUnconscious = character.hp.current <= 0;\n if (character.hp.current < 0) character.hp.current = 0;\n if (wasUnconscious) resetDeathSaves(character.deathSaves);\n character.hp.current = Math.min(character.hp.current + event.amount, character.hp.max);\n};\n\nexport const applyTempHPGranted = (\n state: Draft<CampaignState>,\n event: TempHPGrantedEvent,\n): void => {\n const character = requireCharacter(state, event.targetId);\n if (event.amount > character.hp.temp) {\n character.hp.temp = event.amount;\n }\n};\n\nexport const applyConditionApplied = (\n state: Draft<CampaignState>,\n event: ConditionAppliedEvent,\n): void => {\n const character = requireCharacter(state, event.targetId);\n if (event.conditionId === 'exhaustion') {\n const level = event.level ?? EXHAUSTION_DEFAULT_LEVEL;\n character.exhaustion = Math.min(EXHAUSTION_MAX, character.exhaustion + level);\n return;\n }\n const existing = character.appliedConditions.find(\n (c) => c.conditionId === event.conditionId,\n );\n if (existing) return;\n // Use the triggering event id as the applied-condition id when none was supplied.\n // This keeps replay deterministic even when the consumer omits an explicit id.\n character.appliedConditions.push({\n id: event.appliedConditionId ?? event.id,\n conditionId: event.conditionId,\n sourceEventId: event.id,\n ...(event.level !== undefined ? { level: event.level } : {}),\n ...(event.expiresOnRound !== undefined ? { expiresOnRound: event.expiresOnRound } : {}),\n });\n};\n\nexport const applyConditionRemoved = (\n state: Draft<CampaignState>,\n event: ConditionRemovedEvent,\n): void => {\n const character = requireCharacter(state, event.targetId);\n character.appliedConditions = character.appliedConditions.filter(\n (c) => c.conditionId !== event.conditionId,\n );\n};\n\nexport const applyExhaustionChanged = (\n state: Draft<CampaignState>,\n event: ExhaustionChangedEvent,\n): void => {\n const character = requireCharacter(state, event.targetId);\n invariant(\n character.exhaustion === event.fromLevel,\n `Exhaustion mismatch on ${event.targetId}: expected ${event.fromLevel}, was ${character.exhaustion}`,\n );\n character.exhaustion = event.toLevel;\n};\n\nexport const applyDeathSaveRolled = (\n state: Draft<CampaignState>,\n event: DeathSaveRolledEvent,\n): void => {\n const character = requireCharacter(state, event.targetId);\n invariant(\n character.hp.current === 0,\n `Death saves only apply at 0 HP (character ${event.targetId} has ${character.hp.current})`,\n );\n\n if (event.d20 === DEATH_SAVE_NAT_20) {\n character.hp.current = NAT_20_REVIVE_HP;\n resetDeathSaves(character.deathSaves);\n return;\n }\n if (event.d20 === DEATH_SAVE_NAT_1) {\n incrementFailures(character.deathSaves, DEATH_SAVE_NAT_1_FAILURE_COUNT);\n return;\n }\n const success = event.d20 >= DEATH_SAVE_SUCCESS_THRESHOLD;\n if (success) {\n character.deathSaves.successes = Math.min(\n character.deathSaves.successes + 1,\n DEATH_SAVE_SUCCESSES_TO_STABILIZE,\n );\n if (character.deathSaves.successes >= DEATH_SAVE_SUCCESSES_TO_STABILIZE) {\n character.deathSaves.stable = true;\n }\n return;\n }\n incrementFailures(character.deathSaves, 1);\n};\n\nexport const applyStabilized = (\n state: Draft<CampaignState>,\n event: StabilizedEvent,\n): void => {\n const character = requireCharacter(state, event.targetId);\n resetDeathSaves(character.deathSaves);\n character.deathSaves.stable = true;\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ActionEconomyConsumedEvent } from '../../schemas/events/action-economy.js';\nimport type { ResourceSpentEvent } from '../../schemas/events/resources.js';\nimport { invariant } from '../../internal/invariants.js';\n\nconst ACTION_SURGE_RESOURCE_ID = 'action-surge';\n\nexport const resetActionForActionSurgeIfApplicable = (\n state: Draft<CampaignState>,\n event: ResourceSpentEvent,\n): void => {\n if (event.resourceId !== ACTION_SURGE_RESOURCE_ID) return;\n const encounterId = state.activeEncounterId;\n if (encounterId === undefined) return;\n const encounter = state.encounters[encounterId];\n if (!encounter) return;\n const combatant = encounter.combatants.find((c) => c.combatantId === event.characterId);\n if (!combatant) return;\n combatant.turnUsage.actionUsed = false;\n combatant.turnUsage.attacksMadeThisTurn = 0;\n};\n\nexport const applyActionEconomyConsumed = (\n state: Draft<CampaignState>,\n event: ActionEconomyConsumedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n const combatant = encounter.combatants.find((c) => c.combatantId === event.combatantId);\n invariant(combatant !== undefined, `Combatant ${event.combatantId} not in encounter`);\n\n switch (event.kind) {\n case 'action':\n invariant(!combatant.turnUsage.actionUsed, 'Action already used this turn');\n combatant.turnUsage.actionUsed = true;\n break;\n case 'bonusAction':\n invariant(\n !combatant.turnUsage.bonusActionUsed,\n 'Bonus action already used this turn',\n );\n combatant.turnUsage.bonusActionUsed = true;\n break;\n case 'reaction':\n invariant(\n !combatant.turnUsage.reactionUsedThisRound,\n 'Reaction already used this round',\n );\n combatant.turnUsage.reactionUsedThisRound = true;\n break;\n case 'attack':\n combatant.turnUsage.attacksMadeThisTurn += 1;\n break;\n }\n};\n\nexport const resetActionForActionSurge = (\n combatant: { turnUsage: { actionUsed: boolean } },\n): void => {\n combatant.turnUsage.actionUsed = false;\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { Character } from '../../schemas/runtime/character.js';\nimport type {\n HitDieSpentEvent,\n ResourceRestoredEvent,\n ResourceSpentEvent,\n} from '../../schemas/events/resources.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { resetActionForActionSurgeIfApplicable } from './action-economy.js';\n\nconst requireCharacter = (state: Draft<CampaignState>, id: string): Draft<Character> => {\n const c = state.characters[id];\n invariant(c !== undefined, `Character ${id} not found`);\n return c;\n};\n\nexport const applyResourceSpent = (\n state: Draft<CampaignState>,\n event: ResourceSpentEvent,\n): void => {\n const character = requireCharacter(state, event.characterId);\n const resource = character.resources.find((r) => r.resourceId === event.resourceId);\n invariant(resource !== undefined, `Resource ${event.resourceId} not on character`);\n invariant(\n resource.current >= event.amount,\n `Resource ${event.resourceId} insufficient: have ${resource.current}, spend ${event.amount}`,\n );\n resource.current -= event.amount;\n resetActionForActionSurgeIfApplicable(state, event);\n};\n\nexport const applyResourceRestored = (\n state: Draft<CampaignState>,\n event: ResourceRestoredEvent,\n): void => {\n const character = requireCharacter(state, event.characterId);\n const resource = character.resources.find((r) => r.resourceId === event.resourceId);\n invariant(resource !== undefined, `Resource ${event.resourceId} not on character`);\n const restored = event.amount === 'all' ? resource.max : event.amount;\n resource.current = Math.min(resource.current + restored, resource.max);\n};\n\nexport const applyHitDieSpent = (\n state: Draft<CampaignState>,\n event: HitDieSpentEvent,\n): void => {\n const character = requireCharacter(state, event.characterId);\n const enrollment = character.classes.find((c) => c.hitDiceRemaining > 0);\n invariant(enrollment !== undefined, `No hit dice remaining for ${event.characterId}`);\n enrollment.hitDiceRemaining -= 1;\n if (character.hp.current > 0) {\n character.hp.current = Math.min(character.hp.current + event.healed, character.hp.max);\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { Character } from '../../schemas/runtime/character.js';\nimport type { TriggerFiredEvent } from '../../schemas/events/triggers.js';\nimport { invariant } from '../../internal/invariants.js';\n\ntype CadenceField =\n | 'firedThisTurn'\n | 'firedThisRound'\n | 'firedThisShortRest'\n | 'firedThisLongRest';\n\nconst ALL_CADENCE_FIELDS: ReadonlyArray<CadenceField> = [\n 'firedThisTurn',\n 'firedThisRound',\n 'firedThisShortRest',\n 'firedThisLongRest',\n];\n\nconst requireCharacter = (state: Draft<CampaignState>, id: string): Draft<Character> => {\n const c = state.characters[id];\n invariant(c !== undefined, `Character ${id} not found`);\n return c;\n};\n\nexport const applyTriggerFired = (\n state: Draft<CampaignState>,\n event: TriggerFiredEvent,\n): void => {\n const character = requireCharacter(state, event.characterId);\n const prior = character.triggerCounters[event.triggerId] ?? {};\n const merged: Character['triggerCounters'][string] = { ...prior };\n for (const field of ALL_CADENCE_FIELDS) {\n const incoming = event.cadence[field];\n if (incoming !== undefined) merged[field] = incoming;\n }\n character.triggerCounters[event.triggerId] = merged;\n};\n\nconst clearCadenceFields = (\n character: Draft<Character>,\n fields: ReadonlyArray<CadenceField>,\n): void => {\n for (const triggerId of Object.keys(character.triggerCounters)) {\n const counter = character.triggerCounters[triggerId];\n if (counter === undefined) continue;\n for (const field of fields) {\n counter[field] = false;\n }\n }\n};\n\nconst clearForParticipants = (\n state: Draft<CampaignState>,\n characterIds: ReadonlyArray<string>,\n fields: ReadonlyArray<CadenceField>,\n): void => {\n for (const id of characterIds) {\n const character = state.characters[id];\n if (character !== undefined) clearCadenceFields(character, fields);\n }\n};\n\nexport const clearTurnCountersForCharacter = (\n state: Draft<CampaignState>,\n characterId: string,\n): void => {\n const character = state.characters[characterId];\n if (!character) return;\n clearCadenceFields(character, ['firedThisTurn']);\n};\n\nexport const clearRoundCountersForCharacters = (\n state: Draft<CampaignState>,\n characterIds: ReadonlyArray<string>,\n): void => clearForParticipants(state, characterIds, ['firedThisRound']);\n\nexport const clearShortRestCountersForCharacters = (\n state: Draft<CampaignState>,\n characterIds: ReadonlyArray<string>,\n): void => clearForParticipants(state, characterIds, ['firedThisShortRest']);\n\nexport const clearLongRestCountersForCharacters = (\n state: Draft<CampaignState>,\n characterIds: ReadonlyArray<string>,\n): void => clearForParticipants(state, characterIds, ALL_CADENCE_FIELDS);\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n LongRestEndedEvent,\n LongRestStartedEvent,\n ShortRestEndedEvent,\n ShortRestStartedEvent,\n} from '../../schemas/events/rest.js';\nimport { invariant } from '../../internal/invariants.js';\nimport {\n clearLongRestCountersForCharacters,\n clearShortRestCountersForCharacters,\n} from './triggers.js';\n\nexport const applyShortRestStarted = (\n state: Draft<CampaignState>,\n event: ShortRestStartedEvent,\n): void => {\n invariant(state.activeShortRest === undefined, 'A short rest is already in progress');\n invariant(state.activeLongRest === undefined, 'Cannot short rest during a long rest');\n state.activeShortRest = {\n startedAtEventId: event.id,\n participantIds: [...event.participantIds],\n };\n};\n\nexport const applyShortRestEnded = (\n state: Draft<CampaignState>,\n _event: ShortRestEndedEvent,\n): void => {\n const session = state.activeShortRest;\n invariant(session !== undefined, 'No active short rest to end');\n state.activeShortRest = undefined;\n for (const id of session.participantIds) {\n const character = state.characters[id];\n if (!character) continue;\n character.pactSlotsUsed = 0;\n }\n clearShortRestCountersForCharacters(state, session.participantIds);\n};\n\nconst halfRoundedDown = (n: number): number => Math.floor(n / 2);\nconst oneMin = (n: number): number => Math.max(1, n);\n\nexport const applyLongRestStarted = (\n state: Draft<CampaignState>,\n event: LongRestStartedEvent,\n): void => {\n invariant(state.activeShortRest === undefined, 'Cannot long rest during a short rest');\n invariant(state.activeLongRest === undefined, 'A long rest is already in progress');\n state.activeLongRest = {\n startedAtEventId: event.id,\n participantIds: [...event.participantIds],\n };\n};\n\nexport const applyLongRestEnded = (\n state: Draft<CampaignState>,\n _event: LongRestEndedEvent,\n): void => {\n const session = state.activeLongRest;\n invariant(session !== undefined, 'No active long rest to end');\n state.activeLongRest = undefined;\n for (const id of session.participantIds) {\n const character = state.characters[id];\n if (!character) continue;\n character.hp.current = character.hp.max;\n character.hp.temp = 0;\n character.deathSaves.successes = 0;\n character.deathSaves.failures = 0;\n character.deathSaves.stable = false;\n if (character.exhaustion > 0) {\n character.exhaustion = character.exhaustion - 1;\n }\n let totalHitDice = 0;\n for (const enrollment of character.classes) {\n totalHitDice += enrollment.level;\n }\n const recoveryBudget = oneMin(halfRoundedDown(totalHitDice));\n let remaining = recoveryBudget;\n for (const enrollment of character.classes) {\n if (remaining <= 0) break;\n const possible = enrollment.level - enrollment.hitDiceRemaining;\n const take = Math.min(remaining, possible);\n enrollment.hitDiceRemaining += take;\n remaining -= take;\n }\n for (const resource of character.resources) {\n resource.current = resource.max;\n }\n character.spellSlotsUsed = {};\n character.pactSlotsUsed = 0;\n }\n clearLongRestCountersForCharacters(state, session.participantIds);\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n EncounterCreatedEvent,\n EncounterEndedEvent,\n EncounterStartedEvent,\n InitiativeRolledEvent,\n RoundEndedEvent,\n TurnEndedEvent,\n TurnStartedEvent,\n} from '../../schemas/events/encounter.js';\nimport { invariant } from '../../internal/invariants.js';\nimport {\n clearRoundCountersForCharacters,\n clearTurnCountersForCharacter,\n} from './triggers.js';\n\nexport const applyEncounterCreated = (\n state: Draft<CampaignState>,\n event: EncounterCreatedEvent,\n): void => {\n invariant(\n state.encounters[event.encounterId] === undefined,\n `Encounter ${event.encounterId} already exists`,\n );\n state.encounters[event.encounterId] = {\n id: event.encounterId,\n ...(event.name !== undefined ? { name: event.name } : {}),\n status: 'planning',\n combatants: event.combatantIds.map((id) => ({\n combatantId: id,\n initiative: 0,\n initiativeOrder: 0,\n hasActedThisRound: false,\n turnUsage: {\n actionUsed: false,\n bonusActionUsed: false,\n attacksMadeThisTurn: 0,\n reactionUsedThisRound: false,\n feetMovedThisTurn: 0,\n dashed: false,\n disengaged: false,\n },\n })),\n round: 0,\n activeIndex: 0,\n };\n};\n\nexport const applyInitiativeRolled = (\n state: Draft<CampaignState>,\n event: InitiativeRolledEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n invariant(encounter.status === 'planning', 'Initiative can only be rolled while planning');\n const totalsById = new Map(event.rolls.map((r) => [r.combatantId, r.total]));\n const sortedRolls = [...event.rolls].sort((a, b) => b.total - a.total);\n const orderById = new Map(sortedRolls.map((r, i) => [r.combatantId, i]));\n\n for (const combatant of encounter.combatants) {\n const total = totalsById.get(combatant.combatantId);\n invariant(total !== undefined, `Combatant ${combatant.combatantId} missing initiative roll`);\n combatant.initiative = total;\n combatant.initiativeOrder = orderById.get(combatant.combatantId) ?? 0;\n }\n encounter.combatants.sort((a, b) => a.initiativeOrder - b.initiativeOrder);\n};\n\nexport const applyEncounterStarted = (\n state: Draft<CampaignState>,\n event: EncounterStartedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n invariant(encounter.status === 'planning', 'Encounter already started');\n invariant(encounter.combatants.length > 0, 'No combatants in encounter');\n invariant(\n encounter.combatants.every((c) => c.initiative !== 0 || c.initiativeOrder >= 0),\n 'Initiative must be rolled before starting encounter',\n );\n encounter.status = 'active';\n encounter.round = 1;\n encounter.activeIndex = 0;\n encounter.startedAtEventId = event.id;\n state.activeEncounterId = event.encounterId;\n};\n\nexport const applyTurnStarted = (\n state: Draft<CampaignState>,\n event: TurnStartedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n invariant(encounter.status === 'active', 'Encounter not active');\n const active = encounter.combatants[encounter.activeIndex];\n invariant(\n active !== undefined && active.combatantId === event.combatantId,\n `Turn-start mismatch: expected ${active?.combatantId}, got ${event.combatantId}`,\n );\n invariant(encounter.round === event.round, `Round mismatch`);\n clearTurnCountersForCharacter(state, event.combatantId);\n active.turnUsage.actionUsed = false;\n active.turnUsage.bonusActionUsed = false;\n active.turnUsage.attacksMadeThisTurn = 0;\n};\n\nexport const applyTurnEnded = (\n state: Draft<CampaignState>,\n event: TurnEndedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n invariant(encounter.status === 'active', 'Encounter not active');\n const active = encounter.combatants[encounter.activeIndex];\n invariant(\n active !== undefined && active.combatantId === event.combatantId,\n `Turn-end mismatch`,\n );\n active.hasActedThisRound = true;\n encounter.activeIndex += 1;\n};\n\nexport const applyRoundEnded = (\n state: Draft<CampaignState>,\n event: RoundEndedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n invariant(encounter.status === 'active', 'Encounter not active');\n invariant(\n encounter.activeIndex >= encounter.combatants.length,\n 'Not all combatants have acted',\n );\n for (const combatant of encounter.combatants) {\n combatant.hasActedThisRound = false;\n combatant.turnUsage.reactionUsedThisRound = false;\n }\n encounter.round += 1;\n encounter.activeIndex = 0;\n clearRoundCountersForCharacters(\n state,\n encounter.combatants.map((c) => c.combatantId),\n );\n};\n\nexport const applyEncounterEnded = (\n state: Draft<CampaignState>,\n event: EncounterEndedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n invariant(encounter.status === 'active', 'Encounter already ended or not started');\n encounter.status = 'ended';\n encounter.outcome = event.outcome;\n encounter.endedAtEventId = event.id;\n if (state.activeEncounterId === event.encounterId) {\n state.activeEncounterId = undefined;\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n ItemAcquiredEvent,\n ItemAttunedEvent,\n ItemEquippedEvent,\n ItemUnattunedEvent,\n ItemUnequippedEvent,\n} from '../../schemas/events/inventory.js';\nimport { invariant } from '../../internal/invariants.js';\n\nconst MAX_ATTUNED_ITEMS = 3;\n\nexport const applyItemAcquired = (\n state: Draft<CampaignState>,\n event: ItemAcquiredEvent,\n): void => {\n invariant(\n state.itemInstances[event.instance.id] === undefined,\n `Item instance ${event.instance.id} already exists`,\n );\n state.itemInstances[event.instance.id] = event.instance;\n};\n\nexport const applyItemEquipped = (\n state: Draft<CampaignState>,\n event: ItemEquippedEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n const instance = state.itemInstances[event.instanceId];\n invariant(instance !== undefined, `Item instance ${event.instanceId} not found`);\n character.equipped[event.slot] = event.instanceId;\n instance.equippedBy = event.characterId;\n};\n\nexport const applyItemUnequipped = (\n state: Draft<CampaignState>,\n event: ItemUnequippedEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n const priorInstanceId = character.equipped[event.slot];\n if (priorInstanceId !== undefined) {\n const instance = state.itemInstances[priorInstanceId];\n if (instance !== undefined) instance.equippedBy = undefined;\n }\n character.equipped[event.slot] = undefined;\n};\n\nexport const applyItemAttuned = (\n state: Draft<CampaignState>,\n event: ItemAttunedEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n const instance = state.itemInstances[event.instanceId];\n invariant(instance !== undefined, `Item instance ${event.instanceId} not found`);\n invariant(!instance.attuned, `Item ${event.instanceId} already attuned`);\n invariant(\n character.equipped.attuned.length < MAX_ATTUNED_ITEMS,\n `Character already has the maximum of ${MAX_ATTUNED_ITEMS} attuned items`,\n );\n instance.attuned = true;\n instance.attunedTo = event.characterId;\n character.equipped.attuned.push(event.instanceId);\n};\n\nexport const applyItemUnattuned = (\n state: Draft<CampaignState>,\n event: ItemUnattunedEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n const instance = state.itemInstances[event.instanceId];\n invariant(instance !== undefined, `Item instance ${event.instanceId} not found`);\n invariant(instance.attuned, `Item ${event.instanceId} not attuned`);\n instance.attuned = false;\n instance.attunedTo = undefined;\n character.equipped.attuned = character.equipped.attuned.filter(\n (id) => id !== event.instanceId,\n );\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n ChoiceRequiredEvent,\n ChoiceResolvedEvent,\n LevelUpResolvedEvent,\n} from '../../schemas/events/level-up.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyLevelUpResolved = (\n state: Draft<CampaignState>,\n event: LevelUpResolvedEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n const enrollment = character.classes.find((c) => c.classId === event.classId);\n invariant(\n enrollment !== undefined,\n `Character ${event.characterId} has no enrollment in class ${event.classId}`,\n );\n invariant(\n enrollment.level + 1 === event.newClassLevel,\n `Level-up must advance by 1: current ${enrollment.level}, requested ${event.newClassLevel}`,\n );\n enrollment.level = event.newClassLevel;\n enrollment.hitDiceRemaining += 1;\n character.hp.max += event.hpGained;\n character.hp.current += event.hpGained;\n};\n\nexport const applyChoiceRequired = (\n state: Draft<CampaignState>,\n event: ChoiceRequiredEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n invariant(\n state.pendingChoices[event.choiceId] === undefined,\n `Choice ${event.choiceId} already exists`,\n );\n state.pendingChoices[event.choiceId] = {\n id: event.choiceId,\n prompt: event.prompt,\n options: [...event.options],\n oneOf: event.oneOf,\n forCharacterId: event.characterId,\n triggerEventId: event.id,\n };\n character.pendingChoiceIds.push(event.choiceId);\n};\n\nexport const applyChoiceResolved = (\n state: Draft<CampaignState>,\n event: ChoiceResolvedEvent,\n): void => {\n const choice = state.pendingChoices[event.choiceId];\n invariant(choice !== undefined, `Choice ${event.choiceId} not found`);\n invariant(choice.resolution === undefined, `Choice ${event.choiceId} already resolved`);\n invariant(\n choice.forCharacterId === event.characterId,\n `Choice ${event.choiceId} belongs to a different character`,\n );\n invariant(\n event.selectedOptionIds.length === choice.oneOf,\n `Expected exactly ${choice.oneOf} selection(s), got ${event.selectedOptionIds.length}`,\n );\n for (const id of event.selectedOptionIds) {\n invariant(\n choice.options.some((o) => o.id === id),\n `Option ${id} not in choice ${event.choiceId}`,\n );\n }\n choice.resolution = {\n selectedOptionIds: [...event.selectedOptionIds],\n atEventId: event.id,\n };\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { Character } from '../../schemas/runtime/character.js';\nimport type {\n PactSlotConsumedEvent,\n SpellCastDeclaredEvent,\n SpellSlotConsumedEvent,\n} from '../../schemas/events/spellcasting.js';\nimport { invariant } from '../../internal/invariants.js';\n\nconst requireCharacter = (state: Draft<CampaignState>, id: string): Draft<Character> => {\n const c = state.characters[id];\n invariant(c !== undefined, `Character ${id} not found`);\n return c;\n};\n\nexport const applySpellCastDeclared = (\n _state: Draft<CampaignState>,\n _event: SpellCastDeclaredEvent,\n): void => {\n // Intent event: declares what the caster is doing. Mechanical effects\n // (slot consumption, damage, etc.) come via subsequent events.\n};\n\nexport const applySpellSlotConsumed = (\n state: Draft<CampaignState>,\n event: SpellSlotConsumedEvent,\n): void => {\n const character = requireCharacter(state, event.characterId);\n const key = String(event.slotLevel);\n const previous = character.spellSlotsUsed[key] ?? 0;\n character.spellSlotsUsed[key] = previous + 1;\n};\n\nexport const applyPactSlotConsumed = (\n state: Draft<CampaignState>,\n event: PactSlotConsumedEvent,\n): void => {\n const character = requireCharacter(state, event.characterId);\n character.pactSlotsUsed += 1;\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n ConcentrationBrokenEvent,\n ConcentrationStartedEvent,\n} from '../../schemas/events/concentration.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyConcentrationStarted = (\n state: Draft<CampaignState>,\n event: ConcentrationStartedEvent,\n): void => {\n const caster = state.characters[event.casterId];\n invariant(caster !== undefined, `Caster ${event.casterId} not found`);\n invariant(\n state.effectInstances[event.effectInstanceId] === undefined,\n `EffectInstance ${event.effectInstanceId} already exists`,\n );\n state.effectInstances[event.effectInstanceId] = {\n id: event.effectInstanceId,\n spellId: event.spellId,\n casterId: event.casterId,\n targetIds: [...event.targetIds],\n conditionsApplied: [...event.conditionsApplied],\n requiresConcentration: true,\n ...(event.durationRounds !== undefined ? { durationRounds: event.durationRounds } : {}),\n startedAtEventId: event.id,\n };\n caster.concentrationEffectId = event.effectInstanceId;\n};\n\nexport const applyConcentrationBroken = (\n state: Draft<CampaignState>,\n event: ConcentrationBrokenEvent,\n): void => {\n const effect = state.effectInstances[event.effectInstanceId];\n invariant(effect !== undefined, `EffectInstance ${event.effectInstanceId} not found`);\n const caster = state.characters[effect.casterId];\n for (const applied of effect.conditionsApplied) {\n const target = state.characters[applied.targetId];\n if (!target) continue;\n target.appliedConditions = target.appliedConditions.filter(\n (c) => c.id !== applied.appliedConditionId,\n );\n }\n if (caster?.concentrationEffectId === event.effectInstanceId) {\n caster.concentrationEffectId = undefined;\n }\n delete state.effectInstances[event.effectInstanceId];\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n CombatantMovedEvent,\n DashedEvent,\n DisengagedEvent,\n} from '../../schemas/events/movement.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyCombatantMoved = (\n state: Draft<CampaignState>,\n event: CombatantMovedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n const combatant = encounter.combatants.find((c) => c.combatantId === event.combatantId);\n invariant(combatant !== undefined, `Combatant ${event.combatantId} not in encounter`);\n combatant.position = { ...event.toPosition };\n combatant.turnUsage.feetMovedThisTurn += event.feetTraveled;\n};\n\nexport const applyDashed = (state: Draft<CampaignState>, event: DashedEvent): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n const combatant = encounter.combatants.find((c) => c.combatantId === event.combatantId);\n invariant(combatant !== undefined, `Combatant ${event.combatantId} not in encounter`);\n invariant(!combatant.turnUsage.dashed, `${event.combatantId} already dashed this turn`);\n combatant.turnUsage.dashed = true;\n};\n\nexport const applyDisengaged = (\n state: Draft<CampaignState>,\n event: DisengagedEvent,\n): void => {\n const encounter = state.encounters[event.encounterId];\n invariant(encounter !== undefined, `Encounter ${event.encounterId} not found`);\n const combatant = encounter.combatants.find((c) => c.combatantId === event.combatantId);\n invariant(combatant !== undefined, `Combatant ${event.combatantId} not in encounter`);\n invariant(!combatant.turnUsage.disengaged, `${event.combatantId} already disengaged this turn`);\n combatant.turnUsage.disengaged = true;\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n PartyCreatedEvent,\n PartyMembersChangedEvent,\n CurrencyAcquiredEvent,\n CurrencySpentEvent,\n ItemDepositedToPartyEvent,\n ItemWithdrawnFromPartyEvent,\n} from '../../schemas/events/party.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { addCurrency, subtractCurrency, emptyCurrency } from '../../schemas/runtime/currency.js';\n\nexport const applyPartyCreated = (\n state: Draft<CampaignState>,\n event: PartyCreatedEvent,\n): void => {\n invariant(state.parties[event.partyId] === undefined, `Party ${event.partyId} already exists`);\n for (const memberId of event.memberIds) {\n invariant(state.characters[memberId] !== undefined, `Member ${memberId} not found`);\n }\n state.parties[event.partyId] = {\n id: event.partyId,\n name: event.name,\n memberIds: [...event.memberIds],\n sharedInventory: [],\n purse: emptyCurrency(),\n };\n};\n\nexport const applyPartyMembersChanged = (\n state: Draft<CampaignState>,\n event: PartyMembersChangedEvent,\n): void => {\n const party = state.parties[event.partyId];\n invariant(party !== undefined, `Party ${event.partyId} not found`);\n for (const addedId of event.added) {\n invariant(state.characters[addedId] !== undefined, `Member ${addedId} not found`);\n if (!party.memberIds.includes(addedId)) party.memberIds.push(addedId);\n }\n if (event.removed.length > 0) {\n party.memberIds = party.memberIds.filter((id) => !event.removed.includes(id));\n }\n};\n\nexport const applyCurrencyAcquired = (\n state: Draft<CampaignState>,\n event: CurrencyAcquiredEvent,\n): void => {\n const party = state.parties[event.partyId];\n invariant(party !== undefined, `Party ${event.partyId} not found`);\n party.purse = addCurrency(party.purse, event.amounts);\n};\n\nexport const applyCurrencySpent = (\n state: Draft<CampaignState>,\n event: CurrencySpentEvent,\n): void => {\n const party = state.parties[event.partyId];\n invariant(party !== undefined, `Party ${event.partyId} not found`);\n party.purse = subtractCurrency(party.purse, event.amounts);\n};\n\nexport const applyItemDepositedToParty = (\n state: Draft<CampaignState>,\n event: ItemDepositedToPartyEvent,\n): void => {\n const party = state.parties[event.partyId];\n invariant(party !== undefined, `Party ${event.partyId} not found`);\n invariant(\n state.itemInstances[event.itemInstanceId] !== undefined,\n `Item instance ${event.itemInstanceId} not found`,\n );\n if (event.sourceCharacterId !== undefined) {\n const source = state.characters[event.sourceCharacterId];\n invariant(source !== undefined, `Character ${event.sourceCharacterId} not found`);\n source.inventory = source.inventory.filter((id) => id !== event.itemInstanceId);\n }\n if (!party.sharedInventory.includes(event.itemInstanceId)) {\n party.sharedInventory.push(event.itemInstanceId);\n }\n};\n\nexport const applyItemWithdrawnFromParty = (\n state: Draft<CampaignState>,\n event: ItemWithdrawnFromPartyEvent,\n): void => {\n const party = state.parties[event.partyId];\n invariant(party !== undefined, `Party ${event.partyId} not found`);\n invariant(\n party.sharedInventory.includes(event.itemInstanceId),\n `Item ${event.itemInstanceId} not in party ${event.partyId} inventory`,\n );\n party.sharedInventory = party.sharedInventory.filter((id) => id !== event.itemInstanceId);\n if (event.recipientCharacterId !== undefined) {\n const recipient = state.characters[event.recipientCharacterId];\n invariant(recipient !== undefined, `Character ${event.recipientCharacterId} not found`);\n if (!recipient.inventory.includes(event.itemInstanceId)) {\n recipient.inventory.push(event.itemInstanceId);\n }\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n SessionStartedEvent,\n SessionEndedEvent,\n JournalEntryAddedEvent,\n InGameTimeAdvancedEvent,\n} from '../../schemas/events/session.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { advanceInGameTime } from '../../schemas/runtime/in-game-time.js';\n\nexport const applySessionStarted = (\n state: Draft<CampaignState>,\n event: SessionStartedEvent,\n): void => {\n invariant(state.sessions[event.sessionId] === undefined, `Session ${event.sessionId} already exists`);\n invariant(state.activeSessionId === undefined, `Another session ${state.activeSessionId} is already active`);\n if (event.inGameStart !== undefined) {\n invariant(\n event.inGameStart.totalMinutes >= state.inGameTime.totalMinutes,\n `Session inGameStart cannot rewind the campaign clock`,\n );\n state.inGameTime = { totalMinutes: event.inGameStart.totalMinutes };\n }\n state.sessions[event.sessionId] = {\n id: event.sessionId,\n name: event.name,\n startedAtIso: event.at,\n inGameStart: { totalMinutes: state.inGameTime.totalMinutes },\n journalEntryIds: [],\n };\n state.activeSessionId = event.sessionId;\n};\n\nexport const applySessionEnded = (\n state: Draft<CampaignState>,\n event: SessionEndedEvent,\n): void => {\n const session = state.sessions[event.sessionId];\n invariant(session !== undefined, `Session ${event.sessionId} not found`);\n invariant(session.endedAtIso === undefined, `Session ${event.sessionId} already ended`);\n session.endedAtIso = event.at;\n session.inGameEnd = state.inGameTime;\n if (event.summary !== undefined) session.summary = event.summary;\n if (state.activeSessionId === event.sessionId) state.activeSessionId = undefined;\n};\n\nexport const applyJournalEntryAdded = (\n state: Draft<CampaignState>,\n event: JournalEntryAddedEvent,\n): void => {\n invariant(state.journalEntries[event.entryId] === undefined, `Journal entry ${event.entryId} already exists`);\n if (event.sessionId !== undefined) {\n invariant(state.sessions[event.sessionId] !== undefined, `Session ${event.sessionId} not found`);\n }\n if (event.authorCharacterId !== undefined) {\n invariant(\n state.characters[event.authorCharacterId] !== undefined,\n `Author ${event.authorCharacterId} not found`,\n );\n }\n state.journalEntries[event.entryId] = {\n id: event.entryId,\n sessionId: event.sessionId,\n authorKind: event.authorKind,\n authorCharacterId: event.authorCharacterId,\n visibility: event.visibility,\n visibleToCharacterIds: [...event.visibleToCharacterIds],\n title: event.title,\n body: event.body,\n createdAtIso: event.at,\n inGameAt: state.inGameTime,\n };\n if (event.sessionId !== undefined) {\n state.sessions[event.sessionId]!.journalEntryIds.push(event.entryId);\n }\n};\n\nexport const applyInGameTimeAdvanced = (\n state: Draft<CampaignState>,\n event: InGameTimeAdvancedEvent,\n): void => {\n state.inGameTime = advanceInGameTime(state.inGameTime, event.minutes);\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n LocationCreatedEvent,\n DoorAddedEvent,\n DoorStateChangedEvent,\n CharacterLocationChangedEvent,\n} from '../../schemas/events/locations.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyLocationCreated = (\n state: Draft<CampaignState>,\n event: LocationCreatedEvent,\n): void => {\n invariant(state.locations[event.locationId] === undefined, `Location ${event.locationId} already exists`);\n if (event.parentLocationId !== undefined) {\n invariant(\n state.locations[event.parentLocationId] !== undefined,\n `Parent location ${event.parentLocationId} not found`,\n );\n }\n if (event.map !== undefined) {\n invariant(\n event.map.terrain.length === event.map.heightCells,\n `Map terrain rows (${event.map.terrain.length}) must equal heightCells (${event.map.heightCells})`,\n );\n for (const row of event.map.terrain) {\n invariant(\n row.length === event.map.widthCells,\n `Map terrain row width (${row.length}) must equal widthCells (${event.map.widthCells})`,\n );\n }\n }\n state.locations[event.locationId] = {\n id: event.locationId,\n name: event.name,\n description: event.description,\n parentLocationId: event.parentLocationId,\n map: event.map,\n doorIds: [],\n };\n};\n\nexport const applyDoorAdded = (\n state: Draft<CampaignState>,\n event: DoorAddedEvent,\n): void => {\n invariant(state.doors[event.doorId] === undefined, `Door ${event.doorId} already exists`);\n const location = state.locations[event.locationId];\n invariant(location !== undefined, `Location ${event.locationId} not found`);\n if (location.map !== undefined) {\n invariant(\n event.position.x >= 0 && event.position.x < location.map.widthCells,\n `Door x ${event.position.x} out of map bounds`,\n );\n invariant(\n event.position.y >= 0 && event.position.y < location.map.heightCells,\n `Door y ${event.position.y} out of map bounds`,\n );\n }\n state.doors[event.doorId] = {\n id: event.doorId,\n locationId: event.locationId,\n name: event.name,\n position: { x: event.position.x, y: event.position.y },\n state: event.state,\n };\n location.doorIds.push(event.doorId);\n};\n\nexport const applyDoorStateChanged = (\n state: Draft<CampaignState>,\n event: DoorStateChangedEvent,\n): void => {\n const door = state.doors[event.doorId];\n invariant(door !== undefined, `Door ${event.doorId} not found`);\n if (event.byCharacterId !== undefined) {\n invariant(\n state.characters[event.byCharacterId] !== undefined,\n `Character ${event.byCharacterId} not found`,\n );\n }\n door.state = event.toState;\n};\n\nexport const applyCharacterLocationChanged = (\n state: Draft<CampaignState>,\n event: CharacterLocationChangedEvent,\n): void => {\n invariant(\n state.characters[event.characterId] !== undefined,\n `Character ${event.characterId} not found`,\n );\n if (event.toLocationId === undefined) {\n delete state.characterLocations[event.characterId];\n } else {\n invariant(\n state.locations[event.toLocationId] !== undefined,\n `Location ${event.toLocationId} not found`,\n );\n state.characterLocations[event.characterId] = event.toLocationId;\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n QuestStartedEvent,\n ObjectiveProgressedEvent,\n ObjectiveCompletedEvent,\n ObjectiveFailedEvent,\n QuestCompletedEvent,\n QuestFailedEvent,\n QuestAbandonedEvent,\n QuestRewardClaimedEvent,\n XPAwardedEvent,\n MilestoneAwardedEvent,\n} from '../../schemas/events/quests.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { emptyCurrency, addCurrency } from '../../schemas/runtime/currency.js';\n\nconst cloneObjectives = (event: QuestStartedEvent) =>\n event.objectives.map((o) => ({\n id: o.id,\n description: o.description,\n status: o.status,\n optional: o.optional,\n progress: o.progress,\n ...(o.required !== undefined ? { required: o.required } : {}),\n }));\n\nexport const applyQuestStarted = (state: Draft<CampaignState>, event: QuestStartedEvent): void => {\n invariant(state.quests[event.questId] === undefined, `Quest ${event.questId} already exists`);\n if (event.partyId !== undefined) {\n invariant(state.parties[event.partyId] !== undefined, `Party ${event.partyId} not found`);\n }\n state.quests[event.questId] = {\n id: event.questId,\n title: event.title,\n description: event.description,\n status: 'active',\n partyId: event.partyId,\n objectives: cloneObjectives(event),\n reward: event.reward ?? {\n xpPerCharacter: 0,\n currency: emptyCurrency(),\n itemDefinitionIds: [],\n },\n rewardClaimed: false,\n startedAtIso: event.at,\n };\n};\n\nconst findObjective = (\n state: Draft<CampaignState>,\n questId: string,\n objectiveId: string,\n) => {\n const quest = state.quests[questId];\n invariant(quest !== undefined, `Quest ${questId} not found`);\n const objective = quest.objectives.find((o) => o.id === objectiveId);\n invariant(objective !== undefined, `Objective ${objectiveId} not found on quest ${questId}`);\n return { quest, objective };\n};\n\nexport const applyObjectiveProgressed = (\n state: Draft<CampaignState>,\n event: ObjectiveProgressedEvent,\n): void => {\n const { quest, objective } = findObjective(state, event.questId, event.objectiveId);\n invariant(quest.status === 'active', `Quest ${event.questId} is not active`);\n invariant(objective.status === 'pending', `Objective ${event.objectiveId} is not pending`);\n objective.progress += event.delta;\n if (objective.required !== undefined && objective.progress >= objective.required) {\n objective.status = 'completed';\n }\n};\n\nexport const applyObjectiveCompleted = (\n state: Draft<CampaignState>,\n event: ObjectiveCompletedEvent,\n): void => {\n const { objective } = findObjective(state, event.questId, event.objectiveId);\n invariant(objective.status !== 'completed', `Objective ${event.objectiveId} already completed`);\n objective.status = 'completed';\n if (objective.required !== undefined && objective.progress < objective.required) {\n objective.progress = objective.required;\n }\n};\n\nexport const applyObjectiveFailed = (\n state: Draft<CampaignState>,\n event: ObjectiveFailedEvent,\n): void => {\n const { objective } = findObjective(state, event.questId, event.objectiveId);\n invariant(objective.status === 'pending', `Objective ${event.objectiveId} is not pending`);\n objective.status = 'failed';\n};\n\nexport const applyQuestCompleted = (\n state: Draft<CampaignState>,\n event: QuestCompletedEvent,\n): void => {\n const quest = state.quests[event.questId];\n invariant(quest !== undefined, `Quest ${event.questId} not found`);\n invariant(quest.status === 'active', `Quest ${event.questId} is not active`);\n for (const o of quest.objectives) {\n if (!o.optional) {\n invariant(o.status === 'completed', `Required objective ${o.id} is not completed`);\n }\n }\n quest.status = 'completed';\n quest.endedAtIso = event.at;\n};\n\nexport const applyQuestFailed = (\n state: Draft<CampaignState>,\n event: QuestFailedEvent,\n): void => {\n const quest = state.quests[event.questId];\n invariant(quest !== undefined, `Quest ${event.questId} not found`);\n invariant(quest.status === 'active', `Quest ${event.questId} is not active`);\n quest.status = 'failed';\n quest.endedAtIso = event.at;\n};\n\nexport const applyQuestAbandoned = (\n state: Draft<CampaignState>,\n event: QuestAbandonedEvent,\n): void => {\n const quest = state.quests[event.questId];\n invariant(quest !== undefined, `Quest ${event.questId} not found`);\n invariant(quest.status === 'active', `Quest ${event.questId} is not active`);\n quest.status = 'abandoned';\n quest.endedAtIso = event.at;\n};\n\nexport const applyQuestRewardClaimed = (\n state: Draft<CampaignState>,\n event: QuestRewardClaimedEvent,\n): void => {\n const quest = state.quests[event.questId];\n invariant(quest !== undefined, `Quest ${event.questId} not found`);\n invariant(quest.status === 'completed', `Quest ${event.questId} must be completed before claiming reward`);\n invariant(!quest.rewardClaimed, `Quest ${event.questId} reward already claimed`);\n for (const beneficiaryId of event.beneficiaryCharacterIds) {\n invariant(\n state.characters[beneficiaryId] !== undefined,\n `Beneficiary ${beneficiaryId} not found`,\n );\n const beneficiary = state.characters[beneficiaryId]!;\n beneficiary.xp += quest.reward.xpPerCharacter;\n }\n if (quest.partyId !== undefined) {\n const party = state.parties[quest.partyId];\n invariant(party !== undefined, `Party ${quest.partyId} not found`);\n party.purse = addCurrency(party.purse, quest.reward.currency);\n }\n quest.rewardClaimed = true;\n};\n\nexport const applyXPAwarded = (state: Draft<CampaignState>, event: XPAwardedEvent): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n character.xp += event.amount;\n};\n\nexport const applyMilestoneAwarded = (\n state: Draft<CampaignState>,\n event: MilestoneAwardedEvent,\n): void => {\n if (event.partyId !== undefined) {\n invariant(state.parties[event.partyId] !== undefined, `Party ${event.partyId} not found`);\n }\n if (event.questId !== undefined) {\n invariant(state.quests[event.questId] !== undefined, `Quest ${event.questId} not found`);\n }\n state.milestones.push({\n kind: event.kind,\n title: event.title,\n atIso: event.at,\n partyId: event.partyId,\n questId: event.questId,\n });\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n SpellCounteredEvent,\n SpellDispelledEvent,\n ItemIdentifiedEvent,\n} from '../../schemas/events/reactive-spells.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applySpellCountered = (\n _state: Draft<CampaignState>,\n _event: SpellCounteredEvent,\n): void => {\n // Record-only: the original spell's slot was already consumed by\n // SpellSlotConsumed. The spell's effects are simply not applied; this\n // event documents the counter for replay / narrative.\n};\n\nexport const applySpellDispelled = (\n state: Draft<CampaignState>,\n event: SpellDispelledEvent,\n): void => {\n const effect = state.effectInstances[event.effectInstanceId];\n invariant(effect !== undefined, `EffectInstance ${event.effectInstanceId} not found`);\n invariant(\n state.characters[event.dispelledByCharacterId] !== undefined,\n `Caster ${event.dispelledByCharacterId} not found`,\n );\n for (const applied of effect.conditionsApplied) {\n const target = state.characters[applied.targetId];\n if (!target) continue;\n target.appliedConditions = target.appliedConditions.filter(\n (c) => c.id !== applied.appliedConditionId,\n );\n }\n const caster = state.characters[effect.casterId];\n if (caster?.concentrationEffectId === event.effectInstanceId) {\n caster.concentrationEffectId = undefined;\n }\n delete state.effectInstances[event.effectInstanceId];\n};\n\nexport const applyItemIdentified = (\n state: Draft<CampaignState>,\n event: ItemIdentifiedEvent,\n): void => {\n const item = state.itemInstances[event.itemInstanceId];\n invariant(item !== undefined, `Item ${event.itemInstanceId} not found`);\n invariant(\n state.characters[event.identifiedByCharacterId] !== undefined,\n `Identifier ${event.identifiedByCharacterId} not found`,\n );\n if (!item.identifiedByCharacterIds.includes(event.identifiedByCharacterId)) {\n item.identifiedByCharacterIds.push(event.identifiedByCharacterId);\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { WeaponMasteryActivatedEvent } from '../../schemas/events/weapon-mastery.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyWeaponMasteryActivated = (\n state: Draft<CampaignState>,\n event: WeaponMasteryActivatedEvent,\n): void => {\n invariant(\n state.characters[event.attackerId] !== undefined,\n `Attacker ${event.attackerId} not found`,\n );\n invariant(\n state.itemInstances[event.weaponInstanceId] !== undefined,\n `Weapon ${event.weaponInstanceId} not found`,\n );\n if (event.targetId !== undefined) {\n invariant(\n state.characters[event.targetId] !== undefined,\n `Target ${event.targetId} not found`,\n );\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n MountedEvent,\n DismountedEvent,\n VehicleAcquiredEvent,\n VehicleBoardedEvent,\n VehicleDepartedEvent,\n VehicleDamagedEvent,\n VehicleRepairedEvent,\n} from '../../schemas/events/mounts-vehicles.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyMounted = (state: Draft<CampaignState>, event: MountedEvent): void => {\n const rider = state.characters[event.riderId];\n invariant(rider !== undefined, `Rider ${event.riderId} not found`);\n invariant(rider.mountedOnId === undefined, `${event.riderId} is already mounted`);\n invariant(state.characters[event.mountId] !== undefined, `Mount ${event.mountId} not found`);\n rider.mountedOnId = event.mountId;\n};\n\nexport const applyDismounted = (state: Draft<CampaignState>, event: DismountedEvent): void => {\n const rider = state.characters[event.riderId];\n invariant(rider !== undefined, `Rider ${event.riderId} not found`);\n invariant(\n rider.mountedOnId === event.mountId,\n `${event.riderId} is not mounted on ${event.mountId}`,\n );\n rider.mountedOnId = undefined;\n};\n\nexport const applyVehicleAcquired = (\n state: Draft<CampaignState>,\n event: VehicleAcquiredEvent,\n): void => {\n invariant(state.vehicles[event.vehicleId] === undefined, `Vehicle ${event.vehicleId} already exists`);\n state.vehicles[event.vehicleId] = {\n id: event.vehicleId,\n name: event.name,\n kind: event.kind,\n speedFeet: event.speedFeet,\n ac: event.ac,\n hp: { current: event.maxHp, max: event.maxHp },\n capacity: event.capacity,\n occupantIds: [],\n };\n};\n\nexport const applyVehicleBoarded = (\n state: Draft<CampaignState>,\n event: VehicleBoardedEvent,\n): void => {\n const vehicle = state.vehicles[event.vehicleId];\n invariant(vehicle !== undefined, `Vehicle ${event.vehicleId} not found`);\n invariant(state.characters[event.characterId] !== undefined, `Character ${event.characterId} not found`);\n invariant(\n vehicle.occupantIds.length < vehicle.capacity,\n `Vehicle ${event.vehicleId} is at capacity`,\n );\n if (!vehicle.occupantIds.includes(event.characterId)) {\n vehicle.occupantIds.push(event.characterId);\n }\n};\n\nexport const applyVehicleDeparted = (\n state: Draft<CampaignState>,\n event: VehicleDepartedEvent,\n): void => {\n const vehicle = state.vehicles[event.vehicleId];\n invariant(vehicle !== undefined, `Vehicle ${event.vehicleId} not found`);\n invariant(\n vehicle.occupantIds.includes(event.characterId),\n `${event.characterId} is not aboard ${event.vehicleId}`,\n );\n vehicle.occupantIds = vehicle.occupantIds.filter((id) => id !== event.characterId);\n};\n\nexport const applyVehicleDamaged = (\n state: Draft<CampaignState>,\n event: VehicleDamagedEvent,\n): void => {\n const vehicle = state.vehicles[event.vehicleId];\n invariant(vehicle !== undefined, `Vehicle ${event.vehicleId} not found`);\n vehicle.hp.current = Math.max(0, vehicle.hp.current - event.amount);\n};\n\nexport const applyVehicleRepaired = (\n state: Draft<CampaignState>,\n event: VehicleRepairedEvent,\n): void => {\n const vehicle = state.vehicles[event.vehicleId];\n invariant(vehicle !== undefined, `Vehicle ${event.vehicleId} not found`);\n vehicle.hp.current = Math.min(vehicle.hp.max, vehicle.hp.current + event.amount);\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n TravelLegCompletedEvent,\n NavigationCheckRolledEvent,\n ForagedForEvent,\n} from '../../schemas/events/travel.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyTravelLegCompleted = (\n state: Draft<CampaignState>,\n event: TravelLegCompletedEvent,\n): void => {\n invariant(state.parties[event.partyId] !== undefined, `Party ${event.partyId} not found`);\n if (event.fromLocationId !== undefined) {\n invariant(\n state.locations[event.fromLocationId] !== undefined,\n `From-location ${event.fromLocationId} not found`,\n );\n }\n if (event.toLocationId !== undefined) {\n invariant(\n state.locations[event.toLocationId] !== undefined,\n `To-location ${event.toLocationId} not found`,\n );\n }\n state.travelLog.push({\n partyId: event.partyId,\n pace: event.pace,\n hours: event.hours,\n miles: event.miles,\n fromLocationId: event.fromLocationId,\n toLocationId: event.toLocationId,\n notes: event.notes,\n atIso: event.at,\n });\n};\n\nexport const applyNavigationCheckRolled = (\n state: Draft<CampaignState>,\n event: NavigationCheckRolledEvent,\n): void => {\n invariant(state.parties[event.partyId] !== undefined, `Party ${event.partyId} not found`);\n invariant(\n state.characters[event.navigatorId] !== undefined,\n `Navigator ${event.navigatorId} not found`,\n );\n};\n\nexport const applyForagedFor = (state: Draft<CampaignState>, event: ForagedForEvent): void => {\n invariant(state.parties[event.partyId] !== undefined, `Party ${event.partyId} not found`);\n invariant(\n state.characters[event.foragerId] !== undefined,\n `Forager ${event.foragerId} not found`,\n );\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n AttitudeChangedEvent,\n MoraleCheckRolledEvent,\n MoraleBrokenEvent,\n} from '../../schemas/events/npc.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyAttitudeChanged = (\n state: Draft<CampaignState>,\n event: AttitudeChangedEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n character.attitude = event.toAttitude;\n};\n\nexport const applyMoraleCheckRolled = (\n state: Draft<CampaignState>,\n event: MoraleCheckRolledEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n if (!event.success && character.morale !== undefined) {\n character.morale.current = Math.max(0, character.morale.current - 1);\n }\n};\n\nexport const applyMoraleBroken = (\n state: Draft<CampaignState>,\n event: MoraleBrokenEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n character.moraleBroken = true;\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { DowntimeActivityResolvedEvent } from '../../schemas/events/downtime.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyDowntimeActivityResolved = (\n state: Draft<CampaignState>,\n event: DowntimeActivityResolvedEvent,\n): void => {\n invariant(\n state.characters[event.characterId] !== undefined,\n `Character ${event.characterId} not found`,\n );\n state.downtimeLog.push({\n characterId: event.characterId,\n kind: event.kind,\n days: event.days,\n outcome: event.outcome,\n summary: event.summary,\n atIso: event.at,\n producedItemDefinitionId: event.producedItemDefinitionId,\n toolProficiencyGained: event.toolProficiencyGained,\n });\n if (event.toolProficiencyGained !== undefined) {\n const existing = state.toolProficienciesByCharacter[event.characterId] ?? [];\n if (!existing.includes(event.toolProficiencyGained)) {\n state.toolProficienciesByCharacter[event.characterId] = [\n ...existing,\n event.toolProficiencyGained,\n ];\n }\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n ItemChargeConsumedEvent,\n ItemRechargedEvent,\n SentientItemConflictEvent,\n} from '../../schemas/events/charges.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyItemChargeConsumed = (\n state: Draft<CampaignState>,\n event: ItemChargeConsumedEvent,\n): void => {\n const item = state.itemInstances[event.itemInstanceId];\n invariant(item !== undefined, `Item ${event.itemInstanceId} not found`);\n const current = item.chargesRemaining ?? 0;\n invariant(current >= event.amount, `Item ${event.itemInstanceId} has only ${current} charges`);\n item.chargesRemaining = current - event.amount;\n if (event.byCharacterId !== undefined) {\n invariant(\n state.characters[event.byCharacterId] !== undefined,\n `Wielder ${event.byCharacterId} not found`,\n );\n }\n};\n\nexport const applyItemRecharged = (\n state: Draft<CampaignState>,\n event: ItemRechargedEvent,\n): void => {\n const item = state.itemInstances[event.itemInstanceId];\n invariant(item !== undefined, `Item ${event.itemInstanceId} not found`);\n const current = item.chargesRemaining ?? 0;\n const cap = item.maxCharges ?? current + event.amount;\n item.chargesRemaining = Math.min(cap, current + event.amount);\n};\n\nexport const applySentientItemConflict = (\n state: Draft<CampaignState>,\n event: SentientItemConflictEvent,\n): void => {\n const item = state.itemInstances[event.itemInstanceId];\n invariant(item !== undefined, `Item ${event.itemInstanceId} not found`);\n invariant(item.sentient !== undefined, `Item ${event.itemInstanceId} is not sentient`);\n invariant(\n state.characters[event.wielderId] !== undefined,\n `Wielder ${event.wielderId} not found`,\n );\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n BastionFoundedEvent,\n BastionFacilityAddedEvent,\n BastionHirelingAddedEvent,\n BastionTurnTakenEvent,\n BastionDamagedEvent,\n BastionLevelChangedEvent,\n} from '../../schemas/events/bastion.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyBastionFounded = (\n state: Draft<CampaignState>,\n event: BastionFoundedEvent,\n): void => {\n invariant(state.bastions[event.bastionId] === undefined, `Bastion ${event.bastionId} already exists`);\n invariant(\n state.characters[event.ownerCharacterId] !== undefined,\n `Owner ${event.ownerCharacterId} not found`,\n );\n if (event.locationId !== undefined) {\n invariant(state.locations[event.locationId] !== undefined, `Location ${event.locationId} not found`);\n }\n state.bastions[event.bastionId] = {\n id: event.bastionId,\n name: event.name,\n ownerCharacterId: event.ownerCharacterId,\n locationId: event.locationId,\n level: event.level,\n facilities: [],\n hirelings: [],\n defenders: 0,\n treasuryGp: 0,\n hpCurrent: event.hpMax,\n hpMax: event.hpMax,\n };\n};\n\nexport const applyBastionFacilityAdded = (\n state: Draft<CampaignState>,\n event: BastionFacilityAddedEvent,\n): void => {\n const bastion = state.bastions[event.bastionId];\n invariant(bastion !== undefined, `Bastion ${event.bastionId} not found`);\n invariant(\n !bastion.facilities.some((f) => f.id === event.facilityId),\n `Facility ${event.facilityId} already exists on bastion`,\n );\n bastion.facilities.push({\n id: event.facilityId,\n name: event.name,\n kind: event.kind,\n space: event.space,\n description: event.description,\n });\n};\n\nexport const applyBastionHirelingAdded = (\n state: Draft<CampaignState>,\n event: BastionHirelingAddedEvent,\n): void => {\n const bastion = state.bastions[event.bastionId];\n invariant(bastion !== undefined, `Bastion ${event.bastionId} not found`);\n bastion.hirelings.push({ id: event.hirelingId, name: event.name, role: event.role });\n};\n\nexport const applyBastionTurnTaken = (\n state: Draft<CampaignState>,\n event: BastionTurnTakenEvent,\n): void => {\n const bastion = state.bastions[event.bastionId];\n invariant(bastion !== undefined, `Bastion ${event.bastionId} not found`);\n bastion.treasuryGp = Math.max(0, bastion.treasuryGp + event.treasuryDeltaGp);\n};\n\nexport const applyBastionDamaged = (\n state: Draft<CampaignState>,\n event: BastionDamagedEvent,\n): void => {\n const bastion = state.bastions[event.bastionId];\n invariant(bastion !== undefined, `Bastion ${event.bastionId} not found`);\n bastion.hpCurrent = Math.max(0, bastion.hpCurrent - event.amount);\n};\n\nexport const applyBastionLevelChanged = (\n state: Draft<CampaignState>,\n event: BastionLevelChangedEvent,\n): void => {\n const bastion = state.bastions[event.bastionId];\n invariant(bastion !== undefined, `Bastion ${event.bastionId} not found`);\n invariant(bastion.level === event.fromLevel, `Bastion level mismatch (expected ${event.fromLevel}, got ${bastion.level})`);\n bastion.level = event.toLevel;\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { CampaignSettingsChangedEvent } from '../../schemas/events/settings.js';\n\nexport const applyCampaignSettingsChanged = (\n state: Draft<CampaignState>,\n event: CampaignSettingsChangedEvent,\n): void => {\n const s = state.settings;\n if (event.grittyRest !== undefined) s.grittyRest = event.grittyRest;\n if (event.heroPoints !== undefined) s.heroPoints = event.heroPoints;\n if (event.sanity !== undefined) s.sanity = event.sanity;\n if (event.massCombat !== undefined) s.massCombat = event.massCombat;\n if (event.feaCharacterFlaws !== undefined) s.feaCharacterFlaws = event.feaCharacterFlaws;\n if (event.customHouserulesAdd !== undefined) {\n for (const r of event.customHouserulesAdd) {\n if (!s.customHouserules.includes(r)) s.customHouserules.push(r);\n }\n }\n if (event.customHouserulesRemove !== undefined) {\n s.customHouserules = s.customHouserules.filter((r) => !event.customHouserulesRemove!.includes(r));\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { CharacterResurrectedEvent } from '../../schemas/events/resurrection.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyCharacterResurrected = (\n state: Draft<CampaignState>,\n event: CharacterResurrectedEvent,\n): void => {\n const character = state.characters[event.characterId];\n invariant(character !== undefined, `Character ${event.characterId} not found`);\n character.hp.current = event.hpAfter;\n character.hp.temp = 0;\n character.deathSaves = { successes: 0, failures: 0, stable: false };\n character.exhaustion = 0;\n if (event.newSpeciesId !== undefined) {\n character.speciesId = event.newSpeciesId;\n }\n if (event.byCharacterId !== undefined) {\n invariant(\n state.characters[event.byCharacterId] !== undefined,\n `Caster ${event.byCharacterId} not found`,\n );\n }\n};\n","import type { Draft } from 'immer';\nimport type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n PolymorphAppliedEvent,\n PolymorphRevertedEvent,\n SimulacrumCreatedEvent,\n WishGrantedEvent,\n} from '../../schemas/events/transformations.js';\nimport { invariant } from '../../internal/invariants.js';\n\nexport const applyPolymorphApplied = (\n state: Draft<CampaignState>,\n event: PolymorphAppliedEvent,\n): void => {\n const character = state.characters[event.targetId];\n invariant(character !== undefined, `Target ${event.targetId} not found`);\n invariant(\n character.polymorphedSnapshot === undefined,\n `${event.targetId} is already polymorphed`,\n );\n character.polymorphedSnapshot = {\n hp: { current: character.hp.current, max: character.hp.max, temp: character.hp.temp },\n abilityScores: { ...character.abilityScores },\n speedFeet: character.speedFeet,\n speciesId: character.speciesId,\n kind: event.kind,\n formName: event.form.name,\n };\n character.hp.current = event.form.hp;\n character.hp.max = event.form.hp;\n character.hp.temp = 0;\n character.abilityScores = { ...event.form.abilityScores };\n character.speedFeet = event.form.speedFeet;\n if (event.form.speciesId !== undefined) character.speciesId = event.form.speciesId;\n};\n\nexport const applyPolymorphReverted = (\n state: Draft<CampaignState>,\n event: PolymorphRevertedEvent,\n): void => {\n const character = state.characters[event.targetId];\n invariant(character !== undefined, `Target ${event.targetId} not found`);\n const snap = character.polymorphedSnapshot;\n invariant(snap !== undefined, `${event.targetId} is not polymorphed`);\n character.hp = { current: snap.hp.current, max: snap.hp.max, temp: snap.hp.temp };\n character.abilityScores = { ...snap.abilityScores };\n character.speedFeet = snap.speedFeet;\n character.speciesId = snap.speciesId;\n character.polymorphedSnapshot = undefined;\n};\n\nexport const applySimulacrumCreated = (\n state: Draft<CampaignState>,\n event: SimulacrumCreatedEvent,\n): void => {\n const original = state.characters[event.originalId];\n invariant(original !== undefined, `Original ${event.originalId} not found`);\n invariant(state.characters[event.simulacrumId] === undefined, `Simulacrum ${event.simulacrumId} already exists`);\n state.characters[event.simulacrumId] = {\n ...original,\n id: event.simulacrumId,\n name: `Simulacrum of ${original.name}`,\n kind: 'creature',\n hp: { current: event.hpMax, max: event.hpMax, temp: 0 },\n appliedConditions: [],\n triggerCounters: {},\n spellSlotsUsed: {},\n pactSlotsUsed: 0,\n concentrationEffectId: undefined,\n inventory: [],\n equipped: { attuned: [] },\n pendingChoiceIds: [],\n polymorphedSnapshot: undefined,\n mountedOnId: undefined,\n moraleBroken: false,\n xp: 0,\n };\n};\n\nexport const applyWishGranted = (\n state: Draft<CampaignState>,\n event: WishGrantedEvent,\n): void => {\n invariant(state.characters[event.granterId] !== undefined, `Granter ${event.granterId} not found`);\n if (event.stressApplied) {\n const granter = state.characters[event.granterId]!;\n granter.exhaustion = Math.min(6, granter.exhaustion + 1);\n }\n};\n","import type { CampaignState } from '../schemas/runtime/campaign.js';\nimport type { Event } from '../schemas/events/index.js';\nimport { immerProduce } from '../internal/immer.js';\nimport { applyCharacterCreated } from './reducers/progression.js';\nimport {\n applyConditionApplied,\n applyConditionRemoved,\n applyDamageApplied,\n applyDeathSaveRolled,\n applyExhaustionChanged,\n applyHealed,\n applyStabilized,\n applyTempHPGranted,\n} from './reducers/combat.js';\nimport {\n applyHitDieSpent,\n applyResourceRestored,\n applyResourceSpent,\n} from './reducers/resources.js';\nimport {\n applyLongRestEnded,\n applyLongRestStarted,\n applyShortRestEnded,\n applyShortRestStarted,\n} from './reducers/rest.js';\nimport {\n applyEncounterCreated,\n applyEncounterEnded,\n applyEncounterStarted,\n applyInitiativeRolled,\n applyRoundEnded,\n applyTurnEnded,\n applyTurnStarted,\n} from './reducers/encounter.js';\nimport { applyAttackRolled, applyDamageRolled } from './reducers/attack.js';\nimport {\n applyItemAcquired,\n applyItemAttuned,\n applyItemEquipped,\n applyItemUnattuned,\n applyItemUnequipped,\n} from './reducers/inventory.js';\nimport {\n applyChoiceRequired,\n applyChoiceResolved,\n applyLevelUpResolved,\n} from './reducers/level-up.js';\nimport { applyAbilityCheckRolled, applySaveRolled } from './reducers/checks.js';\nimport {\n applyPactSlotConsumed,\n applySpellCastDeclared,\n applySpellSlotConsumed,\n} from './reducers/spellcasting.js';\nimport {\n applyConcentrationBroken,\n applyConcentrationStarted,\n} from './reducers/concentration.js';\nimport { applyTriggerFired } from './reducers/triggers.js';\nimport { applyActionEconomyConsumed } from './reducers/action-economy.js';\nimport {\n applyCombatantMoved,\n applyDashed,\n applyDisengaged,\n} from './reducers/movement.js';\nimport {\n applyPartyCreated,\n applyPartyMembersChanged,\n applyCurrencyAcquired,\n applyCurrencySpent,\n applyItemDepositedToParty,\n applyItemWithdrawnFromParty,\n} from './reducers/party.js';\nimport {\n applySessionStarted,\n applySessionEnded,\n applyJournalEntryAdded,\n applyInGameTimeAdvanced,\n} from './reducers/session.js';\nimport {\n applyLocationCreated,\n applyDoorAdded,\n applyDoorStateChanged,\n applyCharacterLocationChanged,\n} from './reducers/locations.js';\nimport {\n applyQuestStarted,\n applyObjectiveProgressed,\n applyObjectiveCompleted,\n applyObjectiveFailed,\n applyQuestCompleted,\n applyQuestFailed,\n applyQuestAbandoned,\n applyQuestRewardClaimed,\n applyXPAwarded,\n applyMilestoneAwarded,\n} from './reducers/quests.js';\nimport {\n applySpellCountered,\n applySpellDispelled,\n applyItemIdentified,\n} from './reducers/reactive-spells.js';\nimport { applyWeaponMasteryActivated } from './reducers/weapon-mastery.js';\nimport {\n applyMounted,\n applyDismounted,\n applyVehicleAcquired,\n applyVehicleBoarded,\n applyVehicleDeparted,\n applyVehicleDamaged,\n applyVehicleRepaired,\n} from './reducers/mounts-vehicles.js';\nimport {\n applyTravelLegCompleted,\n applyNavigationCheckRolled,\n applyForagedFor,\n} from './reducers/travel.js';\nimport {\n applyAttitudeChanged,\n applyMoraleCheckRolled,\n applyMoraleBroken,\n} from './reducers/npc.js';\nimport { applyDowntimeActivityResolved } from './reducers/downtime.js';\nimport {\n applyItemChargeConsumed,\n applyItemRecharged,\n applySentientItemConflict,\n} from './reducers/charges.js';\nimport {\n applyBastionFounded,\n applyBastionFacilityAdded,\n applyBastionHirelingAdded,\n applyBastionTurnTaken,\n applyBastionDamaged,\n applyBastionLevelChanged,\n} from './reducers/bastion.js';\nimport { applyCampaignSettingsChanged } from './reducers/settings.js';\nimport { applyCharacterResurrected } from './reducers/resurrection.js';\nimport {\n applyPolymorphApplied,\n applyPolymorphReverted,\n applySimulacrumCreated,\n applyWishGranted,\n} from './reducers/transformations.js';\nimport { invariant } from '../internal/invariants.js';\n\nexport const apply = (state: CampaignState, event: Event): CampaignState =>\n immerProduce(state, (draft) => {\n switch (event.type) {\n case 'CharacterCreated':\n applyCharacterCreated(draft, event);\n break;\n case 'DamageApplied':\n applyDamageApplied(draft, event);\n break;\n case 'Healed':\n applyHealed(draft, event);\n break;\n case 'TempHPGranted':\n applyTempHPGranted(draft, event);\n break;\n case 'ConditionApplied':\n applyConditionApplied(draft, event);\n break;\n case 'ConditionRemoved':\n applyConditionRemoved(draft, event);\n break;\n case 'ExhaustionChanged':\n applyExhaustionChanged(draft, event);\n break;\n case 'DeathSaveRolled':\n applyDeathSaveRolled(draft, event);\n break;\n case 'Stabilized':\n applyStabilized(draft, event);\n break;\n case 'ResourceSpent':\n applyResourceSpent(draft, event);\n break;\n case 'ResourceRestored':\n applyResourceRestored(draft, event);\n break;\n case 'HitDieSpent':\n applyHitDieSpent(draft, event);\n break;\n case 'ShortRestStarted':\n applyShortRestStarted(draft, event);\n break;\n case 'ShortRestEnded':\n applyShortRestEnded(draft, event);\n break;\n case 'LongRestStarted':\n applyLongRestStarted(draft, event);\n break;\n case 'LongRestEnded':\n applyLongRestEnded(draft, event);\n break;\n case 'EncounterCreated':\n applyEncounterCreated(draft, event);\n break;\n case 'EncounterStarted':\n applyEncounterStarted(draft, event);\n break;\n case 'InitiativeRolled':\n applyInitiativeRolled(draft, event);\n break;\n case 'TurnStarted':\n applyTurnStarted(draft, event);\n break;\n case 'TurnEnded':\n applyTurnEnded(draft, event);\n break;\n case 'RoundEnded':\n applyRoundEnded(draft, event);\n break;\n case 'EncounterEnded':\n applyEncounterEnded(draft, event);\n break;\n case 'AttackRolled':\n applyAttackRolled(draft, event);\n break;\n case 'DamageRolled':\n applyDamageRolled(draft, event);\n break;\n case 'ItemAcquired':\n applyItemAcquired(draft, event);\n break;\n case 'LevelUpResolved':\n applyLevelUpResolved(draft, event);\n break;\n case 'ChoiceRequired':\n applyChoiceRequired(draft, event);\n break;\n case 'ChoiceResolved':\n applyChoiceResolved(draft, event);\n break;\n case 'SaveRolled':\n applySaveRolled(draft, event);\n break;\n case 'AbilityCheckRolled':\n applyAbilityCheckRolled(draft, event);\n break;\n case 'SpellCastDeclared':\n applySpellCastDeclared(draft, event);\n break;\n case 'SpellSlotConsumed':\n applySpellSlotConsumed(draft, event);\n break;\n case 'PactSlotConsumed':\n applyPactSlotConsumed(draft, event);\n break;\n case 'ConcentrationStarted':\n applyConcentrationStarted(draft, event);\n break;\n case 'ConcentrationBroken':\n applyConcentrationBroken(draft, event);\n break;\n case 'TriggerFired':\n applyTriggerFired(draft, event);\n break;\n case 'ActionEconomyConsumed':\n applyActionEconomyConsumed(draft, event);\n break;\n case 'CombatantMoved':\n applyCombatantMoved(draft, event);\n break;\n case 'Dashed':\n applyDashed(draft, event);\n break;\n case 'Disengaged':\n applyDisengaged(draft, event);\n break;\n case 'ItemEquipped':\n applyItemEquipped(draft, event);\n break;\n case 'ItemUnequipped':\n applyItemUnequipped(draft, event);\n break;\n case 'ItemAttuned':\n applyItemAttuned(draft, event);\n break;\n case 'ItemUnattuned':\n applyItemUnattuned(draft, event);\n break;\n case 'PartyCreated':\n applyPartyCreated(draft, event);\n break;\n case 'PartyMembersChanged':\n applyPartyMembersChanged(draft, event);\n break;\n case 'CurrencyAcquired':\n applyCurrencyAcquired(draft, event);\n break;\n case 'CurrencySpent':\n applyCurrencySpent(draft, event);\n break;\n case 'ItemDepositedToParty':\n applyItemDepositedToParty(draft, event);\n break;\n case 'ItemWithdrawnFromParty':\n applyItemWithdrawnFromParty(draft, event);\n break;\n case 'SessionStarted':\n applySessionStarted(draft, event);\n break;\n case 'SessionEnded':\n applySessionEnded(draft, event);\n break;\n case 'JournalEntryAdded':\n applyJournalEntryAdded(draft, event);\n break;\n case 'InGameTimeAdvanced':\n applyInGameTimeAdvanced(draft, event);\n break;\n case 'LocationCreated':\n applyLocationCreated(draft, event);\n break;\n case 'DoorAdded':\n applyDoorAdded(draft, event);\n break;\n case 'DoorStateChanged':\n applyDoorStateChanged(draft, event);\n break;\n case 'CharacterLocationChanged':\n applyCharacterLocationChanged(draft, event);\n break;\n case 'QuestStarted':\n applyQuestStarted(draft, event);\n break;\n case 'ObjectiveProgressed':\n applyObjectiveProgressed(draft, event);\n break;\n case 'ObjectiveCompleted':\n applyObjectiveCompleted(draft, event);\n break;\n case 'ObjectiveFailed':\n applyObjectiveFailed(draft, event);\n break;\n case 'QuestCompleted':\n applyQuestCompleted(draft, event);\n break;\n case 'QuestFailed':\n applyQuestFailed(draft, event);\n break;\n case 'QuestAbandoned':\n applyQuestAbandoned(draft, event);\n break;\n case 'QuestRewardClaimed':\n applyQuestRewardClaimed(draft, event);\n break;\n case 'XPAwarded':\n applyXPAwarded(draft, event);\n break;\n case 'MilestoneAwarded':\n applyMilestoneAwarded(draft, event);\n break;\n case 'SpellCountered':\n applySpellCountered(draft, event);\n break;\n case 'SpellDispelled':\n applySpellDispelled(draft, event);\n break;\n case 'ItemIdentified':\n applyItemIdentified(draft, event);\n break;\n case 'WeaponMasteryActivated':\n applyWeaponMasteryActivated(draft, event);\n break;\n case 'Mounted':\n applyMounted(draft, event);\n break;\n case 'Dismounted':\n applyDismounted(draft, event);\n break;\n case 'VehicleAcquired':\n applyVehicleAcquired(draft, event);\n break;\n case 'VehicleBoarded':\n applyVehicleBoarded(draft, event);\n break;\n case 'VehicleDeparted':\n applyVehicleDeparted(draft, event);\n break;\n case 'VehicleDamaged':\n applyVehicleDamaged(draft, event);\n break;\n case 'VehicleRepaired':\n applyVehicleRepaired(draft, event);\n break;\n case 'TravelLegCompleted':\n applyTravelLegCompleted(draft, event);\n break;\n case 'NavigationCheckRolled':\n applyNavigationCheckRolled(draft, event);\n break;\n case 'ForagedFor':\n applyForagedFor(draft, event);\n break;\n case 'AttitudeChanged':\n applyAttitudeChanged(draft, event);\n break;\n case 'MoraleCheckRolled':\n applyMoraleCheckRolled(draft, event);\n break;\n case 'MoraleBroken':\n applyMoraleBroken(draft, event);\n break;\n case 'DowntimeActivityResolved':\n applyDowntimeActivityResolved(draft, event);\n break;\n case 'ItemChargeConsumed':\n applyItemChargeConsumed(draft, event);\n break;\n case 'ItemRecharged':\n applyItemRecharged(draft, event);\n break;\n case 'SentientItemConflict':\n applySentientItemConflict(draft, event);\n break;\n case 'BastionFounded':\n applyBastionFounded(draft, event);\n break;\n case 'BastionFacilityAdded':\n applyBastionFacilityAdded(draft, event);\n break;\n case 'BastionHirelingAdded':\n applyBastionHirelingAdded(draft, event);\n break;\n case 'BastionTurnTaken':\n applyBastionTurnTaken(draft, event);\n break;\n case 'BastionDamaged':\n applyBastionDamaged(draft, event);\n break;\n case 'BastionLevelChanged':\n applyBastionLevelChanged(draft, event);\n break;\n case 'CharacterResurrected':\n applyCharacterResurrected(draft, event);\n break;\n case 'PolymorphApplied':\n applyPolymorphApplied(draft, event);\n break;\n case 'PolymorphReverted':\n applyPolymorphReverted(draft, event);\n break;\n case 'SimulacrumCreated':\n applySimulacrumCreated(draft, event);\n break;\n case 'WishGranted':\n applyWishGranted(draft, event);\n break;\n case 'CampaignSettingsChanged':\n applyCampaignSettingsChanged(draft, event);\n break;\n default: {\n const exhaustive: never = event;\n invariant(false, `Unhandled event: ${JSON.stringify(exhaustive)}`);\n }\n }\n draft.version += 1;\n });\n\nexport const applyAll = (state: CampaignState, events: ReadonlyArray<Event>): CampaignState =>\n events.reduce<CampaignState>(apply, state);\n","import type { CampaignState } from '../schemas/runtime/campaign.js';\nimport type { Event } from '../schemas/events/index.js';\nimport { emptyCampaignState } from '../schemas/runtime/campaign.js';\nimport { applyAll } from './apply.js';\n\nexport const replay = (events: ReadonlyArray<Event>): CampaignState =>\n applyAll(emptyCampaignState(), events);\n","import type { CampaignState } from '../schemas/runtime/campaign.js';\nimport type { Event } from '../schemas/events/index.js';\nimport { apply } from './apply.js';\n\nexport interface Campaign {\n readonly id: string;\n readonly name: string;\n readonly state: CampaignState;\n readonly events: ReadonlyArray<Event>;\n readonly cursor: number;\n readonly schemaVersion: number;\n}\n\nexport const commit = (campaign: Campaign, events: ReadonlyArray<Event>): Campaign => {\n let nextState = campaign.state;\n for (const event of events) {\n nextState = apply(nextState, event);\n }\n const before = campaign.events.slice(0, campaign.cursor);\n const nextEvents = [...before, ...events];\n return {\n ...campaign,\n state: nextState,\n events: nextEvents,\n cursor: nextEvents.length,\n };\n};\n","import type { Campaign } from './commit.js';\nimport { replay } from './replay.js';\n\nexport const undo = (campaign: Campaign): Campaign => {\n if (campaign.cursor === 0) return campaign;\n const cursor = campaign.cursor - 1;\n const replayedEvents = campaign.events.slice(0, cursor);\n return {\n ...campaign,\n state: replay(replayedEvents),\n cursor,\n };\n};\n\nexport const redo = (campaign: Campaign): Campaign => {\n if (campaign.cursor >= campaign.events.length) return campaign;\n const cursor = campaign.cursor + 1;\n const replayedEvents = campaign.events.slice(0, cursor);\n return {\n ...campaign,\n state: replay(replayedEvents),\n cursor,\n };\n};\n","import { z } from 'zod';\nimport type { Campaign } from './commit.js';\nimport type { Engine, PlanResult } from './index.js';\nimport { commit } from './commit.js';\nimport { replay } from './replay.js';\nimport { CharacterSchema, type Character } from '../schemas/runtime/character.js';\nimport { EventSchema, type Event } from '../schemas/events/index.js';\nimport { newCharacterId } from '../ids.js';\nimport { SCHEMA_VERSION } from '../version.js';\n\n/**\n * Plan + commit in one call. Dispatches the intent to the right planner\n * by its `type` tag and appends the resulting events to the campaign.\n */\nexport const performIntent = (\n engine: Engine,\n campaign: Campaign,\n intent: { readonly type: string } & Record<string, unknown>,\n): Campaign => {\n const dispatch: Readonly<Record<string, (i: never) => PlanResult>> = {\n Attack: (i) => engine.plan.attack(campaign.state, i),\n OpportunityAttack: (i) => engine.plan.opportunityAttack(campaign.state, i),\n ShortRest: (i) => engine.plan.shortRest(campaign.state, i),\n LongRest: (i) => engine.plan.longRest(campaign.state, i),\n CastSpell: (i) => engine.plan.castSpell(campaign.state, i),\n CheckConcentration: (i) => engine.plan.checkConcentration(campaign.state, i),\n Save: (i) => engine.plan.save(campaign.state, i),\n AbilityCheck: (i) => engine.plan.abilityCheck(campaign.state, i),\n LevelUp: (i) => engine.plan.levelUp(campaign.state, i),\n ResolveChoice: (i) => engine.plan.resolveChoice(campaign.state, i),\n Move: (i) => engine.plan.move(campaign.state, i),\n Dash: (i) => engine.plan.dash(campaign.state, i),\n Disengage: (i) => engine.plan.disengage(campaign.state, i),\n ActionSurge: (i) => engine.plan.actionSurge(campaign.state, i),\n OffHandAttack: (i) => engine.plan.offHandAttack(campaign.state, i),\n Multiattack: (i) => engine.plan.multiattack(campaign.state, i),\n Falling: (i) => engine.plan.falling(campaign.state, i),\n Grapple: (i) => engine.plan.grapple(campaign.state, i),\n Shove: (i) => engine.plan.shove(campaign.state, i),\n Hide: (i) => engine.plan.hide(campaign.state, i),\n Counterspell: (i) => engine.plan.counterspell(campaign.state, i),\n DispelMagic: (i) => engine.plan.dispelMagic(campaign.state, i),\n Identify: (i) => engine.plan.identify(campaign.state, i),\n WeaponMastery: (i) => engine.plan.weaponMastery(campaign.state, i),\n Forage: (i) => engine.plan.forage(campaign.state, i),\n NavigationCheck: (i) => engine.plan.navigationCheck(campaign.state, i),\n MoraleCheck: (i) => engine.plan.moraleCheck(campaign.state, i),\n ReactionRoll: (i) => engine.plan.reactionRoll(campaign.state, i),\n };\n const planner = dispatch[intent.type];\n if (planner === undefined) {\n throw new Error(`Unknown intent type: ${intent.type}`);\n }\n const { type: _, ...rest } = intent;\n void _;\n const result = planner(rest as never);\n return commit(campaign, result.events);\n};\n\nconst SerializedCampaignSchema = z.object({\n id: z.string(),\n name: z.string(),\n schemaVersion: z.number().int(),\n events: z.array(EventSchema),\n});\nexport type SerializedCampaign = z.infer<typeof SerializedCampaignSchema>;\n\n/** Serialize a campaign to a JSON string. State is omitted because it is computed by replay. */\nexport const serializeCampaign = (campaign: Campaign): string =>\n JSON.stringify({\n id: campaign.id,\n name: campaign.name,\n schemaVersion: campaign.schemaVersion,\n events: [...campaign.events],\n } satisfies SerializedCampaign);\n\n/** Parse a serialized campaign and replay its events to reconstruct state. */\nexport const loadCampaign = (json: string): Campaign => {\n const parsed = SerializedCampaignSchema.parse(JSON.parse(json));\n const state = replay(parsed.events);\n return {\n id: parsed.id,\n name: parsed.name,\n state,\n events: parsed.events,\n cursor: parsed.events.length,\n schemaVersion: parsed.schemaVersion,\n };\n};\n\nexport interface CreatePCOptions {\n readonly name: string;\n readonly speciesId: string;\n readonly backgroundId: string;\n readonly classId: string;\n readonly level?: number;\n readonly abilityScores?: Character['abilityScores'];\n readonly hpMax: number;\n readonly hpCurrent?: number;\n readonly featsTaken?: ReadonlyArray<string>;\n readonly id?: string;\n}\n\nconst DEFAULT_ABILITY_SCORES: Character['abilityScores'] = {\n STR: 14,\n DEX: 12,\n CON: 14,\n INT: 10,\n WIS: 10,\n CHA: 10,\n};\n\n/**\n * Build a Character with sensible defaults. The caller still emits the\n * CharacterCreated event when ready to add them to the campaign.\n */\nexport const createPC = (opts: CreatePCOptions): Character => {\n const level = opts.level ?? 1;\n return CharacterSchema.parse({\n id: opts.id ?? newCharacterId(),\n name: opts.name,\n speciesId: opts.speciesId,\n backgroundId: opts.backgroundId,\n classes: [{ classId: opts.classId, level, hitDiceRemaining: level }],\n abilityScores: opts.abilityScores ?? DEFAULT_ABILITY_SCORES,\n hp: { current: opts.hpCurrent ?? opts.hpMax, max: opts.hpMax, temp: 0 },\n featsTaken: opts.featsTaken ?? [],\n });\n};\n\nexport { SCHEMA_VERSION };\n\nvoid EventSchema; // ensure the Event type is included\nvoid ((): Event[] => []);\n","// Wallclock helpers. Used by planners that need to stamp events with the\n// current time when the caller did not supply one. Centralised here so the\n// behaviour is consistent across the engine and trivial to mock if needed.\n\nexport const nowIso = (): string => new Date().toISOString();\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type {\n LongRestEndedEvent,\n LongRestStartedEvent,\n ShortRestEndedEvent,\n ShortRestStartedEvent,\n} from '../../schemas/events/rest.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport { newEventId } from '../../ids.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../../engine/ids-utils.js';\n\nexport interface LongRestIntent {\n readonly type: 'LongRest';\n readonly participantIds: ReadonlyArray<string>;\n readonly at?: string;\n}\n\nexport interface ShortRestIntent {\n readonly type: 'ShortRest';\n readonly participantIds: ReadonlyArray<string>;\n readonly at?: string;\n}\n\nexport type RestIntent = LongRestIntent | ShortRestIntent;\n\nexport const planShortRest = (\n _state: CampaignState,\n intent: ShortRestIntent,\n): ReadonlyArray<Event> => {\n const at = intent.at ?? nowIso();\n const start: ShortRestStartedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ShortRestStarted',\n participantIds: [...intent.participantIds],\n };\n const end: ShortRestEndedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ShortRestEnded',\n causedByEventId: start.id,\n };\n return [start, end];\n};\n\nexport const planLongRest = (\n _state: CampaignState,\n intent: LongRestIntent,\n): ReadonlyArray<Event> => {\n const at = intent.at ?? nowIso();\n const start: LongRestStartedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'LongRestStarted',\n participantIds: [...intent.participantIds],\n };\n const end: LongRestEndedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'LongRestEnded',\n causedByEventId: start.id,\n };\n return [start, end];\n};\n","import type { Character } from '../schemas/runtime/character.js';\nimport type { ItemInstance } from '../schemas/runtime/item-instance.js';\nimport type { PendingChoice } from '../schemas/runtime/pending-choice.js';\nimport type { ResolvedContent } from '../content/pack.js';\nimport type { DamageComponent } from '../schemas/events/combat.js';\nimport type { DamageType } from '../schemas/primitives.js';\nimport { buildEffectStack } from './effect-stack.js';\n\nconst RESISTANCE_DIVISOR = 2;\nconst VULNERABILITY_MULTIPLIER = 2;\n\nexport interface MitigateDamageInput {\n readonly character: Character;\n readonly itemInstances: Readonly<Record<string, ItemInstance>>;\n readonly content: ResolvedContent;\n readonly pendingChoices?: Readonly<Record<string, PendingChoice>>;\n readonly rawComponents: ReadonlyArray<{ readonly amount: number; readonly type: DamageType }>;\n}\n\nconst halfRoundDown = (n: number): number => Math.floor(n / RESISTANCE_DIVISOR);\n\nexport const mitigateDamage = (input: MitigateDamageInput): DamageComponent[] => {\n const effects = buildEffectStack(input);\n return input.rawComponents.map((component) => {\n const rawAmount = component.amount;\n const flatReduction = effects.flatDamageReductionFor(component.type);\n const afterFlat = Math.max(0, rawAmount - flatReduction);\n\n if (effects.hasImmunity(component.type)) {\n return { amount: 0, type: component.type, rawAmount, mitigation: 'immune' };\n }\n if (effects.hasVulnerability(component.type)) {\n return {\n amount: afterFlat * VULNERABILITY_MULTIPLIER,\n type: component.type,\n rawAmount,\n mitigation: 'vulnerable',\n };\n }\n if (effects.hasResistance(component.type)) {\n return {\n amount: halfRoundDown(afterFlat),\n type: component.type,\n rawAmount,\n mitigation: 'resisted',\n };\n }\n if (flatReduction > 0) {\n return {\n amount: afterFlat,\n type: component.type,\n rawAmount,\n mitigation: 'resisted',\n };\n }\n return { amount: rawAmount, type: component.type };\n });\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { Character } from '../../schemas/runtime/character.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { Effect } from '../../schemas/effects.js';\nimport type { Predicate } from '../../schemas/predicate.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie, parseDiceExpression } from '../../rng/dice.js';\nimport { evaluatePredicate } from '../../effects/predicate.js';\nimport { collectEffectsFromCharacter } from '../../derive/effect-stack.js';\nimport { newEventId } from '../../ids.js';\nimport type { ULID } from '../ids-utils.js';\nimport type { DamageAppliedEvent } from '../../schemas/events/combat.js';\nimport type { TriggerFiredEvent } from '../../schemas/events/triggers.js';\n\ntype OnEventEffect = Extract<Effect, { kind: 'OnEvent' }>;\ntype AddDamageAction = Extract<OnEventEffect['actions'][number], { kind: 'AddDamage' }>;\n\nconst buildEventFacts = (event: Event, characterId: string): Map<string, unknown> => {\n const facts = new Map<string, unknown>([['event.type', event.type]]);\n if (event.type === 'AttackRolled') {\n facts.set('event.attackerIsSelf', event.attackerId === characterId);\n facts.set('event.targetIsSelf', event.targetId === characterId);\n facts.set('event.hit', event.hit);\n facts.set('event.critical', event.critical);\n facts.set('event.used', event.used);\n facts.set('event.weaponInstanceId', event.weaponInstanceId);\n } else if (event.type === 'DamageApplied') {\n facts.set('event.targetIsSelf', event.targetId === characterId);\n }\n return facts;\n};\n\nconst cadenceAllowsFiring = (\n character: Character,\n triggerId: string,\n oncePer: OnEventEffect['oncePer'],\n): boolean => {\n if (oncePer === undefined) return true;\n const counter = character.triggerCounters[triggerId];\n if (counter === undefined) return true;\n switch (oncePer) {\n case 'turn':\n return counter.firedThisTurn !== true;\n case 'round':\n return counter.firedThisRound !== true;\n case 'shortRest':\n return counter.firedThisShortRest !== true;\n case 'longRest':\n return counter.firedThisLongRest !== true;\n }\n};\n\nconst cadencePayload = (\n oncePer: OnEventEffect['oncePer'],\n): TriggerFiredEvent['cadence'] => {\n if (oncePer === undefined) return {};\n switch (oncePer) {\n case 'turn':\n return { firedThisTurn: true };\n case 'round':\n return { firedThisRound: true };\n case 'shortRest':\n return { firedThisShortRest: true };\n case 'longRest':\n return { firedThisLongRest: true };\n }\n};\n\nconst rollAddDamage = (\n action: AddDamageAction,\n rng: RNG,\n critical: boolean,\n): { amount: number; rolls: number[] } => {\n const parsed = parseDiceExpression(action.dice);\n const count = critical ? parsed.count * 2 : parsed.count;\n const rolls: number[] = [];\n for (let i = 0; i < count; i++) {\n rolls.push(rollDie(parsed.die, rng));\n }\n const amount = rolls.reduce((s, v) => s + v, 0) + parsed.modifier;\n return { amount: Math.max(0, amount), rolls };\n};\n\ninterface FiredTrigger {\n readonly events: Event[];\n readonly triggerId: string;\n readonly cadence: TriggerFiredEvent['cadence'];\n}\n\nconst fireAddDamage = (\n action: AddDamageAction,\n event: Event,\n rng: RNG,\n causedByEventId: string,\n): Event[] => {\n if (event.type !== 'AttackRolled') return [];\n const { amount } = rollAddDamage(action, rng, event.critical);\n if (amount <= 0) return [];\n const damageApplied: DamageAppliedEvent = {\n id: newEventId() as ULID,\n at: event.at,\n type: 'DamageApplied',\n targetId: event.targetId,\n components: [{ amount, type: action.damageType }],\n causedByEventId: causedByEventId as ULID,\n };\n return [damageApplied];\n};\n\nconst fireTrigger = (\n effect: OnEventEffect,\n character: Character,\n triggerId: string,\n event: Event,\n rng: RNG,\n at: string,\n): FiredTrigger | null => {\n const cadence = cadencePayload(effect.oncePer);\n const triggerFired: TriggerFiredEvent = {\n id: newEventId() as ULID,\n at,\n type: 'TriggerFired',\n characterId: character.id as ULID,\n triggerId,\n cadence,\n };\n const events: Event[] = [triggerFired];\n\n for (const action of effect.actions) {\n if (action.kind === 'AddDamage') {\n events.push(...fireAddDamage(action, event, rng, triggerFired.id));\n }\n }\n return { events, triggerId, cadence };\n};\n\nconst triggerIdOf = (effect: OnEventEffect, characterId: string): string => {\n const explicit = (effect as OnEventEffect & { id?: string }).id;\n if (typeof explicit === 'string') return `${characterId}:${explicit}`;\n const filterHash = JSON.stringify(effect.trigger);\n return `${characterId}:${effect.trigger.eventType}:${filterHash}`;\n};\n\nexport interface DispatchInput {\n readonly state: CampaignState;\n readonly content: ResolvedContent;\n readonly rng: RNG;\n readonly event: Event;\n readonly at: string;\n}\n\nexport const dispatchTriggers = (input: DispatchInput): Event[] => {\n const { state, content, rng, event, at } = input;\n const emitted: Event[] = [];\n for (const characterId of Object.keys(state.characters)) {\n const character = state.characters[characterId];\n if (character === undefined) continue;\n const effects = collectEffectsFromCharacter({\n character,\n content,\n itemInstances: state.itemInstances,\n pendingChoices: state.pendingChoices,\n });\n for (const effect of effects) {\n if (effect.kind !== 'OnEvent') continue;\n if (effect.trigger.eventType !== event.type) continue;\n const facts = buildEventFacts(event, characterId);\n const filter = effect.trigger.filter as Predicate | undefined;\n if (filter !== undefined && !evaluatePredicate(filter, { facts })) continue;\n const triggerId = triggerIdOf(effect, characterId);\n if (!cadenceAllowsFiring(character, triggerId, effect.oncePer)) continue;\n const fired = fireTrigger(effect, character, triggerId, event, rng, at);\n if (fired === null) continue;\n emitted.push(...fired.events);\n }\n }\n return emitted;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type {\n AttackRolledEvent,\n DamageRolledEvent,\n DamageRoll,\n} from '../../schemas/events/attack.js';\nimport type { DamageAppliedEvent } from '../../schemas/events/combat.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie, parseDiceExpression } from '../../rng/dice.js';\nimport { newEventId } from '../../ids.js';\nimport { computeAttackBonus } from '../../derive/attack.js';\nimport { computeAC } from '../../derive/ac.js';\nimport { abilityModifier } from '../../derive/ability.js';\nimport { computeActionEconomyBudget } from '../../derive/action-economy.js';\nimport { mitigateDamage } from '../../derive/damage-mitigation.js';\nimport { dispatchTriggers } from '../triggers/dispatch.js';\nimport { applyAll } from '../apply.js';\nimport { D20_SIDES, NAT_20, NAT_1 } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\nimport type { ActionEconomyConsumedEvent } from '../../schemas/events/action-economy.js';\n\nexport const COVER_KINDS = ['none', 'half', 'three-quarters', 'total'] as const;\nexport type CoverKind = (typeof COVER_KINDS)[number];\n\nconst HALF_COVER_AC_BONUS = 2;\nconst THREE_QUARTERS_COVER_AC_BONUS = 5;\n\nexport const coverACBonus = (cover: CoverKind): number => {\n switch (cover) {\n case 'half':\n return HALF_COVER_AC_BONUS;\n case 'three-quarters':\n return THREE_QUARTERS_COVER_AC_BONUS;\n case 'none':\n case 'total':\n return 0;\n }\n};\n\nexport interface AttackIntent {\n readonly type: 'Attack';\n readonly attackerId: string;\n readonly targetId: string;\n readonly weaponInstanceId: string;\n readonly advantage?: 'advantage' | 'disadvantage' | 'none';\n readonly cover?: CoverKind;\n readonly at?: string;\n}\n\nconst chooseDamageAbility = (\n attacker: { abilityScores: { STR: number; DEX: number } },\n weapon: { properties: ReadonlyArray<string>; attackKind: 'melee' | 'ranged' },\n): 'STR' | 'DEX' => {\n const isFinesse = weapon.properties.includes('finesse');\n const isRanged = weapon.attackKind === 'ranged';\n if (isRanged && !weapon.properties.includes('thrown')) return 'DEX';\n if (isFinesse) {\n return abilityModifier(attacker.abilityScores.DEX) >=\n abilityModifier(attacker.abilityScores.STR)\n ? 'DEX'\n : 'STR';\n }\n return 'STR';\n};\n\nexport interface ResolveAttackInput {\n readonly state: CampaignState;\n readonly content: ResolvedContent;\n readonly rng: RNG;\n readonly attackerId: string;\n readonly targetId: string;\n readonly weaponInstanceId: string;\n readonly advantage?: 'advantage' | 'disadvantage' | 'none';\n readonly cover?: CoverKind;\n readonly at: string;\n}\n\nexport const resolveAttack = (input: ResolveAttackInput): ReadonlyArray<Event> => {\n const { state, content, rng, at } = input;\n const attacker = state.characters[input.attackerId];\n if (!attacker) throw new Error(`Unknown attacker ${input.attackerId}`);\n const target = state.characters[input.targetId];\n if (!target) throw new Error(`Unknown target ${input.targetId}`);\n const weaponInstance = state.itemInstances[input.weaponInstanceId];\n if (!weaponInstance) throw new Error(`Unknown weapon ${input.weaponInstanceId}`);\n const weaponDef = content.items.get(weaponInstance.definitionId);\n if (!weaponDef || weaponDef.itemKind !== 'weapon') {\n throw new Error(`Item ${weaponInstance.definitionId} is not a weapon`);\n }\n\n const attackBonusResult = computeAttackBonus({\n character: attacker,\n itemInstances: state.itemInstances,\n content,\n weaponInstanceId: input.weaponInstanceId,\n });\n\n const cover = input.cover ?? 'none';\n if (cover === 'total') {\n throw new Error(`${target.name} has total cover and cannot be targeted`);\n }\n const acResultBase = computeAC({\n character: target,\n itemInstances: state.itemInstances,\n content,\n });\n const coverBonus = coverACBonus(cover);\n const acResult = { ...acResultBase, total: acResultBase.total + coverBonus };\n\n const advantage = input.advantage ?? 'none';\n const rolls: number[] = [rollDie(D20_SIDES, rng)];\n if (advantage !== 'none') {\n rolls.push(rollDie(D20_SIDES, rng));\n }\n const usedRoll =\n advantage === 'advantage'\n ? Math.max(...rolls)\n : advantage === 'disadvantage'\n ? Math.min(...rolls)\n : (rolls[0] ?? 0);\n const total = usedRoll + attackBonusResult.total;\n const naturalHit = usedRoll === NAT_20;\n const naturalMiss = usedRoll === NAT_1;\n const hit = !naturalMiss && (naturalHit || total >= acResult.total);\n const critical = naturalHit;\n\n const attackRolled: AttackRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'AttackRolled',\n attackerId: input.attackerId,\n targetId: input.targetId,\n weaponInstanceId: input.weaponInstanceId,\n d20: rolls,\n used: advantage,\n attackBonus: attackBonusResult.total,\n total,\n targetAC: acResult.total,\n hit,\n critical,\n };\n\n const stateAfterAttack = applyAll(state, [attackRolled]);\n const attackTriggers = dispatchTriggers({\n state: stateAfterAttack,\n content,\n rng,\n event: attackRolled,\n at,\n });\n\n if (!hit) {\n return [attackRolled, ...attackTriggers];\n }\n\n const damageAbility = chooseDamageAbility(attacker, weaponDef);\n const damageAbilityMod = abilityModifier(attacker.abilityScores[damageAbility]);\n const parsed = parseDiceExpression(weaponDef.damageDice);\n const totalRolls = critical ? parsed.count * 2 : parsed.count;\n const damageRolls: number[] = [];\n for (let i = 0; i < totalRolls; i++) {\n damageRolls.push(rollDie(parsed.die, rng));\n }\n const damageRollPayload: DamageRoll = {\n expression: weaponDef.damageDice,\n rolls: damageRolls,\n modifier: damageAbilityMod + parsed.modifier,\n type: weaponDef.damageType,\n };\n\n const damageRolled: DamageRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageRolled',\n attackerId: input.attackerId,\n targetId: input.targetId,\n weaponInstanceId: input.weaponInstanceId,\n rolls: [damageRollPayload],\n critical,\n causedByEventId: attackRolled.id,\n };\n\n const damageTotal = damageRolls.reduce((s, v) => s + v, 0) + damageRollPayload.modifier;\n const mitigatedComponents = mitigateDamage({\n character: target,\n itemInstances: state.itemInstances,\n content,\n rawComponents: [{ amount: Math.max(0, damageTotal), type: weaponDef.damageType }],\n });\n const damageApplied: DamageAppliedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageApplied',\n targetId: input.targetId,\n components: mitigatedComponents,\n causedByEventId: damageRolled.id,\n };\n\n return [attackRolled, ...attackTriggers, damageRolled, damageApplied];\n};\n\nexport const planAttack = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: AttackIntent,\n): ReadonlyArray<Event> => {\n const economyPrelude = planActionEconomyForAttack(state, content, intent);\n const at = intent.at ?? nowIso();\n const resolution = resolveAttack({\n state,\n content,\n rng,\n attackerId: intent.attackerId,\n targetId: intent.targetId,\n weaponInstanceId: intent.weaponInstanceId,\n ...(intent.cover !== undefined ? { cover: intent.cover } : {}),\n ...(intent.advantage !== undefined ? { advantage: intent.advantage } : {}),\n at,\n });\n return [...economyPrelude, ...resolution];\n};\n\nconst findActiveCombatant = (\n state: CampaignState,\n attackerId: string,\n): { encounterId: string; attacksMadeThisTurn: number; actionUsed: boolean } | undefined => {\n const encounterId = state.activeEncounterId;\n if (encounterId === undefined) return undefined;\n const encounter = state.encounters[encounterId];\n if (!encounter || encounter.status !== 'active') return undefined;\n const active = encounter.combatants[encounter.activeIndex];\n if (!active || active.combatantId !== attackerId) return undefined;\n return {\n encounterId,\n attacksMadeThisTurn: active.turnUsage.attacksMadeThisTurn,\n actionUsed: active.turnUsage.actionUsed,\n };\n};\n\nconst planActionEconomyForAttack = (\n state: CampaignState,\n content: ResolvedContent,\n intent: AttackIntent,\n): ReadonlyArray<Event> => {\n const attacker = state.characters[intent.attackerId];\n if (!attacker) return [];\n const active = findActiveCombatant(state, intent.attackerId);\n if (active === undefined) return [];\n\n const budget = computeActionEconomyBudget({\n character: attacker,\n itemInstances: state.itemInstances,\n content,\n });\n\n if (active.attacksMadeThisTurn >= budget.maxAttacksPerAction) {\n throw new Error(\n `Attack budget exhausted: ${attacker.name} has already made ${active.attacksMadeThisTurn} attacks this turn (max ${budget.maxAttacksPerAction})`,\n );\n }\n\n const at = intent.at ?? nowIso();\n const events: ActionEconomyConsumedEvent[] = [];\n if (!active.actionUsed) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId: active.encounterId,\n combatantId: intent.attackerId,\n kind: 'action',\n });\n }\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId: active.encounterId,\n combatantId: intent.attackerId,\n kind: 'attack',\n });\n return events;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { ActionEconomyConsumedEvent } from '../../schemas/events/action-economy.js';\nimport type { RNG } from '../../rng/index.js';\nimport { newEventId } from '../../ids.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { resolveAttack } from './attack.js';\nimport type { ULID } from '../ids-utils.js';\n\nexport interface OpportunityAttackIntent {\n readonly type: 'OpportunityAttack';\n readonly reactorId: string;\n readonly targetId: string;\n readonly weaponInstanceId: string;\n readonly advantage?: 'advantage' | 'disadvantage' | 'none';\n readonly at?: string;\n}\n\ninterface ReactionEligibility {\n readonly encounterId: string;\n readonly reactionUsedThisRound: boolean;\n readonly isActiveCombatant: boolean;\n}\n\nconst findReactor = (\n state: CampaignState,\n reactorId: string,\n): ReactionEligibility | undefined => {\n const encounterId = state.activeEncounterId;\n if (encounterId === undefined) return undefined;\n const encounter = state.encounters[encounterId];\n if (!encounter || encounter.status !== 'active') return undefined;\n const reactor = encounter.combatants.find((c) => c.combatantId === reactorId);\n if (reactor === undefined) return undefined;\n const active = encounter.combatants[encounter.activeIndex];\n return {\n encounterId,\n reactionUsedThisRound: reactor.turnUsage.reactionUsedThisRound,\n isActiveCombatant: active?.combatantId === reactorId,\n };\n};\n\nexport const planOpportunityAttack = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: OpportunityAttackIntent,\n): ReadonlyArray<Event> => {\n const reactor = state.characters[intent.reactorId];\n if (!reactor) throw new Error(`Unknown reactor ${intent.reactorId}`);\n\n const eligibility = findReactor(state, intent.reactorId);\n if (eligibility === undefined) {\n throw new Error(\n `Opportunity attacks require an active encounter that includes the reactor`,\n );\n }\n if (eligibility.isActiveCombatant) {\n throw new Error(\n `${reactor.name} cannot take an opportunity attack on their own turn`,\n );\n }\n if (eligibility.reactionUsedThisRound) {\n throw new Error(`${reactor.name} has already used their reaction this round`);\n }\n\n const at = intent.at ?? nowIso();\n const reactionConsumed: ActionEconomyConsumedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId: eligibility.encounterId,\n combatantId: intent.reactorId,\n kind: 'reaction',\n };\n const resolution = resolveAttack({\n state,\n content,\n rng,\n attackerId: intent.reactorId,\n targetId: intent.targetId,\n weaponInstanceId: intent.weaponInstanceId,\n ...(intent.advantage !== undefined ? { advantage: intent.advantage } : {}),\n at,\n });\n return [reactionConsumed, ...resolution];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type {\n EncounterCreatedEvent,\n EncounterEndedEvent,\n EncounterStartedEvent,\n InitiativeRolledEvent,\n InitiativeRoll,\n RoundEndedEvent,\n TurnEndedEvent,\n TurnStartedEvent,\n} from '../../schemas/events/encounter.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId, newEncounterId } from '../../ids.js';\nimport { abilityModifier } from '../../derive/ability.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\n\nexport interface CreateEncounterIntent {\n readonly type: 'CreateEncounter';\n readonly combatantIds: ReadonlyArray<string>;\n readonly name?: string;\n readonly encounterId?: string;\n readonly at?: string;\n}\n\nexport const planCreateEncounter = (\n _state: CampaignState,\n _content: ResolvedContent,\n intent: CreateEncounterIntent,\n): { events: ReadonlyArray<Event>; encounterId: string } => {\n const encounterId = intent.encounterId ?? newEncounterId();\n const at = intent.at ?? nowIso();\n const event: EncounterCreatedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'EncounterCreated',\n encounterId,\n ...(intent.name !== undefined ? { name: intent.name } : {}),\n combatantIds: [...intent.combatantIds],\n };\n return { events: [event], encounterId };\n};\n\nexport interface RollInitiativeIntent {\n readonly type: 'RollInitiative';\n readonly encounterId: string;\n readonly at?: string;\n}\n\nexport const planRollInitiative = (\n state: CampaignState,\n _content: ResolvedContent,\n rng: RNG,\n intent: RollInitiativeIntent,\n): ReadonlyArray<Event> => {\n const encounter = state.encounters[intent.encounterId];\n if (!encounter) throw new Error(`Unknown encounter ${intent.encounterId}`);\n const at = intent.at ?? nowIso();\n const rolls: InitiativeRoll[] = encounter.combatants.map((c) => {\n const character = state.characters[c.combatantId];\n const dexMod = character ? abilityModifier(character.abilityScores.DEX) : 0;\n const d20 = rollDie(D20_SIDES, rng);\n return {\n combatantId: c.combatantId,\n d20,\n modifier: dexMod,\n total: d20 + dexMod,\n };\n });\n const event: InitiativeRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'InitiativeRolled',\n encounterId: intent.encounterId,\n rolls,\n };\n return [event];\n};\n\nexport interface StartEncounterIntent {\n readonly type: 'StartEncounter';\n readonly encounterId: string;\n readonly at?: string;\n}\n\nexport const planStartEncounter = (\n _state: CampaignState,\n _content: ResolvedContent,\n intent: StartEncounterIntent,\n): ReadonlyArray<Event> => {\n const event: EncounterStartedEvent = {\n id: newEventId() as ULID,\n at: intent.at ?? nowIso(),\n type: 'EncounterStarted',\n encounterId: intent.encounterId,\n };\n return [event];\n};\n\nexport interface AdvanceTurnIntent {\n readonly type: 'AdvanceTurn';\n readonly encounterId: string;\n readonly at?: string;\n}\n\nexport const planAdvanceTurn = (\n state: CampaignState,\n _content: ResolvedContent,\n intent: AdvanceTurnIntent,\n): ReadonlyArray<Event> => {\n const encounter = state.encounters[intent.encounterId];\n if (!encounter) throw new Error(`Unknown encounter ${intent.encounterId}`);\n const at = intent.at ?? nowIso();\n const current = encounter.combatants[encounter.activeIndex];\n if (!current) throw new Error('No active combatant');\n const turnEnd: TurnEndedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'TurnEnded',\n encounterId: intent.encounterId,\n combatantId: current.combatantId,\n round: encounter.round,\n };\n const isLast = encounter.activeIndex >= encounter.combatants.length - 1;\n if (isLast) {\n const roundEnd: RoundEndedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'RoundEnded',\n encounterId: intent.encounterId,\n round: encounter.round,\n };\n const first = encounter.combatants[0];\n if (!first) throw new Error('No combatants');\n const nextTurn: TurnStartedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'TurnStarted',\n encounterId: intent.encounterId,\n combatantId: first.combatantId,\n round: encounter.round + 1,\n };\n return [turnEnd, roundEnd, nextTurn];\n }\n const next = encounter.combatants[encounter.activeIndex + 1];\n if (!next) throw new Error('Bad combatant index');\n const nextTurn: TurnStartedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'TurnStarted',\n encounterId: intent.encounterId,\n combatantId: next.combatantId,\n round: encounter.round,\n };\n return [turnEnd, nextTurn];\n};\n\nexport interface BeginFirstTurnIntent {\n readonly type: 'BeginFirstTurn';\n readonly encounterId: string;\n readonly at?: string;\n}\n\nexport const planBeginFirstTurn = (\n state: CampaignState,\n _content: ResolvedContent,\n intent: BeginFirstTurnIntent,\n): ReadonlyArray<Event> => {\n const encounter = state.encounters[intent.encounterId];\n if (!encounter) throw new Error(`Unknown encounter ${intent.encounterId}`);\n const first = encounter.combatants[0];\n if (!first) throw new Error('No combatants');\n const turnStart: TurnStartedEvent = {\n id: newEventId() as ULID,\n at: intent.at ?? nowIso(),\n type: 'TurnStarted',\n encounterId: intent.encounterId,\n combatantId: first.combatantId,\n round: encounter.round,\n };\n return [turnStart];\n};\n\nexport interface EndEncounterIntent {\n readonly type: 'EndEncounter';\n readonly encounterId: string;\n readonly outcome: 'victory' | 'defeat' | 'fled' | 'parley';\n readonly at?: string;\n}\n\nexport const planEndEncounter = (\n _state: CampaignState,\n _content: ResolvedContent,\n intent: EndEncounterIntent,\n): ReadonlyArray<Event> => {\n const event: EncounterEndedEvent = {\n id: newEventId() as ULID,\n at: intent.at ?? nowIso(),\n type: 'EncounterEnded',\n encounterId: intent.encounterId,\n outcome: intent.outcome,\n };\n return [event];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type {\n ChoiceRequiredEvent,\n ChoiceResolvedEvent,\n HPStrategy,\n LevelUpResolvedEvent,\n} from '../../schemas/events/level-up.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newChoiceId, newEventId } from '../../ids.js';\nimport { abilityModifier } from '../../derive/ability.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\nimport type { Effect } from '../../schemas/effects.js';\n\nconst HP_AVERAGE_BY_DIE: Record<number, number> = { 6: 4, 8: 5, 10: 6, 12: 7 };\n\nexport interface LevelUpIntent {\n readonly type: 'LevelUp';\n readonly characterId: string;\n readonly classId: string;\n readonly hpStrategy: HPStrategy;\n readonly at?: string;\n}\n\nexport const planLevelUp = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: LevelUpIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n if (character.pendingChoiceIds.some((id) => state.pendingChoices[id]?.resolution === undefined)) {\n throw new Error('Character has unresolved choices from a previous level-up');\n }\n const enrollment = character.classes.find((c) => c.classId === intent.classId);\n if (!enrollment) throw new Error(`Character has no enrollment in ${intent.classId}`);\n if (enrollment.level >= 20) throw new Error('Already at max level');\n const cls = content.classes.get(intent.classId);\n if (!cls) throw new Error(`Unknown class ${intent.classId}`);\n\n const newClassLevel = enrollment.level + 1;\n const die = cls.hitDie;\n const conMod = abilityModifier(character.abilityScores.CON);\n\n let hpRoll: number | undefined;\n let baseGain: number;\n if (intent.hpStrategy === 'roll') {\n hpRoll = rollDie(die, rng);\n baseGain = hpRoll;\n } else {\n const avg = HP_AVERAGE_BY_DIE[die];\n if (avg === undefined) throw new Error(`No HP average for d${die}`);\n baseGain = avg;\n }\n const hpGained = Math.max(1, baseGain + conMod);\n const at = intent.at ?? nowIso();\n\n const levelUp: LevelUpResolvedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'LevelUpResolved',\n characterId: intent.characterId,\n classId: intent.classId,\n newClassLevel,\n hpStrategy: intent.hpStrategy,\n ...(hpRoll !== undefined ? { hpRoll } : {}),\n hpGained,\n };\n\n const events: Event[] = [levelUp];\n\n const newLevelEntry = cls.levelTable[String(newClassLevel)];\n if (newLevelEntry !== undefined) {\n for (const feature of newLevelEntry.features) {\n for (const effect of feature.effects) {\n if (effect.kind === 'OfferChoice' && effect.when !== 'onLongRest') {\n const choice: ChoiceRequiredEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ChoiceRequired',\n choiceId: newChoiceId(),\n characterId: intent.characterId,\n promptKey: effect.choiceId,\n prompt: effect.prompt,\n options: effect.options.map((o) => ({\n id: o.id,\n label: o.label,\n effects: o.effects as Effect[],\n })),\n oneOf: effect.oneOf,\n causedByEventId: levelUp.id,\n };\n events.push(choice);\n }\n }\n }\n }\n\n return events;\n};\n\nexport interface ResolveChoiceIntent {\n readonly type: 'ResolveChoice';\n readonly choiceId: string;\n readonly characterId: string;\n readonly selectedOptionIds: ReadonlyArray<string>;\n readonly at?: string;\n}\n\nexport const planResolveChoice = (\n state: CampaignState,\n _content: ResolvedContent,\n intent: ResolveChoiceIntent,\n): ReadonlyArray<Event> => {\n const choice = state.pendingChoices[intent.choiceId];\n if (!choice) throw new Error(`Unknown choice ${intent.choiceId}`);\n if (choice.resolution !== undefined) {\n throw new Error(`Choice ${intent.choiceId} already resolved`);\n }\n if (choice.forCharacterId !== intent.characterId) {\n throw new Error(`Choice ${intent.choiceId} belongs to a different character`);\n }\n if (intent.selectedOptionIds.length !== choice.oneOf) {\n throw new Error(\n `Expected exactly ${choice.oneOf} selection(s), got ${intent.selectedOptionIds.length}`,\n );\n }\n for (const id of intent.selectedOptionIds) {\n if (!choice.options.some((o) => o.id === id)) {\n throw new Error(`Option ${id} not in choice ${intent.choiceId}`);\n }\n }\n const event: ChoiceResolvedEvent = {\n id: newEventId() as ULID,\n at: intent.at ?? nowIso(),\n type: 'ChoiceResolved',\n choiceId: intent.choiceId,\n characterId: intent.characterId,\n selectedOptionIds: [...intent.selectedOptionIds],\n };\n return [event];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type {\n AbilityCheckRolledEvent,\n CheckAdvantage,\n SaveRolledEvent,\n} from '../../schemas/events/checks.js';\nimport type { AbilityScore, Skill } from '../../schemas/primitives.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId } from '../../ids.js';\nimport { computeSavingThrow } from '../../derive/save.js';\nimport { computeAbilityCheck } from '../../derive/ability-check.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\n\nconst rollWithAdvantage = (\n rng: RNG,\n advantage: CheckAdvantage,\n): { rolls: number[]; used: number } => {\n const first = rollDie(D20_SIDES, rng);\n if (advantage === 'none') return { rolls: [first], used: first };\n const second = rollDie(D20_SIDES, rng);\n const used = advantage === 'advantage' ? Math.max(first, second) : Math.min(first, second);\n return { rolls: [first, second], used };\n};\n\nconst resolveAdvantage = (\n requested: CheckAdvantage | undefined,\n derivedAdv: boolean,\n derivedDis: boolean,\n): CheckAdvantage => {\n if (requested !== undefined && requested !== 'none') return requested;\n if (derivedAdv && !derivedDis) return 'advantage';\n if (derivedDis && !derivedAdv) return 'disadvantage';\n return 'none';\n};\n\nexport interface SaveIntent {\n readonly type: 'Save';\n readonly characterId: string;\n readonly ability: AbilityScore;\n readonly dc: number;\n readonly advantage?: CheckAdvantage;\n readonly at?: string;\n}\n\nexport const planSave = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: SaveIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n const derivation = computeSavingThrow({\n character,\n itemInstances: state.itemInstances,\n content,\n ability: intent.ability,\n pendingChoices: state.pendingChoices,\n });\n const used = resolveAdvantage(\n intent.advantage,\n derivation.hasAdvantage,\n derivation.hasDisadvantage,\n );\n const { rolls, used: d20 } = rollWithAdvantage(rng, used);\n const total = d20 + derivation.total;\n const event: SaveRolledEvent = {\n id: newEventId() as ULID,\n at: intent.at ?? nowIso(),\n type: 'SaveRolled',\n targetId: intent.characterId,\n ability: intent.ability,\n dc: intent.dc,\n d20: rolls,\n used,\n bonus: derivation.total,\n total,\n success: total >= intent.dc,\n };\n return [event];\n};\n\nexport interface AbilityCheckIntent {\n readonly type: 'AbilityCheck';\n readonly characterId: string;\n readonly ability: AbilityScore;\n readonly skill?: Skill;\n readonly dc?: number;\n readonly advantage?: CheckAdvantage;\n readonly at?: string;\n}\n\nexport const planAbilityCheck = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: AbilityCheckIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n const derivation = computeAbilityCheck({\n character,\n itemInstances: state.itemInstances,\n content,\n ability: intent.ability,\n ...(intent.skill !== undefined ? { skill: intent.skill } : {}),\n pendingChoices: state.pendingChoices,\n });\n const used = resolveAdvantage(\n intent.advantage,\n derivation.hasAdvantage,\n derivation.hasDisadvantage,\n );\n const { rolls, used: d20 } = rollWithAdvantage(rng, used);\n const total = d20 + derivation.total;\n const event: AbilityCheckRolledEvent = {\n id: newEventId() as ULID,\n at: intent.at ?? nowIso(),\n type: 'AbilityCheckRolled',\n characterId: intent.characterId,\n ability: intent.ability,\n ...(intent.skill !== undefined ? { skill: intent.skill } : {}),\n ...(intent.dc !== undefined ? { dc: intent.dc, success: total >= intent.dc } : {}),\n d20: rolls,\n used,\n bonus: derivation.total,\n total,\n };\n return [event];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type {\n PactSlotConsumedEvent,\n SpellCastDeclaredEvent,\n SpellSlotConsumedEvent,\n SpellSlotSource,\n} from '../../schemas/events/spellcasting.js';\nimport type {\n AttackRolledEvent,\n DamageRolledEvent,\n DamageRoll,\n} from '../../schemas/events/attack.js';\nimport type {\n DamageAppliedEvent,\n ConditionAppliedEvent,\n HealedEvent,\n} from '../../schemas/events/combat.js';\nimport type { SaveRolledEvent } from '../../schemas/events/checks.js';\nimport type {\n ConcentrationBrokenEvent,\n ConcentrationStartedEvent,\n} from '../../schemas/events/concentration.js';\nimport type { Spell, SpellMechanic } from '../../schemas/content/spell.js';\nimport { cantripExtraDice } from '../../schemas/content/spell.js';\nimport type { Character } from '../../schemas/runtime/character.js';\nimport { computeTotalLevel } from '../../schemas/runtime/character.js';\nimport type { AppliedConditionRef } from '../../schemas/runtime/effect-instance.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie, parseDiceExpression } from '../../rng/dice.js';\nimport { newAppliedConditionId, newEffectInstanceId, newEventId } from '../../ids.js';\nimport { computeSpellSaveDC, computeSpellAttackBonus } from '../../derive/spell-dc.js';\nimport { computeAvailableSpellSlots } from '../../derive/spell-slots.js';\nimport { computeAC } from '../../derive/ac.js';\nimport { computeSavingThrow } from '../../derive/save.js';\nimport { abilityModifier } from '../../derive/ability.js';\nimport { mitigateDamage } from '../../derive/damage-mitigation.js';\nimport {\n CANTRIP_LEVEL,\n D20_SIDES,\n NAT_1,\n NAT_20,\n} from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\n\nexport interface CastSpellIntent {\n readonly type: 'CastSpell';\n readonly characterId: string;\n readonly spellId: string;\n readonly slotLevel: number;\n readonly slotSource?: SpellSlotSource;\n readonly targetIds: ReadonlyArray<string>;\n readonly castingClassId?: string;\n readonly asRitual?: boolean;\n readonly at?: string;\n}\n\nconst findCastingClass = (\n character: Character,\n content: ResolvedContent,\n preferred?: string,\n): string => {\n if (preferred !== undefined) return preferred;\n for (const enrollment of character.classes) {\n const cls = content.classes.get(enrollment.classId);\n if (cls?.spellcasting !== undefined) return enrollment.classId;\n }\n throw new Error(`Character has no spellcasting class`);\n};\n\nconst characterKnowsSpell = (character: Character, spellId: string): boolean =>\n character.knownSpells.includes(spellId) || character.preparedSpells.includes(spellId);\n\nconst chooseSlotSource = (\n spell: Spell,\n intent: CastSpellIntent,\n state: CampaignState,\n content: ResolvedContent,\n): SpellSlotSource => {\n if (intent.slotSource !== undefined) return intent.slotSource;\n if (spell.level === CANTRIP_LEVEL) return 'standard';\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n const available = computeAvailableSpellSlots(character, content.classes);\n if (\n available.pact !== undefined &&\n available.pact.count > 0 &&\n intent.slotLevel <= available.pact.level\n ) {\n return 'pact';\n }\n return 'standard';\n};\n\nconst rollDamage = (\n baseExpression: string,\n bonusDice: number,\n rng: RNG,\n doubleDice: boolean,\n): { rolls: number[]; modifier: number } => {\n const parsed = parseDiceExpression(baseExpression);\n const totalDieCount = (parsed.count + bonusDice) * (doubleDice ? 2 : 1);\n const rolls: number[] = [];\n for (let i = 0; i < totalDieCount; i++) {\n rolls.push(rollDie(parsed.die, rng));\n }\n return { rolls, modifier: parsed.modifier };\n};\n\nconst rollCantripScaling = (\n scalingExpression: string | undefined,\n extraSteps: number,\n rng: RNG,\n doubleDice: boolean,\n): number[] => {\n if (scalingExpression === undefined || extraSteps <= 0) return [];\n const parsed = parseDiceExpression(scalingExpression);\n const dieCount = parsed.count * extraSteps * (doubleDice ? 2 : 1);\n const rolls: number[] = [];\n for (let i = 0; i < dieCount; i++) {\n rolls.push(rollDie(parsed.die, rng));\n }\n return rolls;\n};\n\nconst halveDamage = (totalDamage: number): number => Math.floor(totalDamage / 2);\n\nconst planAttackMechanic = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: CastSpellIntent,\n spell: Spell,\n mechanic: Extract<SpellMechanic, { kind: 'attack' }>,\n declaredEventId: string,\n at: string,\n castingClassId: string,\n): Event[] => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n const attackBonus = computeSpellAttackBonus({\n character,\n itemInstances: state.itemInstances,\n content,\n classId: castingClassId,\n });\n const bonusDice = (mechanic.extraDicePerSlotLevel ?? 0) * Math.max(0, intent.slotLevel - spell.level);\n const cantripSteps = spell.level === CANTRIP_LEVEL ? cantripExtraDice(computeTotalLevel(character)) : 0;\n const events: Event[] = [];\n for (const targetId of intent.targetIds) {\n const target = state.characters[targetId];\n if (!target) continue;\n const targetAC = computeAC({\n character: target,\n itemInstances: state.itemInstances,\n content,\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + attackBonus.total;\n const isCrit = d20 === NAT_20;\n const isMiss = d20 === NAT_1;\n const hit = !isMiss && (isCrit || total >= targetAC.total);\n\n const attackEvent: AttackRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'AttackRolled',\n attackerId: intent.characterId,\n targetId,\n weaponInstanceId: intent.spellId as ULID,\n d20: [d20],\n used: 'none',\n attackBonus: attackBonus.total,\n total,\n targetAC: targetAC.total,\n hit,\n critical: isCrit,\n causedByEventId: declaredEventId as ULID,\n };\n events.push(attackEvent);\n\n if (!hit) continue;\n\n const { rolls: baseRolls, modifier } = rollDamage(mechanic.damageDice, bonusDice, rng, isCrit);\n const scalingRolls = rollCantripScaling(mechanic.cantripScalingDice, cantripSteps, rng, isCrit);\n const rolls = [...baseRolls, ...scalingRolls];\n const damageTotal = rolls.reduce((s, v) => s + v, 0) + modifier;\n const damageRolled: DamageRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageRolled',\n attackerId: intent.characterId,\n targetId,\n weaponInstanceId: intent.spellId as ULID,\n rolls: [\n {\n expression: mechanic.damageDice,\n rolls,\n modifier,\n type: mechanic.damageType,\n } satisfies DamageRoll,\n ],\n critical: isCrit,\n causedByEventId: attackEvent.id,\n };\n events.push(damageRolled);\n const mitigated = mitigateDamage({\n character: target,\n itemInstances: state.itemInstances,\n content,\n rawComponents: [{ amount: Math.max(0, damageTotal), type: mechanic.damageType }],\n });\n const damageApplied: DamageAppliedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageApplied',\n targetId,\n components: mitigated,\n causedByEventId: damageRolled.id,\n };\n events.push(damageApplied);\n }\n return events;\n};\n\ninterface SaveMechanicOutcome {\n readonly events: Event[];\n readonly conditionsApplied: AppliedConditionRef[];\n}\n\nconst planSaveMechanic = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: CastSpellIntent,\n spell: Spell,\n mechanic: Extract<SpellMechanic, { kind: 'save' }>,\n declaredEventId: string,\n at: string,\n castingClassId: string,\n): SaveMechanicOutcome => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n const dcResult = computeSpellSaveDC({\n character,\n itemInstances: state.itemInstances,\n content,\n classId: castingClassId,\n });\n const bonusDice = (mechanic.extraDicePerSlotLevel ?? 0) * Math.max(0, intent.slotLevel - spell.level);\n const cantripSteps = spell.level === CANTRIP_LEVEL ? cantripExtraDice(computeTotalLevel(character)) : 0;\n const events: Event[] = [];\n const conditionsApplied: AppliedConditionRef[] = [];\n\n for (const targetId of intent.targetIds) {\n const target = state.characters[targetId];\n if (!target) continue;\n const saveDerivation = computeSavingThrow({\n character: target,\n itemInstances: state.itemInstances,\n content,\n ability: mechanic.ability,\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + saveDerivation.total;\n const success = total >= dcResult.total;\n const saveEvent: SaveRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'SaveRolled',\n targetId,\n ability: mechanic.ability,\n dc: dcResult.total,\n d20: [d20],\n used: 'none',\n bonus: saveDerivation.total,\n total,\n success,\n causedByEventId: declaredEventId as ULID,\n };\n events.push(saveEvent);\n\n if (mechanic.damageDice !== undefined && mechanic.damageType !== undefined) {\n const { rolls: baseRolls, modifier } = rollDamage(mechanic.damageDice, bonusDice, rng, false);\n const scalingRolls = rollCantripScaling(mechanic.cantripScalingDice, cantripSteps, rng, false);\n const rolls = [...baseRolls, ...scalingRolls];\n const raw = rolls.reduce((s, v) => s + v, 0) + modifier;\n const finalAmount = success && mechanic.halfOnSuccess === true ? halveDamage(raw) : success ? 0 : raw;\n if (finalAmount > 0) {\n const mitigated = mitigateDamage({\n character: target,\n itemInstances: state.itemInstances,\n content,\n rawComponents: [{ amount: finalAmount, type: mechanic.damageType }],\n });\n const damageApplied: DamageAppliedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageApplied',\n targetId,\n components: mitigated,\n causedByEventId: saveEvent.id,\n };\n events.push(damageApplied);\n }\n }\n if (!success && mechanic.conditionOnFail !== undefined) {\n const appliedConditionId = newAppliedConditionId();\n const cond: ConditionAppliedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId,\n conditionId: mechanic.conditionOnFail,\n appliedConditionId,\n causedByEventId: saveEvent.id,\n };\n events.push(cond);\n conditionsApplied.push({\n targetId: targetId as ULID,\n conditionId: mechanic.conditionOnFail,\n appliedConditionId,\n });\n }\n }\n return { events, conditionsApplied };\n};\n\nconst planHealMechanic = (\n state: CampaignState,\n rng: RNG,\n intent: CastSpellIntent,\n spell: Spell,\n mechanic: Extract<SpellMechanic, { kind: 'heal' }>,\n declaredEventId: string,\n at: string,\n): Event[] => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n const castingAbilityMod = abilityModifier(character.abilityScores.WIS);\n const bonusDice = (mechanic.extraDicePerSlotLevel ?? 0) * Math.max(0, intent.slotLevel - spell.level);\n const events: Event[] = [];\n for (const targetId of intent.targetIds) {\n const { rolls, modifier } = rollDamage(mechanic.amountDice, bonusDice, rng, false);\n const amount = Math.max(0, rolls.reduce((s, v) => s + v, 0) + modifier + castingAbilityMod);\n const heal: HealedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'Healed',\n targetId,\n amount,\n source: spell.id,\n causedByEventId: declaredEventId as ULID,\n };\n events.push(heal);\n }\n return events;\n};\n\nexport const planCastSpell = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: CastSpellIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n const spell = content.spells.get(intent.spellId);\n if (!spell) throw new Error(`Unknown spell ${intent.spellId}`);\n if (!characterKnowsSpell(character, intent.spellId)) {\n throw new Error(`Character does not know or prepare spell ${intent.spellId}`);\n }\n if (intent.slotLevel < spell.level) {\n throw new Error(\n `Slot level ${intent.slotLevel} insufficient for spell level ${spell.level}`,\n );\n }\n\n const castingClassId = findCastingClass(character, content, intent.castingClassId);\n const slotSource = chooseSlotSource(spell, intent, state, content);\n\n const castAsRitual = intent.asRitual === true;\n if (castAsRitual && spell.ritual !== true) {\n throw new Error(`Spell ${spell.id} cannot be cast as a ritual`);\n }\n\n if (spell.level > CANTRIP_LEVEL && !castAsRitual) {\n const available = computeAvailableSpellSlots(character, content.classes);\n if (slotSource === 'pact') {\n if (available.pact === undefined || available.pact.count <= 0) {\n throw new Error('No pact slots available');\n }\n if (intent.slotLevel !== available.pact.level) {\n throw new Error(\n `Pact slots are level ${available.pact.level}; requested level ${intent.slotLevel}`,\n );\n }\n } else {\n const slotsLeft = available.standardByLevel[intent.slotLevel - 1] ?? 0;\n if (slotsLeft <= 0) {\n throw new Error(`No spell slots of level ${intent.slotLevel} available`);\n }\n }\n }\n\n const at = intent.at ?? nowIso();\n const declared: SpellCastDeclaredEvent = {\n id: newEventId() as ULID,\n at,\n type: 'SpellCastDeclared',\n characterId: intent.characterId,\n spellId: intent.spellId,\n slotLevel: intent.slotLevel,\n slotSource,\n targetIds: [...intent.targetIds],\n castAsRitual,\n };\n const events: Event[] = [declared];\n\n if (spell.level > CANTRIP_LEVEL && !castAsRitual) {\n if (slotSource === 'pact') {\n const consumed: PactSlotConsumedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'PactSlotConsumed',\n characterId: intent.characterId,\n causedByEventId: declared.id,\n };\n events.push(consumed);\n } else {\n const consumed: SpellSlotConsumedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'SpellSlotConsumed',\n characterId: intent.characterId,\n slotLevel: intent.slotLevel,\n causedByEventId: declared.id,\n };\n events.push(consumed);\n }\n }\n\n const conditionsApplied: AppliedConditionRef[] = [];\n for (const mechanic of spell.mechanicalEffects) {\n if (mechanic.kind === 'attack') {\n events.push(\n ...planAttackMechanic(state, content, rng, intent, spell, mechanic, declared.id, at, castingClassId),\n );\n } else if (mechanic.kind === 'save') {\n const outcome = planSaveMechanic(\n state, content, rng, intent, spell, mechanic, declared.id, at, castingClassId,\n );\n events.push(...outcome.events);\n conditionsApplied.push(...outcome.conditionsApplied);\n } else {\n events.push(...planHealMechanic(state, rng, intent, spell, mechanic, declared.id, at));\n }\n }\n\n if (spell.concentration === true) {\n if (character.concentrationEffectId !== undefined) {\n const priorBroken: ConcentrationBrokenEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ConcentrationBroken',\n effectInstanceId: character.concentrationEffectId,\n casterId: intent.characterId as ULID,\n reason: 'newConcentrationSpell',\n causedByEventId: declared.id,\n };\n events.push(priorBroken);\n }\n const started: ConcentrationStartedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ConcentrationStarted',\n effectInstanceId: newEffectInstanceId(),\n casterId: intent.characterId as ULID,\n spellId: intent.spellId,\n targetIds: [...intent.targetIds] as ULID[],\n conditionsApplied,\n causedByEventId: declared.id,\n };\n events.push(started);\n }\n\n return events;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { ConcentrationBrokenEvent } from '../../schemas/events/concentration.js';\nimport type { SaveRolledEvent } from '../../schemas/events/checks.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId } from '../../ids.js';\nimport { computeSavingThrow } from '../../derive/save.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\n\nconst CONCENTRATION_MIN_DC = 10;\nconst CONCENTRATION_DC_DIVISOR = 2;\n\nexport interface CheckConcentrationIntent {\n readonly type: 'CheckConcentration';\n readonly characterId: string;\n readonly damageTaken: number;\n readonly at?: string;\n}\n\nconst concentrationDC = (damageTaken: number): number =>\n Math.max(CONCENTRATION_MIN_DC, Math.floor(damageTaken / CONCENTRATION_DC_DIVISOR));\n\nexport const planCheckConcentration = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: CheckConcentrationIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n if (character.concentrationEffectId === undefined) {\n return [];\n }\n if (intent.damageTaken <= 0) {\n return [];\n }\n\n const at = intent.at ?? nowIso();\n const dc = concentrationDC(intent.damageTaken);\n const saveDerivation = computeSavingThrow({\n character,\n itemInstances: state.itemInstances,\n content,\n ability: 'CON',\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + saveDerivation.total;\n const success = total >= dc;\n\n const save: SaveRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'SaveRolled',\n targetId: intent.characterId as ULID,\n ability: 'CON',\n dc,\n d20: [d20],\n used: 'none',\n bonus: saveDerivation.total,\n total,\n success,\n };\n const events: Event[] = [save];\n\n if (!success) {\n const broken: ConcentrationBrokenEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ConcentrationBroken',\n effectInstanceId: character.concentrationEffectId,\n casterId: intent.characterId as ULID,\n reason: 'failedSave',\n causedByEventId: save.id,\n };\n events.push(broken);\n }\n return events;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { Position } from '../../schemas/runtime/encounter.js';\nimport type { Combatant } from '../../schemas/runtime/encounter.js';\nimport type {\n CombatantMovedEvent,\n DashedEvent,\n DisengagedEvent,\n} from '../../schemas/events/movement.js';\nimport type { ActionEconomyConsumedEvent } from '../../schemas/events/action-economy.js';\nimport { newEventId } from '../../ids.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\n\nexport interface MoveIntent {\n readonly type: 'Move';\n readonly combatantId: string;\n readonly to: Position;\n readonly at?: string;\n}\n\nexport interface DashIntent {\n readonly type: 'Dash';\n readonly combatantId: string;\n readonly at?: string;\n}\n\nexport interface DisengageIntent {\n readonly type: 'Disengage';\n readonly combatantId: string;\n readonly at?: string;\n}\n\nexport const chebyshevDistance = (a: Position, b: Position): number =>\n Math.max(Math.abs(a.x - b.x), Math.abs(a.y - b.y));\n\nconst findCombatant = (\n state: CampaignState,\n combatantId: string,\n): { encounterId: string; combatant: Combatant; isActive: boolean } => {\n const encounterId = state.activeEncounterId;\n if (encounterId === undefined) {\n throw new Error('Movement requires an active encounter');\n }\n const encounter = state.encounters[encounterId];\n if (!encounter || encounter.status !== 'active') {\n throw new Error('Movement requires an active encounter');\n }\n const combatant = encounter.combatants.find((c) => c.combatantId === combatantId);\n if (!combatant) {\n throw new Error(`Combatant ${combatantId} not in active encounter`);\n }\n const isActive = encounter.combatants[encounter.activeIndex]?.combatantId === combatantId;\n return { encounterId, combatant, isActive };\n};\n\nconst characterWalkSpeed = (state: CampaignState, characterId: string): number => {\n const character = state.characters[characterId];\n return character?.speedFeet ?? 30;\n};\n\nexport const planMove = (\n state: CampaignState,\n _content: ResolvedContent,\n intent: MoveIntent,\n): ReadonlyArray<Event> => {\n const { encounterId, combatant, isActive } = findCombatant(state, intent.combatantId);\n if (!isActive) {\n throw new Error('Only the active combatant may move on their turn');\n }\n if (combatant.position === undefined) {\n throw new Error('Combatant has no position set');\n }\n const distance = chebyshevDistance(combatant.position, intent.to);\n const baseSpeed = characterWalkSpeed(state, intent.combatantId);\n const maxThisTurn = combatant.turnUsage.dashed ? baseSpeed * 2 : baseSpeed;\n const remaining = maxThisTurn - combatant.turnUsage.feetMovedThisTurn;\n if (distance > remaining) {\n throw new Error(\n `Move of ${distance}ft exceeds remaining movement (${remaining}ft of ${maxThisTurn}ft)`,\n );\n }\n\n const at = intent.at ?? nowIso();\n const moved: CombatantMovedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'CombatantMoved',\n encounterId,\n combatantId: intent.combatantId,\n fromPosition: { ...combatant.position },\n toPosition: { ...intent.to },\n feetTraveled: distance,\n };\n return [moved];\n};\n\nexport const planDash = (\n state: CampaignState,\n _content: ResolvedContent,\n intent: DashIntent,\n): ReadonlyArray<Event> => {\n const { encounterId, combatant, isActive } = findCombatant(state, intent.combatantId);\n if (!isActive) {\n throw new Error('Only the active combatant may Dash on their turn');\n }\n if (combatant.turnUsage.actionUsed) {\n throw new Error('Action already used this turn');\n }\n if (combatant.turnUsage.dashed) {\n throw new Error('Already dashed this turn');\n }\n const at = intent.at ?? nowIso();\n const actionConsumed: ActionEconomyConsumedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId,\n combatantId: intent.combatantId,\n kind: 'action',\n };\n const dashed: DashedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'Dashed',\n encounterId,\n combatantId: intent.combatantId,\n };\n return [actionConsumed, dashed];\n};\n\nexport const planDisengage = (\n state: CampaignState,\n _content: ResolvedContent,\n intent: DisengageIntent,\n): ReadonlyArray<Event> => {\n const { encounterId, combatant, isActive } = findCombatant(state, intent.combatantId);\n if (!isActive) {\n throw new Error('Only the active combatant may Disengage on their turn');\n }\n if (combatant.turnUsage.actionUsed) {\n throw new Error('Action already used this turn');\n }\n if (combatant.turnUsage.disengaged) {\n throw new Error('Already disengaged this turn');\n }\n const at = intent.at ?? nowIso();\n const actionConsumed: ActionEconomyConsumedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId,\n combatantId: intent.combatantId,\n kind: 'action',\n };\n const disengaged: DisengagedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'Disengaged',\n encounterId,\n combatantId: intent.combatantId,\n };\n return [actionConsumed, disengaged];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { ResourceSpentEvent } from '../../schemas/events/resources.js';\nimport type { ActionEconomyConsumedEvent } from '../../schemas/events/action-economy.js';\nimport type { Combatant } from '../../schemas/runtime/encounter.js';\nimport { newEventId } from '../../ids.js';\nimport { nowIso } from '../../internal/clock.js';\nimport type { ULID } from '../ids-utils.js';\n\nconst ACTION_SURGE_RESOURCE_ID = 'action-surge';\n\nexport interface ActionSurgeIntent {\n readonly type: 'ActionSurge';\n readonly combatantId: string;\n readonly at?: string;\n}\n\nconst findActive = (\n state: CampaignState,\n combatantId: string,\n): { encounterId: string; combatant: Combatant; activeIndex: number } => {\n const encounterId = state.activeEncounterId;\n if (encounterId === undefined) {\n throw new Error('Action Surge requires an active encounter');\n }\n const encounter = state.encounters[encounterId];\n if (!encounter || encounter.status !== 'active') {\n throw new Error('Action Surge requires an active encounter');\n }\n const active = encounter.combatants[encounter.activeIndex];\n if (!active || active.combatantId !== combatantId) {\n throw new Error('Action Surge can only be used on your own turn');\n }\n return { encounterId, combatant: active, activeIndex: encounter.activeIndex };\n};\n\nexport const planActionSurge = (\n state: CampaignState,\n _content: ResolvedContent,\n intent: ActionSurgeIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.combatantId];\n if (!character) throw new Error(`Unknown character ${intent.combatantId}`);\n const resource = character.resources.find((r) => r.resourceId === ACTION_SURGE_RESOURCE_ID);\n if (!resource || resource.current <= 0) {\n throw new Error(`${character.name} has no Action Surge available`);\n }\n const { combatant } = findActive(state, intent.combatantId);\n if (!combatant.turnUsage.actionUsed) {\n throw new Error('Action Surge is only meaningful after the Action is used');\n }\n\n const at = intent.at ?? nowIso();\n const spend: ResourceSpentEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ResourceSpent',\n characterId: intent.combatantId,\n resourceId: ACTION_SURGE_RESOURCE_ID,\n amount: 1,\n };\n return [spend];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { ActionEconomyConsumedEvent } from '../../schemas/events/action-economy.js';\nimport type {\n AttackRolledEvent,\n DamageRolledEvent,\n DamageRoll,\n} from '../../schemas/events/attack.js';\nimport type { DamageAppliedEvent } from '../../schemas/events/combat.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie, parseDiceExpression } from '../../rng/dice.js';\nimport { newEventId } from '../../ids.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { computeAttackBonus } from '../../derive/attack.js';\nimport { computeAC } from '../../derive/ac.js';\nimport { abilityModifier } from '../../derive/ability.js';\nimport { mitigateDamage } from '../../derive/damage-mitigation.js';\nimport { D20_SIDES, NAT_20, NAT_1 } from '../../internal/constants.js';\nimport type { ULID } from '../ids-utils.js';\n\nexport interface OffHandAttackIntent {\n readonly type: 'OffHandAttack';\n readonly attackerId: string;\n readonly targetId: string;\n readonly weaponInstanceId: string;\n readonly at?: string;\n}\n\nconst findActiveEncounter = (\n state: CampaignState,\n attackerId: string,\n): { encounterId: string; bonusActionUsed: boolean } | undefined => {\n const encounterId = state.activeEncounterId;\n if (encounterId === undefined) return undefined;\n const encounter = state.encounters[encounterId];\n if (!encounter || encounter.status !== 'active') return undefined;\n const active = encounter.combatants[encounter.activeIndex];\n if (!active || active.combatantId !== attackerId) return undefined;\n return { encounterId, bonusActionUsed: active.turnUsage.bonusActionUsed };\n};\n\nexport const planOffHandAttack = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: OffHandAttackIntent,\n): ReadonlyArray<Event> => {\n const attacker = state.characters[intent.attackerId];\n if (!attacker) throw new Error(`Unknown attacker ${intent.attackerId}`);\n const target = state.characters[intent.targetId];\n if (!target) throw new Error(`Unknown target ${intent.targetId}`);\n const weaponInstance = state.itemInstances[intent.weaponInstanceId];\n if (!weaponInstance) throw new Error(`Unknown weapon ${intent.weaponInstanceId}`);\n const weaponDef = content.items.get(weaponInstance.definitionId);\n if (!weaponDef || weaponDef.itemKind !== 'weapon') {\n throw new Error(`Item ${weaponInstance.definitionId} is not a weapon`);\n }\n if (!weaponDef.properties.includes('light')) {\n throw new Error(`Off-hand attacks require a 'light' weapon; ${weaponDef.name} is not light`);\n }\n\n const active = findActiveEncounter(state, intent.attackerId);\n if (active === undefined) {\n throw new Error('Off-hand attack requires being the active combatant in an active encounter');\n }\n if (active.bonusActionUsed) {\n throw new Error('Bonus action already used this turn');\n }\n\n const at = intent.at ?? nowIso();\n\n const bonusActionConsumed: ActionEconomyConsumedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId: active.encounterId,\n combatantId: intent.attackerId,\n kind: 'bonusAction',\n };\n\n const attackBonusResult = computeAttackBonus({\n character: attacker,\n itemInstances: state.itemInstances,\n content,\n weaponInstanceId: intent.weaponInstanceId,\n });\n const acResult = computeAC({\n character: target,\n itemInstances: state.itemInstances,\n content,\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + attackBonusResult.total;\n const naturalHit = d20 === NAT_20;\n const naturalMiss = d20 === NAT_1;\n const hit = !naturalMiss && (naturalHit || total >= acResult.total);\n const critical = naturalHit;\n\n const attackRolled: AttackRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'AttackRolled',\n attackerId: intent.attackerId,\n targetId: intent.targetId,\n weaponInstanceId: intent.weaponInstanceId,\n d20: [d20],\n used: 'none',\n attackBonus: attackBonusResult.total,\n total,\n targetAC: acResult.total,\n hit,\n critical,\n };\n\n if (!hit) {\n return [bonusActionConsumed, attackRolled];\n }\n\n // Off-hand attacks do NOT add ability modifier to damage (except negative).\n const strMod = abilityModifier(attacker.abilityScores.STR);\n const dexMod = abilityModifier(attacker.abilityScores.DEX);\n const isFinesse = weaponDef.properties.includes('finesse');\n const abilityMod = isFinesse ? Math.max(strMod, dexMod) : strMod;\n const offHandModifier = abilityMod < 0 ? abilityMod : 0;\n const parsed = parseDiceExpression(weaponDef.damageDice);\n const totalRolls = critical ? parsed.count * 2 : parsed.count;\n const damageRolls: number[] = [];\n for (let i = 0; i < totalRolls; i++) {\n damageRolls.push(rollDie(parsed.die, rng));\n }\n const damageRollPayload: DamageRoll = {\n expression: weaponDef.damageDice,\n rolls: damageRolls,\n modifier: offHandModifier + parsed.modifier,\n type: weaponDef.damageType,\n };\n const damageRolled: DamageRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageRolled',\n attackerId: intent.attackerId,\n targetId: intent.targetId,\n weaponInstanceId: intent.weaponInstanceId,\n rolls: [damageRollPayload],\n critical,\n causedByEventId: attackRolled.id,\n };\n const damageTotal = damageRolls.reduce((s, v) => s + v, 0) + damageRollPayload.modifier;\n const mitigated = mitigateDamage({\n character: target,\n itemInstances: state.itemInstances,\n content,\n rawComponents: [{ amount: Math.max(0, damageTotal), type: weaponDef.damageType }],\n });\n const damageApplied: DamageAppliedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageApplied',\n targetId: intent.targetId,\n components: mitigated,\n causedByEventId: damageRolled.id,\n };\n\n return [bonusActionConsumed, attackRolled, damageRolled, damageApplied];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { ActionEconomyConsumedEvent } from '../../schemas/events/action-economy.js';\nimport type { RNG } from '../../rng/index.js';\nimport { newEventId } from '../../ids.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { resolveAttack } from './attack.js';\nimport type { ULID } from '../ids-utils.js';\n\nexport interface MultiattackIntent {\n readonly type: 'Multiattack';\n readonly attackerId: string;\n readonly targetId: string;\n readonly at?: string;\n}\n\nexport const planMultiattack = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: MultiattackIntent,\n): ReadonlyArray<Event> => {\n const attacker = state.characters[intent.attackerId];\n if (!attacker) throw new Error(`Unknown attacker ${intent.attackerId}`);\n const pattern = attacker.multiattack;\n if (pattern === undefined) {\n throw new Error(`${attacker.name} has no multiattack pattern`);\n }\n\n const at = intent.at ?? nowIso();\n const events: Event[] = [];\n const encounterId = state.activeEncounterId;\n if (encounterId !== undefined) {\n const encounter = state.encounters[encounterId];\n if (encounter && encounter.status === 'active') {\n const active = encounter.combatants[encounter.activeIndex];\n if (active?.combatantId === intent.attackerId && !active.turnUsage.actionUsed) {\n const actionConsumed: ActionEconomyConsumedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId,\n combatantId: intent.attackerId,\n kind: 'action',\n };\n events.push(actionConsumed);\n }\n }\n }\n\n for (const swing of pattern.attacks) {\n for (let i = 0; i < swing.count; i++) {\n const resolution = resolveAttack({\n state,\n content,\n rng,\n attackerId: intent.attackerId,\n targetId: intent.targetId,\n weaponInstanceId: swing.weaponInstanceId,\n at,\n });\n events.push(...resolution);\n }\n }\n return events;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { DamageAppliedEvent } from '../../schemas/events/combat.js';\nimport { newEventId } from '../../ids.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { mitigateDamage } from '../../derive/damage-mitigation.js';\nimport type { ULID } from '../ids-utils.js';\n\nconst FALLING_FEET_PER_DIE = 10;\nconst FALLING_DIE_AVERAGE = 3.5;\nconst FALLING_MAX_DICE = 20;\n\nexport interface FallingIntent {\n readonly type: 'Falling';\n readonly characterId: string;\n readonly distanceFeet: number;\n readonly at?: string;\n}\n\nconst fallingDieCount = (distanceFeet: number): number =>\n Math.min(FALLING_MAX_DICE, Math.floor(distanceFeet / FALLING_FEET_PER_DIE));\n\nconst expectedFallingDamage = (distanceFeet: number): number => {\n const dice = fallingDieCount(distanceFeet);\n return Math.round(dice * FALLING_DIE_AVERAGE);\n};\n\nexport const planFalling = (\n state: CampaignState,\n content: ResolvedContent,\n intent: FallingIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.characterId];\n if (!character) throw new Error(`Unknown character ${intent.characterId}`);\n if (intent.distanceFeet < 0) {\n throw new Error('Falling distance must be non-negative');\n }\n const rawDamage = expectedFallingDamage(intent.distanceFeet);\n if (rawDamage <= 0) return [];\n\n const mitigated = mitigateDamage({\n character,\n itemInstances: state.itemInstances,\n content,\n rawComponents: [{ amount: rawDamage, type: 'bludgeoning' }],\n });\n const at = intent.at ?? nowIso();\n const damageApplied: DamageAppliedEvent = {\n id: newEventId() as ULID,\n at,\n type: 'DamageApplied',\n targetId: intent.characterId,\n components: mitigated,\n };\n return [damageApplied];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId, newAppliedConditionId } from '../../ids.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { abilityModifier, proficiencyBonus } from '../../derive/ability.js';\nimport { computeTotalLevel } from '../../schemas/runtime/character.js';\nimport { computeAbilityCheck } from '../../derive/ability-check.js';\nimport type { ULID } from '../ids-utils.js';\nimport type {\n ActionEconomyConsumedEvent,\n} from '../../schemas/events/action-economy.js';\nimport type {\n ConditionAppliedEvent,\n} from '../../schemas/events/combat.js';\nimport type { SaveRolledEvent, AbilityCheckRolledEvent } from '../../schemas/events/checks.js';\nimport type { CombatantMovedEvent } from '../../schemas/events/movement.js';\n\nconst UNARMED_DC_BASE = 8;\nconst HIDE_DEFAULT_DC = 15;\nconst SHOVE_PUSH_FEET = 5;\n\nconst unarmedSaveDC = (character: { abilityScores: { STR: number }; classes: Array<{ level: number }> }): number => {\n const str = abilityModifier(character.abilityScores.STR);\n const prof = proficiencyBonus(computeTotalLevel(character as never));\n return UNARMED_DC_BASE + str + prof;\n};\n\nconst consumeActionIfEncountered = (\n state: CampaignState,\n attackerId: string,\n at: string,\n): ActionEconomyConsumedEvent | undefined => {\n if (state.activeEncounterId === undefined) return undefined;\n const encounter = state.encounters[state.activeEncounterId];\n if (encounter === undefined) return undefined;\n if (!encounter.combatants.some((c) => c.combatantId === attackerId)) return undefined;\n return {\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId: encounter.id,\n combatantId: attackerId,\n kind: 'action',\n };\n};\n\nexport interface GrappleIntent {\n readonly type: 'Grapple';\n readonly attackerId: string;\n readonly targetId: string;\n readonly targetAbility?: 'STR' | 'DEX';\n readonly at?: string;\n}\n\nexport const planGrapple = (\n state: CampaignState,\n _content: ResolvedContent,\n rng: RNG,\n intent: GrappleIntent,\n): ReadonlyArray<Event> => {\n const attacker = state.characters[intent.attackerId];\n invariant(attacker !== undefined, `Attacker ${intent.attackerId} not found`);\n const target = state.characters[intent.targetId];\n invariant(target !== undefined, `Target ${intent.targetId} not found`);\n const at = intent.at ?? nowIso();\n const ability = intent.targetAbility ?? 'STR';\n const dc = unarmedSaveDC(attacker);\n const d20 = rollDie(D20_SIDES, rng);\n const bonus = abilityModifier(target.abilityScores[ability]);\n const total = d20 + bonus;\n const success = total >= dc;\n const events: Event[] = [];\n const consume = consumeActionIfEncountered(state, intent.attackerId, at);\n if (consume !== undefined) events.push(consume);\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SaveRolled',\n targetId: intent.targetId,\n ability,\n dc,\n d20: [d20],\n used: 'none',\n bonus,\n total,\n success,\n } satisfies SaveRolledEvent);\n if (!success) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId: intent.targetId,\n conditionId: 'grappled',\n appliedConditionId: newAppliedConditionId(),\n } satisfies ConditionAppliedEvent);\n }\n return events;\n};\n\nexport interface ShoveIntent {\n readonly type: 'Shove';\n readonly attackerId: string;\n readonly targetId: string;\n readonly mode: 'prone' | 'push';\n readonly at?: string;\n}\n\nexport const planShove = (\n state: CampaignState,\n _content: ResolvedContent,\n rng: RNG,\n intent: ShoveIntent,\n): ReadonlyArray<Event> => {\n const attacker = state.characters[intent.attackerId];\n invariant(attacker !== undefined, `Attacker ${intent.attackerId} not found`);\n const target = state.characters[intent.targetId];\n invariant(target !== undefined, `Target ${intent.targetId} not found`);\n const at = intent.at ?? nowIso();\n const dc = unarmedSaveDC(attacker);\n const d20 = rollDie(D20_SIDES, rng);\n const bonus = abilityModifier(target.abilityScores.STR);\n const total = d20 + bonus;\n const success = total >= dc;\n const events: Event[] = [];\n const consume = consumeActionIfEncountered(state, intent.attackerId, at);\n if (consume !== undefined) events.push(consume);\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SaveRolled',\n targetId: intent.targetId,\n ability: 'STR',\n dc,\n d20: [d20],\n used: 'none',\n bonus,\n total,\n success,\n } satisfies SaveRolledEvent);\n if (!success) {\n if (intent.mode === 'prone') {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId: intent.targetId,\n conditionId: 'prone',\n appliedConditionId: newAppliedConditionId(),\n } satisfies ConditionAppliedEvent);\n } else {\n const encounter = state.activeEncounterId !== undefined\n ? state.encounters[state.activeEncounterId]\n : undefined;\n const combatant = encounter?.combatants.find((c) => c.combatantId === intent.targetId);\n if (combatant?.position !== undefined) {\n const attackerCombatant = encounter?.combatants.find((c) => c.combatantId === intent.attackerId);\n const attackerPos = attackerCombatant?.position;\n const dx = attackerPos !== undefined\n ? Math.sign(combatant.position.x - attackerPos.x) || 1\n : 1;\n const dy = attackerPos !== undefined\n ? Math.sign(combatant.position.y - attackerPos.y) || 0\n : 0;\n const cellSize = 5;\n const targetCells = SHOVE_PUSH_FEET / cellSize;\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'CombatantMoved',\n encounterId: encounter!.id,\n combatantId: intent.targetId,\n fromPosition: { x: combatant.position.x, y: combatant.position.y },\n toPosition: {\n x: combatant.position.x + dx * targetCells,\n y: combatant.position.y + dy * targetCells,\n },\n feetTraveled: SHOVE_PUSH_FEET,\n } satisfies CombatantMovedEvent);\n }\n }\n }\n return events;\n};\n\nexport interface HideIntent {\n readonly type: 'Hide';\n readonly characterId: string;\n readonly dc?: number;\n readonly at?: string;\n}\n\nexport const planHide = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: HideIntent,\n): ReadonlyArray<Event> => {\n const character = state.characters[intent.characterId];\n invariant(character !== undefined, `Character ${intent.characterId} not found`);\n const at = intent.at ?? nowIso();\n const dc = intent.dc ?? HIDE_DEFAULT_DC;\n const derivation = computeAbilityCheck({\n character,\n itemInstances: state.itemInstances,\n content,\n ability: 'DEX',\n skill: 'stealth',\n pendingChoices: state.pendingChoices,\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + derivation.total;\n const success = total >= dc;\n const events: Event[] = [];\n const consume = consumeActionIfEncountered(state, intent.characterId, at);\n if (consume !== undefined) events.push(consume);\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'AbilityCheckRolled',\n characterId: intent.characterId,\n ability: 'DEX',\n skill: 'stealth',\n dc,\n success,\n d20: [d20],\n used: 'none',\n bonus: derivation.total,\n total,\n } satisfies AbilityCheckRolledEvent);\n if (success) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId: intent.characterId,\n conditionId: 'invisible',\n appliedConditionId: newAppliedConditionId(),\n } satisfies ConditionAppliedEvent);\n }\n return events;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId } from '../../ids.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { abilityModifier, proficiencyBonus } from '../../derive/ability.js';\nimport { computeTotalLevel } from '../../schemas/runtime/character.js';\nimport { computeSpellSaveDC } from '../../derive/spell-dc.js';\nimport type { ULID } from '../ids-utils.js';\nimport type {\n ActionEconomyConsumedEvent,\n} from '../../schemas/events/action-economy.js';\nimport type {\n SpellCounteredEvent,\n SpellDispelledEvent,\n ItemIdentifiedEvent,\n} from '../../schemas/events/reactive-spells.js';\nimport type {\n SpellSlotConsumedEvent,\n} from '../../schemas/events/spellcasting.js';\nimport type {\n SaveRolledEvent,\n AbilityCheckRolledEvent,\n} from '../../schemas/events/checks.js';\n\nconst DC_ABOVE_AUTO_FAIL = 10;\nconst COUNTERSPELL_SLOT_LEVEL = 3;\n\nconst economyConsumedIfEncountered = (\n state: CampaignState,\n combatantId: string,\n at: string,\n kind: 'action' | 'reaction',\n): ActionEconomyConsumedEvent | undefined => {\n if (state.activeEncounterId === undefined) return undefined;\n const encounter = state.encounters[state.activeEncounterId];\n if (encounter === undefined) return undefined;\n if (!encounter.combatants.some((c) => c.combatantId === combatantId)) return undefined;\n return {\n id: newEventId() as ULID,\n at,\n type: 'ActionEconomyConsumed',\n encounterId: encounter.id,\n combatantId,\n kind,\n };\n};\n\nexport interface CounterspellIntent {\n readonly type: 'Counterspell';\n readonly counterCasterId: string;\n readonly targetCasterId: string;\n readonly originalSpellEventId: string;\n readonly spellId: string;\n readonly castingClassId: string;\n readonly slotLevelToConsume?: number;\n readonly at?: string;\n}\n\nexport const planCounterspell = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: CounterspellIntent,\n): ReadonlyArray<Event> => {\n const caster = state.characters[intent.counterCasterId];\n invariant(caster !== undefined, `Counter caster ${intent.counterCasterId} not found`);\n const target = state.characters[intent.targetCasterId];\n invariant(target !== undefined, `Target caster ${intent.targetCasterId} not found`);\n const at = intent.at ?? nowIso();\n const dcResult = computeSpellSaveDC({\n character: caster,\n itemInstances: state.itemInstances,\n content,\n pendingChoices: state.pendingChoices,\n classId: intent.castingClassId,\n });\n const dc = dcResult.total;\n const conBonus = abilityModifier(target.abilityScores.CON);\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + conBonus;\n const saveSucceeded = total >= dc;\n const slotLevel = intent.slotLevelToConsume ?? COUNTERSPELL_SLOT_LEVEL;\n invariant(slotLevel >= COUNTERSPELL_SLOT_LEVEL, `Counterspell requires a 3rd-level or higher slot`);\n\n const events: Event[] = [];\n const reaction = economyConsumedIfEncountered(state, intent.counterCasterId, at, 'reaction');\n if (reaction !== undefined) events.push(reaction);\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SpellSlotConsumed',\n characterId: intent.counterCasterId,\n slotLevel,\n } satisfies SpellSlotConsumedEvent);\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SaveRolled',\n targetId: intent.targetCasterId,\n ability: 'CON',\n dc,\n d20: [d20],\n used: 'none',\n bonus: conBonus,\n total,\n success: saveSucceeded,\n } satisfies SaveRolledEvent);\n if (!saveSucceeded) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SpellCountered',\n originalSpellEventId: intent.originalSpellEventId,\n counterCasterId: intent.counterCasterId,\n targetCasterId: intent.targetCasterId,\n spellId: intent.spellId,\n } satisfies SpellCounteredEvent);\n }\n return events;\n};\n\nexport interface DispelMagicIntent {\n readonly type: 'DispelMagic';\n readonly casterId: string;\n readonly effectInstanceId: string;\n readonly targetSpellLevel: number;\n readonly slotLevel: number;\n readonly castingClassId: string;\n readonly at?: string;\n}\n\nexport const planDispelMagic = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: DispelMagicIntent,\n): ReadonlyArray<Event> => {\n const caster = state.characters[intent.casterId];\n invariant(caster !== undefined, `Caster ${intent.casterId} not found`);\n const effect = state.effectInstances[intent.effectInstanceId];\n invariant(effect !== undefined, `EffectInstance ${intent.effectInstanceId} not found`);\n invariant(intent.slotLevel >= 3, `Dispel Magic requires a 3rd-level or higher slot`);\n const at = intent.at ?? nowIso();\n\n const events: Event[] = [];\n const action = economyConsumedIfEncountered(state, intent.casterId, at, 'action');\n if (action !== undefined) events.push(action);\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SpellSlotConsumed',\n characterId: intent.casterId,\n slotLevel: intent.slotLevel,\n } satisfies SpellSlotConsumedEvent);\n\n const autoSucceed = intent.targetSpellLevel <= intent.slotLevel;\n let dispelSucceeds = autoSucceed;\n if (!autoSucceed) {\n const dc = DC_ABOVE_AUTO_FAIL + intent.targetSpellLevel;\n const cls = content.classes.get(intent.castingClassId);\n const rawAbility = cls?.spellcasting?.ability;\n const ability: 'INT' | 'WIS' | 'CHA' =\n rawAbility === 'INT' || rawAbility === 'WIS' || rawAbility === 'CHA' ? rawAbility : 'INT';\n const totalLevel = computeTotalLevel(caster);\n const bonus = abilityModifier(caster.abilityScores[ability]) + proficiencyBonus(totalLevel);\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + bonus;\n dispelSucceeds = total >= dc;\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'AbilityCheckRolled',\n characterId: intent.casterId,\n ability,\n dc,\n success: dispelSucceeds,\n d20: [d20],\n used: 'none',\n bonus,\n total,\n } satisfies AbilityCheckRolledEvent);\n }\n if (dispelSucceeds) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SpellDispelled',\n effectInstanceId: intent.effectInstanceId,\n dispelledByCharacterId: intent.casterId,\n } satisfies SpellDispelledEvent);\n }\n return events;\n};\n\nexport interface IdentifyIntent {\n readonly type: 'Identify';\n readonly casterId: string;\n readonly itemInstanceId: string;\n readonly slotLevel?: number;\n readonly at?: string;\n}\n\nexport const planIdentify = (\n state: CampaignState,\n _content: ResolvedContent,\n _rng: RNG,\n intent: IdentifyIntent,\n): ReadonlyArray<Event> => {\n const caster = state.characters[intent.casterId];\n invariant(caster !== undefined, `Caster ${intent.casterId} not found`);\n const item = state.itemInstances[intent.itemInstanceId];\n invariant(item !== undefined, `Item ${intent.itemInstanceId} not found`);\n const at = intent.at ?? nowIso();\n const events: Event[] = [];\n const action = economyConsumedIfEncountered(state, intent.casterId, at, 'action');\n if (action !== undefined) events.push(action);\n if (intent.slotLevel !== undefined && intent.slotLevel >= 1) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SpellSlotConsumed',\n characterId: intent.casterId,\n slotLevel: intent.slotLevel,\n } satisfies SpellSlotConsumedEvent);\n }\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ItemIdentified',\n itemInstanceId: intent.itemInstanceId,\n identifiedByCharacterId: intent.casterId,\n } satisfies ItemIdentifiedEvent);\n return events;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId, newAppliedConditionId } from '../../ids.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { abilityModifier, proficiencyBonus } from '../../derive/ability.js';\nimport { computeTotalLevel } from '../../schemas/runtime/character.js';\nimport type { ULID } from '../ids-utils.js';\nimport type { WeaponMastery } from '../../schemas/primitives.js';\nimport type { WeaponMasteryActivatedEvent } from '../../schemas/events/weapon-mastery.js';\nimport type { ConditionAppliedEvent, DamageAppliedEvent } from '../../schemas/events/combat.js';\nimport type { CombatantMovedEvent } from '../../schemas/events/movement.js';\nimport type { SaveRolledEvent } from '../../schemas/events/checks.js';\n\nconst UNARMED_DC_BASE = 8;\nconst CELL_SIZE_FEET = 5;\nconst PUSH_DISTANCE_FEET = 10;\n\nconst masterySaveDC = (character: { abilityScores: { STR: number }; classes: Array<{ level: number }> }): number =>\n UNARMED_DC_BASE +\n abilityModifier(character.abilityScores.STR) +\n proficiencyBonus(computeTotalLevel(character as never));\n\nconst recordMasteryEvent = (\n mastery: WeaponMastery,\n attackerId: string,\n targetId: string | undefined,\n weaponInstanceId: string,\n at: string,\n): WeaponMasteryActivatedEvent => ({\n id: newEventId() as ULID,\n at,\n type: 'WeaponMasteryActivated',\n mastery,\n attackerId,\n weaponInstanceId,\n ...(targetId !== undefined ? { targetId } : {}),\n});\n\nexport interface WeaponMasteryIntent {\n readonly type: 'WeaponMastery';\n readonly mastery: WeaponMastery;\n readonly attackerId: string;\n readonly targetId: string;\n readonly weaponInstanceId: string;\n readonly at?: string;\n}\n\nexport const planWeaponMastery = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: WeaponMasteryIntent,\n): ReadonlyArray<Event> => {\n const attacker = state.characters[intent.attackerId];\n invariant(attacker !== undefined, `Attacker ${intent.attackerId} not found`);\n const target = state.characters[intent.targetId];\n invariant(target !== undefined, `Target ${intent.targetId} not found`);\n const weaponInst = state.itemInstances[intent.weaponInstanceId];\n invariant(weaponInst !== undefined, `Weapon ${intent.weaponInstanceId} not found`);\n const weapon = content.items.get(weaponInst.definitionId);\n invariant(weapon !== undefined, `Weapon definition ${weaponInst.definitionId} not found`);\n invariant(\n weapon.itemKind === 'weapon',\n `Item ${weaponInst.definitionId} is not a weapon`,\n );\n invariant(\n weapon.mastery === intent.mastery,\n `Weapon ${weaponInst.definitionId} mastery is ${weapon.mastery ?? 'none'}, not ${intent.mastery}`,\n );\n\n const at = intent.at ?? nowIso();\n const events: Event[] = [\n recordMasteryEvent(intent.mastery, intent.attackerId, intent.targetId, intent.weaponInstanceId, at),\n ];\n\n switch (intent.mastery) {\n case 'Sap':\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId: intent.targetId,\n conditionId: 'sapped',\n appliedConditionId: newAppliedConditionId(),\n } satisfies ConditionAppliedEvent);\n break;\n case 'Vex':\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId: intent.targetId,\n conditionId: 'vexed-by',\n appliedConditionId: newAppliedConditionId(),\n } satisfies ConditionAppliedEvent);\n break;\n case 'Slow':\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId: intent.targetId,\n conditionId: 'slowed-10ft',\n appliedConditionId: newAppliedConditionId(),\n } satisfies ConditionAppliedEvent);\n break;\n case 'Topple': {\n const dc = masterySaveDC(attacker);\n const d20 = rollDie(D20_SIDES, rng);\n const conBonus = abilityModifier(target.abilityScores.CON);\n const total = d20 + conBonus;\n const success = total >= dc;\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'SaveRolled',\n targetId: intent.targetId,\n ability: 'CON',\n dc,\n d20: [d20],\n used: 'none',\n bonus: conBonus,\n total,\n success,\n } satisfies SaveRolledEvent);\n if (!success) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'ConditionApplied',\n targetId: intent.targetId,\n conditionId: 'prone',\n appliedConditionId: newAppliedConditionId(),\n } satisfies ConditionAppliedEvent);\n }\n break;\n }\n case 'Push': {\n const encounter = state.activeEncounterId !== undefined\n ? state.encounters[state.activeEncounterId]\n : undefined;\n const targetCombatant = encounter?.combatants.find((c) => c.combatantId === intent.targetId);\n if (encounter !== undefined && targetCombatant?.position !== undefined) {\n const attackerCombatant = encounter.combatants.find((c) => c.combatantId === intent.attackerId);\n const attackerPos = attackerCombatant?.position;\n const dx = attackerPos !== undefined\n ? Math.sign(targetCombatant.position.x - attackerPos.x) || 1\n : 1;\n const dy = attackerPos !== undefined\n ? Math.sign(targetCombatant.position.y - attackerPos.y) || 0\n : 0;\n const cells = PUSH_DISTANCE_FEET / CELL_SIZE_FEET;\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'CombatantMoved',\n encounterId: encounter.id,\n combatantId: intent.targetId,\n fromPosition: { x: targetCombatant.position.x, y: targetCombatant.position.y },\n toPosition: {\n x: targetCombatant.position.x + dx * cells,\n y: targetCombatant.position.y + dy * cells,\n },\n feetTraveled: PUSH_DISTANCE_FEET,\n } satisfies CombatantMovedEvent);\n }\n break;\n }\n case 'Graze': {\n const damageType = weapon.damageType;\n const grazeAmount = Math.max(0, abilityModifier(attacker.abilityScores.STR));\n if (grazeAmount > 0) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'DamageApplied',\n targetId: intent.targetId,\n components: [{ amount: grazeAmount, type: damageType, rawAmount: grazeAmount }],\n } satisfies DamageAppliedEvent);\n }\n break;\n }\n case 'Cleave':\n case 'Nick':\n case 'Flex':\n // Cleave grants an extra attack; Nick changes the off-hand timing;\n // Flex toggles 1H/2H damage dice. None produce a rider event on\n // their own — they shape the attack sequence and belong in the\n // attack planner, not here.\n break;\n }\n return events;\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId } from '../../ids.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { computeAbilityCheck } from '../../derive/ability-check.js';\nimport type { ULID } from '../ids-utils.js';\nimport type { ForagedForEvent, NavigationCheckRolledEvent } from '../../schemas/events/travel.js';\n\nconst FORAGE_FOOD_ON_SUCCESS = 4;\nconst FORAGE_WATER_ON_SUCCESS = 4;\n\nexport interface ForageIntent {\n readonly type: 'Forage';\n readonly partyId: string;\n readonly foragerId: string;\n readonly dc: number;\n readonly at?: string;\n}\n\nexport const planForage = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: ForageIntent,\n): ReadonlyArray<Event> => {\n invariant(state.parties[intent.partyId] !== undefined, `Party ${intent.partyId} not found`);\n const forager = state.characters[intent.foragerId];\n invariant(forager !== undefined, `Forager ${intent.foragerId} not found`);\n const derivation = computeAbilityCheck({\n character: forager,\n itemInstances: state.itemInstances,\n content,\n ability: 'WIS',\n skill: 'survival',\n pendingChoices: state.pendingChoices,\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + derivation.total;\n const success = total >= intent.dc;\n const at = intent.at ?? nowIso();\n const event: ForagedForEvent = {\n id: newEventId() as ULID,\n at,\n type: 'ForagedFor',\n partyId: intent.partyId,\n foragerId: intent.foragerId,\n d20,\n bonus: derivation.total,\n total,\n dc: intent.dc,\n success,\n foodPounds: success ? FORAGE_FOOD_ON_SUCCESS : 0,\n waterPounds: success ? FORAGE_WATER_ON_SUCCESS : 0,\n };\n return [event];\n};\n\nexport interface NavigationCheckIntent {\n readonly type: 'NavigationCheck';\n readonly partyId: string;\n readonly navigatorId: string;\n readonly dc: number;\n readonly at?: string;\n}\n\nexport const planNavigationCheck = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: NavigationCheckIntent,\n): ReadonlyArray<Event> => {\n invariant(state.parties[intent.partyId] !== undefined, `Party ${intent.partyId} not found`);\n const navigator = state.characters[intent.navigatorId];\n invariant(navigator !== undefined, `Navigator ${intent.navigatorId} not found`);\n const derivation = computeAbilityCheck({\n character: navigator,\n itemInstances: state.itemInstances,\n content,\n ability: 'WIS',\n skill: 'survival',\n pendingChoices: state.pendingChoices,\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + derivation.total;\n const at = intent.at ?? nowIso();\n const event: NavigationCheckRolledEvent = {\n id: newEventId() as ULID,\n at,\n type: 'NavigationCheckRolled',\n partyId: intent.partyId,\n navigatorId: intent.navigatorId,\n d20,\n bonus: derivation.total,\n total,\n dc: intent.dc,\n success: total >= intent.dc,\n };\n return [event];\n};\n","import type { CampaignState } from '../../schemas/runtime/campaign.js';\nimport type { ResolvedContent } from '../../content/pack.js';\nimport type { Event } from '../../schemas/events/index.js';\nimport type { RNG } from '../../rng/index.js';\nimport { rollDie } from '../../rng/dice.js';\nimport { newEventId } from '../../ids.js';\nimport { D20_SIDES } from '../../internal/constants.js';\nimport { nowIso } from '../../internal/clock.js';\nimport { invariant } from '../../internal/invariants.js';\nimport { computeAbilityCheck } from '../../derive/ability-check.js';\nimport { abilityModifier } from '../../derive/ability.js';\nimport type { ULID } from '../ids-utils.js';\nimport type {\n MoraleCheckRolledEvent,\n MoraleBrokenEvent,\n AttitudeChangedEvent,\n} from '../../schemas/events/npc.js';\nimport type { AbilityCheckRolledEvent } from '../../schemas/events/checks.js';\n\nexport interface MoraleCheckIntent {\n readonly type: 'MoraleCheck';\n readonly npcId: string;\n readonly dc: number;\n readonly breakAction?: 'flee' | 'surrender';\n readonly at?: string;\n}\n\nexport const planMoraleCheck = (\n state: CampaignState,\n _content: ResolvedContent,\n rng: RNG,\n intent: MoraleCheckIntent,\n): ReadonlyArray<Event> => {\n const npc = state.characters[intent.npcId];\n invariant(npc !== undefined, `NPC ${intent.npcId} not found`);\n const at = intent.at ?? nowIso();\n const bonus = abilityModifier(npc.abilityScores.WIS);\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + bonus;\n const success = total >= intent.dc;\n const events: Event[] = [];\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'MoraleCheckRolled',\n characterId: intent.npcId,\n d20,\n bonus,\n total,\n dc: intent.dc,\n success,\n } satisfies MoraleCheckRolledEvent);\n if (!success && npc.morale !== undefined && npc.morale.current <= 1) {\n events.push({\n id: newEventId() as ULID,\n at,\n type: 'MoraleBroken',\n characterId: intent.npcId,\n action: intent.breakAction ?? 'flee',\n } satisfies MoraleBrokenEvent);\n }\n return events;\n};\n\nexport interface ReactionRollIntent {\n readonly type: 'ReactionRoll';\n readonly npcId: string;\n readonly presenterId: string;\n readonly dc?: number;\n readonly at?: string;\n}\n\nconst reactionAttitudeFor = (total: number, dc: number): 'hostile' | 'unfriendly' | 'indifferent' | 'friendly' | 'helpful' => {\n const delta = total - dc;\n if (delta >= 10) return 'helpful';\n if (delta >= 5) return 'friendly';\n if (delta >= 0) return 'indifferent';\n if (delta >= -5) return 'unfriendly';\n return 'hostile';\n};\n\nexport const planReactionRoll = (\n state: CampaignState,\n content: ResolvedContent,\n rng: RNG,\n intent: ReactionRollIntent,\n): ReadonlyArray<Event> => {\n const npc = state.characters[intent.npcId];\n invariant(npc !== undefined, `NPC ${intent.npcId} not found`);\n const presenter = state.characters[intent.presenterId];\n invariant(presenter !== undefined, `Presenter ${intent.presenterId} not found`);\n const dc = intent.dc ?? 10;\n const at = intent.at ?? nowIso();\n const derivation = computeAbilityCheck({\n character: presenter,\n itemInstances: state.itemInstances,\n content,\n ability: 'CHA',\n skill: 'persuasion',\n pendingChoices: state.pendingChoices,\n });\n const d20 = rollDie(D20_SIDES, rng);\n const total = d20 + derivation.total;\n const newAttitude = reactionAttitudeFor(total, dc);\n return [\n {\n id: newEventId() as ULID,\n at,\n type: 'AbilityCheckRolled',\n characterId: intent.presenterId,\n ability: 'CHA',\n skill: 'persuasion',\n dc,\n success: total >= dc,\n d20: [d20],\n used: 'none',\n bonus: derivation.total,\n total,\n } satisfies AbilityCheckRolledEvent,\n {\n id: newEventId() as ULID,\n at,\n type: 'AttitudeChanged',\n characterId: intent.npcId,\n ...(npc.attitude !== undefined ? { fromAttitude: npc.attitude } : {}),\n toAttitude: newAttitude,\n cause: 'reaction roll',\n } satisfies AttitudeChangedEvent,\n ];\n};\n","import type { CampaignState } from '../schemas/runtime/campaign.js';\nimport { emptyCampaignState } from '../schemas/runtime/campaign.js';\nimport type { Event } from '../schemas/events/index.js';\nimport type { ContentPack, ResolvedContent } from '../content/pack.js';\nimport { resolveContent } from '../content/pack.js';\nimport { validateCrossReferences } from '../content/validate.js';\nimport type { RNG } from '../rng/index.js';\nimport { defaultRNG } from '../rng/default.js';\nimport type { HandlerRegistry } from '../handlers/index.js';\nimport { apply, applyAll } from './apply.js';\nimport { replay } from './replay.js';\nimport { commit, type Campaign } from './commit.js';\nimport { undo, redo } from './undo-redo.js';\n\nexport { apply, applyAll } from './apply.js';\nexport { replay } from './replay.js';\nexport { commit } from './commit.js';\nexport { undo, redo } from './undo-redo.js';\nexport { performIntent, serializeCampaign, loadCampaign, createPC } from './conveniences.js';\nexport type { CreatePCOptions, SerializedCampaign } from './conveniences.js';\nimport { performIntent } from './conveniences.js';\nimport {\n planShortRest,\n planLongRest,\n planAttack,\n planCreateEncounter,\n planRollInitiative,\n planStartEncounter,\n planBeginFirstTurn,\n planAdvanceTurn,\n planEndEncounter,\n planLevelUp,\n planResolveChoice,\n planSave,\n planAbilityCheck,\n planCastSpell,\n planCheckConcentration,\n planOpportunityAttack,\n planMove,\n planDash,\n planDisengage,\n planActionSurge,\n planOffHandAttack,\n planMultiattack,\n planFalling,\n planGrapple,\n planShove,\n planHide,\n planCounterspell,\n planDispelMagic,\n planIdentify,\n planWeaponMastery,\n planForage,\n planNavigationCheck,\n planMoraleCheck,\n planReactionRoll,\n type GrappleIntent,\n type ShoveIntent,\n type HideIntent,\n type CounterspellIntent,\n type DispelMagicIntent,\n type IdentifyIntent,\n type WeaponMasteryIntent,\n type ForageIntent,\n type NavigationCheckIntent,\n type MoraleCheckIntent,\n type ReactionRollIntent,\n type RestIntent,\n type AttackIntent,\n type OpportunityAttackIntent,\n type MoveIntent,\n type DashIntent,\n type DisengageIntent,\n type ActionSurgeIntent,\n type OffHandAttackIntent,\n type MultiattackIntent,\n type FallingIntent,\n type CreateEncounterIntent,\n type RollInitiativeIntent,\n type StartEncounterIntent,\n type AdvanceTurnIntent,\n type BeginFirstTurnIntent,\n type EndEncounterIntent,\n type LevelUpIntent,\n type ResolveChoiceIntent,\n type SaveIntent,\n type AbilityCheckIntent,\n type CastSpellIntent,\n type CheckConcentrationIntent,\n} from './plan/index.js';\nimport { newCampaignId } from '../ids.js';\nimport { SCHEMA_VERSION } from '../version.js';\nimport { computeAC } from '../derive/ac.js';\nimport { computeSavingThrow } from '../derive/save.js';\nimport { computeAttackBonus } from '../derive/attack.js';\nimport { computeSpellSaveDC, computeSpellAttackBonus } from '../derive/spell-dc.js';\nimport { computeDerivedCharacter } from '../derive/character-view.js';\nimport { computeSpellSlots } from '../derive/spell-slots.js';\nimport { abilityModifier, proficiencyBonus } from '../derive/ability.js';\nimport type { AbilityScore } from '../schemas/primitives.js';\n\nexport interface CreateEngineOptions {\n readonly rng?: RNG;\n readonly contentPacks: ReadonlyArray<ContentPack>;\n readonly handlers?: HandlerRegistry;\n}\n\nexport interface CampaignInit {\n readonly id?: string;\n readonly name: string;\n}\n\nexport interface PlanResult {\n readonly events: ReadonlyArray<Event>;\n}\n\nexport interface Engine {\n readonly content: ResolvedContent;\n readonly schemaVersion: number;\n readonly rng: RNG;\n\n createCampaign(init: CampaignInit): Campaign;\n\n apply(state: CampaignState, event: Event): CampaignState;\n applyAll(state: CampaignState, events: ReadonlyArray<Event>): CampaignState;\n replay(events: ReadonlyArray<Event>): CampaignState;\n commit(campaign: Campaign, events: ReadonlyArray<Event>): Campaign;\n undo(campaign: Campaign): Campaign;\n redo(campaign: Campaign): Campaign;\n do(campaign: Campaign, intent: { readonly type: string } & Record<string, unknown>): Campaign;\n\n plan: {\n shortRest(state: CampaignState, intent: { participantIds: ReadonlyArray<string>; at?: string }): PlanResult;\n longRest(state: CampaignState, intent: { participantIds: ReadonlyArray<string>; at?: string }): PlanResult;\n rest(state: CampaignState, intent: RestIntent): PlanResult;\n attack(state: CampaignState, intent: Omit<AttackIntent, 'type'>): PlanResult;\n opportunityAttack(state: CampaignState, intent: Omit<OpportunityAttackIntent, 'type'>): PlanResult;\n createEncounter(\n state: CampaignState,\n intent: Omit<CreateEncounterIntent, 'type'>,\n ): { events: ReadonlyArray<Event>; encounterId: string };\n rollInitiative(state: CampaignState, intent: Omit<RollInitiativeIntent, 'type'>): PlanResult;\n startEncounter(state: CampaignState, intent: Omit<StartEncounterIntent, 'type'>): PlanResult;\n beginFirstTurn(state: CampaignState, intent: Omit<BeginFirstTurnIntent, 'type'>): PlanResult;\n advanceTurn(state: CampaignState, intent: Omit<AdvanceTurnIntent, 'type'>): PlanResult;\n endEncounter(state: CampaignState, intent: Omit<EndEncounterIntent, 'type'>): PlanResult;\n levelUp(state: CampaignState, intent: Omit<LevelUpIntent, 'type'>): PlanResult;\n resolveChoice(state: CampaignState, intent: Omit<ResolveChoiceIntent, 'type'>): PlanResult;\n save(state: CampaignState, intent: Omit<SaveIntent, 'type'>): PlanResult;\n abilityCheck(state: CampaignState, intent: Omit<AbilityCheckIntent, 'type'>): PlanResult;\n castSpell(state: CampaignState, intent: Omit<CastSpellIntent, 'type'>): PlanResult;\n checkConcentration(\n state: CampaignState,\n intent: Omit<CheckConcentrationIntent, 'type'>,\n ): PlanResult;\n move(state: CampaignState, intent: Omit<MoveIntent, 'type'>): PlanResult;\n dash(state: CampaignState, intent: Omit<DashIntent, 'type'>): PlanResult;\n disengage(state: CampaignState, intent: Omit<DisengageIntent, 'type'>): PlanResult;\n actionSurge(state: CampaignState, intent: Omit<ActionSurgeIntent, 'type'>): PlanResult;\n offHandAttack(state: CampaignState, intent: Omit<OffHandAttackIntent, 'type'>): PlanResult;\n multiattack(state: CampaignState, intent: Omit<MultiattackIntent, 'type'>): PlanResult;\n falling(state: CampaignState, intent: Omit<FallingIntent, 'type'>): PlanResult;\n grapple(state: CampaignState, intent: Omit<GrappleIntent, 'type'>): PlanResult;\n shove(state: CampaignState, intent: Omit<ShoveIntent, 'type'>): PlanResult;\n hide(state: CampaignState, intent: Omit<HideIntent, 'type'>): PlanResult;\n counterspell(state: CampaignState, intent: Omit<CounterspellIntent, 'type'>): PlanResult;\n dispelMagic(state: CampaignState, intent: Omit<DispelMagicIntent, 'type'>): PlanResult;\n identify(state: CampaignState, intent: Omit<IdentifyIntent, 'type'>): PlanResult;\n weaponMastery(state: CampaignState, intent: Omit<WeaponMasteryIntent, 'type'>): PlanResult;\n forage(state: CampaignState, intent: Omit<ForageIntent, 'type'>): PlanResult;\n navigationCheck(state: CampaignState, intent: Omit<NavigationCheckIntent, 'type'>): PlanResult;\n moraleCheck(state: CampaignState, intent: Omit<MoraleCheckIntent, 'type'>): PlanResult;\n reactionRoll(state: CampaignState, intent: Omit<ReactionRollIntent, 'type'>): PlanResult;\n };\n\n derive: {\n character(state: CampaignState, id: string): ReturnType<typeof computeDerivedCharacter>;\n ac(state: CampaignState, characterId: string): ReturnType<typeof computeAC>;\n savingThrow(state: CampaignState, characterId: string, ability: AbilityScore): ReturnType<typeof computeSavingThrow>;\n attackBonus(state: CampaignState, characterId: string, weaponInstanceId: string): ReturnType<typeof computeAttackBonus>;\n spellSaveDC(state: CampaignState, characterId: string, classId: string): ReturnType<typeof computeSpellSaveDC>;\n spellAttackBonus(state: CampaignState, characterId: string, classId: string): ReturnType<typeof computeSpellAttackBonus>;\n spellSlots(state: CampaignState, characterId: string): ReturnType<typeof computeSpellSlots>;\n abilityModifier(score: number): number;\n proficiencyBonus(level: number): number;\n };\n}\n\nconst requireCharacter = (state: CampaignState, id: string) => {\n const c = state.characters[id];\n if (!c) throw new Error(`Unknown character ${id}`);\n return c;\n};\n\nexport const createEngine = (opts: CreateEngineOptions): Engine => {\n const content = resolveContent(opts.contentPacks);\n const validationIssues = validateCrossReferences(content);\n if (validationIssues.length > 0) {\n const formatted = validationIssues.map((i) => `${i.path}: ${i.message}`).join('\\n');\n throw new Error(`Content pack cross-reference validation failed:\\n${formatted}`);\n }\n const rng = opts.rng ?? defaultRNG();\n\n const planNs: Engine['plan'] = {\n shortRest(state, intent) {\n return { events: planShortRest(state, { type: 'ShortRest', ...intent }) };\n },\n longRest(state, intent) {\n return { events: planLongRest(state, { type: 'LongRest', ...intent }) };\n },\n rest(state, intent) {\n if (intent.type === 'ShortRest') return { events: planShortRest(state, intent) };\n return { events: planLongRest(state, intent) };\n },\n attack(state, intent) {\n return { events: planAttack(state, content, rng, { type: 'Attack', ...intent }) };\n },\n opportunityAttack(state, intent) {\n return {\n events: planOpportunityAttack(state, content, rng, {\n type: 'OpportunityAttack',\n ...intent,\n }),\n };\n },\n createEncounter(state, intent) {\n return planCreateEncounter(state, content, { type: 'CreateEncounter', ...intent });\n },\n rollInitiative(state, intent) {\n return {\n events: planRollInitiative(state, content, rng, { type: 'RollInitiative', ...intent }),\n };\n },\n startEncounter(state, intent) {\n return { events: planStartEncounter(state, content, { type: 'StartEncounter', ...intent }) };\n },\n beginFirstTurn(state, intent) {\n return { events: planBeginFirstTurn(state, content, { type: 'BeginFirstTurn', ...intent }) };\n },\n advanceTurn(state, intent) {\n return { events: planAdvanceTurn(state, content, { type: 'AdvanceTurn', ...intent }) };\n },\n endEncounter(state, intent) {\n return { events: planEndEncounter(state, content, { type: 'EndEncounter', ...intent }) };\n },\n levelUp(state, intent) {\n return { events: planLevelUp(state, content, rng, { type: 'LevelUp', ...intent }) };\n },\n resolveChoice(state, intent) {\n return { events: planResolveChoice(state, content, { type: 'ResolveChoice', ...intent }) };\n },\n save(state, intent) {\n return { events: planSave(state, content, rng, { type: 'Save', ...intent }) };\n },\n abilityCheck(state, intent) {\n return { events: planAbilityCheck(state, content, rng, { type: 'AbilityCheck', ...intent }) };\n },\n castSpell(state, intent) {\n return { events: planCastSpell(state, content, rng, { type: 'CastSpell', ...intent }) };\n },\n checkConcentration(state, intent) {\n return {\n events: planCheckConcentration(state, content, rng, {\n type: 'CheckConcentration',\n ...intent,\n }),\n };\n },\n move(state, intent) {\n return { events: planMove(state, content, { type: 'Move', ...intent }) };\n },\n dash(state, intent) {\n return { events: planDash(state, content, { type: 'Dash', ...intent }) };\n },\n disengage(state, intent) {\n return { events: planDisengage(state, content, { type: 'Disengage', ...intent }) };\n },\n actionSurge(state, intent) {\n return { events: planActionSurge(state, content, { type: 'ActionSurge', ...intent }) };\n },\n offHandAttack(state, intent) {\n return { events: planOffHandAttack(state, content, rng, { type: 'OffHandAttack', ...intent }) };\n },\n multiattack(state, intent) {\n return { events: planMultiattack(state, content, rng, { type: 'Multiattack', ...intent }) };\n },\n falling(state, intent) {\n return { events: planFalling(state, content, { type: 'Falling', ...intent }) };\n },\n grapple(state, intent) {\n return { events: planGrapple(state, content, rng, { type: 'Grapple', ...intent }) };\n },\n shove(state, intent) {\n return { events: planShove(state, content, rng, { type: 'Shove', ...intent }) };\n },\n hide(state, intent) {\n return { events: planHide(state, content, rng, { type: 'Hide', ...intent }) };\n },\n counterspell(state, intent) {\n return { events: planCounterspell(state, content, rng, { type: 'Counterspell', ...intent }) };\n },\n dispelMagic(state, intent) {\n return { events: planDispelMagic(state, content, rng, { type: 'DispelMagic', ...intent }) };\n },\n identify(state, intent) {\n return { events: planIdentify(state, content, rng, { type: 'Identify', ...intent }) };\n },\n weaponMastery(state, intent) {\n return { events: planWeaponMastery(state, content, rng, { type: 'WeaponMastery', ...intent }) };\n },\n forage(state, intent) {\n return { events: planForage(state, content, rng, { type: 'Forage', ...intent }) };\n },\n navigationCheck(state, intent) {\n return { events: planNavigationCheck(state, content, rng, { type: 'NavigationCheck', ...intent }) };\n },\n moraleCheck(state, intent) {\n return { events: planMoraleCheck(state, content, rng, { type: 'MoraleCheck', ...intent }) };\n },\n reactionRoll(state, intent) {\n return { events: planReactionRoll(state, content, rng, { type: 'ReactionRoll', ...intent }) };\n },\n };\n\n const memo = new Map<string, unknown>();\n let memoVersion = -1;\n const memoize = <T>(args: ReadonlyArray<string | number>, state: CampaignState, compute: () => T): T => {\n if (state.version !== memoVersion) {\n memo.clear();\n memoVersion = state.version;\n }\n const key = args.join('|');\n if (memo.has(key)) return memo.get(key) as T;\n const result = compute();\n memo.set(key, result);\n return result;\n };\n\n const deriveNs: Engine['derive'] = {\n character(state, id) {\n return memoize(['character', id], state, () =>\n computeDerivedCharacter({\n character: requireCharacter(state, id),\n itemInstances: state.itemInstances,\n content,\n pendingChoices: state.pendingChoices,\n }),\n );\n },\n ac(state, id) {\n return memoize(['ac', id], state, () =>\n computeAC({\n character: requireCharacter(state, id),\n itemInstances: state.itemInstances,\n content,\n pendingChoices: state.pendingChoices,\n }),\n );\n },\n savingThrow(state, id, ability) {\n return memoize(['save', id, ability], state, () =>\n computeSavingThrow({\n character: requireCharacter(state, id),\n itemInstances: state.itemInstances,\n content,\n pendingChoices: state.pendingChoices,\n ability,\n }),\n );\n },\n attackBonus(state, id, weaponInstanceId) {\n return memoize(['attack', id, weaponInstanceId], state, () =>\n computeAttackBonus({\n character: requireCharacter(state, id),\n itemInstances: state.itemInstances,\n content,\n pendingChoices: state.pendingChoices,\n weaponInstanceId,\n }),\n );\n },\n spellSaveDC(state, id, classId) {\n return memoize(['spellDC', id, classId], state, () =>\n computeSpellSaveDC({\n character: requireCharacter(state, id),\n itemInstances: state.itemInstances,\n content,\n pendingChoices: state.pendingChoices,\n classId,\n }),\n );\n },\n spellAttackBonus(state, id, classId) {\n return memoize(['spellAtk', id, classId], state, () =>\n computeSpellAttackBonus({\n character: requireCharacter(state, id),\n itemInstances: state.itemInstances,\n content,\n pendingChoices: state.pendingChoices,\n classId,\n }),\n );\n },\n spellSlots(state, id) {\n return memoize(['slots', id], state, () =>\n computeSpellSlots(requireCharacter(state, id), content.classes),\n );\n },\n abilityModifier(score) {\n return abilityModifier(score);\n },\n proficiencyBonus(level) {\n return proficiencyBonus(level);\n },\n };\n\n return {\n content,\n schemaVersion: SCHEMA_VERSION,\n rng,\n createCampaign(init) {\n return {\n id: init.id ?? newCampaignId(),\n name: init.name,\n state: emptyCampaignState(),\n events: [],\n cursor: 0,\n schemaVersion: SCHEMA_VERSION,\n };\n },\n apply,\n applyAll,\n replay,\n commit,\n undo,\n redo,\n do(campaign, intent) {\n return performIntent(this, campaign, intent);\n },\n plan: planNs,\n derive: deriveNs,\n };\n};\n\nexport type { Campaign } from './commit.js';\n","import { SCHEMA_VERSION } from '../version.js';\n\nexport type MigrationFn = (doc: unknown) => unknown;\n\nconst MIGRATIONS: ReadonlyMap<number, MigrationFn> = new Map<number, MigrationFn>([\n [0, (doc) => doc],\n]);\n\nexport const migrate = (doc: unknown, fromVersion: number, toVersion = SCHEMA_VERSION): unknown => {\n if (fromVersion === toVersion) return doc;\n if (fromVersion > toVersion) {\n throw new Error(`Cannot downgrade schema from ${fromVersion} to ${toVersion}`);\n }\n let current = doc;\n for (let v = fromVersion; v < toVersion; v++) {\n const fn = MIGRATIONS.get(v);\n if (!fn) {\n throw new Error(`No migration from version ${v}`);\n }\n current = fn(current);\n }\n return current;\n};\n\nexport { SCHEMA_VERSION };\n"],"names":["SCHEMA_VERSION","newCharacterId","ulid","newCreatureId","newPartyId","newEncounterId","newCampaignId","newSessionId","newLocationId","newQuestId","newJournalEntryId","newEventId","newChoiceId","newEffectInstanceId","newAppliedConditionId","newItemInstanceId","asCharacterId","s","asCreatureId","asSpeciesId","asBackgroundId","asClassId","asSubclassId","asClassFeatureId","asFeatId","asSpellId","asConditionId","asMonsterStatblockId","asResourceId","asItemDefinitionId","asItemInstanceId","asContentPackId","asHandlerId","ABILITY_SCORES","AbilityScoreSchema","z","ABILITY_SCORE_MIN","ABILITY_SCORE_MAX","AbilityScoreValueSchema","AbilityScoresSchema","SIZES","SizeSchema","CREATURE_TYPES","CreatureTypeSchema","DAMAGE_TYPES","DamageTypeSchema","SKILLS","SkillSchema","SKILL_ABILITY","ProficiencyLevelSchema","PROFICIENCY_MULTIPLIER","HitDieSchema","MovementModeSchema","SpeedSchema","SenseSchema","SensesSchema","SpellSchoolSchema","SPELL_LEVEL_MIN","SPELL_LEVEL_MAX","SpellLevelSchema","CHARACTER_LEVEL_MIN","CHARACTER_LEVEL_MAX","CharacterLevelSchema","EXHAUSTION_MIN","EXHAUSTION_MAX","ExhaustionLevelSchema","ALIGNMENT_LAW_CHAOS","ALIGNMENT_GOOD_EVIL","AlignmentSchema","ULIDSchema","CurrencySchema","CURRENCY_KEYS","RechargeSchema","WEAPON_PROPERTIES","WeaponPropertySchema","WEAPON_MASTERIES","WeaponMasterySchema","DiceExpressionSchema","ConstNodeSchema","AbilityNodeSchema","AbilityModNodeSchema","ProfBonusNodeSchema","LevelNodeSchema","ClassColumnNodeSchema","DiceNodeSchema","FormulaSchema","isFormula","value","EqNodeSchema","SelfNodeSchema","HasPropertyNodeSchema","HasConditionNodeSchema","DamageTypeNodeSchema","NotNodeSchema","PredicateSchema","isPredicate","ModifierTargetSchema","RollTargetSchema","TriggerActionSchema","EffectSchema","EFFECT_KINDS","ConditionSchema","SpeciesSchema","BackgroundSchema","FeatSchema","ClassFeatureSchema","LevelEntrySchema","SpellcastingProgressionSchema","ClassSchema","val","ctx","key","n","SubclassSchema","CANTRIP_SCALING_THRESHOLDS","SpellAttackMechanicSchema","SpellSaveMechanicSchema","SpellHealMechanicSchema","SPELL_AREA_SHAPES","SpellAreaShapeSchema","SpellTargetingSchema","cantripExtraDice","characterLevel","extra","threshold","SpellMechanicSchema","SpellSchema","ItemBaseSchema","WeaponSchema","ArmorSchema","ToolSchema","MagicItemSchema","ConsumableSchema","GearSchema","ItemDefinitionSchema","MonsterStatblockSchema","ResourceStateSchema","AppliedConditionSchema","HPSchema","DeathSavesSchema","ClassEnrollmentSchema","CHARACTER_KINDS","CharacterKindSchema","MultiattackPatternSchema","CharacterSchema","computeTotalLevel","character","acc","enrollment","ItemInstanceSchema","AppliedConditionRefSchema","EffectInstanceSchema","ChoiceOptionSchema","PendingChoiceSchema","EncounterStatusSchema","PositionSchema","TurnUsageSchema","EMPTY_TURN_USAGE","CombatantSchema","EncounterSchema","CURRENCY_DENOMINATIONS","CP_PER_SP","CP_PER_EP","CP_PER_GP","CP_PER_PP","CP_VALUE_BY_DENOMINATION","emptyCurrency","totalInCopper","purse","total","denomination","addCurrency","b","subtractCurrency","result","PartySchema","InGameTimeSchema","MINUTES_PER_HOUR","HOURS_PER_DAY","MINUTES_PER_DAY","breakdownInGameTime","time","formatInGameTime","days","hours","minutes","dd","hh","mm","advanceInGameTime","SessionSchema","JOURNAL_AUTHOR_KINDS","JournalAuthorKindSchema","JOURNAL_VISIBILITIES","JournalVisibilitySchema","JournalEntrySchema","TERRAIN_KINDS","TerrainKindSchema","DEFAULT_CELL_SIZE_FEET","NORMAL_MOVEMENT_COST","DIFFICULT_MOVEMENT_COST","LocationMapSchema","DOOR_STATES","DoorStateSchema","DoorSchema","LocationSchema","QUEST_STATUSES","QuestStatusSchema","OBJECTIVE_STATUSES","ObjectiveStatusSchema","QuestObjectiveSchema","QuestRewardSchema","QuestSchema","EventEnvelopeSchema","QuestStartedEventSchema","ObjectiveProgressedEventSchema","ObjectiveCompletedEventSchema","ObjectiveFailedEventSchema","QuestCompletedEventSchema","QuestFailedEventSchema","QuestAbandonedEventSchema","QuestRewardClaimedEventSchema","XPAwardedEventSchema","MILESTONE_KINDS","MilestoneKindSchema","MilestoneAwardedEventSchema","VEHICLE_KINDS","VehicleKindSchema","VehicleSchema","TRAVEL_PACES","TravelPaceSchema","TravelLegSchema","DOWNTIME_KINDS","DowntimeKindSchema","DOWNTIME_OUTCOMES","DowntimeOutcomeSchema","DowntimeActivityResolvedEventSchema","DowntimeLogEntrySchema","BASTION_FACILITY_KINDS","BastionFacilityKindSchema","BASTION_FACILITY_SPACES","BastionFacilitySpaceSchema","BastionFacilitySchema","BastionHirelingSchema","BastionSchema","CampaignSettingsSchema","defaultCampaignSettings","CampaignStateSchema","emptyCampaignState","DAMAGE_MITIGATION_KINDS","DamageMitigationKindSchema","DamageComponentSchema","DamageAppliedEventSchema","HealedEventSchema","TempHPGrantedEventSchema","ConditionAppliedEventSchema","ConditionRemovedEventSchema","ExhaustionChangedEventSchema","DeathSaveRolledEventSchema","StabilizedEventSchema","ResourceSpentEventSchema","ResourceRestoredEventSchema","HitDieSpentEventSchema","ShortRestStartedEventSchema","ShortRestEndedEventSchema","LongRestStartedEventSchema","LongRestEndedEventSchema","CharacterCreatedEventSchema","EncounterCreatedEventSchema","InitiativeRollSchema","InitiativeRolledEventSchema","EncounterStartedEventSchema","TurnStartedEventSchema","TurnEndedEventSchema","RoundEndedEventSchema","EncounterEndedEventSchema","AttackAdvantageSchema","AttackRolledEventSchema","DamageRollSchema","DamageRolledEventSchema","ItemAcquiredEventSchema","EQUIP_SLOTS","EquipSlotSchema","ItemEquippedEventSchema","ItemUnequippedEventSchema","ItemAttunedEventSchema","ItemUnattunedEventSchema","HPStrategySchema","LevelUpResolvedEventSchema","ChoiceRequiredEventSchema","ChoiceResolvedEventSchema","CheckAdvantageSchema","SaveRolledEventSchema","AbilityCheckRolledEventSchema","SpellSlotSourceSchema","SpellCastDeclaredEventSchema","SpellSlotConsumedEventSchema","PactSlotConsumedEventSchema","ConcentrationStartedEventSchema","ConcentrationBrokenReasonSchema","ConcentrationBrokenEventSchema","TriggerFiredEventSchema","ACTION_ECONOMY_KINDS","ActionEconomyKindSchema","ActionEconomyConsumedEventSchema","CombatantMovedEventSchema","DashedEventSchema","DisengagedEventSchema","PartyCreatedEventSchema","PartyMembersChangedEventSchema","CurrencyAcquiredEventSchema","CurrencySpentEventSchema","ItemDepositedToPartyEventSchema","ItemWithdrawnFromPartyEventSchema","SessionStartedEventSchema","SessionEndedEventSchema","JournalEntryAddedEventSchema","InGameTimeAdvancedEventSchema","LocationCreatedEventSchema","DoorAddedEventSchema","DoorStateChangedEventSchema","CharacterLocationChangedEventSchema","SpellCounteredEventSchema","SpellDispelledEventSchema","ItemIdentifiedEventSchema","WeaponMasteryActivatedEventSchema","MountedEventSchema","DismountedEventSchema","VehicleAcquiredEventSchema","VehicleBoardedEventSchema","VehicleDepartedEventSchema","VehicleDamagedEventSchema","VehicleRepairedEventSchema","TravelLegCompletedEventSchema","NavigationCheckRolledEventSchema","ForagedForEventSchema","ATTITUDES","AttitudeSchema","AttitudeChangedEventSchema","MoraleCheckRolledEventSchema","MoraleBrokenEventSchema","RECHARGE_CADENCES","RechargeCadenceSchema","ItemChargeConsumedEventSchema","ItemRechargedEventSchema","SentientItemConflictEventSchema","BASTION_TURN_ORDERS","BastionTurnOrderSchema","BastionFoundedEventSchema","BastionFacilityAddedEventSchema","BastionHirelingAddedEventSchema","BastionTurnTakenEventSchema","BastionDamagedEventSchema","BastionLevelChangedEventSchema","CampaignSettingsChangedEventSchema","RESURRECTION_SPELLS","ResurrectionSpellSchema","CharacterResurrectedEventSchema","POLYMORPH_KINDS","PolymorphKindSchema","PolymorphFormSchema","PolymorphAppliedEventSchema","PolymorphRevertedEventSchema","SimulacrumCreatedEventSchema","WishGrantedEventSchema","EventSchema","EVENT_TYPES","ContentPackSchema","resolveContent","packs","species","backgrounds","classes","subclasses","feats","spells","items","monsters","conditions","pack","e","formatZodPath","path","p","ContentPackLoadError","issues","summary","body","i","loadContentPack","input","SUGGESTION_DISTANCE_THRESHOLD","levenshtein","prev","_","last","j","temp","cost","suggestSimilar","target","candidates","best","candidate","distance","buildIssue","message","missingId","suggestion","validateCrossReferences","content","id","background","subclass","STARTER_PACK_RAW","starterPackJson","loadStarterPack","DefaultRNG","defaultRNG","SEED_MASK","SEED_ADD","STATE_MOD","SeededRNG","seed","t","salt","seededRNG","RNGCalledInPureContextError","ThrowOnCallRNG","throwOnCallRNG","DICE_EXPRESSION_RE","parseDiceExpression","expression","match","countStr","dieStr","modStr","count","die","modifier","rollDie","rng","rollDice","rolls","rollExpression","parsed","sumOfRolls","r","PROFICIENCY_BONUS_LEVEL_MIN","PROFICIENCY_BONUS_LEVEL_MAX","abilityModifier","score","proficiencyBonus","level","modifierKey","rollKey","emptyAdvantage","EffectAccumulator","source","list","mode","state","type","override","grant","existing","rank","c","current","op","prior","damageType","amount","applyEffectToBuilder","effect","collectResolvedChoiceEffects","pendingChoices","effects","choiceId","choice","optionId","option","o","collectClassEffects","cls","entry","feature","features","collectFeatEffects","featId","feat","collectItemEffects","itemInstances","instanceId","inst","def","collectConditionEffects","applied","condition","collectEffectsFromCharacter","buildEffectStack","UNARMORED_BASE","computeArmorAC","breakdown","armorInstanceId","dexMod","armorInstance","armorDef","dexContribution","shieldInstanceId","shieldInstance","shieldDef","computeUnarmoredOverrideAC","baseValue","ability","mod","capped","computeAC","modifierBonus","chooseAttackAbility","weapon","isFinesse","isWeaponProficient","computeAttackBonus","instance","D20_SIDES","NAT_20","NAT_1","EXHAUSTION_SAVE_PENALTY_PER_LEVEL","CANTRIP_LEVEL","isSaveProficient","computeSavingThrow","abilityMod","totalLevel","penalty","adv","SPELL_DC_BASE","lookupSpellcastingAbility","computeSpellSaveDC","bonus","computeSpellAttackBonus","FULL_CASTER_SLOTS","PACT_SLOTS","casterLevelContribution","progression","computeSpellSlots","classesById","multiclassCasterLevel","pactLevel","onlyOneFullOrHalfClass","multipleSpellcasters","slotsByLevel","effectiveLevel","row","spellSlotsForLevel","spellLevel","computeAvailableSpellSlots","max","standardByLevel","idx","usedKey","used","pact","ABILITIES","computeDerivedCharacter","abilityMods","a","ac","savingThrows","exhaustionPenalty","computeAbilityCheck","profLevel","multiplier","skillModifier","checkModifier","advantageTarget","sum","computePassiveScore","check","advantageBonus","BASE_ATTACKS_PER_ACTION","computeActionEconomyBudget","terrainAt","map","x","y","movementCostFor","terrain","movementCostAt","chebyshevSteps","chebyshevDistanceFeet","cellSizeFeet","isInRangeFeet","from","to","rangeFeet","bresenhamCells","cells","x0","y0","x1","y1","dx","dy","sx","sy","err","e2","doorBlocksSight","door","hasLineOfSight","doorsAtLocation","cell","hasLineOfEffect","averageOfDiceExpression","perDieAverage","evaluateFormula","formula","term","values","getPath","facts","evaluatePredicate","predicate","enableMapSet","immerProduce","recipe","produce","InvariantViolationError","invariant","applyCharacterCreated","event","DEATH_SAVE_SUCCESSES_TO_STABILIZE","DEATH_SAVE_FAILURES_TO_DIE","DEATH_SAVE_NAT_20","DEATH_SAVE_NAT_1","DEATH_SAVE_SUCCESS_THRESHOLD","DEATH_SAVE_NAT_1_FAILURE_COUNT","NAT_20_REVIVE_HP","EXHAUSTION_DEFAULT_LEVEL","requireCharacter","isMassiveDamage","hpBeforeDamage","hpAfterDamage","hpMax","resetDeathSaves","saves","absorbTempHP","rawDamage","absorbed","totalDamageOf","incrementFailures","by","applyDamageApplied","remainingAfterTemp","startedConscious","hpBeforeClamp","applyHealed","wasUnconscious","applyTempHPGranted","applyConditionApplied","applyConditionRemoved","applyExhaustionChanged","applyDeathSaveRolled","applyStabilized","ACTION_SURGE_RESOURCE_ID","resetActionForActionSurgeIfApplicable","encounterId","encounter","combatant","applyActionEconomyConsumed","applyResourceSpent","resource","applyResourceRestored","restored","applyHitDieSpent","ALL_CADENCE_FIELDS","applyTriggerFired","merged","field","incoming","clearCadenceFields","fields","triggerId","counter","clearForParticipants","characterIds","clearTurnCountersForCharacter","characterId","clearRoundCountersForCharacters","clearShortRestCountersForCharacters","clearLongRestCountersForCharacters","applyShortRestStarted","applyShortRestEnded","_event","session","halfRoundedDown","oneMin","applyLongRestStarted","applyLongRestEnded","totalHitDice","remaining","possible","take","applyEncounterCreated","applyInitiativeRolled","totalsById","sortedRolls","orderById","applyEncounterStarted","applyTurnStarted","active","applyTurnEnded","applyRoundEnded","applyEncounterEnded","MAX_ATTUNED_ITEMS","applyItemAcquired","applyItemEquipped","applyItemUnequipped","priorInstanceId","applyItemAttuned","applyItemUnattuned","applyLevelUpResolved","applyChoiceRequired","applyChoiceResolved","applySpellSlotConsumed","previous","applyPactSlotConsumed","applyConcentrationStarted","caster","applyConcentrationBroken","applyCombatantMoved","applyDashed","applyDisengaged","applyPartyCreated","memberId","applyPartyMembersChanged","party","addedId","applyCurrencyAcquired","applyCurrencySpent","applyItemDepositedToParty","applyItemWithdrawnFromParty","recipient","applySessionStarted","applySessionEnded","applyJournalEntryAdded","applyInGameTimeAdvanced","applyLocationCreated","applyDoorAdded","location","applyDoorStateChanged","applyCharacterLocationChanged","cloneObjectives","applyQuestStarted","findObjective","questId","objectiveId","quest","objective","applyObjectiveProgressed","applyObjectiveCompleted","applyObjectiveFailed","applyQuestCompleted","applyQuestFailed","applyQuestAbandoned","applyQuestRewardClaimed","beneficiaryId","beneficiary","applyXPAwarded","applyMilestoneAwarded","applySpellDispelled","applyItemIdentified","item","applyWeaponMasteryActivated","applyMounted","rider","applyDismounted","applyVehicleAcquired","applyVehicleBoarded","vehicle","applyVehicleDeparted","applyVehicleDamaged","applyVehicleRepaired","applyTravelLegCompleted","applyNavigationCheckRolled","applyForagedFor","applyAttitudeChanged","applyMoraleCheckRolled","applyMoraleBroken","applyDowntimeActivityResolved","applyItemChargeConsumed","applyItemRecharged","cap","applySentientItemConflict","applyBastionFounded","applyBastionFacilityAdded","bastion","f","applyBastionHirelingAdded","applyBastionTurnTaken","applyBastionDamaged","applyBastionLevelChanged","applyCampaignSettingsChanged","applyCharacterResurrected","applyPolymorphApplied","applyPolymorphReverted","snap","applySimulacrumCreated","original","applyWishGranted","granter","apply","draft","applyAll","events","replay","commit","campaign","nextState","nextEvents","undo","cursor","replayedEvents","redo","performIntent","engine","intent","planner","rest","SerializedCampaignSchema","serializeCampaign","loadCampaign","json","DEFAULT_ABILITY_SCORES","createPC","opts","nowIso","planShortRest","_state","at","start","end","planLongRest","RESISTANCE_DIVISOR","VULNERABILITY_MULTIPLIER","halfRoundDown","mitigateDamage","component","rawAmount","flatReduction","afterFlat","buildEventFacts","cadenceAllowsFiring","oncePer","cadencePayload","rollAddDamage","action","critical","v","fireAddDamage","causedByEventId","fireTrigger","cadence","triggerFired","triggerIdOf","explicit","filterHash","dispatchTriggers","emitted","filter","fired","HALF_COVER_AC_BONUS","THREE_QUARTERS_COVER_AC_BONUS","coverACBonus","cover","chooseDamageAbility","attacker","resolveAttack","weaponInstance","weaponDef","attackBonusResult","acResultBase","coverBonus","acResult","advantage","usedRoll","naturalHit","hit","attackRolled","stateAfterAttack","attackTriggers","damageAbility","damageAbilityMod","totalRolls","damageRolls","damageRollPayload","damageRolled","damageTotal","mitigatedComponents","damageApplied","planAttack","economyPrelude","planActionEconomyForAttack","resolution","findActiveCombatant","attackerId","budget","findReactor","reactorId","reactor","planOpportunityAttack","eligibility","reactionConsumed","planCreateEncounter","_content","planRollInitiative","d20","planStartEncounter","planAdvanceTurn","turnEnd","roundEnd","first","nextTurn","next","planBeginFirstTurn","planEndEncounter","HP_AVERAGE_BY_DIE","planLevelUp","newClassLevel","conMod","hpRoll","baseGain","avg","hpGained","levelUp","newLevelEntry","planResolveChoice","rollWithAdvantage","second","resolveAdvantage","requested","derivedAdv","derivedDis","planSave","derivation","planAbilityCheck","findCastingClass","preferred","characterKnowsSpell","spellId","chooseSlotSource","spell","available","rollDamage","baseExpression","bonusDice","doubleDice","totalDieCount","rollCantripScaling","scalingExpression","extraSteps","dieCount","halveDamage","totalDamage","planAttackMechanic","mechanic","declaredEventId","castingClassId","attackBonus","cantripSteps","targetId","targetAC","isCrit","attackEvent","baseRolls","scalingRolls","mitigated","planSaveMechanic","dcResult","conditionsApplied","saveDerivation","success","saveEvent","raw","finalAmount","appliedConditionId","cond","planHealMechanic","castingAbilityMod","heal","planCastSpell","slotSource","castAsRitual","declared","consumed","outcome","priorBroken","started","CONCENTRATION_MIN_DC","CONCENTRATION_DC_DIVISOR","concentrationDC","damageTaken","planCheckConcentration","dc","save","broken","chebyshevDistance","findCombatant","combatantId","isActive","characterWalkSpeed","planMove","baseSpeed","maxThisTurn","planDash","actionConsumed","dashed","planDisengage","disengaged","findActive","planActionSurge","findActiveEncounter","planOffHandAttack","bonusActionConsumed","strMod","offHandModifier","planMultiattack","pattern","swing","FALLING_FEET_PER_DIE","FALLING_DIE_AVERAGE","FALLING_MAX_DICE","fallingDieCount","distanceFeet","expectedFallingDamage","dice","planFalling","UNARMED_DC_BASE","HIDE_DEFAULT_DC","SHOVE_PUSH_FEET","unarmedSaveDC","str","prof","consumeActionIfEncountered","planGrapple","consume","planShove","attackerPos","targetCells","planHide","DC_ABOVE_AUTO_FAIL","COUNTERSPELL_SLOT_LEVEL","economyConsumedIfEncountered","kind","planCounterspell","conBonus","saveSucceeded","slotLevel","reaction","planDispelMagic","autoSucceed","dispelSucceeds","rawAbility","planIdentify","_rng","CELL_SIZE_FEET","PUSH_DISTANCE_FEET","masterySaveDC","recordMasteryEvent","mastery","weaponInstanceId","planWeaponMastery","weaponInst","targetCombatant","grazeAmount","FORAGE_FOOD_ON_SUCCESS","FORAGE_WATER_ON_SUCCESS","planForage","forager","planNavigationCheck","navigator","planMoraleCheck","npc","reactionAttitudeFor","delta","planReactionRoll","presenter","newAttitude","createEngine","validationIssues","formatted","planNs","memo","memoVersion","memoize","args","compute","init","classId","MIGRATIONS","doc","migrate","fromVersion","toVersion","fn"],"mappings":";;;AAAO,MAAMA,KAAiB,GCqCjBC,KAAiB,MAAmBC,EAAA,GACpCC,KAAgB,MAAkBD,EAAA,GAClCE,KAAa,MAAeF,EAAA,GAC5BG,KAAiB,MAAmBH,EAAA,GACpCI,KAAgB,MAAkBJ,EAAA,GAClCK,KAAe,MAAiBL,EAAA,GAChCM,KAAgB,MAAkBN,EAAA,GAClCO,KAAa,MAAeP,EAAA,GAC5BQ,KAAoB,MAAsBR,EAAA,GAC1CS,IAAa,MAAeT,EAAA,GAC5BU,KAAc,MAAgBV,EAAA,GAC9BW,KAAsB,MAAwBX,EAAA,GAC9CY,IAAwB,MAA0BZ,EAAA,GAClDa,KAAoB,MAAsBb,EAAA,GAE1Cc,KAAgB,CAACC,MAA2BA,GAC5CC,KAAe,CAACD,MAA0BA,GAC1CE,KAAc,CAACF,MAAyBA,GACxCG,KAAiB,CAACH,MAA4BA,GAC9CI,KAAY,CAACJ,MAAuBA,GACpCK,KAAe,CAACL,MAA0BA,GAC1CM,KAAmB,CAACN,MAA8BA,GAClDO,KAAW,CAACP,MAAsBA,GAClCQ,KAAY,CAACR,MAAuBA,GACpCS,KAAgB,CAACT,MAA2BA,GAC5CU,KAAuB,CAACV,MAAkCA,GAC1DW,KAAe,CAACX,MAA0BA,GAC1CY,KAAqB,CAACZ,MAAgCA,GACtDa,KAAmB,CAACb,MAA8BA,GAClDc,KAAkB,CAACd,MAA6BA,GAChDe,KAAc,CAACf,MAAyBA,GCjExCgB,KAAiB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GAC1DC,IAAqBC,EAAE,KAAKF,EAAc,GAG1CG,KAAoB,GACpBC,KAAoB,IACpBC,KAA0BH,EACpC,SACA,IAAA,EACA,IAAIC,EAAiB,EACrB,IAAIC,EAAiB,GAEXE,KAAsBJ,EAAE,OAAO;AAAA,EAC1C,KAAKG;AAAA,EACL,KAAKA;AAAA,EACL,KAAKA;AAAA,EACL,KAAKA;AAAA,EACL,KAAKA;AAAA,EACL,KAAKA;AACP,CAAC,GAGYE,KAAQ,CAAC,QAAQ,SAAS,UAAU,SAAS,QAAQ,YAAY,GACjEC,KAAaN,EAAE,KAAKK,EAAK,GAGzBE,KAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACaC,KAAqBR,EAAE,KAAKO,EAAc,GAG1CE,KAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACaC,IAAmBV,EAAE,KAAKS,EAAY,GAGtCE,KAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACaC,KAAcZ,EAAE,KAAKW,EAAM,GAG3BE,KAA6C;AAAA,EACxD,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,UAAU;AACZ,GAEaC,KAAyBd,EAAE,KAAK,CAAC,QAAQ,QAAQ,cAAc,WAAW,CAAC,GAG3Ee,KAA2D;AAAA,EACtE,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,WAAW;AACb,GAEaC,KAAehB,EAAE,MAAM;AAAA,EAClCA,EAAE,QAAQ,CAAC;AAAA,EACXA,EAAE,QAAQ,CAAC;AAAA,EACXA,EAAE,QAAQ,EAAE;AAAA,EACZA,EAAE,QAAQ,EAAE;AACd,CAAC,GAGYiB,KAAqBjB,EAAE,KAAK,CAAC,QAAQ,OAAO,QAAQ,SAAS,QAAQ,CAAC,GAGtEkB,KAAclB,EAAE,OAAO;AAAA,EAClC,MAAMA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACvC,KAAKA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC7B,MAAMA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC9B,OAAOA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC/B,QAAQA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAChC,OAAOA,EAAE,QAAA,EAAU,SAAA;AACrB,CAAC,GAGYmB,KAAcnB,EAAE,KAAK,CAAC,cAAc,cAAc,eAAe,WAAW,CAAC,GAG7EoB,KAAepB,EAAE,OAAO;AAAA,EACnC,YAAYA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACpC,YAAYA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACpC,aAAaA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACrC,WAAWA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnC,2BAA2BA,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AACrD,CAAC,GAGYqB,KAAoBrB,EAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAGYsB,KAAkB,GAClBC,KAAkB,GAClBC,KAAmBxB,EAAE,SAAS,IAAA,EAAM,IAAIsB,EAAe,EAAE,IAAIC,EAAe,GAG5EE,KAAsB,GACtBC,KAAsB,IACtBC,KAAuB3B,EACjC,SACA,IAAA,EACA,IAAIyB,EAAmB,EACvB,IAAIC,EAAmB,GAGbE,KAAiB,GACjBC,KAAiB,GACjBC,KAAwB9B,EAClC,SACA,IAAA,EACA,IAAI4B,EAAc,EAClB,IAAIC,EAAc,GAGRE,KAAsB,CAAC,UAAU,WAAW,SAAS,GACrDC,KAAsB,CAAC,QAAQ,WAAW,MAAM,GAChDC,KAAkBjC,EAAE,MAAM;AAAA,EACrCA,EAAE,QAAQ,WAAW;AAAA,EACrBA,EAAE,QAAQ,KAAK;AAAA,EACfA,EAAE,OAAO;AAAA,IACP,UAAUA,EAAE,KAAK+B,EAAmB;AAAA,IACpC,UAAU/B,EAAE,KAAKgC,EAAmB;AAAA,EAAA,CACrC;AACH,CAAC,GAGYE,IAAalC,EAAE,OAAA,EAAS,MAAM,6BAA6B,iBAAiB,GAE5EmC,KAAiBnC,EAAE,OAAO;AAAA,EACrC,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACrC,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACrC,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACrC,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACrC,IAAIA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AACvC,CAAC,GAGYoC,KAAgB,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,GAG7CC,KAAiBrC,EAAE,KAAK;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAGYsC,KAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACaC,KAAuBvC,EAAE,KAAKsC,EAAiB,GAG/CE,KAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACaC,KAAsBzC,EAAE,KAAKwC,EAAgB,GAG7CE,IAAuB1C,EAAE,SAAS,MAAM,yBAAyB;AAAA,EAC5E,SAAS;AACX,CAAC,GC3PK2C,KAAkB3C,EAAE,OAAO;AAAA,EAC/B,MAAMA,EAAE,QAAQ,OAAO;AAAA,EACvB,OAAOA,EAAE,OAAA;AACX,CAAC,GAEK4C,KAAoB5C,EAAE,OAAO;AAAA,EACjC,MAAMA,EAAE,QAAQ,SAAS;AAAA,EACzB,SAASD;AACX,CAAC,GAEK8C,KAAuB7C,EAAE,OAAO;AAAA,EACpC,MAAMA,EAAE,QAAQ,YAAY;AAAA,EAC5B,SAASD;AACX,CAAC,GAEK+C,KAAsB9C,EAAE,OAAO;AAAA,EACnC,MAAMA,EAAE,QAAQ,WAAW;AAC7B,CAAC,GAEK+C,KAAkB/C,EAAE,OAAO;AAAA,EAC/B,MAAMA,EAAE,QAAQ,OAAO;AAAA,EACvB,SAASA,EAAE,OAAA,EAAS,SAAA;AACtB,CAAC,GAEKgD,KAAwBhD,EAAE,OAAO;AAAA,EACrC,MAAMA,EAAE,QAAQ,UAAU;AAAA,EAC1B,SAASA,EAAE,OAAA;AAAA,EACX,QAAQA,EAAE,OAAA;AACZ,CAAC,GAEKiD,KAAiBjD,EAAE,OAAO;AAAA,EAC9B,MAAMA,EAAE,QAAQ,MAAM;AAAA,EACtB,YAAY0C;AAAA,EACZ,SAAS1C,EAAE,QAAA,EAAU,SAAA;AACvB,CAAC,GA+CYkD,IAAoClD,EAAE;AAAA,EAAK,MACtDA,EAAE,MAAM;AAAA,IACN2C;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAjD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,KAAK;AAAA,MACrB,OAAOA,EAAE,MAAMkD,CAAa;AAAA,IAAA,CAC7B;AAAA,IACDlD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,KAAK;AAAA,MACrB,OAAOA,EAAE,MAAMkD,CAAa,EAAE,IAAI,CAAC;AAAA,IAAA,CACpC;AAAA,IACDlD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,KAAK;AAAA,MACrB,OAAOA,EAAE,MAAMkD,CAAa,EAAE,IAAI,CAAC;AAAA,IAAA,CACpC;AAAA,IACDlD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,UAAU;AAAA,MAC1B,OAAOA,EAAE,MAAMkD,CAAa;AAAA,IAAA,CAC7B;AAAA,IACDlD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,OAAO;AAAA,MACvB,MAAMkD;AAAA,IAAA,CACP;AAAA,IACDlD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,MAAM;AAAA,MACtB,MAAMkD;AAAA,IAAA,CACP;AAAA,EAAA,CACF;AACH,GAEaC,KAAY,CAACC,MACxBF,EAAc,UAAUE,CAAK,EAAE,SCtH3BC,KAAerD,EAAE,OAAO;AAAA,EAC5B,MAAMA,EAAE,QAAQ,IAAI;AAAA,EACpB,MAAMA,EAAE,OAAA;AAAA,EACR,OAAOA,EAAE,MAAM,CAACA,EAAE,UAAUA,EAAE,OAAA,GAAUA,EAAE,QAAA,GAAWA,EAAE,KAAA,CAAM,CAAC;AAChE,CAAC,GAEKsD,KAAiBtD,EAAE,OAAO;AAAA,EAC9B,MAAMA,EAAE,QAAQ,MAAM;AACxB,CAAC,GAEKuD,KAAwBvD,EAAE,OAAO;AAAA,EACrC,MAAMA,EAAE,QAAQ,aAAa;AAAA,EAC7B,UAAUuC;AACZ,CAAC,GAEKiB,KAAyBxD,EAAE,OAAO;AAAA,EACtC,MAAMA,EAAE,QAAQ,cAAc;AAAA,EAC9B,aAAaA,EAAE,OAAA;AACjB,CAAC,GAEKyD,KAAuBzD,EAAE,OAAO;AAAA,EACpC,MAAMA,EAAE,QAAQ,YAAY;AAAA,EAC5B,MAAMU;AACR,CAAC,GAEKgD,KAAgB1D,EAAE;AAAA,EAAK,MAC3BA,EAAE,OAAO;AAAA,IACP,MAAMA,EAAE,QAAQ,KAAK;AAAA,IACrB,MAAM2D;AAAA,EAAA,CACP;AACH,GA2BaA,IAAwC3D,EAAE;AAAA,EAAK,MAC1DA,EAAE,MAAM;AAAA,IACNqD;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAzD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,KAAK;AAAA,MACrB,OAAOA,EAAE,MAAM2D,CAAe;AAAA,IAAA,CAC/B;AAAA,IACD3D,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,KAAK;AAAA,MACrB,OAAOA,EAAE,MAAM2D,CAAe;AAAA,IAAA,CAC/B;AAAA,IACDD;AAAA,IACA1D,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,QAAQ,GAAG;AAAA,IACtCA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,OAAO,GAAG;AAAA,EAAA,CACtC;AACH,GAEa4D,KAAc,CAACR,MAC1BO,EAAgB,UAAUP,CAAK,EAAE,SC1CtBS,KAAkD7D,EAAE,MAAM;AAAA,EACrEA,EAAE,QAAQ,IAAI;AAAA,EACdA,EAAE,QAAQ,QAAQ;AAAA,EAClBA,EAAE,QAAQ,QAAQ;AAAA,EAClBA,EAAE,QAAQ,YAAY;AAAA,EACtBA,EAAE,QAAQ,aAAa;AAAA,EACvBA,EAAE,QAAQ,aAAa;AAAA,EACvBA,EAAE,QAAQ,OAAO;AAAA,EACjBA,EAAE,QAAQ,OAAO;AAAA,EACjBA,EAAE,QAAQ,mBAAmB;AAAA,EAC7BA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,MAAM,GAAG,SAASD,GAAoB;AAAA,EACjEC,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,OAAO,GAAG,SAASD,GAAoB;AAAA,EAClEC,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,OAAO,GAAG,OAAOY,GAAA,CAAa;AAC3D,CAAC,GAUYkD,KAA0C9D,EAAE,MAAM;AAAA,EAC7DA,EAAE,QAAQ,QAAQ;AAAA,EAClBA,EAAE,QAAQ,QAAQ;AAAA,EAClBA,EAAE,QAAQ,YAAY;AAAA,EACtBA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,MAAM,GAAG,SAASD,GAAoB;AAAA,EACjEC,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,OAAO,GAAG,SAASD,GAAoB;AAAA,EAClEC,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,OAAO,GAAG,OAAOY,GAAA,CAAa;AAC3D,CAAC,GAUYmD,KAAgD/D,EAAE,MAAM;AAAA,EACnEA,EAAE,OAAO;AAAA,IACP,MAAMA,EAAE,QAAQ,WAAW;AAAA,IAC3B,MAAM0C;AAAA,IACN,YAAYhC;AAAA,EAAA,CACb;AAAA,EACDV,EAAE,OAAO;AAAA,IACP,MAAMA,EAAE,QAAQ,MAAM;AAAA,IACtB,QAAQA,EAAE,MAAM,CAACA,EAAE,OAAA,GAAUkD,CAAa,CAAC;AAAA,EAAA,CAC5C;AAAA,EACDlD,EAAE,OAAO;AAAA,IACP,MAAMA,EAAE,QAAQ,gBAAgB;AAAA,IAChC,aAAaA,EAAE,OAAA;AAAA,IACf,gBAAgBA,EAAE,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAC3C;AAAA,EACDA,EAAE,OAAO;AAAA,IACP,MAAMA,EAAE,QAAQ,eAAe;AAAA,IAC/B,YAAYA,EAAE,OAAA;AAAA,IACd,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAAA,CAC/B;AAAA,EACDA,EAAE,OAAO;AAAA,IACP,MAAMA,EAAE,QAAQ,mBAAmB;AAAA,IACnC,QAAQA,EAAE,MAAM,CAACA,EAAE,OAAA,GAAUkD,CAAa,CAAC;AAAA,IAC3C,KAAKlD,EAAE,OAAA,EAAS,SAAA;AAAA,EAAS,CAC1B;AAAA,EACDA,EAAE,OAAO;AAAA,IACP,MAAMA,EAAE,QAAQ,WAAW;AAAA,IAC3B,WAAWA,EAAE,OAAA;AAAA,IACb,SAASA,EAAE,QAAA,EAAU,SAAA;AAAA,EAAS,CAC/B;AACH,CAAC,GAiCYgE,IAAkChE,EAAE;AAAA,EAAK,MACpDA,EAAE,MAAM;AAAA,IACNA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,kBAAkB;AAAA,MAClC,QAAQA,EAAE,KAAK,CAAC,SAAS,QAAQ,UAAU,SAAS,QAAQ,UAAU,CAAC;AAAA,MACvE,IAAIA,EAAE,OAAA;AAAA,MACN,OAAOc;AAAA,IAAA,CACR;AAAA,IACDd,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,YAAY;AAAA,MAC5B,OAAOmB;AAAA,MACP,OAAOnB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAAA,CAC9B;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,aAAa;AAAA,MAC7B,MAAMiB;AAAA,MACN,IAAIjB,EAAE,KAAK,CAAC,OAAO,OAAO,UAAU,CAAC;AAAA,MACrC,OAAOA,EAAE,OAAA;AAAA,IAAO,CACjB;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,aAAa;AAAA,MAC7B,QAAQ6D;AAAA,MACR,OAAO7D,EAAE,MAAM,CAACA,EAAE,OAAA,GAAUkD,CAAa,CAAC;AAAA,MAC1C,WAAWS,EAAgB,SAAA;AAAA,IAAS,CACrC;AAAA,IACD3D,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,cAAc;AAAA,MAC9B,IAAI8D;AAAA,MACJ,MAAM9D,EAAE,KAAK,CAAC,aAAa,gBAAgB,aAAa,WAAW,CAAC;AAAA,MACpE,WAAW2D,EAAgB,SAAA;AAAA,IAAS,CACrC;AAAA,IACD3D,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,iBAAiB;AAAA,MACjC,YAAYA,EAAE,MAAM,CAACU,GAAkBV,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,MACxD,WAAW2D,EAAgB,SAAA;AAAA,IAAS,CACrC;AAAA,IACD3D,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,eAAe;AAAA,MAC/B,YAAYA,EAAE,MAAM,CAACU,GAAkBV,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,IAAA,CACzD;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,oBAAoB;AAAA,MACpC,YAAYU;AAAA,IAAA,CACb;AAAA,IACDV,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,wBAAwB;AAAA,MACxC,aAAaA,EAAE,OAAA;AAAA,IAAO,CACvB;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,mBAAmB;AAAA,MACnC,MAAMA,EAAE,MAAM,CAACA,EAAE,OAAA,GAAUA,EAAE,QAAQ,KAAK,GAAGA,EAAE,QAAQ,KAAK,GAAGA,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,MAChF,kBAAkBA,EAAE,MAAMD,CAAkB;AAAA,MAC5C,QAAQC,EAAE,OAAA,EAAS,SAAA;AAAA,MACnB,UAAUA,EAAE,SAAS,IAAA,EAAM,SAAA;AAAA,IAAS,CACrC;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,eAAe;AAAA,MAC/B,YAAYA,EAAE,OAAA;AAAA,MACd,KAAKA,EAAE,MAAM,CAACA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,GAAGkD,CAAa,CAAC;AAAA,MACrD,UAAUb;AAAA,MACV,UAAUrC,EAAE,SAAS,IAAA,EAAM,SAAA;AAAA,IAAS,CACrC;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,iBAAiB;AAAA,MACjC,OAAOwB;AAAA,MACP,OAAOxB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,MAC7B,QAAQA,EAAE,KAAK,CAAC,QAAQ,QAAQ,SAAS,MAAM,CAAC;AAAA,IAAA,CACjD;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,YAAY;AAAA,MAC5B,SAASA,EAAE,OAAA;AAAA,MACX,aAAaA,EAAE,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACD,qBAAqBD,EAAmB,SAAA;AAAA,IAAS,CAClD;AAAA,IACDC,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,SAAS;AAAA,MACzB,IAAIA,EAAE,OAAA,EAAS,SAAA;AAAA,MACf,SAASA,EAAE,OAAO;AAAA,QAChB,WAAWA,EAAE,OAAA;AAAA,QACb,QAAQ2D,EAAgB,SAAA;AAAA,MAAS,CAClC;AAAA,MACD,SAAS3D,EAAE,MAAM+D,EAAmB;AAAA,MACpC,SAAS/D,EAAE,KAAK,CAAC,QAAQ,SAAS,aAAa,UAAU,CAAC,EAAE,SAAA;AAAA,MAC5D,kBAAkBA,EAAE,QAAA,EAAU,SAAA;AAAA,IAAS,CACxC;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,iBAAiB;AAAA,MACjC,YAAYA,EAAE,OAAA;AAAA,MACd,QAAQA,EAAE,MAAM,CAACA,EAAE,UAAUA,EAAE,QAAQ,KAAK,GAAGkD,CAAa,CAAC;AAAA,MAC7D,MAAMlD,EAAE,KAAK,CAAC,aAAa,YAAY,aAAa,WAAW,MAAM,CAAC;AAAA,IAAA,CACvE;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,aAAa;AAAA,MAC7B,UAAUA,EAAE,OAAA;AAAA,MACZ,MAAMA,EAAE,OAAA;AAAA,MACR,MAAMA,EAAE,KAAK,CAAC,UAAU,eAAe,YAAY,MAAM,CAAC;AAAA,MAC1D,cAAcA,EACX,OAAO,EAAE,YAAYA,EAAE,UAAU,QAAQA,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAA,CAAG,EAClE,SAAA;AAAA,IAAS,CACb;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,qBAAqB;AAAA,MACrC,IAAIA,EAAE,KAAK,CAAC,eAAe,eAAe,kBAAkB,CAAC;AAAA,MAC7D,OAAOA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,MAC7B,WAAW2D,EAAgB,SAAA;AAAA,IAAS,CACrC;AAAA,IACD3D,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,oBAAoB;AAAA,MACpC,WAAWA,EAAE,MAAMyC,EAAmB;AAAA,MACtC,OAAOzC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAAA,CAC9B;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,iBAAiB;AAAA,MACjC,SAASA,EAAE,OAAA;AAAA,MACX,UAAUA,EAAE,MAAMA,EAAE,QAAQ;AAAA,IAAA,CAC7B;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,iBAAiB;AAAA,MACjC,SAASkD;AAAA,IAAA,CACV;AAAA,IACDlD,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,aAAa;AAAA,MAC7B,UAAUA,EAAE,OAAA;AAAA,MACZ,QAAQA,EAAE,OAAA;AAAA,MACV,SAASA,EACN;AAAA,QACCA,EAAE,OAAO;AAAA,UACP,IAAIA,EAAE,OAAA;AAAA,UACN,OAAOA,EAAE,OAAA;AAAA,UACT,SAASA,EAAE,MAAMgE,CAAY;AAAA,QAAA,CAC9B;AAAA,MAAA,EAEF,IAAI,CAAC;AAAA,MACR,OAAOhE,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,MAC7B,MAAMA,EAAE,KAAK,CAAC,aAAa,aAAa,YAAY,CAAC;AAAA,IAAA,CACtD;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,qBAAqB;AAAA,MACrC,aAAaA,EAAE,MAAMU,CAAgB,EAAE,IAAI,CAAC;AAAA,MAC5C,QAAQV,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAAA,CAC/B;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,MAAMA,EAAE,QAAQ,QAAQ;AAAA,MACxB,WAAWA,EAAE,OAAA;AAAA,MACb,QAAQA,EAAE,QAAA,EAAU,SAAA;AAAA,IAAS,CAC9B;AAAA,EAAA,CACF;AACH,GAIaiE,KAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GClUaC,KAAkBlE,EAAE,OAAO;AAAA,EACtC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,SAASA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAAA,EACzC,WAAWhE,EAAE,UAAU,QAAQ,EAAK;AAAA,EACpC,QAAQA,EACL;AAAA,IACCA,EAAE,MAAM;AAAA,MACNA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,WAAW,GAAG;AAAA,MACzCA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,UAAU,GAAG;AAAA,MACxCA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,SAAS,GAAG,SAASA,EAAE,SAAS,SAAA,GAAY;AAAA,MACvEA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,aAAa,GAAG,SAASA,EAAE,OAAA,GAAU,IAAIA,EAAE,SAAS,IAAA,GAAO;AAAA,MACtFA,EAAE,OAAO,EAAE,MAAMA,EAAE,QAAQ,aAAa,GAAG;AAAA,IAAA,CAC5C;AAAA,EAAA,EAEF,QAAQ,CAAA,CAAE;AACf,CAAC,GChBYmE,KAAgBnE,EAAE,OAAO;AAAA,EACpC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,MAAMM;AAAA,EACN,cAAcE,GAAmB,QAAQ,UAAU;AAAA,EACnD,OAAOU;AAAA,EACP,WAAWlB,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACzC,QAAQA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAC1C,CAAC,GCRYI,KAAmBpE,EAAE,OAAO;AAAA,EACvC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,uBAAuBA,EAAE,OAAO;AAAA,IAC9B,SAASA,EAAE,MAAMD,CAAkB,EAAE,IAAI,CAAC;AAAA,IAC1C,SAASC,EAAE,KAAK,CAAC,SAAS,UAAU,CAAC;AAAA,EAAA,CACtC;AAAA,EACD,oBAAoBA,EAAE,MAAMY,EAAW,EAAE,QAAQ,CAAA,CAAE;AAAA,EACnD,mBAAmBZ,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACjD,WAAWA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACzC,cAAcA,EAAE,OAAA;AAAA,EAChB,QAAQA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAC1C,CAAC,GCbYK,KAAarE,EAAE,OAAO;AAAA,EACjC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,UAAUA,EAAE,KAAK,CAAC,UAAU,WAAW,kBAAkB,WAAW,CAAC;AAAA,EACrE,YAAYA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACrC,eAAeA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EAC7C,SAASA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAC3C,CAAC,GCAYM,KAAqBtE,EAAE,OAAO;AAAA,EACzC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,SAASA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAC3C,CAAC,GAGKO,KAAmBvE,EAAE,OAAO;AAAA,EAChC,kBAAkBA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC/C,UAAUA,EAAE,MAAMsE,EAAkB,EAAE,QAAQ,CAAA,CAAE;AAAA,EAChD,SAAStE,EAAE,OAAOA,EAAE,UAAUA,EAAE,MAAM,CAACA,EAAE,UAAUA,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAA,CAAE;AAC7E,CAAC,GAGYwE,KAAgCxE,EAAE,OAAO;AAAA,EACpD,SAASD;AAAA,EACT,MAAMC,EAAE,KAAK,CAAC,QAAQ,QAAQ,SAAS,MAAM,CAAC;AAAA,EAC9C,iBAAiBA,EAAE,OAAA,EAAS,SAAA;AAC9B,CAAC,GAGYyE,KAAczE,EAAE,OAAO;AAAA,EAClC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,QAAQgB;AAAA,EACR,gBAAgBhB,EAAE,MAAMD,CAAkB,EAAE,IAAI,CAAC;AAAA,EACjD,0BAA0BC,EAAE,MAAMD,CAAkB,EAAE,OAAO,CAAC;AAAA,EAC9D,oBAAoBC,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EAClD,qBAAqBA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACnD,mBAAmBA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACjD,cAAcA,EACX,OAAO;AAAA,IACN,SAASA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAC/B,MAAMA,EAAE,MAAMY,EAAW;AAAA,EAAA,CAC1B,EACA,SAAA;AAAA,EACH,YAAYZ,EACT;AAAA,IACCA,EACG,OAAA,EACA,MAAM,uBAAuB,0BAA0B;AAAA,IAC1DuE;AAAA,EAAA,EAED,YAAY,CAACG,GAAKC,MAAQ;AACzB,eAAWC,KAAO,OAAO,KAAKF,CAAG,GAAG;AAClC,YAAMG,IAAI,OAAO,SAASD,GAAK,EAAE;AACjC,OAAIC,IAAIpD,MAAuBoD,IAAInD,OACjCiD,EAAI,SAAS;AAAA,QACX,MAAM3E,EAAE,aAAa;AAAA,QACrB,SAAS,aAAa4E,CAAG;AAAA,MAAA,CAC1B;AAAA,IAEL;AAAA,EACF,CAAC;AAAA,EACH,eAAe5E,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI0B,EAAmB,EAAE,SAAA;AAAA,EAChE,cAAc8C,GAA8B,SAAA;AAC9C,CAAC,GAGYM,KAAiB9E,EAAE,OAAO;AAAA,EACrC,IAAIA,EAAE,OAAA;AAAA,EACN,eAAeA,EAAE,OAAA;AAAA,EACjB,MAAMA,EAAE,OAAA;AAAA,EACR,aAAaA,EAAE,OAAOA,EAAE,OAAA,GAAUA,EAAE,MAAMsE,EAAkB,CAAC,EAAE,QAAQ,CAAA,CAAE;AAC3E,CAAC,GClEKS,KAA6B,CAAC,GAAG,IAAI,EAAE,GAEvCC,KAA4BhF,EAAE,OAAO;AAAA,EACzC,MAAMA,EAAE,QAAQ,QAAQ;AAAA,EACxB,YAAY0C;AAAA,EACZ,YAAYhC;AAAA,EACZ,uBAAuBV,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC/C,oBAAoB0C,EAAqB,SAAA;AAC3C,CAAC,GAEKuC,KAA0BjF,EAAE,OAAO;AAAA,EACvC,MAAMA,EAAE,QAAQ,MAAM;AAAA,EACtB,SAASD;AAAA,EACT,YAAY2C,EAAqB,SAAA;AAAA,EACjC,YAAYhC,EAAiB,SAAA;AAAA,EAC7B,eAAeV,EAAE,QAAA,EAAU,SAAA;AAAA,EAC3B,iBAAiBA,EAAE,OAAA,EAAS,SAAA;AAAA,EAC5B,uBAAuBA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC/C,oBAAoB0C,EAAqB,SAAA;AAC3C,CAAC,GAEKwC,KAA0BlF,EAAE,OAAO;AAAA,EACvC,MAAMA,EAAE,QAAQ,MAAM;AAAA,EACtB,YAAY0C;AAAA,EACZ,uBAAuB1C,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AACjD,CAAC,GAEYmF,KAAoB,CAAC,QAAQ,QAAQ,QAAQ,UAAU,UAAU,GACjEC,KAAuBpF,EAAE,KAAKmF,EAAiB,GAG/CE,KAAuBrF,EAAE,OAAO;AAAA,EAC3C,OAAOoF;AAAA,EACP,MAAMpF,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC9B,CAAC,GAGYsF,KAAmB,CAACC,MAAmC;AAClE,MAAIC,IAAQ;AACZ,aAAWC,KAAaV;AACtB,IAAIQ,KAAkBE,MAAWD,KAAS;AAE5C,SAAOA;AACT,GAEaE,KAAsB1F,EAAE,mBAAmB,QAAQ;AAAA,EAC9DgF;AAAA,EACAC;AAAA,EACAC;AACF,CAAC,GAGYS,KAAc3F,EAAE,OAAO;AAAA,EAClC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,OAAOwB;AAAA,EACP,QAAQH;AAAA,EACR,aAAarB,EAAE,OAAA;AAAA,EACf,OAAOA,EAAE,OAAA;AAAA,EACT,YAAYA,EAAE,OAAO;AAAA,IACnB,QAAQA,EAAE,UAAU,QAAQ,EAAK;AAAA,IACjC,SAASA,EAAE,UAAU,QAAQ,EAAK;AAAA,IAClC,UAAUA,EAAE,OAAA,EAAS,SAAA;AAAA,EAAS,CAC/B;AAAA,EACD,UAAUA,EAAE,OAAA;AAAA,EACZ,eAAeA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACxC,QAAQA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACjC,SAASA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACvC,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,mBAAmBA,EAAE,MAAM0F,EAAmB,EAAE,QAAQ,CAAA,CAAE;AAAA,EAC1D,WAAWL,GAAqB,SAAA;AAClC,CAAC,GCtEKO,KAAiB5F,EAAE,OAAO;AAAA,EAC9B,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,QAAQA,EAAE,OAAA,EAAS,YAAA,EAAc,SAAA;AAAA,EACjC,MAAMA,EACH,OAAO;AAAA,IACN,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAC9B,UAAUA,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,EAAA,CAChD,EACA,SAAA;AACL,CAAC,GAEY6F,KAAeD,GAAe,OAAO;AAAA,EAChD,UAAU5F,EAAE,QAAQ,QAAQ;AAAA,EAC5B,UAAUA,EAAE,KAAK,CAAC,UAAU,SAAS,CAAC;AAAA,EACtC,YAAYA,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,EACtC,YAAYU;AAAA,EACZ,YAAYgC;AAAA,EACZ,eAAeA,EAAqB,SAAA;AAAA,EACpC,YAAY1C,EAAE,MAAMuC,EAAoB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACpD,SAASE,GAAoB,SAAA;AAAA,EAC7B,aAAazC,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,EAC9B,WAAWA,EAAE,SAAS,IAAA,EAAM,SAAA;AAC9B,CAAC,GAGY8F,KAAcF,GAAe,OAAO;AAAA,EAC/C,UAAU5F,EAAE,QAAQ,OAAO;AAAA,EAC3B,UAAUA,EAAE,KAAK,CAAC,SAAS,UAAU,SAAS,QAAQ,CAAC;AAAA,EACvD,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,EACzB,gBAAgBA,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,EACjC,qBAAqBA,EAAE,QAAA,EAAU,QAAQ,EAAK;AAChD,CAAC,GAGY+F,KAAaH,GAAe,OAAO;AAAA,EAC9C,UAAU5F,EAAE,QAAQ,MAAM;AAAA,EAC1B,UAAUA,EAAE,KAAK,CAAC,WAAW,UAAU,WAAW,OAAO,CAAC;AAC5D,CAAC,GAGYgG,KAAkBJ,GAAe,OAAO;AAAA,EACnD,UAAU5F,EAAE,QAAQ,OAAO;AAAA,EAC3B,QAAQA,EAAE,KAAK,CAAC,UAAU,YAAY,QAAQ,aAAa,aAAa,UAAU,CAAC;AAAA,EACnF,oBAAoBA,EAAE,UAAU,QAAQ,EAAK;AAAA,EAC7C,qBAAqBA,EAAE,OAAA,EAAS,SAAA;AAAA,EAChC,SAASA,EACN,OAAO;AAAA,IACN,KAAKA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAC3B,UAAUqC;AAAA,IACV,iBAAiBK,EAAqB,SAAA;AAAA,EAAS,CAChD,EACA,SAAA;AAAA,EACH,SAAS1C,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAC3C,CAAC,GAGYiC,KAAmBL,GAAe,OAAO;AAAA,EACpD,UAAU5F,EAAE,QAAQ,YAAY;AAAA,EAChC,WAAWA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAAA,EAC3C,aAAahE,EAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,GAGYkG,KAAaN,GAAe,OAAO;AAAA,EAC9C,UAAU5F,EAAE,QAAQ,MAAM;AAAA,EAC1B,aAAaA,EAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,GAGYmG,KAAuBnG,EAAE,mBAAmB,YAAY;AAAA,EACnE6F;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,CAAC,GC3EYE,KAAyBpG,EAAE,OAAO;AAAA,EAC7C,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,MAAMM;AAAA,EACN,MAAME;AAAA,EACN,SAASR,EAAE,OAAA,EAAS,SAAA;AAAA,EACpB,WAAWiC,GAAgB,QAAQ,WAAW;AAAA,EAC9C,IAAIjC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC1B,IAAIA,EAAE,OAAO;AAAA,IACX,SAASA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAC/B,SAASA,EAAE,OAAA;AAAA,EAAO,CACnB;AAAA,EACD,OAAOkB;AAAA,EACP,eAAed;AAAA,EACf,cAAcJ,EAAE,OAAOA,EAAE,OAAA,GAAUA,EAAE,OAAA,EAAS,IAAA,CAAK,EAAE,SAAA;AAAA,EACrD,QAAQA,EAAE,OAAOY,IAAaZ,EAAE,SAAS,KAAK,EAAE,SAAA;AAAA,EAChD,mBAAmBA,EAAE,MAAMU,CAAgB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACvD,kBAAkBV,EAAE,MAAMU,CAAgB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACtD,uBAAuBV,EAAE,MAAMU,CAAgB,EAAE,QAAQ,CAAA,CAAE;AAAA,EAC3D,qBAAqBV,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACnD,QAAQoB,GAAa,SAAA;AAAA,EACrB,WAAWpB,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EACzC,IAAIA,EAAE,SAAS,IAAI,CAAC;AAAA,EACpB,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC1B,kBAAkBA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC/C,QAAQA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAC1C,CAAC,GC/BYqC,KAAsBrG,EAAE,OAAO;AAAA,EAC1C,YAAYA,EAAE,OAAA;AAAA,EACd,SAASA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC/B,KAAKA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC7B,CAAC,GAGYsG,KAAyBtG,EAAE,OAAO;AAAA,EAC7C,IAAIkC;AAAA,EACJ,aAAalC,EAAE,OAAA;AAAA,EACf,eAAekC,EAAW,SAAA;AAAA,EAC1B,OAAOlC,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC/B,gBAAgBA,EAAE,SAAS,IAAA,EAAM,SAAA;AACnC,CAAC,GAGYuG,KAAWvG,EAAE,OAAO;AAAA,EAC/B,SAASA,EAAE,OAAA,EAAS,IAAA;AAAA,EACpB,KAAKA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC3B,MAAMA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AACzC,CAAC,GAGYwG,KAAmBxG,EAAE,OAAO;AAAA,EACvC,WAAWA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACnD,UAAUA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAClD,QAAQA,EAAE,QAAA,EAAU,QAAQ,EAAK;AACnC,CAAC,GAGYyG,KAAwBzG,EAAE,OAAO;AAAA,EAC5C,SAASA,EAAE,OAAA;AAAA,EACX,YAAYA,EAAE,OAAA,EAAS,SAAA;AAAA,EACvB,OAAO2B;AAAA,EACP,kBAAkB3B,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC1C,CAAC,GAGY0G,KAAkB,CAAC,MAAM,OAAO,UAAU,GAC1CC,KAAsB3G,EAAE,KAAK0G,EAAe,GAG5CE,KAA2B5G,EAAE,OAAO;AAAA,EAC/C,MAAMA,EAAE,OAAA;AAAA,EACR,SAASA,EAAE;AAAA,IACTA,EAAE,OAAO;AAAA,MACP,kBAAkBkC;AAAA,MAClB,OAAOlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAAA,CAC9B;AAAA,EAAA,EACD,IAAI,CAAC;AACT,CAAC,GAGY6G,KAAkB7G,EAAE,OAAO;AAAA,EACtC,IAAIkC;AAAA,EACJ,MAAMyE,GAAoB,QAAQ,IAAI;AAAA,EACtC,aAAa3G,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,aAAa4G,GAAyB,SAAA;AAAA,EACtC,MAAM5G,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,UAAUA,EAAE,OAAA,EAAS,SAAA;AAAA,EACrB,WAAWA,EAAE,OAAA;AAAA,EACb,cAAcA,EAAE,OAAA;AAAA,EAChB,SAASA,EAAE,MAAMyG,EAAqB,EAAE,IAAI,CAAC;AAAA,EAC7C,eAAerG;AAAA,EACf,IAAImG;AAAA,EACJ,YAAYC,GAAiB,QAAQ,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,IAAO;AAAA,EACjF,YAAY1E,GAAsB,QAAQ,CAAC;AAAA,EAC3C,WAAW9B,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,EAAE;AAAA,EAC7C,WAAWA,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACzC,UAAUlC,EACP,OAAO;AAAA,IACN,UAAUkC,EAAW,SAAA;AAAA,IACrB,SAASA,EAAW,SAAA;AAAA,IACpB,OAAOA,EAAW,SAAA;AAAA,IAClB,QAAQA,EAAW,SAAA;AAAA,IACnB,SAASlC,EAAE,MAAMkC,CAAU,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAA,CAAE;AAAA,EAAA,CAC/C,EACA,QAAQ,EAAE,SAAS,CAAA,GAAI;AAAA,EAC1B,WAAWlC,EAAE,MAAMqG,EAAmB,EAAE,QAAQ,CAAA,CAAE;AAAA,EAClD,mBAAmBrG,EAAE,MAAMsG,EAAsB,EAAE,QAAQ,CAAA,CAAE;AAAA,EAC7D,aAAatG,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EAC3C,gBAAgBA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EAC9C,gBAAgBA,EACb;AAAA,IACCA,EAAE,OAAA,EAAS,MAAM,WAAW,8BAA8B;AAAA,IAC1DA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAAA,EAEvB,QAAQ,CAAA,CAAE;AAAA,EACb,eAAeA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAChD,uBAAuBkC,EAAW,SAAA;AAAA,EAClC,iBAAiBlC,EACd;AAAA,IACCA,EAAE,OAAA;AAAA,IACFA,EAAE,OAAO;AAAA,MACP,eAAeA,EAAE,QAAA,EAAU,SAAA;AAAA,MAC3B,gBAAgBA,EAAE,QAAA,EAAU,SAAA;AAAA,MAC5B,oBAAoBA,EAAE,QAAA,EAAU,SAAA;AAAA,MAChC,mBAAmBA,EAAE,QAAA,EAAU,SAAA;AAAA,IAAS,CACzC;AAAA,EAAA,EAEF,QAAQ,CAAA,CAAE;AAAA,EACb,YAAYA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,EAC1C,kBAAkBA,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EAChD,IAAIlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACrC,aAAakC,EAAW,SAAA;AAAA,EACxB,UAAUlC,EAAE,KAAK,CAAC,WAAW,cAAc,eAAe,YAAY,SAAS,CAAC,EAAE,SAAA;AAAA,EAClF,QAAQA,EACL,OAAO;AAAA,IACN,SAASA,EAAE,OAAA,EAAS,IAAA;AAAA,IACpB,KAAKA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAAA,CAC5B,EACA,SAAA;AAAA,EACH,cAAcA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACvC,qBAAqBA,EAClB,OAAO;AAAA,IACN,IAAIA,EAAE,OAAO;AAAA,MACX,SAASA,EAAE,OAAA,EAAS,IAAA;AAAA,MACpB,KAAKA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,MAC3B,MAAMA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAAA,CACxC;AAAA,IACD,eAAeI;AAAA,IACf,WAAWJ,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IACjC,WAAWA,EAAE,OAAA;AAAA,IACb,MAAMA,EAAE,KAAK,CAAC,aAAa,cAAc,gBAAgB,CAAC;AAAA,IAC1D,UAAUA,EAAE,OAAA;AAAA,EAAO,CACpB,EACA,SAAA;AACL,CAAC,GAGY8G,IAAoB,CAACC,MAChCA,EAAU,QAAQ,OAAO,CAACC,GAAKC,MAAeD,IAAMC,EAAW,OAAO,CAAC,GCxI5DC,KAAqBlH,EAAE,OAAO;AAAA,EACzC,IAAIkC;AAAA,EACJ,cAAclC,EAAE,OAAA;AAAA,EAChB,YAAYA,EAAE,OAAA,EAAS,SAAA;AAAA,EACvB,UAAUA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC3C,kBAAkBA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC1C,SAASA,EAAE,UAAU,QAAQ,EAAK;AAAA,EAClC,WAAWkC,EAAW,SAAA;AAAA,EACtB,YAAYA,EAAW,SAAA;AAAA,EACvB,aAAaA,EAAW,SAAA;AAAA,EACxB,mBAAmBA,EAAW,SAAA;AAAA,EAC9B,0BAA0BlC,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACxD,YAAYlC,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACpC,UAAUA,EACP,OAAO;AAAA,IACN,KAAKA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,IAC3B,WAAWA,EAAE,OAAA;AAAA,IACb,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AACL,CAAC,GCpBYmH,KAA4BnH,EAAE,OAAO;AAAA,EAChD,UAAUkC;AAAA,EACV,aAAalC,EAAE,OAAA;AAAA,EACf,oBAAoBkC;AACtB,CAAC,GAGYkF,KAAuBpH,EAAE,OAAO;AAAA,EAC3C,IAAIkC;AAAA,EACJ,SAASlC,EAAE,OAAA;AAAA,EACX,UAAUkC;AAAA,EACV,WAAWlC,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACzC,mBAAmBlC,EAAE,MAAMmH,EAAyB,EAAE,QAAQ,CAAA,CAAE;AAAA,EAChE,uBAAuBnH,EAAE,QAAA;AAAA,EACzB,gBAAgBA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACxC,kBAAkBkC;AACpB,CAAC,GCfYmF,KAAqBrH,EAAE,OAAO;AAAA,EACzC,IAAIA,EAAE,OAAA;AAAA,EACN,OAAOA,EAAE,OAAA;AAAA,EACT,SAASA,EAAE,MAAMgE,CAAY,EAAE,QAAQ,CAAA,CAAE;AAC3C,CAAC,GAGYsD,KAAsBtH,EAAE,OAAO;AAAA,EAC1C,IAAIkC;AAAA,EACJ,QAAQlC,EAAE,OAAA;AAAA,EACV,SAASA,EAAE,MAAMqH,EAAkB,EAAE,IAAI,CAAC;AAAA,EAC1C,OAAOrH,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACxC,gBAAgBkC;AAAA,EAChB,gBAAgBA;AAAA,EAChB,YAAYlC,EACT,OAAO;AAAA,IACN,mBAAmBA,EAAE,MAAMA,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,IAC5C,WAAWkC;AAAA,EAAA,CACZ,EACA,SAAA;AACL,CAAC,GCrBYqF,KAAwBvH,EAAE,KAAK,CAAC,YAAY,UAAU,OAAO,CAAC,GAG9DwH,KAAiBxH,EAAE,OAAO;AAAA,EACrC,GAAGA,EAAE,OAAA;AAAA,EACL,GAAGA,EAAE,OAAA;AACP,CAAC,GAGYyH,KAAkBzH,EAAE,OAAO;AAAA,EACtC,YAAYA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACrC,iBAAiBA,EAAE,UAAU,QAAQ,EAAK;AAAA,EAC1C,qBAAqBA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACtD,uBAAuBA,EAAE,UAAU,QAAQ,EAAK;AAAA,EAChD,mBAAmBA,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC9C,QAAQA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACjC,YAAYA,EAAE,QAAA,EAAU,QAAQ,EAAK;AACvC,CAAC,GAGY0H,KAA8B;AAAA,EACzC,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,YAAY;AACd,GAEaC,KAAkB3H,EAAE,OAAO;AAAA,EACtC,aAAakC;AAAA,EACb,YAAYlC,EAAE,OAAA,EAAS,IAAA;AAAA,EACvB,iBAAiBA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EACvC,mBAAmBA,EAAE,UAAU,QAAQ,EAAK;AAAA,EAC5C,WAAWyH,GAAgB,QAAQC,EAAgB;AAAA,EACnD,UAAUF,GAAe,SAAA;AAC3B,CAAC,GAGYI,KAAkB5H,EAAE,OAAO;AAAA,EACtC,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,QAAQuH;AAAA,EACR,YAAYvH,EAAE,MAAM2H,EAAe,EAAE,QAAQ,CAAA,CAAE;AAAA,EAC/C,OAAO3H,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC7B,aAAaA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EACnC,kBAAkBkC,EAAW,SAAA;AAAA,EAC7B,gBAAgBA,EAAW,SAAA;AAAA,EAC3B,SAASlC,EAAE,KAAK,CAAC,WAAW,UAAU,QAAQ,QAAQ,CAAC,EAAE,SAAA;AAC3D,CAAC,GClDY6H,KAAyBzF,IAGhC0F,KAAY,IACZC,KAAY,IACZC,KAAY,KACZC,KAAY,KAEZC,KAA2E;AAAA,EAC/E,IAAI;AAAA,EACJ,IAAIJ;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN,GAEaE,KAAgB,OAAiB,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAA,IAEnEC,KAAgB,CAACC,MAC5BR,GAAuB;AAAA,EACrB,CAACS,GAAOC,MAAiBD,IAAQD,EAAME,CAAY,IAAIL,GAAyBK,CAAY;AAAA,EAC5F;AACF,GAEWC,KAAc,CAAC,GAAaC,OAA2B;AAAA,EAClE,IAAI,EAAE,KAAKA,EAAE;AAAA,EACb,IAAI,EAAE,KAAKA,EAAE;AAAA,EACb,IAAI,EAAE,KAAKA,EAAE;AAAA,EACb,IAAI,EAAE,KAAKA,EAAE;AAAA,EACb,IAAI,EAAE,KAAKA,EAAE;AACf,IAEaC,KAAmB,CAAC,GAAaD,MAA0B;AACtE,QAAME,IAAmB;AAAA,IACvB,IAAI,EAAE,KAAKF,EAAE;AAAA,IACb,IAAI,EAAE,KAAKA,EAAE;AAAA,IACb,IAAI,EAAE,KAAKA,EAAE;AAAA,IACb,IAAI,EAAE,KAAKA,EAAE;AAAA,IACb,IAAI,EAAE,KAAKA,EAAE;AAAA,EAAA;AAEf,aAAWF,KAAgBV;AACzB,QAAIc,EAAOJ,CAAY,IAAI;AACzB,YAAM,IAAI,MAAM,gBAAgBA,CAAY,UAAU,EAAEA,CAAY,CAAC,UAAUE,EAAEF,CAAY,CAAC,EAAE;AAGpG,SAAOI;AACT,GC7CaC,KAAc5I,EAAE,OAAO;AAAA,EAClC,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,WAAWA,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACzC,iBAAiBlC,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EAC/C,OAAOC,GAAe,QAAQgG,GAAA,CAAe;AAC/C,CAAC,GCRYU,KAAmB7I,EAAE,OAAO;AAAA,EACvC,cAAcA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AACjD,CAAC,GAGK8I,KAAmB,IACnBC,KAAgB,IAChBC,KAAkBF,KAAmBC,IAQ9BE,KAAsB,CAACC,OAA4C;AAAA,EAC9E,MAAM,KAAK,MAAMA,EAAK,eAAeF,EAAe;AAAA,EACpD,OAAO,KAAK,MAAOE,EAAK,eAAeF,KAAmBF,EAAgB;AAAA,EAC1E,SAASI,EAAK,eAAeJ;AAC/B,IAEaK,KAAmB,CAACD,MAA6B;AAC5D,QAAM,EAAE,MAAAE,GAAM,OAAAC,GAAO,SAAAC,EAAA,IAAYL,GAAoBC,CAAI,GACnDK,IAAK,OAAOH,CAAI,EAAE,SAAS,GAAG,GAAG,GACjCI,IAAK,OAAOH,CAAK,EAAE,SAAS,GAAG,GAAG,GAClCI,IAAK,OAAOH,CAAO,EAAE,SAAS,GAAG,GAAG;AAC1C,SAAO,OAAOC,CAAE,IAAIC,CAAE,IAAIC,CAAE;AAC9B,GAEaC,KAAoB,CAACR,GAAkBI,MAAgC;AAClF,MAAIA,IAAU,EAAG,OAAM,IAAI,MAAM,kDAAkD;AACnF,SAAO,EAAE,cAAcJ,EAAK,eAAeI,EAAA;AAC7C,GC9BaK,KAAgB3J,EAAE,OAAO;AAAA,EACpC,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,cAAcA,EAAE,OAAA;AAAA,EAChB,YAAYA,EAAE,OAAA,EAAS,SAAA;AAAA,EACvB,aAAa6I;AAAA,EACb,WAAWA,GAAiB,SAAA;AAAA,EAC5B,SAAS7I,EAAE,OAAA,EAAS,SAAA;AAAA,EACpB,iBAAiBA,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AACjD,CAAC,GAGY0H,KAAuB,CAAC,UAAU,IAAI,GACtCC,KAA0B7J,EAAE,KAAK4J,EAAoB,GAGrDE,KAAuB,CAAC,SAAS,WAAW,WAAW,GACvDC,KAA0B/J,EAAE,KAAK8J,EAAoB,GAGrDE,KAAqBhK,EAAE,OAAO;AAAA,EACzC,IAAIkC;AAAA,EACJ,WAAWA,EAAW,SAAA;AAAA,EACtB,YAAY2H;AAAA,EACZ,mBAAmB3H,EAAW,SAAA;AAAA,EAC9B,YAAY6H;AAAA,EACZ,uBAAuB/J,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACrD,OAAOlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,MAAMA,EAAE,OAAA;AAAA,EACR,cAAcA,EAAE,OAAA;AAAA,EAChB,UAAU6I;AACZ,CAAC,GC/BYoB,KAAgB,CAAC,UAAU,aAAa,cAAc,OAAO,GAC7DC,KAAoBlK,EAAE,KAAKiK,EAAa,GAGxCE,KAAyB,GACzBC,KAAuB,GACvBC,KAA0B,GAE1BC,KAAoBtK,EAAE,OAAO;AAAA,EACxC,YAAYA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAClC,aAAaA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EACnC,cAAcA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQmK,EAAsB;AAAA,EACpE,SAASnK,EAAE,MAAMA,EAAE,MAAMkK,EAAiB,CAAC;AAC7C,CAAC,GAGYK,KAAc,CAAC,QAAQ,UAAU,QAAQ,GACzCC,KAAkBxK,EAAE,KAAKuK,EAAW,GAGpCE,KAAazK,EAAE,OAAO;AAAA,EACjC,IAAIkC;AAAA,EACJ,YAAYA;AAAA,EACZ,MAAMlC,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,UAAUwH;AAAA,EACV,OAAOgD;AACT,CAAC,GAGYE,KAAiB1K,EAAE,OAAO;AAAA,EACrC,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,kBAAkBkC,EAAW,SAAA;AAAA,EAC7B,KAAKoI,GAAkB,SAAA;AAAA,EACvB,SAAStK,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AACzC,CAAC,GCpCYyI,KAAiB,CAAC,UAAU,aAAa,UAAU,WAAW,GAC9DC,KAAoB5K,EAAE,KAAK2K,EAAc,GAGzCE,KAAqB,CAAC,WAAW,aAAa,QAAQ,GACtDC,KAAwB9K,EAAE,KAAK6K,EAAkB,GAGjDE,KAAuB/K,EAAE,OAAO;AAAA,EAC3C,IAAIkC;AAAA,EACJ,aAAalC,EAAE,SAAS,IAAI,CAAC;AAAA,EAC7B,QAAQ8K,GAAsB,QAAQ,SAAS;AAAA,EAC/C,UAAU9K,EAAE,UAAU,QAAQ,EAAK;AAAA,EACnC,UAAUA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC3C,UAAUA,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AACpC,CAAC,GAGYgL,KAAoBhL,EAAE,OAAO;AAAA,EACxC,gBAAgBA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACjD,UAAUmC,GAAe,QAAQgG,IAAe;AAAA,EAChD,mBAAmBnI,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,CAAA,CAAE;AACnD,CAAC,GAGYiL,KAAcjL,EAAE,OAAO;AAAA,EAClC,IAAIkC;AAAA,EACJ,OAAOlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,QAAQ4K,GAAkB,QAAQ,QAAQ;AAAA,EAC1C,SAAS1I,EAAW,SAAA;AAAA,EACpB,YAAYlC,EAAE,MAAM+K,EAAoB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACpD,QAAQC,GAAkB,QAAQ;AAAA,IAChC,gBAAgB;AAAA,IAChB,UAAU7C,GAAA;AAAA,IACV,mBAAmB,CAAA;AAAA,EAAC,CACrB;AAAA,EACD,eAAenI,EAAE,UAAU,QAAQ,EAAK;AAAA,EACxC,cAAcA,EAAE,OAAA,EAAS,SAAA;AAAA,EACzB,YAAYA,EAAE,OAAA,EAAS,SAAA;AACzB,CAAC,GCzCYkL,IAAsBlL,EAAE,OAAO;AAAA,EAC1C,IAAIkC;AAAA,EACJ,IAAIlC,EAAE,OAAA;AAAA,EACN,WAAWkC,EAAW,SAAA;AAAA,EACtB,iBAAiBA,EAAW,SAAA;AAAA,EAC5B,SAASA,EAAW,SAAA;AACtB,CAAC,GCJYiJ,KAA0BD,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,SAASkC;AAAA,EACT,OAAOlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,SAASkC,EAAW,SAAA;AAAA,EACpB,YAAYlC,EAAE,MAAM+K,EAAoB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACpD,QAAQC,GAAkB,SAAA;AAC5B,CAAC,GAGYI,KAAiCF,EAAoB,OAAO;AAAA,EACvE,MAAMlL,EAAE,QAAQ,qBAAqB;AAAA,EACrC,SAASkC;AAAA,EACT,aAAaA;AAAA,EACb,OAAOlC,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAC1C,CAAC,GAGYqL,KAAgCH,EAAoB,OAAO;AAAA,EACtE,MAAMlL,EAAE,QAAQ,oBAAoB;AAAA,EACpC,SAASkC;AAAA,EACT,aAAaA;AACf,CAAC,GAGYoJ,KAA6BJ,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,SAASkC;AAAA,EACT,aAAaA;AACf,CAAC,GAGYqJ,KAA4BL,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,SAASkC;AACX,CAAC,GAGYsJ,KAAyBN,EAAoB,OAAO;AAAA,EAC/D,MAAMlL,EAAE,QAAQ,aAAa;AAAA,EAC7B,SAASkC;AAAA,EACT,QAAQlC,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GAGYyL,KAA4BP,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,SAASkC;AAAA,EACT,QAAQlC,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GAGY0L,KAAgCR,EAAoB,OAAO;AAAA,EACtE,MAAMlL,EAAE,QAAQ,oBAAoB;AAAA,EACpC,SAASkC;AAAA,EACT,yBAAyBlC,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AACzD,CAAC,GAGYyJ,KAAuBT,EAAoB,OAAO;AAAA,EAC7D,MAAMlL,EAAE,QAAQ,WAAW;AAAA,EAC3B,aAAakC;AAAA,EACb,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,QAAQA,EAAE,OAAA,EAAS,SAAA;AAAA,EACnB,SAASkC,EAAW,SAAA;AACtB,CAAC,GAGY0J,KAAkB,CAAC,SAAS,SAAS,UAAU,GAC/CC,KAAsB7L,EAAE,KAAK4L,EAAe,GAG5CE,KAA8BZ,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,MAAM6L;AAAA,EACN,OAAO7L,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,SAASkC,EAAW,SAAA;AAAA,EACpB,SAASA,EAAW,SAAA;AACtB,CAAC,GCjFY6J,KAAgB,CAAC,QAAQ,SAAS,KAAK,GACvCC,KAAoBhM,EAAE,KAAK+L,EAAa,GAGxCE,KAAgBjM,EAAE,OAAO;AAAA,EACpC,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,MAAMgM;AAAA,EACN,WAAWhM,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EACjC,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC1B,IAAIA,EAAE,OAAO;AAAA,IACX,SAASA,EAAE,OAAA,EAAS,IAAA;AAAA,IACpB,KAAKA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAAA,CAC5B;AAAA,EACD,UAAUA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAChC,aAAaA,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAC7C,CAAC,GChBYgK,KAAe,CAAC,QAAQ,UAAU,MAAM,GACxCC,KAAmBnM,EAAE,KAAKkM,EAAY,GAGtCE,KAAkBpM,EAAE,OAAO;AAAA,EACtC,SAASkC;AAAA,EACT,MAAMiK;AAAA,EACN,OAAOnM,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,OAAOA,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,gBAAgBkC,EAAW,SAAA;AAAA,EAC3B,cAAcA,EAAW,SAAA;AAAA,EACzB,OAAOlC,EAAE,OAAA,EAAS,SAAA;AAAA,EAClB,OAAOA,EAAE,OAAA;AACX,CAAC,GCZYqM,KAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACaC,KAAqBtM,EAAE,KAAKqM,EAAc,GAG1CE,KAAoB,CAAC,WAAW,WAAW,SAAS,GACpDC,KAAwBxM,EAAE,KAAKuM,EAAiB,GAGhDE,KAAsCvB,EAAoB,OAAO;AAAA,EAC5E,MAAMlL,EAAE,QAAQ,0BAA0B;AAAA,EAC1C,aAAakC;AAAA,EACb,MAAMoK;AAAA,EACN,MAAMtM,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC5B,SAASwM;AAAA,EACT,SAASxM,EAAE,SAAS,IAAI,CAAC;AAAA,EACzB,0BAA0BA,EAAE,OAAA,EAAS,SAAA;AAAA,EACrC,uBAAuBA,EAAE,OAAA,EAAS,SAAA;AACpC,CAAC,GCxBY0M,KAAyB1M,EAAE,OAAO;AAAA,EAC7C,aAAakC;AAAA,EACb,MAAMoK;AAAA,EACN,MAAMtM,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC5B,SAASwM;AAAA,EACT,SAASxM,EAAE,OAAA;AAAA,EACX,OAAOA,EAAE,OAAA;AAAA,EACT,0BAA0BA,EAAE,OAAA,EAAS,SAAA;AAAA,EACrC,uBAAuBA,EAAE,OAAA,EAAS,SAAA;AACpC,CAAC,GCVY2M,KAAyB,CAAC,SAAS,SAAS,GAC5CC,KAA4B5M,EAAE,KAAK2M,EAAsB,GAGzDE,KAA0B,CAAC,WAAW,SAAS,MAAM,GACrDC,KAA6B9M,EAAE,KAAK6M,EAAuB,GAG3DE,KAAwB/M,EAAE,OAAO;AAAA,EAC5C,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,MAAM4M;AAAA,EACN,OAAOE;AAAA,EACP,aAAa9M,EAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,GAGYgN,KAAwBhN,EAAE,OAAO;AAAA,EAC5C,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,MAAMA,EAAE,OAAA,EAAS,IAAI,CAAC;AACxB,CAAC,GAGYiN,KAAgBjN,EAAE,OAAO;AAAA,EACpC,IAAIkC;AAAA,EACJ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,kBAAkBkC;AAAA,EAClB,YAAYA,EAAW,SAAA;AAAA,EACvB,OAAOlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACpC,YAAYA,EAAE,MAAM+M,EAAqB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACrD,WAAW/M,EAAE,MAAMgN,EAAqB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACpD,WAAWhN,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC5C,YAAYA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC7C,WAAWA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EACjC,OAAOA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC/B,CAAC,GCrCYkN,KAAyBlN,EAAE,OAAO;AAAA,EAC7C,YAAYA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACrC,YAAYA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACrC,QAAQA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACjC,YAAYA,EAAE,UAAU,QAAQ,EAAK;AAAA,EACrC,mBAAmBA,EAAE,UAAU,QAAQ,EAAK;AAAA,EAC5C,kBAAkBA,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQ,CAAA,CAAE;AAClD,CAAC,GAGYmN,KAA0B,OAAyB;AAAA,EAC9D,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,kBAAkB,CAAA;AACpB,ICAaC,KAAsBpN,EAAE,OAAO;AAAA,EAC1C,YAAYA,EAAE,OAAOkC,GAAY2E,EAAe,EAAE,QAAQ,EAAE;AAAA,EAC5D,eAAe7G,EAAE,OAAOkC,GAAYgF,EAAkB,EAAE,QAAQ,EAAE;AAAA,EAClE,gBAAgBlH,EAAE,OAAOkC,GAAYoF,EAAmB,EAAE,QAAQ,EAAE;AAAA,EACpE,YAAYtH,EAAE,OAAOkC,GAAY0F,EAAe,EAAE,QAAQ,EAAE;AAAA,EAC5D,iBAAiB5H,EAAE,OAAOkC,GAAYkF,EAAoB,EAAE,QAAQ,EAAE;AAAA,EACtE,SAASpH,EAAE,OAAOkC,GAAY0G,EAAW,EAAE,QAAQ,EAAE;AAAA,EACrD,UAAU5I,EAAE,OAAOkC,GAAYyH,EAAa,EAAE,QAAQ,EAAE;AAAA,EACxD,gBAAgB3J,EAAE,OAAOkC,GAAY8H,EAAkB,EAAE,QAAQ,EAAE;AAAA,EACnE,WAAWhK,EAAE,OAAOkC,GAAYwI,EAAc,EAAE,QAAQ,EAAE;AAAA,EAC1D,OAAO1K,EAAE,OAAOkC,GAAYuI,EAAU,EAAE,QAAQ,EAAE;AAAA,EAClD,oBAAoBzK,EAAE,OAAOkC,GAAYA,CAAU,EAAE,QAAQ,EAAE;AAAA,EAC/D,QAAQlC,EAAE,OAAOkC,GAAY+I,EAAW,EAAE,QAAQ,EAAE;AAAA,EACpD,UAAUjL,EAAE,OAAOkC,GAAY+J,EAAa,EAAE,QAAQ,EAAE;AAAA,EACxD,WAAWjM,EAAE,MAAMoM,EAAe,EAAE,QAAQ,CAAA,CAAE;AAAA,EAC9C,aAAapM,EAAE,MAAM0M,EAAsB,EAAE,QAAQ,CAAA,CAAE;AAAA,EACvD,8BAA8B1M,EAAE,OAAOkC,GAAYlC,EAAE,MAAMA,EAAE,OAAA,CAAQ,CAAC,EAAE,QAAQ,CAAA,CAAE;AAAA,EAClF,UAAUA,EAAE,OAAOkC,GAAY+K,EAAa,EAAE,QAAQ,EAAE;AAAA,EACxD,UAAUC,GAAuB,QAAQC,IAAyB;AAAA,EAClE,YAAYnN,EACT;AAAA,IACCA,EAAE,OAAO;AAAA,MACP,MAAM6L;AAAA,MACN,OAAO7L,EAAE,OAAA;AAAA,MACT,OAAOA,EAAE,OAAA;AAAA,MACT,SAASkC,EAAW,SAAA;AAAA,MACpB,SAASA,EAAW,SAAA;AAAA,IAAS,CAC9B;AAAA,EAAA,EAEF,QAAQ,CAAA,CAAE;AAAA,EACb,YAAY2G,GAAiB,QAAQ,EAAE,cAAc,GAAG;AAAA,EACxD,iBAAiB3G,EAAW,SAAA;AAAA,EAC5B,iBAAiBlC,EACd,OAAO;AAAA,IACN,kBAAkBkC;AAAA,IAClB,gBAAgBlC,EAAE,MAAMkC,CAAU;AAAA,EAAA,CACnC,EACA,SAAA;AAAA,EACH,gBAAgBlC,EACb,OAAO;AAAA,IACN,kBAAkBkC;AAAA,IAClB,gBAAgBlC,EAAE,MAAMkC,CAAU;AAAA,EAAA,CACnC,EACA,SAAA;AAAA,EACH,mBAAmBA,EAAW,SAAA;AAAA,EAC9B,SAASlC,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAC5C,CAAC,GAGYqN,KAAqB,OAAsB;AAAA,EACtD,YAAY,CAAA;AAAA,EACZ,eAAe,CAAA;AAAA,EACf,gBAAgB,CAAA;AAAA,EAChB,YAAY,CAAA;AAAA,EACZ,iBAAiB,CAAA;AAAA,EACjB,SAAS,CAAA;AAAA,EACT,UAAU,CAAA;AAAA,EACV,gBAAgB,CAAA;AAAA,EAChB,WAAW,CAAA;AAAA,EACX,OAAO,CAAA;AAAA,EACP,oBAAoB,CAAA;AAAA,EACpB,QAAQ,CAAA;AAAA,EACR,UAAU,CAAA;AAAA,EACV,WAAW,CAAA;AAAA,EACX,aAAa,CAAA;AAAA,EACb,8BAA8B,CAAA;AAAA,EAC9B,UAAU,CAAA;AAAA,EACV,UAAUF,GAAA;AAAA,EACV,YAAY,CAAA;AAAA,EACZ,YAAY,EAAE,cAAc,EAAA;AAAA,EAC5B,SAAS;AACX,ICtFaG,KAA0B,CAAC,YAAY,UAAU,YAAY,GAC7DC,KAA6BvN,EAAE,KAAKsN,EAAuB,GAG3DE,KAAwBxN,EAAE,OAAO;AAAA,EAC5C,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,MAAMU;AAAA,EACN,WAAWV,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnC,YAAYuN,GAA2B,SAAA;AACzC,CAAC,GAGYE,KAA2BvC,EAAoB,OAAO;AAAA,EACjE,MAAMlL,EAAE,QAAQ,eAAe;AAAA,EAC/B,UAAUkC;AAAA,EACV,YAAYlC,EAAE,MAAMwN,EAAqB,EAAE,IAAI,CAAC;AAClD,CAAC,GAGYE,KAAoBxC,EAAoB,OAAO;AAAA,EAC1D,MAAMlL,EAAE,QAAQ,QAAQ;AAAA,EACxB,UAAUkC;AAAA,EACV,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,QAAQA,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GAGY2N,KAA2BzC,EAAoB,OAAO;AAAA,EACjE,MAAMlL,EAAE,QAAQ,eAAe;AAAA,EAC/B,UAAUkC;AAAA,EACV,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,QAAQA,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GAGY4N,KAA8B1C,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,UAAUkC;AAAA,EACV,aAAalC,EAAE,OAAA;AAAA,EACf,OAAOA,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC/B,gBAAgBA,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,EACjC,oBAAoBkC,EAAW,SAAA;AACjC,CAAC,GAGY2L,KAA8B3C,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,UAAUkC;AAAA,EACV,aAAalC,EAAE,OAAA;AACjB,CAAC,GAGY8N,KAA+B5C,EAAoB,OAAO;AAAA,EACrE,MAAMlL,EAAE,QAAQ,mBAAmB;AAAA,EACnC,UAAUkC;AAAA,EACV,WAAWlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACxC,SAASA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC;AACxC,CAAC,GAGY+N,KAA6B7C,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,UAAUkC;AAAA,EACV,KAAKlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACnC,SAASA,EAAE,QAAA;AAAA,EACX,UAAUA,EAAE,QAAA,EAAU,QAAQ,EAAK;AACrC,CAAC,GAGYgO,KAAwB9C,EAAoB,OAAO;AAAA,EAC9D,MAAMlL,EAAE,QAAQ,YAAY;AAAA,EAC5B,UAAUkC;AACZ,CAAC,GCxEY+L,KAA2B/C,EAAoB,OAAO;AAAA,EACjE,MAAMlL,EAAE,QAAQ,eAAe;AAAA,EAC/B,aAAakC;AAAA,EACb,YAAYlC,EAAE,OAAA;AAAA,EACd,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAChC,CAAC,GAGYkO,KAA8BhD,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,aAAakC;AAAA,EACb,YAAYlC,EAAE,OAAA;AAAA,EACd,QAAQA,EAAE,MAAM,CAACA,EAAE,SAAS,MAAM,IAAI,CAAC,GAAGA,EAAE,QAAQ,KAAK,CAAC,CAAC;AAC7D,CAAC,GAGYmO,KAAyBjD,EAAoB,OAAO;AAAA,EAC/D,MAAMlL,EAAE,QAAQ,aAAa;AAAA,EAC7B,aAAakC;AAAA,EACb,KAAKlC,EAAE,MAAM,CAACA,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,EAAE,GAAGA,EAAE,QAAQ,EAAE,CAAC,CAAC;AAAA,EACvE,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,QAAQA,EAAE,OAAA,EAAS,IAAA;AAAA,EACnB,QAAQA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAChC,CAAC,GCvBYoO,KAA8BlD,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,gBAAgBA,EAAE,MAAMkC,CAAU,EAAE,IAAI,CAAC;AAC3C,CAAC,GAGYmM,KAA4BnD,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAClC,CAAC,GAGYsO,KAA6BpD,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,gBAAgBA,EAAE,MAAMkC,CAAU,EAAE,IAAI,CAAC;AAC3C,CAAC,GAGYqM,KAA2BrD,EAAoB,OAAO;AAAA,EACjE,MAAMlL,EAAE,QAAQ,eAAe;AACjC,CAAC,GCnBYwO,KAA8BtD,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,UAAU6G;AACZ,CAAC,GCHY4H,KAA8BvD,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,aAAakC;AAAA,EACb,MAAMlC,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,cAAcA,EAAE,MAAMkC,CAAU,EAAE,IAAI,CAAC;AACzC,CAAC,GAGYwM,KAAuB1O,EAAE,OAAO;AAAA,EAC3C,aAAakC;AAAA,EACb,KAAKlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACnC,UAAUA,EAAE,OAAA,EAAS,IAAA;AAAA,EACrB,OAAOA,EAAE,OAAA,EAAS,IAAA;AACpB,CAAC,GAGY2O,KAA8BzD,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,aAAakC;AAAA,EACb,OAAOlC,EAAE,MAAM0O,EAAoB,EAAE,IAAI,CAAC;AAC5C,CAAC,GAGYE,KAA8B1D,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,aAAakC;AACf,CAAC,GAGY2M,KAAyB3D,EAAoB,OAAO;AAAA,EAC/D,MAAMlL,EAAE,QAAQ,aAAa;AAAA,EAC7B,aAAakC;AAAA,EACb,aAAaA;AAAA,EACb,OAAOlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC/B,CAAC,GAGY8O,KAAuB5D,EAAoB,OAAO;AAAA,EAC7D,MAAMlL,EAAE,QAAQ,WAAW;AAAA,EAC3B,aAAakC;AAAA,EACb,aAAaA;AAAA,EACb,OAAOlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC/B,CAAC,GAGY+O,KAAwB7D,EAAoB,OAAO;AAAA,EAC9D,MAAMlL,EAAE,QAAQ,YAAY;AAAA,EAC5B,aAAakC;AAAA,EACb,OAAOlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC/B,CAAC,GAGYgP,KAA4B9D,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,aAAakC;AAAA,EACb,SAASlC,EAAE,KAAK,CAAC,WAAW,UAAU,QAAQ,QAAQ,CAAC;AACzD,CAAC,GCxDYiP,KAAwBjP,EAAE,KAAK,CAAC,QAAQ,aAAa,cAAc,CAAC,GAGpEkP,KAA0BhE,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,YAAYkC;AAAA,EACZ,UAAUA;AAAA,EACV,kBAAkBA;AAAA,EAClB,KAAKlC,EAAE,MAAMA,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC1D,MAAMiP;AAAA,EACN,aAAajP,EAAE,OAAA,EAAS,IAAA;AAAA,EACxB,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,UAAUA,EAAE,OAAA,EAAS,IAAA;AAAA,EACrB,KAAKA,EAAE,QAAA;AAAA,EACP,UAAUA,EAAE,QAAA;AACd,CAAC,GAGYmP,KAAmBnP,EAAE,OAAO;AAAA,EACvC,YAAY0C;AAAA,EACZ,OAAO1C,EAAE,MAAMA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,CAAC;AAAA,EACtC,UAAUA,EAAE,OAAA,EAAS,IAAA;AAAA,EACrB,MAAMU;AACR,CAAC,GAGY0O,KAA0BlE,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,YAAYkC;AAAA,EACZ,UAAUA;AAAA,EACV,kBAAkBA;AAAA,EAClB,OAAOlC,EAAE,MAAMmP,EAAgB,EAAE,IAAI,CAAC;AAAA,EACtC,UAAUnP,EAAE,QAAA;AACd,CAAC,GChCYqP,KAA0BnE,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,UAAUkH;AACZ,CAAC,GAGYoI,KAAc,CAAC,YAAY,WAAW,SAAS,QAAQ,GACvDC,KAAkBvP,EAAE,KAAKsP,EAAW,GAGpCE,KAA0BtE,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,aAAakC;AAAA,EACb,YAAYA;AAAA,EACZ,MAAMqN;AACR,CAAC,GAGYE,KAA4BvE,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,aAAakC;AAAA,EACb,MAAMqN;AACR,CAAC,GAGYG,KAAyBxE,EAAoB,OAAO;AAAA,EAC/D,MAAMlL,EAAE,QAAQ,aAAa;AAAA,EAC7B,aAAakC;AAAA,EACb,YAAYA;AACd,CAAC,GAGYyN,KAA2BzE,EAAoB,OAAO;AAAA,EACjE,MAAMlL,EAAE,QAAQ,eAAe;AAAA,EAC/B,aAAakC;AAAA,EACb,YAAYA;AACd,CAAC,GCpCY0N,KAAmB5P,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC,GAG7C6P,KAA6B3E,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,aAAakC;AAAA,EACb,SAASlC,EAAE,OAAA;AAAA,EACX,eAAeA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC7C,YAAY4P;AAAA,EACZ,QAAQ5P,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAChC,UAAUA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAClC,CAAC,GAGY8P,KAA4B5E,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,UAAUkC;AAAA,EACV,aAAaA;AAAA,EACb,WAAWlC,EAAE,OAAA;AAAA,EACb,QAAQA,EAAE,OAAA;AAAA,EACV,SAASA,EAAE,MAAMqH,EAAkB,EAAE,IAAI,CAAC;AAAA,EAC1C,OAAOrH,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC/B,CAAC,GAGY+P,KAA4B7E,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,UAAUkC;AAAA,EACV,aAAaA;AAAA,EACb,mBAAmBlC,EAAE,MAAMA,EAAE,QAAQ,EAAE,IAAI,CAAC;AAC9C,CAAC,GC/BYgQ,KAAuBhQ,EAAE,KAAK,CAAC,QAAQ,aAAa,cAAc,CAAC,GAGnEiQ,KAAwB/E,EAAoB,OAAO;AAAA,EAC9D,MAAMlL,EAAE,QAAQ,YAAY;AAAA,EAC5B,UAAUkC;AAAA,EACV,SAASnC;AAAA,EACT,IAAIC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC1B,KAAKA,EAAE,MAAMA,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC1D,MAAMgQ;AAAA,EACN,OAAOhQ,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,SAASA,EAAE,QAAA;AACb,CAAC,GAGYkQ,KAAgChF,EAAoB,OAAO;AAAA,EACtE,MAAMlL,EAAE,QAAQ,oBAAoB;AAAA,EACpC,aAAakC;AAAA,EACb,SAASnC;AAAA,EACT,OAAOa,GAAY,SAAA;AAAA,EACnB,IAAIZ,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EAC5B,KAAKA,EAAE,MAAMA,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC1D,MAAMgQ;AAAA,EACN,OAAOhQ,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,SAASA,EAAE,QAAA,EAAU,SAAA;AACvB,CAAC,GC3BYmQ,KAAwBnQ,EAAE,KAAK,CAAC,YAAY,MAAM,CAAC,GAGnDoQ,KAA+BlF,EAAoB,OAAO;AAAA,EACrE,MAAMlL,EAAE,QAAQ,mBAAmB;AAAA,EACnC,aAAakC;AAAA,EACb,SAASlC,EAAE,OAAA;AAAA,EACX,WAAWwB;AAAA,EACX,YAAY2O;AAAA,EACZ,WAAWnQ,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACzC,cAAclC,EAAE,QAAA,EAAU,QAAQ,EAAK;AACzC,CAAC,GAGYqQ,KAA+BnF,EAAoB,OAAO;AAAA,EACrE,MAAMlL,EAAE,QAAQ,mBAAmB;AAAA,EACnC,aAAakC;AAAA,EACb,WAAWV;AACb,CAAC,GAGY8O,KAA8BpF,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,aAAakC;AACf,CAAC,GCvBYqO,KAAkCrF,EAAoB,OAAO;AAAA,EACxE,MAAMlL,EAAE,QAAQ,sBAAsB;AAAA,EACtC,kBAAkBkC;AAAA,EAClB,UAAUA;AAAA,EACV,SAASlC,EAAE,OAAA;AAAA,EACX,WAAWA,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACzC,mBAAmBlC,EAAE,MAAMmH,EAAyB,EAAE,QAAQ,CAAA,CAAE;AAAA,EAChE,gBAAgBnH,EAAE,OAAA,EAAS,MAAM,IAAI,CAAC,EAAE,SAAA;AAC1C,CAAC,GAGYwQ,KAAkCxQ,EAAE,KAAK;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAGYyQ,KAAiCvF,EAAoB,OAAO;AAAA,EACvE,MAAMlL,EAAE,QAAQ,qBAAqB;AAAA,EACrC,kBAAkBkC;AAAA,EAClB,UAAUA;AAAA,EACV,QAAQsO;AACV,CAAC,GC3BYE,KAA0BxF,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,aAAakC;AAAA,EACb,WAAWlC,EAAE,OAAA;AAAA,EACb,SAASA,EACN,OAAO;AAAA,IACN,eAAeA,EAAE,QAAA,EAAU,SAAA;AAAA,IAC3B,gBAAgBA,EAAE,QAAA,EAAU,SAAA;AAAA,IAC5B,oBAAoBA,EAAE,QAAA,EAAU,SAAA;AAAA,IAChC,mBAAmBA,EAAE,QAAA,EAAU,SAAA;AAAA,EAAS,CACzC,EACA,QAAQ,CAAA,CAAE;AACf,CAAC,GCZY2Q,KAAuB,CAAC,UAAU,eAAe,YAAY,QAAQ,GACrEC,KAA0B5Q,EAAE,KAAK2Q,EAAoB,GAGrDE,KAAmC3F,EAAoB,OAAO;AAAA,EACzE,MAAMlL,EAAE,QAAQ,uBAAuB;AAAA,EACvC,aAAakC;AAAA,EACb,aAAaA;AAAA,EACb,MAAM0O;AACR,CAAC,GCRYE,KAA4B5F,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,aAAakC;AAAA,EACb,aAAaA;AAAA,EACb,cAAcsF,GAAe,SAAA;AAAA,EAC7B,YAAYA;AAAA,EACZ,cAAcxH,EAAE,OAAA,EAAS,IAAI,CAAC;AAChC,CAAC,GAGY+Q,KAAoB7F,EAAoB,OAAO;AAAA,EAC1D,MAAMlL,EAAE,QAAQ,QAAQ;AAAA,EACxB,aAAakC;AAAA,EACb,aAAaA;AACf,CAAC,GAGY8O,KAAwB9F,EAAoB,OAAO;AAAA,EAC9D,MAAMlL,EAAE,QAAQ,YAAY;AAAA,EAC5B,aAAakC;AAAA,EACb,aAAaA;AACf,CAAC,GCrBY+O,KAA0B/F,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,SAASkC;AAAA,EACT,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,WAAWA,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAC3C,CAAC,GAGYgP,KAAiChG,EAAoB,OAAO;AAAA,EACvE,MAAMlL,EAAE,QAAQ,qBAAqB;AAAA,EACrC,SAASkC;AAAA,EACT,OAAOlC,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACrC,SAASlC,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AACzC,CAAC,GAGYiP,KAA8BjG,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,SAASkC;AAAA,EACT,SAASC;AAAA,EACT,QAAQnC,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GAGYoR,KAA2BlG,EAAoB,OAAO;AAAA,EACjE,MAAMlL,EAAE,QAAQ,eAAe;AAAA,EAC/B,SAASkC;AAAA,EACT,SAASC;AAAA,EACT,SAASnC,EAAE,OAAA,EAAS,SAAA;AACtB,CAAC,GAGYqR,KAAkCnG,EAAoB,OAAO;AAAA,EACxE,MAAMlL,EAAE,QAAQ,sBAAsB;AAAA,EACtC,SAASkC;AAAA,EACT,gBAAgBA;AAAA,EAChB,mBAAmBA,EAAW,SAAA;AAChC,CAAC,GAGYoP,KAAoCpG,EAAoB,OAAO;AAAA,EAC1E,MAAMlL,EAAE,QAAQ,wBAAwB;AAAA,EACxC,SAASkC;AAAA,EACT,gBAAgBA;AAAA,EAChB,sBAAsBA,EAAW,SAAA;AACnC,CAAC,GC5CYqP,KAA4BrG,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,WAAWkC;AAAA,EACX,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,aAAa6I,GAAiB,SAAA;AAChC,CAAC,GAGY2I,KAA0BtG,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,WAAWkC;AAAA,EACX,SAASlC,EAAE,OAAA,EAAS,SAAA;AACtB,CAAC,GAGYyR,KAA+BvG,EAAoB,OAAO;AAAA,EACrE,MAAMlL,EAAE,QAAQ,mBAAmB;AAAA,EACnC,SAASkC;AAAA,EACT,WAAWA,EAAW,SAAA;AAAA,EACtB,YAAY2H;AAAA,EACZ,mBAAmB3H,EAAW,SAAA;AAAA,EAC9B,YAAY6H;AAAA,EACZ,uBAAuB/J,EAAE,MAAMkC,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACrD,OAAOlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,MAAMA,EAAE,OAAA;AACV,CAAC,GAGY0R,KAAgCxG,EAAoB,OAAO;AAAA,EACtE,MAAMlL,EAAE,QAAQ,oBAAoB;AAAA,EACpC,SAASA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC/B,QAAQA,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GC7BY2R,KAA6BzG,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,YAAYkC;AAAA,EACZ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,kBAAkBkC,EAAW,SAAA;AAAA,EAC7B,KAAKoI,GAAkB,SAAA;AACzB,CAAC,GAGYsH,KAAuB1G,EAAoB,OAAO;AAAA,EAC7D,MAAMlL,EAAE,QAAQ,WAAW;AAAA,EAC3B,QAAQkC;AAAA,EACR,YAAYA;AAAA,EACZ,MAAMlC,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,UAAUwH;AAAA,EACV,OAAOgD;AACT,CAAC,GAGYqH,KAA8B3G,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,QAAQkC;AAAA,EACR,SAASsI;AAAA,EACT,eAAetI,EAAW,SAAA;AAC5B,CAAC,GAGY4P,KAAsC5G,EAAoB,OAAO;AAAA,EAC5E,MAAMlL,EAAE,QAAQ,0BAA0B;AAAA,EAC1C,aAAakC;AAAA,EACb,cAAcA,EAAW,SAAA;AAC3B,CAAC,GCrCY6P,KAA4B7G,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,sBAAsBkC;AAAA,EACtB,iBAAiBA;AAAA,EACjB,gBAAgBA;AAAA,EAChB,SAASlC,EAAE,OAAA;AACb,CAAC,GAGYgS,KAA4B9G,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,kBAAkBkC;AAAA,EAClB,wBAAwBA;AAC1B,CAAC,GAGY+P,KAA4B/G,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,gBAAgBkC;AAAA,EAChB,yBAAyBA;AAC3B,CAAC,GCpBYgQ,KAAoChH,EAAoB,OAAO;AAAA,EAC1E,MAAMlL,EAAE,QAAQ,wBAAwB;AAAA,EACxC,SAASyC;AAAA,EACT,YAAYP;AAAA,EACZ,UAAUA,EAAW,SAAA;AAAA,EACrB,kBAAkBA;AACpB,CAAC,GCLYiQ,KAAqBjH,EAAoB,OAAO;AAAA,EAC3D,MAAMlL,EAAE,QAAQ,SAAS;AAAA,EACzB,SAASkC;AAAA,EACT,SAASA;AACX,CAAC,GAGYkQ,KAAwBlH,EAAoB,OAAO;AAAA,EAC9D,MAAMlL,EAAE,QAAQ,YAAY;AAAA,EAC5B,SAASkC;AAAA,EACT,SAASA;AAAA,EACT,WAAWlC,EAAE,QAAA,EAAU,QAAQ,EAAI;AACrC,CAAC,GAGYqS,KAA6BnH,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,WAAWkC;AAAA,EACX,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,MAAMgM;AAAA,EACN,WAAWhM,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EACjC,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC1B,OAAOA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC7B,UAAUA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAClC,CAAC,GAGYsS,KAA4BpH,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,WAAWkC;AAAA,EACX,aAAaA;AACf,CAAC,GAGYqQ,KAA6BrH,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,WAAWkC;AAAA,EACX,aAAaA;AACf,CAAC,GAGYsQ,KAA4BtH,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,WAAWkC;AAAA,EACX,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,QAAQA,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GAGYyS,KAA6BvH,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,WAAWkC;AAAA,EACX,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAChC,CAAC,GCrDY0S,KAAgCxH,EAAoB,OAAO;AAAA,EACtE,MAAMlL,EAAE,QAAQ,oBAAoB;AAAA,EACpC,SAASkC;AAAA,EACT,MAAMiK;AAAA,EACN,OAAOnM,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,OAAOA,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,gBAAgBkC,EAAW,SAAA;AAAA,EAC3B,cAAcA,EAAW,SAAA;AAAA,EACzB,OAAOlC,EAAE,OAAA,EAAS,SAAA;AACpB,CAAC,GAGY2S,KAAmCzH,EAAoB,OAAO;AAAA,EACzE,MAAMlL,EAAE,QAAQ,uBAAuB;AAAA,EACvC,SAASkC;AAAA,EACT,aAAaA;AAAA,EACb,KAAKlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACnC,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,IAAIA,EAAE,OAAA,EAAS,IAAA;AAAA,EACf,SAASA,EAAE,QAAA;AACb,CAAC,GAGY4S,KAAwB1H,EAAoB,OAAO;AAAA,EAC9D,MAAMlL,EAAE,QAAQ,YAAY;AAAA,EAC5B,SAASkC;AAAA,EACT,WAAWA;AAAA,EACX,KAAKlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACnC,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,IAAIA,EAAE,OAAA,EAAS,IAAA;AAAA,EACf,SAASA,EAAE,QAAA;AAAA,EACX,YAAYA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC7C,aAAaA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,CAAC;AAChD,CAAC,GCpCY6S,KAAY,CAAC,WAAW,cAAc,eAAe,YAAY,SAAS,GAC1EC,KAAiB9S,EAAE,KAAK6S,EAAS,GAGjCE,KAA6B7H,EAAoB,OAAO;AAAA,EACnE,MAAMlL,EAAE,QAAQ,iBAAiB;AAAA,EACjC,aAAakC;AAAA,EACb,cAAc4Q,GAAe,SAAA;AAAA,EAC7B,YAAYA;AAAA,EACZ,OAAO9S,EAAE,OAAA,EAAS,SAAA;AACpB,CAAC,GAGYgT,KAA+B9H,EAAoB,OAAO;AAAA,EACrE,MAAMlL,EAAE,QAAQ,mBAAmB;AAAA,EACnC,aAAakC;AAAA,EACb,KAAKlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACnC,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,OAAOA,EAAE,OAAA,EAAS,IAAA;AAAA,EAClB,IAAIA,EAAE,OAAA,EAAS,IAAA;AAAA,EACf,SAASA,EAAE,QAAA;AACb,CAAC,GAGYiT,KAA0B/H,EAAoB,OAAO;AAAA,EAChE,MAAMlL,EAAE,QAAQ,cAAc;AAAA,EAC9B,aAAakC;AAAA,EACb,QAAQlC,EAAE,KAAK,CAAC,QAAQ,WAAW,CAAC;AACtC,CAAC,GC5BYkT,KAAoB,CAAC,QAAQ,QAAQ,aAAa,YAAY,QAAQ,GACtEC,KAAwBnT,EAAE,KAAKkT,EAAiB,GAGhDE,KAAgClI,EAAoB,OAAO;AAAA,EACtE,MAAMlL,EAAE,QAAQ,oBAAoB;AAAA,EACpC,gBAAgBkC;AAAA,EAChB,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,eAAekC,EAAW,SAAA;AAAA,EAC1B,WAAWlC,EAAE,OAAA,EAAS,SAAA;AACxB,CAAC,GAGYqT,KAA2BnI,EAAoB,OAAO;AAAA,EACjE,MAAMlL,EAAE,QAAQ,eAAe;AAAA,EAC/B,gBAAgBkC;AAAA,EAChB,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,SAASmT;AACX,CAAC,GAGYG,KAAkCpI,EAAoB,OAAO;AAAA,EACxE,MAAMlL,EAAE,QAAQ,sBAAsB;AAAA,EACtC,gBAAgBkC;AAAA,EAChB,WAAWA;AAAA,EACX,QAAQlC,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC;AAAA,EAClC,aAAaA,EAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,GC1BYuT,KAAsB,CAAC,YAAY,SAAS,WAAW,YAAY,SAAS,SAAS,GACrFC,KAAyBxT,EAAE,KAAKuT,EAAmB,GAGnDE,KAA4BvI,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,WAAWkC;AAAA,EACX,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,kBAAkBkC;AAAA,EAClB,YAAYA,EAAW,SAAA;AAAA,EACvB,OAAOlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC/C,OAAOA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,EAAE;AAC3C,CAAC,GAGY0T,KAAkCxI,EAAoB,OAAO;AAAA,EACxE,MAAMlL,EAAE,QAAQ,sBAAsB;AAAA,EACtC,WAAWkC;AAAA,EACX,YAAYA;AAAA,EACZ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,MAAM4M;AAAA,EACN,OAAOE;AAAA,EACP,aAAa9M,EAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,GAGY2T,KAAkCzI,EAAoB,OAAO;AAAA,EACxE,MAAMlL,EAAE,QAAQ,sBAAsB;AAAA,EACtC,WAAWkC;AAAA,EACX,YAAYA;AAAA,EACZ,MAAMlC,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,MAAMA,EAAE,OAAA,EAAS,IAAI,CAAC;AACxB,CAAC,GAGY4T,KAA8B1I,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,WAAWkC;AAAA,EACX,OAAOsR;AAAA,EACP,iBAAiBxT,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAC;AAAA,EAC3C,SAASA,EAAE,OAAA,EAAS,SAAA;AACtB,CAAC,GAGY6T,KAA4B3I,EAAoB,OAAO;AAAA,EAClE,MAAMlL,EAAE,QAAQ,gBAAgB;AAAA,EAChC,WAAWkC;AAAA,EACX,QAAQlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC9B,QAAQA,EAAE,OAAA,EAAS,SAAA;AACrB,CAAC,GAGY8T,KAAiC5I,EAAoB,OAAO;AAAA,EACvE,MAAMlL,EAAE,QAAQ,qBAAqB;AAAA,EACrC,WAAWkC;AAAA,EACX,WAAWlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACxC,SAASA,EAAE,SAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC;AACxC,CAAC,GC3DY+T,KAAqC7I,EAAoB,OAAO;AAAA,EAC3E,MAAMlL,EAAE,QAAQ,yBAAyB;AAAA,EACzC,YAAYA,EAAE,QAAA,EAAU,SAAA;AAAA,EACxB,YAAYA,EAAE,QAAA,EAAU,SAAA;AAAA,EACxB,QAAQA,EAAE,QAAA,EAAU,SAAA;AAAA,EACpB,YAAYA,EAAE,QAAA,EAAU,SAAA;AAAA,EACxB,mBAAmBA,EAAE,QAAA,EAAU,SAAA;AAAA,EAC/B,qBAAqBA,EAAE,MAAMA,EAAE,OAAA,CAAQ,EAAE,SAAA;AAAA,EACzC,wBAAwBA,EAAE,MAAMA,EAAE,OAAA,CAAQ,EAAE,SAAA;AAC9C,CAAC,GCRYgU,KAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACaC,KAA0BjU,EAAE,KAAKgU,EAAmB,GAGpDE,KAAkChJ,EAAoB,OAAO;AAAA,EACxE,MAAMlL,EAAE,QAAQ,sBAAsB;AAAA,EACtC,aAAakC;AAAA,EACb,OAAO+R;AAAA,EACP,eAAe/R,EAAW,SAAA;AAAA,EAC1B,SAASlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC/B,cAAcA,EAAE,OAAA,EAAS,SAAA;AAC3B,CAAC,GCjBYmU,KAAkB,CAAC,aAAa,cAAc,gBAAgB,GAC9DC,KAAsBpU,EAAE,KAAKmU,EAAe,GAG5CE,KAAsBrU,EAAE,OAAO;AAAA,EAC1C,MAAMA,EAAE,SAAS,IAAI,CAAC;AAAA,EACtB,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC1B,IAAIA,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EAC1B,eAAeI;AAAA,EACf,WAAWJ,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAAA,EACjC,WAAWA,EAAE,OAAA,EAAS,SAAA;AACxB,CAAC,GAGYsU,KAA8BpJ,EAAoB,OAAO;AAAA,EACpE,MAAMlL,EAAE,QAAQ,kBAAkB;AAAA,EAClC,UAAUkC;AAAA,EACV,UAAUA,EAAW,SAAA;AAAA,EACrB,MAAMkS;AAAA,EACN,MAAMC;AACR,CAAC,GAGYE,KAA+BrJ,EAAoB,OAAO;AAAA,EACrE,MAAMlL,EAAE,QAAQ,mBAAmB;AAAA,EACnC,UAAUkC;AAAA,EACV,QAAQlC,EAAE,KAAK,CAAC,aAAa,kBAAkB,kBAAkB,CAAC,EAAE,QAAQ,WAAW;AACzF,CAAC,GAGYwU,KAA+BtJ,EAAoB,OAAO;AAAA,EACrE,MAAMlL,EAAE,QAAQ,mBAAmB;AAAA,EACnC,cAAckC;AAAA,EACd,YAAYA;AAAA,EACZ,OAAOlC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC;AAC/B,CAAC,GAGYyU,KAAyBvJ,EAAoB,OAAO;AAAA,EAC/D,MAAMlL,EAAE,QAAQ,aAAa;AAAA,EAC7B,WAAWkC;AAAA,EACX,aAAalC,EAAE,SAAS,IAAI,CAAC;AAAA,EAC7B,eAAeA,EAAE,QAAA,EAAU,QAAQ,EAAK;AAC1C,CAAC,GCqGY0U,KAAc1U,EAAE,mBAAmB,QAAQ;AAAA,EACtDwO;AAAA,EACAf;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAE;AAAA,EACAG;AAAA,EACAD;AAAA,EACAE;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAE;AAAA,EACAE;AAAA,EACAC;AAAA,EACAQ;AAAA,EACAC;AAAA,EACAC;AAAA,EACAE;AAAA,EACAC;AAAA,EACAE;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAE;AAAA,EACAC;AAAA,EACAG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAxB;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAsB;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACA3G;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAG;AAAA,EACAiG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAxG;AAAA,EACA2G;AAAA,EACAC;AAAA,EACAC;AAAA,EACAG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAI;AAAA,EACAI;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAV;AACF,CAAC,GAIYY,KAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}