framefields 2.0.9 → 2.0.11

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 (241) hide show
  1. package/README.md +17 -6
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BxA0sL9z.d.mts → audio-BHanw8Jb.d.mts} +3 -3
  5. package/dist/{audio-BxA0sL9z.d.mts.map → audio-BHanw8Jb.d.mts.map} +1 -1
  6. package/dist/{audio-Dev4NGPa.mjs → audio-COOMNwL5.mjs} +4 -4
  7. package/dist/{audio-Dev4NGPa.mjs.map → audio-COOMNwL5.mjs.map} +1 -1
  8. package/dist/{dist-CoSg-CWr.mjs → dist-BAVZdFEJ.mjs} +3 -3
  9. package/dist/{dist-CoSg-CWr.mjs.map → dist-BAVZdFEJ.mjs.map} +1 -1
  10. package/dist/{dist-DzUJmIHt.mjs → dist-BYqNNwsl.mjs} +2 -2
  11. package/dist/{dist-DzUJmIHt.mjs.map → dist-BYqNNwsl.mjs.map} +1 -1
  12. package/dist/{dist-B9Afsv83.mjs → dist-CbG3QxDw.mjs} +651 -2
  13. package/dist/dist-CbG3QxDw.mjs.map +1 -0
  14. package/dist/{dist-DgfykO99.mjs → dist-Cxi68OuY.mjs} +5347 -3286
  15. package/dist/dist-Cxi68OuY.mjs.map +1 -0
  16. package/dist/effects/index.d.mts +4 -4
  17. package/dist/effects/index.mjs +25 -25
  18. package/dist/{effects-hxRwxjyC.mjs → effects-DzbjFhyA.mjs} +3 -3
  19. package/dist/{effects-hxRwxjyC.mjs.map → effects-DzbjFhyA.mjs.map} +1 -1
  20. package/dist/fonts/index.d.mts +2 -2
  21. package/dist/fonts/index.mjs +1 -1
  22. package/dist/{fonts-BznIea-I.mjs → fonts-C0W6TgJk.mjs} +52 -5
  23. package/dist/fonts-C0W6TgJk.mjs.map +1 -0
  24. package/dist/{index-J9CIK_nu.d.mts → index-9B8CJowc.d.mts} +2 -2
  25. package/dist/{index-J9CIK_nu.d.mts.map → index-9B8CJowc.d.mts.map} +1 -1
  26. package/dist/{index-CvDVpaKn.d.mts → index-CDoTrMs1.d.mts} +4 -4
  27. package/dist/{index-CvDVpaKn.d.mts.map → index-CDoTrMs1.d.mts.map} +1 -1
  28. package/dist/{index-BXNNJVs8.d.mts → index-CYGpSVsf.d.mts} +2 -2
  29. package/dist/{index-BXNNJVs8.d.mts.map → index-CYGpSVsf.d.mts.map} +1 -1
  30. package/dist/{index-D1zaOwEU.d.mts → index-DDEPvMww.d.mts} +520 -71
  31. package/dist/index-DDEPvMww.d.mts.map +1 -0
  32. package/dist/{index-oodg5k9K.d.mts → index-DGJp1d30.d.mts} +3 -3
  33. package/dist/{index-oodg5k9K.d.mts.map → index-DGJp1d30.d.mts.map} +1 -1
  34. package/dist/{index-fo4E7A6C.d.mts → index-DRZu3ezy.d.mts} +3 -3
  35. package/dist/{index-fo4E7A6C.d.mts.map → index-DRZu3ezy.d.mts.map} +1 -1
  36. package/dist/{index-CQcdKyxF.d.mts → index-DnWsbbuZ.d.mts} +54 -2
  37. package/dist/index-DnWsbbuZ.d.mts.map +1 -0
  38. package/dist/index.d.mts +398 -18
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +633 -57
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/preview/index.d.mts +2 -2
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-DZTbEON9.mjs → preview-BV2C4Fk6.mjs} +2 -2
  45. package/dist/{preview-DZTbEON9.mjs.map → preview-BV2C4Fk6.mjs.map} +1 -1
  46. package/dist/preview-engine/{chunk-VVLM6LZ3.mjs → chunk-6256GQFP.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-VWLR2AZR.mjs → chunk-AEK5BO3J.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-YG35X5R5.mjs → chunk-AWTH2WZO.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-7DIAFPQP.mjs → chunk-ECPP3UG6.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-5JD65JSJ.mjs → chunk-FGHOHCFG.mjs} +1 -1
  51. package/dist/preview-engine/chunk-IMV5SBQV.mjs +1 -0
  52. package/dist/preview-engine/chunk-IQKIHFNZ.mjs +1 -0
  53. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +474 -0
  54. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +3 -0
  55. package/dist/preview-engine/chunk-MJM3NFEC.mjs +315 -0
  56. package/dist/preview-engine/chunk-NFAGEP43.mjs +1448 -0
  57. package/dist/preview-engine/{chunk-5PPSCISJ.mjs → chunk-Q66QQI6N.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-JAOXXYXG.mjs → chunk-QYRDQMNB.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-XCYFPA34.mjs → chunk-RJUAM52F.mjs} +1 -1
  60. package/dist/preview-engine/chunk-VRGREB3V.mjs +1 -0
  61. package/dist/preview-engine/{chunk-AW7HNZKR.mjs → chunk-Y6HWYPKX.mjs} +1 -1
  62. package/dist/preview-engine/effects.mjs +1 -1
  63. package/dist/preview-engine/fonts.mjs +1 -1
  64. package/dist/preview-engine/framefields.mjs +27 -27
  65. package/dist/preview-engine/player.mjs +1 -1
  66. package/dist/preview-engine/renderers-5BV6JGTU.mjs +248 -0
  67. package/dist/preview-engine/renderers-7X2W6QWX.mjs +1 -0
  68. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +1 -0
  69. package/dist/preview-engine/renderers-G5KQISVL.mjs +1 -0
  70. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +1 -0
  71. package/dist/preview-engine/renderers-TVTQ2R74.mjs +1 -0
  72. package/dist/preview-engine/renderers-ZIMBODX6.mjs +1 -0
  73. package/dist/{program-C797QMRL.mjs → program-BmNKgzja.mjs} +281 -23
  74. package/dist/program-BmNKgzja.mjs.map +1 -0
  75. package/dist/renderer/index.d.mts +2 -2
  76. package/dist/renderer/index.mjs +2 -2
  77. package/dist/{renderer-D-4Yh-RK.mjs → renderer-1VuQTY1Z.mjs} +2 -2
  78. package/dist/{renderer-D-4Yh-RK.mjs.map → renderer-1VuQTY1Z.mjs.map} +1 -1
  79. package/dist/renderer-6oMSare3.mjs +3 -0
  80. package/dist/renderer-B1ComPb2.mjs +3 -0
  81. package/dist/{renderer-DgSO5OO0.mjs → renderer-B1YMwl2B.mjs} +1 -1
  82. package/dist/{renderer-9QCHY8Kh.mjs → renderer-B2ieylQ3.mjs} +2 -2
  83. package/dist/{renderer-9QCHY8Kh.mjs.map → renderer-B2ieylQ3.mjs.map} +1 -1
  84. package/dist/{renderer-CuqhAB4i.mjs → renderer-B8-kzZdP.mjs} +2 -2
  85. package/dist/{renderer-CuqhAB4i.mjs.map → renderer-B8-kzZdP.mjs.map} +1 -1
  86. package/dist/{renderer-Dn8v2o9L.mjs → renderer-B8UaFNqb.mjs} +3 -3
  87. package/dist/{renderer-Dn8v2o9L.mjs.map → renderer-B8UaFNqb.mjs.map} +1 -1
  88. package/dist/{renderer-DPpgBTlK.mjs → renderer-BDbTWSpP.mjs} +3 -3
  89. package/dist/{renderer-DPpgBTlK.mjs.map → renderer-BDbTWSpP.mjs.map} +1 -1
  90. package/dist/{renderer-CrVAvP92.mjs → renderer-BIIWCg_J.mjs} +3 -3
  91. package/dist/{renderer-CrVAvP92.mjs.map → renderer-BIIWCg_J.mjs.map} +1 -1
  92. package/dist/{renderer-5jfDUKd4.mjs → renderer-BJ1aTkZf.mjs} +3 -3
  93. package/dist/{renderer-5jfDUKd4.mjs.map → renderer-BJ1aTkZf.mjs.map} +1 -1
  94. package/dist/renderer-BQ5Bz5D0.mjs +3 -0
  95. package/dist/{renderer-D6Gi_h4K.mjs → renderer-BSaYG8aw.mjs} +1 -1
  96. package/dist/{renderer-2NQWaZd7.d.mts → renderer-BTdOMMEx.d.mts} +2 -2
  97. package/dist/{renderer-2NQWaZd7.d.mts.map → renderer-BTdOMMEx.d.mts.map} +1 -1
  98. package/dist/renderer-BZcn_iBl.mjs +3 -0
  99. package/dist/{renderer-DnF3aXPX.mjs → renderer-Bc04fivZ.mjs} +3 -3
  100. package/dist/{renderer-DnF3aXPX.mjs.map → renderer-Bc04fivZ.mjs.map} +1 -1
  101. package/dist/{renderer-B1UeU7lX.mjs → renderer-BfAWZziM.mjs} +193 -12
  102. package/dist/renderer-BfAWZziM.mjs.map +1 -0
  103. package/dist/{renderer-CKJb_Lky.mjs → renderer-Bfgd4N0O.mjs} +3 -3
  104. package/dist/{renderer-CKJb_Lky.mjs.map → renderer-Bfgd4N0O.mjs.map} +1 -1
  105. package/dist/{renderer-b6sZN90h.mjs → renderer-BhZZEyFX.mjs} +2 -2
  106. package/dist/{renderer-b6sZN90h.mjs.map → renderer-BhZZEyFX.mjs.map} +1 -1
  107. package/dist/{renderer-C-PfbkPu.mjs → renderer-Bhdf90Zq.mjs} +2 -2
  108. package/dist/{renderer-C-PfbkPu.mjs.map → renderer-Bhdf90Zq.mjs.map} +1 -1
  109. package/dist/renderer-Bp6sDMa6.mjs +3 -0
  110. package/dist/renderer-Bt7_sb_Y.mjs +3 -0
  111. package/dist/{renderer-CB8hMQgm.mjs → renderer-Bv21DbWy.mjs} +1 -1
  112. package/dist/{renderer-gT0ADXMW.mjs → renderer-Bv6q84TU.mjs} +2 -2
  113. package/dist/{renderer-gT0ADXMW.mjs.map → renderer-Bv6q84TU.mjs.map} +1 -1
  114. package/dist/renderer-C606ZPUn.mjs +3 -0
  115. package/dist/renderer-C9jyKn1i.mjs +3 -0
  116. package/dist/renderer-CERfcxgv.mjs +3 -0
  117. package/dist/renderer-CG5PzNkv.mjs +3 -0
  118. package/dist/{renderer-CpUbDJAV.mjs → renderer-CI7sG_cv.mjs} +2 -2
  119. package/dist/{renderer-CpUbDJAV.mjs.map → renderer-CI7sG_cv.mjs.map} +1 -1
  120. package/dist/renderer-CPoIMVdk.mjs +3 -0
  121. package/dist/{renderer-B4ecTNR7.mjs → renderer-CWTpc4ff.mjs} +2 -2
  122. package/dist/{renderer-B4ecTNR7.mjs.map → renderer-CWTpc4ff.mjs.map} +1 -1
  123. package/dist/{renderer-D3uNI10l.mjs → renderer-CXn5HAnK.mjs} +3 -3
  124. package/dist/{renderer-D3uNI10l.mjs.map → renderer-CXn5HAnK.mjs.map} +1 -1
  125. package/dist/{renderer-DCK73tcD.mjs → renderer-C_TPMHiH.mjs} +2 -2
  126. package/dist/{renderer-DCK73tcD.mjs.map → renderer-C_TPMHiH.mjs.map} +1 -1
  127. package/dist/renderer-Ca7L1EOp.mjs +3 -0
  128. package/dist/{renderer-6PqlYQjC.mjs → renderer-CaaOKMSd.mjs} +2 -2
  129. package/dist/{renderer-6PqlYQjC.mjs.map → renderer-CaaOKMSd.mjs.map} +1 -1
  130. package/dist/{renderer-DX38J6mK.mjs → renderer-CdciwwMI.mjs} +3 -3
  131. package/dist/{renderer-DX38J6mK.mjs.map → renderer-CdciwwMI.mjs.map} +1 -1
  132. package/dist/{renderer-DRpE3ZW4.mjs → renderer-CfC_aiew.mjs} +3 -3
  133. package/dist/{renderer-DRpE3ZW4.mjs.map → renderer-CfC_aiew.mjs.map} +1 -1
  134. package/dist/{renderer-BE4Ns0nw.mjs → renderer-ChdLYS-G.mjs} +3 -3
  135. package/dist/{renderer-BE4Ns0nw.mjs.map → renderer-ChdLYS-G.mjs.map} +1 -1
  136. package/dist/renderer-Cl6GkeHx.mjs +3 -0
  137. package/dist/renderer-ClcjrFyo.mjs +3 -0
  138. package/dist/{renderer-B8gTyU3w.mjs → renderer-CnXW28b9.mjs} +2 -2
  139. package/dist/{renderer-B8gTyU3w.mjs.map → renderer-CnXW28b9.mjs.map} +1 -1
  140. package/dist/{renderer-C2gnWTQZ.mjs → renderer-Ctk2zzfy.mjs} +3 -3
  141. package/dist/{renderer-C2gnWTQZ.mjs.map → renderer-Ctk2zzfy.mjs.map} +1 -1
  142. package/dist/{renderer-EmG34sT2.mjs → renderer-CtyD_Xju.mjs} +2 -2
  143. package/dist/{renderer-EmG34sT2.mjs.map → renderer-CtyD_Xju.mjs.map} +1 -1
  144. package/dist/renderer-CySUP_wk.mjs +3 -0
  145. package/dist/renderer-D2l_Odyg.mjs +3 -0
  146. package/dist/{renderer-CckJJHbM.mjs → renderer-D2nCGcjv.mjs} +2 -2
  147. package/dist/{renderer-CckJJHbM.mjs.map → renderer-D2nCGcjv.mjs.map} +1 -1
  148. package/dist/renderer-DCPCYySt.mjs +3 -0
  149. package/dist/{renderer-BgqjWI7K.mjs → renderer-DIgsilTw.mjs} +3 -3
  150. package/dist/{renderer-BgqjWI7K.mjs.map → renderer-DIgsilTw.mjs.map} +1 -1
  151. package/dist/renderer-DIkpJEOZ.mjs +3 -0
  152. package/dist/{renderer-CxQ5v4fJ.mjs → renderer-DML9qpmS.mjs} +2 -2
  153. package/dist/{renderer-CxQ5v4fJ.mjs.map → renderer-DML9qpmS.mjs.map} +1 -1
  154. package/dist/renderer-DNSXPkf_.mjs +3 -0
  155. package/dist/renderer-DP-CvZ_Z.mjs +3 -0
  156. package/dist/renderer-DeXb8R6h.mjs +3 -0
  157. package/dist/renderer-DezO-ZaP.mjs +4 -0
  158. package/dist/renderer-DhXe04fC.mjs +3 -0
  159. package/dist/{renderer-BwmZUkvd.mjs → renderer-DirxsOjq.mjs} +2 -2
  160. package/dist/{renderer-BwmZUkvd.mjs.map → renderer-DirxsOjq.mjs.map} +1 -1
  161. package/dist/{renderer-BcPpcKDI.mjs → renderer-Djlb4TLO.mjs} +3 -3
  162. package/dist/{renderer-BcPpcKDI.mjs.map → renderer-Djlb4TLO.mjs.map} +1 -1
  163. package/dist/renderer-DnH3SI7w.mjs +3 -0
  164. package/dist/{renderer-xp_J0ln7.mjs → renderer-DpGc-N3G.mjs} +3 -3
  165. package/dist/{renderer-xp_J0ln7.mjs.map → renderer-DpGc-N3G.mjs.map} +1 -1
  166. package/dist/renderer-Dpw4oi33.mjs +3 -0
  167. package/dist/{renderer-DAFyJ4dv.mjs → renderer-DxTs4Iyi.mjs} +2 -2
  168. package/dist/{renderer-DAFyJ4dv.mjs.map → renderer-DxTs4Iyi.mjs.map} +1 -1
  169. package/dist/{renderer-BXaK02qA.mjs → renderer-Dy0utCl7.mjs} +3 -3
  170. package/dist/{renderer-BXaK02qA.mjs.map → renderer-Dy0utCl7.mjs.map} +1 -1
  171. package/dist/renderer-Md-ytU0v.mjs +3 -0
  172. package/dist/{renderer-BTYncYDf.mjs → renderer-RKsXlF_0.mjs} +43 -43
  173. package/dist/{renderer-BTYncYDf.mjs.map → renderer-RKsXlF_0.mjs.map} +1 -1
  174. package/dist/renderer-U-bhWO9Q.mjs +3 -0
  175. package/dist/{renderer-CV8diddR.mjs → renderer-WSGuj_V6.mjs} +2 -2
  176. package/dist/{renderer-CV8diddR.mjs.map → renderer-WSGuj_V6.mjs.map} +1 -1
  177. package/dist/{renderer-_bygZSKk.mjs → renderer-bsWnRNpJ.mjs} +2 -2
  178. package/dist/{renderer-_bygZSKk.mjs.map → renderer-bsWnRNpJ.mjs.map} +1 -1
  179. package/dist/{renderer-lq4n1hSS.mjs → renderer-cgxO2xN6.mjs} +3 -3
  180. package/dist/{renderer-lq4n1hSS.mjs.map → renderer-cgxO2xN6.mjs.map} +1 -1
  181. package/dist/{renderer-zvtpCnqy.mjs → renderer-dncoIVdd.mjs} +1 -1
  182. package/dist/{renderer-BpJgfBQ8.mjs → renderer-kwmlLQOO.mjs} +3 -3
  183. package/dist/{renderer-BpJgfBQ8.mjs.map → renderer-kwmlLQOO.mjs.map} +1 -1
  184. package/dist/{renderer--vY6O19V.mjs → renderer-vqkKWqa5.mjs} +2 -2
  185. package/dist/{renderer--vY6O19V.mjs.map → renderer-vqkKWqa5.mjs.map} +1 -1
  186. package/dist/renderer-zA5okHds.mjs +3 -0
  187. package/dist/{renderers-CP8CFWDs-Ciap7y_j.mjs → renderers-CP8CFWDs-DwQTx8S7.mjs} +3 -3
  188. package/dist/{renderers-CP8CFWDs-Ciap7y_j.mjs.map → renderers-CP8CFWDs-DwQTx8S7.mjs.map} +1 -1
  189. package/dist/signals/index.d.mts +5 -5
  190. package/dist/signals/index.mjs +6 -6
  191. package/dist/{signals-CsxqD2AA.mjs → signals-Bv1OweKd.mjs} +3 -3
  192. package/dist/{signals-CsxqD2AA.mjs.map → signals-Bv1OweKd.mjs.map} +1 -1
  193. package/package.json +55 -55
  194. package/dist/dist-B9Afsv83.mjs.map +0 -1
  195. package/dist/dist-DgfykO99.mjs.map +0 -1
  196. package/dist/fonts-BznIea-I.mjs.map +0 -1
  197. package/dist/index-CQcdKyxF.d.mts.map +0 -1
  198. package/dist/index-D1zaOwEU.d.mts.map +0 -1
  199. package/dist/preview-engine/chunk-BUWK5RJ4.mjs +0 -997
  200. package/dist/preview-engine/chunk-CNSHAFEA.mjs +0 -1
  201. package/dist/preview-engine/chunk-OF75EHTX.mjs +0 -418
  202. package/dist/preview-engine/chunk-UC7CSW2A.mjs +0 -1
  203. package/dist/preview-engine/chunk-WQ7BFSKF.mjs +0 -3
  204. package/dist/preview-engine/chunk-ZJFAGIOM.mjs +0 -315
  205. package/dist/preview-engine/renderers-32PIFHPS.mjs +0 -1
  206. package/dist/preview-engine/renderers-3Y3EMRDJ.mjs +0 -1
  207. package/dist/preview-engine/renderers-CHJWUJVI.mjs +0 -1
  208. package/dist/preview-engine/renderers-CI2GXWLP.mjs +0 -1
  209. package/dist/preview-engine/renderers-EE2GFG7J.mjs +0 -1
  210. package/dist/preview-engine/renderers-LTNTQLWE.mjs +0 -248
  211. package/dist/preview-engine/renderers-UGZUPONY.mjs +0 -1
  212. package/dist/program-C797QMRL.mjs.map +0 -1
  213. package/dist/renderer-3uTfN95I.mjs +0 -3
  214. package/dist/renderer-B1UeU7lX.mjs.map +0 -1
  215. package/dist/renderer-B5GslTP-.mjs +0 -3
  216. package/dist/renderer-BUIWeIKQ.mjs +0 -3
  217. package/dist/renderer-B_LfC88A.mjs +0 -3
  218. package/dist/renderer-B_zmicsE.mjs +0 -3
  219. package/dist/renderer-BtNxtXkR.mjs +0 -3
  220. package/dist/renderer-C-sZSHtf.mjs +0 -3
  221. package/dist/renderer-C1zifktw.mjs +0 -3
  222. package/dist/renderer-CCt2XTSM.mjs +0 -3
  223. package/dist/renderer-CL3evUmF.mjs +0 -3
  224. package/dist/renderer-CMXcaArD.mjs +0 -3
  225. package/dist/renderer-CW9D5zCP.mjs +0 -3
  226. package/dist/renderer-CjY77sB_.mjs +0 -3
  227. package/dist/renderer-D1R7vBUl.mjs +0 -3
  228. package/dist/renderer-D5yawxtJ.mjs +0 -3
  229. package/dist/renderer-DC8jr1Ay.mjs +0 -3
  230. package/dist/renderer-DCv-Abvn.mjs +0 -4
  231. package/dist/renderer-DPLFhzaV.mjs +0 -3
  232. package/dist/renderer-DVsF2FDr.mjs +0 -3
  233. package/dist/renderer-DetDm3ep.mjs +0 -3
  234. package/dist/renderer-DhMhJh_G.mjs +0 -3
  235. package/dist/renderer-DhQld4Qt.mjs +0 -3
  236. package/dist/renderer-Dn3rc3ah.mjs +0 -3
  237. package/dist/renderer-Dw9LxE2f.mjs +0 -3
  238. package/dist/renderer-HvrQZw5E.mjs +0 -3
  239. package/dist/renderer-QdJE56ts.mjs +0 -3
  240. package/dist/renderer-euGyUN2O.mjs +0 -3
  241. package/dist/renderer-p3SmBFP9.mjs +0 -3
@@ -0,0 +1,1448 @@
1
+ import{a as Jn}from"./chunk-JPXQPP6J.mjs";import{a as Xe}from"./chunk-IMV5SBQV.mjs";import{c as Rn,e as Ln}from"./chunk-IQKIHFNZ.mjs";import{h as Un,l as vn}from"./chunk-24P6DAB3.mjs";import{d as kn}from"./chunk-6YJP57MZ.mjs";import{d as _A,e as Pn,f as GA,g as Hn,h as Tn}from"./chunk-MJM3NFEC.mjs";import{r as pA}from"./chunk-MTJHQATU.mjs";import{d as Ut}from"./chunk-HYBAPT6I.mjs";import{o as TA}from"./chunk-YAQFFQPG.mjs";import{a as Nn,c as Sn,e as T}from"./chunk-BVF64D6H.mjs";var Zn=Nn((Ra,Xn)=>{T();var je=()=>new Proxy(function(){},{get:(A,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":je(),apply:()=>je(),construct:()=>je()});Xn.exports=je()});var wr=Nn((Al,br)=>{T();var Et=()=>new Proxy(function(){},{get:(A,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":Et(),apply:()=>Et(),construct:()=>Et()});br.exports=Et()});T();var Kn=new Float32Array(2048);for(let A=0;A<2048;A++)Kn[A]=.5*(1-Math.cos(2*Math.PI*A/2047));var Yn=new Uint16Array(2048);for(let A=0;A<2048;A++){let e=0,t=A;for(let n=0;n<11;n++)e=e<<1|t&1,t>>=1;Yn[A]=e}var Vn=new Float32Array(2048/2),Wn=new Float32Array(2048/2);for(let A=0;A<2048/2;A++){let e=-2*Math.PI*A/2048;Vn[A]=Math.cos(e),Wn[A]=Math.sin(e)}function ui(A,e){for(let t=0;t<2048;t++){let n=Yn[t]??0;if(n>t){let r=A[t]??0;A[t]=A[n]??0,A[n]=r;let i=e[t]??0;e[t]=e[n]??0,e[n]=i}}for(let t=2;t<=2048;t<<=1){let n=t>>1,r=2048/t;for(let i=0;i<2048;i+=t)for(let o=0;o<n;o++){let a=o*r,s=Vn[a]??1,g=Wn[a]??0,l=A[i+o]??0,I=e[i+o]??0,u=A[i+o+n]??0,E=e[i+o+n]??0,Q=u*s-E*g,C=u*g+E*s;A[i+o]=l+Q,e[i+o]=I+C,A[i+o+n]=l-Q,e[i+o+n]=I-C}}}var Ze=class A{tempReal=new Float32Array(2048);tempImag=new Float32Array(2048);previousBins=new Float32Array(1024);extractAtTime(e,t,n){let r=e.length,i=r>0?e[0]?.length??0:0,a=Math.round(n*t)-1024;for(let G=0;G<2048;G++){let x=a+G,b=0;x>=0&&x<i&&(r===1?b=e[0]?.[x]??0:r>=2&&(b=((e[0]?.[x]??0)+(e[1]?.[x]??0))*.5)),this.tempReal[G]=b*(Kn[G]??1),this.tempImag[G]=0}ui(this.tempReal,this.tempImag);let s=new Float32Array(1024),g=2/2048;for(let G=0;G<1024;G++){let x=this.tempReal[G]??0,b=this.tempImag[G]??0;s[G]=Math.sqrt(x*x+b*b)*g*2}let l=t/2048,I=Math.max(1,Math.round(20/l)),u=Math.max(I+1,Math.round(150/l)),E=0;for(let G=I;G<=u&&G<1024;G++)E+=(s[G]??0)*(s[G]??0);let Q=Math.min(1,Math.sqrt(E/(u-I+1))*4),C=0;for(let G=0;G<1024;G++){let x=(s[G]??0)-(this.previousBins[G]??0);x>0&&(C+=x),this.previousBins[G]=s[G]??0}let m=Math.min(1,C*.15),h=Math.round(300/l),d=Math.min(1023,Math.round(3400/l)),y=0;for(let G=h;G<=d;G++)y+=(s[G]??0)*(s[G]??0);let w=Math.min(1,Math.sqrt(y/(d-h+1))*3.5);return{fftBins:s,bassEnergy:Q,drumTransient:m,vocalEnergy:w,timeMs:n*1e3}}static packBufferData(e){let t=new Float32Array(1028);return t.set(e.fftBins,0),t[1024]=e.bassEnergy,t[1025]=e.drumTransient,t[1026]=e.vocalEnergy,t[1027]=e.timeMs,t}static createGpuBuffer(e,t){let n=t?A.packBufferData(t):new Float32Array(1028),r=e.createBuffer({label:"AudioLatentBuffer",size:4112,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return new Float32Array(r.getMappedRange()).set(n),r.unmap(),r}static updateGpuBuffer(e,t,n){let r=A.packBufferData(n);e.queue.writeBuffer(t,0,r)}},On=class{constructor(e,t,n,r){this.channels=e;this.sampleRate=t;this.fps=n;this.totalFrames=r;let i=new Ze,o=t||48e3,a=n||30,s=e[0]?.length??0,g=Math.max(10,Math.ceil(s/o*a)+10),l=typeof r=="number"&&Number.isFinite(r)&&r>0?Math.round(r):g;this.frames=new Array(l);for(let I=0;I<l;I++){let u=I/a;this.frames[I]=i.extractAtTime(e,o,u)}}channels;sampleRate;fps;totalFrames;frames=[];gpuBuffers=new WeakMap;getFrameData(e){let t=Math.max(0,Math.min(this.totalFrames-1,Math.round(e)));return this.frames[t]??{fftBins:new Float32Array(1024),bassEnergy:0,drumTransient:0,vocalEnergy:0,timeMs:t/this.fps*1e3}}getGpuBuffer(e,t){let n=this.gpuBuffers.get(e);n||(n=new Map,this.gpuBuffers.set(e,n));let r=Math.max(0,Math.min(this.totalFrames-1,Math.round(t))),i=n.get(r);if(!i){let o=this.getFrameData(r);i=Ze.createGpuBuffer(e,o),n.set(r,i)}return i}};T();T();T();var L={create(A=0,e=0,t=0){return[A,e,t]},copy(A){return[A[0],A[1],A[2]]},set(A,e,t,n){return A[0]=e,A[1]=t,A[2]=n,A},add(A,e){return[A[0]+e[0],A[1]+e[1],A[2]+e[2]]},subtract(A,e){return[A[0]-e[0],A[1]-e[1],A[2]-e[2]]},multiplyScalar(A,e){return[A[0]*e,A[1]*e,A[2]*e]},dot(A,e){return A[0]*e[0]+A[1]*e[1]+A[2]*e[2]},cross(A,e){return[A[1]*e[2]-A[2]*e[1],A[2]*e[0]-A[0]*e[2],A[0]*e[1]-A[1]*e[0]]},lengthSq(A){return A[0]*A[0]+A[1]*A[1]+A[2]*A[2]},length(A){return Math.hypot(A[0],A[1],A[2])},distance(A,e){return Math.hypot(A[0]-e[0],A[1]-e[1],A[2]-e[2])},normalize(A){let e=Math.hypot(A[0],A[1],A[2]);if(e===0)return[0,0,0];let t=1/e;return[A[0]*t,A[1]*t,A[2]*t]},lerp(A,e,t){return[A[0]+(e[0]-A[0])*t,A[1]+(e[1]-A[1])*t,A[2]+(e[2]-A[2])*t]},equals(A,e,t=1e-6){return Math.abs(A[0]-e[0])<=t&&Math.abs(A[1]-e[1])<=t&&Math.abs(A[2]-e[2])<=t}};var uA={identity(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},copy(A){return[...A]},multiply(A,e){let t=new Array(16);for(let n=0;n<4;n++)for(let r=0;r<4;r++)t[r*4+n]=A[0+n]*e[r*4+0]+A[4+n]*e[r*4+1]+A[8+n]*e[r*4+2]+A[12+n]*e[r*4+3];return t},translate(A,e,t=0){return[1,0,0,0,0,1,0,0,0,0,1,0,A,e,t,1]},scale(A,e,t=1){return[A,0,0,0,0,e,0,0,0,0,t,0,0,0,0,1]},rotateX(A){let e=Math.cos(A),t=Math.sin(A);return[1,0,0,0,0,e,t,0,0,-t,e,0,0,0,0,1]},rotateY(A){let e=Math.cos(A),t=Math.sin(A);return[e,0,-t,0,0,1,0,0,t,0,e,0,0,0,0,1]},rotateZ(A){let e=Math.cos(A),t=Math.sin(A);return[e,t,0,0,-t,e,0,0,0,0,1,0,0,0,0,1]},rotateAxis(A,e){let t=L.normalize(A),n=t[0],r=t[1],i=t[2],o=Math.cos(e),a=Math.sin(e),s=1-o;return[s*n*n+o,s*n*r+a*i,s*n*i-a*r,0,s*n*r-a*i,s*r*r+o,s*r*i+a*n,0,s*n*i+a*r,s*r*i-a*n,s*i*i+o,0,0,0,0,1]},lookAt(A,e,t=[0,-1,0]){let n=L.subtract(e,A);L.lengthSq(n)===0?n=[0,0,1]:n=L.normalize(n);let r=L.cross(n,t);L.lengthSq(r)===0?r=[1,0,0]:r=L.normalize(r);let i=L.cross(r,n);return[r[0],i[0],n[0],0,r[1],i[1],n[1],0,r[2],i[2],n[2],0,-L.dot(r,A),-L.dot(i,A),-L.dot(n,A),1]},perspective(A,e,t,n){let r=1/Math.tan(A/2),i=1/(n-t);return[r/e,0,0,0,0,r,0,0,0,0,n*i,1,0,0,-t*n*i,0]},orthographic(A,e,t,n,r,i){let o=1/(e-A),a=1/(n-t),s=1/(i-r);return[2*o,0,0,0,0,2*a,0,0,0,0,s,0,-(e+A)*o,-(n+t)*a,-r*s,1]},invert(A){let e=new Array(16);e[0]=A[5]*A[10]*A[15]-A[5]*A[11]*A[14]-A[9]*A[6]*A[15]+A[9]*A[7]*A[14]+A[13]*A[6]*A[11]-A[13]*A[7]*A[10],e[4]=-A[4]*A[10]*A[15]+A[4]*A[11]*A[14]+A[8]*A[6]*A[15]-A[8]*A[7]*A[14]-A[12]*A[6]*A[11]+A[12]*A[7]*A[10],e[8]=A[4]*A[9]*A[15]-A[4]*A[11]*A[13]-A[8]*A[5]*A[15]+A[8]*A[7]*A[13]+A[12]*A[5]*A[11]-A[12]*A[7]*A[9],e[12]=-A[4]*A[9]*A[14]+A[4]*A[10]*A[13]+A[8]*A[5]*A[14]-A[8]*A[6]*A[13]-A[12]*A[5]*A[10]+A[12]*A[6]*A[9],e[1]=-A[1]*A[10]*A[15]+A[1]*A[11]*A[14]+A[9]*A[2]*A[15]-A[9]*A[3]*A[14]-A[13]*A[2]*A[11]+A[13]*A[3]*A[10],e[5]=A[0]*A[10]*A[15]-A[0]*A[11]*A[14]-A[8]*A[2]*A[15]+A[8]*A[3]*A[14]+A[12]*A[2]*A[11]-A[12]*A[3]*A[10],e[9]=-A[0]*A[9]*A[15]+A[0]*A[11]*A[13]+A[8]*A[1]*A[15]-A[8]*A[3]*A[13]-A[12]*A[1]*A[11]+A[12]*A[3]*A[9],e[13]=A[0]*A[9]*A[14]-A[0]*A[10]*A[13]-A[8]*A[1]*A[14]+A[8]*A[2]*A[13]+A[12]*A[1]*A[10]-A[12]*A[2]*A[9],e[2]=A[1]*A[6]*A[15]-A[1]*A[7]*A[14]-A[5]*A[2]*A[15]+A[5]*A[3]*A[14]+A[13]*A[2]*A[7]-A[13]*A[3]*A[6],e[6]=-A[0]*A[6]*A[15]+A[0]*A[7]*A[14]+A[4]*A[2]*A[15]-A[4]*A[3]*A[14]-A[12]*A[2]*A[7]+A[12]*A[3]*A[6],e[10]=A[0]*A[5]*A[15]-A[0]*A[7]*A[13]-A[4]*A[1]*A[15]+A[4]*A[3]*A[13]+A[12]*A[1]*A[7]-A[12]*A[3]*A[5],e[14]=-A[0]*A[5]*A[14]+A[0]*A[6]*A[13]+A[4]*A[1]*A[14]-A[4]*A[2]*A[13]-A[12]*A[1]*A[6]+A[12]*A[2]*A[5],e[3]=-A[1]*A[6]*A[11]+A[1]*A[7]*A[10]+A[5]*A[2]*A[11]-A[5]*A[3]*A[10]-A[9]*A[2]*A[7]+A[9]*A[3]*A[6],e[7]=A[0]*A[6]*A[11]-A[0]*A[7]*A[10]-A[4]*A[2]*A[11]+A[4]*A[3]*A[10]+A[8]*A[2]*A[7]-A[8]*A[3]*A[6],e[11]=-A[0]*A[5]*A[11]+A[0]*A[7]*A[9]+A[4]*A[1]*A[11]-A[4]*A[3]*A[9]-A[8]*A[1]*A[7]+A[8]*A[3]*A[5],e[15]=A[0]*A[5]*A[10]-A[0]*A[6]*A[9]-A[4]*A[1]*A[10]+A[4]*A[2]*A[9]+A[8]*A[1]*A[6]-A[8]*A[2]*A[5];let t=A[0]*e[0]+A[1]*e[4]+A[2]*e[8]+A[3]*e[12];if(Math.abs(t)<1e-12)return null;t=1/t;for(let n=0;n<16;n++)e[n]*=t;return e},transpose(A){return[A[0],A[4],A[8],A[12],A[1],A[5],A[9],A[13],A[2],A[6],A[10],A[14],A[3],A[7],A[11],A[15]]},projectPoint(A,e){let t=e[0],n=e[1],r=e[2],i=A[0]*t+A[4]*n+A[8]*r+A[12],o=A[1]*t+A[5]*n+A[9]*r+A[13],a=A[2]*t+A[6]*n+A[10]*r+A[14],s=A[3]*t+A[7]*n+A[11]*r+A[15],g=Math.abs(s)>1e-6?1/s:1;return[i*g,o*g,a*g]},projectRectangle(A,e,t){return[uA.projectPoint(A,[0,0,0]),uA.projectPoint(A,[e,0,0]),uA.projectPoint(A,[e,t,0]),uA.projectPoint(A,[0,t,0])]},toFloat32Array(A){return new Float32Array(A)}};function me(A,e,t=3){let n=0,r=1,i=1,o=0;for(let a=0;a<t;a++){let s=Math.sin(A*r*2*Math.PI+e+a*1.7),g=Math.cos(A*r*1.414*Math.PI+e*2.1+a*.9);n+=(s*.6+g*.4)*i,o+=i,r*=2,i*=.5}return o>0?n/o:0}var oe={createDefaultCamera(A,e,t=50){let n=t*Math.PI/180,r=e/2/Math.tan(n/2);return{eye:[A/2,e/2,-r],target:[A/2,e/2,0],up:[0,-1,0],fov:t,aspect:Math.max(1e-4,A/e),near:1,far:5e4,zoom:1,focusDistance:r,fStop:2.8,maxBlurRadius:32}},computeViewMatrix(A){return uA.lookAt(A.eye,A.target,A.up)},computeProjectionMatrix(A){let e=A.fov*Math.PI/180,t=uA.perspective(e,A.aspect,A.near,A.far);return A.zoom!==1&&A.zoom>0&&(t[0]*=A.zoom,t[5]*=A.zoom),t},computeViewProjectionMatrix(A){let e=oe.computeViewMatrix(A),t=oe.computeProjectionMatrix(A);return uA.multiply(t,e)},dolly(A,e,t){let n=L.normalize(L.subtract(e,A)),r=L.multiplyScalar(n,t);return{eye:L.add(A,r),target:e}},truckPedestal(A,e,t,n,r){let i=L.normalize(L.subtract(e,A)),o=L.normalize(L.cross(i,t)),a=L.cross(o,i),s=L.multiplyScalar(o,n),g=L.multiplyScalar(a,r),l=L.add(s,g);return{eye:L.add(A,l),target:L.add(e,l)}},orbit(A,e,t,n){let r=t*Math.PI/180,i=n*Math.PI/180,o=Math.cos(i),a=Math.sin(i),s=Math.cos(r),g=Math.sin(r),l=A[0]+e*o*g,I=A[1]-e*a,u=A[2]-e*o*s;return[l,I,u]},applyOrientation(A,e,t,n){if(e===0&&t===0&&n===0)return A;let r=L.normalize(L.subtract(A.target,A.eye)),i=L.normalize(L.cross(r,A.up)),o=L.cross(i,r),a=L.distance(A.eye,A.target),s=r,g=o;if(t!==0){let u=t*Math.PI/180,E=Math.cos(u),Q=Math.sin(u);s=L.normalize(L.subtract(L.multiplyScalar(s,E),L.multiplyScalar(i,Q)))}let l=L.normalize(L.cross(s,g));if(e!==0){let u=e*Math.PI/180,E=Math.cos(u),Q=Math.sin(u);s=L.normalize(L.add(L.multiplyScalar(s,E),L.multiplyScalar(g,Q))),g=L.normalize(L.cross(l,s))}if(n!==0){let u=n*Math.PI/180,E=Math.cos(u),Q=Math.sin(u);g=L.normalize(L.add(L.multiplyScalar(g,E),L.multiplyScalar(l,Q)))}let I=L.add(A.eye,L.multiplyScalar(s,a));return{...A,target:I,up:g}},applyCameraShake(A,e,t){let{translationAmplitude:n,rotationAmplitude:r,frequency:i=2.5,octaves:o=3,seed:a=42}=t;if(n<=0&&r<=0)return A;let s=e*i,g=me(s,a,o)*n,l=me(s,a+101.5,o)*n,I=me(s,a+203.7,o)*(n*.5),u=me(s,a+307.1,o)*r,E=me(s,a+409.3,o)*r,Q=L.normalize(L.subtract(A.target,A.eye)),C=L.normalize(L.cross(Q,A.up)),m=L.cross(C,Q),h=L.add(L.multiplyScalar(C,g),L.add(L.multiplyScalar(m,l),L.multiplyScalar(Q,I))),d=L.add(A.eye,h),y=L.add(A.target,L.add(L.multiplyScalar(C,E*10),L.multiplyScalar(m,u*10)));return{...A,eye:d,target:y}},computeCircleOfConfusion(A,e,t,n,r=32){if(e<=0||n<=0||A<=0)return 0;let i=Math.abs(A-e),o=t/n,a=i/A*o*.5;return Math.min(r,Math.max(0,a))},computeCameraFrustumPlanes(A){let e=t=>{let n=Math.hypot(t[0],t[1],t[2]);return n===0?t:[t[0]/n,t[1]/n,t[2]/n,t[3]/n]};return{left:e([A[3]+A[0],A[7]+A[4],A[11]+A[8],A[15]+A[12]]),right:e([A[3]-A[0],A[7]-A[4],A[11]-A[8],A[15]-A[12]]),bottom:e([A[3]+A[1],A[7]+A[5],A[11]+A[9],A[15]+A[13]]),top:e([A[3]-A[1],A[7]-A[5],A[11]-A[9],A[15]-A[13]]),near:e([A[2],A[6],A[10],A[14]]),far:e([A[3]-A[2],A[7]-A[6],A[11]-A[10],A[15]-A[14]])}},isBoxInFrustum(A,e,t){let n=[t.left,t.right,t.bottom,t.top,t.near,t.far];for(let r of n){let i=r[0]>0?e[0]:A[0],o=r[1]>0?e[1]:A[1],a=r[2]>0?e[2]:A[2];if(r[0]*i+r[1]*o+r[2]*a+r[3]<0)return!1}return!0}};T();T();var Bi={studio:{top:"#9da3ad",horizon:"#5d626b",bottom:"#202226",softboxes:3.5},soft:{top:"#f1efea",horizon:"#cfcac1",bottom:"#77726a",softboxes:1.2},sunset:{top:"#4d63a3",horizon:"#ff9a5c",bottom:"#3b2a28",softboxes:1},night:{top:"#121a3a",horizon:"#1f2950",bottom:"#05060b",softboxes:.5},neutral:{top:"#9a9a9a",horizon:"#808080",bottom:"#5c5c5c",softboxes:0}},Ei={none:0,aces:1,agx:2,neutral:3};function qe(A){let e=Rn(A)??[0,0,0,1],t=n=>n<=.04045?n/12.92:((n+.055)/1.055)**2.4;return[t(e[0]),t(e[1]),t(e[2])]}function zn(A){let e=Bi[A.preset??"studio"],t=A.intensity??1,n=r=>[r[0]*t,r[1]*t,r[2]*t];return{top:n(qe(A.top??e.top)),horizon:n(qe(A.horizon??e.horizon)),bottom:n(qe(A.bottom??e.bottom)),softboxes:(A.softboxes??e.softboxes)*t,rotationRad:(A.rotation??0)*Math.PI/180,exposureMultiplier:2**(A.exposure??0),toneMapping:Ei[A.toneMapping??"neutral"],fog:A.fog?{color:qe(A.fog.color),start:A.fog.start,end:A.fog.end,opacity:Math.max(0,Math.min(1,A.fog.opacity??1))}:void 0}}var _e=8,Rt=736;function vt(A){if(!A)return[1,1,1];if(Array.isArray(A)){let r=A[0]??1,i=A[1]??1,o=A[2]??1;return[r>1?r/255:r,i>1?i/255:i,o>1?o/255:o]}if(typeof A=="object"&&A!==null){let r=A.r??1,i=A.g??1,o=A.b??1;return[r>1?r/255:r,i>1?i/255:i,o>1?o/255:o]}if(typeof A!="string")return[1,1,1];let e=A.trim().toLowerCase();if(e.startsWith("#")){let r=e.slice(1);if(r.length===3){let i=Number.parseInt(r[0]+r[0],16)/255,o=Number.parseInt(r[1]+r[1],16)/255,a=Number.parseInt(r[2]+r[2],16)/255;return[i,o,a]}if(r.length>=6){let i=Number.parseInt(r.slice(0,2),16)/255,o=Number.parseInt(r.slice(2,4),16)/255,a=Number.parseInt(r.slice(4,6),16)/255;return[i,o,a]}}let t=e.match(/rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/);if(t){let r=Number.parseFloat(t[1])/255,i=Number.parseFloat(t[2])/255,o=Number.parseFloat(t[3])/255;return[Math.max(0,Math.min(1,r)),Math.max(0,Math.min(1,i)),Math.max(0,Math.min(1,o))]}let n=e.match(/hsla?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?/);if(n){let r=Number.parseFloat(n[1])/360,i=Number.parseFloat(n[2])/100,o=Number.parseFloat(n[3])/100;return Qi(r,i,o)}return[1,1,1]}function Qi(A,e,t){if(e===0)return[t,t,t];let n=(o,a,s)=>{let g=s;return g<0&&(g+=1),g>1&&(g-=1),g<1/6?o+(a-o)*6*g:g<1/2?a:g<2/3?o+(a-o)*(2/3-g)*6:o},r=t<.5?t*(1+e):t+e-t*e,i=2*t-r;return[n(i,r,A+1/3),n(i,r,A),n(i,r,A-1/3)]}var VA={computeNormalMatrix(A){let e=uA.invert(A);return e?[e[0],e[4],e[8],0,e[1],e[5],e[9],0,e[2],e[6],e[10],0,0,0,0,1]:uA.identity()},processLight(A){let e=vt(A.color),t=A.intensity??1,n=A.position?A.position[0]:A.x??0,r=A.position?A.position[1]:A.y??0,i=A.position?A.position[2]:A.z??0,o=A.lightType??A.type??"directional",a=1;o==="ambient"?a=0:o==="directional"?a=1:o==="point"?a=2:o==="spot"&&(a=3);let s=[0,0,-1];if(A.direction)s=L.normalize(A.direction);else if(A.target||A.targetX!==void 0||A.targetY!==void 0||A.targetZ!==void 0){let h=A.target?A.target[0]:A.targetX??n,d=A.target?A.target[1]:A.targetY??r,y=A.target?A.target[2]:A.targetZ??i,w=[h,d,y],G=L.subtract(w,[n,r,i]);L.length(G)>1e-4&&(s=L.normalize(G))}let g=Math.max(1,A.radius??1e3),l=A.decay??2,I=Math.max(.1,Math.min(180,A.angle??45)),u=Math.max(0,Math.min(1,A.penumbra??.2)),E=I*Math.PI/180,Q=E*(1-u),C=Math.cos(E),m=Math.cos(Q);return{posType:[n,r,i,a],dirRadius:[s[0],s[1],s[2],g],colorIntensity:[e[0],e[1],e[2],t],spotParams:[C,m,l,0]}},packLightsUniforms(A,e,t){let n=new Float32Array(Rt/4);if(VA.packPhysicalBlock(n,A??[],e,t),(!A||A.length===0)&&!e)return n[4]=0,n[5]=0,n;let r=0,i=0,o=0,a=[];for(let g of A)if((g.lightType??g.type)==="ambient"){let I=vt(g.color),u=g.intensity??1;r+=I[0]*u,i+=I[1]*u,o+=I[2]*u}else a.length<_e&&a.push(VA.processLight(g));n[0]=r,n[1]=i,n[2]=o,n[3]=1,n[4]=a.length,n[5]=1;let s=8;for(let g=0;g<_e;g++){if(g<a.length){let l=a[g];n[s+0]=l.posType[0],n[s+1]=l.posType[1],n[s+2]=l.posType[2],n[s+3]=l.posType[3],n[s+4]=l.dirRadius[0],n[s+5]=l.dirRadius[1],n[s+6]=l.dirRadius[2],n[s+7]=l.dirRadius[3],n[s+8]=l.colorIntensity[0],n[s+9]=l.colorIntensity[1],n[s+10]=l.colorIntensity[2],n[s+11]=l.colorIntensity[3],n[s+12]=l.spotParams[0],n[s+13]=l.spotParams[1],n[s+14]=l.spotParams[2],n[s+15]=l.spotParams[3]}else for(let l=0;l<16;l++)n[s+l]=0;s+=16}return n},shadowCasterIndex(A){let e=0;for(let t of A){let n=t.lightType??t.type;if(n!=="ambient"){if(e>=_e)break;if(t.castShadow&&(n==="directional"||n==="spot"))return e;e++}}return-1},packPhysicalBlock(A,e,t,n){let r=8+_e*16,i=0,o=0,a=0;for(let s of e){if((s.lightType??s.type)!=="ambient")continue;let[g,l,I]=vt(s.color),u=s.intensity??1,E=Q=>Q<=.04045?Q/12.92:((Q+.055)/1.055)**2.4;i+=E(g)*u,o+=E(l)*u,a+=E(I)*u}if(A[r+0]=i,A[r+1]=o,A[r+2]=a,A[r+3]=1,t){let s=zn(t);A[6]=1,A[7]=s.toneMapping,A[r+3]=s.exposureMultiplier,A.set([...s.top,s.rotationRad],r+4),A.set([...s.horizon,s.softboxes],r+8),A.set([...s.bottom,1],r+12),s.fog&&(A.set([...s.fog.color,1],r+16),A.set([s.fog.start,s.fog.end,s.fog.opacity,0],r+20))}if(n&&n.lightIndex>=0){A.set([1,n.lightIndex,n.softness,n.mapSize],r+24),A.set([n.bias,n.normalOffset,n.darkness,0],r+28);for(let s=0;s<16;s++)A[r+32+s]=n.matrix[s]??0}}};T();var pe=class A{static parse(e,t,n){let r=typeof t=="object"&&t!==null?t:n??{},i=typeof t=="string"?t:r.mtlText,o=[],a=[],s=[],g=[],l={materialName:"default",faces:[]};g.push(l);let I={};i&&Object.assign(I,A.parseMtl(i));let u=e.split(/\r?\n/);for(let v=0;v<u.length;v++){let sA=u[v]?.trim();if(!sA||sA.startsWith("#"))continue;let eA=sA.split(/\s+/),gA=eA[0]?.toLowerCase();if(gA==="mtllib"){let j=eA.slice(1).join(" ").trim();if(r.basePath&&typeof pA<"u"&&pA.existsSync)try{let M=TA.resolve(r.basePath,j);if(pA.existsSync(M)){let P=pA.readFileSync(M,"utf-8");Object.assign(I,A.parseMtl(P))}}catch{}}else if(gA==="v"){let j=Number.parseFloat(eA[1]??"0"),M=Number.parseFloat(eA[2]??"0"),P=Number.parseFloat(eA[3]??"0");o.push([j,M,P])}else if(gA==="vn"){let j=Number.parseFloat(eA[1]??"0"),M=Number.parseFloat(eA[2]??"0"),P=Number.parseFloat(eA[3]??"0");a.push([j,M,P])}else if(gA==="vt"){let j=Number.parseFloat(eA[1]??"0"),M=eA[2]!==void 0?Number.parseFloat(eA[2]):0;s.push([j,M])}else if(gA==="usemtl"){let j=eA[1]??"default";l.faces.length>0?(l={materialName:j,faces:[]},g.push(l)):l.materialName=j}else if(gA==="f"){let j=[];for(let M=1;M<eA.length;M++){let P=eA[M];if(!P)continue;let Z=P.split("/"),iA=Number.parseInt(Z[0]??"0",10),QA=Z[1]&&Z[1].length>0?Number.parseInt(Z[1],10):0,fA=Z[2]&&Z[2].length>0?Number.parseInt(Z[2],10):0;iA<0&&(iA=o.length+iA+1),QA<0&&(QA=s.length+QA+1),fA<0&&(fA=a.length+fA+1),j.push({v:iA-1,vt:QA-1,vn:fA-1})}if(j.length>=3)for(let M=1;M<j.length-1;M++){let P=j[0],Z=j[M],iA=j[M+1];P&&Z&&iA&&l.faces.push([P,Z,iA])}}}let E=1/0,Q=1/0,C=1/0,m=-1/0,h=-1/0,d=-1/0;for(let v of o){let[sA,eA,gA]=v;sA===void 0||eA===void 0||gA===void 0||(sA<E&&(E=sA),eA<Q&&(Q=eA),gA<C&&(C=gA),sA>m&&(m=sA),eA>h&&(h=eA),gA>d&&(d=gA))}Number.isFinite(E)||(E=-1,Q=-1,C=-1,m=1,h=1,d=1);let y=(E+m)*.5,w=(Q+h)*.5,G=(C+d)*.5,x=Math.max(1e-4,m-E),b=Math.max(1e-4,h-Q),F=Math.max(1e-4,d-C),k=Math.max(x,b,F),H=1;r.normalizeSize&&r.normalizeSize>0&&(H=r.normalizeSize/k),typeof r.scale=="number"&&(H*=r.scale);let _=r.center??!1,R=_?y:0,z=_?w:0,X=_?G:0,S=[];for(let v=0;v<g.length;v++){let sA=g[v];if(!sA||sA.faces.length===0)continue;let eA=new Map,gA=[],j=[],M=[],P=[],Z=!1;for(let fA of sA.faces)for(let CA of fA){let mA=`${CA.v}_${CA.vt}_${CA.vn}`,dA=eA.get(mA);if(dA===void 0){dA=gA.length/3,eA.set(mA,dA);let DA=o[CA.v]??[0,0,0],bA=((DA[0]??0)-R)*H,SA=((DA[1]??0)-z)*H,UA=((DA[2]??0)-X)*H;if(gA.push(bA,SA,UA),CA.vt>=0&&s[CA.vt]){let LA=s[CA.vt];M.push(LA[0]??0,1-(LA[1]??0))}else M.push(0,0);if(CA.vn>=0&&a[CA.vn]){Z=!0;let LA=a[CA.vn];j.push(LA[0]??0,LA[1]??0,LA[2]??0)}else j.push(0,0,0)}P.push(dA)}if(!Z||r.smoothNormals){let fA=new Float32Array(gA.length);for(let CA=0;CA<P.length;CA+=3){let mA=P[CA],dA=P[CA+1],DA=P[CA+2],bA=[gA[mA*3],gA[mA*3+1],gA[mA*3+2]],SA=[gA[dA*3],gA[dA*3+1],gA[dA*3+2]],UA=[gA[DA*3],gA[DA*3+1],gA[DA*3+2]],LA=L.subtract(SA,bA),pt=L.subtract(UA,bA),vA=L.cross(LA,pt);fA[mA*3]+=vA[0],fA[mA*3+1]+=vA[1],fA[mA*3+2]+=vA[2],fA[dA*3]+=vA[0],fA[dA*3+1]+=vA[1],fA[dA*3+2]+=vA[2],fA[DA*3]+=vA[0],fA[DA*3+1]+=vA[1],fA[DA*3+2]+=vA[2]}for(let CA=0;CA<gA.length/3;CA++){let mA=fA[CA*3],dA=fA[CA*3+1],DA=fA[CA*3+2],bA=Math.hypot(mA,dA,DA)||1;j[CA*3]=mA/bA,j[CA*3+1]=dA/bA,j[CA*3+2]=DA/bA}}let QA=gA.length/3>65535?new Uint32Array(P):new Uint16Array(P);S.push({id:`mesh_${v}`,name:sA.materialName,positions:new Float32Array(gA),normals:new Float32Array(j),uvs:new Float32Array(M),indices:QA,materialName:sA.materialName})}let IA=(E-R)*H,O=(Q-z)*H,V=(C-X)*H,rA=(m-R)*H,Y=(h-z)*H,U=(d-X)*H,AA=rA-IA,$=Y-O,W=U-V,nA=(IA+rA)*.5,cA=(O+Y)*.5,oA=(V+U)*.5,aA=Math.hypot(AA,$,W)*.5;return{meshes:S,materials:I,animations:[],bounds:{min:[IA,O,V],max:[rA,Y,U],center:[nA,cA,oA],size:[AA,$,W],boundingSphereRadius:aA}}}static parseMtl(e){let t={},n=null,r=e.split(/\r?\n/);for(let i of r){let o=i.trim();if(!o||o.startsWith("#"))continue;let a=o.split(/\s+/),s=a[0]?.toLowerCase();if(s==="newmtl"){let g=a[1]??"default";n={name:g,diffuseColor:[1,1,1,1],specularColor:[1,1,1],ambientColor:[.2,.2,.2],shininess:32,opacity:1},t[g]=n}else if(n)if(s==="kd"){let g=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),I=Number.parseFloat(a[3]??"1");n.diffuseColor=[g,l,I,n.diffuseColor?.[3]??1]}else if(s==="ks"){let g=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),I=Number.parseFloat(a[3]??"1");n.specularColor=[g,l,I],n.specularIntensity=(g+l+I)/3}else if(s==="ka"){let g=Number.parseFloat(a[1]??"0.2"),l=Number.parseFloat(a[2]??"0.2"),I=Number.parseFloat(a[3]??"0.2");n.ambientColor=[g,l,I]}else if(s==="ns")n.shininess=Number.parseFloat(a[1]??"32");else if(s==="d"||s==="tr"){let g=Number.parseFloat(a[1]??"1");n.opacity=s==="d"?g:1-g,n.diffuseColor&&(n.diffuseColor[3]=n.opacity)}else s==="map_kd"?n.diffuseTexture=a.slice(1).join(" "):(s==="map_bump"||s==="bump")&&(n.normalTexture=a.slice(1).join(" "))}return t}};function Na(A,e,t={}){return pe.parse(A,e,t)}function Sa(A){return pe.parseMtl(A)}function ye(A,e,t={}){let n;if(typeof A!="string")n=new TextDecoder().decode(A);else{let r=A.trim();if(!(r.startsWith("v ")||r.startsWith("#")||r.includes(`
2
+ v `)||r.includes("\rv "))&&typeof pA<"u"&&pA.existsSync)try{let o=A.startsWith("file://")?A.slice(7):A;try{o=decodeURIComponent(o)}catch{}pA.existsSync(o)?(n=pA.readFileSync(o,"utf-8"),t={basePath:t.basePath??TA.dirname(o),...t}):n=A}catch{n=A}else n=A}return pe.parse(n,e,t)}T();var _n=Sn(Zn(),1);var $A=class A{static FBX_KTIME=46186158e3;static parse(e,t={}){let n=typeof e=="string"?A.parseAscii(e):A.isBinary(e)?A.parseBinary(e):A.parseAscii(new TextDecoder().decode(e));return A.buildModelFromTree(n,t)}static isBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<27)return!1;let n="Kaydara FBX Binary \0\0";for(let r=0;r<n.length;r++)if(t[r]!==n.charCodeAt(r))return!1;return!0}static parseBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=new DataView(t.buffer,t.byteOffset,t.byteLength),i=n.getUint32(23,!0)>=7500,o=27,a={name:"Root",props:[],children:[]},s=()=>{if(o>=t.byteLength)return null;let g,l,I;if(i){if(o+25>t.byteLength)return null;g=Number(n.getBigUint64(o,!0)),l=Number(n.getBigUint64(o+8,!0)),I=n.getUint8(o+24),o+=25}else{if(o+13>t.byteLength)return null;g=n.getUint32(o,!0),l=n.getUint32(o+4,!0),I=n.getUint8(o+12),o+=13}if(g===0)return null;let u=new TextDecoder().decode(t.subarray(o,o+I));o+=I;let E=[];for(let C=0;C<l;C++){let m=String.fromCharCode(t[o]);switch(o+=1,m){case"Y":{E.push(n.getInt16(o,!0)),o+=2;break}case"C":case"B":{E.push(n.getUint8(o)!==0),o+=1;break}case"I":{E.push(n.getInt32(o,!0)),o+=4;break}case"F":{E.push(n.getFloat32(o,!0)),o+=4;break}case"D":{E.push(n.getFloat64(o,!0)),o+=8;break}case"L":{E.push(Number(n.getBigInt64(o,!0))),o+=8;break}case"S":{let h=n.getUint32(o,!0);o+=4;let d=new TextDecoder().decode(t.subarray(o,o+h));E.push(d),o+=h;break}case"R":{let h=n.getUint32(o,!0);o+=4;let d=t.subarray(o,o+h);E.push(d),o+=h;break}case"f":case"d":case"i":case"l":case"b":case"c":{let h=n.getUint32(o,!0),d=n.getUint32(o+4,!0),y=n.getUint32(o+8,!0);o+=12;let w;if(d===1){let x=t.subarray(o,o+y);w=(0,_n.inflateSync)(x),o+=y}else{let b=h*(m==="d"||m==="l"?8:m==="f"||m==="i"?4:1);w=t.subarray(o,o+b),o+=b}let G=new DataView(w.buffer,w.byteOffset,w.byteLength);if(m==="f"){let x=new Float32Array(h);for(let b=0;b<h;b++)x[b]=G.getFloat32(b*4,!0);E.push(x)}else if(m==="d"){let x=new Float64Array(h);for(let b=0;b<h;b++)x[b]=G.getFloat64(b*8,!0);E.push(x)}else if(m==="i"){let x=new Int32Array(h);for(let b=0;b<h;b++)x[b]=G.getInt32(b*4,!0);E.push(x)}else if(m==="l"){let x=new Float64Array(h);for(let b=0;b<h;b++)x[b]=Number(G.getBigInt64(b*8,!0));E.push(x)}else if(m==="b"){let x=new Uint8Array(h);for(let b=0;b<h;b++)x[b]=G.getUint8(b);E.push(x)}else E.push(w);break}default:break}}let Q=[];for(;o<g;){let C=s();if(C)Q.push(C);else break}return o=g,{name:u,props:E,children:Q}};for(;o<t.byteLength-(i?25:13);){let g=s();if(g)a.children.push(g);else break}return a}static parseAscii(e){let t={name:"Root",props:[],children:[]},n=[t],r=e.split(/\r?\n/);for(let i=0;i<r.length;i++){let o=r[i]?.trim();if(!o||o.startsWith(";"))continue;if(o==="}"){n.length>1&&n.pop();continue}let a=o.indexOf(":");if(a===-1)continue;let s=o.substring(0,a).trim(),g=o.substring(a+1).trim(),l=g.endsWith("{"),I=l?g.slice(0,-1).trim():g,u=[];if(I){let C=I.split(",").map(m=>m.trim());for(let m of C)m.startsWith('"')&&m.endsWith('"')?u.push(m.slice(1,-1)):Number.isNaN(Number(m))?u.push(m):u.push(Number(m))}let E={name:s,props:u,children:[]},Q=n[n.length-1];Q&&Q.children.push(E),l&&n.push(E)}return t}static buildModelFromTree(e,t={}){let n=e.children.find(F=>F.name==="Objects"),r=e.children.find(F=>F.name==="Connections"),i=new Map;if(n)for(let F of n.children){let k=F.props[0]??0,_=String(F.props[1]??"").split("::"),R=_.length>1?_[1]:_[0],z=String(F.props[2]??F.name);i.set(k,{id:k,name:R,type:z,node:F})}let o=[];if(r){for(let F of r.children)if(F.name==="C"||F.name==="Connect"){let k=String(F.props[0]),H=F.props[1]??0,_=F.props[2]??0,R=k==="OP"?String(F.props[3]):void 0;o.push({childId:H,parentId:_,propName:R})}}let a=[],s={};function g(F){if(!F)return[];if(F.props[0]instanceof Float32Array||F.props[0]instanceof Float64Array||F.props[0]instanceof Int32Array||Array.isArray(F.props[0]))return F.props[0];let k=F.children.find(H=>H.name==="a");return k&&k.props.length>0?k.props:Array.isArray(F.props)&&F.props.length>0&&typeof F.props[0]=="number"?F.props:[]}for(let[F,k]of i)if(k.node.name==="Geometry"&&(k.type==="Mesh"||k.node.props[2]==="Mesh"||k.type==="")){let H=k.node,_=H.children.find(M=>M.name==="Vertices"),R=H.children.find(M=>M.name==="PolygonVertexIndex"),z=H.children.find(M=>M.name==="LayerElementNormal"),X=H.children.find(M=>M.name==="LayerElementUV");if(!_||!R)continue;let S=g(_),IA=g(R),O=z?.children.find(M=>M.name==="Normals"),V=g(O),rA=X?.children.find(M=>M.name==="UV"),Y=X?.children.find(M=>M.name==="UVIndex"),U=g(rA),AA=g(Y),$=[],W=[],nA=[];for(let M=0;M<IA.length;M++){let P=IA[M];if(P<0){if(nA.push(-(P+1)),W.push(M),nA.length>=3)for(let Z=1;Z<nA.length-1;Z++)$.push([nA[0],nA[Z],nA[Z+1]]);nA=[]}else nA.push(P),W.push(M)}let cA=[],oA=[],aA=[],v=[];for(let M=0;M<$.length;M++){let P=$[M];for(let Z=0;Z<3;Z++){let iA=P[Z],QA=cA.length/3,fA=S[iA*3]??0,CA=S[iA*3+1]??0,mA=S[iA*3+2]??0;if(cA.push(fA,CA,mA),V.length>0){let dA=V[iA*3]??0,DA=V[iA*3+1]??0,bA=V[iA*3+2]??0;oA.push(dA,DA,bA)}else oA.push(0,0,1);if(U.length>0){let dA=iA;AA.length>0&&(dA=AA[iA]??iA);let DA=U[dA*2]??0,bA=U[dA*2+1]??0;aA.push(DA,1-bA)}else aA.push(0,0);v.push(QA)}}if(V.length===0||t.smoothNormals){let M=new Float32Array(cA.length);for(let P=0;P<v.length;P+=3){let Z=v[P],iA=v[P+1],QA=v[P+2],fA=[cA[Z*3],cA[Z*3+1],cA[Z*3+2]],CA=[cA[iA*3],cA[iA*3+1],cA[iA*3+2]],mA=[cA[QA*3],cA[QA*3+1],cA[QA*3+2]],dA=L.subtract(CA,fA),DA=L.subtract(mA,fA),bA=L.cross(dA,DA);M[Z*3]+=bA[0],M[Z*3+1]+=bA[1],M[Z*3+2]+=bA[2],M[iA*3]+=bA[0],M[iA*3+1]+=bA[1],M[iA*3+2]+=bA[2],M[QA*3]+=bA[0],M[QA*3+1]+=bA[1],M[QA*3+2]+=bA[2]}for(let P=0;P<cA.length/3;P++){let Z=M[P*3],iA=M[P*3+1],QA=M[P*3+2],fA=Math.hypot(Z,iA,QA)||1;oA[P*3]=Z/fA,oA[P*3+1]=iA/fA,oA[P*3+2]=QA/fA}}let sA=o.find(M=>M.parentId===F&&i.get(M.childId)?.type==="Deformer"&&i.get(M.childId)?.node.props[2]==="Skin"),eA,gA;if(sA){let M=cA.length/3;eA=new Float32Array(M*4),gA=new Float32Array(M*4),o.filter(Z=>Z.parentId===sA.childId&&i.get(Z.childId)?.type==="Deformer"&&i.get(Z.childId)?.node.props[2]==="Cluster").forEach((Z,iA)=>{let QA=i.get(Z.childId)?.node,fA=QA?.children.find(mA=>mA.name==="Indexes"),CA=QA?.children.find(mA=>mA.name==="Weights");if(fA&&CA){let mA=g(fA),dA=g(CA);for(let DA=0;DA<mA.length;DA++){let bA=dA[DA]??0;for(let SA=0;SA<M;SA++)for(let UA=0;UA<4;UA++)if(gA[SA*4+UA]===0){eA[SA*4+UA]=iA,gA[SA*4+UA]=bA;break}}}})}let j=cA.length/3>65535;a.push({id:`fbx_mesh_${F}`,name:k.name,positions:new Float32Array(cA),normals:new Float32Array(oA),uvs:new Float32Array(aA),indices:j?new Uint32Array(v):new Uint16Array(v),jointIndices:eA,jointWeights:gA,materialName:k.name})}for(let[,F]of i)if(F.node.name==="Material"){let H=F.node.children.find(X=>X.name==="Properties70"),_=[1,1,1,1],R=32,z=1;if(H){for(let X of H.children)if(X.name==="P"){let S=String(X.props[0]);if(S==="DiffuseColor"||S==="Color"){let IA=Number(X.props[4]??1),O=Number(X.props[5]??1),V=Number(X.props[6]??1);_=[IA,O,V,1]}else S==="Shininess"||S==="ShininessExponent"?R=Number(X.props[4]??32):S==="Opacity"&&(z=Number(X.props[4]??1),_[3]=z)}}s[F.name]={name:F.name,diffuseColor:_,shininess:R,opacity:z}}let l=[];for(let[F,k]of i)if(k.node.name==="AnimationStack"){let H=k.name||"Take 001",_=[],R=o.find(X=>X.parentId===F&&i.get(X.childId)?.node.name==="AnimationLayer");if(R){let X=o.filter(IA=>IA.parentId===R.childId&&i.get(IA.childId)?.node.name==="AnimationCurveNode"),S=new Map;for(let IA of X){let O=i.get(IA.childId);if(!O)continue;let V=o.find(W=>W.childId===O.id&&i.get(W.parentId)?.node.name==="Model"),rA=V?i.get(V.parentId):void 0,Y=qn(V?.propName)??qn(O.name);if(!Y)continue;let U=`${rA?.id??O.id}|${Y}`,AA=S.get(U);if(!AA){let W=rA?.node;AA={nodeName:rA?.name??O.name,model:W,kind:Y,defaults:fi(W,O.node,Y),channels:[void 0,void 0,void 0]},S.set(U,AA)}o.filter(W=>W.parentId===O.id&&i.get(W.childId)?.node.name==="AnimationCurve").forEach((W,nA)=>{let cA=Ci(W.propName)??nA;if(cA>2)return;let oA=i.get(W.childId)?.node,aA=g(oA?.children.find(eA=>eA.name==="KeyTime")),v=g(oA?.children.find(eA=>eA.name==="KeyValueFloat")),sA=Math.min(aA.length,v.length);sA!==0&&(AA.channels[cA]={times:Array.from(aA.slice(0,sA),eA=>Number(eA)),values:Array.from(v.slice(0,sA),eA=>Number(eA))})})}for(let IA of S.values()){let O=yi(IA);O&&_.push(O)}}let z=1;for(let X of _)if(X.times.length>0){let S=X.times[X.times.length-1]??0;S>z&&(z=S)}l.push({name:H,duration:z,fps:30,tracks:_})}let I=1/0,u=1/0,E=1/0,Q=-1/0,C=-1/0,m=-1/0;for(let F of a)for(let k=0;k<F.positions.length;k+=3){let H=F.positions[k],_=F.positions[k+1],R=F.positions[k+2];H<I&&(I=H),_<u&&(u=_),R<E&&(E=R),H>Q&&(Q=H),_>C&&(C=_),R>m&&(m=R)}Number.isFinite(I)||(I=-1,u=-1,E=-1,Q=1,C=1,m=1);let h=Q-I,d=C-u,y=m-E,w=(I+Q)*.5,G=(u+C)*.5,x=(E+m)*.5,b=Math.hypot(h,d,y)*.5;return{meshes:a,materials:s,animations:l,bounds:{min:[I,u,E],max:[Q,C,m],center:[w,G,x],size:[h,d,y],boundingSphereRadius:b}}}};function qn(A){switch(A){case"Lcl Translation":case"T":return"T";case"Lcl Rotation":case"R":return"R";case"Lcl Scaling":case"S":return"S";default:return}}function Ci(A){switch(A){case"d|X":return 0;case"d|Y":return 1;case"d|Z":return 2;default:return}}function Lt(A,e){let n=A?.children.find(r=>r.name==="Properties70")?.children.find(r=>r.name==="P"&&r.props[0]===e);if(n)return n.props.slice(4).map(r=>Number(r))}function fi(A,e,t){let n=t==="S"?1:0,r=Lt(A,t==="T"?"Lcl Translation":t==="R"?"Lcl Rotation":"Lcl Scaling"),i=[n,n,n];for(let o=0;o<3;o++){let a=r?.[o],s=Lt(e,`d|${"XYZ"[o]}`)?.[0],g=a??s;g!==void 0&&Number.isFinite(g)&&(i[o]=g)}return i}var di=["XYZ","XZY","YZX","YXZ","ZXY","ZYX"];function hi(A){let e=Lt(A,"RotationOrder")?.[0]??0;return di[e]??"XYZ"}function mi(A,e="XYZ"){let t=[0,0,0,1];for(let n of e){let r="XYZ".indexOf(n),i=(A[r]??0)*Math.PI/360,o=Math.sin(i),a=[0,0,0,Math.cos(i)];a[r]=o,t=[a[3]*t[0]+a[0]*t[3]+a[1]*t[2]-a[2]*t[1],a[3]*t[1]-a[0]*t[2]+a[1]*t[3]+a[2]*t[0],a[3]*t[2]+a[0]*t[1]-a[1]*t[0]+a[2]*t[3],a[3]*t[3]-a[0]*t[0]-a[1]*t[1]-a[2]*t[2]]}return t}function pi(A,e){let{times:t,values:n}=A,r=t.length-1;if(e<=t[0])return n[0];if(e>=t[r])return n[r];let i=0;for(;i<r-1&&t[i+1]<=e;)i++;let o=t[i],a=t[i+1],s=a>o?(e-o)/(a-o):0;return n[i]+(n[i+1]-n[i])*s}function yi(A){let e=new Set;for(let s of A.channels)for(let g of s?.times??[])e.add(g);if(e.size===0)return;let t=[...e].sort((s,g)=>s-g),n=new Float32Array(t.length),r=A.kind==="R",i=new Float32Array(t.length*(r?4:3)),o=r?hi(A.model):"XYZ",a;return t.forEach((s,g)=>{n[g]=s/$A.FBX_KTIME;let l=[0,1,2].map(u=>{let E=A.channels[u];return E?pi(E,s):A.defaults[u]});if(!r){i.set(l,g*3);return}let I=mi(l,o);if(a&&a[0]*I[0]+a[1]*I[1]+a[2]*I[2]+a[3]*I[3]<0)for(let u=0;u<4;u++)I[u]=-I[u];a=I,i.set(I,g*4)}),{nodeName:A.nodeName,times:n,translations:A.kind==="T"?i:void 0,rotations:r?i:void 0,scales:A.kind==="S"?i:void 0}}function Ha(A,e={}){return $A.parse(A,e)}function De(A,e={}){let t=A;if(typeof A=="string"){let n=A.trim();if(!(n.includes("FBXHeaderExtension")||n.includes("Kaydara FBX"))&&typeof pA<"u"&&pA.existsSync)try{let i=A.startsWith("file://")?A.slice(7):A;try{i=decodeURIComponent(i)}catch{}if(pA.existsSync(i)){let o=pA.readFileSync(i);t=new Uint8Array(o.buffer,o.byteOffset,o.byteLength)}}catch{}}return $A.parse(t,e)}T();T();var jn=`
3
+ struct AudioLatentBuffer {
4
+ fftBins : array<f32, 1024>,
5
+ bassEnergy : f32,
6
+ drumTransient : f32,
7
+ vocalEnergy : f32,
8
+ timeMs : f32,
9
+ };
10
+
11
+ struct DeformParams {
12
+ mode : u32, // 0 = normal_extrusion, 1 = radial_pulse, 2 = harmonic_wave, 3 = twist, 4 = ripple
13
+ freqMinBin : u32,
14
+ freqMaxBin : u32,
15
+ vertexCount : u32,
16
+ amplitudeMultiplier : f32,
17
+ damping : f32,
18
+ timeMs : f32,
19
+ pad : f32,
20
+ };
21
+
22
+ struct VertexData {
23
+ // 16 floats = 64 bytes per vertex
24
+ f : array<f32, 16>,
25
+ };
26
+
27
+ @group(0) @binding(0) var<storage, read> audio : AudioLatentBuffer;
28
+ @group(0) @binding(1) var<uniform> params : DeformParams;
29
+ @group(0) @binding(2) var<storage, read> srcVertices : array<VertexData>;
30
+ @group(0) @binding(3) var<storage, read_write> dstVertices : array<VertexData>;
31
+
32
+ @compute @workgroup_size(256)
33
+ fn cs_displace(@builtin(global_invocation_id) gid : vec3<u32>) {
34
+ let idx = gid.x;
35
+ if (idx >= params.vertexCount) {
36
+ return;
37
+ }
38
+
39
+ let src = srcVertices[idx];
40
+ var outV = src;
41
+
42
+ // Extract attributes
43
+ let pos = vec3<f32>(src.f[0], src.f[1], src.f[2]);
44
+ let uv = vec2<f32>(src.f[3], src.f[4]);
45
+ var norm = vec3<f32>(src.f[5], src.f[6], src.f[7]);
46
+
47
+ let normLen = length(norm);
48
+ if (normLen > 0.0001) {
49
+ norm = norm / normLen;
50
+ } else {
51
+ norm = vec3<f32>(0.0, 1.0, 0.0);
52
+ }
53
+
54
+ // Determine frequency bin
55
+ let minBin = max(0u, params.freqMinBin);
56
+ let maxBin = min(1023u, max(minBin, params.freqMaxBin));
57
+ let freqNorm = clamp(uv.x, 0.0, 1.0);
58
+ let binIdx = u32(clamp(f32(minBin) + freqNorm * f32(maxBin - minBin), 0.0, 1023.0));
59
+ let freqAmplitude = audio.fftBins[binIdx];
60
+
61
+ var displacedPos = pos;
62
+ var displacedNorm = norm;
63
+
64
+ if (params.mode == 0u) {
65
+ // Mode 0: normal_extrusion
66
+ let bassOsc = sin(params.timeMs * 0.01 + pos.y * 0.5);
67
+ let displacementMag = (freqAmplitude * 45.0 + audio.bassEnergy * 20.0 * bassOsc) * params.amplitudeMultiplier;
68
+ displacedPos = pos + norm * displacementMag;
69
+
70
+ // Dynamic normal perturbation based on spatial gradient
71
+ let tangentDelta = cos(params.timeMs * 0.01 + pos.y * 0.5) * 0.5 * audio.bassEnergy * params.amplitudeMultiplier;
72
+ var perturbed = norm + vec3<f32>(0.0, -tangentDelta * 0.05, 0.0);
73
+ let pLen = length(perturbed);
74
+ if (pLen > 0.0001) {
75
+ displacedNorm = perturbed / pLen;
76
+ }
77
+ } else if (params.mode == 1u) {
78
+ // Mode 1: radial_pulse
79
+ let rLen = length(pos);
80
+ var dir = norm;
81
+ if (rLen > 0.0001) {
82
+ dir = pos / rLen;
83
+ }
84
+ let pulse = (audio.bassEnergy * 35.0 + audio.drumTransient * 45.0) * params.amplitudeMultiplier;
85
+ let dampingFactor = exp(-max(0.0, params.damping) * rLen * 0.01);
86
+ displacedPos = pos + dir * (pulse * dampingFactor);
87
+ displacedNorm = norm;
88
+ } else if (params.mode == 3u) {
89
+ // Mode 3: twist. Each slice turns about Y by its height times the
90
+ // twist rate; a resting twist plus the bass, so it winds on the drop.
91
+ let rate = (0.35 + audio.bassEnergy) * 0.004 * params.amplitudeMultiplier;
92
+ let a = pos.y * rate;
93
+ let c = cos(a);
94
+ let s = sin(a);
95
+ displacedPos = vec3<f32>(c * pos.x - s * pos.z, pos.y, s * pos.x + c * pos.z);
96
+ displacedNorm = vec3<f32>(c * norm.x - s * norm.z, norm.y, s * norm.x + c * norm.z);
97
+ } else if (params.mode == 4u) {
98
+ // Mode 4: ripple. Concentric waves travel out across XY from the
99
+ // origin, struck harder by the drums and fading with distance.
100
+ let r = length(pos.xy);
101
+ let phase = r * 0.05 - params.timeMs * 0.015;
102
+ let height = (6.0 + audio.drumTransient * 28.0 + audio.bassEnergy * 10.0) * params.amplitudeMultiplier;
103
+ let fade = exp(-max(0.0, params.damping) * r * 0.002);
104
+ displacedPos = pos + norm * (sin(phase) * height * fade);
105
+ // The wave's slope tilts the normal toward the travel direction.
106
+ var radial = vec3<f32>(0.0, 0.0, 0.0);
107
+ if (r > 0.0001) {
108
+ radial = vec3<f32>(pos.x / r, pos.y / r, 0.0);
109
+ }
110
+ let slope = cos(phase) * 0.05 * height * fade;
111
+ var perturbed = norm - radial * slope;
112
+ let pLen = length(perturbed);
113
+ if (pLen > 0.0001) {
114
+ displacedNorm = perturbed / pLen;
115
+ }
116
+ } else {
117
+ // Mode 2: harmonic_wave
118
+ let wavePhase = params.timeMs * 0.005 + pos.y * 0.2;
119
+ let wave = (sin(wavePhase) * audio.bassEnergy * 25.0 + cos(wavePhase * 2.0 + pos.x * 0.1) * freqAmplitude * 20.0) * params.amplitudeMultiplier;
120
+ displacedPos = pos + norm * wave;
121
+
122
+ let dWaveDy = cos(wavePhase) * 0.2 * audio.bassEnergy * 25.0 * params.amplitudeMultiplier;
123
+ var perturbed = norm - vec3<f32>(0.0, dWaveDy * 0.03, 0.0);
124
+ let pLen = length(perturbed);
125
+ if (pLen > 0.0001) {
126
+ displacedNorm = perturbed / pLen;
127
+ }
128
+ }
129
+
130
+ // Write deformed position and normal
131
+ outV.f[0] = displacedPos.x;
132
+ outV.f[1] = displacedPos.y;
133
+ outV.f[2] = displacedPos.z;
134
+
135
+ outV.f[5] = displacedNorm.x;
136
+ outV.f[6] = displacedNorm.y;
137
+ outV.f[7] = displacedNorm.z;
138
+
139
+ dstVertices[idx] = outV;
140
+ }
141
+ `;var Di={normal_extrusion:0,radial_pulse:1,harmonic_wave:2,twist:3,ripple:4},$e=class{device;pipeline;bindGroupLayout;uniformPool;deformedBuffers=new WeakMap;uniformData=new ArrayBuffer(32);uniformUint32=new Uint32Array(this.uniformData);uniformFloat32=new Float32Array(this.uniformData);constructor(e){this.device=e,this.uniformPool=new GA(32,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.bindGroupLayout=e.createBindGroupLayout({label:"AudioMeshDeformBindGroupLayout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});let t=e.createShaderModule({label:"audioMeshDisplace.wgsl",code:jn}),n=e.createPipelineLayout({label:"AudioMeshDeformPipelineLayout",bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=e.createComputePipeline({label:"AudioMeshDeformComputePipeline",layout:n,compute:{module:t,entryPoint:"cs_displace"}})}getOrCreateDeformedBuffer(e,t){let n=this.deformedBuffers.get(e);return(!n||n.size<t)&&(n?.destroy(),n=this.device.createBuffer({label:"DeformedMeshVertexBuffer",size:Math.max(64,Math.ceil(t/4)*4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),this.deformedBuffers.set(e,n)),n}execute(e,t,n){let{config:r,audioLatentBuffer:i,vertexCount:o,timeMs:a=0,sampleRate:s=48e3}=n,g=o*64,l=this.getOrCreateDeformedBuffer(t,g),I=Di[r.mode]??0,u=s/2048,E=r.frequencyRange?r.frequencyRange[0]:20,Q=r.frequencyRange?r.frequencyRange[1]:120,C=Math.max(0,Math.min(1023,Math.round(E/u))),m=Math.max(C,Math.min(1023,Math.round(Q/u))),h=typeof r.amplitudeMultiplier=="number"?r.amplitudeMultiplier:typeof r.amplitudeMultiplier?.value=="number"?r.amplitudeMultiplier.value:1,d=r.damping??0;this.uniformUint32[0]=I,this.uniformUint32[1]=C,this.uniformUint32[2]=m,this.uniformUint32[3]=o,this.uniformFloat32[4]=h,this.uniformFloat32[5]=d,this.uniformFloat32[6]=a,this.uniformFloat32[7]=0;let y=this.uniformPool.getBuffer(this.device,new Uint8Array(this.uniformData)),w=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:y}},{binding:2,resource:{buffer:t}},{binding:3,resource:{buffer:l}}]}),G=e.beginComputePass({label:"AudioMeshDeformComputePass"});G.setPipeline(this.pipeline),G.setBindGroup(0,w);let x=Math.ceil(o/256);return G.dispatchWorkgroups(x),G.end(),l}resetPools(){this.uniformPool.reset()}destroy(){this.uniformPool.destroy()}};T();T();var be=class A{static isBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<84)return!1;let r=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(80,!0),i=84+r*50;if(t.length===i)return!0;let o=Math.min(t.length,512);for(let s=0;s<o;s++){let g=t[s];if(g>127||g<32&&g!==9&&g!==10&&g!==13)return!0}let a=new TextDecoder("utf-8").decode(t.subarray(0,80)).trim();return a.startsWith("solid")&&!a.includes(`
142
+ `)?t.length>=84+r*50:!a.startsWith("solid")}static parse(e,t={}){if(typeof e=="string")return A.parseAscii(e,t);let n=e instanceof Uint8Array?e:new Uint8Array(e);if(A.isBinary(n))return A.parseBinary(n,t);let r=new TextDecoder("utf-8").decode(n);return A.parseAscii(r,t)}static parseBinary(e,t={}){let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=n.getUint32(80,!0),i=[],o=[],a=[],s=84;for(let g=0;g<r&&!(s+50>e.byteLength);g++){let l=n.getFloat32(s,!0),I=n.getFloat32(s+4,!0),u=n.getFloat32(s+8,!0);s+=12;let E=n.getFloat32(s,!0),Q=n.getFloat32(s+4,!0),C=n.getFloat32(s+8,!0);s+=12;let m=n.getFloat32(s,!0),h=n.getFloat32(s+4,!0),d=n.getFloat32(s+8,!0);s+=12;let y=n.getFloat32(s,!0),w=n.getFloat32(s+4,!0),G=n.getFloat32(s+8,!0);s+=12,s+=2;let x=l,b=I,F=u;if(x===0&&b===0&&F===0){let H=L.subtract([m,h,d],[E,Q,C]),_=L.subtract([y,w,G],[E,Q,C]),R=L.normalize(L.cross(H,_));x=R[0],b=R[1],F=R[2]}let k=i.length/3;i.push(E,Q,C,m,h,d,y,w,G),o.push(x,b,F,x,b,F,x,b,F),a.push(k,k+1,k+2)}return A.finalizeModel(i,o,a,t)}static parseAscii(e,t={}){let n=[],r=[],i=[],o=e.split(/\r?\n/),a=[0,0,1],s=[];for(let g of o){let l=g.trim();if(l){if(l.startsWith("facet normal")){let I=l.split(/\s+/),u=Number.parseFloat(I[2]??"0")||0,E=Number.parseFloat(I[3]??"0")||0,Q=Number.parseFloat(I[4]??"0")||0;a=[u,E,Q],s=[]}else if(l.startsWith("vertex")){let I=l.split(/\s+/),u=Number.parseFloat(I[1]??"0")||0,E=Number.parseFloat(I[2]??"0")||0,Q=Number.parseFloat(I[3]??"0")||0;s.push([u,E,Q])}else if(l.startsWith("endfacet")){if(s.length>=3){let I=s[0],u=s[1],E=s[2],Q=a;if(Q[0]===0&&Q[1]===0&&Q[2]===0){let C=L.subtract(u,I),m=L.subtract(E,I);Q=L.normalize(L.cross(C,m))}for(let C=1;C<s.length-1;C++){let m=s[C],h=s[C+1],d=n.length/3;n.push(I[0],I[1],I[2],m[0],m[1],m[2],h[0],h[1],h[2]),r.push(Q[0],Q[1],Q[2],Q[0],Q[1],Q[2],Q[0],Q[1],Q[2]),i.push(d,d+1,d+2)}}s=[]}}}return A.finalizeModel(n,r,i,t)}static finalizeModel(e,t,n,r={}){let i=1/0,o=1/0,a=1/0,s=-1/0,g=-1/0,l=-1/0;for(let U=0;U<e.length;U+=3){let AA=e[U],$=e[U+1],W=e[U+2];AA<i&&(i=AA),AA>s&&(s=AA),$<o&&(o=$),$>g&&(g=$),W<a&&(a=W),W>l&&(l=W)}Number.isFinite(i)||(i=o=a=0,s=g=l=0);let I=(i+s)*.5,u=(o+g)*.5,E=(a+l)*.5,Q=s-i,C=g-o,m=l-a,h=Math.max(Q,C,m,1e-4),d=1;r.normalizeSize&&r.normalizeSize>0&&(d=r.normalizeSize/h);let y=d,w=d,G=d;typeof r.scale=="number"?(y*=r.scale,w*=r.scale,G*=r.scale):Array.isArray(r.scale)&&(y*=r.scale[0],w*=r.scale[1],G*=r.scale[2]);let x=r.center?I:0,b=r.center?u:0,F=r.center?E:0,k=new Float32Array(e.length),H=new Float32Array(e.length/3*2);for(let U=0;U<e.length;U+=3){let AA=(e[U]-x)*y,$=(e[U+1]-b)*w,W=(e[U+2]-F)*G;k[U]=AA,k[U+1]=$,k[U+2]=W;let nA=U/3*2;H[nA]=Q>0?(e[U]-i)/Q:0,H[nA+1]=C>0?(e[U+1]-o)/C:0}let R=k.length/3>65535?new Uint32Array(n):new Uint16Array(n),z={name:"stl_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...r.defaultMaterial},X=[{id:"stl_mesh_0",name:"stl_geometry",positions:k,normals:new Float32Array(t),uvs:H,indices:R,materialName:"stl_default"}],S=(i-x)*y,IA=(o-b)*w,O=(a-F)*G,V=(s-x)*y,rA=(g-b)*w,Y=(l-F)*G;return{name:"STL_Model",meshes:X,materials:{stl_default:z},animations:[],bounds:{min:[S,IA,O],max:[V,rA,Y],center:[(S+V)*.5,(IA+rA)*.5,(O+Y)*.5],size:[V-S,rA-IA,Y-O],boundingSphereRadius:Math.hypot(V-S,rA-IA,Y-O)*.5}}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=pA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function we(A,e={}){return be.load(A,e)}T();var kt=class A{static parse(e,t={}){let n=typeof e=="string"?new TextEncoder().encode(e):e instanceof Uint8Array?e:new Uint8Array(e),r=A.extractHeader(n),i=A.parseHeader(r.text);if(i.format==="ascii"){let a=new TextDecoder("utf-8").decode(n.subarray(r.endOffset));return A.parseAsciiBody(i,a,t)}let o=i.format==="binary_little_endian";return A.parseBinaryBody(i,n.subarray(r.endOffset),o,t)}static extractHeader(e){let t=Math.min(e.length,1e4),n=e.subarray(0,t),r=new TextDecoder("utf-8").decode(n),i=r.indexOf("end_header");if(i===-1)throw new Error("Invalid PLY file: 'end_header' marker not found");let o=r.indexOf(`
143
+ `,i);return o===-1?o=i+10:o+=1,{text:r.substring(0,o),endOffset:o}}static parseHeader(e){let t=e.split(/\r?\n/),n="ascii",r="1.0",i=[],o=null;for(let a of t){let s=a.trim();if(!s||s.startsWith("comment"))continue;let g=s.split(/\s+/),l=g[0]?.toLowerCase();if(l!=="ply"){if(l==="format"){let I=g[1]?.toLowerCase();I==="binary_little_endian"?n="binary_little_endian":I==="binary_big_endian"?n="binary_big_endian":n="ascii",r=g[2]??"1.0"}else if(l==="element"){let I=g[1]??"",u=Number.parseInt(g[2]??"0",10);o={name:I,count:u,properties:[]},i.push(o)}else if(l==="property"&&o)g[1]?.toLowerCase()==="list"?o.properties.push({name:g[4]??"",type:"list",isList:!0,countType:g[2]??"uchar",itemType:g[3]??"int"}):o.properties.push({name:g[2]??"",type:g[1]?.toLowerCase()??"float"});else if(l==="end_header")break}}return{format:n,version:r,elements:i}}static parseAsciiBody(e,t,n){let r=e.elements.find(S=>S.name==="vertex"),i=e.elements.find(S=>S.name==="face"),o=r?.count??0,a=i?.count??0,s=[],g=[],l=[],I=[],u=[],E=r?.properties??[],Q=E.findIndex(S=>S.name==="x"),C=E.findIndex(S=>S.name==="y"),m=E.findIndex(S=>S.name==="z"),h=E.findIndex(S=>S.name==="nx"),d=E.findIndex(S=>S.name==="ny"),y=E.findIndex(S=>S.name==="nz"),w=E.findIndex(S=>S.name==="u"||S.name==="s"||S.name==="texture_u"),G=E.findIndex(S=>S.name==="v"||S.name==="t"||S.name==="texture_v"),x=E.findIndex(S=>S.name==="red"||S.name==="r"),b=E.findIndex(S=>S.name==="green"||S.name==="g"),F=E.findIndex(S=>S.name==="blue"||S.name==="b"),k=E.findIndex(S=>S.name==="alpha"||S.name==="a"),H=h!==-1&&d!==-1&&y!==-1,_=x!==-1&&b!==-1&&F!==-1,R=w!==-1&&G!==-1,z=t.trim().split(/\r?\n/),X=0;for(let S=0;S<o&&!(X>=z.length);S++){let IA=z[X++]?.trim();if(!IA)continue;let O=IA.split(/\s+/),V=Number.parseFloat(O[Q]??"0")||0,rA=Number.parseFloat(O[C]??"0")||0,Y=Number.parseFloat(O[m]??"0")||0;if(s.push(V,rA,Y),H){let U=Number.parseFloat(O[h]??"0")||0,AA=Number.parseFloat(O[d]??"0")||0,$=Number.parseFloat(O[y]??"0")||0;g.push(U,AA,$)}else g.push(0,0,0);if(R){let U=Number.parseFloat(O[w]??"0")||0,AA=Number.parseFloat(O[G]??"0")||0;l.push(U,1-AA)}else l.push(0,0);if(_){let U=(Number.parseFloat(O[x]??"255")||0)/255,AA=(Number.parseFloat(O[b]??"255")||0)/255,$=(Number.parseFloat(O[F]??"255")||0)/255,W=k!==-1?(Number.parseFloat(O[k]??"255")||0)/255:1;I.push(U,AA,$,W)}}for(let S=0;S<a&&!(X>=z.length);S++){let IA=z[X++]?.trim();if(!IA)continue;let O=IA.split(/\s+/),V=Number.parseInt(O[0]??"0",10);if(V>=3){let rA=Number.parseInt(O[1]??"0",10);for(let Y=1;Y<V-1;Y++){let U=Number.parseInt(O[Y+1]??"0",10),AA=Number.parseInt(O[Y+2]??"0",10);u.push(rA,U,AA)}}}return A.finalizeModel(s,g,l,_?I:void 0,u,H,n)}static parseBinaryBody(e,t,n,r){let i=new DataView(t.buffer,t.byteOffset,t.byteLength),o=0,a=e.elements.find(x=>x.name==="vertex"),s=e.elements.find(x=>x.name==="face"),g=a?.count??0,l=s?.count??0,I=[],u=[],E=[],Q=[],C=[],m=a?.properties??[],h=m.some(x=>x.name==="nx"),d=m.some(x=>x.name==="red"||x.name==="r"),y=x=>{let b=0;switch(x.toLowerCase()){case"char":case"int8":b=i.getInt8(o),o+=1;break;case"uchar":case"uint8":b=i.getUint8(o),o+=1;break;case"short":case"int16":b=i.getInt16(o,n),o+=2;break;case"ushort":case"uint16":b=i.getUint16(o,n),o+=2;break;case"int":case"int32":b=i.getInt32(o,n),o+=4;break;case"uint":case"uint32":b=i.getUint32(o,n),o+=4;break;case"float":case"float32":b=i.getFloat32(o,n),o+=4;break;case"double":case"float64":b=i.getFloat64(o,n),o+=8;break;default:b=i.getFloat32(o,n),o+=4;break}return b};for(let x=0;x<g;x++){let b=0,F=0,k=0,H=0,_=0,R=0,z=0,X=0,S=1,IA=1,O=1,V=1;for(let rA of m){let Y=y(rA.type),U=rA.name.toLowerCase();U==="x"?b=Y:U==="y"?F=Y:U==="z"?k=Y:U==="nx"?H=Y:U==="ny"?_=Y:U==="nz"?R=Y:U==="u"||U==="s"?z=Y:U==="v"||U==="t"?X=Y:U==="red"||U==="r"?S=rA.type.includes("int")?Y/255:Y:U==="green"||U==="g"?IA=rA.type.includes("int")?Y/255:Y:U==="blue"||U==="b"?O=rA.type.includes("int")?Y/255:Y:(U==="alpha"||U==="a")&&(V=rA.type.includes("int")?Y/255:Y)}I.push(b,F,k),u.push(H,_,R),E.push(z,1-X),d&&Q.push(S,IA,O,V)}let G=(s?.properties??[]).find(x=>x.isList);for(let x=0;x<l&&!(o>=t.byteLength);x++)if(G){let b=y(G.countType??"uchar"),F=[];for(let k=0;k<b;k++)F.push(y(G.itemType??"int"));if(F.length>=3){let k=F[0];for(let H=1;H<F.length-1;H++)C.push(k,F[H],F[H+1])}}return A.finalizeModel(I,u,E,d?Q:void 0,C,h,r)}static finalizeModel(e,t,n,r,i,o,a){if(!o||a.smoothNormals){for(let $=0;$<i.length;$+=3){let W=i[$],nA=i[$+1],cA=i[$+2],oA=[e[W*3],e[W*3+1],e[W*3+2]],aA=[e[nA*3],e[nA*3+1],e[nA*3+2]],v=[e[cA*3],e[cA*3+1],e[cA*3+2]],sA=L.subtract(aA,oA),eA=L.subtract(v,oA),gA=L.cross(sA,eA);t[W*3]+=gA[0],t[W*3+1]+=gA[1],t[W*3+2]+=gA[2],t[nA*3]+=gA[0],t[nA*3+1]+=gA[1],t[nA*3+2]+=gA[2],t[cA*3]+=gA[0],t[cA*3+1]+=gA[1],t[cA*3+2]+=gA[2]}for(let $=0;$<t.length;$+=3){let W=t[$],nA=t[$+1],cA=t[$+2],oA=Math.hypot(W,nA,cA)||1;t[$]=W/oA,t[$+1]=nA/oA,t[$+2]=cA/oA}}let s=1/0,g=1/0,l=1/0,I=-1/0,u=-1/0,E=-1/0;for(let $=0;$<e.length;$+=3){let W=e[$],nA=e[$+1],cA=e[$+2];W<s&&(s=W),W>I&&(I=W),nA<g&&(g=nA),nA>u&&(u=nA),cA<l&&(l=cA),cA>E&&(E=cA)}Number.isFinite(s)||(s=g=l=0,I=u=E=0);let Q=(s+I)*.5,C=(g+u)*.5,m=(l+E)*.5,h=I-s,d=u-g,y=E-l,w=Math.max(h,d,y,1e-4),G=1;a.normalizeSize&&a.normalizeSize>0&&(G=a.normalizeSize/w);let x=G,b=G,F=G;typeof a.scale=="number"?(x*=a.scale,b*=a.scale,F*=a.scale):Array.isArray(a.scale)&&(x*=a.scale[0],b*=a.scale[1],F*=a.scale[2]);let k=a.center?Q:0,H=a.center?C:0,_=a.center?m:0,R=new Float32Array(e.length);for(let $=0;$<e.length;$+=3)R[$]=(e[$]-k)*x,R[$+1]=(e[$+1]-H)*b,R[$+2]=(e[$+2]-_)*F;let X=R.length/3>65535?new Uint32Array(i):new Uint16Array(i),S={name:"ply_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...a.defaultMaterial},IA=[{id:"ply_mesh_0",name:"ply_geometry",positions:R,normals:new Float32Array(t),uvs:new Float32Array(n),colors:r?new Float32Array(r):void 0,indices:X,materialName:"ply_default"}],O=(s-k)*x,V=(g-H)*b,rA=(l-_)*F,Y=(I-k)*x,U=(u-H)*b,AA=(E-_)*F;return{name:"PLY_Model",meshes:IA,materials:{ply_default:S},animations:[],bounds:{min:[O,V,rA],max:[Y,U,AA],center:[(O+Y)*.5,(V+U)*.5,(rA+AA)*.5],size:[Y-O,U-V,AA-rA],boundingSphereRadius:Math.hypot(Y-O,U-V,AA-rA)*.5}}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=pA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function xe(A,e={}){return kt.load(A,e)}T();T();var Me=128;function bi(A,e,t){let[n,r,i,o]=e,a=n*n,s=r*r,g=i*i,l=n*r,I=n*i,u=r*i,E=o*n,Q=o*r,C=o*i;return[(1-2*(s+g))*t[0],2*(l+C)*t[0],2*(I-Q)*t[0],0,2*(l-C)*t[1],(1-2*(a+g))*t[1],2*(u+E)*t[1],0,2*(I+Q)*t[2],2*(u-E)*t[2],(1-2*(a+s))*t[2],0,A[0],A[1],A[2],1]}function $n(A){let e=Math.hypot(A[0],A[1],A[2],A[3])||1;return[A[0]/e,A[1]/e,A[2]/e,A[3]/e]}function wi(A,e,t){let n=A[0]*e[0]+A[1]*e[1]+A[2]*e[2]+A[3]*e[3],r=n<0?-1:1;if(n*=r,n>.9995)return $n([A[0]+(r*e[0]-A[0])*t,A[1]+(r*e[1]-A[1])*t,A[2]+(r*e[2]-A[2])*t,A[3]+(r*e[3]-A[3])*t]);let i=Math.acos(n),o=Math.sin(i),a=Math.sin((1-t)*i)/o,s=r*Math.sin(t*i)/o;return[A[0]*a+e[0]*s,A[1]*a+e[1]*s,A[2]*a+e[2]*s,A[3]*a+e[3]*s]}function xi(A,e){let t=0,n=A.length-1;for(;t<n;){let r=t+n+1>>1;(A[r]??0)<=e?t=r:n=r-1}return t}function Ae(A,e,t,n,r=1){let i=n?(e*3+r)*t:e*t;return Array.from(A.subarray(i,i+t))}function Pt(A,e,t,n){let{times:r}=A,i=A.interpolation==="cubic",o=r.length-1;if(n<=(r[0]??0))return Ae(e,0,t,i);if(n>=(r[o]??0))return Ae(e,o,t,i);let a=xi(r,n);if(A.interpolation==="step")return Ae(e,a,t,i);let s=r[a]??0,g=(r[a+1]??s)-s,l=g>0?(n-s)/g:0,I=Ae(e,a,t,i),u=Ae(e,a+1,t,i);if(i){let E=Ae(e,a,t,!0,2),Q=Ae(e,a+1,t,!0,0),C=l*l,m=C*l,h=I.map((d,y)=>(2*m-3*C+1)*d+(m-2*C+l)*g*(E[y]??0)+(-2*m+3*C)*(u[y]??0)+(m-C)*g*(Q[y]??0));return t===4?$n(h):h}return t===4?wi(I,u,l):I.map((E,Q)=>E+((u[Q]??E)-E)*l)}function Mi(A,e,t){let n=A.map(a=>[...a.translation]),r=A.map(a=>[...a.rotation]),i=A.map(a=>[...a.scale]),o=new Map(A.map((a,s)=>[a.name,s]));for(let a of e?.tracks??[]){let s=a.node??o.get(a.nodeName);s===void 0||!a.times.length||(a.translations&&(n[s]=Pt(a,a.translations,3,t)),a.rotations&&(r[s]=Pt(a,a.rotations,4,t)),a.scales&&(i[s]=Pt(a,a.scales,3,t)))}return A.map((a,s)=>a.matrix??bi(n[s],r[s],i[s]))}function Ar(A,e,t){let n=A.nodes??[],r=Mi(n,e,t),i=new Array(n.length),o=a=>{let s=i[a];if(s)return s;let g=n[a].parent,l=g<0?r[a]:uA.multiply(o(g),r[a]);return i[a]=l,l};return n.map((a,s)=>o(s))}function ns(A,e,t){let n=A.skins?.[e];if(!n)throw new Error(`model has no skin ${e}`);let r=new Float32Array(Me*16);for(let i=0;i<Me;i++){let o=n.joints[i];if(o===void 0){r.set(uA.identity(),i*16);continue}let a=Array.from(n.inverseBindMatrices.subarray(i*16,i*16+16));r.set(uA.multiply(t[o],a),i*16)}return r}var Gi={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},Fi={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function Ni(A,e=!1){switch(A){case 5120:return e?(t,n)=>Math.max(t.getInt8(n)/127,-1):(t,n)=>t.getInt8(n);case 5121:return e?(t,n)=>t.getUint8(n)/255:(t,n)=>t.getUint8(n);case 5122:return e?(t,n)=>Math.max(t.getInt16(n,!0)/32767,-1):(t,n)=>t.getInt16(n,!0);case 5123:return e?(t,n)=>t.getUint16(n,!0)/65535:(t,n)=>t.getUint16(n,!0);case 5125:return(t,n)=>t.getUint32(n,!0);default:return(t,n)=>t.getFloat32(n,!0)}}var er=1179937895,Si=1313821514,Ui=5130562,ae=class A{static isGlb(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<12?!1:new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0)===er}static parse(e,t={},n){let r,i=[];if(typeof e=="string")try{r=JSON.parse(e)}catch(o){throw new Error(`Failed to parse glTF JSON: ${String(o)}`)}else{let o=e instanceof Uint8Array?e:new Uint8Array(e);if(A.isGlb(o)){let a=A.unpackGlb(o);r=a.doc,a.binBuffer&&i.push(a.binBuffer)}else{let a=new TextDecoder("utf-8").decode(o);r=JSON.parse(a)}}if(r.buffers)for(let o=0;o<r.buffers.length;o++){if(o===0&&i.length>0)continue;let a=r.buffers[o];if(a.uri){if(a.uri.startsWith("data:")){let s=a.uri.indexOf("base64,");if(s!==-1){let g=a.uri.substring(s+7),l=Buffer.from(g,"base64");i[o]=new Uint8Array(l.buffer,l.byteOffset,l.byteLength)}}else if(n){let s=TA.isAbsolute(a.uri)?a.uri:TA.join(n,a.uri);if(pA.existsSync(s)){let g=pA.readFileSync(s);i[o]=new Uint8Array(g.buffer,g.byteOffset,g.byteLength)}}}}return A.buildModel(r,i,t,n)}static unpackGlb(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(0,!0),r=t.getUint32(8,!0);if(n!==er)throw new Error("Invalid GLB header: magic mismatch");let i=12,o=null,a;for(;i<r&&i<e.byteLength;){let s=t.getUint32(i,!0),g=t.getUint32(i+4,!0);i+=8;let l=e.subarray(i,i+s);if(i+=s,g===Si){let I=new TextDecoder("utf-8").decode(l);o=JSON.parse(I)}else g===Ui&&(a=l)}if(!o)throw new Error("Invalid GLB: JSON chunk not found");return{doc:o,binBuffer:a}}static readFloats(e,t,n){let r=e.accessors?.[n];if(!r)throw new Error(`Accessor ${n} not found`);let i=Gi[r.type]??1,o=new Float32Array(r.count*i);if(r.bufferView===void 0)return{data:o,itemSize:i,count:r.count};let a=e.bufferViews?.[r.bufferView];if(!a)throw new Error(`BufferView ${r.bufferView} not found`);let s=t[a.buffer];if(!s)throw new Error(`Binary buffer ${a.buffer} not loaded`);let g=Fi[r.componentType]??4,l=a.byteStride??g*i,I=new DataView(s.buffer,s.byteOffset,s.byteLength),u=(a.byteOffset??0)+(r.byteOffset??0),E=Ni(r.componentType,r.normalized);for(let Q=0;Q<r.count;Q++)for(let C=0;C<i;C++)o[Q*i+C]=E(I,u+Q*l+C*g);return{data:o,itemSize:i,count:r.count}}static readIndices(e,t,n){let{data:r}=A.readFloats(e,t,n);return r.reduce((o,a)=>a>o?a:o,0)>65535?Uint32Array.from(r):Uint16Array.from(r)}static imageBytes(e,t,n,r){let i=e.images?.[n];if(!i)return;if(i.bufferView!==void 0){let s=e.bufferViews?.[i.bufferView],g=s?t[s.buffer]:void 0;if(!s||!g)return;let l=s.byteOffset??0;return{bytes:g.subarray(l,l+s.byteLength),mime:i.mimeType??"image/png"}}if(!i.uri)return;if(i.uri.startsWith("data:")){let s=i.uri.indexOf(","),g=i.uri.slice(5,i.uri.indexOf(";"));return{bytes:new Uint8Array(Buffer.from(i.uri.slice(s+1),"base64")),mime:g}}if(!r)return;let o=TA.isAbsolute(i.uri)?i.uri:TA.join(r,decodeURIComponent(i.uri));if(!pA.existsSync(o))return;let a=TA.extname(o).toLowerCase();return{bytes:new Uint8Array(pA.readFileSync(o)),mime:i.mimeType??(a===".png"?"image/png":"image/jpeg")}}static buildMaterial(e,t,n,r,i){let o=n.pbrMetallicRoughness,a=o?.baseColorFactor??[1,1,1,1],s={name:r,diffuseColor:a,roughness:o?.roughnessFactor??.5,metallic:o?.metallicFactor??0,shininess:32*(1-(o?.roughnessFactor??.5)),opacity:a[3]??1,twoSided:n.doubleSided??!0,alphaMode:n.alphaMode==="MASK"?"mask":n.alphaMode==="BLEND"?"blend":"opaque",alphaCutoff:n.alphaMode==="MASK"?n.alphaCutoff??.5:0},g=n.emissiveFactor;g&&(g[0]>0||g[1]>0||g[2]>0)&&(s.emissive=[g[0],g[1],g[2]],s.emissiveStrength=n.extensions?.KHR_materials_emissive_strength?.emissiveStrength??1);let l=n.extensions?.VRMC_materials_mtoon;l?(s.shading="toon",s.shadeColor=l.shadeColorFactor??[1,1,1]):n.extensions?.KHR_materials_unlit&&(s.shading="unlit");let I=o?.baseColorTexture,u=I?e.textures?.[I.index]:void 0;if(u?.source!==void 0){let d=A.imageBytes(e,t,u.source,i);if(d){s.diffuseTextureBuffer=d.bytes,s.diffuseTextureMime=d.mime;let y=u.sampler!==void 0?e.samplers?.[u.sampler]?.wrapS:void 0;s.textureWrap=y===33071?"clamp":y===33648?"mirror":"repeat"}}let E=d=>{let y=d?e.textures?.[d.index]:void 0;return y?.source!==void 0?A.imageBytes(e,t,y.source,i)?.bytes:void 0},Q=E(n.normalTexture);Q&&(s.normalTextureBuffer=Q,s.normalScale=n.normalTexture?.scale??1);let C=E(o?.metallicRoughnessTexture);C&&(s.metallicRoughnessTextureBuffer=C,s.roughness=o?.roughnessFactor??1,s.metallic=o?.metallicFactor??1);let m=E(n.occlusionTexture);m&&(s.occlusionTextureBuffer=m,s.occlusionStrength=n.occlusionTexture?.strength??1);let h=s.emissive&&E(n.emissiveTexture);return h&&(s.emissiveTextureBuffer=h),s}static buildNodes(e){let t=(e.nodes??[]).map((n,r)=>({name:n.name??`node_${r}`,parent:-1,translation:n.translation??[0,0,0],rotation:n.rotation??[0,0,0,1],scale:n.scale??[1,1,1],matrix:n.matrix?n.matrix:void 0}));return(e.nodes??[]).forEach((n,r)=>{for(let i of n.children??[]){let o=t[i];o&&(o.parent=r)}}),t}static buildAnimations(e,t,n){return(e.animations??[]).map((r,i)=>{let o=[],a=0;for(let s of r.channels){let g=r.samplers[s.sampler],l=s.target.node;if(!g||l===void 0||s.target.path==="weights")continue;let I=A.readFloats(e,t,g.input).data,u=A.readFloats(e,t,g.output).data;a=Math.max(a,I[I.length-1]??0);let E={nodeName:n[l]?.name??`node_${l}`,node:l,times:I,interpolation:g.interpolation==="STEP"?"step":g.interpolation==="CUBICSPLINE"?"cubic":"linear"};s.target.path==="translation"?E.translations=u:s.target.path==="rotation"?E.rotations=u:E.scales=u,o.push(E)}return{name:r.name??`Animation_${i}`,duration:a>0?a:1,fps:30,tracks:o}})}static buildModel(e,t,n,r){let i=(e.materials??[]).map((R,z,X)=>{let S=R.name??`material_${z}`;return X.findIndex((IA,O)=>(IA.name??`material_${O}`)===S)===z?S:`${S}#${z}`}),o={};(e.materials??[]).forEach((R,z)=>{let X=i[z];o[X]=A.buildMaterial(e,t,R,X,r)});let a=A.buildNodes(e),s=(e.skins??[]).map(R=>({joints:R.joints,inverseBindMatrices:R.inverseBindMatrices!==void 0?A.readFloats(e,t,R.inverseBindMatrices).data:Float32Array.from(R.joints.flatMap(()=>uA.identity()))})),g=A.buildAnimations(e,t,a),l=(e.nodes??[]).flatMap((R,z)=>R.mesh!==void 0?[{mesh:R.mesh,node:z,skin:R.skin}]:[]),I=l.length>0?l:(e.meshes??[]).map((R,z)=>({mesh:z})),u={name:"glTF_Model",meshes:[],materials:o,nodes:a,skins:s,animations:g,bounds:{min:[0,0,0],max:[0,0,0],center:[0,0,0],size:[0,0,0],boundingSphereRadius:0}},E=Ar(u,void 0,0),Q=1/0,C=1/0,m=1/0,h=-1/0,d=-1/0,y=-1/0,w=(R,z,X)=>{R<Q&&(Q=R),R>h&&(h=R),z<C&&(C=z),z>d&&(d=z),X<m&&(m=X),X>y&&(y=X)};for(let R of I){let z=e.meshes?.[R.mesh];z&&z.primitives.forEach((X,S)=>{if(X.attributes.POSITION===void 0||X.mode!==void 0&&X.mode!==4)return;let IA=W=>W===void 0?void 0:A.readFloats(e,t,W),O=IA(X.attributes.POSITION),V=O.count,rA=IA(X.attributes.COLOR_0),Y;if(rA){Y=new Float32Array(V*4).fill(1);for(let W=0;W<V;W++)for(let nA=0;nA<rA.itemSize;nA++)Y[W*4+nA]=rA.data[W*rA.itemSize+nA]??1}let U;if(X.indices!==void 0)U=A.readIndices(e,t,X.indices);else{U=V>65535?new Uint32Array(V):new Uint16Array(V);for(let W=0;W<V;W++)U[W]=W}let AA=R.skin!==void 0&&X.attributes.JOINTS_0!==void 0,$=!AA&&R.node!==void 0?E[R.node]:void 0;for(let W=0;W<V;W++){let nA=O.data[W*3],cA=O.data[W*3+1],oA=O.data[W*3+2];if($){let aA=uA.projectPoint($,[nA,cA,oA]);w(aA[0],aA[1],aA[2])}else w(nA,cA,oA)}u.meshes.push({id:`gltf_mesh_${R.mesh}_${S}${R.node!==void 0?`_n${R.node}`:""}`,name:z.name??`Mesh_${R.mesh}`,positions:O.data,normals:IA(X.attributes.NORMAL)?.data??new Float32Array(V*3),uvs:IA(X.attributes.TEXCOORD_0)?.data??new Float32Array(V*2),colors:Y,jointIndices:AA?IA(X.attributes.JOINTS_0)?.data:void 0,jointWeights:AA?IA(X.attributes.WEIGHTS_0)?.data:void 0,indices:U,materialName:X.material!==void 0?i[X.material]:void 0,node:R.node,skin:AA?R.skin:void 0})})}for(let R of s)if(R.joints.length>Me)throw new Error(`glTF skin has ${R.joints.length} joints; the mesh shader holds ${Me}`);Number.isFinite(Q)||(Q=C=m=0,h=d=y=0);let G=Math.max(h-Q,d-C,y-m,1e-4),x=n.normalizeSize&&n.normalizeSize>0?n.normalizeSize/G:1,b=typeof n.scale=="number"?[n.scale,n.scale,n.scale]:n.scale??[1,1,1],F=[x*b[0],x*b[1],x*b[2]],k=n.center?[(Q+h)*.5,(C+d)*.5,(m+y)*.5]:[0,0,0];u.rootTransform=uA.multiply(uA.scale(F[0],F[1],F[2]),uA.translate(-k[0],-k[1],-k[2]));let H=[(Q-k[0])*F[0],(C-k[1])*F[1],(m-k[2])*F[2]],_=[(h-k[0])*F[0],(d-k[1])*F[1],(y-k[2])*F[2]];return u.bounds={min:H,max:_,center:[(H[0]+_[0])*.5,(H[1]+_[1])*.5,(H[2]+_[2])*.5],size:[_[0]-H[0],_[1]-H[1],_[2]-H[2]],boundingSphereRadius:Math.hypot(_[0]-H[0],_[1]-H[1],_[2]-H[2])*.5},u}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=pA.readFileSync(n),i=TA.dirname(n);return A.parse(r,t,i)}return A.parse(e,t)}};function At(A,e={}){return ae.load(A,e)}function tr(A,e={}){return ae.load(A,e)}T();var vi=[[0,0,0,0],...Array.from({length:255},(A,e)=>{let t=(e+1)/256;return[t,t,t,1]})],Ge=class A{static isVox(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<8?!1:new TextDecoder("ascii").decode(t.subarray(0,4))==="VOX "}static parse(e,t={}){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(new TextDecoder("ascii").decode(n.subarray(0,4))!=="VOX ")throw new Error("Invalid VOX file: magic mismatch");let o=8,a=16,s=16,g=16,l=[],I=[...vi];for(;o+12<=n.byteLength;){let u=new TextDecoder("ascii").decode(n.subarray(o,o+4)),E=r.getUint32(o+4,!0);o+=12;let Q=o;if(u==="SIZE")a=r.getUint32(Q,!0),s=r.getUint32(Q+4,!0),g=r.getUint32(Q+8,!0);else if(u==="XYZI"){let C=r.getUint32(Q,!0),m=Q+4;for(let h=0;h<C&&!(m+4>n.byteLength);h++){let d=r.getUint8(m),y=r.getUint8(m+1),w=r.getUint8(m+2),G=r.getUint8(m+3);m+=4,l.push({x:d,y,z:w,colorIndex:G})}}else if(u==="RGBA")for(let C=0;C<256;C++){let m=Q+C*4;if(m+4>n.byteLength)break;let h=r.getUint8(m)/255,d=r.getUint8(m+1)/255,y=r.getUint8(m+2)/255,w=r.getUint8(m+3)/255,G=C===255?0:C+1;I[G]=[h,d,y,w]}o+=E}return A.buildModel(l,I,a,s,g,t)}static buildModel(e,t,n,r,i,o){let a=new Set;e.forEach(v=>a.add(`${v.x},${v.y},${v.z}`));let s=[],g=[],l=[],I=[],u=[],E=(v,sA,eA,gA,j,M)=>{let P=s.length/3;s.push(...v,...sA,...eA,...gA),g.push(...j,...j,...j,...j),l.push(...M,...M,...M,...M),I.push(0,0,1,0,1,1,0,1),u.push(P,P+1,P+2,P,P+2,P+3)};for(let v of e){let{x:sA,y:eA,z:gA,colorIndex:j}=v,M=t[j]??[.8,.8,.8,1],P=sA,Z=-gA,iA=eA;a.has(`${sA+1},${eA},${gA}`)||E([P+1,Z,iA],[P+1,Z-1,iA],[P+1,Z-1,iA+1],[P+1,Z,iA+1],[1,0,0],M),a.has(`${sA-1},${eA},${gA}`)||E([P,Z,iA+1],[P,Z-1,iA+1],[P,Z-1,iA],[P,Z,iA],[-1,0,0],M),a.has(`${sA},${eA},${gA+1}`)||E([P,Z-1,iA],[P+1,Z-1,iA],[P+1,Z-1,iA+1],[P,Z-1,iA+1],[0,-1,0],M),a.has(`${sA},${eA},${gA-1}`)||E([P,Z,iA+1],[P+1,Z,iA+1],[P+1,Z,iA],[P,Z,iA],[0,1,0],M),a.has(`${sA},${eA+1},${gA}`)||E([P+1,Z,iA+1],[P+1,Z-1,iA+1],[P,Z-1,iA+1],[P,Z,iA+1],[0,0,1],M),a.has(`${sA},${eA-1},${gA}`)||E([P,Z,iA],[P,Z-1,iA],[P+1,Z-1,iA],[P+1,Z,iA],[0,0,-1],M)}let Q=1/0,C=1/0,m=1/0,h=-1/0,d=-1/0,y=-1/0;for(let v=0;v<s.length;v+=3){let sA=s[v],eA=s[v+1],gA=s[v+2];sA<Q&&(Q=sA),sA>h&&(h=sA),eA<C&&(C=eA),eA>d&&(d=eA),gA<m&&(m=gA),gA>y&&(y=gA)}Number.isFinite(Q)||(Q=C=m=0,h=d=y=0);let w=(Q+h)*.5,G=(C+d)*.5,x=(m+y)*.5,b=h-Q,F=d-C,k=y-m,H=Math.max(b,F,k,1e-4),_=1;o.normalizeSize&&o.normalizeSize>0&&(_=o.normalizeSize/H);let R=_,z=_,X=_;typeof o.scale=="number"?(R*=o.scale,z*=o.scale,X*=o.scale):Array.isArray(o.scale)&&(R*=o.scale[0],z*=o.scale[1],X*=o.scale[2]);let S=o.center?w:0,IA=o.center?G:0,O=o.center?x:0,V=new Float32Array(s.length);for(let v=0;v<s.length;v+=3)V[v]=(s[v]-S)*R,V[v+1]=(s[v+1]-IA)*z,V[v+2]=(s[v+2]-O)*X;let Y=V.length/3>65535?new Uint32Array(u):new Uint16Array(u),U={name:"vox_default",diffuseColor:[1,1,1,1],shininess:32,specularIntensity:.4,...o.defaultMaterial},AA=[{id:"vox_mesh_0",name:"vox_geometry",positions:V,normals:new Float32Array(g),uvs:new Float32Array(I),colors:new Float32Array(l),indices:Y,materialName:"vox_default"}],$=(Q-S)*R,W=(C-IA)*z,nA=(m-O)*X,cA=(h-S)*R,oA=(d-IA)*z,aA=(y-O)*X;return{name:"VOX_Model",meshes:AA,materials:{vox_default:U},animations:[],bounds:{min:[$,W,nA],max:[cA,oA,aA],center:[($+cA)*.5,(W+oA)*.5,(nA+aA)*.5],size:[cA-$,oA-W,aA-nA],boundingSphereRadius:Math.hypot(cA-$,oA-W,aA-nA)*.5}}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=pA.readFileSync(n);return A.parse(r,t)}throw new Error("VOX files must be binary buffers or local file paths")}};function et(A,e={}){return Ge.load(A,e)}T();var Ht=19789,Ri=15677,Li=16384,ki=16640,Pi=16656,Hi=16672,Ti=16704,Ji=45055,Oi=40960,Ki=40992,Yi=16,Vi=17,Fe=class A{static is3DS(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<6?!1:new DataView(t.buffer,t.byteOffset,t.byteLength).getUint16(0,!0)===Ht}static parse(e,t={}){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(r.getUint16(0,!0)!==Ht)throw new Error("Invalid 3DS file: 0x4D4D magic mismatch");let o=[],a={};return A.readChunk(r,0,n.byteLength,o,a),A.buildModel(o,a,t)}static readChunk(e,t,n,r,i,o="Object"){let a=t;for(;a+6<=n&&a+6<=e.byteLength;){let s=e.getUint16(a,!0),g=e.getUint32(a+2,!0);if(g<6)break;let l=a+g,I=a+6,u=Math.min(l,n,e.byteLength);switch(s){case Ht:case Ri:A.readChunk(e,I,u,r,i,o);break;case Li:{let E=I;for(;E<u&&e.getUint8(E)!==0;)E++;let Q=new Uint8Array(e.buffer,e.byteOffset+I,E-I),C=new TextDecoder("ascii").decode(Q)||"Object";A.readChunk(e,E+1,u,r,i,C);break}case ki:{let E={name:o,positions:[],indices:[],uvs:[]};A.readTriMesh(e,I,u,E,i),E.positions.length>0&&E.indices.length>0&&r.push(E);break}case Ji:A.readMaterial(e,I,u,i);break;default:break}a=l}}static readTriMesh(e,t,n,r,i){let o=t;for(;o+6<=n;){let a=e.getUint16(o,!0),s=e.getUint32(o+2,!0);if(s<6)break;let g=o+s,l=o+6;if(a===Pi){let I=e.getUint16(l,!0),u=l+2;for(let E=0;E<I&&!(u+12>n);E++){let Q=e.getFloat32(u,!0),C=e.getFloat32(u+4,!0),m=e.getFloat32(u+8,!0);r.positions.push(Q,C,m),u+=12}}else if(a===Hi){let I=e.getUint16(l,!0),u=l+2;for(let E=0;E<I&&!(u+8>n);E++){let Q=e.getUint16(u,!0),C=e.getUint16(u+2,!0),m=e.getUint16(u+4,!0);r.indices.push(Q,C,m),u+=8}}else if(a===Ti){let I=e.getUint16(l,!0),u=l+2;for(let E=0;E<I&&!(u+8>n);E++){let Q=e.getFloat32(u,!0),C=e.getFloat32(u+4,!0);r.uvs.push(Q,1-C),u+=8}}o=g}}static readMaterial(e,t,n,r){let i=t,o="Material",a=[.8,.8,.8,1];for(;i+6<=n;){let s=e.getUint16(i,!0),g=e.getUint32(i+2,!0);if(g<6)break;let l=i+g,I=i+6;if(s===Oi){let u=I;for(;u<l&&e.getUint8(u)!==0;)u++;let E=new Uint8Array(e.buffer,e.byteOffset+I,u-I);o=new TextDecoder("ascii").decode(E)||o}else if(s===Ki&&I+6<=l){let u=e.getUint16(I,!0);if(u===Yi&&I+18<=l){let E=e.getFloat32(I+6,!0),Q=e.getFloat32(I+10,!0),C=e.getFloat32(I+14,!0);a=[E,Q,C,1]}else if(u===Vi&&I+9<=l){let E=e.getUint8(I+6)/255,Q=e.getUint8(I+7)/255,C=e.getUint8(I+8)/255;a=[E,Q,C,1]}}i=l}r[o]={name:o,diffuseColor:a,shininess:32,specularIntensity:.5}}static buildModel(e,t,n){let r=1/0,i=1/0,o=1/0,a=-1/0,s=-1/0,g=-1/0;for(let S of e)for(let IA=0;IA<S.positions.length;IA+=3){let O=S.positions[IA],V=S.positions[IA+1],rA=S.positions[IA+2];O<r&&(r=O),O>a&&(a=O),V<i&&(i=V),V>s&&(s=V),rA<o&&(o=rA),rA>g&&(g=rA)}Number.isFinite(r)||(r=i=o=0,a=s=g=0);let l=(r+a)*.5,I=(i+s)*.5,u=(o+g)*.5,E=a-r,Q=s-i,C=g-o,m=Math.max(E,Q,C,1e-4),h=1;n.normalizeSize&&n.normalizeSize>0&&(h=n.normalizeSize/m);let d=h,y=h,w=h;typeof n.scale=="number"?(d*=n.scale,y*=n.scale,w*=n.scale):Array.isArray(n.scale)&&(d*=n.scale[0],y*=n.scale[1],w*=n.scale[2]);let G=n.center?l:0,x=n.center?I:0,b=n.center?u:0,F=e.map((S,IA)=>{let O=new Float32Array(S.positions.length);for(let AA=0;AA<S.positions.length;AA+=3)O[AA]=(S.positions[AA]-G)*d,O[AA+1]=(S.positions[AA+1]-x)*y,O[AA+2]=(S.positions[AA+2]-b)*w;let V=new Float32Array(S.positions.length);for(let AA=0;AA<S.indices.length;AA+=3){let $=S.indices[AA],W=S.indices[AA+1],nA=S.indices[AA+2],cA=[O[$*3],O[$*3+1],O[$*3+2]],oA=[O[W*3],O[W*3+1],O[W*3+2]],aA=[O[nA*3],O[nA*3+1],O[nA*3+2]],v=L.subtract(oA,cA),sA=L.subtract(aA,cA),eA=L.cross(v,sA);V[$*3]+=eA[0],V[$*3+1]+=eA[1],V[$*3+2]+=eA[2],V[W*3]+=eA[0],V[W*3+1]+=eA[1],V[W*3+2]+=eA[2],V[nA*3]+=eA[0],V[nA*3+1]+=eA[1],V[nA*3+2]+=eA[2]}for(let AA=0;AA<V.length;AA+=3){let $=V[AA],W=V[AA+1],nA=V[AA+2],cA=Math.hypot($,W,nA)||1;V[AA]=$/cA,V[AA+1]=W/cA,V[AA+2]=nA/cA}let rA=S.uvs.length===S.positions.length/3*2?new Float32Array(S.uvs):new Float32Array(S.positions.length/3*2),U=O.length/3>65535?new Uint32Array(S.indices):new Uint16Array(S.indices);return{id:`3ds_mesh_${IA}`,name:S.name,positions:O,normals:V,uvs:rA,indices:U,materialName:S.materialName}}),k=(r-G)*d,H=(i-x)*y,_=(o-b)*w,R=(a-G)*d,z=(s-x)*y,X=(g-b)*w;return{name:"3DS_Model",meshes:F,materials:t,animations:[],bounds:{min:[k,H,_],max:[R,z,X],center:[(k+R)*.5,(H+z)*.5,(_+X)*.5],size:[R-k,z-H,X-_],boundingSphereRadius:Math.hypot(R-k,z-H,X-_)*.5}}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=pA.readFileSync(n);return A.parse(r,t)}throw new Error("3DS files must be binary buffers or local file paths")}};function tt(A,e={}){return Fe.load(A,e)}T();var Tt=class A{static parse(e,t={}){let r=(typeof e=="string"?e:new TextDecoder("utf-8").decode(e instanceof Uint8Array?e:new Uint8Array(e))).split(/\r?\n/),i=0;for(;i<r.length&&(!r[i].trim()||r[i].trim().startsWith("#"));)i++;if(i>=r.length)throw new Error("Empty OFF file");let o=r[i++].trim(),a=!1,s=!1;if(o.startsWith("NOFF")||o.startsWith("STOFF"))a=!0;else if(o.startsWith("COFF"))s=!0;else if(!o.startsWith("OFF"))throw new Error("Invalid OFF header: missing 'OFF'");o=o.replace(/^(?:ST|CO|NO|C|N)?OFF\s*/i,"").trim();let g=0,l=0;if(o.length>0){let j=o.split(/\s+/);g=Number.parseInt(j[0]??"0",10),l=Number.parseInt(j[1]??"0",10)}else for(;i<r.length;){let j=r[i++].trim();if(!j||j.startsWith("#"))continue;let M=j.split(/\s+/);g=Number.parseInt(M[0]??"0",10),l=Number.parseInt(M[1]??"0",10);break}let I=[],u=[],E=[],Q=[],C=[],m=0;for(;i<r.length&&m<g;){let j=r[i++].trim();if(!j||j.startsWith("#"))continue;let M=j.split(/\s+/),P=Number.parseFloat(M[0]??"0")||0,Z=Number.parseFloat(M[1]??"0")||0,iA=Number.parseFloat(M[2]??"0")||0;I.push(P,Z,iA);let QA=3;if(a){let fA=Number.parseFloat(M[QA]??"0")||0,CA=Number.parseFloat(M[QA+1]??"0")||0,mA=Number.parseFloat(M[QA+2]??"0")||0;u.push(fA,CA,mA),QA+=3}else u.push(0,0,0);if(s&&M.length>QA){let fA=(Number.parseFloat(M[QA]??"255")||0)/(Number.parseFloat(M[QA]??"255")>1?255:1),CA=(Number.parseFloat(M[QA+1]??"255")||0)/(Number.parseFloat(M[QA+1]??"255")>1?255:1),mA=(Number.parseFloat(M[QA+2]??"255")||0)/(Number.parseFloat(M[QA+2]??"255")>1?255:1),dA=M.length>QA+3&&Number.parseFloat(M[QA+3]??"1")||1;E.push(fA,CA,mA,dA)}Q.push(0,0),m++}let h=0;for(;i<r.length&&h<l;){let j=r[i++].trim();if(!j||j.startsWith("#"))continue;let M=j.split(/\s+/),P=Number.parseInt(M[0]??"0",10);if(P>=3){let Z=Number.parseInt(M[1]??"0",10);for(let iA=1;iA<P-1;iA++){let QA=Number.parseInt(M[iA+1]??"0",10),fA=Number.parseInt(M[iA+2]??"0",10);C.push(Z,QA,fA)}}h++}if(!a||t.smoothNormals){for(let j=0;j<C.length;j+=3){let M=C[j],P=C[j+1],Z=C[j+2],iA=[I[M*3],I[M*3+1],I[M*3+2]],QA=[I[P*3],I[P*3+1],I[P*3+2]],fA=[I[Z*3],I[Z*3+1],I[Z*3+2]],CA=L.subtract(QA,iA),mA=L.subtract(fA,iA),dA=L.cross(CA,mA);u[M*3]+=dA[0],u[M*3+1]+=dA[1],u[M*3+2]+=dA[2],u[P*3]+=dA[0],u[P*3+1]+=dA[1],u[P*3+2]+=dA[2],u[Z*3]+=dA[0],u[Z*3+1]+=dA[1],u[Z*3+2]+=dA[2]}for(let j=0;j<u.length;j+=3){let M=u[j],P=u[j+1],Z=u[j+2],iA=Math.hypot(M,P,Z)||1;u[j]=M/iA,u[j+1]=P/iA,u[j+2]=Z/iA}}let d=1/0,y=1/0,w=1/0,G=-1/0,x=-1/0,b=-1/0;for(let j=0;j<I.length;j+=3){let M=I[j],P=I[j+1],Z=I[j+2];M<d&&(d=M),M>G&&(G=M),P<y&&(y=P),P>x&&(x=P),Z<w&&(w=Z),Z>b&&(b=Z)}Number.isFinite(d)||(d=y=w=0,G=x=b=0);let F=(d+G)*.5,k=(y+x)*.5,H=(w+b)*.5,_=G-d,R=x-y,z=b-w,X=Math.max(_,R,z,1e-4),S=1;t.normalizeSize&&t.normalizeSize>0&&(S=t.normalizeSize/X);let IA=S,O=S,V=S;typeof t.scale=="number"?(IA*=t.scale,O*=t.scale,V*=t.scale):Array.isArray(t.scale)&&(IA*=t.scale[0],O*=t.scale[1],V*=t.scale[2]);let rA=t.center?F:0,Y=t.center?k:0,U=t.center?H:0,AA=new Float32Array(I.length);for(let j=0;j<I.length;j+=3)AA[j]=(I[j]-rA)*IA,AA[j+1]=(I[j+1]-Y)*O,AA[j+2]=(I[j+2]-U)*V;let W=AA.length/3>65535?new Uint32Array(C):new Uint16Array(C),nA={name:"off_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...t.defaultMaterial},cA=[{id:"off_mesh_0",name:"off_geometry",positions:AA,normals:new Float32Array(u),uvs:new Float32Array(Q),colors:s?new Float32Array(E):void 0,indices:W,materialName:"off_default"}],oA=(d-rA)*IA,aA=(y-Y)*O,v=(w-U)*V,sA=(G-rA)*IA,eA=(x-Y)*O,gA=(b-U)*V;return{name:"OFF_Model",meshes:cA,materials:{off_default:nA},animations:[],bounds:{min:[oA,aA,v],max:[sA,eA,gA],center:[(oA+sA)*.5,(aA+eA)*.5,(v+gA)*.5],size:[sA-oA,eA-aA,gA-v],boundingSphereRadius:Math.hypot(sA-oA,eA-aA,gA-v)*.5}}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=pA.readFileSync(n,"utf-8");return A.parse(r,t)}return A.parse(e,t)}};function nt(A,e={}){return Tt.load(A,e)}T();var nr=`
144
+ struct CameraUniforms {
145
+ viewMatrix : mat4x4<f32>,
146
+ projMatrix : mat4x4<f32>,
147
+ viewProjMatrix : mat4x4<f32>,
148
+ invViewProjMatrix : mat4x4<f32>,
149
+ cameraPos : vec4<f32>, // xyz = eye, w = near
150
+ cameraDir : vec4<f32>, // xyz = forward, w = far
151
+ dofParams : vec4<f32>, // x = focusDistance, y = fStop, z = maxBlurRadius, w = dofEnabled
152
+ screenParams : vec4<f32>, // x = surfaceWidth, y = surfaceHeight, z = time, w = unused
153
+ };
154
+
155
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
156
+ @group(0) @binding(1) var samp : sampler;
157
+ @group(0) @binding(2) var colorTex : texture_2d<f32>;
158
+ @group(0) @binding(3) var depthTex : texture_2d<f32>;
159
+
160
+ struct VSOut {
161
+ @builtin(position) pos : vec4<f32>,
162
+ @location(0) uv : vec2<f32>,
163
+ };
164
+
165
+ @vertex
166
+ fn vs_fullscreen(@builtin(vertex_index) vid : u32) -> VSOut {
167
+ var out: VSOut;
168
+ // Fullscreen triangle covering [-1, 1] NDC
169
+ var coord = vec2<f32>(-1.0, -1.0);
170
+ if (vid == 1u) {
171
+ coord = vec2<f32>(3.0, -1.0);
172
+ } else if (vid == 2u) {
173
+ coord = vec2<f32>(-1.0, 3.0);
174
+ }
175
+ out.pos = vec4<f32>(coord, 0.0, 1.0);
176
+ out.uv = coord * 0.5 + 0.5;
177
+ out.uv.y = 1.0 - out.uv.y; // Flip Y for texture coordinates
178
+ return out;
179
+ }
180
+
181
+ fn computeCoC(depth: f32) -> f32 {
182
+ let focusDist = cam.dofParams.x;
183
+ let maxBlur = cam.dofParams.z;
184
+ if (focusDist <= 0.0 || maxBlur <= 0.0) {
185
+ return 0.0;
186
+ }
187
+ let delta = abs(depth - focusDist);
188
+ // Smooth non-linear ramp around focus plane
189
+ return clamp((delta / (focusDist * 0.5 + 1.0)) * maxBlur, 0.0, maxBlur);
190
+ }
191
+
192
+ @fragment
193
+ fn fs_dof(in: VSOut) -> @location(0) vec4<f32> {
194
+ let centerColor = textureSampleLevel(colorTex, samp, in.uv, 0.0);
195
+ let centerDepth = textureSampleLevel(depthTex, samp, in.uv, 0.0).r;
196
+ let coc = computeCoC(centerDepth);
197
+
198
+ // Skip if DoF is disabled or blur is negligible
199
+ if (cam.dofParams.w < 0.5 || coc < 0.5) {
200
+ return centerColor;
201
+ }
202
+
203
+ var accumColor = centerColor;
204
+ var totalWeight = 1.0;
205
+
206
+ let NUM_SAMPLES = 24;
207
+ let GOLDEN_ANGLE = 2.39996323;
208
+ let texelSize = 1.0 / cam.screenParams.xy;
209
+
210
+ for (var i = 1; i <= NUM_SAMPLES; i = i + 1) {
211
+ let theta = f32(i) * GOLDEN_ANGLE;
212
+ let r = sqrt(f32(i) / f32(NUM_SAMPLES)) * coc;
213
+ let offset = vec2<f32>(cos(theta), sin(theta)) * r * texelSize;
214
+
215
+ let sampleUV = in.uv + offset;
216
+ let sampleColor = textureSampleLevel(colorTex, samp, sampleUV, 0.0);
217
+ let sampleDepth = textureSampleLevel(depthTex, samp, sampleUV, 0.0).r;
218
+ let sampleCoC = computeCoC(sampleDepth);
219
+
220
+ // Depth-aware bilateral rejection: prevent background bleed onto sharp foreground
221
+ let depthDiff = sampleDepth - centerDepth;
222
+ let weight = select(
223
+ smoothstep(-10.0, 0.0, depthDiff) * clamp(sampleCoC / coc, 0.2, 1.0),
224
+ 1.0,
225
+ depthDiff >= 0.0
226
+ );
227
+
228
+ accumColor = accumColor + sampleColor * weight;
229
+ totalWeight = totalWeight + weight;
230
+ }
231
+
232
+ return accumColor / totalWeight;
233
+ }
234
+ `;T();var Wi=`
235
+ struct BloomUniforms {
236
+ texel : vec2<f32>, // 1 / source size
237
+ threshold : f32,
238
+ knee : f32,
239
+ intensity : f32,
240
+ mode : f32,
241
+ _pad : vec2<f32>,
242
+ tint : vec4<f32>,
243
+ };
244
+
245
+ @group(0) @binding(0) var<uniform> u : BloomUniforms;
246
+ @group(0) @binding(1) var samp : sampler;
247
+ @group(0) @binding(2) var src : texture_2d<f32>;
248
+ @group(0) @binding(3) var base : texture_2d<f32>;
249
+
250
+ struct VsOut {
251
+ @builtin(position) pos : vec4<f32>,
252
+ @location(0) uv : vec2<f32>,
253
+ };
254
+
255
+ @vertex
256
+ fn vs(@builtin(vertex_index) i : u32) -> VsOut {
257
+ let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
258
+ var o : VsOut;
259
+ o.pos = vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
260
+ o.uv = vec2<f32>(p.x, 1.0 - p.y);
261
+ return o;
262
+ }
263
+
264
+ fn s(uv : vec2<f32>) -> vec3<f32> {
265
+ return textureSampleLevel(src, samp, uv, 0.0).rgb;
266
+ }
267
+
268
+ // Jimenez's 13-tap downsample (Call of Duty: AW): stable, no fireflies.
269
+ fn down13(uv : vec2<f32>) -> vec3<f32> {
270
+ let t = u.texel;
271
+ let a = s(uv + t * vec2<f32>(-2.0, -2.0));
272
+ let b = s(uv + t * vec2<f32>(0.0, -2.0));
273
+ let c = s(uv + t * vec2<f32>(2.0, -2.0));
274
+ let d = s(uv + t * vec2<f32>(-2.0, 0.0));
275
+ let e = s(uv);
276
+ let f = s(uv + t * vec2<f32>(2.0, 0.0));
277
+ let g = s(uv + t * vec2<f32>(-2.0, 2.0));
278
+ let h = s(uv + t * vec2<f32>(0.0, 2.0));
279
+ let i = s(uv + t * vec2<f32>(2.0, 2.0));
280
+ let j = s(uv + t * vec2<f32>(-1.0, -1.0));
281
+ let k = s(uv + t * vec2<f32>(1.0, -1.0));
282
+ let l = s(uv + t * vec2<f32>(-1.0, 1.0));
283
+ let m = s(uv + t * vec2<f32>(1.0, 1.0));
284
+ return e * 0.125 + (a + c + g + i) * 0.03125 + (b + d + f + h) * 0.0625 + (j + k + l + m) * 0.125;
285
+ }
286
+
287
+ // Soft-knee threshold (keeps hue, fades in below the threshold).
288
+ fn prefilter(c : vec3<f32>) -> vec3<f32> {
289
+ let br = max(c.r, max(c.g, c.b));
290
+ let kneeW = u.threshold * u.knee + 1e-4;
291
+ var soft = clamp(br - u.threshold + kneeW, 0.0, 2.0 * kneeW);
292
+ soft = soft * soft / (4.0 * kneeW);
293
+ let w = max(soft, br - u.threshold) / max(br, 1e-4);
294
+ return c * max(w, 0.0);
295
+ }
296
+
297
+ fn srgbToLinear(c : vec3<f32>) -> vec3<f32> {
298
+ let lo = c / 12.92;
299
+ let hi = pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4));
300
+ return select(hi, lo, c <= vec3<f32>(0.04045));
301
+ }
302
+
303
+ fn linearToSrgb(c : vec3<f32>) -> vec3<f32> {
304
+ let x = clamp(c, vec3<f32>(0.0), vec3<f32>(1.0));
305
+ let lo = x * 12.92;
306
+ let hi = 1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055;
307
+ return select(hi, lo, x <= vec3<f32>(0.0031308));
308
+ }
309
+
310
+ // mode 0: the source is linear scene radiance; mode 1: display-encoded color.
311
+ @fragment
312
+ fn fs_prefilter(in : VsOut) -> @location(0) vec4<f32> {
313
+ var c = down13(in.uv);
314
+ if (u.mode > 0.5) {
315
+ c = srgbToLinear(c);
316
+ }
317
+ return vec4<f32>(prefilter(c), 1.0);
318
+ }
319
+
320
+ @fragment
321
+ fn fs_down(in : VsOut) -> @location(0) vec4<f32> {
322
+ return vec4<f32>(down13(in.uv), 1.0);
323
+ }
324
+
325
+ // 3x3 tent upsample; added onto the next-larger level by the blend state.
326
+ @fragment
327
+ fn fs_up(in : VsOut) -> @location(0) vec4<f32> {
328
+ let t = u.texel;
329
+ var c = s(in.uv) * 4.0;
330
+ c += (s(in.uv + vec2<f32>(-t.x, 0.0)) + s(in.uv + vec2<f32>(t.x, 0.0)) + s(in.uv + vec2<f32>(0.0, -t.y)) + s(in.uv + vec2<f32>(0.0, t.y))) * 2.0;
331
+ c += s(in.uv + vec2<f32>(-t.x, -t.y)) + s(in.uv + vec2<f32>(t.x, -t.y)) + s(in.uv + vec2<f32>(-t.x, t.y)) + s(in.uv + vec2<f32>(t.x, t.y));
332
+ return vec4<f32>(c / 16.0, 1.0);
333
+ }
334
+
335
+ // Adds the glow in linear light over the premultiplied display image.
336
+ @fragment
337
+ fn fs_composite(in : VsOut) -> @location(0) vec4<f32> {
338
+ let orig = textureSampleLevel(base, samp, in.uv, 0.0);
339
+ let glow = max(textureSampleLevel(src, samp, in.uv, 0.0).rgb * u.intensity * u.tint.rgb, vec3<f32>(0.0));
340
+ var lin = vec3<f32>(0.0);
341
+ if (orig.a > 0.0001) {
342
+ lin = srgbToLinear(orig.rgb / orig.a) * orig.a;
343
+ }
344
+ let sum = lin + glow;
345
+ let a = clamp(max(orig.a, max(glow.r, max(glow.g, glow.b))), 0.0, 1.0);
346
+ if (a <= 0.0001) {
347
+ return vec4<f32>(0.0);
348
+ }
349
+ return vec4<f32>(linearToSrgb(sum / a) * a, a);
350
+ }
351
+ `,Jt="rgba16float",rt=class{device;layout;prefilterPipe;downPipe;upPipe;compositePipes=new Map;module;pipelineLayout;sampler;mips=[];mipKey="";placeholder;uniformPool=new GA(48,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);constructor(e){this.device=e,this.module=e.createShaderModule({label:"bloom.wgsl",code:Wi}),this.layout=e.createBindGroupLayout({label:"BloomLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.pipelineLayout=e.createPipelineLayout({bindGroupLayouts:[this.layout]});let t=(n,r)=>e.createRenderPipeline({label:`Bloom:${n}`,layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:n,targets:[{format:Jt,...r&&{blend:{color:{srcFactor:"one",dstFactor:"one",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one",operation:"add"}}}}]},primitive:{topology:"triangle-list"}});this.prefilterPipe=t("fs_prefilter",!1),this.downPipe=t("fs_down",!1),this.upPipe=t("fs_up",!0),this.sampler=e.createSampler({label:"BloomSampler",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.placeholder=e.createTexture({size:{width:1,height:1},format:Jt,usage:GPUTextureUsage.TEXTURE_BINDING})}compositePipe(e){let t=this.compositePipes.get(e);return t||(t=this.device.createRenderPipeline({label:"Bloom:composite",layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:"fs_composite",targets:[{format:e}]},primitive:{topology:"triangle-list"}}),this.compositePipes.set(e,t)),t}ensureMips(e,t,n){let r=`${e}x${t}x${n}`;if(r===this.mipKey)return;for(let a of this.mips)a.destroy();this.mips=[];let i=e,o=t;for(let a=0;a<n&&(i=Math.max(1,Math.floor(i/2)),o=Math.max(1,Math.floor(o/2)),this.mips.push(this.device.createTexture({label:`BloomMip${a}`,size:{width:i,height:o},format:Jt,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),!(i===1&&o===1));a++);this.mipKey=r}uniforms(e,t,n){let r=new Float32Array([e,t,n.threshold,n.knee,n.intensity,n.mode,0,0,n.tint[0],n.tint[1],n.tint[2],1]);return this.uniformPool.getBuffer(this.device,r)}pass(e,t,n,r,i,o,a){let s=this.device.createBindGroup({layout:this.layout,entries:[{binding:0,resource:{buffer:o}},{binding:1,resource:this.sampler},{binding:2,resource:r.createView()},{binding:3,resource:i.createView()}]}),g=e.beginRenderPass({colorAttachments:[{view:n,loadOp:a,storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});g.setPipeline(t),g.setBindGroup(0,s),g.draw(3),g.end()}apply(e,t,n,r={},i){let o=!i,a=Q=>Q<=.04045?Q/12.92:((Q+.055)/1.055)**2.4,s=r.threshold??(o?.85:2.5),g={intensity:r.intensity??.2,threshold:o?a(s):s,knee:r.knee??.4,tint:r.tint??[1,1,1],mode:o?1:0},l=Math.max(1,Math.min(8,Math.round(r.radius??6)));this.ensureMips(t.width,t.height,l);let I=this.mips,u=(Q,C)=>this.uniforms(1/Q,1/C,g),E=i??t;this.pass(e,this.prefilterPipe,I[0].createView(),E,this.placeholder,u(E.width,E.height),"clear");for(let Q=1;Q<I.length;Q++){let C=I[Q-1];this.pass(e,this.downPipe,I[Q].createView(),C,this.placeholder,u(C.width,C.height),"clear")}for(let Q=I.length-1;Q>0;Q--){let C=I[Q];this.pass(e,this.upPipe,I[Q-1].createView(),C,this.placeholder,u(C.width,C.height),"load")}this.pass(e,this.compositePipe(n.format),n.createView(),I[0],t,u(I[0].width,I[0].height),"clear")}resetPools(){this.uniformPool.reset()}destroy(){for(let e of this.mips)e.destroy();this.placeholder.destroy(),this.uniformPool.destroy()}};T();T();T();var se=`
352
+ struct CameraUniforms {
353
+ viewMatrix : mat4x4<f32>,
354
+ projMatrix : mat4x4<f32>,
355
+ viewProjMatrix : mat4x4<f32>,
356
+ invViewProjMatrix : mat4x4<f32>,
357
+ cameraPos : vec4<f32>, // xyz = eye, w = near
358
+ cameraDir : vec4<f32>, // xyz = forward, w = far
359
+ dofParams : vec4<f32>, // x = focusDistance, y = fStop, z = maxBlurRadius, w = dofEnabled
360
+ screenParams : vec4<f32>, // x = surfaceWidth, y = surfaceHeight, z = time, w = unused
361
+ };
362
+
363
+ struct GPULight {
364
+ posType : vec4<f32>, // xyz = position, w = type (0=ambient, 1=directional, 2=point, 3=spot)
365
+ dirRadius : vec4<f32>, // xyz = normalized direction, w = radius / range
366
+ colorIntensity : vec4<f32>, // rgb = sRGB color, w = intensity
367
+ spotParams : vec4<f32>, // x = cos(outer), y = cos(inner), z = decay, w = unused
368
+ };
369
+
370
+ struct LightsUniforms {
371
+ ambientColor : vec4<f32>, // rgb = ambient color * intensity (sRGB), w = unused
372
+ params : vec4<f32>, // x = numLights, y = hasLights, z = physical (1), w = tone mapping (0 none, 1 ACES, 2 AgX, 3 PBR Neutral)
373
+ lights : array<GPULight, 8>,
374
+ // Appended after the original layout so older readers of the prefix still line up.
375
+ ambientLinear : vec4<f32>, // rgb = ambient irradiance (linear), w = exposure multiplier
376
+ envTop : vec4<f32>, // rgb = sky radiance (linear), w = environment rotation (rad)
377
+ envHorizon : vec4<f32>, // rgb = horizon radiance, w = softbox strength
378
+ envBottom : vec4<f32>, // rgb = ground radiance, w = environment enabled
379
+ fog : vec4<f32>, // rgb = fog color (display linear), w = enabled
380
+ fogRange : vec4<f32>, // x = start distance, y = full distance, z = max opacity, w = unused
381
+ shadowParams : vec4<f32>, // x = enabled, y = shadowed light index, z = softness (texels), w = map size
382
+ shadowBias : vec4<f32>, // x = depth bias, y = normal offset (world px), z = darkness 0..1, w = unused
383
+ shadowMatrix : mat4x4<f32>,
384
+ };
385
+
386
+ const PI = 3.14159265359;
387
+
388
+ fn srgbToLinear(c: vec3<f32>) -> vec3<f32> {
389
+ let lo = c / 12.92;
390
+ let hi = pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4));
391
+ return select(hi, lo, c <= vec3<f32>(0.04045));
392
+ }
393
+
394
+ fn linearToSrgb(c: vec3<f32>) -> vec3<f32> {
395
+ let x = clamp(c, vec3<f32>(0.0), vec3<f32>(1.0));
396
+ let lo = x * 12.92;
397
+ let hi = 1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055;
398
+ return select(hi, lo, x <= vec3<f32>(0.0031308));
399
+ }
400
+
401
+ // \u2500\u2500 Tone mapping (linear scene \u2192 linear display, 0..1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
402
+
403
+ fn rrtAndOdtFit(v: vec3<f32>) -> vec3<f32> {
404
+ let a = v * (v + 0.0245786) - 0.000090537;
405
+ let b = v * (0.983729 * v + 0.4329510) + 0.238081;
406
+ return a / b;
407
+ }
408
+
409
+ // Stephen Hill's fitted ACES (RRT + sRGB ODT).
410
+ fn toneMapAces(c: vec3<f32>) -> vec3<f32> {
411
+ let x = c / 0.6;
412
+ var v = vec3<f32>(
413
+ dot(vec3<f32>(0.59719, 0.35458, 0.04823), x),
414
+ dot(vec3<f32>(0.07600, 0.90834, 0.01566), x),
415
+ dot(vec3<f32>(0.02840, 0.13383, 0.83777), x),
416
+ );
417
+ v = rrtAndOdtFit(v);
418
+ v = vec3<f32>(
419
+ dot(vec3<f32>(1.60475, -0.53108, -0.07367), v),
420
+ dot(vec3<f32>(-0.10208, 1.10813, -0.00605), v),
421
+ dot(vec3<f32>(-0.00327, -0.07276, 1.07602), v),
422
+ );
423
+ return clamp(v, vec3<f32>(0.0), vec3<f32>(1.0));
424
+ }
425
+
426
+ fn agxContrast(x: vec3<f32>) -> vec3<f32> {
427
+ let x2 = x * x;
428
+ let x4 = x2 * x2;
429
+ return 15.5 * x4 * x2 - 40.14 * x4 * x + 31.96 * x4 - 6.868 * x2 * x
430
+ + 0.4298 * x2 + 0.1191 * x - 0.00232;
431
+ }
432
+
433
+ // AgX (Troy Sobotka), base look: graceful highlight roll-off that keeps
434
+ // saturated emissives from clipping to flat primaries.
435
+ fn toneMapAgx(c: vec3<f32>) -> vec3<f32> {
436
+ let inset = mat3x3<f32>(
437
+ 0.842479062253094, 0.0423282422610123, 0.0423756549057051,
438
+ 0.0784335999999992, 0.878468636469772, 0.0784336,
439
+ 0.0792237451477643, 0.0791661274605434, 0.879142973793104,
440
+ );
441
+ let outset = mat3x3<f32>(
442
+ 1.19687900512017, -0.0528968517574562, -0.0529716355144438,
443
+ -0.0980208811401368, 1.15190312990417, -0.0980434501171241,
444
+ -0.0990297440797205, -0.0989611768448433, 1.15107367264116,
445
+ );
446
+ let minEv = -12.47393;
447
+ let maxEv = 4.026069;
448
+ var v = inset * max(c, vec3<f32>(0.0));
449
+ v = clamp(log2(max(v, vec3<f32>(1e-10))), vec3<f32>(minEv), vec3<f32>(maxEv));
450
+ v = (v - minEv) / (maxEv - minEv);
451
+ v = agxContrast(v);
452
+ v = outset * v;
453
+ return clamp(pow(max(v, vec3<f32>(0.0)), vec3<f32>(2.2)), vec3<f32>(0.0), vec3<f32>(1.0));
454
+ }
455
+
456
+ // Khronos PBR Neutral: base colors come out as authored (hue and
457
+ // saturation kept) up to near-white; only highlights are compressed.
458
+ fn toneMapNeutral(cIn: vec3<f32>) -> vec3<f32> {
459
+ let startCompression = 0.8 - 0.04;
460
+ let desaturation = 0.15;
461
+ var c = max(cIn, vec3<f32>(0.0));
462
+ let x = min(c.r, min(c.g, c.b));
463
+ let offset = select(0.04, x - 6.25 * x * x, x < 0.08);
464
+ c = c - offset;
465
+ let peak = max(c.r, max(c.g, c.b));
466
+ if (peak < startCompression) {
467
+ return c;
468
+ }
469
+ let d = 1.0 - startCompression;
470
+ let newPeak = 1.0 - d * d / (peak + d - startCompression);
471
+ c = c * (newPeak / peak);
472
+ let g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0);
473
+ return mix(c, vec3<f32>(newPeak), g);
474
+ }
475
+
476
+ fn toneMap(c: vec3<f32>) -> vec3<f32> {
477
+ let exposed = c * lights.ambientLinear.w;
478
+ let mode = lights.params.w;
479
+ if (mode > 2.5) {
480
+ return toneMapNeutral(exposed);
481
+ }
482
+ if (mode > 1.5) {
483
+ return toneMapAgx(exposed);
484
+ }
485
+ if (mode > 0.5) {
486
+ return toneMapAces(exposed);
487
+ }
488
+ return clamp(exposed, vec3<f32>(0.0), vec3<f32>(1.0));
489
+ }
490
+
491
+ // \u2500\u2500 Procedural studio environment (image-based light) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
492
+
493
+ // A rectangular-ish softbox seen from the scene: bright inside its angular
494
+ // radius, blurring out with roughness while keeping roughly the same energy.
495
+ fn softbox(d: vec3<f32>, axis: vec3<f32>, radius: f32, rough: f32) -> f32 {
496
+ let cosA = dot(d, axis);
497
+ let edge = cos(radius + rough * 0.9);
498
+ let width = 0.004 + rough * rough * 0.5;
499
+ let lobe = smoothstep(edge - width, edge + width * 0.25, cosA);
500
+ return lobe / (1.0 + rough * rough * 6.0);
501
+ }
502
+
503
+ /// Radiance arriving from direction d (world space; y points down), as a
504
+ /// surface of the given roughness sees it.
505
+ fn envRadiance(dirIn: vec3<f32>, rough: f32) -> vec3<f32> {
506
+ if (lights.envBottom.w < 0.5) {
507
+ return vec3<f32>(0.0);
508
+ }
509
+ let rot = lights.envTop.w;
510
+ let c = cos(rot);
511
+ let s = sin(rot);
512
+ let d = normalize(vec3<f32>(c * dirIn.x + s * dirIn.z, dirIn.y, -s * dirIn.x + c * dirIn.z));
513
+ let up = -d.y;
514
+ let spread = 0.35 + rough * 0.9;
515
+ let tUp = smoothstep(-0.05, spread, up);
516
+ let tDown = smoothstep(-0.05, spread, -up);
517
+ var col = mix(lights.envHorizon.rgb, lights.envTop.rgb, tUp);
518
+ col = mix(col, lights.envBottom.rgb, tDown);
519
+ let k = lights.envHorizon.w;
520
+ if (k > 0.0) {
521
+ // Key softbox overhead-front-left, a rim strip behind-right, a fill strip left.
522
+ let key = softbox(d, normalize(vec3<f32>(-0.35, -0.85, -0.4)), 0.32, rough);
523
+ let rim = softbox(d, normalize(vec3<f32>(0.75, -0.35, 0.55)), 0.2, rough);
524
+ let fill = softbox(d, normalize(vec3<f32>(-0.92, -0.15, -0.2)), 0.16, rough);
525
+ col += vec3<f32>(k * (key * 1.0 + rim * 0.7 + fill * 0.35));
526
+ }
527
+ return col;
528
+ }
529
+
530
+ // Karis' analytic approximation of the split-sum environment BRDF.
531
+ fn envBrdfApprox(f0: vec3<f32>, rough: f32, nDotV: f32) -> vec3<f32> {
532
+ let c0 = vec4<f32>(-1.0, -0.0275, -0.572, 0.022);
533
+ let c1 = vec4<f32>(1.0, 0.0425, 1.04, -0.04);
534
+ let r = rough * c0 + c1;
535
+ let a004 = min(r.x * r.x, exp2(-9.28 * nDotV)) * r.x + r.y;
536
+ let ab = vec2<f32>(-1.04, 1.04) * a004 + r.zw;
537
+ return f0 * ab.x + ab.y;
538
+ }
539
+
540
+ // \u2500\u2500 Shadows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
541
+
542
+ var<private> POISSON : array<vec2<f32>, 12> = array<vec2<f32>, 12>(
543
+ vec2<f32>(-0.326, -0.406), vec2<f32>(-0.840, -0.074), vec2<f32>(-0.696, 0.457),
544
+ vec2<f32>(-0.203, 0.621), vec2<f32>(0.962, -0.195), vec2<f32>(0.473, -0.480),
545
+ vec2<f32>(0.519, 0.767), vec2<f32>(0.185, -0.893), vec2<f32>(0.507, 0.064),
546
+ vec2<f32>(0.896, 0.412), vec2<f32>(-0.322, -0.933), vec2<f32>(-0.792, -0.598),
547
+ );
548
+
549
+ /// 1 = fully lit, 0 = fully shadowed, for light index i.
550
+ fn shadowFactor(worldPos: vec3<f32>, N: vec3<f32>, i: i32) -> f32 {
551
+ if (lights.shadowParams.x < 0.5 || i32(lights.shadowParams.y) != i) {
552
+ return 1.0;
553
+ }
554
+ let p = worldPos + N * lights.shadowBias.y;
555
+ let lp = lights.shadowMatrix * vec4<f32>(p, 1.0);
556
+ let ndc = lp.xyz / lp.w;
557
+ let uv = vec2<f32>(ndc.x * 0.5 + 0.5, 0.5 - ndc.y * 0.5);
558
+ if (lp.w <= 0.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0 || ndc.z > 1.0) {
559
+ return 1.0;
560
+ }
561
+ let texel = 1.0 / max(lights.shadowParams.w, 1.0);
562
+ let radius = lights.shadowParams.z * texel;
563
+ let depthRef = ndc.z - lights.shadowBias.x;
564
+ var lit = 0.0;
565
+ for (var k = 0; k < 12; k++) {
566
+ lit += textureSampleCompareLevel(shadowMap, shadowSampler, uv + POISSON[k] * radius, depthRef);
567
+ }
568
+ lit = lit / 12.0;
569
+ return mix(1.0, lit, lights.shadowBias.z);
570
+ }
571
+
572
+ // \u2500\u2500 Lights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
573
+
574
+ struct LightSample {
575
+ L : vec3<f32>,
576
+ attenuation : f32,
577
+ valid : bool,
578
+ };
579
+
580
+ fn sampleLight(i: i32, worldPos: vec3<f32>) -> LightSample {
581
+ var out = LightSample(vec3<f32>(0.0, 0.0, 1.0), 1.0, false);
582
+ let light = lights.lights[i];
583
+ let lightType = light.posType.w;
584
+ if (lightType > 0.5 && lightType < 1.5) {
585
+ out.L = normalize(-light.dirRadius.xyz);
586
+ out.valid = true;
587
+ return out;
588
+ }
589
+ if (lightType < 1.5) {
590
+ return out;
591
+ }
592
+ let toLight = light.posType.xyz - worldPos;
593
+ let dist = length(toLight);
594
+ let radius = max(1.0, light.dirRadius.w);
595
+ if (dist > radius) {
596
+ return out;
597
+ }
598
+ out.L = normalize(toLight);
599
+ let dNorm = clamp(dist / radius, 0.0, 1.0);
600
+ let decay = max(0.5, light.spotParams.z);
601
+ out.attenuation = pow(clamp(1.0 - dNorm, 0.0, 1.0), decay);
602
+ if (lightType > 2.5) {
603
+ let spotDir = normalize(light.dirRadius.xyz);
604
+ let cosAngle = dot(-out.L, spotDir);
605
+ if (cosAngle < light.spotParams.x) {
606
+ return out;
607
+ }
608
+ out.attenuation *= smoothstep(light.spotParams.x, light.spotParams.y, cosAngle);
609
+ }
610
+ out.valid = true;
611
+ return out;
612
+ }
613
+
614
+ // Blinn-Phong in display space: the original look, plus shadows when a
615
+ // light casts them.
616
+ fn applyLighting3D(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>) -> vec3<f32> {
617
+ if (lights.params.y < 0.5 || material.w < 0.5) {
618
+ return baseColor;
619
+ }
620
+ var N = normalize(worldNormal);
621
+ let V = normalize(cam.cameraPos.xyz - worldPos);
622
+ if (dot(N, V) < 0.0) {
623
+ N = -N;
624
+ }
625
+ let shininess = max(1.0, material.x);
626
+ let specularInt = material.y;
627
+ let ambientInt = material.z;
628
+
629
+ var totalIllumination = baseColor * (lights.ambientColor.rgb * ambientInt);
630
+ let numLights = i32(lights.params.x);
631
+ for (var i = 0; i < 8; i++) {
632
+ if (i >= numLights) {
633
+ break;
634
+ }
635
+ let ls = sampleLight(i, worldPos);
636
+ if (!ls.valid) {
637
+ continue;
638
+ }
639
+ let light = lights.lights[i];
640
+ let lightColor = light.colorIntensity.rgb;
641
+ let intensity = light.colorIntensity.w;
642
+ let NdotL = max(dot(N, ls.L), 0.0);
643
+ let diffuse = baseColor * lightColor * (NdotL * intensity * ls.attenuation);
644
+ var specular = vec3<f32>(0.0);
645
+ if (NdotL > 0.0 && specularInt > 0.001) {
646
+ let H = normalize(ls.L + V);
647
+ let NdotH = max(dot(N, H), 0.0);
648
+ specular = lightColor * (pow(NdotH, shininess) * specularInt * intensity * ls.attenuation);
649
+ }
650
+ totalIllumination += (diffuse + specular) * shadowFactor(worldPos, N, i);
651
+ }
652
+ return totalIllumination;
653
+ }
654
+
655
+ // GGX / Smith-correlated / Schlick, image-based light from envRadiance.
656
+ // Returns linear scene radiance (unbounded).
657
+ fn shadePhysical(worldPos: vec3<f32>, worldNormal: vec3<f32>, albedo: vec3<f32>, rough: f32, metal: f32, ambientInt: f32) -> vec3<f32> {
658
+ var N = normalize(worldNormal);
659
+ let V = normalize(cam.cameraPos.xyz - worldPos);
660
+ if (dot(N, V) < 0.0) {
661
+ N = -N;
662
+ }
663
+ let nDotV = max(dot(N, V), 1e-4);
664
+ let r = clamp(rough, 0.03, 1.0);
665
+ let a = r * r;
666
+ let a2 = a * a;
667
+ let f0 = mix(vec3<f32>(0.04), albedo, metal);
668
+ let diffuseColor = albedo * (1.0 - metal);
669
+
670
+ var lo = vec3<f32>(0.0);
671
+ let numLights = i32(lights.params.x);
672
+ for (var i = 0; i < 8; i++) {
673
+ if (i >= numLights) {
674
+ break;
675
+ }
676
+ let ls = sampleLight(i, worldPos);
677
+ if (!ls.valid) {
678
+ continue;
679
+ }
680
+ let light = lights.lights[i];
681
+ let nDotL = max(dot(N, ls.L), 0.0);
682
+ if (nDotL <= 0.0) {
683
+ continue;
684
+ }
685
+ let H = normalize(ls.L + V);
686
+ let nDotH = max(dot(N, H), 0.0);
687
+ let vDotH = max(dot(V, H), 0.0);
688
+ let dDen = nDotH * nDotH * (a2 - 1.0) + 1.0;
689
+ let D = a2 / (PI * dDen * dDen);
690
+ let gv = nDotL * sqrt(nDotV * nDotV * (1.0 - a2) + a2);
691
+ let gl = nDotV * sqrt(nDotL * nDotL * (1.0 - a2) + a2);
692
+ let Vis = 0.5 / max(gv + gl, 1e-5);
693
+ let F = f0 + (vec3<f32>(1.0) - f0) * pow(1.0 - vDotH, 5.0);
694
+ let spec = D * Vis * F;
695
+ let diff = (vec3<f32>(1.0) - F) * diffuseColor / PI;
696
+ // x PI so a white light of intensity 1 lights a white wall about as
697
+ // brightly as the legacy shading does.
698
+ let radiance = srgbToLinear(light.colorIntensity.rgb) * light.colorIntensity.w * ls.attenuation * PI;
699
+ lo += (diff + spec) * radiance * nDotL * shadowFactor(worldPos, N, i);
700
+ }
701
+
702
+ let R = reflect(-V, N);
703
+ let irradiance = envRadiance(N, 1.0) + lights.ambientLinear.rgb;
704
+ let specEnv = envRadiance(R, r) * envBrdfApprox(f0, r, nDotV);
705
+ lo += (diffuseColor * irradiance + specEnv) * ambientInt;
706
+ return lo;
707
+ }
708
+
709
+ struct Shaded {
710
+ /** Display-encoded (sRGB) color for the color target. */
711
+ display : vec3<f32>,
712
+ /** Unclamped scene-referred linear radiance, for the bloom target. */
713
+ hdr : vec3<f32>,
714
+ };
715
+
716
+ /// Shades a surface for the scene's mode.
717
+ /// material: x shininess, y specularIntensity, z ambientIntensity, w mode (0 unlit).
718
+ /// pbr: x roughness (<0 = default), y metallic, z/w unused.
719
+ /// emissive: rgb sRGB color, w strength.
720
+ fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> Shaded {
721
+ var out: Shaded;
722
+ if (lights.params.z < 0.5) {
723
+ var c = baseColor;
724
+ if (material.w >= 0.5) {
725
+ c = applyLighting3D(worldPos, worldNormal, baseColor, material);
726
+ }
727
+ c += emissive.rgb * emissive.w;
728
+ out.display = c;
729
+ out.hdr = srgbToLinear(clamp(c, vec3<f32>(0.0), vec3<f32>(1.0))) * max(max(c.r, max(c.g, c.b)), 1.0);
730
+ return out;
731
+ }
732
+ var radiance: vec3<f32>;
733
+ if (material.w < 0.5) {
734
+ radiance = srgbToLinear(baseColor);
735
+ } else {
736
+ let rough = select(pbr.x, 0.5, pbr.x < 0.0);
737
+ radiance = shadePhysical(worldPos, worldNormal, srgbToLinear(baseColor), rough, clamp(pbr.y, 0.0, 1.0), material.z);
738
+ }
739
+ radiance += srgbToLinear(emissive.rgb) * emissive.w;
740
+ var display: vec3<f32>;
741
+ if (material.w < 0.5) {
742
+ // Unlit layers keep their exact authored colors.
743
+ display = clamp(radiance, vec3<f32>(0.0), vec3<f32>(1.0));
744
+ } else {
745
+ display = toneMap(radiance);
746
+ }
747
+ var hdr = radiance * lights.ambientLinear.w;
748
+ if (lights.fog.w > 0.5) {
749
+ let dist = distance(worldPos, cam.cameraPos.xyz);
750
+ let f = smoothstep(lights.fogRange.x, max(lights.fogRange.y, lights.fogRange.x + 1.0), dist) * lights.fogRange.z;
751
+ display = mix(display, lights.fog.rgb, f);
752
+ hdr = hdr * (1.0 - f);
753
+ }
754
+ out.display = linearToSrgb(display);
755
+ out.hdr = hdr;
756
+ return out;
757
+ }
758
+
759
+ fn shadeSurface(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> vec3<f32> {
760
+ return shadeSurfaceFull(worldPos, worldNormal, baseColor, material, pbr, emissive).display;
761
+ }
762
+ `,ge=`
763
+ @group(3) @binding(0) var<uniform> lights : LightsUniforms;
764
+ @group(3) @binding(1) var shadowMap : texture_depth_2d;
765
+ @group(3) @binding(2) var shadowSampler : sampler_comparison;
766
+ `;T();function le(A,e){return`
767
+ @group(${A}) @binding(${e}) var matteTex : texture_2d<f32>;
768
+
769
+ fn matteCoverage(fragPos : vec2<f32>) -> f32 {
770
+ let dims = vec2<f32>(textureDimensions(matteTex));
771
+ let p = floor(fragPos * dims / max(cam.screenParams.xy, vec2<f32>(1.0)));
772
+ return textureLoad(matteTex, vec2<i32>(clamp(p, vec2<f32>(0.0), dims - 1.0)), 0).a;
773
+ }
774
+ `}var rr=`
775
+ ${se}
776
+
777
+ struct ModelUniforms {
778
+ modelMatrix : mat4x4<f32>,
779
+ normalMatrix : mat4x4<f32>,
780
+ colorTint : vec4<f32>,
781
+ params : vec4<f32>, // x = opacity, y = twoSided (1.0 = yes), z = isSkinned (1.0 = yes), w = wireframe
782
+ materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit, 2=toon)
783
+ shade : vec4<f32>, // rgb = toon shadow-side color multiplier, a = alpha cutoff (0 = none)
784
+ pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
785
+ emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
786
+ maps : vec4<f32>, // x = normal scale (0 = no map), y = occlusion strength, z = has metallic-roughness map, w = has emissive map
787
+ };
788
+
789
+ struct SkinningUniforms {
790
+ jointMatrices : array<mat4x4<f32>, 128>,
791
+ };
792
+
793
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
794
+ @group(1) @binding(0) var<uniform> model : ModelUniforms;
795
+ @group(1) @binding(1) var<uniform> skinning : SkinningUniforms;
796
+ ${le(1,2)}@group(2) @binding(0) var texSampler : sampler;
797
+ @group(2) @binding(1) var mainTex : texture_2d<f32>;
798
+ @group(2) @binding(2) var normalTex : texture_2d<f32>;
799
+ @group(2) @binding(3) var metalRoughTex : texture_2d<f32>;
800
+ @group(2) @binding(4) var occlusionTex : texture_2d<f32>;
801
+ @group(2) @binding(5) var emissiveTex : texture_2d<f32>;
802
+ ${ge}
803
+
804
+ struct VertexInput {
805
+ @location(0) position : vec3<f32>,
806
+ @location(1) uv : vec2<f32>,
807
+ @location(2) normal : vec3<f32>,
808
+ @location(3) joints : vec4<f32>,
809
+ @location(4) weights : vec4<f32>,
810
+ };
811
+
812
+ struct VertexOutput {
813
+ @builtin(position) clipPos : vec4<f32>,
814
+ @location(0) uv : vec2<f32>,
815
+ @location(1) worldPos : vec3<f32>,
816
+ @location(2) worldNormal : vec3<f32>,
817
+ @location(3) linearDepth : f32,
818
+ };
819
+
820
+ @vertex
821
+ fn vs_main(in: VertexInput) -> VertexOutput {
822
+ var out: VertexOutput;
823
+
824
+ var localPos = in.position;
825
+ var localNorm = in.normal;
826
+
827
+ // Linear Blend Skinning (LBS) on GPU
828
+ if (model.params.z > 0.5) {
829
+ let j0 = i32(in.joints.x);
830
+ let j1 = i32(in.joints.y);
831
+ let j2 = i32(in.joints.z);
832
+ let j3 = i32(in.joints.w);
833
+
834
+ let w0 = in.weights.x;
835
+ let w1 = in.weights.y;
836
+ let w2 = in.weights.z;
837
+ let w3 = in.weights.w;
838
+
839
+ let totalWeight = w0 + w1 + w2 + w3;
840
+ if (totalWeight > 0.001) {
841
+ let skinMat = skinning.jointMatrices[j0] * w0 +
842
+ skinning.jointMatrices[j1] * w1 +
843
+ skinning.jointMatrices[j2] * w2 +
844
+ skinning.jointMatrices[j3] * w3;
845
+
846
+ let pos4 = skinMat * vec4<f32>(in.position, 1.0);
847
+ localPos = pos4.xyz;
848
+
849
+ let norm4 = skinMat * vec4<f32>(in.normal, 0.0);
850
+ localNorm = normalize(norm4.xyz);
851
+ }
852
+ }
853
+
854
+ let worldPos4 = model.modelMatrix * vec4<f32>(localPos, 1.0);
855
+ out.worldPos = worldPos4.xyz;
856
+
857
+ let norm4 = model.normalMatrix * vec4<f32>(localNorm, 0.0);
858
+ out.worldNormal = normalize(norm4.xyz);
859
+
860
+ out.clipPos = cam.viewProjMatrix * worldPos4;
861
+ out.uv = in.uv;
862
+
863
+ out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
864
+ return out;
865
+ }
866
+
867
+ // Toon (MToon-style): the base color as authored where the light reaches,
868
+ // the shade color past a soft terminator. Highlights stay out: the texture
869
+ // already paints them.
870
+ fn toonLighting(in: VertexOutput, baseColor: vec3<f32>) -> vec3<f32> {
871
+ var N = normalize(in.worldNormal);
872
+ let V = normalize(cam.cameraPos.xyz - in.worldPos);
873
+ if (dot(N, V) < 0.0) {
874
+ N = -N;
875
+ }
876
+ var lit = 0.0;
877
+ let numLights = i32(lights.params.x);
878
+ for (var i = 0; i < 8; i++) {
879
+ if (i >= numLights) {
880
+ break;
881
+ }
882
+ let light = lights.lights[i];
883
+ let lightType = light.posType.w;
884
+ var L = vec3<f32>(0.0, 0.0, 1.0);
885
+ if (lightType > 0.5 && lightType < 1.5) {
886
+ L = normalize(-light.dirRadius.xyz);
887
+ } else if (lightType >= 1.5) {
888
+ L = normalize(light.posType.xyz - in.worldPos);
889
+ } else {
890
+ continue;
891
+ }
892
+ let terminator = smoothstep(-0.05, 0.2, dot(N, L));
893
+ lit = max(lit, terminator * min(light.colorIntensity.w, 1.0));
894
+ }
895
+ return baseColor * mix(model.shade.rgb, vec3<f32>(1.0), lit);
896
+ }
897
+
898
+ struct MeshFragment {
899
+ color : vec4<f32>, // premultiplied display color
900
+ hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
901
+ };
902
+
903
+ // Normal mapping without tangents: a cotangent frame from screen-space
904
+ // derivatives (Sch\xFCler, "Followup: Normal Mapping Without Precomputed Tangents").
905
+ fn perturbNormal(N: vec3<f32>, p: vec3<f32>, uv: vec2<f32>, tn: vec3<f32>, dp1: vec3<f32>, dp2: vec3<f32>, duv1: vec2<f32>, duv2: vec2<f32>) -> vec3<f32> {
906
+ let dp2perp = cross(dp2, N);
907
+ let dp1perp = cross(N, dp1);
908
+ // The derivation assumes cross(dp1, dp2) points along N; with this
909
+ // engine's y-down view basis it can point away, mirroring the frame.
910
+ let handed = select(1.0, -1.0, dot(cross(dp1, dp2), N) < 0.0);
911
+ let T = (dp2perp * duv1.x + dp1perp * duv2.x) * handed;
912
+ let B = (dp2perp * duv1.y + dp1perp * duv2.y) * handed;
913
+ let invmax = inverseSqrt(max(max(dot(T, T), dot(B, B)), 1e-20));
914
+ // glTF maps are +Y up while v grows down the image: green points along -B.
915
+ return normalize(T * (tn.x * invmax) - B * (tn.y * invmax) + N * tn.z);
916
+ }
917
+
918
+ fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
919
+ // Every sample and derivative up front, in uniform control flow.
920
+ var texColor = textureSample(mainTex, texSampler, in.uv);
921
+ let normalSample = textureSample(normalTex, texSampler, in.uv).xyz;
922
+ let mrSample = textureSample(metalRoughTex, texSampler, in.uv);
923
+ let aoSample = textureSample(occlusionTex, texSampler, in.uv).r;
924
+ let emissiveSample = textureSample(emissiveTex, texSampler, in.uv).rgb;
925
+ let dp1 = dpdx(in.worldPos);
926
+ let dp2 = dpdy(in.worldPos);
927
+ let duv1 = dpdx(in.uv);
928
+ let duv2 = dpdy(in.uv);
929
+
930
+ if (!isFront && model.params.y < 0.5) {
931
+ discard;
932
+ }
933
+ if (texColor.a < model.shade.a) {
934
+ discard;
935
+ }
936
+ let alpha = texColor.a * model.params.x * model.colorTint.a * matteCoverage(in.clipPos.xy);
937
+ if (alpha <= 0.001) {
938
+ discard;
939
+ }
940
+
941
+ let baseRgb = texColor.rgb * model.colorTint.rgb;
942
+ var out: MeshFragment;
943
+ if (model.materialParams.w > 1.5) {
944
+ var toon = baseRgb;
945
+ if (lights.params.y >= 0.5) {
946
+ toon = toonLighting(in, baseRgb);
947
+ }
948
+ out.color = vec4<f32>(toon * alpha, alpha);
949
+ out.hdr = vec4<f32>(srgbToLinear(toon) * alpha, alpha);
950
+ return out;
951
+ }
952
+
953
+ var N = normalize(in.worldNormal);
954
+ if (model.maps.x > 0.0) {
955
+ var tn = normalSample * 2.0 - 1.0;
956
+ tn = vec3<f32>(tn.xy * model.maps.x, tn.z);
957
+ // The frame follows the surface side the camera sees.
958
+ var Nf = N;
959
+ if (dot(Nf, cam.cameraPos.xyz - in.worldPos) < 0.0) {
960
+ Nf = -Nf;
961
+ }
962
+ N = perturbNormal(Nf, in.worldPos, in.uv, tn, dp1, dp2, duv1, duv2);
963
+ }
964
+ var pbr = model.pbr;
965
+ if (model.maps.z > 0.5) {
966
+ pbr.x = select(pbr.x, 1.0, pbr.x < 0.0) * mrSample.g;
967
+ pbr.y = pbr.y * mrSample.b;
968
+ }
969
+ var material = model.materialParams;
970
+ material.z = material.z * mix(1.0, aoSample, clamp(model.maps.y, 0.0, 1.0));
971
+ var emissive = model.emissive;
972
+ if (model.maps.w > 0.5) {
973
+ // Linear multiply in display space is close enough for an 8-bit map.
974
+ emissive = vec4<f32>(emissive.rgb * emissiveSample, emissive.w);
975
+ }
976
+ let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive);
977
+ out.color = vec4<f32>(shaded.display * alpha, alpha);
978
+ out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
979
+ return out;
980
+ }
981
+
982
+ struct MrtOutput {
983
+ @location(0) color : vec4<f32>,
984
+ @location(1) depth : vec4<f32>,
985
+ };
986
+
987
+ struct BloomOutput {
988
+ @location(0) color : vec4<f32>,
989
+ @location(1) hdr : vec4<f32>,
990
+ };
991
+
992
+ struct MrtBloomOutput {
993
+ @location(0) color : vec4<f32>,
994
+ @location(1) depth : vec4<f32>,
995
+ @location(2) hdr : vec4<f32>,
996
+ };
997
+
998
+ @fragment
999
+ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
1000
+ return shadeMesh(in, isFront).color;
1001
+ }
1002
+
1003
+ @fragment
1004
+ fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
1005
+ var out: MrtOutput;
1006
+ out.color = shadeMesh(in, isFront).color;
1007
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1008
+ return out;
1009
+ }
1010
+
1011
+ @fragment
1012
+ fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
1013
+ let f = shadeMesh(in, isFront);
1014
+ var out: BloomOutput;
1015
+ out.color = f.color;
1016
+ out.hdr = f.hdr;
1017
+ return out;
1018
+ }
1019
+
1020
+ @fragment
1021
+ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
1022
+ let f = shadeMesh(in, isFront);
1023
+ var out: MrtBloomOutput;
1024
+ out.color = f.color;
1025
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1026
+ out.hdr = f.hdr;
1027
+ return out;
1028
+ }
1029
+ `;T();function Ie(A){return{binding:A,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}}var ir=new WeakMap;function ce(A){let e=ir.get(A);if(!e){let t=A.createTexture({label:"Matte3DFullCoverage",size:[1,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});A.queue.writeTexture({texture:t},new Uint8Array([255,255,255,255]),{bytesPerRow:4},[1,1]),e=t.createView(),ir.set(A,e)}return e}T();var or={color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}},zi="rgba16float",Xi="rgba16float",jA=class{constructor(e,t){this.device=e;this.base=t}device;base;cache=new Map;get(e){let t=this.cache.get(e);if(!t){let n=this.base;t=this.device.createRenderPipeline({label:`${n.label}${e?"MrtBloom":"Bloom"}`,layout:n.layout,vertex:n.vertex,fragment:{module:n.module,entryPoint:e?"fs_mrt_bloom":"fs_single_bloom",targets:[{format:n.format,blend:or},...e?[{format:zi}]:[],{format:Xi,blend:or}]},depthStencil:n.depthStencil,primitive:n.primitive,multisample:n.multisample}),this.cache.set(e,t)}return t}};T();T();var ar=`
1030
+ ${se}
1031
+ struct ModelUniforms {
1032
+ modelMatrix : mat4x4<f32>,
1033
+ normalMatrix : mat4x4<f32>,
1034
+ colorTint : vec4<f32>,
1035
+ borderColor : vec4<f32>,
1036
+ params : vec4<f32>, // x = opacity, y = borderRadius, z = twoSided (1.0 = yes), w = borderWidth
1037
+ dimensions : vec4<f32>, // x = width, y = height, zw = texture extent the layer covers (0 = whole texture)
1038
+ materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
1039
+ pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
1040
+ emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
1041
+ };
1042
+
1043
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
1044
+ @group(1) @binding(0) var<uniform> model : ModelUniforms;
1045
+ ${le(1,1)}@group(2) @binding(0) var texSampler : sampler;
1046
+ @group(2) @binding(1) var mainTex : texture_2d<f32>;
1047
+ ${ge}
1048
+
1049
+ struct VertexInput {
1050
+ @location(0) position : vec3<f32>,
1051
+ @location(1) uv : vec2<f32>,
1052
+ @location(2) normal : vec3<f32>,
1053
+ };
1054
+
1055
+ struct VertexOutput {
1056
+ @builtin(position) clipPos : vec4<f32>,
1057
+ @location(0) uv : vec2<f32>,
1058
+ @location(1) worldPos : vec3<f32>,
1059
+ @location(2) worldNormal : vec3<f32>,
1060
+ @location(3) linearDepth : f32,
1061
+ @location(4) localPos : vec2<f32>,
1062
+ };
1063
+
1064
+ @vertex
1065
+ fn vs_main(in: VertexInput) -> VertexOutput {
1066
+ var out: VertexOutput;
1067
+
1068
+ let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
1069
+ var pad = 0.0;
1070
+ if (hasDimensions) {
1071
+ let viewPos = cam.viewMatrix * model.modelMatrix * vec4<f32>(0.0, 0.0, 0.0, 1.0);
1072
+ let viewDepth = max(abs(viewPos.z), 0.1);
1073
+ let projScale = max(cam.projMatrix[1][1], 0.001);
1074
+ let worldPx = (2.0 * viewDepth) / max(cam.screenParams.y * projScale, 0.001);
1075
+ pad = max(4.0 * worldPx, 4.0);
1076
+ }
1077
+ let scalePad = select(vec2<f32>(1.0), 1.0 + vec2<f32>(2.0 * pad) / model.dimensions.xy, hasDimensions);
1078
+
1079
+ let paddedPos = vec3<f32>(in.position.xy * scalePad, in.position.z);
1080
+ let worldPos4 = model.modelMatrix * vec4<f32>(paddedPos, 1.0);
1081
+ out.worldPos = worldPos4.xyz;
1082
+
1083
+ // Normal transformed by 3x3 normal matrix
1084
+ let norm4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
1085
+ out.worldNormal = normalize(norm4.xyz);
1086
+
1087
+ out.clipPos = cam.viewProjMatrix * worldPos4;
1088
+
1089
+ out.localPos = in.position.xy * (model.dimensions.xy + vec2<f32>(2.0 * pad));
1090
+ // A layer of fractional size renders into a texture rounded up to whole
1091
+ // pixels: map the quad onto the part it covers, not the whole texture,
1092
+ // or the content is stretched by up to a pixel and resampled off-grid.
1093
+ let uvExtent = select(model.dimensions.zw, vec2<f32>(1.0), model.dimensions.zw <= vec2<f32>(0.0));
1094
+ out.uv = select(in.uv, (out.localPos / model.dimensions.xy + vec2<f32>(0.5)) * uvExtent, hasDimensions);
1095
+
1096
+ // Linear camera depth along optical viewing axis
1097
+ out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
1098
+ return out;
1099
+ }
1100
+
1101
+ fn sdRoundedRectWithNormal(p: vec2<f32>, b: vec2<f32>, r: f32) -> vec3<f32> {
1102
+ let q = abs(p) - b + vec2<f32>(r);
1103
+ let sx = select(1.0, -1.0, p.x < 0.0);
1104
+ let sy = select(1.0, -1.0, p.y < 0.0);
1105
+ let s = vec2<f32>(sx, sy);
1106
+
1107
+ // Outside corner arc region
1108
+ if (q.x > 0.0 && q.y > 0.0) {
1109
+ let l = length(q);
1110
+ let n = select(vec2<f32>(0.0, 1.0), q / l, l > 0.0001);
1111
+ return vec3<f32>(l - r, s * n);
1112
+ }
1113
+
1114
+ // Straight edges or interior
1115
+ if (q.x > q.y) {
1116
+ let dist = q.x - r;
1117
+ return vec3<f32>(dist, s.x, 0.0);
1118
+ } else {
1119
+ let dist = q.y - r;
1120
+ return vec3<f32>(dist, 0.0, s.y);
1121
+ }
1122
+ }
1123
+
1124
+ struct QuadFragment {
1125
+ color : vec4<f32>, // premultiplied display color
1126
+ hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
1127
+ };
1128
+
1129
+ fn shadeQuad(in: VertexOutput, isFront: bool) -> QuadFragment {
1130
+ // One-sided quads cull against their declared normal, not the hardware
1131
+ // winding: the Y-down view basis mirrors winding, so front_facing reads
1132
+ // camera-facing quads as back faces.
1133
+ if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
1134
+ discard;
1135
+ }
1136
+
1137
+ var outerAlpha = 1.0;
1138
+ var borderFactor = 0.0;
1139
+ let br = model.params.y;
1140
+ let borderWidth = model.params.w;
1141
+ let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
1142
+
1143
+ if (hasDimensions) {
1144
+ let halfSize = model.dimensions.xy * 0.5;
1145
+ let normData = sdRoundedRectWithNormal(in.localPos, halfSize, br);
1146
+
1147
+ let uvDx = dpdx(in.localPos);
1148
+ let uvDy = dpdy(in.localPos);
1149
+
1150
+ let dPdx = normData.y * uvDx.x + normData.z * uvDx.y;
1151
+ let dPdy = normData.y * uvDy.x + normData.z * uvDy.y;
1152
+ let gradLen = max(sqrt(dPdx * dPdx + dPdy * dPdy), 0.001);
1153
+
1154
+ let distPixel = normData.x / gradLen;
1155
+ outerAlpha = clamp(0.5 - distPixel, 0.0, 1.0);
1156
+ if (outerAlpha <= 0.001) {
1157
+ discard;
1158
+ }
1159
+
1160
+ if (borderWidth > 0.0 && model.borderColor.a > 0.0) {
1161
+ let borderWidthPixel = max(borderWidth / gradLen, 0.0);
1162
+ let innerAlpha = clamp(0.5 - (distPixel + borderWidthPixel), 0.0, 1.0);
1163
+ borderFactor = clamp(outerAlpha - innerAlpha, 0.0, 1.0) * model.borderColor.a;
1164
+ }
1165
+ }
1166
+
1167
+ let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
1168
+ let dxUV = dpdx(in.uv);
1169
+ let dyUV = dpdy(in.uv);
1170
+ var texColor = textureSampleGrad(mainTex, texSampler, clampedUv, dxUV, dyUV);
1171
+ let texAlpha = texColor.a;
1172
+
1173
+ let unmultipliedRgb = select(texColor.rgb / texAlpha, texColor.rgb, texAlpha < 0.001);
1174
+ let baseRgb = mix(unmultipliedRgb * model.colorTint.rgb, model.borderColor.rgb, borderFactor);
1175
+ let alpha = mix(texAlpha, 1.0, borderFactor) * model.params.x * model.colorTint.a * outerAlpha * matteCoverage(in.clipPos.xy);
1176
+ if (alpha <= 0.001) {
1177
+ discard;
1178
+ }
1179
+
1180
+ let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive);
1181
+ var out: QuadFragment;
1182
+ out.color = vec4<f32>(shaded.display * alpha, alpha);
1183
+ out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
1184
+ return out;
1185
+ }
1186
+
1187
+ struct MrtOutput {
1188
+ @location(0) color : vec4<f32>,
1189
+ @location(1) depth : vec4<f32>,
1190
+ };
1191
+
1192
+ struct BloomOutput {
1193
+ @location(0) color : vec4<f32>,
1194
+ @location(1) hdr : vec4<f32>,
1195
+ };
1196
+
1197
+ struct MrtBloomOutput {
1198
+ @location(0) color : vec4<f32>,
1199
+ @location(1) depth : vec4<f32>,
1200
+ @location(2) hdr : vec4<f32>,
1201
+ };
1202
+
1203
+ @fragment
1204
+ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
1205
+ return shadeQuad(in, isFront).color;
1206
+ }
1207
+
1208
+ @fragment
1209
+ fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
1210
+ var out: MrtOutput;
1211
+ out.color = shadeQuad(in, isFront).color;
1212
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1213
+ return out;
1214
+ }
1215
+
1216
+ @fragment
1217
+ fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
1218
+ let f = shadeQuad(in, isFront);
1219
+ var out: BloomOutput;
1220
+ out.color = f.color;
1221
+ out.hdr = f.hdr;
1222
+ return out;
1223
+ }
1224
+
1225
+ @fragment
1226
+ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
1227
+ let f = shadeQuad(in, isFront);
1228
+ var out: MrtBloomOutput;
1229
+ out.color = f.color;
1230
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1231
+ out.hdr = f.hdr;
1232
+ return out;
1233
+ }
1234
+
1235
+ // Shadow-map pass: depth only, alpha-tested so a cut-out casts its shape.
1236
+ @fragment
1237
+ fn fs_shadow(in: VertexOutput) {
1238
+ let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
1239
+ let a = textureSampleLevel(mainTex, texSampler, clampedUv, 0.0).a * model.params.x * model.colorTint.a;
1240
+ if (a < 0.5) {
1241
+ discard;
1242
+ }
1243
+ }
1244
+ `;T();var it="depth32float",ot={format:it,depthWriteEnabled:!0,depthCompare:"less-equal",depthBias:2,depthBiasSlopeScale:2.5,depthBiasClamp:.01};T();var WA=8;function ue(A,e,t){e[t]=A.roughness??-1,e[t+1]=A.metallic??0,e[t+2]=0,e[t+3]=0;let n=A.emissive;if(n==null){e.fill(0,t+4,t+8);return}let r;if(Array.isArray(n))r=[n[0],n[1],n[2]];else{let i=Xe(n);r=[i.r*i.a,i.g*i.a,i.b*i.a]}e[t+4]=r[0],e[t+5]=r[1],e[t+6]=r[2],e[t+7]=A.emissiveIntensity??1}function Ot(A,e="Lights3DLayout"){return A.createBindGroupLayout({label:e,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"comparison"}}]})}function Kt(A){let e=A.roughness!==void 0?Math.max(1,(1-A.roughness)*128):A.shininess??32,t=A.metallic!==void 0?A.metallic:A.specularIntensity??.5,n=A.ambientIntensity??1,r=A.material==="unlit"?0:1;return[e,t,n,r]}var at=class{device;pipelineSingle;pipelineMrt;bloomVariants;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;vertexBuffer;indexBuffer;modelData=new Float32Array(52+WA);constructor(e,t,n="depth24plus",r=1){this.device=e,this.modelPool=new GA((52+WA)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let i=e.createShaderModule({label:"quad3d.wgsl",code:ar});this.cameraLayout=e.createBindGroupLayout({label:"Quad3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=e.createBindGroupLayout({label:"Quad3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},Ie(1)]}),this.textureLayout=e.createBindGroupLayout({label:"Quad3DTextureLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.lightsLayout=Ot(e,"Quad3DLightsLayout");let o=e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),a={module:i,entryPoint:"vs_main",buffers:[{arrayStride:32,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"}]}]};this.pipelineSingle=e.createRenderPipeline({label:"Quad3DPipelineSingle",layout:o,vertex:a,fragment:{module:i,entryPoint:"fs_single",targets:[{format:t,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:r}}),this.pipelineMrt=e.createRenderPipeline({label:"Quad3DPipelineMrt",layout:o,vertex:a,fragment:{module:i,entryPoint:"fs_mrt",targets:[{format:t,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}},{format:"rgba16float"}]},depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:r}}),this.bloomVariants=new jA(e,{label:"Quad3DPipeline",layout:o,vertex:a,module:i,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:r}}),this.pipelineShadow=e.createRenderPipeline({label:"Quad3DPipelineShadow",layout:e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout]}),vertex:a,fragment:{module:i,entryPoint:"fs_shadow",targets:[]},depthStencil:ot,primitive:{topology:"triangle-list",cullMode:"none"}});let s=new Float32Array([-.5,-.5,0,0,0,0,0,-1,.5,-.5,0,1,0,0,0,-1,.5,.5,0,1,1,0,0,-1,-.5,.5,0,0,1,0,0,-1]),g=new Uint16Array([0,1,2,0,2,3]);this.vertexBuffer=e.createBuffer({size:s.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.vertexBuffer.getMappedRange()).set(s),this.vertexBuffer.unmap(),this.indexBuffer=e.createBuffer({size:g.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Uint16Array(this.indexBuffer.getMappedRange()).set(g),this.indexBuffer.unmap()}resetPools(){this.modelPool.reset()}packModel(e){let t=e.modelMatrix;for(let a=0;a<16;a++)this.modelData[a]=t[a]??0;let n=e.normalMatrix??t;for(let a=0;a<16;a++)this.modelData[16+a]=n[a]??0;let r=e.colorTint??[1,1,1,1];this.modelData[32]=r[0],this.modelData[33]=r[1],this.modelData[34]=r[2],this.modelData[35]=r[3];let i=e.borderColor??[0,0,0,0];this.modelData[36]=i[0],this.modelData[37]=i[1],this.modelData[38]=i[2],this.modelData[39]=i[3],this.modelData[40]=e.opacity??1,this.modelData[41]=e.borderRadius??0,this.modelData[42]=e.twoSided?1:0,this.modelData[43]=e.borderWidth??0,this.modelData[44]=e.width??0,this.modelData[45]=e.height??0,this.modelData[46]=e.textureExtent?.[0]??0,this.modelData[47]=e.textureExtent?.[1]??0,this.modelData.set(Kt(e),48),ue(e,this.modelData,52);let o=this.modelPool.getBuffer(this.device,this.modelData);return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:o}},{binding:1,resource:e.matte?.createView()??ce(this.device)}]})}textureBindGroup(e,t){return this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:t},{binding:1,resource:e.createView()}]})}draw(e,t,n,r,i,o,a=!1,s=!1){let g=this.packModel(o),l=this.textureBindGroup(r,i);e.setPipeline(s?this.bloomVariants.get(a):a?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,g),e.setBindGroup(2,l),e.setBindGroup(3,n),e.setVertexBuffer(0,this.vertexBuffer),e.setIndexBuffer(this.indexBuffer,"uint16"),e.drawIndexed(6)}drawShadow(e,t,n,r,i){e.setPipeline(this.pipelineShadow),e.setBindGroup(0,t),e.setBindGroup(1,this.packModel(i)),e.setBindGroup(2,this.textureBindGroup(n,r)),e.setVertexBuffer(0,this.vertexBuffer),e.setIndexBuffer(this.indexBuffer,"uint16"),e.drawIndexed(6)}destroy(){this.modelPool.destroy(),this.vertexBuffer.destroy(),this.indexBuffer.destroy()}};var st=class{device;pipelineSingle;pipelineMrt;bloomVariants;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;skinningPool;defaultWhiteTexture;flatNormalTexture;defaultSkinningBuffer;modelData=new Float32Array(52+WA);constructor(e,t,n="depth24plus",r,i,o=1){this.device=e,this.modelPool=new GA((52+WA)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.skinningPool=new GA(8192,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let a=e.createShaderModule({label:"mesh3d.wgsl",code:rr});this.cameraLayout=r??e.createBindGroupLayout({label:"Mesh3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=e.createBindGroupLayout({label:"Mesh3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},Ie(2)]}),this.textureLayout=e.createBindGroupLayout({label:"Mesh3DTextureLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},...[1,2,3,4,5].map(I=>({binding:I,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}))]}),this.lightsLayout=i??Ot(e,"Mesh3DLightsLayout");let s=e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),g={module:a,entryPoint:"vs_main",buffers:[{arrayStride:64,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"},{shaderLocation:3,offset:32,format:"float32x4"},{shaderLocation:4,offset:48,format:"float32x4"}]}]};this.pipelineSingle=e.createRenderPipeline({label:"Mesh3DPipelineSingle",layout:s,vertex:g,fragment:{module:a,entryPoint:"fs_single",targets:[{format:t,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}}),this.pipelineMrt=e.createRenderPipeline({label:"Mesh3DPipelineMrt",layout:s,vertex:g,fragment:{module:a,entryPoint:"fs_mrt",targets:[{format:t,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}},{format:"rgba16float"}]},depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}}),this.bloomVariants=new jA(e,{label:"Mesh3DPipeline",layout:s,vertex:g,module:a,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}}),this.pipelineShadow=e.createRenderPipeline({label:"Mesh3DPipelineShadow",layout:e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout]}),vertex:g,depthStencil:ot,primitive:{topology:"triangle-list",cullMode:"none"}}),this.defaultWhiteTexture=e.createTexture({label:"Mesh3DDefaultWhiteTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),e.queue.writeTexture({texture:this.defaultWhiteTexture},new Uint8Array([255,255,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1}),this.flatNormalTexture=e.createTexture({label:"Mesh3DFlatNormalTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),e.queue.writeTexture({texture:this.flatNormalTexture},new Uint8Array([128,128,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1});let l=new Float32Array(2048);for(let I=0;I<128;I++)l[I*16]=1,l[I*16+5]=1,l[I*16+10]=1,l[I*16+15]=1;this.defaultSkinningBuffer=e.createBuffer({size:8192,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.defaultSkinningBuffer.getMappedRange()).set(l),this.defaultSkinningBuffer.unmap()}resetPools(){this.modelPool.reset(),this.skinningPool.reset()}packModel(e){let t=e.modelMatrix;for(let E=0;E<16;E++)this.modelData[E]=t[E]??0;let n=e.normalMatrix??t;for(let E=0;E<16;E++)this.modelData[16+E]=n[E]??0;let r=e.colorTint??[1,1,1,1];this.modelData[32]=r[0],this.modelData[33]=r[1],this.modelData[34]=r[2],this.modelData[35]=r[3],this.modelData[36]=e.opacity??1,this.modelData[37]=e.twoSided?1:0,this.modelData[38]=e.isSkinned?1:0,this.modelData[39]=e.wireframe?1:0;let i=e.roughness!==void 0?Math.max(1,(1-e.roughness)*128):e.shininess??32,o=e.metallic!==void 0?e.metallic:e.specularIntensity??.5,a=e.ambientIntensity??1,s=e.material==="unlit"?0:e.material==="toon"?2:1;this.modelData[40]=i,this.modelData[41]=o,this.modelData[42]=a,this.modelData[43]=s;let g=e.shadeColor??[1,1,1];this.modelData[44]=g[0],this.modelData[45]=g[1],this.modelData[46]=g[2],this.modelData[47]=e.alphaCutoff??0,ue(e,this.modelData,48);let l=e.maps;this.modelData[56]=l?.normal?l.normalScale??1:0,this.modelData[57]=l?.occlusion?l.occlusionStrength??1:0,this.modelData[58]=l?.metallicRoughness?1:0,this.modelData[59]=l?.emissive?1:0;let I=this.modelPool.getBuffer(this.device,this.modelData),u=e.isSkinned&&e.skinningMatrices?this.skinningPool.getBuffer(this.device,e.skinningMatrices):this.defaultSkinningBuffer;return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:I}},{binding:1,resource:{buffer:u}},{binding:2,resource:e.matte?.createView()??ce(this.device)}]})}draw(e,t,n,r,i,o,a,s=!1,g=!1){let l=this.packModel(a),I=this.defaultWhiteTexture,u=a.maps,E=this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:o},{binding:1,resource:(i??I).createView()},{binding:2,resource:(u?.normal??this.flatNormalTexture).createView()},{binding:3,resource:(u?.metallicRoughness??I).createView()},{binding:4,resource:(u?.occlusion??I).createView()},{binding:5,resource:(u?.emissive??I).createView()}]});e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,l),e.setBindGroup(2,E),e.setBindGroup(3,n),e.setVertexBuffer(0,r.vertexBuffer),e.setIndexBuffer(r.indexBuffer,r.indexFormat),e.drawIndexed(r.indexCount)}drawShadow(e,t,n,r){e.setPipeline(this.pipelineShadow),e.setBindGroup(0,t),e.setBindGroup(1,this.packModel(r)),e.setVertexBuffer(0,n.vertexBuffer),e.setIndexBuffer(n.indexBuffer,n.indexFormat),e.drawIndexed(n.indexCount)}destroy(){this.modelPool.destroy(),this.skinningPool.destroy(),this.defaultWhiteTexture.destroy(),this.flatNormalTexture.destroy(),this.defaultSkinningBuffer.destroy()}};T();function Yt(A){let{min:e,max:t}=A;return[[e[0],e[1],e[2]],[t[0],e[1],e[2]],[e[0],t[1],e[2]],[t[0],t[1],e[2]],[e[0],e[1],t[2]],[t[0],e[1],t[2]],[e[0],t[1],t[2]],[t[0],t[1],t[2]]]}function Vt(A,e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let[r,i,o]of Yt(A)){let a=[e[0]*r+e[4]*i+e[8]*o+e[12],e[1]*r+e[5]*i+e[9]*o+e[13],e[2]*r+e[6]*i+e[10]*o+e[14]];for(let s=0;s<3;s++)a[s]<t[s]&&(t[s]=a[s]),a[s]>n[s]&&(n[s]=a[s])}return{min:t,max:n}}function gt(A,e){return[A[0]*e[0]+A[4]*e[1]+A[8]*e[2]+A[12],A[1]*e[0]+A[5]*e[1]+A[9]*e[2]+A[13],A[2]*e[0]+A[6]*e[1]+A[10]*e[2]+A[14]]}function sr(A){return Math.abs(A[1])>.98?[0,0,1]:[0,-1,0]}function gr(A,e,t,n){if(e.length===0)return null;let r=L.normalize(A.direction),i=e.flatMap(Yt),o=[...i,...t.flatMap(Yt)];if(A.type==="directional"){let Q=[0,0,0];for(let R of i)Q[0]+=R[0]/i.length,Q[1]+=R[1]/i.length,Q[2]+=R[2]/i.length;let C=L.subtract(Q,L.multiplyScalar(r,1)),m=uA.lookAt(C,Q,sr(r)),h=1/0,d=-1/0,y=1/0,w=-1/0;for(let R of i){let z=gt(m,R);h=Math.min(h,z[0]),d=Math.max(d,z[0]),y=Math.min(y,z[1]),w=Math.max(w,z[1])}let G=1/0,x=-1/0;for(let R of o){let z=gt(m,R)[2];G=Math.min(G,z),x=Math.max(x,z)}let b=Math.max(d-h,w-y)*.5*1.08+4,F=(h+d)/2,k=(y+w)/2,H=Math.max(10,(x-G)*.02),_=uA.orthographic(F-b,F+b,k-b,k+b,G-H,x+H);return{viewProj:uA.multiply(_,m),texelWorldSize:2*b/n}}let a=A.position,s=uA.lookAt(a,L.add(a,r),sr(r)),g=1/0,l=0,I=0;for(let Q of o){let C=gt(s,Q)[2];C>0&&(g=Math.min(g,C),l=Math.max(l,C))}for(let Q of i)I=Math.max(I,gt(s,Q)[2]);if(!Number.isFinite(g)||l<=0)return null;g=Math.max(1,g*.9),l=l*1.05+1;let u=Math.min(170,2*(A.angle??45)+4)*Math.PI/180,E=uA.perspective(u,1,g,l);return{viewProj:uA.multiply(E,s),texelWorldSize:2*Math.tan(u/2)*Math.max(I,g)/n}}T();T();var lr=`
1245
+ ${se}
1246
+
1247
+ struct TextModelUniforms {
1248
+ modelMatrix : mat4x4<f32>, // paragraph px -> world
1249
+ normalMatrix : mat4x4<f32>,
1250
+ params : vec4<f32>, // x = opacity, y = slant, z = twoSided (1.0 = yes), w = pull toward the eye
1251
+ materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
1252
+ pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
1253
+ emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
1254
+ };
1255
+
1256
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
1257
+ @group(1) @binding(0) var<uniform> model : TextModelUniforms;
1258
+ ${le(1,1)}@group(2) @binding(0) var curvesTex : texture_2d<f32>;
1259
+ @group(2) @binding(1) var bandsTex : texture_2d<u32>;
1260
+ ${ge}
1261
+
1262
+ ${Tn}
1263
+
1264
+ struct VSOut {
1265
+ @builtin(position) pos : vec4<f32>,
1266
+ @location(0) uv : vec2<f32>,
1267
+ @location(1) @interpolate(flat) glyphScale : vec2<f32>,
1268
+ @location(2) @interpolate(flat) bandScale : vec2<f32>,
1269
+ @location(3) @interpolate(flat) bandMax : vec2<u32>,
1270
+ @location(4) @interpolate(flat) bandsTexCoords : vec2<u32>,
1271
+ @location(5) color : vec4<f32>,
1272
+ @location(6) @interpolate(flat) fx : vec4<f32>, // x = blur, y = chromatic shift, z = dissolve, w = vfx
1273
+ @location(7) worldPos : vec3<f32>,
1274
+ @location(8) @interpolate(flat) worldNormal : vec3<f32>,
1275
+ @location(9) linearDepth : f32,
1276
+ };
1277
+
1278
+ var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
1279
+ vec2<f32>(-1.0, -1.0),
1280
+ vec2<f32>(1.0, 1.0),
1281
+ vec2<f32>(-1.0, 1.0),
1282
+ vec2<f32>(-1.0, -1.0),
1283
+ vec2<f32>(1.0, -1.0),
1284
+ vec2<f32>(1.0, 1.0)
1285
+ );
1286
+
1287
+ // Screen pixels moved per paragraph unit along the axis whose clip-space step
1288
+ // is dc, at clip position c: the derivative of the perspective divide.
1289
+ fn pixelsPerUnitAlong(c: vec4<f32>, dc: vec4<f32>) -> vec2<f32> {
1290
+ let w = max(c.w, 1e-4);
1291
+ return (dc.xy * w - c.xy * dc.w) / (w * w) * 0.5 * cam.screenParams.xy;
1292
+ }
1293
+
1294
+ @vertex fn vs(
1295
+ @builtin(vertex_index) vertex_index : u32,
1296
+ @location(0) aScaleBias : vec4<f32>,
1297
+ @location(1) aGlyphBandScale : vec4<f32>,
1298
+ @location(2) aBandMaxTexCoords : vec4<f32>,
1299
+ @location(3) aAnim : vec4<f32>, // x = rotation, y = scale_mult, zw = translation
1300
+ @location(4) aColor : vec4<f32>,
1301
+ @location(5) aExtraParams : vec4<f32>,
1302
+ ) -> VSOut {
1303
+ let quad_pos = pos[vertex_index];
1304
+ let angle = aAnim.x;
1305
+ let scale_mult = aAnim.y;
1306
+ let origin = aScaleBias.zw + aAnim.zw;
1307
+ let slant = model.params.y;
1308
+ let rot = mat2x2<f32>(cos(angle), sin(angle), -sin(angle), cos(angle));
1309
+ let shear = mat2x2<f32>(1.0, 0.0, -slant, 1.0);
1310
+ let glyphToParagraph = rot * shear;
1311
+
1312
+ let clipFromParagraph = cam.viewProjMatrix * model.modelMatrix;
1313
+
1314
+ // Slug's dynamic dilation, under perspective: grow the quad by one screen
1315
+ // pixel so edge pixels whose centres fall just outside the outline's box
1316
+ // are still shaded. The pixel is measured at this corner through the
1317
+ // projection's Jacobian, along the paragraph direction that gets the fewest
1318
+ // pixels (its smallest singular value), so foreshortened sides are covered.
1319
+ let corner = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult);
1320
+ let cornerClip = clipFromParagraph * vec4<f32>(corner, 0.0, 1.0);
1321
+ let jx = pixelsPerUnitAlong(cornerClip, clipFromParagraph[0]);
1322
+ let jy = pixelsPerUnitAlong(cornerClip, clipFromParagraph[1]);
1323
+ let e = dot(jx, jx) + dot(jy, jy);
1324
+ let det = jx.x * jy.y - jx.y * jy.x;
1325
+ let minPixelsPerUnit = sqrt(max(0.5 * (e - sqrt(max(e * e - 4.0 * det * det, 0.0))), 0.0));
1326
+ let halfSize = max(abs(aScaleBias.xy * scale_mult), vec2<f32>(1e-4));
1327
+ // Bounded at three times the glyph: seen nearly edge-on a pixel spans
1328
+ // most of the paragraph, and the glyph is a sliver either way.
1329
+ let dilation = min(vec2<f32>(1.0 / max(minPixelsPerUnit, 1e-6)), halfSize * 2.0);
1330
+ let grow = vec2<f32>(1.0) + dilation / halfSize;
1331
+
1332
+ let paragraphPos = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult * grow);
1333
+ let world4 = model.modelMatrix * vec4<f32>(paragraphPos, 0.0, 1.0);
1334
+ // Slide toward the eye along the view ray: the same pixel, a nearer depth.
1335
+ // Passes stacked on one plane (shadow, stroke, fill, a backdrop) resolve
1336
+ // by draw order instead of z-fighting.
1337
+ let world = world4.xyz + (cam.cameraPos.xyz - world4.xyz) * model.params.w;
1338
+
1339
+ var out : VSOut;
1340
+ out.pos = cam.viewProjMatrix * vec4<f32>(world, 1.0);
1341
+ out.uv = vec2<f32>(
1342
+ quad_pos.x * grow.x * 0.5 + 0.5,
1343
+ 1.0 - (quad_pos.y * grow.y * 0.5 + 0.5),
1344
+ );
1345
+ out.glyphScale = aGlyphBandScale.xy;
1346
+ out.bandScale = aGlyphBandScale.zw;
1347
+ out.bandMax = vec2<u32>(aBandMaxTexCoords.xy);
1348
+ out.bandsTexCoords = vec2<u32>(aBandMaxTexCoords.zw);
1349
+ out.color = aColor;
1350
+ out.fx = aExtraParams;
1351
+ out.worldPos = world4.xyz;
1352
+ out.worldNormal = normalize((model.normalMatrix * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
1353
+ out.linearDepth = dot(world4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
1354
+ return out;
1355
+ }
1356
+
1357
+ struct TextFragment {
1358
+ color : vec4<f32>, // premultiplied display color; alpha 0 = discard
1359
+ hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
1360
+ };
1361
+
1362
+ fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
1363
+ var out : TextFragment;
1364
+ out.color = vec4<f32>(0.0);
1365
+ out.hdr = vec4<f32>(0.0);
1366
+ // One-sided text culls against its plane's normal, as one-sided quads do.
1367
+ if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
1368
+ return out;
1369
+ }
1370
+ let glyph = SlugGlyph(in.glyphScale, in.bandScale, in.bandMax, in.bandsTexCoords);
1371
+ let shaded = shadeSlugGlyph(
1372
+ in.uv,
1373
+ fw,
1374
+ in.pos.xy,
1375
+ glyph,
1376
+ in.color,
1377
+ model.params.x,
1378
+ in.fx.x,
1379
+ in.fx.y,
1380
+ in.fx.z,
1381
+ );
1382
+ if (shaded.a < 0.0001) {
1383
+ return out;
1384
+ }
1385
+ let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive);
1386
+ out.color = vec4<f32>(lit.display * shaded.a, shaded.a);
1387
+ out.hdr = vec4<f32>(lit.hdr * shaded.a, shaded.a);
1388
+ return out;
1389
+ }
1390
+
1391
+ fn textFragment(in : VSOut) -> TextFragment {
1392
+ let fw = max(abs(dpdx(in.uv)) + abs(dpdy(in.uv)), vec2<f32>(0.000001));
1393
+ let m = matteCoverage(in.pos.xy);
1394
+ var f = shadeText(in, fw);
1395
+ f.color *= m;
1396
+ f.hdr *= m;
1397
+ if (f.color.a < 0.0001) {
1398
+ discard;
1399
+ }
1400
+ return f;
1401
+ }
1402
+
1403
+ @fragment fn fs_single(in : VSOut) -> @location(0) vec4<f32> {
1404
+ return textFragment(in).color;
1405
+ }
1406
+
1407
+ struct MrtOutput {
1408
+ @location(0) color : vec4<f32>,
1409
+ @location(1) depth : vec4<f32>,
1410
+ };
1411
+
1412
+ struct BloomOutput {
1413
+ @location(0) color : vec4<f32>,
1414
+ @location(1) hdr : vec4<f32>,
1415
+ };
1416
+
1417
+ struct MrtBloomOutput {
1418
+ @location(0) color : vec4<f32>,
1419
+ @location(1) depth : vec4<f32>,
1420
+ @location(2) hdr : vec4<f32>,
1421
+ };
1422
+
1423
+ @fragment fn fs_mrt(in : VSOut) -> MrtOutput {
1424
+ var out : MrtOutput;
1425
+ out.color = textFragment(in).color;
1426
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1427
+ return out;
1428
+ }
1429
+
1430
+ @fragment fn fs_single_bloom(in : VSOut) -> BloomOutput {
1431
+ let f = textFragment(in);
1432
+ var out : BloomOutput;
1433
+ out.color = f.color;
1434
+ out.hdr = f.hdr;
1435
+ return out;
1436
+ }
1437
+
1438
+ @fragment fn fs_mrt_bloom(in : VSOut) -> MrtBloomOutput {
1439
+ let f = textFragment(in);
1440
+ var out : MrtBloomOutput;
1441
+ out.color = f.color;
1442
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1443
+ out.hdr = f.hdr;
1444
+ return out;
1445
+ }
1446
+ `;var Ir=24,lt=class{device;pipelineSingle;pipelineMrt;bloomVariants;modelLayout;fontLayout;modelPool;instancePool;fontBindGroups=new WeakMap;modelData=new Float32Array(40+WA);constructor(e,t,n,r,i,o=1){this.device=e,this.modelPool=new GA((40+WA)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.instancePool=new GA(65536,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let a=e.createShaderModule({label:"slug3d.wgsl",code:lr});this.modelLayout=e.createBindGroupLayout({label:"Slug3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},Ie(1)]}),this.fontLayout=e.createBindGroupLayout({label:"Slug3DFontLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"uint"}}]});let s=e.createPipelineLayout({bindGroupLayouts:[r,this.modelLayout,this.fontLayout,i]}),g={module:a,entryPoint:"vs",buffers:[{arrayStride:Ir*4,stepMode:"instance",attributes:[{shaderLocation:0,offset:0,format:"float32x4"},{shaderLocation:1,offset:16,format:"float32x4"},{shaderLocation:2,offset:32,format:"float32x4"},{shaderLocation:3,offset:48,format:"float32x4"},{shaderLocation:4,offset:64,format:"float32x4"},{shaderLocation:5,offset:80,format:"float32x4"}]}]},l={color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}},I={format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},u={topology:"triangle-list",cullMode:"none"},E={count:o};this.pipelineSingle=e.createRenderPipeline({label:"Slug3DPipelineSingle",layout:s,vertex:g,fragment:{module:a,entryPoint:"fs_single",targets:[{format:t,blend:l}]},depthStencil:I,primitive:u,multisample:E}),this.pipelineMrt=e.createRenderPipeline({label:"Slug3DPipelineMrt",layout:s,vertex:g,fragment:{module:a,entryPoint:"fs_mrt",targets:[{format:t,blend:l},{format:"rgba16float"}]},depthStencil:I,primitive:u,multisample:E}),this.bloomVariants=new jA(e,{label:"Slug3DPipeline",layout:s,vertex:g,module:a,format:t,depthStencil:I,primitive:u,multisample:E})}resetPools(){this.modelPool.reset(),this.instancePool.reset()}draw(e,t,n,r,i,o,a,s=!1,g=!1){if(o===0||!r.curvesTex||!r.bandsTex)return;this.modelData.set(a.modelMatrix,0),this.modelData.set(a.normalMatrix,16),this.modelData[32]=a.opacity,this.modelData[33]=a.slant,this.modelData[34]=a.twoSided?1:0,this.modelData[35]=a.depthPull,this.modelData.set(Kt(a),36),ue(a,this.modelData,40);let l=this.modelPool.getBuffer(this.device,this.modelData),I=this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:l}},{binding:1,resource:a.matte?.createView()??ce(this.device)}]}),u=this.instancePool.getBuffer(this.device,i.subarray(0,o*Ir));e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,I),e.setBindGroup(2,this.fontBindGroup(r.curvesTex,r.bandsTex)),e.setBindGroup(3,n),e.setVertexBuffer(0,u),e.draw(6,o)}fontBindGroup(e,t){let n=this.fontBindGroups.get(e);return n||(n=this.device.createBindGroup({layout:this.fontLayout,entries:[{binding:0,resource:e.createView()},{binding:1,resource:t.createView()}]}),this.fontBindGroups.set(e,n)),n}destroy(){this.modelPool.destroy(),this.instancePool.destroy()}};var Zi={repeat:"repeat",clamp:"clamp-to-edge",mirror:"mirror-repeat"},qi=5e-4,cr=class{device;format;quad3dPipeline;slug3dPipeline;mesh3dPipeline;audioMeshDeformPipeline;dofPipeline;dofBindGroupLayout;cameraPool;lightsPool;cameraUniformBindGroupCache=new Hn;samplerCache=new Jn;depthTexture=null;linearDepthTexture=null;msaaColorTexture=null;msaaLinearDepthTexture=null;msaaHdrTexture=null;hdrTexture=null;passWritesHdr=!1;cameraUniformData=new Float32Array(80);meshBuffersCache=new WeakMap;materialTextures=new WeakMap;materialMapCache=new WeakMap;modelCache=new Map;lastCameraPose=null;shadowTexture=null;placeholderShadowTexture=null;shadowSampler=null;meshBounds=new WeakMap;bloomPipeline=null;lastCameraBuffer=null;sampleCount;constructor(e,t,n=4){this.device=e,this.format=t,this.sampleCount=n,this.quad3dPipeline=new at(e,t,"depth24plus",n),this.slug3dPipeline=new lt(e,t,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.mesh3dPipeline=new st(e,t,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.audioMeshDeformPipeline=new $e(e),this.cameraPool=new GA(320,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.lightsPool=new GA(Rt,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let r=e.createShaderModule({label:"dof-bokeh.wgsl",code:nr});this.dofBindGroupLayout=e.createBindGroupLayout({label:"DoFBindGroupLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.dofPipeline=e.createRenderPipeline({label:"DoFBokehPipeline",layout:e.createPipelineLayout({bindGroupLayouts:[this.dofBindGroupLayout]}),vertex:{module:r,entryPoint:"vs_fullscreen"},fragment:{module:r,entryPoint:"fs_dof",targets:[{format:t}]},primitive:{topology:"triangle-list"}})}resetPools(){this.bloomPipeline?.resetPools(),this.cameraPool.reset(),this.lastCameraPose=null,this.lastCameraBuffer=null,this.lightsPool.reset(),this.quad3dPipeline.resetPools(),this.slug3dPipeline.resetPools(),this.mesh3dPipeline.resetPools(),this.audioMeshDeformPipeline.resetPools()}getOrCreateDepthTexture(e,t){return(!this.depthTexture||this.depthTexture.width!==e||this.depthTexture.height!==t)&&(this.depthTexture?.destroy(),this.depthTexture=this.device.createTexture({label:"Renderer3DDepthTexture",size:{width:e,height:t},format:"depth24plus",sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT})),this.depthTexture}getOrCreateMsaaTexture(e,t,n,r,i){return e&&e.width===r&&e.height===i?e:(e?.destroy(),this.device.createTexture({label:t,size:{width:r,height:i},format:n,sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT}))}hdrSource(){return this.hdrTexture}getOrCreateHdrTexture(e,t){return(!this.hdrTexture||this.hdrTexture.width!==e||this.hdrTexture.height!==t)&&(this.hdrTexture?.destroy(),this.hdrTexture=this.device.createTexture({label:"Renderer3DHdrRadiance",size:{width:e,height:t},format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),this.hdrTexture}getOrCreateLinearDepthTexture(e,t){return(!this.linearDepthTexture||this.linearDepthTexture.width!==e||this.linearDepthTexture.height!==t)&&(this.linearDepthTexture?.destroy(),this.linearDepthTexture=this.device.createTexture({label:"Renderer3DLinearDepthTexture",size:{width:e,height:t},format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),this.linearDepthTexture}packCameraUniforms(e,t,n,r=0){if(this.lastCameraPose&&this.lastCameraBuffer&&this.lastCameraPose.eye[0]===e.eye[0]&&this.lastCameraPose.eye[1]===e.eye[1]&&this.lastCameraPose.eye[2]===e.eye[2]&&this.lastCameraPose.target[0]===e.target[0]&&this.lastCameraPose.target[1]===e.target[1]&&this.lastCameraPose.target[2]===e.target[2]&&this.lastCameraPose.up[0]===e.up[0]&&this.lastCameraPose.up[1]===e.up[1]&&this.lastCameraPose.up[2]===e.up[2]&&this.lastCameraPose.fov===e.fov&&this.lastCameraPose.near===e.near&&this.lastCameraPose.far===e.far)return this.lastCameraBuffer;let i=oe.computeViewMatrix(e),o=oe.computeProjectionMatrix(e),a=oe.computeViewProjectionMatrix(e),s=uA.invert(a)??uA.identity();this.cameraUniformData.set(i,0),this.cameraUniformData.set(o,16),this.cameraUniformData.set(a,32),this.cameraUniformData.set(s,48),this.cameraUniformData[64]=e.eye[0],this.cameraUniformData[65]=e.eye[1],this.cameraUniformData[66]=e.eye[2],this.cameraUniformData[67]=e.near;let g=L.normalize(L.subtract(e.target,e.eye));this.cameraUniformData[68]=g[0],this.cameraUniformData[69]=g[1],this.cameraUniformData[70]=g[2],this.cameraUniformData[71]=e.far,this.cameraUniformData[72]=e.focusDistance??1e3,this.cameraUniformData[73]=e.fStop??2.8,this.cameraUniformData[74]=e.maxBlurRadius??32,this.cameraUniformData[75]=e.focusDistance!==void 0?1:0,this.cameraUniformData[76]=t,this.cameraUniformData[77]=n,this.cameraUniformData[78]=r,this.cameraUniformData[79]=0;let l=this.cameraPool.getBuffer(this.device,this.cameraUniformData);return this.lastCameraPose=e,this.lastCameraBuffer=l,l}createCameraBindGroup(e){return this.cameraUniformBindGroupCache.getBindGroup(this.device,this.quad3dPipeline.cameraLayout,e)}getOrCreateLightsBuffer(e,t){let n=VA.packLightsUniforms(e??[],t?.environment,t?.shadow);return this.lightsPool.getBuffer(this.device,n)}createLightsBindGroup(e,t){this.shadowSampler??=this.device.createSampler({label:"ShadowComparisonSampler",compare:"less-equal",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.placeholderShadowTexture??=this.device.createTexture({label:"ShadowMapPlaceholder",size:{width:1,height:1},format:it,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});let n=t&&this.shadowTexture?this.shadowTexture:this.placeholderShadowTexture;return this.device.createBindGroup({label:"Lights3DBindGroup",layout:this.quad3dPipeline.lightsLayout,entries:[{binding:0,resource:{buffer:e}},{binding:1,resource:n.createView()},{binding:2,resource:this.shadowSampler}]})}meshAabb(e){let t=this.meshBounds.get(e);if(!t){let n=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0],i=e.positions;for(let o=0;o+2<i.length;o+=3)for(let a=0;a<3;a++){let s=i[o+a];s<n[a]&&(n[a]=s),s>r[a]&&(r[a]=s)}t=Number.isFinite(n[0])?{min:n,max:r}:{min:[0,0,0],max:[0,0,0]},this.meshBounds.set(e,t)}return t}worldBounds(e){return e.kind==="mesh"?Vt(this.meshAabb(e.mesh),this.meshModelMatrix(e.opts)):Vt({min:[-.5,-.5,0],max:[.5,.5,0]},this.quadModelMatrix(e.opts))}renderShadowMap(e,t,n,r,i,o={}){let a=t.lightType??t.type;if(a!=="directional"&&a!=="spot")return null;let s=VA.processLight(t),g=[s.posType[0],s.posType[1],s.posType[2]],l=[s.dirRadius[0],s.dirRadius[1],s.dirRadius[2]],I=o.mapSize??2048,u=r.map(d=>this.worldBounds(d)),E=gr({type:a,position:g,direction:l,angle:t.angle},u,i,I);if(!E)return null;(!this.shadowTexture||this.shadowTexture.width!==I)&&(this.shadowTexture?.destroy(),this.shadowTexture=this.device.createTexture({label:"ShadowMap",size:{width:I,height:I},format:it,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}));let Q=new Float32Array(80);Q.set(E.viewProj,32),Q.set(E.viewProj,0),Q[5]=1,Q.set(E.viewProj,16),Q[64]=g[0],Q[65]=g[1],Q[66]=g[2],Q[68]=l[0],Q[69]=l[1],Q[70]=l[2],Q[76]=I,Q[77]=I;let C=this.createCameraBindGroup(this.cameraPool.getBuffer(this.device,Q)),m=e.beginRenderPass({label:"ShadowMapPass",colorAttachments:[],depthStencilAttachment:{view:this.shadowTexture.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),h=this.samplerCache.getSampler(this.device);for(let d of r)if(d.kind==="mesh"){let y=this.meshModelMatrix(d.opts);this.mesh3dPipeline.drawShadow(m,C,d.buffers??this.getOrCreateMeshBuffers(d.mesh),{modelMatrix:y,normalMatrix:d.opts.normalMatrix??VA.computeNormalMatrix(y),isSkinned:d.opts.isSkinned,skinningMatrices:d.opts.skinningMatrices})}else{let y=this.quadModelMatrix(d.opts);this.quad3dPipeline.drawShadow(m,C,d.texture,h,{modelMatrix:y,normalMatrix:y,width:d.opts.width,height:d.opts.height,textureExtent:d.opts.textureExtent,opacity:d.opts.opacity,colorTint:d.opts.colorTint})}return m.end(),{matrix:E.viewProj,lightIndex:n,mapSize:I,softness:o.softness??t.shadowSoftness??2.5,bias:a==="directional"?6e-4:8e-5,normalOffset:E.texelWorldSize*1.5,darkness:o.darkness??t.shadowDarkness??1}}beginPass(e,t,n,r,i,o="clear",a={r:0,g:0,b:0,a:0},s,g,l,I=!1){let u=this.getOrCreateDepthTexture(n,r),E=this.packCameraUniforms(i,n,r),Q=this.createCameraBindGroup(E),C=this.getOrCreateLightsBuffer(g,l),m=this.createLightsBindGroup(C,!!l?.shadow),h=this.sampleCount>1;if(h&&o==="load")throw new Error("Renderer3D.beginPass: loadOp 'load' needs a Renderer3D built with sampleCount 1");let d=(G,x,b,F)=>x?{view:x.createView(),resolveTarget:G,loadOp:"clear",storeOp:"discard",clearValue:b}:{view:G,loadOp:F,storeOp:"store",clearValue:b};h&&(this.msaaColorTexture=this.getOrCreateMsaaTexture(this.msaaColorTexture,"Renderer3DMsaaColor",this.format,n,r));let y=[d(t,h?this.msaaColorTexture:null,a,o)];return s&&(h&&(this.msaaLinearDepthTexture=this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture,"Renderer3DMsaaLinearDepth","rgba16float",n,r)),y.push(d(s,h?this.msaaLinearDepthTexture:null,{r:i.far,g:0,b:0,a:1},"clear"))),this.passWritesHdr=I,I&&(this.hdrTexture=this.getOrCreateHdrTexture(n,r),h&&(this.msaaHdrTexture=this.getOrCreateMsaaTexture(this.msaaHdrTexture,"Renderer3DMsaaHdr","rgba16float",n,r)),y.push(d(this.hdrTexture.createView(),h?this.msaaHdrTexture:null,{r:0,g:0,b:0,a:0},"clear"))),{pass:e.beginRenderPass({colorAttachments:y,depthStencilAttachment:{view:u.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:h?"discard":"store"}}),cameraBindGroup:Q,cameraBuffer:E,lightsBindGroup:m}}quadModelMatrix(e){if(e.modelMatrix)return e.modelMatrix;let{position:t,width:n,height:r,rotation:i=[0,0,0],scale:o=[1,1,1],anchor:a=[.5,.5]}=e,s=uA.identity();s=uA.multiply(s,uA.translate(t[0],t[1],t[2]));let g=i[0]*Math.PI/180,l=i[1]*Math.PI/180,I=i[2]*Math.PI/180;I!==0&&(s=uA.multiply(s,uA.rotateZ(I))),l!==0&&(s=uA.multiply(s,uA.rotateY(l))),g!==0&&(s=uA.multiply(s,uA.rotateX(g)));let u=n*o[0],E=r*o[1],Q=o[2];s=uA.multiply(s,uA.scale(u,E,Q));let C=.5-a[0],m=.5-a[1];return(C!==0||m!==0)&&(s=uA.multiply(s,uA.translate(C,m,0))),s}drawSlugText(e,t,n,r,i,o=0,a=!1){let{width:s,height:g}=i;if(!(s>0&&g>0))return;let l=this.quadModelMatrix(i),I=i.normalMatrix??VA.computeNormalMatrix(l),u=uA.multiply(l,uA.multiply(uA.translate(-.5,-.5,0),uA.scale(1/s,1/g,1)));for(let E=0;E<r.length;E++){let Q=r[E],[C,m,h,d,y,w]=Q.transform,G=[C,m,0,0,h,d,0,0,0,0,1,0,y,w,0,1];this.slug3dPipeline.draw(e,t,n,Q.font,Q.instances,Q.instanceCount,{modelMatrix:uA.multiply(u,G),normalMatrix:I,opacity:Q.opacity*(i.opacity??1),slant:Q.slant,twoSided:i.twoSided??!0,depthPull:qi*(o+E+1),material:i.material,shininess:i.shininess??32,roughness:i.roughness,specularIntensity:i.specularIntensity??.5,ambientIntensity:i.ambientIntensity??1,metallic:i.metallic,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,matte:i.matte},a,this.passWritesHdr)}}drawTextureQuad(e,t,n,r,i,o=!1){let{width:a,height:s,opacity:g=1,colorTint:l=[1,1,1,1],borderColor:I,borderWidth:u=0,borderRadius:E=0,twoSided:Q=!0,material:C="lit",shininess:m=32,roughness:h,specularIntensity:d=.5,ambientIntensity:y=1,metallic:w}=i,G=this.quadModelMatrix(i),x=i.normalMatrix??VA.computeNormalMatrix(G),b=this.samplerCache.getSampler(this.device),F;if(I)if(Array.isArray(I))F=I;else{let k=Xe(I);F=[k.r,k.g,k.b,k.a]}this.quad3dPipeline.draw(e,t,n,r,b,{modelMatrix:G,normalMatrix:x,colorTint:l,borderColor:F,borderWidth:u,opacity:g,borderRadius:E,twoSided:Q,width:a,height:s,textureExtent:i.textureExtent,material:C,shininess:m,roughness:h,specularIntensity:d,ambientIntensity:y,metallic:w,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,matte:i.matte},o,this.passWritesHdr)}meshModelMatrix(e){if(e.modelMatrix)return e.modelMatrix;let{position:t=[0,0,0],rotation:n=[0,0,0],scale:r=[1,1,1]}=e,i=uA.translate(t[0],t[1],t[2]),o=n[0]*Math.PI/180,a=n[1]*Math.PI/180,s=n[2]*Math.PI/180;return s!==0&&(i=uA.multiply(i,uA.rotateZ(s))),a!==0&&(i=uA.multiply(i,uA.rotateY(a))),o!==0&&(i=uA.multiply(i,uA.rotateX(o))),uA.multiply(i,uA.scale(r[0],r[1],r[2]))}getOrCreateMeshBuffers(e){let t=this.meshBuffersCache.get(e);if(t)return t;let n=e.positions.length/3,r=new Float32Array(n*16);for(let l=0;l<n;l++){let I=l*16;r[I]=e.positions[l*3]??0,r[I+1]=e.positions[l*3+1]??0,r[I+2]=e.positions[l*3+2]??0,r[I+3]=e.uvs[l*2]??0,r[I+4]=e.uvs[l*2+1]??0,r[I+5]=e.normals[l*3]??0,r[I+6]=e.normals[l*3+1]??0,r[I+7]=e.normals[l*3+2]??1,e.jointIndices?(r[I+8]=e.jointIndices[l*4]??0,r[I+9]=e.jointIndices[l*4+1]??0,r[I+10]=e.jointIndices[l*4+2]??0,r[I+11]=e.jointIndices[l*4+3]??0):(r[I+8]=0,r[I+9]=0,r[I+10]=0,r[I+11]=0),e.jointWeights?(r[I+12]=e.jointWeights[l*4]??0,r[I+13]=e.jointWeights[l*4+1]??0,r[I+14]=e.jointWeights[l*4+2]??0,r[I+15]=e.jointWeights[l*4+3]??0):(r[I+12]=0,r[I+13]=0,r[I+14]=0,r[I+15]=0)}let i=Math.ceil(r.byteLength/4)*4,o=this.device.createBuffer({size:Math.max(4,i),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,mappedAtCreation:!0});new Float32Array(o.getMappedRange()).set(r),o.unmap();let a=e.indices instanceof Uint32Array,s=Math.ceil(e.indices.byteLength/4)*4,g=this.device.createBuffer({size:Math.max(4,s),usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return a?new Uint32Array(g.getMappedRange()).set(e.indices):new Uint16Array(g.getMappedRange()).set(e.indices),g.unmap(),t={vertexBuffer:o,indexBuffer:g,indexCount:e.indices.length,indexFormat:a?"uint32":"uint16"},this.meshBuffersCache.set(e,t),t}deformMesh(e,t,n){let r=this.getOrCreateMeshBuffers(t),i=t.positions.length/3;return{vertexBuffer:this.audioMeshDeformPipeline.execute(e,r.vertexBuffer,{config:n.config,audioLatentBuffer:n.latentBuffer,vertexCount:i,timeMs:n.timeMs,sampleRate:n.sampleRate}),indexBuffer:r.indexBuffer,indexCount:r.indexCount,indexFormat:r.indexFormat}}drawMesh3D(e,t,n,r,i,o={},a=!1){let s="vertexBuffer"in r?r:this.getOrCreateMeshBuffers(r),{opacity:g=1,colorTint:l=[1,1,1,1],twoSided:I=!0,wireframe:u=!1,isSkinned:E=!1,skinningMatrices:Q,material:C="lit",shadeColor:m,alphaCutoff:h,textureWrap:d="clamp",shininess:y=32,roughness:w,specularIntensity:G=.5,ambientIntensity:x=1,metallic:b}=o,F=this.meshModelMatrix(o),k=o.normalMatrix??VA.computeNormalMatrix(F),H=Zi[d],_=this.samplerCache.getSampler(this.device,{addressModeU:H,addressModeV:H});this.mesh3dPipeline.draw(e,t,n,s,i,_,{modelMatrix:F,normalMatrix:k,colorTint:l,opacity:g,twoSided:I,wireframe:u,isSkinned:E,skinningMatrices:Q,material:C,shadeColor:m,alphaCutoff:h,shininess:y,roughness:w,specularIntensity:G,ambientIntensity:x,metallic:b,emissive:o.emissive,emissiveIntensity:o.emissiveIntensity,matte:o.matte,maps:o.maps},a,this.passWritesHdr)}loadModel(e,t="auto",n={}){if(typeof e!="string")return ur(e,t,n);let r=`${t}|${JSON.stringify(n)}|${e}`,i=this.modelCache.get(r);return i||(i=ur(e,t,n),this.modelCache.set(r,i)),i}materialTexture(e){let t=this.materialTextures.get(e);return t||(t=this.uploadMaterialTexture(e),this.materialTextures.set(e,t)),t}materialMaps(e){let t=this.materialMapCache.get(e);return t||(t=(async()=>{let n=e.name,[r,i,o,a]=await Promise.all([this.uploadImage(e.normalTextureBuffer,`${n}:normal`),this.uploadImage(e.metallicRoughnessTextureBuffer,`${n}:metallicRoughness`),this.uploadImage(e.occlusionTextureBuffer,`${n}:occlusion`),this.uploadImage(e.emissiveTextureBuffer,`${n}:emissive`)]);return{...r&&{normal:r,normalScale:e.normalScale??1},...i&&{metallicRoughness:i},...o&&{occlusion:o,occlusionStrength:e.occlusionStrength??1},...a&&{emissive:a}}})(),this.materialMapCache.set(e,t)),t}uploadMaterialTexture(e){return this.uploadImage(e.diffuseTextureBuffer,`Material:${e.name}`)}async uploadImage(e,t){if(!e)return;let n=(await import("./sharp-V6ZTBNDW.mjs")).default,r=Buffer.from(e instanceof Uint8Array?e:new Uint8Array(e)),{width:i,height:o}=await n(r).metadata();if(!i||!o)return;let a=Math.floor(Math.log2(Math.max(i,o)))+1,s=this.device.createTexture({label:t,size:{width:i,height:o},mipLevelCount:a,format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});for(let g=0;g<a;g++){let l=Math.max(1,i>>g),I=Math.max(1,o>>g),u=await n(r).ensureAlpha().resize(l,I,{fit:"fill"}).raw().toBuffer();this.device.queue.writeTexture({texture:s,mipLevel:g},u,{bytesPerRow:l*4,rowsPerImage:I},{width:l,height:I})}return s}applyBloom(e,t,n,r={},i){this.bloomPipeline??=new rt(this.device),this.bloomPipeline.apply(e,t,n,r,i??void 0)}applyDepthOfField(e,t,n,r,i){let o=this.samplerCache.getSampler(this.device),a=this.device.createBindGroup({layout:this.dofBindGroupLayout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:o},{binding:2,resource:t.createView()},{binding:3,resource:n.createView()}]}),s=e.beginRenderPass({colorAttachments:[{view:r,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});s.setPipeline(this.dofPipeline),s.setBindGroup(0,a),s.draw(3),s.end()}destroy(){this.bloomPipeline?.destroy(),this.depthTexture?.destroy(),this.shadowTexture?.destroy(),this.placeholderShadowTexture?.destroy(),this.linearDepthTexture?.destroy(),this.msaaColorTexture?.destroy(),this.msaaLinearDepthTexture?.destroy(),this.msaaHdrTexture?.destroy(),this.hdrTexture?.destroy(),this.quad3dPipeline.destroy(),this.slug3dPipeline.destroy(),this.mesh3dPipeline.destroy(),this.cameraPool.destroy(),this.lightsPool.destroy(),this.cameraUniformBindGroupCache.destroy()}};function ur(A,e="auto",t={}){if(e==="gltf"||e==="glb")return At(A,t);if(e==="stl")return we(A,t);if(e==="ply")return xe(A,t);if(e==="vox")return et(A,t);if(e==="3ds")return tt(A,t);if(e==="off")return nt(A,t);if(e==="fbx")return De(A,t);if(e==="obj")return ye(A,void 0,t);let n=typeof A!="string",r=typeof A=="string"?A.trim():"",i=r.toLowerCase();if(i.endsWith(".glb")||i.endsWith(".gltf"))return At(A,t);if(i.endsWith(".stl"))return we(A,t);if(i.endsWith(".ply"))return xe(A,t);if(i.endsWith(".vox"))return et(A,t);if(i.endsWith(".3ds"))return tt(A,t);if(i.endsWith(".off"))return nt(A,t);if(i.endsWith(".fbx"))return De(A,t);if(i.endsWith(".obj"))return ye(A,void 0,t);if(n){let o=A instanceof Uint8Array?A:new Uint8Array(A);return ae.isGlb(o)?tr(o,t):$A.isBinary(o)?De(o,t):Ge.isVox(o)?et(o,t):Fe.is3DS(o)?tt(o,t):o.length>=3&&o[0]===112&&o[1]===108&&o[2]===121?xe(o,t):be.isBinary(o)?we(o,t):ye(o,void 0,t)}return r.startsWith("{")&&(r.includes('"asset"')||r.includes('"meshes"'))?At(r,t):r.startsWith("ply")||r.startsWith("PLY")?xe(r,t):r.startsWith("OFF")||r.startsWith("NOFF")||r.startsWith("COFF")?nt(r,t):r.includes("FBXHeaderExtension")||r.includes("Kaydara FBX")?De(r,t):r.startsWith("solid")&&r.includes("facet")?we(r,t):ye(A,void 0,t)}T();var{cbrt:Wt,sqrt:zt,PI:Be}=Math,_i=(A,e,t,n,r)=>{let i=e+t*A,o=i**2+n;if(o>0){let l=zt(o);return Wt(i+l)+Wt(i-l)-r}let a=Wt(zt(i*i-o)),s=i?Math.atan(zt(-o)/i):-Be/2,g;return t<0?g=(i>0?2*Be:Be)-s:r<0?g=(i>0?2*Be:-3*Be)+s:g=(i>0?0:Be)+s,2*a*Math.cos(g/3)-r},ji=(A,e,t,n)=>((e*A+3*t)*A+n)*A,Xt=A=>A;function Br(A,e,t,n){if(!(0<=A&&A<=1&&0<=t&&t<=1))throw new Error("bezier x values must be in [0, 1] range");if(A===e&&t===n)return Xt;let r=6*(3*A-3*t+1),i=6*(t-2*A),o=3*A,a=r*r,s=i*i,g=i/r,l=3*i*o/a-s*i/(a*r),I=2*o/r-s/a,u=I*I*I,E=3/r,Q=3*e-3*n+1,C=n-2*e,m=3*e,h=r?_i:Xt;return function(y){return y===0||y===1?y:ji(h(y,l,E,u,g),Q,C,m)}}var Vg={linear:Xt,ease:Br(.25,.1,.25,1),quad:A=>A*A,cubic:A=>A*A*A,poly:A=>e=>e**A,sin:A=>1-Math.cos(A*Math.PI/2),circle:A=>1-Math.sqrt(1-A*A),exp:A=>2**(10*(A-1)),elastic:(A=1)=>{let e=A*Math.PI;return t=>1-Math.cos(t*Math.PI/2)**3*Math.cos(t*e)},back:(A=1.70158)=>e=>e*e*((A+1)*e-A),bounce:A=>{if(A<1/2.75)return 7.5625*A*A;if(A<2/2.75){let t=A-.5454545454545454;return 7.5625*t*t+.75}if(A<2.5/2.75){let t=A-.8181818181818182;return 7.5625*t*t+.9375}let e=A-2.625/2.75;return 7.5625*e*e+.984375},bezier:Br,in:A=>A,out:A=>e=>1-A(1-e),inOut:A=>e=>e<.5?A(e*2)/2:1-A((1-e)*2)/2};function Er(A,e,t,n){let r=n?.extrapolateLeft??"extend",i=n?.extrapolateRight??"extend";if(e.length!==t.length)throw new Error("inputRange and outputRange must have the same length");if(e.length<2)throw new Error("inputRange must have at least 2 elements");let o=e[0],a=e[e.length-1];if(A<o){if(r==="clamp")return t[0];if(r==="identity")return A}if(A>a){if(i==="clamp")return t[t.length-1];if(i==="identity")return A}let s=1;for(;s<e.length-1&&!(A<e[s]);s++);let g=e[s-1],l=e[s],I=t[s-1],u=t[s];if(g===l)return I;let E=(A-g)/(l-g);return n?.easing&&(E=n.easing(E)),I+E*(u-I)}T();var $i={damping:10,mass:1,stiffness:100,overshootClamping:!1},Zt={};function Ao({animation:A,now:e,config:t}){let{toValue:n,lastTimestamp:r,current:i,velocity:o}=A,a=Math.min(e-r,64);if(t.damping<=0)throw new Error("Spring damping must be greater than 0, otherwise the spring() animation will never end, causing an infinite loop.");if(t.stiffness<=0)throw new Error("Spring stiffness must be greater than 0.");if(t.mass<=0)throw new Error("Spring mass must be greater than 0.");let s=t.damping,g=t.mass,l=t.stiffness,I=[n,r,i,o,s,g,l,e].join("-");if(Zt[I])return Zt[I];let u=-o,E=n-i,Q=s/(2*Math.sqrt(l*g)),C=Math.sqrt(l/g),m=C*Math.sqrt(1-Q**2),h=a/1e3,d=Math.sin(m*h),y=Math.cos(m*h),w=Math.exp(-Q*C*h),G=w*(d*((u+Q*C*E)/m)+E*y),x=n-G,b=Q*C*G-w*(y*(u+Q*C*E)-m*E*d),F=Math.exp(-C*h),k=n-F*(E+(u+C*E)*h),H=F*(u*(h*C-1)+h*E*C*C),_={toValue:n,prevPosition:i,lastTimestamp:e,current:Q<1?x:k,velocity:Q<1?b:H};return Zt[I]=_,_}var qt={};function Qr({frame:A,fps:e,config:t={}}){let i=[A,e,t.damping,t.mass,t.overshootClamping,t.stiffness].join("-");if(qt[i])return qt[i];let o={lastTimestamp:0,current:0,toValue:1,velocity:0,prevPosition:0},a=Math.max(0,A),s=a%1;for(let g=0;g<=Math.floor(a);g++){g===Math.floor(a)&&(g+=s);let l=g/e*1e3;o=Ao({animation:o,now:l,config:{...$i,...t}})}return qt[i]=o,o}var _t=new Map;function eo({fps:A,config:e={},threshold:t=.005}){if(typeof t!="number")throw new TypeError(`threshold must be a number, got ${t}`);if(t===0)return 1/0;if(t===1)return 0;if(Number.isNaN(t))throw new TypeError("Threshold is NaN");if(!Number.isFinite(t))throw new TypeError("Threshold is not finite");if(t<0)throw new TypeError("Threshold is below 0");let n=[A,e.damping,e.mass,e.overshootClamping,e.stiffness,t].join("-");if(_t.has(n))return _t.get(n);let r=0,i=0,o=()=>Qr({fps:A,frame:r,config:e}),a=o(),s=()=>Math.abs(a.current-a.toValue),g=s();for(;g>=t;)r++,a=o(),g=s();i=r;for(let l=0;l<20;l++)r++,a=o(),g=s(),g>=t&&(l=0,i=r+1);return _t.set(n,i),i}function Zg({frame:A,fps:e,config:t={},from:n=0,to:r=1,durationInFrames:i,durationRestThreshold:o,delay:a=0,reverse:s=!1}){let g=s||typeof i<"u",l=g?eo({fps:e,config:t,threshold:o}):void 0,I=g?{get:()=>l}:{get:()=>{throw new Error("did not calculate natural duration")}},E=(s?(i??I.get())-A:A)+(s?a:-a),Q=i===void 0?E:E/(i/I.get());if(i&&E>i)return r;let C=Qr({fps:e,frame:Q,config:t}),m=t.overshootClamping?r>=n?Math.min(C.current,r):Math.max(C.current,r):C.current;return n===0&&r===1?m:Er(m,[0,1],[n,r])}T();T();T();T();var Ue=new Set,jt=!1;function on(A,e,t=2){let n=e&&e.length,r=n?e[0]*t:A.length;Ue.size&&Ue.clear();let i=hr(A,0,r,t,!0),o=[];if(!i||i.next===i.prev)return o;let a=0,s=0,g=0;if(n&&(i=oo(A,e,i,t)),A.length>80*t){a=A[0],s=A[1];let l=a,I=s;for(let u=t;u<r;u+=t){let E=A[u],Q=A[u+1];E<a&&(a=E),Q<s&&(s=Q),E>l&&(l=E),Q>I&&(I=Q)}g=Math.max(l-a,I-s),g=g!==0?32767/g:0}return $t(i,o,a,s,g),o}function hr(A,e,t,n,r){let i=null;if(r===ho(A,e,t,n)>0)for(let o=e;o<t;o+=n)i=dr(o/n|0,A[o],A[o+1],i);else for(let o=t-n;o>=e;o-=n)i=dr(o/n|0,A[o],A[o+1],i);return i&&ve(i,i.next)&&(Le(i),i=i.next),i}function te(A,e=A){let t=e===A,n=A,r;do r=!1,n!==n.next&&(Ue.size===0||!Ue.has(n))&&(ve(n,n.next)||MA(n.prev,n,n.next)===0)?((t||n===e)&&(e=n.prev),jt=!0,Le(n),n=n.prev,r=!0):(t||n!==e)&&(n=n.next,r=!t);while(r||n!==e);return e}function $t(A,e,t,n,r){r&&uo(A,t,n,r);let i=A,o=!1;for(;A.prev!==A.next;){let a=A.prev,s=A.next;if(MA(a,A,s)<0&&(r?no(A,t,n,r):to(A))){e.push(a.i,A.i,s.i),Le(A),A=s,i=s;continue}if(A=s,A===i){if(jt=!1,A=te(A),jt){i=A;continue}if(!o){A=ro(A,e),i=A,o=!0;continue}io(A,e,t,n,r);break}}}function to(A){let e=A.prev,t=A,n=A.next,r=e.x,i=t.x,o=n.x,a=e.y,s=t.y,g=n.y,l=Math.min(r,i,o),I=Math.min(a,s,g),u=Math.max(r,i,o),E=Math.max(a,s,g),Q=n.next;for(;Q!==e;){if(Q.x>=l&&Q.x<=u&&Q.y>=I&&Q.y<=E&&!(r===Q.x&&a===Q.y)&&Bt(r,a,i,s,o,g,Q.x,Q.y)&&MA(Q.prev,Q,Q.next)>=0)return!1;Q=Q.next}return!0}function no(A,e,t,n){let r=A.prev,i=A,o=A.next,a=r.x,s=i.x,g=o.x,l=r.y,I=i.y,u=o.y,E=Math.min(a,s,g),Q=Math.min(l,I,u),C=Math.max(a,s,g),m=Math.max(l,I,u),h=nn(E,Q,e,t,n),d=nn(C,m,e,t,n),y=A.prevZ;for(;y&&y.z>=h;){if(y.x>=E&&y.x<=C&&y.y>=Q&&y.y<=m&&y!==o&&!(a===y.x&&l===y.y)&&Bt(a,l,s,I,g,u,y.x,y.y)&&MA(y.prev,y,y.next)>=0)return!1;y=y.prevZ}let w=A.nextZ;for(;w&&w.z<=d;){if(w.x>=E&&w.x<=C&&w.y>=Q&&w.y<=m&&w!==o&&!(a===w.x&&l===w.y)&&Bt(a,l,s,I,g,u,w.x,w.y)&&MA(w.prev,w,w.next)>=0)return!1;w=w.nextZ}return!0}function ro(A,e){let t=A,n=!1;do{let r=t.prev,i=t.next.next;yr(r,t,t.next,i,!1)&&Re(r,i)&&Re(i,r)&&(e.push(r.i,t.i,i.i),Le(t),Le(t.next),t=A=i,n=!0),t=t.next}while(t!==A);return n?te(t):t}function io(A,e,t,n,r){let i=A;do{let o=i.next.next;for(;o!==i.prev;){if(i.i!==o.i&&Qo(i,o)){let a=Dr(i,o);i=te(i,i.next),a=te(a,a.next),$t(i,e,t,n,r),$t(a,e,t,n,r);return}o=o.next}i=i.next}while(i!==A)}var An=!1;function oo(A,e,t,n){let r=[];for(let i=0,o=e.length;i<o;i++){let a=e[i]*n,s=i<o-1?e[i+1]*n:A.length,g=hr(A,a,s,n,!1);g===g.next&&Ue.add(g),r.push(Eo(g))}r.sort(ao),go(A.length/n,e.length),pr(t,t),An=!0;for(let i=0;i<r.length;i++)t=so(r[i],t);return An=!1,te(t)}function ao(A,e){return A.x-e.x||A.y-e.y||(A.next.y-A.y)/(A.next.x-A.x)-(e.next.y-e.y)/(e.next.x-e.x)}function so(A,e){let t=Io(A,e);if(!t)return e;let n=Dr(t,A),r=n.next;return pr(t,r.next),te(n,n.next),te(t,t.next)}var mr=16,wA=new Float64Array(0),ut=0,en=[],tn=[];function go(A,e){let t=Math.ceil((A+2*e)/mr)+e+2;wA.length<t*4&&(wA=new Float64Array(t*4)),ut=0}function pr(A,e){let t=A;do{let n=ut++;en[n]=t;let r=t.x,i=t.y,o=t.x,a=t.y,s=0;do{let l=t.next;t.z=n,l.x<r&&(r=l.x),l.x>o&&(o=l.x),l.y<i&&(i=l.y),l.y>a&&(a=l.y),t=l}while(++s<mr&&t!==e);tn[n]=t;let g=n*4;wA[g]=r,wA[g+1]=i,wA[g+2]=o,wA[g+3]=a}while(t!==e)}function lo(A,e){let t=A.z*4;e.x<wA[t]&&(wA[t]=e.x),e.y<wA[t+1]&&(wA[t+1]=e.y),e.x>wA[t+2]&&(wA[t+2]=e.x),e.y>wA[t+3]&&(wA[t+3]=e.y)}function Cr(A){let e=tn[A];for(;e.prev.next!==e;)e=e.next;return tn[A]=e,e}function fr(A){let e=en[A];for(;e.prev.next!==e;)e=e.next;return en[A]=e,e}function Io(A,e){let t=e,n=A.x,r=A.y,i=-1/0,o;if(ve(A,t))return t;for(let u=0,E=0;u<ut;u++,E+=4){if(r<wA[E+1]||r>wA[E+3]||wA[E]>n||wA[E+2]<=i)continue;let Q=Cr(u);t=fr(u);do{if(t.prev.next===t){if(ve(A,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){let C=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(C<=n&&C>i&&(i=C,o=t.x<t.next.x?t:t.next,C===n))return o}}t=t.next}while(t!==Q)}if(!o)return null;let a=o.x,s=o.y,g=Math.min(r,s),l=Math.max(r,s),I=1/0;for(let u=0,E=0;u<ut;u++,E+=4){if(wA[E+2]<a||wA[E]>n||wA[E+3]<g||wA[E+1]>l)continue;let Q=Cr(u);t=fr(u);do{if(t.prev.next===t&&n>=t.x&&t.x>=a&&n!==t.x&&Bt(r<s?n:i,r,a,s,r<s?i:n,r,t.x,t.y)){let C=Math.abs(r-t.y)/(n-t.x);(Re(t,A)||t.y===r&&t.next.y===r&&t.next.x>n)&&(C<I||C===I&&(t.x>o.x||t.x===o.x&&co(o,t)))&&(o=t,I=C)}t=t.next}while(t!==Q)}return o}function co(A,e){return MA(A.prev,A,e.prev)<0&&MA(e.next,A,A.next)<0}var NA=[],Ee=[],ee=new Uint32Array(0),Ne=new Uint32Array(0),Se=new Uint32Array(256);function uo(A,e,t,n){let r=A,i=0;do r.z=nn(r.x,r.y,e,t,n),NA[i++]=r,r=r.next;while(r!==A);Bo(i);let o=null;for(let a=0;a<i;a++){let s=NA[a];s.prevZ=o,o&&(o.nextZ=s),o=s}o.nextZ=null,NA.fill(null,0,i),Ee.fill(null,0,i)}function Bo(A){if(A<=32){for(let e=1;e<A;e++){let t=NA[e],n=t.z,r=e-1;for(;r>=0&&NA[r].z>n;)NA[r+1]=NA[r],r--;NA[r+1]=t}return}ee.length<A&&(ee=new Uint32Array(A),Ne=new Uint32Array(A),Ee=new Array(A));for(let e=0;e<A;e++)ee[e]=NA[e].z;It(A,NA,ee,Ee,Ne,0),It(A,Ee,Ne,NA,ee,8),It(A,NA,ee,Ee,Ne,16),It(A,Ee,Ne,NA,ee,24)}function It(A,e,t,n,r,i){Se.fill(0);for(let a=0;a<A;a++)Se[t[a]>>>i&255]++;let o=0;for(let a=0;a<256;a++){let s=Se[a];Se[a]=o,o+=s}for(let a=0;a<A;a++){let s=t[a],g=Se[s>>>i&255]++;n[g]=e[a],r[g]=s}}function nn(A,e,t,n,r){return A=(A-t)*r|0,e=(e-n)*r|0,A=(A|A<<8)&16711935,A=(A|A<<4)&252645135,A=(A|A<<2)&858993459,A=(A|A<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,A|e<<1}function Eo(A){let e=A,t=A;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==A);return t}function Bt(A,e,t,n,r,i,o,a){return(r-o)*(e-a)>=(A-o)*(i-a)&&(A-o)*(n-a)>=(t-o)*(e-a)&&(t-o)*(i-a)>=(r-o)*(n-a)}function Qo(A,e){let t=ve(A,e)&&MA(A.prev,A,A.next)>0&&MA(e.prev,e,e.next)>0;return A.next.i!==e.i&&(t||Re(A,e)&&Re(e,A)&&(MA(A.prev,A,e.prev)!==0||MA(A,e.prev,e)!==0))&&!Co(A,e)&&(t||fo(A,e))}function MA(A,e,t){return(e.y-A.y)*(t.x-e.x)-(e.x-A.x)*(t.y-e.y)}function ve(A,e){return A.x===e.x&&A.y===e.y}function yr(A,e,t,n,r=!0){let i=MA(A,e,t),o=MA(A,e,n),a=MA(t,n,A),s=MA(t,n,e);return(i>0&&o<0||i<0&&o>0)&&(a>0&&s<0||a<0&&s>0)?!0:r?!!(i===0&&ct(A,t,e)||o===0&&ct(A,n,e)||a===0&&ct(t,A,n)||s===0&&ct(t,e,n)):!1}function ct(A,e,t){return e.x<=Math.max(A.x,t.x)&&e.x>=Math.min(A.x,t.x)&&e.y<=Math.max(A.y,t.y)&&e.y>=Math.min(A.y,t.y)}function Co(A,e){let t=Math.min(A.x,e.x),n=Math.max(A.x,e.x),r=Math.min(A.y,e.y),i=Math.max(A.y,e.y),o=A;do{let a=o.next;if(o.x>n&&a.x>n||o.x<t&&a.x<t||o.y>i&&a.y>i||o.y<r&&a.y<r){o=a;continue}if(o.i!==A.i&&a.i!==A.i&&o.i!==e.i&&a.i!==e.i&&yr(o,a,A,e))return!0;o=a}while(o!==A);return!1}function Re(A,e){return MA(A.prev,A,A.next)<0?MA(A,e,A.next)>=0&&MA(A,A.prev,e)>=0:MA(A,e,A.prev)<0||MA(A,A.next,e)<0}function fo(A,e){let t=A,n=!1,r=(A.x+e.x)/2,i=(A.y+e.y)/2;do{let o=t.next;t.y>i!=o.y>i&&r<(o.x-t.x)*(i-t.y)/(o.y-t.y)+t.x&&(n=!n),t=o}while(t!==A);return n}function Dr(A,e){let t=rn(A.i,A.x,A.y),n=rn(e.i,e.x,e.y),r=A.next,i=e.prev;return A.next=e,e.prev=A,t.next=r,r.prev=t,n.next=t,t.prev=n,i.next=n,n.prev=i,n}function dr(A,e,t,n){let r=rn(A,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Le(A){A.next.prev=A.prev,A.prev.next=A.next,A.prevZ&&(A.prevZ.nextZ=A.nextZ),A.nextZ&&(A.nextZ.prevZ=A.prevZ),An&&lo(A.prev,A.next)}function rn(A,e,t){return{i:A,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null}}function ho(A,e,t,n){let r=0;for(let i=e,o=t-n;i<t;i+=n)r+=(A[o]-A[i])*(A[i+1]+A[o+1]),o=i;return r}var Mr=Sn(wr(),1);function Qt(A){let e=A.trim();if(e.startsWith("#")){let t=e.slice(1);if(t.length===3){let n=Number.parseInt(t[0]+t[0],16)/255,r=Number.parseInt(t[1]+t[1],16)/255,i=Number.parseInt(t[2]+t[2],16)/255;return[n,r,i,1]}if(t.length===6){let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return[n,r,i,1]}if(t.length===8){let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255,o=Number.parseInt(t.slice(6,8),16)/255;return[n,r,i,o]}}if(e.startsWith("rgb")){let t=e.replace(/rgba?\(/,"").replace(/\)/,"").split(",").map(a=>Number.parseFloat(a.trim())),n=(t[0]??0)/255,r=(t[1]??0)/255,i=(t[2]??0)/255,o=t[3]!==void 0?t[3]:1;return[n,r,i,o]}return[1,1,1,1]}function ke(A){let e=0,t=A.length;for(let n=0;n<t;n++){let r=(n+1)%t;e+=A[n].x*A[r].y-A[r].x*A[n].y}return e/2}function Ct(A,e){let t=!1,n=e.length;for(let r=0,i=n-1;r<n;i=r++){let o=e[r].x,a=e[r].y,s=e[i].x,g=e[i].y;a>A.y!=g>A.y&&A.x<(s-o)*(A.y-a)/(g-a)+o&&(t=!t)}return t}var mo=.1,po=64;function Gr(A,e){if(e.segments!==void 0)return e.segments;let t=Math.ceil(Math.sqrt(A/(8*e.tolerance)));return Math.min(po,Math.max(1,t))}function yo(A,e,t,n,r){let i=Gr(2*Math.hypot(A.x-2*e.x+t.x,A.y-2*e.y+t.y),n);for(let o=1;o<=i;o++){let a=o/i,s=1-a;r.push({x:s*s*A.x+2*s*a*e.x+a*a*t.x,y:s*s*A.y+2*s*a*e.y+a*a*t.y})}}function Do(A,e,t,n,r,i){let o=Gr(6*Math.max(Math.hypot(A.x-2*e.x+t.x,A.y-2*e.y+t.y),Math.hypot(e.x-2*t.x+n.x,e.y-2*t.y+n.y)),r);for(let a=1;a<=o;a++){let s=a/o,g=1-s;i.push({x:g*g*g*A.x+3*g*g*s*e.x+3*g*s*s*t.x+s*s*s*n.x,y:g*g*g*A.y+3*g*g*s*e.y+3*g*s*s*t.y+s*s*s*n.y})}}function bo(A){try{let e=new Mr.Path2D(A).simplify().edges;return Array.isArray(e)?e:null}catch{return null}}function wo(A,e,t,n,r){let i=A.path?.toSVG();if(!i)return{contours:[],simplified:!0};let o=bo(i),a=o!==null;o??=(A.path?.commands??[]).map(u=>[u.command,...u.args]);let s=[],g={x:0,y:0},l=[],I=()=>{if(l.length>=3){let u=l[0],E=l[l.length-1];Math.hypot(E.x-u.x,E.y-u.y)<1e-4&&l.pop(),l.length>=3&&s.push(l)}l=[]};for(let u of o){let E=u[0],Q=u.slice(1);if(E==="moveTo")I(),g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l=[g];else if(E==="lineTo")g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l.push(g);else if(E==="quadraticCurveTo"){let C={x:(e+Q[0])*n,y:-(t+Q[1])*n},m={x:(e+Q[2])*n,y:-(t+Q[3])*n};yo(g,C,m,r,l),g=m}else if(E==="bezierCurveTo"){let C={x:(e+Q[0])*n,y:-(t+Q[1])*n},m={x:(e+Q[2])*n,y:-(t+Q[3])*n},h={x:(e+Q[4])*n,y:-(t+Q[5])*n};Do(g,C,m,h,r,l),g=h}else E==="closePath"&&I()}return I(),{contours:s,simplified:a}}var xo=Math.cos(30*Math.PI/180);function Mo({contours:A,simplified:e}){if(!e)return Go(A);let t=A.map(o=>({contour:o,area:Math.abs(ke(o))}));t.sort((o,a)=>a.area-o.area);let n=t.map(()=>[]);for(let o=0;o<t.length;o++){let a=t[o].contour,s=a[Math.floor(a.length/2)];for(let g=0;g<o;g++){if(t[g].area<=t[o].area)continue;let l=t[g].contour;(Ct(a[0],l)||Ct(s,l))&&n[o].push(g)}}let r=[],i=new Map;for(let o=0;o<t.length;o++){let a=n[o];if(a.length%2===0){let s={outer:t[o].contour,holes:[]};r.push(s),i.set(o,s)}else i.get(a[a.length-1])?.holes.push(t[o].contour)}return r}function Go(A){let e=A.map(r=>{let i=ke(r);return{contour:r,signed:i,area:Math.abs(i)}});if(e.length===0)return[];e.sort((r,i)=>i.area-r.area);let t=Math.sign(e[0].signed),n=[];for(let r of e)Math.sign(r.signed)===t&&n.push({outer:r.contour,holes:[]});for(let r of e){if(Math.sign(r.signed)===t)continue;let i=r.contour[0],o=r.contour[Math.floor(r.contour.length/2)],a,s=Number.POSITIVE_INFINITY;for(let g of n){let l=Math.abs(ke(g.outer));l>r.area&&l<s&&(Ct(i,g.outer)||Ct(o,g.outer))&&(a=g,s=l)}a?.holes.push(r.contour)}return n}var xr=new WeakMap;function Fo(A,e,t,n,r,i){let o=xr.get(A);o||(o=new Map,xr.set(A,o));let a=`${e.id}|${r}|${i.segments??""}|${i.tolerance}`,s=o.get(a);s||(s=Mo(wo(e,0,0,r,i)),o.set(a,s));let g=t*r,l=-n*r,I=u=>u.map(E=>({x:E.x+g,y:E.y+l}));return s.map(u=>({outer:I(u.outer),holes:u.holes.map(I)}))}function nl(A){let e=A.font,t=A.fontSize??48,n=A.depth??20,r=n/2,i={segments:A.curveSegments!==void 0?Math.max(2,A.curveSegments):void 0,tolerance:Math.max(.001,A.curveTolerance??mo)},o=e.unitsPerEm||1e3,a=t/o,s=e.layout(A.text),g=0,l=[];for(let rA=0;rA<s.glyphs.length;rA++){let Y=s.glyphs[rA],U=s.positions[rA],AA=g+(U.xOffset??0),$=U.yOffset??0,W=Fo(e,Y,AA,$,a,i);for(let nA of W)l.push(nA);g+=(U.xAdvance??Y.advanceWidth??0)+(A.letterSpacing?A.letterSpacing/a:0)}let I=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,E=Number.POSITIVE_INFINITY,Q=Number.NEGATIVE_INFINITY;for(let rA of l){for(let Y of rA.outer)Y.x<I&&(I=Y.x),Y.x>u&&(u=Y.x),Y.y<E&&(E=Y.y),Y.y>Q&&(Q=Y.y);for(let Y of rA.holes)for(let U of Y)U.x<I&&(I=U.x),U.x>u&&(u=U.x),U.y<E&&(E=U.y),U.y>Q&&(Q=U.y)}Number.isFinite(I)||(I=0,u=0,E=0,Q=0);let C=u-I,m=Q-E,h=(I+u)/2;(A.align==="left"||A.align==="start")&&(h=I),(A.align==="right"||A.align==="end")&&(h=u);let d=(E+Q)/2;A.verticalAlign==="top"&&(d=E),A.verticalAlign==="bottom"&&(d=Q);for(let rA of l){for(let Y of rA.outer)Y.x-=h,Y.y-=d;for(let Y of rA.holes)for(let U of Y)U.x-=h,U.y-=d}I-=h,u-=h,E-=d,Q-=d;let y=[],w=[],G=[],x=[],b=[],F=[],k=[],H=[],_=(rA,Y,U)=>{let AA=b.length/3;return b.push(rA.x,rA.y,r,rA.x,rA.y,-r),F.push(Y.x,Y.y,0,Y.x,Y.y,0),k.push(U,0,U,1),AA},R=rA=>{let Y=rA.filter((aA,v)=>{let sA=rA[(v+1)%rA.length];return Math.hypot(sA.x-aA.x,sA.y-aA.y)>=1e-6}),U=Y.length;if(U<2)return;let AA=[],$=Y.map((aA,v)=>{let sA=Y[(v+1)%U],eA=Math.hypot(sA.x-aA.x,sA.y-aA.y);return AA.push(eA),{x:(sA.y-aA.y)/eA,y:-(sA.x-aA.x)/eA}}),W=AA.reduce((aA,v)=>aA+v,0),nA=[],cA=[],oA=0;for(let aA=0;aA<U;aA++){let v=$[(aA-1+U)%U],sA=$[aA],eA=oA/W,gA=v.x+sA.x,j=v.y+sA.y,P=v.x*sA.x+v.y*sA.y>=xo?{x:gA/Math.hypot(gA,j),y:j/Math.hypot(gA,j)}:null;P&&aA>0?nA[aA]=cA[aA]=_(Y[aA],P,eA):(cA[aA]=_(Y[aA],P??v,aA===0?1:eA),nA[aA]=_(Y[aA],P??sA,eA)),oA+=AA[aA]}for(let aA=0;aA<U;aA++){let v=nA[aA],sA=cA[(aA+1)%U];H.push(v,sA+1,sA),H.push(v,v+1,sA+1)}};for(let rA of l){let Y=rA.outer;ke(Y)<0&&Y.reverse();for(let oA of rA.holes)ke(oA)>0&&oA.reverse();let U=[],AA=[];for(let oA of Y)U.push(oA.x,oA.y);for(let oA of rA.holes){AA.push(U.length/2);for(let aA of oA)U.push(aA.x,aA.y)}let $=on(U,AA,2),W=U.length/2,nA=y.length/3;for(let oA=0;oA<W;oA++){let aA=U[oA*2],v=U[oA*2+1];y.push(aA,v,-r),w.push(0,0,-1),G.push((aA-I)/(C||1),(v-E)/(m||1))}for(let oA=0;oA<$.length;oA+=3)x.push(nA+$[oA],nA+$[oA+2],nA+$[oA+1]);let cA=y.length/3;for(let oA=0;oA<W;oA++){let aA=U[oA*2],v=U[oA*2+1];y.push(aA,v,r),w.push(0,0,1),G.push((aA-I)/(C||1),(v-E)/(m||1))}for(let oA=0;oA<$.length;oA+=3)x.push(cA+$[oA],cA+$[oA+1],cA+$[oA+2]);R(Y);for(let oA of rA.holes)R(oA)}let z=Qt(A.fill??"#ffffff"),X=Qt(A.bevelColor??A.fill??"#ffffff"),S={name:"front-material",diffuseColor:z,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},IA={name:"side-material",diffuseColor:X,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},O=[];return x.length>0&&O.push({id:"text-front-mesh",name:"front",positions:new Float32Array(y),normals:new Float32Array(w),uvs:new Float32Array(G),indices:y.length/3>65535?new Uint32Array(x):new Uint16Array(x),materialName:"front-material"}),H.length>0&&O.push({id:"text-side-mesh",name:"side",positions:new Float32Array(b),normals:new Float32Array(F),uvs:new Float32Array(k),indices:b.length/3>65535?new Uint32Array(H):new Uint16Array(H),materialName:"side-material"}),{modelData:{name:`extruded-text-${A.text}`,meshes:O,materials:{"front-material":S,"side-material":IA},animations:[],bounds:{min:[I,E,-r],max:[u,Q,r],center:[(I+u)/2,(E+Q)/2,0],size:[C,m,n],boundingSphereRadius:Math.hypot(C,m,n)/2}},bounds:{minX:I,maxX:u,minY:E,maxY:Q,width:C,height:m,depth:n}}}var sn=class{positions=[];normals=[];uvs=[];indices=[];vertex(e,t,n){return this.positions.push(e[0],e[1],e[2]),this.normals.push(t[0],t[1],t[2]),this.uvs.push(n[0],n[1]),this.positions.length/3-1}grid(e,t,n,r=!1){for(let i=0;i<n;i++)for(let o=0;o<t;o++){let a=e+i*(t+1)+o,s=a+1,g=a+t+1,l=g+1;r?this.indices.push(a,s,g,s,l,g):this.indices.push(a,g,s,s,g,l)}}build(e){let t=this.positions.length/3;return{id:`${e}-mesh`,name:e,positions:new Float32Array(this.positions),normals:new Float32Array(this.normals),uvs:new Float32Array(this.uvs),indices:t>65535?new Uint32Array(this.indices):new Uint16Array(this.indices),materialName:`${e}-material`}}};function gn(A){let e=Math.hypot(A[0],A[1],A[2]);return e>1e-12?[A[0]/e,A[1]/e,A[2]/e]:[0,0,0]}function an(A,e,t){if(e<=0)return[-A,A];let n=A-e,r=[];for(let i=0;i<=t;i++)r.push(-n-e*Math.cos(i/t*Math.PI/2));for(let i=n>1e-9?0:1;i<=t;i++)r.push(n+e*Math.sin(i/t*Math.PI/2));return r}function No(A,e){let t=A.width/2,n=A.height/2,r=A.depth/2,i=Math.max(0,Math.min(A.radius??0,t,n,r)),o=Math.max(1,Math.round(A.segments??4)),a=A.taper??1,s=t-i,g=n-i,l=r-i,I=an(t,i,o),u=an(n,i,o),E=an(r,i,o),Q=A.height>0?(1-a)/A.height:0,C=w=>a+Q*(w+n),m=(w,G)=>{let x=[Math.max(-s,Math.min(s,w[0])),Math.max(-g,Math.min(g,w[1])),Math.max(-l,Math.min(l,w[2]))],b=i>0?gn([w[0]-x[0],w[1]-x[1],w[2]-x[2]]):G;b[0]===0&&b[1]===0&&b[2]===0&&(b=G);let F=[x[0]+b[0]*i,x[1]+b[1]*i,x[2]+b[2]*i];if(a===1)return{p:F,n:b};let k=C(F[1]);return{p:[F[0]*k,F[1],F[2]*k],n:gn([b[0]/k,b[1]-F[0]*Q*b[0]/k-F[2]*Q*b[2]/k,b[2]/k])}},h=[{axis:2,sign:-1,u:0,v:1},{axis:2,sign:1,u:0,v:1},{axis:0,sign:-1,u:2,v:1},{axis:0,sign:1,u:2,v:1},{axis:1,sign:-1,u:0,v:2},{axis:1,sign:1,u:0,v:2}],d=[t,n,r],y=[I,u,E];for(let w of h){let G=y[w.u],x=y[w.v],b=[0,0,0];b[w.axis]=w.sign;let F=e.positions.length/3;for(let H=0;H<x.length;H++)for(let _=0;_<G.length;_++){let R=[0,0,0];R[w.axis]=w.sign*d[w.axis],R[w.u]=G[_],R[w.v]=x[H];let{p:z,n:X}=m(R,b);e.vertex(z,X,[(G[_]/d[w.u]+1)/2,(x[H]/d[w.v]+1)/2])}let k=(w.v+1)%3===w.u;e.grid(F,G.length-1,x.length-1,(k?1:-1)!==w.sign)}}function So(A,e){let t=Math.max(3,Math.round(A.segments??32)),n=Math.max(2,Math.round(t/2));for(let r=0;r<=n;r++){let i=r/n*Math.PI;for(let o=0;o<=t;o++){let a=o/t*Math.PI*2,s=[Math.sin(i)*Math.cos(a),-Math.cos(i),Math.sin(i)*Math.sin(a)];e.vertex([s[0]*A.radius,s[1]*A.radius,s[2]*A.radius],s,[o/t,r/n])}}e.grid(0,t,n)}function Uo(A,e){let t=Math.max(3,Math.round(A.segments??32)),n=A.radiusTop??A.radius??50,r=A.radiusBottom??A.radius??50,i=A.height/2,o=A.height>0?(r-n)/A.height:0;for(let a=0;a<=1;a++){let s=a===0?n:r,g=a===0?-i:i;for(let l=0;l<=t;l++){let I=l/t*Math.PI*2,u=Math.cos(I),E=Math.sin(I);e.vertex([u*s,g,E*s],gn([u,-o,E]),[l/t,a])}}if(e.grid(0,t,1),!A.openEnded)for(let[a,s,g]of[[-i,n,-1],[i,r,1]]){if(s<=0)continue;let l=e.vertex([0,a,0],[0,g,0],[.5,.5]),I=e.positions.length/3;for(let u=0;u<=t;u++){let E=u/t*Math.PI*2,Q=Math.cos(E),C=Math.sin(E);e.vertex([Q*s,a,C*s],[0,g,0],[(Q+1)/2,(C+1)/2])}for(let u=0;u<t;u++)g<0?e.indices.push(l,I+u,I+u+1):e.indices.push(l,I+u+1,I+u)}}function vo(A){let e=new sn;if(A.type==="roundedBox")No(A,e);else if(A.type==="sphere")So(A,e);else if(A.type==="cylinder")Uo(A,e);else throw new Error(`Unknown 3D primitive: ${A.type}`);let t=A.type,n=e.build(t),r={name:`${t}-material`,diffuseColor:Qt(A.color??"#ffffff"),shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic},i=[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY],o=[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],a=n.positions;for(let g=0;g<a.length;g+=3)for(let l=0;l<3;l++){let I=a[g+l];I<i[l]&&(i[l]=I),I>o[l]&&(o[l]=I)}let s=[o[0]-i[0],o[1]-i[1],o[2]-i[2]];return{name:`primitive-${t}`,meshes:[n],materials:{[r.name]:r},animations:[],bounds:{min:i,max:o,center:[(i[0]+o[0])/2,(i[1]+o[1])/2,(i[2]+o[2])/2],size:s,boundingSphereRadius:Math.hypot(...s)/2}}}var ft=new Map;function al(A){let e=JSON.stringify(A),t=ft.get(e);return t||(t=vo(A),ft.size>512&&ft.clear(),ft.set(e,t)),t}var ln=new Map;function Ro(A,e){return JSON.stringify({text:A,...e})}function In(A,e){let t=A?String(A):" ",n=Ro(t,e),r=ln.get(n);if(r)return r;let i=e.fontSize??48,o=e.fontFamily??"Inter";_A.isFailed(o)&&(o="Inter");let a=e.letterSpacing??0,s=e.lineHeight!==void 0&&e.lineHeight<10?e.lineHeight*i:e.lineHeight??i*1.2,g=_A.getFont(o,e.fontWeight,null),l=e.padding??0;if(!g){if(!_A.isFailed(o)){let d=Ut(o);_A.preloadSlugFont(null,o,d).catch(()=>{})}let E=t.split(`
1447
+ `),Q=0,C=e.width!==void 0?Math.max(10,e.width-l*2):0;for(let d of E)if(C>0){let y=d.length*i*.55+a*d.length,w=Math.max(1,Math.ceil(y/C));Q+=w}else Q+=1;let m=Math.max(0,t.length-1),h={width:e.width!==void 0?e.width:Math.ceil(t.length*i*.6+a*m)+l*2,height:e.height!==void 0?e.height:Math.ceil(Q*s)+l*2};return ln.set(n,h),h}let I=Pn.measure(t,g,i,a,s,e.width!==void 0?Math.max(0,e.width-l*2):void 0,e.spans),u={width:e.width!==void 0&&!e.keepNaturalWidth?e.width:Math.ceil(I.width)+l*2,height:e.height!==void 0?e.height:Math.ceil(I.height)+l*2};return ln.set(n,u),u}function cl(A,e){let t=e.fontFamily??"Inter";if(_A.isFailed(t)&&(t="Inter"),_A.isFailed(t))return Promise.resolve(In(A,e));let n=Ut(t);return _A.preloadSlugFont(null,t,n).then(()=>In(A,e)).catch(()=>In(A,e))}T();T();T();var Lo=(()=>{var A=import.meta.url;return(function(e){e=e||{};var t;t||(t=typeof e<"u"?e:{});var n,r;t.ready=new Promise(function(c,B){n=c,r=B});var i=Object.assign({},t),o="";typeof document<"u"&&document.currentScript&&(o=document.currentScript.src),A&&(o=A),o.indexOf("blob:")!==0?o=o.substr(0,o.replace(/[?#].*/,"").lastIndexOf("/")+1):o="";var a=t.print||console.log.bind(console),s=t.printErr||console.warn.bind(console);Object.assign(t,i),i=null;var g;t.wasmBinary&&(g=t.wasmBinary);var l=t.noExitRuntime||!0;typeof WebAssembly!="object"&&IA("no native wasm support detected");var I,u=!1;function E(c,B,f){f=B+f;for(var p="";!(B>=f);){var D=c[B++];if(!D)break;if(D&128){var N=c[B++]&63;if((D&224)==192)p+=String.fromCharCode((D&31)<<6|N);else{var J=c[B++]&63;D=(D&240)==224?(D&15)<<12|N<<6|J:(D&7)<<18|N<<12|J<<6|c[B++]&63,65536>D?p+=String.fromCharCode(D):(D-=65536,p+=String.fromCharCode(55296|D>>10,56320|D&1023))}}else p+=String.fromCharCode(D)}return p}var Q,C,m,h,d,y,w,G,x;function b(){var c=I.buffer;Q=c,t.HEAP8=C=new Int8Array(c),t.HEAP16=h=new Int16Array(c),t.HEAP32=y=new Int32Array(c),t.HEAPU8=m=new Uint8Array(c),t.HEAPU16=d=new Uint16Array(c),t.HEAPU32=w=new Uint32Array(c),t.HEAPF32=G=new Float32Array(c),t.HEAPF64=x=new Float64Array(c)}var F,k=[],H=[],_=[];function R(){var c=t.preRun.shift();k.unshift(c)}var z=0,X=null,S=null;function IA(c){throw t.onAbort&&t.onAbort(c),c="Aborted("+c+")",s(c),u=!0,c=new WebAssembly.RuntimeError(c+". Build with -sASSERTIONS for more info."),r(c),c}function O(c){return c.startsWith("data:application/octet-stream;base64,")}var V;if(V="data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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",!O(V)){var rA=V;V=t.locateFile?t.locateFile(rA,o):o+rA}function Y(){var c=V;try{if(c==V&&g)return new Uint8Array(g);if(O(c))try{var B=Ii(c.slice(37)),f=new Uint8Array(B.length);for(c=0;c<B.length;++c)f[c]=B.charCodeAt(c);var p=f}catch{throw Error("Converting base64 string to bytes failed.")}else p=void 0;var D=p;if(D)return D;throw"both async and sync fetching of the wasm failed"}catch(N){IA(N)}}function U(){return g||typeof fetch!="function"?Promise.resolve().then(function(){return Y()}):fetch(V,{credentials:"same-origin"}).then(function(c){if(!c.ok)throw"failed to load wasm binary file at '"+V+"'";return c.arrayBuffer()}).catch(function(){return Y()})}function AA(c){for(;0<c.length;)c.shift()(t)}function $(c){if(c===void 0)return"_unknown";c=c.replace(/[^a-zA-Z0-9_]/g,"$");var B=c.charCodeAt(0);return 48<=B&&57>=B?"_"+c:c}function W(c,B){return c=$(c),function(){return B.apply(this,arguments)}}var nA=[{},{value:void 0},{value:null},{value:!0},{value:!1}],cA=[];function oA(c){var B=Error,f=W(c,function(p){this.name=c,this.message=p,p=Error(p).stack,p!==void 0&&(this.stack=this.toString()+`
1448
+ `+p.replace(/^Error(:[^\n]*)?\n/,""))});return f.prototype=Object.create(B.prototype),f.prototype.constructor=f,f.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},f}var aA=void 0;function v(c){throw new aA(c)}var sA=c=>(c||v("Cannot use deleted val. handle = "+c),nA[c].value),eA=c=>{switch(c){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var B=cA.length?cA.pop():nA.length;return nA[B]={ga:1,value:c},B}},gA=void 0,j=void 0;function M(c){for(var B="";m[c];)B+=j[m[c++]];return B}var P=[];function Z(){for(;P.length;){var c=P.pop();c.M.$=!1,c.delete()}}var iA=void 0,QA={};function fA(c,B){for(B===void 0&&v("ptr should not be undefined");c.R;)B=c.ba(B),c=c.R;return B}var CA={};function mA(c){c=xn(c);var B=M(c);return KA(c),B}function dA(c,B){var f=CA[c];return f===void 0&&v(B+" has unknown type "+mA(c)),f}function DA(){}var bA=!1;function SA(c){--c.count.value,c.count.value===0&&(c.T?c.U.W(c.T):c.P.N.W(c.O))}function UA(c,B,f){return B===f?c:f.R===void 0?null:(c=UA(c,B,f.R),c===null?null:f.na(c))}var LA={};function pt(c,B){return B=fA(c,B),QA[B]}var vA=void 0;function Te(c){throw new vA(c)}function Je(c,B){return B.P&&B.O||Te("makeClassHandle requires ptr and ptrType"),!!B.U!=!!B.T&&Te("Both smartPtrType and smartPtr must be specified"),B.count={value:1},re(Object.create(c,{M:{value:B}}))}function re(c){return typeof FinalizationRegistry>"u"?(re=B=>B,c):(bA=new FinalizationRegistry(B=>{SA(B.M)}),re=B=>{var f=B.M;return f.T&&bA.register(B,{M:f},B),B},DA=B=>{bA.unregister(B)},re(c))}var Oe={};function yt(c){for(;c.length;){var B=c.pop();c.pop()(B)}}function de(c){return this.fromWireType(y[c>>2])}var ie={},Ke={};function ZA(c,B,f){function p(K){K=f(K),K.length!==c.length&&Te("Mismatched type converter count");for(var tA=0;tA<c.length;++tA)JA(c[tA],K[tA])}c.forEach(function(K){Ke[K]=B});var D=Array(B.length),N=[],J=0;B.forEach((K,tA)=>{CA.hasOwnProperty(K)?D[tA]=CA[K]:(N.push(K),ie.hasOwnProperty(K)||(ie[K]=[]),ie[K].push(()=>{D[tA]=CA[K],++J,J===N.length&&p(D)}))}),N.length===0&&p(D)}function Dt(c){switch(c){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+c)}}function JA(c,B,f={}){if(!("argPackAdvance"in B))throw new TypeError("registerType registeredInstance requires argPackAdvance");var p=B.name;if(c||v('type "'+p+'" must have a positive integer typeid pointer'),CA.hasOwnProperty(c)){if(f.ua)return;v("Cannot register type '"+p+"' twice")}CA[c]=B,delete Ke[c],ie.hasOwnProperty(c)&&(B=ie[c],delete ie[c],B.forEach(D=>D()))}function bt(c){v(c.M.P.N.name+" instance already deleted")}function qA(){}function wt(c,B,f){if(c[B].S===void 0){var p=c[B];c[B]=function(){return c[B].S.hasOwnProperty(arguments.length)||v("Function '"+f+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[B].S+")!"),c[B].S[arguments.length].apply(this,arguments)},c[B].S=[],c[B].S[p.Z]=p}}function Wr(c,B){t.hasOwnProperty(c)?(v("Cannot register public name '"+c+"' twice"),wt(t,c,c),t.hasOwnProperty(void 0)&&v("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),t[c].S[void 0]=B):t[c]=B}function zr(c,B,f,p,D,N,J,K){this.name=c,this.constructor=B,this.X=f,this.W=p,this.R=D,this.pa=N,this.ba=J,this.na=K,this.ja=[]}function xt(c,B,f){for(;B!==f;)B.ba||v("Expected null or instance of "+f.name+", got an instance of "+B.name),c=B.ba(c),B=B.R;return c}function Xr(c,B){return B===null?(this.ea&&v("null is not a valid "+this.name),0):(B.M||v('Cannot pass "'+Nt(B)+'" as a '+this.name),B.M.O||v("Cannot pass deleted object as a pointer of type "+this.name),xt(B.M.O,B.M.P.N,this.N))}function Zr(c,B){if(B===null){if(this.ea&&v("null is not a valid "+this.name),this.da){var f=this.fa();return c!==null&&c.push(this.W,f),f}return 0}if(B.M||v('Cannot pass "'+Nt(B)+'" as a '+this.name),B.M.O||v("Cannot pass deleted object as a pointer of type "+this.name),!this.ca&&B.M.P.ca&&v("Cannot convert argument of type "+(B.M.U?B.M.U.name:B.M.P.name)+" to parameter type "+this.name),f=xt(B.M.O,B.M.P.N,this.N),this.da)switch(B.M.T===void 0&&v("Passing raw pointer to smart pointer is illegal"),this.Ba){case 0:B.M.U===this?f=B.M.T:v("Cannot convert argument of type "+(B.M.U?B.M.U.name:B.M.P.name)+" to parameter type "+this.name);break;case 1:f=B.M.T;break;case 2:if(B.M.U===this)f=B.M.T;else{var p=B.clone();f=this.xa(f,eA(function(){p.delete()})),c!==null&&c.push(this.W,f)}break;default:v("Unsupporting sharing policy")}return f}function qr(c,B){return B===null?(this.ea&&v("null is not a valid "+this.name),0):(B.M||v('Cannot pass "'+Nt(B)+'" as a '+this.name),B.M.O||v("Cannot pass deleted object as a pointer of type "+this.name),B.M.P.ca&&v("Cannot convert argument of type "+B.M.P.name+" to parameter type "+this.name),xt(B.M.O,B.M.P.N,this.N))}function OA(c,B,f,p){this.name=c,this.N=B,this.ea=f,this.ca=p,this.da=!1,this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0,B.R!==void 0?this.toWireType=Zr:(this.toWireType=p?Xr:qr,this.V=null)}function _r(c,B){t.hasOwnProperty(c)||Te("Replacing nonexistant public symbol"),t[c]=B,t[c].Z=void 0}function jr(c,B){var f=[];return function(){if(f.length=0,Object.assign(f,arguments),c.includes("j")){var p=t["dynCall_"+c];p=f&&f.length?p.apply(null,[B].concat(f)):p.call(null,B)}else p=F.get(B).apply(null,f);return p}}function kA(c,B){c=M(c);var f=c.includes("j")?jr(c,B):F.get(B);return typeof f!="function"&&v("unknown function pointer with signature "+c+": "+B),f}var yn=void 0;function Ye(c,B){function f(N){D[N]||CA[N]||(Ke[N]?Ke[N].forEach(f):(p.push(N),D[N]=!0))}var p=[],D={};throw B.forEach(f),new yn(c+": "+p.map(mA).join([", "]))}function Mt(c,B,f,p,D){var N=B.length;2>N&&v("argTypes array size mismatch! Must at least get return value and 'this' types!");var J=B[1]!==null&&f!==null,K=!1;for(f=1;f<B.length;++f)if(B[f]!==null&&B[f].V===void 0){K=!0;break}var tA=B[0].name!=="void",q=N-2,lA=Array(q),BA=[],hA=[];return function(){if(arguments.length!==q&&v("function "+c+" called with "+arguments.length+" arguments, expected "+q+" args!"),hA.length=0,BA.length=J?2:1,BA[0]=D,J){var xA=B[1].toWireType(hA,this);BA[1]=xA}for(var yA=0;yA<q;++yA)lA[yA]=B[yA+2].toWireType(hA,arguments[yA]),BA.push(lA[yA]);if(yA=p.apply(null,BA),K)yt(hA);else for(var FA=J?1:2;FA<B.length;FA++){var PA=FA===1?xA:lA[FA-2];B[FA].V!==null&&B[FA].V(PA)}return xA=tA?B[0].fromWireType(yA):void 0,xA}}function Gt(c,B){for(var f=[],p=0;p<c;p++)f.push(w[B+4*p>>2]);return f}function Ft(c){4<c&&--nA[c].ga===0&&(nA[c]=void 0,cA.push(c))}function Nt(c){if(c===null)return"null";var B=typeof c;return B==="object"||B==="array"||B==="function"?c.toString():""+c}function $r(c,B){switch(B){case 2:return function(f){return this.fromWireType(G[f>>2])};case 3:return function(f){return this.fromWireType(x[f>>3])};default:throw new TypeError("Unknown float type: "+c)}}function Ai(c,B,f){switch(B){case 0:return f?function(p){return C[p]}:function(p){return m[p]};case 1:return f?function(p){return h[p>>1]}:function(p){return d[p>>1]};case 2:return f?function(p){return y[p>>2]}:function(p){return w[p>>2]};default:throw new TypeError("Unknown integer type: "+c)}}function ei(c,B){for(var f="",p=0;!(p>=B/2);++p){var D=h[c+2*p>>1];if(D==0)break;f+=String.fromCharCode(D)}return f}function ti(c,B,f){if(f===void 0&&(f=2147483647),2>f)return 0;f-=2;var p=B;f=f<2*c.length?f/2:c.length;for(var D=0;D<f;++D)h[B>>1]=c.charCodeAt(D),B+=2;return h[B>>1]=0,B-p}function ni(c){return 2*c.length}function ri(c,B){for(var f=0,p="";!(f>=B/4);){var D=y[c+4*f>>2];if(D==0)break;++f,65536<=D?(D-=65536,p+=String.fromCharCode(55296|D>>10,56320|D&1023)):p+=String.fromCharCode(D)}return p}function ii(c,B,f){if(f===void 0&&(f=2147483647),4>f)return 0;var p=B;f=p+f-4;for(var D=0;D<c.length;++D){var N=c.charCodeAt(D);if(55296<=N&&57343>=N){var J=c.charCodeAt(++D);N=65536+((N&1023)<<10)|J&1023}if(y[B>>2]=N,B+=4,B+4>f)break}return y[B>>2]=0,B-p}function oi(c){for(var B=0,f=0;f<c.length;++f){var p=c.charCodeAt(f);55296<=p&&57343>=p&&++f,B+=4}return B}var ai={};function Dn(c){var B=ai[c];return B===void 0?M(c):B}var Ve=[];function si(c){var B=Ve.length;return Ve.push(c),B}function gi(c,B){for(var f=Array(c),p=0;p<c;++p)f[p]=dA(w[B+4*p>>2],"parameter "+p);return f}var bn=[],li=[null,[],[]];aA=t.BindingError=oA("BindingError"),t.count_emval_handles=function(){for(var c=0,B=5;B<nA.length;++B)nA[B]!==void 0&&++c;return c},t.get_first_emval=function(){for(var c=5;c<nA.length;++c)if(nA[c]!==void 0)return nA[c];return null},gA=t.PureVirtualError=oA("PureVirtualError");for(var wn=Array(256),We=0;256>We;++We)wn[We]=String.fromCharCode(We);j=wn,t.getInheritedInstanceCount=function(){return Object.keys(QA).length},t.getLiveInheritedInstances=function(){var c=[],B;for(B in QA)QA.hasOwnProperty(B)&&c.push(QA[B]);return c},t.flushPendingDeletes=Z,t.setDelayFunction=function(c){iA=c,P.length&&iA&&iA(Z)},vA=t.InternalError=oA("InternalError"),qA.prototype.isAliasOf=function(c){if(!(this instanceof qA&&c instanceof qA))return!1;var B=this.M.P.N,f=this.M.O,p=c.M.P.N;for(c=c.M.O;B.R;)f=B.ba(f),B=B.R;for(;p.R;)c=p.ba(c),p=p.R;return B===p&&f===c},qA.prototype.clone=function(){if(this.M.O||bt(this),this.M.aa)return this.M.count.value+=1,this;var c=re,B=Object,f=B.create,p=Object.getPrototypeOf(this),D=this.M;return c=c(f.call(B,p,{M:{value:{count:D.count,$:D.$,aa:D.aa,O:D.O,P:D.P,T:D.T,U:D.U}}})),c.M.count.value+=1,c.M.$=!1,c},qA.prototype.delete=function(){this.M.O||bt(this),this.M.$&&!this.M.aa&&v("Object already scheduled for deletion"),DA(this),SA(this.M),this.M.aa||(this.M.T=void 0,this.M.O=void 0)},qA.prototype.isDeleted=function(){return!this.M.O},qA.prototype.deleteLater=function(){return this.M.O||bt(this),this.M.$&&!this.M.aa&&v("Object already scheduled for deletion"),P.push(this),P.length===1&&iA&&iA(Z),this.M.$=!0,this},OA.prototype.qa=function(c){return this.ka&&(c=this.ka(c)),c},OA.prototype.ha=function(c){this.W&&this.W(c)},OA.prototype.argPackAdvance=8,OA.prototype.readValueFromPointer=de,OA.prototype.deleteObject=function(c){c!==null&&c.delete()},OA.prototype.fromWireType=function(c){function B(){return this.da?Je(this.N.X,{P:this.wa,O:f,U:this,T:c}):Je(this.N.X,{P:this,O:c})}var f=this.qa(c);if(!f)return this.ha(c),null;var p=pt(this.N,f);if(p!==void 0)return p.M.count.value===0?(p.M.O=f,p.M.T=c,p.clone()):(p=p.clone(),this.ha(c),p);if(p=this.N.pa(f),p=LA[p],!p)return B.call(this);p=this.ca?p.la:p.pointerType;var D=UA(f,this.N,p.N);return D===null?B.call(this):this.da?Je(p.N.X,{P:p,O:D,U:this,T:c}):Je(p.N.X,{P:p,O:D})},yn=t.UnboundTypeError=oA("UnboundTypeError");var Ii=typeof atob=="function"?atob:function(c){var B="",f=0;c=c.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(f++)),D="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(f++)),N="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(f++)),J="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(f++));p=p<<2|D>>4,D=(D&15)<<4|N>>2;var K=(N&3)<<6|J;B+=String.fromCharCode(p),N!==64&&(B+=String.fromCharCode(D)),J!==64&&(B+=String.fromCharCode(K))}while(f<c.length);return B},ci={l:function(c,B,f,p){IA("Assertion failed: "+(c?E(m,c):"")+", at: "+[B?B?E(m,B):"":"unknown filename",f,p?p?E(m,p):"":"unknown function"])},q:function(c,B,f){c=M(c),B=dA(B,"wrapper"),f=sA(f);var p=[].slice,D=B.N,N=D.X,J=D.R.X,K=D.R.constructor;c=W(c,function(){D.R.ja.forEach(function(q){if(this[q]===J[q])throw new gA("Pure virtual function "+q+" must be implemented in JavaScript")}.bind(this)),Object.defineProperty(this,"__parent",{value:N}),this.__construct.apply(this,p.call(arguments))}),N.__construct=function(){this===N&&v("Pass correct 'this' to __construct");var q=K.implement.apply(void 0,[this].concat(p.call(arguments)));DA(q);var lA=q.M;q.notifyOnDestruction(),lA.aa=!0,Object.defineProperties(this,{M:{value:lA}}),re(this),q=lA.O,q=fA(D,q),QA.hasOwnProperty(q)?v("Tried to register registered instance: "+q):QA[q]=this},N.__destruct=function(){this===N&&v("Pass correct 'this' to __destruct"),DA(this);var q=this.M.O;q=fA(D,q),QA.hasOwnProperty(q)?delete QA[q]:v("Tried to unregister unregistered instance: "+q)},c.prototype=Object.create(N);for(var tA in f)c.prototype[tA]=f[tA];return eA(c)},j:function(c){var B=Oe[c];delete Oe[c];var f=B.fa,p=B.W,D=B.ia,N=D.map(J=>J.ta).concat(D.map(J=>J.za));ZA([c],N,J=>{var K={};return D.forEach((tA,q)=>{var lA=J[q],BA=tA.ra,hA=tA.sa,xA=J[q+D.length],yA=tA.ya,FA=tA.Aa;K[tA.oa]={read:PA=>lA.fromWireType(BA(hA,PA)),write:(PA,he)=>{var YA=[];yA(FA,PA,xA.toWireType(YA,he)),yt(YA)}}}),[{name:B.name,fromWireType:function(tA){var q={},lA;for(lA in K)q[lA]=K[lA].read(tA);return p(tA),q},toWireType:function(tA,q){for(var lA in K)if(!(lA in q))throw new TypeError('Missing field: "'+lA+'"');var BA=f();for(lA in K)K[lA].write(BA,q[lA]);return tA!==null&&tA.push(p,BA),BA},argPackAdvance:8,readValueFromPointer:de,V:p}]})},v:function(){},B:function(c,B,f,p,D){var N=Dt(f);B=M(B),JA(c,{name:B,fromWireType:function(J){return!!J},toWireType:function(J,K){return K?p:D},argPackAdvance:8,readValueFromPointer:function(J){if(f===1)var K=C;else if(f===2)K=h;else if(f===4)K=y;else throw new TypeError("Unknown boolean type size: "+B);return this.fromWireType(K[J>>N])},V:null})},f:function(c,B,f,p,D,N,J,K,tA,q,lA,BA,hA){lA=M(lA),N=kA(D,N),K&&(K=kA(J,K)),q&&(q=kA(tA,q)),hA=kA(BA,hA);var xA=$(lA);Wr(xA,function(){Ye("Cannot construct "+lA+" due to unbound types",[p])}),ZA([c,B,f],p?[p]:[],function(yA){if(yA=yA[0],p)var FA=yA.N,PA=FA.X;else PA=qA.prototype;yA=W(xA,function(){if(Object.getPrototypeOf(this)!==he)throw new aA("Use 'new' to construct "+lA);if(YA.Y===void 0)throw new aA(lA+" has no accessible constructor");var Fn=YA.Y[arguments.length];if(Fn===void 0)throw new aA("Tried to invoke ctor of "+lA+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(YA.Y).toString()+") parameters instead!");return Fn.apply(this,arguments)});var he=Object.create(PA,{constructor:{value:yA}});yA.prototype=he;var YA=new zr(lA,yA,he,hA,FA,N,K,q);FA=new OA(lA,YA,!0,!1),PA=new OA(lA+"*",YA,!1,!1);var Gn=new OA(lA+" const*",YA,!1,!0);return LA[c]={pointerType:PA,la:Gn},_r(xA,yA),[FA,PA,Gn]})},d:function(c,B,f,p,D,N,J){var K=Gt(f,p);B=M(B),N=kA(D,N),ZA([],[c],function(tA){function q(){Ye("Cannot call "+lA+" due to unbound types",K)}tA=tA[0];var lA=tA.name+"."+B;B.startsWith("@@")&&(B=Symbol[B.substring(2)]);var BA=tA.N.constructor;return BA[B]===void 0?(q.Z=f-1,BA[B]=q):(wt(BA,B,lA),BA[B].S[f-1]=q),ZA([],K,function(hA){return hA=Mt(lA,[hA[0],null].concat(hA.slice(1)),null,N,J),BA[B].S===void 0?(hA.Z=f-1,BA[B]=hA):BA[B].S[f-1]=hA,[]}),[]})},p:function(c,B,f,p,D,N){0<B||IA();var J=Gt(B,f);D=kA(p,D),ZA([],[c],function(K){K=K[0];var tA="constructor "+K.name;if(K.N.Y===void 0&&(K.N.Y=[]),K.N.Y[B-1]!==void 0)throw new aA("Cannot register multiple constructors with identical number of parameters ("+(B-1)+") for class '"+K.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return K.N.Y[B-1]=()=>{Ye("Cannot construct "+K.name+" due to unbound types",J)},ZA([],J,function(q){return q.splice(1,0,null),K.N.Y[B-1]=Mt(tA,q,null,D,N),[]}),[]})},a:function(c,B,f,p,D,N,J,K){var tA=Gt(f,p);B=M(B),N=kA(D,N),ZA([],[c],function(q){function lA(){Ye("Cannot call "+BA+" due to unbound types",tA)}q=q[0];var BA=q.name+"."+B;B.startsWith("@@")&&(B=Symbol[B.substring(2)]),K&&q.N.ja.push(B);var hA=q.N.X,xA=hA[B];return xA===void 0||xA.S===void 0&&xA.className!==q.name&&xA.Z===f-2?(lA.Z=f-2,lA.className=q.name,hA[B]=lA):(wt(hA,B,BA),hA[B].S[f-2]=lA),ZA([],tA,function(yA){return yA=Mt(BA,yA,q,N,J),hA[B].S===void 0?(yA.Z=f-2,hA[B]=yA):hA[B].S[f-2]=yA,[]}),[]})},A:function(c,B){B=M(B),JA(c,{name:B,fromWireType:function(f){var p=sA(f);return Ft(f),p},toWireType:function(f,p){return eA(p)},argPackAdvance:8,readValueFromPointer:de,V:null})},n:function(c,B,f){f=Dt(f),B=M(B),JA(c,{name:B,fromWireType:function(p){return p},toWireType:function(p,D){return D},argPackAdvance:8,readValueFromPointer:$r(B,f),V:null})},e:function(c,B,f,p,D){B=M(B),D===-1&&(D=4294967295),D=Dt(f);var N=K=>K;if(p===0){var J=32-8*f;N=K=>K<<J>>>J}f=B.includes("unsigned")?function(K,tA){return tA>>>0}:function(K,tA){return tA},JA(c,{name:B,fromWireType:N,toWireType:f,argPackAdvance:8,readValueFromPointer:Ai(B,D,p!==0),V:null})},b:function(c,B,f){function p(N){N>>=2;var J=w;return new D(Q,J[N+1],J[N])}var D=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][B];f=M(f),JA(c,{name:f,fromWireType:p,argPackAdvance:8,readValueFromPointer:p},{ua:!0})},o:function(c,B){B=M(B);var f=B==="std::string";JA(c,{name:B,fromWireType:function(p){var D=w[p>>2],N=p+4;if(f)for(var J=N,K=0;K<=D;++K){var tA=N+K;if(K==D||m[tA]==0){if(J=J?E(m,J,tA-J):"",q===void 0)var q=J;else q+="\0",q+=J;J=tA+1}}else{for(q=Array(D),K=0;K<D;++K)q[K]=String.fromCharCode(m[N+K]);q=q.join("")}return KA(p),q},toWireType:function(p,D){D instanceof ArrayBuffer&&(D=new Uint8Array(D));var N,J=typeof D=="string";if(J||D instanceof Uint8Array||D instanceof Uint8ClampedArray||D instanceof Int8Array||v("Cannot pass non-string to std::string"),f&&J){var K=0;for(N=0;N<D.length;++N){var tA=D.charCodeAt(N);127>=tA?K++:2047>=tA?K+=2:55296<=tA&&57343>=tA?(K+=4,++N):K+=3}N=K}else N=D.length;if(K=St(4+N+1),tA=K+4,w[K>>2]=N,f&&J){if(J=tA,tA=N+1,N=m,0<tA){tA=J+tA-1;for(var q=0;q<D.length;++q){var lA=D.charCodeAt(q);if(55296<=lA&&57343>=lA){var BA=D.charCodeAt(++q);lA=65536+((lA&1023)<<10)|BA&1023}if(127>=lA){if(J>=tA)break;N[J++]=lA}else{if(2047>=lA){if(J+1>=tA)break;N[J++]=192|lA>>6}else{if(65535>=lA){if(J+2>=tA)break;N[J++]=224|lA>>12}else{if(J+3>=tA)break;N[J++]=240|lA>>18,N[J++]=128|lA>>12&63}N[J++]=128|lA>>6&63}N[J++]=128|lA&63}}N[J]=0}}else if(J)for(J=0;J<N;++J)q=D.charCodeAt(J),255<q&&(KA(tA),v("String has UTF-16 code units that do not fit in 8 bits")),m[tA+J]=q;else for(J=0;J<N;++J)m[tA+J]=D[J];return p!==null&&p.push(KA,K),K},argPackAdvance:8,readValueFromPointer:de,V:function(p){KA(p)}})},i:function(c,B,f){if(f=M(f),B===2)var p=ei,D=ti,N=ni,J=()=>d,K=1;else B===4&&(p=ri,D=ii,N=oi,J=()=>w,K=2);JA(c,{name:f,fromWireType:function(tA){for(var q=w[tA>>2],lA=J(),BA,hA=tA+4,xA=0;xA<=q;++xA){var yA=tA+4+xA*B;(xA==q||lA[yA>>K]==0)&&(hA=p(hA,yA-hA),BA===void 0?BA=hA:(BA+="\0",BA+=hA),hA=yA+B)}return KA(tA),BA},toWireType:function(tA,q){typeof q!="string"&&v("Cannot pass non-string to C++ string type "+f);var lA=N(q),BA=St(4+lA+B);return w[BA>>2]=lA>>K,D(q,BA+4,lA+B),tA!==null&&tA.push(KA,BA),BA},argPackAdvance:8,readValueFromPointer:de,V:function(tA){KA(tA)}})},k:function(c,B,f,p,D,N){Oe[c]={name:M(B),fa:kA(f,p),W:kA(D,N),ia:[]}},h:function(c,B,f,p,D,N,J,K,tA,q){Oe[c].ia.push({oa:M(B),ta:f,ra:kA(p,D),sa:N,za:J,ya:kA(K,tA),Aa:q})},C:function(c,B){B=M(B),JA(c,{va:!0,name:B,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(c,B,f,p,D){c=Ve[c],B=sA(B),f=Dn(f);var N=[];return w[p>>2]=eA(N),c(B,f,N,D)},t:function(c,B,f,p){c=Ve[c],B=sA(B),f=Dn(f),c(B,f,null,p)},g:Ft,m:function(c,B){var f=gi(c,B),p=f[0];B=p.name+"_$"+f.slice(1).map(function(J){return J.name}).join("_")+"$";var D=bn[B];if(D!==void 0)return D;var N=Array(c-1);return D=si((J,K,tA,q)=>{for(var lA=0,BA=0;BA<c-1;++BA)N[BA]=f[BA+1].readValueFromPointer(q+lA),lA+=f[BA+1].argPackAdvance;for(J=J[K].apply(J,N),BA=0;BA<c-1;++BA)f[BA+1].ma&&f[BA+1].ma(N[BA]);if(!p.va)return p.toWireType(tA,J)}),bn[B]=D},D:function(c){4<c&&(nA[c].ga+=1)},r:function(c){var B=sA(c);yt(B),Ft(c)},c:function(){IA("")},x:function(c,B,f){m.copyWithin(c,B,B+f)},w:function(c){var B=m.length;if(c>>>=0,2147483648<c)return!1;for(var f=1;4>=f;f*=2){var p=B*(1+.2/f);p=Math.min(p,c+100663296);var D=Math;p=Math.max(c,p),D=D.min.call(D,2147483648,p+(65536-p%65536)%65536);A:{try{I.grow(D-Q.byteLength+65535>>>16),b();var N=1;break A}catch{}N=void 0}if(N)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(c,B,f,p){for(var D=0,N=0;N<f;N++){var J=w[B>>2],K=w[B+4>>2];B+=8;for(var tA=0;tA<K;tA++){var q=m[J+tA],lA=li[c];q===0||q===10?((c===1?a:s)(E(lA,0)),lA.length=0):lA.push(q)}D+=K}return w[p>>2]=D,0}};(function(){function c(D){t.asm=D.exports,I=t.asm.E,b(),F=t.asm.J,H.unshift(t.asm.F),z--,t.monitorRunDependencies&&t.monitorRunDependencies(z),z==0&&(X!==null&&(clearInterval(X),X=null),S&&(D=S,S=null,D()))}function B(D){c(D.instance)}function f(D){return U().then(function(N){return WebAssembly.instantiate(N,p)}).then(function(N){return N}).then(D,function(N){s("failed to asynchronously prepare wasm: "+N),IA(N)})}var p={a:ci};if(z++,t.monitorRunDependencies&&t.monitorRunDependencies(z),t.instantiateWasm)try{return t.instantiateWasm(p,c)}catch(D){s("Module.instantiateWasm callback failed with error: "+D),r(D)}return(function(){return g||typeof WebAssembly.instantiateStreaming!="function"||O(V)||typeof fetch!="function"?f(B):fetch(V,{credentials:"same-origin"}).then(function(D){return WebAssembly.instantiateStreaming(D,p).then(B,function(N){return s("wasm streaming compile failed: "+N),s("falling back to ArrayBuffer instantiation"),f(B)})})})().catch(r),{}})(),t.___wasm_call_ctors=function(){return(t.___wasm_call_ctors=t.asm.F).apply(null,arguments)};var xn=t.___getTypeName=function(){return(xn=t.___getTypeName=t.asm.G).apply(null,arguments)};t.__embind_initialize_bindings=function(){return(t.__embind_initialize_bindings=t.asm.H).apply(null,arguments)};var St=t._malloc=function(){return(St=t._malloc=t.asm.I).apply(null,arguments)},KA=t._free=function(){return(KA=t._free=t.asm.K).apply(null,arguments)};t.dynCall_jiji=function(){return(t.dynCall_jiji=t.asm.L).apply(null,arguments)};var ze;S=function c(){ze||Mn(),ze||(S=c)};function Mn(){function c(){if(!ze&&(ze=!0,t.calledRun=!0,!u)){if(AA(H),n(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;){var B=t.postRun.shift();_.unshift(B)}AA(_)}}if(!(0<z)){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)R();AA(k),0<z||(t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),c()},1)):c())}}if(t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);0<t.preInit.length;)t.preInit.pop()();return Mn(),e.ready})})(),Fr=Lo;T();T();var zA=(function(A){return A[A.Auto=0]="Auto",A[A.FlexStart=1]="FlexStart",A[A.Center=2]="Center",A[A.FlexEnd=3]="FlexEnd",A[A.Stretch=4]="Stretch",A[A.Baseline=5]="Baseline",A[A.SpaceBetween=6]="SpaceBetween",A[A.SpaceAround=7]="SpaceAround",A[A.SpaceEvenly=8]="SpaceEvenly",A})({}),Nr=(function(A){return A[A.BorderBox=0]="BorderBox",A[A.ContentBox=1]="ContentBox",A})({}),Sr=(function(A){return A[A.Width=0]="Width",A[A.Height=1]="Height",A})({}),Pe=(function(A){return A[A.Inherit=0]="Inherit",A[A.LTR=1]="LTR",A[A.RTL=2]="RTL",A})({}),cn=(function(A){return A[A.Flex=0]="Flex",A[A.None=1]="None",A[A.Contents=2]="Contents",A})({}),XA=(function(A){return A[A.Left=0]="Left",A[A.Top=1]="Top",A[A.Right=2]="Right",A[A.Bottom=3]="Bottom",A[A.Start=4]="Start",A[A.End=5]="End",A[A.Horizontal=6]="Horizontal",A[A.Vertical=7]="Vertical",A[A.All=8]="All",A})({}),Qe=(function(A){return A[A.None=0]="None",A[A.StretchFlexBasis=1]="StretchFlexBasis",A[A.AbsolutePositionWithoutInsetsExcludesPadding=2]="AbsolutePositionWithoutInsetsExcludesPadding",A[A.AbsolutePercentAgainstInnerSize=4]="AbsolutePercentAgainstInnerSize",A[A.All=2147483647]="All",A[A.Classic=2147483646]="Classic",A})({}),ko=(function(A){return A[A.WebFlexBasis=0]="WebFlexBasis",A})({}),dt=(function(A){return A[A.Column=0]="Column",A[A.ColumnReverse=1]="ColumnReverse",A[A.Row=2]="Row",A[A.RowReverse=3]="RowReverse",A})({}),un=(function(A){return A[A.Column=0]="Column",A[A.Row=1]="Row",A[A.All=2]="All",A})({}),Ce=(function(A){return A[A.FlexStart=0]="FlexStart",A[A.Center=1]="Center",A[A.FlexEnd=2]="FlexEnd",A[A.SpaceBetween=3]="SpaceBetween",A[A.SpaceAround=4]="SpaceAround",A[A.SpaceEvenly=5]="SpaceEvenly",A})({}),fe=(function(A){return A[A.Error=0]="Error",A[A.Warn=1]="Warn",A[A.Info=2]="Info",A[A.Debug=3]="Debug",A[A.Verbose=4]="Verbose",A[A.Fatal=5]="Fatal",A})({}),Bn=(function(A){return A[A.Undefined=0]="Undefined",A[A.Exactly=1]="Exactly",A[A.AtMost=2]="AtMost",A})({}),Ur=(function(A){return A[A.Default=0]="Default",A[A.Text=1]="Text",A})({}),En=(function(A){return A[A.Visible=0]="Visible",A[A.Hidden=1]="Hidden",A[A.Scroll=2]="Scroll",A})({}),Qn=(function(A){return A[A.Static=0]="Static",A[A.Relative=1]="Relative",A[A.Absolute=2]="Absolute",A})({}),HA=(function(A){return A[A.Undefined=0]="Undefined",A[A.Point=1]="Point",A[A.Percent=2]="Percent",A[A.Auto=3]="Auto",A})({}),Cn=(function(A){return A[A.NoWrap=0]="NoWrap",A[A.Wrap=1]="Wrap",A[A.WrapReverse=2]="WrapReverse",A})({}),Po={ALIGN_AUTO:zA.Auto,ALIGN_FLEX_START:zA.FlexStart,ALIGN_CENTER:zA.Center,ALIGN_FLEX_END:zA.FlexEnd,ALIGN_STRETCH:zA.Stretch,ALIGN_BASELINE:zA.Baseline,ALIGN_SPACE_BETWEEN:zA.SpaceBetween,ALIGN_SPACE_AROUND:zA.SpaceAround,ALIGN_SPACE_EVENLY:zA.SpaceEvenly,BOX_SIZING_BORDER_BOX:Nr.BorderBox,BOX_SIZING_CONTENT_BOX:Nr.ContentBox,DIMENSION_WIDTH:Sr.Width,DIMENSION_HEIGHT:Sr.Height,DIRECTION_INHERIT:Pe.Inherit,DIRECTION_LTR:Pe.LTR,DIRECTION_RTL:Pe.RTL,DISPLAY_FLEX:cn.Flex,DISPLAY_NONE:cn.None,DISPLAY_CONTENTS:cn.Contents,EDGE_LEFT:XA.Left,EDGE_TOP:XA.Top,EDGE_RIGHT:XA.Right,EDGE_BOTTOM:XA.Bottom,EDGE_START:XA.Start,EDGE_END:XA.End,EDGE_HORIZONTAL:XA.Horizontal,EDGE_VERTICAL:XA.Vertical,EDGE_ALL:XA.All,ERRATA_NONE:Qe.None,ERRATA_STRETCH_FLEX_BASIS:Qe.StretchFlexBasis,ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING:Qe.AbsolutePositionWithoutInsetsExcludesPadding,ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE:Qe.AbsolutePercentAgainstInnerSize,ERRATA_ALL:Qe.All,ERRATA_CLASSIC:Qe.Classic,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:ko.WebFlexBasis,FLEX_DIRECTION_COLUMN:dt.Column,FLEX_DIRECTION_COLUMN_REVERSE:dt.ColumnReverse,FLEX_DIRECTION_ROW:dt.Row,FLEX_DIRECTION_ROW_REVERSE:dt.RowReverse,GUTTER_COLUMN:un.Column,GUTTER_ROW:un.Row,GUTTER_ALL:un.All,JUSTIFY_FLEX_START:Ce.FlexStart,JUSTIFY_CENTER:Ce.Center,JUSTIFY_FLEX_END:Ce.FlexEnd,JUSTIFY_SPACE_BETWEEN:Ce.SpaceBetween,JUSTIFY_SPACE_AROUND:Ce.SpaceAround,JUSTIFY_SPACE_EVENLY:Ce.SpaceEvenly,LOG_LEVEL_ERROR:fe.Error,LOG_LEVEL_WARN:fe.Warn,LOG_LEVEL_INFO:fe.Info,LOG_LEVEL_DEBUG:fe.Debug,LOG_LEVEL_VERBOSE:fe.Verbose,LOG_LEVEL_FATAL:fe.Fatal,MEASURE_MODE_UNDEFINED:Bn.Undefined,MEASURE_MODE_EXACTLY:Bn.Exactly,MEASURE_MODE_AT_MOST:Bn.AtMost,NODE_TYPE_DEFAULT:Ur.Default,NODE_TYPE_TEXT:Ur.Text,OVERFLOW_VISIBLE:En.Visible,OVERFLOW_HIDDEN:En.Hidden,OVERFLOW_SCROLL:En.Scroll,POSITION_TYPE_STATIC:Qn.Static,POSITION_TYPE_RELATIVE:Qn.Relative,POSITION_TYPE_ABSOLUTE:Qn.Absolute,UNIT_UNDEFINED:HA.Undefined,UNIT_POINT:HA.Point,UNIT_PERCENT:HA.Percent,UNIT_AUTO:HA.Auto,WRAP_NO_WRAP:Cn.NoWrap,WRAP_WRAP:Cn.Wrap,WRAP_WRAP_REVERSE:Cn.WrapReverse},vr=Po;function fn(A){function e(r,i,o){let a=r[i];r[i]=function(){for(var s=arguments.length,g=new Array(s),l=0;l<s;l++)g[l]=arguments[l];return o.call(this,a,...g)}}for(let r of["setPosition","setMargin","setFlexBasis","setWidth","setHeight","setMinWidth","setMinHeight","setMaxWidth","setMaxHeight","setPadding","setGap"]){let i={[HA.Point]:A.Node.prototype[r],[HA.Percent]:A.Node.prototype[`${r}Percent`],[HA.Auto]:A.Node.prototype[`${r}Auto`]};e(A.Node.prototype,r,function(o){for(var a=arguments.length,s=new Array(a>1?a-1:0),g=1;g<a;g++)s[g-1]=arguments[g];let l=s.pop(),I,u;if(l==="auto")I=HA.Auto,u=void 0;else if(typeof l=="object")I=l.unit,u=l.valueOf();else if(I=typeof l=="string"&&l.endsWith("%")?HA.Percent:HA.Point,u=parseFloat(l),l!==void 0&&!Number.isNaN(l)&&Number.isNaN(u))throw new Error(`Invalid value ${l} for ${r}`);if(!i[I])throw new Error(`Failed to execute "${r}": Unsupported unit '${l}'`);return u!==void 0?i[I].call(this,...s,u):i[I].call(this,...s)})}function t(r){return A.MeasureCallback.implement({measure:function(){let{width:i,height:o}=r(...arguments);return{width:i??NaN,height:o??NaN}}})}e(A.Node.prototype,"setMeasureFunc",function(r,i){return i?r.call(this,t(i)):this.unsetMeasureFunc()});function n(r){return A.DirtiedCallback.implement({dirtied:r})}return e(A.Node.prototype,"setDirtiedFunc",function(r,i){r.call(this,n(i))}),e(A.Config.prototype,"free",function(){A.Config.destroy(this)}),e(A.Node,"create",(r,i)=>i?A.Node.createWithConfig(i):A.Node.createDefault()),e(A.Node.prototype,"free",function(){A.Node.destroy(this)}),e(A.Node.prototype,"freeRecursive",function(){for(let r=0,i=this.getChildCount();r<i;++r)this.getChild(0).freeRecursive();this.free()}),e(A.Node.prototype,"calculateLayout",function(r){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NaN,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Pe.LTR;return r.call(this,i,o,a)}),{Config:A.Config,Node:A.Node,...vr}}async function Rr(){return fn(await Fr())}var ht=null;async function Ho(){return ht||(ht=await Rr(),ht)}function To(A,e){switch(e){case"center":return A.JUSTIFY_CENTER;case"end":return A.JUSTIFY_FLEX_END;case"space-between":return A.JUSTIFY_SPACE_BETWEEN;case"space-around":return A.JUSTIFY_SPACE_AROUND;default:return A.JUSTIFY_FLEX_START}}function Jo(A,e){switch(e){case"center":return A.ALIGN_CENTER;case"end":return A.ALIGN_FLEX_END;case"stretch":return A.ALIGN_STRETCH;default:return A.ALIGN_FLEX_START}}function Oo(A,e){switch(e){case"start":return A.ALIGN_FLEX_START;case"center":return A.ALIGN_CENTER;case"end":return A.ALIGN_FLEX_END;case"stretch":return A.ALIGN_STRETCH;case"baseline":return A.ALIGN_BASELINE;default:return A.ALIGN_AUTO}}function ne(A){if(A!=null){if(typeof A=="number"||typeof A=="string")return A;if(typeof A=="object"){if("unit"in A&&typeof A.unit=="number")return A;let e=Number(A);if(!Number.isNaN(e))return e}}}function Ko(A){switch(A.kind){case"flex":return A.dir??"row";case"block":return"column";case"box":return A.children&&A.children.length>0?"column":null;default:return null}}function Yo(A){if(A.kind==="block")return"fill"}function Vo(A){let e=0;if(A.kind==="flex"||A.kind==="block"){let o=ne(A.gap);e=typeof o=="number"?o:0}let t=0;if(A.kind==="flex"||A.kind==="block"||A.kind==="box"||A.kind==="text"){let o=ne(A.padding);t=typeof o=="number"?o:0}let n="start";A.kind==="flex"&&(n=A.justify??"start");let r="start";(A.kind==="flex"||A.kind==="block")&&(r=A.align??"start");let i=!1;return A.kind==="flex"&&(i=typeof A.wrap=="boolean"?A.wrap:!1),{gap:e,padding:t,justify:n,align:r,wrap:i}}function He(A){let e=A;return e.position==="absolute"||e.position===void 0&&(e.x!==void 0||e.y!==void 0)}function Wo(A){return"children"in A&&A.children?A.children.filter(e=>!He(e)):[]}function zo(A){return"children"in A&&A.children?A.children.filter(e=>He(e)):[]}function kr(A,e,t,n,r){let i=e,o=A.Node.create(),a=Ko(i),s=a!==null,g=[];if(He(i)){o.setPositionType(A.POSITION_TYPE_ABSOLUTE);let h=ne(i.x),d=ne(i.y);h!==void 0&&o.setPosition(A.EDGE_LEFT,h),d!==void 0&&o.setPosition(A.EDGE_TOP,d)}else o.setPositionType(A.POSITION_TYPE_RELATIVE);let I=ne(i.grow);I!==void 0&&o.setFlexGrow(typeof I=="number"?I:parseFloat(I));let u=ne(i.flexShrink);u!==void 0?o.setFlexShrink(typeof u=="number"?u:parseFloat(u)):o.setFlexShrink(r!==null?1:0),i.flexBasis!==void 0&&o.setFlexBasis(i.flexBasis),i.alignSelf!==void 0&&o.setAlignSelf(Oo(A,i.alignSelf));let E=i.width??Yo(i),Q=i.height,C=r==="row",m=r==="column";if(Lr(o,"width",E,t?.width,C),Lr(o,"height",Q,t?.height,m),s){let h=Vo(i);o.setFlexDirection(a==="row"?A.FLEX_DIRECTION_ROW:A.FLEX_DIRECTION_COLUMN),o.setJustifyContent(To(A,h.justify)),o.setAlignItems(Jo(A,h.align)),o.setFlexWrap(h.wrap?A.WRAP_WRAP:A.WRAP_NO_WRAP),h.padding>0&&o.setPadding(A.EDGE_ALL,h.padding),h.gap>0&&o.setGap(A.GUTTER_ALL,h.gap);let d=Wo(i),y=zo(i),w=[...d,...y];for(let G=0;G<w.length;G++){let x=kr(A,w[G],void 0,n,He(i)?null:a);o.insertChild(x.yogaNode,G),g.push(x)}}else if(i.kind==="text"||i.kind==="media"&&i.dataType==="Caption")o.setMeasureFunc((h,d,y,w)=>{let G;(d===1||d===2)&&(G=h);let x=n?.(i,G)??{width:0,height:0},b=x.width,F=x.height;return d===1&&(b=h),w===1&&(F=y),{width:b,height:F}});else{let h=n?.(i)??null;if(h){let d=i.aspectRatio!==void 0,y=i.dataType==="Caption",w=h.height>0?h.width/h.height:1;i.kind==="media"&&!y&&!d&&o.setAspectRatio(w);let G=E===void 0||E==="auto"||E==="fit",x=Q===void 0||Q==="auto"||Q==="fit";if(G&&x){let b=i.aspectRatio??(i.kind==="media"?w:void 0)??1;o.setMeasureFunc((F,k,H,_)=>{let R=h.width,z=h.height;if(k===1&&_===1)R=F,z=H;else if(k===1)R=F,z=b>0?Math.round(F/b):h.height;else if(_===1)z=H,R=b>0?Math.round(H*b):h.width;else if(k===2&&_===2){let X=Math.min(1,F/h.width,H/h.height);R=Math.round(h.width*X),z=Math.round(h.height*X)}else k===2?h.width>F&&(R=F,z=b>0?Math.round(F/b):h.height):_===2&&h.height>H&&(z=H,R=b>0?Math.round(H*b):h.width);return{width:R,height:z}})}else if(G){let b=i.aspectRatio??(i.kind==="media"?w:void 0);(b===void 0||b<=0)&&o.setWidth(h.width)}else if(x){let b=i.aspectRatio??(i.kind==="media"?w:void 0);(b===void 0||b<=0)&&o.setHeight(h.height)}}}return{yogaNode:o,layoutNode:i,children:g}}function Lr(A,e,t,n,r){if(t===void 0||t==="auto"||t==="fit")return;let i=ne(t);if(typeof i=="number"){e==="width"?A.setWidth(i):A.setHeight(i);return}if(i==="fill"){if(r){A.getFlexGrow()===0&&A.setFlexGrow(1),A.setFlexBasis(0);return}n!==void 0?e==="width"?A.setWidth(n):A.setHeight(n):e==="width"?A.setWidthPercent(100):A.setHeightPercent(100)}}function Pr(A,e,t,n,r){let i=A.yogaNode.getComputedLayout(),o=e+i.left,a=t+i.top,s=i.width,g=i.height,l=A.layoutNode;He(l)||(o+=Number(l.x??0),a+=Number(l.y??0)),n[A.layoutNode.id]={x:Math.round(o*1e3)/1e3,y:Math.round(a*1e3)/1e3,width:Math.round(s*1e3)/1e3,height:Math.round(g*1e3)/1e3},r[A.layoutNode.id]={width:Math.round(s*1e3)/1e3,height:Math.round(g*1e3)/1e3};for(let I of A.children)Pr(I,o,a,n,r)}function Hr(A){for(let e of A.children)Hr(e);A.yogaNode.free()}function Xo(A,e){let{layout:t,viewport:n,measure:r}=e,i={},o={};for(let a of t){let s=A.Node.create();s.setWidth(n.width),s.setHeight(n.height),s.setFlexDirection(A.FLEX_DIRECTION_COLUMN);let g=kr(A,a,{width:n.width,height:n.height},r,null);s.insertChild(g.yogaNode,0),s.calculateLayout(n.width,n.height);let l=g.yogaNode.getComputedLayout(),I=a.position==="absolute"||a.position===void 0&&(a.x!==void 0||a.y!==void 0),u=I?l.left:Number(a.x??0),E=I?l.top:Number(a.y??0);i[a.id]={x:Math.round(u*1e3)/1e3,y:Math.round(E*1e3)/1e3,width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3},o[a.id]={width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3};for(let Q of g.children)Pr(Q,u,E,i,o);Hr(g),s.free()}return{rects:i,sizes:o}}async function Gl(A){let e=await Ho();return Xo(e,A)}T();function Tr(A,e){let t=Math.floor(A)^e*1013|0;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967295*2-1}function Zo(A,e){let t=Math.floor(A),n=t+1,r=A-t,i=r*r*(3-2*r),o=Tr(t,e),a=Tr(n,e),s=o*r,g=a*(r-1);return(s*(1-i)+g*i)*2}function qo(A,e,t=0){let n=A.frequency??2,r=A.amplitude??50,i=Math.max(1,Math.min(4,A.octaves??1)),o=A.seed??1234,a=0,s=0,g=1,l=n;for(let u=0;u<i;u++){let E=Zo(e*l,o+u*7919);a+=E*g,s+=g,g*=.5,l*=2}let I=s>0?a/s:0;return t+I*r}function _o(A,e,t,n){if(e<=0)return t;let r=Math.max(.001,A.mass??1),i=Math.max(.001,A.stiffness??180),o=Math.max(.001,A.damping??12),a=Math.sqrt(i/r),s=o/(2*Math.sqrt(i*r)),g=1;if(s<1){let l=a*Math.sqrt(1-s*s),I=-1,u=-s*a/l;g=1+Math.exp(-s*a*e)*(I*Math.cos(l*e)+u*Math.sin(l*e))}else if(Math.abs(s-1)<1e-4)g=1+Math.exp(-a*e)*(-1-a*e);else{let l=Math.sqrt(s*s-1),I=-a*(s-l),u=-a*(s+l),E=-1/(1-I/u),Q=-1-E;g=1+E*Math.exp(I*e)+Q*Math.exp(u*e)}return t+(n-t)*g}function RA(A,e,t){if(A==null)return 0;if(typeof A=="number")return A;if(typeof A=="function")return Number(A(e,t))||0;if(Array.isArray(A)||ArrayBuffer.isView(A)){let n=A;if(n.length===0)return 0;let r=Math.max(0,Math.min(n.length-1,Math.round(e)));return Number(n[r])||0}if(typeof A=="object"){let n=A;if(typeof n.get=="function")return Number(n.get({frame:e,fps:t,time:t>0?e/t:0}))||0;if(n.type==="Signal"&&n.data)return RA(n.data,e,t);let r=n.samples??(typeof n.channel=="string"&&n[n.channel]!==void 0?n[n.channel]:void 0);if(Array.isArray(r)||ArrayBuffer.isView(r)){let i=r;if(i.length===0)return 0;let o=Number(n.fps)||24,a=t>0?t:24,s=e/a,g=Math.max(0,Math.min(i.length-1,Math.round(s*o)));return Number(i[g])||0}if(n.type==="audio_extractor"||n.extractionMode!==void 0){let i=n.nodeId;if(i){let o=n.channel??"primary",a=kn.getChannelSamples(i,o);if(a&&a.length>0){let s=Number(n.fps)||24,g=t>0?t:24,l=e/g,I=Math.max(0,Math.min(a.length-1,Math.round(l*s)));return Number(a[I])||0}}return 0}if(n.type==="generator"){let i=typeof n.amplitude=="number"?n.amplitude:1,o=typeof n.frequency=="number"?n.frequency:1;if(n.syncToBpm&&typeof n.bpm=="number"&&n.bpm>0){let h=typeof n.bars=="number"&&n.bars>0?n.bars:1;o=n.bpm/60/h}let a=typeof n.phase=="number"?n.phase:0,s=typeof n.offset=="number"?n.offset:0,g=e/(t>0?t:24),l=n.baseType??"sine",I=!!n.fmEnabled,u=g;if(I){let h=Number(n.fmAmplitude)||1,d=Number(n.fmFrequency)||.5;u=g+Math.sin(g*d*Math.PI*2)*h}let E=0,Q=(u*o+a/(Math.PI*2))%1,C=Q<0?Q+1:Q,m=h=>(h%1+1)%1;switch(l){case"triangle":E=4*Math.abs(C-.5)-1;break;case"sawtooth":E=2*C-1;break;case"square":E=C<.5?1:-1;break;case"constant":E=1;break;case"noise_smooth":{let h=u*o+a,d=Math.floor(h),y=h-d,w=y*y*(3-2*y),G=m(Math.sin(d*12.9898)*43758.5453),x=m(Math.sin((d+1)*12.9898)*43758.5453);E=(G*(1-w)+x*w)*2-1;break}case"noise_white":E=m(Math.sin(u*12.9898+a)*43758.5453)*2-1;break;case"pulse":{let h=a===0?.5:Math.max(.01,Math.min(.99,a));E=m(u*o)<h?1:-1;break}case"bounce":E=Math.abs(Math.sin(u*o*Math.PI+a));break;case"staircase":E=Math.floor(C*8)/7*2-1;break;default:E=Math.sin(u*o*Math.PI*2+a);break}return E*i+s}if(n.type==="gate"){let i=n.sourceSignal??n.signal,o=typeof n.threshold=="number"?n.threshold:.5,a=n.mode??"gate",s=!!n.invert,g=typeof n.debounceMs=="number"?n.debounceMs:0,l=Math.max(1,Math.round(g/1e3*t)),I=Math.max(1,Number(n.holdFrames)||4),u=0;if(a==="gate")u=RA(i,e,t)>=o?1:0;else if(a==="trigger"){let E=-1/0,Q=Math.max(0,e-300);for(let C=Q;C<=e;C++){let m=RA(i,C,t),h=C>0?RA(i,C-1,t):0;m>=o&&h<o&&C-E>=l&&(E=C)}u=e>=E&&e<E+I?1:0}else if(a==="toggle"){let E=0,Q=-1/0;for(let C=0;C<=e;C++){let m=RA(i,C,t),h=C>0?RA(i,C-1,t):0;m>=o&&h<o&&C-Q>=l&&(E++,Q=C)}u=E%2===1?1:0}return s?1-u:u}if(n.type==="signal_math"){let i=RA(n.signalA,e,t),a=n.signalB!==void 0?RA(n.signalB,e,t):Number(n.bValue)||0;switch(n.operation){case"add":return i+a;case"subtract":return i-a;case"multiply":return i*a;case"divide":return a!==0?i/a:0;case"min":return Math.min(i,a);case"max":return Math.max(i,a);case"clamp":{let s=Number(n.clampMin)||0,g=Number(n.clampMax)||1;return Math.max(s,Math.min(g,i))}case"abs":return Math.abs(i);case"negate":return-i;case"invert":return 1-i;case"power":return i**(Number(n.exponent)||2);case"modulo":return a!==0?i%a:0;case"remap":{let s=Number(n.inMin)||0,g=Number(n.inMax)||1,l=Number(n.outMin)||0,I=Number(n.outMax)||1,u=g-s,E=u!==0?(i-s)/u:0;return l+E*(I-l)}case"normalize":{let s=Number(n.aMin??n.inMin)||0,l=(Number(n.aMax??n.inMax)||1)-s;return l!==0?Math.max(0,Math.min(1,(i-s)/l)):0}case"smoothstep":{let s=Number(n.edge0)||0,l=(Number(n.edge1)||1)-s,I=l!==0?Math.max(0,Math.min(1,(i-s)/l)):0;return I*I*(3-2*I)}case"custom":return i;default:return i}}if(typeof n.value=="number")return n.value}return 0}function jo(A,e,t,n=.15,r=2){if(e<0||!A)return 0;let i=A,o=0,a=-1/0;for(let s=0;s<=e;s++){let g=RA(i,s,t),l=s>0?RA(i,s-1,t):0;g>=n&&l<n&&s-a>=r&&(o++,a=s)}return o}function $o(A,e,t,n={}){let r=n[A.inputHandleId];if(r===void 0&&n){let u=Object.keys(n);if(u.length===1)r=n[u[0]];else if(u.length>1){let E=u.find(Q=>Q===A.inputHandleId);r=E?n[E]:n[u[0]]}}if(A.channel&&r&&typeof r=="object"){let u=r[A.channel];u!==void 0?r=u:typeof r.get!="function"&&(r={...r,channel:A.channel})}if(A.signalMode==="accumulate"){let u=A.threshold??A.accumulateThreshold??.15,E=A.debounceFrames??2,Q=jo(r,e,t,u,E),C=A.multiplier??1,m=A.offset??0;return Q*C+m}let i=A.multiplier??1,o=A.offset??0,a=Math.max(0,Math.round(A.smoothingWindowFrames??0));if(a<=1)return RA(r,e,t)*i+o;let s=0,g=0,l=Math.max(0,e-a+1);for(let u=l;u<=e;u++)s+=RA(r,u,t),g++;return(g>0?s/g:0)*i+o}function Aa(A,e,t){return A+(e-A)*t}function ea(A){let e=A.trim().replace("#","");if(e.length===3&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),e.length===6){let t=parseInt(e,16);return[t>>16&255,t>>8&255,t&255,1]}if(e.length===8){let t=parseInt(e,16);return[t>>24&255,t>>16&255,t>>8&255,(t&255)/255]}return[255,255,255,1]}function Jr(A,e,t){return Ln(A,e,t)}function dn(A,e,t){let n=t;return n<0&&(n+=1),n>1&&(n-=1),n<1/6?A+(e-A)*6*n:n<1/2?e:n<2/3?A+(e-A)*(2/3-n)*6:A}function ta(A,e){let[t,n,r,i]=ea(A),o=t/255,a=n/255,s=r/255,g=Math.max(o,a,s),l=Math.min(o,a,s),I=0,u=0,E=(g+l)/2;if(g!==l){let d=g-l;switch(u=E>.5?d/(2-g-l):d/(g+l),g){case o:I=(a-s)/d+(a<s?6:0);break;case a:I=(s-o)/d+2;break;case s:I=(o-a)/d+4;break}I/=6}I=(I+e%1+1)%1;let Q=E,C=E,m=E;if(u!==0){let d=E<.5?E*(1+u):E+u-E*u,y=2*E-d;Q=dn(y,d,I+1/3),C=dn(y,d,I),m=dn(y,d,I-1/3)}let h=d=>Math.round(Math.max(0,Math.min(255,d*255))).toString(16).padStart(2,"0");return i>=.999?`#${h(Q)}${h(C)}${h(m)}`:`rgba(${Math.round(Q*255)}, ${Math.round(C*255)}, ${Math.round(m*255)}, ${Math.round(i*100)/100})`}var na=new Set(["fill","fillColor","strokeColor","textBackgroundColor","color"]);function hn(A,e){let t=A.keyframes??[];if(t.length===0)return 0;if(t.length===1||e<=t[0].frame)return t[0].value;if(e>=t[t.length-1].frame)return t[t.length-1].value;for(let n=0;n<t.length-1;n++){let r=t[n],i=t[n+1];if(e>=r.frame&&e<=i.frame){let o=i.frame-r.frame,a=o>0?(e-r.frame)/o:0;if(typeof r.value=="boolean")return a>=1?i.value:r.value;if(typeof r.value=="string"&&typeof i.value=="string")return Jr(r.value,i.value,a);let s=Number(r.value)||0,g=Number(i.value)||0;return Aa(s,g,a)}}return t[t.length-1].value}function ra(A,e,t=24,n={}){let r=n.startFrame??0,i=e-r,o=A.source??{type:"keyframe"},a=n.baseValues?.[A.prop];switch(o.type){case"keyframe":return hn(A,i);case"wiggle":{let s=typeof a=="number"?a:0,g=A.keyframes&&A.keyframes.length>0?Number(hn(A,i))||0:s,l=i/(t>0?t:24);return qo(o,l,g)}case"springOvershoot":{let s=0,g=1;A.keyframes&&A.keyframes.length>=2?(s=Number(A.keyframes[0].value)||0,g=Number(A.keyframes[1].value)||1):A.keyframes&&A.keyframes.length===1?(s=Number(a)||0,g=Number(A.keyframes[0].value)||0):typeof a=="number"&&(s=a,g=a);let l=i/(t>0?t:24);return _o(o,l,s,g)}case"signal":{let s=$o(o,e,t,n.signals);if(na.has(A.prop)){let g=o,l=g.colorA??"#ffffff",I=g.colorB??"#ffffff",u=g.colorMode??"interpolate";if(u==="threshold"){let Q=g.colorThreshold??.5;return s>=Q?I:l}if(u==="hueRotate")return ta(l,s);let E=Math.max(0,Math.min(1,s));return Jr(l,I,E)}return s}default:return hn(A,i)}}function vl(A,e,t=24,n={}){let r={};if(!A?.tracks)return r;for(let i of A.tracks)r[i.prop]=ra(i,e,t,n);return r}T();var Or=["x","y","width","height"];function ia(A){let e=A.matte,{matte:t,...n}=A,r={...n};if(Array.isArray(r.children)&&(r.children=mt(r.children)),!e?.node)return[r];let i=e.node,o=i.id??`${String(A.id)}__matte`,a={position:"absolute",...i,id:o,matteOf:String(A.id),matteMode:e.mode??"alpha"};if(Or.every(g=>i[g]===void 0))for(let g of Or)typeof A[g]=="number"&&(a[g]=A[g]);let s=typeof A.startFrame=="number"?A.startFrame:0;return a.startFrame=s+(typeof i.startFrame=="number"?i.startFrame:0),i.durationFrames===void 0&&A.durationFrames!==void 0&&(a.durationFrames=A.durationFrames),Array.isArray(a.children)&&(a.children=mt(a.children)),r.matteId=o,[r,a]}function mt(A){return A.flatMap(e=>ia(e))}T();function mn(A,e,t,n="forward"){if(t<=0||e<=1)return 0;switch(n){case"reverse":return(e-1-A)*t;case"center-out":{let r=(e-1)/2,i=Math.abs(A-r);return Math.round(i*t)}default:return A*t}}function Hl(A,e,t="forward",n=0){return!A||A.length===0?[]:e<=0&&n===0?[...A]:A.map((r,i)=>{let o=mn(i,A.length,e,t),a=r.startFrame??0;return{...r,startFrame:a+o+n}})}T();T();var Yr=Symbol.for("framefields.inlineSignal"),Kr=new WeakMap,oa=0;function aa(A){let e=Kr.get(A);return e===void 0&&(e=`inline_signal_${oa++}`,Kr.set(A,e)),e}function Ol(A){if(typeof A=="string")return{handleId:A};if(A===null||typeof A!="object"&&typeof A!="function")throw new TypeError(`LayerAnimation.signal: expected a signal object or a signal name, got ${String(A)}. Pass a signal (Signal.fromArray / Signal.builder / an audio channel \u2026) or register it with comp.addSignal(name, signal) and pass the name.`);let e=A;return typeof e.inputHandleId=="string"?{handleId:e.inputHandleId}:typeof e.gpuBinding?.nodeId=="string"?typeof e.get=="function"?{handleId:e.gpuBinding.nodeId,inline:A}:{handleId:e.gpuBinding.nodeId}:{handleId:aa(A),inline:A}}function Kl(A,e){Object.defineProperty(A,Yr,{value:e,enumerable:!1,configurable:!0,writable:!0})}function sa(A){if(!(!A||typeof A!="object"))return A[Yr]}function pn(A,e={}){for(let t of A){if(!t||typeof t!="object")continue;let{animation:n,children:r}=t,i=n?.tracks;if(Array.isArray(i))for(let o of i){let a=o?.source,s=sa(a);s&&typeof a?.inputHandleId=="string"&&(e[a.inputHandleId]=s)}Array.isArray(r)&&pn(r,e)}return e}function Vr(A,e,t,n=0,r,i){let o=[],a=A.src??A.inputHandleId,s=d=>typeof d=="string"&&(d.startsWith("http://")||d.startsWith("https://")||d.startsWith("file://")||d.startsWith("/")||d.startsWith("./")||d.startsWith("blob:")||d.startsWith("data:")||/\.(png|jpe?g|webp|gif|svg|mp4|webm|mov|mkv|mp3|wav|ogg|m4a|srt|vtt)$/i.test(d)),g;if(A.kind==="media"){if(e&&(g=e(A.inputHandleId)),!g&&a&&(s(a)||A.src)&&(g=Un(a,A.dataType??"Video")),g&&A.crop){let d=A.crop,y=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Crop",...y,dataType:g.operation.dataType},children:[g]}}if(g&&Array.isArray(A.effects))for(let d of A.effects){let y=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{id:A.id?`${A.id}-${y.op??"effect"}`:void 0,effect:d,...y,dataType:g.operation.dataType},children:[g]}}if(g&&A.vision){let d=A.vision,y=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Vision",id:A.id,effect:d,...y,dataType:g.operation.dataType},children:[g]}}}if(A.kind==="media")o=g?[g]:[];else if("children"in A&&A.children){let d="staggerFrames"in A&&typeof A.staggerFrames=="number"?A.staggerFrames:0,y="staggerDirection"in A&&typeof A.staggerDirection=="string"?A.staggerDirection:"forward",w=typeof A.startFrame=="number"&&Number.isFinite(A.startFrame)?Math.round(A.startFrame):0,G=typeof A.durationFrames=="number"&&Number.isFinite(A.durationFrames)?Math.round(A.durationFrames):i;o=A.children.map((x,b)=>{let F=mn(b,A.children.length,d,y),k=n+w+F;return Vr(x,e,t,k,r,x.durationFrames===void 0?G:void 0)})}let l="Image",I;if(g){l=g.operation?.dataType??"Image";let y=l==="Image"||l==="SVG"?void 0:vn(g)?.durationMs;y!=null&&(I=Math.max(1,Math.round(y/1e3*t)))}let u=g?.operation?.dataType==="Caption",E=A.kind==="flex"||A.kind==="block"||A.kind==="box",Q=(typeof A.startFrame=="number"&&Number.isFinite(A.startFrame)&&A.startFrame>=0?Math.round(A.startFrame):0)+n,C=typeof A.durationFrames=="number"&&Number.isFinite(A.durationFrames)&&A.durationFrames>0?Math.round(A.durationFrames):void 0,m=i??Math.round((r??1e4)/1e3*t);if(E&&o.length>0){if(C===void 0){let d=o.map(y=>(y.operation?.startFrame??0)+(y.operation?.durationFrames??m));C=Math.max(1,Math.max(...d)-Q)}}else u&&I!==void 0&&I>0?C=I:C!==void 0?(l==="Video"||l==="Audio")&&I!==void 0&&I>0&&(C=Math.min(C,I)):C=I??i??Math.round((r??1e4)/1e3*t);let h=C/t*1e3;if(A.kind==="media"&&g){let d=g;for(;d;)(!d.metadata?.durationMs||d.metadata.durationMs<=0)&&(d.metadata||(d.metadata={}),d.metadata.durationMs=h),d.operation?.sourceMeta&&!d.operation.sourceMeta.durationMs&&(d.operation.sourceMeta.durationMs=h),d=d.children?.[0]}return{metadata:{durationMs:h},operation:{op:"CompositorLayer",...A,startFrame:Q,durationFrames:C,dataType:l},children:o}}function ql(A,e){let{isVideoMode:t,fps:n,durationMs:r,resolveMedia:i,signals:o}=e,a={metadata:{width:A.width,height:A.height,fps:n,...r!==void 0&&{durationMs:r}},operation:{op:"Compositor",width:A.width,height:A.height,fps:n,mode:A.mode??"Video",backgroundColor:A.backgroundColor,...A.antialias3d!==void 0&&{antialias3d:A.antialias3d},volume:A.volume??1,dataType:t?"Video":"Image",layout:A.layout,signals:{...pn(A.layout),...o??A.signals??{}},...(A.onRequestFrame||e.onRequestFrame)&&{onRequestFrame:A.onRequestFrame??e.onRequestFrame}},children:mt(A.layout).map(l=>Vr(l,i,n,0,r))},s=Array.isArray(e.effects)?e.effects:Array.isArray(A.effects)?A.effects:[];for(let l of s){let I=typeof l.toOperation=="function"?l.toOperation():l;a={metadata:{...a.metadata},operation:{...I,dataType:a.operation.dataType},children:[a]}}let g=A.vision??e.vision;if(g){let l=typeof g.toOperation=="function"?g.toOperation():g;a={metadata:{...a.metadata},operation:{op:"Vision",...l,dataType:a.operation.dataType},children:[a]}}return a}function _l(A){let e=[],t=n=>{n?.operation?.op==="CompositorLayer"&&e.push(n);for(let r of n?.children??[])t(r)};for(let n of A)t(n);return e}export{Ze as a,On as b,L as c,uA as d,oe as e,VA as f,Na as g,Sa as h,ye as i,Ha as j,De as k,Ar as l,ns as m,$e as n,wr as o,nl as p,al as q,cr as r,ur as s,Br as t,Vg as u,Er as v,Qr as w,eo as x,Zg as y,In as z,cl as A,Ho as B,Xo as C,Gl as D,Ol as E,Kl as F,ra as G,vl as H,mt as I,mn as J,Hl as K,ql as L,_l as M};