picopilot 0.0.0 → 0.1.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 (334) hide show
  1. package/LICENSE +661 -0
  2. package/dist/bin.d.ts +3 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/bin.js +4 -0
  5. package/dist/bin.js.map +1 -0
  6. package/dist/cli.d.ts +15 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +59 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/audio.d.ts +17 -0
  11. package/dist/commands/audio.d.ts.map +1 -0
  12. package/dist/commands/audio.js +315 -0
  13. package/dist/commands/audio.js.map +1 -0
  14. package/dist/commands/export.d.ts +36 -0
  15. package/dist/commands/export.d.ts.map +1 -0
  16. package/dist/commands/export.js +257 -0
  17. package/dist/commands/export.js.map +1 -0
  18. package/dist/commands/gfx.d.ts +28 -0
  19. package/dist/commands/gfx.d.ts.map +1 -0
  20. package/dist/commands/gfx.js +521 -0
  21. package/dist/commands/gfx.js.map +1 -0
  22. package/dist/commands/init.d.ts +34 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +151 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/lint.d.ts +20 -0
  27. package/dist/commands/lint.d.ts.map +1 -0
  28. package/dist/commands/lint.js +90 -0
  29. package/dist/commands/lint.js.map +1 -0
  30. package/dist/commands/minify.d.ts +20 -0
  31. package/dist/commands/minify.d.ts.map +1 -0
  32. package/dist/commands/minify.js +129 -0
  33. package/dist/commands/minify.js.map +1 -0
  34. package/dist/commands/music.d.ts +13 -0
  35. package/dist/commands/music.d.ts.map +1 -0
  36. package/dist/commands/music.js +241 -0
  37. package/dist/commands/music.js.map +1 -0
  38. package/dist/commands/playtest.d.ts +29 -0
  39. package/dist/commands/playtest.d.ts.map +1 -0
  40. package/dist/commands/playtest.js +631 -0
  41. package/dist/commands/playtest.js.map +1 -0
  42. package/dist/commands/run.d.ts +30 -0
  43. package/dist/commands/run.d.ts.map +1 -0
  44. package/dist/commands/run.js +202 -0
  45. package/dist/commands/run.js.map +1 -0
  46. package/dist/commands/serve.d.ts +50 -0
  47. package/dist/commands/serve.d.ts.map +1 -0
  48. package/dist/commands/serve.js +213 -0
  49. package/dist/commands/serve.js.map +1 -0
  50. package/dist/commands/sfx.d.ts +13 -0
  51. package/dist/commands/sfx.d.ts.map +1 -0
  52. package/dist/commands/sfx.js +254 -0
  53. package/dist/commands/sfx.js.map +1 -0
  54. package/dist/commands/tokens.d.ts +36 -0
  55. package/dist/commands/tokens.d.ts.map +1 -0
  56. package/dist/commands/tokens.js +129 -0
  57. package/dist/commands/tokens.js.map +1 -0
  58. package/dist/commands/verify.d.ts +57 -0
  59. package/dist/commands/verify.d.ts.map +1 -0
  60. package/dist/commands/verify.js +213 -0
  61. package/dist/commands/verify.js.map +1 -0
  62. package/dist/commands/version.d.ts +12 -0
  63. package/dist/commands/version.d.ts.map +1 -0
  64. package/dist/commands/version.js +24 -0
  65. package/dist/commands/version.js.map +1 -0
  66. package/dist/engine/audio/index.d.ts +14 -0
  67. package/dist/engine/audio/index.d.ts.map +1 -0
  68. package/dist/engine/audio/index.js +14 -0
  69. package/dist/engine/audio/index.js.map +1 -0
  70. package/dist/engine/audio/music.d.ts +116 -0
  71. package/dist/engine/audio/music.d.ts.map +1 -0
  72. package/dist/engine/audio/music.js +138 -0
  73. package/dist/engine/audio/music.js.map +1 -0
  74. package/dist/engine/audio/section.d.ts +34 -0
  75. package/dist/engine/audio/section.d.ts.map +1 -0
  76. package/dist/engine/audio/section.js +67 -0
  77. package/dist/engine/audio/section.js.map +1 -0
  78. package/dist/engine/audio/sfx.d.ts +141 -0
  79. package/dist/engine/audio/sfx.d.ts.map +1 -0
  80. package/dist/engine/audio/sfx.js +506 -0
  81. package/dist/engine/audio/sfx.js.map +1 -0
  82. package/dist/engine/cart/cart.d.ts +75 -0
  83. package/dist/engine/cart/cart.d.ts.map +1 -0
  84. package/dist/engine/cart/cart.js +153 -0
  85. package/dist/engine/cart/cart.js.map +1 -0
  86. package/dist/engine/cart/errors.d.ts +29 -0
  87. package/dist/engine/cart/errors.d.ts.map +1 -0
  88. package/dist/engine/cart/errors.js +26 -0
  89. package/dist/engine/cart/errors.js.map +1 -0
  90. package/dist/engine/cart/gfx.d.ts +79 -0
  91. package/dist/engine/cart/gfx.d.ts.map +1 -0
  92. package/dist/engine/cart/gfx.js +171 -0
  93. package/dist/engine/cart/gfx.js.map +1 -0
  94. package/dist/engine/cart/index.d.ts +15 -0
  95. package/dist/engine/cart/index.d.ts.map +1 -0
  96. package/dist/engine/cart/index.js +15 -0
  97. package/dist/engine/cart/index.js.map +1 -0
  98. package/dist/engine/cart/map.d.ts +46 -0
  99. package/dist/engine/cart/map.d.ts.map +1 -0
  100. package/dist/engine/cart/map.js +118 -0
  101. package/dist/engine/cart/map.js.map +1 -0
  102. package/dist/engine/config/config.d.ts +74 -0
  103. package/dist/engine/config/config.d.ts.map +1 -0
  104. package/dist/engine/config/config.js +103 -0
  105. package/dist/engine/config/config.js.map +1 -0
  106. package/dist/engine/config/index.d.ts +7 -0
  107. package/dist/engine/config/index.d.ts.map +1 -0
  108. package/dist/engine/config/index.js +7 -0
  109. package/dist/engine/config/index.js.map +1 -0
  110. package/dist/engine/gfx/grid.d.ts +51 -0
  111. package/dist/engine/gfx/grid.d.ts.map +1 -0
  112. package/dist/engine/gfx/grid.js +116 -0
  113. package/dist/engine/gfx/grid.js.map +1 -0
  114. package/dist/engine/gfx/index.d.ts +17 -0
  115. package/dist/engine/gfx/index.d.ts.map +1 -0
  116. package/dist/engine/gfx/index.js +17 -0
  117. package/dist/engine/gfx/index.js.map +1 -0
  118. package/dist/engine/gfx/label.d.ts +34 -0
  119. package/dist/engine/gfx/label.d.ts.map +1 -0
  120. package/dist/engine/gfx/label.js +190 -0
  121. package/dist/engine/gfx/label.js.map +1 -0
  122. package/dist/engine/gfx/overlap.d.ts +42 -0
  123. package/dist/engine/gfx/overlap.d.ts.map +1 -0
  124. package/dist/engine/gfx/overlap.js +57 -0
  125. package/dist/engine/gfx/overlap.js.map +1 -0
  126. package/dist/engine/gfx/palette.d.ts +29 -0
  127. package/dist/engine/gfx/palette.d.ts.map +1 -0
  128. package/dist/engine/gfx/palette.js +46 -0
  129. package/dist/engine/gfx/palette.js.map +1 -0
  130. package/dist/engine/gfx/png.d.ts +31 -0
  131. package/dist/engine/gfx/png.d.ts.map +1 -0
  132. package/dist/engine/gfx/png.js +165 -0
  133. package/dist/engine/gfx/png.js.map +1 -0
  134. package/dist/engine/gfx/render.d.ts +42 -0
  135. package/dist/engine/gfx/render.d.ts.map +1 -0
  136. package/dist/engine/gfx/render.js +72 -0
  137. package/dist/engine/gfx/render.js.map +1 -0
  138. package/dist/engine/index.d.ts +22 -0
  139. package/dist/engine/index.d.ts.map +1 -0
  140. package/dist/engine/index.js +22 -0
  141. package/dist/engine/index.js.map +1 -0
  142. package/dist/engine/pico8/adapter.d.ts +267 -0
  143. package/dist/engine/pico8/adapter.d.ts.map +1 -0
  144. package/dist/engine/pico8/adapter.js +37 -0
  145. package/dist/engine/pico8/adapter.js.map +1 -0
  146. package/dist/engine/pico8/drive.d.ts +308 -0
  147. package/dist/engine/pico8/drive.d.ts.map +1 -0
  148. package/dist/engine/pico8/drive.js +581 -0
  149. package/dist/engine/pico8/drive.js.map +1 -0
  150. package/dist/engine/pico8/harness.d.ts +146 -0
  151. package/dist/engine/pico8/harness.d.ts.map +1 -0
  152. package/dist/engine/pico8/harness.js +251 -0
  153. package/dist/engine/pico8/harness.js.map +1 -0
  154. package/dist/engine/pico8/index.d.ts +21 -0
  155. package/dist/engine/pico8/index.d.ts.map +1 -0
  156. package/dist/engine/pico8/index.js +21 -0
  157. package/dist/engine/pico8/index.js.map +1 -0
  158. package/dist/engine/pico8/sentinel.d.ts +63 -0
  159. package/dist/engine/pico8/sentinel.d.ts.map +1 -0
  160. package/dist/engine/pico8/sentinel.js +86 -0
  161. package/dist/engine/pico8/sentinel.js.map +1 -0
  162. package/dist/engine/pico8/session-daemon-entry.d.ts +10 -0
  163. package/dist/engine/pico8/session-daemon-entry.d.ts.map +1 -0
  164. package/dist/engine/pico8/session-daemon-entry.js +11 -0
  165. package/dist/engine/pico8/session-daemon-entry.js.map +1 -0
  166. package/dist/engine/pico8/session-daemon-main.d.ts +44 -0
  167. package/dist/engine/pico8/session-daemon-main.d.ts.map +1 -0
  168. package/dist/engine/pico8/session-daemon-main.js +71 -0
  169. package/dist/engine/pico8/session-daemon-main.js.map +1 -0
  170. package/dist/engine/pico8/session-daemon.d.ts +68 -0
  171. package/dist/engine/pico8/session-daemon.d.ts.map +1 -0
  172. package/dist/engine/pico8/session-daemon.js +264 -0
  173. package/dist/engine/pico8/session-daemon.js.map +1 -0
  174. package/dist/engine/pico8/session.d.ts +140 -0
  175. package/dist/engine/pico8/session.d.ts.map +1 -0
  176. package/dist/engine/pico8/session.js +250 -0
  177. package/dist/engine/pico8/session.js.map +1 -0
  178. package/dist/engine/pico8/shell.d.ts +103 -0
  179. package/dist/engine/pico8/shell.d.ts.map +1 -0
  180. package/dist/engine/pico8/shell.js +324 -0
  181. package/dist/engine/pico8/shell.js.map +1 -0
  182. package/dist/engine/pico8/supervisor.d.ts +137 -0
  183. package/dist/engine/pico8/supervisor.d.ts.map +1 -0
  184. package/dist/engine/pico8/supervisor.js +140 -0
  185. package/dist/engine/pico8/supervisor.js.map +1 -0
  186. package/dist/engine/scaffold/index.d.ts +8 -0
  187. package/dist/engine/scaffold/index.d.ts.map +1 -0
  188. package/dist/engine/scaffold/index.js +8 -0
  189. package/dist/engine/scaffold/index.js.map +1 -0
  190. package/dist/engine/scaffold/scaffold.d.ts +49 -0
  191. package/dist/engine/scaffold/scaffold.d.ts.map +1 -0
  192. package/dist/engine/scaffold/scaffold.js +217 -0
  193. package/dist/engine/scaffold/scaffold.js.map +1 -0
  194. package/dist/engine/shrinko/adapter.d.ts +167 -0
  195. package/dist/engine/shrinko/adapter.d.ts.map +1 -0
  196. package/dist/engine/shrinko/adapter.js +107 -0
  197. package/dist/engine/shrinko/adapter.js.map +1 -0
  198. package/dist/engine/shrinko/index.d.ts +13 -0
  199. package/dist/engine/shrinko/index.d.ts.map +1 -0
  200. package/dist/engine/shrinko/index.js +13 -0
  201. package/dist/engine/shrinko/index.js.map +1 -0
  202. package/dist/engine/shrinko/shell.d.ts +69 -0
  203. package/dist/engine/shrinko/shell.d.ts.map +1 -0
  204. package/dist/engine/shrinko/shell.js +156 -0
  205. package/dist/engine/shrinko/shell.js.map +1 -0
  206. package/dist/engine/skills/index.d.ts +8 -0
  207. package/dist/engine/skills/index.d.ts.map +1 -0
  208. package/dist/engine/skills/index.js +8 -0
  209. package/dist/engine/skills/index.js.map +1 -0
  210. package/dist/engine/skills/skills.d.ts +104 -0
  211. package/dist/engine/skills/skills.d.ts.map +1 -0
  212. package/dist/engine/skills/skills.js +149 -0
  213. package/dist/engine/skills/skills.js.map +1 -0
  214. package/dist/index.d.ts +10 -0
  215. package/dist/index.d.ts.map +1 -0
  216. package/dist/index.js +10 -0
  217. package/dist/index.js.map +1 -0
  218. package/dist/version.d.ts +2 -0
  219. package/dist/version.d.ts.map +1 -0
  220. package/dist/version.js +19 -0
  221. package/dist/version.js.map +1 -0
  222. package/package.json +48 -2
  223. package/src/bin.ts +4 -0
  224. package/src/cli.ts +61 -0
  225. package/src/commands/audio.test.ts +280 -0
  226. package/src/commands/audio.ts +410 -0
  227. package/src/commands/export.test.ts +310 -0
  228. package/src/commands/export.ts +316 -0
  229. package/src/commands/gfx-io.test.ts +178 -0
  230. package/src/commands/gfx.test.ts +470 -0
  231. package/src/commands/gfx.ts +645 -0
  232. package/src/commands/init.test.ts +460 -0
  233. package/src/commands/init.ts +193 -0
  234. package/src/commands/lint.test.ts +137 -0
  235. package/src/commands/lint.ts +117 -0
  236. package/src/commands/minify.test.ts +166 -0
  237. package/src/commands/minify.ts +156 -0
  238. package/src/commands/music.test.ts +272 -0
  239. package/src/commands/music.ts +288 -0
  240. package/src/commands/playtest.test.ts +317 -0
  241. package/src/commands/playtest.ts +773 -0
  242. package/src/commands/run.test.ts +238 -0
  243. package/src/commands/run.ts +259 -0
  244. package/src/commands/serve.test.ts +218 -0
  245. package/src/commands/serve.ts +272 -0
  246. package/src/commands/sfx.test.ts +349 -0
  247. package/src/commands/sfx.ts +300 -0
  248. package/src/commands/tokens.test.ts +212 -0
  249. package/src/commands/tokens.ts +168 -0
  250. package/src/commands/verify.test.ts +238 -0
  251. package/src/commands/verify.ts +256 -0
  252. package/src/commands/version.test.ts +70 -0
  253. package/src/commands/version.ts +24 -0
  254. package/src/engine/audio/index.ts +47 -0
  255. package/src/engine/audio/music.test.ts +188 -0
  256. package/src/engine/audio/music.ts +218 -0
  257. package/src/engine/audio/section.test.ts +124 -0
  258. package/src/engine/audio/section.ts +79 -0
  259. package/src/engine/audio/sfx.test.ts +410 -0
  260. package/src/engine/audio/sfx.ts +694 -0
  261. package/src/engine/cart/cart.test.ts +304 -0
  262. package/src/engine/cart/cart.ts +211 -0
  263. package/src/engine/cart/errors.ts +39 -0
  264. package/src/engine/cart/fixtures/crlf.p8 +6 -0
  265. package/src/engine/cart/fixtures/full.p8 +174 -0
  266. package/src/engine/cart/fixtures/header-only.p8 +2 -0
  267. package/src/engine/cart/fixtures/malformed-no-header.p8 +2 -0
  268. package/src/engine/cart/fixtures/minimal.p8 +10 -0
  269. package/src/engine/cart/fixtures/no-trailing-newline.p8 +6 -0
  270. package/src/engine/cart/gfx.ts +195 -0
  271. package/src/engine/cart/index.ts +27 -0
  272. package/src/engine/cart/map.ts +134 -0
  273. package/src/engine/config/config.ts +115 -0
  274. package/src/engine/config/index.ts +12 -0
  275. package/src/engine/gfx/grid.test.ts +128 -0
  276. package/src/engine/gfx/grid.ts +136 -0
  277. package/src/engine/gfx/index.ts +34 -0
  278. package/src/engine/gfx/label.test.ts +105 -0
  279. package/src/engine/gfx/label.ts +229 -0
  280. package/src/engine/gfx/overlap.test.ts +71 -0
  281. package/src/engine/gfx/overlap.ts +66 -0
  282. package/src/engine/gfx/palette.test.ts +35 -0
  283. package/src/engine/gfx/palette.ts +54 -0
  284. package/src/engine/gfx/png.test.ts +111 -0
  285. package/src/engine/gfx/png.ts +196 -0
  286. package/src/engine/gfx/render.test.ts +180 -0
  287. package/src/engine/gfx/render.ts +106 -0
  288. package/src/engine/index.ts +21 -0
  289. package/src/engine/pico8/adapter.ts +303 -0
  290. package/src/engine/pico8/drive.test.ts +415 -0
  291. package/src/engine/pico8/drive.ts +729 -0
  292. package/src/engine/pico8/harness.test.ts +181 -0
  293. package/src/engine/pico8/harness.ts +354 -0
  294. package/src/engine/pico8/index.ts +20 -0
  295. package/src/engine/pico8/sentinel.test.ts +80 -0
  296. package/src/engine/pico8/sentinel.ts +93 -0
  297. package/src/engine/pico8/session-daemon-entry.ts +12 -0
  298. package/src/engine/pico8/session-daemon-main.ts +98 -0
  299. package/src/engine/pico8/session-daemon.test.ts +212 -0
  300. package/src/engine/pico8/session-daemon.ts +306 -0
  301. package/src/engine/pico8/session.test.ts +239 -0
  302. package/src/engine/pico8/session.ts +321 -0
  303. package/src/engine/pico8/shell.test.ts +583 -0
  304. package/src/engine/pico8/shell.ts +412 -0
  305. package/src/engine/pico8/supervisor.test.ts +105 -0
  306. package/src/engine/pico8/supervisor.ts +197 -0
  307. package/src/engine/scaffold/index.ts +15 -0
  308. package/src/engine/scaffold/scaffold.ts +236 -0
  309. package/src/engine/shrinko/adapter.ts +241 -0
  310. package/src/engine/shrinko/fixtures/count-no-compressed.txt +2 -0
  311. package/src/engine/shrinko/fixtures/count-over-budget.txt +3 -0
  312. package/src/engine/shrinko/fixtures/count-under-budget.txt +3 -0
  313. package/src/engine/shrinko/index.ts +33 -0
  314. package/src/engine/shrinko/shell.ts +224 -0
  315. package/src/engine/shrinko/shrinko.test.ts +182 -0
  316. package/src/engine/skills/index.ts +14 -0
  317. package/src/engine/skills/skills.test.ts +376 -0
  318. package/src/engine/skills/skills.ts +205 -0
  319. package/src/index.ts +13 -0
  320. package/src/skills/game-design-reference/SKILL.md +70 -0
  321. package/src/skills/game-jam/SKILL.md +45 -0
  322. package/src/skills/picopilot-art/SKILL.md +62 -0
  323. package/src/skills/picopilot-audio/SKILL.md +194 -0
  324. package/src/skills/picopilot-code/SKILL.md +97 -0
  325. package/src/skills/picopilot-code/reference/README.md +42 -0
  326. package/src/skills/picopilot-code/reference/mode7-racing.md +95 -0
  327. package/src/skills/picopilot-code/reference/platformer.md +119 -0
  328. package/src/skills/picopilot-code/reference/puzzle-grid.md +106 -0
  329. package/src/skills/picopilot-code/reference/rpg-menus-dialog.md +122 -0
  330. package/src/skills/picopilot-code/reference/top-down-adventure.md +117 -0
  331. package/src/skills/picopilot-code/reference/twin-stick-arcade.md +128 -0
  332. package/src/skills/picopilot-debug/SKILL.md +195 -0
  333. package/src/skills/picopilot-overview/SKILL.md +52 -0
  334. package/src/version.ts +22 -0
@@ -0,0 +1,631 @@
1
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync, } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
4
+ import { Cli as IncurCli, z } from 'incur';
5
+ import { buildDriveHarness, DEFAULT_ACK_TIMEOUT_MS, DEFAULT_IDLE_TIMEOUT_MS, DONE_SENTINEL, DriveError, PICO8_NOT_FOUND_MARKER, parseButtons, parseInputScript, SessionClient, SessionRegistry, sessionExists, SHOT_BASENAME, ShellPico8Adapter, spawnSessionDaemon, } from '../engine/pico8/index.js';
6
+ const defaultAdapterFactory = (env) => new ShellPico8Adapter({ env });
7
+ /**
8
+ * The default backstop: kill a driven cart that never signals/exits after this
9
+ * many ms. Larger than `run`'s screenshot default because a driven run advances
10
+ * a scripted sequence of frames (plus PICO-8 startup), not a single quick pass.
11
+ */
12
+ const DEFAULT_BACKSTOP_MS = 20_000;
13
+ /** How long `start` waits for the daemon to become READY (socket) or report absent. */
14
+ const START_READY_TIMEOUT_MS = 15_000;
15
+ /** How often `start` polls for the daemon's readiness/absence markers. */
16
+ const START_POLL_MS = 50;
17
+ /** Resolves a path argument to an absolute path (relative to cwd). */
18
+ function resolvePath(p) {
19
+ return isAbsolute(p) ? p : resolve(process.cwd(), p);
20
+ }
21
+ /**
22
+ * A `#include` resolver for the drive-transform, bound to the SOURCE cart's dir:
23
+ * picopilot's standard scaffold is `main.p8` = `#include main.lua`, and the
24
+ * driven cart runs from a throwaway temp dir where `main.lua` is absent, so the
25
+ * transform inlines includes to be self-contained. Reads the included file
26
+ * relative to the cart (absolute paths honoured); returns `undefined` if it
27
+ * cannot be read (the directive is then left verbatim).
28
+ */
29
+ function makeReadInclude(cartPath) {
30
+ const base = dirname(cartPath);
31
+ return (includePath) => {
32
+ const full = isAbsolute(includePath)
33
+ ? includePath
34
+ : join(base, includePath);
35
+ try {
36
+ return readFileSync(full, 'utf8');
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ };
42
+ }
43
+ /** A small sleep for the `start` readiness poll. */
44
+ function sleep(ms) {
45
+ return new Promise((r) => setTimeout(r, ms));
46
+ }
47
+ /**
48
+ * Registers `picopilot playtest`, the driven-playtest command group (ADR-0011).
49
+ * The ROOT command (`playtest <cart>`) is the ONE-SHOT driver (US #1-5,7-11): it
50
+ * sends the whole scripted input up front and captures gameplay in one envelope.
51
+ * The SUBCOMMANDS are the RESUMABLE LIVE SESSION (US #6, the "A" model): `start`
52
+ * launches a persistent driven process the agent addresses BY ID, and `step` /
53
+ * `input` / `shot` / `stop` / `status` drive it across SEPARATE invocations while
54
+ * the game stays alive + paused between turns, over the same verified block+ACK
55
+ * transport. The cart-side drive-transform is reused UNCHANGED (see `drive.ts`).
56
+ *
57
+ * PICO-8 absent -> structured `pico8-not-found` + nonzero exit (mirrors `run`),
58
+ * never a crash or a hang. The CI-testable surface is the pure transform + the
59
+ * session handshake core (against a fake process); a live multi-turn session is
60
+ * the manual/opt-in tier.
61
+ *
62
+ * @param adapterFactory injects the adapter (defaults to the shell adapter);
63
+ * tests pass a stub to drive present/absent without the real binary.
64
+ */
65
+ export function registerPlaytest(cli, adapterFactory = defaultAdapterFactory) {
66
+ cli.command(buildPlaytestGroup(adapterFactory));
67
+ }
68
+ /**
69
+ * Builds the `playtest` command GROUP: `playtest run <cart>` (the one-shot
70
+ * driver, US #1-5,7-11) plus the resumable LIVE session verbs `start`/`step`/
71
+ * `input`/`shot`/`stop`/`status` (US #6). `playtest` is a verb group (not a bare
72
+ * `playtest <cart>`) because the resumable session needs first-class sibling verbs
73
+ * that a bare positional-arg root would swallow; see the ## Decisions note in the
74
+ * task. The one-shot's behaviour + flags are unchanged, only its path moved from
75
+ * `playtest <cart>` to `playtest run <cart>`.
76
+ */
77
+ function buildPlaytestGroup(adapterFactory) {
78
+ const playtest = IncurCli.create('playtest', {
79
+ description: 'Drive an arbitrary cart through input and capture LIVE gameplay (not the title). `playtest run <cart>` is a one-shot scripted drive; `start`/`step`/`input`/`shot`/`stop` are a resumable LIVE session you play across turns. Transforms a throwaway copy of the cart (btn/btnp -> serial, harness-owned frame loop); your cart is untouched. Requires PICO-8.',
80
+ });
81
+ playtest.command('run', {
82
+ description: 'One-shot: drive an arbitrary cart through a scripted input and capture LIVE gameplay (not the title) in ONE structured envelope. Transforms a throwaway copy of the cart; your cart is untouched. Requires PICO-8.',
83
+ args: z.object({
84
+ cart: z
85
+ .string()
86
+ .default('main.p8')
87
+ .describe('The .p8 cart to playtest. Defaults to main.p8 in the current folder.'),
88
+ }),
89
+ options: z.object({
90
+ input: z
91
+ .string()
92
+ .optional()
93
+ .describe('Scripted input. Either a bare list of buttons ("z", "o right") = pressed at frame 0, or a timeline of "frame:button"/"from-to:button" ("3:o, 18-22:o, 20:right"). A button is a name (o/x/left/right/up/down, aliases l/r/u/d, PICO-8 keys z/x) or a bit 0..5. Omit for the generic one-button/runner/flappy driver.'),
94
+ seed: z
95
+ .number()
96
+ .int()
97
+ .optional()
98
+ .describe('Opt-in determinism: inject srand(n) at cart start so an otherwise-random cart replays identically. Omitted = no srand injected (never silent).'),
99
+ frames: z
100
+ .number()
101
+ .int()
102
+ .positive()
103
+ .optional()
104
+ .describe('How many frames to drive the cart for (defaults to a short window that reaches play).'),
105
+ shotDir: z
106
+ .string()
107
+ .optional()
108
+ .describe('Where PICO-8 writes gameplay screenshots (-desktop). Defaults to an isolated temp dir; NEVER ~/Desktop.'),
109
+ sentinel: z
110
+ .string()
111
+ .default(DONE_SENTINEL)
112
+ .describe('The stdout line that ends the run. The driven cart printh-es this on QUIT.'),
113
+ backstopMs: z
114
+ .number()
115
+ .int()
116
+ .positive()
117
+ .default(DEFAULT_BACKSTOP_MS)
118
+ .describe('Safety backstop: kill PICO-8 after this many ms if it never signals.'),
119
+ }),
120
+ env: PLAYTEST_ENV,
121
+ output: z.object({
122
+ screenshots: z
123
+ .array(z.string())
124
+ .describe('Absolute paths of the gameplay PNG screenshots the driven cart produced.'),
125
+ printh: z
126
+ .string()
127
+ .describe('Captured stdout (the cart ACKs + printh + the sentinel).'),
128
+ exitReason: z
129
+ .enum(['sentinel', 'timeout', 'exit'])
130
+ .describe('sentinel = cart signalled done; timeout = backstop fired; exit = PICO-8 quit.'),
131
+ shotDir: z.string().describe('The dir screenshots were written to.'),
132
+ steps: z
133
+ .number()
134
+ .int()
135
+ .describe('The number of driven-run command blocks sent to the cart.'),
136
+ shotCount: z
137
+ .number()
138
+ .int()
139
+ .describe('The number of screenshots the script requested (SHOT commands).'),
140
+ seeded: z
141
+ .boolean()
142
+ .describe('Whether a --seed was injected (deterministic replay).'),
143
+ }),
144
+ examples: [
145
+ { description: 'Playtest main.p8 with the generic driver (one-shot)' },
146
+ {
147
+ description: 'Drive a specific cart with a scripted input (one-shot)',
148
+ args: { cart: 'game.p8' },
149
+ options: { input: '3:4, 18-22:4, 20:1' },
150
+ },
151
+ {
152
+ description: 'Deterministic replay with a fixed seed',
153
+ args: { cart: 'game.p8' },
154
+ options: { seed: 1, input: '3:4' },
155
+ },
156
+ ],
157
+ async run(ctx) {
158
+ return runOneShot({
159
+ args: ctx.args,
160
+ options: ctx.options,
161
+ env: ctx.env,
162
+ error: ctx.error,
163
+ ok: ctx.ok,
164
+ }, adapterFactory);
165
+ },
166
+ });
167
+ registerSessionVerbs(playtest);
168
+ return playtest;
169
+ }
170
+ /** The env schema the whole `playtest` group shares (locates the binary, isolated). */
171
+ const PLAYTEST_ENV = z.object({
172
+ PICO8_PATH: z
173
+ .string()
174
+ .optional()
175
+ .describe('Explicit path to the PICO-8 binary (else `pico8` on PATH).'),
176
+ PATH: z.string().optional().describe('Used to locate `pico8`.'),
177
+ });
178
+ /**
179
+ * The ONE-SHOT root handler (unchanged behaviour from the one-shot task): build
180
+ * the throwaway driven cart, pipe the whole scripted input as fixed-size blocks,
181
+ * capture the SHOT screenshots, return one structured envelope.
182
+ */
183
+ async function runOneShot(ctx, adapterFactory) {
184
+ const { args, options, env, error, ok } = ctx;
185
+ const cartPath = resolvePath(args.cart);
186
+ if (!existsSync(cartPath)) {
187
+ return error({
188
+ code: 'cart-not-found',
189
+ message: `no cart at ${cartPath}`,
190
+ exitCode: 1,
191
+ });
192
+ }
193
+ let presses;
194
+ if (options.input !== undefined) {
195
+ try {
196
+ presses = parseInputScript(options.input);
197
+ }
198
+ catch (e) {
199
+ if (e instanceof DriveError) {
200
+ return error({ code: e.code, message: e.message, exitCode: 1 });
201
+ }
202
+ throw e;
203
+ }
204
+ }
205
+ let harness;
206
+ try {
207
+ harness = buildDriveHarness(readFileSync(cartPath, 'utf8'), {
208
+ presses,
209
+ frames: options.frames,
210
+ seed: options.seed,
211
+ sentinel: options.sentinel,
212
+ readInclude: makeReadInclude(cartPath),
213
+ });
214
+ }
215
+ catch (e) {
216
+ if (e instanceof DriveError) {
217
+ return error({ code: e.code, message: e.message, exitCode: 1 });
218
+ }
219
+ throw e;
220
+ }
221
+ const shotDir = options.shotDir !== undefined
222
+ ? resolvePath(options.shotDir)
223
+ : mkdtempSync(join(tmpdir(), 'picopilot-playtest-'));
224
+ if (!existsSync(shotDir))
225
+ mkdirSync(shotDir, { recursive: true });
226
+ const drivenCart = join(shotDir, 'driven.p8');
227
+ writeFileSync(drivenCart, harness.cartText);
228
+ const adapter = adapterFactory(env);
229
+ const result = await adapter.drive({
230
+ cartPath: drivenCart,
231
+ shotDir,
232
+ blocks: harness.blocks,
233
+ sentinel: options.sentinel,
234
+ backstopMs: options.backstopMs,
235
+ });
236
+ if (!result.ok) {
237
+ return error({
238
+ code: result.reason,
239
+ message: `PICO-8 is not installed. ${result.remedy} (needs: ${result.needs.join(', ')})`,
240
+ exitCode: 1,
241
+ });
242
+ }
243
+ const { screenshots, printh, exitReason } = result.value;
244
+ const cta = exitReason === 'timeout'
245
+ ? {
246
+ description: 'The driven cart never printed the done-sentinel (backstop fired). Check for a fault:',
247
+ commands: [
248
+ {
249
+ command: 'verify',
250
+ description: 'Run the static gate (tokens + lint + integrity).',
251
+ },
252
+ {
253
+ command: 'run',
254
+ description: 'Boot the cart on its own to see what it draws.',
255
+ },
256
+ ],
257
+ }
258
+ : undefined;
259
+ return ok({
260
+ screenshots: [...screenshots],
261
+ printh,
262
+ exitReason,
263
+ shotDir,
264
+ steps: harness.script.length,
265
+ shotCount: harness.shotCount,
266
+ seeded: options.seed !== undefined,
267
+ }, cta === undefined ? undefined : { cta });
268
+ }
269
+ // ---------------------------------------------------------------------------
270
+ // The RESUMABLE LIVE SESSION verbs (US #6, the "A" model).
271
+ // ---------------------------------------------------------------------------
272
+ /** The structured output shape the session verbs return. */
273
+ const SESSION_OUTPUT = z.object({
274
+ id: z.string().describe('The session id to address in later verbs.'),
275
+ frame: z
276
+ .number()
277
+ .int()
278
+ .describe('Total frames the session has advanced so far.'),
279
+ alive: z
280
+ .boolean()
281
+ .describe('Whether the session is still alive (the game is paused, ready).'),
282
+ ack: z
283
+ .string()
284
+ .optional()
285
+ .describe('The cart ACK line for this command (settled-frame proof).'),
286
+ screenshot: z
287
+ .string()
288
+ .optional()
289
+ .describe('For `shot`: the absolute path of the captured frame PNG.'),
290
+ shotName: z
291
+ .string()
292
+ .optional()
293
+ .describe('For `shot`: the basename the cart named the capture.'),
294
+ shotDir: z
295
+ .string()
296
+ .optional()
297
+ .describe('The dir the session writes screenshots into (never ~/Desktop).'),
298
+ });
299
+ /** Registers `start`/`step`/`input`/`shot`/`stop`/`status` on the group. */
300
+ function registerSessionVerbs(playtest) {
301
+ // --- playtest start <cart> -------------------------------------------------
302
+ playtest.command('start', {
303
+ description: 'Start a RESUMABLE live playtest session on a cart: launches a persistent driven PICO-8 (paused) and returns a session id you drive with step/input/shot/stop across turns. Requires PICO-8; absent -> structured pico8-not-found.',
304
+ args: z.object({
305
+ cart: z
306
+ .string()
307
+ .default('main.p8')
308
+ .describe('The .p8 cart to start a session on. Defaults to main.p8.'),
309
+ }),
310
+ options: z.object({
311
+ id: z
312
+ .string()
313
+ .optional()
314
+ .describe('A session id to use (1-64 chars of [A-Za-z0-9._-]). Omit for a fresh random id.'),
315
+ seed: z
316
+ .number()
317
+ .int()
318
+ .optional()
319
+ .describe('Opt-in determinism: inject srand(n) at cart start (never silent).'),
320
+ idleTimeoutMs: z
321
+ .number()
322
+ .int()
323
+ .positive()
324
+ .default(DEFAULT_IDLE_TIMEOUT_MS)
325
+ .describe('Orphan reap: tear the session (and PICO-8) down after this idle window.'),
326
+ ackTimeoutMs: z
327
+ .number()
328
+ .int()
329
+ .positive()
330
+ .default(DEFAULT_ACK_TIMEOUT_MS)
331
+ .describe('Per-command deadline to wait for the cart ACK before failing.'),
332
+ }),
333
+ env: PLAYTEST_ENV,
334
+ output: SESSION_OUTPUT,
335
+ examples: [
336
+ { description: 'Start a session on main.p8' },
337
+ {
338
+ description: 'Start a named, seeded session',
339
+ args: { cart: 'game.p8' },
340
+ options: { id: 'run1', seed: 1 },
341
+ },
342
+ ],
343
+ async run({ args, options, env, error, ok }) {
344
+ const cartPath = resolvePath(args.cart);
345
+ if (!existsSync(cartPath)) {
346
+ return error({
347
+ code: 'cart-not-found',
348
+ message: `no cart at ${cartPath}`,
349
+ exitCode: 1,
350
+ });
351
+ }
352
+ // Resolve/validate the session id and its controlled on-disk layout.
353
+ const registry = new SessionRegistry();
354
+ let id;
355
+ try {
356
+ id =
357
+ options.id !== undefined
358
+ ? SessionRegistry.validateId(options.id)
359
+ : SessionRegistry.freshId();
360
+ }
361
+ catch (e) {
362
+ return error({
363
+ code: 'playtest-session-id-invalid',
364
+ message: e instanceof Error ? e.message : String(e),
365
+ exitCode: 1,
366
+ });
367
+ }
368
+ if (options.id !== undefined && sessionExists(registry.resolve(id))) {
369
+ return error({
370
+ code: 'playtest-session-exists',
371
+ message: `a session "${id}" is already running; stop it first or use a new id`,
372
+ exitCode: 1,
373
+ });
374
+ }
375
+ const paths = registry.create(id);
376
+ // Build the throwaway driven cart from a COPY (the shim + optional srand).
377
+ // The blocks are ignored: a live session drives commands per-verb.
378
+ let harness;
379
+ try {
380
+ harness = buildDriveHarness(readFileSync(cartPath, 'utf8'), {
381
+ seed: options.seed,
382
+ shotBasename: SHOT_BASENAME,
383
+ readInclude: makeReadInclude(cartPath),
384
+ });
385
+ }
386
+ catch (e) {
387
+ if (e instanceof DriveError) {
388
+ registry.remove(id);
389
+ return error({ code: e.code, message: e.message, exitCode: 1 });
390
+ }
391
+ throw e;
392
+ }
393
+ const drivenCart = join(paths.dir, 'driven.p8');
394
+ writeFileSync(drivenCart, harness.cartText);
395
+ // Spawn the detached daemon, then wait for it to become READY (socket) or
396
+ // report PICO-8 ABSENT (marker), or time out.
397
+ spawnSessionDaemon({
398
+ id,
399
+ paths,
400
+ cartPath: drivenCart,
401
+ shotBasename: SHOT_BASENAME,
402
+ idleTimeoutMs: options.idleTimeoutMs,
403
+ ackTimeoutMs: options.ackTimeoutMs,
404
+ });
405
+ const readiness = await waitForReady(paths, START_READY_TIMEOUT_MS);
406
+ if (readiness === 'absent') {
407
+ registry.remove(id);
408
+ return error({
409
+ code: 'pico8-not-found',
410
+ message: 'PICO-8 is not installed. set PICO8_PATH or install PICO-8 (needs: pico8)',
411
+ exitCode: 1,
412
+ });
413
+ }
414
+ if (readiness === 'timeout') {
415
+ registry.remove(id);
416
+ return error({
417
+ code: 'playtest-session-start-failed',
418
+ message: `the session daemon did not become ready within ${START_READY_TIMEOUT_MS}ms`,
419
+ exitCode: 1,
420
+ });
421
+ }
422
+ return ok({ id, frame: 0, alive: true, shotDir: paths.shotDir }, {
423
+ cta: {
424
+ description: `Session "${id}" is live and paused. Drive it:`,
425
+ commands: [
426
+ {
427
+ command: `playtest input ${id} "right o"`,
428
+ description: 'Hold buttons for the next steps.',
429
+ },
430
+ {
431
+ command: `playtest step ${id} --frames 30`,
432
+ description: 'Advance exactly N frames, then pause.',
433
+ },
434
+ {
435
+ command: `playtest shot ${id}`,
436
+ description: 'Capture the current frozen frame.',
437
+ },
438
+ {
439
+ command: `playtest stop ${id}`,
440
+ description: 'Tear the session down.',
441
+ },
442
+ ],
443
+ },
444
+ });
445
+ },
446
+ });
447
+ // --- playtest input <id> <buttons> ----------------------------------------
448
+ playtest.command('input', {
449
+ description: 'Inject held buttons for the upcoming steps of a live session. Buttons are names (left/right/up/down/o/x, or l/r/u/d), space- or comma-separated; an empty string releases all.',
450
+ args: z.object({
451
+ id: z.string().describe('The session id (from `playtest start`).'),
452
+ buttons: z
453
+ .string()
454
+ .default('')
455
+ .describe('Held buttons, e.g. "right o". Empty = release all.'),
456
+ }),
457
+ env: PLAYTEST_ENV,
458
+ output: SESSION_OUTPUT,
459
+ examples: [
460
+ { description: 'Hold Right + O', args: { id: 'run1', buttons: 'right o' } },
461
+ { description: 'Release all', args: { id: 'run1', buttons: '' } },
462
+ ],
463
+ async run({ args, error, ok }) {
464
+ let held;
465
+ try {
466
+ held = parseButtons(args.buttons);
467
+ }
468
+ catch (e) {
469
+ if (e instanceof DriveError) {
470
+ return error({ code: e.code, message: e.message, exitCode: 1 });
471
+ }
472
+ throw e;
473
+ }
474
+ return sendVerb(args.id, { verb: 'input', held }, error, ok);
475
+ },
476
+ });
477
+ // --- playtest step <id> --frames N ----------------------------------------
478
+ playtest.command('step', {
479
+ description: 'Advance a live session EXACTLY N frames then pause (deterministic via the ACK handshake). The game stays paused on a settled frame between steps.',
480
+ args: z.object({
481
+ id: z.string().describe('The session id (from `playtest start`).'),
482
+ }),
483
+ options: z.object({
484
+ frames: z
485
+ .number()
486
+ .int()
487
+ .positive()
488
+ .default(1)
489
+ .describe('The exact number of frames to advance (default 1).'),
490
+ }),
491
+ env: PLAYTEST_ENV,
492
+ output: SESSION_OUTPUT,
493
+ examples: [
494
+ { description: 'Advance one frame', args: { id: 'run1' } },
495
+ {
496
+ description: 'Advance 30 frames',
497
+ args: { id: 'run1' },
498
+ options: { frames: 30 },
499
+ },
500
+ ],
501
+ async run({ args, options, error, ok }) {
502
+ return sendVerb(args.id, { verb: 'step', frames: options.frames }, error, ok);
503
+ },
504
+ });
505
+ // --- playtest shot <id> ----------------------------------------------------
506
+ playtest.command('shot', {
507
+ description: 'Capture the current (paused, frozen) frame of a live session as a PNG and return its path.',
508
+ args: z.object({
509
+ id: z.string().describe('The session id (from `playtest start`).'),
510
+ }),
511
+ env: PLAYTEST_ENV,
512
+ output: SESSION_OUTPUT,
513
+ examples: [
514
+ { description: 'Screenshot the current frame', args: { id: 'run1' } },
515
+ ],
516
+ async run({ args, error, ok }) {
517
+ return sendVerb(args.id, { verb: 'shot' }, error, ok);
518
+ },
519
+ });
520
+ // --- playtest status <id> --------------------------------------------------
521
+ playtest.command('status', {
522
+ description: 'Report a live session: whether it is alive (game paused, ready) and its frame count.',
523
+ args: z.object({
524
+ id: z.string().describe('The session id (from `playtest start`).'),
525
+ }),
526
+ env: PLAYTEST_ENV,
527
+ output: SESSION_OUTPUT,
528
+ examples: [{ description: 'Check a session', args: { id: 'run1' } }],
529
+ async run({ args, error, ok }) {
530
+ return sendVerb(args.id, { verb: 'status' }, error, ok);
531
+ },
532
+ });
533
+ // --- playtest stop <id> ----------------------------------------------------
534
+ playtest.command('stop', {
535
+ description: 'Tear down a live session: quit its PICO-8 and reap its dir. Idempotent; safe on an already-dead session.',
536
+ args: z.object({
537
+ id: z.string().describe('The session id (from `playtest start`).'),
538
+ }),
539
+ env: PLAYTEST_ENV,
540
+ output: SESSION_OUTPUT,
541
+ examples: [{ description: 'Stop a session', args: { id: 'run1' } }],
542
+ async run({ args, error, ok }) {
543
+ const registry = new SessionRegistry();
544
+ let paths;
545
+ try {
546
+ paths = registry.resolve(args.id);
547
+ }
548
+ catch (e) {
549
+ return error({
550
+ code: 'playtest-session-id-invalid',
551
+ message: e instanceof Error ? e.message : String(e),
552
+ exitCode: 1,
553
+ });
554
+ }
555
+ // A stop on a session with no live daemon is a no-op success (idempotent):
556
+ // clean up any leftover dir and report it gone.
557
+ if (!sessionExists(paths)) {
558
+ registry.remove(args.id);
559
+ return ok({ id: args.id, frame: 0, alive: false });
560
+ }
561
+ const res = await sendVerb(args.id, { verb: 'stop' }, error, ok);
562
+ // The daemon reaps its own dir on teardown; sweep any residue.
563
+ registry.remove(args.id);
564
+ return res;
565
+ },
566
+ });
567
+ }
568
+ /**
569
+ * Polls for the daemon becoming READY (its socket appears) or reporting PICO-8
570
+ * ABSENT (its marker file appears), or a timeout. This is how `start` turns the
571
+ * detached daemon's async startup into a synchronous structured result.
572
+ */
573
+ async function waitForReady(paths, timeoutMs) {
574
+ const marker = join(paths.dir, PICO8_NOT_FOUND_MARKER);
575
+ const deadline = Date.now() + timeoutMs;
576
+ while (Date.now() < deadline) {
577
+ if (existsSync(marker))
578
+ return 'absent';
579
+ if (existsSync(paths.socket))
580
+ return 'ready';
581
+ await sleep(START_POLL_MS);
582
+ }
583
+ return 'timeout';
584
+ }
585
+ /**
586
+ * Sends one verb to a session daemon and maps its {@link SessionResponse} onto the
587
+ * command's ok/error. A connection failure (no daemon at that id) is the
588
+ * structured `playtest-session-not-found`; a daemon error (a lost ack, a dead
589
+ * process) is surfaced with its structured code. Never a hang.
590
+ */
591
+ async function sendVerb(id, request, error, ok) {
592
+ const registry = new SessionRegistry();
593
+ let paths;
594
+ try {
595
+ paths = registry.resolve(id);
596
+ }
597
+ catch (e) {
598
+ return error({
599
+ code: 'playtest-session-id-invalid',
600
+ message: e instanceof Error ? e.message : String(e),
601
+ exitCode: 1,
602
+ });
603
+ }
604
+ if (!sessionExists(paths)) {
605
+ return error({
606
+ code: 'playtest-session-not-found',
607
+ message: `no live session "${id}" (start one with \`playtest start\`)`,
608
+ exitCode: 1,
609
+ });
610
+ }
611
+ let response;
612
+ try {
613
+ response = await new SessionClient(paths.socket).send(request);
614
+ }
615
+ catch (e) {
616
+ return error({
617
+ code: 'playtest-session-not-found',
618
+ message: `could not reach session "${id}": ${e instanceof Error ? e.message : String(e)}`,
619
+ exitCode: 1,
620
+ });
621
+ }
622
+ if (!response.ok) {
623
+ return error({
624
+ code: response.code,
625
+ message: response.message,
626
+ exitCode: 1,
627
+ });
628
+ }
629
+ return ok(response.value);
630
+ }
631
+ //# sourceMappingURL=playtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playtest.js","sourceRoot":"","sources":["../../src/commands/playtest.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAW,GAAG,IAAI,QAAQ,EAAE,CAAC,EAAC,MAAM,OAAO,CAAC;AACnD,OAAO,EACN,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,EACb,UAAU,EAEV,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,kBAAkB,GAIlB,MAAM,0BAA0B,CAAC;AAUlC,MAAM,qBAAqB,GAAwB,CAAC,GAAG,EAAE,EAAE,CAC1D,IAAI,iBAAiB,CAAC,EAAC,GAAG,EAAC,CAAC,CAAC;AAE9B;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,uFAAuF;AACvF,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,0EAA0E;AAC1E,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,sEAAsE;AACtE,SAAS,WAAW,CAAC,CAAS;IAC7B,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,QAAgB;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,WAAW,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;YACnC,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3B,IAAI,CAAC;YACJ,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,SAAS,KAAK,CAAC,EAAU;IACxB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,gBAAgB,CAC/B,GAAY,EACZ,iBAAsC,qBAAqB;IAE3D,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,cAAmC;IAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;QAC5C,WAAW,EACV,gWAAgW;KACjW,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;QACvB,WAAW,EACV,oNAAoN;QACrN,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,OAAO,CAAC,SAAS,CAAC;iBAClB,QAAQ,CACR,sEAAsE,CACtE;SACF,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,sTAAsT,CACtT;YACF,IAAI,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CACR,gJAAgJ,CAChJ;YACF,MAAM,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,EAAE;iBACV,QAAQ,CACR,uFAAuF,CACvF;YACF,OAAO,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,yGAAyG,CACzG;YACF,QAAQ,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,OAAO,CAAC,aAAa,CAAC;iBACtB,QAAQ,CACR,4EAA4E,CAC5E;YACF,UAAU,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,OAAO,CAAC,mBAAmB,CAAC;iBAC5B,QAAQ,CACR,sEAAsE,CACtE;SACF,CAAC;QACF,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,CAAC;iBACZ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,CACR,0EAA0E,CAC1E;YACF,MAAM,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CAAC,0DAA0D,CAAC;YACtE,UAAU,EAAE,CAAC;iBACX,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;iBACrC,QAAQ,CACR,+EAA+E,CAC/E;YACF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACpE,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,CAAC,2DAA2D,CAAC;YACvE,SAAS,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,CACR,iEAAiE,CACjE;YACF,MAAM,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,CAAC,uDAAuD,CAAC;SACnE,CAAC;QACF,QAAQ,EAAE;YACT,EAAC,WAAW,EAAE,qDAAqD,EAAC;YACpE;gBACC,WAAW,EAAE,wDAAwD;gBACrE,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC;gBACvB,OAAO,EAAE,EAAC,KAAK,EAAE,oBAAoB,EAAC;aACtC;YACD;gBACC,WAAW,EAAE,wCAAwC;gBACrD,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC;gBACvB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAC;aAChC;SACD;QACD,KAAK,CAAC,GAAG,CAAC,GAAQ;YACjB,OAAO,UAAU,CAChB;gBACC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,EAAE,EAAE,GAAG,CAAC,EAAgD;aACxD,EACD,cAAc,CACd,CAAC;QACH,CAAC;KACD,CAAC,CAAC;IAEH,oBAAoB,CAAC,QAA8B,CAAC,CAAC;IACrD,OAAO,QAA8B,CAAC;AACvC,CAAC;AAED,uFAAuF;AACvF,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,UAAU,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4DAA4D,CAAC;IACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CAC/D,CAAC,CAAC;AAEH;;;;GAIG;AACH,KAAK,UAAU,UAAU,CACxB,GAaC,EACD,cAAmC;IAEnC,MAAM,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAC,GAAG,GAAG,CAAC;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;YACZ,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,cAAc,QAAQ,EAAE;YACjC,QAAQ,EAAE,CAAC;SACX,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC;IACZ,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC,EAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,CAAC,CAAC;QACT,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACJ,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC3D,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC;SACtC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC,EAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,CAAC,CAAC;IACT,CAAC;IAED,MAAM,OAAO,GACZ,OAAO,CAAC,OAAO,KAAK,SAAS;QAC5B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;QAC9B,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,SAAS,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9C,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAwB,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;QAClC,QAAQ,EAAE,UAAU;QACpB,OAAO;QACP,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,OAAO,EAAE,4BAA4B,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACxF,QAAQ,EAAE,CAAC;SACX,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,EAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACvD,MAAM,GAAG,GACR,UAAU,KAAK,SAAS;QACvB,CAAC,CAAC;YACA,WAAW,EACV,sFAAsF;YACvF,QAAQ,EAAE;gBACT;oBACC,OAAO,EAAE,QAAQ;oBACjB,WAAW,EAAE,kDAAkD;iBAC/D;gBACD;oBACC,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,gDAAgD;iBAC7D;aACD;SACD;QACF,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,EAAE,CACR;QACC,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC;QAC7B,MAAM;QACN,UAAU;QACV,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS;KAClC,EACD,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC,GAAG,EAAC,CACrC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,4DAA4D;AAC5D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACpE,KAAK,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,CAAC,+CAA+C,CAAC;IAC3D,KAAK,EAAE,CAAC;SACN,OAAO,EAAE;SACT,QAAQ,CACR,iEAAiE,CACjE;IACF,GAAG,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2DAA2D,CAAC;IACvE,UAAU,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0DAA0D,CAAC;IACtE,QAAQ,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sDAAsD,CAAC;IAClE,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,gEAAgE,CAAC;CAC5E,CAAC,CAAC;AAEH,4EAA4E;AAC5E,SAAS,oBAAoB,CAAC,QAAiB;IAC9C,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;QACzB,WAAW,EACV,mOAAmO;QACpO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,OAAO,CAAC,SAAS,CAAC;iBAClB,QAAQ,CAAC,0DAA0D,CAAC;SACtE,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,EAAE,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,iFAAiF,CACjF;YACF,IAAI,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CACR,mEAAmE,CACnE;YACF,aAAa,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,OAAO,CAAC,uBAAuB,CAAC;iBAChC,QAAQ,CACR,yEAAyE,CACzE;YACF,YAAY,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,OAAO,CAAC,sBAAsB,CAAC;iBAC/B,QAAQ,CACR,+DAA+D,CAC/D;SACF,CAAC;QACF,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE;YACT,EAAC,WAAW,EAAE,4BAA4B,EAAC;YAC3C;gBACC,WAAW,EAAE,+BAA+B;gBAC5C,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC;gBACvB,OAAO,EAAE,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAC;aAC9B;SACD;QACD,KAAK,CAAC,GAAG,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAC;YACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,cAAc,QAAQ,EAAE;oBACjC,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YAED,qEAAqE;YACrE,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;YACvC,IAAI,EAAU,CAAC;YACf,IAAI,CAAC;gBACJ,EAAE;oBACD,OAAO,CAAC,EAAE,KAAK,SAAS;wBACvB,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;wBACxC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;oBACnD,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACrE,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,cAAc,EAAE,qDAAqD;oBAC9E,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAElC,2EAA2E;YAC3E,mEAAmE;YACnE,IAAI,OAAO,CAAC;YACZ,IAAI,CAAC;gBACJ,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;oBAC3D,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,YAAY,EAAE,aAAa;oBAC3B,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC;iBACtC,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;oBAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACpB,OAAO,KAAK,CAAC,EAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;gBAC/D,CAAC;gBACD,MAAM,CAAC,CAAC;YACT,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAChD,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE5C,0EAA0E;YAC1E,8CAA8C;YAC9C,kBAAkB,CAAC;gBAClB,EAAE;gBACF,KAAK;gBACL,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,aAAa;gBAC3B,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;YACpE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACpB,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EACN,0EAA0E;oBAC3E,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACpB,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,+BAA+B;oBACrC,OAAO,EAAE,kDAAkD,sBAAsB,IAAI;oBACrF,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,CACR,EAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAC,EACnD;gBACC,GAAG,EAAE;oBACJ,WAAW,EAAE,YAAY,EAAE,iCAAiC;oBAC5D,QAAQ,EAAE;wBACT;4BACC,OAAO,EAAE,kBAAkB,EAAE,YAAY;4BACzC,WAAW,EAAE,kCAAkC;yBAC/C;wBACD;4BACC,OAAO,EAAE,iBAAiB,EAAE,cAAc;4BAC1C,WAAW,EAAE,uCAAuC;yBACpD;wBACD;4BACC,OAAO,EAAE,iBAAiB,EAAE,EAAE;4BAC9B,WAAW,EAAE,mCAAmC;yBAChD;wBACD;4BACC,OAAO,EAAE,iBAAiB,EAAE,EAAE;4BAC9B,WAAW,EAAE,wBAAwB;yBACrC;qBACD;iBACD;aACD,CACD,CAAC;QACH,CAAC;KACD,CAAC,CAAC;IAEH,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;QACzB,WAAW,EACV,gLAAgL;QACjL,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YAClE,OAAO,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,oDAAoD,CAAC;SAChE,CAAC;QACF,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE;YACT,EAAC,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAC,EAAC;YACvE,EAAC,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAC,EAAC;SAC7D;QACD,KAAK,CAAC,GAAG,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAC;YAC1B,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACJ,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;oBAC7B,OAAO,KAAK,CAAC,EAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;gBAC/D,CAAC;gBACD,MAAM,CAAC,CAAC;YACT,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;KACD,CAAC,CAAC;IAEH,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;QACxB,WAAW,EACV,mJAAmJ;QACpJ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAClE,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,CAAC;iBACV,QAAQ,CAAC,oDAAoD,CAAC;SAChE,CAAC;QACF,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE;YACT,EAAC,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAC,EAAE,EAAE,MAAM,EAAC,EAAC;YACtD;gBACC,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,EAAC,EAAE,EAAE,MAAM,EAAC;gBAClB,OAAO,EAAE,EAAC,MAAM,EAAE,EAAE,EAAC;aACrB;SACD;QACD,KAAK,CAAC,GAAG,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAC;YACnC,OAAO,QAAQ,CACd,IAAI,CAAC,EAAE,EACP,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAC,EACtC,KAAK,EACL,EAAE,CACF,CAAC;QACH,CAAC;KACD,CAAC,CAAC;IAEH,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;QACxB,WAAW,EACV,4FAA4F;QAC7F,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAClE,CAAC;QACF,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE;YACT,EAAC,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,EAAC,EAAE,EAAE,MAAM,EAAC,EAAC;SACjE;QACD,KAAK,CAAC,GAAG,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAC;YAC1B,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;KACD,CAAC,CAAC;IAEH,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE;QAC1B,WAAW,EACV,sFAAsF;QACvF,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAClE,CAAC;QACF,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE,CAAC,EAAC,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAC,EAAE,EAAE,MAAM,EAAC,EAAC,CAAC;QAChE,KAAK,CAAC,GAAG,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAC;YAC1B,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;KACD,CAAC,CAAC;IAEH,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;QACxB,WAAW,EACV,0GAA0G;QAC3G,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAClE,CAAC;QACF,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE,CAAC,EAAC,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAC,EAAE,EAAE,MAAM,EAAC,EAAC,CAAC;QAC/D,KAAK,CAAC,GAAG,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC;YACV,IAAI,CAAC;gBACJ,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;oBACnD,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YACD,2EAA2E;YAC3E,gDAAgD;YAChD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAC,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/D,+DAA+D;YAC/D,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzB,OAAO,GAAG,CAAC;QACZ,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,YAAY,CAC1B,KAAoC,EACpC,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC9B,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,QAAQ,CAAC;QACxC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,OAAO,CAAC;QAC7C,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,QAAQ,CACtB,EAAU,EACV,OAAuB,EACvB,KAAkE,EAClE,EAAsC;IAEtC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACJ,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;YACZ,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACnD,QAAQ,EAAE,CAAC;SACX,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;YACZ,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,oBAAoB,EAAE,uCAAuC;YACtE,QAAQ,EAAE,CAAC;SACX,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,QAAyB,CAAC;IAC9B,IAAI,CAAC;QACJ,QAAQ,GAAG,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;YACZ,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzF,QAAQ,EAAE,CAAC;SACX,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;YACZ,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,CAAC;SACX,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}