@bldrs-ai/conway 1.389.1221 → 1.394.1504

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 (382) hide show
  1. package/README.md +36 -22
  2. package/compiled/Dist/ConwayGeomWasmNode.js +0 -0
  3. package/compiled/Dist/ConwayGeomWasmNodeMT.js +0 -0
  4. package/compiled/Dist/ConwayGeomWasmWeb.js +0 -0
  5. package/compiled/Dist/ConwayGeomWasmWebMT.js +1 -1
  6. package/compiled/Dist/ConwayGeomWasmWebMT.wasm +0 -0
  7. package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmNode.js +0 -0
  8. package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmNodeMT.js +0 -0
  9. package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmWeb.js +0 -0
  10. package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmWebMT.js +1 -1
  11. package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmWebMT.wasm +0 -0
  12. package/compiled/dependencies/conway-geom/interface/conway_geometry.d.ts +19 -0
  13. package/compiled/dependencies/conway-geom/interface/conway_geometry.d.ts.map +1 -1
  14. package/compiled/dependencies/conway-geom/interface/conway_geometry.js +17 -0
  15. package/compiled/dependencies/conway-geom/interface/parameters/surface_object.d.ts +6 -0
  16. package/compiled/dependencies/conway-geom/interface/parameters/surface_object.d.ts.map +1 -1
  17. package/compiled/examples/browser-bundled.cjs +1569 -51
  18. package/compiled/examples/cli-bundled.cjs +2790 -436
  19. package/compiled/examples/cli-step-bundled.cjs +1904 -229
  20. package/compiled/examples/validator-bundled.cjs +1569 -51
  21. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.d.ts +2 -2
  22. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.d.ts.map +1 -1
  23. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.js +2 -2
  24. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.d.ts +3 -3
  25. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.d.ts.map +1 -1
  26. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.js +3 -3
  27. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.d.ts +1 -1
  28. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.d.ts.map +1 -1
  29. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.js +1 -1
  30. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.d.ts +1 -1
  31. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.d.ts.map +1 -1
  32. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.js +1 -1
  33. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.d.ts +1 -1
  34. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.d.ts.map +1 -1
  35. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.js +1 -1
  36. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.d.ts +1 -1
  37. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.d.ts.map +1 -1
  38. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.js +1 -1
  39. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/presentation_style_assignment.gen.d.ts.map +1 -1
  40. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/presentation_style_assignment.gen.js +2 -2
  41. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/schema_ap214.gen.js +11 -11
  42. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.d.ts +1 -1
  43. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.d.ts.map +1 -1
  44. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.js +1 -1
  45. package/compiled/src/AP214E3_2010/ap214_command_line_main.js +7 -3
  46. package/compiled/src/AP214E3_2010/ap214_geometry_extraction.d.ts +181 -7
  47. package/compiled/src/AP214E3_2010/ap214_geometry_extraction.d.ts.map +1 -1
  48. package/compiled/src/AP214E3_2010/ap214_geometry_extraction.js +906 -137
  49. package/compiled/src/AP214E3_2010/ap214_geometry_extraction.test.js +10 -2
  50. package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.d.ts +2 -0
  51. package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.d.ts.map +1 -0
  52. package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.js +114 -0
  53. package/compiled/src/AP214E3_2010/ap214_model_geometry.d.ts +6 -0
  54. package/compiled/src/AP214E3_2010/ap214_model_geometry.d.ts.map +1 -1
  55. package/compiled/src/AP214E3_2010/ap214_model_geometry.js +9 -0
  56. package/compiled/src/AP214E3_2010/ap214_pcurve_basis_surfaces.test.d.ts +2 -0
  57. package/compiled/src/AP214E3_2010/ap214_pcurve_basis_surfaces.test.d.ts.map +1 -0
  58. package/compiled/src/AP214E3_2010/ap214_pcurve_basis_surfaces.test.js +233 -0
  59. package/compiled/src/AP214E3_2010/ap214_sphere_vertex_loop.test.d.ts +2 -0
  60. package/compiled/src/AP214E3_2010/ap214_sphere_vertex_loop.test.d.ts.map +1 -0
  61. package/compiled/src/AP214E3_2010/ap214_sphere_vertex_loop.test.js +147 -0
  62. package/compiled/src/AP214E3_2010/ap214_step_model.d.ts +2 -1
  63. package/compiled/src/AP214E3_2010/ap214_step_model.d.ts.map +1 -1
  64. package/compiled/src/AP214E3_2010/ap214_step_model.js +1 -1
  65. package/compiled/src/AP214E3_2010/ap214_typed_select_enum.test.d.ts +2 -0
  66. package/compiled/src/AP214E3_2010/ap214_typed_select_enum.test.d.ts.map +1 -0
  67. package/compiled/src/AP214E3_2010/ap214_typed_select_enum.test.js +65 -0
  68. package/compiled/src/AP214E3_2010/ap214_unit_scale.test.d.ts +2 -0
  69. package/compiled/src/AP214E3_2010/ap214_unit_scale.test.d.ts.map +1 -0
  70. package/compiled/src/AP214E3_2010/ap214_unit_scale.test.js +111 -0
  71. package/compiled/src/compat/web-ifc/ap214_streamed_open.test.d.ts +2 -0
  72. package/compiled/src/compat/web-ifc/ap214_streamed_open.test.d.ts.map +1 -0
  73. package/compiled/src/compat/web-ifc/ap214_streamed_open.test.js +190 -0
  74. package/compiled/src/compat/web-ifc/coordination_export_order.test.d.ts +2 -0
  75. package/compiled/src/compat/web-ifc/coordination_export_order.test.d.ts.map +1 -0
  76. package/compiled/src/compat/web-ifc/coordination_export_order.test.js +110 -0
  77. package/compiled/src/compat/web-ifc/coordination_f64.d.ts +165 -0
  78. package/compiled/src/compat/web-ifc/coordination_f64.d.ts.map +1 -0
  79. package/compiled/src/compat/web-ifc/coordination_f64.js +286 -0
  80. package/compiled/src/compat/web-ifc/coordination_f64.test.d.ts +2 -0
  81. package/compiled/src/compat/web-ifc/coordination_f64.test.d.ts.map +1 -0
  82. package/compiled/src/compat/web-ifc/coordination_f64.test.js +225 -0
  83. package/compiled/src/compat/web-ifc/ifc_api.d.ts +154 -0
  84. package/compiled/src/compat/web-ifc/ifc_api.d.ts.map +1 -1
  85. package/compiled/src/compat/web-ifc/ifc_api.js +211 -3
  86. package/compiled/src/compat/web-ifc/ifc_api_deferred_open.test.d.ts +2 -0
  87. package/compiled/src/compat/web-ifc/ifc_api_deferred_open.test.d.ts.map +1 -0
  88. package/compiled/src/compat/web-ifc/ifc_api_deferred_open.test.js +288 -0
  89. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts +39 -0
  90. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts.map +1 -1
  91. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough_factory.d.ts +30 -0
  92. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough_factory.d.ts.map +1 -1
  93. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough_factory.js +83 -0
  94. package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.d.ts +2 -0
  95. package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.d.ts.map +1 -0
  96. package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.js +383 -0
  97. package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.d.ts +2 -0
  98. package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.d.ts.map +1 -0
  99. package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.js +124 -0
  100. package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.d.ts +132 -0
  101. package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.d.ts.map +1 -1
  102. package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.js +488 -92
  103. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts +268 -0
  104. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
  105. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +996 -149
  106. package/compiled/src/compat/web-ifc/ifc_api_streamed_open.test.d.ts +2 -0
  107. package/compiled/src/compat/web-ifc/ifc_api_streamed_open.test.d.ts.map +1 -0
  108. package/compiled/src/compat/web-ifc/ifc_api_streamed_open.test.js +129 -0
  109. package/compiled/src/compat/web-ifc/spatial_imposter.d.ts +134 -0
  110. package/compiled/src/compat/web-ifc/spatial_imposter.d.ts.map +1 -0
  111. package/compiled/src/compat/web-ifc/spatial_imposter.js +933 -0
  112. package/compiled/src/compat/web-ifc/spatial_imposter.test.d.ts +2 -0
  113. package/compiled/src/compat/web-ifc/spatial_imposter.test.d.ts.map +1 -0
  114. package/compiled/src/compat/web-ifc/spatial_imposter.test.js +467 -0
  115. package/compiled/src/compat/web-ifc/store_preview_channel.d.ts +187 -0
  116. package/compiled/src/compat/web-ifc/store_preview_channel.d.ts.map +1 -0
  117. package/compiled/src/compat/web-ifc/store_preview_channel.js +524 -0
  118. package/compiled/src/compat/web-ifc/store_preview_channel.test.d.ts +2 -0
  119. package/compiled/src/compat/web-ifc/store_preview_channel.test.d.ts.map +1 -0
  120. package/compiled/src/compat/web-ifc/store_preview_channel.test.js +234 -0
  121. package/compiled/src/compat/web-ifc/streamed_preview_channel.d.ts +306 -0
  122. package/compiled/src/compat/web-ifc/streamed_preview_channel.d.ts.map +1 -0
  123. package/compiled/src/compat/web-ifc/streamed_preview_channel.js +580 -0
  124. package/compiled/src/compat/web-ifc/web_wasm_directory.test.d.ts +2 -0
  125. package/compiled/src/compat/web-ifc/web_wasm_directory.test.d.ts.map +1 -0
  126. package/compiled/src/compat/web-ifc/web_wasm_directory.test.js +22 -0
  127. package/compiled/src/core/composed_model_skeleton.d.ts +63 -0
  128. package/compiled/src/core/composed_model_skeleton.d.ts.map +1 -0
  129. package/compiled/src/core/composed_model_skeleton.js +66 -0
  130. package/compiled/src/core/composed_model_skeleton.test.d.ts +2 -0
  131. package/compiled/src/core/composed_model_skeleton.test.d.ts.map +1 -0
  132. package/compiled/src/core/composed_model_skeleton.test.js +69 -0
  133. package/compiled/src/core/demand_geometry_queue.d.ts +147 -0
  134. package/compiled/src/core/demand_geometry_queue.d.ts.map +1 -0
  135. package/compiled/src/core/demand_geometry_queue.js +223 -0
  136. package/compiled/src/core/demand_geometry_queue.test.d.ts +2 -0
  137. package/compiled/src/core/demand_geometry_queue.test.d.ts.map +1 -0
  138. package/compiled/src/core/demand_geometry_queue.test.js +133 -0
  139. package/compiled/src/core/demand_residency_pump.d.ts +93 -0
  140. package/compiled/src/core/demand_residency_pump.d.ts.map +1 -0
  141. package/compiled/src/core/demand_residency_pump.js +120 -0
  142. package/compiled/src/core/demand_residency_pump.test.d.ts +2 -0
  143. package/compiled/src/core/demand_residency_pump.test.d.ts.map +1 -0
  144. package/compiled/src/core/demand_residency_pump.test.js +148 -0
  145. package/compiled/src/core/geometry_tile_bindings.d.ts +110 -0
  146. package/compiled/src/core/geometry_tile_bindings.d.ts.map +1 -0
  147. package/compiled/src/core/geometry_tile_bindings.js +76 -0
  148. package/compiled/src/core/geometry_tile_bindings.test.d.ts +2 -0
  149. package/compiled/src/core/geometry_tile_bindings.test.d.ts.map +1 -0
  150. package/compiled/src/core/geometry_tile_bindings.test.js +211 -0
  151. package/compiled/src/core/geometry_tile_pool.d.ts +99 -0
  152. package/compiled/src/core/geometry_tile_pool.d.ts.map +1 -0
  153. package/compiled/src/core/geometry_tile_pool.js +104 -0
  154. package/compiled/src/core/geometry_tile_pool.test.d.ts +2 -0
  155. package/compiled/src/core/geometry_tile_pool.test.d.ts.map +1 -0
  156. package/compiled/src/core/geometry_tile_pool.test.js +180 -0
  157. package/compiled/src/core/mem/chunked_pool.d.ts +116 -0
  158. package/compiled/src/core/mem/chunked_pool.d.ts.map +1 -0
  159. package/compiled/src/core/mem/chunked_pool.js +149 -0
  160. package/compiled/src/core/mem/chunked_pool.test.d.ts +2 -0
  161. package/compiled/src/core/mem/chunked_pool.test.d.ts.map +1 -0
  162. package/compiled/src/core/mem/chunked_pool.test.js +63 -0
  163. package/compiled/src/core/mem/shared_asset_pool.d.ts +82 -0
  164. package/compiled/src/core/mem/shared_asset_pool.d.ts.map +1 -0
  165. package/compiled/src/core/mem/shared_asset_pool.js +113 -0
  166. package/compiled/src/core/mem/shared_asset_pool.test.d.ts +2 -0
  167. package/compiled/src/core/mem/shared_asset_pool.test.d.ts.map +1 -0
  168. package/compiled/src/core/mem/shared_asset_pool.test.js +49 -0
  169. package/compiled/src/core/model_registry.d.ts +87 -0
  170. package/compiled/src/core/model_registry.d.ts.map +1 -0
  171. package/compiled/src/core/model_registry.js +101 -0
  172. package/compiled/src/core/model_registry.test.d.ts +2 -0
  173. package/compiled/src/core/model_registry.test.d.ts.map +1 -0
  174. package/compiled/src/core/model_registry.test.js +60 -0
  175. package/compiled/src/core/model_uri.d.ts +57 -0
  176. package/compiled/src/core/model_uri.d.ts.map +1 -0
  177. package/compiled/src/core/model_uri.js +101 -0
  178. package/compiled/src/core/model_uri.test.d.ts +2 -0
  179. package/compiled/src/core/model_uri.test.d.ts.map +1 -0
  180. package/compiled/src/core/model_uri.test.js +49 -0
  181. package/compiled/src/core/progress.d.ts +16 -2
  182. package/compiled/src/core/progress.d.ts.map +1 -1
  183. package/compiled/src/core/progress.js +31 -5
  184. package/compiled/src/core/progress.test.js +11 -2
  185. package/compiled/src/core/progress_log.d.ts +1 -0
  186. package/compiled/src/core/progress_log.d.ts.map +1 -1
  187. package/compiled/src/core/progress_log.js +7 -2
  188. package/compiled/src/core/progress_log.test.js +21 -0
  189. package/compiled/src/core/shared_byte_budget.d.ts +60 -0
  190. package/compiled/src/core/shared_byte_budget.d.ts.map +1 -0
  191. package/compiled/src/core/shared_byte_budget.js +85 -0
  192. package/compiled/src/core/shared_byte_budget.test.d.ts +2 -0
  193. package/compiled/src/core/shared_byte_budget.test.d.ts.map +1 -0
  194. package/compiled/src/core/shared_byte_budget.test.js +55 -0
  195. package/compiled/src/core/wasm_heap.d.ts +208 -0
  196. package/compiled/src/core/wasm_heap.d.ts.map +1 -0
  197. package/compiled/src/core/wasm_heap.js +417 -0
  198. package/compiled/src/core/wasm_heap.test.d.ts +2 -0
  199. package/compiled/src/core/wasm_heap.test.d.ts.map +1 -0
  200. package/compiled/src/core/wasm_heap.test.js +546 -0
  201. package/compiled/src/demand/index.d.ts +23 -0
  202. package/compiled/src/demand/index.d.ts.map +1 -0
  203. package/compiled/src/demand/index.js +22 -0
  204. package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.d.ts +1 -1
  205. package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.d.ts.map +1 -1
  206. package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.js +1 -1
  207. package/compiled/src/ifc/ifc4_gen/IfcPresentationStyleAssignment.gen.d.ts.map +1 -1
  208. package/compiled/src/ifc/ifc4_gen/IfcPresentationStyleAssignment.gen.js +2 -2
  209. package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.d.ts +1 -1
  210. package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.d.ts.map +1 -1
  211. package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.js +1 -1
  212. package/compiled/src/ifc/ifc4_gen/schema_ifc.gen.js +2 -2
  213. package/compiled/src/ifc/ifc_demand_extraction.test.d.ts +2 -0
  214. package/compiled/src/ifc/ifc_demand_extraction.test.d.ts.map +1 -0
  215. package/compiled/src/ifc/ifc_demand_extraction.test.js +251 -0
  216. package/compiled/src/ifc/ifc_geometry_extraction.d.ts +367 -6
  217. package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
  218. package/compiled/src/ifc/ifc_geometry_extraction.js +1322 -389
  219. package/compiled/src/ifc/ifc_grid_placement.test.d.ts +2 -0
  220. package/compiled/src/ifc/ifc_grid_placement.test.d.ts.map +1 -0
  221. package/compiled/src/ifc/ifc_grid_placement.test.js +261 -0
  222. package/compiled/src/ifc/ifc_model_geometry.d.ts +12 -0
  223. package/compiled/src/ifc/ifc_model_geometry.d.ts.map +1 -1
  224. package/compiled/src/ifc/ifc_model_geometry.js +15 -0
  225. package/compiled/src/ifc/ifc_regression_batch_main.js +210 -12
  226. package/compiled/src/ifc/ifc_spatial_skeleton.d.ts +145 -0
  227. package/compiled/src/ifc/ifc_spatial_skeleton.d.ts.map +1 -0
  228. package/compiled/src/ifc/ifc_spatial_skeleton.js +266 -0
  229. package/compiled/src/ifc/ifc_spatial_skeleton.test.d.ts +2 -0
  230. package/compiled/src/ifc/ifc_spatial_skeleton.test.d.ts.map +1 -0
  231. package/compiled/src/ifc/ifc_spatial_skeleton.test.js +199 -0
  232. package/compiled/src/ifc/ifc_step_model.d.ts +6 -2
  233. package/compiled/src/ifc/ifc_step_model.d.ts.map +1 -1
  234. package/compiled/src/ifc/ifc_step_model.js +6 -4
  235. package/compiled/src/ifc/ifc_step_parser.d.ts +58 -0
  236. package/compiled/src/ifc/ifc_step_parser.d.ts.map +1 -1
  237. package/compiled/src/ifc/ifc_step_parser.js +64 -0
  238. package/compiled/src/ifc/ifc_stream_model.test.d.ts +2 -0
  239. package/compiled/src/ifc/ifc_stream_model.test.d.ts.map +1 -0
  240. package/compiled/src/ifc/ifc_stream_model.test.js +70 -0
  241. package/compiled/src/ifc/ifc_stream_open.d.ts +131 -0
  242. package/compiled/src/ifc/ifc_stream_open.d.ts.map +1 -0
  243. package/compiled/src/ifc/ifc_stream_open.js +116 -0
  244. package/compiled/src/ifc/ifc_stream_open.test.d.ts +2 -0
  245. package/compiled/src/ifc/ifc_stream_open.test.d.ts.map +1 -0
  246. package/compiled/src/ifc/ifc_stream_open.test.js +230 -0
  247. package/compiled/src/ifc/ifc_tile_extractor.d.ts +84 -0
  248. package/compiled/src/ifc/ifc_tile_extractor.d.ts.map +1 -0
  249. package/compiled/src/ifc/ifc_tile_extractor.js +134 -0
  250. package/compiled/src/ifc/ifc_tile_extractor.test.d.ts +2 -0
  251. package/compiled/src/ifc/ifc_tile_extractor.test.d.ts.map +1 -0
  252. package/compiled/src/ifc/ifc_tile_extractor.test.js +118 -0
  253. package/compiled/src/ifc/ifc_typed_select_enum.test.d.ts +2 -0
  254. package/compiled/src/ifc/ifc_typed_select_enum.test.d.ts.map +1 -0
  255. package/compiled/src/ifc/ifc_typed_select_enum.test.js +60 -0
  256. package/compiled/src/index.d.ts +21 -1
  257. package/compiled/src/index.d.ts.map +1 -1
  258. package/compiled/src/index.js +28 -1
  259. package/compiled/src/logging/logger.d.ts +16 -2
  260. package/compiled/src/logging/logger.d.ts.map +1 -1
  261. package/compiled/src/logging/logger.js +34 -7
  262. package/compiled/src/logging/logger.test.js +30 -0
  263. package/compiled/src/mem/index.d.ts +17 -0
  264. package/compiled/src/mem/index.d.ts.map +1 -0
  265. package/compiled/src/mem/index.js +16 -0
  266. package/compiled/src/namespace_surface.test.d.ts +2 -0
  267. package/compiled/src/namespace_surface.test.d.ts.map +1 -0
  268. package/compiled/src/namespace_surface.test.js +43 -0
  269. package/compiled/src/parsing/parsing_buffer.d.ts +23 -0
  270. package/compiled/src/parsing/parsing_buffer.d.ts.map +1 -1
  271. package/compiled/src/parsing/parsing_buffer.js +31 -0
  272. package/compiled/src/scripts/model_report_displacement.test.d.ts +2 -0
  273. package/compiled/src/scripts/model_report_displacement.test.d.ts.map +1 -0
  274. package/compiled/src/scripts/model_report_displacement.test.js +104 -0
  275. package/compiled/src/scripts/render_glb_paths.test.d.ts +2 -0
  276. package/compiled/src/scripts/render_glb_paths.test.d.ts.map +1 -0
  277. package/compiled/src/scripts/render_glb_paths.test.js +115 -0
  278. package/compiled/src/step/indexing/step_type_indexer.d.ts +20 -0
  279. package/compiled/src/step/indexing/step_type_indexer.d.ts.map +1 -1
  280. package/compiled/src/step/indexing/step_type_indexer.js +67 -0
  281. package/compiled/src/step/parsing/byte_source.d.ts +153 -0
  282. package/compiled/src/step/parsing/byte_source.d.ts.map +1 -0
  283. package/compiled/src/step/parsing/byte_source.js +106 -0
  284. package/compiled/src/step/parsing/byte_source.test.d.ts +2 -0
  285. package/compiled/src/step/parsing/byte_source.test.d.ts.map +1 -0
  286. package/compiled/src/step/parsing/byte_source.test.js +47 -0
  287. package/compiled/src/step/parsing/byte_source_node.d.ts +41 -0
  288. package/compiled/src/step/parsing/byte_source_node.d.ts.map +1 -0
  289. package/compiled/src/step/parsing/byte_source_node.js +54 -0
  290. package/compiled/src/step/parsing/columnar_index.d.ts +103 -0
  291. package/compiled/src/step/parsing/columnar_index.d.ts.map +1 -0
  292. package/compiled/src/step/parsing/columnar_index.js +224 -0
  293. package/compiled/src/step/parsing/columnar_index.test.d.ts +2 -0
  294. package/compiled/src/step/parsing/columnar_index.test.d.ts.map +1 -0
  295. package/compiled/src/step/parsing/columnar_index.test.js +155 -0
  296. package/compiled/src/step/parsing/cross_reference_registry.d.ts +95 -0
  297. package/compiled/src/step/parsing/cross_reference_registry.d.ts.map +1 -0
  298. package/compiled/src/step/parsing/cross_reference_registry.js +91 -0
  299. package/compiled/src/step/parsing/cross_reference_registry.test.d.ts +2 -0
  300. package/compiled/src/step/parsing/cross_reference_registry.test.d.ts.map +1 -0
  301. package/compiled/src/step/parsing/cross_reference_registry.test.js +66 -0
  302. package/compiled/src/step/parsing/decode_utf8.d.ts +15 -0
  303. package/compiled/src/step/parsing/decode_utf8.d.ts.map +1 -1
  304. package/compiled/src/step/parsing/decode_utf8.js +28 -0
  305. package/compiled/src/step/parsing/express_ref_scan.d.ts +20 -0
  306. package/compiled/src/step/parsing/express_ref_scan.d.ts.map +1 -0
  307. package/compiled/src/step/parsing/express_ref_scan.js +91 -0
  308. package/compiled/src/step/parsing/express_ref_scan.test.d.ts +2 -0
  309. package/compiled/src/step/parsing/express_ref_scan.test.d.ts.map +1 -0
  310. package/compiled/src/step/parsing/express_ref_scan.test.js +28 -0
  311. package/compiled/src/step/parsing/index_sidecar.d.ts +81 -0
  312. package/compiled/src/step/parsing/index_sidecar.d.ts.map +1 -0
  313. package/compiled/src/step/parsing/index_sidecar.js +283 -0
  314. package/compiled/src/step/parsing/index_sidecar.test.d.ts +2 -0
  315. package/compiled/src/step/parsing/index_sidecar.test.d.ts.map +1 -0
  316. package/compiled/src/step/parsing/index_sidecar.test.js +122 -0
  317. package/compiled/src/step/parsing/inf_recovery_index.test.d.ts +2 -0
  318. package/compiled/src/step/parsing/inf_recovery_index.test.d.ts.map +1 -0
  319. package/compiled/src/step/parsing/inf_recovery_index.test.js +108 -0
  320. package/compiled/src/step/parsing/prefix_type_index.d.ts +124 -0
  321. package/compiled/src/step/parsing/prefix_type_index.d.ts.map +1 -0
  322. package/compiled/src/step/parsing/prefix_type_index.js +207 -0
  323. package/compiled/src/step/parsing/prefix_type_index.test.d.ts +2 -0
  324. package/compiled/src/step/parsing/prefix_type_index.test.d.ts.map +1 -0
  325. package/compiled/src/step/parsing/prefix_type_index.test.js +298 -0
  326. package/compiled/src/step/parsing/range_byte_source.d.ts +69 -0
  327. package/compiled/src/step/parsing/range_byte_source.d.ts.map +1 -0
  328. package/compiled/src/step/parsing/range_byte_source.js +78 -0
  329. package/compiled/src/step/parsing/range_byte_source.test.d.ts +2 -0
  330. package/compiled/src/step/parsing/range_byte_source.test.d.ts.map +1 -0
  331. package/compiled/src/step/parsing/range_byte_source.test.js +70 -0
  332. package/compiled/src/step/parsing/record_event.d.ts +23 -0
  333. package/compiled/src/step/parsing/record_event.d.ts.map +1 -0
  334. package/compiled/src/step/parsing/record_event.js +1 -0
  335. package/compiled/src/step/parsing/record_field_cursor.d.ts +94 -0
  336. package/compiled/src/step/parsing/record_field_cursor.d.ts.map +1 -0
  337. package/compiled/src/step/parsing/record_field_cursor.js +189 -0
  338. package/compiled/src/step/parsing/step_deserialization_functions.d.ts +29 -0
  339. package/compiled/src/step/parsing/step_deserialization_functions.d.ts.map +1 -1
  340. package/compiled/src/step/parsing/step_deserialization_functions.js +45 -0
  341. package/compiled/src/step/parsing/step_deserialization_functions.test.js +59 -1
  342. package/compiled/src/step/parsing/step_parser.d.ts +66 -1
  343. package/compiled/src/step/parsing/step_parser.d.ts.map +1 -1
  344. package/compiled/src/step/parsing/step_parser.js +164 -10
  345. package/compiled/src/step/parsing/step_string_parser.js +8 -8
  346. package/compiled/src/step/parsing/streaming_index_builder.d.ts +141 -0
  347. package/compiled/src/step/parsing/streaming_index_builder.d.ts.map +1 -0
  348. package/compiled/src/step/parsing/streaming_index_builder.js +280 -0
  349. package/compiled/src/step/parsing/streaming_index_builder.test.d.ts +2 -0
  350. package/compiled/src/step/parsing/streaming_index_builder.test.d.ts.map +1 -0
  351. package/compiled/src/step/parsing/streaming_index_builder.test.js +107 -0
  352. package/compiled/src/step/parsing/streaming_index_builder_async.test.d.ts +2 -0
  353. package/compiled/src/step/parsing/streaming_index_builder_async.test.d.ts.map +1 -0
  354. package/compiled/src/step/parsing/streaming_index_builder_async.test.js +109 -0
  355. package/compiled/src/step/parsing/streaming_record_dispatcher.d.ts +71 -0
  356. package/compiled/src/step/parsing/streaming_record_dispatcher.d.ts.map +1 -0
  357. package/compiled/src/step/parsing/streaming_record_dispatcher.js +88 -0
  358. package/compiled/src/step/parsing/streaming_record_dispatcher.test.d.ts +2 -0
  359. package/compiled/src/step/parsing/streaming_record_dispatcher.test.d.ts.map +1 -0
  360. package/compiled/src/step/parsing/streaming_record_dispatcher.test.js +66 -0
  361. package/compiled/src/step/parsing/uint32_sink.d.ts +72 -0
  362. package/compiled/src/step/parsing/uint32_sink.d.ts.map +1 -0
  363. package/compiled/src/step/parsing/uint32_sink.js +180 -0
  364. package/compiled/src/step/parsing/uint32_sink.test.d.ts +2 -0
  365. package/compiled/src/step/parsing/uint32_sink.test.d.ts.map +1 -0
  366. package/compiled/src/step/parsing/uint32_sink.test.js +199 -0
  367. package/compiled/src/step/step_buffer_provider.d.ts +48 -3
  368. package/compiled/src/step/step_buffer_provider.d.ts.map +1 -1
  369. package/compiled/src/step/step_buffer_provider.js +60 -11
  370. package/compiled/src/step/step_buffer_provider.test.js +14 -0
  371. package/compiled/src/step/step_entity_base.d.ts +65 -3
  372. package/compiled/src/step/step_entity_base.d.ts.map +1 -1
  373. package/compiled/src/step/step_entity_base.js +135 -3
  374. package/compiled/src/step/step_model_base.d.ts +221 -8
  375. package/compiled/src/step/step_model_base.d.ts.map +1 -1
  376. package/compiled/src/step/step_model_base.js +542 -7
  377. package/compiled/src/stream/index.d.ts +34 -0
  378. package/compiled/src/stream/index.d.ts.map +1 -0
  379. package/compiled/src/stream/index.js +32 -0
  380. package/compiled/src/version/version.js +1 -1
  381. package/compiled/tsconfig.tsbuildinfo +1 -1
  382. package/package.json +16 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spatial_imposter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial_imposter.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/spatial_imposter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,467 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ import * as fs from "fs";
3
+ import { describe, expect, test } from "@jest/globals";
4
+ import { openStreamedIfcModelFromStore } from "../../ifc/ifc_stream_open.js";
5
+ import { InMemoryStepByteStore } from "../../step/step_buffer_provider.js";
6
+ import EntityTypesIfc from "../../ifc/ifc4_gen/entity_types_ifc.gen.js";
7
+ import { deriveCoordinationF64, mat4MultiplyF64, NORMALIZE_MAT_F64, } from "./coordination_f64.js";
8
+ import { aabbBoxMatrix, aabbMostlyEqual, emitSpatialStructureImposters, shouldEmitSpatialNode, spatialImposterDepthCap, SPATIAL_IMPOSTER_COLOR, unionAabb, } from "./spatial_imposter.js";
9
+ /**
10
+ * The axes an IfcAxis2Placement3D needs to state a rotation, as
11
+ * `[Axis (local +Z), RefDirection (local +X)]`.
12
+ *
13
+ * @param rotation The fixture's rotation knob.
14
+ * @return {PlacementAxes | undefined} The two direction ratios, or
15
+ * undefined for no rotation.
16
+ */
17
+ function rotationAxes(rotation) {
18
+ if (rotation === void 0) {
19
+ return;
20
+ }
21
+ const radians = rotation.degrees * Math.PI / 180;
22
+ const cos = Math.cos(radians);
23
+ const sin = Math.sin(radians);
24
+ // Columns of the rotation matrix: Axis is its third (local +Z),
25
+ // RefDirection its first (local +X).
26
+ return rotation.axis === "z" ?
27
+ [[0, 0, 1], [cos, sin, 0]] :
28
+ [[0, -sin, cos], [1, 0, 0]];
29
+ }
30
+ /**
31
+ * Transform a point by the fixture's site rotation — what the composed
32
+ * placement chain must reproduce.
33
+ *
34
+ * @param rotation The fixture's rotation knob.
35
+ * @param point A point in the site's local frame.
36
+ * @return {[number, number, number]} The rotated point.
37
+ */
38
+ function rotatePoint(rotation, point) {
39
+ if (rotation === void 0) {
40
+ return point;
41
+ }
42
+ const radians = rotation.degrees * Math.PI / 180;
43
+ const cos = Math.cos(radians);
44
+ const sin = Math.sin(radians);
45
+ const [x, y, z] = point;
46
+ return rotation.axis === "z" ?
47
+ [x * cos - y * sin, x * sin + y * cos, z] :
48
+ [x, y * cos - z * sin, y * sin + z * cos];
49
+ }
50
+ /**
51
+ * A minimal but schema-valid IFC4 spatial structure —
52
+ * Project/Site/Building/2 Storeys, two placed walls contained in each
53
+ * storey — with every placement and elevation a caller-chosen number.
54
+ * Carries no units and no geometry: the imposter walk reads placement
55
+ * chains only, and takes its scaling factor as an argument.
56
+ *
57
+ * @param fixture Placement/elevation knobs.
58
+ * @return {Uint8Array} The file bytes.
59
+ */
60
+ function syntheticSpatialIfc(fixture) {
61
+ const lines = [];
62
+ let next = 1;
63
+ const push = (body) => {
64
+ const id = next++;
65
+ lines.push(`#${id}=${body};`);
66
+ return id;
67
+ };
68
+ const num = (value) => value.toFixed(4);
69
+ const guid = (seed) => `3vB2${String(seed).padStart(18, "0")}`;
70
+ // Direction ratios get more decimals than `num`'s four: they are
71
+ // trigonometric, and rounding cos(30 deg) at four places moves a
72
+ // sampled origin by ~1e-4 source units — enough to break assertions
73
+ // that compare a composed plate against the same rotation applied in
74
+ // double precision.
75
+ const direction = (ratios) => push(`IFCDIRECTION((${ratios.map((r) => r.toFixed(12)).join(",")}))`);
76
+ const ref = (ratios) => ratios !== void 0 ? `#${direction(ratios)}` : "$";
77
+ const placement = (relTo, x, y, z, axes, twoDimensional = false) => {
78
+ // A 2D placement's Location is a 2D point, and its only direction
79
+ // field is RefDirection — there is no Axis to state.
80
+ const point = twoDimensional ?
81
+ push(`IFCCARTESIANPOINT((${num(x)},${num(y)}))`) :
82
+ push(`IFCCARTESIANPOINT((${num(x)},${num(y)},${num(z)}))`);
83
+ const axis = twoDimensional ?
84
+ push(`IFCAXIS2PLACEMENT2D(#${point},$)`) :
85
+ push(`IFCAXIS2PLACEMENT3D(#${point},` +
86
+ `${ref(axes?.[0])},${ref(axes?.[1])})`);
87
+ return push(`IFCLOCALPLACEMENT(${relTo === void 0 ? "$" : `#${relTo}`},#${axis})`);
88
+ };
89
+ const sitePlacement = placement(void 0, ...fixture.siteOrigin, fixture.siteAxes ?? rotationAxes(fixture.siteRotation), fixture.sitePlacement2D === true);
90
+ const buildingPlacement = placement(sitePlacement, 0, 0, fixture.buildingZ);
91
+ const project = push(`IFCPROJECT('${guid(1)}',$,'P',$,$,$,$,$,$)`);
92
+ const site = push(`IFCSITE('${guid(2)}',$,'S',$,$,#${sitePlacement},$,$,.ELEMENT.,$,$,$,$,$)`);
93
+ const building = push(`IFCBUILDING('${guid(3)}',$,'B',$,$,#${buildingPlacement},$,$,.ELEMENT.,$,$,$)`);
94
+ const storeys = fixture.storeyElevations.map((elevation, index) => {
95
+ // Under the default the storey's own placement carries the same
96
+ // offset from the building datum that Elevation states — the
97
+ // ordinary authoring — so the two only disagree once the BUILDING is
98
+ // off world zero. Under 'datum' the placement says nothing and
99
+ // Elevation is the only record of the height.
100
+ const storeyPlacement = placement(buildingPlacement, 0, 0, fixture.storeyPlacementZ === "datum" ? 0 : elevation);
101
+ return push(`IFCBUILDINGSTOREY('${guid(10 + index)}',$,'L${index}',$,$,` +
102
+ `#${storeyPlacement},$,$,.ELEMENT.,${num(elevation)})`);
103
+ });
104
+ push(`IFCRELAGGREGATES('${guid(20)}',$,$,$,#${project},(#${site}))`);
105
+ push(`IFCRELAGGREGATES('${guid(21)}',$,$,$,#${site},(#${building}))`);
106
+ push(`IFCRELAGGREGATES('${guid(22)}',$,$,$,#${building},` +
107
+ `(${storeys.map((id) => `#${id}`).join(",")}))`);
108
+ storeys.forEach((storey, index) => {
109
+ const storeyPlacement = storey - 1;
110
+ // Whatever the storey placement does not say about the height, the
111
+ // contained walls have to say themselves — otherwise every storey's
112
+ // contents would pile up at the building datum, which is not a file
113
+ // any exporter produces.
114
+ const wallZ = fixture.storeyPlacementZ === "datum" ?
115
+ fixture.storeyElevations[index] : 0;
116
+ const wallA = push(`IFCWALL('${guid(30 + index * 2)}',$,$,$,$,` +
117
+ `#${placement(storeyPlacement, 0, 0, wallZ)},$,$,$)`);
118
+ const wallB = push(`IFCWALL('${guid(31 + index * 2)}',$,$,$,$,` +
119
+ `#${placement(storeyPlacement, ...fixture.wallOffset, wallZ)},$,$,$)`);
120
+ push(`IFCRELCONTAINEDINSPATIALSTRUCTURE('${guid(40 + index)}',$,$,$,` +
121
+ `(#${wallA},#${wallB}),#${storey})`);
122
+ });
123
+ const text = "ISO-10303-21;\n" +
124
+ "HEADER;\n" +
125
+ "FILE_DESCRIPTION((''),'2;1');\n" +
126
+ "FILE_NAME('synthetic.ifc','2026-01-01T00:00:00',(''),(''),'','','');\n" +
127
+ "FILE_SCHEMA(('IFC4'));\n" +
128
+ "ENDSEC;\n" +
129
+ "DATA;\n" +
130
+ `${lines.join("\n")}\n` +
131
+ "ENDSEC;\n" +
132
+ "END-ISO-10303-21;\n";
133
+ return new TextEncoder().encode(text);
134
+ }
135
+ /**
136
+ * Emit imposters for a synthetic fixture.
137
+ *
138
+ * @param fixture Placement/elevation knobs.
139
+ * @param linearScalingFactor Source units -> metres.
140
+ * @param coordinationMatrix Latched preview frame, or undefined to
141
+ * exercise the walk's own fallback derivation.
142
+ * @return {Promise<[PreviewMeshPayload[], IfcStepModel]>} Payloads and model.
143
+ */
144
+ async function emitForFixture(fixture, linearScalingFactor, coordinationMatrix) {
145
+ const open = await openStreamedIfcModelFromStore(new InMemoryStepByteStore(syntheticSpatialIfc(fixture)), { pool: 4 * 1024 });
146
+ expect(open.model).toBeDefined();
147
+ const payloads = [];
148
+ await emitSpatialStructureImposters(open.model, (mesh) => payloads.push(mesh), coordinationMatrix, linearScalingFactor);
149
+ expect(payloads.length).toBeGreaterThan(0);
150
+ return [payloads, open.model];
151
+ }
152
+ /**
153
+ * @param payloads Emitted imposters.
154
+ * @param model The model they came from.
155
+ * @return {PreviewMeshPayload[]} Only the IfcBuildingStorey plates,
156
+ * ordered bottom-up.
157
+ */
158
+ function storeyPlates(payloads, model) {
159
+ return payloads
160
+ .filter((payload) => model.typeIDOf(model.resolveExpressID(payload.expressID)) ===
161
+ EntityTypesIfc.IFCBUILDINGSTOREY)
162
+ .sort((a, b) => a.aabb.min[2] - b.aabb.min[2]);
163
+ }
164
+ /**
165
+ * @param actual A 16-element matrix.
166
+ * @param expected A 16-element matrix.
167
+ * @param digits Decimal places (jest's toBeCloseTo semantics).
168
+ */
169
+ function expectMatrixClose(actual, expected, digits = 6) {
170
+ expect(actual).toHaveLength(16);
171
+ for (let where = 0; where < 16; ++where) {
172
+ expect(actual[where]).toBeCloseTo(expected[where], digits);
173
+ }
174
+ }
175
+ describe("spatial_imposter policy", () => {
176
+ test("depth cap is half the tree, rounded up", () => {
177
+ expect(spatialImposterDepthCap(0)).toBe(0);
178
+ expect(spatialImposterDepthCap(1)).toBe(1);
179
+ expect(spatialImposterDepthCap(4)).toBe(2);
180
+ expect(spatialImposterDepthCap(5)).toBe(3);
181
+ });
182
+ test("never emits spaces; always emits storeys; half-depth otherwise", () => {
183
+ expect(shouldEmitSpatialNode(4, 4, EntityTypesIfc.IFCSPACE)).toBe(false);
184
+ expect(shouldEmitSpatialNode(3, 4, EntityTypesIfc.IFCBUILDINGSTOREY)).toBe(true);
185
+ expect(shouldEmitSpatialNode(2, 4, EntityTypesIfc.IFCBUILDING)).toBe(true);
186
+ expect(shouldEmitSpatialNode(3, 4, EntityTypesIfc.IFCBUILDING)).toBe(false);
187
+ expect(shouldEmitSpatialNode(0, 4, EntityTypesIfc.IFCPROJECT)).toBe(true);
188
+ });
189
+ test("unionAabb and aabbMostlyEqual", () => {
190
+ const a = { min: [0, 0, 0], max: [10, 10, 4] };
191
+ const b = { min: [8, 8, 0], max: [12, 12, 4] };
192
+ const u = unionAabb(a, b);
193
+ expect(u.min).toEqual([0, 0, 0]);
194
+ expect(u.max).toEqual([12, 12, 4]);
195
+ expect(aabbMostlyEqual(a, a)).toBe(true);
196
+ expect(aabbMostlyEqual(a, b)).toBe(false);
197
+ });
198
+ test("imposter colour is black at 0.3 opacity", () => {
199
+ expect(SPATIAL_IMPOSTER_COLOR).toEqual({ x: 0, y: 0, z: 0, w: 0.3 });
200
+ });
201
+ test("aabbBoxMatrix stays in raw IFC space \u2014 no axis flip", () => {
202
+ const matrix = aabbBoxMatrix({ min: [0, 0, 0], max: [2, 4, 6] });
203
+ // translate(centre) * scale(size), column-major, Z-up preserved.
204
+ expect(matrix).toEqual([
205
+ 2,
206
+ 0,
207
+ 0,
208
+ 0,
209
+ 0,
210
+ 4,
211
+ 0,
212
+ 0,
213
+ 0,
214
+ 0,
215
+ 6,
216
+ 0,
217
+ 1,
218
+ 2,
219
+ 3,
220
+ 1,
221
+ ]);
222
+ });
223
+ });
224
+ describe("emitSpatialStructureImposters", () => {
225
+ test("index.ifc emits storey-scale wireframe boxes, not spaces", async () => {
226
+ const bytes = new Uint8Array(fs.readFileSync("data/index.ifc"));
227
+ const open = await openStreamedIfcModelFromStore(new InMemoryStepByteStore(bytes), { pool: 4 * 1024 });
228
+ const payloads = [];
229
+ const emitted = await emitSpatialStructureImposters(open.model, (mesh) => payloads.push(mesh));
230
+ expect(emitted).toBeGreaterThan(0);
231
+ expect(payloads).toHaveLength(emitted);
232
+ for (const payload of payloads) {
233
+ // Wireframe by request — `solid` stays in the payload contract but
234
+ // nothing sets it any more.
235
+ expect(payload.solid).toBeUndefined();
236
+ expect("solid" in payload).toBe(false);
237
+ expect(payload.aabb).toBeDefined();
238
+ expect(payload.geometryExpressID).toBe(-1);
239
+ expect(payload.color).toEqual(SPATIAL_IMPOSTER_COLOR);
240
+ expect(payload.flatTransformation).toHaveLength(16);
241
+ }
242
+ const types = new Set(payloads.map((p) => open.model.typeIDOf(open.model.resolveExpressID(p.expressID))));
243
+ expect(types.has(EntityTypesIfc.IFCSPACE)).toBe(false);
244
+ });
245
+ });
246
+ // conway#515: the plates used to be emitted in raw source units with a
247
+ // locally baked Z-up -> Y-up flip and no coordination at all, so on a
248
+ // millimetre model they came out 1000x oversized and on a georeferenced
249
+ // one they sat a site-offset away from the meshes they were previewing.
250
+ describe("emitSpatialStructureImposters coordination frame", () => {
251
+ /** Millimetres, 50km east / 30km north — well past the recentre budget. */
252
+ const MILLIMETRE_GEOREFERENCED = {
253
+ siteOrigin: [50000000, 30000000, 0],
254
+ buildingZ: 0,
255
+ storeyElevations: [0, 3000],
256
+ wallOffset: [8000, 6000],
257
+ };
258
+ const MM_TO_M = 0.001;
259
+ test("millimetre georeferenced plates compose under the latched frame", async () => {
260
+ // What the preview channel latches from a first geometry sitting on
261
+ // the site origin: identity placement, that point as the anchor.
262
+ const coordination = deriveCoordinationF64(void 0, { x: 50000000, y: 30000000, z: 0 }, NORMALIZE_MAT_F64, MM_TO_M);
263
+ const [payloads] = await emitForFixture(MILLIMETRE_GEOREFERENCED, MM_TO_M, coordination);
264
+ for (const payload of payloads) {
265
+ expectMatrixClose(payload.flatTransformation, mat4MultiplyF64(coordination, aabbBoxMatrix(payload.aabb)));
266
+ // In metres and near the origin, not 5e7 source units out.
267
+ expect(Math.abs(payload.flatTransformation[12])).toBeLessThan(100);
268
+ expect(Math.abs(payload.flatTransformation[13])).toBeLessThan(100);
269
+ expect(Math.abs(payload.flatTransformation[14])).toBeLessThan(100);
270
+ // Scale columns are metres too — the mm-oversize bug put these at
271
+ // 8000 x 6000 rather than 8 x 6.
272
+ for (let column = 0; column < 3; ++column) {
273
+ expect(Math.hypot(payload.flatTransformation[column * 4], payload.flatTransformation[column * 4 + 1], payload.flatTransformation[column * 4 + 2])).toBeLessThan(100);
274
+ }
275
+ // The reported box stays in raw IFC space for the consumer.
276
+ expect(payload.aabb.min[0]).toBeGreaterThan(10000000);
277
+ }
278
+ });
279
+ test("no latched frame: the fallback derivation recentres the same way", async () => {
280
+ const [payloads] = await emitForFixture(MILLIMETRE_GEOREFERENCED, MM_TO_M);
281
+ // Anchored on the spatial root's centre rather than a first
282
+ // geometry, but the same quantized policy: the 1km grid (1e6 source
283
+ // units here) puts the model back within a cell of the origin.
284
+ for (const payload of payloads) {
285
+ expect(Math.hypot(payload.flatTransformation[12], payload.flatTransformation[13], payload.flatTransformation[14])).toBeLessThan(1000);
286
+ }
287
+ });
288
+ test("near-origin metres model is not recentred (model-zero policy)", async () => {
289
+ const [payloads] = await emitForFixture({
290
+ siteOrigin: [10, 20, 0],
291
+ buildingZ: 0,
292
+ storeyElevations: [0, 3.5],
293
+ wallOffset: [8, 6],
294
+ }, 1);
295
+ for (const payload of payloads) {
296
+ // Inside LARGE_COORDINATE_BUDGET_M the policy recentres nothing,
297
+ // so the whole frame collapses to the Z-up -> Y-up normalize —
298
+ // which is exactly where the durable walk would put these.
299
+ expectMatrixClose(payload.flatTransformation, mat4MultiplyF64(NORMALIZE_MAT_F64, aabbBoxMatrix(payload.aabb)));
300
+ const centreX = (payload.aabb.min[0] + payload.aabb.max[0]) * 0.5;
301
+ expect(payload.flatTransformation[12]).toBeCloseTo(centreX, 9);
302
+ }
303
+ });
304
+ test("storey plates band on the building datum, not on bare elevation", async () => {
305
+ // Building datum 100m above world zero: Elevation says 0 and
306
+ // 3.5, but the plates belong at 100 and 103.5.
307
+ const [payloads, model] = await emitForFixture({
308
+ siteOrigin: [0, 0, 0],
309
+ buildingZ: 100,
310
+ storeyElevations: [0, 3.5],
311
+ wallOffset: [8, 6],
312
+ }, 1);
313
+ const plates = storeyPlates(payloads, model);
314
+ expect(plates).toHaveLength(2);
315
+ // Lower storey: floor at the placement, ceiling at the next
316
+ // storey's elevation delta above it.
317
+ expect(plates[0].aabb.min[2]).toBeCloseTo(100, 6);
318
+ expect(plates[0].aabb.max[2]).toBeCloseTo(103.5, 6);
319
+ // Upper storey: no next elevation, so MIN_EDGE thick.
320
+ expect(plates[1].aabb.min[2]).toBeCloseTo(103.5, 6);
321
+ expect(plates[1].aabb.max[2]).toBeCloseTo(104.5, 6);
322
+ });
323
+ test("storey plates keep their spacing when only Elevation states it", async () => {
324
+ // Every storey placement parked on the building datum, so the
325
+ // placement chain reports the same Z for both and Elevation is
326
+ // the only thing that separates them. Reading placement Z
327
+ // INSTEAD of elevation stacks both plates on 100; reading it as
328
+ // the datum elevation is measured from keeps them apart.
329
+ const [payloads, model] = await emitForFixture({
330
+ siteOrigin: [0, 0, 0],
331
+ buildingZ: 100,
332
+ storeyElevations: [0, 3.5],
333
+ wallOffset: [8, 6],
334
+ storeyPlacementZ: "datum",
335
+ }, 1);
336
+ const plates = storeyPlates(payloads, model);
337
+ expect(plates).toHaveLength(2);
338
+ expect(plates[0].aabb.min[2]).toBeCloseTo(100, 6);
339
+ expect(plates[1].aabb.min[2]).toBeCloseTo(103.5, 6);
340
+ });
341
+ // conway#517: the placement chain used to SUM Location translations
342
+ // and ignore rotation outright, so on a Revit export rotated to true
343
+ // north every sampled origin landed unrotated in raw model space while
344
+ // the durable meshes did not — the plate cloud read as a rotated ghost
345
+ // of the building. Both fixtures below fail against that composition.
346
+ describe("rotation-aware placement composition", () => {
347
+ /** Site rotated 30 deg about Z — Revit's true-north plan rotation. */
348
+ const ROTATED_SITE = {
349
+ siteOrigin: [0, 0, 0],
350
+ buildingZ: 0,
351
+ storeyElevations: [0, 3.5],
352
+ wallOffset: [8, 6],
353
+ siteRotation: { axis: "z", degrees: 30 },
354
+ };
355
+ /** Site tipped 30 deg about X, with the building datum 100 up. */
356
+ const TILTED_SITE = {
357
+ siteOrigin: [0, 0, 0],
358
+ buildingZ: 100,
359
+ storeyElevations: [0, 3.5],
360
+ wallOffset: [8, 6],
361
+ siteRotation: { axis: "x", degrees: 30 },
362
+ };
363
+ test("plan rotation: plate XY is the AABB of the ROTATED samples", async () => {
364
+ const [payloads, model] = await emitForFixture(ROTATED_SITE, 1);
365
+ const plates = storeyPlates(payloads, model);
366
+ expect(plates).toHaveLength(2);
367
+ // The two walls each storey contains, composed through the
368
+ // rotated site placement.
369
+ const cornerA = rotatePoint(ROTATED_SITE.siteRotation, [0, 0, 0]);
370
+ const cornerB = rotatePoint(ROTATED_SITE.siteRotation, [...ROTATED_SITE.wallOffset, 0]);
371
+ for (const plate of plates) {
372
+ expect(plate.aabb.min[0])
373
+ .toBeCloseTo(Math.min(cornerA[0], cornerB[0]), 6);
374
+ expect(plate.aabb.max[0])
375
+ .toBeCloseTo(Math.max(cornerA[0], cornerB[0]), 6);
376
+ expect(plate.aabb.min[1])
377
+ .toBeCloseTo(Math.min(cornerA[1], cornerB[1]), 6);
378
+ expect(plate.aabb.max[1])
379
+ .toBeCloseTo(Math.max(cornerA[1], cornerB[1]), 6);
380
+ }
381
+ // And specifically NOT the unrotated offset the translation-sum
382
+ // implementation produced: 6 m north instead of 9.2 m.
383
+ expect(plates[0].aabb.max[1])
384
+ .not.toBeCloseTo(ROTATED_SITE.wallOffset[1], 3);
385
+ });
386
+ test("tilt about X: storey floors band on the DATUM's world Z", async () => {
387
+ const [payloads, model] = await emitForFixture(TILTED_SITE, 1);
388
+ const plates = storeyPlates(payloads, model);
389
+ expect(plates).toHaveLength(2);
390
+ const rotation = TILTED_SITE.siteRotation;
391
+ const floorA = rotatePoint(rotation, [0, 0, 100]);
392
+ const floorB = rotatePoint(rotation, [...TILTED_SITE.wallOffset, 100]);
393
+ // Elevation is a length along the datum's own +Z, so a tilted
394
+ // datum puts the floor at cos(30) * the elevation, not at it.
395
+ expect(plates[0].aabb.min[2]).toBeCloseTo(floorA[2], 6);
396
+ expect(plates[1].aabb.min[2])
397
+ .toBeCloseTo(rotatePoint(rotation, [0, 0, 103.5])[2], 6);
398
+ // A Z-only fixture leaves the third matrix column at the
399
+ // identity; this one does not, so an Axis/RefDirection mixup
400
+ // shows up as Y bounds that never left zero.
401
+ expect(plates[0].aabb.min[1])
402
+ .toBeCloseTo(Math.min(floorA[1], floorB[1]), 6);
403
+ expect(plates[0].aabb.max[1])
404
+ .toBeCloseTo(Math.max(floorA[1], floorB[1]), 6);
405
+ // The translation-sum implementation put both floors at the
406
+ // bare elevations, 100 and 103.5.
407
+ expect(plates[0].aabb.min[2]).not.toBeCloseTo(100, 3);
408
+ expect(plates[1].aabb.min[2]).not.toBeCloseTo(103.5, 3);
409
+ });
410
+ test("an Axis with no RefDirection still yields a frame", async () => {
411
+ // Axis = world +X with RefDirection omitted: the IFC default
412
+ // RefDirection (1,0,0) is parallel to it, so a naive build finds a
413
+ // zero cross product. Falling all the way back to world axes there
414
+ // discards a perfectly good rotation; IFC's IfcFirstProjAxis
415
+ // substitutes a perpendicular reference instead, which sends local
416
+ // (a,b,c) to world (c,a,b).
417
+ const [payloads, model] = await emitForFixture({
418
+ siteOrigin: [0, 0, 0],
419
+ buildingZ: 0,
420
+ storeyElevations: [0, 3.5],
421
+ wallOffset: [8, 6],
422
+ siteAxes: [[1, 0, 0], void 0],
423
+ }, 1);
424
+ const plates = storeyPlates(payloads, model);
425
+ expect(plates).toHaveLength(2);
426
+ // Lower storey's walls: local (0,0,0) and (8,6,0) -> (0,0,0) and
427
+ // (0,8,6). X collapses, so the plate is MIN_EDGE thick about
428
+ // zero there; the identity fallback would have spanned 0..8.
429
+ const plate = plates[0].aabb;
430
+ expect((plate.min[0] + plate.max[0]) * 0.5).toBeCloseTo(0, 6);
431
+ expect(plate.max[0] - plate.min[0]).toBeCloseTo(1, 6);
432
+ expect(plate.max[1]).toBeCloseTo(8, 6);
433
+ expect(plate.max[2]).toBeCloseTo(6, 6);
434
+ });
435
+ test("a 2D relative placement does not break the chain", async () => {
436
+ // IfcLocalPlacement.RelativePlacement admits IfcAxis2Placement2D,
437
+ // whose field 1 is RefDirection (not Axis) and which has no field
438
+ // 2 at all. Reading the 3D direction fields unconditionally throws
439
+ // "too few fields in record"; that throw memoizes an undefined
440
+ // placement, and every DESCENDANT then composes in local
441
+ // coordinates — the site translation below silently disappears.
442
+ const [payloads, model] = await emitForFixture({
443
+ siteOrigin: [10, 20, 0],
444
+ buildingZ: 100,
445
+ storeyElevations: [0, 3.5],
446
+ wallOffset: [8, 6],
447
+ sitePlacement2D: true,
448
+ }, 1);
449
+ const plates = storeyPlates(payloads, model);
450
+ expect(plates).toHaveLength(2);
451
+ // The site's XY still reaches the storeys...
452
+ expect(plates[0].aabb.min[0]).toBeCloseTo(10, 6);
453
+ expect(plates[0].aabb.max[0]).toBeCloseTo(18, 6);
454
+ expect(plates[0].aabb.min[1]).toBeCloseTo(20, 6);
455
+ expect(plates[0].aabb.max[1]).toBeCloseTo(26, 6);
456
+ // ...and so does the building datum the elevations band on.
457
+ expect(plates[0].aabb.min[2]).toBeCloseTo(100, 6);
458
+ expect(plates[1].aabb.min[2]).toBeCloseTo(103.5, 6);
459
+ });
460
+ });
461
+ test("nothing emits `solid`", async () => {
462
+ const [payloads] = await emitForFixture(MILLIMETRE_GEOREFERENCED, MM_TO_M);
463
+ for (const payload of payloads) {
464
+ expect("solid" in payload).toBe(false);
465
+ }
466
+ });
467
+ });
@@ -0,0 +1,187 @@
1
+ import { ConwayGeometry } from "../../index.js";
2
+ import { ColumnarIndexSink } from "../../step/parsing/columnar_index.js";
3
+ import type { StepExternalByteStore } from "../../step/step_buffer_provider.js";
4
+ import { PreviewMeshPayload } from "./streamed_preview_channel.js";
5
+ /**
6
+ * Parse-time placed-mesh preview for a windowed (store-backed) open.
7
+ *
8
+ * Twin of {@link StreamedPreviewChannel}: same capture math and
9
+ * COORDINATE_TO_ORIGIN frame, same time-budgeted tick, but the prefix
10
+ * model pages product closures from `store` instead of a resident
11
+ * buffer. After each product the pins drop, so peak source residency
12
+ * stays the windowed LRU — not the file.
13
+ *
14
+ * It also runs the spatial-structure walk off its own prefix
15
+ * generations, so the building's skeleton goes up in the first seconds
16
+ * of a long parse rather than after it — see
17
+ * {@link maybeEmitEarlySpatialPlates_}.
18
+ */
19
+ export declare class StorePreviewChannel {
20
+ private readonly store_;
21
+ private readonly sink_;
22
+ private readonly conwaywasm_;
23
+ private readonly coordinateToOrigin_;
24
+ private readonly onMesh_;
25
+ private readonly maxUnits;
26
+ private readonly maxBytes;
27
+ private readonly firstGenerationMinRecords;
28
+ coordinationMatrix?: number[];
29
+ private stopped_;
30
+ private emittedUnits_;
31
+ private emittedBytes_;
32
+ private unitOrdinal_;
33
+ private lastInlineTick_;
34
+ private tickIntervalMs_;
35
+ private lastSnapshotRecords_;
36
+ private lastFailedSnapshotRecords_;
37
+ lastFailReason?: string;
38
+ private tickBudgetMs_;
39
+ private tickMaxAttempts_;
40
+ /** Set once a prefix-generation spatial walk has emitted a plate. */
41
+ private earlyPlatesEmitted_;
42
+ /**
43
+ * Whether those plates were composed under the walk's own fallback
44
+ * frame because no preview instance had latched one yet. They get one
45
+ * re-emission on a later generation once a real frame exists — see
46
+ * {@link maybeEmitEarlySpatialPlates_}.
47
+ */
48
+ private earlyPlatesUsedFallbackFrame_;
49
+ private readonly emittedGeometry_;
50
+ private generation_?;
51
+ /**
52
+ * @param store_ External source (OPFS / file).
53
+ * @param sink_ Live columnar sink the parse is filling.
54
+ * @param conwaywasm_ Shared wasm wrapper.
55
+ * @param coordinateToOrigin_ Open COORDINATE_TO_ORIGIN.
56
+ * @param onMesh_ Preview consumer.
57
+ * @param maxUnits Cap on products preview-extracted.
58
+ * @param maxBytes Cap on copied payload bytes.
59
+ * @param firstGenerationMinRecords Records before the first snapshot.
60
+ */
61
+ constructor(store_: StepExternalByteStore, sink_: ColumnarIndexSink<number>, conwaywasm_: ConwayGeometry, coordinateToOrigin_: boolean, onMesh_: (mesh: PreviewMeshPayload) => void, maxUnits?: number, maxBytes?: number, firstGenerationMinRecords?: number);
62
+ get capped(): boolean;
63
+ get emittedUnits(): number;
64
+ /** Products the current generation would run (test seam). */
65
+ get productCount(): number;
66
+ /**
67
+ * Plates the prefix-generation spatial walk emitted, 0 while it has
68
+ * not succeeded (see {@link maybeEmitEarlySpatialPlates_}).
69
+ */
70
+ get earlyPlateCount(): number;
71
+ /**
72
+ * One cadence-gated, time-budgeted tick. No-op until the interval
73
+ * elapses or the index can support a generation. Safe to call from
74
+ * parse progress.
75
+ *
76
+ * **Cadence and budget interact once, not twice.** The interval is
77
+ * measured tick-start to tick-start (`lastInlineTick_` is stamped
78
+ * before the work, as on the streamed channel), so a tick that spends
79
+ * its whole budget shortens the gap to the next one by that budget
80
+ * rather than adding to it. And the decay is charged only to ticks
81
+ * that actually attempted a product: a tick that found no generation —
82
+ * which is every tick through the opening seconds of a big parse, when
83
+ * the index has not yet reached FIRST_GENERATION_MIN_RECORDS — used to
84
+ * decay the interval anyway, so by the time there was anything to
85
+ * extract the cadence had already cooled toward
86
+ * TICK_INTERVAL_MAX_MS. Deliberately divergent from
87
+ * {@link StreamedPreviewChannel}, which decays unconditionally; the
88
+ * cost is that a channel which never finds a generation keeps probing
89
+ * at TICK_INTERVAL_MS, and a probe that finds nothing is a record
90
+ * count compared against two thresholds.
91
+ *
92
+ * @return {Promise<void>} Settles when this tick's products (if any)
93
+ * are captured.
94
+ */
95
+ maybeTickAsync(): Promise<void>;
96
+ /**
97
+ * Attempt products until the time budget or the attempt cap runs out,
98
+ * whichever comes first.
99
+ *
100
+ * @return {Promise<number>} Products attempted this tick.
101
+ */
102
+ private tickBudgeted_;
103
+ /**
104
+ * After parse: extract a short burst so small files (and prefixes
105
+ * that never crossed a progress tick) still emit placed meshes
106
+ * before open returns.
107
+ *
108
+ * @return {Promise<void>} Settles when the burst ends.
109
+ */
110
+ flushAsync(): Promise<void>;
111
+ /** Drop the throwaway prefix generation. Idempotent. */
112
+ stop(): void;
113
+ /**
114
+ * Test seam: drain until the current sink is exhausted or a cap hits.
115
+ *
116
+ * @return {Promise<void>} Settles when idle.
117
+ */
118
+ drainForTest(): Promise<void>;
119
+ /**
120
+ * @return {Promise<boolean>} True when a product was attempted.
121
+ */
122
+ private tickOnce_;
123
+ /**
124
+ * @return {Promise<boolean>} True when a generation with pending units exists.
125
+ */
126
+ private ensureGeneration_;
127
+ /**
128
+ * Put the spatial skeleton up from a PREFIX generation, seconds into
129
+ * the parse instead of after it (conway#518).
130
+ *
131
+ * The spatial records sit at the file head on Revit exports — on PSB
132
+ * `IFCSITE` is record #211 — and a prefix generation is already
133
+ * everything the walk needs: a columns snapshot over a windowed
134
+ * provider, with `prepareDemandExtraction(true)` done, which is what
135
+ * makes `getLinearScalingFactor()` report real units rather than 1.
136
+ * So the plates can lead the first extracted product rather than
137
+ * trailing the whole parse, which is what the store path's three
138
+ * stacked latency gates (one product per tick, early products
139
+ * deferring on late placements, the walk waiting for the full index)
140
+ * added up to: a blank screen through the first ~60% of a 16.7 s
141
+ * parse.
142
+ *
143
+ * **Runs at most once successfully, on the parse's cooperative path.**
144
+ * The walk is reused as-is, with no internal budget: it awaits a
145
+ * residency ensure per spatial node and per sampled product placement
146
+ * (PRODUCT_SAMPLE per node), so its cost tracks the prefix's spatial
147
+ * tree, not the file. On the first qualifying generation that tree is
148
+ * small by construction — the storeys exist but few
149
+ * `IfcRelContainedInSpatialStructure` do — which is the same property
150
+ * that makes these early plates coarse. Retries are bounded without a
151
+ * counter: generations only rebuild on a GENERATION_GROWTH_FACTOR
152
+ * doubling of the index, so there are O(log records) of them.
153
+ *
154
+ * **The end-of-parse walk in the proxy is the refresh, not a
155
+ * duplicate.** It re-emits the same expressIDs with contained-product
156
+ * samples the prefix did not hold and under the frame the channel
157
+ * latched, and the consumer contract is that an `aabb` payload
158
+ * REPLACES the prior plate for its expressID. Double emission is the
159
+ * design; see PreviewMeshPayload.
160
+ *
161
+ * **Known gap in that contract, and it is a gap, not a subtlety.**
162
+ * Replacement only reaches nodes the final walk still emits, and the
163
+ * emit set is not stable between the two: `aabbMostlyEqual` collapses
164
+ * a single-child wrapper (Project over Site over Building) once its
165
+ * box matches its child's, which a prefix generation's degenerate
166
+ * boxes may not yet do. A wrapper emitted here and collapsed there is
167
+ * never replaced and never removed — the payload contract has no
168
+ * delete — so its early box lingers as one small plate until Share
169
+ * tears the preview scenery down at load end. Bounded (the wrapper
170
+ * chain is a handful of nodes, and the collapse needs exactly one
171
+ * child), but real. Closing it properly needs either a delete/
172
+ * generation channel in the payload contract or an emit set the two
173
+ * walks agree on, and both are consumer-side changes.
174
+ *
175
+ * @param model The prefix model.
176
+ * @param extraction Its prepared extraction.
177
+ * @return {Promise<void>} Settles when the walk has run or been skipped.
178
+ */
179
+ private maybeEmitEarlySpatialPlates_;
180
+ private disposeGeneration_;
181
+ /**
182
+ * Copy newly extracted instances out of wasm — same placement math
183
+ * as {@link StreamedPreviewChannel}.
184
+ */
185
+ private captureNewInstances_;
186
+ }
187
+ //# sourceMappingURL=store_preview_channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store_preview_channel.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/store_preview_channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAY5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAGrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAU5E,OAAO,EACL,kBAAkB,EAEnB,MAAM,4BAA4B,CAAA;AAuCnC;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAoD1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAzDvC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAEpC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,0BAA0B,CAAI;IACtC,cAAc,CAAC,EAAE,MAAM,CAAA;IAMvB,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,gBAAgB,CAAoB;IAE5C,qEAAqE;IACrE,OAAO,CAAC,mBAAmB,CAAI;IAE/B;;;;;OAKG;IACH,OAAO,CAAC,6BAA6B,CAAQ;IAE7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAEvD,OAAO,CAAC,WAAW,CAAC,CAKnB;IAED;;;;;;;;;OASG;gBAEkB,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,iBAAiB,CAAE,MAAM,CAAE,EAClC,WAAW,EAAE,cAAc,EAC3B,mBAAmB,EAAE,OAAO,EAC5B,OAAO,EAAE,CAAE,IAAI,EAAE,kBAAkB,KAAM,IAAI,EAC7C,QAAQ,GAAE,MAAkC,EAC5C,QAAQ,GAAE,MAAkC,EAC5C,yBAAyB,GAAE,MAChB;IAGhC,IAAW,MAAM,IAAI,OAAO,CAG3B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,6DAA6D;IAC7D,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED;;;OAGG;IACH,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACU,cAAc,IAAI,OAAO,CAAE,IAAI,CAAE;IAyB9C;;;;;OAKG;YACW,aAAa;IAmB3B;;;;;;OAMG;IACU,UAAU,IAAI,OAAO,CAAE,IAAI,CAAE;IAuB1C,wDAAwD;IACjD,IAAI,IAAI,IAAI;IAMnB;;;;OAIG;IACU,YAAY,IAAI,OAAO,CAAE,IAAI,CAAE;IAmB5C;;OAEG;YACW,SAAS;IAyCvB;;OAEG;YACW,iBAAiB;IAgF/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmDG;YACW,4BAA4B;IAsE1C,OAAO,CAAC,kBAAkB;IAiB1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CA+H7B"}