@wildshard/shard-format 0.0.1 → 0.4.6

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 (748) hide show
  1. package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
  2. package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
  3. package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
  4. package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
  5. package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
  6. package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
  7. package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
  8. package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
  9. package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
  10. package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
  11. package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
  12. package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
  13. package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
  14. package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
  15. package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
  16. package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
  17. package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
  18. package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
  19. package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
  20. package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
  21. package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
  22. package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
  23. package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
  24. package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
  25. package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
  26. package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
  27. package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
  28. package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
  29. package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
  30. package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
  31. package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
  32. package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
  33. package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
  34. package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
  35. package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
  36. package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
  37. package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
  38. package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
  39. package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
  40. package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
  41. package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
  42. package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
  43. package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
  44. package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
  45. package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
  46. package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
  47. package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
  48. package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
  49. package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
  50. package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
  51. package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
  52. package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
  53. package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
  54. package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
  55. package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
  56. package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
  57. package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
  58. package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
  59. package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
  60. package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
  61. package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
  62. package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
  63. package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
  64. package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
  65. package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
  66. package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
  67. package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
  68. package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
  69. package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
  70. package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
  71. package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
  72. package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
  73. package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
  74. package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
  75. package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
  76. package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
  77. package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
  78. package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
  79. package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
  80. package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
  81. package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
  82. package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
  83. package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
  84. package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
  85. package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
  86. package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
  87. package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
  88. package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
  89. package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
  90. package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
  91. package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
  92. package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
  93. package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
  94. package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
  95. package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
  96. package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
  97. package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
  98. package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
  99. package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
  100. package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
  101. package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
  102. package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
  103. package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
  104. package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
  105. package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
  106. package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
  107. package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
  108. package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
  109. package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
  110. package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
  111. package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
  112. package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
  113. package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
  114. package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
  115. package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
  116. package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
  117. package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
  118. package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
  119. package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
  120. package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
  121. package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
  122. package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
  123. package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
  124. package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
  125. package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
  126. package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
  127. package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
  128. package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
  129. package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
  130. package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
  131. package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
  132. package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
  133. package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
  134. package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
  135. package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
  136. package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
  137. package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
  138. package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
  139. package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
  140. package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
  141. package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
  142. package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
  143. package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
  144. package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
  145. package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
  146. package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
  147. package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
  148. package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
  149. package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
  150. package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
  151. package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
  152. package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
  153. package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
  154. package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
  155. package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
  156. package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
  157. package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
  158. package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
  159. package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
  160. package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
  161. package/corpus/brasscap-mesa/cook.json +1 -0
  162. package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
  163. package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
  164. package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
  165. package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
  166. package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
  167. package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
  168. package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
  169. package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
  170. package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
  171. package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
  172. package/corpus/brasscap-mesa/sections/look/look.json +1 -0
  173. package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
  174. package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
  175. package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
  176. package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
  177. package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
  178. package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
  179. package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
  180. package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
  181. package/corpus/brasscap-mesa/sections/state/state.json +1 -0
  182. package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
  183. package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
  184. package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
  185. package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
  186. package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
  187. package/corpus/brasscap-mesa/sections/world/days.json +1 -0
  188. package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
  189. package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
  190. package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
  191. package/corpus/brasscap-mesa/sections/world/props.json +1 -0
  192. package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
  193. package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
  194. package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
  195. package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
  196. package/corpus/brasscap-mesa/sections/world/water.json +1 -0
  197. package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
  198. package/corpus/brasscap-mesa/shard.json +1 -0
  199. package/corpus/brasscap-mesa/validation.json +1 -0
  200. package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
  201. package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
  202. package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
  203. package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
  204. package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
  205. package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
  206. package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
  207. package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
  208. package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
  209. package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
  210. package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
  211. package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
  212. package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
  213. package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
  214. package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
  215. package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
  216. package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
  217. package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
  218. package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
  219. package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
  220. package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
  221. package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
  222. package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
  223. package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
  224. package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
  225. package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
  226. package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
  227. package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
  228. package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
  229. package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
  230. package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
  231. package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
  232. package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
  233. package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
  234. package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
  235. package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
  236. package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
  237. package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
  238. package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
  239. package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
  240. package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
  241. package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
  242. package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
  243. package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
  244. package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
  245. package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
  246. package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
  247. package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
  248. package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
  249. package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
  250. package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
  251. package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
  252. package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
  253. package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
  254. package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
  255. package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
  256. package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
  257. package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
  258. package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
  259. package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
  260. package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
  261. package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
  262. package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
  263. package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
  264. package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
  265. package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
  266. package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
  267. package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
  268. package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
  269. package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
  270. package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
  271. package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
  272. package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
  273. package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
  274. package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
  275. package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
  276. package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
  277. package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
  278. package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
  279. package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
  280. package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
  281. package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
  282. package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
  283. package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
  284. package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
  285. package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
  286. package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
  287. package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
  288. package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
  289. package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
  290. package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
  291. package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
  292. package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
  293. package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
  294. package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
  295. package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
  296. package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
  297. package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
  298. package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
  299. package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
  300. package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
  301. package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
  302. package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
  303. package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
  304. package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
  305. package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
  306. package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
  307. package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
  308. package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
  309. package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
  310. package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
  311. package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
  312. package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
  313. package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
  314. package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
  315. package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
  316. package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
  317. package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
  318. package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
  319. package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
  320. package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
  321. package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
  322. package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
  323. package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
  324. package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
  325. package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
  326. package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
  327. package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
  328. package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
  329. package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
  330. package/corpus/handwritten/cook.json +1 -0
  331. package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
  332. package/corpus/handwritten/sections/actors/creatures.json +1 -0
  333. package/corpus/handwritten/sections/actors/crowds.json +1 -0
  334. package/corpus/handwritten/sections/actors/species.json +1 -0
  335. package/corpus/handwritten/sections/audio/audio.json +1 -0
  336. package/corpus/handwritten/sections/client/plan.json +1 -0
  337. package/corpus/handwritten/sections/combat/encounters.json +1 -0
  338. package/corpus/handwritten/sections/combat/items.json +1 -0
  339. package/corpus/handwritten/sections/combat/strikes.json +1 -0
  340. package/corpus/handwritten/sections/economy/ledger.json +1 -0
  341. package/corpus/handwritten/sections/economy/loot.json +1 -0
  342. package/corpus/handwritten/sections/look/look.json +1 -0
  343. package/corpus/handwritten/sections/look/map.json +1 -0
  344. package/corpus/handwritten/sections/look/materials.json +1 -0
  345. package/corpus/handwritten/sections/quests/quests.json +1 -0
  346. package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
  347. package/corpus/handwritten/sections/sim/hooks.json +1 -0
  348. package/corpus/handwritten/sections/sim/plumbing.json +1 -0
  349. package/corpus/handwritten/sections/sim/sim.json +1 -0
  350. package/corpus/handwritten/sections/state/migrations.json +1 -0
  351. package/corpus/handwritten/sections/state/state.json +1 -0
  352. package/corpus/handwritten/sections/ui/card.json +1 -0
  353. package/corpus/handwritten/sections/ui/compendium.json +1 -0
  354. package/corpus/handwritten/sections/ui/level.json +1 -0
  355. package/corpus/handwritten/sections/ui/ui.json +1 -0
  356. package/corpus/handwritten/sections/world/collision.json +1 -0
  357. package/corpus/handwritten/sections/world/days.json +1 -0
  358. package/corpus/handwritten/sections/world/edge.json +1 -0
  359. package/corpus/handwritten/sections/world/movers.json +1 -0
  360. package/corpus/handwritten/sections/world/navigation.json +1 -0
  361. package/corpus/handwritten/sections/world/props.json +1 -0
  362. package/corpus/handwritten/sections/world/spawn.json +1 -0
  363. package/corpus/handwritten/sections/world/terrain.json +1 -0
  364. package/corpus/handwritten/sections/world/tiles.json +1 -0
  365. package/corpus/handwritten/sections/world/traversal.json +1 -0
  366. package/corpus/handwritten/sections/world/water.json +1 -0
  367. package/corpus/handwritten/sections/world/weather.json +1 -0
  368. package/corpus/handwritten/shard.json +1 -0
  369. package/corpus/handwritten/validation.json +1 -0
  370. package/package.json +508 -2
  371. package/packages/wire/src/net-command.ts +150 -0
  372. package/src/cli/bin.mjs +9 -0
  373. package/src/cli/main.ts +148 -0
  374. package/src/cli/pack.ts +262 -0
  375. package/src/cli/validate.ts +210 -0
  376. package/src/cli/version.ts +13 -0
  377. package/src/format/aacIndex.ts +160 -0
  378. package/src/format/accent.ts +35 -0
  379. package/src/format/achievementCounters.ts +22 -0
  380. package/src/format/actorMoves.ts +615 -0
  381. package/src/format/actorProjectionV2.ts +93 -0
  382. package/src/format/admissionControl.ts +66 -0
  383. package/src/format/admissionLate.ts +22 -0
  384. package/src/format/admissionLimits.ts +11 -0
  385. package/src/format/admissionServer.ts +30 -0
  386. package/src/format/ambientLife.ts +123 -0
  387. package/src/format/arenaRoomDocument.ts +114 -0
  388. package/src/format/arenaScriptRows.ts +107 -0
  389. package/src/format/arenaView.ts +30 -0
  390. package/src/format/assetAdmission.ts +279 -0
  391. package/src/format/audio-measure.ts +184 -0
  392. package/src/format/audio-mp4.ts +234 -0
  393. package/src/format/audio-rules.ts +295 -0
  394. package/src/format/audio-waiver.ts +55 -0
  395. package/src/format/audio.ts +463 -0
  396. package/src/format/audioBank.ts +37 -0
  397. package/src/format/audioProfiles.ts +501 -0
  398. package/src/format/audioRouting.ts +67 -0
  399. package/src/format/audioScene.ts +342 -0
  400. package/src/format/bakedTerrainBytes.ts +35 -0
  401. package/src/format/bakedTerrainSampling.ts +66 -0
  402. package/src/format/bakedTiles.ts +407 -0
  403. package/src/format/binarySource.ts +32 -0
  404. package/src/format/bodySlots.ts +90 -0
  405. package/src/format/bossEncounter.ts +354 -0
  406. package/src/format/bossProfiles.ts +709 -0
  407. package/src/format/bossSocketRig.ts +92 -0
  408. package/src/format/bowVariantRows.ts +68 -0
  409. package/src/format/brains.ts +252 -0
  410. package/src/format/budget.ts +214 -0
  411. package/src/format/buildings.ts +496 -0
  412. package/src/format/builtIndexes.ts +26 -0
  413. package/src/format/catalogueEconomy.ts +65 -0
  414. package/src/format/caveInterior.ts +225 -0
  415. package/src/format/cellBounds.ts +47 -0
  416. package/src/format/cellField.ts +98 -0
  417. package/src/format/chapterDirector.ts +193 -0
  418. package/src/format/clientChannels.ts +450 -0
  419. package/src/format/clientCues.ts +34 -0
  420. package/src/format/clientNative.ts +358 -0
  421. package/src/format/clientOwnership.ts +43 -0
  422. package/src/format/clientPlan.ts +306 -0
  423. package/src/format/clientScripts.ts +116 -0
  424. package/src/format/clientState.ts +273 -0
  425. package/src/format/clientTrails.ts +56 -0
  426. package/src/format/collectionDisplay.ts +232 -0
  427. package/src/format/colourFunction.ts +44 -0
  428. package/src/format/colourLut.ts +4 -0
  429. package/src/format/commonsCosts.ts +28 -0
  430. package/src/format/compendiumRows.ts +151 -0
  431. package/src/format/compendiumSketches.ts +23 -0
  432. package/src/format/completion.ts +83 -0
  433. package/src/format/contentBounds.ts +76 -0
  434. package/src/format/contentCost.ts +50 -0
  435. package/src/format/contracts.ts +305 -0
  436. package/src/format/cook-data.ts +148 -0
  437. package/src/format/cook-preparation.ts +241 -0
  438. package/src/format/coverAppearance.ts +53 -0
  439. package/src/format/creatures.ts +175 -0
  440. package/src/format/crowdPresentation.ts +87 -0
  441. package/src/format/crowds.ts +46 -0
  442. package/src/format/cueDirector.ts +134 -0
  443. package/src/format/dayCycle.ts +28 -0
  444. package/src/format/dayLook.ts +44 -0
  445. package/src/format/decisionBindings.ts +80 -0
  446. package/src/format/decisionPublication.ts +35 -0
  447. package/src/format/decisionScripts.ts +327 -0
  448. package/src/format/declaredQuestPage.ts +101 -0
  449. package/src/format/deviceMemoryCost.ts +50 -0
  450. package/src/format/director.ts +52 -0
  451. package/src/format/directorProduct.ts +27 -0
  452. package/src/format/directorStages.ts +165 -0
  453. package/src/format/directorWhen.ts +78 -0
  454. package/src/format/discoveryValues.ts +416 -0
  455. package/src/format/easedFields.ts +48 -0
  456. package/src/format/edgeProfiles.ts +40 -0
  457. package/src/format/eliteContinuation.ts +110 -0
  458. package/src/format/eliteEntryRows.ts +351 -0
  459. package/src/format/eliteFeature.ts +605 -0
  460. package/src/format/eliteScripts.ts +60 -0
  461. package/src/format/encounterRows.ts +1030 -0
  462. package/src/format/encounters.ts +65 -0
  463. package/src/format/engine-music.ts +42 -0
  464. package/src/format/entryClearance.ts +86 -0
  465. package/src/format/entryCoverage.ts +61 -0
  466. package/src/format/entryGeometry.ts +56 -0
  467. package/src/format/entryLanding.ts +83 -0
  468. package/src/format/entryReads.ts +45 -0
  469. package/src/format/entrywayAssets.ts +33 -0
  470. package/src/format/entryways.ts +58 -0
  471. package/src/format/exchange.ts +25 -0
  472. package/src/format/explorerCatalogue.ts +312 -0
  473. package/src/format/feature-sides.ts +233 -0
  474. package/src/format/fieldPresentation.ts +62 -0
  475. package/src/format/figures.ts +437 -0
  476. package/src/format/findsCatalogue.ts +67 -0
  477. package/src/format/fixedDraws.ts +24 -0
  478. package/src/format/flyers.ts +226 -0
  479. package/src/format/forestNativeInputs.ts +37 -0
  480. package/src/format/forestPage.ts +285 -0
  481. package/src/format/forestWeather.ts +333 -0
  482. package/src/format/geometryPack.ts +136 -0
  483. package/src/format/glbBuffers.ts +77 -0
  484. package/src/format/glbCost.ts +212 -0
  485. package/src/format/glbImages.ts +95 -0
  486. package/src/format/glbTriangles.ts +95 -0
  487. package/src/format/graphArmsRows.ts +200 -0
  488. package/src/format/grapple.ts +123 -0
  489. package/src/format/grazers.ts +164 -0
  490. package/src/format/grid-catalogue.ts +247 -0
  491. package/src/format/gridReadiness.ts +49 -0
  492. package/src/format/groupBrains.ts +249 -0
  493. package/src/format/heldArms.ts +576 -0
  494. package/src/format/heldEquipment.ts +78 -0
  495. package/src/format/heldFinishes.ts +415 -0
  496. package/src/format/heldGear.ts +68 -0
  497. package/src/format/heldJianDocument.ts +75 -0
  498. package/src/format/heldMelee.ts +866 -0
  499. package/src/format/heldView.ts +26 -0
  500. package/src/format/heldWeaponDocuments.ts +36 -0
  501. package/src/format/herdShelter.ts +58 -0
  502. package/src/format/hooks.ts +45 -0
  503. package/src/format/immutable.ts +59 -0
  504. package/src/format/inputDeclarations.ts +157 -0
  505. package/src/format/islandLibrary.ts +51 -0
  506. package/src/format/issue-codes.ts +262 -0
  507. package/src/format/items.ts +229 -0
  508. package/src/format/json.ts +143 -0
  509. package/src/format/keyedSky.ts +314 -0
  510. package/src/format/kitFigure.ts +68 -0
  511. package/src/format/ktx2Cost.ts +47 -0
  512. package/src/format/ledger.ts +56 -0
  513. package/src/format/liftApproach.ts +75 -0
  514. package/src/format/liftRider.ts +10 -0
  515. package/src/format/lightEmitters.ts +105 -0
  516. package/src/format/lights.ts +135 -0
  517. package/src/format/limbCollision.ts +136 -0
  518. package/src/format/limbPopulation.ts +33 -0
  519. package/src/format/limbRig.ts +202 -0
  520. package/src/format/loadout.ts +156 -0
  521. package/src/format/look-light.ts +153 -0
  522. package/src/format/lootBag.ts +145 -0
  523. package/src/format/lootEconomy.ts +235 -0
  524. package/src/format/materialFamilies.ts +565 -0
  525. package/src/format/materialGraph.ts +1220 -0
  526. package/src/format/materials.ts +449 -0
  527. package/src/format/memoryAdmission.ts +84 -0
  528. package/src/format/memoryGates.json +7 -0
  529. package/src/format/meshCollision.ts +56 -0
  530. package/src/format/meshCollisionAssets.ts +19 -0
  531. package/src/format/meshCollisionBytes.ts +102 -0
  532. package/src/format/meshEntryways.ts +54 -0
  533. package/src/format/meshopt-decoder.wasm +0 -0
  534. package/src/format/meshopt-module.ts +177 -0
  535. package/src/format/meshopt-static.mjs +11 -0
  536. package/src/format/meshopt-wasm.ts +61 -0
  537. package/src/format/migrations.ts +209 -0
  538. package/src/format/minimap.ts +1052 -0
  539. package/src/format/mixedPopulation.ts +222 -0
  540. package/src/format/modes.ts +304 -0
  541. package/src/format/mountedSpecimenRows.ts +64 -0
  542. package/src/format/moverLifecycle.ts +34 -0
  543. package/src/format/moverMotion.ts +271 -0
  544. package/src/format/movers.ts +224 -0
  545. package/src/format/namedJsonContracts.ts +423 -0
  546. package/src/format/nativeActors.ts +45 -0
  547. package/src/format/nativeAssembly.ts +141 -0
  548. package/src/format/nativeGround.ts +37 -0
  549. package/src/format/nativeGroundAssets.ts +35 -0
  550. package/src/format/nativeItems.ts +184 -0
  551. package/src/format/nativePhysics.ts +140 -0
  552. package/src/format/nativeQuestComposition.ts +398 -0
  553. package/src/format/nativeRiding.ts +103 -0
  554. package/src/format/nativeRuntimePlan.ts +89 -0
  555. package/src/format/navigation.ts +99 -0
  556. package/src/format/navigationBytes.ts +111 -0
  557. package/src/format/nearPlaceholder.ts +111 -0
  558. package/src/format/nearPlaceholderAssets.ts +23 -0
  559. package/src/format/netCommand.ts +11 -0
  560. package/src/format/npcs.ts +546 -0
  561. package/src/format/outputAddress.ts +11 -0
  562. package/src/format/outputDownload.ts +34 -0
  563. package/src/format/outputFields.ts +123 -0
  564. package/src/format/outputIndex.ts +352 -0
  565. package/src/format/overdraw.ts +41 -0
  566. package/src/format/pageLife.ts +303 -0
  567. package/src/format/pagePreparation.ts +60 -0
  568. package/src/format/paintedLook.ts +55 -0
  569. package/src/format/paintedResources.ts +158 -0
  570. package/src/format/panelTemplate.ts +139 -0
  571. package/src/format/placeholderSource.ts +209 -0
  572. package/src/format/platformDataSections.ts +146 -0
  573. package/src/format/platformFileFamilies.ts +299 -0
  574. package/src/format/plumbing.ts +165 -0
  575. package/src/format/populationEnvironment.ts +210 -0
  576. package/src/format/populationKeeper.ts +163 -0
  577. package/src/format/populationProjection.ts +496 -0
  578. package/src/format/populationRespawn.ts +48 -0
  579. package/src/format/populationRoster.ts +158 -0
  580. package/src/format/portalFloor.ts +56 -0
  581. package/src/format/portalLink.ts +112 -0
  582. package/src/format/portalLinkAssets.ts +42 -0
  583. package/src/format/portalRide.ts +22 -0
  584. package/src/format/postGraphDocument.ts +36 -0
  585. package/src/format/postGraphLook.ts +477 -0
  586. package/src/format/postStack.ts +114 -0
  587. package/src/format/practiceCourseRows.ts +466 -0
  588. package/src/format/preflight.ts +155 -0
  589. package/src/format/presentation.ts +33 -0
  590. package/src/format/product-audio.ts +76 -0
  591. package/src/format/product-reads.ts +178 -0
  592. package/src/format/product-stream-admit.ts +114 -0
  593. package/src/format/product-stream-assets.ts +511 -0
  594. package/src/format/product-stream-facts.ts +208 -0
  595. package/src/format/product-stream-miss.ts +15 -0
  596. package/src/format/product-stream-node.ts +47 -0
  597. package/src/format/product-stream-packs.ts +247 -0
  598. package/src/format/product-stream-rows.ts +234 -0
  599. package/src/format/product-stream-tar.ts +204 -0
  600. package/src/format/product-stream.ts +297 -0
  601. package/src/format/product.ts +366 -0
  602. package/src/format/productValidation.ts +236 -0
  603. package/src/format/propMaterials.ts +254 -0
  604. package/src/format/props.ts +137 -0
  605. package/src/format/questContinuation.ts +42 -0
  606. package/src/format/questFigures.ts +227 -0
  607. package/src/format/questGraph.ts +30 -0
  608. package/src/format/questHost.ts +314 -0
  609. package/src/format/questInteractionSource.ts +57 -0
  610. package/src/format/questInteractions.ts +642 -0
  611. package/src/format/questPageComposition.ts +92 -0
  612. package/src/format/questPageFacets.ts +121 -0
  613. package/src/format/questRuntime.ts +118 -0
  614. package/src/format/questSteps.ts +182 -0
  615. package/src/format/questStory.ts +512 -0
  616. package/src/format/questStoryBindings.ts +43 -0
  617. package/src/format/questWorld.ts +36 -0
  618. package/src/format/quests.ts +333 -0
  619. package/src/format/rainPresentation.ts +131 -0
  620. package/src/format/rangedPage.ts +117 -0
  621. package/src/format/receipt-cost.ts +71 -0
  622. package/src/format/registeredJson.ts +530 -0
  623. package/src/format/returnProgramDocument.ts +40 -0
  624. package/src/format/returnProjectionV2.ts +84 -0
  625. package/src/format/riding.ts +377 -0
  626. package/src/format/riggedHulls.ts +160 -0
  627. package/src/format/roamingBossProjection.ts +178 -0
  628. package/src/format/roamingCombat.ts +22 -0
  629. package/src/format/ropeDeckSite.ts +148 -0
  630. package/src/format/rows.ts +86 -0
  631. package/src/format/runtime.ts +38 -0
  632. package/src/format/runtimeBinds.ts +49 -0
  633. package/src/format/runtimeCost.ts +80 -0
  634. package/src/format/runtimeSpawns.ts +73 -0
  635. package/src/format/scalarChannel.ts +38 -0
  636. package/src/format/scaledPost.ts +27 -0
  637. package/src/format/scaledPostContract.ts +51 -0
  638. package/src/format/sceneBuffers.ts +122 -0
  639. package/src/format/sceneDraws.ts +89 -0
  640. package/src/format/sceneDressing.ts +247 -0
  641. package/src/format/sceneInstances.ts +192 -0
  642. package/src/format/sceneMotion.ts +122 -0
  643. package/src/format/sceneRefs.ts +71 -0
  644. package/src/format/sceneSources.ts +730 -0
  645. package/src/format/script-side-grandfather.ts +62 -0
  646. package/src/format/script-sides.ts +289 -0
  647. package/src/format/scriptAbi.ts +14 -0
  648. package/src/format/scriptAbiV1.ts +56 -0
  649. package/src/format/scriptActionsV2.ts +101 -0
  650. package/src/format/scriptAdmission.ts +165 -0
  651. package/src/format/scriptAdmissionV2.ts +126 -0
  652. package/src/format/scriptContract.ts +170 -0
  653. package/src/format/scriptFuelV2.ts +124 -0
  654. package/src/format/scriptGroupBankV2.ts +54 -0
  655. package/src/format/scriptGroupStepV2.ts +165 -0
  656. package/src/format/scriptInputStateV2.ts +52 -0
  657. package/src/format/scriptLimits.ts +5 -0
  658. package/src/format/scriptMemoryV2.ts +17 -0
  659. package/src/format/scriptModuleV2.ts +116 -0
  660. package/src/format/scriptObservationColumnsV2.ts +226 -0
  661. package/src/format/scriptQueriesV2.ts +164 -0
  662. package/src/format/scriptQueryStateV2.ts +40 -0
  663. package/src/format/scriptRngV2.ts +52 -0
  664. package/src/format/scriptWireV2.ts +106 -0
  665. package/src/format/scripts.ts +31 -0
  666. package/src/format/sections.ts +140 -0
  667. package/src/format/shardSchema.ts +632 -0
  668. package/src/format/shardSections.ts +383 -0
  669. package/src/format/sketch.ts +79 -0
  670. package/src/format/skin-materials.ts +172 -0
  671. package/src/format/skinAssets.ts +107 -0
  672. package/src/format/skinData.ts +110 -0
  673. package/src/format/skinLayers.ts +90 -0
  674. package/src/format/skins.ts +37 -0
  675. package/src/format/socketLift.ts +58 -0
  676. package/src/format/socketLiftAssets.ts +81 -0
  677. package/src/format/socketRigCreature.ts +66 -0
  678. package/src/format/sourceResidency.ts +16 -0
  679. package/src/format/spawnCombat.ts +26 -0
  680. package/src/format/spawnScriptV2.ts +145 -0
  681. package/src/format/spawnScripts.ts +229 -0
  682. package/src/format/spawnTables.ts +46 -0
  683. package/src/format/spawnView.ts +26 -0
  684. package/src/format/speciesActorsFile.ts +86 -0
  685. package/src/format/speciesBookRows.ts +84 -0
  686. package/src/format/speciesBrain.ts +96 -0
  687. package/src/format/speciesLooks.ts +1021 -0
  688. package/src/format/speciesPrograms.ts +97 -0
  689. package/src/format/speciesScripts.ts +45 -0
  690. package/src/format/specimenCatalogue.ts +94 -0
  691. package/src/format/splatTerrain.ts +192 -0
  692. package/src/format/standalone-catalogue.ts +144 -0
  693. package/src/format/standaloneControl.ts +44 -0
  694. package/src/format/state.ts +61 -0
  695. package/src/format/stateLineage.ts +71 -0
  696. package/src/format/stealth.ts +106 -0
  697. package/src/format/stillImage.ts +135 -0
  698. package/src/format/streamedCover.ts +105 -0
  699. package/src/format/surfaceLooks.ts +50 -0
  700. package/src/format/tar-fields.ts +54 -0
  701. package/src/format/tar-paths.ts +104 -0
  702. package/src/format/tar-source.ts +13 -0
  703. package/src/format/tar-write.ts +152 -0
  704. package/src/format/tar.ts +204 -0
  705. package/src/format/targets.ts +217 -0
  706. package/src/format/terrain.ts +241 -0
  707. package/src/format/terrainTileBytes.ts +104 -0
  708. package/src/format/tierSelection.ts +195 -0
  709. package/src/format/toonLighting.ts +32 -0
  710. package/src/format/toonLook.ts +332 -0
  711. package/src/format/trail.ts +17 -0
  712. package/src/format/traversal.ts +13 -0
  713. package/src/format/treeSetRows.ts +93 -0
  714. package/src/format/ui.ts +90 -0
  715. package/src/format/uiStrings.ts +17 -0
  716. package/src/format/uniformRows.ts +31 -0
  717. package/src/format/upload-wire.ts +184 -0
  718. package/src/format/validationReceipt.ts +142 -0
  719. package/src/format/version.ts +9 -0
  720. package/src/format/vertexWear.ts +45 -0
  721. package/src/format/viewProgram.ts +329 -0
  722. package/src/format/voicePatches.ts +47 -0
  723. package/src/format/water.ts +247 -0
  724. package/src/format/waterWaves.ts +7 -0
  725. package/src/format/waterWorld.ts +34 -0
  726. package/src/format/weaponProfiles.ts +1315 -0
  727. package/src/format/weatherBundle.ts +36 -0
  728. package/src/format/weatherEffects.ts +78 -0
  729. package/src/format/weatherProgram.ts +422 -0
  730. package/src/format/wildlifePopulation.ts +210 -0
  731. package/src/format/wireLimits.ts +9 -0
  732. package/src/format/worldAssembly.ts +104 -0
  733. package/src/format/worldEntry.ts +151 -0
  734. package/src/format/worldPhysics.ts +292 -0
  735. package/src/format/worldSceneBatch.ts +106 -0
  736. package/src/format/worldSceneModels.ts +79 -0
  737. package/src/format/worldScenePages.ts +89 -0
  738. package/src/format/worldScenePlacement.ts +191 -0
  739. package/src/format/worldSceneSlabs.ts +43 -0
  740. package/src/format/worldSceneSurface.ts +113 -0
  741. package/src/format/worldSceneWeld.ts +702 -0
  742. package/src/format/worldScenes.ts +184 -0
  743. package/src/format/worldTargets.ts +111 -0
  744. package/src/format/worldUpdates.ts +229 -0
  745. package/src/hook/format-hook.d.mts +2 -0
  746. package/src/hook/format-hook.mjs +47 -0
  747. package/src/tools/runtime-hosts.json +497 -0
  748. package/README.md +0 -8
@@ -0,0 +1,449 @@
1
+ import { hasDeclaredClientPage } from './runtimeBinds.ts';
2
+ import * as v from 'valibot';
3
+ import {
4
+ FAMILY_IDS, FamilyMaterialSchema, GRAPH_PRESET_VERSION, paintedTerrainTextureRefs, parseEmissiveLook, parsePainterlyLook, parseToonLook, presetRefusal,
5
+ ToonLookSchema, PainterlyLookSchema, EmissiveLookSchema, type EmissiveLookParams, type FamilyMaterialParams, type PainterlyLookParams, type ToonLookParams,
6
+ } from './materialFamilies.ts';
7
+
8
+ import { GRAPH_ADMISSION_LIMITS, validateGraph, type GraphIr } from './materialGraph.ts';
9
+ import { isJsonData } from './json.ts';
10
+ import type { Shardfile } from './shardSchema.ts';
11
+
12
+ const graph = v.pipe(v.unknown(), v.rawTransform(({ dataset, addIssue, NEVER }): GraphIr => {
13
+ if (!isJsonData(dataset.value)) { addIssue({ message: 'material graph is plain JSON data' }); return NEVER; }
14
+ const checked = validateGraph(dataset.value, { trustedBudget: true });
15
+ if (!checked.ok) { addIssue({ message: checked.errors.join('; ') }); return NEVER; }
16
+ // a catalogue slot holds a material or the shard's declared fog (O11: a material selects it by id), never a post pass
17
+ if (checked.graph.kind === 'post') { addIssue({ message: 'material slot requires a material or fog graph, not a post pass' }); return NEVER; }
18
+ return checked.graph;
19
+ }));
20
+ const graphMaterial = v.strictObject({ family: v.literal('graph'), graph });
21
+ /** a graph file: a JSON file of the product's library closure holding one material graph (validated with its bytes) */
22
+ const graphFile = v.strictObject({ family: v.literal('graph'), file: v.pipe(v.string(), v.regex(/^[a-f0-9]{64}$/u)) });
23
+ /** an engine-owned built-in preset: a family entry the engine re-expresses as graph IR (`familyPresetGraph`) */
24
+ const graphPreset = v.strictObject({ family: v.literal('graph'), preset: FamilyMaterialSchema, version: v.literal(GRAPH_PRESET_VERSION) });
25
+
26
+ /** a graph file's byte cap: the inline slot's raw JSON bound (`GRAPH_ADMISSION_LIMITS.bytes`) */
27
+ const GRAPH_FILE_BYTES = GRAPH_ADMISSION_LIMITS.bytes;
28
+ const id = v.pipe(v.string(), v.regex(/^[a-z][a-z0-9.-]*$/u), v.maxLength(128));
29
+ /** Authored material IDs select bounded platform presets or validated material graph data, never shader source. */
30
+ export const MaterialsSchema: v.GenericSchema<MaterialsRowsInput, MaterialsRows> = v.pipe(v.record(id, v.union([FamilyMaterialSchema, graphMaterial, graphFile, graphPreset])), v.check((rows) => Object.keys(rows).length <= 256, 'bounded material catalogue'));
31
+ /** An admitted catalogue entry. */
32
+ export type MaterialEntry = v.InferOutput<typeof MaterialsSchema>[string];
33
+
34
+ /** The family looks a preset reads: the shard's own, defaults filled. */
35
+ export function presetLooks(familyLooks: Shardfile['look']['familyLooks']): { toon: ToonLookParams; painterly: PainterlyLookParams; emissive: EmissiveLookParams } {
36
+ return { toon: parseToonLook(familyLooks.toon ?? {}), painterly: parsePainterlyLook(familyLooks.painterly ?? {}), emissive: parseEmissiveLook(familyLooks.emissive ?? {}) };
37
+ }
38
+ /**
39
+ * A graph file's JSON (SF59): `file` returns an admitted file's bytes (undefined: not present). Throws when the file is
40
+ * missing, past the inline slot's byte bound, or not UTF-8 JSON; the graph itself is validated by the caller under the
41
+ * author caps (a graph file is authored content, never a trusted preset).
42
+ */
43
+ export function graphFileJson(hash: string, file: (hash: string) => Uint8Array | undefined): unknown {
44
+ const bytes = file(hash);
45
+ if (bytes === undefined) throw new Error(`material graph file ${hash} is not an admitted file`);
46
+ if (bytes.length > GRAPH_FILE_BYTES) throw new Error(`material graph file ${hash}: ${bytes.length} bytes (at most ${GRAPH_FILE_BYTES})`);
47
+ try { return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes)); } catch { throw new Error(`material graph file ${hash} is not UTF-8 JSON`); }
48
+ }
49
+ /**
50
+ * A graph material's IR (D74: graph files): a graph file's JSON, its bytes from `file`, validated under the trusted budget
51
+ * (product admission already held it to its caps and bindings, `graphFileRules`), or an inline entry's IR. Throws for a
52
+ * preset reference or a missing or invalid file.
53
+ */
54
+ export function materialGraphIr(entry: MaterialEntry, file: (hash: string) => Uint8Array | undefined): GraphIr {
55
+ if (entry.family !== 'graph' || !('file' in entry)) throw new Error('material graph IR needs a graph file (a built product carries no inline graph)');
56
+ const checked = validateGraph(graphFileJson(entry.file, file), { trustedBudget: true });
57
+ if (!checked.ok) throw new Error(`material graph file ${entry.file}: ${checked.errors.join('; ')}`);
58
+ return checked.graph;
59
+ }
60
+ /** D74: why a built product's catalogue may not hold an inline graph (the SDK lowers an authored one into its file) */
61
+ export const INLINE_GRAPH_REFUSAL = 'material catalogue holds no inline graph: the SDK lowers an authored graph into a graph file { family: "graph", file }';
62
+ /** The wire boundary (product admission): every graph of a built product's catalogue is a graph file or a preset. An
63
+ * authored declaration may still hold inline graphs; the SDK lowers them before admission. */
64
+ export function inlineGraphRules(materials: Readonly<v.InferOutput<typeof MaterialsSchema>>): string[] {
65
+ return Object.entries(materials).flatMap(([materialId, material]) => material.family === 'graph' && 'graph' in material ? [`material ${materialId}: ${INLINE_GRAPH_REFUSAL}`] : []);
66
+ }
67
+ /** The texture params of the catalogue's graph files (their bytes from `bytes`; a missing or unreadable file names none). */
68
+ export function graphFileTextureRefs(materials: Readonly<v.InferOutput<typeof MaterialsSchema>>, bytes: (hash: string) => Uint8Array | undefined): string[] {
69
+ const refs: string[] = [];
70
+ for (const material of Object.values(materials)) {
71
+ if (material.family !== 'graph' || !('file' in material)) continue;
72
+ const data = bytes(material.file);
73
+ if (data === undefined) continue;
74
+ // admission validated the file (graphFileRules); here only its texture params are read
75
+ const json = graphFileJson(material.file, () => data);
76
+ const params: unknown = typeof json === 'object' && json !== null ? Reflect.get(json, 'params') : undefined;
77
+ if (typeof params !== 'object' || params === null) continue;
78
+ for (const param of Object.values(params)) {
79
+ // a lent texture names no file: its runtime lends it (materialGraph `role: 'lent'`)
80
+ if (typeof param === 'object' && param !== null && Reflect.get(param, 'type') === 'texture' && Reflect.get(param, 'role') !== 'lent') { const value: unknown = Reflect.get(param, 'value'); if (typeof value === 'string') refs.push(value); }
81
+ }
82
+ }
83
+ return refs;
84
+ }
85
+ /** Optional per-shard family looks use the renderer-neutral engine schemas. */
86
+ export const FamilyLooksSchema: v.GenericSchema<FamilyLooksRowsInput, FamilyLooksRows> = v.strictObject({ toon: v.exactOptional(ToonLookSchema), painterly: v.exactOptional(PainterlyLookSchema), emissive: v.exactOptional(EmissiveLookSchema) });
87
+ /**
88
+ * A look texture's sampler, one row per texture ref of the material catalogue (absent row: the loader's sampler, as before).
89
+ * `wrap` its S and T addressing (absent: clamp); `anisotropy` its anisotropic samples, 1 (off) to 16, capped by the device
90
+ * (absent: 1); `filter` linear or nearest (absent: the file's own, a transcoded file's linear and a raw file's nearest;
91
+ * with GPU mips, linear); `mips` `'gpu'` uploads only level 0 of a raw (uncompressed) KTX2 and lets the GPU build the
92
+ * chain, as a data texture's driver mips (a baked chain is not bit-equal to them), `'file'` (absent) samples the file's
93
+ * own levels.
94
+ */
95
+ export const TextureSamplersSchema: v.GenericSchema<TextureSamplersInput, TextureSamplers> = v.pipe(v.record(v.pipe(v.string(), v.regex(/^(?:commons:)?[a-f0-9]{64}$/u)), v.strictObject({
96
+ wrap: v.exactOptional(v.picklist(['repeat', 'clamp', 'mirror'])), anisotropy: v.exactOptional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(16))),
97
+ filter: v.exactOptional(v.picklist(['linear', 'nearest'])), mips: v.exactOptional(v.picklist(['file', 'gpu'])),
98
+ })), v.check((rows) => Object.keys(rows).length <= 256, 'bounded texture samplers'));
99
+ /** Each sampler row names a texture of the look's material catalogue (a graph file's are its row's dependencies). */
100
+ export function textureSamplerRules(look: Pick<Shardfile['look'], 'materials' | 'samplers'>, files: readonly { readonly hash: string; readonly dependencies: readonly string[] }[] = []): string[] {
101
+ const rows = new Map(files.map((file) => [file.hash, file])), refs = new Set(materialTextureRefs(look.materials));
102
+ for (const material of Object.values(look.materials)) if (material.family === 'graph' && 'file' in material) for (const ref of rows.get(material.file)?.dependencies ?? []) refs.add(ref);
103
+ return Object.keys(look.samplers ?? {}).flatMap((ref) => (refs.has(ref) ? [] : [`samplers ${ref}: not a texture of the look's material catalogue`]));
104
+ }
105
+ /** Resolve authored surface IDs or the four platform default material IDs. */
106
+ export function materialExists(materials: Readonly<Record<string, unknown>>, idValue: string): boolean {
107
+ return Object.hasOwn(materials, idValue) || FAMILY_IDS.some((family) => family === idValue);
108
+ }
109
+ /** All texture inputs, including ground layers and emitter fields, enter the admitted library closure. */
110
+ export function materialTextureRefs(materials: Readonly<v.InferOutput<typeof MaterialsSchema>>): string[] {
111
+ return Object.values(materials).flatMap((material) => {
112
+ if (material.family === 'graph') {
113
+ // a preset's textures are its family entry's; a graph file's are its file row's dependencies (validated with its bytes)
114
+ if ('preset' in material) return familyTextureRefs(material.preset);
115
+ if ('file' in material) return [];
116
+ return Object.values(material.graph.params ?? {}).flatMap((param) => param.type === 'texture' && param.role !== 'lent' && typeof param.value === 'string' ? [param.value] : []);
117
+ }
118
+ return familyTextureRefs(material);
119
+ });
120
+ }
121
+ function familyTextureRefs(material: FamilyMaterialParams): string[] {
122
+ if (material.family === 'toon') return [];
123
+ if (material.family === 'pbr') return [...Object.values(material.maps), material.ground?.grain.map, material.ground?.trail?.map, material.ground?.keyShadow?.map].filter((ref): ref is string => typeof ref === 'string');
124
+ if (material.family === 'painterly') return (material.map === null ? [] : [material.map]).concat(material.terrain === undefined ? [] : paintedTerrainTextureRefs(material.terrain));
125
+ return [material.map, material.tube?.field, ...(material.sky?.maps ?? [])].filter((ref): ref is string => typeof ref === 'string');
126
+ }
127
+
128
+ /** A graph binding's admitted sources: the day-key channels the look's keys carry (with their value type) and the readable numeric state fields. */
129
+ export interface GraphBindingSources { readonly day: ReadonlyMap<string, 'float' | 'vec3'>; readonly state: readonly string[] }
130
+ /**
131
+ * The admitted binding names of a shardfile (SF59): the canonical dotted day-key channels its look keys carry and its
132
+ * declared public i32 / f64 state fields as `shared.<field>` / `player.<field>`, plus, as for material curves
133
+ * (`curveStateFields`), its host-owned numeric fields when a trusted runtime binds `state` (the runtime hands the client
134
+ * their live values). Admission and the client's compile both use these lists, never a compiler default that allows any name.
135
+ */
136
+ export function graphBindingSources(source: Pick<Shardfile, 'look' | 'state'> & Partial<Pick<Shardfile, 'runtime' | 'questHost'>>): GraphBindingSources {
137
+ const day = new Map<string, 'float' | 'vec3'>();
138
+ if (source.look.keys.length > 0) {
139
+ for (const path of ['sky.zenith', 'sky.horizon', 'fog.colour', 'sun.colour', 'ambient.sky', 'ambient.ground']) day.set(path, 'vec3');
140
+ for (const path of ['fog.density', 'sun.intensity', 'ambient.intensity']) day.set(path, 'float');
141
+ if (source.look.keys.every((key) => key.fog.near !== undefined && key.fog.far !== undefined)) {
142
+ day.set('fog.near', 'float'); day.set('fog.far', 'float');
143
+ }
144
+ }
145
+ return { day, state: [...curveStateFields({ state: source.state, runtime: source.runtime ?? null, ...(source.questHost === undefined ? {} : { questHost: source.questHost }) })] };
146
+ }
147
+ /** The `<scope>.<name>` keys of the numeric state fields of one privacy. */
148
+ function numericFields(state: Shardfile['state'], privacy: 'public' | 'host'): string[] {
149
+ return (['shared', 'player'] as const).flatMap((scope) => state[scope].filter((field) => field.privacy === privacy && (field.type === 'i32' || field.type === 'f64')).map((field) => `${scope}.${field.name}`));
150
+ }
151
+
152
+ /**
153
+ * Check graph uniform bindings against admitted day channels and public numeric state declarations. A preset reference
154
+ * must be expressible as a built-in preset (`presetRefusal`, the rule the engine's preset door applies; the trusted preset
155
+ * programs are held to `PRESET_GRAPH_BUDGET` by the engine's own tests, never the author caps); a graph file must be a
156
+ * JSON file of the library closure (`files` / `library` given: its bytes are validated by product admission, `graphFileRules`).
157
+ */
158
+ export function materialGraphRules(source: Pick<Shardfile, 'look' | 'state'> & Partial<Pick<Shardfile, 'files' | 'library' | 'runtime' | 'questHost'>>): string[] {
159
+ const errors: string[] = [];
160
+ const { day: dayChannels, state: stateFields } = graphBindingSources(source);
161
+ const files = new Map((source.files ?? []).map((row) => [row.hash, row])), closure = new Set<string>(), pending = [...source.library ?? []];
162
+ while (pending.length > 0) { const hash = pending.pop(); if (hash === undefined || closure.has(hash)) continue; closure.add(hash); pending.push(...files.get(hash)?.dependencies ?? []); }
163
+ for (const [materialId, material] of Object.entries(source.look.materials)) {
164
+ if (material.family !== 'graph') continue;
165
+ if ('file' in material) {
166
+ if (source.files !== undefined && (files.get(material.file)?.kind !== 'json' || !closure.has(material.file))) errors.push(`material ${materialId}: a graph file is a JSON file of the library closure`);
167
+ continue;
168
+ }
169
+ if ('preset' in material) { const refusal = presetRefusal(material.preset); if (refusal !== null) errors.push(`material ${materialId}: ${refusal}`); continue; }
170
+ const checked = validateGraph(material.graph, { dayKeys: [...dayChannels.keys()], stateFields, trustedBudget: source.runtime !== null && source.runtime !== undefined || hasDeclaredClientPage(source) });
171
+ if (!checked.ok) { errors.push(...checked.errors.map((error) => `material ${materialId}: ${error}`)); continue; }
172
+ errors.push(...bindingTypeErrors(materialId, checked.graph, dayChannels));
173
+ const fog = checked.graph.effectState?.fog;
174
+ if (typeof fog === 'string') {
175
+ const target = source.look.materials[fog];
176
+ // a graph file target is held to its fog kind with its bytes (graphFileRules)
177
+ if (target?.family !== 'graph' || 'preset' in target || ('graph' in target && target.graph.kind !== 'fog')) errors.push(`material ${materialId}: effectState.fog ${fog} names no fog graph of this catalogue`);
178
+ }
179
+ }
180
+ return errors;
181
+ }
182
+ /**
183
+ * Product admission of the graph files a catalogue names (SF59): each file's bytes (`bytes(hash)`) are UTF-8 JSON of
184
+ * one `kind: "material"` graph that validates under the author caps against the shard's admitted bindings, and every
185
+ * texture param names a KTX2 file its row declares as a direct dependency (so the texture is charged with the closure).
186
+ */
187
+ export function graphFileRules(source: Pick<Shardfile, 'look' | 'state' | 'files'> & Partial<Pick<Shardfile, 'runtime' | 'questHost'>>, bytes: (hash: string) => Uint8Array | undefined): string[] {
188
+ const errors: string[] = [];
189
+ const { day: dayChannels, state: stateFields } = graphBindingSources(source);
190
+ const files = new Map(source.files.map((row) => [row.hash, row]));
191
+ for (const [materialId, material] of Object.entries(source.look.materials)) {
192
+ if (material.family !== 'graph' || !('file' in material)) continue;
193
+ let ir: unknown;
194
+ try { ir = graphFileJson(material.file, bytes); } catch (error) { errors.push(`material ${materialId}: ${error instanceof Error ? error.message : 'graph file'}`); continue; }
195
+ const checked = validateGraph(ir, { dayKeys: [...dayChannels.keys()], stateFields, trustedBudget: source.runtime !== null && source.runtime !== undefined || hasDeclaredClientPage(source) });
196
+ if (!checked.ok) { errors.push(...checked.errors.map((error) => `material ${materialId}: ${error}`)); continue; }
197
+ if (checked.graph.kind === 'post') { errors.push(`material ${materialId}: a graph file in a material slot holds a material or fog graph, not a post pass`); continue; }
198
+ const fog = checked.graph.effectState?.fog, target = typeof fog === 'string' ? source.look.materials[fog] : undefined;
199
+ if (typeof fog === 'string' && (target?.family !== 'graph' || 'preset' in target || fogKind(target, bytes) !== 'fog')) errors.push(`material ${materialId}: effectState.fog ${fog} names no fog graph of this catalogue`);
200
+ const deps = new Set(files.get(material.file)?.dependencies);
201
+ for (const param of Object.values(checked.graph.params ?? {})) {
202
+ // a lent texture names no file: its runtime lends it (as an inline graph's)
203
+ if (param.type === 'texture' && param.role !== 'lent' && (typeof param.value !== 'string' || !deps.has(param.value) || files.get(param.value)?.kind !== 'ktx2')) errors.push(`material ${materialId}: a graph file's texture is a KTX2 dependency of its file row`);
204
+ }
205
+ errors.push(...bindingTypeErrors(materialId, checked.graph, dayChannels));
206
+ }
207
+ return errors;
208
+ }
209
+ /** a graph entry's kind, read from its file's bytes when it is a file (undefined: unreadable) */
210
+ function fogKind(entry: MaterialEntry, bytes: (hash: string) => Uint8Array | undefined): string | undefined {
211
+ try { return materialGraphIr(entry, bytes).kind; } catch { return undefined; }
212
+ }
213
+ function bindingTypeErrors(materialId: string, ir: GraphIr, dayChannels: ReadonlyMap<string, 'float' | 'vec3'>): string[] {
214
+ const errors: string[] = [];
215
+ for (const param of Object.values(ir.params ?? {})) {
216
+ if (param.bind === undefined) continue;
217
+ if ('state' in param.bind && param.type !== 'float') errors.push(`material ${materialId}: state binding requires a float param`);
218
+ if ('day' in param.bind) {
219
+ const type = dayChannels.get(param.bind.day);
220
+ if (type !== undefined && (type === 'float' ? param.type !== 'float' : param.type !== 'vec3' && param.type !== 'colour')) errors.push(`material ${materialId}: day binding type must match its channel`);
221
+ }
222
+ }
223
+ return errors;
224
+ }
225
+
226
+ /**
227
+ * A curve of one 0 … 1 progress value d (a dusk, a storm, a season), as data: `scale × (base + Σ terms) × times`, or a
228
+ * two-point `mix`. A term is `gain ×` a power of d, a smoothstep between two edges, a smoothstep or a clamped linear ramp
229
+ * from a start over a width; a `fold` ramp multiplies its gain in from the left (gain·t·t·(3 − 2t)), the same curve rounded
230
+ * the way a hand-written one was.
231
+ */
232
+ export type CurveTerm =
233
+ | { readonly gain: number; readonly pow: number }
234
+ | { readonly gain: number; readonly edges: readonly [number, number] }
235
+ | { readonly gain: number; readonly ramp: readonly [number, number]; readonly fold?: boolean }
236
+ | { readonly gain: number; readonly linear: readonly [number, number] };
237
+ /** A curve of d (see `CurveTerm`; the evaluator takes any depth of `times`, the schema one). */
238
+ export interface Curve { readonly base?: number; readonly terms?: readonly CurveTerm[]; readonly times?: Curve; readonly scale?: number; readonly mix?: readonly [number, number] }
239
+ const finite = v.pipe(v.number(), v.finite());
240
+ const pair = v.tuple([finite, finite]);
241
+ const CurveTermSchema: v.GenericSchema<CurveTermRowsInput, CurveTermRows> = v.union([v.strictObject({ gain: finite, pow: finite }), v.strictObject({ gain: finite, edges: pair }),
242
+ v.strictObject({ gain: finite, ramp: pair, fold: v.exactOptional(v.boolean()) }), v.strictObject({ gain: finite, linear: pair })]);
243
+ const curveCore = { base: v.exactOptional(finite), terms: v.exactOptional(v.pipe(v.array(CurveTermSchema), v.maxLength(8))), scale: v.exactOptional(finite), mix: v.exactOptional(pair) };
244
+ /** A curve row (bounded: eight terms; `times` is a curve one level deep, no further `times`). */
245
+ export const CurveSchema: v.GenericSchema<CurveRowsInput, CurveRows> = v.strictObject({ ...curveCore, times: v.exactOptional(v.strictObject(curveCore)) });
246
+
247
+ const clamp01 = (t: number): number => Math.min(1, Math.max(0, t));
248
+ const smooth = (t: number): number => t * t * (3 - 2 * t);
249
+ function termAt(term: CurveTerm, d: number): number {
250
+ if ('pow' in term) return term.gain * d ** term.pow;
251
+ if ('edges' in term) return term.gain * smooth(clamp01((d - term.edges[0]) / (term.edges[1] - term.edges[0])));
252
+ if ('ramp' in term) { const t = clamp01((d - term.ramp[0]) / term.ramp[1]); return term.fold === true ? term.gain * t * t * (3 - 2 * t) : term.gain * smooth(t); }
253
+ return term.gain * clamp01((d - term.linear[0]) / term.linear[1]);
254
+ }
255
+ /** A curve's value at d. */
256
+ export function curveAt(curve: Curve, d: number): number {
257
+ let value = curve.mix === undefined ? (curve.terms ?? []).reduce((sum, term) => sum + termAt(term, d), curve.base ?? 0) : curve.mix[0] + (curve.mix[1] - curve.mix[0]) * d;
258
+ if (curve.times !== undefined) value *= curveAt(curve.times, d);
259
+ return curve.scale === undefined ? value : curve.scale * value;
260
+ }
261
+
262
+ /**
263
+ * State-bound material curves (`look.curves`): per catalogue family entry, numbers that move with a declared public numeric
264
+ * state field (`shared.<name>` / `player.<name>`), or a host-owned numeric shared field when a trusted runtime binds
265
+ * `state` (its runtime hands the client the live value), each the curve's value at the field's live value (clamped 0 … 1). A
266
+ * `param` is a dot path into the entry with its defaults filled (`ground.shade.tint.0`) that resolves to a number its
267
+ * family can move without a new program (`MOVABLE_FAMILY_PARAMS`). The client evaluates them in its material tick, only
268
+ * when a field moved, uniforms only.
269
+ */
270
+ export const MaterialCurvesSchema: v.GenericSchema<MaterialCurvesRowsInput, MaterialCurvesRows> = v.pipe(v.record(id, v.pipe(v.array(v.strictObject({
271
+ param: v.pipe(v.string(), v.regex(/^[a-zA-Z]\w*(?:\.\w+)*$/u), v.maxLength(96)), state: v.pipe(v.string(), v.regex(/^(?:shared|player)\.[A-Za-z_]\w*$/u)), curve: CurveSchema,
272
+ })), v.minLength(1), v.maxLength(32))), v.check((rows) => Object.keys(rows).length <= 32, 'bounded material curves'));
273
+ /** What each family moves without a new program: a path prefix (`ground.` the whole ground layer) or an exact name. */
274
+ export const MOVABLE_FAMILY_PARAMS: Readonly<Partial<Record<FamilyMaterialParams['family'], readonly string[]>>> = { pbr: ['roughness', 'metalness', 'ground.'] };
275
+
276
+ const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;
277
+ function pathValue(root: unknown, path: string): unknown {
278
+ let at: unknown = root;
279
+ for (const key of path.split('.')) at = isRecord(at) ? at[key] : undefined;
280
+ return at;
281
+ }
282
+ /** A copy of `params` with each curve's value at its field's value (`value(state)`, clamped 0 … 1) written at its path. */
283
+ export function curvedParams(params: FamilyMaterialParams, curves: readonly { readonly param: string; readonly state: string; readonly curve: Curve }[], value: (state: string) => number): FamilyMaterialParams {
284
+ const out = structuredClone(params);
285
+ for (const row of curves) {
286
+ const keys = row.param.split('.'), last = keys.pop();
287
+ const parent = keys.length === 0 ? out : pathValue(out, keys.join('.'));
288
+ if (last === undefined || !isRecord(parent) || typeof parent[last] !== 'number') throw new Error(`material curve: ${row.param} is not a number`);
289
+ parent[last] = curveAt(row.curve, clamp01(value(row.state)));
290
+ }
291
+ return out;
292
+ }
293
+ /**
294
+ * The fields a material curve may read: every public numeric field, and, when a trusted runtime binds `state`
295
+ * (`runtime.binds`), its host-owned numeric shared fields too (the runtime hands the client their live values).
296
+ */
297
+ function curveStateFields(source: Pick<Shardfile, 'state' | 'runtime'> & Partial<Pick<Shardfile, 'questHost'>>): ReadonlySet<string> {
298
+ return new Set([...numericFields(source.state, 'public'), ...(source.runtime?.binds?.includes('state') === true || hasDeclaredClientPage(source) ? numericFields(source.state, 'host') : [])]);
299
+ }
300
+ /** Check each curve's material, field and param: a family catalogue entry, a readable numeric field (`curveStateFields`), a movable number. */
301
+ export function materialCurveRules(source: Pick<Shardfile, 'look' | 'state' | 'runtime'> & Partial<Pick<Shardfile, 'questHost'>>): string[] {
302
+ const errors: string[] = [], fields = curveStateFields(source);
303
+ for (const [materialId, rows] of Object.entries(source.look.curves ?? {})) {
304
+ const entry = source.look.materials[materialId];
305
+ if (entry === undefined || entry.family === 'graph') { errors.push(`curves ${materialId}: not a family entry of the catalogue`); continue; }
306
+ const params = v.parse(FamilyMaterialSchema, entry), movable = MOVABLE_FAMILY_PARAMS[params.family] ?? [];
307
+ for (const row of rows) {
308
+ if (!fields.has(row.state)) errors.push(`curves ${materialId}: ${row.state} is not a declared public numeric state field (or a host one its runtime binds)`);
309
+ if (!movable.some((name) => name.endsWith('.') ? row.param.startsWith(name) : row.param === name)) errors.push(`curves ${materialId}: ${params.family} cannot move ${row.param} without a new program`);
310
+ else if (typeof pathValue(params, row.param) !== 'number') errors.push(`curves ${materialId}: ${row.param} is not a number of the entry`);
311
+ }
312
+ }
313
+ return errors;
314
+ }
315
+
316
+ /** Admitted data contracts, independent of validator implementation metadata. */
317
+ export type MaterialsRowsInput = Record<string, (v.InferInput<typeof FamilyMaterialSchema>) | ({
318
+ family: 'graph';
319
+ graph: unknown;
320
+ }) | ({
321
+ family: 'graph';
322
+ file: string;
323
+ }) | ({
324
+ family: 'graph';
325
+ preset: v.InferInput<typeof FamilyMaterialSchema>;
326
+ version: (typeof GRAPH_PRESET_VERSION);
327
+ })>;
328
+ export type MaterialsRows = Record<string, (v.InferOutput<typeof FamilyMaterialSchema>) | ({
329
+ family: 'graph';
330
+ graph: GraphIr;
331
+ }) | ({
332
+ family: 'graph';
333
+ file: string;
334
+ }) | ({
335
+ family: 'graph';
336
+ preset: v.InferOutput<typeof FamilyMaterialSchema>;
337
+ version: (typeof GRAPH_PRESET_VERSION);
338
+ })>;
339
+ interface FamilyLooksRowsInputFields {
340
+ toon?: v.InferInput<typeof ToonLookSchema>;
341
+ painterly?: v.InferInput<typeof PainterlyLookSchema>;
342
+ emissive?: v.InferInput<typeof EmissiveLookSchema>;
343
+ }
344
+ export type FamilyLooksRowsInput = { [Key in keyof FamilyLooksRowsInputFields]: FamilyLooksRowsInputFields[Key] };
345
+ interface FamilyLooksRowsFields {
346
+ toon?: v.InferOutput<typeof ToonLookSchema>;
347
+ painterly?: v.InferOutput<typeof PainterlyLookSchema>;
348
+ emissive?: v.InferOutput<typeof EmissiveLookSchema>;
349
+ }
350
+ export type FamilyLooksRows = { [Key in keyof FamilyLooksRowsFields]: FamilyLooksRowsFields[Key] };
351
+ export type TextureSamplersInput = TextureSamplers;
352
+ export type TextureSamplers = Record<string, {
353
+ wrap?: 'repeat' | 'clamp' | 'mirror';
354
+ anisotropy?: number;
355
+ filter?: 'linear' | 'nearest';
356
+ mips?: 'file' | 'gpu';
357
+ }>;
358
+ export type CurveTermRowsInput = CurveTermRows;
359
+ export type CurveTermRows = ({
360
+ gain: number;
361
+ pow: number;
362
+ }) | ({
363
+ gain: number;
364
+ edges: [
365
+ number,
366
+ number
367
+ ];
368
+ }) | ({
369
+ gain: number;
370
+ ramp: [
371
+ number,
372
+ number
373
+ ];
374
+ fold?: boolean;
375
+ }) | ({
376
+ gain: number;
377
+ linear: [
378
+ number,
379
+ number
380
+ ];
381
+ });
382
+ export type CurveRowsInput = Omit<{
383
+ base?: number;
384
+ terms?: (CurveTermRowsInput)[];
385
+ scale?: number;
386
+ mix?: [
387
+ number,
388
+ number
389
+ ];
390
+ }, keyof ({
391
+ times?: {
392
+ base?: number;
393
+ terms?: (CurveTermRowsInput)[];
394
+ scale?: number;
395
+ mix?: [
396
+ number,
397
+ number
398
+ ];
399
+ };
400
+ })> & {
401
+ times?: {
402
+ base?: number;
403
+ terms?: (CurveTermRowsInput)[];
404
+ scale?: number;
405
+ mix?: [
406
+ number,
407
+ number
408
+ ];
409
+ };
410
+ };
411
+ export type CurveRows = Omit<{
412
+ base?: number;
413
+ terms?: (CurveTermRows)[];
414
+ scale?: number;
415
+ mix?: [
416
+ number,
417
+ number
418
+ ];
419
+ }, keyof ({
420
+ times?: {
421
+ base?: number;
422
+ terms?: (CurveTermRows)[];
423
+ scale?: number;
424
+ mix?: [
425
+ number,
426
+ number
427
+ ];
428
+ };
429
+ })> & {
430
+ times?: {
431
+ base?: number;
432
+ terms?: (CurveTermRows)[];
433
+ scale?: number;
434
+ mix?: [
435
+ number,
436
+ number
437
+ ];
438
+ };
439
+ };
440
+ export type MaterialCurvesRowsInput = Record<string, ({
441
+ param: string;
442
+ state: string;
443
+ curve: CurveRowsInput;
444
+ })[]>;
445
+ export type MaterialCurvesRows = Record<string, ({
446
+ param: string;
447
+ state: string;
448
+ curve: CurveRows;
449
+ })[]>;
@@ -0,0 +1,84 @@
1
+ import { CONTENT_CAPS } from './contentBounds.ts';
2
+ import type { ContentCostInput } from './contentCost.ts';
3
+
4
+ /** A measured opaque runtime retains both rulers and the evidence used to derive its full claim. All bytes are decimal. */
5
+ export interface AdmissionMeasurement {
6
+ readonly webContentBytes: number; readonly glBytes: number; readonly engineBaseBytes: number;
7
+ /** Matched pre-entry resident set subtracted by the runtime claim; the dated engine base remains provenance. */
8
+ readonly residentBaseBytes?: number;
9
+ readonly rev: string; readonly device: string; readonly evidence: string;
10
+ }
11
+ /** Trusted callers report only the total-memory envelope here. Parser, hash, script and content-understatement guards are separate. */
12
+ export interface MemoryAdmissionRequest {
13
+ readonly stage: 'runtime' | 'declared' | 'actual' | 'resident';
14
+ readonly owner: string; readonly id: string;
15
+ readonly claimedBytes: number; readonly accountedBytes: number;
16
+ readonly playingBytes: number; readonly loadingBytes: number;
17
+ readonly playingCap?: number; readonly loadingCap?: number;
18
+ readonly categories?: Readonly<ContentCostInput>;
19
+ readonly measured?: AdmissionMeasurement;
20
+ }
21
+ /** G216's visible warning / G217 loading-screen read port: full claims and original caps, never a discounted allocation. */
22
+ export interface MemoryAdmissionWarning extends MemoryAdmissionRequest {
23
+ readonly playingCap: number; readonly loadingCap: number;
24
+ readonly playingOverBytes: number; readonly loadingOverBytes: number;
25
+ }
26
+
27
+ /**
28
+ * G216: Developer may exceed the total memory envelope while keeping truthful accounting. Public callers still refuse.
29
+ * The root supplies the live Settings Developer reader; pure Node and author validation default to strict. No DOM,
30
+ * timers, world allocation or service installation occurs here. Warnings are bounded and leave with their page owner.
31
+ */
32
+ export class MemoryAdmission {
33
+ private readonly warnings = new Map<string, MemoryAdmissionWarning>();
34
+ private readonly listeners = new Set<() => void>();
35
+ private readonly developer: () => boolean;
36
+ constructor(developer: () => boolean = () => false) { this.developer = developer; }
37
+
38
+ /** True for an in-envelope request or a Developer override. False means the caller retains its original refusal path. */
39
+ accept(request: MemoryAdmissionRequest): boolean {
40
+ const playingCap = request.playingCap ?? CONTENT_CAPS.playing, loadingCap = request.loadingCap ?? CONTENT_CAPS.loading;
41
+ if (request.owner.length === 0 || request.id.length === 0 || ![request.claimedBytes, request.accountedBytes, request.playingBytes, request.loadingBytes].every(value => Number.isSafeInteger(value) && value >= 0)
42
+ || ![playingCap, loadingCap].every(value => Number.isFinite(value) && value > 0)) throw new RangeError('Invalid memory admission report');
43
+ const key = `${request.stage}:${request.owner}`;
44
+ const playingOverBytes = Math.max(0, request.playingBytes - playingCap), loadingOverBytes = Math.max(0, request.loadingBytes - loadingCap);
45
+ if (playingOverBytes === 0 && loadingOverBytes === 0) { if (this.warnings.delete(key)) this.notify(); return true; }
46
+ if (!this.developer()) return false;
47
+ const warning = Object.freeze({ ...request, playingCap, loadingCap, playingOverBytes, loadingOverBytes,
48
+ ...(request.categories === undefined ? {} : { categories: Object.freeze({ ...request.categories }) }),
49
+ ...(request.measured === undefined ? {} : { measured: Object.freeze({ ...request.measured }) }),
50
+ });
51
+ this.warnings.delete(key); this.warnings.set(key, warning);
52
+ if (this.warnings.size > 64) {
53
+ const oldest = this.warnings.keys().next().value; if (oldest !== undefined) this.warnings.delete(oldest);
54
+ }
55
+ this.notify(); return true;
56
+ }
57
+ /** Frozen reports in arrival order. The newest resident report includes the full page's category totals. */
58
+ reports(): readonly MemoryAdmissionWarning[] { return Object.freeze([...this.warnings.values()]); }
59
+ /** Scope-owned warning surfaces subscribe, then read reports. Existing pre-bootstrap warnings paint immediately. */
60
+ subscribe(read: () => void): () => void { this.listeners.add(read); read(); return () => { this.listeners.delete(read); }; }
61
+ /** Remove warnings for released resident claims after the total falls back under the envelope. */
62
+ clearResidents(): void { let changed = false; for (const [key, row] of this.warnings) if (row.stage === 'resident') { this.warnings.delete(key); changed = true; } if (changed) this.notify(); }
63
+ /** Whether a resident warning needs the allocator's current totals; other report stages keep their own ruler. */
64
+ get hasResidentWarnings(): boolean {
65
+ for (const row of this.warnings.values()) if (row.stage === 'resident') return true;
66
+ return false;
67
+ }
68
+ /** Released claims stop warning; retained claims report their owner's current cost (G556: per shard, never the page). */
69
+ syncResidents(ids: Pick<ReadonlySet<string>, 'has'>, costOf: (owner: string) => { accounted: number; playing: number; loading: number; input: ContentCostInput }): void {
70
+ let changed = false;
71
+ for (const [key, row] of this.warnings) {
72
+ if (row.stage !== 'resident') continue;
73
+ const cost = costOf(row.owner), playingOverBytes = Math.max(0, cost.playing - row.playingCap), loadingOverBytes = Math.max(0, cost.loading - row.loadingCap);
74
+ if (!ids.has(row.id) || playingOverBytes + loadingOverBytes === 0) { this.warnings.delete(key); changed = true; continue; }
75
+ if (row.accountedBytes === cost.accounted) continue;
76
+ this.warnings.set(key, Object.freeze({ ...row, accountedBytes: cost.accounted, playingBytes: cost.playing,
77
+ loadingBytes: cost.loading, playingOverBytes, loadingOverBytes, categories: Object.freeze({ ...cost.input }) })); changed = true;
78
+ }
79
+ if (changed) this.notify();
80
+ }
81
+ /** Page disposal forgets every warning and listener; no later admission resurrects a UI subscription. */
82
+ dispose(): void { this.warnings.clear(); this.listeners.clear(); }
83
+ private notify(): void { for (const read of this.listeners) read(); }
84
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$doc": "The one memory switch (Jake, 2026-10-15, G433). explorerMB / loadingMB are the runtime caps (CONTENT_CAPS.playing / .loading: grid admission, page residency, the phone's images-first texture switch). mode 'report-only' makes every memory CHECK print its numbers and never fail (build product admission, the Simulator watchdog's phase budgets); 'enforce' restores refusal. Restore when SHARD-PLATFORM closes: set mode to \"enforce\" and explorerMB to 1000 in this one edit.",
3
+ "mode": "report-only",
4
+ "explorerMB": 1200,
5
+ "loadingMB": 1800,
6
+ "until": "SHARD-PLATFORM closes (G433): then mode enforce, explorerMB 1000"
7
+ }
@@ -0,0 +1,56 @@
1
+ import * as v from 'valibot';
2
+
3
+ const id = v.pipe(v.string(), v.regex(/^[a-z][a-zA-Z0-9.-]*$/u), v.maxLength(128));
4
+ const hash = v.pipe(v.string(), v.regex(/^[a-f0-9]{64}$/u));
5
+ const address = v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(7));
6
+ /** Exact cell-local triangle chunks; interactive panels keep independent stable collider identities. */
7
+ export const MeshCollisionSchema: v.GenericSchema<ShardMeshCollisionInput, ShardMeshCollision> = v.pipe(v.strictObject({ version: v.literal(1),
8
+ tiles: v.pipe(v.array(v.strictObject({ x: address, z: address, file: hash })), v.maxLength(64)),
9
+ panels: v.pipe(v.array(v.strictObject({ id, panel: id, file: hash, initialActive: v.boolean() })), v.maxLength(64)),
10
+ }), v.check(data => new Set(data.tiles.map(row => `${row.x}/${row.z}`)).size === data.tiles.length, 'unique mesh collision tile addresses'),
11
+ v.check(data => new Set(data.panels.map(row => row.id)).size === data.panels.length && new Set(data.panels.map(row => row.panel)).size === data.panels.length, 'unique mesh collision panel identities'),
12
+ v.check(data => { const refs = [...data.tiles, ...data.panels].map(row => row.file); return new Set(refs).size === refs.length; }, 'independently charged mesh collision chunks'));
13
+ /** Admitted metadata references immutable WMC1 bytes, never an authored physics closure. */
14
+
15
+ /** Renderer-neutral references checked before immutable asset admission. */
16
+ export interface CollisionSource {
17
+ meshCollision: ShardMeshCollision | null;
18
+ terrain: object | null;
19
+ props: { panels: readonly { id: string }[]; colliders: readonly { id: string }[] } | null;
20
+ files: readonly { hash: string; kind: string; dependencies: readonly string[] }[];
21
+ critical: readonly string[];
22
+ }
23
+ /** Check critical roots and target identities without reading any asset or creating a collider. */
24
+ export function meshCollisionRules(source: CollisionSource): string[] {
25
+ const data = source.meshCollision; if (data === null) return [];
26
+ const errors: string[] = [];
27
+ if (source.terrain !== null) errors.push('mesh collision and terrain are mutually exclusive');
28
+ const files = new Map(source.files.map(row => [row.hash, row]));
29
+ for (const row of [...data.tiles, ...data.panels]) {
30
+ const file = files.get(row.file);
31
+ if (file?.kind !== 'binary' || file.dependencies.length > 0 || !source.critical.includes(row.file)) errors.push('mesh collision chunks are independent critical binary roots');
32
+ }
33
+ const panels = new Set(source.props?.panels.map(row => row.id));
34
+ if (data.panels.some(row => !panels.has(row.panel))) errors.push('mesh collision panels reference declared prop panels');
35
+ const ids = [...source.props?.colliders.map(row => row.id) ?? [], ...data.panels.map(row => row.id), ...data.tiles.map(row => `mesh.tile.${row.x}.${row.z}`)];
36
+ if (new Set(ids).size !== ids.length) errors.push('unique combined mesh and prop collider identities');
37
+ return errors;
38
+ }
39
+
40
+ /** Admitted data contracts, independent of validator implementation metadata. */
41
+ export type ShardMeshCollisionInput = ShardMeshCollision;
42
+ interface ShardMeshCollisionFields {
43
+ version: 1;
44
+ tiles: ({
45
+ x: number;
46
+ z: number;
47
+ file: string;
48
+ })[];
49
+ panels: ({
50
+ id: string;
51
+ panel: string;
52
+ file: string;
53
+ initialActive: boolean;
54
+ })[];
55
+ }
56
+ export type ShardMeshCollision = { [Key in keyof ShardMeshCollisionFields]: ShardMeshCollisionFields[Key] };
@@ -0,0 +1,19 @@
1
+ import { decodeMeshCollision } from './meshCollisionBytes.ts';
2
+ import { meshCollisionRules, type CollisionSource } from './meshCollision.ts';
3
+
4
+ /** Verify bounded WMC1 bytes and exact tile containment after immutable hashes and costs have been admitted. */
5
+ export function validateMeshCollisionAssets(source: CollisionSource, assets: ReadonlyMap<string, Uint8Array>): void {
6
+ const errors = meshCollisionRules(source); if (errors.length > 0) throw new Error(errors.join('; '));
7
+ const data = source.meshCollision; if (data === null) return;
8
+ for (const row of [...data.tiles, ...data.panels]) {
9
+ const bytes = assets.get(row.file); if (bytes === undefined) throw new Error('Missing mesh collision asset');
10
+ const mesh = decodeMeshCollision(bytes);
11
+ if ('x' in row) {
12
+ const minX = -250 + row.x * 62.5, minZ = -250 + row.z * 62.5;
13
+ for (let i = 0; i < mesh.vertices.length; i += 3) {
14
+ const x = mesh.vertices[i], z = mesh.vertices[i + 2];
15
+ if (x === undefined || z === undefined || x < minX || x > minX + 62.5 || z < minZ || z > minZ + 62.5) throw new Error('Mesh collision geometry outside declared tile');
16
+ }
17
+ }
18
+ }
19
+ }