hbengine 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/README.md +20 -0
  2. package/engine-cli/connect.mjs +73 -0
  3. package/engine-cli/hbengine.mjs +565 -0
  4. package/engine-cli/package.json +1 -0
  5. package/engine-cli/templates.mjs +14 -0
  6. package/engine-conformance/analyse-worker.mjs +12 -0
  7. package/engine-conformance/analyse.mjs +4458 -0
  8. package/engine-conformance/bundle.mjs +208 -0
  9. package/engine-conformance/clock.mjs +294 -0
  10. package/engine-conformance/csp.go +56 -0
  11. package/engine-conformance/csp.json +6 -0
  12. package/engine-conformance/csp.mjs +20 -0
  13. package/engine-conformance/gzip-sizes.mjs +9 -0
  14. package/engine-conformance/package.json +1 -0
  15. package/engine-conformance/picture.mjs +55 -0
  16. package/engine-conformance/report.go +349 -0
  17. package/engine-conformance/run.mjs +1217 -0
  18. package/engine-conformance/scan.mjs +476 -0
  19. package/engine-conformance/testdata/clock-overlay/bundle/assets.json +1 -0
  20. package/engine-conformance/testdata/clock-overlay/bundle/game.css +17 -0
  21. package/engine-conformance/testdata/clock-overlay/bundle/game.js +83 -0
  22. package/engine-conformance/testdata/clock-overlay/bundle/hbtest.json +4 -0
  23. package/engine-conformance/testdata/clock-overlay/bundle/index.html +34 -0
  24. package/engine-conformance/testdata/clock-probe/bundle/assets.json +1 -0
  25. package/engine-conformance/testdata/clock-probe/bundle/game.css +17 -0
  26. package/engine-conformance/testdata/clock-probe/bundle/game.js +65 -0
  27. package/engine-conformance/testdata/clock-probe/bundle/hbtest.json +4 -0
  28. package/engine-conformance/testdata/clock-probe/bundle/index.html +35 -0
  29. package/engine-conformance/testdata/clock-probe/bundle/probe-worker.js +46 -0
  30. package/engine-conformance/testdata/clock-probe/bundle/probe.js +210 -0
  31. package/engine-conformance/testdata/clock-probe/math/dice.tsv +100 -0
  32. package/engine-conformance/testdata/clock-probe/math/manifest.json +2925 -0
  33. package/engine-conformance/testdata/clock-worker/bundle/assets.json +1 -0
  34. package/engine-conformance/testdata/clock-worker/bundle/clock-worker.js +14 -0
  35. package/engine-conformance/testdata/clock-worker/bundle/game.css +17 -0
  36. package/engine-conformance/testdata/clock-worker/bundle/game.js +61 -0
  37. package/engine-conformance/testdata/clock-worker/bundle/hbtest.json +4 -0
  38. package/engine-conformance/testdata/clock-worker/bundle/index.html +35 -0
  39. package/engine-conformance/testdata/clock-worker/math/dice.tsv +100 -0
  40. package/engine-conformance/testdata/clock-worker/math/manifest.json +2925 -0
  41. package/engine-conformance/travel.mjs +1209 -0
  42. package/engine-conformance/vendor/acorn/LICENSE +21 -0
  43. package/engine-conformance/vendor/acorn/acorn.mjs +6266 -0
  44. package/engine-conformance/wasm-releases.json +168 -0
  45. package/engine-examples/README.md +23 -0
  46. package/engine-examples/coin/AGENTS.md +3 -0
  47. package/engine-examples/coin/README.md +7 -0
  48. package/engine-examples/coin/bundle/assets.json +1 -0
  49. package/engine-examples/coin/bundle/game.css +5 -0
  50. package/engine-examples/coin/bundle/game.js +19 -0
  51. package/engine-examples/coin/bundle/hbtest.json +5 -0
  52. package/engine-examples/coin/bundle/index.html +16 -0
  53. package/engine-examples/coin/math/coin.tsv +2 -0
  54. package/engine-examples/coin/math/manifest.json +17 -0
  55. package/engine-examples/crash/AGENTS.md +3 -0
  56. package/engine-examples/crash/README.md +14 -0
  57. package/engine-examples/crash/bundle/assets.json +1 -0
  58. package/engine-examples/crash/bundle/game.css +8 -0
  59. package/engine-examples/crash/bundle/game.js +90 -0
  60. package/engine-examples/crash/bundle/hbtest.json +5 -0
  61. package/engine-examples/crash/bundle/index.html +20 -0
  62. package/engine-examples/crash/math/crash-01.tsv +2 -0
  63. package/engine-examples/crash/math/crash-02.tsv +2 -0
  64. package/engine-examples/crash/math/crash-03.tsv +2 -0
  65. package/engine-examples/crash/math/crash-04.tsv +2 -0
  66. package/engine-examples/crash/math/crash-05.tsv +2 -0
  67. package/engine-examples/crash/math/crash-06.tsv +2 -0
  68. package/engine-examples/crash/math/crash-07.tsv +2 -0
  69. package/engine-examples/crash/math/crash-08.tsv +2 -0
  70. package/engine-examples/crash/math/crash-09.tsv +2 -0
  71. package/engine-examples/crash/math/crash-10.tsv +2 -0
  72. package/engine-examples/crash/math/crash-11.tsv +2 -0
  73. package/engine-examples/crash/math/crash-12.tsv +2 -0
  74. package/engine-examples/crash/math/crash-13.tsv +2 -0
  75. package/engine-examples/crash/math/crash-14.tsv +2 -0
  76. package/engine-examples/crash/math/crash-15.tsv +2 -0
  77. package/engine-examples/crash/math/crash-16.tsv +2 -0
  78. package/engine-examples/crash/math/crash-17.tsv +2 -0
  79. package/engine-examples/crash/math/crash-18.tsv +2 -0
  80. package/engine-examples/crash/math/crash-19.tsv +2 -0
  81. package/engine-examples/crash/math/crash-20.tsv +2 -0
  82. package/engine-examples/crash/math/crash-21.tsv +2 -0
  83. package/engine-examples/crash/math/crash-22.tsv +2 -0
  84. package/engine-examples/crash/math/crash-23.tsv +2 -0
  85. package/engine-examples/crash/math/crash-24.tsv +2 -0
  86. package/engine-examples/crash/math/crash-25.tsv +2 -0
  87. package/engine-examples/crash/math/crash-26.tsv +2 -0
  88. package/engine-examples/crash/math/crash-27.tsv +2 -0
  89. package/engine-examples/crash/math/crash-28.tsv +2 -0
  90. package/engine-examples/crash/math/crash-29.tsv +2 -0
  91. package/engine-examples/crash/math/crash-30.tsv +2 -0
  92. package/engine-examples/crash/math/crash-31.tsv +2 -0
  93. package/engine-examples/crash/math/crash-32.tsv +2 -0
  94. package/engine-examples/crash/math/crash-33.tsv +2 -0
  95. package/engine-examples/crash/math/crash-34.tsv +2 -0
  96. package/engine-examples/crash/math/crash-35.tsv +2 -0
  97. package/engine-examples/crash/math/crash-36.tsv +2 -0
  98. package/engine-examples/crash/math/crash-37.tsv +2 -0
  99. package/engine-examples/crash/math/crash-38.tsv +2 -0
  100. package/engine-examples/crash/math/crash-39.tsv +2 -0
  101. package/engine-examples/crash/math/crash-40.tsv +2 -0
  102. package/engine-examples/crash/math/crash-41.tsv +2 -0
  103. package/engine-examples/crash/math/crash-42.tsv +2 -0
  104. package/engine-examples/crash/math/crash-43.tsv +2 -0
  105. package/engine-examples/crash/math/crash-44.tsv +2 -0
  106. package/engine-examples/crash/math/crash-45.tsv +2 -0
  107. package/engine-examples/crash/math/crash-46.tsv +2 -0
  108. package/engine-examples/crash/math/crash-47.tsv +2 -0
  109. package/engine-examples/crash/math/crash-48.tsv +2 -0
  110. package/engine-examples/crash/math/crash-49.tsv +2 -0
  111. package/engine-examples/crash/math/crash-50.tsv +2 -0
  112. package/engine-examples/crash/math/crash-51.tsv +2 -0
  113. package/engine-examples/crash/math/crash-52.tsv +2 -0
  114. package/engine-examples/crash/math/crash-53.tsv +2 -0
  115. package/engine-examples/crash/math/crash-54.tsv +2 -0
  116. package/engine-examples/crash/math/crash-55.tsv +2 -0
  117. package/engine-examples/crash/math/crash-56.tsv +2 -0
  118. package/engine-examples/crash/math/crash-57.tsv +2 -0
  119. package/engine-examples/crash/math/crash-58.tsv +2 -0
  120. package/engine-examples/crash/math/crash-59.tsv +2 -0
  121. package/engine-examples/crash/math/crash-60.tsv +2 -0
  122. package/engine-examples/crash/math/crash-61.tsv +2 -0
  123. package/engine-examples/crash/math/crash-62.tsv +2 -0
  124. package/engine-examples/crash/math/crash-63.tsv +2 -0
  125. package/engine-examples/crash/math/crash-64.tsv +2 -0
  126. package/engine-examples/crash/math/gen.mjs +31 -0
  127. package/engine-examples/crash/math/manifest.json +1 -0
  128. package/engine-examples/dice/AGENTS.md +3 -0
  129. package/engine-examples/dice/README.md +25 -0
  130. package/engine-examples/dice/bundle/assets.json +1 -0
  131. package/engine-examples/dice/bundle/game.css +17 -0
  132. package/engine-examples/dice/bundle/game.js +61 -0
  133. package/engine-examples/dice/bundle/hbtest.json +4 -0
  134. package/engine-examples/dice/bundle/index.html +34 -0
  135. package/engine-examples/dice/math/dice.tsv +100 -0
  136. package/engine-examples/dice/math/manifest.json +2925 -0
  137. package/engine-examples/keno/AGENTS.md +3 -0
  138. package/engine-examples/keno/README.md +11 -0
  139. package/engine-examples/keno/bundle/assets.json +1 -0
  140. package/engine-examples/keno/bundle/game.css +14 -0
  141. package/engine-examples/keno/bundle/game.js +86 -0
  142. package/engine-examples/keno/bundle/hbtest.json +4 -0
  143. package/engine-examples/keno/bundle/i18n.json +342 -0
  144. package/engine-examples/keno/bundle/index.html +20 -0
  145. package/engine-examples/keno/bundle/model.json +1 -0
  146. package/engine-examples/keno/math/gen.mjs +35 -0
  147. package/engine-examples/keno/math/keno-picks-1.tsv +2 -0
  148. package/engine-examples/keno/math/keno-picks-10.tsv +11 -0
  149. package/engine-examples/keno/math/keno-picks-2.tsv +3 -0
  150. package/engine-examples/keno/math/keno-picks-3.tsv +4 -0
  151. package/engine-examples/keno/math/keno-picks-4.tsv +5 -0
  152. package/engine-examples/keno/math/keno-picks-5.tsv +6 -0
  153. package/engine-examples/keno/math/keno-picks-6.tsv +7 -0
  154. package/engine-examples/keno/math/keno-picks-7.tsv +8 -0
  155. package/engine-examples/keno/math/keno-picks-8.tsv +9 -0
  156. package/engine-examples/keno/math/keno-picks-9.tsv +10 -0
  157. package/engine-examples/keno/math/manifest.json +1 -0
  158. package/engine-examples/keno/math-kit/pack.mjs +165 -0
  159. package/engine-examples/keno/math-kit/package.json +8 -0
  160. package/engine-examples/keno/math-kit/slot.mjs +94 -0
  161. package/engine-examples/keno/math-kit/tumble.mjs +94 -0
  162. package/engine-examples/lines/AGENTS.md +3 -0
  163. package/engine-examples/lines/README.md +20 -0
  164. package/engine-examples/lines/bundle/assets.json +1 -0
  165. package/engine-examples/lines/bundle/game.css +16 -0
  166. package/engine-examples/lines/bundle/game.js +125 -0
  167. package/engine-examples/lines/bundle/hbtest.json +4 -0
  168. package/engine-examples/lines/bundle/i18n.json +242 -0
  169. package/engine-examples/lines/bundle/index.html +23 -0
  170. package/engine-examples/lines/bundle/model.json +1 -0
  171. package/engine-examples/lines/math/gen.mjs +54 -0
  172. package/engine-examples/lines/math-kit/pack.mjs +165 -0
  173. package/engine-examples/lines/math-kit/package.json +8 -0
  174. package/engine-examples/lines/math-kit/slot.mjs +94 -0
  175. package/engine-examples/lines/math-kit/tumble.mjs +94 -0
  176. package/engine-examples/mines/AGENTS.md +3 -0
  177. package/engine-examples/mines/README.md +13 -0
  178. package/engine-examples/mines/bundle/assets.json +1 -0
  179. package/engine-examples/mines/bundle/game.css +12 -0
  180. package/engine-examples/mines/bundle/game.js +58 -0
  181. package/engine-examples/mines/bundle/hbtest.json +8 -0
  182. package/engine-examples/mines/bundle/index.html +16 -0
  183. package/engine-examples/mines/math/gen.mjs +40 -0
  184. package/engine-examples/mines/math/manifest.json +1 -0
  185. package/engine-examples/mines/math/mines-1-1.tsv +2 -0
  186. package/engine-examples/mines/math/mines-1-2.tsv +2 -0
  187. package/engine-examples/mines/math/mines-1-22.tsv +2 -0
  188. package/engine-examples/mines/math/mines-1-23.tsv +2 -0
  189. package/engine-examples/mines/math/mines-1-24.tsv +2 -0
  190. package/engine-examples/mines/math/mines-1-3.tsv +2 -0
  191. package/engine-examples/mines/math/mines-10-1.tsv +2 -0
  192. package/engine-examples/mines/math/mines-10-10.tsv +2 -0
  193. package/engine-examples/mines/math/mines-10-11.tsv +2 -0
  194. package/engine-examples/mines/math/mines-10-12.tsv +2 -0
  195. package/engine-examples/mines/math/mines-10-13.tsv +2 -0
  196. package/engine-examples/mines/math/mines-10-14.tsv +2 -0
  197. package/engine-examples/mines/math/mines-10-15.tsv +2 -0
  198. package/engine-examples/mines/math/mines-10-2.tsv +2 -0
  199. package/engine-examples/mines/math/mines-10-3.tsv +2 -0
  200. package/engine-examples/mines/math/mines-10-4.tsv +2 -0
  201. package/engine-examples/mines/math/mines-10-5.tsv +2 -0
  202. package/engine-examples/mines/math/mines-10-6.tsv +2 -0
  203. package/engine-examples/mines/math/mines-10-7.tsv +2 -0
  204. package/engine-examples/mines/math/mines-10-8.tsv +2 -0
  205. package/engine-examples/mines/math/mines-10-9.tsv +2 -0
  206. package/engine-examples/mines/math/mines-11-1.tsv +2 -0
  207. package/engine-examples/mines/math/mines-11-10.tsv +2 -0
  208. package/engine-examples/mines/math/mines-11-11.tsv +2 -0
  209. package/engine-examples/mines/math/mines-11-12.tsv +2 -0
  210. package/engine-examples/mines/math/mines-11-13.tsv +2 -0
  211. package/engine-examples/mines/math/mines-11-14.tsv +2 -0
  212. package/engine-examples/mines/math/mines-11-2.tsv +2 -0
  213. package/engine-examples/mines/math/mines-11-3.tsv +2 -0
  214. package/engine-examples/mines/math/mines-11-4.tsv +2 -0
  215. package/engine-examples/mines/math/mines-11-5.tsv +2 -0
  216. package/engine-examples/mines/math/mines-11-6.tsv +2 -0
  217. package/engine-examples/mines/math/mines-11-7.tsv +2 -0
  218. package/engine-examples/mines/math/mines-11-8.tsv +2 -0
  219. package/engine-examples/mines/math/mines-11-9.tsv +2 -0
  220. package/engine-examples/mines/math/mines-12-1.tsv +2 -0
  221. package/engine-examples/mines/math/mines-12-10.tsv +2 -0
  222. package/engine-examples/mines/math/mines-12-11.tsv +2 -0
  223. package/engine-examples/mines/math/mines-12-12.tsv +2 -0
  224. package/engine-examples/mines/math/mines-12-13.tsv +2 -0
  225. package/engine-examples/mines/math/mines-12-2.tsv +2 -0
  226. package/engine-examples/mines/math/mines-12-3.tsv +2 -0
  227. package/engine-examples/mines/math/mines-12-4.tsv +2 -0
  228. package/engine-examples/mines/math/mines-12-5.tsv +2 -0
  229. package/engine-examples/mines/math/mines-12-6.tsv +2 -0
  230. package/engine-examples/mines/math/mines-12-7.tsv +2 -0
  231. package/engine-examples/mines/math/mines-12-8.tsv +2 -0
  232. package/engine-examples/mines/math/mines-12-9.tsv +2 -0
  233. package/engine-examples/mines/math/mines-13-1.tsv +2 -0
  234. package/engine-examples/mines/math/mines-13-10.tsv +2 -0
  235. package/engine-examples/mines/math/mines-13-11.tsv +2 -0
  236. package/engine-examples/mines/math/mines-13-12.tsv +2 -0
  237. package/engine-examples/mines/math/mines-13-2.tsv +2 -0
  238. package/engine-examples/mines/math/mines-13-3.tsv +2 -0
  239. package/engine-examples/mines/math/mines-13-4.tsv +2 -0
  240. package/engine-examples/mines/math/mines-13-5.tsv +2 -0
  241. package/engine-examples/mines/math/mines-13-6.tsv +2 -0
  242. package/engine-examples/mines/math/mines-13-7.tsv +2 -0
  243. package/engine-examples/mines/math/mines-13-8.tsv +2 -0
  244. package/engine-examples/mines/math/mines-13-9.tsv +2 -0
  245. package/engine-examples/mines/math/mines-14-1.tsv +2 -0
  246. package/engine-examples/mines/math/mines-14-10.tsv +2 -0
  247. package/engine-examples/mines/math/mines-14-11.tsv +2 -0
  248. package/engine-examples/mines/math/mines-14-2.tsv +2 -0
  249. package/engine-examples/mines/math/mines-14-3.tsv +2 -0
  250. package/engine-examples/mines/math/mines-14-4.tsv +2 -0
  251. package/engine-examples/mines/math/mines-14-5.tsv +2 -0
  252. package/engine-examples/mines/math/mines-14-6.tsv +2 -0
  253. package/engine-examples/mines/math/mines-14-7.tsv +2 -0
  254. package/engine-examples/mines/math/mines-14-8.tsv +2 -0
  255. package/engine-examples/mines/math/mines-14-9.tsv +2 -0
  256. package/engine-examples/mines/math/mines-15-1.tsv +2 -0
  257. package/engine-examples/mines/math/mines-15-10.tsv +2 -0
  258. package/engine-examples/mines/math/mines-15-2.tsv +2 -0
  259. package/engine-examples/mines/math/mines-15-3.tsv +2 -0
  260. package/engine-examples/mines/math/mines-15-4.tsv +2 -0
  261. package/engine-examples/mines/math/mines-15-5.tsv +2 -0
  262. package/engine-examples/mines/math/mines-15-6.tsv +2 -0
  263. package/engine-examples/mines/math/mines-15-7.tsv +2 -0
  264. package/engine-examples/mines/math/mines-15-8.tsv +2 -0
  265. package/engine-examples/mines/math/mines-15-9.tsv +2 -0
  266. package/engine-examples/mines/math/mines-16-1.tsv +2 -0
  267. package/engine-examples/mines/math/mines-16-2.tsv +2 -0
  268. package/engine-examples/mines/math/mines-16-3.tsv +2 -0
  269. package/engine-examples/mines/math/mines-16-4.tsv +2 -0
  270. package/engine-examples/mines/math/mines-16-5.tsv +2 -0
  271. package/engine-examples/mines/math/mines-16-6.tsv +2 -0
  272. package/engine-examples/mines/math/mines-16-7.tsv +2 -0
  273. package/engine-examples/mines/math/mines-16-8.tsv +2 -0
  274. package/engine-examples/mines/math/mines-16-9.tsv +2 -0
  275. package/engine-examples/mines/math/mines-17-1.tsv +2 -0
  276. package/engine-examples/mines/math/mines-17-2.tsv +2 -0
  277. package/engine-examples/mines/math/mines-17-3.tsv +2 -0
  278. package/engine-examples/mines/math/mines-17-4.tsv +2 -0
  279. package/engine-examples/mines/math/mines-17-5.tsv +2 -0
  280. package/engine-examples/mines/math/mines-17-6.tsv +2 -0
  281. package/engine-examples/mines/math/mines-17-7.tsv +2 -0
  282. package/engine-examples/mines/math/mines-17-8.tsv +2 -0
  283. package/engine-examples/mines/math/mines-18-1.tsv +2 -0
  284. package/engine-examples/mines/math/mines-18-2.tsv +2 -0
  285. package/engine-examples/mines/math/mines-18-3.tsv +2 -0
  286. package/engine-examples/mines/math/mines-18-4.tsv +2 -0
  287. package/engine-examples/mines/math/mines-18-5.tsv +2 -0
  288. package/engine-examples/mines/math/mines-18-6.tsv +2 -0
  289. package/engine-examples/mines/math/mines-18-7.tsv +2 -0
  290. package/engine-examples/mines/math/mines-19-1.tsv +2 -0
  291. package/engine-examples/mines/math/mines-19-2.tsv +2 -0
  292. package/engine-examples/mines/math/mines-19-3.tsv +2 -0
  293. package/engine-examples/mines/math/mines-19-4.tsv +2 -0
  294. package/engine-examples/mines/math/mines-19-5.tsv +2 -0
  295. package/engine-examples/mines/math/mines-19-6.tsv +2 -0
  296. package/engine-examples/mines/math/mines-2-1.tsv +2 -0
  297. package/engine-examples/mines/math/mines-2-19.tsv +2 -0
  298. package/engine-examples/mines/math/mines-2-2.tsv +2 -0
  299. package/engine-examples/mines/math/mines-2-20.tsv +2 -0
  300. package/engine-examples/mines/math/mines-2-21.tsv +2 -0
  301. package/engine-examples/mines/math/mines-2-22.tsv +2 -0
  302. package/engine-examples/mines/math/mines-2-23.tsv +2 -0
  303. package/engine-examples/mines/math/mines-2-3.tsv +2 -0
  304. package/engine-examples/mines/math/mines-2-4.tsv +2 -0
  305. package/engine-examples/mines/math/mines-2-5.tsv +2 -0
  306. package/engine-examples/mines/math/mines-20-1.tsv +2 -0
  307. package/engine-examples/mines/math/mines-20-2.tsv +2 -0
  308. package/engine-examples/mines/math/mines-20-3.tsv +2 -0
  309. package/engine-examples/mines/math/mines-20-4.tsv +2 -0
  310. package/engine-examples/mines/math/mines-20-5.tsv +2 -0
  311. package/engine-examples/mines/math/mines-21-1.tsv +2 -0
  312. package/engine-examples/mines/math/mines-21-2.tsv +2 -0
  313. package/engine-examples/mines/math/mines-21-3.tsv +2 -0
  314. package/engine-examples/mines/math/mines-21-4.tsv +2 -0
  315. package/engine-examples/mines/math/mines-22-1.tsv +2 -0
  316. package/engine-examples/mines/math/mines-22-2.tsv +2 -0
  317. package/engine-examples/mines/math/mines-22-3.tsv +2 -0
  318. package/engine-examples/mines/math/mines-23-1.tsv +2 -0
  319. package/engine-examples/mines/math/mines-23-2.tsv +2 -0
  320. package/engine-examples/mines/math/mines-24-1.tsv +2 -0
  321. package/engine-examples/mines/math/mines-3-1.tsv +2 -0
  322. package/engine-examples/mines/math/mines-3-17.tsv +2 -0
  323. package/engine-examples/mines/math/mines-3-18.tsv +2 -0
  324. package/engine-examples/mines/math/mines-3-19.tsv +2 -0
  325. package/engine-examples/mines/math/mines-3-2.tsv +2 -0
  326. package/engine-examples/mines/math/mines-3-20.tsv +2 -0
  327. package/engine-examples/mines/math/mines-3-21.tsv +2 -0
  328. package/engine-examples/mines/math/mines-3-22.tsv +2 -0
  329. package/engine-examples/mines/math/mines-3-3.tsv +2 -0
  330. package/engine-examples/mines/math/mines-3-4.tsv +2 -0
  331. package/engine-examples/mines/math/mines-3-5.tsv +2 -0
  332. package/engine-examples/mines/math/mines-3-6.tsv +2 -0
  333. package/engine-examples/mines/math/mines-4-1.tsv +2 -0
  334. package/engine-examples/mines/math/mines-4-13.tsv +2 -0
  335. package/engine-examples/mines/math/mines-4-14.tsv +2 -0
  336. package/engine-examples/mines/math/mines-4-15.tsv +2 -0
  337. package/engine-examples/mines/math/mines-4-16.tsv +2 -0
  338. package/engine-examples/mines/math/mines-4-17.tsv +2 -0
  339. package/engine-examples/mines/math/mines-4-18.tsv +2 -0
  340. package/engine-examples/mines/math/mines-4-19.tsv +2 -0
  341. package/engine-examples/mines/math/mines-4-2.tsv +2 -0
  342. package/engine-examples/mines/math/mines-4-20.tsv +2 -0
  343. package/engine-examples/mines/math/mines-4-21.tsv +2 -0
  344. package/engine-examples/mines/math/mines-4-3.tsv +2 -0
  345. package/engine-examples/mines/math/mines-4-4.tsv +2 -0
  346. package/engine-examples/mines/math/mines-4-5.tsv +2 -0
  347. package/engine-examples/mines/math/mines-4-6.tsv +2 -0
  348. package/engine-examples/mines/math/mines-4-7.tsv +2 -0
  349. package/engine-examples/mines/math/mines-4-8.tsv +2 -0
  350. package/engine-examples/mines/math/mines-4-9.tsv +2 -0
  351. package/engine-examples/mines/math/mines-5-1.tsv +2 -0
  352. package/engine-examples/mines/math/mines-5-10.tsv +2 -0
  353. package/engine-examples/mines/math/mines-5-11.tsv +2 -0
  354. package/engine-examples/mines/math/mines-5-12.tsv +2 -0
  355. package/engine-examples/mines/math/mines-5-13.tsv +2 -0
  356. package/engine-examples/mines/math/mines-5-14.tsv +2 -0
  357. package/engine-examples/mines/math/mines-5-15.tsv +2 -0
  358. package/engine-examples/mines/math/mines-5-16.tsv +2 -0
  359. package/engine-examples/mines/math/mines-5-17.tsv +2 -0
  360. package/engine-examples/mines/math/mines-5-18.tsv +2 -0
  361. package/engine-examples/mines/math/mines-5-19.tsv +2 -0
  362. package/engine-examples/mines/math/mines-5-2.tsv +2 -0
  363. package/engine-examples/mines/math/mines-5-20.tsv +2 -0
  364. package/engine-examples/mines/math/mines-5-3.tsv +2 -0
  365. package/engine-examples/mines/math/mines-5-4.tsv +2 -0
  366. package/engine-examples/mines/math/mines-5-5.tsv +2 -0
  367. package/engine-examples/mines/math/mines-5-6.tsv +2 -0
  368. package/engine-examples/mines/math/mines-5-7.tsv +2 -0
  369. package/engine-examples/mines/math/mines-5-8.tsv +2 -0
  370. package/engine-examples/mines/math/mines-5-9.tsv +2 -0
  371. package/engine-examples/mines/math/mines-6-1.tsv +2 -0
  372. package/engine-examples/mines/math/mines-6-10.tsv +2 -0
  373. package/engine-examples/mines/math/mines-6-11.tsv +2 -0
  374. package/engine-examples/mines/math/mines-6-12.tsv +2 -0
  375. package/engine-examples/mines/math/mines-6-13.tsv +2 -0
  376. package/engine-examples/mines/math/mines-6-14.tsv +2 -0
  377. package/engine-examples/mines/math/mines-6-15.tsv +2 -0
  378. package/engine-examples/mines/math/mines-6-16.tsv +2 -0
  379. package/engine-examples/mines/math/mines-6-17.tsv +2 -0
  380. package/engine-examples/mines/math/mines-6-18.tsv +2 -0
  381. package/engine-examples/mines/math/mines-6-19.tsv +2 -0
  382. package/engine-examples/mines/math/mines-6-2.tsv +2 -0
  383. package/engine-examples/mines/math/mines-6-3.tsv +2 -0
  384. package/engine-examples/mines/math/mines-6-4.tsv +2 -0
  385. package/engine-examples/mines/math/mines-6-5.tsv +2 -0
  386. package/engine-examples/mines/math/mines-6-6.tsv +2 -0
  387. package/engine-examples/mines/math/mines-6-7.tsv +2 -0
  388. package/engine-examples/mines/math/mines-6-8.tsv +2 -0
  389. package/engine-examples/mines/math/mines-6-9.tsv +2 -0
  390. package/engine-examples/mines/math/mines-7-1.tsv +2 -0
  391. package/engine-examples/mines/math/mines-7-10.tsv +2 -0
  392. package/engine-examples/mines/math/mines-7-11.tsv +2 -0
  393. package/engine-examples/mines/math/mines-7-12.tsv +2 -0
  394. package/engine-examples/mines/math/mines-7-13.tsv +2 -0
  395. package/engine-examples/mines/math/mines-7-14.tsv +2 -0
  396. package/engine-examples/mines/math/mines-7-15.tsv +2 -0
  397. package/engine-examples/mines/math/mines-7-16.tsv +2 -0
  398. package/engine-examples/mines/math/mines-7-17.tsv +2 -0
  399. package/engine-examples/mines/math/mines-7-18.tsv +2 -0
  400. package/engine-examples/mines/math/mines-7-2.tsv +2 -0
  401. package/engine-examples/mines/math/mines-7-3.tsv +2 -0
  402. package/engine-examples/mines/math/mines-7-4.tsv +2 -0
  403. package/engine-examples/mines/math/mines-7-5.tsv +2 -0
  404. package/engine-examples/mines/math/mines-7-6.tsv +2 -0
  405. package/engine-examples/mines/math/mines-7-7.tsv +2 -0
  406. package/engine-examples/mines/math/mines-7-8.tsv +2 -0
  407. package/engine-examples/mines/math/mines-7-9.tsv +2 -0
  408. package/engine-examples/mines/math/mines-8-1.tsv +2 -0
  409. package/engine-examples/mines/math/mines-8-10.tsv +2 -0
  410. package/engine-examples/mines/math/mines-8-11.tsv +2 -0
  411. package/engine-examples/mines/math/mines-8-12.tsv +2 -0
  412. package/engine-examples/mines/math/mines-8-13.tsv +2 -0
  413. package/engine-examples/mines/math/mines-8-14.tsv +2 -0
  414. package/engine-examples/mines/math/mines-8-15.tsv +2 -0
  415. package/engine-examples/mines/math/mines-8-16.tsv +2 -0
  416. package/engine-examples/mines/math/mines-8-17.tsv +2 -0
  417. package/engine-examples/mines/math/mines-8-2.tsv +2 -0
  418. package/engine-examples/mines/math/mines-8-3.tsv +2 -0
  419. package/engine-examples/mines/math/mines-8-4.tsv +2 -0
  420. package/engine-examples/mines/math/mines-8-5.tsv +2 -0
  421. package/engine-examples/mines/math/mines-8-6.tsv +2 -0
  422. package/engine-examples/mines/math/mines-8-7.tsv +2 -0
  423. package/engine-examples/mines/math/mines-8-8.tsv +2 -0
  424. package/engine-examples/mines/math/mines-8-9.tsv +2 -0
  425. package/engine-examples/mines/math/mines-9-1.tsv +2 -0
  426. package/engine-examples/mines/math/mines-9-10.tsv +2 -0
  427. package/engine-examples/mines/math/mines-9-11.tsv +2 -0
  428. package/engine-examples/mines/math/mines-9-12.tsv +2 -0
  429. package/engine-examples/mines/math/mines-9-13.tsv +2 -0
  430. package/engine-examples/mines/math/mines-9-14.tsv +2 -0
  431. package/engine-examples/mines/math/mines-9-15.tsv +2 -0
  432. package/engine-examples/mines/math/mines-9-16.tsv +2 -0
  433. package/engine-examples/mines/math/mines-9-2.tsv +2 -0
  434. package/engine-examples/mines/math/mines-9-3.tsv +2 -0
  435. package/engine-examples/mines/math/mines-9-4.tsv +2 -0
  436. package/engine-examples/mines/math/mines-9-5.tsv +2 -0
  437. package/engine-examples/mines/math/mines-9-6.tsv +2 -0
  438. package/engine-examples/mines/math/mines-9-7.tsv +2 -0
  439. package/engine-examples/mines/math/mines-9-8.tsv +2 -0
  440. package/engine-examples/mines/math/mines-9-9.tsv +2 -0
  441. package/engine-examples/plinko/AGENTS.md +3 -0
  442. package/engine-examples/plinko/README.md +9 -0
  443. package/engine-examples/plinko/bundle/assets.json +1 -0
  444. package/engine-examples/plinko/bundle/game.css +5 -0
  445. package/engine-examples/plinko/bundle/game.js +92 -0
  446. package/engine-examples/plinko/bundle/hbtest.json +4 -0
  447. package/engine-examples/plinko/bundle/index.html +16 -0
  448. package/engine-examples/plinko/bundle/model.json +1 -0
  449. package/engine-examples/plinko/math/gen.mjs +40 -0
  450. package/engine-examples/plinko/math/manifest.json +1 -0
  451. package/engine-examples/plinko/math/plinko-12-high.tsv +13 -0
  452. package/engine-examples/plinko/math/plinko-12-low.tsv +13 -0
  453. package/engine-examples/plinko/math/plinko-12-medium.tsv +13 -0
  454. package/engine-examples/plinko/math/plinko-16-high.tsv +17 -0
  455. package/engine-examples/plinko/math/plinko-16-low.tsv +17 -0
  456. package/engine-examples/plinko/math/plinko-16-medium.tsv +17 -0
  457. package/engine-examples/plinko/math/plinko-8-high.tsv +9 -0
  458. package/engine-examples/plinko/math/plinko-8-low.tsv +9 -0
  459. package/engine-examples/plinko/math/plinko-8-medium.tsv +9 -0
  460. package/engine-examples/plinko/math-kit/pack.mjs +165 -0
  461. package/engine-examples/plinko/math-kit/package.json +8 -0
  462. package/engine-examples/plinko/math-kit/slot.mjs +94 -0
  463. package/engine-examples/plinko/math-kit/tumble.mjs +94 -0
  464. package/engine-examples/slot/AGENTS.md +3 -0
  465. package/engine-examples/slot/README.md +26 -0
  466. package/engine-examples/slot/bundle/assets.json +1 -0
  467. package/engine-examples/slot/bundle/game.css +19 -0
  468. package/engine-examples/slot/bundle/game.js +42 -0
  469. package/engine-examples/slot/bundle/hbtest.json +4 -0
  470. package/engine-examples/slot/bundle/index.html +23 -0
  471. package/engine-examples/slot/math/gen.mjs +79 -0
  472. package/engine-examples/slot/math/manifest.json +1 -0
  473. package/engine-examples/slot/math/slot.tsv +110592 -0
  474. package/engine-examples/tower/AGENTS.md +3 -0
  475. package/engine-examples/tower/README.md +21 -0
  476. package/engine-examples/tower/bundle/assets.json +1 -0
  477. package/engine-examples/tower/bundle/game.css +8 -0
  478. package/engine-examples/tower/bundle/game.js +37 -0
  479. package/engine-examples/tower/bundle/hbtest.json +5 -0
  480. package/engine-examples/tower/bundle/index.html +16 -0
  481. package/engine-examples/tower/math/floor.tsv +4 -0
  482. package/engine-examples/tower/math/manifest.json +61 -0
  483. package/engine-examples/tumble/AGENTS.md +3 -0
  484. package/engine-examples/tumble/README.md +18 -0
  485. package/engine-examples/tumble/bundle/assets.json +1 -0
  486. package/engine-examples/tumble/bundle/game.css +13 -0
  487. package/engine-examples/tumble/bundle/game.js +119 -0
  488. package/engine-examples/tumble/bundle/hbtest.json +4 -0
  489. package/engine-examples/tumble/bundle/i18n.json +122 -0
  490. package/engine-examples/tumble/bundle/index.html +20 -0
  491. package/engine-examples/tumble/bundle/model.json +1 -0
  492. package/engine-examples/tumble/math/gen.mjs +38 -0
  493. package/engine-examples/tumble/math-kit/pack.mjs +165 -0
  494. package/engine-examples/tumble/math-kit/package.json +8 -0
  495. package/engine-examples/tumble/math-kit/slot.mjs +94 -0
  496. package/engine-examples/tumble/math-kit/tumble.mjs +94 -0
  497. package/engine-examples/wheel/README.md +14 -0
  498. package/engine-examples/wheel/bundle/assets.json +1 -0
  499. package/engine-examples/wheel/bundle/game.css +7 -0
  500. package/engine-examples/wheel/bundle/game.js +51 -0
  501. package/engine-examples/wheel/bundle/hbtest.json +4 -0
  502. package/engine-examples/wheel/bundle/index.html +19 -0
  503. package/engine-examples/wheel/math/high.tsv +24 -0
  504. package/engine-examples/wheel/math/low.tsv +24 -0
  505. package/engine-examples/wheel/math/manifest.json +48 -0
  506. package/engine-examples/wheel/math/medium.tsv +24 -0
  507. package/engine-math/pack.mjs +165 -0
  508. package/engine-math/package.json +1 -0
  509. package/engine-math/slot.mjs +94 -0
  510. package/engine-math/tumble.mjs +94 -0
  511. package/engine-mcp/package.json +1 -0
  512. package/engine-mcp/server.mjs +151 -0
  513. package/engine-sdk/GUIDE.md +855 -0
  514. package/engine-sdk/assets.js +92 -0
  515. package/engine-sdk/autoplay.js +82 -0
  516. package/engine-sdk/bet-field.js +391 -0
  517. package/engine-sdk/kit/fiat-coins.js +51 -0
  518. package/engine-sdk/kit/numeric-input.js +116 -0
  519. package/engine-sdk/kit/wallet-format.js +423 -0
  520. package/engine-sdk/marks.js +22 -0
  521. package/engine-sdk/messages.js +289 -0
  522. package/engine-sdk/money.js +89 -0
  523. package/engine-sdk/package.json +1 -0
  524. package/engine-sdk/protocol.js +263 -0
  525. package/engine-sdk/sdk.d.ts +138 -0
  526. package/engine-sdk/sdk.js +330 -0
  527. package/engine-sdk/stake.js +68 -0
  528. package/engine-sdk/ui.d.ts +36 -0
  529. package/engine-sdk/ui.js +340 -0
  530. package/engine-shell/core/faults.js +127 -0
  531. package/engine-shell/core/rgs.js +193 -0
  532. package/engine-shell/core/router.js +917 -0
  533. package/engine-shell/host/boot.js +408 -0
  534. package/engine-shell/host/engine-v1.js +438 -0
  535. package/engine-shell/host/fair.js +285 -0
  536. package/engine-shell/host/fonts/SOURCE.json +11 -0
  537. package/engine-shell/host/fonts/figtree-400.woff2 +0 -0
  538. package/engine-shell/host/fonts/figtree-500.woff2 +0 -0
  539. package/engine-shell/host/fonts/figtree-600.woff2 +0 -0
  540. package/engine-shell/host/fonts/red-hat-display-700.woff2 +0 -0
  541. package/engine-shell/host/index.html +230 -0
  542. package/engine-shell/host/page.js +809 -0
  543. package/engine-shell/host/sandbox-panel.js +681 -0
  544. package/engine-shell/host/sandbox-scenarios.js +554 -0
  545. package/engine-shell/host/site-bridge.js +87 -0
  546. package/engine-shell/host/strings.js +916 -0
  547. package/engine-shell/package.json +1 -0
  548. package/engine-shell/verifiers/badcat/coin.tsv +2 -0
  549. package/engine-shell/verifiers/badcat/dice-2.tsv +11 -0
  550. package/engine-shell/verifiers/badcat/dice-5.tsv +26 -0
  551. package/engine-shell/verifiers/badcat/dice-9.tsv +46 -0
  552. package/engine-shell/verifiers/badcat/manifest.json +3344 -0
  553. package/engine-shell/verifiers/badcat/rps.tsv +3 -0
  554. package/engine-shell/verifiers/badcat/triple.tsv +66 -0
  555. package/engine-shell/verifiers/engine-verify.js +358 -0
  556. package/engine-shell/verifiers/package.json +5 -0
  557. package/engine-shell/verifiers/parity/manifest.json +27 -0
  558. package/engine-shell/verifiers/parity/wide.tsv +5 -0
  559. package/engine-shell/verifiers/parity-vectors.json +244 -0
  560. package/engine-shell/verifiers/vectors.json +100 -0
  561. package/package.json +10 -0
@@ -0,0 +1,51 @@
1
+ /* OUR OWN FIAT COINS (owner, 2026-10-08: "create our own library of logos for
2
+ each currency rather than choosing the flags, looks silly").
3
+
4
+ One struck coin per fiat the platform offers, plus GBP: a rim lit from above
5
+ round a recessed face, the sign drawn by hand on one grid (cap 14, one line
6
+ weight, round ends) and pressed into the face. One hue per currency, all at
7
+ the same lightness, so the set reads as one family; saffron and gold coins
8
+ carry a dark sign. Generated by hb_marks.py (housebets-currency-marks/drawn):
9
+ regenerate there, do not hand-edit the strings.
10
+
11
+ The coins travel inside the game as data: URIs: no request, no host that can
12
+ answer 522, nothing the storefront has to serve. A fiat that is not in the
13
+ set keeps the platform's round flag. */
14
+ export var FIAT_COINS = {
15
+ aed: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="AED"><defs><linearGradient id="r-aed" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#06BCBD"/><stop offset="1" stop-color="#016566"/></linearGradient><linearGradient id="f-aed" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#128283"/><stop offset="1" stop-color="#0A9D9E"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-aed)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-aed)"/><g stroke="#023536" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.914" transform="translate(8.700 11.956) scale(0.6919)"><path d="M1.2 0V14H4.4C8.4 14 10.8 11.4 10.8 7C10.8 2.6 8.4 0 4.4 0Z" transform="translate(-1.200 0)"/><path d="M1.2 0V14" transform="translate(12.300 0)"/><path d="M1.2 14V8.6C1.2 5.7 2.9 4 5.2 4C7.5 4 8.8 5.5 8.8 8.4V14" transform="translate(12.300 0)"/></g><g stroke="#F1FDFD" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.914" transform="translate(8.700 11.156) scale(0.6919)"><path d="M1.2 0V14H4.4C8.4 14 10.8 11.4 10.8 7C10.8 2.6 8.4 0 4.4 0Z" transform="translate(-1.200 0)"/><path d="M1.2 0V14" transform="translate(12.300 0)"/><path d="M1.2 14V8.6C1.2 5.7 2.9 4 5.2 4C7.5 4 8.8 5.5 8.8 8.4V14" transform="translate(12.300 0)"/></g></svg>',
16
+ ars: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="ARS"><defs><linearGradient id="r-ars" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#11B4E8"/><stop offset="1" stop-color="#0C617E"/></linearGradient><linearGradient id="f-ars" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#067DA2"/><stop offset="1" stop-color="#0596C3"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-ars)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-ars)"/><g stroke="#013345" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 10.780) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g><g stroke="#F5FBFE" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 9.980) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g></svg>',
17
+ cad: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="CAD"><defs><linearGradient id="r-cad" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F47A81"/><stop offset="1" stop-color="#93323C"/></linearGradient><linearGradient id="f-cad" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B9444F"/><stop offset="1" stop-color="#D45D66"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-cad)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-cad)"/><g stroke="#52151C" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.392" transform="translate(8.700 12.639) scale(0.5944)"><path d="M11.863 1.965 A7.000 7.000 0 1 0 11.863 12.035" transform="translate(0.000 0)"/><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(15.564 0)"/><path d="M4.6 -1.6V1.4" transform="translate(15.564 0)"/><path d="M4.6 12.6V15.6" transform="translate(15.564 0)"/></g><g stroke="#FDF9F9" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.392" transform="translate(8.700 11.839) scale(0.5944)"><path d="M11.863 1.965 A7.000 7.000 0 1 0 11.863 12.035" transform="translate(0.000 0)"/><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(15.564 0)"/><path d="M4.6 -1.6V1.4" transform="translate(15.564 0)"/><path d="M4.6 12.6V15.6" transform="translate(15.564 0)"/></g></svg>',
18
+ clp: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="CLP"><defs><linearGradient id="r-clp" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#A193FC"/><stop offset="1" stop-color="#56489B"/></linearGradient><linearGradient id="f-clp" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#6F5FC3"/><stop offset="1" stop-color="#8677DE"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-clp)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-clp)"/><g stroke="#2D2457" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 10.780) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g><g stroke="#FAFAFD" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 9.980) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g></svg>',
19
+ cny: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="CNY"><defs><linearGradient id="r-cny" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F47C6E"/><stop offset="1" stop-color="#93342C"/></linearGradient><linearGradient id="f-cny" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B9473D"/><stop offset="1" stop-color="#D56054"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-cny)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-cny)"/><g stroke="#521612" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.872 10.780) scale(0.8600)"><path d="M0.4 0L5.2 6.6L10 0" transform="translate(-0.400 0)"/><path d="M5.2 6.6V14" transform="translate(-0.400 0)"/><path d="M1.4 8.4H9" transform="translate(-0.400 0)"/><path d="M1.4 11.6H9" transform="translate(-0.400 0)"/></g><g stroke="#FDF9F9" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.872 9.980) scale(0.8600)"><path d="M0.4 0L5.2 6.6L10 0" transform="translate(-0.400 0)"/><path d="M5.2 6.6V14" transform="translate(-0.400 0)"/><path d="M1.4 8.4H9" transform="translate(-0.400 0)"/><path d="M1.4 11.6H9" transform="translate(-0.400 0)"/></g></svg>',
20
+ dkk: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="DKK"><defs><linearGradient id="r-dkk" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#E77AB5"/><stop offset="1" stop-color="#893365"/></linearGradient><linearGradient id="f-dkk" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#AD4681"/><stop offset="1" stop-color="#C85F99"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-dkk)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-dkk)"/><g stroke="#4C1636" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.344" transform="translate(8.991 10.780) scale(0.8600)"><path d="M1.2 0V14" transform="translate(-1.200 0)"/><path d="M8.2 4L1.6 10" transform="translate(-1.200 0)"/><path d="M4.4 7.9L8.8 14" transform="translate(-1.200 0)"/><path d="M1.2 4V14" transform="translate(10.300 0)"/><path d="M1.2 9C1.2 5.8 3 4 6 4.1" transform="translate(10.300 0)"/></g><g stroke="#FFF8FB" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.344" transform="translate(8.991 9.980) scale(0.8600)"><path d="M1.2 0V14" transform="translate(-1.200 0)"/><path d="M8.2 4L1.6 10" transform="translate(-1.200 0)"/><path d="M4.4 7.9L8.8 14" transform="translate(-1.200 0)"/><path d="M1.2 4V14" transform="translate(10.300 0)"/><path d="M1.2 9C1.2 5.8 3 4 6 4.1" transform="translate(10.300 0)"/></g></svg>',
21
+ eur: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="EUR"><defs><linearGradient id="r-eur" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#68A5FF"/><stop offset="1" stop-color="#24569F"/></linearGradient><linearGradient id="f-eur" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3370C7"/><stop offset="1" stop-color="#4B88E2"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-eur)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-eur)"/><g stroke="#0C2C5A" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.481 10.780) scale(0.8600)"><path d="M12.235 2.137 A7.000 7.000 0 1 0 12.235 11.863" transform="translate(0.600 0)"/><path d="M-0.6 5.1H8.4" transform="translate(0.600 0)"/><path d="M-0.6 8.9H8.4" transform="translate(0.600 0)"/></g><g stroke="#F8FAFD" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.481 9.980) scale(0.8600)"><path d="M12.235 2.137 A7.000 7.000 0 1 0 12.235 11.863" transform="translate(0.600 0)"/><path d="M-0.6 5.1H8.4" transform="translate(0.600 0)"/><path d="M-0.6 8.9H8.4" transform="translate(0.600 0)"/></g></svg>',
22
+ gbp: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="GBP"><defs><linearGradient id="r-gbp" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B48DF4"/><stop offset="1" stop-color="#644395"/></linearGradient><linearGradient id="f-gbp" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#8059BB"/><stop offset="1" stop-color="#9871D5"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-gbp)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-gbp)"/><g stroke="#352053" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.786 10.780) scale(0.8600)"><path d="M9.3 2.9C8.8 1 7.4 0 5.6 0C3.4 0 2.2 1.6 2.2 3.9V10.2C2.2 12 1.6 13.2 0.4 14H9.8" transform="translate(0.000 0)"/><path d="M0 7.2H7.2" transform="translate(0.000 0)"/></g><g stroke="#FBF9FF" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.786 9.980) scale(0.8600)"><path d="M9.3 2.9C8.8 1 7.4 0 5.6 0C3.4 0 2.2 1.6 2.2 3.9V10.2C2.2 12 1.6 13.2 0.4 14H9.8" transform="translate(0.000 0)"/><path d="M0 7.2H7.2" transform="translate(0.000 0)"/></g></svg>',
23
+ ghs: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="GHS"><defs><linearGradient id="r-ghs" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#EAD166"/><stop offset="1" stop-color="#AA9117"/></linearGradient><linearGradient id="f-ghs" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#C5AA2B"/><stop offset="1" stop-color="#DFC34B"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-ghs)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-ghs)"/><g stroke="#F7E8AB" stroke-opacity="0.55" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.899 10.780) scale(0.8600)"><path d="M11.863 1.965 A7.000 7.000 0 1 0 11.863 12.035" transform="translate(0.000 0)"/><path d="M6.6 -1.8V1.2" transform="translate(0.000 0)"/><path d="M6.6 12.8V15.8" transform="translate(0.000 0)"/></g><g stroke="#2E2603" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.899 9.980) scale(0.8600)"><path d="M11.863 1.965 A7.000 7.000 0 1 0 11.863 12.035" transform="translate(0.000 0)"/><path d="M6.6 -1.8V1.2" transform="translate(0.000 0)"/><path d="M6.6 12.8V15.8" transform="translate(0.000 0)"/></g></svg>',
24
+ idr: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="IDR"><defs><linearGradient id="r-idr" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F17993"/><stop offset="1" stop-color="#91314A"/></linearGradient><linearGradient id="f-idr" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B64461"/><stop offset="1" stop-color="#D25D78"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-idr)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-idr)"/><g stroke="#511525" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.762" transform="translate(8.700 11.252) scale(0.7300)"><path d="M1.2 14V0H5.2C7.8 0 9.3 1.6 9.3 3.9C9.3 6.2 7.8 7.8 5.2 7.8H1.2" transform="translate(-1.200 0)"/><path d="M5.6 7.8L9.6 14" transform="translate(-1.200 0)"/><path d="M1.2 4V18.4" transform="translate(11.100 0)"/><path d="M1.2 9C1.2 6 2.9 4 5.1 4C7.4 4 8.9 6.1 8.9 9C8.9 11.9 7.4 14 5.1 14C2.9 14 1.2 12 1.2 9" transform="translate(11.100 0)"/></g><g stroke="#FDF9F9" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.762" transform="translate(8.700 10.452) scale(0.7300)"><path d="M1.2 14V0H5.2C7.8 0 9.3 1.6 9.3 3.9C9.3 6.2 7.8 7.8 5.2 7.8H1.2" transform="translate(-1.200 0)"/><path d="M5.6 7.8L9.6 14" transform="translate(-1.200 0)"/><path d="M1.2 4V18.4" transform="translate(11.100 0)"/><path d="M1.2 9C1.2 6 2.9 4 5.1 4C7.4 4 8.9 6.1 8.9 9C8.9 11.9 7.4 14 5.1 14C2.9 14 1.2 12 1.2 9" transform="translate(11.100 0)"/></g></svg>',
25
+ ils: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="ILS"><defs><linearGradient id="r-ils" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#18B7D9"/><stop offset="1" stop-color="#026376"/></linearGradient><linearGradient id="f-ils" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#047F97"/><stop offset="1" stop-color="#1399B5"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-ils)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-ils)"/><g stroke="#003440" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.840 10.780) scale(0.8600)"><path d="M1 14V0.6H5.8C7.9 0.6 8.9 1.8 8.9 3.8V9.6" transform="translate(-1.000 0)"/><path d="M4.9 4.4V13.4H9.9C12 13.4 13 12.2 13 10.2V0.6" transform="translate(-1.000 0)"/></g><g stroke="#F4FCFE" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.840 9.980) scale(0.8600)"><path d="M1 14V0.6H5.8C7.9 0.6 8.9 1.8 8.9 3.8V9.6" transform="translate(-1.000 0)"/><path d="M4.9 4.4V13.4H9.9C12 13.4 13 12.2 13 10.2V0.6" transform="translate(-1.000 0)"/></g></svg>',
26
+ inr: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="INR"><defs><linearGradient id="r-inr" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#FEC587"/><stop offset="1" stop-color="#C68128"/></linearGradient><linearGradient id="f-inr" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#E49839"/><stop offset="1" stop-color="#FEB25A"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-inr)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-inr)"/><g stroke="#FEE3C6" stroke-opacity="0.55" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.958 10.780) scale(0.8600)"><path d="M0.6 0H10" transform="translate(-0.600 0)"/><path d="M0.6 4.1H10" transform="translate(-0.600 0)"/><path d="M0.6 0H3.9C6.8 0 8.2 1.9 8.2 4.1C8.2 6.5 6.4 8.3 3.6 8.3H1.4L8.6 14" transform="translate(-0.600 0)"/></g><g stroke="#382003" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.958 9.980) scale(0.8600)"><path d="M0.6 0H10" transform="translate(-0.600 0)"/><path d="M0.6 4.1H10" transform="translate(-0.600 0)"/><path d="M0.6 0H3.9C6.8 0 8.2 1.9 8.2 4.1C8.2 6.5 6.4 8.3 3.6 8.3H1.4L8.6 14" transform="translate(-0.600 0)"/></g></svg>',
27
+ jpy: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="JPY"><defs><linearGradient id="r-jpy" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#EC79A9"/><stop offset="1" stop-color="#8D325C"/></linearGradient><linearGradient id="f-jpy" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B14576"/><stop offset="1" stop-color="#CD5D8E"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-jpy)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-jpy)"/><g stroke="#4E1530" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.872 10.780) scale(0.8600)"><path d="M0.4 0L5.2 6.6L10 0" transform="translate(-0.400 0)"/><path d="M5.2 6.6V14" transform="translate(-0.400 0)"/><path d="M1.4 8.4H9" transform="translate(-0.400 0)"/><path d="M1.4 11.6H9" transform="translate(-0.400 0)"/></g><g stroke="#FFF8FA" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.872 9.980) scale(0.8600)"><path d="M0.4 0L5.2 6.6L10 0" transform="translate(-0.400 0)"/><path d="M5.2 6.6V14" transform="translate(-0.400 0)"/><path d="M1.4 8.4H9" transform="translate(-0.400 0)"/><path d="M1.4 11.6H9" transform="translate(-0.400 0)"/></g></svg>',
28
+ kes: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="KES"><defs><linearGradient id="r-kes" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#73BA59"/><stop offset="1" stop-color="#2E6813"/></linearGradient><linearGradient id="f-kes" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3F8521"/><stop offset="1" stop-color="#579E3C"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-kes)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-kes)"/><g stroke="#133702" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.803" transform="translate(8.700 11.766) scale(0.7192)"><path d="M8.067 1.345 A4.400 3.500 0 1 0 4.600 7.000 A4.400 3.500 0 1 1 1.133 12.655" transform="translate(-0.200 0)"/><path d="M1.2 0V14" transform="translate(11.500 0)"/><path d="M1.2 14V8.6C1.2 5.7 2.9 4 5.2 4C7.5 4 8.8 5.5 8.8 8.4V14" transform="translate(11.500 0)"/></g><g stroke="#F6FCF4" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.803" transform="translate(8.700 10.966) scale(0.7192)"><path d="M8.067 1.345 A4.400 3.500 0 1 0 4.600 7.000 A4.400 3.500 0 1 1 1.133 12.655" transform="translate(-0.200 0)"/><path d="M1.2 0V14" transform="translate(11.500 0)"/><path d="M1.2 14V8.6C1.2 5.7 2.9 4 5.2 4C7.5 4 8.8 5.5 8.8 8.4V14" transform="translate(11.500 0)"/></g></svg>',
29
+ krw: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="KRW"><defs><linearGradient id="r-krw" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#869DFD"/><stop offset="1" stop-color="#4050A0"/></linearGradient><linearGradient id="f-krw" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#5468C8"/><stop offset="1" stop-color="#6A80E3"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-krw)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-krw)"/><g stroke="#1F285A" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.152 10.780) scale(0.8600)"><path d="M0 0L2.9 14L6 3.6L9.1 14L12 0" transform="translate(0.800 0)"/><path d="M-0.8 6.2H12.8" transform="translate(0.800 0)"/></g><g stroke="#F9FAFD" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.152 9.980) scale(0.8600)"><path d="M0 0L2.9 14L6 3.6L9.1 14L12 0" transform="translate(0.800 0)"/><path d="M-0.8 6.2H12.8" transform="translate(0.800 0)"/></g></svg>',
30
+ mxn: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="MXN"><defs><linearGradient id="r-mxn" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#13BFA5"/><stop offset="1" stop-color="#0A6758"/></linearGradient><linearGradient id="f-mxn" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#108472"/><stop offset="1" stop-color="#0D9F89"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-mxn)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-mxn)"/><g stroke="#02362E" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 10.780) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g><g stroke="#F2FDFA" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 9.980) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g></svg>',
31
+ ngn: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="NGN"><defs><linearGradient id="r-ngn" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#5EBD69"/><stop offset="1" stop-color="#146A25"/></linearGradient><linearGradient id="f-ngn" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#238735"/><stop offset="1" stop-color="#41A04D"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-ngn)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-ngn)"/><g stroke="#02390D" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.668 10.780) scale(0.8600)"><path d="M1.4 14V0L9.8 14V0" transform="translate(0.600 0)"/><path d="M-0.6 5.3H11.8" transform="translate(0.600 0)"/><path d="M-0.6 8.7H11.8" transform="translate(0.600 0)"/></g><g stroke="#F5FCF5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.668 9.980) scale(0.8600)"><path d="M1.4 14V0L9.8 14V0" transform="translate(0.600 0)"/><path d="M-0.6 5.3H11.8" transform="translate(0.600 0)"/><path d="M-0.6 8.7H11.8" transform="translate(0.600 0)"/></g></svg>',
32
+ pen: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="PEN"><defs><linearGradient id="r-pen" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F18154"/><stop offset="1" stop-color="#91380E"/></linearGradient><linearGradient id="f-pen" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B64C1B"/><stop offset="1" stop-color="#D26538"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-pen)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-pen)"/><g stroke="#511900" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.693" transform="translate(8.700 11.559) scale(0.7487)"><path d="M8.067 1.345 A4.400 3.500 0 1 0 4.600 7.000 A4.400 3.500 0 1 1 1.133 12.655" transform="translate(-0.200 0)"/><path d="M7.4 -0.6L0.6 14.6" transform="translate(12.100 0)"/></g><g stroke="#FDF9F8" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.693" transform="translate(8.700 10.759) scale(0.7487)"><path d="M8.067 1.345 A4.400 3.500 0 1 0 4.600 7.000 A4.400 3.500 0 1 1 1.133 12.655" transform="translate(-0.200 0)"/><path d="M7.4 -0.6L0.6 14.6" transform="translate(12.100 0)"/></g></svg>',
33
+ php: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="PHP"><defs><linearGradient id="r-php" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#26B0F7"/><stop offset="1" stop-color="#005F8A"/></linearGradient><linearGradient id="f-php" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#007AB0"/><stop offset="1" stop-color="#0993D2"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-php)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-php)"/><g stroke="#01324B" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.496 10.780) scale(0.8600)"><path d="M2.2 14V0H6C8.8 0 10.4 1.7 10.4 4.1C10.4 6.5 8.8 8.2 6 8.2H2.2" transform="translate(0.400 0)"/><path d="M-0.4 4.1H12.4" transform="translate(0.400 0)"/></g><g stroke="#F5FBFF" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(10.496 9.980) scale(0.8600)"><path d="M2.2 14V0H6C8.8 0 10.4 1.7 10.4 4.1C10.4 6.5 8.8 8.2 6 8.2H2.2" transform="translate(0.400 0)"/><path d="M-0.4 4.1H12.4" transform="translate(0.400 0)"/></g></svg>',
34
+ pln: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="PLN"><defs><linearGradient id="r-pln" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#EE79A1"/><stop offset="1" stop-color="#8E3255"/></linearGradient><linearGradient id="f-pln" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B4446E"/><stop offset="1" stop-color="#CF5D85"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-pln)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-pln)"/><g stroke="#4F152C" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.472" transform="translate(8.700 11.091) scale(0.8156)"><path d="M0.8 4H8.4L0.8 14H8.8" transform="translate(-0.800 0)"/><path d="M3.4 0V14" transform="translate(11.500 0)"/><path d="M0.4 9L6.4 5" transform="translate(11.500 0)"/></g><g stroke="#FDF9FA" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.472" transform="translate(8.700 10.291) scale(0.8156)"><path d="M0.8 4H8.4L0.8 14H8.8" transform="translate(-0.800 0)"/><path d="M3.4 0V14" transform="translate(11.500 0)"/><path d="M0.4 9L6.4 5" transform="translate(11.500 0)"/></g></svg>',
35
+ rub: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="RUB"><defs><linearGradient id="r-rub" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#DD7ECA"/><stop offset="1" stop-color="#823774"/></linearGradient><linearGradient id="f-rub" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#A44A94"/><stop offset="1" stop-color="#BF62AD"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-rub)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-rub)"/><g stroke="#48183F" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.356 10.780) scale(0.8600)"><path d="M3 14V0H6.8C9.6 0 11.2 1.7 11.2 4.1C11.2 6.5 9.6 8.2 6.8 8.2H0.4" transform="translate(-0.400 0)"/><path d="M0.4 11.2H8" transform="translate(-0.400 0)"/></g><g stroke="#FEF8FC" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.356 9.980) scale(0.8600)"><path d="M3 14V0H6.8C9.6 0 11.2 1.7 11.2 4.1C11.2 6.5 9.6 8.2 6.8 8.2H0.4" transform="translate(-0.400 0)"/><path d="M0.4 11.2H8" transform="translate(-0.400 0)"/></g></svg>',
36
+ sar: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="SAR"><defs><linearGradient id="r-sar" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#2FC183"/><stop offset="1" stop-color="#066944"/></linearGradient><linearGradient id="f-sar" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#0A8758"/><stop offset="1" stop-color="#03A26B"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-sar)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-sar)"/><g stroke="#023822" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.914" transform="translate(8.700 11.956) scale(0.6919)"><path d="M8.067 1.345 A4.400 3.500 0 1 0 4.600 7.000 A4.400 3.500 0 1 1 1.133 12.655" transform="translate(-0.200 0)"/><path d="M1.2 14V0H5.2C7.8 0 9.3 1.6 9.3 3.9C9.3 6.2 7.8 7.8 5.2 7.8H1.2" transform="translate(11.500 0)"/><path d="M5.6 7.8L9.6 14" transform="translate(11.500 0)"/></g><g stroke="#F4FDF7" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.914" transform="translate(8.700 11.156) scale(0.6919)"><path d="M8.067 1.345 A4.400 3.500 0 1 0 4.600 7.000 A4.400 3.500 0 1 1 1.133 12.655" transform="translate(-0.200 0)"/><path d="M1.2 14V0H5.2C7.8 0 9.3 1.6 9.3 3.9C9.3 6.2 7.8 7.8 5.2 7.8H1.2" transform="translate(11.500 0)"/><path d="M5.6 7.8L9.6 14" transform="translate(11.500 0)"/></g></svg>',
37
+ try: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="TRY"><defs><linearGradient id="r-try" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F37988"/><stop offset="1" stop-color="#923141"/></linearGradient><linearGradient id="f-try" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#B84456"/><stop offset="1" stop-color="#D45D6D"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-try)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-try)"/><g stroke="#521520" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.786 10.780) scale(0.8600)"><path d="M3.6 0V14C7.8 14 10.4 11.2 10.4 7" transform="translate(-0.600 0)"/><path d="M0.6 6.6L7.4 3.9" transform="translate(-0.600 0)"/><path d="M0.6 10.2L7.4 7.5" transform="translate(-0.600 0)"/></g><g stroke="#FDF9F9" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.786 9.980) scale(0.8600)"><path d="M3.6 0V14C7.8 14 10.4 11.2 10.4 7" transform="translate(-0.600 0)"/><path d="M0.6 6.6L7.4 3.9" transform="translate(-0.600 0)"/><path d="M0.6 10.2L7.4 7.5" transform="translate(-0.600 0)"/></g></svg>',
38
+ twd: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="TWD"><defs><linearGradient id="r-twd" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#CB84E1"/><stop offset="1" stop-color="#753C86"/></linearGradient><linearGradient id="f-twd" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#9550A9"/><stop offset="1" stop-color="#AE69C3"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-twd)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-twd)"/><g stroke="#401C4A" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.079" transform="translate(8.700 12.217) scale(0.6547)"><path d="M1.2 14V0L9.6 14V0" transform="translate(-1.200 0)"/><path d="M0 0H10" transform="translate(12.300 0)"/><path d="M5 0V14" transform="translate(12.300 0)"/></g><g stroke="#FCF8FE" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.079" transform="translate(8.700 11.417) scale(0.6547)"><path d="M1.2 14V0L9.6 14V0" transform="translate(-1.200 0)"/><path d="M0 0H10" transform="translate(12.300 0)"/><path d="M5 0V14" transform="translate(12.300 0)"/></g></svg>',
39
+ usd: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="USD"><defs><linearGradient id="r-usd" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#53BE70"/><stop offset="1" stop-color="#026A2E"/></linearGradient><linearGradient id="f-usd" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#05893E"/><stop offset="1" stop-color="#32A155"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-usd)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-usd)"/><g stroke="#013916" stroke-opacity="0.5" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 10.780) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g><g stroke="#F5FDF6" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(12.215 9.980) scale(0.8600)"><path d="M8.067 2.638 A4.400 2.700 0 1 0 4.600 7.000 A4.400 2.700 0 1 1 1.133 11.362" transform="translate(-0.199 0)"/><path d="M4.6 -1.6V1.4" transform="translate(-0.199 0)"/><path d="M4.6 12.6V15.6" transform="translate(-0.199 0)"/></g></svg>',
40
+ vnd: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="VND"><defs><linearGradient id="r-vnd" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F4CC64"/><stop offset="1" stop-color="#B38C15"/></linearGradient><linearGradient id="f-vnd" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#CFA529"/><stop offset="1" stop-color="#EABE4A"/></linearGradient></defs><circle cx="16" cy="16" r="16" fill="url(#r-vnd)"/><circle cx="16" cy="16" r="13.60" fill="url(#f-vnd)"/><g stroke="#FEE6AA" stroke-opacity="0.55" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.528 10.780) scale(0.8600)"><path d="M8.4 0V11.6" transform="translate(-0.400 0)"/><path d="M8.2 7.75A3.9 3.9 0 1 0 0.4 7.75A3.9 3.9 0 1 0 8.2 7.75" transform="translate(-0.400 0)"/><path d="M5.8 2.3H10.8" transform="translate(-0.400 0)"/><path d="M0.4 14.8H8.6" transform="translate(-0.400 0)"/></g><g stroke="#312503" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.651" transform="translate(11.528 9.980) scale(0.8600)"><path d="M8.4 0V11.6" transform="translate(-0.400 0)"/><path d="M8.2 7.75A3.9 3.9 0 1 0 0.4 7.75A3.9 3.9 0 1 0 8.2 7.75" transform="translate(-0.400 0)"/><path d="M5.8 2.3H10.8" transform="translate(-0.400 0)"/><path d="M0.4 14.8H8.6" transform="translate(-0.400 0)"/></g></svg>',
41
+ };
42
+
43
+ var URIS = {};
44
+
45
+ /** The data: URI of our coin for a fiat code, `''` when the set has none. */
46
+ export function fiatCoinSrc(code) {
47
+ var lower = String(code == null ? '' : code).trim().toLowerCase();
48
+ if (!Object.prototype.hasOwnProperty.call(FIAT_COINS, lower)) return '';
49
+ if (!URIS[lower]) URIS[lower] = 'data:image/svg+xml,' + encodeURIComponent(FIAT_COINS[lower]);
50
+ return URIS[lower];
51
+ }
@@ -0,0 +1,116 @@
1
+ /* THE INPUT RULE FOR NUMERIC FIELDS — ONE COPY FOR EVERY GAME.
2
+ ---------------------------------------------------------------------------
3
+ IT USED TO LIVE TWICE, once in dice and once in blackjack, and on 25.09.2026
4
+ the copies drifted for half an hour: a defect was fixed in one file while the
5
+ other kept the old reading. The stand's contract compares them, but only on
6
+ the samples it happens to carry — a rule kept in two places is a rule that
7
+ will differ in a case nobody thought to write down.
8
+
9
+ Here it lives once. The games import it; there is nothing left to drift.
10
+
11
+ WHY A MODULE OF ITS OWN. The rule is one and the fields are many, and they live
12
+ in two different worlds: the game zone is drawn by hand, the panel is Svelte.
13
+ While the rule sat as a copy inside the game zone the fields drifted apart: the
14
+ multiplier, "roll over" and the chance filtered their input, while the stake,
15
+ stop-profit, stop-loss and the number of bets took anything at all — you could
16
+ write "abc" into the stake or drop text into it with the mouse.
17
+
18
+ THE RULE IS TAKEN FROM THE REFERENCE, not invented. Measured on shuffle.com on
19
+ 2026-09-05: typing `a1b.2.3,4e-5` leaves `1.2345` in the field — digits and the
20
+ FIRST dot, everything else silently dropped: letters, a second dot, a comma, a
21
+ minus, `e`. The tail of digits is not trimmed (`.00123456789012` stays as it is)
22
+ and a leading dot is allowed. Silently — that is, with no notice and no refusal:
23
+ the player keeps typing.
24
+
25
+ WHY THE FILTER IS ON `input` AND NOT ON KEY PRESSES. The keyboard is only one way
26
+ into a field. A mouse paste, dragged text, autofill and an on-screen keyboard
27
+ press no keys at all, and a rule standing on `keydown` lets them through. The
28
+ `input` event arrives for every one of those — so protection against pasted text
29
+ comes out of the same code rather than a separate one.
30
+
31
+ WHERE TO CALL IT. As the first line of the field's handler, not as a separate
32
+ listener: the panel's fields have their value drawn by Svelte, and an outside
33
+ listener would filter the text AFTER the handler had already passed the raw
34
+ string onward — and Svelte would put it straight back into the field. */
35
+
36
+ /** Digits and one dot.
37
+ *
38
+ * A COMMA IS READ TWO WAYS, AND THE FIELD'S OWN FORMAT DECIDES WHICH.
39
+ *
40
+ * It used to be read one way — as a dot, because on many layouts that is the
41
+ * decimal key. But these fields PRINT their amounts grouped: "max" fills the
42
+ * stake with `1,000.00`. Edit that text and the grouping comma was re-read as a
43
+ * decimal point: `1,000.00` became `1.000.00`, only the first dot survived, and
44
+ * the stake silently collapsed to 1.00. Reported by the owner 25.09.2026 —
45
+ * press max, add a zero, and the amount is gone.
46
+ *
47
+ * So the commas are weighed first. If the digits around them form the grouping
48
+ * this field itself writes — `1,000`, `112,333`, `1,234,567` — they are
49
+ * separators and drop out. Anything else keeps the old reading, where the comma
50
+ * is the decimal key: `0,5` is still half.
51
+ *
52
+ * THE ONE AMBIGUOUS CASE IS NAMED HONESTLY: `0,500` typed on a comma layout
53
+ * meaning "half" matches the grouping pattern and comes out as five hundred.
54
+ * The reference behaves the same way (shuffle.com, measured 2026-09-05, drops
55
+ * the comma outright), the field shows what it understood, and the limit
56
+ * guards stand behind it — while the reported defect was certain and silent.
57
+ *
58
+ * A DOT IN THE STRING SETTLES THE COMMA OUTRIGHT (measured on dev 25.09.2026,
59
+ * on the bundle that carried the first fix). Weighing only well-formed groups
60
+ * left a hole the size of the whole feature: editing the integer part BREAKS
61
+ * the groups while you type. `5,000.45` with one digit typed before the dot is
62
+ * `5,0004.45` — no longer even triples, so the old reading took over and the
63
+ * stake fell from 5 001.55 USDT to 5.0015 with the bet button still live. The
64
+ * player saw five thousand and would have staked five.
65
+ *
66
+ * The rule that closes it is not a wider pattern but a fact about numbers: a
67
+ * number has ONE decimal separator. If a dot is already present, the comma
68
+ * cannot be a second one, whatever shape the digits are in — so it is a group
69
+ * separator and drops out. Well-formedness is only asked where there is no dot
70
+ * at all, which is exactly where `0,5` still has to mean half. */
71
+ var GROUPED = /^\d{1,3}(,\d{3})+$/;
72
+
73
+ export function sanitizeDecimal(s) {
74
+ var raw = String(s == null ? '' : s);
75
+ /* The integer part is what carries grouping — the fraction never does. */
76
+ var dot = raw.indexOf('.');
77
+ var head = dot === -1 ? raw : raw.slice(0, dot);
78
+ /* A dot decides it: the comma cannot be a second decimal separator. Without
79
+ a dot the digits have to be weighed, and only there `0,5` means half. */
80
+ var grouped = dot !== -1 || GROUPED.test(head.replace(/[^0-9,]/g, ''));
81
+ var v = (grouped ? raw.replace(/,/g, '') : raw.replace(/,/g, '.')).replace(/[^0-9.]/g, '');
82
+ var i = v.indexOf('.');
83
+ if (i !== -1) v = v.slice(0, i + 1) + v.slice(i + 1).replace(/\./g, '');
84
+ return v;
85
+ }
86
+
87
+ /** Digits only — for fields where a fraction is meaningless (the number of bets). */
88
+ export function sanitizeInteger(s) {
89
+ return String(s == null ? '' : s).replace(/[^0-9]/g, '');
90
+ }
91
+
92
+ function clean(value, mode) {
93
+ return mode === 'integer' ? sanitizeInteger(value) : sanitizeDecimal(value);
94
+ }
95
+
96
+ /** Filter the field in place and return the cleaned string.
97
+ *
98
+ * The caret is preserved: we count how many surviving characters stood BEFORE it
99
+ * and put it after them. Without this a paste or an edit in the middle of a number
100
+ * would throw the caret to the end — most noticeable on a long crypto amount.
101
+ */
102
+ export function filterNumericInput(input, mode) {
103
+ if (!input) return '';
104
+ var before = input.value;
105
+ var after = clean(before, mode);
106
+ if (after === before) return after;
107
+
108
+ var caret = null;
109
+ try { caret = input.selectionStart; } catch (e) { /* the field gives no caret — no matter */ }
110
+ var at = after.length;
111
+ if (typeof caret === 'number') at = clean(before.slice(0, caret), mode).length;
112
+
113
+ input.value = after;
114
+ try { input.setSelectionRange(at, at); } catch (e) { /* a field without a selection */ }
115
+ return after;
116
+ }