@ccpc/math 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/index.cjs +226 -0
  2. package/package.json +19 -37
  3. package/types/algorithm/bool_operate/bool2d/bool2d.d.ts +22 -0
  4. package/types/algorithm/bool_operate/bool2d/difference.d.ts +9 -0
  5. package/types/algorithm/bool_operate/bool2d/intersect.d.ts +9 -0
  6. package/types/algorithm/bool_operate/bool2d/split.d.ts +3 -0
  7. package/types/algorithm/bool_operate/bool2d/union.d.ts +9 -0
  8. package/types/algorithm/bool_operate/bool2d/utils.d.ts +40 -0
  9. package/types/algorithm/bool_operate/bool_operate_clipper.d.ts +18 -0
  10. package/types/algorithm/bool_operate/polycurve_polygon_bool.d.ts +13 -0
  11. package/types/algorithm/bool_operate_2d.d.ts +67 -0
  12. package/types/algorithm/calc_d.d.ts +85 -0
  13. package/types/algorithm/calc_offset.d.ts +70 -0
  14. package/types/algorithm/calc_overlap.d.ts +56 -0
  15. package/types/algorithm/calc_project.d.ts +29 -0
  16. package/types/algorithm/calc_x.d.ts +215 -0
  17. package/types/algorithm/calculate_util/geometry_subdevide_infos.d.ts +73 -0
  18. package/types/algorithm/calculate_util/iterative_method.d.ts +30 -0
  19. package/types/algorithm/discrete/discrete_curve.d.ts +31 -0
  20. package/types/algorithm/discrete/discrete_refiner.d.ts +35 -0
  21. package/types/algorithm/discrete/discrete_surface.d.ts +74 -0
  22. package/types/algorithm/discrete/discrete_topology.d.ts +32 -0
  23. package/types/algorithm/discrete/discrete_util.d.ts +96 -0
  24. package/types/algorithm/discrete/grid_discrete_data.d.ts +58 -0
  25. package/types/algorithm/discrete/libtess.d.ts +12 -0
  26. package/types/algorithm/discrete/uniform_grid_discrete.d.ts +3 -0
  27. package/types/algorithm/distance/base_calc_distance/curves_distance_util.d.ts +20 -0
  28. package/types/algorithm/distance/base_calc_distance/define_of_calculate_distance.d.ts +12 -0
  29. package/types/algorithm/distance/curve2ds_distance/arc2s_distance.d.ts +17 -0
  30. package/types/algorithm/distance/curve2ds_distance/line2d_to_arc2d_distance.d.ts +17 -0
  31. package/types/algorithm/distance/curve2ds_distance/line2s_distance.d.ts +15 -0
  32. package/types/algorithm/distance/curve2s_distance.d.ts +15 -0
  33. package/types/algorithm/distance/curve3ds_distance/line3d_to_line3d_distance_paramed.d.ts +12 -0
  34. package/types/algorithm/distance/curve3s_distance.d.ts +31 -0
  35. package/types/algorithm/distance/pt_to_curve2_signed_distance.d.ts +17 -0
  36. package/types/algorithm/distance/pt_to_curve3_distance.d.ts +25 -0
  37. package/types/algorithm/distance/pt_to_curve_distance_info.d.ts +12 -0
  38. package/types/algorithm/distance/pt_to_surface_distance.d.ts +17 -0
  39. package/types/algorithm/distance/pts_to_curves_distance.d.ts +13 -0
  40. package/types/algorithm/distance/pts_to_pts_distance.d.ts +7 -0
  41. package/types/algorithm/geometry_merge.d.ts +22 -0
  42. package/types/algorithm/index.d.ts +32 -0
  43. package/types/algorithm/intersect/box_cut_line.d.ts +6 -0
  44. package/types/algorithm/intersect/curve_self_x.d.ts +13 -0
  45. package/types/algorithm/intersect/curve_surface_x.d.ts +34 -0
  46. package/types/algorithm/intersect/curve_surface_x_util.d.ts +32 -0
  47. package/types/algorithm/intersect/curves_x/circulars_x.d.ts +35 -0
  48. package/types/algorithm/intersect/curves_x/linear_circular_x.d.ts +40 -0
  49. package/types/algorithm/intersect/curves_x/lines_x.d.ts +17 -0
  50. package/types/algorithm/intersect/curves_x/lines_x_util.d.ts +4 -0
  51. package/types/algorithm/intersect/curves_x.d.ts +26 -0
  52. package/types/algorithm/intersect/curves_x_util.d.ts +35 -0
  53. package/types/algorithm/intersect/intersect_info_util.d.ts +9 -0
  54. package/types/algorithm/intersect/surface_self_x.d.ts +8 -0
  55. package/types/algorithm/intersect/surfaces_x.d.ts +53 -0
  56. package/types/algorithm/intersect/surfaces_x_complex.d.ts +29 -0
  57. package/types/algorithm/intersect/surfaces_x_special.d.ts +16 -0
  58. package/types/algorithm/intersect/surfaces_x_util.d.ts +41 -0
  59. package/types/algorithm/intersect/x_info.d.ts +65 -0
  60. package/types/algorithm/loop_property/loop-area.d.ts +49 -0
  61. package/types/algorithm/loop_property/loop-centroid.d.ts +40 -0
  62. package/types/algorithm/merge_geometry/halfplane.d.ts +24 -0
  63. package/types/algorithm/merge_geometry/merge_curve.d.ts +14 -0
  64. package/types/algorithm/merge_geometry/merge_point.d.ts +18 -0
  65. package/types/algorithm/mesh/clip_mesh.d.ts +27 -0
  66. package/types/algorithm/mesh/extrude_clip.d.ts +236 -0
  67. package/types/algorithm/mesh/mesh_assist.d.ts +21 -0
  68. package/types/algorithm/mesh/mesh_contour.d.ts +26 -0
  69. package/types/algorithm/mesh/mesh_util.d.ts +115 -0
  70. package/types/algorithm/offset/loop2d_offset.d.ts +22 -0
  71. package/types/algorithm/offset/polygon_offset.d.ts +27 -0
  72. package/types/algorithm/overlap/curve_surface_coincide.d.ts +6 -0
  73. package/types/algorithm/overlap/curves_colinear.d.ts +38 -0
  74. package/types/algorithm/overlap/curves_merge.d.ts +74 -0
  75. package/types/algorithm/overlap/curves_overlap.d.ts +34 -0
  76. package/types/algorithm/overlap/i_overlap.d.ts +9 -0
  77. package/types/algorithm/overlap/surfaces_coplaner.d.ts +5 -0
  78. package/types/algorithm/pattern/blocks2Geometry.d.ts +50 -0
  79. package/types/algorithm/pattern/math.d.ts +42 -0
  80. package/types/algorithm/pattern/pattern.d.ts +43 -0
  81. package/types/algorithm/pattern/pattern_util.d.ts +53 -0
  82. package/types/algorithm/pattern/pave.d.ts +33 -0
  83. package/types/algorithm/pj/curves_oj.d.ts +19 -0
  84. package/types/algorithm/pj/curves_pj.d.ts +19 -0
  85. package/types/algorithm/pj/loops_pj.d.ts +13 -0
  86. package/types/algorithm/pj/pj_type.d.ts +46 -0
  87. package/types/algorithm/pj/pt_loop_pj.d.ts +24 -0
  88. package/types/algorithm/pj/pt_polygon_pj.d.ts +18 -0
  89. package/types/algorithm/pj/pt_polygon_position_judger.d.ts +11 -0
  90. package/types/algorithm/position_judge.d.ts +72 -0
  91. package/types/algorithm/project/curve3d_to_plane_project.d.ts +11 -0
  92. package/types/algorithm/project/curve_curve_project.d.ts +9 -0
  93. package/types/algorithm/search_graph/iloops_polygonex.d.ts +28 -0
  94. package/types/algorithm/search_graph/loop_tree_node.d.ts +30 -0
  95. package/types/algorithm/search_graph/loops_to_loop_tree_search_graph.d.ts +25 -0
  96. package/types/algorithm/search_graph/polygon_polygonex.d.ts +13 -0
  97. package/types/algorithm/search_graph/search_loop2d.d.ts +20 -0
  98. package/types/algorithm/search_graph/search_polyline.d.ts +11 -0
  99. package/types/algorithm/search_graph.d.ts +45 -0
  100. package/types/algorithm/topology_edit.d.ts +10 -0
  101. package/types/base/box.d.ts +100 -0
  102. package/types/base/box2.d.ts +17 -0
  103. package/types/base/box3.d.ts +20 -0
  104. package/types/base/coord.d.ts +10 -0
  105. package/types/base/coord2.d.ts +92 -0
  106. package/types/base/coord3.d.ts +139 -0
  107. package/types/base/discrete_param.d.ts +28 -0
  108. package/types/base/euler.d.ts +102 -0
  109. package/types/base/geo_element.d.ts +54 -0
  110. package/types/base/interval.d.ts +122 -0
  111. package/types/base/ivector.d.ts +126 -0
  112. package/types/base/matrix.d.ts +108 -0
  113. package/types/base/matrix3.d.ts +118 -0
  114. package/types/base/matrix4.d.ts +166 -0
  115. package/types/base/matrix_util.d.ts +5 -0
  116. package/types/base/period_inverval.d.ts +127 -0
  117. package/types/base/quaternion.d.ts +39 -0
  118. package/types/base/tangent_cone.d.ts +11 -0
  119. package/types/base/tilt_box.d.ts +11 -0
  120. package/types/base/tol.d.ts +120 -0
  121. package/types/base/vec.d.ts +46 -0
  122. package/types/base/vec2.d.ts +146 -0
  123. package/types/base/vec3.d.ts +158 -0
  124. package/types/brep-src/algorithm/alg_const.d.ts +23 -0
  125. package/types/brep-src/algorithm/alg_types.d.ts +47 -0
  126. package/types/brep-src/algorithm/algorithm_util/base_define.d.ts +7 -0
  127. package/types/brep-src/algorithm/algorithm_util/body_base_util.d.ts +4 -0
  128. package/types/brep-src/algorithm/algorithm_util/curve_solid_analysis.d.ts +28 -0
  129. package/types/brep-src/algorithm/algorithm_util/face_face_analysis.d.ts +39 -0
  130. package/types/brep-src/algorithm/algorithm_util/search_wire.d.ts +8 -0
  131. package/types/brep-src/algorithm/body_builder/basic_body_builder.d.ts +15 -0
  132. package/types/brep-src/algorithm/body_builder/extrude_body.d.ts +23 -0
  133. package/types/brep-src/algorithm/body_builder/sweep_body.d.ts +37 -0
  134. package/types/brep-src/algorithm/body_builder.d.ts +36 -0
  135. package/types/brep-src/algorithm/body_util.d.ts +21 -0
  136. package/types/brep-src/algorithm/bool_sk/brep_converter.d.ts +11 -0
  137. package/types/brep-src/algorithm/brep_calc_project.d.ts +50 -0
  138. package/types/brep-src/algorithm/brep_calc_x.d.ts +34 -0
  139. package/types/brep-src/algorithm/brep_pj.d.ts +47 -0
  140. package/types/brep-src/algorithm/index.d.ts +5 -0
  141. package/types/brep-src/algorithm/intersect/curve_face_overlap.d.ts +10 -0
  142. package/types/brep-src/algorithm/intersect/face_face_intersect.d.ts +22 -0
  143. package/types/brep-src/algorithm/intersect/face_faces_intersect.d.ts +15 -0
  144. package/types/brep-src/algorithm/intersect/line_face_intersect.d.ts +16 -0
  145. package/types/brep-src/algorithm/podition_judge/body_pj.d.ts +25 -0
  146. package/types/brep-src/algorithm/podition_judge/extrude_pj.d.ts +28 -0
  147. package/types/brep-src/algorithm/podition_judge/pt_body_pj.d.ts +32 -0
  148. package/types/brep-src/algorithm/project/body_project.d.ts +8 -0
  149. package/types/brep-src/algorithm/project/face_project.d.ts +20 -0
  150. package/types/brep-src/algorithm/project/face_surface_project.d.ts +8 -0
  151. package/types/brep-src/algorithm/project/space_project.d.ts +26 -0
  152. package/types/brep-src/algorithm/project/space_project_simple.d.ts +10 -0
  153. package/types/brep-src/algorithm/project/view_project.d.ts +25 -0
  154. package/types/brep-src/algorithm/shell_builder/create_shell_from_curves.d.ts +38 -0
  155. package/types/brep-src/algorithm/shell_builder.d.ts +25 -0
  156. package/types/brep-src/algorithm/shell_edit/add_edges/add_edges.d.ts +14 -0
  157. package/types/brep-src/algorithm/shell_edit/add_edges/add_edges_core.d.ts +11 -0
  158. package/types/brep-src/algorithm/shell_edit/copy_faces.d.ts +20 -0
  159. package/types/brep-src/algorithm/shell_edit/delete_faces_edges/delete_edge.d.ts +9 -0
  160. package/types/brep-src/algorithm/shell_edit/delete_faces_edges/delete_faces_edges.d.ts +17 -0
  161. package/types/brep-src/algorithm/shell_edit/faces_boolean/faces_boolean.d.ts +19 -0
  162. package/types/brep-src/algorithm/shell_edit/faces_boolean/faces_shells_boolean.d.ts +13 -0
  163. package/types/brep-src/algorithm/shell_edit/faces_boolean/octree.d.ts +11 -0
  164. package/types/brep-src/algorithm/shell_edit/isolate_faces.d.ts +21 -0
  165. package/types/brep-src/algorithm/shell_edit/merge_connect_faces.d.ts +14 -0
  166. package/types/brep-src/algorithm/shell_edit/merge_edges.d.ts +8 -0
  167. package/types/brep-src/algorithm/shell_edit/move_operators/move_edges.d.ts +31 -0
  168. package/types/brep-src/algorithm/shell_edit/move_operators/move_faces.d.ts +14 -0
  169. package/types/brep-src/algorithm/shell_edit/operator/dispose_topo.d.ts +2 -0
  170. package/types/brep-src/algorithm/shell_edit/operator/merge_connect_edge.d.ts +3 -0
  171. package/types/brep-src/algorithm/shell_edit/operator/merge_connect_face.d.ts +2 -0
  172. package/types/brep-src/algorithm/shell_edit/operator/merge_overlap_edge.d.ts +3 -0
  173. package/types/brep-src/algorithm/shell_edit/operator/merge_shell.d.ts +11 -0
  174. package/types/brep-src/algorithm/shell_edit/operator/merge_vertex.d.ts +2 -0
  175. package/types/brep-src/algorithm/shell_edit/operator/split_edge.d.ts +4 -0
  176. package/types/brep-src/algorithm/shell_edit/operator/split_shell.d.ts +6 -0
  177. package/types/brep-src/algorithm/shell_edit/pull_push_face/pull_push_face.d.ts +18 -0
  178. package/types/brep-src/algorithm/shell_edit/pull_push_face/pull_push_face_core.d.ts +6 -0
  179. package/types/brep-src/algorithm/shell_edit/pull_push_face/pull_push_face_preview.d.ts +16 -0
  180. package/types/brep-src/algorithm/shell_edit/pull_push_face/pull_push_face_preview_core.d.ts +24 -0
  181. package/types/brep-src/algorithm/shell_edit/roundinng/2d_rounding.d.ts +22 -0
  182. package/types/brep-src/algorithm/shell_edit/shell_modeling_base.d.ts +10 -0
  183. package/types/brep-src/algorithm/shell_edit/shell_modeling_result.d.ts +21 -0
  184. package/types/brep-src/algorithm/shell_edit/smooth/detect_loop_util.d.ts +27 -0
  185. package/types/brep-src/algorithm/shell_edit/smooth/shell_modeling_util.d.ts +24 -0
  186. package/types/brep-src/algorithm/shell_edit/smooth/smooth_util.d.ts +22 -0
  187. package/types/brep-src/algorithm/shell_edit/split_edge.d.ts +10 -0
  188. package/types/brep-src/algorithm/shell_edit.d.ts +119 -0
  189. package/types/brep-src/algorithm/shell_valid/base_brep_topo_error.d.ts +176 -0
  190. package/types/brep-src/algorithm/shell_valid/diagnose_shell.d.ts +14 -0
  191. package/types/brep-src/brep/brep_body.d.ts +19 -0
  192. package/types/brep-src/brep/coedge3d.d.ts +83 -0
  193. package/types/brep-src/brep/edge.d.ts +96 -0
  194. package/types/brep-src/brep/face.d.ts +150 -0
  195. package/types/brep-src/brep/shell.d.ts +166 -0
  196. package/types/brep-src/brep/topo_object.d.ts +40 -0
  197. package/types/brep-src/brep/vertex.d.ts +48 -0
  198. package/types/brep-src/brep/wire.d.ts +66 -0
  199. package/types/brep-src/continuous/continuous_edge.d.ts +17 -0
  200. package/types/brep-src/continuous/continuous_face.d.ts +10 -0
  201. package/types/brep-src/continuous/continuous_util.d.ts +60 -0
  202. package/types/brep-src/continuous/continuous_uv.d.ts +24 -0
  203. package/types/brep-src/continuous/index.d.ts +4 -0
  204. package/types/brep-src/index.d.ts +14 -0
  205. package/types/brep-src/type_define/i_types.d.ts +46 -0
  206. package/types/brep-src/util/util.d.ts +23 -0
  207. package/types/conversion/units_conversion.d.ts +14 -0
  208. package/types/geometry/arc2d.d.ts +249 -0
  209. package/types/geometry/arc3d.d.ts +204 -0
  210. package/types/geometry/circle3d.d.ts +92 -0
  211. package/types/geometry/circular_surface.d.ts +52 -0
  212. package/types/geometry/coord_based_surface.d.ts +25 -0
  213. package/types/geometry/curve.d.ts +228 -0
  214. package/types/geometry/curve2.d.ts +62 -0
  215. package/types/geometry/curve3d.d.ts +66 -0
  216. package/types/geometry/cylinder.d.ts +73 -0
  217. package/types/geometry/discrete_arrow.d.ts +3 -0
  218. package/types/geometry/extend_curve2.d.ts +75 -0
  219. package/types/geometry/geometry2d.d.ts +35 -0
  220. package/types/geometry/geometry3d.d.ts +36 -0
  221. package/types/geometry/intersect_curve3.d.ts +90 -0
  222. package/types/geometry/ln2.d.ts +168 -0
  223. package/types/geometry/ln3.d.ts +152 -0
  224. package/types/geometry/nurbs_curve2.d.ts +106 -0
  225. package/types/geometry/nurbs_curve3.d.ts +191 -0
  226. package/types/geometry/offset_curve2.d.ts +63 -0
  227. package/types/geometry/offset_curve3.d.ts +97 -0
  228. package/types/geometry/offset_parameter_mapper.d.ts +72 -0
  229. package/types/geometry/plane.d.ts +109 -0
  230. package/types/geometry/polyline.d.ts +12 -0
  231. package/types/geometry/smooth_poly2.d.ts +78 -0
  232. package/types/geometry/smooth_poly3.d.ts +85 -0
  233. package/types/geometry/surface.d.ts +173 -0
  234. package/types/index.d.ts +78 -0
  235. package/types/io/obj_parser.d.ts +4 -0
  236. package/types/io/svgparser.d.ts +22 -0
  237. package/types/loader/loader.d.ts +23 -0
  238. package/types/loader/register_geo.d.ts +7 -0
  239. package/types/math/gauss_integration.d.ts +13 -0
  240. package/types/math/inv_bilinear.d.ts +33 -0
  241. package/types/solve_equations/cubic_equation.d.ts +7 -0
  242. package/types/solve_equations/linear_system.d.ts +6 -0
  243. package/types/solve_equations/nonlinear_system.d.ts +11 -0
  244. package/types/solve_equations/plurality.d.ts +9 -0
  245. package/types/solve_equations/polynomial_equation.d.ts +6 -0
  246. package/types/solve_equations/quadratic_equation.d.ts +6 -0
  247. package/types/solve_equations/quartic_equation.d.ts +6 -0
  248. package/types/solve_equations/solve_equation_util.d.ts +50 -0
  249. package/types/test_util/loop_generator.d.ts +21 -0
  250. package/types/topology/evolution_map.d.ts +90 -0
  251. package/types/topology/loop.d.ts +50 -0
  252. package/types/topology/polycurve.d.ts +109 -0
  253. package/types/topology/polygon.d.ts +118 -0
  254. package/types/topology/trimmed_surface.d.ts +136 -0
  255. package/types/type_define/const.d.ts +18 -0
  256. package/types/type_define/i_element.d.ts +9 -0
  257. package/types/type_define/i_element_type.d.ts +34 -0
  258. package/types/type_define/i_geometry.d.ts +191 -0
  259. package/types/type_define/i_types.d.ts +280 -0
  260. package/types/util/array_util.d.ts +8 -0
  261. package/types/util/assert.d.ts +21 -0
  262. package/types/util/clipper2_util.d.ts +5 -0
  263. package/types/util/clipper_format_converter.d.ts +21 -0
  264. package/types/util/clipper_util.d.ts +10 -0
  265. package/types/util/curve_util.d.ts +72 -0
  266. package/types/util/geom_util.d.ts +23 -0
  267. package/types/util/log.d.ts +19 -0
  268. package/types/util/math_error.d.ts +37 -0
  269. package/types/util/surface_util.d.ts +13 -0
  270. package/types/util/util.d.ts +18 -0
  271. package/types/util/uv_util.d.ts +68 -0
  272. package/types/verb/export_verb.d.ts +2 -0
  273. package/types/wasm/a2d.d.ts +19 -0
  274. package/types/wasm/bx2.d.ts +16 -0
  275. package/types/wasm/c2d.d.ts +29 -0
  276. package/types/wasm/elli.d.ts +19 -0
  277. package/types/wasm/grapher2d.d.ts +39 -0
  278. package/types/wasm/grapherutil.d.ts +9 -0
  279. package/types/wasm/l2d.d.ts +14 -0
  280. package/types/wasm/loader.d.ts +8 -0
  281. package/types/wasm/pt.d.ts +19 -0
  282. package/types/wasm/wasm-geom.d.ts +296 -0
  283. package/types/wasm/wasminstance.d.ts +19 -0
  284. package/types/wasm/wrapper.d.ts +82 -0
  285. package/README.md +0 -21
  286. package/dist/constants/geom_type.d.ts +0 -13
  287. package/dist/constants/geom_type.d.ts.map +0 -1
  288. package/dist/constants/geom_type.js +0 -17
  289. package/dist/constants/math_const.d.ts +0 -9
  290. package/dist/constants/math_const.d.ts.map +0 -1
  291. package/dist/constants/math_const.js +0 -12
  292. package/dist/core/box2.d.ts +0 -71
  293. package/dist/core/box2.d.ts.map +0 -1
  294. package/dist/core/box2.js +0 -243
  295. package/dist/core/coord2d.d.ts +0 -62
  296. package/dist/core/coord2d.d.ts.map +0 -1
  297. package/dist/core/coord2d.js +0 -155
  298. package/dist/core/geom_base.d.ts +0 -19
  299. package/dist/core/geom_base.d.ts.map +0 -1
  300. package/dist/core/geom_base.js +0 -18
  301. package/dist/core/mat3.d.ts +0 -101
  302. package/dist/core/mat3.d.ts.map +0 -1
  303. package/dist/core/mat3.js +0 -290
  304. package/dist/core/vec2.d.ts +0 -138
  305. package/dist/core/vec2.d.ts.map +0 -1
  306. package/dist/core/vec2.js +0 -297
  307. package/dist/curves/arc2.d.ts +0 -49
  308. package/dist/curves/arc2.d.ts.map +0 -1
  309. package/dist/curves/arc2.js +0 -265
  310. package/dist/curves/bspline2.d.ts +0 -150
  311. package/dist/curves/bspline2.d.ts.map +0 -1
  312. package/dist/curves/bspline2.js +0 -793
  313. package/dist/curves/circle2.d.ts +0 -42
  314. package/dist/curves/circle2.d.ts.map +0 -1
  315. package/dist/curves/circle2.js +0 -135
  316. package/dist/curves/circle_curve2.d.ts +0 -38
  317. package/dist/curves/circle_curve2.d.ts.map +0 -1
  318. package/dist/curves/circle_curve2.js +0 -112
  319. package/dist/curves/curve2.d.ts +0 -214
  320. package/dist/curves/curve2.d.ts.map +0 -1
  321. package/dist/curves/curve2.js +0 -238
  322. package/dist/curves/ellipse2.d.ts +0 -42
  323. package/dist/curves/ellipse2.d.ts.map +0 -1
  324. package/dist/curves/ellipse2.js +0 -125
  325. package/dist/curves/ellipse_arc2.d.ts +0 -49
  326. package/dist/curves/ellipse_arc2.d.ts.map +0 -1
  327. package/dist/curves/ellipse_arc2.js +0 -184
  328. package/dist/curves/ellipse_curve2.d.ts +0 -56
  329. package/dist/curves/ellipse_curve2.d.ts.map +0 -1
  330. package/dist/curves/ellipse_curve2.js +0 -262
  331. package/dist/curves/interval.d.ts +0 -112
  332. package/dist/curves/interval.d.ts.map +0 -1
  333. package/dist/curves/interval.js +0 -200
  334. package/dist/curves/line2.d.ts +0 -64
  335. package/dist/curves/line2.d.ts.map +0 -1
  336. package/dist/curves/line2.js +0 -193
  337. package/dist/curves/period_interval.d.ts +0 -129
  338. package/dist/curves/period_interval.d.ts.map +0 -1
  339. package/dist/curves/period_interval.js +0 -240
  340. package/dist/discretize/discretize_defaults.d.ts +0 -12
  341. package/dist/discretize/discretize_defaults.d.ts.map +0 -1
  342. package/dist/discretize/discretize_defaults.js +0 -12
  343. package/dist/discretize/discretize_engine.d.ts +0 -33
  344. package/dist/discretize/discretize_engine.d.ts.map +0 -1
  345. package/dist/discretize/discretize_engine.js +0 -347
  346. package/dist/discretize/discretize_errors.d.ts +0 -15
  347. package/dist/discretize/discretize_errors.d.ts.map +0 -1
  348. package/dist/discretize/discretize_errors.js +0 -30
  349. package/dist/discretize/discretize_options.d.ts +0 -18
  350. package/dist/discretize/discretize_options.d.ts.map +0 -1
  351. package/dist/discretize/discretize_options.js +0 -19
  352. package/dist/discretize/discretize_types.d.ts +0 -36
  353. package/dist/discretize/discretize_types.d.ts.map +0 -1
  354. package/dist/discretize/discretize_types.js +0 -1
  355. package/dist/discretize/internal/curve_guards.d.ts +0 -35
  356. package/dist/discretize/internal/curve_guards.d.ts.map +0 -1
  357. package/dist/discretize/internal/curve_guards.js +0 -62
  358. package/dist/discretize/internal/postprocess.d.ts +0 -5
  359. package/dist/discretize/internal/postprocess.d.ts.map +0 -1
  360. package/dist/discretize/internal/postprocess.js +0 -109
  361. package/dist/discretize/internal/sampling_utils.d.ts +0 -8
  362. package/dist/discretize/internal/sampling_utils.d.ts.map +0 -1
  363. package/dist/discretize/internal/sampling_utils.js +0 -36
  364. package/dist/discretize/register_builtin_strategies.d.ts +0 -3
  365. package/dist/discretize/register_builtin_strategies.d.ts.map +0 -1
  366. package/dist/discretize/register_builtin_strategies.js +0 -10
  367. package/dist/discretize/strategies/bspline_strategy.d.ts +0 -4
  368. package/dist/discretize/strategies/bspline_strategy.d.ts.map +0 -1
  369. package/dist/discretize/strategies/bspline_strategy.js +0 -115
  370. package/dist/discretize/strategies/circle_strategy.d.ts +0 -7
  371. package/dist/discretize/strategies/circle_strategy.d.ts.map +0 -1
  372. package/dist/discretize/strategies/circle_strategy.js +0 -55
  373. package/dist/discretize/strategies/ellipse_strategy.d.ts +0 -7
  374. package/dist/discretize/strategies/ellipse_strategy.d.ts.map +0 -1
  375. package/dist/discretize/strategies/ellipse_strategy.js +0 -86
  376. package/dist/discretize/strategies/line_strategy.d.ts +0 -4
  377. package/dist/discretize/strategies/line_strategy.d.ts.map +0 -1
  378. package/dist/discretize/strategies/line_strategy.js +0 -40
  379. package/dist/discretize/strategy_registry.d.ts +0 -9
  380. package/dist/discretize/strategy_registry.d.ts.map +0 -1
  381. package/dist/discretize/strategy_registry.js +0 -34
  382. package/dist/index.d.ts +0 -30
  383. package/dist/index.d.ts.map +0 -1
  384. package/dist/index.js +0 -24
  385. package/dist/intersections/analytic_x_algorithm.d.ts +0 -10
  386. package/dist/intersections/analytic_x_algorithm.d.ts.map +0 -1
  387. package/dist/intersections/analytic_x_algorithm.js +0 -83
  388. package/dist/intersections/curve_x_engine.d.ts +0 -9
  389. package/dist/intersections/curve_x_engine.d.ts.map +0 -1
  390. package/dist/intersections/curve_x_engine.js +0 -27
  391. package/dist/intersections/index.d.ts +0 -5
  392. package/dist/intersections/index.d.ts.map +0 -1
  393. package/dist/intersections/index.js +0 -11
  394. package/dist/intersections/internal/certification.d.ts +0 -34
  395. package/dist/intersections/internal/certification.d.ts.map +0 -1
  396. package/dist/intersections/internal/certification.js +0 -238
  397. package/dist/intersections/internal/interval_clipping.d.ts +0 -29
  398. package/dist/intersections/internal/interval_clipping.d.ts.map +0 -1
  399. package/dist/intersections/internal/interval_clipping.js +0 -123
  400. package/dist/intersections/internal/kind.d.ts +0 -4
  401. package/dist/intersections/internal/kind.d.ts.map +0 -1
  402. package/dist/intersections/internal/kind.js +0 -16
  403. package/dist/intersections/internal/pair.d.ts +0 -9
  404. package/dist/intersections/internal/pair.d.ts.map +0 -1
  405. package/dist/intersections/internal/pair.js +0 -14
  406. package/dist/intersections/internal/result.d.ts +0 -20
  407. package/dist/intersections/internal/result.d.ts.map +0 -1
  408. package/dist/intersections/internal/result.js +0 -125
  409. package/dist/intersections/internal/sampling.d.ts +0 -15
  410. package/dist/intersections/internal/sampling.d.ts.map +0 -1
  411. package/dist/intersections/internal/sampling.js +0 -131
  412. package/dist/intersections/internal/segment.d.ts +0 -32
  413. package/dist/intersections/internal/segment.d.ts.map +0 -1
  414. package/dist/intersections/internal/segment.js +0 -137
  415. package/dist/intersections/internal/tolerance.d.ts +0 -10
  416. package/dist/intersections/internal/tolerance.d.ts.map +0 -1
  417. package/dist/intersections/internal/tolerance.js +0 -20
  418. package/dist/intersections/intersector.d.ts +0 -6
  419. package/dist/intersections/intersector.d.ts.map +0 -1
  420. package/dist/intersections/intersector.js +0 -1
  421. package/dist/intersections/numeric_x_algorithm.d.ts +0 -10
  422. package/dist/intersections/numeric_x_algorithm.d.ts.map +0 -1
  423. package/dist/intersections/numeric_x_algorithm.js +0 -73
  424. package/dist/intersections/solvers/bspline_self_solver.d.ts +0 -7
  425. package/dist/intersections/solvers/bspline_self_solver.d.ts.map +0 -1
  426. package/dist/intersections/solvers/bspline_self_solver.js +0 -308
  427. package/dist/intersections/solvers/line_line_pair_solver.d.ts +0 -7
  428. package/dist/intersections/solvers/line_line_pair_solver.d.ts.map +0 -1
  429. package/dist/intersections/solvers/line_line_pair_solver.js +0 -35
  430. package/dist/intersections/solvers/pair_solvers.d.ts +0 -94
  431. package/dist/intersections/solvers/pair_solvers.d.ts.map +0 -1
  432. package/dist/intersections/solvers/pair_solvers.js +0 -1078
  433. package/dist/intersections/solvers/polyline_pair_intersector.d.ts +0 -51
  434. package/dist/intersections/solvers/polyline_pair_intersector.d.ts.map +0 -1
  435. package/dist/intersections/solvers/polyline_pair_intersector.js +0 -731
  436. package/dist/intersections/types.d.ts +0 -11
  437. package/dist/intersections/types.d.ts.map +0 -1
  438. package/dist/intersections/types.js +0 -1
  439. package/dist/serialize/dump_types.d.ts +0 -101
  440. package/dist/serialize/dump_types.d.ts.map +0 -1
  441. package/dist/serialize/dump_types.js +0 -5
  442. package/dist/serialize/geom_mgr.d.ts +0 -24
  443. package/dist/serialize/geom_mgr.d.ts.map +0 -1
  444. package/dist/serialize/geom_mgr.js +0 -30
  445. package/dist/types/type_define.d.ts +0 -29
  446. package/dist/types/type_define.d.ts.map +0 -1
  447. package/dist/types/type_define.js +0 -10
  448. package/dist/types/type_guard.d.ts +0 -46
  449. package/dist/types/type_guard.d.ts.map +0 -1
  450. package/dist/types/type_guard.js +0 -5
  451. package/dist/utils/math_error.d.ts +0 -16
  452. package/dist/utils/math_error.d.ts.map +0 -1
  453. package/dist/utils/math_error.js +0 -35
  454. package/dist/utils/math_utils.d.ts +0 -9
  455. package/dist/utils/math_utils.d.ts.map +0 -1
  456. package/dist/utils/math_utils.js +0 -25
  457. package/dist/utils/precision.d.ts +0 -29
  458. package/dist/utils/precision.d.ts.map +0 -1
  459. package/dist/utils/precision.js +0 -44
package/index.cjs ADDED
@@ -0,0 +1,226 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const uuid=require("uuid"),_=require("lodash"),earcut=require("earcut");function _mergeNamespaces(l,t){for(var e=0;e<t.length;e++){const n=t[e];if(typeof n!="string"&&!Array.isArray(n)){for(const s in n)if(s!=="default"&&!(s in l)){const r=Object.getOwnPropertyDescriptor(n,s);r&&Object.defineProperty(l,s,r.get?r:{enumerable:!0,get:()=>n[s]})}}}return Object.freeze(Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}))}class CONST{static{this.PI=Math.PI}static{this.PI2=Math.PI*2}static{this.PI_2=Math.PI/2}static{this.PI_4=Math.PI/4}static{this.PI_6=Math.PI/6}static{this.PI_16=Math.PI/16}static{this.NORMAL_ITER_NUM=20}static{this.MAX_ITER_NUM=200}static{this.PI_12=Math.PI/12}static{this.MAX_SUBDEVIDE_DEPTH=16}static{this.MAX_INTERSECTION_NUM=1e3}static{this.MODEL_MAX_LENGTH=1e6}static{this.APPROX_ARC_MIN=Math.PI/180}static{this.APPROX_ARC_MAX=Math.PI/18}static{this.MAX_INTEGER=1e100}static{this.MAX_NEG_INTEGER=-1e100}}class Tol{constructor(t=Tol.LENGTH,e=t,n=t*.1,s=Tol.EDGE_LENGTH_EPS){this.lengthEps=t,this.angleEps=e,this.processLengthEps=n,this.edgeLengthEps=s,this.lengthEps2=t*t,this.processLengthEps2=n*n,this.edgeLengthEps2=s*s}static{this.NUMBER=1e-6}static{this.NUMBER_2=Tol.NUMBER*Tol.NUMBER}static{this.LENGTH=1e-6}static{this.LENGTH_2=Tol.LENGTH*Tol.LENGTH}static{this.EDGE_LENGTH_EPS=.001}static{this.EDGE_LENGTH_EPS2=Tol.EDGE_LENGTH_EPS*Tol.EDGE_LENGTH_EPS}static{this.PROCESS_LENGTH_EPS=1e-7}static{this.ANGLE=1e-6}static{this.ROUGH_ANGLE_EPS=.001}static{this.DELTA_EPS=1e-10}static{this.NUMBER_CALC_EPS=1e-8}static{this.ZERO_JUDGE_EPS=1e-14}static{this.ZERO_JUDGE_EPS2=1e-28}static{this.CALCULATE_EPS=1e-12}static{this.CALCULATE_EPS2=Tol.CALCULATE_EPS*Tol.CALCULATE_EPS}static{this.CALCULATE_EPS4=Tol.CALCULATE_EPS2*Tol.CALCULATE_EPS2}static{this.CLIPPER_SCALE=1e8}static{this.DEFAULT=new Tol(Tol.LENGTH)}get numEps(){return this.angleEps}get numberEps(){return this.angleEps}areAnglesEqual(t,e){return Math.abs(t-e)<this.angleEps}areLengthEqual(t,e){return Math.abs(t-e)<this.lengthEps}areParamEqual(t,e){return Math.abs(t-e)<this.numberEps}isLengthZero(t){return Math.abs(t)<this.lengthEps}isSquareLengthZero(t){return t<this.lengthEps*this.lengthEps}isParamOnPeriodEnd(t,e=CONST.PI2){const n=t%e;return Math.abs(n)<this.numberEps||Math.abs(n+e)<this.numberEps}areParralel(t,e){const n=t.z||0,s=e.z||0,r=t.x*t.x+t.y*t.y+n*n,i=e.x*e.x+t.y*t.y+s*s,o=t.x*e.y-t.y*e.x,g=t.y*s-n*e.y,a=n*e.x-t.x*s;return(g*g+a*a+o*o)/(r*i)<Math.sin(this.angleEps)**2}areNear(t,e){const n=t.z||0,s=e.z||0,r=t.x-e.x,i=t.y-e.y,o=n-s;return r*r+i*i+o*o<this.lengthEps*this.lengthEps}}class Util{static degreeToRadian(t){return t*Math.PI/180}static radianToDegree(t){return t*180/Math.PI}static isNearlyEqual(t,e,n=Tol.NUMBER){return Math.abs(t-e)<=n}static isNearlySmaller(t,e,n=Tol.NUMBER){return t-e<-n}static isNearlySmallerOrEqual(t,e,n=Tol.NUMBER){return t-e<=n}static isNearlyBigger(t,e,n=Tol.NUMBER){return t-e>n}static isNearlyBiggerOrEqual(t,e,n=Tol.NUMBER){return t-e>=-n}static isNearly0(t,e=Tol.NUMBER){return Math.abs(t)<=e}static isInRange(t,e,n,s=Tol.NUMBER){return t-e>=-s&&t-n<=s}static randomInRange(t,e){return Math.random()*(e-t)+t}static sum(t){return t.reduce((e,n)=>e+n,0)}static clamp(t,e,n){return Math.max(e,Math.min(n,t))}static getUniqueOnes(t,e){const n=[];A:for(const s of t){for(const r of n)if(e(s,r))continue A;n.push(s)}return n}}var MathErrorType=(l=>(l.Input="input",l.Algorithm="algorithm",l.Geometry="geometry",l.Unimplemented="unimplemented",l.Unknown="unknown",l.Default="default",l.None="none",l))(MathErrorType||{});class MathError extends Error{constructor(t="",e="",n="default",s=[]){super(t),this._algorithm=e,this._type=n,this._params=s}static{this.showMutedWarn=!1}static assert(t,e,n,...s){if(!(t instanceof Function?t():t)){const i=new MathError(e,"",n,s);throw process.env.NODE_ENV!=="production"&&(i.message=i.fullMessage),i}}static warn(t,e,n,...s){if(process.env.NODE_ENV==="production")return;if(!(t instanceof Function?t():t)){const i=new MathError(e,"",n,s);i.message=i.fullMessage,console.warn(i.message,i.params)}}static mutedWarn(t,e,n,...s){if(process.env.NODE_ENV==="production"||!this.showMutedWarn)return;if(!(t instanceof Function?t():t)){const i=new MathError(e,"",n,s);i.message=i.fullMessage,console.warn(i.message,i.params)}}get algorithm(){return this._algorithm}set algorithm(t){this._algorithm=t}get type(){return this._type}set type(t){this._type=t}get name(){return this.constructor.name}get params(){return this._params}set params(t){this._params=t}get fullMessage(){let t=`${this.algorithm}(${this.type}) - ${this.message}
2
+ `;for(const e of this._params)t+=e instanceof Object?`${e.constructor.name}}
3
+ `:`${e}
4
+ `;return t}toString(){return this.fullMessage}}class MathAssert{static assert(t,e="error",...n){process.env.NODE_ENV==="development"&&MathError.assert(t,e,MathErrorType.Algorithm,...n)}static warn(t,e="error",...n){MathError.warn(t,e,MathErrorType.Algorithm,...n)}static mutedWarn(t,e="error",...n){MathError.mutedWarn(t,e,MathErrorType.Algorithm,...n)}}class Box{constructor(){this.makeEmpty()}expandByScalar(t){return this.min.multiply(t),this.max.multiply(t),this}setFromPoints(t){if(this.makeEmpty(),t)for(const e of t)this.expandByPoint(e);return this}getCenter(){return this.isValid()?this.min.clone().add(this.max).multiply(.5):(MathAssert.warn(!1,"box is not valid, get centerPt failure"),this.min.clone())}getSize(){return this.max.clone().subtract(this.min)}containsBox(t,e=Tol.LENGTH){return this.containsPt(t.min,e)&&this.containsPt(t.max,e)}intersectsBox(t,e=Tol.LENGTH){if(!this.isValid()||!t.isValid())return!1;for(let n=0;n<t.min.data.length;n++)if(Util.isNearlySmaller(this.max.data[n],t.min.data[n],e)||Util.isNearlyBigger(this.min.data[n],t.max.data[n],e))return!1;return!0}union(t){return t.isValid()?(this.expandByPoint(t.min),this.expandByPoint(t.max),this):this}isZeroSizeBox(){for(let t=0;t<this.max.data.length;t++)if(Math.abs(this.max.data[t]-this.min.data[t])<Tol.NUMBER)return!0;return!0}isValid(){for(let t=0;t<this.max.data.length;t++){if(!Number.isFinite(this.min.data[t])||!Number.isFinite(this.max.data[t])||Number.isNaN(this.min.data[t])||Number.isNaN(this.max.data[t]))return!1;if(!(Math.abs(this.min.data[t]-this.max.data[t])<Tol.NUMBER)&&this.min.data[t]>this.max.data[t])return!1}return!0}equals(t,e=Tol.LENGTH){return this.min.equals(t.min,e)&&this.max.equals(t.max,e)}translate(t){return this.min.add(t),this.max.add(t),this}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}}function getDefaultExportFromCjs(l){return l&&l.__esModule&&Object.prototype.hasOwnProperty.call(l,"default")?l.default:l}var numeric1_2_6={},hasRequiredNumeric1_2_6;function requireNumeric1_2_6(){return hasRequiredNumeric1_2_6||(hasRequiredNumeric1_2_6=1,(function(exports$1){var numeric=exports$1;typeof globalThis<"u"&&(globalThis.numeric=numeric),numeric.version="1.2.6",numeric.bench=function(t,e){var n,s,r,i;for(typeof e>"u"&&(e=15),r=.5,n=new Date;;){for(r*=2,i=r;i>3;i-=4)t(),t(),t(),t();for(;i>0;)t(),i--;if(s=new Date,s-n>e)break}for(i=r;i>3;i-=4)t(),t(),t(),t();for(;i>0;)t(),i--;return s=new Date,1e3*(3*r-1)/(s-n)},numeric._myIndexOf=(function(t){var e=this.length,n;for(n=0;n<e;++n)if(this[n]===t)return n;return-1}),numeric.myIndexOf=Array.prototype.indexOf?Array.prototype.indexOf:numeric._myIndexOf,numeric.Function=Function,numeric.precision=4,numeric.largeArray=50,numeric.prettyPrint=function(t){function e(r){if(r===0)return"0";if(isNaN(r))return"NaN";if(r<0)return"-"+e(-r);if(isFinite(r)){var i=Math.floor(Math.log(r)/Math.log(10)),o=r/Math.pow(10,i),g=o.toPrecision(numeric.precision);return parseFloat(g)===10&&(i++,o=1,g=o.toPrecision(numeric.precision)),parseFloat(g).toString()+"e"+i.toString()}return"Infinity"}var n=[];function s(r){var i;if(typeof r>"u")return n.push(Array(numeric.precision+8).join(" ")),!1;if(typeof r=="string")return n.push('"'+r+'"'),!1;if(typeof r=="boolean")return n.push(r.toString()),!1;if(typeof r=="number"){var o=e(r),g=r.toPrecision(numeric.precision),a=parseFloat(r.toString()).toString(),I=[o,g,a,parseFloat(g).toString(),parseFloat(a).toString()];for(i=1;i<I.length;i++)I[i].length<o.length&&(o=I[i]);return n.push(Array(numeric.precision+8-o.length).join(" ")+o),!1}if(r===null)return n.push("null"),!1;if(typeof r=="function"){n.push(r.toString());var c=!1;for(i in r)r.hasOwnProperty(i)&&(c?n.push(`,
5
+ `):n.push(`
6
+ {`),c=!0,n.push(i),n.push(`:
7
+ `),s(r[i]));return c&&n.push(`}
8
+ `),!0}if(r instanceof Array){if(r.length>numeric.largeArray)return n.push("...Large Array..."),!0;var c=!1;for(n.push("["),i=0;i<r.length;i++)i>0&&(n.push(","),c&&n.push(`
9
+ `)),c=s(r[i]);return n.push("]"),!0}n.push("{");var c=!1;for(i in r)r.hasOwnProperty(i)&&(c&&n.push(`,
10
+ `),c=!0,n.push(i),n.push(`:
11
+ `),s(r[i]));return n.push("}"),!0}return s(t),n.join("")},numeric.parseDate=function(t){function e(n){if(typeof n=="string")return Date.parse(n.replace(/-/g,"/"));if(!(n instanceof Array))throw new Error("parseDate: parameter must be arrays of strings");var s=[],r;for(r=0;r<n.length;r++)s[r]=e(n[r]);return s}return e(t)},numeric.parseFloat=function(t){function e(n){if(typeof n=="string")return parseFloat(n);if(!(n instanceof Array))throw new Error("parseFloat: parameter must be arrays of strings");var s=[],r;for(r=0;r<n.length;r++)s[r]=e(n[r]);return s}return e(t)},numeric.parseCSV=function(t){var e=t.split(`
12
+ `),n,s,r=[],i=/(([^'",]*)|('[^']*')|("[^"]*")),/g,o=/^\s*(([+-]?[0-9]+(\.[0-9]*)?(e[+-]?[0-9]+)?)|([+-]?[0-9]*(\.[0-9]+)?(e[+-]?[0-9]+)?))\s*$/,g=function(E){return E.substr(0,E.length-1)},a=0;for(s=0;s<e.length;s++){var I=(e[s]+",").match(i),c;if(I.length>0){for(r[a]=[],n=0;n<I.length;n++)c=g(I[n]),o.test(c)?r[a][n]=parseFloat(c):r[a][n]=c;a++}}return r},numeric.toCSV=function(t){var e=numeric.dim(t),n,s,r,i,o;for(r=e[0],e[1],o=[],n=0;n<r;n++){for(i=[],s=0;s<r;s++)i[s]=t[n][s].toString();o[n]=i.join(", ")}return o.join(`
13
+ `)+`
14
+ `},numeric.getURL=function(t){var e=new XMLHttpRequest;return e.open("GET",t,!1),e.send(),e},numeric.imageURL=function(t){function e(y){var M=y.length,N,S,R,U,b,G,O,H,z="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",tA="";for(N=0;N<M;N+=3)S=y[N],R=y[N+1],U=y[N+2],b=S>>2,G=((S&3)<<4)+(R>>4),O=((R&15)<<2)+(U>>6),H=U&63,N+1>=M?O=H=64:N+2>=M&&(H=64),tA+=z.charAt(b)+z.charAt(G)+z.charAt(O)+z.charAt(H);return tA}function n(y,M,N){typeof M>"u"&&(M=0),typeof N>"u"&&(N=y.length);var S=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],R=-1,U=0;y.length;var b;for(b=M;b<N;b++)U=(R^y[b])&255,R=R>>>8^S[U];return R^-1}var s=t[0].length,r=t[0][0].length,i,o,g,a,I,c,E,u,Q,p,w=[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,r>>24&255,r>>16&255,r>>8&255,r&255,s>>24&255,s>>16&255,s>>8&255,s&255,8,2,0,0,0,-1,-2,-3,-4,-5,-6,-7,-8,73,68,65,84,8,29];for(p=n(w,12,29),w[29]=p>>24&255,w[30]=p>>16&255,w[31]=p>>8&255,w[32]=p&255,i=1,o=0,E=0;E<s;E++){for(E<s-1?w.push(0):w.push(1),I=3*r+1+(E===0)&255,c=3*r+1+(E===0)>>8&255,w.push(I),w.push(c),w.push(~I&255),w.push(~c&255),E===0&&w.push(0),u=0;u<r;u++)for(g=0;g<3;g++)I=t[g][E][u],I>255?I=255:I<0?I=0:I=Math.round(I),i=(i+I)%65521,o=(o+i)%65521,w.push(I);w.push(0)}return Q=(o<<16)+i,w.push(Q>>24&255),w.push(Q>>16&255),w.push(Q>>8&255),w.push(Q&255),a=w.length-41,w[33]=a>>24&255,w[34]=a>>16&255,w[35]=a>>8&255,w[36]=a&255,p=n(w,37),w.push(p>>24&255),w.push(p>>16&255),w.push(p>>8&255),w.push(p&255),w.push(0),w.push(0),w.push(0),w.push(0),w.push(73),w.push(69),w.push(78),w.push(68),w.push(174),w.push(66),w.push(96),w.push(130),"data:image/png;base64,"+e(w)},numeric._dim=function(t){for(var e=[];typeof t=="object";)e.push(t.length),t=t[0];return e},numeric.dim=function(t){var e,n;return typeof t=="object"?(e=t[0],typeof e=="object"?(n=e[0],typeof n=="object"?numeric._dim(t):[t.length,e.length]):[t.length]):[]},numeric.mapreduce=function(t,e){return Function("x","accum","_s","_k",'if(typeof accum === "undefined") accum = '+e+`;
15
+ if(typeof x === "number") { var xi = x; `+t+`; return accum; }
16
+ if(typeof _s === "undefined") _s = numeric.dim(x);
17
+ if(typeof _k === "undefined") _k = 0;
18
+ var _n = _s[_k];
19
+ var i,xi;
20
+ if(_k < _s.length-1) {
21
+ for(i=_n-1;i>=0;i--) {
22
+ accum = arguments.callee(x[i],accum,_s,_k+1);
23
+ } return accum;
24
+ }
25
+ for(i=_n-1;i>=1;i-=2) {
26
+ xi = x[i];
27
+ `+t+`;
28
+ xi = x[i-1];
29
+ `+t+`;
30
+ }
31
+ if(i === 0) {
32
+ xi = x[i];
33
+ `+t+`
34
+ }
35
+ return accum;`)},numeric.mapreduce2=function(t,e){return Function("x",`var n = x.length;
36
+ var i,xi;
37
+ `+e+`;
38
+ for(i=n-1;i!==-1;--i) {
39
+ xi = x[i];
40
+ `+t+`;
41
+ }
42
+ return accum;`)},numeric.same=function l(t,e){var n,s;if(!(t instanceof Array)||!(e instanceof Array)||(s=t.length,s!==e.length))return!1;for(n=0;n<s;n++)if(t[n]!==e[n])if(typeof t[n]=="object"){if(!l(t[n],e[n]))return!1}else return!1;return!0},numeric.rep=function(t,e,n){typeof n>"u"&&(n=0);var s=t[n],r=Array(s),i;if(n===t.length-1){for(i=s-2;i>=0;i-=2)r[i+1]=e,r[i]=e;return i===-1&&(r[0]=e),r}for(i=s-1;i>=0;i--)r[i]=numeric.rep(t,e,n+1);return r},numeric.dotMMsmall=function(t,e){var n,s,r,i,o,g,a,I,c,E,u;for(i=t.length,o=e.length,g=e[0].length,a=Array(i),n=i-1;n>=0;n--){for(I=Array(g),c=t[n],r=g-1;r>=0;r--){for(E=c[o-1]*e[o-1][r],s=o-2;s>=1;s-=2)u=s-1,E+=c[s]*e[s][r]+c[u]*e[u][r];s===0&&(E+=c[0]*e[0][r]),I[r]=E}a[n]=I}return a},numeric._getCol=function(t,e,n){var s=t.length,r;for(r=s-1;r>0;--r)n[r]=t[r][e],--r,n[r]=t[r][e];r===0&&(n[0]=t[0][e])},numeric.dotMMbig=function(t,e){var n=numeric._getCol,s=e.length,r=Array(s),i=t.length,o=e[0].length,g=new Array(i),a,I=numeric.dotVV,c,E;for(--s,--i,c=i;c!==-1;--c)g[c]=Array(o);for(--o,c=o;c!==-1;--c)for(n(e,c,r),E=i;E!==-1;--E)a=t[E],g[E][c]=I(a,r);return g},numeric.dotMV=function(t,e){var n=t.length;e.length;var s,r=Array(n),i=numeric.dotVV;for(s=n-1;s>=0;s--)r[s]=i(t[s],e);return r},numeric.dotVM=function(t,e){var n,s,r,i,o,g,a;for(r=t.length,i=e[0].length,o=Array(i),s=i-1;s>=0;s--){for(g=t[r-1]*e[r-1][s],n=r-2;n>=1;n-=2)a=n-1,g+=t[n]*e[n][s]+t[a]*e[a][s];n===0&&(g+=t[0]*e[0][s]),o[s]=g}return o},numeric.dotVV=function(t,e){var n,s=t.length,r,i=t[s-1]*e[s-1];for(n=s-2;n>=1;n-=2)r=n-1,i+=t[n]*e[n]+t[r]*e[r];return n===0&&(i+=t[0]*e[0]),i},numeric.dot=function(t,e){var n=numeric.dim;switch(n(t).length*1e3+n(e).length){case 2002:return e.length<10?numeric.dotMMsmall(t,e):numeric.dotMMbig(t,e);case 2001:return numeric.dotMV(t,e);case 1002:return numeric.dotVM(t,e);case 1001:return numeric.dotVV(t,e);case 1e3:return numeric.mulVS(t,e);case 1:return numeric.mulSV(t,e);case 0:return t*e;default:throw new Error("numeric.dot only works on vectors and matrices")}},numeric.diag=function(t){var e,n,s,r=t.length,i=Array(r),o;for(e=r-1;e>=0;e--){for(o=Array(r),n=e+2,s=r-1;s>=n;s-=2)o[s]=0,o[s-1]=0;for(s>e&&(o[s]=0),o[e]=t[e],s=e-1;s>=1;s-=2)o[s]=0,o[s-1]=0;s===0&&(o[0]=0),i[e]=o}return i},numeric.getDiag=function(l){var t=Math.min(l.length,l[0].length),e,n=Array(t);for(e=t-1;e>=1;--e)n[e]=l[e][e],--e,n[e]=l[e][e];return e===0&&(n[0]=l[0][0]),n},numeric.identity=function(t){return numeric.diag(numeric.rep([t],1))},numeric.pointwise=function(t,e,n){typeof n>"u"&&(n="");var s=[],r,i=/\[i\]$/,o,g="",a=!1;for(r=0;r<t.length;r++)i.test(t[r])?(o=t[r].substring(0,t[r].length-3),g=o):o=t[r],o==="ret"&&(a=!0),s.push(o);return s[t.length]="_s",s[t.length+1]="_k",s[t.length+2]='if(typeof _s === "undefined") _s = numeric.dim('+g+`);
43
+ if(typeof _k === "undefined") _k = 0;
44
+ var _n = _s[_k];
45
+ var i`+(a?"":", ret = Array(_n)")+`;
46
+ if(_k < _s.length-1) {
47
+ for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(`+t.join(",")+`,_s,_k+1);
48
+ return ret;
49
+ }
50
+ `+n+`
51
+ for(i=_n-1;i!==-1;--i) {
52
+ `+e+`
53
+ }
54
+ return ret;`,Function.apply(null,s)},numeric.pointwise2=function(t,e,n){typeof n>"u"&&(n="");var s=[],r,i=/\[i\]$/,o,g="",a=!1;for(r=0;r<t.length;r++)i.test(t[r])?(o=t[r].substring(0,t[r].length-3),g=o):o=t[r],o==="ret"&&(a=!0),s.push(o);return s[t.length]="var _n = "+g+`.length;
55
+ var i`+(a?"":", ret = Array(_n)")+`;
56
+ `+n+`
57
+ for(i=_n-1;i!==-1;--i) {
58
+ `+e+`
59
+ }
60
+ return ret;`,Function.apply(null,s)},numeric._biforeach=(function l(t,e,n,s,r){if(s===n.length-1){r(t,e);return}var i,o=n[s];for(i=o-1;i>=0;i--)l(typeof t=="object"?t[i]:t,typeof e=="object"?e[i]:e,n,s+1,r)}),numeric._biforeach2=(function l(t,e,n,s,r){if(s===n.length-1)return r(t,e);var i,o=n[s],g=Array(o);for(i=o-1;i>=0;--i)g[i]=l(typeof t=="object"?t[i]:t,typeof e=="object"?e[i]:e,n,s+1,r);return g}),numeric._foreach=(function l(t,e,n,s){if(n===e.length-1){s(t);return}var r,i=e[n];for(r=i-1;r>=0;r--)l(t[r],e,n+1,s)}),numeric._foreach2=(function l(t,e,n,s){if(n===e.length-1)return s(t);var r,i=e[n],o=Array(i);for(r=i-1;r>=0;r--)o[r]=l(t[r],e,n+1,s);return o}),numeric.ops2={add:"+",sub:"-",mul:"*",div:"/",mod:"%",and:"&&",or:"||",eq:"===",neq:"!==",lt:"<",gt:">",leq:"<=",geq:">=",band:"&",bor:"|",bxor:"^",lshift:"<<",rshift:">>",rrshift:">>>"},numeric.opseq={addeq:"+=",subeq:"-=",muleq:"*=",diveq:"/=",modeq:"%=",lshifteq:"<<=",rshifteq:">>=",rrshifteq:">>>=",bandeq:"&=",boreq:"|=",bxoreq:"^="},numeric.mathfuns=["abs","acos","asin","atan","ceil","cos","exp","floor","log","round","sin","sqrt","tan","isNaN","isFinite"],numeric.mathfuns2=["atan2","pow","max","min"],numeric.ops1={neg:"-",not:"!",bnot:"~",clone:""},numeric.mapreducers={any:["if(xi) return true;","var accum = false;"],all:["if(!xi) return false;","var accum = true;"],sum:["accum += xi;","var accum = 0;"],prod:["accum *= xi;","var accum = 1;"],norm2Squared:["accum += xi*xi;","var accum = 0;"],norminf:["accum = max(accum,abs(xi));","var accum = 0, max = Math.max, abs = Math.abs;"],norm1:["accum += abs(xi)","var accum = 0, abs = Math.abs;"],sup:["accum = max(accum,xi);","var accum = -Infinity, max = Math.max;"],inf:["accum = min(accum,xi);","var accum = Infinity, min = Math.min;"]},(function(){var l,t;for(l=0;l<numeric.mathfuns2.length;++l)t=numeric.mathfuns2[l],numeric.ops2[t]=t;for(l in numeric.ops2)if(numeric.ops2.hasOwnProperty(l)){t=numeric.ops2[l];var e,n,s="";numeric.myIndexOf.call(numeric.mathfuns2,l)!==-1?(s="var "+t+" = Math."+t+`;
61
+ `,e=function(r,i,o){return r+" = "+t+"("+i+","+o+")"},n=function(r,i){return r+" = "+t+"("+r+","+i+")"}):(e=function(r,i,o){return r+" = "+i+" "+t+" "+o},numeric.opseq.hasOwnProperty(l+"eq")?n=function(r,i){return r+" "+t+"= "+i}:n=function(r,i){return r+" = "+r+" "+t+" "+i}),numeric[l+"VV"]=numeric.pointwise2(["x[i]","y[i]"],e("ret[i]","x[i]","y[i]"),s),numeric[l+"SV"]=numeric.pointwise2(["x","y[i]"],e("ret[i]","x","y[i]"),s),numeric[l+"VS"]=numeric.pointwise2(["x[i]","y"],e("ret[i]","x[i]","y"),s),numeric[l]=Function(`var n = arguments.length, i, x = arguments[0], y;
62
+ var VV = numeric.`+l+"VV, VS = numeric."+l+"VS, SV = numeric."+l+`SV;
63
+ var dim = numeric.dim;
64
+ for(i=1;i!==n;++i) {
65
+ y = arguments[i];
66
+ if(typeof x === "object") {
67
+ if(typeof y === "object") x = numeric._biforeach2(x,y,dim(x),0,VV);
68
+ else x = numeric._biforeach2(x,y,dim(x),0,VS);
69
+ } else if(typeof y === "object") x = numeric._biforeach2(x,y,dim(y),0,SV);
70
+ else `+n("x","y")+`
71
+ }
72
+ return x;
73
+ `),numeric[t]=numeric[l],numeric[l+"eqV"]=numeric.pointwise2(["ret[i]","x[i]"],n("ret[i]","x[i]"),s),numeric[l+"eqS"]=numeric.pointwise2(["ret[i]","x"],n("ret[i]","x"),s),numeric[l+"eq"]=Function(`var n = arguments.length, i, x = arguments[0], y;
74
+ var V = numeric.`+l+"eqV, S = numeric."+l+`eqS
75
+ var s = numeric.dim(x);
76
+ for(i=1;i!==n;++i) {
77
+ y = arguments[i];
78
+ if(typeof y === "object") numeric._biforeach(x,y,s,0,V);
79
+ else numeric._biforeach(x,y,s,0,S);
80
+ }
81
+ return x;
82
+ `)}for(l=0;l<numeric.mathfuns2.length;++l)t=numeric.mathfuns2[l],delete numeric.ops2[t];for(l=0;l<numeric.mathfuns.length;++l)t=numeric.mathfuns[l],numeric.ops1[t]=t;for(l in numeric.ops1)numeric.ops1.hasOwnProperty(l)&&(s="",t=numeric.ops1[l],numeric.myIndexOf.call(numeric.mathfuns,l)!==-1&&Math.hasOwnProperty(t)&&(s="var "+t+" = Math."+t+`;
83
+ `),numeric[l+"eqV"]=numeric.pointwise2(["ret[i]"],"ret[i] = "+t+"(ret[i]);",s),numeric[l+"eq"]=Function("x",'if(typeof x !== "object") return '+t+`x
84
+ var i;
85
+ var V = numeric.`+l+`eqV;
86
+ var s = numeric.dim(x);
87
+ numeric._foreach(x,s,0,V);
88
+ return x;
89
+ `),numeric[l+"V"]=numeric.pointwise2(["x[i]"],"ret[i] = "+t+"(x[i]);",s),numeric[l]=Function("x",'if(typeof x !== "object") return '+t+`(x)
90
+ var i;
91
+ var V = numeric.`+l+`V;
92
+ var s = numeric.dim(x);
93
+ return numeric._foreach2(x,s,0,V);
94
+ `));for(l=0;l<numeric.mathfuns.length;++l)t=numeric.mathfuns[l],delete numeric.ops1[t];for(l in numeric.mapreducers)numeric.mapreducers.hasOwnProperty(l)&&(t=numeric.mapreducers[l],numeric[l+"V"]=numeric.mapreduce2(t[0],t[1]),numeric[l]=Function("x","s","k",t[1]+`if(typeof x !== "object") { xi = x;
95
+ `+t[0]+`;
96
+ return accum;
97
+ }if(typeof s === "undefined") s = numeric.dim(x);
98
+ if(typeof k === "undefined") k = 0;
99
+ if(k === s.length-1) return numeric.`+l+`V(x);
100
+ var xi;
101
+ var n = x.length, i;
102
+ for(i=n-1;i!==-1;--i) {
103
+ xi = arguments.callee(x[i]);
104
+ `+t[0]+`;
105
+ }
106
+ return accum;
107
+ `))})(),numeric.truncVV=numeric.pointwise(["x[i]","y[i]"],"ret[i] = round(x[i]/y[i])*y[i];","var round = Math.round;"),numeric.truncVS=numeric.pointwise(["x[i]","y"],"ret[i] = round(x[i]/y)*y;","var round = Math.round;"),numeric.truncSV=numeric.pointwise(["x","y[i]"],"ret[i] = round(x/y[i])*y[i];","var round = Math.round;"),numeric.trunc=function(t,e){return typeof t=="object"?typeof e=="object"?numeric.truncVV(t,e):numeric.truncVS(t,e):typeof e=="object"?numeric.truncSV(t,e):Math.round(t/e)*e},numeric.inv=function(p){var e=numeric.dim(p),n=Math.abs,s=e[0],r=e[1],i=numeric.clone(p),o,g,a=numeric.identity(s),I,c,E,u,Q,p;for(u=0;u<r;++u){var w=-1,y=-1;for(E=u;E!==s;++E)Q=n(i[E][u]),Q>y&&(w=E,y=Q);for(g=i[w],i[w]=i[u],i[u]=g,c=a[w],a[w]=a[u],a[u]=c,p=g[u],Q=u;Q!==r;++Q)g[Q]/=p;for(Q=r-1;Q!==-1;--Q)c[Q]/=p;for(E=s-1;E!==-1;--E)if(E!==u){for(o=i[E],I=a[E],p=o[u],Q=u+1;Q!==r;++Q)o[Q]-=g[Q]*p;for(Q=r-1;Q>0;--Q)I[Q]-=c[Q]*p,--Q,I[Q]-=c[Q]*p;Q===0&&(I[0]-=c[0]*p)}}return a},numeric.det=function(t){var e=numeric.dim(t);if(e.length!==2||e[0]!==e[1])throw new Error("numeric: det() only works on square matrices");var n=e[0],s=1,r,i,o,g=numeric.clone(t),a,I,c,E,u;for(i=0;i<n-1;i++){for(o=i,r=i+1;r<n;r++)Math.abs(g[r][i])>Math.abs(g[o][i])&&(o=r);for(o!==i&&(E=g[o],g[o]=g[i],g[i]=E,s*=-1),a=g[i],r=i+1;r<n;r++){for(I=g[r],c=I[i]/a[i],o=i+1;o<n-1;o+=2)u=o+1,I[o]-=a[o]*c,I[u]-=a[u]*c;o!==n&&(I[o]-=a[o]*c)}if(a[i]===0)return 0;s*=a[i]}return s*g[i][i]},numeric.transpose=function(t){var e,n,s=t.length,r=t[0].length,i=Array(r),o,g,a;for(n=0;n<r;n++)i[n]=Array(s);for(e=s-1;e>=1;e-=2){for(g=t[e],o=t[e-1],n=r-1;n>=1;--n)a=i[n],a[e]=g[n],a[e-1]=o[n],--n,a=i[n],a[e]=g[n],a[e-1]=o[n];n===0&&(a=i[0],a[e]=g[0],a[e-1]=o[0])}if(e===0){for(o=t[0],n=r-1;n>=1;--n)i[n][0]=o[n],--n,i[n][0]=o[n];n===0&&(i[0][0]=o[0])}return i},numeric.negtranspose=function(t){var e,n,s=t.length,r=t[0].length,i=Array(r),o,g,a;for(n=0;n<r;n++)i[n]=Array(s);for(e=s-1;e>=1;e-=2){for(g=t[e],o=t[e-1],n=r-1;n>=1;--n)a=i[n],a[e]=-g[n],a[e-1]=-o[n],--n,a=i[n],a[e]=-g[n],a[e-1]=-o[n];n===0&&(a=i[0],a[e]=-g[0],a[e-1]=-o[0])}if(e===0){for(o=t[0],n=r-1;n>=1;--n)i[n][0]=-o[n],--n,i[n][0]=-o[n];n===0&&(i[0][0]=-o[0])}return i},numeric._random=function l(t,e){var n,s=t[e],r=Array(s),i;if(e===t.length-1){for(i=Math.random,n=s-1;n>=1;n-=2)r[n]=i(),r[n-1]=i();return n===0&&(r[0]=i()),r}for(n=s-1;n>=0;n--)r[n]=l(t,e+1);return r},numeric.random=function(t){return numeric._random(t,0)},numeric.norm2=function(t){return Math.sqrt(numeric.norm2Squared(t))},numeric.linspace=function(t,e,n){if(typeof n>"u"&&(n=Math.max(Math.round(e-t)+1,1)),n<2)return n===1?[t]:[];var s,r=Array(n);for(n--,s=n;s>=0;s--)r[s]=(s*e+(n-s)*t)/n;return r},numeric.getBlock=function(t,e,n){var s=numeric.dim(t);function r(i,o){var g,a=e[o],I=n[o]-a,c=Array(I);if(o===s.length-1){for(g=I;g>=0;g--)c[g]=i[g+a];return c}for(g=I;g>=0;g--)c[g]=r(i[g+a],o+1);return c}return r(t,0)},numeric.setBlock=function(t,e,n,s){var r=numeric.dim(t);function i(o,g,a){var I,c=e[a],E=n[a]-c;if(a===r.length-1)for(I=E;I>=0;I--)o[I+c]=g[I];for(I=E;I>=0;I--)i(o[I+c],g[I],a+1)}return i(t,s,0),t},numeric.getRange=function(t,e,n){var s=e.length,r=n.length,i,o,g=Array(s),a,I;for(i=s-1;i!==-1;--i)for(g[i]=Array(r),a=g[i],I=t[e[i]],o=r-1;o!==-1;--o)a[o]=I[n[o]];return g},numeric.blockMatrix=function(t){var e=numeric.dim(t);if(e.length<4)return numeric.blockMatrix([t]);var n=e[0],s=e[1],r,i,o,g,a;for(r=0,i=0,o=0;o<n;++o)r+=t[o][0].length;for(g=0;g<s;++g)i+=t[0][g][0].length;var I=Array(r);for(o=0;o<r;++o)I[o]=Array(i);var c=0,E,u,Q,p,w;for(o=0;o<n;++o){for(E=i,g=s-1;g!==-1;--g)for(a=t[o][g],E-=a[0].length,Q=a.length-1;Q!==-1;--Q)for(w=a[Q],u=I[c+Q],p=w.length-1;p!==-1;--p)u[E+p]=w[p];c+=t[o][0].length}return I},numeric.tensor=function(t,e){if(typeof t=="number"||typeof e=="number")return numeric.mul(t,e);var n=numeric.dim(t),s=numeric.dim(e);if(n.length!==1||s.length!==1)throw new Error("numeric: tensor product is only defined for vectors");var r=n[0],i=s[0],o=Array(r),g,a,I,c;for(a=r-1;a>=0;a--){for(g=Array(i),c=t[a],I=i-1;I>=3;--I)g[I]=c*e[I],--I,g[I]=c*e[I],--I,g[I]=c*e[I],--I,g[I]=c*e[I];for(;I>=0;)g[I]=c*e[I],--I;o[a]=g}return o},numeric.T=function(t,e){this.x=t,this.y=e},numeric.t=function(t,e){return new numeric.T(t,e)},numeric.Tbinop=function(t,e,n,s,r){if(numeric.indexOf,typeof r!="string"){var i;r="";for(i in numeric)numeric.hasOwnProperty(i)&&(t.indexOf(i)>=0||e.indexOf(i)>=0||n.indexOf(i)>=0||s.indexOf(i)>=0)&&i.length>1&&(r+="var "+i+" = numeric."+i+`;
108
+ `)}return Function(["y"],`var x = this;
109
+ if(!(y instanceof numeric.T)) { y = new numeric.T(y); }
110
+ `+r+`
111
+ if(x.y) { if(y.y) { return new numeric.T(`+s+`);
112
+ }
113
+ return new numeric.T(`+n+`);
114
+ }
115
+ if(y.y) {
116
+ return new numeric.T(`+e+`);
117
+ }
118
+ return new numeric.T(`+t+`);
119
+ `)},numeric.T.prototype.add=numeric.Tbinop("add(x.x,y.x)","add(x.x,y.x),y.y","add(x.x,y.x),x.y","add(x.x,y.x),add(x.y,y.y)"),numeric.T.prototype.sub=numeric.Tbinop("sub(x.x,y.x)","sub(x.x,y.x),neg(y.y)","sub(x.x,y.x),x.y","sub(x.x,y.x),sub(x.y,y.y)"),numeric.T.prototype.mul=numeric.Tbinop("mul(x.x,y.x)","mul(x.x,y.x),mul(x.x,y.y)","mul(x.x,y.x),mul(x.y,y.x)","sub(mul(x.x,y.x),mul(x.y,y.y)),add(mul(x.x,y.y),mul(x.y,y.x))"),numeric.T.prototype.reciprocal=function(){var t=numeric.mul,e=numeric.div;if(this.y){var n=numeric.add(t(this.x,this.x),t(this.y,this.y));return new numeric.T(e(this.x,n),e(numeric.neg(this.y),n))}return new T(e(1,this.x))},numeric.T.prototype.div=function(t){if(t instanceof numeric.T||(t=new numeric.T(t)),t.y)return this.mul(t.reciprocal());var e=numeric.div;return this.y?new numeric.T(e(this.x,t.x),e(this.y,t.x)):new numeric.T(e(this.x,t.x))},numeric.T.prototype.dot=numeric.Tbinop("dot(x.x,y.x)","dot(x.x,y.x),dot(x.x,y.y)","dot(x.x,y.x),dot(x.y,y.x)","sub(dot(x.x,y.x),dot(x.y,y.y)),add(dot(x.x,y.y),dot(x.y,y.x))"),numeric.T.prototype.transpose=function(){var t=numeric.transpose,e=this.x,n=this.y;return n?new numeric.T(t(e),t(n)):new numeric.T(t(e))},numeric.T.prototype.transjugate=function(){var t=numeric.transpose,e=this.x,n=this.y;return n?new numeric.T(t(e),numeric.negtranspose(n)):new numeric.T(t(e))},numeric.Tunop=function(t,e,n){return typeof n!="string"&&(n=""),Function(`var x = this;
120
+ `+n+`
121
+ if(x.y) { `+e+`;
122
+ }
123
+ `+t+`;
124
+ `)},numeric.T.prototype.exp=numeric.Tunop("return new numeric.T(ex)","return new numeric.T(mul(cos(x.y),ex),mul(sin(x.y),ex))","var ex = numeric.exp(x.x), cos = numeric.cos, sin = numeric.sin, mul = numeric.mul;"),numeric.T.prototype.conj=numeric.Tunop("return new numeric.T(x.x);","return new numeric.T(x.x,numeric.neg(x.y));"),numeric.T.prototype.neg=numeric.Tunop("return new numeric.T(neg(x.x));","return new numeric.T(neg(x.x),neg(x.y));","var neg = numeric.neg;"),numeric.T.prototype.sin=numeric.Tunop("return new numeric.T(numeric.sin(x.x))","return x.exp().sub(x.neg().exp()).div(new numeric.T(0,2));"),numeric.T.prototype.cos=numeric.Tunop("return new numeric.T(numeric.cos(x.x))","return x.exp().add(x.neg().exp()).div(2);"),numeric.T.prototype.abs=numeric.Tunop("return new numeric.T(numeric.abs(x.x));","return new numeric.T(numeric.sqrt(numeric.add(mul(x.x,x.x),mul(x.y,x.y))));","var mul = numeric.mul;"),numeric.T.prototype.log=numeric.Tunop("return new numeric.T(numeric.log(x.x));",`var theta = new numeric.T(numeric.atan2(x.y,x.x)), r = x.abs();
125
+ return new numeric.T(numeric.log(r.x),theta.x);`),numeric.T.prototype.norm2=numeric.Tunop("return numeric.norm2(x.x);",`var f = numeric.norm2Squared;
126
+ return Math.sqrt(f(x.x)+f(x.y));`),numeric.T.prototype.inv=function(){var t=this;if(typeof t.y>"u")return new numeric.T(numeric.inv(t.x));var e=t.x.length,p,w,y,n=numeric.identity(e),s=numeric.rep([e,e],0),r=numeric.clone(t.x),i=numeric.clone(t.y),o,g,a,I,c,E,u,Q,p,w,y,M,N,S,R,U,b,G;for(p=0;p<e;p++){for(S=r[p][p],R=i[p][p],M=S*S+R*R,y=p,w=p+1;w<e;w++)S=r[w][p],R=i[w][p],N=S*S+R*R,N>M&&(y=w,M=N);for(y!==p&&(G=r[p],r[p]=r[y],r[y]=G,G=i[p],i[p]=i[y],i[y]=G,G=n[p],n[p]=n[y],n[y]=G,G=s[p],s[p]=s[y],s[y]=G),o=r[p],g=i[p],c=n[p],E=s[p],S=o[p],R=g[p],w=p+1;w<e;w++)U=o[w],b=g[w],o[w]=(U*S+b*R)/M,g[w]=(b*S-U*R)/M;for(w=0;w<e;w++)U=c[w],b=E[w],c[w]=(U*S+b*R)/M,E[w]=(b*S-U*R)/M;for(w=p+1;w<e;w++){for(a=r[w],I=i[w],u=n[w],Q=s[w],S=a[p],R=I[p],y=p+1;y<e;y++)U=o[y],b=g[y],a[y]-=U*S-b*R,I[y]-=b*S+U*R;for(y=0;y<e;y++)U=c[y],b=E[y],u[y]-=U*S-b*R,Q[y]-=b*S+U*R}}for(p=e-1;p>0;p--)for(c=n[p],E=s[p],w=p-1;w>=0;w--)for(u=n[w],Q=s[w],S=r[w][p],R=i[w][p],y=e-1;y>=0;y--)U=c[y],b=E[y],u[y]-=S*U-R*b,Q[y]-=S*b+R*U;return new numeric.T(n,s)},numeric.T.prototype.get=function(t){var e=this.x,n=this.y,s=0,r,i=t.length;if(n){for(;s<i;)r=t[s],e=e[r],n=n[r],s++;return new numeric.T(e,n)}for(;s<i;)r=t[s],e=e[r],s++;return new numeric.T(e)},numeric.T.prototype.set=function(t,e){var n=this.x,s=this.y,r=0,i,o=t.length,g=e.x,a=e.y;if(o===0)return a?this.y=a:s&&(this.y=void 0),this.x=n,this;if(a){for(s||(s=numeric.rep(numeric.dim(n),0),this.y=s);r<o-1;)i=t[r],n=n[i],s=s[i],r++;return i=t[r],n[i]=g,s[i]=a,this}if(s){for(;r<o-1;)i=t[r],n=n[i],s=s[i],r++;return i=t[r],n[i]=g,g instanceof Array?s[i]=numeric.rep(numeric.dim(g),0):s[i]=0,this}for(;r<o-1;)i=t[r],n=n[i],r++;return i=t[r],n[i]=g,this},numeric.T.prototype.getRows=function(t,e){var n=e-t+1,s,r=Array(n),i,o=this.x,g=this.y;for(s=t;s<=e;s++)r[s-t]=o[s];if(g){for(i=Array(n),s=t;s<=e;s++)i[s-t]=g[s];return new numeric.T(r,i)}return new numeric.T(r)},numeric.T.prototype.setRows=function(t,e,n){var s,r=this.x,i=this.y,o=n.x,g=n.y;for(s=t;s<=e;s++)r[s]=o[s-t];if(g)for(i||(i=numeric.rep(numeric.dim(r),0),this.y=i),s=t;s<=e;s++)i[s]=g[s-t];else if(i)for(s=t;s<=e;s++)i[s]=numeric.rep([o[s-t].length],0);return this},numeric.T.prototype.getRow=function(t){var e=this.x,n=this.y;return n?new numeric.T(e[t],n[t]):new numeric.T(e[t])},numeric.T.prototype.setRow=function(t,e){var n=this.x,s=this.y,r=e.x,i=e.y;return n[t]=r,i?(s||(s=numeric.rep(numeric.dim(n),0),this.y=s),s[t]=i):s&&(s=numeric.rep([r.length],0)),this},numeric.T.prototype.getBlock=function(t,e){var n=this.x,s=this.y,r=numeric.getBlock;return s?new numeric.T(r(n,t,e),r(s,t,e)):new numeric.T(r(n,t,e))},numeric.T.prototype.setBlock=function(t,e,n){n instanceof numeric.T||(n=new numeric.T(n));var s=this.x,r=this.y,i=numeric.setBlock,o=n.x,g=n.y;if(g)return r||(this.y=numeric.rep(numeric.dim(this),0),r=this.y),i(s,t,e,o),i(r,t,e,g),this;i(s,t,e,o),r&&i(r,t,e,numeric.rep(numeric.dim(o),0))},numeric.T.rep=function(t,e){var n=numeric.T;e instanceof n||(e=new n(e));var s=e.x,r=e.y,i=numeric.rep;return r?new n(i(t,s),i(t,r)):new n(i(t,s))},numeric.T.diag=function(t){t instanceof numeric.T||(t=new numeric.T(t));var e=t.x,n=t.y,s=numeric.diag;return n?new numeric.T(s(e),s(n)):new numeric.T(s(e))},numeric.T.eig=function(){if(this.y)throw new Error("eig: not implemented for complex matrices.");return numeric.eig(this.x)},numeric.T.identity=function(t){return new numeric.T(numeric.identity(t))},numeric.T.prototype.getDiag=function(){var t=numeric,e=this.x,n=this.y;return n?new t.T(t.getDiag(e),t.getDiag(n)):new t.T(t.getDiag(e))},numeric.house=function(t){var e=numeric.clone(t),n=t[0]>=0?1:-1,s=n*numeric.norm2(t);e[0]+=s;var r=numeric.norm2(e);if(r===0)throw new Error("eig: internal error");return numeric.div(e,r)},numeric.toUpperHessenberg=function(t){var e=numeric.dim(t);if(e.length!==2||e[0]!==e[1])throw new Error("numeric: toUpperHessenberg() only works on square matrices");var n=e[0],s,r,i,o,g,a=numeric.clone(t),I,c,E,u,Q=numeric.identity(n),p;for(r=0;r<n-2;r++){for(o=Array(n-r-1),s=r+1;s<n;s++)o[s-r-1]=a[s][r];if(numeric.norm2(o)>0){for(g=numeric.house(o),I=numeric.getBlock(a,[r+1,r],[n-1,n-1]),c=numeric.tensor(g,numeric.dot(g,I)),s=r+1;s<n;s++)for(E=a[s],u=c[s-r-1],i=r;i<n;i++)E[i]-=2*u[i-r];for(I=numeric.getBlock(a,[0,r+1],[n-1,n-1]),c=numeric.tensor(numeric.dot(I,g),g),s=0;s<n;s++)for(E=a[s],u=c[s],i=r+1;i<n;i++)E[i]-=2*u[i-r-1];for(I=Array(n-r-1),s=r+1;s<n;s++)I[s-r-1]=Q[s];for(c=numeric.tensor(g,numeric.dot(g,I)),s=r+1;s<n;s++)for(p=Q[s],u=c[s-r-1],i=0;i<n;i++)p[i]-=2*u[i]}}return{H:a,Q}},numeric.epsilon=2220446049250313e-31,numeric.QRFrancis=function(l,t){typeof t>"u"&&(t=1e4),l=numeric.clone(l),numeric.clone(l);var e=numeric.dim(l),n=e[0],s,r,i,o,g,a,I,c,E,u=numeric.identity(n),Q,p,w,y,M,N,S,R,U;if(n<3)return{Q:u,B:[[0,n-1]]};var b=numeric.epsilon;for(U=0;U<t;U++){for(S=0;S<n-1;S++)if(Math.abs(l[S+1][S])<b*(Math.abs(l[S][S])+Math.abs(l[S+1][S+1]))){var G=numeric.QRFrancis(numeric.getBlock(l,[0,0],[S,S]),t),O=numeric.QRFrancis(numeric.getBlock(l,[S+1,S+1],[n-1,n-1]),t);for(w=Array(S+1),N=0;N<=S;N++)w[N]=u[N];for(y=numeric.dot(G.Q,w),N=0;N<=S;N++)u[N]=y[N];for(w=Array(n-S-1),N=S+1;N<n;N++)w[N-S-1]=u[N];for(y=numeric.dot(O.Q,w),N=S+1;N<n;N++)u[N]=y[N-S-1];return{Q:u,B:G.B.concat(numeric.add(O.B,S+1))}}if(i=l[n-2][n-2],o=l[n-2][n-1],g=l[n-1][n-2],a=l[n-1][n-1],c=i+a,I=i*a-o*g,E=numeric.getBlock(l,[0,0],[2,2]),c*c>=4*I){var H,z;H=.5*(c+Math.sqrt(c*c-4*I)),z=.5*(c-Math.sqrt(c*c-4*I)),E=numeric.add(numeric.sub(numeric.dot(E,E),numeric.mul(E,H+z)),numeric.diag(numeric.rep([3],H*z)))}else E=numeric.add(numeric.sub(numeric.dot(E,E),numeric.mul(E,c)),numeric.diag(numeric.rep([3],I)));for(s=[E[0][0],E[1][0],E[2][0]],r=numeric.house(s),w=[l[0],l[1],l[2]],y=numeric.tensor(r,numeric.dot(r,w)),N=0;N<3;N++)for(p=l[N],M=y[N],R=0;R<n;R++)p[R]-=2*M[R];for(w=numeric.getBlock(l,[0,0],[n-1,2]),y=numeric.tensor(numeric.dot(w,r),r),N=0;N<n;N++)for(p=l[N],M=y[N],R=0;R<3;R++)p[R]-=2*M[R];for(w=[u[0],u[1],u[2]],y=numeric.tensor(r,numeric.dot(r,w)),N=0;N<3;N++)for(Q=u[N],M=y[N],R=0;R<n;R++)Q[R]-=2*M[R];var tA;for(S=0;S<n-2;S++){for(R=S;R<=S+1;R++)if(Math.abs(l[R+1][R])<b*(Math.abs(l[R][R])+Math.abs(l[R+1][R+1]))){var G=numeric.QRFrancis(numeric.getBlock(l,[0,0],[R,R]),t),O=numeric.QRFrancis(numeric.getBlock(l,[R+1,R+1],[n-1,n-1]),t);for(w=Array(R+1),N=0;N<=R;N++)w[N]=u[N];for(y=numeric.dot(G.Q,w),N=0;N<=R;N++)u[N]=y[N];for(w=Array(n-R-1),N=R+1;N<n;N++)w[N-R-1]=u[N];for(y=numeric.dot(O.Q,w),N=R+1;N<n;N++)u[N]=y[N-R-1];return{Q:u,B:G.B.concat(numeric.add(O.B,R+1))}}for(tA=Math.min(n-1,S+3),s=Array(tA-S),N=S+1;N<=tA;N++)s[N-S-1]=l[N][S];for(r=numeric.house(s),w=numeric.getBlock(l,[S+1,S],[tA,n-1]),y=numeric.tensor(r,numeric.dot(r,w)),N=S+1;N<=tA;N++)for(p=l[N],M=y[N-S-1],R=S;R<n;R++)p[R]-=2*M[R-S];for(w=numeric.getBlock(l,[0,S+1],[n-1,tA]),y=numeric.tensor(numeric.dot(w,r),r),N=0;N<n;N++)for(p=l[N],M=y[N],R=S+1;R<=tA;R++)p[R]-=2*M[R-S-1];for(w=Array(tA-S),N=S+1;N<=tA;N++)w[N-S-1]=u[N];for(y=numeric.tensor(r,numeric.dot(r,w)),N=S+1;N<=tA;N++)for(Q=u[N],M=y[N-S-1],R=0;R<n;R++)Q[R]-=2*M[R]}}throw new Error("numeric: eigenvalue iteration does not converge -- increase maxiter?")},numeric.eig=function(t,e){var n=numeric.toUpperHessenberg(t),s=numeric.QRFrancis(n.H,e),r=numeric.T,nA=t.length,i,o,g=s.B,a=numeric.dot(s.Q,numeric.dot(n.H,numeric.transpose(s.Q))),I=new r(numeric.dot(s.Q,n.Q)),c,E=g.length,u,Q,p,w,y,M,N,S,R,U,b,G,O,H,z=Math.sqrt;for(o=0;o<E;o++)if(i=g[o][0],i!==g[o][1]){if(u=i+1,Q=a[i][i],p=a[i][u],w=a[u][i],y=a[u][u],p===0&&w===0)continue;M=-Q-y,N=Q*y-p*w,S=M*M-4*N,S>=0?(M<0?R=-.5*(M-z(S)):R=-.5*(M+z(S)),O=(Q-R)*(Q-R)+p*p,H=w*w+(y-R)*(y-R),O>H?(O=z(O),b=(Q-R)/O,G=p/O):(H=z(H),b=w/H,G=(y-R)/H),c=new r([[G,-b],[b,G]]),I.setRows(i,u,c.dot(I.getRows(i,u)))):(R=-.5*M,U=.5*z(-S),O=(Q-R)*(Q-R)+p*p,H=w*w+(y-R)*(y-R),O>H?(O=z(O+U*U),b=(Q-R)/O,G=p/O,R=0,U/=O):(H=z(H+U*U),b=w/H,G=(y-R)/H,R=U/H,U=0),c=new r([[G,-b],[b,G]],[[R,U],[U,-R]]),I.setRows(i,u,c.dot(I.getRows(i,u))))}var tA=I.dot(t).dot(I.transjugate()),nA=t.length,IA=numeric.T.identity(nA);for(u=0;u<nA;u++)if(u>0)for(o=u-1;o>=0;o--){var iA=tA.get([o,o]),W=tA.get([u,u]);if(numeric.neq(iA.x,W.x)||numeric.neq(iA.y,W.y))R=tA.getRow(o).getBlock([o],[u-1]),U=IA.getRow(u).getBlock([o],[u-1]),IA.set([u,o],tA.get([o,u]).neg().sub(R.dot(U)).div(iA.sub(W)));else{IA.setRow(u,IA.getRow(o));continue}}for(u=0;u<nA;u++)R=IA.getRow(u),IA.setRow(u,R.div(R.norm2()));return IA=IA.transpose(),IA=I.transjugate().dot(IA),{lambda:tA.getDiag(),E:IA}},numeric.ccsSparse=function(t){var e=t.length,o,n,s,r,i=[];for(s=e-1;s!==-1;--s){n=t[s];for(r in n){for(r=parseInt(r);r>=i.length;)i[i.length]=0;n[r]!==0&&i[r]++}}var o=i.length,g=Array(o+1);for(g[0]=0,s=0;s<o;++s)g[s+1]=g[s]+i[s];var a=Array(g[o]),I=Array(g[o]);for(s=e-1;s!==-1;--s){n=t[s];for(r in n)n[r]!==0&&(i[r]--,a[g[r]+i[r]]=s,I[g[r]+i[r]]=n[r])}return[g,a,I]},numeric.ccsFull=function(t){var e=t[0],n=t[1],s=t[2],r=numeric.ccsDim(t),i=r[0],o=r[1],g,a,I,c,E=numeric.rep([i,o],0);for(g=0;g<o;g++)for(I=e[g],c=e[g+1],a=I;a<c;++a)E[n[a]][g]=s[a];return E},numeric.ccsTSolve=function(t,e,n,s,r){var i=t[0],o=t[1],g=t[2],a=i.length-1,I=Math.max,c=0;typeof s>"u"&&(n=numeric.rep([a],0)),typeof s>"u"&&(s=numeric.linspace(0,n.length-1)),typeof r>"u"&&(r=[]);function E(S){var R;if(n[S]===0){for(n[S]=1,R=i[S];R<i[S+1];++R)E(o[R]);r[c]=S,++c}}var u,Q,p,w,y,M,N;for(u=s.length-1;u!==-1;--u)E(s[u]);for(r.length=c,u=r.length-1;u!==-1;--u)n[r[u]]=0;for(u=s.length-1;u!==-1;--u)Q=s[u],n[Q]=e[Q];for(u=r.length-1;u!==-1;--u){for(Q=r[u],p=i[Q],w=I(i[Q+1],p),y=p;y!==w;++y)if(o[y]===Q){n[Q]/=g[y];break}for(N=n[Q],y=p;y!==w;++y)M=o[y],M!==Q&&(n[M]-=N*g[y])}return n},numeric.ccsDFS=function(t){this.k=Array(t),this.k1=Array(t),this.j=Array(t)},numeric.ccsDFS.prototype.dfs=function(t,e,n,s,r,i){var o=0,g,a=r.length,I=this.k,c=this.k1,E=this.j,u,Q;if(s[t]===0)for(s[t]=1,E[0]=t,I[0]=u=e[t],c[0]=Q=e[t+1];;)if(u>=Q){if(r[a]=E[o],o===0)return;++a,--o,u=I[o],Q=c[o]}else g=i[n[u]],s[g]===0?(s[g]=1,I[o]=u,++o,E[o]=g,u=e[g],c[o]=Q=e[g+1]):++u},numeric.ccsLPSolve=function(t,e,n,s,r,i,o){var g=t[0],a=t[1],I=t[2];g.length-1;var c=e[0],E=e[1],u=e[2],Q,p,w,y,M,N,S,R,U;for(p=c[r],w=c[r+1],s.length=0,Q=p;Q<w;++Q)o.dfs(i[E[Q]],g,a,n,s,i);for(Q=s.length-1;Q!==-1;--Q)n[s[Q]]=0;for(Q=p;Q!==w;++Q)y=i[E[Q]],n[y]=u[Q];for(Q=s.length-1;Q!==-1;--Q){for(y=s[Q],M=g[y],N=g[y+1],S=M;S<N;++S)if(i[a[S]]===y){n[y]/=I[S];break}for(U=n[y],S=M;S<N;++S)R=i[a[S]],R!==y&&(n[R]-=U*I[S])}return n},numeric.ccsLUP1=function(t,e){var n=t[0].length-1,s=[numeric.rep([n+1],0),[],[]],r=[numeric.rep([n+1],0),[],[]],i=s[0],o=s[1],g=s[2],a=r[0],I=r[1],c=r[2],E=numeric.rep([n],0),u=numeric.rep([n],0),Q,p,w,y,M,N,S,R=numeric.ccsLPSolve,U=Math.abs,b=numeric.linspace(0,n-1),G=numeric.linspace(0,n-1),O=new numeric.ccsDFS(n);for(typeof e>"u"&&(e=1),Q=0;Q<n;++Q){for(R(s,t,E,u,Q,G,O),y=-1,M=-1,p=u.length-1;p!==-1;--p)w=u[p],!(w<=Q)&&(N=U(E[w]),N>y&&(M=w,y=N));for(U(E[Q])<e*y&&(p=b[Q],y=b[M],b[Q]=y,G[y]=Q,b[M]=p,G[p]=M,y=E[Q],E[Q]=E[M],E[M]=y),y=i[Q],M=a[Q],S=E[Q],o[y]=b[Q],g[y]=1,++y,p=u.length-1;p!==-1;--p)w=u[p],N=E[w],u[p]=0,E[w]=0,w<=Q?(I[M]=w,c[M]=N,++M):(o[y]=b[w],g[y]=N/S,++y);i[Q+1]=y,a[Q+1]=M}for(p=o.length-1;p!==-1;--p)o[p]=G[o[p]];return{L:s,U:r,P:b,Pinv:G}},numeric.ccsDFS0=function(t){this.k=Array(t),this.k1=Array(t),this.j=Array(t)},numeric.ccsDFS0.prototype.dfs=function(t,e,n,s,r,i,o){var g=0,a,I=r.length,c=this.k,E=this.k1,u=this.j,Q,p;if(s[t]===0)for(s[t]=1,u[0]=t,c[0]=Q=e[i[t]],E[0]=p=e[i[t]+1];;){if(isNaN(Q))throw new Error("Ow!");if(Q>=p){if(r[I]=i[u[g]],g===0)return;++I,--g,Q=c[g],p=E[g]}else a=n[Q],s[a]===0?(s[a]=1,c[g]=Q,++g,u[g]=a,a=i[a],Q=e[a],E[g]=p=e[a+1]):++Q}},numeric.ccsLPSolve0=function(t,e,n,s,r,i,o,g){var a=t[0],I=t[1],c=t[2];a.length-1;var E=e[0],u=e[1],Q=e[2],p,w,y,M,N,S,R,U,b;for(w=E[r],y=E[r+1],s.length=0,p=w;p<y;++p)g.dfs(u[p],a,I,n,s,i,o);for(p=s.length-1;p!==-1;--p)M=s[p],n[o[M]]=0;for(p=w;p!==y;++p)M=u[p],n[M]=Q[p];for(p=s.length-1;p!==-1;--p){for(M=s[p],U=o[M],N=a[M],S=a[M+1],R=N;R<S;++R)if(I[R]===U){n[U]/=c[R];break}for(b=n[U],R=N;R<S;++R)n[I[R]]-=b*c[R];n[U]=b}},numeric.ccsLUP0=function(t,e){var n=t[0].length-1,s=[numeric.rep([n+1],0),[],[]],r=[numeric.rep([n+1],0),[],[]],i=s[0],o=s[1],g=s[2],a=r[0],I=r[1],c=r[2],E=numeric.rep([n],0),u=numeric.rep([n],0),Q,p,w,y,M,N,S,R=numeric.ccsLPSolve0,U=Math.abs,b=numeric.linspace(0,n-1),G=numeric.linspace(0,n-1),O=new numeric.ccsDFS0(n);for(typeof e>"u"&&(e=1),Q=0;Q<n;++Q){for(R(s,t,E,u,Q,G,b,O),y=-1,M=-1,p=u.length-1;p!==-1;--p)w=u[p],!(w<=Q)&&(N=U(E[b[w]]),N>y&&(M=w,y=N));for(U(E[b[Q]])<e*y&&(p=b[Q],y=b[M],b[Q]=y,G[y]=Q,b[M]=p,G[p]=M),y=i[Q],M=a[Q],S=E[b[Q]],o[y]=b[Q],g[y]=1,++y,p=u.length-1;p!==-1;--p)w=u[p],N=E[b[w]],u[p]=0,E[b[w]]=0,w<=Q?(I[M]=w,c[M]=N,++M):(o[y]=b[w],g[y]=N/S,++y);i[Q+1]=y,a[Q+1]=M}for(p=o.length-1;p!==-1;--p)o[p]=G[o[p]];return{L:s,U:r,P:b,Pinv:G}},numeric.ccsLUP=numeric.ccsLUP0,numeric.ccsDim=function(t){return[numeric.sup(t[1])+1,t[0].length-1]},numeric.ccsGetBlock=function(t,e,n){var s=numeric.ccsDim(t),r=s[0],i=s[1];typeof e>"u"?e=numeric.linspace(0,r-1):typeof e=="number"&&(e=[e]),typeof n>"u"?n=numeric.linspace(0,i-1):typeof n=="number"&&(n=[n]);var o,g=e.length,a,I=n.length,c,E,u,Q=numeric.rep([i],0),p=[],w=[],y=[Q,p,w],M=t[0],N=t[1],S=t[2],R=numeric.rep([r],0),U=0,b=numeric.rep([r],0);for(a=0;a<I;++a){E=n[a];var G=M[E],O=M[E+1];for(o=G;o<O;++o)c=N[o],b[c]=1,R[c]=S[o];for(o=0;o<g;++o)u=e[o],b[u]&&(p[U]=o,w[U]=R[e[o]],++U);for(o=G;o<O;++o)c=N[o],b[c]=0;Q[a+1]=U}return y},numeric.ccsDot=function(t,e){var n=t[0],s=t[1],r=t[2],i=e[0],o=e[1],g=e[2],a=numeric.ccsDim(t),I=numeric.ccsDim(e),c=a[0];a[1];var E=I[1],u=numeric.rep([c],0),Q=numeric.rep([c],0),p=Array(c),w=numeric.rep([E],0),y=[],M=[],N=[w,y,M],S,R,U,b,G,O,H,z,tA,nA,IA;for(U=0;U!==E;++U){for(b=i[U],G=i[U+1],tA=0,R=b;R<G;++R)for(nA=o[R],IA=g[R],O=n[nA],H=n[nA+1],S=O;S<H;++S)z=s[S],Q[z]===0&&(p[tA]=z,Q[z]=1,tA=tA+1),u[z]=u[z]+r[S]*IA;for(b=w[U],G=b+tA,w[U+1]=G,R=tA-1;R!==-1;--R)IA=b+R,S=p[R],y[IA]=S,M[IA]=u[S],Q[S]=0,u[S]=0;w[U+1]=w[U]+tA}return N},numeric.ccsLUPSolve=function(t,e){var n=t.L,s=t.U;t.P;var r=e[0],i=!1;typeof r!="object"&&(e=[[0,e.length],numeric.linspace(0,e.length-1),e],r=e[0],i=!0);var o=e[1],g=e[2],a=n[0].length-1,I=r.length-1,c=numeric.rep([a],0),E=Array(a),u=numeric.rep([a],0),Q=Array(a),p=numeric.rep([I+1],0),w=[],y=[],M=numeric.ccsTSolve,N,S,R,U,b,G,O=0;for(N=0;N<I;++N){for(b=0,R=r[N],U=r[N+1],S=R;S<U;++S)G=t.Pinv[o[S]],Q[b]=G,u[G]=g[S],++b;for(Q.length=b,M(n,u,c,Q,E),S=Q.length-1;S!==-1;--S)u[Q[S]]=0;if(M(s,c,u,E,Q),i)return u;for(S=E.length-1;S!==-1;--S)c[E[S]]=0;for(S=Q.length-1;S!==-1;--S)G=Q[S],w[O]=G,y[O]=u[G],u[G]=0,++O;p[N+1]=O}return[p,w,y]},numeric.ccsbinop=function(t,e){return typeof e>"u"&&(e=""),Function("X","Y",`var Xi = X[0], Xj = X[1], Xv = X[2];
127
+ var Yi = Y[0], Yj = Y[1], Yv = Y[2];
128
+ var n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;
129
+ var Zi = numeric.rep([n+1],0), Zj = [], Zv = [];
130
+ var x = numeric.rep([m],0),y = numeric.rep([m],0);
131
+ var xk,yk,zk;
132
+ var i,j,j0,j1,k,p=0;
133
+ `+e+`for(i=0;i<n;++i) {
134
+ j0 = Xi[i]; j1 = Xi[i+1];
135
+ for(j=j0;j!==j1;++j) {
136
+ k = Xj[j];
137
+ x[k] = 1;
138
+ Zj[p] = k;
139
+ ++p;
140
+ }
141
+ j0 = Yi[i]; j1 = Yi[i+1];
142
+ for(j=j0;j!==j1;++j) {
143
+ k = Yj[j];
144
+ y[k] = Yv[j];
145
+ if(x[k] === 0) {
146
+ Zj[p] = k;
147
+ ++p;
148
+ }
149
+ }
150
+ Zi[i+1] = p;
151
+ j0 = Xi[i]; j1 = Xi[i+1];
152
+ for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];
153
+ j0 = Zi[i]; j1 = Zi[i+1];
154
+ for(j=j0;j!==j1;++j) {
155
+ k = Zj[j];
156
+ xk = x[k];
157
+ yk = y[k];
158
+ `+t+`
159
+ Zv[j] = zk;
160
+ }
161
+ j0 = Xi[i]; j1 = Xi[i+1];
162
+ for(j=j0;j!==j1;++j) x[Xj[j]] = 0;
163
+ j0 = Yi[i]; j1 = Yi[i+1];
164
+ for(j=j0;j!==j1;++j) y[Yj[j]] = 0;
165
+ }
166
+ return [Zi,Zj,Zv];`)},(function(){var k,A,B,C;for(k in numeric.ops2)isFinite(eval("1"+numeric.ops2[k]+"0"))?A="[Y[0],Y[1],numeric."+k+"(X,Y[2])]":A="NaN",isFinite(eval("0"+numeric.ops2[k]+"1"))?B="[X[0],X[1],numeric."+k+"(X[2],Y)]":B="NaN",isFinite(eval("1"+numeric.ops2[k]+"0"))&&isFinite(eval("0"+numeric.ops2[k]+"1"))?C="numeric.ccs"+k+"MM(X,Y)":C="NaN",numeric["ccs"+k+"MM"]=numeric.ccsbinop("zk = xk "+numeric.ops2[k]+"yk;"),numeric["ccs"+k]=Function("X","Y",'if(typeof X === "number") return '+A+`;
167
+ if(typeof Y === "number") return `+B+`;
168
+ return `+C+`;
169
+ `)})(),numeric.ccsScatter=function l(t){var e=t[0],n=t[1],s=t[2],r=numeric.sup(n)+1,i=e.length,o=numeric.rep([r],0),g=Array(i),a=Array(i),I=numeric.rep([r],0),c;for(c=0;c<i;++c)I[n[c]]++;for(c=0;c<r;++c)o[c+1]=o[c]+I[c];var E=o.slice(0),u,Q;for(c=0;c<i;++c)Q=n[c],u=E[Q],g[u]=e[c],a[u]=s[c],E[Q]=E[Q]+1;return[o,g,a]},numeric.ccsGather=function l(t){var e=t[0],n=t[1],s=t[2],r=e.length-1,i=n.length,o=Array(i),g=Array(i),a=Array(i),I,c,E,u,Q;for(Q=0,I=0;I<r;++I)for(E=e[I],u=e[I+1],c=E;c!==u;++c)g[Q]=I,o[Q]=n[c],a[Q]=s[c],++Q;return[o,g,a]},numeric.sdim=function l(t,e,n){if(typeof e>"u"&&(e=[]),typeof t!="object")return e;typeof n>"u"&&(n=0),n in e||(e[n]=0),t.length>e[n]&&(e[n]=t.length);var s;for(s in t)t.hasOwnProperty(s)&&l(t[s],e,n+1);return e},numeric.sclone=function l(t,e,n){typeof e>"u"&&(e=0),typeof n>"u"&&(n=numeric.sdim(t).length);var s,r=Array(t.length);if(e===n-1){for(s in t)t.hasOwnProperty(s)&&(r[s]=t[s]);return r}for(s in t)t.hasOwnProperty(s)&&(r[s]=l(t[s],e+1,n));return r},numeric.sdiag=function l(t){var e=t.length,n,s=Array(e),r;for(n=e-1;n>=1;n-=2)r=n-1,s[n]=[],s[n][n]=t[n],s[r]=[],s[r][r]=t[r];return n===0&&(s[0]=[],s[0][0]=t[n]),s},numeric.sidentity=function l(t){return numeric.sdiag(numeric.rep([t],1))},numeric.stranspose=function l(t){var e=[];t.length;var n,s,r;for(n in t)if(t.hasOwnProperty(n)){r=t[n];for(s in r)r.hasOwnProperty(s)&&(typeof e[s]!="object"&&(e[s]=[]),e[s][n]=r[s])}return e},numeric.sLUP=function l(t,e){throw new Error("The function numeric.sLUP had a bug in it and has been removed. Please use the new numeric.ccsLUP function instead.")},numeric.sdotMM=function l(t,e){var n=t.length;e.length;var s=numeric.stranspose(e),r=s.length,i,o,g,a,I,c,E=Array(n),u;for(g=n-1;g>=0;g--){for(u=[],i=t[g],I=r-1;I>=0;I--){c=0,o=s[I];for(a in i)i.hasOwnProperty(a)&&a in o&&(c+=i[a]*o[a]);c&&(u[I]=c)}E[g]=u}return E},numeric.sdotMV=function l(t,e){var n=t.length,s,r,i,o=Array(n),g;for(r=n-1;r>=0;r--){s=t[r],g=0;for(i in s)s.hasOwnProperty(i)&&e[i]&&(g+=s[i]*e[i]);g&&(o[r]=g)}return o},numeric.sdotVM=function l(t,e){var n,s,r,i,o=[];for(n in t)if(t.hasOwnProperty(n)){r=e[n],i=t[n];for(s in r)r.hasOwnProperty(s)&&(o[s]||(o[s]=0),o[s]+=i*r[s])}return o},numeric.sdotVV=function l(t,e){var n,s=0;for(n in t)t[n]&&e[n]&&(s+=t[n]*e[n]);return s},numeric.sdot=function l(t,e){var n=numeric.sdim(t).length,s=numeric.sdim(e).length,r=n*1e3+s;switch(r){case 0:return t*e;case 1001:return numeric.sdotVV(t,e);case 2001:return numeric.sdotMV(t,e);case 1002:return numeric.sdotVM(t,e);case 2002:return numeric.sdotMM(t,e);default:throw new Error("numeric.sdot not implemented for tensors of order "+n+" and "+s)}},numeric.sscatter=function l(t){var e=t[0].length,n,s,r,i=t.length,o=[],g;for(s=e-1;s>=0;--s)if(t[i-1][s]){for(g=o,r=0;r<i-2;r++)n=t[r][s],g[n]||(g[n]=[]),g=g[n];g[t[r][s]]=t[r+1][s]}return o},numeric.sgather=function l(t,e,n){typeof e>"u"&&(e=[]),typeof n>"u"&&(n=[]);var s,r,i;s=n.length;for(r in t)if(t.hasOwnProperty(r))if(n[s]=parseInt(r),i=t[r],typeof i=="number"){if(i){if(e.length===0)for(r=s+1;r>=0;--r)e[r]=[];for(r=s;r>=0;--r)e[r].push(n[r]);e[s+1].push(i)}}else l(i,e,n);return n.length>s&&n.pop(),e},numeric.cLU=function l(t){var e=t[0],n=t[1],s=t[2],O=e.length,r=0,i,o,g,a,I,c;for(i=0;i<O;i++)e[i]>r&&(r=e[i]);r++;var E=Array(r),u=Array(r),Q=numeric.rep([r],1/0),p=numeric.rep([r],-1/0),N,S,w;for(g=0;g<O;g++)i=e[g],o=n[g],o<Q[i]&&(Q[i]=o),o>p[i]&&(p[i]=o);for(i=0;i<r-1;i++)p[i]>p[i+1]&&(p[i+1]=p[i]);for(i=r-1;i>=1;i--)Q[i]<Q[i-1]&&(Q[i-1]=Q[i]);var y=0,M=0;for(i=0;i<r;i++)u[i]=numeric.rep([p[i]-Q[i]+1],0),E[i]=numeric.rep([i-Q[i]],0),y+=i-Q[i]+1,M+=p[i]-i+1;for(g=0;g<O;g++)i=e[g],u[i][n[g]-Q[i]]=s[g];for(i=0;i<r-1;i++)for(a=i-Q[i],N=u[i],o=i+1;Q[o]<=i&&o<r;o++)if(I=i-Q[o],c=p[i]-i,S=u[o],w=S[I]/N[a],w){for(g=1;g<=c;g++)S[g+I]-=w*N[g+a];E[o][i-Q[o]]=w}var N=[],S=[],R=[],U=[],b=[],G=[],O,H,z;for(O=0,H=0,i=0;i<r;i++){for(a=Q[i],I=p[i],z=u[i],o=i;o<=I;o++)z[o-a]&&(N[O]=i,S[O]=o,R[O]=z[o-a],O++);for(z=E[i],o=a;o<i;o++)z[o-a]&&(U[H]=i,b[H]=o,G[H]=z[o-a],H++);U[H]=i,b[H]=i,G[H]=1,H++}return{U:[N,S,R],L:[U,b,G]}},numeric.cLUsolve=function l(t,e){var n=t.L,s=t.U,r=numeric.clone(e),i=n[0],o=n[1],g=n[2],a=s[0],I=s[1],c=s[2],E=a.length;i.length;var u=r.length,Q,p;for(p=0,Q=0;Q<u;Q++){for(;o[p]<Q;)r[Q]-=g[p]*r[o[p]],p++;p++}for(p=E-1,Q=u-1;Q>=0;Q--){for(;I[p]>Q;)r[Q]-=c[p]*r[I[p]],p--;r[Q]/=c[p],p--}return r},numeric.cgrid=function l(t,e){typeof t=="number"&&(t=[t,t]);var n=numeric.rep(t,-1),s,r,i;for(typeof e!="function"&&(e==="L"?e=function(o,g){return o>=t[0]/2||g<t[1]/2}:e=function(o,g){return!0}),i=0,s=1;s<t[0]-1;s++)for(r=1;r<t[1]-1;r++)e(s,r)&&(n[s][r]=i,i++);return n},numeric.cdelsq=function l(t){var e=[[-1,0],[0,-1],[0,1],[1,0]],n=numeric.dim(t),s=n[0],r=n[1],i,o,g,a,I,c=[],E=[],u=[];for(i=1;i<s-1;i++)for(o=1;o<r-1;o++)if(!(t[i][o]<0)){for(g=0;g<4;g++)a=i+e[g][0],I=o+e[g][1],!(t[a][I]<0)&&(c.push(t[i][o]),E.push(t[a][I]),u.push(-1));c.push(t[i][o]),E.push(t[i][o]),u.push(4)}return[c,E,u]},numeric.cdotMV=function l(t,e){var n,s=t[0],r=t[1],i=t[2],o,g=s.length,a;for(a=0,o=0;o<g;o++)s[o]>a&&(a=s[o]);for(a++,n=numeric.rep([a],0),o=0;o<g;o++)n[s[o]]+=i[o]*e[r[o]];return n},numeric.Spline=function l(t,e,n,s,r){this.x=t,this.yl=e,this.yr=n,this.kl=s,this.kr=r},numeric.Spline.prototype._at=function l(g,e){var n=this.x,s=this.yl,r=this.yr,i=this.kl,o=this.kr,g,a,I,c,E=numeric.add,u=numeric.sub,Q=numeric.mul;a=u(Q(i[e],n[e+1]-n[e]),u(r[e+1],s[e])),I=E(Q(o[e+1],n[e]-n[e+1]),u(r[e+1],s[e])),c=(g-n[e])/(n[e+1]-n[e]);var p=c*(1-c);return E(E(E(Q(1-c,s[e]),Q(c,r[e+1])),Q(a,p*(1-c))),Q(I,p*c))},numeric.Spline.prototype.at=function l(t){if(typeof t=="number"){var e=this.x,o=e.length,n,s,r,i=Math.floor;for(n=0,s=o-1;s-n>1;)r=i((n+s)/2),e[r]<=t?n=r:s=r;return this._at(t,n)}var o=t.length,g,a=Array(o);for(g=o-1;g!==-1;--g)a[g]=this.at(t[g]);return a},numeric.Spline.prototype.diff=function l(){var t=this.x,e=this.yl,n=this.yr,s=this.kl,r=this.kr,i=e.length,o,g,a,I=s,c=r,E=Array(i),u=Array(i),Q=numeric.add,p=numeric.mul,w=numeric.div,y=numeric.sub;for(o=i-1;o!==-1;--o)g=t[o+1]-t[o],a=y(n[o+1],e[o]),E[o]=w(Q(p(a,6),p(s[o],-4*g),p(r[o+1],-2*g)),g*g),u[o+1]=w(Q(p(a,-6),p(s[o],2*g),p(r[o+1],4*g)),g*g);return new numeric.Spline(t,I,c,E,u)},numeric.Spline.prototype.roots=function l(){function t(dA){return dA*dA}var w=[],e=this.x,n=this.yl,s=this.yr,r=this.kl,i=this.kr;typeof n[0]=="number"&&(n=[n],s=[s],r=[r],i=[i]);var o=n.length,g=e.length-1,a,I,c,E,u,Q,p,w=Array(o),y,M,N,S,R,U,b,G,O,H,z,tA,nA,IA,iA,W,oA=Math.sqrt;for(a=0;a!==o;++a){for(E=n[a],u=s[a],Q=r[a],p=i[a],y=[],I=0;I!==g;I++){for(I>0&&u[I]*E[I]<0&&y.push(e[I]),O=e[I+1]-e[I],e[I],S=E[I],R=u[I+1],M=Q[I]/O,N=p[I+1]/O,G=t(M-N+3*(S-R))+12*N*S,U=N+3*S+2*M-3*R,b=3*(N+M+2*(S-R)),G<=0?(z=U/b,z>e[I]&&z<e[I+1]?H=[e[I],z,e[I+1]]:H=[e[I],e[I+1]]):(z=(U-oA(G))/b,tA=(U+oA(G))/b,H=[e[I]],z>e[I]&&z<e[I+1]&&H.push(z),tA>e[I]&&tA<e[I+1]&&H.push(tA),H.push(e[I+1])),IA=H[0],z=this._at(IA,I),c=0;c<H.length-1;c++){if(iA=H[c+1],tA=this._at(iA,I),z===0){y.push(IA),IA=iA,z=tA;continue}if(tA===0||z*tA>0){IA=iA,z=tA;continue}for(var hA=0;W=(z*iA-tA*IA)/(z-tA),!(W<=IA||W>=iA);)if(nA=this._at(W,I),nA*tA>0)iA=W,tA=nA,hA===-1&&(z*=.5),hA=-1;else if(nA*z>0)IA=W,z=nA,hA===1&&(tA*=.5),hA=1;else break;y.push(W),IA=H[c+1],z=this._at(IA,I)}tA===0&&y.push(iA)}w[a]=y}return typeof this.yl[0]=="number"?w[0]:w},numeric.spline=function l(t,e,n,s){var r=t.length,i=[],o=[],g=[],a,I=numeric.sub,c=numeric.mul,E=numeric.add;for(a=r-2;a>=0;a--)o[a]=t[a+1]-t[a],g[a]=I(e[a+1],e[a]);(typeof n=="string"||typeof s=="string")&&(n=s="periodic");var u=[[],[],[]];switch(typeof n){case"undefined":i[0]=c(3/(o[0]*o[0]),g[0]),u[0].push(0,0),u[1].push(0,1),u[2].push(2/o[0],1/o[0]);break;case"string":i[0]=E(c(3/(o[r-2]*o[r-2]),g[r-2]),c(3/(o[0]*o[0]),g[0])),u[0].push(0,0,0),u[1].push(r-2,0,1),u[2].push(1/o[r-2],2/o[r-2]+2/o[0],1/o[0]);break;default:i[0]=n,u[0].push(0),u[1].push(0),u[2].push(1);break}for(a=1;a<r-1;a++)i[a]=E(c(3/(o[a-1]*o[a-1]),g[a-1]),c(3/(o[a]*o[a]),g[a])),u[0].push(a,a,a),u[1].push(a-1,a,a+1),u[2].push(1/o[a-1],2/o[a-1]+2/o[a],1/o[a]);switch(typeof s){case"undefined":i[r-1]=c(3/(o[r-2]*o[r-2]),g[r-2]),u[0].push(r-1,r-1),u[1].push(r-2,r-1),u[2].push(1/o[r-2],2/o[r-2]);break;case"string":u[1][u[1].length-1]=0;break;default:i[r-1]=s,u[0].push(r-1),u[1].push(r-1),u[2].push(1);break}typeof i[0]!="number"?i=numeric.transpose(i):i=[i];var Q=Array(i.length);if(typeof n=="string")for(a=Q.length-1;a!==-1;--a)Q[a]=numeric.ccsLUPSolve(numeric.ccsLUP(numeric.ccsScatter(u)),i[a]),Q[a][r-1]=Q[a][0];else for(a=Q.length-1;a!==-1;--a)Q[a]=numeric.cLUsolve(numeric.cLU(u),i[a]);return typeof e[0]=="number"?Q=Q[0]:Q=numeric.transpose(Q),new numeric.Spline(t,e,e,Q,Q)},numeric.fftpow2=function l(t,e){var n=t.length;if(n!==1){var s=Math.cos,r=Math.sin,i,o,g=Array(n/2),a=Array(n/2),I=Array(n/2),c=Array(n/2);for(o=n/2,i=n-1;i!==-1;--i)--o,I[o]=t[i],c[o]=e[i],--i,g[o]=t[i],a[o]=e[i];l(g,a),l(I,c),o=n/2;var E,u=-6.283185307179586/n,Q,p;for(i=n-1;i!==-1;--i)--o,o===-1&&(o=n/2-1),E=u*i,Q=s(E),p=r(E),t[i]=g[o]+Q*I[o]-p*c[o],e[i]=a[o]+Q*c[o]+p*I[o]}},numeric._ifftpow2=function l(t,e){var n=t.length;if(n!==1){var s=Math.cos,r=Math.sin,i,o,g=Array(n/2),a=Array(n/2),I=Array(n/2),c=Array(n/2);for(o=n/2,i=n-1;i!==-1;--i)--o,I[o]=t[i],c[o]=e[i],--i,g[o]=t[i],a[o]=e[i];l(g,a),l(I,c),o=n/2;var E,u=6.283185307179586/n,Q,p;for(i=n-1;i!==-1;--i)--o,o===-1&&(o=n/2-1),E=u*i,Q=s(E),p=r(E),t[i]=g[o]+Q*I[o]-p*c[o],e[i]=a[o]+Q*c[o]+p*I[o]}},numeric.ifftpow2=function l(t,e){numeric._ifftpow2(t,e),numeric.diveq(t,t.length),numeric.diveq(e,e.length)},numeric.convpow2=function l(t,e,n,s){numeric.fftpow2(t,e),numeric.fftpow2(n,s);var r,i=t.length,o,g,a,I;for(r=i-1;r!==-1;--r)o=t[r],a=e[r],g=n[r],I=s[r],t[r]=o*g-a*I,e[r]=o*I+a*g;numeric.ifftpow2(t,e)},numeric.T.prototype.fft=function l(){var t=this.x,e=this.y,n=t.length,s=Math.log,r=s(2),i=Math.ceil(s(2*n-1)/r),o=Math.pow(2,i),g=numeric.rep([o],0),a=numeric.rep([o],0),I=Math.cos,c=Math.sin,E,u=-3.141592653589793/n,Q,p=numeric.rep([o],0),w=numeric.rep([o],0);for(E=0;E<n;E++)p[E]=t[E];if(typeof e<"u")for(E=0;E<n;E++)w[E]=e[E];for(g[0]=1,E=1;E<=o/2;E++)Q=u*E*E,g[E]=I(Q),a[E]=c(Q),g[o-E]=I(Q),a[o-E]=c(Q);var y=new numeric.T(p,w),M=new numeric.T(g,a);return y=y.mul(M),numeric.convpow2(y.x,y.y,numeric.clone(M.x),numeric.neg(M.y)),y=y.mul(M),y.x.length=n,y.y.length=n,y},numeric.T.prototype.ifft=function l(){var t=this.x,e=this.y,n=t.length,s=Math.log,r=s(2),i=Math.ceil(s(2*n-1)/r),o=Math.pow(2,i),g=numeric.rep([o],0),a=numeric.rep([o],0),I=Math.cos,c=Math.sin,E,u=3.141592653589793/n,Q,p=numeric.rep([o],0),w=numeric.rep([o],0);for(E=0;E<n;E++)p[E]=t[E];if(typeof e<"u")for(E=0;E<n;E++)w[E]=e[E];for(g[0]=1,E=1;E<=o/2;E++)Q=u*E*E,g[E]=I(Q),a[E]=c(Q),g[o-E]=I(Q),a[o-E]=c(Q);var y=new numeric.T(p,w),M=new numeric.T(g,a);return y=y.mul(M),numeric.convpow2(y.x,y.y,numeric.clone(M.x),numeric.neg(M.y)),y=y.mul(M),y.x.length=n,y.y.length=n,y.div(n)},numeric.gradient=function l(t,e){var n=e.length,s=t(e);if(isNaN(s))throw new Error("gradient: f(x) is a NaN!");var c=Math.max,r,i=numeric.clone(e),o,g,a=Array(n);numeric.div,numeric.sub;var I,c=Math.max,E=.001,u=Math.abs,Q=Math.min,p,w,y,M=0,N,S,R;for(r=0;r<n;r++)for(var U=c(1e-6*s,1e-8);;){if(++M,M>20)throw new Error("Numerical gradient fails");if(i[r]=e[r]+U,o=t(i),i[r]=e[r]-U,g=t(i),i[r]=e[r],isNaN(o)||isNaN(g)){U/=16;continue}if(a[r]=(o-g)/(2*U),p=e[r]-U,w=e[r],y=e[r]+U,N=(o-s)/U,S=(s-g)/U,R=c(u(a[r]),u(s),u(o),u(g),u(p),u(w),u(y),1e-8),I=Q(c(u(N-a[r]),u(S-a[r]),u(N-S))/R,U/R),I>E)U/=16;else break}return a},numeric.uncmin=function l(t,e,n,s,r,i,o){var g=numeric.gradient;typeof o>"u"&&(o={}),typeof n>"u"&&(n=1e-8),typeof s>"u"&&(s=function(yA){return g(t,yA)}),typeof r>"u"&&(r=1e3),e=numeric.clone(e);var a=e.length,I=t(e),c,E;if(isNaN(I))throw new Error("uncmin: f(x0) is a NaN!");var u=Math.max,Q=numeric.norm2;n=u(n,numeric.epsilon);var p,w,y,M=o.Hinv||numeric.identity(a),N=numeric.dot;numeric.inv;var S=numeric.sub,R=numeric.add,U=numeric.tensor,b=numeric.div,G=numeric.mul,O=numeric.all,H=numeric.isFinite,z=numeric.neg,tA=0,nA,IA,iA,W,oA,hA,dA,PA="";for(w=s(e);tA<r;){if(typeof i=="function"&&i(tA,e,I,w,M)){PA="Callback returned true";break}if(!O(H(w))){PA="Gradient has Infinity or NaN";break}if(p=z(N(M,w)),!O(H(p))){PA="Search direction has Infinity or NaN";break}if(dA=Q(p),dA<n){PA="Newton step smaller than tol";break}for(hA=1,E=N(w,p),IA=e;tA<r&&!(hA*dA<n);){if(nA=G(p,hA),IA=R(e,nA),c=t(IA),c-I>=.1*hA*E||isNaN(c)){hA*=.5,++tA;continue}break}if(hA*dA<n){PA="Line search step size smaller than tol";break}if(tA===r){PA="maxit reached during line search";break}y=s(IA),iA=S(y,w),oA=N(iA,nA),W=N(M,iA),M=S(R(M,G((oA+N(iA,W))/(oA*oA),U(nA,nA))),b(R(U(W,nA),U(nA,W)),oA)),e=IA,I=c,w=y,++tA}return{solution:e,f:I,gradient:w,invHessian:M,iterations:tA,message:PA}},numeric.Dopri=function l(t,e,n,s,r,i,o){this.x=t,this.y=e,this.f=n,this.ymid=s,this.iterations=r,this.events=o,this.message=i},numeric.Dopri.prototype._at=function l(p,e){function n(G){return G*G}var s=this,r=s.x,i=s.y,o=s.f,g=s.ymid;r.length;var a,I,c,E,u,Q,p,w,y=.5,M=numeric.add,N=numeric.mul,S=numeric.sub,R,U,b;return a=r[e],I=r[e+1],E=i[e],u=i[e+1],w=I-a,c=a+y*w,Q=g[e],R=S(o[e],N(E,1/(a-c)+2/(a-I))),U=S(o[e+1],N(u,1/(I-c)+2/(I-a))),b=[n(p-I)*(p-c)/n(a-I)/(a-c),n(p-a)*n(p-I)/n(a-c)/n(I-c),n(p-a)*(p-c)/n(I-a)/(I-c),(p-a)*n(p-I)*(p-c)/n(a-I)/(a-c),(p-I)*n(p-a)*(p-c)/n(a-I)/(I-c)],M(M(M(M(N(E,b[0]),N(Q,b[1])),N(u,b[2])),N(R,b[3])),N(U,b[4]))},numeric.Dopri.prototype.at=function l(t){var e,n,s,r=Math.floor;if(typeof t!="number"){var i=t.length,o=Array(i);for(e=i-1;e!==-1;--e)o[e]=this.at(t[e]);return o}var g=this.x;for(e=0,n=g.length-1;n-e>1;)s=r(.5*(e+n)),g[s]<=t?e=s:n=s;return this._at(t,e)},numeric.dopri=function l(t,e,n,s,r,i,o){typeof r>"u"&&(r=1e-6),typeof i>"u"&&(i=1e3);var g=[t],a=[n],I=[s(t,n)],c,E,u,Q,p,w,y=[],M=1/5,N=[3/40,9/40],S=[44/45,-56/15,32/9],R=[19372/6561,-25360/2187,64448/6561,-212/729],U=[9017/3168,-355/33,46732/5247,49/176,-5103/18656],b=[35/384,0,500/1113,125/192,-2187/6784,11/84],G=[.5*6025192743/30085553152,0,.5*51252292925/65400821598,.5*-2691868925/45128329728,.5*187940372067/1594534317056,.5*-1776094331/19743644256,.5*11237099/235043384],O=[1/5,3/10,4/5,8/9,1,1],H=[-71/57600,0,71/16695,-71/1920,17253/339200,-22/525,1/40],z=0,tA,nA,IA=(e-t)/10,iA=0,W=numeric.add,oA=numeric.mul,hA,dA,PA=Math.min,yA=Math.abs,_A=numeric.norminf,LA=Math.pow,BA=numeric.any,lA=numeric.lt,aA=numeric.and;numeric.sub;var wA,YA,DA,UA=new numeric.Dopri(g,a,I,y,-1,"");for(typeof o=="function"&&(wA=o(t,n));t<e&&iA<i;){if(++iA,t+IA>e&&(IA=e-t),c=s(t+O[0]*IA,W(n,oA(M*IA,I[z]))),E=s(t+O[1]*IA,W(W(n,oA(N[0]*IA,I[z])),oA(N[1]*IA,c))),u=s(t+O[2]*IA,W(W(W(n,oA(S[0]*IA,I[z])),oA(S[1]*IA,c)),oA(S[2]*IA,E))),Q=s(t+O[3]*IA,W(W(W(W(n,oA(R[0]*IA,I[z])),oA(R[1]*IA,c)),oA(R[2]*IA,E)),oA(R[3]*IA,u))),p=s(t+O[4]*IA,W(W(W(W(W(n,oA(U[0]*IA,I[z])),oA(U[1]*IA,c)),oA(U[2]*IA,E)),oA(U[3]*IA,u)),oA(U[4]*IA,Q))),hA=W(W(W(W(W(n,oA(I[z],IA*b[0])),oA(E,IA*b[2])),oA(u,IA*b[3])),oA(Q,IA*b[4])),oA(p,IA*b[5])),w=s(t+IA,hA),tA=W(W(W(W(W(oA(I[z],IA*H[0]),oA(E,IA*H[2])),oA(u,IA*H[3])),oA(Q,IA*H[4])),oA(p,IA*H[5])),oA(w,IA*H[6])),typeof tA=="number"?dA=yA(tA):dA=_A(tA),dA>r){if(IA=.2*IA*LA(r/dA,.25),t+IA===t){UA.msg="Step size became too small";break}continue}if(y[z]=W(W(W(W(W(W(n,oA(I[z],IA*G[0])),oA(E,IA*G[2])),oA(u,IA*G[3])),oA(Q,IA*G[4])),oA(p,IA*G[5])),oA(w,IA*G[6])),++z,g[z]=t+IA,a[z]=hA,I[z]=w,typeof o=="function"){var XA,bA=t,nt=t+.5*IA,It;if(YA=o(nt,y[z-1]),DA=aA(lA(wA,0),lA(0,YA)),BA(DA)||(bA=nt,nt=t+IA,wA=YA,YA=o(nt,hA),DA=aA(lA(wA,0),lA(0,YA))),BA(DA)){for(var St,gt,it=0,Nt=1,Pt=1;;){if(typeof wA=="number")It=(Pt*YA*bA-Nt*wA*nt)/(Pt*YA-Nt*wA);else for(It=nt,nA=wA.length-1;nA!==-1;--nA)wA[nA]<0&&YA[nA]>0&&(It=PA(It,(Pt*YA[nA]*bA-Nt*wA[nA]*nt)/(Pt*YA[nA]-Nt*wA[nA])));if(It<=bA||It>=nt)break;XA=UA._at(It,z-1),gt=o(It,XA),St=aA(lA(wA,0),lA(0,gt)),BA(St)?(nt=It,YA=gt,DA=St,Pt=1,it===-1?Nt*=.5:Nt=1,it=-1):(bA=It,wA=gt,Nt=1,it===1?Pt*=.5:Pt=1,it=1)}return hA=UA._at(.5*(t+It),z-1),UA.f[z]=s(It,XA),UA.x[z]=It,UA.y[z]=XA,UA.ymid[z-1]=hA,UA.events=DA,UA.iterations=iA,UA}}t+=IA,n=hA,wA=YA,IA=PA(.8*IA*LA(r/dA,.25),4*IA)}return UA.iterations=iA,UA},numeric.LU=function(l,t){t=t||!1;var e=Math.abs,n,s,r,i,o,g,a,I,c,E=l.length,u=E-1,Q=new Array(E);for(t||(l=numeric.clone(l)),r=0;r<E;++r){for(a=r,g=l[r],c=e(g[r]),s=r+1;s<E;++s)i=e(l[s][r]),c<i&&(c=i,a=s);for(Q[r]=a,a!=r&&(l[r]=l[a],l[a]=g,g=l[r]),o=g[r],n=r+1;n<E;++n)l[n][r]/=o;for(n=r+1;n<E;++n){for(I=l[n],s=r+1;s<u;++s)I[s]-=I[r]*g[s],++s,I[s]-=I[r]*g[s];s===u&&(I[s]-=I[r]*g[s])}}return{LU:l,P:Q}},numeric.LUsolve=function l(t,e){var n,s,r=t.LU,i=r.length,o=numeric.clone(e),g=t.P,a,I,c;for(n=i-1;n!==-1;--n)o[n]=e[n];for(n=0;n<i;++n)for(a=g[n],g[n]!==n&&(c=o[n],o[n]=o[a],o[a]=c),I=r[n],s=0;s<n;++s)o[n]-=o[s]*I[s];for(n=i-1;n>=0;--n){for(I=r[n],s=n+1;s<i;++s)o[n]-=o[s]*I[s];o[n]/=I[n]}return o},numeric.solve=function l(t,e,n){return numeric.LUsolve(numeric.LU(t,n),e)},numeric.echelonize=function l(t){var e=numeric.dim(t),n=e[0],s=e[1],r=numeric.identity(n),i=Array(n),o,g,a,I,c,E,u,Q,p=Math.abs,w=numeric.diveq;for(t=numeric.clone(t),o=0;o<n;++o){for(a=0,c=t[o],E=r[o],g=1;g<s;++g)p(c[a])<p(c[g])&&(a=g);for(i[o]=a,w(E,c[a]),w(c,c[a]),g=0;g<n;++g)if(g!==o){for(u=t[g],Q=u[a],I=s-1;I!==-1;--I)u[I]-=c[I]*Q;for(u=r[g],I=n-1;I!==-1;--I)u[I]-=E[I]*Q}}return{I:r,A:t,P:i}},numeric.__solveLP=function l(t,e,n,s,r,i,o){var g=numeric.sum;numeric.log;var a=numeric.mul,I=numeric.sub,c=numeric.dot,E=numeric.div,u=numeric.add,Q=t.length,p=n.length,w,y=!1,M=0,N=1;numeric.transpose(e),numeric.svd;var S=numeric.transpose;numeric.leq;var R=Math.sqrt,U=Math.abs;numeric.muleq,numeric.norminf,numeric.any;var b=Math.min,G=numeric.all,O=numeric.gt,H=Array(Q),z=Array(p);numeric.rep([p],1);var tA,nA=numeric.solve,IA=I(n,c(e,i)),iA,W=c(t,t),oA;for(iA=M;iA<r;++iA){var hA,dA;for(hA=p-1;hA!==-1;--hA)z[hA]=E(e[hA],IA[hA]);var PA=S(z);for(hA=Q-1;hA!==-1;--hA)H[hA]=g(PA[hA]);N=.25*U(W/c(t,H));var yA=100*R(W/c(H,H));for((!isFinite(N)||N>yA)&&(N=yA),oA=u(t,a(N,H)),tA=c(PA,z),hA=Q-1;hA!==-1;--hA)tA[hA][hA]+=1;dA=nA(tA,E(oA,N),!0);var _A=E(IA,c(e,dA)),LA=1;for(hA=p-1;hA!==-1;--hA)_A[hA]<0&&(LA=b(LA,-.999*_A[hA]));if(w=I(i,a(dA,LA)),IA=I(n,c(e,w)),!G(O(IA,0)))return{solution:i,message:"",iterations:iA};if(i=w,N<s)return{solution:w,message:"",iterations:iA};if(o){var BA=c(t,oA),lA=c(e,oA);for(y=!0,hA=p-1;hA!==-1;--hA)if(BA*lA[hA]<0){y=!1;break}}else i[Q-1]>=0?y=!1:y=!0;if(y)return{solution:w,message:"Unbounded",iterations:iA}}return{solution:i,message:"maximum iteration count exceeded",iterations:iA}},numeric._solveLP=function l(t,e,n,s,r){var i=t.length,o=n.length,Q;numeric.sum,numeric.log,numeric.mul;var g=numeric.sub,a=numeric.dot;numeric.div,numeric.add;var I=numeric.rep([i],0).concat([1]),c=numeric.rep([o,1],-1),E=numeric.blockMatrix([[e,c]]),u=n,Q=numeric.rep([i],0).concat(Math.max(0,numeric.sup(numeric.neg(n)))+1),p=numeric.__solveLP(I,E,u,s,r,Q,!1),w=numeric.clone(p.solution);w.length=i;var y=numeric.inf(g(n,a(e,w)));if(y<0)return{solution:NaN,message:"Infeasible",iterations:p.iterations};var M=numeric.__solveLP(t,e,n,s,r-p.iterations,w,!0);return M.iterations+=p.iterations,M},numeric.solveLP=function l(t,e,n,s,r,i,o){if(typeof o>"u"&&(o=1e3),typeof i>"u"&&(i=numeric.epsilon),typeof s>"u")return numeric._solveLP(t,e,n,i,o);var g=s.length,a=s[0].length,I=e.length,c=numeric.echelonize(s),E=numeric.rep([a],0),u=c.P,Q=[],p;for(p=u.length-1;p!==-1;--p)E[u[p]]=1;for(p=a-1;p!==-1;--p)E[p]===0&&Q.push(p);var w=numeric.getRange,y=numeric.linspace(0,g-1),M=numeric.linspace(0,I-1),N=w(s,y,Q),S=w(e,M,u),R=w(e,M,Q),U=numeric.dot,b=numeric.sub,G=U(S,c.I),O=b(R,U(G,N)),H=b(n,U(G,r)),z=Array(u.length),tA=Array(Q.length);for(p=u.length-1;p!==-1;--p)z[p]=t[u[p]];for(p=Q.length-1;p!==-1;--p)tA[p]=t[Q[p]];var nA=b(tA,U(z,U(c.I,N))),IA=numeric._solveLP(nA,O,H,i,o),iA=IA.solution;if(iA!==iA)return IA;var W=U(c.I,b(r,U(N,iA))),oA=Array(t.length);for(p=u.length-1;p!==-1;--p)oA[u[p]]=W[p];for(p=Q.length-1;p!==-1;--p)oA[Q[p]]=iA[p];return{solution:oA,message:IA.message,iterations:IA.iterations}},numeric.MPStoLP=function l(t){t instanceof String&&t.split(`
170
+ `);var e=0,n=["Initial state","NAME","ROWS","COLUMNS","RHS","BOUNDS","ENDATA"],s=t.length,r,i,o,g=0,a={},I=[],c=0,E={},u=0,Q,p=[],w=[],y=[];function M(b){throw new Error("MPStoLP: "+b+`
171
+ Line `+r+": "+t[r]+`
172
+ Current state: `+n[e]+`
173
+ `)}for(r=0;r<s;++r){o=t[r];var N=o.match(/\S*/g),S=[];for(i=0;i<N.length;++i)N[i]!==""&&S.push(N[i]);if(S.length!==0){for(i=0;i<n.length&&o.substr(0,n[i].length)!==n[i];++i);if(i<n.length){if(e=i,i===1&&(Q=S[1]),i===6)return{name:Q,c:p,A:numeric.transpose(w),b:y,rows:a,vars:E};continue}switch(e){case 0:case 1:M("Unexpected line");case 2:switch(S[0]){case"N":g===0?g=S[1]:M("Two or more N rows");break;case"L":a[S[1]]=c,I[c]=1,y[c]=0,++c;break;case"G":a[S[1]]=c,I[c]=-1,y[c]=0,++c;break;case"E":a[S[1]]=c,I[c]=0,y[c]=0,++c;break;default:M("Parse error "+numeric.prettyPrint(S))}break;case 3:E.hasOwnProperty(S[0])||(E[S[0]]=u,p[u]=0,w[u]=numeric.rep([c],0),++u);var R=E[S[0]];for(i=1;i<S.length;i+=2){if(S[i]===g){p[R]=parseFloat(S[i+1]);continue}var U=a[S[i]];w[R][U]=(I[U]<0?-1:1)*parseFloat(S[i+1])}break;case 4:for(i=1;i<S.length;i+=2)y[a[S[i]]]=(I[a[S[i]]]<0?-1:1)*parseFloat(S[i+1]);break;case 5:break;case 6:M("Internal error")}}}M("Reached end of file without ENDATA")},numeric.seedrandom={pow:Math.pow,random:Math.random},(function(l,t,e,n,s,r,i){t.seedrandom=function(E,u){var Q=[],p;return E=a(g(u?[E,l]:arguments.length?E:[new Date().getTime(),l,window],3),Q),p=new o(Q),a(p.S,l),t.random=function(){for(var y=p.g(n),M=i,N=0;y<s;)y=(y+N)*e,M*=e,N=p.g(1);for(;y>=r;)y/=2,M/=2,N>>>=1;return(y+N)/M},E};function o(c){var E,u,Q=this,p=c.length,w=0,y=Q.i=Q.j=Q.m=0;for(Q.S=[],Q.c=[],p||(c=[p++]);w<e;)Q.S[w]=w++;for(w=0;w<e;w++)E=Q.S[w],y=I(y+E+c[w%p]),u=Q.S[y],Q.S[w]=u,Q.S[y]=E;Q.g=function(N){var S=Q.S,R=I(Q.i+1),U=S[R],b=I(Q.j+U),G=S[b];S[R]=G,S[b]=U;for(var O=S[I(U+G)];--N;)R=I(R+1),U=S[R],b=I(b+U),G=S[b],S[R]=G,S[b]=U,O=O*e+S[I(U+G)];return Q.i=R,Q.j=b,O},Q.g(e)}function g(c,E,u,Q,p){if(u=[],p=typeof c,E&&p=="object"){for(Q in c)if(Q.indexOf("S")<5)try{u.push(g(c[Q],E-1))}catch{}}return u.length?u:c+(p!="string"?"\0":"")}function a(c,E,u,Q){for(c+="",u=0,Q=0;Q<c.length;Q++)E[I(Q)]=I((u^=E[I(Q)]*19)+c.charCodeAt(Q));c="";for(Q in E)c+=String.fromCharCode(E[Q]);return c}function I(c){return c&e-1}i=t.pow(e,n),s=t.pow(2,s),r=s*2,a(t.random(),l)})([],numeric.seedrandom,256,6,52),(function(l){function t(g){if(typeof g!="object")return g;var a=[],I,c=g.length;for(I=0;I<c;I++)a[I+1]=t(g[I]);return a}function e(g){if(typeof g!="object")return g;var a=[],I,c=g.length;for(I=1;I<c;I++)a[I-1]=e(g[I]);return a}function n(g,a,I){var c,E,u,Q,p;for(u=1;u<=I;u=u+1){for(g[u][u]=1/g[u][u],p=-g[u][u],c=1;c<u;c=c+1)g[c][u]=p*g[c][u];if(Q=u+1,I<Q)break;for(E=Q;E<=I;E=E+1)for(p=g[u][E],g[u][E]=0,c=1;c<=u;c=c+1)g[c][E]=g[c][E]+p*g[c][u]}}function s(g,a,I,c){var E,u,Q,p;for(u=1;u<=I;u=u+1){for(p=0,E=1;E<u;E=E+1)p=p+g[E][u]*c[E];c[u]=(c[u]-p)/g[u][u]}for(Q=1;Q<=I;Q=Q+1)for(u=I+1-Q,c[u]=c[u]/g[u][u],p=-c[u],E=1;E<u;E=E+1)c[E]=c[E]+p*g[E][u]}function r(g,a,I,c){var E,u,Q,p,w,y;for(u=1;u<=I;u=u+1){if(c[1]=u,y=0,Q=u-1,Q<1){if(y=g[u][u]-y,y<=0)break;g[u][u]=Math.sqrt(y)}else{for(p=1;p<=Q;p=p+1){for(w=g[p][u],E=1;E<p;E=E+1)w=w-g[E][u]*g[E][p];w=w/g[p][p],g[p][u]=w,y=y+w*w}if(y=g[u][u]-y,y<=0)break;g[u][u]=Math.sqrt(y)}c[1]=0}}function i(g,a,I,c,E,u,Q,p,w,y,M,N,S,R,U,b){var G,O,H,z,tA,nA,IA,iA,W,oA,hA,dA,PA,yA,_A,LA,BA,lA,aA,wA,YA,DA,UA,XA,bA,nt,It;PA=Math.min(c,y),H=2*c+PA*(PA+5)/2+2*y+1,XA=1e-60;do XA=XA+XA,bA=1+.1*XA,nt=1+.2*XA;while(bA<=1||nt<=1);for(G=1;G<=c;G=G+1)U[G]=a[G];for(G=c+1;G<=H;G=G+1)U[G]=0;for(G=1;G<=y;G=G+1)N[G]=0;if(tA=[],b[1]===0){if(r(g,I,c,tA),tA[1]!==0){b[1]=2;return}s(g,I,c,a),n(g,I,c)}else{for(O=1;O<=c;O=O+1)for(E[O]=0,G=1;G<=O;G=G+1)E[O]=E[O]+g[G][O]*a[G];for(O=1;O<=c;O=O+1)for(a[O]=0,G=O;G<=c;G=G+1)a[O]=a[O]+g[O][G]*E[G]}for(u[1]=0,O=1;O<=c;O=O+1)for(E[O]=a[O],u[1]=u[1]+U[O]*E[O],U[O]=0,G=O+1;G<=c;G=G+1)g[G][O]=0;for(u[1]=-u[1]/2,b[1]=0,IA=c,iA=IA+c,hA=iA+PA,W=hA+PA+1,oA=W+PA*(PA+1)/2,yA=oA+y,G=1;G<=y;G=G+1){for(LA=0,O=1;O<=c;O=O+1)LA=LA+Q[O][G]*Q[O][G];U[yA+G]=Math.sqrt(LA)}S=0,R[1]=0,R[2]=0;function St(){for(R[1]=R[1]+1,H=oA,G=1;G<=y;G=G+1){for(H=H+1,LA=-p[G],O=1;O<=c;O=O+1)LA=LA+Q[O][G]*E[O];if(Math.abs(LA)<XA&&(LA=0),G>M)U[H]=LA;else if(U[H]=-Math.abs(LA),LA>0){for(O=1;O<=c;O=O+1)Q[O][G]=-Q[O][G];p[G]=-p[G]}}for(G=1;G<=S;G=G+1)U[oA+N[G]]=0;for(dA=0,_A=0,G=1;G<=y;G=G+1)U[oA+G]<_A*U[yA+G]&&(dA=G,_A=U[oA+G]/U[yA+G]);return dA===0?999:0}function gt(){for(G=1;G<=c;G=G+1){for(LA=0,O=1;O<=c;O=O+1)LA=LA+g[O][G]*Q[O][dA];U[G]=LA}for(z=IA,G=1;G<=c;G=G+1)U[z+G]=0;for(O=S+1;O<=c;O=O+1)for(G=1;G<=c;G=G+1)U[z+G]=U[z+G]+g[G][O]*U[O];for(DA=!0,G=S;G>=1;G=G-1){for(LA=U[G],H=W+G*(G+3)/2,z=H-G,O=G+1;O<=S;O=O+1)LA=LA-U[H]*U[iA+O],H=H+O;if(LA=LA/U[z],U[iA+G]=LA,N[G]<M||LA<0)break;DA=!1,nA=G}if(!DA)for(BA=U[hA+nA]/U[iA+nA],G=1;G<=S&&!(N[G]<M||U[iA+G]<0);G=G+1)_A=U[hA+G]/U[iA+G],_A<BA&&(BA=_A,nA=G);for(LA=0,G=IA+1;G<=IA+c;G=G+1)LA=LA+U[G]*U[G];if(Math.abs(LA)<=XA){if(DA)return b[1]=1,999;for(G=1;G<=S;G=G+1)U[hA+G]=U[hA+G]-BA*U[iA+G];return U[hA+S+1]=U[hA+S+1]+BA,700}else{for(LA=0,G=1;G<=c;G=G+1)LA=LA+U[IA+G]*Q[G][dA];for(lA=-U[oA+dA]/LA,UA=!0,DA||BA<lA&&(lA=BA,UA=!1),G=1;G<=c;G=G+1)E[G]=E[G]+lA*U[IA+G],Math.abs(E[G])<XA&&(E[G]=0);for(u[1]=u[1]+lA*LA*(lA/2+U[hA+S+1]),G=1;G<=S;G=G+1)U[hA+G]=U[hA+G]-lA*U[iA+G];if(U[hA+S+1]=U[hA+S+1]+lA,UA){for(S=S+1,N[S]=dA,H=W+(S-1)*S/2+1,G=1;G<=S-1;G=G+1)U[H]=U[G],H=H+1;if(S===c)U[H]=U[c];else{for(G=c;G>=S+1&&!(U[G]===0||(aA=Math.max(Math.abs(U[G-1]),Math.abs(U[G])),wA=Math.min(Math.abs(U[G-1]),Math.abs(U[G])),U[G-1]>=0?_A=Math.abs(aA*Math.sqrt(1+wA*wA/(aA*aA))):_A=-Math.abs(aA*Math.sqrt(1+wA*wA/(aA*aA))),aA=U[G-1]/_A,wA=U[G]/_A,aA===1));G=G-1)if(aA===0)for(U[G-1]=wA*_A,O=1;O<=c;O=O+1)_A=g[O][G-1],g[O][G-1]=g[O][G],g[O][G]=_A;else for(U[G-1]=_A,YA=wA/(1+aA),O=1;O<=c;O=O+1)_A=aA*g[O][G-1]+wA*g[O][G],g[O][G]=YA*(g[O][G-1]+_A)-g[O][G],g[O][G-1]=_A;U[H]=U[S]}}else{for(LA=-p[dA],O=1;O<=c;O=O+1)LA=LA+E[O]*Q[O][dA];if(dA>M)U[oA+dA]=LA;else if(U[oA+dA]=-Math.abs(LA),LA>0){for(O=1;O<=c;O=O+1)Q[O][dA]=-Q[O][dA];p[dA]=-p[dA]}return 700}}return 0}function it(){if(H=W+nA*(nA+1)/2+1,z=H+nA,U[z]===0||(aA=Math.max(Math.abs(U[z-1]),Math.abs(U[z])),wA=Math.min(Math.abs(U[z-1]),Math.abs(U[z])),U[z-1]>=0?_A=Math.abs(aA*Math.sqrt(1+wA*wA/(aA*aA))):_A=-Math.abs(aA*Math.sqrt(1+wA*wA/(aA*aA))),aA=U[z-1]/_A,wA=U[z]/_A,aA===1))return 798;if(aA===0){for(G=nA+1;G<=S;G=G+1)_A=U[z-1],U[z-1]=U[z],U[z]=_A,z=z+G;for(G=1;G<=c;G=G+1)_A=g[G][nA],g[G][nA]=g[G][nA+1],g[G][nA+1]=_A}else{for(YA=wA/(1+aA),G=nA+1;G<=S;G=G+1)_A=aA*U[z-1]+wA*U[z],U[z]=YA*(U[z-1]+_A)-U[z],U[z-1]=_A,z=z+G;for(G=1;G<=c;G=G+1)_A=aA*g[G][nA]+wA*g[G][nA+1],g[G][nA+1]=YA*(g[G][nA]+_A)-g[G][nA+1],g[G][nA]=_A}return 0}function Nt(){for(z=H-nA,G=1;G<=nA;G=G+1)U[z]=U[H],H=H+1,z=z+1;return U[hA+nA]=U[hA+nA+1],N[nA]=N[nA+1],nA=nA+1,nA<S?797:0}function Pt(){return U[hA+S]=U[hA+S+1],U[hA+S+1]=0,N[S]=0,S=S-1,R[2]=R[2]+1,0}for(It=0;;){if(It=St(),It===999)return;for(;It=gt(),It!==0;){if(It===999)return;if(It===700)if(nA===S)Pt();else{for(;it(),It=Nt(),It===797;);Pt()}}}}function o(g,a,I,c,E,u){g=t(g),a=t(a),I=t(I);var Q,p,w,y,M,N=[],S=[],R=[],U=[],b=[],G;if(E=E||0,u=u?t(u):[void 0,0],c=c?t(c):[],p=g.length-1,w=I[1].length-1,!c)for(Q=1;Q<=w;Q=Q+1)c[Q]=0;for(Q=1;Q<=w;Q=Q+1)S[Q]=0;for(y=0,M=Math.min(p,w),Q=1;Q<=p;Q=Q+1)R[Q]=0;for(N[1]=0,Q=1;Q<=2*p+M*(M+5)/2+2*w+1;Q=Q+1)U[Q]=0;for(Q=1;Q<=2;Q=Q+1)b[Q]=0;return i(g,a,p,p,R,N,I,c,p,w,E,S,y,b,U,u),G="",u[1]===1&&(G="constraints are inconsistent, no solution!"),u[1]===2&&(G="matrix D in quadratic function is not positive definite!"),{solution:e(R),value:e(N),unconstrained_solution:e(a),iterations:e(b),iact:e(S),message:G}}l.solveQP=o})(numeric),numeric.svd=function l(t){var e,n=numeric.epsilon,s=1e-64/n,r=50,i=0,o=0,g=0,a=0,I=0,c=numeric.clone(t),E=c.length,u=c[0].length;if(E<u)throw"Need more rows than columns";var Q=new Array(u),p=new Array(u);for(o=0;o<u;o++)Q[o]=p[o]=0;var w=numeric.rep([u,u],0);function y(tA,nA){return tA=Math.abs(tA),nA=Math.abs(nA),tA>nA?tA*Math.sqrt(1+nA*nA/tA/tA):nA==0?tA:nA*Math.sqrt(1+tA*tA/nA/nA)}var M=0,N=0,S=0,R=0,U=0,b=0,G=0;for(o=0;o<u;o++){for(Q[o]=N,G=0,I=o+1,g=o;g<E;g++)G+=c[g][o]*c[g][o];if(G<=s)N=0;else for(M=c[o][o],N=Math.sqrt(G),M>=0&&(N=-N),S=M*N-G,c[o][o]=M-N,g=I;g<u;g++){for(G=0,a=o;a<E;a++)G+=c[a][o]*c[a][g];for(M=G/S,a=o;a<E;a++)c[a][g]+=M*c[a][o]}for(p[o]=N,G=0,g=I;g<u;g++)G=G+c[o][g]*c[o][g];if(G<=s)N=0;else{for(M=c[o][o+1],N=Math.sqrt(G),M>=0&&(N=-N),S=M*N-G,c[o][o+1]=M-N,g=I;g<u;g++)Q[g]=c[o][g]/S;for(g=I;g<E;g++){for(G=0,a=I;a<u;a++)G+=c[g][a]*c[o][a];for(a=I;a<u;a++)c[g][a]+=G*Q[a]}}U=Math.abs(p[o])+Math.abs(Q[o]),U>R&&(R=U)}for(o=u-1;o!=-1;o+=-1){if(N!=0){for(S=N*c[o][o+1],g=I;g<u;g++)w[g][o]=c[o][g]/S;for(g=I;g<u;g++){for(G=0,a=I;a<u;a++)G+=c[o][a]*w[a][g];for(a=I;a<u;a++)w[a][g]+=G*w[a][o]}}for(g=I;g<u;g++)w[o][g]=0,w[g][o]=0;w[o][o]=1,N=Q[o],I=o}for(o=u-1;o!=-1;o+=-1){for(I=o+1,N=p[o],g=I;g<u;g++)c[o][g]=0;if(N!=0){for(S=c[o][o]*N,g=I;g<u;g++){for(G=0,a=I;a<E;a++)G+=c[a][o]*c[a][g];for(M=G/S,a=o;a<E;a++)c[a][g]+=M*c[a][o]}for(g=o;g<E;g++)c[g][o]=c[g][o]/N}else for(g=o;g<E;g++)c[g][o]=0;c[o][o]+=1}for(n=n*R,a=u-1;a!=-1;a+=-1)for(var O=0;O<r;O++){var H=!1;for(I=a;I!=-1;I+=-1){if(Math.abs(Q[I])<=n){H=!0;break}if(Math.abs(p[I-1])<=n)break}if(!H){i=0,G=1;var z=I-1;for(o=I;o<a+1&&(M=G*Q[o],Q[o]=i*Q[o],!(Math.abs(M)<=n));o++)for(N=p[o],S=y(M,N),p[o]=S,i=N/S,G=-M/S,g=0;g<E;g++)U=c[g][z],b=c[g][o],c[g][z]=U*i+b*G,c[g][o]=-U*G+b*i}if(b=p[a],I==a){if(b<0)for(p[a]=-b,g=0;g<u;g++)w[g][a]=-w[g][a];break}if(O>=r-1)throw"Error: no convergence.";for(R=p[I],U=p[a-1],N=Q[a-1],S=Q[a],M=((U-b)*(U+b)+(N-S)*(N+S))/(2*S*U),N=y(M,1),M<0?M=((R-b)*(R+b)+S*(U/(M-N)-S))/R:M=((R-b)*(R+b)+S*(U/(M+N)-S))/R,i=1,G=1,o=I+1;o<a+1;o++){for(N=Q[o],U=p[o],S=G*N,N=i*N,b=y(M,S),Q[o-1]=b,i=M/b,G=S/b,M=R*i+N*G,N=-R*G+N*i,S=U*G,U=U*i,g=0;g<u;g++)R=w[g][o-1],b=w[g][o],w[g][o-1]=R*i+b*G,w[g][o]=-R*G+b*i;for(b=y(M,S),p[o-1]=b,i=M/b,G=S/b,M=i*N+G*U,R=-G*N+i*U,g=0;g<E;g++)U=c[g][o-1],b=c[g][o],c[g][o-1]=U*i+b*G,c[g][o]=-U*G+b*i}Q[I]=0,Q[a]=M,p[a]=R}for(o=0;o<p.length;o++)p[o]<n&&(p[o]=0);for(o=0;o<u;o++)for(g=o-1;g>=0;g--)if(p[g]<p[o]){for(i=p[g],p[g]=p[o],p[o]=i,a=0;a<c.length;a++)e=c[a][o],c[a][o]=c[a][g],c[a][g]=e;for(a=0;a<w.length;a++)e=w[a][o],w[a][o]=w[a][g],w[a][g]=e;o=g}return{U:c,S:p,V:w}}})(numeric1_2_6)),numeric1_2_6}var numeric1_2_6Exports=requireNumeric1_2_6(),EN_GEO_TYPE=(l=>(l.MATRIX_3="m3",l.MATRIX_4="m4",l.COORD_2="d2",l.COORD_3="d3",l.VEC_2="v2",l.VEC_3="v3",l.LN_2="l2",l.LN_3="l3",l.ARC_2="a2",l.ARC_3="a3",l.CIRCLE_3="c3",l.INTERSECT_3D="x3",l.NURBS_CURVE_3D="n3",l.NURBS_CURVE_2D="n2",l.SMOOTHPOLY_2D="s2",l.SMOOTHPOLY_3D="s3",l.OFFSET_CURVE_2D="f2",l.OFFSET_CURVE_3D="f3",l.EXTEND_CURVE_2D="e2",l.POLY_CURVE="pc",l.LOOP="lp",l.POLYGON="pg",l.PLANE="pl",l.CYLINDER="cd",l.TRIM="ts",l.BREP_VERTEX="bv",l.BREP_COEDGE="bc",l.BREP_EDGE="be",l.BREP_WIRE="bw",l.BREP_FACE="bf",l.BREP_SHELL="bs",l.BREP_BODY="bb",l))(EN_GEO_TYPE||{});class GeoElement{dump(){const t={type:this.getType()};return this.dUserData&&(t._d=this.dUserData),t}load(t){return this.dUserData=t._d,this}clone(){const t=new this.constructor;return t.load(this.dump()),t.userData=this.userData,t}toString(){return JSON.stringify(this.dump())}isVector2(){return this.getType()===EN_GEO_TYPE.VEC_2}isVector3(){return this.getType()===EN_GEO_TYPE.VEC_3}isLine2d(){return this.getType()===EN_GEO_TYPE.LN_2}isArc2d(){return this.getType()===EN_GEO_TYPE.ARC_2}isNurbsCurve2d(){return this.getType()===EN_GEO_TYPE.NURBS_CURVE_2D}isOffsetCurve2d(){return this.getType()===EN_GEO_TYPE.OFFSET_CURVE_2D}isSmoothPoly2d(){return this.getType()===EN_GEO_TYPE.SMOOTHPOLY_2D}isSmoothPoly3d(){return this.getType()===EN_GEO_TYPE.SMOOTHPOLY_3D}isLoop(){return this.getType()===EN_GEO_TYPE.LOOP}isLine3d(){return this.getType()===EN_GEO_TYPE.LN_3}isArc3d(){return this.getType()===EN_GEO_TYPE.ARC_3}isCircle3d(){return this.getType()===EN_GEO_TYPE.CIRCLE_3}isOffsetCurve3d(){return this.getType()===EN_GEO_TYPE.OFFSET_CURVE_3D}isNurbsCurve3d(){return this.getType()===EN_GEO_TYPE.NURBS_CURVE_3D}isLine(){return this.isLine2d()||this.isLine3d()}isArc(){return this.isArc2d()||this.isArc3d()}isNurbsCurve(){return this.isNurbsCurve2d()||this.isNurbsCurve3d()}isOffsetCurve(){return this.isOffsetCurve2d()||this.isOffsetCurve3d()}isPlane(){return this.getType()===EN_GEO_TYPE.PLANE}isCylinder(){return this.getType()===EN_GEO_TYPE.CYLINDER}}class IVector extends GeoElement{constructor(){super()}get data(){return this._data}isSameDirection(t,e=Tol.ANGLE){return this.isParallel(t,e)&&this.dot(t)>0}isOpposite(t,e=Tol.ANGLE){return this.isParallel(t,e)&&this.dot(t)<0}isZero(t=Tol.LENGTH){return this.getSqLength()<=t*t}toArray2(){return[this._data[0],this._data[1]]}toArray3(){return[this._data[0],this._data[1],this._data[2]||0]}toXY(){return{x:this._data[0],y:this._data[1]}}toXYZ(){return{x:this._data[0],y:this._data[1],z:this._data[2]||0}}getLength(){return Math.sqrt(this.getSqLength())}getSqLength(){let t=0;for(const e of this._data)t+=e*e;return t}dump(){return{type:this.getType(),data:this._data}}load({data:t}){return this._resetData(t),this}_resetData(t){return this._data.splice(0),t&&this._data.push(...t),this}}class Vec extends IVector{constructor(){super()}get x(){return this._data[0]}get y(){return this._data[1]}set x(t){this._data[0]=t}set y(t){this._data[1]=t}multiply(t){for(let e=0;e<this._data.length;e++)this._data[e]*=t;return this}reverse(){for(let t=0;t<this._data.length;t++)this._data[t]=-this._data[t];return this}normalize(){const t=this.getSqLength();if(Util.isNearlyEqual(t,1,Tol.CALCULATE_EPS2))return this;const e=this.z;if(t<Tol.CALCULATE_EPS2)return this;const n=Math.sqrt(t),s=this.x/n,r=this.y/n;return e===void 0?this.resetFromArray([s,r]):this.resetFromArray([s,r,e/n]),this}translate(t){return this.add(t)}resetFromArray(t){for(let e=this._data.length-1;e>=0;e--)this._data[e]=t[e];return this}}class Loader{static{this._ctors=new Map}static registerGeo(...t){for(const e of t){const n=new e().getType();if(this._ctors.has(n)){console.error("registerGeo duplicated");return}this._ctors.set(n,e)}}static reflect(t){const e=[];let n=t;try{let r=JSON.parse(n);n=JSON.stringify(r)}catch{}const s=n.split(`
174
+ `);for(let r of s)if(r=r.trim(),!(r.length<10))try{const i=JSON.parse(r);if(Array.isArray(i))i.flat(100).forEach(o=>{const g=this.load(o);e.push(g)});else{const o=this.load(i);e.push(o)}}catch(i){console.error(i)}return e}static load(t){const e=this._ctors.get(t.type);if(!e)throw new Error(`请注册类型:${t.type}`);return new e().load(t)}static reflectMesh(t){const e=[],n=t.split(`
175
+ `);for(let s of n)if(s=s.trim(),!(s.length<10))try{const r=JSON.parse(s);if(!r.faces||!r.normals||!r.vertices||!r.uvs)throw new Error("load数据的类型不正确");r.type="RENDER_MESH",r.data=[r.vertices,r.faces,r.normals,r.uvs],r.vertices=[],r.faces=[],r.uvs=[];const i=this.load(r);e.push(i)}catch(r){console.error(r)}return e}}function registerGeo(l){Loader.registerGeo(l)}class Matrix extends GeoElement{constructor(t,e,n=!0){if(super(),this._dim=t,e)if(n){this._data=new Array(t);for(let s=0;s<t;s++)this._data[s]=e[s].slice(0)}else this._data=e;else{this._data=new Array(t);for(let s=0;s<t;s++){const r=new Array(t).fill(0);r[s]=1,this._data[s]=r}}}determinant(){return numeric1_2_6Exports.det(this._data)}inverse(){try{const t=numeric1_2_6Exports.inv(this._data);return this.copy(t)}catch{return}}get dim(){return this._dim}get data(){return this._data}set(t,e,n){MathAssert.assert(t<this._dim&&e<this._dim,"error! out of range"),this._data[e][t]=n}resetIdentity(){for(let t=0;t<this._dim;t++){const e=this._data[t];e.fill(0),e[t]=1}return this}isIdentity(){for(let t=0;t<this._dim;t++)for(let e=0;e<this._dim;e++)if(t===e){if(!Util.isNearlyEqual(this.data[t][e],1,Tol.NUMBER))return!1}else if(!Util.isNearly0(this.data[t][e],Tol.NUMBER))return!1;return!0}multiply(t){const e=t.data||t,n=numeric1_2_6Exports.dot(e,this._data);return this.copy(n),this}preMultiply(t){const e=t.data||t,n=numeric1_2_6Exports.dot(this._data,e);return this.copy(n),this}multiplyScalar(t){for(const e of this._data)for(let n=0;n<this._dim;n++)e[n]*=t;return this}transpose(){const t=numeric1_2_6Exports.transpose(this._data);return this.copy(t)}copy(t){const e=t.data||t;for(let n=0;n<this._dim;n++)this._data[n].splice(0,this._dim,...e[n]);return this}dump(){return{type:this.getType(),data:this._data}}load({data:t}){return this.copy(t)}}var __getOwnPropDesc$t=Object.getOwnPropertyDescriptor,__decorateClass$t=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$t(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Matrix3=class extends Matrix{static make(t,e=!0){return t instanceof exports.Matrix3?e?t.clone():t:new exports.Matrix3(t.data||t,e)}static makeTranslate({x:t,y:e}){return new exports.Matrix3([[1,0,0],[0,1,0],[t,e,1]],!1)}static makeRotate(t,e){const n=Math.cos(e),s=Math.sin(e),r=(1-n)*t.x+s*t.y,i=(1-n)*t.y-s*t.x;return new exports.Matrix3([[n,s,0],[-s,n,0],[r,i,1]],!1)}static makeScale(t,e){const n=typeof e=="number"?{x:e,y:e}:e,s=(1-n.x)*t.x,r=(1-n.y)*t.y;return new exports.Matrix3([[n.x,0,0],[0,n.y,0],[s,r,1]],!1)}static makeMirror(t,e){const{x:n,y:s}=new exports.Vec2(-e.y,e.x).normalize(),r=2*n*n,i=2*n*s,o=2*s*s,g=2*(n*t.x+s*t.y);return new exports.Matrix3([[1-r,-i,0],[-i,1-o,0],[g*n,g*s,1]],!1)}static isSvdMirror(t){return t.scale.x<0}static assertScaleEqual(t){const e=Math.abs(t.x)>Tol.NUMBER&&Math.abs(Math.abs(t.y/t.x)-1)<Tol.NUMBER;return MathAssert.warn(e,"暂不支持非等比缩放"),e}constructor(t,e=!0){super(3,t,e)}get data(){return this._data}toArray(t,e){const n=t||[],s=e||0,[r,i,o]=this._data;return n.splice(s,9,r[0],r[1],r[2],i[0],i[1],i[2],o[0],o[1],o[2]),n}fromArray(t,e){const n=e||0,[s,r,i]=this._data;return s[0]=t[n],s[1]=t[n+1],s[2]=t[n+2],r[0]=t[n+3],r[1]=t[n+4],r[2]=t[n+5],i[0]=t[n+6],i[1]=t[n+7],i[2]=t[n+8],this}getBasicVec(t){return new exports.Vec2(this._data[t])}isMirror(){const t=new exports.Vec2(this._data[0]),e=new exports.Vec2(this._data[1]);return t.cross(e)<0}applyTranslate({x:t,y:e}){const n=this._data[2];return n[0]+=t,n[1]+=e,this}applyRotate(t,e){const n=exports.Matrix3.makeRotate(t,e);return this.preMultiply(n)}applyMirror(t,e){const n=exports.Matrix3.makeMirror(t,e);return this.preMultiply(n)}applyScale(t,e){const n=exports.Matrix3.makeScale(t,e);return this.preMultiply(n)}decomposeTRS(){const t=this.getBasicVec(0),e=this.getBasicVec(1);if(!t.isPerpendicular(e))return[];const[n,s,r]=this._data,i=exports.Matrix3.makeTranslate({x:r[0],y:r[1]}),o=this.determinant()>0?1:-1,g=t.getLength()*o,a=e.getLength(),I=new exports.Matrix3([[g,0,0],[0,a,0],[0,0,1]],!1),c=new exports.Matrix3([[n[0]/g,n[1]/g,0],[s[0]/a,s[1]/a,0],[0,0,1]],!1);return[i,c,I]}decompose(){const t=[this.data[0].slice(0,2),this.data[1].slice(0,2)],e=numeric1_2_6Exports.svd(t);numeric1_2_6Exports.det(e.U)<0&&(e.U[0][0]*=-1,e.U[1][0]*=-1,e.S[0]*=-1),numeric1_2_6Exports.det(e.V)<0&&(e.V[0][0]*=-1,e.V[1][0]*=-1,e.S[0]*=-1);const n=[[e.V[0][0],e.V[1][0],0],[e.V[0][1],e.V[1][1],0],[this.data[2][0],this.data[2][1],1]],s=[[...e.U[0],0],[...e.U[1],0],[0,0,1]];return{uTransform:new exports.Matrix3(n,!1),scale:new exports.Vec2(e.S),vRotate:new exports.Matrix3(s,!1)}}multiplied(t){return this.clone().multiply(t)}preMultiplied(t){return this.clone().preMultiply(t)}multipliedScalar(t){return this.clone().multiplyScalar(t)}multipliedVector3(t){return numeric1_2_6Exports.dot(t,this.data)}inversed(){return this.clone().inverse()}transposed(){return this.clone().transpose()}getType(){return EN_GEO_TYPE.MATRIX_3}clone(){return super.clone()}dump(){return super.dump()}};exports.Matrix3=__decorateClass$t([registerGeo],exports.Matrix3);var __getOwnPropDesc$s=Object.getOwnPropertyDescriptor,__decorateClass$s=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$s(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Vec2=class extends Vec{constructor(t,e){super(),this._data=[0,0],e!==void 0?typeof e=="number"?this._reset(t,e):this._reset(e.x-t.x,e.y-t.y):t instanceof Array?this._reset(t[0],t[1]):t?this._reset(t.x,t.y):this._reset(0,0)}static O(){return new exports.Vec2(0,0)}static X(t=1){return new exports.Vec2(t,0)}static Y(t=1){return new exports.Vec2(0,t)}static tmp(t=0,e=0){let n=this.__tmp;return n||(n=new exports.Vec2,this.__tmp=n),n.x=t,n.y=e,n}static rO(){let t=this.__zero;return t||(t=new exports.Vec2(0,0),Object.freeze(t),this.__zero=t),t}static rX(){let t=this.__X;return t||(t=new exports.Vec2(1,0),Object.freeze(t),this.__X=t),t}static rY(){let t=this.__Y;return t||(t=new exports.Vec2(0,1),Object.freeze(t),this.__Y=t),t}get data(){return this._data}add(t){return this._data[0]+=t.x,this._data[1]+=t.y,this}added(t){return new exports.Vec2(this.x+t.x,this.y+t.y)}subtract(t){return this._data[0]-=t.x,this._data[1]-=t.y,this}subtracted(t){return new exports.Vec2(this.x-t.x,this.y-t.y)}multiplied(t){return new exports.Vec2(this.x*t,this.y*t)}dot(t){return this._data[0]*t.x+this._data[1]*t.y}reversed(){return new exports.Vec2(-this.x,-this.y)}interpolate(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}interpolated(t,e){return new exports.Vec2(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)}midTo(t){return new exports.Vec2((this.x+t.x)*.5,(this.y+t.y)*.5)}normalized(){return this.clone().normalize()}translated(t){return this.added(t)}transform(t){const e=t.data||t,n=numeric1_2_6Exports.dot([...this._data,1],e),s=n.pop();if(!Util.isNearlyEqual(s,1)&&!Util.isNearly0(s)){const r=1/s;n[0]*=r,n[1]*=r}return this.resetFromArray(n),this}vecTransform(t){const e=t.data||t,n=[e[0],e[1],[0,0,e[2][2]]];return this.transform(n)}transformed(t){return this.clone().transform(t)}vecTransformed(t){return this.clone().vecTransform(t)}rotate(t,e){return this.transform(exports.Matrix3.makeRotate(t,e))}rotated(t,e){return this.clone().rotate(t,e)}vecRotate(t){const e=t%CONST.PI2;if(Util.isNearly0(e))return this;if(Util.isNearlyEqual(CONST.PI_2,e))return[this.x,this.y]=[-this.y,this.x],this;if(Util.isNearlyEqual(-CONST.PI_2,e))return[this.x,this.y]=[this.y,-this.x],this;if(Util.isNearlyEqual(CONST.PI,Math.abs(e)))return[this.x,this.y]=[-this.x,-this.y],this;if(Util.isNearlyEqual(3*CONST.PI_2,e))return[this.x,this.y]=[this.y,-this.x],this;if(Util.isNearlyEqual(-3*CONST.PI_2,e))return[this.x,this.y]=[-this.y,this.x],this;const n=Math.cos(t),s=Math.sin(t),{x:r,y:i}=this;return[this.x,this.y]=[r*n-i*s,r*s+i*n],this}vecRotated(t){return this.clone().vecRotate(t)}cross(t){return this.x*t.y-this.y*t.x}angle(t){return Math.atan2(Math.abs(this.cross(t)),this.dot(t))}angleTo(t){const e=this.cross(t),n=this.angle(t);return e<0&&n<CONST.PI&&n>0?CONST.PI2-n:n}isParallel(t,e=Tol.ANGLE){const n=this.normalized(),s=new exports.Vec2(t).normalized();return Math.abs(n.cross(s))<e}isPerpendicular(t,e=Tol.ANGLE){return Math.abs(this.dot(t))<e}distanceTo(t){return this.subtracted(t).getLength()}sqDistanceTo(t){return this.subtracted(t).getSqLength()}equals(t,e=Tol.LENGTH){return this.subtracted(t).isZero(e)}getType(){return EN_GEO_TYPE.VEC_2}dump(){return{type:EN_GEO_TYPE.VEC_2,data:this._data}}clone(){return new exports.Vec2(this._data)}copy(t){return this._data[0]=t.x,this._data[1]=t.y,this}_reset(t,e){this._data[0]=t,this._data[1]=e}};exports.Vec2=__decorateClass$s([registerGeo],exports.Vec2);class Interval{static infinit(){return new Interval(-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH)}static infinitArray(){return[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]}static merge(t){if(t.length<1)return[];t.length>1&&t.sort((s,r)=>s._min-r._min);const e=[t[0]];let n=e[0];for(let s=1;s<t.length;s++)t[s]._min<n._max+Tol.DEFAULT.numberEps?n._max=Math.max(t[s]._max,n._max):(n=t[s],e.push(n));return e}constructor(t,e,n=!1){t!==void 0&&e!==void 0&&(t<e?(this._min=t,this._max=e):n?(this._min=e,this._max=t):(MathError.warn(Util.isNearlyEqual(t,e),`invalid interval[ ${t}, ${e}]`),this._min=t,this._max=t))}get min(){return this._min}set min(t){MathError.assert(t<this._max||Util.isNearlyEqual(t,this._max),`min > this._max ${t} ${this._max}`),this._min=t<this.max?t:this.max}get max(){return this._max}set max(t){MathError.assert(this._min<t||Util.isNearlyEqual(t,this._min),`max < this._min ${t} ${this._min}`),this._max=t>this.min?t:this.min}set(t,e){return MathError.assert(t<e||Util.isNearlyEqual(t,e),`min > max ${t} ${e}`),this._min=t,this._max=e>t?e:t,this}setInfinit(t){return this.min=t!==void 0?t:-CONST.MODEL_MAX_LENGTH,this.max=CONST.MODEL_MAX_LENGTH,this}toArray(){return[this._min,this._max]}containsPt(t,e=Tol.NUMBER){const n=e;return t+n>=this._min&&t-n<=this._max}clamp(t){return t<this._min?this._min:t>this._max?this._max:t}containsPtAtStartOrEnd(t,e=Tol.NUMBER){return Math.abs(this._min-t)<e||Math.abs(this._max-t)<e}containsInterval(t,e=Tol.NUMBER){const n=e;return this.containsPt(t._min,n)&&this.containsPt(t._max,n)}filterParams(t){const e=this._min,n=this._max;return t.filter(s=>e<=s&&s<=n)}equals(t,e=Tol.NUMBER){return this.containsInterval(t,e)&&t.containsInterval(this,e)}getLength(){return this._max-this._min}getMid(){return(this._max+this._min)/2}distanceTo(t){if(typeof t=="number")return t>=this._min&&t<=this._max?-Math.min(t-this._min,this._max-t):t>=this._max?t-this._max:t<=this._min?this._min-t:CONST.MODEL_MAX_LENGTH;const e=this.intersected(t);return e.length>0?-e[0].getLength():Math.min(this.distanceTo(t._min),this.distanceTo(t._max))}intersected(t,e=Tol.NUMBER){const n=Math.max(this._min,t._min),s=Math.min(this._max,t._max);if(n>s+e)return[];if(n>s){const r=(n+s)/2;return[new Interval(r,r)]}return[new Interval(n,s)]}subtracted(...t){const e=t.filter(i=>i.min<this.max-Tol.DEFAULT.numberEps).sort((i,o)=>i.min-o.min);let n=this.min;const s=[],r=i=>{n<i-Tol.DEFAULT.numberEps&&s.push(new Interval(n,i))};for(const i of e)r(i.min),i.max>n&&(n=i.max);return r(this.max),s}expandByPt(t){return t<this._min&&(this._min=t),t>this._max&&(this._max=t),this}multiply(t){return this._min*=t,this._max*=t,this}splited(...t){const e=[this._min,this._max];for(const o of t)typeof o=="number"?e.push(o):e.push(o._min,o._max);e.sort((o,g)=>o-g);const n=e.findIndex(o=>Util.isNearlyEqual(o,this._min)),s=e.findIndex(o=>Util.isNearlyEqual(o,this._max));MathError.assert(n>-1&&s>-1,"logic error");const r=e.slice(n,s+1),i=[];for(let o=0;o<r.length-1;o++)r[o+1]-r[o]>Tol.NUMBER&&i.push(new Interval(r[o],r[o+1],!0));return i}clone(){return new Interval(this._min,this._max)}_sub(t){const e=this.intersected(t);if(e.length===0)return[this];const n=[],s=this._min,r=e[0]._min;r>s&&n.push(new Interval(s,r));const i=e[0]._max,o=this._max;return o>i&&n.push(new Interval(i,o)),n}_add(t){if(this.intersected(t).length===0)throw new Error("no intersection cant add");return this._min=Math.min(this._min,t._min),this._max=Math.max(this._max,t._max),this}}class Box2 extends Box{constructor(t){super(),this.setFromPoints(t)}makeEmpty(){return this.min?(this.min.x=1/0,this.min.y=1/0):this.min=new exports.Vec2(1/0,1/0),this.max?(this.max.x=-1/0,this.max.y=-1/0):this.max=new exports.Vec2(-1/0,-1/0),this}getCornerPts(){return[this.min,new exports.Vec2(this.max.x,this.min.y),this.max,new exports.Vec2(this.min.x,this.max.y)]}expandByPoint(...t){const e=this.min.data,n=this.max.data;for(const s of t){const r=s instanceof exports.Vec2?s.data:[s.x,s.y];r[0]<e[0]&&(e[0]=r[0]),r[1]<e[1]&&(e[1]=r[1]),r[0]>n[0]&&(n[0]=r[0]),r[1]>n[1]&&(n[1]=r[1])}return this}containsPt(t,e=Tol.LENGTH){if(!this.isValid())return!1;const n=e,{data:s}=new exports.Vec2(t),r=this.min.data,i=this.max.data;for(let o=0;o<r.length;o++)if(!new Interval(r[o],i[o]).containsPt(s[o],n))return!1;return!0}getSquareDistanceTo(t){const e=this.min,n=this.max,[s,r]=t instanceof Box2?[t.min,t.max]:[t,t];let i=0;if(r.x<e.x){const o=e.x-r.x;i+=o*o}else if(s.x>n.x){const o=s.x-n.x;i+=o*o}if(r.y<e.y){const o=e.y-r.y;i+=o*o}else if(s.y>n.y){const o=s.y-n.y;i+=o*o}return i}setFromCenterAndSize(t,e){const n=new exports.Vec2(e).multiply(.5);return this.max=new exports.Vec2(t).add(n),this.min=new exports.Vec2(t).subtract(n),this}clone(){return new Box2([this.min,this.max])}}class DiscreteParam{constructor(t,e,n,s,r,i){this.tolerance=t,this.crossEps=e,this.hintSegmentCount=n,this.maxSegmentCount=s,this.maxFaceletCount=r,this.enableSurfaceRefiner=i}static{this.LOW=new DiscreteParam(new Tol(36,CONST.PI/6),1200,4,150,3e3,!1)}static{this.NORMAL=new DiscreteParam(new Tol(12,CONST.PI/12),400,4,400,1e4,!1)}static{this.HIGH=new DiscreteParam(new Tol(4,CONST.PI/36),120,10,1200,3e4,!0)}static{this.BorderScale=.1}static{this.UvDisEps=.1}static{this.CALCULATE=new DiscreteParam(new Tol(1,CONST.PI/108),30,40,5e3,1e5,!0)}static{this._MIN_HINT_SEGMENT_COUNT=4}static{this._MIN_TOLER_ANGLE_EPS=CONST.PI/6}clone({tolerance:t=this.tolerance,crossEps:e=this.crossEps,hintSegmentCount:n=this.hintSegmentCount,maxSegmentCount:s=this.maxSegmentCount,maxFaceletCount:r=this.maxFaceletCount,enableSurfaceRefiner:i=this.enableSurfaceRefiner}){return new DiscreteParam(t,e,n,s,r,i)}ratioed(t=.5,e=this.enableSurfaceRefiner){const n=this.tolerance,s=Math.max(n.angleEps*t,DiscreteParam._MIN_TOLER_ANGLE_EPS),r=Math.max(this.hintSegmentCount/t,DiscreteParam._MIN_HINT_SEGMENT_COUNT);return new DiscreteParam(new Tol(n.lengthEps*t,s),this.crossEps*t,r,this.maxSegmentCount/t,this.maxFaceletCount/t,e)}}class PeriodInterval extends Interval{static isPeriod(t){return t._period!==void 0}static areEqual(t,e,n=CONST.PI2,s=Tol.NUMBER){const r=PeriodInterval.RegularizeParam(e-t,n);return r<s||r>n-s}static RegularizeParam(t,e=CONST.PI2,n=0,s=Tol.CALCULATE_EPS){let r=(t-n)%e;return r<-s?r+=e:e-r<s&&(r-=e),r+n}static merge(t){if(t.length<1)return[];const e=t[0]._period;for(let r=1;r<t.length;r++)MathAssert.assert(t[r]._period===e,"PeriodInterval.Merge():待合并区间周期不同!");const n=[];t.forEach(r=>{r.max>e?(n.push(new Interval(0,r.max-e)),n.push(new Interval(r.min,e))):n.push(new Interval(r.min,r.max))});const s=Interval.merge(n);return s.length>1&&s[0].min<Tol.NUMBER&&s[s.length-1].max>e-Tol.NUMBER&&(s[s.length-1].max=s[0].max+e,s.shift()),s.map(r=>new PeriodInterval(r.min,r.max,e))}static make(t,e,n){return n>0?new PeriodInterval(t,e,n):new Interval(t,e)}constructor(t,e,n=CONST.PI2){super(),this._min=t,this._max=e,this._period=n,this.regularize()}get min(){return this._min}set min(t){this._min=t,this.regularize()}get max(){return this._max}set max(t){this._max=t,this.regularize()}get period(){return this._period}set period(t){this._period=t,this.regularize()}set(t,e){return this._min=t,this._max=e,this.regularize(),this}setInfinit(t){if(t===void 0){const e=(this._min+this._max)/2,n=this._period/2;e<n?(this._min=e+n,this._max=e+n*3):(this._min=e-n,this._max=e+n)}else this._min=t,this._max=t+CONST.PI2;return this}toArray(){return[this._min,this._max]}toArrayWithPeriod(){return[this._min,this._max,this._period]}clamp(t){const e=PeriodInterval.RegularizeParam(t-this._min,this._period),n=this._max-this._min;if(e<=n)return e+this._min;const s=e-n,r=this._period-e;return s<r?t-s:t+r}getRegularParam(t,e=Tol.CALCULATE_EPS){const n=PeriodInterval.RegularizeParam(t-this._min,this._period,0,e);return this._period-n<e?this._min:n+this._min}containsPt(t,e=Tol.NUMBER){const n=PeriodInterval.RegularizeParam(t-this._min,this._period,0,e);return n<this._max-this._min+e||n>this._period-e}containsPtAtStartOrEnd(t,e=Tol.NUMBER){const n=PeriodInterval.RegularizeParam(t-this._min,this._period,e);return Math.abs(n)<e||Math.abs(n-this._period)<e||Math.abs(this._max-this._min-n)<e}containsInterval(t,e=Tol.NUMBER){return this.isClosed(e)?!0:t._period!==this._period?!1:this._min<t.min+e&&this._max>t.max-e||this._min-this._period<t.min+e&&this._max-this._period>t.max-e}filterParams(t){const e=[];for(const n of t){const s=this.getRegularParam(n);s<=this._max&&e.push(s)}return e.sort()}equals(t,e=Tol.NUMBER){if(this._period!==t._period)return!1;const n=this.isClosed(),s=t.isClosed();return!n&&!s?Util.isNearlyEqual(this._min,t.min)&&Util.isNearlyEqual(this._max,t.max):n&&s}isClosed(t=Tol.NUMBER){return Util.isNearlyEqual(this._max-this._min,this._period,t)}distanceTo(t){if(typeof t=="number"){const n=t,s=this.getRegularParam(n);if(s<this._max)return Math.max(s-this._max,this._min-s);const r=s-CONST.PI2;return Math.min(s-this._max,this._min-r)}const e=this.intersected(t);return e.length>0?-e[0].getLength():Math.min(PeriodInterval.RegularizeParam(t.min-this._max,this._period),PeriodInterval.RegularizeParam(this._min-t.max,this._period))}intersected(t,e=Tol.NUMBER){if(this._period!==t._period)return[];if(this.isClosed())return[t.clone()];const n=super.intersected(t,e).map(s=>new PeriodInterval(s.min,s.max,this._period));if(this._max>this._period-e){const s=t.min+this._period;if(this._max>s){const r=Math.max(s,this.min);n.push(new PeriodInterval(r,this._max,this._period))}else if(this._max>s-e){const r=(this._max+s)/2;n.push(new PeriodInterval(r,r))}}if(t.max>this._period-e){const s=t.max-this._period;if(this._min<s){const r=Math.min(this.max,s);n.push(new PeriodInterval(this._min,r,this._period))}else if(this._min<s+e){const r=(this._min+s)/2;n.push(new PeriodInterval(r,r))}}return n}subtracted(...t){t.forEach(i=>{MathAssert.assert(i._period===this._period,"PeriodInterval.subtracted: Period not equal")});const e=t.filter(i=>i.max>this._period).map(i=>new Interval(i.min-this._period,i.max-this._period)),n=this._max>this._period?t.map(i=>new Interval(i.min+this._period,i.max+this._period)):[],s=t.concat(e).concat(n);return super.subtracted(...s).map(i=>new PeriodInterval(i.min,i.max,this._period))}expandByPt(t){const e=this.getRegularParam(t);if(e<=this._max)return this;const n=e-this._period;return e-this._max<this._min-n?this._max=e:(this._min=n,n<0&&(this._min+=this._period,this._max+=this._period)),this}multiply(t){return MathAssert.assert(t===1,"PeriodInterval.multiply: Not support multiply"),this}regularize(){const t=PeriodInterval.RegularizeParam(this._min,this._period);let e=PeriodInterval.RegularizeParam(this._max-this._min,this._period);return Util.isNearly0(e)&&!Util.isNearlyEqual(this._min,this._max)&&(e=this._period),this._min=t,this._max=t+e,this}splited(...t){const e=[this._min,this._max];for(const s of t)if(typeof s=="number"){const r=this.getRegularParam(s);r<this._max&&e.push(r)}else{const r=this.getRegularParam(s.min),i=this.getRegularParam(s.max);r<this._max&&e.push(r),i<this._max&&e.push(i)}e.sort((s,r)=>s-r);const n=[];for(let s=0;s<e.length-1;s++)e[s+1]-e[s]>Tol.NUMBER&&n.push(new PeriodInterval(e[s],e[s+1],this._period));return n}clone(){return new PeriodInterval(this._min,this._max,this._period)}}var __getOwnPropDesc$r=Object.getOwnPropertyDescriptor,__decorateClass$r=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$r(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Matrix4=class extends Matrix{static make(t,e=!0){return t instanceof exports.Matrix4?e?t.clone():t:new exports.Matrix4(t.data||t,e)}static makeTranslate({x:t,y:e,z:n}){return new exports.Matrix4([[1,0,0,0],[0,1,0,0],[0,0,1,0],[t,e,n,1]],!1)}static makeRotate(t,e,n){const s=e.x,r=e.y,i=e.z,o=Math.cos(n);let g=Math.sin(n);const a=Tol.LENGTH,I=Math.abs(s)<a,c=Math.abs(r)<a,E=Math.abs(i)<a;if(c&&E){s<0&&(g*=-1);const G=t.y*(1-o)+t.z*g,O=t.z*(1-o)-t.y*g;return new exports.Matrix4([[1,0,0,0],[0,o,g,0],[0,-g,o,0],[0,G,O,1]],!1)}if(I&&E){r<0&&(g*=-1);const G=t.z*(1-o)+t.x*g,O=t.x*(1-o)-t.z*g;return new exports.Matrix4([[o,0,-g,0],[0,1,0,0],[g,0,o,0],[O,0,G,1]],!1)}if(I&&c){i<0&&(g*=-1);const G=t.x*(1-o)+t.y*g,O=t.y*(1-o)-t.x*g;return new exports.Matrix4([[o,g,0,0],[-g,o,0,0],[0,0,1,0],[G,O,0,1]],!1)}const u=e instanceof exports.Vec3?e.normalized():new exports.Vec3(e).normalize(),Q=u.getPerpendicular(),p=u.cross(Q),w=Q.data,y=p.data,M=u.data,N=exports.Matrix4.makeTranslate({x:-t.x,y:-t.y,z:-t.z});N.preMultiply([[w[0],y[0],M[0],0],[w[1],y[1],M[1],0],[w[2],y[2],M[2],0],[0,0,0,1]]);const S=Q.multiplied(o).add(p.multiplied(g)),R=Q.multiplied(-g).add(p.multiplied(o)),U=S.data,b=R.data;return N.preMultiply([[...U,0],[...b,0],[...M,0],[t.x,t.y,t.z,1]]),N}static makeRotateX(t){const e=Math.cos(t),n=Math.sin(t);return new exports.Matrix4([[1,0,0,0],[0,e,n,0],[0,-n,e,0],[0,0,0,1]],!1)}static makeRotateY(t){const e=Math.cos(t),n=Math.sin(t);return new exports.Matrix4([[e,0,-n,0],[0,1,0,0],[n,0,e,0],[0,0,0,1]],!1)}static makeRotateZ(t){const e=Math.cos(t),n=Math.sin(t);return new exports.Matrix4([[e,n,0,0],[-n,e,0,0],[0,0,1,0],[0,0,0,1]],!1)}static makeRotateFromQuaternion(t){const e=new exports.Matrix4,n=e.data,s=t.x,r=t.y,i=t.z,o=t.w,g=s+s,a=r+r,I=i+i,c=s*g,E=s*a,u=s*I,Q=r*a,p=r*I,w=i*I,y=o*g,M=o*a,N=o*I;return n[0][0]=1-(Q+w),n[1][0]=E-N,n[2][0]=u+M,n[0][1]=E+N,n[1][1]=1-(c+w),n[2][1]=p-y,n[0][2]=u-M,n[1][2]=p+y,n[2][2]=1-(c+Q),n[0][3]=0,n[1][3]=0,n[2][3]=0,n[3][0]=0,n[3][1]=0,n[3][2]=0,n[3][3]=1,e}static makeScale(t,e){const{x:n,y:s,z:r}=typeof e=="number"?{x:e,y:e,z:e}:e;return new exports.Matrix4([[n,0,0,0],[0,s,0,0],[0,0,r,0],[t.x*(1-n),t.y*(1-s),t.z*(1-r),1]],!1)}static makeMirror(t,e){const{x:n,y:s,z:r}=new exports.Vec3(e).normalize(),i=2*n*n,o=2*n*s,g=2*r*n,a=2*s*s,I=2*s*r,c=2*r*r,E=2*(n*t.x+s*t.y+r*t.z);return new exports.Matrix4([[1-i,-o,-g,0],[-o,1-a,-I,0],[-g,-I,1-c,0],[E*n,E*s,E*r,1]],!1)}static makeByMatrix3(t){const[e,n,s]=t.data||t;return new exports.Matrix4([[e[0],e[1],0,e[2]],[n[0],n[1],0,n[2]],[0,0,1,0],[s[0],s[1],0,s[2]]],!1)}static isSvdMirror(t){return t.scale.x<0}static isScaleEqual(t){return Math.abs(t.x)>Tol.NUMBER&&Math.abs(Math.abs(t.y/t.x)-1)<Tol.NUMBER&&Math.abs(Math.abs(t.z/t.x)-1)<Tol.NUMBER}static isOnlyTranslateAndRotate(t){return Math.abs(t.x-1)<Tol.NUMBER&&Math.abs(t.y-1)<Tol.NUMBER&&Math.abs(t.z-1)<Tol.NUMBER}static assertScaleEqual(t){const e=Math.abs(t.x)>Tol.NUMBER&&Math.abs(Math.abs(t.y/t.x)-1)<Tol.NUMBER&&Math.abs(Math.abs(t.z/t.x)-1)<Tol.NUMBER;return MathAssert.warn(e,"暂不支持非等比缩放"),e}constructor(t,e=!0){super(4,t,e)}get data(){return this._data}toArray(t,e){const n=t||[],s=e||0,[r,i,o,g]=this._data;return n.splice(s,16,r[0],r[1],r[2],r[3],i[0],i[1],i[2],i[3],o[0],o[1],o[2],o[3],g[0],g[1],g[2],g[3]),n}fromArray(t,e){const n=e||0,[s,r,i,o]=this._data;return s[0]=t[n],s[1]=t[n+1],s[2]=t[n+2],s[3]=t[n+3],r[0]=t[n+4],r[1]=t[n+5],r[2]=t[n+6],r[3]=t[n+7],i[0]=t[n+8],i[1]=t[n+9],i[2]=t[n+10],i[3]=t[n+11],o[0]=t[n+12],o[1]=t[n+13],o[2]=t[n+14],o[3]=t[n+15],this}getBasicVec(t){return new exports.Vec3(this._data[t])}applyRotate(t,e,n){const s=exports.Matrix4.makeRotate(t,e,n);return this.preMultiply(s)}applyTranslate({x:t,y:e,z:n}){const s=this._data[3];return s[0]+=t,s[1]+=e,s[2]+=n,this}applyScale(t,e){const n=exports.Matrix4.makeScale(t,e);return this.preMultiply(n)}applyMirror(t,e){const n=exports.Matrix4.makeMirror(t,e);return this.preMultiply(n)}getTranslation(){return new exports.Vec3(this.data[3])}setTranslation(t){return this.data[3][0]=t.x,this.data[3][1]=t.y,this.data[3][2]=t.z,this}getScale(){const t=this._data[3][3],e=n=>Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2])/t;return new exports.Vec3(e(this._data[0]),e(this._data[1]),e(this._data[2]))}decomposeTRS(){const t=this.getBasicVec(0),e=this.getBasicVec(1),n=this.getBasicVec(2);if(!t.isPerpendicular(e)||!t.isPerpendicular(n)||!e.isPerpendicular(n))return[];const[s,r,i,o]=this._data,g=exports.Matrix4.makeTranslate({x:o[0],y:o[1],z:o[2]}),a=this.determinant()>0?1:-1,I=t.getLength()*a,c=e.getLength(),E=n.getLength(),u=new exports.Matrix4([[I,0,0,0],[0,c,0,0],[0,0,E,0],[0,0,0,1]],!1),Q=new exports.Matrix4([[s[0]/I,s[1]/I,s[2]/I,0],[r[0]/c,r[1]/c,r[2]/c,0],[i[0]/E,i[1]/E,i[2]/E,0],[0,0,0,1]],!1);return[g,Q,u]}decompose(){const t=[this.data[0].slice(0,3),this.data[1].slice(0,3),this.data[2].slice(0,3)],e=numeric1_2_6Exports.svd(t);numeric1_2_6Exports.det(e.U)<0&&(e.U[0][0]*=-1,e.U[1][0]*=-1,e.U[2][0]*=-1,e.S[0]*=-1),numeric1_2_6Exports.det(e.V)<0&&(e.V[0][0]*=-1,e.V[1][0]*=-1,e.V[2][0]*=-1,e.S[0]*=-1);const[n,s,r]=e.V,i=[[n[0],s[0],r[0],0],[n[1],s[1],r[1],0],[n[2],s[2],r[2],0],this._data[3].slice(0)],o=[[...e.U[0],0],[...e.U[1],0],[...e.U[2],0],[0,0,0,1]];return{uTransform:new exports.Matrix4(i,!1),scale:new exports.Vec3(e.S),vRotate:new exports.Matrix4(o,!1)}}isMirror(){return this.determinant()<0}multiplied(t){return this.clone().multiply(t)}preMultiplied(t){return this.clone().preMultiply(t)}multipliedScalar(t){return this.clone().multiplyScalar(t)}multipliedVector4(t){return numeric1_2_6Exports.dot(t,this.data)}inversed(){return this.clone().inverse()}transposed(){return this.clone().transpose()}getType(){return EN_GEO_TYPE.MATRIX_4}dump(){return super.dump()}clone(){return super.clone()}};exports.Matrix4=__decorateClass$r([registerGeo],exports.Matrix4);var __getOwnPropDesc$q=Object.getOwnPropertyDescriptor,__decorateClass$q=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$q(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Vec3=class extends Vec{constructor(t,e,n){super(),this._data=[0,0,0],n!==void 0?this._reset(t,e,n):e?this._reset(e.x-t.x,e.y-t.y,e.z-t.z):t instanceof Array?this._reset(t[0],t[1],t[2]||0):t?this._reset(t.x,t.y,t.z):this._reset(0,0,0)}static O(){return new exports.Vec3(0,0,0)}static X(t=1){return new exports.Vec3(t,0,0)}static Y(t=1){return new exports.Vec3(0,t,0)}static Z(t=1){return new exports.Vec3(0,0,t)}static XY({x:t,y:e},n=0){return new exports.Vec3(t,e,n)}static tmp(t=0,e=0,n=0){let s=this.__tmp;return s||(s=new exports.Vec3,this.__tmp=s),s.x=t,s.y=e,s.z=n,s}static rO(){let t=this.__zero;return t||(t=new exports.Vec3(0,0,0),Object.freeze(t),this.__zero=t),t}static rX(){let t=this.__X;return t||(t=new exports.Vec3(1,0,0),Object.freeze(t),this.__X=t),t}static rY(){let t=this.__Y;return t||(t=new exports.Vec3(0,1,0),Object.freeze(t),this.__Y=t),t}static rZ(){let t=this.__Z;return t||(t=new exports.Vec3(0,0,1),Object.freeze(t),this.__Z=t),t}get z(){return this._data[2]}set z(t){this._data[2]=t}get data(){return this._data}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z||0,this}added(t){return new exports.Vec3(this.x+t.x,this.y+t.y,this.z+(t.z||0))}subtract(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z||0,this}subtracted(t){return new exports.Vec3(this.x-t.x,this.y-t.y,this.z-(t.z||0))}multiplied(t){return new exports.Vec3(this.x*t,this.y*t,this.z*t)}dot(t){return this.x*t.x+this.y*t.y+this.z*(t.z||0)}reversed(){return new exports.Vec3(-this.x,-this.y,-this.z)}interpolate(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=((t.z||0)-this.z)*e,this}interpolated(t,e){return new exports.Vec3(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e,this.z+((t.z||0)-this.z)*e)}midTo(t){return new exports.Vec3((this.x+t.x)*.5,(this.y+t.y)*.5,(this.z+(t.z||0))*.5)}normalized(){return this.clone().normalize()}translated(t){return this.added(t)}transform(t){const e=t.data||t,n=numeric1_2_6Exports.dot([...this._data,1],e),s=n.pop();if(!Util.isNearlyEqual(s,1)&&!Util.isNearly0(s)){const r=1/s;n[0]*=r,n[1]*=r,n[2]*=r}return this.resetFromArray(n),this}transformed(t){return this.clone().transform(t)}vecTransform(t){const e=t.data||t,n=[e[0],e[1],e[2],[0,0,0,e[3][3]]];return this.transform(n)}vecTransformed(t){return this.clone().vecTransform(t)}rotate(t,e,n){return this.transform(exports.Matrix4.makeRotate(t,e,n))}rotated(t,e,n){return this.clone().rotate(t,e,n)}vecRotate(t,e){return this.vecTransform(exports.Matrix4.makeRotate(exports.Vec3.O(),t,e))}vecRotated(t,e){return this.clone().vecRotate(t,e)}getPerpendicular(){const t=this.isParallel(exports.Vec3.rZ())?{x:0,y:-1,z:0}:{x:0,y:0,z:-1};return this.cross(t).normalize()}cross(t){const e=this.y*t.z-this.z*t.y,n=this.z*t.x-this.x*t.z,s=this.x*t.y-this.y*t.x;return new exports.Vec3(e,n,s)}isParallel(t,e=Tol.ANGLE){const n=this.getSqLength(),{x:s,y:r,z:i}=t,o=s*s+r*r+i*i;return this.cross(t).getSqLength()<=e*e*n*o}isPerpendicular(t,e=Tol.ANGLE){const n=this.getSqLength(),{x:s,y:r,z:i}=t,o=s*s+r*r+i*i,g=this.dot(t);return g*g<=e*e*n*o}angle(t,e,n=Tol.DEFAULT){const s=new exports.Vec3(t);if(this.isZero(n.lengthEps)||s.isZero(n.lengthEps))return 0;const r=this.cross(s),i=r.getLength();return e&&(n.isLengthZero(i)?(e.x=0,e.y=0,e.z=0):(e.x=r.x/i,e.y=r.y/i,e.z=r.z/i)),Math.atan2(i,this.dot(s))}angleTo(t,e){const n=this.cross(t),s=this.angle(t);return n.dot(e)<0&&s<CONST.PI&&s>0?CONST.PI2-s:s}distanceTo(t){return this.subtracted(t).getLength()}sqDistanceTo(t){return this.subtracted(t).getSqLength()}equals(t,e=Tol.LENGTH){return this.subtracted(t).isZero(e)}getType(){return EN_GEO_TYPE.VEC_3}dump(){return{type:EN_GEO_TYPE.VEC_3,data:this._data}}clone(){return new exports.Vec3(this._data)}copy(t){return this._data[0]=t.x,this._data[1]=t.y,this._data[2]=t.z,this}_reset(t,e,n){this._data[0]=t,this._data[1]=e,this._data[2]=n}};exports.Vec3=__decorateClass$q([registerGeo],exports.Vec3);class DiscreteCurve{static execute(t,e){const n=t.getRange();if(t.isNurbsCurve()){const i=[n.min,...t.getKnots(),n.max].sort((a,I)=>a-I),o=i.reduce((a,I,c)=>(Util.isNearlyBiggerOrEqual(I,n.min,0)&&Util.isNearlySmallerOrEqual(I,n.max,0)&&(a.length===0||!Util.isNearlyEqual(I,i[c-1]))&&(a.length&&a.push((a[a.length-1]+I)/2),a.push(I)),a),[]);return o.length<2?[{point:t.getStartPt(),param:t.getStartParam()},{point:t.getEndPt(),param:t.getEndParam()}]:(o.length&&o[o.length-1]!==n.max&&(o[o.length-1]=n.max),o.reduce((a,I,c)=>{const E=o[c+1];if(E){const u=this.nurbsDiscrete(t,I,E,e);c!==o.length-2&&u.pop(),a.push(...u)}return a},[]))}const s=t.getSingularities(),r=DiscreteCurve.getSpecificParams(t,e);return DiscreteCurve.general(i=>t.getPtAt(i),i=>t.getTangentAt(i),t.getRange().toArray(),s,r)}static nurbsDiscrete(t,e,n,s){const r=t.getPtAt(e),i=t.getPtAt(n),o=e+(n-e)*.6,g=t.getPtAt(o),a=r.subtracted(i),I=r.subtracted(g),c=function(E,u,Q,p,w){const y=u.subtracted(E),M=Q.subtracted(u);let N,S;if(y instanceof exports.Vec2&&M instanceof exports.Vec2){const R=y.cross(M);S=y.angle(M),N=R*R}else if(y instanceof exports.Vec3&&M instanceof exports.Vec3){const R=y.cross(M);S=y.angle(M),N=R.dot(R)}return N!==void 0&&N<p&&S!==void 0&&S<w};if(a.dot(a)<s.tolerance.lengthEps&&I.dot(I)>s.tolerance.lengthEps||!c(r,g,i,s.crossEps*6,s.tolerance.angleEps/2)){const E=e+(n-e)*.5,u=this.nurbsDiscrete(t,e,E,s),Q=this.nurbsDiscrete(t,E,n,s);return u.slice(0,-1).concat(Q)}return[{point:r,param:e},{point:i,param:n}]}static general(t,e,n,s=[],r){const i=r.tolerance,o=(n[1]-n[0])/Math.ceil(r.hintSegmentCount/2),g=[],a=[];let I=0,c=s.length;s.length>0&&(s[0]-n[0]<Tol.NUMBER&&I++,n[1]-s[s.length-1]<Tol.NUMBER&&c--);const E=[n[0],...s.slice(I,c),n[1]];for(let p=1;p<E.length;p++){const w=E[p]-E[p-1],y=Math.ceil(w/o),M=w/y;for(let N=0;N<y;N++){const S=a.length;a.push(S);const R=M*N+E[p-1];g.push({t:R,point:t(R),tangent:e(R),next:S+1})}}g.push({t:n[1],point:t(n[1]),tangent:e(n[1]),next:-1});for(let p=0;p<a.length&&g.length<r.maxSegmentCount;p++){const w=a[p],y=g[w],M=g[y.next],N=(y.t+M.t)/2,S=t(N),R=e(N),U={t:N,point:S,tangent:R,next:y.next};g.push(U),y.next=g.length-1;const b=y.point.midTo(M.point).subtracted(S);if(i.isSquareLengthZero(b.getSqLength())){let O=S.subtracted(y.point).isParallel(M.point.subtracted(S),i.angleEps);if(O=O&&R.isParallel(y.tangent,i.angleEps),O)continue}a.push(w),a.push(y.next)}const u=[];let Q=0;for(;Q>=0;){const p=g[Q];u.push({point:p.point,param:p.t}),Q=p.next}return u}static getSpecificParams(t,e){let n=e.hintSegmentCount;if(t.isArc())n=DiscreteCurve._getArcHintSegment(t,e);else if(t.isNurbsCurve())n=DiscreteCurve._getNurbsHintSegment(t,e);else if(t.isOffsetCurve()){const s=t.getBaseCurve();s.isArc()?n=DiscreteCurve._getArcHintSegment(s,e):s.isNurbsCurve()&&(n=DiscreteCurve._getNurbsHintSegment(s,e))}return n===e.hintSegmentCount?e:e.clone({hintSegmentCount:n})}static _getArcHintSegment(t,e){const n=t.getRange();return Math.max(e.hintSegmentCount/2,Math.ceil(n.getLength()/e.tolerance.angleEps/2))}static _getNurbsHintSegment(t,e){const n=t.getControlPoints().length;return Math.max(e.hintSegmentCount,Math.floor(n/2))}}const wg=[1,.6521451548625461,.3478548451374538,.362683783378362,.3137066458778873,.2223810344533745,.1012285362903763,.1894506104550685,.1826034150449236,.1691565193950025,.1495959888165767,.1246289712555339,.0951585116824928,.0622535239386479,.0271524594117541,.0965400885147278,.0956387200792749,.0938443990808046,.0911738786957639,.0876520930044038,.0833119242269467,.0781938957870703,.0723457941088485,.0658222227763618,.0586840934785355,.0509980592623762,.0428358980222267,.0342738629130214,.0253920653092621,.0162743947309057,.0070186100094701,.0486909570091397,.0485754674415034,.048344762234803,.0479993885964583,.0475401657148303,.04696818281621,.0462847965813144,.0454916279274181,.0445905581637566,.0435837245293235,.0424735151236536,.0412625632426235,.0399537411327203,.0385501531786156,.03705512854024,.0354722132568824,.0338051618371416,.0320579283548516,.0302346570724025,.0283396726142595,.0263774697150547,.0243527025687109,.0222701738083833,.0201348231535302,.0179517157756973,.0157260304760247,.0134630478967186,.0111681394601311,.0088467598263639,.0065044579689784,.0041470332605625,.0017832807216964],xg=[.5773502691896257,.3399810435848563,.8611363115940526,.1834346424956498,.525532409916329,.7966664774136267,.9602898564975363,.0950125098376374,.2816035507792589,.4580167776572274,.6178762444026438,.755404408355003,.8656312023878318,.9445750230732326,.9894009349916499,.0483076656877383,.1444719615827965,.2392873622521371,.3318686022821277,.4213512761306353,.5068999089322294,.5877157572407623,.6630442669302152,.7321821187402897,.7944837959679424,.84936761373257,.8963211557660521,.9349060759377397,.9647622555875064,.9856115115452684,.9972638618494816,.0243502926634244,.072993121787799,.1214628192961206,.1696444204239928,.2174236437400071,.2646871622087674,.311322871990211,.3572201583376681,.4022701579639916,.4463660172534641,.489403145707053,.5312794640198946,.571895646202634,.6111553551723933,.6489654712546573,.6852363130542333,.7198818501716109,.7528199072605319,.7839723589433414,.8132653151227975,.8406292962525803,.8659993981540928,.8893154459951141,.9105221370785028,.9295691721319396,.9464113748584028,.9610087996520538,.973326827789911,.983336253884626,.9910133714767443,.9963401167719553,.9993050417357722];function gaussIntegration(l,t,e,n,s){const r=(e-t)*.5,i=(e+t)*.5;let o=0,g=0,a=0,I=0,c=0,E=l(.4226497308103743*r+t);E+=l(1.5773502691896257*r+t),E*=r;let u=1,Q=1;for(let p=1;p<6;p++){Q*=2,o=0;for(let y=0;y<Q;y++)g=r*xg[u+y],a=l(i-g),I=l(i+g),c=a+I,o+=wg[u+y]*c;u+=Q,o*=r;const w=Math.abs(E-o);if(w<Math.abs(s*o)||w<n)return o;E=o}return o}class Curve extends GeoElement{constructor(){super(),this._range=Interval.infinit()}getAllFootParams(t,e=Tol.LENGTH){return MathAssert.warn(!1,`${this.constructor.name}.getAllFootParams() not supported yet`),[this.getParamAt(t)]}getParamNearT(t,e,n=Tol.LENGTH,s=Tol.ANGLE,r){const i=this.getDerivatives(e,1)[1],o=n/i.getLength(),g=Math.sin(s),a=n*n;let I=!1,c=e;this._range instanceof PeriodInterval||(c=this.getDomain().clamp(c));let E=0;for(;E<CONST.NORMAL_ITER_NUM;E++){const Q=this.getDerivatives(c,2),p=Q[0].subtracted(t),w=p.dot(Q[1]);if(p.getSqLength()<a||Math.abs(w)<g){I=!0;break}const y=Q[1].dot(Q[1])+Q[2].dot(Q[0].subtracted(t));if(y===0){I=!1;break}const M=w/y;if(c-=M,this._range instanceof PeriodInterval||(c=this.getDomain().clamp(c)),Math.abs(M)<o||E>40){const N=this.getDerivatives(c,1),S=N[0].subtracted(t),R=S.dot(N[1]);I=S.getSqLength()<a||Math.abs(R)<g;break}}if(I){if(!r||Math.abs(c-e)<r)return c;const Q=this.getRange();if(Q instanceof PeriodInterval){const p=Q.getRegularParam(c);if(Math.abs(p-e)<r)return p;if(Math.abs(p-Q.period-e)<r)return p-Q.period;if(Math.abs(p+Q.period-e)<r)return p+Q.period}}const u=this.getAllFootParams(t);if(u.length>0){let Q=u[0],p=Math.abs(Q-e);for(let w=1;w<u.length;w++){const y=Math.abs(u[w]-e);y<p&&(p=y,Q=u[w])}return Q}return this.getParamAt(t)}isPeriodic(){return this._range instanceof PeriodInterval}isLineLike(){return!1}reversed(){return this.clone().reverse()}getStartPt(){const t=this.getStartParam();return this.getPtAt(t)}getEndPt(){const t=this.getEndParam();return this.getPtAt(t)}getMidPt(){return this.getPtAt(this.getRange().getMid())}getLength(t){if(this.isSmoothPoly2d()||this.getSingularities().length>0){const r=DiscreteCurve.general(o=>this.getPtAt(o),o=>this.getTangentAt(o),(t||this._range).toArray(),this.getSingularities(),DiscreteParam.HIGH);let i=0;for(let o=1;o<r.length;o++)i+=r[o-1].point.subtract(r[o].point).getLength();return i}const e=t||this.getRange();return gaussIntegration(r=>{const i=this.getDerivatives(r,1);return Math.sqrt(i[1].dot(i[1]))},e.min,e.max,1e-6,1e-6)}discrete(t=DiscreteParam.NORMAL){return[this.getStartPt(),this.getEndPt()]}getDomain(){return Interval.infinit()}getStartParam(){return this.getRange().min}getEndParam(){return this.getRange().max}getStartTangent(){return this.getTangentAt(this.getStartParam(),!1)}getEndTangent(){return this.getTangentAt(this.getEndParam(),!0)}getMidTangent(){return this.getTangentAt(this.getRange().getMid())}getTangentAt(t,e){const n=this._getSnapToPrevious(t,e),s=Tol.LENGTH_2,r=this.getDerivatives(t,1,n)[1];{const I=r.getSqLength();if(I>s)return r.multiply(1/Math.sqrt(I))}let i=Tol.NUMBER;const o=n?1:-1,g=this.getPtAt(t),a=this.getDomain();for(;;){const I=t-i*o;if(!a.containsPt(I))break;const c=this.getPtAt(I),E=g.subtracted(c),u=E.getSqLength();if(u>s){const Q=E.multiply(o/Math.sqrt(u));return this._refineDegerateTangent(t,n,Q)}if(i*=10,a instanceof PeriodInterval&&a.period<i)break}return MathAssert.warn(!1,"Curve failed to get tangent"),r}getSingularities(){return[]}isStartPt(t,e=Tol.LENGTH){return this.getStartPt().equals(t,e)}isEndPt(t,e=Tol.LENGTH){return this.getEndPt().equals(t,e)}containsProjectedPt(t,e=Tol.LENGTH){const n=this.getParamAt(t);return this._range.containsPt(n)}containsPt(t,e=Tol.LENGTH){const n=e*e;if(this.getStartPt().sqDistanceTo(t)<n||this.getEndPt().sqDistanceTo(t)<n)return!0;const s=this.getParamAt(t);return this.getPtAt(s).sqDistanceTo(t)>n?!1:this._range.containsPt(s,e)}getProjectedPtBy(t){const e=this.getParamAt(t);return this.getPtAt(e)}getFootByIterate(t,e,n=Tol.LENGTH,s=Tol.ANGLE,r=!0){let i=0,o=e!==void 0?e:this._range.getMid(),g=this.getDerivatives(o,2),a=g[0].subtracted(t);const I=Math.sin(s),c=n*.01,E=c*c,u=(this._range instanceof PeriodInterval?this._range.period:this.getDomain().getLength())/4;do{const Q=a.dot(g[1]),p=g[1].dot(g[1])+a.dot(g[2]);if(Math.abs(p)<E)break;let w=Q/p;Math.abs(w)>u&&(w=u*Math.sign(w)),o=o-w,r&&(o=this.getDomain().clamp(o));const M=g[0];if(g=this.getDerivatives(o,2),a=g[0].subtracted(t),M.sqDistanceTo(g[0])<E)break;i++}while(i<CONST.NORMAL_ITER_NUM);if(a.isZero(n)||Math.abs(g[1].normalized().dot(a.normalized()))<I)return o}getFootByDichotomy(t,e,n,s=Tol.LENGTH,r=Tol.ANGLE,i=!0){const o=Math.sin(r),g=s*.01,a=g*g,I=(this._range instanceof PeriodInterval?this._range.period:this.getDomain().getLength())/4;let c;const E=this.getPtAt(e).subtracted(t);let u=this.getTangentAt(e).dot(E);const Q=this.getPtAt(n).subtracted(t);let p=this.getTangentAt(n).dot(Q);if(u*p<0){let N=e,S=n;for(let R=0;R<8;R++){c=(N+S)/2;const U=this.getPtAt(c).subtracted(t);if(U.getSqLength()<a)return c;const b=this.getTangentAt(c).dot(U);if(Math.abs(b)<o)return c;u*b<0?(p=b,S=c):p*b<0&&(u=b,N=c)}c=(N+S)/2}else c=(e+n)/2;let w=this.getDerivatives(c,2),y=w[0].subtracted(t),M=0;do{const N=y.dot(w[1]),S=w[1].dot(w[1])+y.dot(w[2]);if(Math.abs(S)<a)break;let R=N/S;Math.abs(R)>I&&(R=I*Math.sign(R)),c=c-R,i&&(c=this.getDomain().clamp(c));const b=w[0];if(w=this.getDerivatives(c,2),y=w[0].subtracted(t),b.sqDistanceTo(w[0])<a)break;M++}while(M<CONST.NORMAL_ITER_NUM);if(y.isZero(s)||Math.abs(w[1].normalized().dot(y.normalized()))<o)return c}extend(t,e=!0){return e?this._range.max+=t:this._range.min-=t,this}extendDouble(t){return this._range.max+=t,this._range.min-=t,this}getRange(){return this._range}setRange(t,e){return typeof t=="number"&&e!==void 0?this._range.set(t,e):t instanceof Interval&&this._range.set(t.min,t.max),this}setRangeInfinit(t){if(this._range instanceof PeriodInterval)this._range.min=t||0,this._range.max=this._range.min+this._range.period;else{const e=this.getDomain();this._range.set(t!==void 0?t:e.min,e.max)}}setRangeMaxInfinit(){this._range instanceof PeriodInterval?this._range.max=this._range.min+this._range.period:this._range.max=this.getDomain().max}setRangeMinInfinit(){this._range instanceof PeriodInterval?this._range.min=this._range.max+this._range.period:this._range.min=this.getDomain().min}equals(t,e=Tol.LENGTH){return this.getType()!==t.getType()||!this.getMidPt().equals(t.getMidPt(),e)?0:this.getStartPt().equals(t.getStartPt(),e)&&this.getEndPt().equals(t.getEndPt(),e)?1:this.getStartPt().equals(t.getEndPt(),e)&&this.getEndPt().equals(t.getStartPt(),e)?-1:0}clone(){return super.clone()}discreteBySegmentCount(t){const e=Math.ceil(t),n=(this._range.max-this._range.min)/e,s=[];for(let r=0;r<=e;r++)s.push(this.getPtAt(r*n+this._range.min));return s}getInterpPts(t){const e=[],n=[];let s=this._range.min;for(;s<=this._range.max;){const r=this.getDerivatives(s,2);e.push(s),n.push(r[0]);let i;const o=.15,g=r[1].getSqLength()/r[2].getLength();if(g>10){const I=1/Math.log10(g);i=g*o*I}else g>.1?i=g*o:g>1e-4?i=g:(MathError.warn("拟合的曲线自交!!"),i=g*100);s=s+i/r[1].getLength()}return e.push(this._range.max),n.push(this.getPtAt(this._range.max)),{params:e,pts:n}}_tessellateByPoints(t,e){const n=[];for(let s=0;s<t.length-1;s++)n.push([t[s].toArray3(),t[s+1].toArray3()]);return{edges:n}}_getSnapToPrevious(t,e){return e===void 0?Math.abs(t-this._range.min)>Tol.CALCULATE_EPS:e}_refineDegerateTangent(t,e,n){return n}}class LinesXUtil{static line2dsParamed(t,e,n,s){const r=[[n.x,-s.x],[n.y,-s.y]],i=[e.x-t.x,e.y-t.y];return numeric1_2_6Exports.solve(r,i)}}class Curve2 extends Curve{getBox(t){return this.getBBox(t)}getBBox(t){const{min:e,max:n}=this._range;t&&this.setRange(t);const s=this.getSingularities(),r=this._range.splited(...s),i=new Box2;for(const o of r){const g=DiscreteCurve.execute(this.setRange(o),DiscreteParam.LOW),a=[];for(let I=0;I<g.length;I++)a.push(this.getTangentAt(g[I].param,I!==0));i.expandByPoint(g[0].point);for(let I=1;I<g.length;I++){if(i.expandByPoint(g[I].point),a[I].isParallel(a[I-1]))continue;const c=LinesXUtil.line2dsParamed(g[I-1].point,g[I].point,a[I-1],a[I]);if(c[0]>0&&c[1]<0){const E=g[I-1].point.add(a[I-1].multiply(c[0]));i.expandByPoint(E)}else MathAssert.warn(!1,"曲率拐点未处理")}}return this.setRange(e,n),i}split(t,e){return this._range.splited(...t).map(s=>{const r=this.clone();return r.setRange(s),r})}translate(t){const e=exports.Matrix3.makeTranslate(t);return this.transform(e)}rotate(t,e={x:0,y:0}){const n=exports.Matrix3.makeRotate(e,t);return this.transform(n)}scale(t,e={x:0,y:0}){const n=exports.Matrix3.makeScale(e,t);return this.transform(n)}transformed(t,e){return this.clone().transform(t,e)}reversed(){return this.clone().reverse()}clone(){return super.clone()}}class Coord extends GeoElement{constructor(){super()}}var __getOwnPropDesc$p=Object.getOwnPropertyDescriptor,__decorateClass$p=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$p(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Coord3=class extends Coord{static XOY(t=0){return new exports.Coord3(new exports.Vec3(0,0,t),exports.Vec3.X(),exports.Vec3.Y())}static YOZ(t=0){return new exports.Coord3(new exports.Vec3(t,0,0),exports.Vec3.Y(),exports.Vec3.Z())}static ZOX(t=0){return new exports.Coord3(new exports.Vec3(0,t,0),exports.Vec3.Z(),exports.Vec3.X())}static XOZ(t=0){return new exports.Coord3(new exports.Vec3(0,t,0),exports.Vec3.X(),exports.Vec3.Z())}static getTransformFrom1To2(t,e){const n=t.getLocalToWorldMatrix();if(!n)return;const s=e.getWorldToLocalMatrix();return n.multiply(s)}constructor(t,e,n){if(super(),this._origin=t?new exports.Vec3(t):new exports.Vec3,n)this.setXYDirs(e,n);else if(e){const s=new exports.Vec3(e).normalize(),r=s.getPerpendicular(),i=s.cross(r).normalize();this.setXYDirs(r,i)}else this.setXYDirs(exports.Vec3.X(),exports.Vec3.Y())}getDx(){return this._xDir.clone()}setDx(t){this._xDir=new exports.Vec3(t),this._update()}getDy(){return this._yDir.clone()}setDy(t){this._yDir=new exports.Vec3(t),this._update()}getDz(){return this._zDir.clone()}getOrigin(){return this._origin.clone()}setOrigin(t){this._origin=new exports.Vec3(t)}setXYDirs(t,e){return this._xDir=new exports.Vec3(t).normalize(),this._yDir=new exports.Vec3(e).normalize(),this._update(),this}reverseZDir(){return this._zDir.reverse(),this._yDir=this._zDir.cross(this._xDir),this}translate(t){return this._origin.add(t),this}translated(t){return this.clone().translate(t)}transform(t){this._origin.transform(t),this._xDir.vecTransform(t).normalize();const e=this._yDir.vecTransform(t);return this._yDir=this._xDir.cross(e).cross(this._xDir).normalize(),this._update(),this}transformed(t){return this.clone().transform(t)}getWorldPtAt(t){return this.getOrigin().add(this.getWorldVectorAt(t))}getLocalPtAt(t){const e=new exports.Vec3(t).subtract(this._origin),n=e.dot(this._xDir),s=e.dot(this._yDir),r=e.dot(this._zDir);return new exports.Vec3(n,s,r)}getWorldVectorAt(t){const{x:e,y:n}=t,s=this.getDx(),r=this.getDy(),i=s.multiply(e).add(r.multiply(n)),o=t.z;return o?i.add(this.getDz().multiply(o)):i}getLocalVectorAt(t){const e=new exports.Vec3(t),n=e.dot(this._xDir),s=e.dot(this._yDir),r=e.dot(this._zDir);return new exports.Vec3(n,s,r)}getLocalToWorldMatrix(){return new exports.Matrix4([[this._xDir.x,this._xDir.y,this._xDir.z,0],[this._yDir.x,this._yDir.y,this._yDir.z,0],[this._zDir.x,this._zDir.y,this._zDir.z,0],[this._origin.x,this._origin.y,this._origin.z,1]],!1)}getWorldToLocalMatrix(){return this.getLocalToWorldMatrix().inverse()}clone(){return super.clone()}dump(){return{type:this.getType(),data:[this._origin.toArray3(),this._xDir.toArray3(),this._yDir.toArray3()]}}load({data:[t,e,n]}){return this._origin.resetFromArray(t),this._xDir.resetFromArray(e),this._yDir.resetFromArray(n),this._update(),this}getType(){return EN_GEO_TYPE.COORD_3}_update(){this._zDir=this._xDir.cross(this._yDir)}};exports.Coord3=__decorateClass$p([registerGeo],exports.Coord3);class Box3 extends Box{constructor(t){super(),this.setFromPoints(t)}makeEmpty(){return this.min?(this.min.x=1/0,this.min.y=1/0,this.min.z=1/0):this.min=new exports.Vec3(1/0,1/0,1/0),this.max?(this.max.x=-1/0,this.max.y=-1/0,this.max.z=-1/0):this.max=new exports.Vec3(-1/0,-1/0,-1/0),this}getCornerPts(){if(!this.isValid())return[];const t=this.getSize(),e=this.min.clone(),n=this.min.clone();n.x+=t.x;const s=n.clone();s.y+=t.y;const r=e.clone();r.y+=t.y;const i=e.clone(),o=n.clone(),g=s.clone(),a=r.clone();return[i,o,g,a].forEach(I=>{I.z+=t.z}),[e,n,s,r,i,o,g,a]}expandByPoint(...t){const e=this.min.data,n=this.max.data;for(const s of t){const r=s instanceof exports.Vec3?s.data:[s.x,s.y,s.z];r[0]<e[0]&&(e[0]=r[0]),r[1]<e[1]&&(e[1]=r[1]),r[2]<e[2]&&(e[2]=r[2]),r[0]>n[0]&&(n[0]=r[0]),r[1]>n[1]&&(n[1]=r[1]),r[2]>n[2]&&(n[2]=r[2])}return this}containsPt(t,e=Tol.LENGTH){if(!this.isValid())return!1;const n=e,{data:s}=new exports.Vec3(t),r=this.min.data,i=this.max.data;for(let o=0;o<r.length;o++)if(!new Interval(r[o],i[o]).containsPt(s[o],n))return!1;return!0}getSquareDistanceTo(t){const e=this.min,n=this.max,[s,r]=t instanceof Box3?[t.min,t.max]:[t,t];let i=0;if(r.x<e.x){const o=e.x-r.x;i+=o*o}else if(s.x>n.x){const o=s.x-n.x;i+=o*o}if(r.y<e.y){const o=e.y-r.y;i+=o*o}else if(s.y>n.y){const o=s.y-n.y;i+=o*o}if(r.z<e.z){const o=e.z-r.z;i+=o*o}else if(s.z>n.z){const o=s.z-n.z;i+=o*o}return i}setFromCenterAndSize(t,e){const n=new exports.Vec3(e).multiply(.5);return this.max=new exports.Vec3(t).add(n),this.min=new exports.Vec3(t).subtract(n),this}clone(){return new Box3([this.min,this.max])}}class Line3dToLine3dDistanceParamed{static execute(t,e,n,s){const r=new exports.Vec3(t,e),i=new exports.Vec3(n),o=new exports.Vec3(s),g=[[i.dot(n),-i.dot(s)],[o.dot(n),-o.dot(s)]],a=[i.dot(r),o.dot(r)];return numeric1_2_6Exports.solve(g,a)}}class Curve3 extends Curve{getBox(t){return this.getBBox(t)}getBBox(t){const{min:e,max:n}=this._range;t&&this.setRange(t);const s=this.getSingularities(),r=this._range.splited(...s),i=new Box3;for(const o of r){const g=DiscreteCurve.execute(this.setRange(o),DiscreteParam.LOW),a=[];for(let I=0;I<g.length;I++)a.push(this.getTangentAt(g[I].param,I!==0));i.expandByPoint(g[0].point);for(let I=1;I<g.length;I++){if(i.expandByPoint(g[I].point),a[I].isParallel(a[I-1]))continue;const c=Line3dToLine3dDistanceParamed.execute(g[I-1].point,g[I].point,a[I-1],a[I]);c[0]>0&&c[1]<0?i.expandByPoint(g[I-1].point.add(a[I-1].multiply(c[0]))):MathAssert.mutedWarn(!1,"曲率拐点未处理")}}return this.setRange(e,n),i}translate(t){const e=exports.Matrix4.makeTranslate(t);return this.transform(e)}rotate(t,e,n){const s=n||{x:0,y:0,z:1},r=exports.Matrix4.makeRotate(e,s,t);return this.transform(r)}scale(t,e){const n=exports.Matrix4.makeScale(e,t);return this.transform(n)}transformed(t,e){return this.clone().transform(t,e)}isPlaneCurve3d(t){return!1}split(t,e){return this._range.splited(...t).map(s=>{const r=this.clone();return r.setRange(s),r})}reversed(){return this.clone().reverse()}clone(){return super.clone()}}class TangentCone{constructor(t,e){this.dir=t,this.angle=e}isConeEmpty(){return this.dir.getSqLength()<Tol.LENGTH*Tol.LENGTH}isConeValid(){return this.angle!==CONST.PI}copy(t){this.dir.copy(t.dir),this.angle=t.angle}mergeCone(t,e=!0){if(t.getSqLength()<Tol.LENGTH*Tol.LENGTH)return!1;if(this.isConeEmpty())return this.dir=t,!0;const n=this.dir.dot(t);if(e&&n<=-Tol.ANGLE)return this.angle=CONST.PI,!1;if(Math.abs(n)<1){const s=Math.acos(n);if(s>this.angle){const r=-this.angle,i=Math.max(this.angle,s);this.angle=(i-r)*.5;const o=.5*(r+i),g=Math.sin(s-o),a=Math.sin(o),I=this.dir.multiplied(g).add(t.multiplied(a)).multiply(1/Math.sin(s));this.dir=I}}else n<=0&&(this.angle=CONST.PI2);return!0}mergeTwoCone(t,e){if(t.dir.equals(exports.Vec3.O()))return t.copy(e),!0;const n=t.dir.dot(e.dir);if(n<0)return t.angle=CONST.PI,!1;{const s=Math.acos(n);if(s+t.angle<=e.angle)t.copy(e);else if(s+e.angle>t.angle){const r=s+e.angle+t.angle;if(r>=CONST.PI)t.angle=CONST.PI;else{const i=r/2-e.angle;let o=t.dir.subtracted(e.dir);const g=Math.sin(i);o=o.multiplied(g/(Math.sin(s-i)+g)),t.dir=e.dir.added(o),t.dir.normalize(),t.angle=r/2}}}return!0}}var __getOwnPropDesc$o=Object.getOwnPropertyDescriptor,__decorateClass$o=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$o(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Coord2=class extends Coord{static XOY(){return new exports.Coord2(new exports.Vec2(0,0),exports.Vec2.X())}constructor(t,e){super(),this._origin=t?new exports.Vec2(t):exports.Vec2.O(),this._xDir=e?new exports.Vec2(e).normalize():exports.Vec2.X(),this._updateY()}getDx(){return this._xDir.clone()}setDx(t){this._xDir=new exports.Vec2(t),this._updateY()}getDy(){return this._yDir.clone()}getOrigin(){return this._origin.clone()}setOrigin(t){this._origin=new exports.Vec2(t)}translate(t){return this._origin.add(t),this}translated(t){return this.clone().translate(t)}transform(t){return this._origin.transform(t),this._xDir.vecTransform(t).normalize(),this._updateY(),this}transformed(t){return this.clone().transform(t)}getWorldPtAt(t){return this.getOrigin().add(this.getWorldVectorAt(t))}getLocalPtAt(t){const e=new exports.Vec2(this._origin,t),n=e.dot(this._xDir),s=e.dot(this._yDir);return new exports.Vec2(n,s)}getWorldVectorAt(t){const{x:e,y:n}=t,s=this.getDx(),r=this.getDy();return s.multiply(e).add(r.multiply(n))}getLocalVectorAt(t){const e=new exports.Vec2(t),n=e.dot(this._xDir),s=e.dot(this._yDir);return new exports.Vec2(n,s)}getLocalToWorldMatrix(){return new exports.Matrix3([[this._xDir.x,this._xDir.y,0],[this._yDir.x,this._yDir.y,0],[this._origin.x,this._origin.y,1]],!1)}getWorldToLocalMatrix(){return this.getLocalToWorldMatrix().inverse()}dump(){return{type:this.getType(),data:[this._origin.toArray2(),this._xDir.toArray2()]}}load({data:[t,e]}){return this._origin.resetFromArray(t),this._xDir.resetFromArray(e),this._updateY(),this}clone(){return super.clone()}getType(){return EN_GEO_TYPE.COORD_2}_updateY(){this._yDir=this._xDir.vecRotated(CONST.PI_2)}};exports.Coord2=__decorateClass$o([registerGeo],exports.Coord2);var poly2tri={};const version="1.5.0",require$$0={version};var xy,hasRequiredXy;function requireXy(){if(hasRequiredXy)return xy;hasRequiredXy=1;function l(s){return"("+s.x+";"+s.y+")"}function t(s){var r=s.toString();return r==="[object Object]"?l(s):r}function e(s,r){return s.y===r.y?s.x-r.x:s.y-r.y}function n(s,r){return s.x===r.x&&s.y===r.y}return xy={toString:t,toStringBase:l,compare:e,equals:n},xy}var pointerror,hasRequiredPointerror;function requirePointerror(){if(hasRequiredPointerror)return pointerror;hasRequiredPointerror=1;var l=requireXy(),t=function(e,n){this.name="PointError",this.points=n=n||[],this.message=e||"Invalid Points!";for(var s=0;s<n.length;s++)this.message+=" "+l.toString(n[s])};return t.prototype=new Error,t.prototype.constructor=t,pointerror=t,pointerror}var point,hasRequiredPoint;function requirePoint(){if(hasRequiredPoint)return point;hasRequiredPoint=1;var l=requireXy(),t=function(e,n){this.x=+e||0,this.y=+n||0,this._p2t_edge_list=null};return t.prototype.toString=function(){return l.toStringBase(this)},t.prototype.toJSON=function(){return{x:this.x,y:this.y}},t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.set_zero=function(){return this.x=0,this.y=0,this},t.prototype.set=function(e,n){return this.x=+e||0,this.y=+n||0,this},t.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},t.prototype.add=function(e){return this.x+=e.x,this.y+=e.y,this},t.prototype.sub=function(e){return this.x-=e.x,this.y-=e.y,this},t.prototype.mul=function(e){return this.x*=e,this.y*=e,this},t.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},t.prototype.normalize=function(){var e=this.length();return this.x/=e,this.y/=e,e},t.prototype.equals=function(e){return this.x===e.x&&this.y===e.y},t.negate=function(e){return new t(-e.x,-e.y)},t.add=function(e,n){return new t(e.x+n.x,e.y+n.y)},t.sub=function(e,n){return new t(e.x-n.x,e.y-n.y)},t.mul=function(e,n){return new t(e*n.x,e*n.y)},t.cross=function(e,n){return typeof e=="number"?typeof n=="number"?e*n:new t(-e*n.y,e*n.x):typeof n=="number"?new t(n*e.y,-n*e.x):e.x*n.y-e.y*n.x},t.toString=l.toString,t.compare=l.compare,t.cmp=l.compare,t.equals=l.equals,t.dot=function(e,n){return e.x*n.x+e.y*n.y},point=t,point}var triangle$1,hasRequiredTriangle;function requireTriangle(){if(hasRequiredTriangle)return triangle$1;hasRequiredTriangle=1;var l=requireXy(),t=function(n,s,r){this.points_=[n,s,r],this.neighbors_=[null,null,null],this.interior_=!1,this.constrained_edge=[!1,!1,!1],this.delaunay_edge=[!1,!1,!1]},e=l.toString;return t.prototype.toString=function(){return"["+e(this.points_[0])+e(this.points_[1])+e(this.points_[2])+"]"},t.prototype.getPoint=function(n){return this.points_[n]},t.prototype.GetPoint=t.prototype.getPoint,t.prototype.getPoints=function(){return this.points_},t.prototype.getNeighbor=function(n){return this.neighbors_[n]},t.prototype.containsPoint=function(n){var s=this.points_;return n===s[0]||n===s[1]||n===s[2]},t.prototype.containsEdge=function(n){return this.containsPoint(n.p)&&this.containsPoint(n.q)},t.prototype.containsPoints=function(n,s){return this.containsPoint(n)&&this.containsPoint(s)},t.prototype.isInterior=function(){return this.interior_},t.prototype.setInterior=function(n){return this.interior_=n,this},t.prototype.markNeighborPointers=function(n,s,r){var i=this.points_;if(n===i[2]&&s===i[1]||n===i[1]&&s===i[2])this.neighbors_[0]=r;else if(n===i[0]&&s===i[2]||n===i[2]&&s===i[0])this.neighbors_[1]=r;else if(n===i[0]&&s===i[1]||n===i[1]&&s===i[0])this.neighbors_[2]=r;else throw new Error("poly2tri Invalid Triangle.markNeighborPointers() call")},t.prototype.markNeighbor=function(n){var s=this.points_;n.containsPoints(s[1],s[2])?(this.neighbors_[0]=n,n.markNeighborPointers(s[1],s[2],this)):n.containsPoints(s[0],s[2])?(this.neighbors_[1]=n,n.markNeighborPointers(s[0],s[2],this)):n.containsPoints(s[0],s[1])&&(this.neighbors_[2]=n,n.markNeighborPointers(s[0],s[1],this))},t.prototype.clearNeighbors=function(){this.neighbors_[0]=null,this.neighbors_[1]=null,this.neighbors_[2]=null},t.prototype.clearDelaunayEdges=function(){this.delaunay_edge[0]=!1,this.delaunay_edge[1]=!1,this.delaunay_edge[2]=!1},t.prototype.pointCW=function(n){var s=this.points_;return n===s[0]?s[2]:n===s[1]?s[0]:n===s[2]?s[1]:null},t.prototype.pointCCW=function(n){var s=this.points_;return n===s[0]?s[1]:n===s[1]?s[2]:n===s[2]?s[0]:null},t.prototype.neighborCW=function(n){return n===this.points_[0]?this.neighbors_[1]:n===this.points_[1]?this.neighbors_[2]:this.neighbors_[0]},t.prototype.neighborCCW=function(n){return n===this.points_[0]?this.neighbors_[2]:n===this.points_[1]?this.neighbors_[0]:this.neighbors_[1]},t.prototype.getConstrainedEdgeCW=function(n){return n===this.points_[0]?this.constrained_edge[1]:n===this.points_[1]?this.constrained_edge[2]:this.constrained_edge[0]},t.prototype.getConstrainedEdgeCCW=function(n){return n===this.points_[0]?this.constrained_edge[2]:n===this.points_[1]?this.constrained_edge[0]:this.constrained_edge[1]},t.prototype.getConstrainedEdgeAcross=function(n){return n===this.points_[0]?this.constrained_edge[0]:n===this.points_[1]?this.constrained_edge[1]:this.constrained_edge[2]},t.prototype.setConstrainedEdgeCW=function(n,s){n===this.points_[0]?this.constrained_edge[1]=s:n===this.points_[1]?this.constrained_edge[2]=s:this.constrained_edge[0]=s},t.prototype.setConstrainedEdgeCCW=function(n,s){n===this.points_[0]?this.constrained_edge[2]=s:n===this.points_[1]?this.constrained_edge[0]=s:this.constrained_edge[1]=s},t.prototype.getDelaunayEdgeCW=function(n){return n===this.points_[0]?this.delaunay_edge[1]:n===this.points_[1]?this.delaunay_edge[2]:this.delaunay_edge[0]},t.prototype.getDelaunayEdgeCCW=function(n){return n===this.points_[0]?this.delaunay_edge[2]:n===this.points_[1]?this.delaunay_edge[0]:this.delaunay_edge[1]},t.prototype.setDelaunayEdgeCW=function(n,s){n===this.points_[0]?this.delaunay_edge[1]=s:n===this.points_[1]?this.delaunay_edge[2]=s:this.delaunay_edge[0]=s},t.prototype.setDelaunayEdgeCCW=function(n,s){n===this.points_[0]?this.delaunay_edge[2]=s:n===this.points_[1]?this.delaunay_edge[0]=s:this.delaunay_edge[1]=s},t.prototype.neighborAcross=function(n){return n===this.points_[0]?this.neighbors_[0]:n===this.points_[1]?this.neighbors_[1]:this.neighbors_[2]},t.prototype.oppositePoint=function(n,s){var r=n.pointCW(s);return this.pointCW(r)},t.prototype.legalize=function(n,s){var r=this.points_;if(n===r[0])r[1]=r[0],r[0]=r[2],r[2]=s;else if(n===r[1])r[2]=r[1],r[1]=r[0],r[0]=s;else if(n===r[2])r[0]=r[2],r[2]=r[1],r[1]=s;else throw new Error("poly2tri Invalid Triangle.legalize() call")},t.prototype.index=function(n){var s=this.points_;if(n===s[0])return 0;if(n===s[1])return 1;if(n===s[2])return 2;throw new Error("poly2tri Invalid Triangle.index() call")},t.prototype.edgeIndex=function(n,s){var r=this.points_;if(n===r[0]){if(s===r[1])return 2;if(s===r[2])return 1}else if(n===r[1]){if(s===r[2])return 0;if(s===r[0])return 2}else if(n===r[2]){if(s===r[0])return 1;if(s===r[1])return 0}return-1},t.prototype.markConstrainedEdgeByIndex=function(n){this.constrained_edge[n]=!0},t.prototype.markConstrainedEdgeByEdge=function(n){this.markConstrainedEdgeByPoints(n.p,n.q)},t.prototype.markConstrainedEdgeByPoints=function(n,s){var r=this.points_;s===r[0]&&n===r[1]||s===r[1]&&n===r[0]?this.constrained_edge[2]=!0:s===r[0]&&n===r[2]||s===r[2]&&n===r[0]?this.constrained_edge[1]=!0:(s===r[1]&&n===r[2]||s===r[2]&&n===r[1])&&(this.constrained_edge[0]=!0)},triangle$1=t,triangle$1}var sweep={},assert_1,hasRequiredAssert;function requireAssert(){if(hasRequiredAssert)return assert_1;hasRequiredAssert=1;function l(t,e){if(!t)throw new Error(e||"Assert Failed")}return assert_1=l,assert_1}var advancingfront={exports:{}},hasRequiredAdvancingfront;function requireAdvancingfront(){if(hasRequiredAdvancingfront)return advancingfront.exports;hasRequiredAdvancingfront=1;var l=function(e,n){this.point=e,this.triangle=n||null,this.next=null,this.prev=null,this.value=e.x},t=function(e,n){this.head_=e,this.tail_=n,this.search_node_=e};return t.prototype.head=function(){return this.head_},t.prototype.setHead=function(e){this.head_=e},t.prototype.tail=function(){return this.tail_},t.prototype.setTail=function(e){this.tail_=e},t.prototype.search=function(){return this.search_node_},t.prototype.setSearch=function(e){this.search_node_=e},t.prototype.findSearchNode=function(){return this.search_node_},t.prototype.locateNode=function(e){var n=this.search_node_;if(e<n.value){for(;n=n.prev;)if(e>=n.value)return this.search_node_=n,n}else for(;n=n.next;)if(e<n.value)return this.search_node_=n.prev,n.prev;return null},t.prototype.locatePoint=function(e){var n=e.x,s=this.findSearchNode(n),r=s.point.x;if(n===r){if(e!==s.point)if(e===s.prev.point)s=s.prev;else if(e===s.next.point)s=s.next;else throw new Error("poly2tri Invalid AdvancingFront.locatePoint() call")}else if(n<r)for(;(s=s.prev)&&e!==s.point;);else for(;(s=s.next)&&e!==s.point;);return s&&(this.search_node_=s),s},advancingfront.exports=t,advancingfront.exports.Node=l,advancingfront.exports}var utils={},hasRequiredUtils;function requireUtils(){if(hasRequiredUtils)return utils;hasRequiredUtils=1;var l=1e-12;utils.EPSILON=l;var t={CW:1,CCW:-1,COLLINEAR:0};utils.Orientation=t;function e(r,i,o){var g=(r.x-o.x)*(i.y-o.y),a=(r.y-o.y)*(i.x-o.x),I=g-a;return I>-l&&I<l?t.COLLINEAR:I>0?t.CCW:t.CW}utils.orient2d=e;function n(r,i,o,g){var a=(r.x-i.x)*(g.y-i.y)-(g.x-i.x)*(r.y-i.y);if(a>=-l)return!1;var I=(r.x-o.x)*(g.y-o.y)-(g.x-o.x)*(r.y-o.y);return!(I<=l)}utils.inScanArea=n;function s(r,i,o){var g=i.x-r.x,a=i.y-r.y,I=o.x-r.x,c=o.y-r.y;return g*I+a*c<0}return utils.isAngleObtuse=s,utils}var hasRequiredSweep;function requireSweep(){if(hasRequiredSweep)return sweep;hasRequiredSweep=1;var l=requireAssert(),t=requirePointerror(),e=requireTriangle(),n=requireAdvancingfront().Node,s=requireUtils(),r=s.EPSILON,i=s.Orientation,o=s.orient2d,g=s.inScanArea,a=s.isAngleObtuse;function I(BA){BA.initTriangulation(),BA.createAdvancingFront(),c(BA),E(BA)}function c(BA){var lA,aA=BA.pointCount();for(lA=1;lA<aA;++lA)for(var wA=BA.getPoint(lA),YA=u(BA,wA),DA=wA._p2t_edge_list,UA=0;DA&&UA<DA.length;++UA)Q(BA,DA[UA],YA)}function E(BA){for(var lA=BA.front().head().next.triangle,aA=BA.front().head().next.point;!lA.getConstrainedEdgeCW(aA);)lA=lA.neighborCCW(aA);BA.meshClean(lA)}function u(BA,lA){var aA=BA.locateNode(lA),wA=y(BA,lA,aA);return lA.x<=aA.point.x+r&&M(BA,aA),N(BA,wA),wA}function Q(BA,lA,aA){BA.edge_event.constrained_edge=lA,BA.edge_event.right=lA.p.x>lA.q.x,!w(aA.triangle,lA.p,lA.q)&&(z(BA,lA,aA),p(BA,lA.p,lA.q,aA.triangle,lA.q))}function p(BA,lA,aA,wA,YA){if(!w(wA,lA,aA)){var DA=wA.pointCCW(YA),UA=o(aA,DA,lA);if(UA===i.COLLINEAR)throw new t("poly2tri EdgeEvent: Collinear not supported!",[aA,DA,lA]);var XA=wA.pointCW(YA),bA=o(aA,XA,lA);if(bA===i.COLLINEAR)throw new t("poly2tri EdgeEvent: Collinear not supported!",[aA,XA,lA]);UA===bA?(UA===i.CW?wA=wA.neighborCCW(YA):wA=wA.neighborCW(YA),p(BA,lA,aA,wA,YA)):PA(BA,lA,aA,wA,YA)}}function w(BA,lA,aA){var wA=BA.edgeIndex(lA,aA);if(wA!==-1){BA.markConstrainedEdgeByIndex(wA);var YA=BA.getNeighbor(wA);return YA&&YA.markConstrainedEdgeByPoints(lA,aA),!0}return!1}function y(BA,lA,aA){var wA=new e(lA,aA.point,aA.next.point);wA.markNeighbor(aA.triangle),BA.addToMap(wA);var YA=new n(lA);return YA.next=aA.next,YA.prev=aA,aA.next.prev=YA,aA.next=YA,R(BA,wA)||BA.mapTriangleToNodes(wA),YA}function M(BA,lA){var aA=new e(lA.prev.point,lA.point,lA.next.point);aA.markNeighbor(lA.prev.triangle),aA.markNeighbor(lA.triangle),BA.addToMap(aA),lA.prev.next=lA.next,lA.next.prev=lA.prev,R(BA,aA)||BA.mapTriangleToNodes(aA)}function N(BA,lA){for(var aA=lA.next;aA.next&&!a(aA.point,aA.next.point,aA.prev.point);)M(BA,aA),aA=aA.next;for(aA=lA.prev;aA.prev&&!a(aA.point,aA.next.point,aA.prev.point);)M(BA,aA),aA=aA.prev;lA.next&&lA.next.next&&S(lA)&&G(BA,lA)}function S(BA){var lA=BA.point.x-BA.next.next.point.x,aA=BA.point.y-BA.next.next.point.y;return l(aA>=0,"unordered y"),lA>=0||Math.abs(lA)<aA}function R(BA,lA){for(var aA=0;aA<3;++aA)if(!lA.delaunay_edge[aA]){var wA=lA.getNeighbor(aA);if(wA){var YA=lA.getPoint(aA),DA=wA.oppositePoint(lA,YA),UA=wA.index(DA);if(wA.constrained_edge[UA]||wA.delaunay_edge[UA]){lA.constrained_edge[aA]=wA.constrained_edge[UA];continue}var XA=U(YA,lA.pointCCW(YA),lA.pointCW(YA),DA);if(XA){lA.delaunay_edge[aA]=!0,wA.delaunay_edge[UA]=!0,b(lA,YA,wA,DA);var bA=!R(BA,lA);return bA&&BA.mapTriangleToNodes(lA),bA=!R(BA,wA),bA&&BA.mapTriangleToNodes(wA),lA.delaunay_edge[aA]=!1,wA.delaunay_edge[UA]=!1,!0}}}return!1}function U(BA,lA,aA,wA){var YA=BA.x-wA.x,DA=BA.y-wA.y,UA=lA.x-wA.x,XA=lA.y-wA.y,bA=YA*XA,nt=UA*DA,It=bA-nt;if(It<=0)return!1;var St=aA.x-wA.x,gt=aA.y-wA.y,it=St*DA,Nt=YA*gt,Pt=it-Nt;if(Pt<=0)return!1;var se=UA*gt,Tt=St*XA,Ft=YA*YA+DA*DA,jt=UA*UA+XA*XA,re=St*St+gt*gt,Kt=Ft*(se-Tt)+jt*Pt+re*It;return Kt>0}function b(BA,lA,aA,wA){var YA,DA,UA,XA;YA=BA.neighborCCW(lA),DA=BA.neighborCW(lA),UA=aA.neighborCCW(wA),XA=aA.neighborCW(wA);var bA,nt,It,St;bA=BA.getConstrainedEdgeCCW(lA),nt=BA.getConstrainedEdgeCW(lA),It=aA.getConstrainedEdgeCCW(wA),St=aA.getConstrainedEdgeCW(wA);var gt,it,Nt,Pt;gt=BA.getDelaunayEdgeCCW(lA),it=BA.getDelaunayEdgeCW(lA),Nt=aA.getDelaunayEdgeCCW(wA),Pt=aA.getDelaunayEdgeCW(wA),BA.legalize(lA,wA),aA.legalize(wA,lA),aA.setDelaunayEdgeCCW(lA,gt),BA.setDelaunayEdgeCW(lA,it),BA.setDelaunayEdgeCCW(wA,Nt),aA.setDelaunayEdgeCW(wA,Pt),aA.setConstrainedEdgeCCW(lA,bA),BA.setConstrainedEdgeCW(lA,nt),BA.setConstrainedEdgeCCW(wA,It),aA.setConstrainedEdgeCW(wA,St),BA.clearNeighbors(),aA.clearNeighbors(),YA&&aA.markNeighbor(YA),DA&&BA.markNeighbor(DA),UA&&BA.markNeighbor(UA),XA&&aA.markNeighbor(XA),BA.markNeighbor(aA)}function G(BA,lA){for(o(lA.point,lA.next.point,lA.next.next.point)===i.CCW?BA.basin.left_node=lA.next.next:BA.basin.left_node=lA.next,BA.basin.bottom_node=BA.basin.left_node;BA.basin.bottom_node.next&&BA.basin.bottom_node.point.y>=BA.basin.bottom_node.next.point.y;)BA.basin.bottom_node=BA.basin.bottom_node.next;if(BA.basin.bottom_node!==BA.basin.left_node){for(BA.basin.right_node=BA.basin.bottom_node;BA.basin.right_node.next&&BA.basin.right_node.point.y<BA.basin.right_node.next.point.y;)BA.basin.right_node=BA.basin.right_node.next;BA.basin.right_node!==BA.basin.bottom_node&&(BA.basin.width=BA.basin.right_node.point.x-BA.basin.left_node.point.x,BA.basin.left_highest=BA.basin.left_node.point.y>BA.basin.right_node.point.y,O(BA,BA.basin.bottom_node))}}function O(BA,lA){if(!H(BA,lA)){M(BA,lA);var aA;if(!(lA.prev===BA.basin.left_node&&lA.next===BA.basin.right_node)){if(lA.prev===BA.basin.left_node){if(aA=o(lA.point,lA.next.point,lA.next.next.point),aA===i.CW)return;lA=lA.next}else if(lA.next===BA.basin.right_node){if(aA=o(lA.point,lA.prev.point,lA.prev.prev.point),aA===i.CCW)return;lA=lA.prev}else lA.prev.point.y<lA.next.point.y?lA=lA.prev:lA=lA.next;O(BA,lA)}}}function H(BA,lA){var aA;return BA.basin.left_highest?aA=BA.basin.left_node.point.y-lA.point.y:aA=BA.basin.right_node.point.y-lA.point.y,BA.basin.width>aA}function z(BA,lA,aA){BA.edge_event.right?tA(BA,lA,aA):W(BA,lA,aA)}function tA(BA,lA,aA){for(;aA.next.point.x<lA.p.x;)o(lA.q,aA.next.point,lA.p)===i.CCW?nA(BA,lA,aA):aA=aA.next}function nA(BA,lA,aA){aA.point.x<lA.p.x&&(o(aA.point,aA.next.point,aA.next.next.point)===i.CCW?IA(BA,lA,aA):(iA(BA,lA,aA),nA(BA,lA,aA)))}function IA(BA,lA,aA){M(BA,aA.next),aA.next.point!==lA.p&&o(lA.q,aA.next.point,lA.p)===i.CCW&&o(aA.point,aA.next.point,aA.next.next.point)===i.CCW&&IA(BA,lA,aA)}function iA(BA,lA,aA){o(aA.next.point,aA.next.next.point,aA.next.next.next.point)===i.CCW?IA(BA,lA,aA.next):o(lA.q,aA.next.next.point,lA.p)===i.CCW&&iA(BA,lA,aA.next)}function W(BA,lA,aA){for(;aA.prev.point.x>lA.p.x;)o(lA.q,aA.prev.point,lA.p)===i.CW?oA(BA,lA,aA):aA=aA.prev}function oA(BA,lA,aA){aA.point.x>lA.p.x&&(o(aA.point,aA.prev.point,aA.prev.prev.point)===i.CW?dA(BA,lA,aA):(hA(BA,lA,aA),oA(BA,lA,aA)))}function hA(BA,lA,aA){o(aA.prev.point,aA.prev.prev.point,aA.prev.prev.prev.point)===i.CW?dA(BA,lA,aA.prev):o(lA.q,aA.prev.prev.point,lA.p)===i.CW&&hA(BA,lA,aA.prev)}function dA(BA,lA,aA){M(BA,aA.prev),aA.prev.point!==lA.p&&o(lA.q,aA.prev.point,lA.p)===i.CW&&o(aA.point,aA.prev.point,aA.prev.prev.point)===i.CW&&dA(BA,lA,aA)}function PA(BA,lA,aA,wA,YA){var DA=wA.neighborAcross(YA);l(DA,"FLIP failed due to missing triangle!");var UA=DA.oppositePoint(wA,YA);if(wA.getConstrainedEdgeAcross(YA)){var XA=wA.index(YA);throw new t("poly2tri Intersecting Constraints",[YA,UA,wA.getPoint((XA+1)%3),wA.getPoint((XA+2)%3)])}if(g(YA,wA.pointCCW(YA),wA.pointCW(YA),UA))if(b(wA,YA,DA,UA),BA.mapTriangleToNodes(wA),BA.mapTriangleToNodes(DA),YA===aA&&UA===lA)aA===BA.edge_event.constrained_edge.q&&lA===BA.edge_event.constrained_edge.p&&(wA.markConstrainedEdgeByPoints(lA,aA),DA.markConstrainedEdgeByPoints(lA,aA),R(BA,wA),R(BA,DA));else{var bA=o(aA,UA,lA);wA=yA(BA,bA,wA,DA,YA,UA),PA(BA,lA,aA,wA,YA)}else{var nt=_A(lA,aA,DA,UA);LA(BA,lA,aA,wA,DA,nt),p(BA,lA,aA,wA,YA)}}function yA(BA,lA,aA,wA,YA,DA){var UA;return lA===i.CCW?(UA=wA.edgeIndex(YA,DA),wA.delaunay_edge[UA]=!0,R(BA,wA),wA.clearDelaunayEdges(),aA):(UA=aA.edgeIndex(YA,DA),aA.delaunay_edge[UA]=!0,R(BA,aA),aA.clearDelaunayEdges(),wA)}function _A(BA,lA,aA,wA){var YA=o(lA,wA,BA);if(YA===i.CW)return aA.pointCCW(wA);if(YA===i.CCW)return aA.pointCW(wA);throw new t("poly2tri [Unsupported] nextFlipPoint: opposing point on constrained edge!",[lA,wA,BA])}function LA(BA,lA,aA,wA,YA,DA){var UA=YA.neighborAcross(DA);l(UA,"FLIP failed due to missing triangle");var XA=UA.oppositePoint(YA,DA);if(g(aA,wA.pointCCW(aA),wA.pointCW(aA),XA))PA(BA,aA,XA,UA,XA);else{var bA=_A(lA,aA,UA,XA);LA(BA,lA,aA,wA,UA,bA)}}return sweep.triangulate=I,sweep}var sweepcontext,hasRequiredSweepcontext;function requireSweepcontext(){if(hasRequiredSweepcontext)return sweepcontext;hasRequiredSweepcontext=1;var l=requirePointerror(),t=requirePoint(),e=requireTriangle(),n=requireSweep(),s=requireAdvancingfront(),r=s.Node,i=.3,o=function(c,E){if(this.p=c,this.q=E,c.y>E.y)this.q=c,this.p=E;else if(c.y===E.y){if(c.x>E.x)this.q=c,this.p=E;else if(c.x===E.x)throw new l("poly2tri Invalid Edge constructor: repeated points!",[c])}this.q._p2t_edge_list||(this.q._p2t_edge_list=[]),this.q._p2t_edge_list.push(this)},g=function(){this.left_node=null,this.bottom_node=null,this.right_node=null,this.width=0,this.left_highest=!1};g.prototype.clear=function(){this.left_node=null,this.bottom_node=null,this.right_node=null,this.width=0,this.left_highest=!1};var a=function(){this.constrained_edge=null,this.right=!1},I=function(c,E){E=E||{},this.triangles_=[],this.map_=[],this.points_=E.cloneArrays?c.slice(0):c,this.edge_list=[],this.pmin_=this.pmax_=null,this.front_=null,this.head_=null,this.tail_=null,this.af_head_=null,this.af_middle_=null,this.af_tail_=null,this.basin=new g,this.edge_event=new a,this.initEdges(this.points_)};return I.prototype.addHole=function(c){this.initEdges(c);var E,u=c.length;for(E=0;E<u;E++)this.points_.push(c[E]);return this},I.prototype.AddHole=I.prototype.addHole,I.prototype.addHoles=function(c){var E,u=c.length;for(E=0;E<u;E++)this.initEdges(c[E]);return this.points_=this.points_.concat.apply(this.points_,c),this},I.prototype.addPoint=function(c){return this.points_.push(c),this},I.prototype.AddPoint=I.prototype.addPoint,I.prototype.addPoints=function(c){return this.points_=this.points_.concat(c),this},I.prototype.triangulate=function(){return n.triangulate(this),this},I.prototype.getBoundingBox=function(){return{min:this.pmin_,max:this.pmax_}},I.prototype.getTriangles=function(){return this.triangles_},I.prototype.GetTriangles=I.prototype.getTriangles,I.prototype.front=function(){return this.front_},I.prototype.pointCount=function(){return this.points_.length},I.prototype.head=function(){return this.head_},I.prototype.setHead=function(c){this.head_=c},I.prototype.tail=function(){return this.tail_},I.prototype.setTail=function(c){this.tail_=c},I.prototype.getMap=function(){return this.map_},I.prototype.initTriangulation=function(){var c=this.points_[0].x,E=this.points_[0].x,u=this.points_[0].y,Q=this.points_[0].y,p,w=this.points_.length;for(p=1;p<w;p++){var y=this.points_[p];y.x>c&&(c=y.x),y.x<E&&(E=y.x),y.y>u&&(u=y.y),y.y<Q&&(Q=y.y)}this.pmin_=new t(E,Q),this.pmax_=new t(c,u);var M=i*(c-E),N=i*(u-Q);this.head_=new t(c+M,Q-N),this.tail_=new t(E-M,Q-N),this.points_.sort(t.compare)},I.prototype.initEdges=function(c){var E,u=c.length;for(E=0;E<u;++E)this.edge_list.push(new o(c[E],c[(E+1)%u]))},I.prototype.getPoint=function(c){return this.points_[c]},I.prototype.addToMap=function(c){this.map_.push(c)},I.prototype.locateNode=function(c){return this.front_.locateNode(c.x)},I.prototype.createAdvancingFront=function(){var c,E,u,Q=new e(this.points_[0],this.tail_,this.head_);this.map_.push(Q),c=new r(Q.getPoint(1),Q),E=new r(Q.getPoint(0),Q),u=new r(Q.getPoint(2)),this.front_=new s(c,u),c.next=E,E.next=u,E.prev=c,u.prev=E},I.prototype.removeNode=function(c){},I.prototype.mapTriangleToNodes=function(c){for(var E=0;E<3;++E)if(!c.getNeighbor(E)){var u=this.front_.locatePoint(c.pointCW(c.getPoint(E)));u&&(u.triangle=c)}},I.prototype.removeFromMap=function(c){var E,u=this.map_,Q=u.length;for(E=0;E<Q;E++)if(u[E]===c){u.splice(E,1);break}},I.prototype.meshClean=function(c){for(var E=[c],u,Q;u=E.pop();)if(!u.isInterior())for(u.setInterior(!0),this.triangles_.push(u),Q=0;Q<3;Q++)u.constrained_edge[Q]||E.push(u.getNeighbor(Q))},sweepcontext=I,sweepcontext}var hasRequiredPoly2tri;function requirePoly2tri(){return hasRequiredPoly2tri||(hasRequiredPoly2tri=1,(function(l){var t=globalThis.poly2tri;l.noConflict=function(){return globalThis.poly2tri=t,l},l.VERSION=require$$0.version,l.PointError=requirePointerror(),l.Point=requirePoint(),l.Triangle=requireTriangle(),l.SweepContext=requireSweepcontext();var e=requireSweep();l.triangulate=e.triangulate,l.sweep={Triangulate:e.triangulate}})(poly2tri)),poly2tri}var poly2triExports=requirePoly2tri(),libtess_min$1={exports:{}},libtess_min=libtess_min$1.exports,hasRequiredLibtess_min;function requireLibtess_min(){return hasRequiredLibtess_min||(hasRequiredLibtess_min=1,(function(l){var t;function e(J,Z){return J.b===Z.b&&J.a===Z.a}function n(J,Z){return J.b<Z.b||J.b===Z.b&&J.a<=Z.a}function s(J,Z,sA){var CA=Z.b-J.b,QA=sA.b-Z.b;return 0<CA+QA?CA<QA?Z.a-J.a+CA/(CA+QA)*(J.a-sA.a):Z.a-sA.a+QA/(CA+QA)*(sA.a-J.a):0}function r(J,Z,sA){var CA=Z.b-J.b,QA=sA.b-Z.b;return 0<CA+QA?(Z.a-sA.a)*CA+(Z.a-J.a)*QA:0}function i(J,Z){return J.a<Z.a||J.a===Z.a&&J.b<=Z.b}function o(J,Z,sA){var CA=Z.a-J.a,QA=sA.a-Z.a;return 0<CA+QA?CA<QA?Z.b-J.b+CA/(CA+QA)*(J.b-sA.b):Z.b-sA.b+QA/(CA+QA)*(sA.b-J.b):0}function g(J,Z,sA){var CA=Z.a-J.a,QA=sA.a-Z.a;return 0<CA+QA?(Z.b-sA.b)*CA+(Z.b-J.b)*QA:0}function a(J){return n(J.b.a,J.a)}function I(J){return n(J.a,J.b.a)}function c(J,Z,sA,CA){return J=0>J?0:J,sA=0>sA?0:sA,J<=sA?sA===0?(Z+CA)/2:Z+J/(J+sA)*(CA-Z):CA+sA/(J+sA)*(Z-CA)}function E(J){var Z=y(J.b);return N(Z,J.c),N(Z.b,J.c),S(Z,J.a),Z}function u(J,Z){var sA=!1,CA=!1;J!==Z&&(Z.a!==J.a&&(CA=!0,U(Z.a,J.a)),Z.d!==J.d&&(sA=!0,b(Z.d,J.d)),M(Z,J),CA||(N(Z,J.a),J.a.c=J),sA||(S(Z,J.d),J.d.a=J))}function Q(J){var Z=J.b,sA=!1;J.d!==J.b.d&&(sA=!0,b(J.d,J.b.d)),J.c===J?U(J.a,null):(J.b.d.a=it(J),J.a.c=J.c,M(J,it(J)),sA||S(J,J.d)),Z.c===Z?(U(Z.a,null),b(Z.d,null)):(J.d.a=it(Z),Z.a.c=Z.c,M(Z,it(Z))),R(J)}function p(J){var Z=y(J),sA=Z.b;return M(Z,J.e),Z.a=J.b.a,N(sA,Z.a),Z.d=sA.d=J.d,Z=Z.b,M(J.b,it(J.b)),M(J.b,Z),J.b.a=Z.a,Z.b.a.c=Z.b,Z.b.d=J.b.d,Z.f=J.f,Z.b.f=J.b.f,Z}function w(J,Z){var sA=!1,CA=y(J),QA=CA.b;return Z.d!==J.d&&(sA=!0,b(Z.d,J.d)),M(CA,J.e),M(QA,Z),CA.a=J.b.a,QA.a=Z.a,CA.d=QA.d=J.d,J.d.a=QA,sA||S(CA,J.d),CA}function y(J){var Z=new gt,sA=new gt,CA=J.b.h;return sA.h=CA,CA.b.h=Z,Z.h=J,J.b.h=sA,Z.b=sA,Z.c=Z,Z.e=sA,sA.b=Z,sA.c=sA,sA.e=Z}function M(J,Z){var sA=J.c,CA=Z.c;sA.b.e=Z,CA.b.e=J,J.c=CA,Z.c=sA}function N(J,Z){var sA=Z.f,CA=new Pt(Z,sA);sA.e=CA,Z.f=CA,sA=CA.c=J;do sA.a=CA,sA=sA.c;while(sA!==J)}function S(J,Z){var sA=Z.d,CA=new St(Z,sA);sA.b=CA,Z.d=CA,CA.a=J,CA.c=Z.c,sA=J;do sA.d=CA,sA=sA.e;while(sA!==J)}function R(J){var Z=J.h;J=J.b.h,Z.b.h=J,J.b.h=Z}function U(J,Z){var sA=J.c,CA=sA;do CA.a=Z,CA=CA.c;while(CA!==sA);sA=J.f,CA=J.e,CA.f=sA,sA.e=CA}function b(J,Z){var sA=J.a,CA=sA;do CA.d=Z,CA=CA.e;while(CA!==sA);sA=J.d,CA=J.b,CA.d=sA,sA.b=CA}function G(J){var Z=0;return Math.abs(J[1])>Math.abs(J[0])&&(Z=1),Math.abs(J[2])>Math.abs(J[Z])&&(Z=2),Z}var O=4*1e150;function H(J,Z){J.f+=Z.f,J.b.f+=Z.b.f}function z(J,Z,sA){return J=J.a,Z=Z.a,sA=sA.a,Z.b.a===J?sA.b.a===J?n(Z.a,sA.a)?0>=r(sA.b.a,Z.a,sA.a):0<=r(Z.b.a,sA.a,Z.a):0>=r(sA.b.a,J,sA.a):sA.b.a===J?0<=r(Z.b.a,J,Z.a):(Z=s(Z.b.a,J,Z.a),J=s(sA.b.a,J,sA.a),Z>=J)}function tA(J){J.a.i=null;var Z=J.e;Z.a.c=Z.c,Z.c.a=Z.a,J.e=null}function nA(J,Z){Q(J.a),J.c=!1,J.a=Z,Z.i=J}function IA(J){var Z=J.a.a;do J=Jt(J);while(J.a.a===Z);return J.c&&(Z=w(Lt(J).a.b,J.a.e),nA(J,Z),J=Jt(J)),J}function iA(J,Z,sA){var CA=new we;return CA.a=sA,CA.e=DA(J.f,Z.e,CA),sA.i=CA}function W(J,Z){switch(J.s){case 100130:return(Z&1)!==0;case 100131:return Z!==0;case 100132:return 0<Z;case 100133:return 0>Z;case 100134:return 2<=Z||-2>=Z}return!1}function oA(J){var Z=J.a,sA=Z.d;sA.c=J.d,sA.a=Z,tA(J)}function hA(J,Z,sA){for(J=Z,Z=Z.a;J!==sA;){J.c=!1;var CA=Lt(J),QA=CA.a;if(QA.a!==Z.a){if(!CA.c){oA(J);break}QA=w(Z.c.b,QA.b),nA(CA,QA)}Z.c!==QA&&(u(it(QA),QA),u(Z,QA)),oA(J),Z=CA.a,J=CA}return Z}function dA(J,Z,sA,CA,QA,RA){var AA=!0;do iA(J,Z,sA.b),sA=sA.c;while(sA!==CA);for(QA===null&&(QA=Lt(Z).a.b.c);CA=Lt(Z),sA=CA.a.b,sA.a===QA.a;)sA.c!==QA&&(u(it(sA),sA),u(it(QA),sA)),CA.f=Z.f-sA.f,CA.d=W(J,CA.f),Z.b=!0,!AA&&LA(J,Z)&&(H(sA,QA),tA(Z),Q(QA)),AA=!1,Z=CA,QA=sA;Z.b=!0,RA&&lA(J,Z)}function PA(J,Z,sA,CA,QA){var RA=[Z.g[0],Z.g[1],Z.g[2]];Z.d=null,Z.d=J.o&&J.o(RA,sA,CA,J.c)||null,Z.d===null&&(QA?J.n||(It(J,100156),J.n=!0):Z.d=sA[0])}function yA(J,Z,sA){var CA=[null,null,null,null];CA[0]=Z.a.d,CA[1]=sA.a.d,PA(J,Z.a,CA,[.5,.5,0,0],!1),u(Z,sA)}function _A(J,Z,sA,CA,QA){var RA=Math.abs(Z.b-J.b)+Math.abs(Z.a-J.a),AA=Math.abs(sA.b-J.b)+Math.abs(sA.a-J.a),GA=QA+1;CA[QA]=.5*AA/(RA+AA),CA[GA]=.5*RA/(RA+AA),J.g[0]+=CA[QA]*Z.g[0]+CA[GA]*sA.g[0],J.g[1]+=CA[QA]*Z.g[1]+CA[GA]*sA.g[1],J.g[2]+=CA[QA]*Z.g[2]+CA[GA]*sA.g[2]}function LA(J,Z){var sA=Lt(Z),CA=Z.a,QA=sA.a;if(n(CA.a,QA.a)){if(0<r(QA.b.a,CA.a,QA.a))return!1;if(!e(CA.a,QA.a))p(QA.b),u(CA,it(QA)),Z.b=sA.b=!0;else if(CA.a!==QA.a){var sA=J.e,RA=CA.a.h;if(0<=RA){var sA=sA.b,AA=sA.d,GA=sA.e,st=sA.c,$A=st[RA];AA[$A]=AA[sA.a],st[AA[$A]]=$A,$A<=--sA.a&&(1>=$A||n(GA[AA[$A>>1]],GA[AA[$A]])?le(sA,$A):Xt(sA,$A)),GA[RA]=null,st[RA]=sA.b,sA.b=RA}else for(sA.c[-(RA+1)]=null;0<sA.a&&sA.c[sA.d[sA.a-1]]===null;)--sA.a;yA(J,it(QA),CA)}}else{if(0>r(CA.b.a,QA.a,CA.a))return!1;Jt(Z).b=Z.b=!0,p(CA.b),u(it(QA),CA)}return!0}function BA(J,Z){var sA=Lt(Z),CA=Z.a,QA=sA.a,RA=CA.a,AA=QA.a,GA=CA.b.a,st=QA.b.a,$A=new Pt;if(r(GA,J.a,RA),r(st,J.a,AA),RA===AA||Math.min(RA.a,GA.a)>Math.max(AA.a,st.a))return!1;if(n(RA,AA)){if(0<r(st,RA,AA))return!1}else if(0>r(GA,AA,RA))return!1;var vt=GA,Dt=RA,Mt=st,et=AA,Ct,yt;if(n(vt,Dt)||(Ct=vt,vt=Dt,Dt=Ct),n(Mt,et)||(Ct=Mt,Mt=et,et=Ct),n(vt,Mt)||(Ct=vt,vt=Mt,Mt=Ct,Ct=Dt,Dt=et,et=Ct),n(Mt,Dt)?n(Dt,et)?(Ct=s(vt,Mt,Dt),yt=s(Mt,Dt,et),0>Ct+yt&&(Ct=-Ct,yt=-yt),$A.b=c(Ct,Mt.b,yt,Dt.b)):(Ct=r(vt,Mt,Dt),yt=-r(vt,et,Dt),0>Ct+yt&&(Ct=-Ct,yt=-yt),$A.b=c(Ct,Mt.b,yt,et.b)):$A.b=(Mt.b+Dt.b)/2,i(vt,Dt)||(Ct=vt,vt=Dt,Dt=Ct),i(Mt,et)||(Ct=Mt,Mt=et,et=Ct),i(vt,Mt)||(Ct=vt,vt=Mt,Mt=Ct,Ct=Dt,Dt=et,et=Ct),i(Mt,Dt)?i(Dt,et)?(Ct=o(vt,Mt,Dt),yt=o(Mt,Dt,et),0>Ct+yt&&(Ct=-Ct,yt=-yt),$A.a=c(Ct,Mt.a,yt,Dt.a)):(Ct=g(vt,Mt,Dt),yt=-g(vt,et,Dt),0>Ct+yt&&(Ct=-Ct,yt=-yt),$A.a=c(Ct,Mt.a,yt,et.a)):$A.a=(Mt.a+Dt.a)/2,n($A,J.a)&&($A.b=J.a.b,$A.a=J.a.a),vt=n(RA,AA)?RA:AA,n(vt,$A)&&($A.b=vt.b,$A.a=vt.a),e($A,RA)||e($A,AA))return LA(J,Z),!1;if(!e(GA,J.a)&&0<=r(GA,J.a,$A)||!e(st,J.a)&&0>=r(st,J.a,$A)){if(st===J.a)return p(CA.b),u(QA.b,CA),Z=IA(Z),CA=Lt(Z).a,hA(J,Lt(Z),sA),dA(J,Z,it(CA),CA,CA,!0),!0;if(GA===J.a){p(QA.b),u(CA.e,it(QA)),RA=sA=Z,AA=RA.a.b.a;do RA=Jt(RA);while(RA.a.b.a===AA);return Z=RA,RA=Lt(Z).a.b.c,sA.a=it(QA),QA=hA(J,sA,null),dA(J,Z,QA.c,CA.b.c,RA,!0),!0}return 0<=r(GA,J.a,$A)&&(Jt(Z).b=Z.b=!0,p(CA.b),CA.a.b=J.a.b,CA.a.a=J.a.a),0>=r(st,J.a,$A)&&(Z.b=sA.b=!0,p(QA.b),QA.a.b=J.a.b,QA.a.a=J.a.a),!1}return p(CA.b),p(QA.b),u(it(QA),CA),CA.a.b=$A.b,CA.a.a=$A.a,CA.a.h=Ft(J.e,CA.a),CA=CA.a,QA=[0,0,0,0],$A=[RA.d,GA.d,AA.d,st.d],CA.g[0]=CA.g[1]=CA.g[2]=0,_A(CA,RA,GA,QA,0),_A(CA,AA,st,QA,2),PA(J,CA,$A,QA,!0),Jt(Z).b=Z.b=sA.b=!0,!1}function lA(J,Z){for(var sA=Lt(Z);;){for(;sA.b;)Z=sA,sA=Lt(sA);if(!Z.b&&(sA=Z,Z=Jt(Z),Z===null||!Z.b))break;Z.b=!1;var CA=Z.a,QA=sA.a,RA;if(RA=CA.b.a!==QA.b.a)A:{RA=Z;var AA=Lt(RA),GA=RA.a,st=AA.a,$A=void 0;if(n(GA.b.a,st.b.a)){if(0>r(GA.b.a,st.b.a,GA.a)){RA=!1;break A}Jt(RA).b=RA.b=!0,$A=p(GA),u(st.b,$A),$A.d.c=RA.d}else{if(0<r(st.b.a,GA.b.a,st.a)){RA=!1;break A}RA.b=AA.b=!0,$A=p(st),u(GA.e,st.b),$A.b.d.c=RA.d}RA=!0}if(RA&&(sA.c?(tA(sA),Q(QA),sA=Lt(Z),QA=sA.a):Z.c&&(tA(Z),Q(CA),Z=Jt(sA),CA=Z.a)),CA.a!==QA.a){if(CA.b.a===QA.b.a||Z.c||sA.c||CA.b.a!==J.a&&QA.b.a!==J.a)LA(J,Z);else if(BA(J,Z))break}CA.a===QA.a&&CA.b.a===QA.b.a&&(H(QA,CA),tA(Z),Q(CA),Z=Jt(sA))}}function aA(J,Z){J.a=Z;for(var sA=Z.c;sA.i===null;)if(sA=sA.c,sA===Z.c){var sA=J,CA=Z,AA=new we;AA.a=CA.c.b;var QA=sA.f,GA=QA.a;do GA=GA.a;while(GA.b!==null&&!QA.c(QA.b,AA,GA.b));var QA=GA.b,RA=Lt(QA),AA=QA.a,GA=RA.a;if(r(AA.b.a,CA,AA.a)===0)AA=QA.a,e(AA.a,CA)||e(AA.b.a,CA)||(p(AA.b),QA.c&&(Q(AA.c),QA.c=!1),u(CA.c,AA),aA(sA,CA));else{var st=n(GA.b.a,AA.b.a)?QA:RA,RA=void 0;QA.d||st.c?(st===QA?RA=w(CA.c.b,AA.e):RA=w(GA.b.c.b,CA.c).b,st.c?nA(st,RA):(AA=sA,QA=iA(sA,QA,RA),QA.f=Jt(QA).f+QA.a.f,QA.d=W(AA,QA.f)),aA(sA,CA)):dA(sA,QA,CA.c,CA.c,null,!0)}return}if(sA=IA(sA.i),AA=Lt(sA),QA=AA.a,AA=hA(J,AA,null),AA.c===QA){var QA=AA,AA=QA.c,GA=Lt(sA),RA=sA.a,st=GA.a,$A=!1;RA.b.a!==st.b.a&&BA(J,sA),e(RA.a,J.a)&&(u(it(AA),RA),sA=IA(sA),AA=Lt(sA).a,hA(J,Lt(sA),GA),$A=!0),e(st.a,J.a)&&(u(QA,it(st)),QA=hA(J,GA,null),$A=!0),$A?dA(J,sA,QA.c,AA,AA,!0):(n(st.a,RA.a)?CA=it(st):CA=RA,CA=w(QA.c.b,CA),dA(J,sA,CA,CA.c,CA.c,!1),CA.b.i.c=!0,lA(J,sA))}else dA(J,sA,AA.c,QA,QA,!0)}function wA(J,Z){var sA=new we,CA=E(J.b);CA.a.b=O,CA.a.a=Z,CA.b.a.b=-O,CA.b.a.a=Z,J.a=CA.b.a,sA.a=CA,sA.f=0,sA.d=!1,sA.c=!1,sA.h=!0,sA.b=!1,CA=J.f,CA=DA(CA,CA.a,sA),sA.e=CA}function YA(J){this.a=new UA,this.b=J,this.c=z}function DA(J,Z,sA){do Z=Z.c;while(Z.b!==null&&!J.c(J.b,Z.b,sA));return J=new UA(sA,Z.a,Z),Z.a.c=J,Z.a=J}function UA(J,Z,sA){this.b=J||null,this.a=Z||this,this.c=sA||this}function XA(){this.d=bA,this.p=this.b=this.q=null,this.j=[0,0,0],this.s=100130,this.n=!1,this.o=this.a=this.e=this.f=null,this.m=!1,this.c=this.r=this.i=this.k=this.l=this.h=null}var bA=0;t=XA.prototype,t.x=function(){nt(this,bA)},t.B=function(J,Z){switch(J){case 100142:return;case 100140:switch(Z){case 100130:case 100131:case 100132:case 100133:case 100134:this.s=Z;return}break;case 100141:this.m=!!Z;return;default:It(this,100900);return}It(this,100901)},t.y=function(J){switch(J){case 100142:return 0;case 100140:return this.s;case 100141:return this.m;default:It(this,100900)}return!1},t.A=function(J,Z,sA){this.j[0]=J,this.j[1]=Z,this.j[2]=sA},t.z=function(J,Z){var sA=Z||null;switch(J){case 100100:case 100106:this.h=sA;break;case 100104:case 100110:this.l=sA;break;case 100101:case 100107:this.k=sA;break;case 100102:case 100108:this.i=sA;break;case 100103:case 100109:this.p=sA;break;case 100105:case 100111:this.o=sA;break;case 100112:this.r=sA;break;default:It(this,100900)}},t.C=function(J,Z){var sA=!1,CA=[0,0,0];nt(this,2);for(var QA=0;3>QA;++QA){var RA=J[QA];-1e150>RA&&(RA=-1e150,sA=!0),1e150<RA&&(RA=1e150,sA=!0),CA[QA]=RA}sA&&It(this,100155),sA=this.q,sA===null?(sA=E(this.b),u(sA,sA.b)):(p(sA),sA=sA.e),sA.a.d=Z,sA.a.g[0]=CA[0],sA.a.g[1]=CA[1],sA.a.g[2]=CA[2],sA.f=1,sA.b.f=-1,this.q=sA},t.u=function(J){nt(this,bA),this.d=1,this.b=new Nt,this.c=J},t.t=function(){nt(this,1),this.d=2,this.q=null},t.v=function(){nt(this,2),this.d=1},t.w=function(){nt(this,1),this.d=bA;var J=this.j[0],Z=this.j[1],sA=this.j[2],CA=!1,QA=[J,Z,sA];if(J===0&&Z===0&&sA===0){for(var Z=[-2*1e150,-2*1e150,-2*1e150],RA=[2*1e150,2*1e150,2*1e150],sA=[],AA=[],CA=this.b.c,J=CA.e;J!==CA;J=J.e)for(var GA=0;3>GA;++GA){var st=J.g[GA];st<RA[GA]&&(RA[GA]=st,AA[GA]=J),st>Z[GA]&&(Z[GA]=st,sA[GA]=J)}if(J=0,Z[1]-RA[1]>Z[0]-RA[0]&&(J=1),Z[2]-RA[2]>Z[J]-RA[J]&&(J=2),RA[J]>=Z[J])QA[0]=0,QA[1]=0,QA[2]=1;else{for(Z=0,RA=AA[J],sA=sA[J],AA=[0,0,0],RA=[RA.g[0]-sA.g[0],RA.g[1]-sA.g[1],RA.g[2]-sA.g[2]],GA=[0,0,0],J=CA.e;J!==CA;J=J.e)GA[0]=J.g[0]-sA.g[0],GA[1]=J.g[1]-sA.g[1],GA[2]=J.g[2]-sA.g[2],AA[0]=RA[1]*GA[2]-RA[2]*GA[1],AA[1]=RA[2]*GA[0]-RA[0]*GA[2],AA[2]=RA[0]*GA[1]-RA[1]*GA[0],st=AA[0]*AA[0]+AA[1]*AA[1]+AA[2]*AA[2],st>Z&&(Z=st,QA[0]=AA[0],QA[1]=AA[1],QA[2]=AA[2]);0>=Z&&(QA[0]=QA[1]=QA[2]=0,QA[G(RA)]=1)}CA=!0}for(AA=G(QA),J=this.b.c,Z=(AA+1)%3,sA=(AA+2)%3,AA=0<QA[AA]?1:-1,QA=J.e;QA!==J;QA=QA.e)QA.b=QA.g[Z],QA.a=AA*QA.g[sA];if(CA){for(QA=0,CA=this.b.a,J=CA.b;J!==CA;J=J.b)if(Z=J.a,!(0>=Z.f))do QA+=(Z.a.b-Z.b.a.b)*(Z.a.a+Z.b.a.a),Z=Z.e;while(Z!==J.a);if(0>QA)for(QA=this.b.c,CA=QA.e;CA!==QA;CA=CA.e)CA.a=-CA.a}for(this.n=!1,QA=this.b.b,J=QA.h;J!==QA;J=CA)CA=J.h,Z=J.e,e(J.a,J.b.a)&&J.e.e!==J&&(yA(this,Z,J),Q(J),J=Z,Z=J.e),Z.e===J&&(Z!==J&&((Z===CA||Z===CA.b)&&(CA=CA.h),Q(Z)),(J===CA||J===CA.b)&&(CA=CA.h),Q(J));for(this.e=QA=new se,CA=this.b.c,J=CA.e;J!==CA;J=J.e)J.h=Ft(QA,J);for(Tt(QA),this.f=new YA(this),wA(this,-O),wA(this,O);(QA=jt(this.e))!==null;){for(;;){A:if(J=this.e,J.a===0)CA=ce(J.b);else if(CA=J.c[J.d[J.a-1]],J.b.a!==0&&(J=ce(J.b),n(J,CA))){CA=J;break A}if(CA===null||!e(CA,QA))break;CA=jt(this.e),yA(this,QA.c,CA.c)}aA(this,QA)}for(this.a=this.f.a.a.b.a.a,QA=0;(CA=this.f.a.a.b)!==null;)CA.h||++QA,tA(CA);for(this.f=null,QA=this.e,QA.b=null,QA.d=null,this.e=QA.c=null,QA=this.b,J=QA.a.b;J!==QA.a;J=CA)CA=J.b,J=J.a,J.e.e===J&&(H(J.c,J),Q(J));if(!this.n){if(QA=this.b,this.m)for(J=QA.b.h;J!==QA.b;J=CA)CA=J.h,J.b.d.c!==J.d.c?J.f=J.d.c?1:-1:Q(J);else for(J=QA.a.b;J!==QA.a;J=CA)if(CA=J.b,J.c){for(J=J.a;n(J.b.a,J.a);J=J.c.b);for(;n(J.a,J.b.a);J=J.e);for(Z=J.c.b,sA=void 0;J.e!==Z;)if(n(J.b.a,Z.a)){for(;Z.e!==J&&(a(Z.e)||0>=r(Z.a,Z.b.a,Z.e.b.a));)sA=w(Z.e,Z),Z=sA.b;Z=Z.c.b}else{for(;Z.e!==J&&(I(J.c.b)||0<=r(J.b.a,J.a,J.c.b.a));)sA=w(J,J.c.b),J=sA.b;J=J.e}for(;Z.e.e!==J;)sA=w(Z.e,Z),Z=sA.b}if(this.h||this.i||this.k||this.l)if(this.m){for(QA=this.b,CA=QA.a.b;CA!==QA.a;CA=CA.b)if(CA.c){this.h&&this.h(2,this.c),J=CA.a;do this.k&&this.k(J.a.d,this.c),J=J.e;while(J!==CA.a);this.i&&this.i(this.c)}}else{for(QA=this.b,CA=!!this.l,J=!1,Z=-1,sA=QA.a.d;sA!==QA.a;sA=sA.d)if(sA.c){J||(this.h&&this.h(4,this.c),J=!0),AA=sA.a;do CA&&(RA=AA.b.d.c?0:1,Z!==RA&&(Z=RA,this.l&&this.l(!!Z,this.c))),this.k&&this.k(AA.a.d,this.c),AA=AA.e;while(AA!==sA.a)}J&&this.i&&this.i(this.c)}if(this.r){for(QA=this.b,J=QA.a.b;J!==QA.a;J=CA)if(CA=J.b,!J.c){Z=J.a,sA=Z.e,AA=void 0;do AA=sA,sA=AA.e,AA.d=null,AA.b.d===null&&(AA.c===AA?U(AA.a,null):(AA.a.c=AA.c,M(AA,it(AA))),RA=AA.b,RA.c===RA?U(RA.a,null):(RA.a.c=RA.c,M(RA,it(RA))),R(AA));while(AA!==Z);Z=J.d,J=J.b,J.d=Z,Z.b=J}this.r(this.b),this.c=this.b=null;return}}this.b=this.c=null};function nt(J,Z){if(J.d!==Z)for(;J.d!==Z;)if(J.d<Z)switch(J.d){case bA:It(J,100151),J.u(null);break;case 1:It(J,100152),J.t()}else switch(J.d){case 2:It(J,100154),J.v();break;case 1:It(J,100153),J.w()}}function It(J,Z){J.p&&J.p(Z,J.c)}function St(J,Z){this.b=J||this,this.d=Z||this,this.a=null,this.c=!1}function gt(){this.h=this,this.i=this.d=this.a=this.e=this.c=this.b=null,this.f=0}function it(J){return J.b.e}function Nt(){this.c=new Pt,this.a=new St,this.b=new gt,this.d=new gt,this.b.b=this.d,this.d.b=this.b}function Pt(J,Z){this.e=J||this,this.f=Z||this,this.d=this.c=null,this.g=[0,0,0],this.h=this.a=this.b=0}function se(){this.c=[],this.d=null,this.a=0,this.e=!1,this.b=new re}function Tt(J){J.d=[];for(var Z=0;Z<J.a;Z++)J.d[Z]=Z;J.d.sort((function(sA){return function(CA,QA){return n(sA[CA],sA[QA])?1:-1}})(J.c)),J.e=!0,ue(J.b)}function Ft(J,Z){if(J.e){var sA=J.b,CA=++sA.a;2*CA>sA.f&&(sA.f*=2,sA.c=Kt(sA.c,sA.f+1));var QA;return sA.b===0?QA=CA:(QA=sA.b,sA.b=sA.c[sA.b]),sA.e[QA]=Z,sA.c[QA]=CA,sA.d[CA]=QA,sA.h&&Xt(sA,CA),QA}return sA=J.a++,J.c[sA]=Z,-(sA+1)}function jt(J){if(J.a===0)return De(J.b);var Z=J.c[J.d[J.a-1]];if(J.b.a!==0&&n(ce(J.b),Z))return De(J.b);do--J.a;while(0<J.a&&J.c[J.d[J.a-1]]===null);return Z}function re(){this.d=Kt([0],33),this.e=[null,null],this.c=[0,0],this.a=0,this.f=32,this.b=0,this.h=!1,this.d[1]=1}function Kt(J,Z){for(var sA=Array(Z),CA=0;CA<J.length;CA++)sA[CA]=J[CA];for(;CA<Z;CA++)sA[CA]=0;return sA}function ue(J){for(var Z=J.a;1<=Z;--Z)le(J,Z);J.h=!0}function ce(J){return J.e[J.d[1]]}function De(J){var Z=J.d,sA=J.e,CA=J.c,QA=Z[1],RA=sA[QA];return 0<J.a&&(Z[1]=Z[J.a],CA[Z[1]]=1,sA[QA]=null,CA[QA]=J.b,J.b=QA,0<--J.a&&le(J,1)),RA}function le(J,Z){for(var sA=J.d,CA=J.e,QA=J.c,RA=Z,AA=sA[RA];;){var GA=RA<<1;GA<J.a&&n(CA[sA[GA+1]],CA[sA[GA]])&&(GA+=1);var st=sA[GA];if(GA>J.a||n(CA[AA],CA[st])){sA[RA]=AA,QA[AA]=RA;break}sA[RA]=st,QA[st]=RA,RA=GA}}function Xt(J,Z){for(var sA=J.d,CA=J.e,QA=J.c,RA=Z,AA=sA[RA];;){var GA=RA>>1,st=sA[GA];if(GA===0||n(CA[st],CA[AA])){sA[RA]=AA,QA[AA]=RA;break}sA[RA]=st,QA[st]=RA,RA=GA}}function we(){this.e=this.a=null,this.f=0,this.c=this.b=this.h=this.d=!1}function Lt(J){return J.e.c.b}function Jt(J){return J.e.a.b}libtess_min.libtess={GluTesselator:XA,windingRule:{GLU_TESS_WINDING_ODD:100130,GLU_TESS_WINDING_NONZERO:100131,GLU_TESS_WINDING_POSITIVE:100132,GLU_TESS_WINDING_NEGATIVE:100133,GLU_TESS_WINDING_ABS_GEQ_TWO:100134},primitiveType:{GL_LINE_LOOP:2,GL_TRIANGLES:4,GL_TRIANGLE_STRIP:5,GL_TRIANGLE_FAN:6},errorType:{GLU_TESS_MISSING_BEGIN_POLYGON:100151,GLU_TESS_MISSING_END_POLYGON:100153,GLU_TESS_MISSING_BEGIN_CONTOUR:100152,GLU_TESS_MISSING_END_CONTOUR:100154,GLU_TESS_COORD_TOO_LARGE:100155,GLU_TESS_NEED_COMBINE_CALLBACK:100156},gluEnum:{GLU_TESS_MESH:100112,GLU_TESS_TOLERANCE:100142,GLU_TESS_WINDING_RULE:100140,GLU_TESS_BOUNDARY_ONLY:100141,GLU_INVALID_ENUM:100900,GLU_INVALID_VALUE:100901,GLU_TESS_BEGIN:100100,GLU_TESS_VERTEX:100101,GLU_TESS_END:100102,GLU_TESS_ERROR:100103,GLU_TESS_EDGE_FLAG:100104,GLU_TESS_COMBINE:100105,GLU_TESS_BEGIN_DATA:100106,GLU_TESS_VERTEX_DATA:100107,GLU_TESS_END_DATA:100108,GLU_TESS_ERROR_DATA:100109,GLU_TESS_EDGE_FLAG_DATA:100110,GLU_TESS_COMBINE_DATA:100111}},XA.prototype.gluDeleteTess=XA.prototype.x,XA.prototype.gluTessProperty=XA.prototype.B,XA.prototype.gluGetTessProperty=XA.prototype.y,XA.prototype.gluTessNormal=XA.prototype.A,XA.prototype.gluTessCallback=XA.prototype.z,XA.prototype.gluTessVertex=XA.prototype.C,XA.prototype.gluTessBeginPolygon=XA.prototype.u,XA.prototype.gluTessBeginContour=XA.prototype.t,XA.prototype.gluTessEndContour=XA.prototype.v,XA.prototype.gluTessEndPolygon=XA.prototype.w,l.exports=libtess_min.libtess})(libtess_min$1)),libtess_min$1.exports}var libtess_minExports=requireLibtess_min();const libtess=getDefaultExportFromCjs(libtess_minExports);function begincallback(l){l!==libtess.primitiveType.GL_TRIANGLES&&console.log(`expected TRIANGLES but got type: ${l}`)}function errorcallback(l){console.error("error callback"),console.error(`error number: ${l}`)}function initTesselator(){function l(s,r){r.push(s)}function t(s,r,i){return[s[0],s[1],s[2]]}function e(s){}const n=new libtess.GluTesselator;return n.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA,l),n.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN,begincallback),n.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR,errorcallback),n.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE,t),n.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG,e),n}function tessTriangulate(l,t){const e=initTesselator();e.gluTessNormal(t[0],t[1],t[2]);const n=[];e.gluTessBeginPolygon(n);for(const s of l){e.gluTessBeginContour();for(const r of s)e.gluTessVertex(r,r);e.gluTessEndContour()}return e.gluTessEndPolygon(),n}class LibtessVertex extends Array{constructor(t,e){super(),this.push(t.x),this.push(t.y),this.push(t.z?t.z:0),this.index=e}}var priorityqueuejs,hasRequiredPriorityqueuejs;function requirePriorityqueuejs(){if(hasRequiredPriorityqueuejs)return priorityqueuejs;hasRequiredPriorityqueuejs=1,priorityqueuejs=l;function l(t){this._comparator=t||l.DEFAULT_COMPARATOR,this._elements=[]}return l.DEFAULT_COMPARATOR=function(t,e){return typeof t=="number"&&typeof e=="number"?t-e:(t=t.toString(),e=e.toString(),t==e?0:t>e?1:-1)},l.prototype.isEmpty=function(){return this.size()===0},l.prototype.peek=function(){if(this.isEmpty())throw new Error("PriorityQueue is empty");return this._elements[0]},l.prototype.deq=function(){var t=this.peek(),e=this._elements.pop(),n=this.size();if(n===0)return t;this._elements[0]=e;for(var s=0;s<n;){var r=s,i=2*s+1,o=2*s+2;if(i<n&&this._compare(i,r)>=0&&(r=i),o<n&&this._compare(o,r)>=0&&(r=o),r===s)break;this._swap(r,s),s=r}return t},l.prototype.enq=function(t){for(var e=this._elements.push(t),n=e-1;n>0;){var s=Math.floor((n-1)/2);if(this._compare(n,s)<=0)break;this._swap(s,n),n=s}return e},l.prototype.size=function(){return this._elements.length},l.prototype.forEach=function(t){return this._elements.forEach(t)},l.prototype._compare=function(t,e){return this._comparator(this._elements[t],this._elements[e])},l.prototype._swap=function(t,e){var n=this._elements[t];this._elements[t]=this._elements[e],this._elements[e]=n},priorityqueuejs}var priorityqueuejsExports=requirePriorityqueuejs();const index$4=getDefaultExportFromCjs(priorityqueuejsExports),PriorityQueue=_mergeNamespaces({__proto__:null,default:index$4},[priorityqueuejsExports]);(function(){var l={};l.version="6.4.2.2",l.use_lines=!0,l.use_xyz=!1;var t=!1;typeof module<"u"&&module.exports?(module.exports=l,t=!0):(typeof define=="function"&&define.amd&&define(l),typeof document<"u"?window.ClipperLib=l:self.ClipperLib=l);var e;if(t){var n="chrome";e="Netscape"}else{var n=navigator.userAgent.toString().toLowerCase();e=navigator.appName}var s={};n.indexOf("chrome")!=-1&&n.indexOf("chromium")==-1?s.chrome=1:s.chrome=0,n.indexOf("chromium")!=-1?s.chromium=1:s.chromium=0,n.indexOf("safari")!=-1&&n.indexOf("chrome")==-1&&n.indexOf("chromium")==-1?s.safari=1:s.safari=0,n.indexOf("firefox")!=-1?s.firefox=1:s.firefox=0,n.indexOf("firefox/17")!=-1?s.firefox17=1:s.firefox17=0,n.indexOf("firefox/15")!=-1?s.firefox15=1:s.firefox15=0,n.indexOf("firefox/3")!=-1?s.firefox3=1:s.firefox3=0,n.indexOf("opera")!=-1?s.opera=1:s.opera=0,n.indexOf("msie 10")!=-1?s.msie10=1:s.msie10=0,n.indexOf("msie 9")!=-1?s.msie9=1:s.msie9=0,n.indexOf("msie 8")!=-1?s.msie8=1:s.msie8=0,n.indexOf("msie 7")!=-1?s.msie7=1:s.msie7=0,n.indexOf("msie ")!=-1?s.msie=1:s.msie=0,l.biginteger_used=null;var r;function i(f,m,P){l.biginteger_used=1,f!=null&&(typeof f=="number"&&typeof m>"u"?this.fromInt(f):typeof f=="number"?this.fromNumber(f,m,P):m==null&&typeof f!="string"?this.fromString(f,256):this.fromString(f,m))}function o(){return new i(null,void 0,void 0)}function g(f,m,P,L,h,d){for(;--d>=0;){var v=m*this[f++]+P[L]+h;h=Math.floor(v/67108864),P[L++]=v&67108863}return h}function a(f,m,P,L,h,d){for(var v=m&32767,x=m>>15;--d>=0;){var F=this[f]&32767,Y=this[f++]>>15,K=x*F+Y*v;F=v*F+((K&32767)<<15)+P[L]+(h&1073741823),h=(F>>>30)+(K>>>15)+x*Y+(h>>>30),P[L++]=F&1073741823}return h}function I(f,m,P,L,h,d){for(var v=m&16383,x=m>>14;--d>=0;){var F=this[f]&16383,Y=this[f++]>>14,K=x*F+Y*v;F=v*F+((K&16383)<<14)+P[L]+h,h=(F>>28)+(K>>14)+x*Y,P[L++]=F&268435455}return h}e=="Microsoft Internet Explorer"?(i.prototype.am=a,r=30):e!="Netscape"?(i.prototype.am=g,r=26):(i.prototype.am=I,r=28),i.prototype.DB=r,i.prototype.DM=(1<<r)-1,i.prototype.DV=1<<r;var c=52;i.prototype.FV=Math.pow(2,c),i.prototype.F1=c-r,i.prototype.F2=2*r-c;var E="0123456789abcdefghijklmnopqrstuvwxyz",u=new Array,Q,p;for(Q=48,p=0;p<=9;++p)u[Q++]=p;for(Q=97,p=10;p<36;++p)u[Q++]=p;for(Q=65,p=10;p<36;++p)u[Q++]=p;function w(f){return E.charAt(f)}function y(f,m){var P=u[f.charCodeAt(m)];return P??-1}function M(f){for(var m=this.t-1;m>=0;--m)f[m]=this[m];f.t=this.t,f.s=this.s}function N(f){this.t=1,this.s=f<0?-1:0,f>0?this[0]=f:f<-1?this[0]=f+this.DV:this.t=0}function S(f){var m=o();return m.fromInt(f),m}function R(f,m){var P;if(m==16)P=4;else if(m==8)P=3;else if(m==256)P=8;else if(m==2)P=1;else if(m==32)P=5;else if(m==4)P=2;else{this.fromRadix(f,m);return}this.t=0,this.s=0;for(var L=f.length,h=!1,d=0;--L>=0;){var v=P==8?f[L]&255:y(f,L);if(v<0){f.charAt(L)=="-"&&(h=!0);continue}h=!1,d==0?this[this.t++]=v:d+P>this.DB?(this[this.t-1]|=(v&(1<<this.DB-d)-1)<<d,this[this.t++]=v>>this.DB-d):this[this.t-1]|=v<<d,d+=P,d>=this.DB&&(d-=this.DB)}P==8&&(f[0]&128)!=0&&(this.s=-1,d>0&&(this[this.t-1]|=(1<<this.DB-d)-1<<d)),this.clamp(),h&&i.ZERO.subTo(this,this)}function U(){for(var f=this.s&this.DM;this.t>0&&this[this.t-1]==f;)--this.t}function b(f){if(this.s<0)return"-"+this.negate().toString(f);var m;if(f==16)m=4;else if(f==8)m=3;else if(f==2)m=1;else if(f==32)m=5;else if(f==4)m=2;else return this.toRadix(f);var P=(1<<m)-1,L,h=!1,d="",v=this.t,x=this.DB-v*this.DB%m;if(v-- >0)for(x<this.DB&&(L=this[v]>>x)>0&&(h=!0,d=w(L));v>=0;)x<m?(L=(this[v]&(1<<x)-1)<<m-x,L|=this[--v]>>(x+=this.DB-m)):(L=this[v]>>(x-=m)&P,x<=0&&(x+=this.DB,--v)),L>0&&(h=!0),h&&(d+=w(L));return h?d:"0"}function G(){var f=o();return i.ZERO.subTo(this,f),f}function O(){return this.s<0?this.negate():this}function H(f){var m=this.s-f.s;if(m!=0)return m;var P=this.t;if(m=P-f.t,m!=0)return this.s<0?-m:m;for(;--P>=0;)if((m=this[P]-f[P])!=0)return m;return 0}function z(f){var m=1,P;return(P=f>>>16)!=0&&(f=P,m+=16),(P=f>>8)!=0&&(f=P,m+=8),(P=f>>4)!=0&&(f=P,m+=4),(P=f>>2)!=0&&(f=P,m+=2),(P=f>>1)!=0&&(f=P,m+=1),m}function tA(){return this.t<=0?0:this.DB*(this.t-1)+z(this[this.t-1]^this.s&this.DM)}function nA(f,m){var P;for(P=this.t-1;P>=0;--P)m[P+f]=this[P];for(P=f-1;P>=0;--P)m[P]=0;m.t=this.t+f,m.s=this.s}function IA(f,m){for(var P=f;P<this.t;++P)m[P-f]=this[P];m.t=Math.max(this.t-f,0),m.s=this.s}function iA(f,m){var P=f%this.DB,L=this.DB-P,h=(1<<L)-1,d=Math.floor(f/this.DB),v=this.s<<P&this.DM,x;for(x=this.t-1;x>=0;--x)m[x+d+1]=this[x]>>L|v,v=(this[x]&h)<<P;for(x=d-1;x>=0;--x)m[x]=0;m[d]=v,m.t=this.t+d+1,m.s=this.s,m.clamp()}function W(f,m){m.s=this.s;var P=Math.floor(f/this.DB);if(P>=this.t){m.t=0;return}var L=f%this.DB,h=this.DB-L,d=(1<<L)-1;m[0]=this[P]>>L;for(var v=P+1;v<this.t;++v)m[v-P-1]|=(this[v]&d)<<h,m[v-P]=this[v]>>L;L>0&&(m[this.t-P-1]|=(this.s&d)<<h),m.t=this.t-P,m.clamp()}function oA(f,m){for(var P=0,L=0,h=Math.min(f.t,this.t);P<h;)L+=this[P]-f[P],m[P++]=L&this.DM,L>>=this.DB;if(f.t<this.t){for(L-=f.s;P<this.t;)L+=this[P],m[P++]=L&this.DM,L>>=this.DB;L+=this.s}else{for(L+=this.s;P<f.t;)L-=f[P],m[P++]=L&this.DM,L>>=this.DB;L-=f.s}m.s=L<0?-1:0,L<-1?m[P++]=this.DV+L:L>0&&(m[P++]=L),m.t=P,m.clamp()}function hA(f,m){var P=this.abs(),L=f.abs(),h=P.t;for(m.t=h+L.t;--h>=0;)m[h]=0;for(h=0;h<L.t;++h)m[h+P.t]=P.am(0,L[h],m,h,0,P.t);m.s=0,m.clamp(),this.s!=f.s&&i.ZERO.subTo(m,m)}function dA(f){for(var m=this.abs(),P=f.t=2*m.t;--P>=0;)f[P]=0;for(P=0;P<m.t-1;++P){var L=m.am(P,m[P],f,2*P,0,1);(f[P+m.t]+=m.am(P+1,2*m[P],f,2*P+1,L,m.t-P-1))>=m.DV&&(f[P+m.t]-=m.DV,f[P+m.t+1]=1)}f.t>0&&(f[f.t-1]+=m.am(P,m[P],f,2*P,0,1)),f.s=0,f.clamp()}function PA(f,m,P){var L=f.abs();if(!(L.t<=0)){var h=this.abs();if(h.t<L.t){m?.fromInt(0),P!=null&&this.copyTo(P);return}P==null&&(P=o());var d=o(),v=this.s,x=f.s,F=this.DB-z(L[L.t-1]);F>0?(L.lShiftTo(F,d),h.lShiftTo(F,P)):(L.copyTo(d),h.copyTo(P));var Y=d.t,K=d[Y-1];if(K!=0){var q=K*(1<<this.F1)+(Y>1?d[Y-2]>>this.F2:0),j=this.FV/q,rA=(1<<this.F1)/q,gA=1<<this.F2,cA=P.t,uA=cA-Y,fA=m??o();for(d.dlShiftTo(uA,fA),P.compareTo(fA)>=0&&(P[P.t++]=1,P.subTo(fA,P)),i.ONE.dlShiftTo(Y,fA),fA.subTo(d,d);d.t<Y;)d[d.t++]=0;for(;--uA>=0;){var pA=P[--cA]==K?this.DM:Math.floor(P[cA]*j+(P[cA-1]+gA)*rA);if((P[cA]+=d.am(0,pA,P,uA,0,Y))<pA)for(d.dlShiftTo(uA,fA),P.subTo(fA,P);P[cA]<--pA;)P.subTo(fA,P)}m!=null&&(P.drShiftTo(Y,m),v!=x&&i.ZERO.subTo(m,m)),P.t=Y,P.clamp(),F>0&&P.rShiftTo(F,P),v<0&&i.ZERO.subTo(P,P)}}}function yA(f){var m=o();return this.abs().divRemTo(f,null,m),this.s<0&&m.compareTo(i.ZERO)>0&&f.subTo(m,m),m}function _A(f){this.m=f}function LA(f){return f.s<0||f.compareTo(this.m)>=0?f.mod(this.m):f}function BA(f){return f}function lA(f){f.divRemTo(this.m,null,f)}function aA(f,m,P){f.multiplyTo(m,P),this.reduce(P)}function wA(f,m){f.squareTo(m),this.reduce(m)}_A.prototype.convert=LA,_A.prototype.revert=BA,_A.prototype.reduce=lA,_A.prototype.mulTo=aA,_A.prototype.sqrTo=wA;function YA(){if(this.t<1)return 0;var f=this[0];if((f&1)==0)return 0;var m=f&3;return m=m*(2-(f&15)*m)&15,m=m*(2-(f&255)*m)&255,m=m*(2-((f&65535)*m&65535))&65535,m=m*(2-f*m%this.DV)%this.DV,m>0?this.DV-m:-m}function DA(f){this.m=f,this.mp=f.invDigit(),this.mpl=this.mp&32767,this.mph=this.mp>>15,this.um=(1<<f.DB-15)-1,this.mt2=2*f.t}function UA(f){var m=o();return f.abs().dlShiftTo(this.m.t,m),m.divRemTo(this.m,null,m),f.s<0&&m.compareTo(i.ZERO)>0&&this.m.subTo(m,m),m}function XA(f){var m=o();return f.copyTo(m),this.reduce(m),m}function bA(f){for(;f.t<=this.mt2;)f[f.t++]=0;for(var m=0;m<this.m.t;++m){var P=f[m]&32767,L=P*this.mpl+((P*this.mph+(f[m]>>15)*this.mpl&this.um)<<15)&f.DM;for(P=m+this.m.t,f[P]+=this.m.am(0,L,f,m,0,this.m.t);f[P]>=f.DV;)f[P]-=f.DV,f[++P]++}f.clamp(),f.drShiftTo(this.m.t,f),f.compareTo(this.m)>=0&&f.subTo(this.m,f)}function nt(f,m){f.squareTo(m),this.reduce(m)}function It(f,m,P){f.multiplyTo(m,P),this.reduce(P)}DA.prototype.convert=UA,DA.prototype.revert=XA,DA.prototype.reduce=bA,DA.prototype.mulTo=It,DA.prototype.sqrTo=nt;function St(){return(this.t>0?this[0]&1:this.s)==0}function gt(f,m){if(f>4294967295||f<1)return i.ONE;var P=o(),L=o(),h=m.convert(this),d=z(f)-1;for(h.copyTo(P);--d>=0;)if(m.sqrTo(P,L),(f&1<<d)>0)m.mulTo(L,h,P);else{var v=P;P=L,L=v}return m.revert(P)}function it(f,m){var P;return f<256||m.isEven()?P=new _A(m):P=new DA(m),this.exp(f,P)}i.prototype.copyTo=M,i.prototype.fromInt=N,i.prototype.fromString=R,i.prototype.clamp=U,i.prototype.dlShiftTo=nA,i.prototype.drShiftTo=IA,i.prototype.lShiftTo=iA,i.prototype.rShiftTo=W,i.prototype.subTo=oA,i.prototype.multiplyTo=hA,i.prototype.squareTo=dA,i.prototype.divRemTo=PA,i.prototype.invDigit=YA,i.prototype.isEven=St,i.prototype.exp=gt,i.prototype.toString=b,i.prototype.negate=G,i.prototype.abs=O,i.prototype.compareTo=H,i.prototype.bitLength=tA,i.prototype.mod=yA,i.prototype.modPowInt=it,i.ZERO=S(0),i.ONE=S(1);function Nt(){var f=o();return this.copyTo(f),f}function Pt(){if(this.s<0){if(this.t==1)return this[0]-this.DV;if(this.t==0)return-1}else{if(this.t==1)return this[0];if(this.t==0)return 0}return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]}function se(){return this.t==0?this.s:this[0]<<24>>24}function Tt(){return this.t==0?this.s:this[0]<<16>>16}function Ft(f){return Math.floor(Math.LN2*this.DB/Math.log(f))}function jt(){return this.s<0?-1:this.t<=0||this.t==1&&this[0]<=0?0:1}function re(f){if(f==null&&(f=10),this.signum()==0||f<2||f>36)return"0";var m=this.chunkSize(f),P=Math.pow(f,m),L=S(P),h=o(),d=o(),v="";for(this.divRemTo(L,h,d);h.signum()>0;)v=(P+d.intValue()).toString(f).substr(1)+v,h.divRemTo(L,h,d);return d.intValue().toString(f)+v}function Kt(f,m){this.fromInt(0),m==null&&(m=10);for(var P=this.chunkSize(m),L=Math.pow(m,P),h=!1,d=0,v=0,x=0;x<f.length;++x){var F=y(f,x);if(F<0){f.charAt(x)=="-"&&this.signum()==0&&(h=!0);continue}v=m*v+F,++d>=P&&(this.dMultiply(L),this.dAddOffset(v,0),d=0,v=0)}d>0&&(this.dMultiply(Math.pow(m,d)),this.dAddOffset(v,0)),h&&i.ZERO.subTo(this,this)}function ue(f,m,P){if(typeof m=="number")if(f<2)this.fromInt(1);else for(this.fromNumber(f,P),this.testBit(f-1)||this.bitwiseTo(i.ONE.shiftLeft(f-1),J,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(m);)this.dAddOffset(2,0),this.bitLength()>f&&this.subTo(i.ONE.shiftLeft(f-1),this);else{var L=new Array,h=f&7;L.length=(f>>3)+1,m.nextBytes(L),h>0?L[0]&=(1<<h)-1:L[0]=0,this.fromString(L,256)}}function ce(){var f=this.t,m=new Array;m[0]=this.s;var P=this.DB-f*this.DB%8,L,h=0;if(f-- >0)for(P<this.DB&&(L=this[f]>>P)!=(this.s&this.DM)>>P&&(m[h++]=L|this.s<<this.DB-P);f>=0;)P<8?(L=(this[f]&(1<<P)-1)<<8-P,L|=this[--f]>>(P+=this.DB-8)):(L=this[f]>>(P-=8)&255,P<=0&&(P+=this.DB,--f)),(L&128)!=0&&(L|=-256),h==0&&(this.s&128)!=(L&128)&&++h,(h>0||L!=this.s)&&(m[h++]=L);return m}function De(f){return this.compareTo(f)==0}function le(f){return this.compareTo(f)<0?this:f}function Xt(f){return this.compareTo(f)>0?this:f}function we(f,m,P){var L,h,d=Math.min(f.t,this.t);for(L=0;L<d;++L)P[L]=m(this[L],f[L]);if(f.t<this.t){for(h=f.s&this.DM,L=d;L<this.t;++L)P[L]=m(this[L],h);P.t=this.t}else{for(h=this.s&this.DM,L=d;L<f.t;++L)P[L]=m(h,f[L]);P.t=f.t}P.s=m(this.s,f.s),P.clamp()}function Lt(f,m){return f&m}function Jt(f){var m=o();return this.bitwiseTo(f,Lt,m),m}function J(f,m){return f|m}function Z(f){var m=o();return this.bitwiseTo(f,J,m),m}function sA(f,m){return f^m}function CA(f){var m=o();return this.bitwiseTo(f,sA,m),m}function QA(f,m){return f&~m}function RA(f){var m=o();return this.bitwiseTo(f,QA,m),m}function AA(){for(var f=o(),m=0;m<this.t;++m)f[m]=this.DM&~this[m];return f.t=this.t,f.s=~this.s,f}function GA(f){var m=o();return f<0?this.rShiftTo(-f,m):this.lShiftTo(f,m),m}function st(f){var m=o();return f<0?this.lShiftTo(-f,m):this.rShiftTo(f,m),m}function $A(f){if(f==0)return-1;var m=0;return(f&65535)==0&&(f>>=16,m+=16),(f&255)==0&&(f>>=8,m+=8),(f&15)==0&&(f>>=4,m+=4),(f&3)==0&&(f>>=2,m+=2),(f&1)==0&&++m,m}function vt(){for(var f=0;f<this.t;++f)if(this[f]!=0)return f*this.DB+$A(this[f]);return this.s<0?this.t*this.DB:-1}function Dt(f){for(var m=0;f!=0;)f&=f-1,++m;return m}function Mt(){for(var f=0,m=this.s&this.DM,P=0;P<this.t;++P)f+=Dt(this[P]^m);return f}function et(f){var m=Math.floor(f/this.DB);return m>=this.t?this.s!=0:(this[m]&1<<f%this.DB)!=0}function Ct(f,m){var P=i.ONE.shiftLeft(f);return this.bitwiseTo(P,m,P),P}function yt(f){return this.changeBit(f,J)}function V(f){return this.changeBit(f,QA)}function wt(f){return this.changeBit(f,sA)}function _e(f,m){for(var P=0,L=0,h=Math.min(f.t,this.t);P<h;)L+=this[P]+f[P],m[P++]=L&this.DM,L>>=this.DB;if(f.t<this.t){for(L+=f.s;P<this.t;)L+=this[P],m[P++]=L&this.DM,L>>=this.DB;L+=this.s}else{for(L+=this.s;P<f.t;)L+=f[P],m[P++]=L&this.DM,L>>=this.DB;L+=f.s}m.s=L<0?-1:0,L>0?m[P++]=L:L<-1&&(m[P++]=this.DV+L),m.t=P,m.clamp()}function ie(f){var m=o();return this.addTo(f,m),m}function Ae(f){var m=o();return this.subTo(f,m),m}function xe(f){var m=o();return this.multiplyTo(f,m),m}function mA(){var f=o();return this.squareTo(f),f}function WA(f){var m=o();return this.divRemTo(f,m,null),m}function Et(f){var m=o();return this.divRemTo(f,null,m),m}function dt(f){var m=o(),P=o();return this.divRemTo(f,m,P),new Array(m,P)}function xt(f){this[this.t]=this.am(0,f-1,this,0,0,this.t),++this.t,this.clamp()}function Be(f,m){if(f!=0){for(;this.t<=m;)this[this.t++]=0;for(this[m]+=f;this[m]>=this.DV;)this[m]-=this.DV,++m>=this.t&&(this[this.t++]=0),++this[m]}}function zt(){}function me(f){return f}function Rt(f,m,P){f.multiplyTo(m,P)}function ye(f,m){f.squareTo(m)}zt.prototype.convert=me,zt.prototype.revert=me,zt.prototype.mulTo=Rt,zt.prototype.sqrTo=ye;function Fe(f){return this.exp(f,new zt)}function Le(f,m,P){var L=Math.min(this.t+f.t,m);for(P.s=0,P.t=L;L>0;)P[--L]=0;var h;for(h=P.t-this.t;L<h;++L)P[L+this.t]=this.am(0,f[L],P,L,0,this.t);for(h=Math.min(f.t,m);L<h;++L)this.am(0,f[L],P,L,0,m-L);P.clamp()}function ve(f,m,P){--m;var L=P.t=this.t+f.t-m;for(P.s=0;--L>=0;)P[L]=0;for(L=Math.max(m-this.t,0);L<f.t;++L)P[this.t+L-m]=this.am(m-L,f[L],P,0,0,this.t+L-m);P.clamp(),P.drShiftTo(1,P)}function pt(f){this.r2=o(),this.q3=o(),i.ONE.dlShiftTo(2*f.t,this.r2),this.mu=this.r2.divide(f),this.m=f}function Re(f){if(f.s<0||f.t>2*this.m.t)return f.mod(this.m);if(f.compareTo(this.m)<0)return f;var m=o();return f.copyTo(m),this.reduce(m),m}function qt(f){return f}function te(f){for(f.drShiftTo(this.m.t-1,this.r2),f.t>this.m.t+1&&(f.t=this.m.t+1,f.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);f.compareTo(this.r2)<0;)f.dAddOffset(1,this.m.t+1);for(f.subTo(this.r2,f);f.compareTo(this.m)>=0;)f.subTo(this.m,f)}function Ee(f,m){f.squareTo(m),this.reduce(m)}function Me(f,m,P){f.multiplyTo(m,P),this.reduce(P)}pt.prototype.convert=Re,pt.prototype.revert=qt,pt.prototype.reduce=te,pt.prototype.mulTo=Me,pt.prototype.sqrTo=Ee;function Ue(f,m){var P=f.bitLength(),L,h=S(1),d;if(P<=0)return h;P<18?L=1:P<48?L=3:P<144?L=4:P<768?L=5:L=6,P<8?d=new _A(m):m.isEven()?d=new pt(m):d=new DA(m);var v=new Array,x=3,F=L-1,Y=(1<<L)-1;if(v[1]=d.convert(this),L>1){var K=o();for(d.sqrTo(v[1],K);x<=Y;)v[x]=o(),d.mulTo(K,v[x-2],v[x]),x+=2}var q=f.t-1,j,rA=!0,gA=o(),cA;for(P=z(f[q])-1;q>=0;){for(P>=F?j=f[q]>>P-F&Y:(j=(f[q]&(1<<P+1)-1)<<F-P,q>0&&(j|=f[q-1]>>this.DB+P-F)),x=L;(j&1)==0;)j>>=1,--x;if((P-=x)<0&&(P+=this.DB,--q),rA)v[j].copyTo(h),rA=!1;else{for(;x>1;)d.sqrTo(h,gA),d.sqrTo(gA,h),x-=2;x>0?d.sqrTo(h,gA):(cA=h,h=gA,gA=cA),d.mulTo(gA,v[j],h)}for(;q>=0&&(f[q]&1<<P)==0;)d.sqrTo(h,gA),cA=h,h=gA,gA=cA,--P<0&&(P=this.DB-1,--q)}return d.revert(h)}function ke(f){var m=this.s<0?this.negate():this.clone(),P=f.s<0?f.negate():f.clone();if(m.compareTo(P)<0){var L=m;m=P,P=L}var h=m.getLowestSetBit(),d=P.getLowestSetBit();if(d<0)return m;for(h<d&&(d=h),d>0&&(m.rShiftTo(d,m),P.rShiftTo(d,P));m.signum()>0;)(h=m.getLowestSetBit())>0&&m.rShiftTo(h,m),(h=P.getLowestSetBit())>0&&P.rShiftTo(h,P),m.compareTo(P)>=0?(m.subTo(P,m),m.rShiftTo(1,m)):(P.subTo(m,P),P.rShiftTo(1,P));return d>0&&P.lShiftTo(d,P),P}function Ge(f){if(f<=0)return 0;var m=this.DV%f,P=this.s<0?f-1:0;if(this.t>0)if(m==0)P=this[0]%f;else for(var L=this.t-1;L>=0;--L)P=(m*P+this[L])%f;return P}function Te(f){var m=f.isEven();if(this.isEven()&&m||f.signum()==0)return i.ZERO;for(var P=f.clone(),L=this.clone(),h=S(1),d=S(0),v=S(0),x=S(1);P.signum()!=0;){for(;P.isEven();)P.rShiftTo(1,P),m?((!h.isEven()||!d.isEven())&&(h.addTo(this,h),d.subTo(f,d)),h.rShiftTo(1,h)):d.isEven()||d.subTo(f,d),d.rShiftTo(1,d);for(;L.isEven();)L.rShiftTo(1,L),m?((!v.isEven()||!x.isEven())&&(v.addTo(this,v),x.subTo(f,x)),v.rShiftTo(1,v)):x.isEven()||x.subTo(f,x),x.rShiftTo(1,x);P.compareTo(L)>=0?(P.subTo(L,P),m&&h.subTo(v,h),d.subTo(x,d)):(L.subTo(P,L),m&&v.subTo(h,v),x.subTo(d,x))}if(L.compareTo(i.ONE)!=0)return i.ZERO;if(x.compareTo(f)>=0)return x.subtract(f);if(x.signum()<0)x.addTo(f,x);else return x;return x.signum()<0?x.add(f):x}var bt=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],oe=(1<<26)/bt[bt.length-1];function Wt(f){var m,P=this.abs();if(P.t==1&&P[0]<=bt[bt.length-1]){for(m=0;m<bt.length;++m)if(P[0]==bt[m])return!0;return!1}if(P.isEven())return!1;for(m=1;m<bt.length;){for(var L=bt[m],h=m+1;h<bt.length&&L<oe;)L*=bt[h++];for(L=P.modInt(L);m<h;)if(L%bt[m++]==0)return!1}return P.millerRabin(f)}function Je(f){var m=this.subtract(i.ONE),P=m.getLowestSetBit();if(P<=0)return!1;var L=m.shiftRight(P);f=f+1>>1,f>bt.length&&(f=bt.length);for(var h=o(),d=0;d<f;++d){h.fromInt(bt[Math.floor(Math.random()*bt.length)]);var v=h.modPow(L,this);if(v.compareTo(i.ONE)!=0&&v.compareTo(m)!=0){for(var x=1;x++<P&&v.compareTo(m)!=0;)if(v=v.modPowInt(2,this),v.compareTo(i.ONE)==0)return!1;if(v.compareTo(m)!=0)return!1}}return!0}i.prototype.chunkSize=Ft,i.prototype.toRadix=re,i.prototype.fromRadix=Kt,i.prototype.fromNumber=ue,i.prototype.bitwiseTo=we,i.prototype.changeBit=Ct,i.prototype.addTo=_e,i.prototype.dMultiply=xt,i.prototype.dAddOffset=Be,i.prototype.multiplyLowerTo=Le,i.prototype.multiplyUpperTo=ve,i.prototype.modInt=Ge,i.prototype.millerRabin=Je,i.prototype.clone=Nt,i.prototype.intValue=Pt,i.prototype.byteValue=se,i.prototype.shortValue=Tt,i.prototype.signum=jt,i.prototype.toByteArray=ce,i.prototype.equals=De,i.prototype.min=le,i.prototype.max=Xt,i.prototype.and=Jt,i.prototype.or=Z,i.prototype.xor=CA,i.prototype.andNot=RA,i.prototype.not=AA,i.prototype.shiftLeft=GA,i.prototype.shiftRight=st,i.prototype.getLowestSetBit=vt,i.prototype.bitCount=Mt,i.prototype.testBit=et,i.prototype.setBit=yt,i.prototype.clearBit=V,i.prototype.flipBit=wt,i.prototype.add=ie,i.prototype.subtract=Ae,i.prototype.multiply=xe,i.prototype.divide=WA,i.prototype.remainder=Et,i.prototype.divideAndRemainder=dt,i.prototype.modPow=Ue,i.prototype.modInverse=Te,i.prototype.pow=Fe,i.prototype.gcd=ke,i.prototype.isProbablePrime=Wt,i.prototype.square=mA;var at=i;at.prototype.IsNegative=function(){return this.compareTo(at.ZERO)==-1},at.op_Equality=function(f,m){return f.compareTo(m)==0},at.op_Inequality=function(f,m){return f.compareTo(m)!=0},at.op_GreaterThan=function(f,m){return f.compareTo(m)>0},at.op_LessThan=function(f,m){return f.compareTo(m)<0},at.op_Addition=function(f,m){return new at(f,void 0,void 0).add(new at(m,void 0,void 0))},at.op_Subtraction=function(f,m){return new at(f,void 0,void 0).subtract(new at(m,void 0,void 0))},at.Int128Mul=function(f,m){return new at(f,void 0,void 0).multiply(new at(m,void 0,void 0))},at.op_Division=function(f,m){return f.divide(m)},at.prototype.ToDouble=function(){return parseFloat(this.toString())};var He=function(f,m){var P;if(typeof Object.getOwnPropertyNames>"u"){for(P in m.prototype)(typeof f.prototype[P]>"u"||f.prototype[P]===Object.prototype[P])&&(f.prototype[P]=m.prototype[P]);for(P in m)typeof f[P]>"u"&&(f[P]=m[P]);f.$baseCtor=m}else{for(var L=Object.getOwnPropertyNames(m.prototype),h=0;h<L.length;h++)typeof Object.getOwnPropertyDescriptor(f.prototype,L[h])>"u"&&Object.defineProperty(f.prototype,L[h],Object.getOwnPropertyDescriptor(m.prototype,L[h]));for(P in m)typeof f[P]>"u"&&(f[P]=m[P]);f.$baseCtor=m}};l.Path=function(){return[]},l.Path.prototype.push=Array.prototype.push,l.Paths=function(){return[]},l.Paths.prototype.push=Array.prototype.push,l.DoublePoint=function(){var f=arguments;this.X=0,this.Y=0,f.length===1?(this.X=f[0].X,this.Y=f[0].Y):f.length===2&&(this.X=f[0],this.Y=f[1])},l.DoublePoint0=function(){this.X=0,this.Y=0},l.DoublePoint0.prototype=l.DoublePoint.prototype,l.DoublePoint1=function(f){this.X=f.X,this.Y=f.Y},l.DoublePoint1.prototype=l.DoublePoint.prototype,l.DoublePoint2=function(f,m){this.X=f,this.Y=m},l.DoublePoint2.prototype=l.DoublePoint.prototype,l.PolyNode=function(){this.m_Parent=null,this.m_polygon=new l.Path,this.m_Index=0,this.m_jointype=0,this.m_endtype=0,this.m_Childs=[],this.IsOpen=!1},l.PolyNode.prototype.IsHoleNode=function(){for(var f=!0,m=this.m_Parent;m!==null;)f=!f,m=m.m_Parent;return f},l.PolyNode.prototype.ChildCount=function(){return this.m_Childs.length},l.PolyNode.prototype.Contour=function(){return this.m_polygon},l.PolyNode.prototype.AddChild=function(f){var m=this.m_Childs.length;this.m_Childs.push(f),f.m_Parent=this,f.m_Index=m},l.PolyNode.prototype.GetNext=function(){return this.m_Childs.length>0?this.m_Childs[0]:this.GetNextSiblingUp()},l.PolyNode.prototype.GetNextSiblingUp=function(){return this.m_Parent===null?null:this.m_Index===this.m_Parent.m_Childs.length-1?this.m_Parent.GetNextSiblingUp():this.m_Parent.m_Childs[this.m_Index+1]},l.PolyNode.prototype.Childs=function(){return this.m_Childs},l.PolyNode.prototype.Parent=function(){return this.m_Parent},l.PolyNode.prototype.IsHole=function(){return this.IsHoleNode()},l.PolyTree=function(){this.m_AllPolys=[],l.PolyNode.call(this)},l.PolyTree.prototype.Clear=function(){for(var f=0,m=this.m_AllPolys.length;f<m;f++)this.m_AllPolys[f]=null;this.m_AllPolys.length=0,this.m_Childs.length=0},l.PolyTree.prototype.GetFirst=function(){return this.m_Childs.length>0?this.m_Childs[0]:null},l.PolyTree.prototype.Total=function(){var f=this.m_AllPolys.length;return f>0&&this.m_Childs[0]!==this.m_AllPolys[0]&&f--,f},He(l.PolyTree,l.PolyNode),l.Math_Abs_Int64=l.Math_Abs_Int32=l.Math_Abs_Double=function(f){return Math.abs(f)},l.Math_Max_Int32_Int32=function(f,m){return Math.max(f,m)},s.msie||s.opera||s.safari?l.Cast_Int32=function(f){return f|0}:l.Cast_Int32=function(f){return~~f},typeof Number.toInteger>"u"&&(Number.toInteger=null),s.chrome?l.Cast_Int64=function(f){return f<-2147483648||f>2147483647?f<0?Math.ceil(f):Math.floor(f):~~f}:s.firefox&&typeof Number.toInteger=="function"?l.Cast_Int64=function(f){return Number.toInteger(f)}:s.msie7||s.msie8?l.Cast_Int64=function(f){return parseInt(f,10)}:s.msie?l.Cast_Int64=function(f){return f<-2147483648||f>2147483647?f<0?Math.ceil(f):Math.floor(f):f|0}:l.Cast_Int64=function(f){return f<0?Math.ceil(f):Math.floor(f)},l.Clear=function(f){f.length=0},l.PI=3.141592653589793,l.PI2=2*3.141592653589793,l.IntPoint=function(){var f=arguments,m=f.length;if(this.X=0,this.Y=0,l.use_xyz)if(this.Z=0,m===3)this.X=f[0],this.Y=f[1],this.Z=f[2];else if(m===2)this.X=f[0],this.Y=f[1],this.Z=0;else if(m===1)if(f[0]instanceof l.DoublePoint){var P=f[0];this.X=l.Clipper.Round(P.X),this.Y=l.Clipper.Round(P.Y),this.Z=0}else{var L=f[0];typeof L.Z>"u"&&(L.Z=0),this.X=L.X,this.Y=L.Y,this.Z=L.Z}else this.X=0,this.Y=0,this.Z=0;else if(m===2)this.X=f[0],this.Y=f[1];else if(m===1)if(f[0]instanceof l.DoublePoint){var P=f[0];this.X=l.Clipper.Round(P.X),this.Y=l.Clipper.Round(P.Y)}else{var L=f[0];this.X=L.X,this.Y=L.Y}else this.X=0,this.Y=0},l.IntPoint.op_Equality=function(f,m){return f.X===m.X&&f.Y===m.Y},l.IntPoint.op_Inequality=function(f,m){return f.X!==m.X||f.Y!==m.Y},l.IntPoint0=function(){this.X=0,this.Y=0,l.use_xyz&&(this.Z=0)},l.IntPoint0.prototype=l.IntPoint.prototype,l.IntPoint1=function(f){this.X=f.X,this.Y=f.Y,l.use_xyz&&(typeof f.Z>"u"?this.Z=0:this.Z=f.Z)},l.IntPoint1.prototype=l.IntPoint.prototype,l.IntPoint1dp=function(f){this.X=l.Clipper.Round(f.X),this.Y=l.Clipper.Round(f.Y),l.use_xyz&&(this.Z=0)},l.IntPoint1dp.prototype=l.IntPoint.prototype,l.IntPoint2=function(f,m,P){this.X=f,this.Y=m,l.use_xyz&&(typeof P>"u"?this.Z=0:this.Z=P)},l.IntPoint2.prototype=l.IntPoint.prototype,l.IntRect=function(){var f=arguments,m=f.length;if(m===4)this.left=f[0],this.top=f[1],this.right=f[2],this.bottom=f[3];else if(m===1){var P=f[0];this.left=P.left,this.top=P.top,this.right=P.right,this.bottom=P.bottom}else this.left=0,this.top=0,this.right=0,this.bottom=0},l.IntRect0=function(){this.left=0,this.top=0,this.right=0,this.bottom=0},l.IntRect0.prototype=l.IntRect.prototype,l.IntRect1=function(f){this.left=f.left,this.top=f.top,this.right=f.right,this.bottom=f.bottom},l.IntRect1.prototype=l.IntRect.prototype,l.IntRect4=function(f,m,P,L){this.left=f,this.top=m,this.right=P,this.bottom=L},l.IntRect4.prototype=l.IntRect.prototype,l.ClipType={ctIntersection:0,ctUnion:1,ctDifference:2,ctXor:3},l.PolyType={ptSubject:0,ptClip:1},l.PolyFillType={pftEvenOdd:0,pftNonZero:1,pftPositive:2,pftNegative:3},l.JoinType={jtSquare:0,jtRound:1,jtMiter:2},l.EndType={etOpenSquare:0,etOpenRound:1,etOpenButt:2,etClosedLine:3,etClosedPolygon:4},l.EdgeSide={esLeft:0,esRight:1},l.Direction={dRightToLeft:0,dLeftToRight:1},l.TEdge=function(){this.Bot=new l.IntPoint0,this.Curr=new l.IntPoint0,this.Top=new l.IntPoint0,this.Delta=new l.IntPoint0,this.Dx=0,this.PolyTyp=l.PolyType.ptSubject,this.Side=l.EdgeSide.esLeft,this.WindDelta=0,this.WindCnt=0,this.WindCnt2=0,this.OutIdx=0,this.Next=null,this.Prev=null,this.NextInLML=null,this.NextInAEL=null,this.PrevInAEL=null,this.NextInSEL=null,this.PrevInSEL=null},l.IntersectNode=function(){this.Edge1=null,this.Edge2=null,this.Pt=new l.IntPoint0},l.MyIntersectNodeSort=function(){},l.MyIntersectNodeSort.Compare=function(f,m){var P=m.Pt.Y-f.Pt.Y;return P>0?1:P<0?-1:0},l.LocalMinima=function(){this.Y=0,this.LeftBound=null,this.RightBound=null,this.Next=null},l.Scanbeam=function(){this.Y=0,this.Next=null},l.Maxima=function(){this.X=0,this.Next=null,this.Prev=null},l.OutRec=function(){this.Idx=0,this.IsHole=!1,this.IsOpen=!1,this.FirstLeft=null,this.Pts=null,this.BottomPt=null,this.PolyNode=null},l.OutPt=function(){this.Idx=0,this.Pt=new l.IntPoint0,this.Next=null,this.Prev=null},l.Join=function(){this.OutPt1=null,this.OutPt2=null,this.OffPt=new l.IntPoint0},l.ClipperBase=function(){this.m_MinimaList=null,this.m_CurrentLM=null,this.m_edges=new Array,this.m_UseFullRange=!1,this.m_HasOpenPaths=!1,this.PreserveCollinear=!1,this.m_Scanbeam=null,this.m_PolyOuts=null,this.m_ActiveEdges=null},l.ClipperBase.horizontal=-9007199254740992,l.ClipperBase.Skip=-2,l.ClipperBase.Unassigned=-1,l.ClipperBase.tolerance=1e-20,l.ClipperBase.loRange=47453132,l.ClipperBase.hiRange=0xfffffffffffff,l.ClipperBase.near_zero=function(f){return f>-l.ClipperBase.tolerance&&f<l.ClipperBase.tolerance},l.ClipperBase.IsHorizontal=function(f){return f.Delta.Y===0},l.ClipperBase.prototype.PointIsVertex=function(f,m){var P=m;do{if(l.IntPoint.op_Equality(P.Pt,f))return!0;P=P.Next}while(P!==m);return!1},l.ClipperBase.prototype.PointOnLineSegment=function(f,m,P,L){return L?f.X===m.X&&f.Y===m.Y||f.X===P.X&&f.Y===P.Y||f.X>m.X==f.X<P.X&&f.Y>m.Y==f.Y<P.Y&&at.op_Equality(at.Int128Mul(f.X-m.X,P.Y-m.Y),at.Int128Mul(P.X-m.X,f.Y-m.Y)):f.X===m.X&&f.Y===m.Y||f.X===P.X&&f.Y===P.Y||f.X>m.X==f.X<P.X&&f.Y>m.Y==f.Y<P.Y&&(f.X-m.X)*(P.Y-m.Y)===(P.X-m.X)*(f.Y-m.Y)},l.ClipperBase.prototype.PointOnPolygon=function(f,m,P){for(var L=m;;){if(this.PointOnLineSegment(f,L.Pt,L.Next.Pt,P))return!0;if(L=L.Next,L===m)break}return!1},l.ClipperBase.prototype.SlopesEqual=l.ClipperBase.SlopesEqual=function(){var f=arguments,m=f.length,P,L,h,d,v,x,F;return m===3?(P=f[0],L=f[1],F=f[2],F?at.op_Equality(at.Int128Mul(P.Delta.Y,L.Delta.X),at.Int128Mul(P.Delta.X,L.Delta.Y)):l.Cast_Int64(P.Delta.Y*L.Delta.X)===l.Cast_Int64(P.Delta.X*L.Delta.Y)):m===4?(h=f[0],d=f[1],v=f[2],F=f[3],F?at.op_Equality(at.Int128Mul(h.Y-d.Y,d.X-v.X),at.Int128Mul(h.X-d.X,d.Y-v.Y)):l.Cast_Int64((h.Y-d.Y)*(d.X-v.X))-l.Cast_Int64((h.X-d.X)*(d.Y-v.Y))===0):(h=f[0],d=f[1],v=f[2],x=f[3],F=f[4],F?at.op_Equality(at.Int128Mul(h.Y-d.Y,v.X-x.X),at.Int128Mul(h.X-d.X,v.Y-x.Y)):l.Cast_Int64((h.Y-d.Y)*(v.X-x.X))-l.Cast_Int64((h.X-d.X)*(v.Y-x.Y))===0)},l.ClipperBase.SlopesEqual3=function(f,m,P){return P?at.op_Equality(at.Int128Mul(f.Delta.Y,m.Delta.X),at.Int128Mul(f.Delta.X,m.Delta.Y)):l.Cast_Int64(f.Delta.Y*m.Delta.X)===l.Cast_Int64(f.Delta.X*m.Delta.Y)},l.ClipperBase.SlopesEqual4=function(f,m,P,L){return L?at.op_Equality(at.Int128Mul(f.Y-m.Y,m.X-P.X),at.Int128Mul(f.X-m.X,m.Y-P.Y)):l.Cast_Int64((f.Y-m.Y)*(m.X-P.X))-l.Cast_Int64((f.X-m.X)*(m.Y-P.Y))===0},l.ClipperBase.SlopesEqual5=function(f,m,P,L,h){return h?at.op_Equality(at.Int128Mul(f.Y-m.Y,P.X-L.X),at.Int128Mul(f.X-m.X,P.Y-L.Y)):l.Cast_Int64((f.Y-m.Y)*(P.X-L.X))-l.Cast_Int64((f.X-m.X)*(P.Y-L.Y))===0},l.ClipperBase.prototype.Clear=function(){this.DisposeLocalMinimaList();for(var f=0,m=this.m_edges.length;f<m;++f){for(var P=0,L=this.m_edges[f].length;P<L;++P)this.m_edges[f][P]=null;l.Clear(this.m_edges[f])}l.Clear(this.m_edges),this.m_UseFullRange=!1,this.m_HasOpenPaths=!1},l.ClipperBase.prototype.DisposeLocalMinimaList=function(){for(;this.m_MinimaList!==null;){var f=this.m_MinimaList.Next;this.m_MinimaList=null,this.m_MinimaList=f}this.m_CurrentLM=null},l.ClipperBase.prototype.RangeTest=function(f,m){m.Value?(f.X>l.ClipperBase.hiRange||f.Y>l.ClipperBase.hiRange||-f.X>l.ClipperBase.hiRange||-f.Y>l.ClipperBase.hiRange)&&l.Error("Coordinate outside allowed range in RangeTest()."):(f.X>l.ClipperBase.loRange||f.Y>l.ClipperBase.loRange||-f.X>l.ClipperBase.loRange||-f.Y>l.ClipperBase.loRange)&&(m.Value=!0,this.RangeTest(f,m))},l.ClipperBase.prototype.InitEdge=function(f,m,P,L){f.Next=m,f.Prev=P,f.Curr.X=L.X,f.Curr.Y=L.Y,l.use_xyz&&(f.Curr.Z=L.Z),f.OutIdx=-1},l.ClipperBase.prototype.InitEdge2=function(f,m){f.Curr.Y>=f.Next.Curr.Y?(f.Bot.X=f.Curr.X,f.Bot.Y=f.Curr.Y,l.use_xyz&&(f.Bot.Z=f.Curr.Z),f.Top.X=f.Next.Curr.X,f.Top.Y=f.Next.Curr.Y,l.use_xyz&&(f.Top.Z=f.Next.Curr.Z)):(f.Top.X=f.Curr.X,f.Top.Y=f.Curr.Y,l.use_xyz&&(f.Top.Z=f.Curr.Z),f.Bot.X=f.Next.Curr.X,f.Bot.Y=f.Next.Curr.Y,l.use_xyz&&(f.Bot.Z=f.Next.Curr.Z)),this.SetDx(f),f.PolyTyp=m},l.ClipperBase.prototype.FindNextLocMin=function(f){for(var m;;){for(;l.IntPoint.op_Inequality(f.Bot,f.Prev.Bot)||l.IntPoint.op_Equality(f.Curr,f.Top);)f=f.Next;if(f.Dx!==l.ClipperBase.horizontal&&f.Prev.Dx!==l.ClipperBase.horizontal)break;for(;f.Prev.Dx===l.ClipperBase.horizontal;)f=f.Prev;for(m=f;f.Dx===l.ClipperBase.horizontal;)f=f.Next;if(f.Top.Y!==f.Prev.Bot.Y){m.Prev.Bot.X<f.Bot.X&&(f=m);break}}return f},l.ClipperBase.prototype.ProcessBound=function(f,m){var P,L=f,h;if(L.OutIdx===l.ClipperBase.Skip){if(f=L,m){for(;f.Top.Y===f.Next.Bot.Y;)f=f.Next;for(;f!==L&&f.Dx===l.ClipperBase.horizontal;)f=f.Prev}else{for(;f.Top.Y===f.Prev.Bot.Y;)f=f.Prev;for(;f!==L&&f.Dx===l.ClipperBase.horizontal;)f=f.Next}if(f===L)m?L=f.Next:L=f.Prev;else{m?f=L.Next:f=L.Prev;var d=new l.LocalMinima;d.Next=null,d.Y=f.Bot.Y,d.LeftBound=null,d.RightBound=f,f.WindDelta=0,L=this.ProcessBound(f,m),this.InsertLocalMinima(d)}return L}if(f.Dx===l.ClipperBase.horizontal&&(m?P=f.Prev:P=f.Next,P.Dx===l.ClipperBase.horizontal?P.Bot.X!==f.Bot.X&&P.Top.X!==f.Bot.X&&this.ReverseHorizontal(f):P.Bot.X!==f.Bot.X&&this.ReverseHorizontal(f)),P=f,m){for(;L.Top.Y===L.Next.Bot.Y&&L.Next.OutIdx!==l.ClipperBase.Skip;)L=L.Next;if(L.Dx===l.ClipperBase.horizontal&&L.Next.OutIdx!==l.ClipperBase.Skip){for(h=L;h.Prev.Dx===l.ClipperBase.horizontal;)h=h.Prev;h.Prev.Top.X>L.Next.Top.X&&(L=h.Prev)}for(;f!==L;)f.NextInLML=f.Next,f.Dx===l.ClipperBase.horizontal&&f!==P&&f.Bot.X!==f.Prev.Top.X&&this.ReverseHorizontal(f),f=f.Next;f.Dx===l.ClipperBase.horizontal&&f!==P&&f.Bot.X!==f.Prev.Top.X&&this.ReverseHorizontal(f),L=L.Next}else{for(;L.Top.Y===L.Prev.Bot.Y&&L.Prev.OutIdx!==l.ClipperBase.Skip;)L=L.Prev;if(L.Dx===l.ClipperBase.horizontal&&L.Prev.OutIdx!==l.ClipperBase.Skip){for(h=L;h.Next.Dx===l.ClipperBase.horizontal;)h=h.Next;(h.Next.Top.X===L.Prev.Top.X||h.Next.Top.X>L.Prev.Top.X)&&(L=h.Next)}for(;f!==L;)f.NextInLML=f.Prev,f.Dx===l.ClipperBase.horizontal&&f!==P&&f.Bot.X!==f.Next.Top.X&&this.ReverseHorizontal(f),f=f.Prev;f.Dx===l.ClipperBase.horizontal&&f!==P&&f.Bot.X!==f.Next.Top.X&&this.ReverseHorizontal(f),L=L.Prev}return L},l.ClipperBase.prototype.AddPath=function(f,m,P){l.use_lines?!P&&m===l.PolyType.ptClip&&l.Error("AddPath: Open paths must be subject."):P||l.Error("AddPath: Open paths have been disabled.");var L=f.length-1;if(P)for(;L>0&&l.IntPoint.op_Equality(f[L],f[0]);)--L;for(;L>0&&l.IntPoint.op_Equality(f[L],f[L-1]);)--L;if(P&&L<2||!P&&L<1)return!1;for(var h=new Array,d=0;d<=L;d++)h.push(new l.TEdge);var v=!0;h[1].Curr.X=f[1].X,h[1].Curr.Y=f[1].Y,l.use_xyz&&(h[1].Curr.Z=f[1].Z);var x={Value:this.m_UseFullRange};this.RangeTest(f[0],x),this.m_UseFullRange=x.Value,x.Value=this.m_UseFullRange,this.RangeTest(f[L],x),this.m_UseFullRange=x.Value,this.InitEdge(h[0],h[1],h[L],f[0]),this.InitEdge(h[L],h[0],h[L-1],f[L]);for(var d=L-1;d>=1;--d)x.Value=this.m_UseFullRange,this.RangeTest(f[d],x),this.m_UseFullRange=x.Value,this.InitEdge(h[d],h[d+1],h[d-1],f[d]);for(var F=h[0],Y=F,K=F;;){if(Y.Curr===Y.Next.Curr&&(P||Y.Next!==F)){if(Y===Y.Next)break;Y===F&&(F=Y.Next),Y=this.RemoveEdge(Y),K=Y;continue}if(Y.Prev===Y.Next)break;if(P&&l.ClipperBase.SlopesEqual4(Y.Prev.Curr,Y.Curr,Y.Next.Curr,this.m_UseFullRange)&&(!this.PreserveCollinear||!this.Pt2IsBetweenPt1AndPt3(Y.Prev.Curr,Y.Curr,Y.Next.Curr))){Y===F&&(F=Y.Next),Y=this.RemoveEdge(Y),Y=Y.Prev,K=Y;continue}if(Y=Y.Next,Y===K||!P&&Y.Next===F)break}if(!P&&Y===Y.Next||P&&Y.Prev===Y.Next)return!1;P||(this.m_HasOpenPaths=!0,F.Prev.OutIdx=l.ClipperBase.Skip),Y=F;do this.InitEdge2(Y,m),Y=Y.Next,v&&Y.Curr.Y!==F.Curr.Y&&(v=!1);while(Y!==F);if(v){if(P)return!1;Y.Prev.OutIdx=l.ClipperBase.Skip;var q=new l.LocalMinima;for(q.Next=null,q.Y=Y.Bot.Y,q.LeftBound=null,q.RightBound=Y,q.RightBound.Side=l.EdgeSide.esRight,q.RightBound.WindDelta=0;Y.Bot.X!==Y.Prev.Top.X&&this.ReverseHorizontal(Y),Y.Next.OutIdx!==l.ClipperBase.Skip;)Y.NextInLML=Y.Next,Y=Y.Next;return this.InsertLocalMinima(q),this.m_edges.push(h),!0}this.m_edges.push(h);var j,rA=null;for(l.IntPoint.op_Equality(Y.Prev.Bot,Y.Prev.Top)&&(Y=Y.Next);Y=this.FindNextLocMin(Y),Y!==rA;){rA===null&&(rA=Y);var q=new l.LocalMinima;q.Next=null,q.Y=Y.Bot.Y,Y.Dx<Y.Prev.Dx?(q.LeftBound=Y.Prev,q.RightBound=Y,j=!1):(q.LeftBound=Y,q.RightBound=Y.Prev,j=!0),q.LeftBound.Side=l.EdgeSide.esLeft,q.RightBound.Side=l.EdgeSide.esRight,P?q.LeftBound.Next===q.RightBound?q.LeftBound.WindDelta=-1:q.LeftBound.WindDelta=1:q.LeftBound.WindDelta=0,q.RightBound.WindDelta=-q.LeftBound.WindDelta,Y=this.ProcessBound(q.LeftBound,j),Y.OutIdx===l.ClipperBase.Skip&&(Y=this.ProcessBound(Y,j));var gA=this.ProcessBound(q.RightBound,!j);gA.OutIdx===l.ClipperBase.Skip&&(gA=this.ProcessBound(gA,!j)),q.LeftBound.OutIdx===l.ClipperBase.Skip?q.LeftBound=null:q.RightBound.OutIdx===l.ClipperBase.Skip&&(q.RightBound=null),this.InsertLocalMinima(q),j||(Y=gA)}return!0},l.ClipperBase.prototype.AddPaths=function(f,m,P){for(var L=!1,h=0,d=f.length;h<d;++h)this.AddPath(f[h],m,P)&&(L=!0);return L},l.ClipperBase.prototype.Pt2IsBetweenPt1AndPt3=function(f,m,P){return l.IntPoint.op_Equality(f,P)||l.IntPoint.op_Equality(f,m)||l.IntPoint.op_Equality(P,m)?!1:f.X!==P.X?m.X>f.X==m.X<P.X:m.Y>f.Y==m.Y<P.Y},l.ClipperBase.prototype.RemoveEdge=function(f){f.Prev.Next=f.Next,f.Next.Prev=f.Prev;var m=f.Next;return f.Prev=null,m},l.ClipperBase.prototype.SetDx=function(f){f.Delta.X=f.Top.X-f.Bot.X,f.Delta.Y=f.Top.Y-f.Bot.Y,f.Delta.Y===0?f.Dx=l.ClipperBase.horizontal:f.Dx=f.Delta.X/f.Delta.Y},l.ClipperBase.prototype.InsertLocalMinima=function(f){if(this.m_MinimaList===null)this.m_MinimaList=f;else if(f.Y>=this.m_MinimaList.Y)f.Next=this.m_MinimaList,this.m_MinimaList=f;else{for(var m=this.m_MinimaList;m.Next!==null&&f.Y<m.Next.Y;)m=m.Next;f.Next=m.Next,m.Next=f}},l.ClipperBase.prototype.PopLocalMinima=function(f,m){return m.v=this.m_CurrentLM,this.m_CurrentLM!==null&&this.m_CurrentLM.Y===f?(this.m_CurrentLM=this.m_CurrentLM.Next,!0):!1},l.ClipperBase.prototype.ReverseHorizontal=function(f){var m=f.Top.X;f.Top.X=f.Bot.X,f.Bot.X=m,l.use_xyz&&(m=f.Top.Z,f.Top.Z=f.Bot.Z,f.Bot.Z=m)},l.ClipperBase.prototype.Reset=function(){if(this.m_CurrentLM=this.m_MinimaList,this.m_CurrentLM!==null){this.m_Scanbeam=null;for(var f=this.m_MinimaList;f!==null;){this.InsertScanbeam(f.Y);var m=f.LeftBound;m!==null&&(m.Curr.X=m.Bot.X,m.Curr.Y=m.Bot.Y,l.use_xyz&&(m.Curr.Z=m.Bot.Z),m.OutIdx=l.ClipperBase.Unassigned),m=f.RightBound,m!==null&&(m.Curr.X=m.Bot.X,m.Curr.Y=m.Bot.Y,l.use_xyz&&(m.Curr.Z=m.Bot.Z),m.OutIdx=l.ClipperBase.Unassigned),f=f.Next}this.m_ActiveEdges=null}},l.ClipperBase.prototype.InsertScanbeam=function(f){if(this.m_Scanbeam===null)this.m_Scanbeam=new l.Scanbeam,this.m_Scanbeam.Next=null,this.m_Scanbeam.Y=f;else if(f>this.m_Scanbeam.Y){var m=new l.Scanbeam;m.Y=f,m.Next=this.m_Scanbeam,this.m_Scanbeam=m}else{for(var P=this.m_Scanbeam;P.Next!==null&&f<=P.Next.Y;)P=P.Next;if(f===P.Y)return;var L=new l.Scanbeam;L.Y=f,L.Next=P.Next,P.Next=L}},l.ClipperBase.prototype.PopScanbeam=function(f){return this.m_Scanbeam===null?(f.v=0,!1):(f.v=this.m_Scanbeam.Y,this.m_Scanbeam=this.m_Scanbeam.Next,!0)},l.ClipperBase.prototype.LocalMinimaPending=function(){return this.m_CurrentLM!==null},l.ClipperBase.prototype.CreateOutRec=function(){var f=new l.OutRec;return f.Idx=l.ClipperBase.Unassigned,f.IsHole=!1,f.IsOpen=!1,f.FirstLeft=null,f.Pts=null,f.BottomPt=null,f.PolyNode=null,this.m_PolyOuts.push(f),f.Idx=this.m_PolyOuts.length-1,f},l.ClipperBase.prototype.DisposeOutRec=function(f){var m=this.m_PolyOuts[f];m.Pts=null,m=null,this.m_PolyOuts[f]=null},l.ClipperBase.prototype.UpdateEdgeIntoAEL=function(f){f.NextInLML===null&&l.Error("UpdateEdgeIntoAEL: invalid call");var m=f.PrevInAEL,P=f.NextInAEL;return f.NextInLML.OutIdx=f.OutIdx,m!==null?m.NextInAEL=f.NextInLML:this.m_ActiveEdges=f.NextInLML,P!==null&&(P.PrevInAEL=f.NextInLML),f.NextInLML.Side=f.Side,f.NextInLML.WindDelta=f.WindDelta,f.NextInLML.WindCnt=f.WindCnt,f.NextInLML.WindCnt2=f.WindCnt2,f=f.NextInLML,f.Curr.X=f.Bot.X,f.Curr.Y=f.Bot.Y,f.PrevInAEL=m,f.NextInAEL=P,l.ClipperBase.IsHorizontal(f)||this.InsertScanbeam(f.Top.Y),f},l.ClipperBase.prototype.SwapPositionsInAEL=function(f,m){if(!(f.NextInAEL===f.PrevInAEL||m.NextInAEL===m.PrevInAEL)){if(f.NextInAEL===m){var P=m.NextInAEL;P!==null&&(P.PrevInAEL=f);var L=f.PrevInAEL;L!==null&&(L.NextInAEL=m),m.PrevInAEL=L,m.NextInAEL=f,f.PrevInAEL=m,f.NextInAEL=P}else if(m.NextInAEL===f){var h=f.NextInAEL;h!==null&&(h.PrevInAEL=m);var d=m.PrevInAEL;d!==null&&(d.NextInAEL=f),f.PrevInAEL=d,f.NextInAEL=m,m.PrevInAEL=f,m.NextInAEL=h}else{var v=f.NextInAEL,x=f.PrevInAEL;f.NextInAEL=m.NextInAEL,f.NextInAEL!==null&&(f.NextInAEL.PrevInAEL=f),f.PrevInAEL=m.PrevInAEL,f.PrevInAEL!==null&&(f.PrevInAEL.NextInAEL=f),m.NextInAEL=v,m.NextInAEL!==null&&(m.NextInAEL.PrevInAEL=m),m.PrevInAEL=x,m.PrevInAEL!==null&&(m.PrevInAEL.NextInAEL=m)}f.PrevInAEL===null?this.m_ActiveEdges=f:m.PrevInAEL===null&&(this.m_ActiveEdges=m)}},l.ClipperBase.prototype.DeleteFromAEL=function(f){var m=f.PrevInAEL,P=f.NextInAEL;m===null&&P===null&&f!==this.m_ActiveEdges||(m!==null?m.NextInAEL=P:this.m_ActiveEdges=P,P!==null&&(P.PrevInAEL=m),f.NextInAEL=null,f.PrevInAEL=null)},l.Clipper=function(f){typeof f>"u"&&(f=0),this.m_PolyOuts=null,this.m_ClipType=l.ClipType.ctIntersection,this.m_Scanbeam=null,this.m_Maxima=null,this.m_ActiveEdges=null,this.m_SortedEdges=null,this.m_IntersectList=null,this.m_IntersectNodeComparer=null,this.m_ExecuteLocked=!1,this.m_ClipFillType=l.PolyFillType.pftEvenOdd,this.m_SubjFillType=l.PolyFillType.pftEvenOdd,this.m_Joins=null,this.m_GhostJoins=null,this.m_UsingPolyTree=!1,this.ReverseSolution=!1,this.StrictlySimple=!1,l.ClipperBase.call(this),this.m_Scanbeam=null,this.m_Maxima=null,this.m_ActiveEdges=null,this.m_SortedEdges=null,this.m_IntersectList=new Array,this.m_IntersectNodeComparer=l.MyIntersectNodeSort.Compare,this.m_ExecuteLocked=!1,this.m_UsingPolyTree=!1,this.m_PolyOuts=new Array,this.m_Joins=new Array,this.m_GhostJoins=new Array,this.ReverseSolution=(1&f)!==0,this.StrictlySimple=(2&f)!==0,this.PreserveCollinear=(4&f)!==0,l.use_xyz&&(this.ZFillFunction=null)},l.Clipper.ioReverseSolution=1,l.Clipper.ioStrictlySimple=2,l.Clipper.ioPreserveCollinear=4,l.Clipper.prototype.Clear=function(){this.m_edges.length!==0&&(this.DisposeAllPolyPts(),l.ClipperBase.prototype.Clear.call(this))},l.Clipper.prototype.InsertMaxima=function(f){var m=new l.Maxima;if(m.X=f,this.m_Maxima===null)this.m_Maxima=m,this.m_Maxima.Next=null,this.m_Maxima.Prev=null;else if(f<this.m_Maxima.X)m.Next=this.m_Maxima,m.Prev=null,this.m_Maxima=m;else{for(var P=this.m_Maxima;P.Next!==null&&f>=P.Next.X;)P=P.Next;if(f===P.X)return;m.Next=P.Next,m.Prev=P,P.Next!==null&&(P.Next.Prev=m),P.Next=m}},l.Clipper.prototype.Execute=function(){var f=arguments,m=f.length,P=f[1]instanceof l.PolyTree;if(m===4&&!P){var L=f[0],h=f[1],d=f[2],v=f[3];if(this.m_ExecuteLocked)return!1;this.m_HasOpenPaths&&l.Error("Error: PolyTree struct is needed for open path clipping."),this.m_ExecuteLocked=!0,l.Clear(h),this.m_SubjFillType=d,this.m_ClipFillType=v,this.m_ClipType=L,this.m_UsingPolyTree=!1;try{var x=this.ExecuteInternal();x&&this.BuildResult(h)}finally{this.DisposeAllPolyPts(),this.m_ExecuteLocked=!1}return x}else if(m===4&&P){var L=f[0],F=f[1],d=f[2],v=f[3];if(this.m_ExecuteLocked)return!1;this.m_ExecuteLocked=!0,this.m_SubjFillType=d,this.m_ClipFillType=v,this.m_ClipType=L,this.m_UsingPolyTree=!0;try{var x=this.ExecuteInternal();x&&this.BuildResult2(F)}finally{this.DisposeAllPolyPts(),this.m_ExecuteLocked=!1}return x}else if(m===2&&!P){var L=f[0],h=f[1];return this.Execute(L,h,l.PolyFillType.pftEvenOdd,l.PolyFillType.pftEvenOdd)}else if(m===2&&P){var L=f[0],F=f[1];return this.Execute(L,F,l.PolyFillType.pftEvenOdd,l.PolyFillType.pftEvenOdd)}},l.Clipper.prototype.FixHoleLinkage=function(f){if(!(f.FirstLeft===null||f.IsHole!==f.FirstLeft.IsHole&&f.FirstLeft.Pts!==null)){for(var m=f.FirstLeft;m!==null&&(m.IsHole===f.IsHole||m.Pts===null);)m=m.FirstLeft;f.FirstLeft=m}},l.Clipper.prototype.ExecuteInternal=function(){try{this.Reset(),this.m_SortedEdges=null,this.m_Maxima=null;var f={},m={};if(!this.PopScanbeam(f))return!1;for(this.InsertLocalMinimaIntoAEL(f.v);this.PopScanbeam(m)||this.LocalMinimaPending();){if(this.ProcessHorizontals(),this.m_GhostJoins.length=0,!this.ProcessIntersections(m.v))return!1;this.ProcessEdgesAtTopOfScanbeam(m.v),f.v=m.v,this.InsertLocalMinimaIntoAEL(f.v)}var P,L,h;for(L=0,h=this.m_PolyOuts.length;L<h;L++)P=this.m_PolyOuts[L],!(P.Pts===null||P.IsOpen)&&(P.IsHole^this.ReverseSolution)==this.Area$1(P)>0&&this.ReversePolyPtLinks(P.Pts);for(this.JoinCommonEdges(),L=0,h=this.m_PolyOuts.length;L<h;L++)P=this.m_PolyOuts[L],P.Pts!==null&&(P.IsOpen?this.FixupOutPolyline(P):this.FixupOutPolygon(P));return this.StrictlySimple&&this.DoSimplePolygons(),!0}finally{this.m_Joins.length=0,this.m_GhostJoins.length=0}},l.Clipper.prototype.DisposeAllPolyPts=function(){for(var f=0,m=this.m_PolyOuts.length;f<m;++f)this.DisposeOutRec(f);l.Clear(this.m_PolyOuts)},l.Clipper.prototype.AddJoin=function(f,m,P){var L=new l.Join;L.OutPt1=f,L.OutPt2=m,L.OffPt.X=P.X,L.OffPt.Y=P.Y,l.use_xyz&&(L.OffPt.Z=P.Z),this.m_Joins.push(L)},l.Clipper.prototype.AddGhostJoin=function(f,m){var P=new l.Join;P.OutPt1=f,P.OffPt.X=m.X,P.OffPt.Y=m.Y,l.use_xyz&&(P.OffPt.Z=m.Z),this.m_GhostJoins.push(P)},l.Clipper.prototype.SetZ=function(f,m,P){if(this.ZFillFunction!==null){if(f.Z!==0||this.ZFillFunction===null)return;l.IntPoint.op_Equality(f,m.Bot)?f.Z=m.Bot.Z:l.IntPoint.op_Equality(f,m.Top)?f.Z=m.Top.Z:l.IntPoint.op_Equality(f,P.Bot)?f.Z=P.Bot.Z:l.IntPoint.op_Equality(f,P.Top)?f.Z=P.Top.Z:this.ZFillFunction(m.Bot,m.Top,P.Bot,P.Top,f)}},l.Clipper.prototype.InsertLocalMinimaIntoAEL=function(f){for(var m={},P,L;this.PopLocalMinima(f,m);){P=m.v.LeftBound,L=m.v.RightBound;var h=null;if(P===null?(this.InsertEdgeIntoAEL(L,null),this.SetWindingCount(L),this.IsContributing(L)&&(h=this.AddOutPt(L,L.Bot))):L===null?(this.InsertEdgeIntoAEL(P,null),this.SetWindingCount(P),this.IsContributing(P)&&(h=this.AddOutPt(P,P.Bot)),this.InsertScanbeam(P.Top.Y)):(this.InsertEdgeIntoAEL(P,null),this.InsertEdgeIntoAEL(L,P),this.SetWindingCount(P),L.WindCnt=P.WindCnt,L.WindCnt2=P.WindCnt2,this.IsContributing(P)&&(h=this.AddLocalMinPoly(P,L,P.Bot)),this.InsertScanbeam(P.Top.Y)),L!==null&&(l.ClipperBase.IsHorizontal(L)?(L.NextInLML!==null&&this.InsertScanbeam(L.NextInLML.Top.Y),this.AddEdgeToSEL(L)):this.InsertScanbeam(L.Top.Y)),!(P===null||L===null)){if(h!==null&&l.ClipperBase.IsHorizontal(L)&&this.m_GhostJoins.length>0&&L.WindDelta!==0)for(var d=0,v=this.m_GhostJoins.length;d<v;d++){var x=this.m_GhostJoins[d];this.HorzSegmentsOverlap(x.OutPt1.Pt.X,x.OffPt.X,L.Bot.X,L.Top.X)&&this.AddJoin(x.OutPt1,h,x.OffPt)}if(P.OutIdx>=0&&P.PrevInAEL!==null&&P.PrevInAEL.Curr.X===P.Bot.X&&P.PrevInAEL.OutIdx>=0&&l.ClipperBase.SlopesEqual5(P.PrevInAEL.Curr,P.PrevInAEL.Top,P.Curr,P.Top,this.m_UseFullRange)&&P.WindDelta!==0&&P.PrevInAEL.WindDelta!==0){var F=this.AddOutPt(P.PrevInAEL,P.Bot);this.AddJoin(h,F,P.Top)}if(P.NextInAEL!==L){if(L.OutIdx>=0&&L.PrevInAEL.OutIdx>=0&&l.ClipperBase.SlopesEqual5(L.PrevInAEL.Curr,L.PrevInAEL.Top,L.Curr,L.Top,this.m_UseFullRange)&&L.WindDelta!==0&&L.PrevInAEL.WindDelta!==0){var F=this.AddOutPt(L.PrevInAEL,L.Bot);this.AddJoin(h,F,L.Top)}var Y=P.NextInAEL;if(Y!==null)for(;Y!==L;)this.IntersectEdges(L,Y,P.Curr),Y=Y.NextInAEL}}}},l.Clipper.prototype.InsertEdgeIntoAEL=function(f,m){if(this.m_ActiveEdges===null)f.PrevInAEL=null,f.NextInAEL=null,this.m_ActiveEdges=f;else if(m===null&&this.E2InsertsBeforeE1(this.m_ActiveEdges,f))f.PrevInAEL=null,f.NextInAEL=this.m_ActiveEdges,this.m_ActiveEdges.PrevInAEL=f,this.m_ActiveEdges=f;else{for(m===null&&(m=this.m_ActiveEdges);m.NextInAEL!==null&&!this.E2InsertsBeforeE1(m.NextInAEL,f);)m=m.NextInAEL;f.NextInAEL=m.NextInAEL,m.NextInAEL!==null&&(m.NextInAEL.PrevInAEL=f),f.PrevInAEL=m,m.NextInAEL=f}},l.Clipper.prototype.E2InsertsBeforeE1=function(f,m){return m.Curr.X===f.Curr.X?m.Top.Y>f.Top.Y?m.Top.X<l.Clipper.TopX(f,m.Top.Y):f.Top.X>l.Clipper.TopX(m,f.Top.Y):m.Curr.X<f.Curr.X},l.Clipper.prototype.IsEvenOddFillType=function(f){return f.PolyTyp===l.PolyType.ptSubject?this.m_SubjFillType===l.PolyFillType.pftEvenOdd:this.m_ClipFillType===l.PolyFillType.pftEvenOdd},l.Clipper.prototype.IsEvenOddAltFillType=function(f){return f.PolyTyp===l.PolyType.ptSubject?this.m_ClipFillType===l.PolyFillType.pftEvenOdd:this.m_SubjFillType===l.PolyFillType.pftEvenOdd},l.Clipper.prototype.IsContributing=function(f){var m,P;switch(f.PolyTyp===l.PolyType.ptSubject?(m=this.m_SubjFillType,P=this.m_ClipFillType):(m=this.m_ClipFillType,P=this.m_SubjFillType),m){case l.PolyFillType.pftEvenOdd:if(f.WindDelta===0&&f.WindCnt!==1)return!1;break;case l.PolyFillType.pftNonZero:if(Math.abs(f.WindCnt)!==1)return!1;break;case l.PolyFillType.pftPositive:if(f.WindCnt!==1)return!1;break;default:if(f.WindCnt!==-1)return!1;break}switch(this.m_ClipType){case l.ClipType.ctIntersection:switch(P){case l.PolyFillType.pftEvenOdd:case l.PolyFillType.pftNonZero:return f.WindCnt2!==0;case l.PolyFillType.pftPositive:return f.WindCnt2>0;default:return f.WindCnt2<0}case l.ClipType.ctUnion:switch(P){case l.PolyFillType.pftEvenOdd:case l.PolyFillType.pftNonZero:return f.WindCnt2===0;case l.PolyFillType.pftPositive:return f.WindCnt2<=0;default:return f.WindCnt2>=0}case l.ClipType.ctDifference:if(f.PolyTyp===l.PolyType.ptSubject)switch(P){case l.PolyFillType.pftEvenOdd:case l.PolyFillType.pftNonZero:return f.WindCnt2===0;case l.PolyFillType.pftPositive:return f.WindCnt2<=0;default:return f.WindCnt2>=0}else switch(P){case l.PolyFillType.pftEvenOdd:case l.PolyFillType.pftNonZero:return f.WindCnt2!==0;case l.PolyFillType.pftPositive:return f.WindCnt2>0;default:return f.WindCnt2<0}case l.ClipType.ctXor:if(f.WindDelta===0)switch(P){case l.PolyFillType.pftEvenOdd:case l.PolyFillType.pftNonZero:return f.WindCnt2===0;case l.PolyFillType.pftPositive:return f.WindCnt2<=0;default:return f.WindCnt2>=0}else return!0}return!0},l.Clipper.prototype.SetWindingCount=function(f){for(var m=f.PrevInAEL;m!==null&&(m.PolyTyp!==f.PolyTyp||m.WindDelta===0);)m=m.PrevInAEL;if(m===null){var P=f.PolyTyp===l.PolyType.ptSubject?this.m_SubjFillType:this.m_ClipFillType;f.WindDelta===0?f.WindCnt=P===l.PolyFillType.pftNegative?-1:1:f.WindCnt=f.WindDelta,f.WindCnt2=0,m=this.m_ActiveEdges}else if(f.WindDelta===0&&this.m_ClipType!==l.ClipType.ctUnion)f.WindCnt=1,f.WindCnt2=m.WindCnt2,m=m.NextInAEL;else if(this.IsEvenOddFillType(f)){if(f.WindDelta===0){for(var L=!0,h=m.PrevInAEL;h!==null;)h.PolyTyp===m.PolyTyp&&h.WindDelta!==0&&(L=!L),h=h.PrevInAEL;f.WindCnt=L?0:1}else f.WindCnt=f.WindDelta;f.WindCnt2=m.WindCnt2,m=m.NextInAEL}else m.WindCnt*m.WindDelta<0?Math.abs(m.WindCnt)>1?m.WindDelta*f.WindDelta<0?f.WindCnt=m.WindCnt:f.WindCnt=m.WindCnt+f.WindDelta:f.WindCnt=f.WindDelta===0?1:f.WindDelta:f.WindDelta===0?f.WindCnt=m.WindCnt<0?m.WindCnt-1:m.WindCnt+1:m.WindDelta*f.WindDelta<0?f.WindCnt=m.WindCnt:f.WindCnt=m.WindCnt+f.WindDelta,f.WindCnt2=m.WindCnt2,m=m.NextInAEL;if(this.IsEvenOddAltFillType(f))for(;m!==f;)m.WindDelta!==0&&(f.WindCnt2=f.WindCnt2===0?1:0),m=m.NextInAEL;else for(;m!==f;)f.WindCnt2+=m.WindDelta,m=m.NextInAEL},l.Clipper.prototype.AddEdgeToSEL=function(f){this.m_SortedEdges===null?(this.m_SortedEdges=f,f.PrevInSEL=null,f.NextInSEL=null):(f.NextInSEL=this.m_SortedEdges,f.PrevInSEL=null,this.m_SortedEdges.PrevInSEL=f,this.m_SortedEdges=f)},l.Clipper.prototype.PopEdgeFromSEL=function(f){if(f.v=this.m_SortedEdges,f.v===null)return!1;var m=f.v;return this.m_SortedEdges=f.v.NextInSEL,this.m_SortedEdges!==null&&(this.m_SortedEdges.PrevInSEL=null),m.NextInSEL=null,m.PrevInSEL=null,!0},l.Clipper.prototype.CopyAELToSEL=function(){var f=this.m_ActiveEdges;for(this.m_SortedEdges=f;f!==null;)f.PrevInSEL=f.PrevInAEL,f.NextInSEL=f.NextInAEL,f=f.NextInAEL},l.Clipper.prototype.SwapPositionsInSEL=function(f,m){if(!(f.NextInSEL===null&&f.PrevInSEL===null)&&!(m.NextInSEL===null&&m.PrevInSEL===null)){if(f.NextInSEL===m){var P=m.NextInSEL;P!==null&&(P.PrevInSEL=f);var L=f.PrevInSEL;L!==null&&(L.NextInSEL=m),m.PrevInSEL=L,m.NextInSEL=f,f.PrevInSEL=m,f.NextInSEL=P}else if(m.NextInSEL===f){var P=f.NextInSEL;P!==null&&(P.PrevInSEL=m);var L=m.PrevInSEL;L!==null&&(L.NextInSEL=f),f.PrevInSEL=L,f.NextInSEL=m,m.PrevInSEL=f,m.NextInSEL=P}else{var P=f.NextInSEL,L=f.PrevInSEL;f.NextInSEL=m.NextInSEL,f.NextInSEL!==null&&(f.NextInSEL.PrevInSEL=f),f.PrevInSEL=m.PrevInSEL,f.PrevInSEL!==null&&(f.PrevInSEL.NextInSEL=f),m.NextInSEL=P,m.NextInSEL!==null&&(m.NextInSEL.PrevInSEL=m),m.PrevInSEL=L,m.PrevInSEL!==null&&(m.PrevInSEL.NextInSEL=m)}f.PrevInSEL===null?this.m_SortedEdges=f:m.PrevInSEL===null&&(this.m_SortedEdges=m)}},l.Clipper.prototype.AddLocalMaxPoly=function(f,m,P){this.AddOutPt(f,P),m.WindDelta===0&&this.AddOutPt(m,P),f.OutIdx===m.OutIdx?(f.OutIdx=-1,m.OutIdx=-1):f.OutIdx<m.OutIdx?this.AppendPolygon(f,m):this.AppendPolygon(m,f)},l.Clipper.prototype.AddLocalMinPoly=function(f,m,P){var L,h,d;if(l.ClipperBase.IsHorizontal(m)||f.Dx>m.Dx?(L=this.AddOutPt(f,P),m.OutIdx=f.OutIdx,f.Side=l.EdgeSide.esLeft,m.Side=l.EdgeSide.esRight,h=f,h.PrevInAEL===m?d=m.PrevInAEL:d=h.PrevInAEL):(L=this.AddOutPt(m,P),f.OutIdx=m.OutIdx,f.Side=l.EdgeSide.esRight,m.Side=l.EdgeSide.esLeft,h=m,h.PrevInAEL===f?d=f.PrevInAEL:d=h.PrevInAEL),d!==null&&d.OutIdx>=0&&d.Top.Y<P.Y&&h.Top.Y<P.Y){var v=l.Clipper.TopX(d,P.Y),x=l.Clipper.TopX(h,P.Y);if(v===x&&h.WindDelta!==0&&d.WindDelta!==0&&l.ClipperBase.SlopesEqual5(new l.IntPoint2(v,P.Y),d.Top,new l.IntPoint2(x,P.Y),h.Top,this.m_UseFullRange)){var F=this.AddOutPt(d,P);this.AddJoin(L,F,h.Top)}}return L},l.Clipper.prototype.AddOutPt=function(f,m){if(f.OutIdx<0){var P=this.CreateOutRec();P.IsOpen=f.WindDelta===0;var L=new l.OutPt;return P.Pts=L,L.Idx=P.Idx,L.Pt.X=m.X,L.Pt.Y=m.Y,l.use_xyz&&(L.Pt.Z=m.Z),L.Next=L,L.Prev=L,P.IsOpen||this.SetHoleState(f,P),f.OutIdx=P.Idx,L}else{var P=this.m_PolyOuts[f.OutIdx],h=P.Pts,d=f.Side===l.EdgeSide.esLeft;if(d&&l.IntPoint.op_Equality(m,h.Pt))return h;if(!d&&l.IntPoint.op_Equality(m,h.Prev.Pt))return h.Prev;var L=new l.OutPt;return L.Idx=P.Idx,L.Pt.X=m.X,L.Pt.Y=m.Y,l.use_xyz&&(L.Pt.Z=m.Z),L.Next=h,L.Prev=h.Prev,L.Prev.Next=L,h.Prev=L,d&&(P.Pts=L),L}},l.Clipper.prototype.GetLastOutPt=function(f){var m=this.m_PolyOuts[f.OutIdx];return f.Side===l.EdgeSide.esLeft?m.Pts:m.Pts.Prev},l.Clipper.prototype.SwapPoints=function(f,m){var P=new l.IntPoint1(f.Value);f.Value.X=m.Value.X,f.Value.Y=m.Value.Y,l.use_xyz&&(f.Value.Z=m.Value.Z),m.Value.X=P.X,m.Value.Y=P.Y,l.use_xyz&&(m.Value.Z=P.Z)},l.Clipper.prototype.HorzSegmentsOverlap=function(f,m,P,L){var h;return f>m&&(h=f,f=m,m=h),P>L&&(h=P,P=L,L=h),f<L&&P<m},l.Clipper.prototype.SetHoleState=function(f,m){for(var P=f.PrevInAEL,L=null;P!==null;)P.OutIdx>=0&&P.WindDelta!==0&&(L===null?L=P:L.OutIdx===P.OutIdx&&(L=null)),P=P.PrevInAEL;L===null?(m.FirstLeft=null,m.IsHole=!1):(m.FirstLeft=this.m_PolyOuts[L.OutIdx],m.IsHole=!m.FirstLeft.IsHole)},l.Clipper.prototype.GetDx=function(f,m){return f.Y===m.Y?l.ClipperBase.horizontal:(m.X-f.X)/(m.Y-f.Y)},l.Clipper.prototype.FirstIsBottomPt=function(f,m){for(var P=f.Prev;l.IntPoint.op_Equality(P.Pt,f.Pt)&&P!==f;)P=P.Prev;var L=Math.abs(this.GetDx(f.Pt,P.Pt));for(P=f.Next;l.IntPoint.op_Equality(P.Pt,f.Pt)&&P!==f;)P=P.Next;var h=Math.abs(this.GetDx(f.Pt,P.Pt));for(P=m.Prev;l.IntPoint.op_Equality(P.Pt,m.Pt)&&P!==m;)P=P.Prev;var d=Math.abs(this.GetDx(m.Pt,P.Pt));for(P=m.Next;l.IntPoint.op_Equality(P.Pt,m.Pt)&&P!==m;)P=P.Next;var v=Math.abs(this.GetDx(m.Pt,P.Pt));return Math.max(L,h)===Math.max(d,v)&&Math.min(L,h)===Math.min(d,v)?this.Area(f)>0:L>=d&&L>=v||h>=d&&h>=v},l.Clipper.prototype.GetBottomPt=function(f){for(var m=null,P=f.Next;P!==f;)P.Pt.Y>f.Pt.Y?(f=P,m=null):P.Pt.Y===f.Pt.Y&&P.Pt.X<=f.Pt.X&&(P.Pt.X<f.Pt.X?(m=null,f=P):P.Next!==f&&P.Prev!==f&&(m=P)),P=P.Next;if(m!==null)for(;m!==P;)for(this.FirstIsBottomPt(P,m)||(f=m),m=m.Next;l.IntPoint.op_Inequality(m.Pt,f.Pt);)m=m.Next;return f},l.Clipper.prototype.GetLowermostRec=function(f,m){f.BottomPt===null&&(f.BottomPt=this.GetBottomPt(f.Pts)),m.BottomPt===null&&(m.BottomPt=this.GetBottomPt(m.Pts));var P=f.BottomPt,L=m.BottomPt;return P.Pt.Y>L.Pt.Y?f:P.Pt.Y<L.Pt.Y?m:P.Pt.X<L.Pt.X?f:P.Pt.X>L.Pt.X||P.Next===P?m:L.Next===L||this.FirstIsBottomPt(P,L)?f:m},l.Clipper.prototype.OutRec1RightOfOutRec2=function(f,m){do if(f=f.FirstLeft,f===m)return!0;while(f!==null);return!1},l.Clipper.prototype.GetOutRec=function(f){for(var m=this.m_PolyOuts[f];m!==this.m_PolyOuts[m.Idx];)m=this.m_PolyOuts[m.Idx];return m},l.Clipper.prototype.AppendPolygon=function(f,m){var P=this.m_PolyOuts[f.OutIdx],L=this.m_PolyOuts[m.OutIdx],h;this.OutRec1RightOfOutRec2(P,L)?h=L:this.OutRec1RightOfOutRec2(L,P)?h=P:h=this.GetLowermostRec(P,L);var d=P.Pts,v=d.Prev,x=L.Pts,F=x.Prev;f.Side===l.EdgeSide.esLeft?m.Side===l.EdgeSide.esLeft?(this.ReversePolyPtLinks(x),x.Next=d,d.Prev=x,v.Next=F,F.Prev=v,P.Pts=F):(F.Next=d,d.Prev=F,x.Prev=v,v.Next=x,P.Pts=x):m.Side===l.EdgeSide.esRight?(this.ReversePolyPtLinks(x),v.Next=F,F.Prev=v,x.Next=d,d.Prev=x):(v.Next=x,x.Prev=v,d.Prev=F,F.Next=d),P.BottomPt=null,h===L&&(L.FirstLeft!==P&&(P.FirstLeft=L.FirstLeft),P.IsHole=L.IsHole),L.Pts=null,L.BottomPt=null,L.FirstLeft=P;var Y=f.OutIdx,K=m.OutIdx;f.OutIdx=-1,m.OutIdx=-1;for(var q=this.m_ActiveEdges;q!==null;){if(q.OutIdx===K){q.OutIdx=Y,q.Side=f.Side;break}q=q.NextInAEL}L.Idx=P.Idx},l.Clipper.prototype.ReversePolyPtLinks=function(f){if(f!==null){var m,P;m=f;do P=m.Next,m.Next=m.Prev,m.Prev=P,m=P;while(m!==f)}},l.Clipper.SwapSides=function(f,m){var P=f.Side;f.Side=m.Side,m.Side=P},l.Clipper.SwapPolyIndexes=function(f,m){var P=f.OutIdx;f.OutIdx=m.OutIdx,m.OutIdx=P},l.Clipper.prototype.IntersectEdges=function(f,m,P){var L=f.OutIdx>=0,h=m.OutIdx>=0;if(l.use_xyz&&this.SetZ(P,f,m),l.use_lines&&(f.WindDelta===0||m.WindDelta===0)){if(f.WindDelta===0&&m.WindDelta===0)return;f.PolyTyp===m.PolyTyp&&f.WindDelta!==m.WindDelta&&this.m_ClipType===l.ClipType.ctUnion?f.WindDelta===0?h&&(this.AddOutPt(f,P),L&&(f.OutIdx=-1)):L&&(this.AddOutPt(m,P),h&&(m.OutIdx=-1)):f.PolyTyp!==m.PolyTyp&&(f.WindDelta===0&&Math.abs(m.WindCnt)===1&&(this.m_ClipType!==l.ClipType.ctUnion||m.WindCnt2===0)?(this.AddOutPt(f,P),L&&(f.OutIdx=-1)):m.WindDelta===0&&Math.abs(f.WindCnt)===1&&(this.m_ClipType!==l.ClipType.ctUnion||f.WindCnt2===0)&&(this.AddOutPt(m,P),h&&(m.OutIdx=-1)));return}if(f.PolyTyp===m.PolyTyp)if(this.IsEvenOddFillType(f)){var d=f.WindCnt;f.WindCnt=m.WindCnt,m.WindCnt=d}else f.WindCnt+m.WindDelta===0?f.WindCnt=-f.WindCnt:f.WindCnt+=m.WindDelta,m.WindCnt-f.WindDelta===0?m.WindCnt=-m.WindCnt:m.WindCnt-=f.WindDelta;else this.IsEvenOddFillType(m)?f.WindCnt2=f.WindCnt2===0?1:0:f.WindCnt2+=m.WindDelta,this.IsEvenOddFillType(f)?m.WindCnt2=m.WindCnt2===0?1:0:m.WindCnt2-=f.WindDelta;var v,x,F,Y;f.PolyTyp===l.PolyType.ptSubject?(v=this.m_SubjFillType,F=this.m_ClipFillType):(v=this.m_ClipFillType,F=this.m_SubjFillType),m.PolyTyp===l.PolyType.ptSubject?(x=this.m_SubjFillType,Y=this.m_ClipFillType):(x=this.m_ClipFillType,Y=this.m_SubjFillType);var K,q;switch(v){case l.PolyFillType.pftPositive:K=f.WindCnt;break;case l.PolyFillType.pftNegative:K=-f.WindCnt;break;default:K=Math.abs(f.WindCnt);break}switch(x){case l.PolyFillType.pftPositive:q=m.WindCnt;break;case l.PolyFillType.pftNegative:q=-m.WindCnt;break;default:q=Math.abs(m.WindCnt);break}if(L&&h)K!==0&&K!==1||q!==0&&q!==1||f.PolyTyp!==m.PolyTyp&&this.m_ClipType!==l.ClipType.ctXor?this.AddLocalMaxPoly(f,m,P):(this.AddOutPt(f,P),this.AddOutPt(m,P),l.Clipper.SwapSides(f,m),l.Clipper.SwapPolyIndexes(f,m));else if(L)(q===0||q===1)&&(this.AddOutPt(f,P),l.Clipper.SwapSides(f,m),l.Clipper.SwapPolyIndexes(f,m));else if(h)(K===0||K===1)&&(this.AddOutPt(m,P),l.Clipper.SwapSides(f,m),l.Clipper.SwapPolyIndexes(f,m));else if((K===0||K===1)&&(q===0||q===1)){var j,rA;switch(F){case l.PolyFillType.pftPositive:j=f.WindCnt2;break;case l.PolyFillType.pftNegative:j=-f.WindCnt2;break;default:j=Math.abs(f.WindCnt2);break}switch(Y){case l.PolyFillType.pftPositive:rA=m.WindCnt2;break;case l.PolyFillType.pftNegative:rA=-m.WindCnt2;break;default:rA=Math.abs(m.WindCnt2);break}if(f.PolyTyp!==m.PolyTyp)this.AddLocalMinPoly(f,m,P);else if(K===1&&q===1)switch(this.m_ClipType){case l.ClipType.ctIntersection:j>0&&rA>0&&this.AddLocalMinPoly(f,m,P);break;case l.ClipType.ctUnion:j<=0&&rA<=0&&this.AddLocalMinPoly(f,m,P);break;case l.ClipType.ctDifference:(f.PolyTyp===l.PolyType.ptClip&&j>0&&rA>0||f.PolyTyp===l.PolyType.ptSubject&&j<=0&&rA<=0)&&this.AddLocalMinPoly(f,m,P);break;case l.ClipType.ctXor:this.AddLocalMinPoly(f,m,P);break}else l.Clipper.SwapSides(f,m)}},l.Clipper.prototype.DeleteFromSEL=function(f){var m=f.PrevInSEL,P=f.NextInSEL;m===null&&P===null&&f!==this.m_SortedEdges||(m!==null?m.NextInSEL=P:this.m_SortedEdges=P,P!==null&&(P.PrevInSEL=m),f.NextInSEL=null,f.PrevInSEL=null)},l.Clipper.prototype.ProcessHorizontals=function(){for(var f={};this.PopEdgeFromSEL(f);)this.ProcessHorizontal(f.v)},l.Clipper.prototype.GetHorzDirection=function(f,m){f.Bot.X<f.Top.X?(m.Left=f.Bot.X,m.Right=f.Top.X,m.Dir=l.Direction.dLeftToRight):(m.Left=f.Top.X,m.Right=f.Bot.X,m.Dir=l.Direction.dRightToLeft)},l.Clipper.prototype.ProcessHorizontal=function(f){var m={Dir:null,Left:null,Right:null};this.GetHorzDirection(f,m);for(var P=m.Dir,L=m.Left,h=m.Right,d=f.WindDelta===0,v=f,x=null;v.NextInLML!==null&&l.ClipperBase.IsHorizontal(v.NextInLML);)v=v.NextInLML;v.NextInLML===null&&(x=this.GetMaximaPair(v));var F=this.m_Maxima;if(F!==null)if(P===l.Direction.dLeftToRight){for(;F!==null&&F.X<=f.Bot.X;)F=F.Next;F!==null&&F.X>=v.Top.X&&(F=null)}else{for(;F.Next!==null&&F.Next.X<f.Bot.X;)F=F.Next;F.X<=v.Top.X&&(F=null)}for(var Y=null;;){for(var K=f===v,q=this.GetNextInAEL(f,P);q!==null;){if(F!==null)if(P===l.Direction.dLeftToRight)for(;F!==null&&F.X<q.Curr.X;)f.OutIdx>=0&&!d&&this.AddOutPt(f,new l.IntPoint2(F.X,f.Bot.Y)),F=F.Next;else for(;F!==null&&F.X>q.Curr.X;)f.OutIdx>=0&&!d&&this.AddOutPt(f,new l.IntPoint2(F.X,f.Bot.Y)),F=F.Prev;if(P===l.Direction.dLeftToRight&&q.Curr.X>h||P===l.Direction.dRightToLeft&&q.Curr.X<L||q.Curr.X===f.Top.X&&f.NextInLML!==null&&q.Dx<f.NextInLML.Dx)break;if(f.OutIdx>=0&&!d){l.use_xyz&&(P===l.Direction.dLeftToRight?this.SetZ(q.Curr,f,q):this.SetZ(q.Curr,q,f)),Y=this.AddOutPt(f,q.Curr);for(var j=this.m_SortedEdges;j!==null;){if(j.OutIdx>=0&&this.HorzSegmentsOverlap(f.Bot.X,f.Top.X,j.Bot.X,j.Top.X)){var rA=this.GetLastOutPt(j);this.AddJoin(rA,Y,j.Top)}j=j.NextInSEL}this.AddGhostJoin(Y,f.Bot)}if(q===x&&K){f.OutIdx>=0&&this.AddLocalMaxPoly(f,x,f.Top),this.DeleteFromAEL(f),this.DeleteFromAEL(x);return}if(P===l.Direction.dLeftToRight){var gA=new l.IntPoint2(q.Curr.X,f.Curr.Y);this.IntersectEdges(f,q,gA)}else{var gA=new l.IntPoint2(q.Curr.X,f.Curr.Y);this.IntersectEdges(q,f,gA)}var cA=this.GetNextInAEL(q,P);this.SwapPositionsInAEL(f,q),q=cA}if(f.NextInLML===null||!l.ClipperBase.IsHorizontal(f.NextInLML))break;f=this.UpdateEdgeIntoAEL(f),f.OutIdx>=0&&this.AddOutPt(f,f.Bot),m={Dir:P,Left:L,Right:h},this.GetHorzDirection(f,m),P=m.Dir,L=m.Left,h=m.Right}if(f.OutIdx>=0&&Y===null){Y=this.GetLastOutPt(f);for(var j=this.m_SortedEdges;j!==null;){if(j.OutIdx>=0&&this.HorzSegmentsOverlap(f.Bot.X,f.Top.X,j.Bot.X,j.Top.X)){var rA=this.GetLastOutPt(j);this.AddJoin(rA,Y,j.Top)}j=j.NextInSEL}this.AddGhostJoin(Y,f.Top)}if(f.NextInLML!==null)if(f.OutIdx>=0){if(Y=this.AddOutPt(f,f.Top),f=this.UpdateEdgeIntoAEL(f),f.WindDelta===0)return;var uA=f.PrevInAEL,cA=f.NextInAEL;if(uA!==null&&uA.Curr.X===f.Bot.X&&uA.Curr.Y===f.Bot.Y&&uA.WindDelta===0&&uA.OutIdx>=0&&uA.Curr.Y>uA.Top.Y&&l.ClipperBase.SlopesEqual3(f,uA,this.m_UseFullRange)){var rA=this.AddOutPt(uA,f.Bot);this.AddJoin(Y,rA,f.Top)}else if(cA!==null&&cA.Curr.X===f.Bot.X&&cA.Curr.Y===f.Bot.Y&&cA.WindDelta!==0&&cA.OutIdx>=0&&cA.Curr.Y>cA.Top.Y&&l.ClipperBase.SlopesEqual3(f,cA,this.m_UseFullRange)){var rA=this.AddOutPt(cA,f.Bot);this.AddJoin(Y,rA,f.Top)}}else f=this.UpdateEdgeIntoAEL(f);else f.OutIdx>=0&&this.AddOutPt(f,f.Top),this.DeleteFromAEL(f)},l.Clipper.prototype.GetNextInAEL=function(f,m){return m===l.Direction.dLeftToRight?f.NextInAEL:f.PrevInAEL},l.Clipper.prototype.IsMinima=function(f){return f!==null&&f.Prev.NextInLML!==f&&f.Next.NextInLML!==f},l.Clipper.prototype.IsMaxima=function(f,m){return f!==null&&f.Top.Y===m&&f.NextInLML===null},l.Clipper.prototype.IsIntermediate=function(f,m){return f.Top.Y===m&&f.NextInLML!==null},l.Clipper.prototype.GetMaximaPair=function(f){return l.IntPoint.op_Equality(f.Next.Top,f.Top)&&f.Next.NextInLML===null?f.Next:l.IntPoint.op_Equality(f.Prev.Top,f.Top)&&f.Prev.NextInLML===null?f.Prev:null},l.Clipper.prototype.GetMaximaPairEx=function(f){var m=this.GetMaximaPair(f);return m===null||m.OutIdx===l.ClipperBase.Skip||m.NextInAEL===m.PrevInAEL&&!l.ClipperBase.IsHorizontal(m)?null:m},l.Clipper.prototype.ProcessIntersections=function(f){if(this.m_ActiveEdges===null)return!0;try{if(this.BuildIntersectList(f),this.m_IntersectList.length===0)return!0;if(this.m_IntersectList.length===1||this.FixupIntersectionOrder())this.ProcessIntersectList();else return!1}catch{this.m_SortedEdges=null,this.m_IntersectList.length=0,l.Error("ProcessIntersections error")}return this.m_SortedEdges=null,!0},l.Clipper.prototype.BuildIntersectList=function(f){if(this.m_ActiveEdges!==null){var m=this.m_ActiveEdges;for(this.m_SortedEdges=m;m!==null;)m.PrevInSEL=m.PrevInAEL,m.NextInSEL=m.NextInAEL,m.Curr.X=l.Clipper.TopX(m,f),m=m.NextInAEL;for(var P=!0;P&&this.m_SortedEdges!==null;){for(P=!1,m=this.m_SortedEdges;m.NextInSEL!==null;){var L=m.NextInSEL,h=new l.IntPoint0;if(m.Curr.X>L.Curr.X){this.IntersectPoint(m,L,h),h.Y<f&&(h=new l.IntPoint2(l.Clipper.TopX(m,f),f));var d=new l.IntersectNode;d.Edge1=m,d.Edge2=L,d.Pt.X=h.X,d.Pt.Y=h.Y,l.use_xyz&&(d.Pt.Z=h.Z),this.m_IntersectList.push(d),this.SwapPositionsInSEL(m,L),P=!0}else m=L}if(m.PrevInSEL!==null)m.PrevInSEL.NextInSEL=null;else break}this.m_SortedEdges=null}},l.Clipper.prototype.EdgesAdjacent=function(f){return f.Edge1.NextInSEL===f.Edge2||f.Edge1.PrevInSEL===f.Edge2},l.Clipper.IntersectNodeSort=function(f,m){return m.Pt.Y-f.Pt.Y},l.Clipper.prototype.FixupIntersectionOrder=function(){this.m_IntersectList.sort(this.m_IntersectNodeComparer),this.CopyAELToSEL();for(var f=this.m_IntersectList.length,m=0;m<f;m++){if(!this.EdgesAdjacent(this.m_IntersectList[m])){for(var P=m+1;P<f&&!this.EdgesAdjacent(this.m_IntersectList[P]);)P++;if(P===f)return!1;var L=this.m_IntersectList[m];this.m_IntersectList[m]=this.m_IntersectList[P],this.m_IntersectList[P]=L}this.SwapPositionsInSEL(this.m_IntersectList[m].Edge1,this.m_IntersectList[m].Edge2)}return!0},l.Clipper.prototype.ProcessIntersectList=function(){for(var f=0,m=this.m_IntersectList.length;f<m;f++){var P=this.m_IntersectList[f];this.IntersectEdges(P.Edge1,P.Edge2,P.Pt),this.SwapPositionsInAEL(P.Edge1,P.Edge2)}this.m_IntersectList.length=0};var de=function(f){return f<0?Math.ceil(f-.5):Math.round(f)},qe=function(f){return f<0?Math.ceil(f-.5):Math.floor(f+.5)},be=function(f){return f<0?-Math.round(Math.abs(f)):Math.round(f)},ee=function(f){return f<0?(f-=.5,f<-2147483648?Math.ceil(f):f|0):(f+=.5,f>2147483647?Math.floor(f):f|0)};s.msie?l.Clipper.Round=de:s.chromium?l.Clipper.Round=be:s.safari?l.Clipper.Round=ee:l.Clipper.Round=qe,l.Clipper.TopX=function(f,m){return m===f.Top.Y?f.Top.X:f.Bot.X+l.Clipper.Round(f.Dx*(m-f.Bot.Y))},l.Clipper.prototype.IntersectPoint=function(f,m,P){P.X=0,P.Y=0;var L,h;if(f.Dx===m.Dx){P.Y=f.Curr.Y,P.X=l.Clipper.TopX(f,P.Y);return}if(f.Delta.X===0)P.X=f.Bot.X,l.ClipperBase.IsHorizontal(m)?P.Y=m.Bot.Y:(h=m.Bot.Y-m.Bot.X/m.Dx,P.Y=l.Clipper.Round(P.X/m.Dx+h));else if(m.Delta.X===0)P.X=m.Bot.X,l.ClipperBase.IsHorizontal(f)?P.Y=f.Bot.Y:(L=f.Bot.Y-f.Bot.X/f.Dx,P.Y=l.Clipper.Round(P.X/f.Dx+L));else{L=f.Bot.X-f.Bot.Y*f.Dx,h=m.Bot.X-m.Bot.Y*m.Dx;var d=(h-L)/(f.Dx-m.Dx);P.Y=l.Clipper.Round(d),Math.abs(f.Dx)<Math.abs(m.Dx)?P.X=l.Clipper.Round(f.Dx*d+L):P.X=l.Clipper.Round(m.Dx*d+h)}if(P.Y<f.Top.Y||P.Y<m.Top.Y){if(f.Top.Y>m.Top.Y)return P.Y=f.Top.Y,P.X=l.Clipper.TopX(m,f.Top.Y),P.X<f.Top.X;P.Y=m.Top.Y,Math.abs(f.Dx)<Math.abs(m.Dx)?P.X=l.Clipper.TopX(f,P.Y):P.X=l.Clipper.TopX(m,P.Y)}P.Y>f.Curr.Y&&(P.Y=f.Curr.Y,Math.abs(f.Dx)>Math.abs(m.Dx)?P.X=l.Clipper.TopX(m,P.Y):P.X=l.Clipper.TopX(f,P.Y))},l.Clipper.prototype.ProcessEdgesAtTopOfScanbeam=function(f){for(var m=this.m_ActiveEdges;m!==null;){var P=this.IsMaxima(m,f);if(P){var L=this.GetMaximaPairEx(m);P=L===null||!l.ClipperBase.IsHorizontal(L)}if(P){this.StrictlySimple&&this.InsertMaxima(m.Top.X);var h=m.PrevInAEL;this.DoMaxima(m),h===null?m=this.m_ActiveEdges:m=h.NextInAEL}else{if(this.IsIntermediate(m,f)&&l.ClipperBase.IsHorizontal(m.NextInLML)?(m=this.UpdateEdgeIntoAEL(m),m.OutIdx>=0&&this.AddOutPt(m,m.Bot),this.AddEdgeToSEL(m)):(m.Curr.X=l.Clipper.TopX(m,f),m.Curr.Y=f),l.use_xyz&&(m.Top.Y===f?m.Curr.Z=m.Top.Z:m.Bot.Y===f?m.Curr.Z=m.Bot.Z:m.Curr.Z=0),this.StrictlySimple){var h=m.PrevInAEL;if(m.OutIdx>=0&&m.WindDelta!==0&&h!==null&&h.OutIdx>=0&&h.Curr.X===m.Curr.X&&h.WindDelta!==0){var d=new l.IntPoint1(m.Curr);l.use_xyz&&this.SetZ(d,h,m);var v=this.AddOutPt(h,d),x=this.AddOutPt(m,d);this.AddJoin(v,x,d)}}m=m.NextInAEL}}for(this.ProcessHorizontals(),this.m_Maxima=null,m=this.m_ActiveEdges;m!==null;){if(this.IsIntermediate(m,f)){var v=null;m.OutIdx>=0&&(v=this.AddOutPt(m,m.Top)),m=this.UpdateEdgeIntoAEL(m);var h=m.PrevInAEL,F=m.NextInAEL;if(h!==null&&h.Curr.X===m.Bot.X&&h.Curr.Y===m.Bot.Y&&v!==null&&h.OutIdx>=0&&h.Curr.Y===h.Top.Y&&l.ClipperBase.SlopesEqual5(m.Curr,m.Top,h.Curr,h.Top,this.m_UseFullRange)&&m.WindDelta!==0&&h.WindDelta!==0){var x=this.AddOutPt(ePrev2,m.Bot);this.AddJoin(v,x,m.Top)}else if(F!==null&&F.Curr.X===m.Bot.X&&F.Curr.Y===m.Bot.Y&&v!==null&&F.OutIdx>=0&&F.Curr.Y===F.Top.Y&&l.ClipperBase.SlopesEqual5(m.Curr,m.Top,F.Curr,F.Top,this.m_UseFullRange)&&m.WindDelta!==0&&F.WindDelta!==0){var x=this.AddOutPt(F,m.Bot);this.AddJoin(v,x,m.Top)}}m=m.NextInAEL}},l.Clipper.prototype.DoMaxima=function(f){var m=this.GetMaximaPairEx(f);if(m===null){f.OutIdx>=0&&this.AddOutPt(f,f.Top),this.DeleteFromAEL(f);return}for(var P=f.NextInAEL;P!==null&&P!==m;)this.IntersectEdges(f,P,f.Top),this.SwapPositionsInAEL(f,P),P=f.NextInAEL;f.OutIdx===-1&&m.OutIdx===-1?(this.DeleteFromAEL(f),this.DeleteFromAEL(m)):f.OutIdx>=0&&m.OutIdx>=0?(f.OutIdx>=0&&this.AddLocalMaxPoly(f,m,f.Top),this.DeleteFromAEL(f),this.DeleteFromAEL(m)):l.use_lines&&f.WindDelta===0?(f.OutIdx>=0&&(this.AddOutPt(f,f.Top),f.OutIdx=l.ClipperBase.Unassigned),this.DeleteFromAEL(f),m.OutIdx>=0&&(this.AddOutPt(m,f.Top),m.OutIdx=l.ClipperBase.Unassigned),this.DeleteFromAEL(m)):l.Error("DoMaxima error")},l.Clipper.ReversePaths=function(f){for(var m=0,P=f.length;m<P;m++)f[m].reverse()},l.Clipper.Orientation=function(f){return l.Clipper.Area(f)>=0},l.Clipper.prototype.PointCount=function(f){if(f===null)return 0;var m=0,P=f;do m++,P=P.Next;while(P!==f);return m},l.Clipper.prototype.BuildResult=function(f){l.Clear(f);for(var m=0,P=this.m_PolyOuts.length;m<P;m++){var L=this.m_PolyOuts[m];if(L.Pts!==null){var h=L.Pts.Prev,d=this.PointCount(h);if(!(d<2)){for(var v=new Array(d),x=0;x<d;x++)v[x]=h.Pt,h=h.Prev;f.push(v)}}}},l.Clipper.prototype.BuildResult2=function(f){f.Clear();for(var m=0,P=this.m_PolyOuts.length;m<P;m++){var L=this.m_PolyOuts[m],h=this.PointCount(L.Pts);if(!(L.IsOpen&&h<2||!L.IsOpen&&h<3)){this.FixHoleLinkage(L);var d=new l.PolyNode;f.m_AllPolys.push(d),L.PolyNode=d,d.m_polygon.length=h;for(var v=L.Pts.Prev,x=0;x<h;x++)d.m_polygon[x]=v.Pt,v=v.Prev}}for(var m=0,P=this.m_PolyOuts.length;m<P;m++){var L=this.m_PolyOuts[m];L.PolyNode!==null&&(L.IsOpen?(L.PolyNode.IsOpen=!0,f.AddChild(L.PolyNode)):L.FirstLeft!==null&&L.FirstLeft.PolyNode!==null?L.FirstLeft.PolyNode.AddChild(L.PolyNode):f.AddChild(L.PolyNode))}},l.Clipper.prototype.FixupOutPolyline=function(f){for(var m=f.Pts,P=m.Prev;m!==P;)if(m=m.Next,l.IntPoint.op_Equality(m.Pt,m.Prev.Pt)){m===P&&(P=m.Prev);var L=m.Prev;L.Next=m.Next,m.Next.Prev=L,m=L}m===m.Prev&&(f.Pts=null)},l.Clipper.prototype.FixupOutPolygon=function(f){var m=null;f.BottomPt=null;for(var P=f.Pts,L=this.PreserveCollinear||this.StrictlySimple;;){if(P.Prev===P||P.Prev===P.Next){f.Pts=null;return}if(l.IntPoint.op_Equality(P.Pt,P.Next.Pt)||l.IntPoint.op_Equality(P.Pt,P.Prev.Pt)||l.ClipperBase.SlopesEqual4(P.Prev.Pt,P.Pt,P.Next.Pt,this.m_UseFullRange)&&(!L||!this.Pt2IsBetweenPt1AndPt3(P.Prev.Pt,P.Pt,P.Next.Pt)))m=null,P.Prev.Next=P.Next,P.Next.Prev=P.Prev,P=P.Prev;else{if(P===m)break;m===null&&(m=P),P=P.Next}}f.Pts=P},l.Clipper.prototype.DupOutPt=function(f,m){var P=new l.OutPt;return P.Pt.X=f.Pt.X,P.Pt.Y=f.Pt.Y,l.use_xyz&&(P.Pt.Z=f.Pt.Z),P.Idx=f.Idx,m?(P.Next=f.Next,P.Prev=f,f.Next.Prev=P,f.Next=P):(P.Prev=f.Prev,P.Next=f,f.Prev.Next=P,f.Prev=P),P},l.Clipper.prototype.GetOverlap=function(f,m,P,L,h){return f<m?P<L?(h.Left=Math.max(f,P),h.Right=Math.min(m,L)):(h.Left=Math.max(f,L),h.Right=Math.min(m,P)):P<L?(h.Left=Math.max(m,P),h.Right=Math.min(f,L)):(h.Left=Math.max(m,L),h.Right=Math.min(f,P)),h.Left<h.Right},l.Clipper.prototype.JoinHorz=function(f,m,P,L,h,d){var v=f.Pt.X>m.Pt.X?l.Direction.dRightToLeft:l.Direction.dLeftToRight,x=P.Pt.X>L.Pt.X?l.Direction.dRightToLeft:l.Direction.dLeftToRight;if(v===x)return!1;if(v===l.Direction.dLeftToRight){for(;f.Next.Pt.X<=h.X&&f.Next.Pt.X>=f.Pt.X&&f.Next.Pt.Y===h.Y;)f=f.Next;d&&f.Pt.X!==h.X&&(f=f.Next),m=this.DupOutPt(f,!d),l.IntPoint.op_Inequality(m.Pt,h)&&(f=m,f.Pt.X=h.X,f.Pt.Y=h.Y,l.use_xyz&&(f.Pt.Z=h.Z),m=this.DupOutPt(f,!d))}else{for(;f.Next.Pt.X>=h.X&&f.Next.Pt.X<=f.Pt.X&&f.Next.Pt.Y===h.Y;)f=f.Next;!d&&f.Pt.X!==h.X&&(f=f.Next),m=this.DupOutPt(f,d),l.IntPoint.op_Inequality(m.Pt,h)&&(f=m,f.Pt.X=h.X,f.Pt.Y=h.Y,l.use_xyz&&(f.Pt.Z=h.Z),m=this.DupOutPt(f,d))}if(x===l.Direction.dLeftToRight){for(;P.Next.Pt.X<=h.X&&P.Next.Pt.X>=P.Pt.X&&P.Next.Pt.Y===h.Y;)P=P.Next;d&&P.Pt.X!==h.X&&(P=P.Next),L=this.DupOutPt(P,!d),l.IntPoint.op_Inequality(L.Pt,h)&&(P=L,P.Pt.X=h.X,P.Pt.Y=h.Y,l.use_xyz&&(P.Pt.Z=h.Z),L=this.DupOutPt(P,!d))}else{for(;P.Next.Pt.X>=h.X&&P.Next.Pt.X<=P.Pt.X&&P.Next.Pt.Y===h.Y;)P=P.Next;!d&&P.Pt.X!==h.X&&(P=P.Next),L=this.DupOutPt(P,d),l.IntPoint.op_Inequality(L.Pt,h)&&(P=L,P.Pt.X=h.X,P.Pt.Y=h.Y,l.use_xyz&&(P.Pt.Z=h.Z),L=this.DupOutPt(P,d))}return v===l.Direction.dLeftToRight===d?(f.Prev=P,P.Next=f,m.Next=L,L.Prev=m):(f.Next=P,P.Prev=f,m.Prev=L,L.Next=m),!0},l.Clipper.prototype.JoinPoints=function(f,m,P){var L=f.OutPt1,h=new l.OutPt,d=f.OutPt2,v=new l.OutPt,x=f.OutPt1.Pt.Y===f.OffPt.Y;if(x&&l.IntPoint.op_Equality(f.OffPt,f.OutPt1.Pt)&&l.IntPoint.op_Equality(f.OffPt,f.OutPt2.Pt)){if(m!==P)return!1;for(h=f.OutPt1.Next;h!==L&&l.IntPoint.op_Equality(h.Pt,f.OffPt);)h=h.Next;var F=h.Pt.Y>f.OffPt.Y;for(v=f.OutPt2.Next;v!==d&&l.IntPoint.op_Equality(v.Pt,f.OffPt);)v=v.Next;var Y=v.Pt.Y>f.OffPt.Y;return F===Y?!1:F?(h=this.DupOutPt(L,!1),v=this.DupOutPt(d,!0),L.Prev=d,d.Next=L,h.Next=v,v.Prev=h,f.OutPt1=L,f.OutPt2=h,!0):(h=this.DupOutPt(L,!0),v=this.DupOutPt(d,!1),L.Next=d,d.Prev=L,h.Prev=v,v.Next=h,f.OutPt1=L,f.OutPt2=h,!0)}else if(x){for(h=L;L.Prev.Pt.Y===L.Pt.Y&&L.Prev!==h&&L.Prev!==d;)L=L.Prev;for(;h.Next.Pt.Y===h.Pt.Y&&h.Next!==L&&h.Next!==d;)h=h.Next;if(h.Next===L||h.Next===d)return!1;for(v=d;d.Prev.Pt.Y===d.Pt.Y&&d.Prev!==v&&d.Prev!==h;)d=d.Prev;for(;v.Next.Pt.Y===v.Pt.Y&&v.Next!==d&&v.Next!==L;)v=v.Next;if(v.Next===d||v.Next===L)return!1;var K={Left:null,Right:null};if(!this.GetOverlap(L.Pt.X,h.Pt.X,d.Pt.X,v.Pt.X,K))return!1;var q=K.Left,j=K.Right,rA=new l.IntPoint0,gA;return L.Pt.X>=q&&L.Pt.X<=j?(rA.X=L.Pt.X,rA.Y=L.Pt.Y,l.use_xyz&&(rA.Z=L.Pt.Z),gA=L.Pt.X>h.Pt.X):d.Pt.X>=q&&d.Pt.X<=j?(rA.X=d.Pt.X,rA.Y=d.Pt.Y,l.use_xyz&&(rA.Z=d.Pt.Z),gA=d.Pt.X>v.Pt.X):h.Pt.X>=q&&h.Pt.X<=j?(rA.X=h.Pt.X,rA.Y=h.Pt.Y,l.use_xyz&&(rA.Z=h.Pt.Z),gA=h.Pt.X>L.Pt.X):(rA.X=v.Pt.X,rA.Y=v.Pt.Y,l.use_xyz&&(rA.Z=v.Pt.Z),gA=v.Pt.X>d.Pt.X),f.OutPt1=L,f.OutPt2=d,this.JoinHorz(L,h,d,v,rA,gA)}else{for(h=L.Next;l.IntPoint.op_Equality(h.Pt,L.Pt)&&h!==L;)h=h.Next;var cA=h.Pt.Y>L.Pt.Y||!l.ClipperBase.SlopesEqual4(L.Pt,h.Pt,f.OffPt,this.m_UseFullRange);if(cA){for(h=L.Prev;l.IntPoint.op_Equality(h.Pt,L.Pt)&&h!==L;)h=h.Prev;if(h.Pt.Y>L.Pt.Y||!l.ClipperBase.SlopesEqual4(L.Pt,h.Pt,f.OffPt,this.m_UseFullRange))return!1}for(v=d.Next;l.IntPoint.op_Equality(v.Pt,d.Pt)&&v!==d;)v=v.Next;var uA=v.Pt.Y>d.Pt.Y||!l.ClipperBase.SlopesEqual4(d.Pt,v.Pt,f.OffPt,this.m_UseFullRange);if(uA){for(v=d.Prev;l.IntPoint.op_Equality(v.Pt,d.Pt)&&v!==d;)v=v.Prev;if(v.Pt.Y>d.Pt.Y||!l.ClipperBase.SlopesEqual4(d.Pt,v.Pt,f.OffPt,this.m_UseFullRange))return!1}return h===L||v===d||h===v||m===P&&cA===uA?!1:cA?(h=this.DupOutPt(L,!1),v=this.DupOutPt(d,!0),L.Prev=d,d.Next=L,h.Next=v,v.Prev=h,f.OutPt1=L,f.OutPt2=h,!0):(h=this.DupOutPt(L,!0),v=this.DupOutPt(d,!1),L.Next=d,d.Prev=L,h.Prev=v,v.Next=h,f.OutPt1=L,f.OutPt2=h,!0)}},l.Clipper.GetBounds=function(f){for(var m=0,P=f.length;m<P&&f[m].length===0;)m++;if(m===P)return new l.IntRect(0,0,0,0);var L=new l.IntRect;for(L.left=f[m][0].X,L.right=L.left,L.top=f[m][0].Y,L.bottom=L.top;m<P;m++)for(var h=0,d=f[m].length;h<d;h++)f[m][h].X<L.left?L.left=f[m][h].X:f[m][h].X>L.right&&(L.right=f[m][h].X),f[m][h].Y<L.top?L.top=f[m][h].Y:f[m][h].Y>L.bottom&&(L.bottom=f[m][h].Y);return L},l.Clipper.prototype.GetBounds2=function(f){var m=f,P=new l.IntRect;for(P.left=f.Pt.X,P.right=f.Pt.X,P.top=f.Pt.Y,P.bottom=f.Pt.Y,f=f.Next;f!==m;)f.Pt.X<P.left&&(P.left=f.Pt.X),f.Pt.X>P.right&&(P.right=f.Pt.X),f.Pt.Y<P.top&&(P.top=f.Pt.Y),f.Pt.Y>P.bottom&&(P.bottom=f.Pt.Y),f=f.Next;return P},l.Clipper.PointInPolygon=function(f,m){var P=0,L=m.length;if(L<3)return 0;for(var h=m[0],d=1;d<=L;++d){var v=d===L?m[0]:m[d];if(v.Y===f.Y&&(v.X===f.X||h.Y===f.Y&&v.X>f.X==h.X<f.X))return-1;if(h.Y<f.Y!=v.Y<f.Y){if(h.X>=f.X)if(v.X>f.X)P=1-P;else{var x=(h.X-f.X)*(v.Y-f.Y)-(v.X-f.X)*(h.Y-f.Y);if(x===0)return-1;x>0==v.Y>h.Y&&(P=1-P)}else if(v.X>f.X){var x=(h.X-f.X)*(v.Y-f.Y)-(v.X-f.X)*(h.Y-f.Y);if(x===0)return-1;x>0==v.Y>h.Y&&(P=1-P)}}h=v}return P},l.Clipper.prototype.PointInPolygon=function(f,m){var P=0,L=m,h=f.X,d=f.Y,v=m.Pt.X,x=m.Pt.Y;do{m=m.Next;var F=m.Pt.X,Y=m.Pt.Y;if(Y===d&&(F===h||x===d&&F>h==v<h))return-1;if(x<d!=Y<d){if(v>=h)if(F>h)P=1-P;else{var K=(v-h)*(Y-d)-(F-h)*(x-d);if(K===0)return-1;K>0==Y>x&&(P=1-P)}else if(F>h){var K=(v-h)*(Y-d)-(F-h)*(x-d);if(K===0)return-1;K>0==Y>x&&(P=1-P)}}v=F,x=Y}while(L!==m);return P},l.Clipper.prototype.Poly2ContainsPoly1=function(f,m){var P=f;do{var L=this.PointInPolygon(P.Pt,m);if(L>=0)return L>0;P=P.Next}while(P!==f);return!0},l.Clipper.prototype.FixupFirstLefts1=function(f,m){for(var P,L,h=0,d=this.m_PolyOuts.length;h<d;h++)P=this.m_PolyOuts[h],L=l.Clipper.ParseFirstLeft(P.FirstLeft),P.Pts!==null&&L===f&&this.Poly2ContainsPoly1(P.Pts,m.Pts)&&(P.FirstLeft=m)},l.Clipper.prototype.FixupFirstLefts2=function(f,m){for(var P=m.FirstLeft,L,h,d=0,v=this.m_PolyOuts.length;d<v;d++)L=this.m_PolyOuts[d],!(L.Pts===null||L===m||L===f)&&(h=l.Clipper.ParseFirstLeft(L.FirstLeft),!(h!==P&&h!==f&&h!==m)&&(this.Poly2ContainsPoly1(L.Pts,f.Pts)?L.FirstLeft=f:this.Poly2ContainsPoly1(L.Pts,m.Pts)?L.FirstLeft=m:(L.FirstLeft===f||L.FirstLeft===m)&&(L.FirstLeft=P)))},l.Clipper.prototype.FixupFirstLefts3=function(f,m){for(var P,L,h=0,d=this.m_PolyOuts.length;h<d;h++)P=this.m_PolyOuts[h],L=l.Clipper.ParseFirstLeft(P.FirstLeft),P.Pts!==null&&L===f&&(P.FirstLeft=m)},l.Clipper.ParseFirstLeft=function(f){for(;f!==null&&f.Pts===null;)f=f.FirstLeft;return f},l.Clipper.prototype.JoinCommonEdges=function(){for(var f=0,m=this.m_Joins.length;f<m;f++){var P=this.m_Joins[f],L=this.GetOutRec(P.OutPt1.Idx),h=this.GetOutRec(P.OutPt2.Idx);if(!(L.Pts===null||h.Pts===null)&&!(L.IsOpen||h.IsOpen)){var d;L===h?d=L:this.OutRec1RightOfOutRec2(L,h)?d=h:this.OutRec1RightOfOutRec2(h,L)?d=L:d=this.GetLowermostRec(L,h),this.JoinPoints(P,L,h)&&(L===h?(L.Pts=P.OutPt1,L.BottomPt=null,h=this.CreateOutRec(),h.Pts=P.OutPt2,this.UpdateOutPtIdxs(h),this.Poly2ContainsPoly1(h.Pts,L.Pts)?(h.IsHole=!L.IsHole,h.FirstLeft=L,this.m_UsingPolyTree&&this.FixupFirstLefts2(h,L),(h.IsHole^this.ReverseSolution)==this.Area$1(h)>0&&this.ReversePolyPtLinks(h.Pts)):this.Poly2ContainsPoly1(L.Pts,h.Pts)?(h.IsHole=L.IsHole,L.IsHole=!h.IsHole,h.FirstLeft=L.FirstLeft,L.FirstLeft=h,this.m_UsingPolyTree&&this.FixupFirstLefts2(L,h),(L.IsHole^this.ReverseSolution)==this.Area$1(L)>0&&this.ReversePolyPtLinks(L.Pts)):(h.IsHole=L.IsHole,h.FirstLeft=L.FirstLeft,this.m_UsingPolyTree&&this.FixupFirstLefts1(L,h))):(h.Pts=null,h.BottomPt=null,h.Idx=L.Idx,L.IsHole=d.IsHole,d===h&&(L.FirstLeft=h.FirstLeft),h.FirstLeft=L,this.m_UsingPolyTree&&this.FixupFirstLefts3(h,L)))}}},l.Clipper.prototype.UpdateOutPtIdxs=function(f){var m=f.Pts;do m.Idx=f.Idx,m=m.Prev;while(m!==f.Pts)},l.Clipper.prototype.DoSimplePolygons=function(){for(var f=0;f<this.m_PolyOuts.length;){var m=this.m_PolyOuts[f++],P=m.Pts;if(!(P===null||m.IsOpen))do{for(var L=P.Next;L!==m.Pts;){if(l.IntPoint.op_Equality(P.Pt,L.Pt)&&L.Next!==P&&L.Prev!==P){var h=P.Prev,d=L.Prev;P.Prev=d,d.Next=P,L.Prev=h,h.Next=L,m.Pts=P;var v=this.CreateOutRec();v.Pts=L,this.UpdateOutPtIdxs(v),this.Poly2ContainsPoly1(v.Pts,m.Pts)?(v.IsHole=!m.IsHole,v.FirstLeft=m,this.m_UsingPolyTree&&this.FixupFirstLefts2(v,m)):this.Poly2ContainsPoly1(m.Pts,v.Pts)?(v.IsHole=m.IsHole,m.IsHole=!v.IsHole,v.FirstLeft=m.FirstLeft,m.FirstLeft=v,this.m_UsingPolyTree&&this.FixupFirstLefts2(m,v)):(v.IsHole=m.IsHole,v.FirstLeft=m.FirstLeft,this.m_UsingPolyTree&&this.FixupFirstLefts1(m,v)),L=P}L=L.Next}P=P.Next}while(P!==m.Pts)}},l.Clipper.Area=function(f){if(!Array.isArray(f))return 0;var m=f.length;if(m<3)return 0;for(var P=0,L=0,h=m-1;L<m;++L)P+=(f[h].X+f[L].X)*(f[h].Y-f[L].Y),h=L;return-P*.5},l.Clipper.prototype.Area=function(f){var m=f;if(f===null)return 0;var P=0;do P=P+(f.Prev.Pt.X+f.Pt.X)*(f.Prev.Pt.Y-f.Pt.Y),f=f.Next;while(f!==m);return P*.5},l.Clipper.prototype.Area$1=function(f){return this.Area(f.Pts)},l.Clipper.SimplifyPolygon=function(f,m){var P=new Array,L=new l.Clipper(0);return L.StrictlySimple=!0,L.AddPath(f,l.PolyType.ptSubject,!0),L.Execute(l.ClipType.ctUnion,P,m,m),P},l.Clipper.SimplifyPolygons=function(f,m){typeof m>"u"&&(m=l.PolyFillType.pftEvenOdd);var P=new Array,L=new l.Clipper(0);return L.StrictlySimple=!0,L.AddPaths(f,l.PolyType.ptSubject,!0),L.Execute(l.ClipType.ctUnion,P,m,m),P},l.Clipper.DistanceSqrd=function(f,m){var P=f.X-m.X,L=f.Y-m.Y;return P*P+L*L},l.Clipper.DistanceFromLineSqrd=function(f,m,P){var L=m.Y-P.Y,h=P.X-m.X,d=L*m.X+h*m.Y;return d=L*f.X+h*f.Y-d,d*d/(L*L+h*h)},l.Clipper.SlopesNearCollinear=function(f,m,P,L){return Math.abs(f.X-m.X)>Math.abs(f.Y-m.Y)?f.X>m.X==f.X<P.X?l.Clipper.DistanceFromLineSqrd(f,m,P)<L:m.X>f.X==m.X<P.X?l.Clipper.DistanceFromLineSqrd(m,f,P)<L:l.Clipper.DistanceFromLineSqrd(P,f,m)<L:f.Y>m.Y==f.Y<P.Y?l.Clipper.DistanceFromLineSqrd(f,m,P)<L:m.Y>f.Y==m.Y<P.Y?l.Clipper.DistanceFromLineSqrd(m,f,P)<L:l.Clipper.DistanceFromLineSqrd(P,f,m)<L},l.Clipper.PointsAreClose=function(f,m,P){var L=f.X-m.X,h=f.Y-m.Y;return L*L+h*h<=P},l.Clipper.ExcludeOp=function(f){var m=f.Prev;return m.Next=f.Next,f.Next.Prev=m,m.Idx=0,m},l.Clipper.CleanPolygon=function(f,m){typeof m>"u"&&(m=1.415);var P=f.length;if(P===0)return new Array;for(var L=new Array(P),h=0;h<P;++h)L[h]=new l.OutPt;for(var h=0;h<P;++h)L[h].Pt=f[h],L[h].Next=L[(h+1)%P],L[h].Next.Prev=L[h],L[h].Idx=0;for(var d=m*m,v=L[0];v.Idx===0&&v.Next!==v.Prev;)l.Clipper.PointsAreClose(v.Pt,v.Prev.Pt,d)?(v=l.Clipper.ExcludeOp(v),P--):l.Clipper.PointsAreClose(v.Prev.Pt,v.Next.Pt,d)?(l.Clipper.ExcludeOp(v.Next),v=l.Clipper.ExcludeOp(v),P-=2):l.Clipper.SlopesNearCollinear(v.Prev.Pt,v.Pt,v.Next.Pt,d)?(v=l.Clipper.ExcludeOp(v),P--):(v.Idx=1,v=v.Next);P<3&&(P=0);for(var x=new Array(P),h=0;h<P;++h)x[h]=new l.IntPoint1(v.Pt),v=v.Next;return L=null,x},l.Clipper.CleanPolygons=function(f,m){for(var P=new Array(f.length),L=0,h=f.length;L<h;L++)P[L]=l.Clipper.CleanPolygon(f[L],m);return P},l.Clipper.Minkowski=function(f,m,P,L){var h=L?1:0,d=f.length,v=m.length,x=new Array;if(P)for(var F=0;F<v;F++){for(var Y=new Array(d),K=0,q=f.length,j=f[K];K<q;K++,j=f[K])Y[K]=new l.IntPoint2(m[F].X+j.X,m[F].Y+j.Y);x.push(Y)}else for(var F=0;F<v;F++){for(var Y=new Array(d),K=0,q=f.length,j=f[K];K<q;K++,j=f[K])Y[K]=new l.IntPoint2(m[F].X-j.X,m[F].Y-j.Y);x.push(Y)}for(var rA=new Array,F=0;F<v-1+h;F++)for(var K=0;K<d;K++){var gA=new Array;gA.push(x[F%v][K%d]),gA.push(x[(F+1)%v][K%d]),gA.push(x[(F+1)%v][(K+1)%d]),gA.push(x[F%v][(K+1)%d]),l.Clipper.Orientation(gA)||gA.reverse(),rA.push(gA)}return rA},l.Clipper.MinkowskiSum=function(f,m,P){if(m[0]instanceof Array){for(var h=m,v=new l.Paths,d=new l.Clipper,x=0;x<h.length;++x){var F=l.Clipper.Minkowski(f,h[x],!0,P);if(d.AddPaths(F,l.PolyType.ptSubject,!0),P){var L=l.Clipper.TranslatePath(h[x],f[0]);d.AddPath(L,l.PolyType.ptClip,!0)}}return d.Execute(l.ClipType.ctUnion,v,l.PolyFillType.pftNonZero,l.PolyFillType.pftNonZero),v}else{var L=m,h=l.Clipper.Minkowski(f,L,!0,P),d=new l.Clipper;return d.AddPaths(h,l.PolyType.ptSubject,!0),d.Execute(l.ClipType.ctUnion,h,l.PolyFillType.pftNonZero,l.PolyFillType.pftNonZero),h}},l.Clipper.TranslatePath=function(f,m){for(var P=new l.Path,L=0;L<f.length;L++)P.push(new l.IntPoint2(f[L].X+m.X,f[L].Y+m.Y));return P},l.Clipper.MinkowskiDiff=function(f,m){var P=l.Clipper.Minkowski(f,m,!1,!0),L=new l.Clipper;return L.AddPaths(P,l.PolyType.ptSubject,!0),L.Execute(l.ClipType.ctUnion,P,l.PolyFillType.pftNonZero,l.PolyFillType.pftNonZero),P},l.Clipper.PolyTreeToPaths=function(f){var m=new Array;return l.Clipper.AddPolyNodeToPaths(f,l.Clipper.NodeType.ntAny,m),m},l.Clipper.AddPolyNodeToPaths=function(f,m,P){var L=!0;switch(m){case l.Clipper.NodeType.ntOpen:return;case l.Clipper.NodeType.ntClosed:L=!f.IsOpen;break}f.m_polygon.length>0&&L&&P.push(f.m_polygon);for(var h=0,d=f.Childs(),v=d.length,x=d[h];h<v;h++,x=d[h])l.Clipper.AddPolyNodeToPaths(x,m,P)},l.Clipper.OpenPathsFromPolyTree=function(f){for(var m=new l.Paths,P=0,L=f.ChildCount();P<L;P++)f.Childs()[P].IsOpen&&m.push(f.Childs()[P].m_polygon);return m},l.Clipper.ClosedPathsFromPolyTree=function(f){var m=new l.Paths;return l.Clipper.AddPolyNodeToPaths(f,l.Clipper.NodeType.ntClosed,m),m},He(l.Clipper,l.ClipperBase),l.Clipper.NodeType={ntAny:0,ntOpen:1,ntClosed:2},l.ClipperOffset=function(f,m){typeof f>"u"&&(f=2),typeof m>"u"&&(m=l.ClipperOffset.def_arc_tolerance),this.m_destPolys=new l.Paths,this.m_srcPoly=new l.Path,this.m_destPoly=new l.Path,this.m_normals=new Array,this.m_delta=0,this.m_sinA=0,this.m_sin=0,this.m_cos=0,this.m_miterLim=0,this.m_StepsPerRad=0,this.m_lowest=new l.IntPoint0,this.m_polyNodes=new l.PolyNode,this.MiterLimit=f,this.ArcTolerance=m,this.m_lowest.X=-1},l.ClipperOffset.two_pi=6.28318530717959,l.ClipperOffset.def_arc_tolerance=.25,l.ClipperOffset.prototype.Clear=function(){l.Clear(this.m_polyNodes.Childs()),this.m_lowest.X=-1},l.ClipperOffset.Round=l.Clipper.Round,l.ClipperOffset.prototype.AddPath=function(f,m,P){var L=f.length-1;if(!(L<0)){var h=new l.PolyNode;if(h.m_jointype=m,h.m_endtype=P,P===l.EndType.etClosedLine||P===l.EndType.etClosedPolygon)for(;L>0&&l.IntPoint.op_Equality(f[0],f[L]);)L--;h.m_polygon.push(f[0]);for(var d=0,v=0,x=1;x<=L;x++)l.IntPoint.op_Inequality(h.m_polygon[d],f[x])&&(d++,h.m_polygon.push(f[x]),(f[x].Y>h.m_polygon[v].Y||f[x].Y===h.m_polygon[v].Y&&f[x].X<h.m_polygon[v].X)&&(v=d));if(!(P===l.EndType.etClosedPolygon&&d<2)&&(this.m_polyNodes.AddChild(h),P===l.EndType.etClosedPolygon))if(this.m_lowest.X<0)this.m_lowest=new l.IntPoint2(this.m_polyNodes.ChildCount()-1,v);else{var F=this.m_polyNodes.Childs()[this.m_lowest.X].m_polygon[this.m_lowest.Y];(h.m_polygon[v].Y>F.Y||h.m_polygon[v].Y===F.Y&&h.m_polygon[v].X<F.X)&&(this.m_lowest=new l.IntPoint2(this.m_polyNodes.ChildCount()-1,v))}}},l.ClipperOffset.prototype.AddPaths=function(f,m,P){for(var L=0,h=f.length;L<h;L++)this.AddPath(f[L],m,P)},l.ClipperOffset.prototype.FixOrientations=function(){if(this.m_lowest.X>=0&&!l.Clipper.Orientation(this.m_polyNodes.Childs()[this.m_lowest.X].m_polygon))for(var f=0;f<this.m_polyNodes.ChildCount();f++){var m=this.m_polyNodes.Childs()[f];(m.m_endtype===l.EndType.etClosedPolygon||m.m_endtype===l.EndType.etClosedLine&&l.Clipper.Orientation(m.m_polygon))&&m.m_polygon.reverse()}else for(var f=0;f<this.m_polyNodes.ChildCount();f++){var m=this.m_polyNodes.Childs()[f];m.m_endtype===l.EndType.etClosedLine&&!l.Clipper.Orientation(m.m_polygon)&&m.m_polygon.reverse()}},l.ClipperOffset.GetUnitNormal=function(f,m){var P=m.X-f.X,L=m.Y-f.Y;if(P===0&&L===0)return new l.DoublePoint2(0,0);var h=1/Math.sqrt(P*P+L*L);return P*=h,L*=h,new l.DoublePoint2(L,-P)},l.ClipperOffset.prototype.DoOffset=function(f){if(this.m_destPolys=new Array,this.m_delta=f,l.ClipperBase.near_zero(f)){for(var m=0;m<this.m_polyNodes.ChildCount();m++){var P=this.m_polyNodes.Childs()[m];P.m_endtype===l.EndType.etClosedPolygon&&this.m_destPolys.push(P.m_polygon)}return}this.MiterLimit>2?this.m_miterLim=2/(this.MiterLimit*this.MiterLimit):this.m_miterLim=.5;var L;this.ArcTolerance<=0?L=l.ClipperOffset.def_arc_tolerance:this.ArcTolerance>Math.abs(f)*l.ClipperOffset.def_arc_tolerance?L=Math.abs(f)*l.ClipperOffset.def_arc_tolerance:L=this.ArcTolerance;var h=3.14159265358979/Math.acos(1-L/Math.abs(f));this.m_sin=Math.sin(l.ClipperOffset.two_pi/h),this.m_cos=Math.cos(l.ClipperOffset.two_pi/h),this.m_StepsPerRad=h/l.ClipperOffset.two_pi,f<0&&(this.m_sin=-this.m_sin);for(var m=0;m<this.m_polyNodes.ChildCount();m++){var P=this.m_polyNodes.Childs()[m];this.m_srcPoly=P.m_polygon;var d=this.m_srcPoly.length;if(!(d===0||f<=0&&(d<3||P.m_endtype!==l.EndType.etClosedPolygon))){if(this.m_destPoly=new Array,d===1){if(P.m_jointype===l.JoinType.jtRound)for(var v=1,x=0,F=1;F<=h;F++){this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[0].X+v*f),l.ClipperOffset.Round(this.m_srcPoly[0].Y+x*f)));var Y=v;v=v*this.m_cos-this.m_sin*x,x=Y*this.m_sin+x*this.m_cos}else for(var v=-1,x=-1,F=0;F<4;++F)this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[0].X+v*f),l.ClipperOffset.Round(this.m_srcPoly[0].Y+x*f))),v<0?v=1:x<0?x=1:v=-1;this.m_destPolys.push(this.m_destPoly);continue}this.m_normals.length=0;for(var F=0;F<d-1;F++)this.m_normals.push(l.ClipperOffset.GetUnitNormal(this.m_srcPoly[F],this.m_srcPoly[F+1]));if(P.m_endtype===l.EndType.etClosedLine||P.m_endtype===l.EndType.etClosedPolygon?this.m_normals.push(l.ClipperOffset.GetUnitNormal(this.m_srcPoly[d-1],this.m_srcPoly[0])):this.m_normals.push(new l.DoublePoint1(this.m_normals[d-2])),P.m_endtype===l.EndType.etClosedPolygon){for(var K=d-1,F=0;F<d;F++)K=this.OffsetPoint(F,K,P.m_jointype);this.m_destPolys.push(this.m_destPoly)}else if(P.m_endtype===l.EndType.etClosedLine){for(var K=d-1,F=0;F<d;F++)K=this.OffsetPoint(F,K,P.m_jointype);this.m_destPolys.push(this.m_destPoly),this.m_destPoly=new Array;for(var q=this.m_normals[d-1],F=d-1;F>0;F--)this.m_normals[F]=new l.DoublePoint2(-this.m_normals[F-1].X,-this.m_normals[F-1].Y);this.m_normals[0]=new l.DoublePoint2(-q.X,-q.Y),K=0;for(var F=d-1;F>=0;F--)K=this.OffsetPoint(F,K,P.m_jointype);this.m_destPolys.push(this.m_destPoly)}else{for(var K=0,F=1;F<d-1;++F)K=this.OffsetPoint(F,K,P.m_jointype);var j;if(P.m_endtype===l.EndType.etOpenButt){var F=d-1;j=new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[F].X+this.m_normals[F].X*f),l.ClipperOffset.Round(this.m_srcPoly[F].Y+this.m_normals[F].Y*f)),this.m_destPoly.push(j),j=new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[F].X-this.m_normals[F].X*f),l.ClipperOffset.Round(this.m_srcPoly[F].Y-this.m_normals[F].Y*f)),this.m_destPoly.push(j)}else{var F=d-1;K=d-2,this.m_sinA=0,this.m_normals[F]=new l.DoublePoint2(-this.m_normals[F].X,-this.m_normals[F].Y),P.m_endtype===l.EndType.etOpenSquare?this.DoSquare(F,K):this.DoRound(F,K)}for(var F=d-1;F>0;F--)this.m_normals[F]=new l.DoublePoint2(-this.m_normals[F-1].X,-this.m_normals[F-1].Y);this.m_normals[0]=new l.DoublePoint2(-this.m_normals[1].X,-this.m_normals[1].Y),K=d-1;for(var F=K-1;F>0;--F)K=this.OffsetPoint(F,K,P.m_jointype);P.m_endtype===l.EndType.etOpenButt?(j=new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[0].X-this.m_normals[0].X*f),l.ClipperOffset.Round(this.m_srcPoly[0].Y-this.m_normals[0].Y*f)),this.m_destPoly.push(j),j=new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[0].X+this.m_normals[0].X*f),l.ClipperOffset.Round(this.m_srcPoly[0].Y+this.m_normals[0].Y*f)),this.m_destPoly.push(j)):(K=1,this.m_sinA=0,P.m_endtype===l.EndType.etOpenSquare?this.DoSquare(0,1):this.DoRound(0,1)),this.m_destPolys.push(this.m_destPoly)}}}},l.ClipperOffset.prototype.Execute=function(){var f=arguments,m=f[0]instanceof l.PolyTree;if(m){var P=f[0],L=f[1];P.Clear(),this.FixOrientations(),this.DoOffset(L);var h=new l.Clipper(0);if(h.AddPaths(this.m_destPolys,l.PolyType.ptSubject,!0),L>0)h.Execute(l.ClipType.ctUnion,P,l.PolyFillType.pftPositive,l.PolyFillType.pftPositive);else{var d=l.Clipper.GetBounds(this.m_destPolys),v=new l.Path;if(v.push(new l.IntPoint2(d.left-10,d.bottom+10)),v.push(new l.IntPoint2(d.right+10,d.bottom+10)),v.push(new l.IntPoint2(d.right+10,d.top-10)),v.push(new l.IntPoint2(d.left-10,d.top-10)),h.AddPath(v,l.PolyType.ptSubject,!0),h.ReverseSolution=!0,h.Execute(l.ClipType.ctUnion,P,l.PolyFillType.pftNegative,l.PolyFillType.pftNegative),P.ChildCount()===1&&P.Childs()[0].ChildCount()>0){var x=P.Childs()[0];P.Childs()[0]=x.Childs()[0],P.Childs()[0].m_Parent=P;for(var F=1;F<x.ChildCount();F++)P.AddChild(x.Childs()[F])}else P.Clear()}}else{var P=f[0],L=f[1];l.Clear(P),this.FixOrientations(),this.DoOffset(L);var h=new l.Clipper(0);if(h.AddPaths(this.m_destPolys,l.PolyType.ptSubject,!0),L>0)h.Execute(l.ClipType.ctUnion,P,l.PolyFillType.pftPositive,l.PolyFillType.pftPositive);else{var d=l.Clipper.GetBounds(this.m_destPolys),v=new l.Path;v.push(new l.IntPoint2(d.left-10,d.bottom+10)),v.push(new l.IntPoint2(d.right+10,d.bottom+10)),v.push(new l.IntPoint2(d.right+10,d.top-10)),v.push(new l.IntPoint2(d.left-10,d.top-10)),h.AddPath(v,l.PolyType.ptSubject,!0),h.ReverseSolution=!0,h.Execute(l.ClipType.ctUnion,P,l.PolyFillType.pftNegative,l.PolyFillType.pftNegative),P.length>0&&P.splice(0,1)}}},l.ClipperOffset.prototype.OffsetPoint=function(f,m,P){if(this.m_sinA=this.m_normals[m].X*this.m_normals[f].Y-this.m_normals[f].X*this.m_normals[m].Y,Math.abs(this.m_sinA*this.m_delta)<1){var L=this.m_normals[m].X*this.m_normals[f].X+this.m_normals[f].Y*this.m_normals[m].Y;if(L>0)return this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+this.m_normals[m].X*this.m_delta),l.ClipperOffset.Round(this.m_srcPoly[f].Y+this.m_normals[m].Y*this.m_delta))),m}else this.m_sinA>1?this.m_sinA=1:this.m_sinA<-1&&(this.m_sinA=-1);if(this.m_sinA*this.m_delta<0)this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+this.m_normals[m].X*this.m_delta),l.ClipperOffset.Round(this.m_srcPoly[f].Y+this.m_normals[m].Y*this.m_delta))),this.m_destPoly.push(new l.IntPoint1(this.m_srcPoly[f])),this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+this.m_normals[f].X*this.m_delta),l.ClipperOffset.Round(this.m_srcPoly[f].Y+this.m_normals[f].Y*this.m_delta)));else switch(P){case l.JoinType.jtMiter:{var h=1+(this.m_normals[f].X*this.m_normals[m].X+this.m_normals[f].Y*this.m_normals[m].Y);h>=this.m_miterLim?this.DoMiter(f,m,h):this.DoSquare(f,m);break}case l.JoinType.jtSquare:this.DoSquare(f,m);break;case l.JoinType.jtRound:this.DoRound(f,m);break}return m=f,m},l.ClipperOffset.prototype.DoSquare=function(f,m){var P=Math.tan(Math.atan2(this.m_sinA,this.m_normals[m].X*this.m_normals[f].X+this.m_normals[m].Y*this.m_normals[f].Y)/4);this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+this.m_delta*(this.m_normals[m].X-this.m_normals[m].Y*P)),l.ClipperOffset.Round(this.m_srcPoly[f].Y+this.m_delta*(this.m_normals[m].Y+this.m_normals[m].X*P)))),this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+this.m_delta*(this.m_normals[f].X+this.m_normals[f].Y*P)),l.ClipperOffset.Round(this.m_srcPoly[f].Y+this.m_delta*(this.m_normals[f].Y-this.m_normals[f].X*P))))},l.ClipperOffset.prototype.DoMiter=function(f,m,P){var L=this.m_delta/P;this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+(this.m_normals[m].X+this.m_normals[f].X)*L),l.ClipperOffset.Round(this.m_srcPoly[f].Y+(this.m_normals[m].Y+this.m_normals[f].Y)*L)))},l.ClipperOffset.prototype.DoRound=function(f,m){for(var P=Math.atan2(this.m_sinA,this.m_normals[m].X*this.m_normals[f].X+this.m_normals[m].Y*this.m_normals[f].Y),L=Math.max(l.Cast_Int32(l.ClipperOffset.Round(this.m_StepsPerRad*Math.abs(P))),1),h=this.m_normals[m].X,d=this.m_normals[m].Y,v,x=0;x<L;++x)this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+h*this.m_delta),l.ClipperOffset.Round(this.m_srcPoly[f].Y+d*this.m_delta))),v=h,h=h*this.m_cos-this.m_sin*d,d=v*this.m_sin+d*this.m_cos;this.m_destPoly.push(new l.IntPoint2(l.ClipperOffset.Round(this.m_srcPoly[f].X+this.m_normals[f].X*this.m_delta),l.ClipperOffset.Round(this.m_srcPoly[f].Y+this.m_normals[f].Y*this.m_delta)))},l.Error=function(f){try{throw new Error(f)}catch(m){console.log(m.message)}},l.JS={},l.JS.AreaOfPolygon=function(f,m){return m||(m=1),l.Clipper.Area(f)/(m*m)},l.JS.AreaOfPolygons=function(f,m){m||(m=1);for(var P=0,L=0;L<f.length;L++)P+=l.Clipper.Area(f[L]);return P/(m*m)},l.JS.BoundsOfPath=function(f,m){return l.JS.BoundsOfPaths([f],m)},l.JS.BoundsOfPaths=function(f,m){m||(m=1);var P=l.Clipper.GetBounds(f);return P.left/=m,P.bottom/=m,P.right/=m,P.top/=m,P},l.JS.Clean=function(L,m){if(!(L instanceof Array))return[];var P=L[0]instanceof Array,L=l.JS.Clone(L);if(typeof m!="number"||m===null)return l.Error("Delta is not a number in Clean()."),L;if(L.length===0||L.length===1&&L[0].length===0||m<0)return L;P||(L=[L]);for(var h=L.length,d,v,x,F,Y,K,q,j=[],rA=0;rA<h;rA++)if(v=L[rA],d=v.length,d!==0){if(d<3){x=v,j.push(x);continue}for(x=v,F=m*m,Y=v[0],K=1,q=1;q<d;q++)(v[q].X-Y.X)*(v[q].X-Y.X)+(v[q].Y-Y.Y)*(v[q].Y-Y.Y)<=F||(x[K]=v[q],Y=v[q],K++);Y=v[K-1],(v[0].X-Y.X)*(v[0].X-Y.X)+(v[0].Y-Y.Y)*(v[0].Y-Y.Y)<=F&&K--,K<d&&x.splice(K,d-K),x.length&&j.push(x)}return!P&&j.length?j=j[0]:!P&&j.length===0?j=[]:P&&j.length===0&&(j=[[]]),j},l.JS.Clone=function(f){if(!(f instanceof Array))return[];if(f.length===0)return[];if(f.length===1&&f[0].length===0)return[[]];var m=f[0]instanceof Array;m||(f=[f]);var P=f.length,L,h,d,v,x=new Array(P);for(h=0;h<P;h++){for(L=f[h].length,v=new Array(L),d=0;d<L;d++)v[d]={X:f[h][d].X,Y:f[h][d].Y};x[h]=v}return m||(x=x[0]),x},l.JS.Lighten=function(f,m){if(!(f instanceof Array))return[];if(typeof m!="number"||m===null)return l.Error("Tol is not a number in Lighten()."),l.JS.Clone(f);if(f.length===0||f.length===1&&f[0].length===0||m<0)return l.JS.Clone(f);var P=f[0]instanceof Array;P||(f=[f]);var L,h,d,v,x,F,Y,K,q,j,rA,gA,cA,uA,fA,pA,MA,vA=f.length,TA=m*m,SA=[];for(L=0;L<vA;L++)if(d=f[L],F=d.length,F!==0){for(v=0;v<1e6;v++){for(x=[],F=d.length,d[F-1].X!==d[0].X||d[F-1].Y!==d[0].Y?(gA=1,d.push({X:d[0].X,Y:d[0].Y}),F=d.length):gA=0,rA=[],h=0;h<F-2;h++)Y=d[h],q=d[h+1],K=d[h+2],pA=Y.X,MA=Y.Y,cA=K.X-pA,uA=K.Y-MA,(cA!==0||uA!==0)&&(fA=((q.X-pA)*cA+(q.Y-MA)*uA)/(cA*cA+uA*uA),fA>1?(pA=K.X,MA=K.Y):fA>0&&(pA+=cA*fA,MA+=uA*fA)),cA=q.X-pA,uA=q.Y-MA,j=cA*cA+uA*uA,j<=TA&&(rA[h+1]=1,h++);for(x.push({X:d[0].X,Y:d[0].Y}),h=1;h<F-1;h++)rA[h]||x.push({X:d[h].X,Y:d[h].Y});if(x.push({X:d[F-1].X,Y:d[F-1].Y}),gA&&d.pop(),rA.length)d=x;else break}F=x.length,x[F-1].X===x[0].X&&x[F-1].Y===x[0].Y&&x.pop(),x.length>2&&SA.push(x)}return P||(SA=SA[0]),typeof SA>"u"&&(SA=[]),SA},l.JS.PerimeterOfPath=function(f,m,P){if(typeof f>"u")return 0;var L=Math.sqrt,h=0,d,v,x=0,F=0,Y=0,K=0,q=f.length;if(q<2)return 0;for(m&&(f[q]=f[0],q++);--q;)d=f[q],x=d.X,F=d.Y,v=f[q-1],Y=v.X,K=v.Y,h+=L((x-Y)*(x-Y)+(F-K)*(F-K));return m&&f.pop(),h/P},l.JS.PerimeterOfPaths=function(f,m,P){P||(P=1);for(var L=0,h=0;h<f.length;h++)L+=l.JS.PerimeterOfPath(f[h],m,P);return L},l.JS.ScaleDownPath=function(f,m){var P,L;for(m||(m=1),P=f.length;P--;)L=f[P],L.X=L.X/m,L.Y=L.Y/m},l.JS.ScaleDownPaths=function(f,m){var P,L,h;for(m||(m=1),P=f.length;P--;)for(L=f[P].length;L--;)h=f[P][L],h.X=h.X/m,h.Y=h.Y/m},l.JS.ScaleUpPath=function(f,m){var P,L,h=Math.round;for(m||(m=1),P=f.length;P--;)L=f[P],L.X=h(L.X*m),L.Y=h(L.Y*m)},l.JS.ScaleUpPaths=function(f,m){var P,L,h,d=Math.round;for(m||(m=1),P=f.length;P--;)for(L=f[P].length;L--;)h=f[P][L],h.X=d(h.X*m),h.Y=d(h.Y*m)},l.ExPolygons=function(){return[]},l.ExPolygon=function(){this.outer=null,this.holes=null},l.JS.AddOuterPolyNodeToExPolygons=function(f,m){var P=new l.ExPolygon;P.outer=f.Contour();var L=f.Childs(),h=L.length;P.holes=new Array(h);var d,v,x,F,Y,K;for(x=0;x<h;x++)for(d=L[x],P.holes[x]=d.Contour(),F=0,Y=d.Childs(),K=Y.length;F<K;F++)v=Y[F],l.JS.AddOuterPolyNodeToExPolygons(v,m);m.push(P)},l.JS.ExPolygonsToPaths=function(f){var m,P,L,h,d=new l.Paths;for(m=0,L=f.length;m<L;m++)for(d.push(f[m].outer),P=0,h=f[m].holes.length;P<h;P++)d.push(f[m].holes[P]);return d},l.JS.PolyTreeToExPolygons=function(f){var m=new l.ExPolygons,P,L,h,d;for(L=0,h=f.Childs(),d=h.length;L<d;L++)P=h[L],l.JS.AddOuterPolyNodeToExPolygons(P,m);return m}})();const clipperlib=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));class MeshAssist{static getEdgeNeighbourMap(t){const e=new Map,n=new Map,s=Math.max(...t);for(let r=0;r<t.length;r+=3)for(let i=0;i<3;i++){const o=r+i,g=t[o],a=t[r+(i+1)%3],I=a*s+g,c=n.get(I);c===void 0?n.set(g*s+a,o):(n.delete(I),e.set(o,c),e.set(c,o))}return e}static pickNeighbourFaces(t,e,n,s,r){const i=r||MeshAssist.getEdgeNeighbourMap(t),o=new Set(n);for(;n.length>0;){const g=n.pop();for(let a=0;a<3;a++){const I=i.get(g+a);if(I===void 0)continue;const c=I-I%3;o.has(c)||!s(c)||(e.push(t[c],t[c+1],t[c+2]),n.push(c),o.add(c))}}return o}static getLoop2ds(t,e,n){const s=new Set(e.keys());for(const M of e.values())for(const N of M)s.add(N);const r=Array.from(s).map(M=>{const N=M*3;return{x:t.vertices[N],y:t.vertices[N+1],z:t.vertices[N+2],id:M}});r.sort((M,N)=>M.x!==N.x?M.x-N.x:M.y!==N.y?M.y-N.y:M.z!==N.z?M.z-N.z:M.id-N.id);const i=new Map;for(let M=0;M<r.length;M++){const N=r[M];if(!i.has(N.id))for(let S=M+1;S<r.length;S++){const R=r[S];if(R.x-N.x>Tol.LENGTH)break;new exports.Vec3(N).equals(R,Tol.LENGTH)&&i.set(R.id,N.id)}}const o=Array.from(e.entries());for(const[M,N]of o){for(let R=0;R<N.length;R++){const U=i.get(N[R]);U!==void 0&&(N[R]=U)}const S=i.get(M);if(S!==void 0){e.delete(M);const R=e.get(S);R?R.push(...N):e.set(S,N)}}const g=[],a=n.getDz(),I=new Set(e.keys());for(const M of e.values())for(const N of M)I.delete(N);for(;e.size>0;){let M;I.size>0?(M=I.keys().next().value,e.get(M)?.length===1&&I.delete(M)):M=e.keys().next().value;const N=a.getPerpendicular(),S=[M];for(;;){const R=e.get(M);if(!R)break;if(R.length===1)e.delete(M),M=R[0];else{const U=new exports.Vec3(t.vertices[M*3],t.vertices[M*3+1],t.vertices[M*3+2]);N.reverse();const b=R.map(O=>{const H=O*3,z=U.subtracted({x:t.vertices[H],y:t.vertices[H+1],z:t.vertices[H+2]});return N.angleTo(z,a)});let G=0;for(let O=1;O<b.length;O++)b[O]>b[G]&&(G=O);M=R[G],R.splice(G,1)}if(M===S[0])break;S.push(M)}g.push(S)}const c=Tol.CLIPPER_SCALE,E=g.map(M=>M.map(N=>{const S=N*3,R=n.getLocalPtAt({x:t.vertices[S],y:t.vertices[S+1],z:t.vertices[S+2]});return new(void 0)(R.x,R.y)}));(void 0).ScaleUpPaths(E,c);const u=new(void 0);u.AddPaths(E,(void 0).ptSubject,!0);const Q=new(void 0);u.Execute((void 0).ctUnion,Q,(void 0).pftEvenOdd,(void 0).pftEvenOdd);const p=[],w=Q.Childs(),y=M=>({x:M.X/c,y:M.Y/c});for(;w.length>0;){const M=w.pop(),N=[M.Contour().map(y)];for(const S of M.Childs())N.push(S.Contour().map(y)),w.push(...S.Childs());p.push(N)}return p}}class DiscreteRefiner{static refine(t,e,n=DiscreteParam.NORMAL){return new DiscreteRefiner(t,e,n)._execute()}constructor(t,e,n=DiscreteParam.NORMAL){this.surface=t,this.uvs=e.vertices,this.faces=e.faces,this.params=n,this.pts=this.uvs.map(s=>t.getPtAt(s))}_execute(){this._init(),this._remesh(this.faces.map((n,s)=>s));for(let n=0;n<this.faces.length;n++)this._enQueue(n);for(;this._queue.size()>0&&this.faces.length<this.params.maxFaceletCount*3;)this._dequeue();const t=this.faces,e=new Array(t.length/3);for(let n=0;n<t.length;n+=3)e[n/3]=[t[n],t[n+1],t[n+2]];return{vertices:this.pts.map(n=>n.data),faces:e,uvs:this.uvs.map(n=>[n.x,n.y]),normals:this.uvs.map(n=>this.surface.getNormAt(n).data)}}_init(){this._twinMap=MeshAssist.getEdgeNeighbourMap(this.faces),this._nodeMap=new Map,this._queue=new PriorityQueue((t,e)=>t.priority===e.priority?t.index-e.index:t.priority-e.priority)}_getNodeIndex(t){const e=this._twinMap.get(t);return e!==void 0&&e<t?e:t}_remesh(t){const e=new Set,n=i=>{const o=this._twinMap.get(i);o!==void 0&&e.add(Math.min(i,o))};for(const i of t)n(i);let s;{const i=this.surface,o=new Box2(this.uvs),g=[i.getDerivatives(o.min,1),i.getDerivatives({x:o.min.x,y:o.max.y},1),i.getDerivatives(o.max,1),i.getDerivatives({x:o.max.x,y:o.min.y},1)],a=i.getDerivatives(o.getCenter(),1);let I=0,c=0;for(const E of g)I+=E[1].getLength(),c+=E[2].getLength();I+=4*a[1].getLength(),c+=4*a[2].getLength(),s=c/I}let r=0;for(;e.size>0;){if(r++>1e4)throw new Error("dead loop");const i=e.keys().next().value;e.delete(i);const o=i%3,g=i-o,a=g+(o+1)%3,I=g+(o+2)%3,c=this._twinMap.get(i),E=c%3,u=c-E+(E+1)%3,Q=c-E+(E+2)%3,p=this.faces[i],w=this.faces[a],y=this.faces[I],M=this.faces[Q],N=[p,M,w,y].map(dA=>{const PA=this.uvs[dA];return{x:PA.x,y:PA.y*s}}),S=new Array(4);for(let dA=0;dA<4;dA++)S[dA]=new exports.Vec2(N[dA],N[(dA+1)%4]).normalize();const R=new exports.Vec2(N[0],N[2]).normalize(),U=new exports.Vec2(N[1],N[3]).normalize(),b={x:-U.y,y:U.x};if(!(S[0].dot(b)*S[2].dot(b)<0))continue;const O=Math.min(...S.map(dA=>Math.abs(dA.cross(R)))),H=Math.min(...S.map(dA=>Math.abs(dA.cross(U)))),z=O/H,tA=(dA,PA)=>{const yA=new exports.Vec2(this.uvs[dA]).midTo(this.uvs[PA]),LA=this.surface.getPtAt(yA).subtracted(this.pts[dA]),BA=this.pts[PA].subtracted(this.pts[dA]).normalize();return LA.cross(BA).getLength()},nA=tA(p,w),iA=tA(y,M)/nA,W=z*iA<1,oA=this._twinMap.get(a),hA=this._twinMap.get(I);if(W||oA===void 0&&hA===void 0){this.faces[i]=M,this.faces[c]=y,hA!==void 0?(this._twinMap.set(hA,c),this._twinMap.set(c,hA)):this._twinMap.delete(c);const dA=this._twinMap.get(Q);dA!==void 0?(this._twinMap.set(dA,i),this._twinMap.set(i,dA)):this._twinMap.delete(i),this._twinMap.set(I,Q),this._twinMap.set(Q,I),hA!==void 0&&(e.delete(Math.min(I,hA)),e.add(Math.min(c,hA))),dA!==void 0&&(e.delete(Math.min(Q,dA)),e.add(Math.min(i,dA))),n(a),n(u)}}}_enQueue(t){const e=this._getNodeIndex(t);if(this._nodeMap.has(e))return;const n=t%3,r=t-n+(n+1)%3,i=this.faces[t],o=this.faces[r],g=new exports.Vec2(this.uvs[i]).midTo(this.uvs[o]),a=this.surface.getPtAt(g),I=this.surface.getNormAt(g),c=a.subtracted(this.pts[i]),E=this.pts[o].subtracted(a),Q=c.cross(E).cross(I).getSqLength()/(this.params.crossEps*this.params.crossEps),p=this.surface.getNormAt(this.uvs[i]),w=this.surface.getNormAt(this.uvs[o]),M=p.angle(w)/this.params.tolerance.angleEps/2,N=Math.max(Q,M);if(N>1){const S={priority:N,index:e,uv:g,pt:a};this._nodeMap.set(e,S),this._queue.enq(S)}}_dequeue(){const t=this._queue.deq();this._nodeMap.delete(t.index);const e=t.index,n=this._twinMap.get(e);this.uvs.push(t.uv),this.pts.push(t.pt);const s=[],r=this._splitCoedge(e,this.uvs.length-1,s);if(n!==void 0){const i=this._splitCoedge(n,this.uvs.length-1,s);this._twinMap.set(r,n),this._twinMap.set(n,r),this._twinMap.set(i,e),this._twinMap.set(e,i)}s.forEach(i=>this._enQueue(i))}_splitCoedge(t,e,n){const s=t%3,r=t-s,i=r+(s+1)%3,o=r+(s+2)%3,g=this.faces[i],a=this.faces[o];this.faces[i]=e,this.faces.push(e,g,a);const I=this.faces.length-3,c=this._nodeMap.get(i);if(c){this._nodeMap.delete(i);const u=this._twinMap.get(i),Q=u!==void 0?u:I+1;c.index=Q,this._nodeMap.set(Q,c)}const E=this._twinMap.get(i);return E!==void 0?(this._twinMap.set(I+1,E),this._twinMap.set(E,I+1)):this._twinMap.delete(I+1),this._twinMap.set(i,I+2),this._twinMap.set(I+2,i),n.push(t,i,I),I}}class ArrayUtil{static binarySearch(t,e){let n=0,s=t.length-1;for(;s>n+1;){const r=Math.floor((n+s)/2);t[r]>e?s=r:n=r}for(;n>0&&t[n-1]===e;)n--;return n}}class Polyline{constructor(t,e){MathAssert.assert(t.length===e.length,"控制顶点与参数个数不同"),this._points=t,this._ts=e}get ts(){return this._ts}get points(){return this._points}getPtAt(t){const e=ArrayUtil.binarySearch(this._ts,t),n=this._ts[e],s=this._ts[e+1],r=(t-n)/(s-n);return this._getInterpolator()(this._points[e],this._points[e+1],r)}}class PolylineFunction extends Polyline{_getInterpolator(){return(t,e,n)=>t+(e-t)*n}}class UvUtil{static{this._TEST_OUTPUT=!1}static logCurveLoops(t,e){e&&console.log(`${e}:`),t.forEach(n=>{console.log("crvs: "),n.forEach(s=>console.log("".concat(...s.map(r=>`[${r.x.toFixed(2)}, ${r.y.toFixed(2)}] `))))})}static logConnectedLoops(t,e){e&&console.log(`${e}:`);for(const n of t)console.log("".concat(...n.map(s=>`[${s.x.toFixed(2)}, ${s.y.toFixed(2)}] `)))}static unifyUvForCurvePts(t,e,n){const s=t.getDomainU();if(s instanceof PeriodInterval){const i=s.period;if(e.length>2){let o=!0;for(;o;){let g=0,a=0;for(;g<e.length-2;g++){const I=e[g+1].x-e[g].x,c=Math.abs(e[g+2].x-e[g+1].x);if(Math.abs(I)>i/2&&Math.abs(I)>c*2){a=I<0?1:-1;break}}if(a===0){const I=e[g+1].x-e[g].x,c=Math.abs(e[g].x-e[g-1].x);Math.abs(I)>i/2&&Math.abs(I)>c*2?a=I<0?1:-1:g++}if(o=a!==0,a!==0)for(a>0&&g++;g>=0&&g<e.length;)e[g].x+=i,g+=a}}if(Math.min(e[0].x,e[e.length-1].x)>i-Tol.NUMBER)for(const o of e)o.x-=i;else if(Math.max(e[0].x,e[e.length-1].x)<Tol.NUMBER)for(const o of e)o.x+=i}const r=t.getDomainV();if(r instanceof PeriodInterval){const i=r.period;if(e.length>2){let o=!0;for(;o;){let g=0,a=0;for(;g<e.length-2;g++){const I=e[g+1].y-e[g].y,c=Math.abs(e[g+2].y-e[g+1].y);if(Math.abs(I)>i/2&&Math.abs(I)>c*2){a=I<0?1:-1;break}}if(a===0){const I=e[g+1].y-e[g].y,c=Math.abs(e[g].y-e[g-1].y);Math.abs(I)>i/2&&Math.abs(I)>c*2?a=I<0?1:-1:g++}if(o=a!==0,a!==0)for(a>0&&g++;g>=0&&g<e.length;)e[g].y+=i,g+=a}}if(Math.min(e[0].y,e[e.length-1].y)>i-Tol.NUMBER)for(const o of e)o.y-=i;else if(Math.max(e[0].y,e[e.length-1].y)<Tol.NUMBER)for(const o of e)o.y+=i}}static unifyUvBetweenCurves(t,e,n,s){const r=UvUtil.getPoleVs(t),{y:i}=n,o=UvUtil._getUPeriod(t);if(o>0){UvUtil._TEST_OUTPUT&&UvUtil.logCurveLoops(e,"P0 PCurveLoops");const a=o,I=a/2;e.forEach(c=>{let E=c[0][0].x,u=0;c.forEach(Q=>{let p=!1;if(Q.length===2){const w=UvUtil._getPoleIndex(Q[0].y,r,i),y=UvUtil._getPoleIndex(Q[1].y,r,i);if(w>=0&&w===y&&(p=!0,s)){const M=s(Q[0],Q[1]);Q.splice(1,0,...M)}}for(let w=0;w<Q.length;w++){const y=Q[w];let M=y.x-E;if(!(p&&w>0)){if(M>I)for(;M>I;)M-=a,u-=a;else if(M<-I)for(;M<-I;)M+=a,u+=a}E=y.x,y.x+=u}})}),UvUtil._TEST_OUTPUT&&UvUtil.logCurveLoops(e,"P1 PCurveLoops")}const g=UvUtil._getVPeriod(t);if(g>0){const a=g,I=a/2;e.forEach(c=>{let E=c[0][0].y,u=0;c.forEach(Q=>{for(const p of Q){let w=p.y-E;if(w>I)for(;w>I;)w-=a,u-=a;else if(w<-I)for(;w<-I;)w+=a,u+=a;E=p.y,p.y+=u}})})}}static unifyUvBetweenLoops(t,e,n){const s=UvUtil.getPoleVs(t),{x:r,y:i}=n,o=UvUtil._getUPeriod(t);if(o>0){UvUtil._TEST_OUTPUT&&UvUtil.logConnectedLoops(e,"P2 Combined");const a=e[0],I=o;for(let c=1;c<e.length;c++){const E=e[c],u=E.find(U=>UvUtil._getPoleIndex(U.y,s,i)<0);if(!u)continue;const Q=u.x,p=Q-I/2,w=[];let y=a[a.length-1],M=PeriodInterval.RegularizeParam(y.x-p)-I/2;a.forEach(U=>{const b=PeriodInterval.RegularizeParam(U.x-p)-I/2;if(M>r&&Math.abs(b)<r)w.push(U);else if(M>r&&b<0&&M-b<I/2){const G=1/(1+Math.abs(b/M));w.push(UvUtil._interpolated(y,U,G))}y=U,M=b});const N=u.y,S=w.reduce((U,b)=>b.y>N&&b.y<U.y?b:U,new exports.Vec2(0,CONST.MODEL_MAX_LENGTH)),R=Math.round((S.x-Q)/I)*I;E.forEach(U=>{U.x+=R})}UvUtil._TEST_OUTPUT&&UvUtil.logConnectedLoops(e,"P3 Adjusted")}const g=UvUtil._getVPeriod(t);if(g>0){const a=e[0],I=g;for(let c=1;c<e.length;c++){const E=e[c],u=E[0].y,Q=u-I/2,p=[];let w=a[a.length-1],y=PeriodInterval.RegularizeParam(w.y-Q)-I/2;a.forEach(R=>{const U=PeriodInterval.RegularizeParam(R.y-Q)-I/2;if(y>i&&Math.abs(U)<i)p.push(R);else if(y>i&&U<0&&y-U<I/2){const b=1/(1+Math.abs(U/y));p.push(UvUtil._interpolated(w,R,b))}w=R,y=U});const M=E[0].x,N=p.reduce((R,U)=>U.x>M&&U.x<R.x?R:U,new exports.Vec2(CONST.MODEL_MAX_LENGTH,0)),S=Math.round((N.y-u)/I)*I;E.forEach(R=>{R.y+=S})}}}static connectUvCurves(t,e){return t.map(n=>{for(let o=0;o<n.length;o++){const g=n[o],a=n[(o+1)%n.length],I=a[a.length-1],c=a[0],E=g[g.length-1];new exports.Vec2(I).distanceTo(E)<new exports.Vec2(c).distanceTo(E)&&a.reverse()}for(let o=0;o<n.length;o++){const g=n[o],a=n[(o+1)%n.length],I=g[g.length-1],c=a[0];UvUtil.areEqual(I,c,e)&&(UvUtil._interpolate(a[0],I,.5),g.pop())}const s=[],r=n[n.length-1];let i=r[r.length-1];for(const o of n)if(o.length!==0){for(let g=0;g<o.length;g++)if(!UvUtil.areEqual(i,o[g],e)){for(let a=g;a<o.length;a++)s.push(o[a]);break}i=o[o.length-1]}return s})}static areEqual(t,e,n){const s=(t.x-e.x)/n.x,r=(t.y-e.y)/n.y;return s*s+r*r<1}static getPoleVs(t){return[]}static getSurfaceUvEps(t,e){let n=e.lengthEps,s=e.lengthEps;return t.isCylinder()&&(n=e.angleEps),{x:n,y:s}}static getCurveEps(t,e){const n=t;return n.isArc()?e.angleEps:n.isNurbsCurve()?e.numberEps:e.lengthEps}static parseUvInArcLength(t,e,n=!0){const s=n?t.map(O=>O.slice()):t;if(e.isPlane())return s;const r=new Interval(0,0),i=new Interval(0,0);for(const[O,H]of t)r.expandByPt(O),i.expandByPt(H);const o=e.getDomainU(),g=e.getDomainV(),a=o instanceof PeriodInterval?[o.min,o.max]:r.toArray(),I=g instanceof PeriodInterval?[g.min,g.max]:i.toArray(),c=O=>e.getPtAt({x:O,y:0}),E=O=>e.getIsoCurve(0,!0).getTangentAt(O),u=O=>e.getPtAt({x:0,y:O}),Q=O=>e.getIsoCurve(0,!1).getTangentAt(O),p=DiscreteUtil.discreteGeneralCurve(c,E,a,[],DiscreteParam.NORMAL),w=DiscreteUtil.discreteGeneralCurve(u,Q,I,[],DiscreteParam.NORMAL),y=p.map(O=>O.param),M=w.map(O=>O.param),N=[0],S=[0];for(let O=1;O<p.length;O++)N.push(N[O-1]+p[O-1].point.distanceTo(p[O].point));for(let O=1;O<w.length;O++)S.push(S[O-1]+w[O-1].point.distanceTo(w[O].point));const R=new PolylineFunction(N,y),U=new PolylineFunction(S,M),b=-R.getPtAt(0),G=-U.getPtAt(0);for(const O of s)O[0]=R.getPtAt(O[0])+b,O[1]=U.getPtAt(O[1])+G;return s}static _getPoleIndex(t,e,n){for(let s=0;s<e.length;s++)if(Math.abs(t-e[s])<n)return s;return-1}static _interpolated(t,e,n=.5){return this._interpolate({x:t.x,y:t.y},e,n)}static _interpolate(t,e,n=.5){return t.x+=(e.x-t.x)*n,t.y+=(e.y-e.y)*n,t}static _getUPeriod(t){return t.isUPeriodic()?t.getDomainU().period:0}static _getVPeriod(t){return t.isVPeriodic()?t.getDomainV().period:0}}var CurvesPJType=(l=>(l[l.NOT_INTERSECT=0]="NOT_INTERSECT",l[l.OVERLAP=10]="OVERLAP",l[l.TOTALLY_OVERLAP=11]="TOTALLY_OVERLAP",l[l.INTERSECT_IN=21]="INTERSECT_IN",l[l.INTERSECT_ON=22]="INTERSECT_ON",l))(CurvesPJType||{}),PtLoopPJType=(l=>(l[l.OUT=0]="OUT",l[l.ONEDGE=-1]="ONEDGE",l[l.ONVERTEX=-2]="ONVERTEX",l[l.IN=1]="IN",l))(PtLoopPJType||{}),LoopsPJType=(l=>(l.INTERSECT="x",l.EQUAL="eq",l.IN="in",l.CONTAIN="ct",l.OUT="out",l))(LoopsPJType||{});class SegmentTree{constructor(t,e=4){this._nodes=[];const n=[];t.forEach(s=>{for(let r=0;r<s.length;r++){const i=s[r],o=s[(r+1)%s.length],[g,a]=i.y<o.y?[i.y,o.y]:[o.y,i.y];n.push({stPoint:i,edPoint:o,min:g,max:a})}}),n.sort((s,r)=>s.min===r.min?s.max-r.max:s.min-r.min),this._nodes.push(n);for(let s=n;s.length>1;){const r=Math.ceil(s.length/e),i=new Array(r);for(let o=0;o<r;o++){const g=o*e,a=o===r-1?s.length:g+e;let I=s[g].max;for(let E=g+1;E<a;E++)s[E].max>I&&(I=s[E].max);const c=s[g].min;i[o]={min:c,max:I,st:g,ed:a}}this._nodes.push(i),s=i}}findSegments(t,e=Tol.LENGTH){const n=[{layer:this._nodes.length-1,index:0}],s=[],r=t+e,i=t-e;for(;n.length>0;){const o=n.pop(),g=this._nodes[o.layer][o.index],a=this._nodes[o.layer-1];for(let I=g.st;I<g.ed;I++){const c=a[I];c.min<r&&c.max>i&&(c.stPoint?s.push(c):n.push({layer:o.layer-1,index:I}))}}return s}}class PtPolygonPositionJudger{constructor(t){this._tree=new SegmentTree(t)}judge(t,e=Tol.LENGTH){const n=this._tree.findSegments(t.y,e);let s=0,r=!1;for(const i of n){const o=new exports.Vec2(t).subtract(i.stPoint);if(o.getSqLength()<e*e)return PtLoopPJType.ONVERTEX;const g=new exports.Vec2(i.edPoint).subtract(i.stPoint),a=g.getLength();g.multiply(1/a);const I=o.dot(g),c=o.dot({x:-g.y,y:g.x});if(Math.abs(c)<e&&I>0&&I<a){r=!0;continue}if(Math.abs(o.y)<e)continue;I*g.x+i.stPoint.x>t.x&&s++}return r?PtLoopPJType.ONEDGE:s%2===0?PtLoopPJType.OUT:PtLoopPJType.IN}}var quadtree_min$2={exports:{}},quadtree_min$1=quadtree_min$2.exports,hasRequiredQuadtree_min;function requireQuadtree_min(){return hasRequiredQuadtree_min||(hasRequiredQuadtree_min=1,(function(l,t){(function(e,n){l.exports?l.exports=n():e.Quadtree=n()})(quadtree_min$1,function(){return(function(){function e(c){var E,u;if(this.x=c.x,this.y=c.y,this.width=c.width,this.height=c.height,this.maxElements=c.maxElements,this.width==null||this.height==null)throw new Error("Missing quadtree dimensions.");if(this.x==null&&(this.x=0),this.y==null&&(this.y=0),this.maxElements==null&&(this.maxElements=1),this.contents=[],this.oversized=[],this.size=0,this.width<1||this.height<1)throw new Error("Dimensions must be positive integers.");if(!Number.isInteger(this.x)||!Number.isInteger(this.y))throw new Error("Coordinates must be integers");if(this.maxElements<1)throw new Error("The maximum number of elements before a split must be a positive integer.");u=this,this.children={NW:{create:function(){return new e({x:u.x,y:u.y,width:Math.max(Math.floor(u.width/2),1),height:Math.max(Math.floor(u.height/2),1),maxElements:u.maxElements})},tree:null},NE:{create:function(){return new e({x:u.x+Math.max(Math.floor(u.width/2),1),y:u.y,width:Math.ceil(u.width/2),height:Math.max(Math.floor(u.height/2),1),maxElements:u.maxElements})},tree:null},SW:{create:function(){return new e({x:u.x,y:u.y+Math.max(Math.floor(u.height/2),1),width:Math.max(Math.floor(u.width/2),1),height:Math.ceil(u.height/2),maxElements:u.maxElements})},tree:null},SE:{create:function(){return new e({x:u.x+Math.max(Math.floor(u.width/2),1),y:u.y+Math.max(Math.floor(u.height/2),1),width:Math.ceil(u.width/2),height:Math.ceil(u.height/2),maxElements:u.maxElements})},tree:null}};for(E in this.children)this.children[E].get=function(){return this.tree!=null?this.tree:(this.tree=this.create(),this.tree)}}var n,s,r,i,o,g,a,I;return i=function(c){var E,u;return{x:Math.floor(((E=c.width)!=null?E:1)/2)+c.x,y:Math.floor(((u=c.height)!=null?u:1)/2)+c.y}},n=function(c,E){var u,Q,p,w;return!(c.x>=E.x+((u=E.width)!=null?u:1)||c.x+((Q=c.width)!=null?Q:1)<=E.x||c.y>=E.y+((p=E.height)!=null?p:1)||c.y+((w=c.height)!=null?w:1)<=E.y)},s=function(c,E){var u;return u=i(E),c.x<u.x?c.y<u.y?"NW":"SW":c.y<u.y?"NE":"SE"},I=function(c){if(typeof c!="object")throw new Error("Element must be an Object.");if(c.x==null||c.y==null)throw new Error("Coordinates properties are missing.");if(c?.width<0||c?.height<0)throw new Error("Width and height must be positive integers.")},g=function(c){var E,u,Q,p;return u=Math.max(Math.floor(c.width/2),1),Q=Math.ceil(c.width/2),p=Math.max(Math.floor(c.height/2),1),E=Math.ceil(c.height/2),{NW:{x:c.x,y:c.y,width:u,height:p},NE:{x:c.x+u,y:c.y,width:Q,height:p},SW:{x:c.x,y:c.y+p,width:u,height:E},SE:{x:c.x+u,y:c.y+p,width:Q,height:E}}},r=function(c,E){var u,Q,p,w;w=[],p=g(E);for(Q in p)u=p[Q],n(c,u)&&w.push(Q);return w},o=function(c,E){var u;return(u=function(Q){return c["_"+Q]=c[Q],Object.defineProperty(c,Q,{set:function(p){return E.remove(this,!0),this["_"+Q]=p,E.push(this)},get:function(){return this["_"+Q]},configurable:!0})})("x"),u("y"),u("width"),u("height")},a=function(c){var E;return(E=function(u){if(c["_"+u]!=null)return delete c[u],c[u]=c["_"+u],delete c["_"+u]})("x"),E("y"),E("width"),E("height")},e.prototype.clear=function(){var c,E;this.contents=[],this.oversized=[],this.size=0,E=[];for(c in this.children)E.push(this.children[c].tree=null);return E},e.prototype.push=function(c,E){return this.pushAll([c],E)},e.prototype.pushAll=function(c,E){var u,Q,p,w,y,M,N,S,R,U,b,G,O,H,z,tA,nA,IA,iA,W;for(b=0,H=c.length;b<H;b++)U=c[b],I(U),E&&o(U,this);for(N=[{tree:this,elements:c}];N.length>0;){for(W=(nA=N.shift()).tree,S={NW:null,NE:null,SW:null,SE:null},G=0,z=(M=nA.elements).length;G<z;G++)if(y=M[G],W.size++,(R=r(y,W)).length!==1||W.width===1||W.height===1)W.oversized.push(y);else if(W.size-W.oversized.length<=W.maxElements)W.contents.push(y);else{for(w=R[0],iA=W.children[w],S[w]==null&&(S[w]={tree:iA.get(),elements:[]}),S[w].elements.push(y),O=0,tA=(IA=W.contents).length;O<tA;O++)Q=IA[O],S[p=r(Q,W)[0]]==null&&(S[p]={tree:W.children[p].get(),elements:[]}),S[p].elements.push(Q);W.contents=[]}for(w in S)(u=S[w])!=null&&N.push(u)}return this},e.prototype.remove=function(c,E){var u,Q;return I(c),(u=this.oversized.indexOf(c))>-1?(this.oversized.splice(u,1),this.size--,E||a(c),!0):(u=this.contents.indexOf(c))>-1?(this.contents.splice(u,1),this.size--,E||a(c),!0):!((Q=this.children[s(c,this)]).tree==null||!Q.tree.remove(c,E)||(this.size--,Q.tree.size===0&&(Q.tree=null),0))},e.prototype.colliding=function(c,E){var u,Q,p,w,y,M,N,S,R,U,b,G,O,H;for(E==null&&(E=n),I(c),y=[],p=[this];p.length>0;){for(M=0,R=(G=(H=p.shift()).oversized).length;M<R;M++)(Q=G[M])!==c&&E(c,Q)&&y.push(Q);for(N=0,U=(O=H.contents).length;N<U;N++)(Q=O[N])!==c&&E(c,Q)&&y.push(Q);for((w=r(c,H)).length===0&&(w=[],c.x>=H.x+H.width&&w.push("NE"),c.y>=H.y+H.height&&w.push("SW"),w.length>0&&(w.length===1?w.push("SE"):w=["SE"])),S=0,b=w.length;S<b;S++)u=w[S],H.children[u].tree!=null&&p.push(H.children[u].tree)}return y},e.prototype.onCollision=function(c,E,u){var Q,p,w,y,M,N,S,R,U,b,G,O,H;for(u==null&&(u=n),I(c),w=[this];w.length>0;){for(M=0,R=(G=(H=w.shift()).oversized).length;M<R;M++)(p=G[M])!==c&&u(c,p)&&E(p);for(N=0,U=(O=H.contents).length;N<U;N++)(p=O[N])!==c&&u(c,p)&&E(p);for((y=r(c,H)).length===0&&(y=[],c.x>=H.x+H.width&&y.push("NE"),c.y>=H.y+H.height&&y.push("SW"),y.length>0&&(y.length===1?y.push("SE"):y=["SE"])),S=0,b=y.length;S<b;S++)Q=y[S],H.children[Q].tree!=null&&w.push(H.children[Q].tree)}return null},e.prototype.get=function(c){return this.where(c)},e.prototype.where=function(c){var E,u,Q,p,w,y,M,N,S,R,U,b,G;if(typeof c=="object"&&(c.x==null||c.y==null))return this.find(function(O){var H,z;H=!0;for(z in c)c[z]!==O[z]&&(H=!1);return H});for(I(c),p=[],Q=[this];Q.length>0;){for(w=0,N=(R=(G=Q.shift()).oversized).length;w<N;w++){u=R[w],E=!0;for(M in c)c[M]!==u[M]&&(E=!1);E&&p.push(u)}for(y=0,S=(U=G.contents).length;y<S;y++){u=U[y],E=!0;for(M in c)c[M]!==u[M]&&(E=!1);E&&p.push(u)}(b=G.children[s(c,G)]).tree!=null&&Q.push(b.tree)}return p},e.prototype.each=function(c){var E,u,Q,p,w,y,M,N,S,R;for(u=[this];u.length>0;){for(p=0,y=(N=(R=u.shift()).oversized).length;p<y;p++)Q=N[p],typeof c=="function"&&c(Q);for(w=0,M=(S=R.contents).length;w<M;w++)Q=S[w],typeof c=="function"&&c(Q);for(E in R.children)R.children[E].tree!=null&&u.push(R.children[E].tree)}return this},e.prototype.find=function(c){var E,u,Q,p,w,y,M,N,S,R,U;for(u=[this],p=[];u.length>0;){for(w=0,M=(S=(U=u.shift()).oversized).length;w<M;w++)Q=S[w],typeof c=="function"&&c(Q)&&p.push(Q);for(y=0,N=(R=U.contents).length;y<N;y++)Q=R[y],typeof c=="function"&&c(Q)&&p.push(Q);for(E in U.children)U.children[E].tree!=null&&u.push(U.children[E].tree)}return p},e.prototype.filter=function(c){var E;return(E=function(u){var Q,p,w,y,M,N,S,R,U,b,G;(p=new e({x:u.x,y:u.y,width:u.width,height:u.height,maxElements:u.maxElements})).size=0;for(Q in u.children)u.children[Q].tree!=null&&(p.children[Q].tree=E(u.children[Q].tree),p.size+=(R=(U=p.children[Q].tree)!=null?U.size:void 0)!=null?R:0);for(y=0,N=(b=u.oversized).length;y<N;y++)w=b[y],(c==null||typeof c=="function"&&c(w))&&p.oversized.push(w);for(M=0,S=(G=u.contents).length;M<S;M++)w=G[M],(c==null||typeof c=="function"&&c(w))&&p.contents.push(w);return p.size+=p.oversized.length+p.contents.length,p.size===0?null:p})(this)},e.prototype.reject=function(c){return this.filter(function(E){return!(typeof c=="function"&&c(E))})},e.prototype.visit=function(c){var E,u,Q;for(u=[this];u.length>0;){Q=u.shift(),c.bind(Q)();for(E in Q.children)Q.children[E].tree!=null&&u.push(Q.children[E].tree)}return this},e.prototype.pretty=function(){var c,E,u,Q,p,w,y;for(w="",u=function(M){var N,S,R;for(R="",N=S=M;S<=0?N<0:N>0;S<=0?++N:--N)R+=" ";return R},E=[{label:"ROOT",tree:this,level:0}];E.length>0;){w+=(Q=u((y=E.shift()).level))+"| "+y.label+`
176
+ `+Q+`| ------------
177
+ `,y.tree.oversized.length>0&&(w+=Q+`| * Oversized elements *
178
+ `+Q+"| "+y.tree.oversized+`
179
+ `),y.tree.contents.length>0&&(w+=Q+`| * Leaf content *
180
+ `+Q+"| "+y.tree.contents+`
181
+ `),p=!1;for(c in y.tree.children)y.tree.children[c].tree!=null&&(p=!0,E.unshift({label:c,tree:y.tree.children[c].tree,level:y.level+1}));p&&(w+=Q+`└──┐
182
+ `)}return w},e})()})})(quadtree_min$2)),quadtree_min$2.exports}var quadtree_minExports=requireQuadtree_min();const quadtree_min=getDefaultExportFromCjs(quadtree_minExports),Quadtree=_mergeNamespaces({__proto__:null,default:quadtree_min},[quadtree_minExports]),scale=1e6;function lToXY(l){return l.map(t=>({X:t.x,Y:t.y}))}function pToXY(l){return l.map(lToXY)}function buildQuadTree(l){const t=new Box2(l.flat()),e=t.getSize(),n=new Quadtree({x:Math.round(t.min.x)-50,y:Math.round(t.min.y)-50,width:e.x+100,height:e.y+100,maxElements:6});return l.forEach((s,r)=>{for(let i=0;i<s.length;i++){const o=[s[i],s[(i+1)%s.length]],g=new Box2(o),a=g.getSize();n.push({x:Math.round(g.min.x),y:Math.round(g.min.y),width:a.x,height:a.y,obj:o})}}),{quadtree:n,totalBox:t}}const tmpV=new exports.Vec2;function clip(l,t,e,n){const s=new Box2(n),r=s.getSize(),i={x:Math.round(s.min.x)-10,y:Math.round(s.min.y)-10,width:r.x+20,height:r.y+20};if(!l.colliding(i).length){const E=tmpV.copy(n[0]).interpolate(n[2],.31179),u={x:E.x,y:E.y,width:t.getSize().x*2,height:.1};let Q=!1;return Q=!!(l.colliding(u).length%2),Q?[JSON.parse(JSON.stringify(n))]:void 0}const g=new(void 0);g.AddPaths(e,(void 0).ptSubject,!0),g.AddPath(lToXY(n),(void 0).ptClip,!0);const a=[];return!g.Execute((void 0).ctIntersection,a,(void 0).pftNonZero,(void 0).pftNonZero)||!a.length?void 0:a.map(E=>E.map(u=>({x:u.X,y:u.Y})))}function ptToKey(l){return[l.x,l.y].join()}function mergeAndScale(l){const t=[],e=[],n=new Map;for(let s=0;s<l.length;s++){const r=l[s],i=new Map;for(let o=0;o<r.vertices.length;o++){const g=ptToKey(r.vertices[o]);let a=n.get(g);a===void 0&&(a=n.size,n.set(g,a),e.push(r.vertices[o])),i.set(o,a)}r.faces.forEach(o=>{const g=i.get(o);t.push(g)})}return e.forEach(s=>{s.x/=scale,s.y/=scale}),{vertices:e,faces:t}}function lessPts(l,t){if(t<2)return;const e=l.slice(0);l.splice(0);for(let n=0;n<e.length-1;n+=t)n%t===0&&l.push(e[n]);l.push(e[e.length-1])}function uniformGridDiscrete(l,t){const e=new Set,n=new Set,s=l.map(M=>M.map(N=>{const S=Math.round(N.x*scale),R=Math.round(N.y*scale);return e.add(S),n.add(R),{x:S,y:R}})),r=[...e].sort((M,N)=>M-N),i=[...n].sort((M,N)=>M-N),o=r.length/i.length,g=Math.sqrt(r.length*i.length/t/o),a=Math.round(g),I=Math.round(o*g);lessPts(r,I),lessPts(i,a);const{quadtree:c,totalBox:E}=buildQuadTree(s),u=[];for(let M=0;M<r.length;M++)for(let N=0;N<i.length;N++)u.push({x:r[M],y:i[N]});const Q=pToXY(s),p=[];for(let M=0;M<r.length-1;M++)for(let N=0;N<i.length-1;N++){const S=[];[M*i.length+N,(M+1)*i.length+N,(M+1)*i.length+N+1,M*i.length+N+1].forEach(U=>S.push(u[U]));const R=clip(c,E,Q,S);R&&p.push(R)}const w=p.map(M=>M.length===1&&M[0].length===4?{vertices:M[0],faces:[0,1,2,2,3,0]}:DiscreteUtil.tessVector2(M));return mergeAndScale(w)}function isDirectedCurve2d(l){return!!l.pCurve}class DiscreteSurface{static execute(t,e,n=!0,s=DiscreteParam.NORMAL,r=Tol.DEFAULT,i=[]){if(i.length>0&&!isDirectedCurve2d(e[0][0]))for(const a of e){const I=a;for(let c=0;c<I.length;c++){const E=I[c],u=[];for(const y of i)!y.equals(E.startPoint,r.lengthEps)&&!y.equals(E.endPoint,r.lengthEps)&&E.curve.containsPt(y,r.lengthEps)&&u.push(y);if(u.length===0)continue;const Q=u.map(y=>E.curve.getParamAt(y));Q.sort();const p=E.curve.split(Q),w=[];p.forEach(y=>w.push({curve:y,isSameDirection:E.isSameDirection,startPoint:y.getStartPt(),endPoint:y.getEndPt()})),I.splice(c,1,...w)}}const o=UvUtil.getSurfaceUvEps(t,r),g=DiscreteSurface._discreteSurfaceLoops(t,e,s,o);return this.dircreteFromLoopPts(t,g,n,s,o)}static dircreteFromLoopPts(t,e,n=!0,s=DiscreteParam.NORMAL,r){if(e.length===0||e[0].length<3)return{vertices:[],faces:[],normals:[],uvs:[]};let i;const o=t;try{if(o.isPlane()||o.isCylinder()){const g=DiscreteUtil.tessVector2(e);i=DiscreteSurface.mesh2dto3d(t,g)}else throw Error("暂时不支持的类型")}catch{const a=uniformGridDiscrete(e,s.maxFaceletCount);i=DiscreteSurface.mesh2dto3d(t,a)}return i.faces&&!n&&(i.faces.forEach(g=>{[g[0],g[1]]=[g[1],g[0]]}),i.normals.forEach(g=>{[g[0],g[1],g[2]]=[-g[0],-g[1],-g[2]]})),i}static simplePoints(t,e,n=DiscreteParam.NORMAL,s=Tol.DEFAULT){const r=UvUtil.getSurfaceUvEps(t,s),i=DiscreteSurface._discreteSurfaceLoops(t,e,n,r),o=i.flat();if(!(t.isPlane()||t.isCylinder())){const g=DiscreteSurface._getInnerPointHint(t,i,n),a=DiscreteSurface._getPointsInside(i,g,r);o.push(...a)}return o.map(g=>t.getPtAt(g))}static mesh2dto3d(t,e){const n=[];for(let s=0;s<e.faces.length;s+=3)n.push([e.faces[s],e.faces[s+1],e.faces[s+2]]);return{vertices:e.vertices.map(s=>t.getPtAt(s).toArray3()),faces:n,normals:e.vertices.map(s=>t.getNormAt(s).toArray3()),uvs:e.vertices.map(s=>[s.x,s.y])}}static _discreteSurfaceLoops(t,e,n,s){const r=e.map(a=>DiscreteSurface._getPCurvePoints(t,a,n,s)),i=[];let o;if(i.length>0){const a=[...i,...i.slice(1).map(I=>I+CONST.PI2)];o=(I,c)=>DiscreteSurface._getPoleDiscreteUvs(I,c,a,s.x)}UvUtil.unifyUvBetweenCurves(t,r,s,o);const g=UvUtil.connectUvCurves(r,s);return UvUtil.unifyUvBetweenLoops(t,g,s),g}static _getPCurvePoints(t,e,n,s){const r=new Map,i=[],o=e.map(g=>{if(isDirectedCurve2d(g)){let u=!1;if(!u&&g.pCurve&&g.curve&&(u=Util.isNearly0(g.curve.getLength())),u){const Q=g.pCurve.getRange().getLength()/n.tolerance.angleEps;return g.pCurve.discreteBySegmentCount(Q)}return DiscreteUtil.discreteCurve2dOnSurface(g.pCurve,t,n).uvs}if(g.discretePts&&g.discretePts.length>=2){const u=g.discretePts.map(Q=>t.getUVAt(Q));return UvUtil.unifyUvForCurvePts(t,u,s),i.length>0&&(i.find(Q=>Math.abs(u[0].y-Q)<s.y)!==void 0&&(u[0].x=u[1].x),i.find(Q=>Math.abs(u[u.length-1].y-Q)<s.y)!==void 0&&(u[u.length-1].x=u[u.length-2].x)),u}const a=DiscreteSurface._getSimplePCurve(t,g,Tol.DEFAULT);if(a){const u=DiscreteCurve.getSpecificParams(g.curve,n);return DiscreteUtil.discreteCurve2dOnSurface(a,t,u).uvs}const I=g;let c;I.curve.isLine3d()||I.curve.isNurbsCurve()&&I.curve.getControlPoints().length===2?c=[I.startPoint,I.endPoint]:(c=DiscreteUtil.discreteCurve3d(I.curve,n),(!c||c.length<=1)&&(c=[I.curve.getStartPt(),I.curve.getEndPt()]),I.isSameDirection||c.reverse());let E=[];return E=c.map(u=>t.getUVAt(u)),i.length>0&&(i.find(u=>Math.abs(E[0].y-u)<s.y)!==void 0&&(E[0].x=E[1].x),i.find(u=>Math.abs(E[E.length-1].y-u)<s.y)!==void 0&&(E[E.length-1].x=E[E.length-2].x)),E});if(r.size>0)for(let g=0;g<e.length;g++){const a=o[(g+1)%e.length][0],I=o[g];let E=I[I.length-1].sqDistanceTo(a);if(E>1e-8){const u=r.get(e[g]);if(!u)continue;for(let Q=1;Q<u.length;Q++){const p=u[Q],y=p[p.length-1].sqDistanceTo(a);y<E&&(E=y,o[g]=u[Q])}}}return o}static _getSimplePCurve(t,e,n){}static _getPoleDiscreteUvs(t,e,n,s){const r=(t.y+e.y)/2,i=(n[n.length-1]-n[0])/2,[o,g]=t.x<e.x?[t.x,e.x]:[e.x,t.x],a=Math.floor(o/i)*i,I=o-a,c=g-a;let E=0;for(;I>n[E]-s&&E<n.length;)E++;let u=E;for(;c>n[u]+s&&u<n.length;)u++;const Q=n.slice(E,u);return t.x>e.x&&Q.reverse(),Q.map(p=>({x:p,y:r}))}static _getInnerPointHint(t,e,n,s=!1){if(n.enableSurfaceRefiner&&n.ratioed(2),t.isPlane())return{us:[],vs:[]};const r=new Box2;for(const g of e)r.expandByPoint(...g);return new Interval(r.min.x,r.max.x),new Interval(r.min.y,r.max.y),{us:[],vs:[]}}static _getPointsInside(t,e,n){const s=new PtPolygonPositionJudger(t),r=[];for(const i of e.us)for(const o of e.vs){const g={x:i,y:o};s.judge(g,Math.max(n.x,n.y))===PtLoopPJType.IN&&r.push(g)}return r}}class DiscreteUtil{static{this._POLY2TRI_ANGLE_EPS=1e-10}static tessVector2(t){const e={vertices:[],faces:[]},n=t.map(i=>i.map(o=>{const g=new LibtessVertex(o,e.vertices.length);return e.vertices.push(o),g}));let s;try{s=tessTriangulate(n,[0,0,1])}catch{return MathAssert.warn(!0,"离散化错误",t),e}const r=i=>i.index!==void 0?i.index:(e.vertices.push(new exports.Vec2(i)),e.vertices.length-1);return e.faces=s.map(i=>r(i)),e}static tessByPoly2tri(t,e=[]){for(const E of t){let u=0;for(;u<E.length-2;){let Q=u+1;for(let p=u+2;p<E.length;p++){const w=new exports.Vec2(E[p-1]).subtract(E[u]),y=new exports.Vec2(E[p]).subtract(E[u]),M=w.angle(y);if(Math.abs(M)<DiscreteUtil._POLY2TRI_ANGLE_EPS)Q=p;else break}if(Q>u+1){const p=new exports.Vec2(E[Q]).subtract(E[u]).normalize(),w=new exports.Vec2(-p.y,p.x);for(let y=u+1;y<Q;y++){const M=new exports.Vec2(E[y]).subtract(E[u]);E[y]=new exports.Vec2(E[y]).subtract(w.multiplied(M.dot(w)))}}u=Q}}let n=0;const s=[],r=Tol.NUMBER,i=1/r,o=t.map(E=>E.map(u=>{const Q={x:Math.round(u.x*i)*r,y:Math.round(u.y*i)*r,id:n++};return s.push(Q),Q})),g=e.map(E=>{const u={x:E.x,y:E.y,id:n++};return s.push(u),u}),a=new poly2triExports.SweepContext(o[0]);a.addHoles(o.slice(1)),a.addPoints(g),a.triangulate();const I=a.getTriangles(),c=[];return I.forEach(E=>E.getPoints().forEach(u=>c.push(u.id))),{vertices:s,faces:c}}static discreteLine2d(t,e){const n=[],s=t.getRange(),r=Math.floor(s.getLength()/e);let i=t.getStartPt();for(let o=1;o<=r;o++){const g=t.getPtAt(s.min+e*o);n.push(new exports.Ln2(i,g)),i=g}return i.equals(t.getEndPt(),Tol.LENGTH)||n.push(new exports.Ln2(i,t.getEndPt())),n}static discreteCurve2d(t,e=DiscreteParam.NORMAL){return DiscreteCurve.execute(t,e).map(s=>s.point)}static discreteCurve3d(t,e=DiscreteParam.NORMAL){return DiscreteCurve.execute(t,e).map(s=>s.point)}static discreteCurve(t,e){return DiscreteCurve.execute(t,e)}static discreteCurve2dOnSurface(t,e,n=DiscreteParam.NORMAL){const s=new Map,r=u=>{const Q=t.getPtAt(u),p=e.getPtAt(Q);return s.set(p,Q),p},i=e.getDomainU(),o=e.getDomainV(),g=u=>{const Q=t.getPtAt(u),p=e.getPtAt(Q),w=t.getPtAt(u+1e-5);if(i.containsPt(w.x)&&o.containsPt(w.y))return e.getPtAt(w).subtracted(p).multiplied(1e5);const y=t.getPtAt(u-1e-5);return e.getPtAt(y).subtracted(p).multiplied(-1e5)};if(t.isLine2d()){const u=t.getStartPt(),Q=t.getEndPt(),p={points:[e.getPtAt(u),e.getPtAt(Q)],uvs:[u,Q]};if(e.isPlane()||e.isCylinder()&&Util.isNearlyEqual(u.x,Q.x))return p}const a=t.getSingularities(),I=DiscreteUtil.discreteGeneralCurve(r,g,t.getRange().toArray(),a,n),c=[],E=[];for(const u of I)c.push(u.point),E.push(s.get(u.point));return{points:c,uvs:E}}static discreteGeneralCurve(t,e,n,s=[],r){return DiscreteCurve.general(t,e,n,s,r)}static discreteSurface(t,e,n=!0,s=DiscreteParam.NORMAL,r=Tol.DEFAULT,i=[]){return DiscreteSurface.execute(t,e,n,s,r,i)}static discreteSurfaceIntoPoints(t,e,n=DiscreteParam.NORMAL,s=Tol.DEFAULT){return DiscreteSurface.simplePoints(t,e,n,s)}static refineMesh3d(t,e,n=DiscreteParam.NORMAL){return DiscreteRefiner.refine(t,e,n)}}class LinearSystem{static execute(t,e){if(t.length<1||t.length!==t[0].length)return;if(t.length===2){const o=t[0][0]*t[1][1]-t[0][1]*t[1][0],g=e[0]*t[1][1]-e[1]*t[0][1];if(Math.abs(o)<Tol.CALCULATE_EPS)return Math.abs(t[0][0])<Tol.NUMBER_CALC_EPS&&(Math.abs(t[0][0])<Math.abs(t[1][0])?([t[0],t[1]]=[t[1],t[0]],[e[0],e[1]]=[e[1],e[0]]):Math.abs(t[0][1])<Tol.NUMBER_CALC_EPS&&Math.abs(t[0][1])<Math.abs(t[1][1])&&([t[0],t[1]]=[t[1],t[0]],[e[0],e[1]]=[e[1],e[0]])),Math.abs(g)<Tol.CALCULATE_EPS?Math.abs(t[0][0])>Math.abs(t[0][1])?[e[0]/t[0][0],0]:[0,e[0]/t[0][1]]:Math.abs(e[1])<Tol.ZERO_JUDGE_EPS&&Math.abs(t[1][0])<Tol.ZERO_JUDGE_EPS&&Math.abs(t[1][0])<Tol.ZERO_JUDGE_EPS?[e[0]/t[0][0],0]:void 0;const a=1/o,I=e[1]*t[0][0]-e[0]*t[1][0];return[g*a,I*a]}const n=numeric1_2_6Exports.det(t);if(Math.abs(n)>Tol.CALCULATE_EPS)return numeric1_2_6Exports.solve(t,e);const s=o=>{for(let g=0;g<e.length;g++)if(Number.isNaN(o[g]))return!1;return!0};let r=numeric1_2_6Exports.svd(t),i=0;for(;!s(r.S)&&i<4;){const o=Tol.ZERO_JUDGE_EPS*100**i;for(const g of t)for(let a=0;a<g.length;a++)g[a]=Math.abs(g[a])<o?0:g[a]+o;r=numeric1_2_6Exports.svd(t),i++}if(t.length===3){const o=new exports.Matrix3(r.V),g=new exports.Matrix3;for(let c=0;c<3;c++)r.S[c]<Tol.CALCULATE_EPS?g.set(c,c,r.S[c]):g.set(c,c,1/r.S[c]);const a=new exports.Matrix3(r.U);return o.transposed().multiplied(g).multiply(a).multipliedVector3([e[0],e[1],e[2]])}if(t.length===4){const o=new exports.Matrix4(r.V),g=new exports.Matrix4;for(let c=0;c<4;c++)r.S[c]<Tol.CALCULATE_EPS?g.set(c,c,r.S[c]):g.set(c,c,1/r.S[c]);const a=new exports.Matrix4(r.U);return o.transposed().multiplied(g).multiply(a).multipliedVector4([e[0],e[1],e[2],e[3]])}MathError.warn("不支持的类型:矩阵不满秩,且矩阵A的维数 > 4")}}const __verb=(function(l){if(typeof exports=="object"&&typeof module<"u")return module.exports=l(),module.exports;if(typeof define=="function"&&define.amd){const e=l();return define([],function(){return e}),e}else{var t;return typeof window<"u"?t=window:typeof globalThis<"u"?t=globalThis:typeof self<"u"?t=self:t=this,t.verb=l(),t.verb}})(function(){var l={},t=this;new Function("try {return this===window;}catch(e){ return false;}");var e=new Function("try {return this===global;}catch(e){return false;}"),n=new Function("try {return typeof importScripts === 'function';}catch(e){return false;}");if(e()||n()){var s=t;if(n()){var r=function(i,o){var g=t;return i.split(".").forEach(function(a){g&&(g=g[a])}),g?g[o]:null};onmessage=function(i){if(!(!i.data.className||!i.data.methodName)){var o=r(i.data.className,i.data.methodName);if(!o)return console.error("could not find "+i.data.className+"."+i.data.methodName);postMessage({result:o.apply(null,i.data.args),id:i.data.id})}}}}return(function(i,o,g){o.geom=o.geom||{},o.eval=o.eval||{},o.core=o.core||{},o.promhx=o.promhx||{};var a={},I=function(){return oA.__string_rec(this,"")};function c(h,d){function v(){}v.prototype=h;var x=new v;for(var F in d)x[F]=d[F];return d.toString!==Object.prototype.toString&&(x.toString=d.toString),x}var E=function(){};a.HxOverrides=E,E.__name__=["HxOverrides"],E.strDate=function(h){var d=h.length;switch(d){case 8:var v=h.split(":"),x=new Date;return x.setTime(0),x.setUTCHours(v[0]),x.setUTCMinutes(v[1]),x.setUTCSeconds(v[2]),x;case 10:var F=h.split("-");return new Date(F[0],F[1]-1,F[2],0,0,0);case 19:var Y=h.split(" "),K=Y[0].split("-"),q=Y[1].split(":");return new Date(K[0],K[1]-1,K[2],q[0],q[1],q[2]);default:throw new W("Invalid date format : "+h)}},E.cca=function(h,d){var v=h.charCodeAt(d);if(v==v)return v},E.substr=function(h,d,v){return d!=null&&d!=0&&v!=null&&v<0?"":(v==null&&(v=h.length),d<0?(d=h.length+d,d<0&&(d=0)):v<0&&(v=h.length+v-d),h.substr(d,v))},E.iter=function(h){return{cur:0,arr:h,hasNext:function(){return this.cur<this.arr.length},next:function(){return this.arr[this.cur++]}}};var u=function(){};a.Lambda=u,u.__name__=["Lambda"],u.fold=function(h,d,v){for(var x=oe(h)();x.hasNext();){var F=x.next();v=d(F,v)}return v};var Q=function(){this.length=0};a.List=Q,Q.__name__=["List"],Q.prototype={add:function(h){var d=[h];this.h==null?this.h=d:this.q[1]=d,this.q=d,this.length++},pop:function(){if(this.h==null)return null;var h=this.h[0];return this.h=this.h[1],this.h==null&&(this.q=null),this.length--,h},isEmpty:function(){return this.h==null},__class__:Q},Math.__name__=["Math"];var p=function(){};a.Reflect=p,p.__name__=["Reflect"],p.field=function(h,d){try{return h[d]}catch(v){return v instanceof W&&(v=v.val),null}},p.callMethod=function(h,d,v){return d.apply(h,v)},p.fields=function(h){var d=[];if(h!=null){var v=Object.prototype.hasOwnProperty;for(var x in h)x!="__id__"&&x!="hx__closures__"&&v.call(h,x)&&d.push(x)}return d},p.isFunction=function(h){return typeof h=="function"&&!(h.__name__||h.__ename__)},p.deleteField=function(h,d){return Object.prototype.hasOwnProperty.call(h,d)?(delete h[d],!0):!1};var w=function(){};a.Std=w,w.__name__=["Std"],w.string=function(h){return oA.__string_rec(h,"")},w.parseFloat=function(h){return parseFloat(h)};var y=function(){this.b=""};a.StringBuf=y,y.__name__=["StringBuf"],y.prototype={add:function(h){this.b+=w.string(h)},__class__:y};var M=function(){};a.StringTools=M,M.__name__=["StringTools"],M.fastCodeAt=function(h,d){return h.charCodeAt(d)};var N=a.ValueType={__ename__:["ValueType"],__constructs__:["TNull","TInt","TFloat","TBool","TObject","TFunction","TClass","TEnum","TUnknown"]};N.TNull=["TNull",0],N.TNull.toString=I,N.TNull.__enum__=N,N.TInt=["TInt",1],N.TInt.toString=I,N.TInt.__enum__=N,N.TFloat=["TFloat",2],N.TFloat.toString=I,N.TFloat.__enum__=N,N.TBool=["TBool",3],N.TBool.toString=I,N.TBool.__enum__=N,N.TObject=["TObject",4],N.TObject.toString=I,N.TObject.__enum__=N,N.TFunction=["TFunction",5],N.TFunction.toString=I,N.TFunction.__enum__=N,N.TClass=function(h){var d=["TClass",6,h];return d.__enum__=N,d.toString=I,d},N.TEnum=function(h){var d=["TEnum",7,h];return d.__enum__=N,d.toString=I,d},N.TUnknown=["TUnknown",8],N.TUnknown.toString=I,N.TUnknown.__enum__=N;var S=function(){};a.Type=S,S.__name__=["Type"],S.getClassName=function(h){var d=h.__name__;return d==null?null:d.join(".")},S.getEnumName=function(h){var d=h.__ename__;return d.join(".")},S.resolveClass=function(h){var d=a[h];return d==null||!d.__name__?null:d},S.resolveEnum=function(h){var d=a[h];return d==null||!d.__ename__?null:d},S.createEmptyInstance=function(h){function d(){}return d.prototype=h.prototype,new d},S.createEnum=function(h,d,v){var x=p.field(h,d);if(x==null)throw new W("No such constructor "+d);if(p.isFunction(x)){if(v==null)throw new W("Constructor "+d+" need parameters");return p.callMethod(h,x,v)}if(v!=null&&v.length!=0)throw new W("Constructor "+d+" does not need parameters");return x},S.getEnumConstructs=function(h){var d=h.__constructs__;return d.slice()},S.typeof=function(h){var d=typeof h;switch(d){case"boolean":return N.TBool;case"string":return N.TClass(String);case"number":return Math.ceil(h)==h%2147483648?N.TInt:N.TFloat;case"object":if(h==null)return N.TNull;var v=h.__enum__;if(v!=null)return N.TEnum(v);var x=oA.getClass(h);return x!=null?N.TClass(x):N.TObject;case"function":return h.__name__||h.__ename__?N.TObject:N.TFunction;case"undefined":return N.TNull;default:return N.TUnknown}};var R=function(){};a["haxe.IMap"]=R,R.__name__=["haxe","IMap"];var U=function(h,d){this.high=h,this.low=d};a["haxe._Int64.___Int64"]=U,U.__name__=["haxe","_Int64","___Int64"],U.prototype={__class__:U};var b=function(){this.buf=new y,this.cache=[],this.useCache=b.USE_CACHE,this.useEnumIndex=b.USE_ENUM_INDEX,this.shash=new tA,this.scount=0};a["haxe.Serializer"]=b,b.__name__=["haxe","Serializer"],b.prototype={toString:function(){return this.buf.b},serializeString:function(h){var d=this.shash.get(h);if(d!=null){this.buf.b+="R",d==null?this.buf.b+="null":this.buf.b+=""+d;return}this.shash.set(h,this.scount++),this.buf.b+="y",h=encodeURIComponent(h),h.length==null?this.buf.b+="null":this.buf.b+=""+h.length,this.buf.b+=":",h==null?this.buf.b+="null":this.buf.b+=""+h},serializeRef:function(h){for(var d=typeof h,v=0,x=this.cache.length;v<x;){var F=v++,Y=this.cache[F];if(typeof Y==d&&Y==h)return this.buf.b+="r",F==null?this.buf.b+="null":this.buf.b+=""+F,!0}return this.cache.push(h),!1},serializeFields:function(h){for(var d=0,v=p.fields(h);d<v.length;){var x=v[d];++d,this.serializeString(x),this.serialize(p.field(h,x))}this.buf.b+="g"},serialize:function(h){{var d=S.typeof(h);switch(d[1]){case 0:this.buf.b+="n";break;case 1:var v=h;if(v==0){this.buf.b+="z";return}this.buf.b+="i",v==null?this.buf.b+="null":this.buf.b+=""+v;break;case 2:var x=h;isNaN(x)?this.buf.b+="k":isFinite(x)?(this.buf.b+="d",x==null?this.buf.b+="null":this.buf.b+=""+x):x<0?this.buf.b+="m":this.buf.b+="p";break;case 3:h?this.buf.b+="t":this.buf.b+="f";break;case 6:var F=d[2];if(F==String){this.serializeString(h);return}if(this.useCache&&this.serializeRef(h))return;switch(F){case Array:var Y=0;this.buf.b+="a";for(var K=h.length,q=0;q<K;){var j=q++;h[j]==null?Y++:(Y>0&&(Y==1?this.buf.b+="n":(this.buf.b+="u",Y==null?this.buf.b+="null":this.buf.b+=""+Y),Y=0),this.serialize(h[j]))}Y>0&&(Y==1?this.buf.b+="n":(this.buf.b+="u",Y==null?this.buf.b+="null":this.buf.b+=""+Y)),this.buf.b+="h";break;case Q:this.buf.b+="l";for(var rA=h,gA=rA.h,cA=null;gA!=null;){var uA;cA=gA[0],gA=gA[1],uA=cA,this.serialize(uA)}this.buf.b+="h";break;case Date:var fA=h;this.buf.b+="v",this.buf.add(fA.getTime());break;case tA:this.buf.b+="b";for(var pA=h,MA=pA.keys();MA.hasNext();){var vA=MA.next();this.serializeString(vA),this.serialize(m[vA]!=null?pA.getReserved(vA):pA.h[vA])}this.buf.b+="h";break;case O:this.buf.b+="q";for(var TA=h,SA=TA.keys();SA.hasNext();){var kA=SA.next();this.buf.b+=":",kA==null?this.buf.b+="null":this.buf.b+=""+kA,this.serialize(TA.h[kA])}this.buf.b+="h";break;case H:this.buf.b+="M";for(var HA=h,zA=HA.keys();zA.hasNext();){var ZA=zA.next(),VA=p.field(ZA,"__id__");p.deleteField(ZA,"__id__"),this.serialize(ZA),ZA.__id__=VA,this.serialize(HA.h[ZA.__id__])}this.buf.b+="h";break;case nA:for(var KA=h,jA=0,tt=KA.length-2,ot=new y,ct=b.BASE64;jA<tt;){var lt=KA.get(jA++),ut=KA.get(jA++),Bt=KA.get(jA++);ot.add(ct.charAt(lt>>2)),ot.add(ct.charAt((lt<<4|ut>>4)&63)),ot.add(ct.charAt((ut<<2|Bt>>6)&63)),ot.add(ct.charAt(Bt&63))}if(jA==tt){var rt=KA.get(jA++),ht=KA.get(jA++);ot.add(ct.charAt(rt>>2)),ot.add(ct.charAt((rt<<4|ht>>4)&63)),ot.add(ct.charAt(ht<<2&63))}else if(jA==tt+1){var qA=KA.get(jA++);ot.add(ct.charAt(qA>>2)),ot.add(ct.charAt(qA<<4&63))}var Qt=ot.b;this.buf.b+="s",Qt.length==null?this.buf.b+="null":this.buf.b+=""+Qt.length,this.buf.b+=":",Qt==null?this.buf.b+="null":this.buf.b+=""+Qt;break;default:this.useCache&&this.cache.pop(),h.hxSerialize!=null?(this.buf.b+="C",this.serializeString(S.getClassName(F)),this.useCache&&this.cache.push(h),h.hxSerialize(this),this.buf.b+="g"):(this.buf.b+="c",this.serializeString(S.getClassName(F)),this.useCache&&this.cache.push(h),this.serializeFields(h))}break;case 4:if(oA.__instanceof(h,ee)){var mt=S.getClassName(h);this.buf.b+="A",this.serializeString(mt)}else if(oA.__instanceof(h,f))this.buf.b+="B",this.serializeString(S.getEnumName(h));else{if(this.useCache&&this.serializeRef(h))return;this.buf.b+="o",this.serializeFields(h)}break;case 7:var Ut=d[2];if(this.useCache){if(this.serializeRef(h))return;this.cache.pop()}this.useEnumIndex?this.buf.b+="j":this.buf.b+="w",this.serializeString(S.getEnumName(Ut)),this.useEnumIndex?(this.buf.b+=":",this.buf.b+=w.string(h[1])):this.serializeString(h[0]),this.buf.b+=":";var kt=h.length;this.buf.b+=w.string(kt-2);for(var _t=2;_t<kt;){var Ot=_t++;this.serialize(h[Ot])}this.useCache&&this.cache.push(h);break;case 5:throw new W("Cannot serialize function");default:throw new W("Cannot serialize "+w.string(h))}}},__class__:b};var G=function(h){this.buf=h,this.length=h.length,this.pos=0,this.scache=[],this.cache=[];var d=G.DEFAULT_RESOLVER;d==null&&(d=S,G.DEFAULT_RESOLVER=d),this.setResolver(d)};a["haxe.Unserializer"]=G,G.__name__=["haxe","Unserializer"],G.initCodes=function(){for(var h=[],d=0,v=G.BASE64.length;d<v;){var x=d++;h[G.BASE64.charCodeAt(x)]=x}return h},G.prototype={setResolver:function(h){h==null?this.resolver={resolveClass:function(d){return null},resolveEnum:function(d){return null}}:this.resolver=h},get:function(h){return this.buf.charCodeAt(h)},readDigits:function(){for(var h=0,d=!1,v=this.pos;;){var x=this.buf.charCodeAt(this.pos);if(x!=x)break;if(x==45){if(this.pos!=v)break;d=!0,this.pos++;continue}if(x<48||x>57)break;h=h*10+(x-48),this.pos++}return d&&(h*=-1),h},readFloat:function(){for(var h=this.pos;;){var d=this.buf.charCodeAt(this.pos);if(d>=43&&d<58||d==101||d==69)this.pos++;else break}return w.parseFloat(E.substr(this.buf,h,this.pos-h))},unserializeObject:function(h){for(;;){if(this.pos>=this.length)throw new W("Invalid object");if(this.buf.charCodeAt(this.pos)==103)break;var d=this.unserialize();if(typeof d!="string")throw new W("Invalid object key");var v=this.unserialize();h[d]=v}this.pos++},unserializeEnum:function(h,d){if(this.get(this.pos++)!=58)throw new W("Invalid enum format");var v=this.readDigits();if(v==0)return S.createEnum(h,d);for(var x=[];v-- >0;)x.push(this.unserialize());return S.createEnum(h,d,x)},unserialize:function(){var h=this.get(this.pos++);switch(h){case 110:return null;case 116:return!0;case 102:return!1;case 122:return 0;case 105:return this.readDigits();case 100:return this.readFloat();case 121:var d=this.readDigits();if(this.get(this.pos++)!=58||this.length-this.pos<d)throw new W("Invalid string length");var v=E.substr(this.buf,this.pos,d);return this.pos+=d,v=decodeURIComponent(v.split("+").join(" ")),this.scache.push(v),v;case 107:return NaN;case 109:return-1/0;case 112:return 1/0;case 97:this.buf;var x=[];for(this.cache.push(x);;){var F=this.buf.charCodeAt(this.pos);if(F==104){this.pos++;break}if(F==117){this.pos++;var Y=this.readDigits();x[x.length+Y-1]=null}else x.push(this.unserialize())}return x;case 111:var K={};return this.cache.push(K),this.unserializeObject(K),K;case 114:var q=this.readDigits();if(q<0||q>=this.cache.length)throw new W("Invalid reference");return this.cache[q];case 82:var j=this.readDigits();if(j<0||j>=this.scache.length)throw new W("Invalid string reference");return this.scache[j];case 120:throw new W(this.unserialize());case 99:var rA=this.unserialize(),gA=this.resolver.resolveClass(rA);if(gA==null)throw new W("Class not found "+rA);var cA=S.createEmptyInstance(gA);return this.cache.push(cA),this.unserializeObject(cA),cA;case 119:var uA=this.unserialize(),fA=this.resolver.resolveEnum(uA);if(fA==null)throw new W("Enum not found "+uA);var pA=this.unserializeEnum(fA,this.unserialize());return this.cache.push(pA),pA;case 106:var MA=this.unserialize(),vA=this.resolver.resolveEnum(MA);if(vA==null)throw new W("Enum not found "+MA);this.pos++;var TA=this.readDigits(),SA=S.getEnumConstructs(vA)[TA];if(SA==null)throw new W("Unknown enum index "+MA+"@"+TA);var kA=this.unserializeEnum(vA,SA);return this.cache.push(kA),kA;case 108:var HA=new Q;for(this.cache.push(HA),this.buf;this.buf.charCodeAt(this.pos)!=104;)HA.add(this.unserialize());return this.pos++,HA;case 98:var zA=new tA;for(this.cache.push(zA),this.buf;this.buf.charCodeAt(this.pos)!=104;){var ZA=this.unserialize();zA.set(ZA,this.unserialize())}return this.pos++,zA;case 113:var VA=new O;this.cache.push(VA),this.buf;for(var KA=this.get(this.pos++);KA==58;){var jA=this.readDigits();VA.set(jA,this.unserialize()),KA=this.get(this.pos++)}if(KA!=104)throw new W("Invalid IntMap format");return VA;case 77:var tt=new H;for(this.cache.push(tt),this.buf;this.buf.charCodeAt(this.pos)!=104;){var ot=this.unserialize();tt.set(ot,this.unserialize())}return this.pos++,tt;case 118:var ct;if(this.buf.charCodeAt(this.pos)>=48&&this.buf.charCodeAt(this.pos)<=57&&this.buf.charCodeAt(this.pos+1)>=48&&this.buf.charCodeAt(this.pos+1)<=57&&this.buf.charCodeAt(this.pos+2)>=48&&this.buf.charCodeAt(this.pos+2)<=57&&this.buf.charCodeAt(this.pos+3)>=48&&this.buf.charCodeAt(this.pos+3)<=57&&this.buf.charCodeAt(this.pos+4)==45){var lt=E.substr(this.buf,this.pos,19);ct=E.strDate(lt),this.pos+=19}else{var ut=this.readFloat(),Bt=new Date;Bt.setTime(ut),ct=Bt}return this.cache.push(ct),ct;case 115:var rt=this.readDigits(),ht=this.buf;if(this.get(this.pos++)!=58||this.length-this.pos<rt)throw new W("Invalid bytes length");var qA=G.CODES;qA==null&&(qA=G.initCodes(),G.CODES=qA);var Qt=this.pos,mt=rt&3,Ut;Ut=(rt>>2)*3+(mt>=2?mt-1:0);for(var kt=Qt+(rt-mt),_t=nA.alloc(Ut),Ot=0;Qt<kt;){var ge=qA[M.fastCodeAt(ht,Qt++)],Qe=qA[M.fastCodeAt(ht,Qt++)];_t.set(Ot++,ge<<2|Qe>>4);var Zt=qA[M.fastCodeAt(ht,Qt++)];_t.set(Ot++,Qe<<4|Zt>>2);var $t=qA[M.fastCodeAt(ht,Qt++)];_t.set(Ot++,Zt<<6|$t)}if(mt>=2){var ae=qA[M.fastCodeAt(ht,Qt++)],Vt=qA[M.fastCodeAt(ht,Qt++)];if(_t.set(Ot++,ae<<2|Vt>>4),mt==3){var fe=qA[M.fastCodeAt(ht,Qt++)];_t.set(Ot++,Vt<<4|fe>>2)}}return this.pos+=rt,this.cache.push(_t),_t;case 67:var Ne=this.unserialize(),Ie=this.resolver.resolveClass(Ne);if(Ie==null)throw new W("Class not found "+Ne);var pe=S.createEmptyInstance(Ie);if(this.cache.push(pe),pe.hxUnserialize(this),this.get(this.pos++)!=103)throw new W("Invalid custom data");return pe;case 65:var Ht=this.unserialize(),Se=this.resolver.resolveClass(Ht);if(Se==null)throw new W("Class not found "+Ht);return Se;case 66:var Oe=this.unserialize(),Ye=this.resolver.resolveEnum(Oe);if(Ye==null)throw new W("Enum not found "+Oe);return Ye}throw this.pos--,new W("Invalid char "+this.buf.charAt(this.pos)+" at position "+this.pos)},__class__:G};var O=function(){this.h={}};a["haxe.ds.IntMap"]=O,O.__name__=["haxe","ds","IntMap"],O.__interfaces__=[R],O.prototype={set:function(h,d){this.h[h]=d},remove:function(h){return this.h.hasOwnProperty(h)?(delete this.h[h],!0):!1},keys:function(){var h=[];for(var d in this.h)this.h.hasOwnProperty(d)&&h.push(d|0);return E.iter(h)},__class__:O};var H=function(){this.h={},this.h.__keys__={}};a["haxe.ds.ObjectMap"]=H,H.__name__=["haxe","ds","ObjectMap"],H.__interfaces__=[R],H.prototype={set:function(h,d){var v=h.__id__||(h.__id__=++H.count);this.h[v]=d,this.h.__keys__[v]=h},keys:function(){var h=[];for(var d in this.h.__keys__)this.h.hasOwnProperty(d)&&h.push(this.h.__keys__[d]);return E.iter(h)},__class__:H};var z=a["haxe.ds.Option"]={__ename__:["haxe","ds","Option"],__constructs__:["Some","None"]};z.Some=function(h){var d=["Some",0,h];return d.__enum__=z,d.toString=I,d},z.None=["None",1],z.None.toString=I,z.None.__enum__=z;var tA=function(){this.h={}};a["haxe.ds.StringMap"]=tA,tA.__name__=["haxe","ds","StringMap"],tA.__interfaces__=[R],tA.prototype={set:function(h,d){m[h]!=null?this.setReserved(h,d):this.h[h]=d},get:function(h){return m[h]!=null?this.getReserved(h):this.h[h]},setReserved:function(h,d){this.rh==null&&(this.rh={}),this.rh["$"+h]=d},getReserved:function(h){return this.rh==null?null:this.rh["$"+h]},keys:function(){var h=this.arrayKeys();return E.iter(h)},arrayKeys:function(){var h=[];for(var d in this.h)this.h.hasOwnProperty(d)&&h.push(d);if(this.rh!=null)for(var d in this.rh)d.charCodeAt(0)==36&&h.push(d.substr(1));return h},__class__:tA};var nA=function(h){this.length=h.byteLength,this.b=new L(h),this.b.bufferValue=h,h.hxBytes=this,h.bytes=this.b};a["haxe.io.Bytes"]=nA,nA.__name__=["haxe","io","Bytes"],nA.alloc=function(h){return new nA(new P(h))},nA.prototype={get:function(h){return this.b[h]},set:function(h,d){this.b[h]=d&255},__class__:nA};var IA=a["haxe.io.Error"]={__ename__:["haxe","io","Error"],__constructs__:["Blocked","Overflow","OutsideBounds","Custom"]};IA.Blocked=["Blocked",0],IA.Blocked.toString=I,IA.Blocked.__enum__=IA,IA.Overflow=["Overflow",1],IA.Overflow.toString=I,IA.Overflow.__enum__=IA,IA.OutsideBounds=["OutsideBounds",2],IA.OutsideBounds.toString=I,IA.OutsideBounds.__enum__=IA,IA.Custom=function(h){var d=["Custom",3,h];return d.__enum__=IA,d.toString=I,d};var iA=function(){};a["haxe.io.FPHelper"]=iA,iA.__name__=["haxe","io","FPHelper"],iA.i32ToFloat=function(h){var d=1-(h>>>31<<1),v=h>>>23&255,x=h&8388607;return x==0&&v==0?0:d*(1+Math.pow(2,-23)*x)*Math.pow(2,v-127)},iA.floatToI32=function(h){if(h==0)return 0;var d;h<0?d=-h:d=h;var v=Math.floor(Math.log(d)/.6931471805599453);v<-127?v=-127:v>128&&(v=128);var x=Math.round((d/Math.pow(2,v)-1)*8388608)&8388607;return(h<0?-2147483648:0)|v+127<<23|x},iA.i64ToDouble=function(h,d){var v=1-(d>>>31<<1),x=(d>>20&2047)-1023,F=(d&1048575)*4294967296+(h>>>31)*2147483648+(h&2147483647);return F==0&&x==-1023?0:v*(1+Math.pow(2,-52)*F)*Math.pow(2,x)},iA.doubleToI64=function(h){var d=iA.i64tmp;if(h==0)d.low=0,d.high=0;else{var v;h<0?v=-h:v=h;var x=Math.floor(Math.log(v)/.6931471805599453),F,Y=(v/Math.pow(2,x)-1)*4503599627370496;F=Math.round(Y);var K=F|0,q=F/4294967296|0;d.low=K,d.high=(h<0?-2147483648:0)|x+1023<<20|q}return d};var W=function(h){Error.call(this),this.val=h,this.message=String(h),Error.captureStackTrace&&Error.captureStackTrace(this,W)};a["js._Boot.HaxeError"]=W,W.__name__=["js","_Boot","HaxeError"],W.__super__=Error,W.prototype=c(Error.prototype,{__class__:W});var oA=function(){};a["js.Boot"]=oA,oA.__name__=["js","Boot"],oA.getClass=function(h){if(h instanceof Array&&h.__enum__==null)return Array;var d=h.__class__;if(d!=null)return d;var v=oA.__nativeClassName(h);return v!=null?oA.__resolveNativeClass(v):null},oA.__string_rec=function(h,d){if(h==null)return"null";if(d.length>=5)return"<...>";var v=typeof h;switch(v=="function"&&(h.__name__||h.__ename__)&&(v="object"),v){case"object":if(h instanceof Array){if(h.__enum__){if(h.length==2)return h[0];var x=h[0]+"(";d+=" ";for(var F=2,Y=h.length;F<Y;){var K=F++;K!=2?x+=","+oA.__string_rec(h[K],d):x+=oA.__string_rec(h[K],d)}return x+")"}var q=h.length,j="[";d+=" ";for(var rA=0;rA<q;){var gA=rA++;j+=(gA>0?",":"")+oA.__string_rec(h[gA],d)}return j+="]",j}var cA;try{cA=h.toString}catch(vA){return vA instanceof W&&(vA=vA.val),"???"}if(cA!=null&&cA!=Object.toString&&typeof cA=="function"){var uA=h.toString();if(uA!="[object Object]")return uA}var fA=null,pA=`{
183
+ `;d+=" ";var MA=h.hasOwnProperty!=null;for(var fA in h)MA&&!h.hasOwnProperty(fA)||fA=="prototype"||fA=="__class__"||fA=="__super__"||fA=="__interfaces__"||fA=="__properties__"||(pA.length!=2&&(pA+=`,
184
+ `),pA+=d+fA+" : "+oA.__string_rec(h[fA],d));return d=d.substring(1),pA+=`
185
+ `+d+"}",pA;case"function":return"<function>";case"string":return h;default:return String(h)}},oA.__interfLoop=function(h,d){if(h==null)return!1;if(h==d)return!0;var v=h.__interfaces__;if(v!=null)for(var x=0,F=v.length;x<F;){var Y=x++,K=v[Y];if(K==d||oA.__interfLoop(K,d))return!0}return oA.__interfLoop(h.__super__,d)},oA.__instanceof=function(h,d){if(d==null)return!1;switch(d){case He:return(h|0)===h;case qe:return typeof h=="number";case be:return typeof h=="boolean";case String:return typeof h=="string";case Array:return h instanceof Array&&h.__enum__==null;case de:return!0;default:if(h!=null){if(typeof d=="function"){if(h instanceof d||oA.__interfLoop(oA.getClass(h),d))return!0}else if(typeof d=="object"&&oA.__isNativeObj(d)&&h instanceof d)return!0}else return!1;return d==ee&&h.__name__!=null||d==f&&h.__ename__!=null?!0:h.__enum__==d}},oA.__nativeClassName=function(h){var d=oA.__toStr.call(h).slice(8,-1);return d=="Object"||d=="Function"||d=="Math"||d=="JSON"?null:d},oA.__isNativeObj=function(h){return oA.__nativeClassName(h)!=null},oA.__resolveNativeClass=function(h){return g[h]};var hA=function(h){if(h instanceof Array&&h.__enum__==null)this.a=h,this.byteLength=h.length;else{var d=h;this.a=[];for(var v=0;v<d;){var x=v++;this.a[x]=0}this.byteLength=d}};a["js.html.compat.ArrayBuffer"]=hA,hA.__name__=["js","html","compat","ArrayBuffer"],hA.sliceImpl=function(h,d){var v=new L(this,h,d==null?null:d-h),x=new P(v.byteLength),F=new L(x);return F.set(v),x},hA.prototype={slice:function(h,d){return new hA(this.a.slice(h,d))},__class__:hA};var dA=function(h,d,v){if(this.buf=h,d==null?this.offset=0:this.offset=d,v==null?this.length=h.byteLength-this.offset:this.length=v,this.offset<0||this.length<0||this.offset+this.length>h.byteLength)throw new W(IA.OutsideBounds)};a["js.html.compat.DataView"]=dA,dA.__name__=["js","html","compat","DataView"],dA.prototype={getInt8:function(h){var d=this.buf.a[this.offset+h];return d>=128?d-256:d},getUint8:function(h){return this.buf.a[this.offset+h]},getInt16:function(h,d){var v=this.getUint16(h,d);return v>=32768?v-65536:v},getUint16:function(h,d){return d?this.buf.a[this.offset+h]|this.buf.a[this.offset+h+1]<<8:this.buf.a[this.offset+h]<<8|this.buf.a[this.offset+h+1]},getInt32:function(h,d){var v=this.offset+h,x=this.buf.a[v++],F=this.buf.a[v++],Y=this.buf.a[v++],K=this.buf.a[v++];return d?x|F<<8|Y<<16|K<<24:K|Y<<8|F<<16|x<<24},getUint32:function(h,d){var v=this.getInt32(h,d);return v<0?v+4294967296:v},getFloat32:function(h,d){return iA.i32ToFloat(this.getInt32(h,d))},getFloat64:function(h,d){var v=this.getInt32(h,d),x=this.getInt32(h+4,d);return iA.i64ToDouble(d?v:x,d?x:v)},setInt8:function(h,d){d<0?this.buf.a[h+this.offset]=d+128&255:this.buf.a[h+this.offset]=d&255},setUint8:function(h,d){this.buf.a[h+this.offset]=d&255},setInt16:function(h,d,v){this.setUint16(h,d<0?d+65536:d,v)},setUint16:function(h,d,v){var x=h+this.offset;v?(this.buf.a[x]=d&255,this.buf.a[x++]=d>>8&255):(this.buf.a[x++]=d>>8&255,this.buf.a[x]=d&255)},setInt32:function(h,d,v){this.setUint32(h,d,v)},setUint32:function(h,d,v){var x=h+this.offset;v?(this.buf.a[x++]=d&255,this.buf.a[x++]=d>>8&255,this.buf.a[x++]=d>>16&255,this.buf.a[x++]=d>>>24):(this.buf.a[x++]=d>>>24,this.buf.a[x++]=d>>16&255,this.buf.a[x++]=d>>8&255,this.buf.a[x++]=d&255)},setFloat32:function(h,d,v){this.setUint32(h,iA.floatToI32(d),v)},setFloat64:function(h,d,v){var x=iA.doubleToI64(d);v?(this.setUint32(h,x.low),this.setUint32(h,x.high)):(this.setUint32(h,x.high),this.setUint32(h,x.low))},__class__:dA};var PA=function(){};a["js.html.compat.Uint8Array"]=PA,PA.__name__=["js","html","compat","Uint8Array"],PA._new=function(h,d,v){var x;if(typeof h=="number"){x=[];for(var F=0;F<h;){var Y=F++;x[Y]=0}x.byteLength=x.length,x.byteOffset=0,x.buffer=new hA(x)}else if(oA.__instanceof(h,hA)){var K=h;d==null&&(d=0),v==null&&(v=K.byteLength-d),d==0?x=K.a:x=K.a.slice(d,d+v),x.byteLength=x.length,x.byteOffset=d,x.buffer=K}else if(h instanceof Array&&h.__enum__==null)x=h.slice(),x.byteLength=x.length,x.byteOffset=0,x.buffer=new hA(x);else throw new W("TODO "+w.string(h));return x.subarray=PA._subarray,x.set=PA._set,x},PA._set=function(h,d){var v=this;if(oA.__instanceof(h.buffer,hA)){var x=h;if(h.byteLength+d>v.byteLength)throw new W("set() outside of range");for(var F=0,Y=h.byteLength;F<Y;){var K=F++;v[K+d]=x[K]}}else if(h instanceof Array&&h.__enum__==null){var q=h;if(q.length+d>v.byteLength)throw new W("set() outside of range");for(var j=0,rA=q.length;j<rA;){var gA=j++;v[gA+d]=q[gA]}}else throw new W("TODO")},PA._subarray=function(h,d){var v=this,x=PA._new(v.slice(h,d));return x.byteOffset=h,x};var yA=function(h){this._resolved=!1,this._pending=!1,this._errorPending=!1,this._fulfilled=!1,this._update=[],this._error=[],this._errored=!1,h!=null&&yA.link(h,this,function(d){return d})};a["promhx.base.AsyncBase"]=yA,yA.__name__=["promhx","base","AsyncBase"],yA.link=function(h,d,v){h._update.push({async:d,linkf:function(x){d.handleResolve(v(x))}}),yA.immediateLinkUpdate(h,d,v)},yA.immediateLinkUpdate=function(h,d,v){if(h._errored&&!h._errorPending&&!(h._error.length>0)&&d.handleError(h._errorVal),h._resolved&&!h._pending)try{d.handleResolve(v(h._val))}catch(x){x instanceof W&&(x=x.val),d.handleError(x)}},yA.linkAll=function(h,d){for(var v=function(Y,K,q){if(Y.length==0||yA.allFulfilled(Y)){for(var j,rA=[],gA=oe(h)();gA.hasNext();){var cA=gA.next();rA.push(cA==K?q:cA._val)}j=rA,d.handleResolve(j)}},x=oe(h)();x.hasNext();){var F=x.next();F._update.push({async:d,linkf:(function(Y,K,q){return function(j){Y(K,q,j)}})(v,(function(Y){for(var K,q=[],j=oe(h)();j.hasNext();){var rA=j.next();rA!=F&&q.push(rA)}return K=q,K})(),F)})}yA.allFulfilled(h)&&d.handleResolve((function(Y){for(var K,q=[],j=oe(h)();j.hasNext();){var rA=j.next();q.push(rA._val)}return K=q,K})())},yA.pipeLink=function(h,d,v){var x=!1,F=function(Y){if(!x){x=!0;var K=v(Y);K._update.push({async:d,linkf:at(d,d.handleResolve)}),yA.immediateLinkUpdate(K,d,function(q){return q})}};if(h._update.push({async:d,linkf:F}),h._resolved&&!h._pending)try{F(h._val)}catch(Y){Y instanceof W&&(Y=Y.val),d.handleError(Y)}},yA.allResolved=function(h){for(var d=oe(h)();d.hasNext();){var v=d.next();if(!v._resolved)return!1}return!0},yA.allFulfilled=function(h){for(var d=oe(h)();d.hasNext();){var v=d.next();if(!v._fulfilled)return!1}return!0},yA.prototype={catchError:function(h){return this._error.push(h),this},errorThen:function(h){return this._errorMap=h,this},isResolved:function(){return this._resolved},isErrored:function(){return this._errored},isErrorHandled:function(){return this._error.length>0},isErrorPending:function(){return this._errorPending},isFulfilled:function(){return this._fulfilled},isPending:function(){return this._pending},handleResolve:function(h){this._resolve(h)},_resolve:function(h){var d=this;this._pending?aA.enqueue((function(v,x){return function(){v(x)}})(at(this,this._resolve),h)):(this._resolved=!0,this._pending=!0,aA.queue.add(function(){d._val=h;for(var v=0,x=d._update;v<x.length;){var F=x[v];++v;try{F.linkf(h)}catch(Y){Y instanceof W&&(Y=Y.val),F.async.handleError(Y)}}d._fulfilled=!0,d._pending=!1}),aA.continueOnNextLoop())},handleError:function(h){this._handleError(h)},_handleError:function(h){var d=this,v=function(x){if(d._error.length>0)for(var F=0,Y=d._error;F<Y.length;){var K=Y[F];++F,K(x)}else if(d._update.length>0)for(var q=0,j=d._update;q<j.length;){var rA=j[q];++q,rA.async.handleError(x)}else throw new W(x);d._errorPending=!1};this._errorPending||(this._errorPending=!0,this._errored=!0,this._errorVal=h,aA.queue.add(function(){if(d._errorMap!=null)try{d._resolve(d._errorMap(h))}catch(x){x instanceof W&&(x=x.val),v(x)}else v(h)}),aA.continueOnNextLoop())},then:function(h){var d=new yA(null);return yA.link(this,d,h),d},unlink:function(h){var d=this;aA.queue.add(function(){d._update=d._update.filter(function(v){return v.async!=h})}),aA.continueOnNextLoop()},isLinked:function(h){for(var d=!1,v=0,x=this._update;v<x.length;){var F=x[v];if(++v,F.async==h)return!0}return d},__class__:yA};var _A=o.promhx.Deferred=function(){yA.call(this)};a["promhx.Deferred"]=_A,_A.__name__=["promhx","Deferred"],_A.__super__=yA,_A.prototype=c(yA.prototype,{resolve:function(h){this.handleResolve(h)},throwError:function(h){this.handleError(h)},promise:function(){return new LA(this)},stream:function(){return new BA(this)},publicStream:function(){return new lA(this)},__class__:_A});var LA=o.promhx.Promise=function(h){yA.call(this,h),this._rejected=!1};a["promhx.Promise"]=LA,LA.__name__=["promhx","Promise"],LA.whenAll=function(h){var d=new LA(null);return yA.linkAll(h,d),d},LA.promise=function(h){var d=new LA;return d.handleResolve(h),d},LA.__super__=yA,LA.prototype=c(yA.prototype,{isRejected:function(){return this._rejected},reject:function(h){this._rejected=!0,this.handleError(h)},handleResolve:function(h){if(this._resolved){var d="Promise has already been resolved";throw new W(wA.AlreadyResolved(d))}this._resolve(h)},then:function(h){var d=new LA(null);return yA.link(this,d,h),d},unlink:function(h){var d=this;aA.queue.add(function(){if(d._fulfilled)d._update=d._update.filter(function(x){return x.async!=h});else{var v="Downstream Promise is not fullfilled";d.handleError(wA.DownstreamNotFullfilled(v))}}),aA.continueOnNextLoop()},handleError:function(h){this._rejected=!0,this._handleError(h)},pipe:function(h){var d=new LA(null);return yA.pipeLink(this,d,h),d},errorPipe:function(h){var d=new LA;return this.catchError(function(v){var x=h(v);x.then(at(d,d._resolve))}),this.then(at(d,d._resolve)),d},__class__:LA});var BA=o.promhx.Stream=function(h){yA.call(this,h),this._end_promise=new LA};a["promhx.Stream"]=BA,BA.__name__=["promhx","Stream"],BA.foreach=function(h){for(var d=new BA(null),v=oe(h)();v.hasNext();){var x=v.next();d.handleResolve(x)}return d.end(),d},BA.wheneverAll=function(h){var d=new BA(null);return yA.linkAll(h,d),d},BA.concatAll=function(h){for(var d=new BA(null),v=oe(h)();v.hasNext();){var x=v.next();d.concat(x)}return d},BA.mergeAll=function(h){for(var d=new BA(null),v=oe(h)();v.hasNext();){var x=v.next();d.merge(x)}return d},BA.stream=function(h){var d=new BA(null);return d.handleResolve(h),d},BA.__super__=yA,BA.prototype=c(yA.prototype,{then:function(h){var d=new BA(null);return yA.link(this,d,h),this._end_promise._update.push({async:d._end_promise,linkf:function(v){d.end()}}),d},detachStream:function(h){for(var d=[],v=!1,x=0,F=this._update;x<F.length;){var Y=F[x];++x,Y.async==h?(this._end_promise._update=this._end_promise._update.filter(function(K){return K.async!=h._end_promise}),v=!0):d.push(Y)}return this._update=d,v},first:function(){var h=new LA(null);return this.then(function(d){h._resolved||h.handleResolve(d)}),h},handleResolve:function(h){!this._end&&!this._pause&&this._resolve(h)},pause:function(h){h==null&&(h=!this._pause),this._pause=h},pipe:function(h){var d=new BA(null);return yA.pipeLink(this,d,h),this._end_promise.then(function(v){d.end()}),d},errorPipe:function(h){var d=new BA(null);return this.catchError(function(v){var x=h(v);x.then(at(d,d._resolve)),x._end_promise.then((Wt=d._end_promise,at(Wt,Wt._resolve)))}),this.then(at(d,d._resolve)),this._end_promise.then(function(v){d.end()}),d},handleEnd:function(){if(this._pending)aA.queue.add(at(this,this.handleEnd)),aA.continueOnNextLoop();else{if(this._end_promise._resolved)return;this._end=!0;var h;this._resolved?h=z.Some(this._val):h=z.None,this._end_promise.handleResolve(h),this._update=[],this._error=[]}},end:function(){return aA.queue.add(at(this,this.handleEnd)),aA.continueOnNextLoop(),this},endThen:function(h){return this._end_promise.then(h)},filter:function(h){var d=new BA(null);return this._update.push({async:d,linkf:function(v){h(v)&&d.handleResolve(v)}}),yA.immediateLinkUpdate(this,d,function(v){return v}),d},concat:function(h){var d=new BA(null);return this._update.push({async:d,linkf:at(d,d.handleResolve)}),yA.immediateLinkUpdate(this,d,function(v){return v}),this._end_promise.then(function(v){h.pipe(function(x){return d.handleResolve(x),d}),h._end_promise.then(function(x){d.end()})}),d},merge:function(h){var d=new BA(null);return this._update.push({async:d,linkf:at(d,d.handleResolve)}),h._update.push({async:d,linkf:at(d,d.handleResolve)}),yA.immediateLinkUpdate(this,d,function(v){return v}),yA.immediateLinkUpdate(h,d,function(v){return v}),d},__class__:BA});var lA=o.promhx.PublicStream=function(h){BA.call(this,h)};a["promhx.PublicStream"]=lA,lA.__name__=["promhx","PublicStream"],lA.publicstream=function(h){var d=new lA(null);return d.handleResolve(h),d},lA.__super__=BA,lA.prototype=c(BA.prototype,{resolve:function(h){this.handleResolve(h)},throwError:function(h){this.handleError(h)},update:function(h){this.handleResolve(h)},__class__:lA});var aA=function(){};a["promhx.base.EventLoop"]=aA,aA.__name__=["promhx","base","EventLoop"],aA.enqueue=function(h){aA.queue.add(h),aA.continueOnNextLoop()},aA.set_nextLoop=function(h){if(aA.nextLoop!=null)throw new W("nextLoop has already been set");return aA.nextLoop=h,aA.nextLoop},aA.queueEmpty=function(){return aA.queue.isEmpty()},aA.finish=function(h){h==null&&(h=1e3);for(var d=null;h-- >0&&(d=aA.queue.pop())!=null;)d();return aA.queue.isEmpty()},aA.clear=function(){aA.queue=new Q},aA.f=function(){var h=aA.queue.pop();h?.(),aA.queue.isEmpty()||aA.continueOnNextLoop()},aA.continueOnNextLoop=function(){aA.nextLoop!=null?aA.nextLoop(aA.f):setImmediate(aA.f)};var wA=a["promhx.error.PromiseError"]={__ename__:["promhx","error","PromiseError"],__constructs__:["AlreadyResolved","DownstreamNotFullfilled"]};wA.AlreadyResolved=function(h){var d=["AlreadyResolved",0,h];return d.__enum__=wA,d.toString=I,d},wA.DownstreamNotFullfilled=function(h){var d=["DownstreamNotFullfilled",1,h];return d.__enum__=wA,d.toString=I,d};var YA=function(){};a["verb.Verb"]=YA,YA.__name__=["verb","Verb"],YA.main=function(){};var DA=function(){};a["verb.core.ArrayExtensions"]=DA,DA.__name__=["verb","core","ArrayExtensions"],DA.alloc=function(h,d){if(!(d<0))for(;h.length<d;)h.push(null)},DA.reversed=function(h){var d=h.slice();return d.reverse(),d},DA.last=function(h){return h[h.length-1]},DA.first=function(h){return h[0]},DA.spliceAndInsert=function(h,d,v,x){h.splice(d,v),h.splice(d,0,x)},DA.left=function(h){if(h.length==0)return[];var d=Math.ceil(h.length/2);return h.slice(0,d)},DA.right=function(h){if(h.length==0)return[];var d=Math.ceil(h.length/2);return h.slice(d)},DA.rightWithPivot=function(h){if(h.length==0)return[];var d=Math.ceil(h.length/2);return h.slice(d-1)},DA.unique=function(h,d){if(h.length==0)return[];for(var v=[h.pop()];h.length>0;){for(var x=h.pop(),F=!0,Y=0;Y<v.length;){var K=v[Y];if(++Y,d(x,K)){F=!1;break}}F&&v.push(x)}return v};var UA=function(){};a["verb.core.Binomial"]=UA,UA.__name__=["verb","core","Binomial"],UA.get=function(h,d){if(d==0)return 1;if(h==0||d>h)return 0;if(d>h-d&&(d=h-d),UA.memo_exists(h,d))return UA.get_memo(h,d);for(var v=1,x=h,F=1,Y=d+1;F<Y;){var K=F++;if(UA.memo_exists(x,K)){h--,v=UA.get_memo(x,K);continue}v*=h--,v/=K,UA.memoize(x,K,v)}return v},UA.get_no_memo=function(h,d){if(d==0)return 1;if(h==0||d>h)return 0;d>h-d&&(d=h-d);for(var v=1,x=1,F=d+1;x<F;){var Y=x++;v*=h--,v/=Y}return v},UA.memo_exists=function(h,d){return UA.memo.h.hasOwnProperty(h)&&UA.memo.h[h].h.hasOwnProperty(d)},UA.get_memo=function(h,d){return UA.memo.h[h].h[d]},UA.memoize=function(h,d,v){UA.memo.h.hasOwnProperty(h)||UA.memo.set(h,new O),UA.memo.h[h].h[d]=v};var XA=o.core.BoundingBox=function(h){this.max=null,this.min=null,this.dim=3,this.initialized=!1,h!=null&&this.addRange(h)};a["verb.core.BoundingBox"]=XA,XA.__name__=["verb","core","BoundingBox"],XA.intervalsOverlap=function(h,d,v,x,F){F==null&&(F=-1);var Y;F<-.5?Y=bA.TOLERANCE:Y=F;var K=Math.min(h,d)-Y,q=Math.max(h,d)+Y,j=Math.min(v,x)-Y,rA=Math.max(v,x)+Y;return K>=j&&K<=rA||q>=j&&q<=rA||j>=K&&j<=q||rA>=K&&rA<=q},XA.prototype={fromPoint:function(h){return new XA([h])},add:function(h){if(!this.initialized)return this.dim=h.length,this.min=h.slice(0),this.max=h.slice(0),this.initialized=!0,this;for(var d=0,v=this.dim;d<v;){var x=d++;h[x]>this.max[x]&&(this.max[x]=h[x]),h[x]<this.min[x]&&(this.min[x]=h[x])}return this},addRange:function(h){for(var d=h.length,v=0;v<d;){var x=v++;this.add(h[x])}return this},contains:function(h,d){return d==null&&(d=-1),this.initialized?this.intersects(new XA([h]),d):!1},intersects:function(h,d){if(d==null&&(d=-1),!this.initialized||!h.initialized)return!1;for(var v=this.min,x=this.max,F=h.min,Y=h.max,K=0,q=this.dim;K<q;){var j=K++;if(!XA.intervalsOverlap(v[j],x[j],F[j],Y[j],d))return!1}return!0},clear:function(){return this.initialized=!1,this},getLongestAxis:function(){for(var h=0,d=0,v=0,x=this.dim;v<x;){var F=v++,Y=this.getAxisLength(F);Y>h&&(h=Y,d=F)}return d},getAxisLength:function(h){return h<0||h>this.dim-1?0:Math.abs(this.min[h]-this.max[h])},intersect:function(h,d){if(!this.initialized)return null;var v=this.min,x=this.max,F=h.min,Y=h.max;if(!this.intersects(h,d))return null;for(var K=[],q=[],j=0,rA=this.dim;j<rA;){var gA=j++;K.push(Math.min(x[gA],Y[gA])),q.push(Math.max(v[gA],F[gA]))}return new XA([q,K])},__class__:XA};var bA=o.core.Constants=function(){};a["verb.core.Constants"]=bA,bA.__name__=["verb","core","Constants"];var nt=o.core.SerializableBase=function(){};a["verb.core.SerializableBase"]=nt,nt.__name__=["verb","core","SerializableBase"],nt.prototype={serialize:function(){var h=new b;return h.serialize(this),h.toString()},__class__:nt};var It=o.core.Plane=function(h,d){this.origin=h,this.normal=d};a["verb.core.Plane"]=It,It.__name__=["verb","core","Plane"],It.__super__=nt,It.prototype=c(nt.prototype,{__class__:It});var St=o.core.Ray=function(h,d){this.origin=h,this.dir=d};a["verb.core.Ray"]=St,St.__name__=["verb","core","Ray"],St.__super__=nt,St.prototype=c(nt.prototype,{__class__:St});var gt=o.core.NurbsCurveData=function(h,d,v){this.degree=h,this.controlPoints=v,this.knots=d};a["verb.core.NurbsCurveData"]=gt,gt.__name__=["verb","core","NurbsCurveData"],gt.__super__=nt,gt.prototype=c(nt.prototype,{__class__:gt});var it=o.core.NurbsSurfaceData=function(h,d,v,x,F){this.degreeU=h,this.degreeV=d,this.knotsU=v,this.knotsV=x,this.controlPoints=F};a["verb.core.NurbsSurfaceData"]=it,it.__name__=["verb","core","NurbsSurfaceData"],it.__super__=nt,it.prototype=c(nt.prototype,{__class__:it});var Nt=o.core.MeshData=function(h,d,v,x){this.faces=h,this.points=d,this.normals=v,this.uvs=x};a["verb.core.MeshData"]=Nt,Nt.__name__=["verb","core","MeshData"],Nt.empty=function(){return new Nt([],[],[],[])},Nt.__super__=nt,Nt.prototype=c(nt.prototype,{__class__:Nt});var Pt=o.core.PolylineData=function(h,d){this.points=h,this.params=d};a["verb.core.PolylineData"]=Pt,Pt.__name__=["verb","core","PolylineData"],Pt.__super__=nt,Pt.prototype=c(nt.prototype,{__class__:Pt});var se=o.core.VolumeData=function(h,d,v,x,F,Y,K){this.degreeU=h,this.degreeV=d,this.degreeW=v,this.knotsU=x,this.knotsV=F,this.knotsW=Y,this.controlPoints=K};a["verb.core.VolumeData"]=se,se.__name__=["verb","core","VolumeData"],se.__super__=nt,se.prototype=c(nt.prototype,{__class__:se});var Tt=o.core.Pair=function(h,d){this.item0=h,this.item1=d};a["verb.core.Pair"]=Tt,Tt.__name__=["verb","core","Pair"],Tt.prototype={__class__:Tt};var Ft=o.core.Interval=function(h,d){this.min=h,this.max=d};a["verb.core.Interval"]=Ft,Ft.__name__=["verb","core","Interval"],Ft.prototype={__class__:Ft};var jt=o.core.CurveCurveIntersection=function(h,d,v,x){this.point0=h,this.point1=d,this.u0=v,this.u1=x};a["verb.core.CurveCurveIntersection"]=jt,jt.__name__=["verb","core","CurveCurveIntersection"],jt.prototype={__class__:jt};var re=o.core.CurveSurfaceIntersection=function(h,d,v,x){this.u=h,this.uv=d,this.curvePoint=v,this.surfacePoint=x};a["verb.core.CurveSurfaceIntersection"]=re,re.__name__=["verb","core","CurveSurfaceIntersection"],re.prototype={__class__:re};var Kt=o.core.MeshIntersectionPoint=function(h,d,v,x,F){this.visited=!1,this.adj=null,this.opp=null,this.uv0=h,this.uv1=d,this.point=v,this.faceIndex0,this.faceIndex1};a["verb.core.MeshIntersectionPoint"]=Kt,Kt.__name__=["verb","core","MeshIntersectionPoint"],Kt.prototype={__class__:Kt};var ue=o.core.PolylineMeshIntersection=function(h,d,v,x,F){this.point=h,this.u=d,this.uv=v,this.polylineIndex=x,this.faceIndex=F};a["verb.core.PolylineMeshIntersection"]=ue,ue.__name__=["verb","core","PolylineMeshIntersection"],ue.prototype={__class__:ue};var ce=o.core.SurfaceSurfaceIntersectionPoint=function(h,d,v,x){this.uv0=h,this.uv1=d,this.point=v,this.dist=x};a["verb.core.SurfaceSurfaceIntersectionPoint"]=ce,ce.__name__=["verb","core","SurfaceSurfaceIntersectionPoint"],ce.prototype={__class__:ce};var De=o.core.TriSegmentIntersection=function(h,d,v,x){this.point=h,this.s=d,this.t=v,this.p=x};a["verb.core.TriSegmentIntersection"]=De,De.__name__=["verb","core","TriSegmentIntersection"],De.prototype={__class__:De};var le=o.core.CurveTriPoint=function(h,d,v){this.u=h,this.point=d,this.uv=v};a["verb.core.CurveTriPoint"]=le,le.__name__=["verb","core","CurveTriPoint"],le.prototype={__class__:le};var Xt=function(h,d,v,x,F){F==null&&(F=!1),x==null&&(x=-1),this.uv=v,this.point=h,this.normal=d,this.id=x,this.degen=F};a["verb.core.SurfacePoint"]=Xt,Xt.__name__=["verb","core","SurfacePoint"],Xt.fromUv=function(h,d){return new Xt(null,null,[h,d])},Xt.prototype={__class__:Xt};var we=o.core.CurvePoint=function(h,d){this.u=h,this.pt=d};a["verb.core.CurvePoint"]=we,we.__name__=["verb","core","CurvePoint"],we.prototype={__class__:we};var Lt=o.core.KdTree=function(h,d){this.dim=3,this.points=h,this.distanceFunction=d,this.dim=h[0].point.length,this.root=this.buildTree(h,0,null)};a["verb.core.KdTree"]=Lt,Lt.__name__=["verb","core","KdTree"],Lt.prototype={buildTree:function(h,d,v){var x=d%this.dim,F,Y;return h.length==0?null:h.length==1?new Z(h[0],x,v):(h.sort(function(K,q){var j=K.point[x]-q.point[x];return j==0?0:j>0?1:-1}),F=Math.floor(h.length/2),Y=new Z(h[F],x,v),Y.left=this.buildTree(h.slice(0,F),d+1,Y),Y.right=this.buildTree(h.slice(F+1),d+1,Y),Y)},nearest:function(h,d,v){var x=this,F=new Jt(function(cA){return-cA.item1}),Y,K=null;K=function(cA){for(var uA,fA=cA.dimension,pA=x.distanceFunction(h,cA.kdPoint.point),MA,vA=[],TA=0,SA=x.dim;TA<SA;)TA++,vA.push(0);MA=vA;for(var kA,HA,zA=function(jA,tt){F.push(new Tt(jA,tt)),F.size()>d&&F.pop()},ZA=0,VA=x.dim;ZA<VA;){var KA=ZA++;KA==cA.dimension?MA[KA]=h[KA]:MA[KA]=cA.kdPoint.point[KA]}if(kA=x.distanceFunction(MA,cA.kdPoint.point),cA.right==null&&cA.left==null){(F.size()<d||pA<F.peek().item1)&&zA(cA,pA);return}cA.right==null?uA=cA.left:cA.left==null?uA=cA.right:h[fA]<cA.kdPoint.point[fA]?uA=cA.left:uA=cA.right,K(uA),(F.size()<d||pA<F.peek().item1)&&zA(cA,pA),(F.size()<d||Math.abs(kA)<F.peek().item1)&&(uA==cA.left?HA=cA.right:HA=cA.left,HA!=null&&K(HA))},Y=K;for(var q=0;q<d;)q++,F.push(new Tt(null,v));Y(this.root);for(var j=[],rA=0;rA<d;){var gA=rA++;F.content[gA].item0!=null&&j.push(new Tt(F.content[gA].item0.kdPoint,F.content[gA].item1))}return j},__class__:Lt};var Jt=function(h){this.content=[],this.scoreFunction=h};a["verb.core.BinaryHeap"]=Jt,Jt.__name__=["verb","core","BinaryHeap"],Jt.prototype={push:function(h){this.content.push(h),this.bubbleUp(this.content.length-1)},pop:function(){var h=this.content[0],d=this.content.pop();return this.content.length>0&&(this.content[0]=d,this.sinkDown(0)),h},peek:function(){return this.content[0]},remove:function(h){for(var d=this.content.length,v=0;v<d;){var x=v++;if(this.content[x]==h){var F=this.content.pop();x!=d-1&&(this.content[x]=F,this.scoreFunction(F)<this.scoreFunction(h)?this.bubbleUp(x):this.sinkDown(x));return}}throw new W("Node not found.")},size:function(){return this.content.length},bubbleUp:function(h){for(var d=this.content[h];h>0;){var v=Math.floor((h+1)/2)-1,x=this.content[v];if(this.scoreFunction(d)<this.scoreFunction(x))this.content[v]=d,this.content[h]=x,h=v;else break}},sinkDown:function(h){for(var d=this.content.length,v=this.content[h],x=this.scoreFunction(v);;){var F=(h+1)*2,Y=F-1,K=-1,q=0;if(Y<d){var j=this.content[Y];q=this.scoreFunction(j),q<x&&(K=Y)}if(F<d){var rA=this.content[F],gA=this.scoreFunction(rA);gA<(K==-1?x:q)&&(K=F)}if(K!=-1)this.content[h]=this.content[K],this.content[K]=v,h=K;else break}},__class__:Jt};var J=o.core.KdPoint=function(h,d){this.point=h,this.obj=d};a["verb.core.KdPoint"]=J,J.__name__=["verb","core","KdPoint"],J.prototype={__class__:J};var Z=o.core.KdNode=function(h,d,v){this.kdPoint=h,this.left=null,this.right=null,this.parent=v,this.dimension=d};a["verb.core.KdNode"]=Z,Z.__name__=["verb","core","KdNode"],Z.prototype={__class__:Z};var sA=function(){};a["verb.eval.IBoundingBoxTree"]=sA,sA.__name__=["verb","eval","IBoundingBoxTree"],sA.prototype={__class__:sA};var CA=function(h,d){this._boundingBox=null,this._curve=h,d==null&&(d=V.domain(this._curve.knots)/64),this._knotTol=d};a["verb.core.LazyCurveBoundingBoxTree"]=CA,CA.__name__=["verb","core","LazyCurveBoundingBoxTree"],CA.__interfaces__=[sA],CA.prototype={split:function(){var h=DA.first(this._curve.knots),d=DA.last(this._curve.knots),v=d-h,x=Ae.curveSplit(this._curve,(d+h)/2+v*.1*Math.random());return new Tt(new CA(x[0],this._knotTol),new CA(x[1],this._knotTol))},boundingBox:function(){return this._boundingBox==null&&(this._boundingBox=new XA(mA.dehomogenize1d(this._curve.controlPoints))),this._boundingBox},yield:function(){return this._curve},indivisible:function(h){return V.domain(this._curve.knots)<this._knotTol},empty:function(){return!1},__class__:CA};var QA=function(h,d){if(this._boundingBox=null,this._mesh=h,d==null){for(var v=[],x=0,F=h.faces.length;x<F;){var Y=x++;v.push(Y)}d=v}this._faceIndices=d};a["verb.core.LazyMeshBoundingBoxTree"]=QA,QA.__name__=["verb","core","LazyMeshBoundingBoxTree"],QA.__interfaces__=[sA],QA.prototype={split:function(){var h=$A.sortTrianglesOnLongestAxis(this.boundingBox(),this._mesh,this._faceIndices),d=DA.left(h),v=DA.right(h);return new Tt(new QA(this._mesh,d),new QA(this._mesh,v))},boundingBox:function(){return this._boundingBox==null&&(this._boundingBox=$A.makeMeshAabb(this._mesh,this._faceIndices)),this._boundingBox},yield:function(){return this._faceIndices[0]},indivisible:function(h){return this._faceIndices.length==1},empty:function(){return this._faceIndices.length==0},__class__:QA};var RA=function(h,d){this._boundingBox=null,this._polyline=h,d==null&&(d=new Ft(0,h.points.length!=0?h.points.length-1:0)),this._interval=d};a["verb.core.LazyPolylineBoundingBoxTree"]=RA,RA.__name__=["verb","core","LazyPolylineBoundingBoxTree"],RA.__interfaces__=[sA],RA.prototype={split:function(){var h=this._interval.min,d=this._interval.max,v=h+Math.ceil((d-h)/2),x=new Ft(h,v),F=new Ft(v,d);return new Tt(new RA(this._polyline,x),new RA(this._polyline,F))},boundingBox:function(){return this._boundingBox==null&&(this._boundingBox=new XA(this._polyline.points)),this._boundingBox},yield:function(){return this._interval.min},indivisible:function(h){return this._interval.max-this._interval.min==1},empty:function(){return this._interval.max-this._interval.min==0},__class__:RA};var AA=function(h,d,v,x){d==null&&(d=!1),this._boundingBox=null,this._surface=h,this._splitV=d,v==null&&(v=V.domain(h.knotsU)/16),x==null&&(x=V.domain(h.knotsV)/16),this._knotTolU=v,this._knotTolV=x};a["verb.core.LazySurfaceBoundingBoxTree"]=AA,AA.__name__=["verb","core","LazySurfaceBoundingBoxTree"],AA.__interfaces__=[sA],AA.prototype={split:function(){var h,d;this._splitV?(h=DA.first(this._surface.knotsV),d=DA.last(this._surface.knotsV)):(h=DA.first(this._surface.knotsU),d=DA.last(this._surface.knotsU));var v=(h+d)/2,x=Ae.surfaceSplit(this._surface,v,this._splitV);return new Tt(new AA(x[0],!this._splitV,this._knotTolU,this._knotTolV),new AA(x[1],!this._splitV,this._knotTolU,this._knotTolV))},boundingBox:function(){if(this._boundingBox==null){this._boundingBox=new XA;for(var h=0,d=this._surface.controlPoints;h<d.length;){var v=d[h];++h,this._boundingBox.addRange(mA.dehomogenize1d(v))}}return this._boundingBox},yield:function(){return this._surface},indivisible:function(h){return V.domain(this._surface.knotsV)<this._knotTolV&&V.domain(this._surface.knotsU)<this._knotTolU},empty:function(){return!1},__class__:AA};var GA=o.core.Mat=function(){};a["verb.core.Mat"]=GA,GA.__name__=["verb","core","Mat"],GA.mul=function(h,d){for(var v=[],x=0,F=d.length;x<F;){var Y=x++;v.push(V.mul(h,d[Y]))}return v},GA.mult=function(h,d){var v,x,F,Y,K,q,j,rA;v=h.length,x=d.length,F=d[0].length,Y=[];for(var gA=v-1,cA=0,uA=0;gA>=0;){for(K=[],q=h[gA],uA=F-1;uA>=0;){for(j=q[x-1]*d[x-1][uA],cA=x-2;cA>=1;)rA=cA-1,j+=q[cA]*d[cA][uA]+q[rA]*d[rA][uA],cA-=2;cA==0&&(j+=q[0]*d[0][uA]),K[uA]=j,uA--}Y[gA]=K,gA--}return Y},GA.add=function(h,d){for(var v=[],x=0,F=h.length;x<F;){var Y=x++;v.push(V.add(h[Y],d[Y]))}return v},GA.div=function(h,d){for(var v=[],x=0,F=h.length;x<F;){var Y=x++;v.push(V.div(h[Y],d))}return v},GA.sub=function(h,d){for(var v=[],x=0,F=h.length;x<F;){var Y=x++;v.push(V.sub(h[Y],d[Y]))}return v},GA.dot=function(h,d){for(var v=[],x=0,F=h.length;x<F;){var Y=x++;v.push(V.dot(h[Y],d))}return v},GA.identity=function(h){for(var d=V.zeros2d(h,h),v=0;v<h;){var x=v++;d[x][x]=1}return d},GA.transpose=function(h){if(h.length==0)return[];for(var d=[],v=0,x=h[0].length;v<x;){var F=v++;d.push((function(Y){for(var K,q=[],j=0,rA=h.length;j<rA;){var gA=j++;q.push(h[gA][F])}return K=q,K})())}return d},GA.solve=function(h,d){return GA.LUsolve(GA.LU(h),d)},GA.LUsolve=function(h,d){var v,x,F=h.LU,Y=F.length,K=d.slice(),q=h.P,j,rA,gA;for(v=Y-1;v!=-1;)K[v]=d[v],--v;for(v=0;v<Y;){for(j=q[v],q[v]!=v&&(gA=K[v],K[v]=K[j],K[j]=gA),rA=F[v],x=0;x<v;)K[v]-=K[x]*rA[x],++x;++v}for(v=Y-1;v>=0;){for(rA=F[v],x=v+1;x<Y;)K[v]-=K[x]*rA[x],++x;K[v]/=rA[v],--v}return K},GA.LU=function(h){for(var d,v,x,F,Y,K,q,j,rA,gA=[],cA=0,uA=h.length;cA<uA;){var fA=cA++;gA.push(h[fA].slice())}h=gA;var pA=h.length,MA=pA-1,vA=[];for(x=0;x<pA;){for(q=x,K=h[x],rA=Math.abs(K[x]),v=x+1;v<pA;)F=Math.abs(h[v][x]),rA<F&&(rA=F,q=v),++v;for(vA[x]=q,q!=x&&(h[x]=h[q],h[q]=K,K=h[x]),Y=K[x],d=x+1;d<pA;)h[d][x]/=Y,++d;for(d=x+1;d<pA;){for(j=h[d],v=x+1;v<MA;)j[v]-=j[x]*K[v],++v,j[v]-=j[x]*K[v],++v;v==MA&&(j[v]-=j[x]*K[v]),++d}++x}return new st(h,vA)};var st=function(h,d){this.LU=h,this.P=d};a["verb.core._Mat.LUDecomp"]=st,st.__name__=["verb","core","_Mat","LUDecomp"],st.prototype={__class__:st};var $A=o.core.Mesh=function(){};a["verb.core.Mesh"]=$A,$A.__name__=["verb","core","Mesh"],$A.getTriangleNorm=function(h,d){var v=h[d[0]],x=h[d[1]],F=h[d[2]],Y=V.sub(x,v),K=V.sub(F,v),q=V.cross(Y,K);return V.mul(1/V.norm(q),q)},$A.makeMeshAabb=function(h,d){for(var v=new XA,x=0;x<d.length;){var F=d[x];++x,v.add(h.points[h.faces[F][0]]),v.add(h.points[h.faces[F][1]]),v.add(h.points[h.faces[F][2]])}return v},$A.sortTrianglesOnLongestAxis=function(h,d,v){for(var x=h.getLongestAxis(),F=[],Y=0;Y<v.length;){var K=v[Y];++Y;var q=$A.getMinCoordOnAxis(d.points,d.faces[K],x);F.push(new Tt(q,K))}F.sort(function(uA,fA){var pA=uA.item0,MA=fA.item0;return pA==MA?0:pA>MA?1:-1});for(var j=[],rA=0,gA=F.length;rA<gA;){var cA=rA++;j.push(F[cA].item1)}return j},$A.getMinCoordOnAxis=function(h,d,v){for(var x=1/0,F=0;F<3;){var Y=F++,K=h[d[Y]][v];K<x&&(x=K)}return x},$A.getTriangleCentroid=function(h,d){for(var v=[0,0,0],x=0;x<3;)for(var F=x++,Y=0;Y<3;){var K=Y++;v[K]+=h[d[F]][K]}for(var q=0;q<3;){var j=q++;v[j]/=3}return v},$A.triangleUVFromPoint=function(h,d,v){var x=h.faces[d],F=h.points[x[0]],Y=h.points[x[1]],K=h.points[x[2]],q=h.uvs[x[0]],j=h.uvs[x[1]],rA=h.uvs[x[2]],gA=V.sub(F,v),cA=V.sub(Y,v),uA=V.sub(K,v),fA=V.norm(V.cross(V.sub(F,Y),V.sub(F,K))),pA=V.norm(V.cross(cA,uA))/fA,MA=V.norm(V.cross(uA,gA))/fA,vA=V.norm(V.cross(gA,cA))/fA;return V.add(V.mul(pA,q),V.add(V.mul(MA,j),V.mul(vA,rA)))};var vt=function(h,d){if(this._empty=!1,this._face=-1,d==null){for(var v=[],x=0,F=h.faces.length;x<F;){var Y=x++;v.push(Y)}d=v}if(this._boundingBox=$A.makeMeshAabb(h,d),d.length<1){this._empty=!0;return}else if(d.length<2){this._face=d[0];return}var K=$A.sortTrianglesOnLongestAxis(this._boundingBox,h,d),q=DA.left(K),j=DA.right(K);this._children=new Tt(new vt(h,q),new vt(h,j))};a["verb.core.MeshBoundingBoxTree"]=vt,vt.__name__=["verb","core","MeshBoundingBoxTree"],vt.__interfaces__=[sA],vt.prototype={split:function(){return this._children},boundingBox:function(){return this._boundingBox},yield:function(){return this._face},indivisible:function(h){return this._children==null},empty:function(){return this._empty},__class__:vt};var Dt=o.core.Minimizer=function(){};a["verb.core.Minimizer"]=Dt,Dt.__name__=["verb","core","Minimizer"],Dt.uncmin=function(h,d,v,x,F){v==null&&(v=1e-8),x==null&&(x=function(ZA){return Dt.numericalGradient(h,ZA)}),F==null&&(F=1e3),d=d.slice(0);var Y=d.length,K=h(d),q=K,j;if(isNaN(K))throw new W("uncmin: f(x0) is a NaN!");v=Math.max(v,bA.EPSILON);var rA,gA,cA,uA=GA.identity(Y),fA=0,pA=[],MA,vA,TA,SA,kA,HA,zA="";for(gA=x(d);fA<F;){if(!V.all(V.finite(gA))){zA="Gradient has Infinity or NaN";break}if(rA=V.neg(GA.dot(uA,gA)),!V.all(V.finite(rA))){zA="Search direction has Infinity or NaN";break}if(HA=V.norm(rA),HA<v){zA="Newton step smaller than tol";break}for(kA=1,j=V.dot(gA,rA),MA=d;fA<F&&!(kA*HA<v);){if(pA=V.mul(kA,rA),MA=V.add(d,pA),q=h(MA),q-K>=.1*kA*j||isNaN(q)){kA*=.5,++fA;continue}break}if(kA*HA<v){zA="Line search step size smaller than tol";break}if(fA==F){zA="maxit reached during line search";break}cA=x(MA),vA=V.sub(cA,gA),SA=V.dot(vA,pA),TA=GA.dot(uA,vA),uA=GA.sub(GA.add(uA,GA.mul((SA+V.dot(vA,TA))/(SA*SA),Dt.tensor(pA,pA))),GA.div(GA.add(Dt.tensor(TA,pA),Dt.tensor(pA,TA)),SA)),d=MA,K=q,gA=cA,++fA}return new Mt(d,K,gA,uA,fA,zA)},Dt.numericalGradient=function(h,d){var v=d.length,x=h(d);if(x==NaN)throw new W("gradient: f(x) is a NaN!");for(var F=d.slice(0),Y,K,q=[],j,rA=.001,gA,cA,uA,fA=0,pA,MA,vA,TA=0;TA<v;)for(var SA=TA++,kA=Math.max(1e-6*x,1e-8);;){if(++fA,fA>20)throw new W("Numerical gradient fails");if(F[SA]=d[SA]+kA,Y=h(F),F[SA]=d[SA]-kA,K=h(F),F[SA]=d[SA],isNaN(Y)||isNaN(K)){kA/=16;continue}if(q[SA]=(Y-K)/(2*kA),gA=d[SA]-kA,cA=d[SA],uA=d[SA]+kA,pA=(Y-x)/kA,MA=(x-K)/kA,vA=V.max([Math.abs(q[SA]),Math.abs(x),Math.abs(Y),Math.abs(K),Math.abs(gA),Math.abs(cA),Math.abs(uA),1e-8]),j=Math.min(V.max([Math.abs(pA-q[SA]),Math.abs(MA-q[SA]),Math.abs(pA-MA)])/vA,kA/vA),j>rA)kA/=16;else break}return q},Dt.tensor=function(h,d){for(var v=h.length,x=d.length,F=[],Y,K,q=v-1;q>=0;){Y=[],K=h[q];for(var j=x-1;j>=3;)Y[j]=K*d[j],--j,Y[j]=K*d[j],--j,Y[j]=K*d[j],--j,Y[j]=K*d[j],--j;for(;j>=0;)Y[j]=K*d[j],--j;F[q]=Y,q--}return F};var Mt=function(h,d,v,x,F,Y){this.solution=h,this.value=d,this.gradient=v,this.invHessian=x,this.iterations=F,this.message=Y};a["verb.core.MinimizationResult"]=Mt,Mt.__name__=["verb","core","MinimizationResult"],Mt.prototype={__class__:Mt};var et=function(){};a["verb.core.ISerializable"]=et,et.__name__=["verb","core","ISerializable"],et.prototype={__class__:et};var Ct=o.core.Deserializer=function(){};a["verb.core.Deserializer"]=Ct,Ct.__name__=["verb","core","Deserializer"],Ct.deserialize=function(h){var d=new G(h),v=d.unserialize();return v};var yt=o.core.Trig=function(){};a["verb.core.Trig"]=yt,yt.__name__=["verb","core","Trig"],yt.isPointInPlane=function(h,d,v){return Math.abs(V.dot(V.sub(h,d.origin),d.normal))<v},yt.distToSegment=function(h,d,v){var x=yt.segmentClosestPoint(d,h,v,0,1);return V.dist(d,x.pt)},yt.rayClosestPoint=function(h,d,v){var x=V.sub(h,d),F=V.dot(x,v),Y=V.add(d,V.mul(F,v));return Y},yt.distToRay=function(h,d,v){var x=yt.rayClosestPoint(h,d,v),F=V.sub(x,h);return V.norm(F)},yt.threePointsAreFlat=function(h,d,v,x){var F=V.sub(d,h),Y=V.sub(v,h),K=V.cross(F,Y),q=V.dot(K,K);return q<x},yt.segmentClosestPoint=function(h,d,v,x,F){var Y=V.sub(v,d),K=V.norm(Y);if(K<bA.EPSILON)return{u:x,pt:d};var q=d,j=V.mul(1/K,Y),rA=V.sub(h,q),gA=V.dot(rA,j);return gA<0?{u:x,pt:d}:gA>K?{u:F,pt:v}:{u:x+(F-x)*gA/K,pt:V.add(q,V.mul(gA,j))}};var V=o.core.Vec=function(){};a["verb.core.Vec"]=V,V.__name__=["verb","core","Vec"],V.angleBetween=function(h,d){return Math.acos(V.dot(h,d)/(V.norm(h)*V.norm(d)))},V.positiveAngleBetween=function(h,d,v){var x=V.cross(h,d),F=V.norm(h),Y=V.norm(d),K=F*Y,q=V.dot(h,d),j=V.norm(x)/K,rA=q/K,gA=Math.atan2(j,rA),cA=V.dot(v,x);return Math.abs(cA)<bA.EPSILON||cA>0?gA:-gA},V.signedAngleBetween=function(h,d,v){var x=V.cross(h,d),F=V.norm(h),Y=V.norm(d),K=F*Y,q=V.dot(h,d),j=V.norm(x)/K,rA=q/K,gA=Math.atan2(j,rA),cA=V.dot(v,x);return cA>0?gA:2*Math.PI-gA},V.angleBetweenNormalized2d=function(h,d){var v=h[0]*d[1]-h[1]*d[0];return Math.atan2(v,V.dot(h,d))},V.domain=function(h){return DA.last(h)-DA.first(h)},V.range=function(h){for(var d=[],v=0,x=0;x<h;)x++,d.push(v),v+=1;return d},V.span=function(h,d,v){if(v==null)return[];if(v<bA.EPSILON)return[];if(h>d&&v>0)return[];if(d>h&&v<0)return[];for(var x=[],F=h;F<=d;)x.push(F),F+=v;return x},V.neg=function(h){return h.map(function(d){return-d})},V.min=function(h){return u.fold(h,function(d,v){return Math.min(d,v)},1/0)},V.max=function(h){return u.fold(h,function(d,v){return Math.max(d,v)},-1/0)},V.all=function(h){return u.fold(h,function(d,v){return v&&d},!0)},V.finite=function(h){return h.map(function(d){return isFinite(d)})},V.onRay=function(h,d,v){return V.add(h,V.mul(v,d))},V.lerp=function(h,d,v){return V.add(V.mul(h,d),V.mul(1-h,v))},V.normalized=function(h){return V.div(h,V.norm(h))},V.cross=function(h,d){return[h[1]*d[2]-h[2]*d[1],h[2]*d[0]-h[0]*d[2],h[0]*d[1]-h[1]*d[0]]},V.dist=function(h,d){return V.norm(V.sub(h,d))},V.distSquared=function(h,d){return V.normSquared(V.sub(h,d))},V.sum=function(h){return u.fold(h,function(d,v){return v+d},0)},V.addAll=function(h){var d=oe(h)();if(!d.hasNext())return null;var v=d.next().length;return u.fold(h,function(x,F){return V.add(F,x)},V.rep(v,0))},V.norm=function(h){var d=V.normSquared(h);return d!=0?Math.sqrt(d):d},V.normSquared=function(h){return u.fold(h,function(d,v){return v+d*d},0)},V.rep=function(h,d){for(var v=[],x=0;x<h;)x++,v.push(d);return v},V.zeros1d=function(h){for(var d=[],v=0;v<h;)v++,d.push(0);return d},V.zeros2d=function(h,d){for(var v=[],x=0;x<h;)x++,v.push(V.zeros1d(d));return v},V.zeros3d=function(h,d,v){for(var x=[],F=0;F<h;)F++,x.push(V.zeros2d(d,v));return x},V.dot=function(h,d){for(var v=0,x=0,F=h.length;x<F;){var Y=x++;v+=h[Y]*d[Y]}return v},V.add=function(h,d){for(var v=[],x=0,F=h.length;x<F;){var Y=x++;v.push(h[Y]+d[Y])}return v},V.mul=function(h,d){for(var v=[],x=0,F=d.length;x<F;){var Y=x++;v.push(h*d[Y])}return v},V.div=function(h,d){for(var v=[],x=0,F=h.length;x<F;){var Y=x++;v.push(h[Y]/d)}return v},V.sub=function(h,d){for(var v=[],x=0,F=h.length;x<F;){var Y=x++;v.push(h[Y]-d[Y])}return v},V.isZero=function(h){for(var d=0,v=h.length;d<v;){var x=d++;if(Math.abs(h[x])>bA.TOLERANCE)return!1}return!0},V.sortedSetUnion=function(h,d){for(var v=[],x=0,F=0;x<h.length||F<d.length;){if(x>=h.length){v.push(d[F]),F++;continue}else if(F>=d.length){v.push(h[x]),x++;continue}var Y=h[x]-d[F];if(Math.abs(Y)<bA.EPSILON){v.push(h[x]),x++,F++;continue}if(Y>0){v.push(d[F]),F++;continue}v.push(h[x]),x++}return v},V.sortedSetSub=function(h,d){for(var v=[],x=0,F=0;x<h.length;){if(F>=d.length){v.push(h[x]),x++;continue}if(Math.abs(h[x]-d[F])<bA.EPSILON){x++,F++;continue}v.push(h[x]),x++}return v};var wt=o.eval.Analyze=function(){};a["verb.eval.Analyze"]=wt,wt.__name__=["verb","eval","Analyze"],wt.knotMultiplicities=function(h){for(var d=[new _e(h[0],0)],v=d[0],x=0;x<h.length;){var F=h[x];++x,Math.abs(F-v.knot)>bA.EPSILON&&(v=new _e(F,0),d.push(v)),v.inc()}return d},wt.isRationalSurfaceClosed=function(h,d){d==null&&(d=!0);var v;d?v=h.controlPoints:v=GA.transpose(h.controlPoints);for(var x=0,F=v[0].length;x<F;){var Y=x++,K=V.dist(DA.first(v)[Y],DA.last(v)[Y])<bA.EPSILON;if(!K)return!1}return!0},wt.rationalSurfaceClosestPoint=function(h,d){var v=wt.rationalSurfaceClosestParam(h,d);return mA.rationalSurfacePoint(h,v[0],v[1])},wt.rationalSurfaceClosestParam=function(h,d){for(var v=5,x=0,F,Y=1e-4,K=5e-4,q,j=h.knotsU[0],rA=DA.last(h.knotsU),gA=h.knotsV[0],cA=DA.last(h.knotsV),uA=wt.isRationalSurfaceClosed(h),fA=wt.isRationalSurfaceClosed(h,!1),pA,MA=xt.rationalSurfaceAdaptive(h,new Be),vA=1/0,TA=0,SA=MA.points.length;TA<SA;){var kA=TA++,HA=MA.points[kA],zA=V.normSquared(V.sub(d,HA));zA<vA&&(vA=zA,pA=MA.uvs[kA])}for(var ZA=function(Ut){return mA.rationalSurfaceDerivatives(h,Ut[0],Ut[1],2)},VA=function(Ut,kt,_t){var Ot=kt[1][0],ge=kt[0][1],Qe=kt[2][0],Zt=kt[0][2],$t=kt[1][1],ae=kt[1][1],Vt=V.dot(Ot,_t),fe=V.dot(ge,_t),Ne=[-Vt,-fe],Ie=V.dot(Ot,Ot)+V.dot(Qe,_t),pe=V.dot(Ot,ge)+V.dot($t,_t),Ht=V.dot(Ot,ge)+V.dot(ae,_t),Se=V.dot(ge,ge)+V.dot(Zt,_t),Oe=[[Ie,pe],[Ht,Se]],Ye=GA.solve(Oe,Ne);return V.add(Ye,Ut)};x<v;){F=ZA(pA),q=V.sub(F[0][0],d);var KA=V.norm(q),jA=V.dot(F[1][0],q),tt=V.norm(F[1][0])*KA,ot=V.dot(F[0][1],q),ct=V.norm(F[0][1])*KA,lt=jA/tt,ut=ot/ct,Bt=KA<Y,rt=lt<K,ht=ut<K;if(Bt&&rt&&ht)return pA;var qA=VA(pA,F,q);qA[0]<j?uA?qA=[rA-(qA[0]-j),qA[1]]:qA=[j+bA.EPSILON,qA[1]]:qA[0]>rA&&(uA?qA=[j+(qA[0]-rA),qA[1]]:qA=[rA-bA.EPSILON,qA[1]]),qA[1]<gA?fA?qA=[qA[0],cA-(qA[1]-gA)]:qA=[qA[0],gA+bA.EPSILON]:qA[1]>cA&&(fA?qA=[qA[0],gA+(qA[0]-cA)]:qA=[qA[0],cA-bA.EPSILON]);var Qt=V.norm(V.mul(qA[0]-pA[0],F[1][0])),mt=V.norm(V.mul(qA[1]-pA[1],F[0][1]));if(Qt+mt<Y)return pA;pA=qA,x++}return pA},wt.rationalCurveClosestPoint=function(h,d){return mA.rationalCurvePoint(h,wt.rationalCurveClosestParam(h,d))},wt.rationalCurveClosestParam=function(h,d){for(var v=1/0,x=0,F=xt.rationalCurveRegularSample(h,h.controlPoints.length*h.degree,!0),Y=0,K=F.length-1;Y<K;){var q=Y++,j=F[q][0],rA=F[q+1][0],gA=F[q].slice(1),cA=F[q+1].slice(1),uA=yt.segmentClosestPoint(d,gA,cA,j,rA),fA=V.norm(V.sub(d,uA.pt));fA<v&&(v=fA,x=uA.u)}for(var pA=5,MA=0,vA,TA=1e-4,SA=5e-4,kA,HA=h.knots[0],zA=DA.last(h.knots),ZA=V.normSquared(V.sub(h.controlPoints[0],DA.last(h.controlPoints)))<bA.EPSILON,VA=x,KA=function(qA){return mA.rationalCurveDerivatives(h,qA,2)},jA=function(qA,Qt,mt){var Ut=V.dot(Qt[1],mt),kt=V.dot(Qt[2],mt),_t=V.dot(Qt[1],Qt[1]),Ot=kt+_t;return qA-Ut/Ot};MA<pA;){vA=KA(VA),kA=V.sub(vA[0],d);var tt=V.norm(kA),ot=V.dot(vA[1],kA),ct=V.norm(vA[1])*tt,lt=ot/ct,ut=tt<TA,Bt=Math.abs(lt)<SA;if(ut&&Bt)return VA;var rt=jA(VA,vA,kA);rt<HA?ZA?rt=zA-(rt-HA):rt=HA:rt>zA&&(ZA?rt=HA+(rt-zA):rt=zA);var ht=V.norm(V.mul(rt-VA,vA[1]));if(ht<TA)return VA;VA=rt,MA++}return VA},wt.rationalCurveParamAtArcLength=function(h,d,v,x,F){if(v==null&&(v=.001),d<bA.EPSILON)return h.knots[0];var Y;x!=null?Y=x:Y=dt.decomposeCurveIntoBeziers(h);var K=0;Y[K];var q=-bA.EPSILON,j;for(F!=null?j=F:j=[];q<d&&K<Y.length;){if(K<j.length?j[K]=j[K]:j[K]=wt.rationalBezierCurveArcLength(h),q+=j[K],d<q+bA.EPSILON)return wt.rationalBezierCurveParamAtArcLength(h,d,v,j[K]);K++}return-1},wt.rationalBezierCurveParamAtArcLength=function(h,d,v,x){if(d<0)return h.knots[0];var F;if(x!=null?F=x:F=wt.rationalBezierCurveArcLength(h),d>F)return DA.last(h.knots);var Y=h.knots[0],K=0,q=DA.last(h.knots),j=F,rA=0,gA=0,cA;for(v!=null?cA=v:cA=bA.TOLERANCE*2;j-K>cA;)rA=(Y+q)/2,gA=wt.rationalBezierCurveArcLength(h,rA),gA>d?(q=rA,j=gA):(Y=rA,K=gA);return(Y+q)/2},wt.rationalCurveArcLength=function(h,d,v){v==null&&(v=16),d==null?d=DA.last(h.knots):d=d;for(var x=dt.decomposeCurveIntoBeziers(h),F=0,Y=x[0],K=0;F<x.length&&Y.knots[0]+bA.EPSILON<d;){var q=Math.min(DA.last(Y.knots),d);K+=wt.rationalBezierCurveArcLength(Y,q,v),Y=x[++F]}return K},wt.rationalBezierCurveArcLength=function(h,d,v){v==null&&(v=16);var x;d==null?x=DA.last(h.knots):x=d;for(var F=(x-h.knots[0])/2,Y=0,K=h.degree+v,q,j,rA=0;rA<K;){var gA=rA++;q=F*wt.Tvalues[K][gA]+F+h.knots[0],j=mA.rationalCurveDerivatives(h,q,1),Y+=wt.Cvalues[K][gA]*V.norm(j[1])}return F*Y};var _e=o.eval.KnotMultiplicity=function(h,d){this.knot=h,this.mult=d};a["verb.eval.KnotMultiplicity"]=_e,_e.__name__=["verb","eval","KnotMultiplicity"],_e.prototype={inc:function(){this.mult++},__class__:_e};var ie=o.eval.Check=function(){};a["verb.eval.Check"]=ie,ie.__name__=["verb","eval","Check"],ie.isValidKnotVector=function(h,d){if(h.length==0||h.length<(d+1)*2)return!1;for(var v=DA.first(h),x=0,F=d+1;x<F;){var Y=x++;if(Math.abs(h[Y]-v)>bA.EPSILON)return!1}v=DA.last(h);for(var K=h.length-d-1,q=h.length;K<q;){var j=K++;if(Math.abs(h[j]-v)>bA.EPSILON)return!1}return ie.isNonDecreasing(h)},ie.isNonDecreasing=function(h){for(var d=DA.first(h),v=0,x=h.length;v<x;){var F=v++;if(h[F]<d-bA.EPSILON)return!1;d=h[F]}return!0},ie.isValidNurbsCurveData=function(h){if(h.controlPoints==null)throw new W("Control points array cannot be null!");if(h.degree==null)throw new W("Degree cannot be null!");if(h.degree<1)throw new W("Degree must be greater than 1!");if(h.knots==null)throw new W("Knots cannot be null!");if(h.knots.length!=h.controlPoints.length+h.degree+1)throw new W("controlPoints.length + degree + 1 must equal knots.length!");if(!ie.isValidKnotVector(h.knots,h.degree))throw new W("Invalid knot vector format! Should begin with degree + 1 repeats and end with degree + 1 repeats!");return h},ie.isValidNurbsSurfaceData=function(h){if(h.controlPoints==null)throw new W("Control points array cannot be null!");if(h.degreeU==null)throw new W("DegreeU cannot be null!");if(h.degreeV==null)throw new W("DegreeV cannot be null!");if(h.degreeU<1)throw new W("DegreeU must be greater than 1!");if(h.degreeV<1)throw new W("DegreeV must be greater than 1!");if(h.knotsU==null)throw new W("KnotsU cannot be null!");if(h.knotsV==null)throw new W("KnotsV cannot be null!");if(h.knotsU.length!=h.controlPoints.length+h.degreeU+1)throw new W("controlPointsU.length + degreeU + 1 must equal knotsU.length!");if(h.knotsV.length!=h.controlPoints[0].length+h.degreeV+1)throw new W("controlPointsV.length + degreeV + 1 must equal knotsV.length!");if(!ie.isValidKnotVector(h.knotsU,h.degreeU)||!ie.isValidKnotVector(h.knotsV,h.degreeV))throw new W("Invalid knot vector format! Should begin with degree + 1 repeats and end with degree + 1 repeats!");return h};var Ae=o.eval.Divide=function(){};a["verb.eval.Divide"]=Ae,Ae.__name__=["verb","eval","Divide"],Ae.surfaceSplit=function(h,d,v){v==null&&(v=!1);var x,F,Y;v?(Y=h.controlPoints,x=h.knotsV,F=h.degreeV):(Y=GA.transpose(h.controlPoints),x=h.knotsU,F=h.degreeU);for(var K,q=[],j=0,rA=F+1;j<rA;)j++,q.push(d);K=q;for(var gA=[],cA=[],uA=mA.knotSpan(F,d,x),fA=null,pA=0;pA<Y.length;){var MA=Y[pA];++pA,fA=dt.curveKnotRefine(new gt(F,x,MA),K),gA.push(fA.controlPoints.slice(0,uA+1)),cA.push(fA.controlPoints.slice(uA+1))}var vA=fA.knots.slice(0,uA+F+2),TA=fA.knots.slice(uA+1);return v?[new it(h.degreeU,F,h.knotsU.slice(),vA,gA),new it(h.degreeU,F,h.knotsU.slice(),TA,cA)]:(gA=GA.transpose(gA),cA=GA.transpose(cA),[new it(F,h.degreeV,vA,h.knotsV.slice(),gA),new it(F,h.degreeV,TA,h.knotsV.slice(),cA)])},Ae.curveSplit=function(h,d){var v=h.degree;h.controlPoints;for(var x=h.knots,F,Y=[],K=0,q=v+1;K<q;)K++,Y.push(d);F=Y;var j=dt.curveKnotRefine(h,F),rA=mA.knotSpan(v,d,x),gA=j.knots.slice(0,rA+v+2),cA=j.knots.slice(rA+1),uA=j.controlPoints.slice(0,rA+1),fA=j.controlPoints.slice(rA+1);return[new gt(v,gA,uA),new gt(v,cA,fA)]},Ae.rationalCurveByEqualArcLength=function(h,d){var v=wt.rationalCurveArcLength(h),x=v/d;return Ae.rationalCurveByArcLength(h,x)},Ae.rationalCurveByArcLength=function(h,d){var v=dt.decomposeCurveIntoBeziers(h),x=v.map(function(uA){return wt.rationalBezierCurveArcLength(uA)}),F=V.sum(x),Y=[new xe(h.knots[0],0)];if(d>F)return Y;for(var K=d,q=0,j=K,rA=0,gA=0,cA;q<v.length;){for(rA+=x[q];j<rA+bA.EPSILON;)cA=wt.rationalBezierCurveParamAtArcLength(v[q],j-gA,bA.TOLERANCE,x[q]),Y.push(new xe(cA,j)),j+=K;gA+=x[q],q++}return Y};var xe=o.eval.CurveLengthSample=function(h,d){this.u=h,this.len=d};a["verb.eval.CurveLengthSample"]=xe,xe.__name__=["verb","eval","CurveLengthSample"],xe.prototype={__class__:xe};var mA=o.eval.Eval=function(){};a["verb.eval.Eval"]=mA,mA.__name__=["verb","eval","Eval"],mA.rationalCurveTangent=function(h,d){var v=mA.rationalCurveDerivatives(h,d,1);return v[1]},mA.rationalSurfaceNormal=function(h,d,v){var x=mA.rationalSurfaceDerivatives(h,d,v,1);return V.cross(x[1][0],x[0][1])},mA.rationalSurfaceDerivatives=function(h,d,v,x){x==null&&(x=1);for(var F=mA.surfaceDerivatives(h,d,v,x),Y=mA.rational2d(F),K=mA.weight2d(F),q=[],j=Y[0][0].length,rA=0,gA=x+1;rA<gA;){var cA=rA++;q.push([]);for(var uA=0,fA=x-cA+1;uA<fA;){for(var pA=uA++,MA=Y[cA][pA],vA=1,TA=pA+1;vA<TA;){var SA=vA++;MA=V.sub(MA,V.mul(UA.get(pA,SA)*K[0][SA],q[cA][pA-SA]))}for(var kA=1,HA=cA+1;kA<HA;){var zA=kA++;MA=V.sub(MA,V.mul(UA.get(cA,zA)*K[zA][0],q[cA-zA][pA]));for(var ZA=V.zeros1d(j),VA=1,KA=pA+1;VA<KA;){var jA=VA++;ZA=V.add(ZA,V.mul(UA.get(pA,jA)*K[zA][jA],q[cA-zA][pA-jA]))}MA=V.sub(MA,V.mul(UA.get(cA,zA),ZA))}q[cA].push(V.mul(1/K[0][0],MA))}}return q},mA.rationalSurfacePoint=function(h,d,v){return mA.dehomogenize(mA.surfacePoint(h,d,v))},mA.rationalCurveDerivatives=function(h,d,v){v==null&&(v=1);for(var x=mA.curveDerivatives(h,d,v),F=mA.rational1d(x),Y=mA.weight1d(x),K=[],q=0,j=v+1;q<j;){for(var rA=q++,gA=F[rA],cA=1,uA=rA+1;cA<uA;){var fA=cA++;gA=V.sub(gA,V.mul(UA.get(rA,fA)*Y[fA],K[rA-fA]))}K.push(V.mul(1/Y[0],gA))}return K},mA.rationalCurvePoint=function(h,d){return mA.dehomogenize(mA.curvePoint(h,d))},mA.surfaceDerivatives=function(h,d,v,x){var F=h.knotsU.length-h.degreeU-2,Y=h.knotsV.length-h.degreeV-2;return mA.surfaceDerivativesGivenNM(F,Y,h,d,v,x)},mA.surfaceDerivativesGivenNM=function(h,d,v,x,F,Y){var K=v.degreeU,q=v.degreeV,j=v.controlPoints,rA=v.knotsU,gA=v.knotsV;if(!mA.areValidRelations(K,j.length,rA.length)||!mA.areValidRelations(q,j[0].length,gA.length))throw new W("Invalid relations between control points, knot vector, and n");var cA=j[0][0].length,uA;Y<K?uA=Y:uA=K;var fA;Y<q?fA=Y:fA=q;for(var pA=V.zeros3d(Y+1,Y+1,cA),MA=mA.knotSpanGivenN(h,K,x,rA),vA=mA.knotSpanGivenN(d,q,F,gA),TA=mA.derivativeBasisFunctionsGivenNI(MA,x,K,h,rA),SA=mA.derivativeBasisFunctionsGivenNI(vA,F,q,d,gA),kA=V.zeros2d(q+1,cA),HA=0,zA=0,ZA=uA+1;zA<ZA;){for(var VA=zA++,KA=0,jA=q+1;KA<jA;){var tt=KA++;kA[tt]=V.zeros1d(cA);for(var ot=0,ct=K+1;ot<ct;){var lt=ot++;kA[tt]=V.add(kA[tt],V.mul(TA[VA][lt],j[MA-K+lt][vA-q+tt]))}}var ut=Y-VA;ut<fA?HA=ut:HA=fA;for(var Bt=0,rt=HA+1;Bt<rt;){var ht=Bt++;pA[VA][ht]=V.zeros1d(cA);for(var qA=0,Qt=q+1;qA<Qt;){var mt=qA++;pA[VA][ht]=V.add(pA[VA][ht],V.mul(SA[ht][mt],kA[mt]))}}}return pA},mA.surfacePoint=function(h,d,v){var x=h.knotsU.length-h.degreeU-2,F=h.knotsV.length-h.degreeV-2;return mA.surfacePointGivenNM(x,F,h,d,v)},mA.surfacePointGivenNM=function(h,d,v,x,F){var Y=v.degreeU,K=v.degreeV,q=v.controlPoints,j=v.knotsU,rA=v.knotsV;if(!mA.areValidRelations(Y,q.length,j.length)||!mA.areValidRelations(K,q[0].length,rA.length))throw new W("Invalid relations between control points, knot vector, and n");for(var gA=q[0][0].length,cA=mA.knotSpanGivenN(h,Y,x,j),uA=mA.knotSpanGivenN(d,K,F,rA),fA=mA.basisFunctionsGivenKnotSpanIndex(cA,x,Y,j),pA=mA.basisFunctionsGivenKnotSpanIndex(uA,F,K,rA),MA=cA-Y,vA=uA,TA=V.zeros1d(gA),SA=V.zeros1d(gA),kA=0,HA=K+1;kA<HA;){var zA=kA++;SA=V.zeros1d(gA),vA=uA-K+zA;for(var ZA=0,VA=Y+1;ZA<VA;){var KA=ZA++;SA=V.add(SA,V.mul(fA[KA],q[MA+KA][vA]))}TA=V.add(TA,V.mul(pA[zA],SA))}return TA},mA.curveDerivatives=function(h,d,v){var x=h.knots.length-h.degree-2;return mA.curveDerivativesGivenN(x,h,d,v)},mA.curveDerivativesGivenN=function(h,d,v,x){var F=d.degree,Y=d.controlPoints,K=d.knots;if(!mA.areValidRelations(F,Y.length,K.length))throw new W("Invalid relations between control points, knot vector, and n");var q=Y[0].length,j;x<F?j=x:j=F;for(var rA=V.zeros2d(x+1,q),gA=mA.knotSpanGivenN(h,F,v,K),cA=mA.derivativeBasisFunctionsGivenNI(gA,v,F,j,K),uA=0,fA=j+1;uA<fA;)for(var pA=uA++,MA=0,vA=F+1;MA<vA;){var TA=MA++;rA[pA]=V.add(rA[pA],V.mul(cA[pA][TA],Y[gA-F+TA]))}return rA},mA.curvePoint=function(h,d){var v=h.knots.length-h.degree-2;return mA.curvePointGivenN(v,h,d)},mA.areValidRelations=function(h,d,v){return d+h+1-v==0},mA.curvePointGivenN=function(h,d,v){var x=d.degree,F=d.controlPoints,Y=d.knots;if(!mA.areValidRelations(x,F.length,Y.length))throw new W("Invalid relations between control points, knot Array, and n");for(var K=mA.knotSpanGivenN(h,x,v,Y),q=mA.basisFunctionsGivenKnotSpanIndex(K,v,x,Y),j=V.zeros1d(F[0].length),rA=0,gA=x+1;rA<gA;){var cA=rA++;j=V.add(j,V.mul(q[cA],F[K-x+cA]))}return j},mA.volumePoint=function(h,d,v,x){var F=h.knotsU.length-h.degreeU-2,Y=h.knotsV.length-h.degreeV-2,K=h.knotsW.length-h.degreeW-2;return mA.volumePointGivenNML(h,F,Y,K,d,v,x)},mA.volumePointGivenNML=function(h,d,v,x,F,Y,K){if(!mA.areValidRelations(h.degreeU,h.controlPoints.length,h.knotsU.length)||!mA.areValidRelations(h.degreeV,h.controlPoints[0].length,h.knotsV.length)||!mA.areValidRelations(h.degreeW,h.controlPoints[0][0].length,h.knotsW.length))throw new W("Invalid relations between control points and knot vector");for(var q=h.controlPoints,j=h.degreeU,rA=h.degreeV,gA=h.degreeW,cA=h.knotsU,uA=h.knotsV,fA=h.knotsW,pA=q[0][0][0].length,MA=mA.knotSpanGivenN(d,j,F,cA),vA=mA.knotSpanGivenN(v,rA,Y,uA),TA=mA.knotSpanGivenN(x,gA,K,fA),SA=mA.basisFunctionsGivenKnotSpanIndex(MA,F,j,cA),kA=mA.basisFunctionsGivenKnotSpanIndex(vA,Y,rA,uA),HA=mA.basisFunctionsGivenKnotSpanIndex(TA,K,gA,fA),zA=MA-j,ZA=V.zeros1d(pA),VA=V.zeros1d(pA),KA=V.zeros1d(pA),jA=0,tt=gA+1;jA<tt;){var ot=jA++;KA=V.zeros1d(pA);for(var ct=TA-gA+ot,lt=0,ut=rA+1;lt<ut;){var Bt=lt++;VA=V.zeros1d(pA);for(var rt=vA-rA+Bt,ht=0,qA=j+1;ht<qA;){var Qt=ht++;VA=V.add(VA,V.mul(SA[Qt],q[zA+Qt][rt][ct]))}KA=V.add(KA,V.mul(kA[Bt],VA))}ZA=V.add(ZA,V.mul(HA[ot],KA))}return ZA},mA.derivativeBasisFunctions=function(h,d,v){var x=mA.knotSpan(d,h,v),F=v.length-1,Y=F-d-1;return mA.derivativeBasisFunctionsGivenNI(x,h,d,Y,v)},mA.derivativeBasisFunctionsGivenNI=function(h,d,v,x,F){var Y=V.zeros2d(v+1,v+1),K=V.zeros1d(v+1),q=V.zeros1d(v+1),j=0,rA=0;Y[0][0]=1;for(var gA=1,cA=v+1;gA<cA;){var uA=gA++;K[uA]=d-F[h+1-uA],q[uA]=F[h+uA]-d,j=0;for(var fA=0;fA<uA;){var pA=fA++;Y[uA][pA]=q[pA+1]+K[uA-pA],rA=Y[pA][uA-1]/Y[uA][pA],Y[pA][uA]=j+q[pA+1]*rA,j=K[uA-pA]*rA}Y[uA][uA]=j}for(var MA=V.zeros2d(x+1,v+1),vA=V.zeros2d(2,v+1),TA=0,SA=1,kA=0,HA=0,zA=0,ZA=0,VA=0,KA=0,jA=v+1;KA<jA;){var tt=KA++;MA[0][tt]=Y[tt][v]}for(var ot=0,ct=v+1;ot<ct;){var lt=ot++;TA=0,SA=1,vA[0][0]=1;for(var ut=1,Bt=x+1;ut<Bt;){var rt=ut++;kA=0,HA=lt-rt,zA=v-rt,lt>=rt&&(vA[SA][0]=vA[TA][0]/Y[zA+1][HA],kA=vA[SA][0]*Y[HA][zA]),HA>=-1?ZA=1:ZA=-HA,lt-1<=zA?VA=rt-1:VA=v-lt;for(var ht=ZA,qA=VA+1;ht<qA;){var Qt=ht++;vA[SA][Qt]=(vA[TA][Qt]-vA[TA][Qt-1])/Y[zA+1][HA+Qt],kA+=vA[SA][Qt]*Y[HA+Qt][zA]}lt<=zA&&(vA[SA][rt]=-vA[TA][rt-1]/Y[zA+1][lt],kA+=vA[SA][rt]*Y[lt][zA]),MA[rt][lt]=kA;var mt=TA;TA=SA,SA=mt}}for(var Ut=v,kt=1,_t=x+1;kt<_t;){for(var Ot=kt++,ge=0,Qe=v+1;ge<Qe;){var Zt=ge++;MA[Ot][Zt]*=Ut}Ut*=v-Ot}return MA},mA.basisFunctions=function(h,d,v){var x=mA.knotSpan(d,h,v);return mA.basisFunctionsGivenKnotSpanIndex(x,h,d,v)},mA.basisFunctionsGivenKnotSpanIndex=function(h,d,v,x){var F=V.zeros1d(v+1),Y=V.zeros1d(v+1),K=V.zeros1d(v+1),q=0,j=0;F[0]=1;for(var rA=1,gA=v+1;rA<gA;){var cA=rA++;Y[cA]=d-x[h+1-cA],K[cA]=x[h+cA]-d,q=0;for(var uA=0;uA<cA;){var fA=uA++;j=F[fA]/(K[fA+1]+Y[cA-fA]),F[fA]=q+K[fA+1]*j,q=Y[cA-fA]*j}F[cA]=q}return F},mA.knotSpan=function(h,d,v){return mA.knotSpanGivenN(v.length-h-2,h,d,v)},mA.knotSpanGivenN=function(h,d,v,x){if(v>x[h+1]-bA.EPSILON)return h;if(v<x[d]+bA.EPSILON)return d;for(var F=d,Y=h+1,K=Math.floor((F+Y)/2);v<x[K]||v>=x[K+1];)v<x[K]?Y=K:F=K,K=Math.floor((F+Y)/2);return K},mA.dehomogenize=function(h){for(var d=h.length,v=[],x=h[d-1],F=h.length-1,Y=0;Y<F;){var K=Y++;v.push(h[K]/x)}return v},mA.rational1d=function(h){var d=h[0].length-1;return h.map(function(v){return v.slice(0,d)})},mA.rational2d=function(h){return h.map(mA.rational1d)},mA.weight1d=function(h){var d=h[0].length-1;return h.map(function(v){return v[d]})},mA.weight2d=function(h){return h.map(mA.weight1d)},mA.dehomogenize1d=function(h){return h.map(mA.dehomogenize)},mA.dehomogenize2d=function(h){return h.map(mA.dehomogenize1d)},mA.homogenize1d=function(h,d){var v=h.length,x=h[0].length,F=[],Y=0,K=[],q;d!=null?q=d:q=V.rep(h.length,1);for(var j=0;j<v;){var rA=j++,gA=[];K=h[rA],Y=q[rA];for(var cA=0;cA<x;){var uA=cA++;gA.push(K[uA]*Y)}gA.push(Y),F.push(gA)}return F},mA.homogenize2d=function(h,d){var v=h.length,x=[],F;if(d!=null)F=d;else{for(var Y=[],K=0;K<v;)K++,Y.push(V.rep(h[0].length,1));F=Y}for(var q=0;q<v;){var j=q++;x.push(mA.homogenize1d(h[j],F[j]))}return x};var WA=o.eval.Intersect=function(){};a["verb.eval.Intersect"]=WA,WA.__name__=["verb","eval","Intersect"],WA.surfaces=function(h,d,v){var x=xt.rationalSurfaceAdaptive(h),F=xt.rationalSurfaceAdaptive(d),Y=WA.meshes(x,F),K=Y.map(function(q){return q.map(function(j){return WA.surfacesAtPointWithEstimate(h,d,j.uv0,j.uv1,v)})});return K.map(function(q){return Et.rationalInterpCurve(q.map(function(j){return j.point}),3)})},WA.surfacesAtPointWithEstimate=function(h,d,v,x,F){var Y,K,q,j,rA,gA,cA,uA,fA,pA,MA,vA,TA,SA=5,kA=0;do{if(Y=mA.rationalSurfaceDerivatives(h,v[0],v[1],1),K=Y[0][0],j=Y[1][0],rA=Y[0][1],q=V.normalized(V.cross(j,rA)),gA=V.dot(q,K),cA=mA.rationalSurfaceDerivatives(d,x[0],x[1],1),uA=cA[0][0],pA=cA[1][0],MA=cA[0][1],fA=V.normalized(V.cross(pA,MA)),vA=V.dot(fA,uA),TA=V.distSquared(K,uA),TA<F*F)break;var HA=V.normalized(V.cross(q,fA)),zA=V.dot(HA,K),ZA=WA.threePlanes(q,gA,fA,vA,HA,zA);if(ZA==null)throw new W("panic!");var VA=V.sub(ZA,K),KA=V.sub(ZA,uA),jA=V.cross(j,q),tt=V.cross(rA,q),ot=V.cross(pA,fA),ct=V.cross(MA,fA),lt=V.dot(tt,VA)/V.dot(tt,j),ut=V.dot(jA,VA)/V.dot(jA,rA),Bt=V.dot(ct,KA)/V.dot(ct,pA),rt=V.dot(ot,KA)/V.dot(ot,MA);v=V.add([lt,ut],v),x=V.add([Bt,rt],x),kA++}while(kA<SA);return new ce(v,x,K,TA)},WA.meshes=function(h,d,v,x){v==null&&(v=new QA(h)),x==null&&(x=new QA(d));var F=WA.boundingBoxTrees(v,x,0),Y=DA.unique(F.map(function(K){return WA.triangles(h,K.item0,d,K.item1)}).filter(function(K){return K!=null}).filter(function(K){return V.distSquared(K.min.point,K.max.point)>bA.EPSILON}),function(K,q){var j=V.sub(K.min.uv0,q.min.uv0),rA=V.dot(j,j),gA=V.sub(K.max.uv0,q.max.uv0),cA=V.dot(gA,gA),uA=V.sub(K.min.uv0,q.max.uv0),fA=V.dot(uA,uA),pA=V.sub(K.max.uv0,q.min.uv0),MA=V.dot(pA,pA);return rA<bA.EPSILON&&cA<bA.EPSILON||fA<bA.EPSILON&&MA<bA.EPSILON});return WA.makeMeshIntersectionPolylines(Y)},WA.meshSlices=function(h,d,v,x){for(var F=new vt(h),Y=F.boundingBox(),K=Y.min[0],q=Y.min[1],j=Y.max[0],rA=Y.max[1],gA=V.span(d,v,x),cA=[],uA=0;uA<gA.length;){var fA=gA[uA];++uA;var pA=[[K,q,fA],[j,q,fA],[j,rA,fA],[K,rA,fA]],MA=[[0,0],[1,0],[1,1],[0,1]],vA=[[0,1,2],[0,2,3]],TA=new Nt(vA,pA,null,MA);cA.push(WA.meshes(h,TA,F))}return cA},WA.makeMeshIntersectionPolylines=function(h){if(h.length==0)return[];for(var d=0;d<h.length;){var v=h[d];++d,v.max.opp=v.min,v.min.opp=v.max}for(var x=WA.kdTreeFromSegments(h),F=[],Y=0;Y<h.length;){var K=h[Y];++Y,F.push(K.min),F.push(K.max)}for(var q=0;q<F.length;){var j=F[q];if(++q,j.adj==null){var rA=WA.lookupAdjacentSegment(j,x,h.length);rA!=null&&rA.adj==null&&(j.adj=rA,rA.adj=j)}}var gA=F.filter(function(SA){return SA.adj==null});gA.length==0&&(gA=F);for(var cA=[],uA=0,fA=!1;gA.length!=0;){var pA=gA.pop();if(!pA.visited){for(var MA=[],vA=pA;vA!=null&&!(vA.visited||(vA.visited=!0,vA.opp.visited=!0,MA.push(vA),uA+=2,vA=vA.opp.adj,vA==pA)););MA.length>0&&(MA.push(MA[MA.length-1].opp),cA.push(MA))}if(gA.length==0&&F.length>0&&(fA||uA<F.length)){fA=!0;var TA=F.pop();gA.push(TA)}}return cA},WA.kdTreeFromSegments=function(h){for(var d=[],v=0;v<h.length;){var x=h[v];++v,d.push(new J(x.min.point,x.min)),d.push(new J(x.max.point,x.max))}return new Lt(d,V.distSquared)},WA.lookupAdjacentSegment=function(h,d,v){var x=d.nearest(h.point,v,bA.EPSILON).filter(function(F){return h!=F.item0.obj}).map(function(F){return F.item0.obj});return x.length==1?x[0]:null},WA.curveAndSurface=function(h,d,v,x,F){v==null&&(v=.001),x!=null?x=x:x=new CA(h),F!=null?F=F:F=new AA(d);var Y=WA.boundingBoxTrees(x,F,v);return DA.unique(Y.map(function(K){var q=K.item0,j=K.item1,rA=DA.first(q.knots),gA=DA.last(q.knots),cA=(rA+gA)/2,uA=DA.first(j.knotsU),fA=DA.last(j.knotsU),pA=DA.first(j.knotsV),MA=DA.last(j.knotsV),vA=[(uA+fA)/2,(pA+MA)/2];return WA.curveAndSurfaceWithEstimate(q,j,[cA].concat(vA),v)}).filter(function(K){return V.distSquared(K.curvePoint,K.surfacePoint)<v*v}),function(K,q){return Math.abs(K.u-q.u)<.5*v})},WA.curveAndSurfaceWithEstimate=function(h,d,v,x){x==null&&(x=.001);var F=function(j){var rA=mA.rationalCurvePoint(h,j[0]),gA=mA.rationalSurfacePoint(d,j[1],j[2]),cA=V.sub(rA,gA);return V.dot(cA,cA)},Y=function(j){var rA=mA.rationalCurveDerivatives(h,j[0],1),gA=mA.rationalSurfaceDerivatives(d,j[1],j[2],1),cA=V.sub(gA[0][0],rA[0]),uA=V.mul(-1,rA[1]),fA=gA[1][0],pA=gA[0][1];return[2*V.dot(uA,cA),2*V.dot(fA,cA),2*V.dot(pA,cA)]},K=Dt.uncmin(F,v,x*x,Y),q=K.solution;return new re(q[0],[q[1],q[2]],mA.rationalCurvePoint(h,q[0]),mA.rationalSurfacePoint(d,q[1],q[2]))},WA.polylineAndMesh=function(h,d,v){for(var x=WA.boundingBoxTrees(new RA(h),new QA(d),v),F=[],Y=0;Y<x.length;){var K=x[Y];++Y;var q=K.item0,j=K.item1,rA=WA.segmentWithTriangle(h.points[q],h.points[q+1],d.points,d.faces[j]);if(rA!=null){var gA=rA.point,cA=V.lerp(rA.p,[h.params[q]],[h.params[q+1]])[0],uA=$A.triangleUVFromPoint(d,j,gA);F.push(new ue(gA,cA,uA,q,j))}}return F},WA.boundingBoxTrees=function(h,d,v){v==null&&(v=1e-9);var x=[],F=[];x.push(h),F.push(d);for(var Y=[];x.length>0;){var K=x.pop(),q=F.pop();if(!(K.empty()||q.empty())&&K.boundingBox().intersects(q.boundingBox(),v)){var j=K.indivisible(v),rA=q.indivisible(v);if(j&&rA){Y.push(new Tt(K.yield(),q.yield()));continue}else if(j&&!rA){var gA=q.split();x.push(K),F.push(gA.item1),x.push(K),F.push(gA.item0);continue}else if(!j&&rA){var cA=K.split();x.push(cA.item1),F.push(q),x.push(cA.item0),F.push(q);continue}var uA=K.split(),fA=q.split();x.push(uA.item1),F.push(fA.item1),x.push(uA.item1),F.push(fA.item0),x.push(uA.item0),F.push(fA.item1),x.push(uA.item0),F.push(fA.item0)}}return Y},WA.curves=function(h,d,v){var x=WA.boundingBoxTrees(new CA(h),new CA(d),0);return DA.unique(x.map(function(F){return WA.curvesWithEstimate(h,d,DA.first(F.item0.knots),DA.first(F.item1.knots),v)}).filter(function(F){return V.distSquared(F.point0,F.point1)<v}),function(F,Y){return Math.abs(F.u0-Y.u0)<v*5})},WA.curvesWithEstimate=function(h,d,v,x,F){var Y=function(uA){var fA=mA.rationalCurvePoint(h,uA[0]),pA=mA.rationalCurvePoint(d,uA[1]),MA=V.sub(fA,pA);return V.dot(MA,MA)},K=function(uA){var fA=mA.rationalCurveDerivatives(h,uA[0],1),pA=mA.rationalCurveDerivatives(d,uA[1],1),MA=V.sub(fA[0],pA[0]),vA=fA[1],TA=V.mul(-1,pA[1]);return[2*V.dot(vA,MA),2*V.dot(TA,MA)]},q=Dt.uncmin(Y,[v,x],F*F,K),j=q.solution[0],rA=q.solution[1],gA=mA.rationalCurvePoint(h,j),cA=mA.rationalCurvePoint(d,rA);return new jt(gA,cA,j,rA)},WA.triangles=function(h,d,v,x){var F=h.faces[d],Y=v.faces[x],K=$A.getTriangleNorm(h.points,F),q=$A.getTriangleNorm(v.points,Y),j=h.points[F[0]],rA=v.points[Y[0]],gA=WA.planes(j,K,rA,q);if(gA==null)return null;var cA=WA.clipRayInCoplanarTriangle(gA,h,d);if(cA==null)return null;var uA=WA.clipRayInCoplanarTriangle(gA,v,x);if(uA==null)return null;var fA=WA.mergeTriangleClipIntervals(cA,uA,h,d,v,x);return fA==null?null:new Ft(new Kt(fA.min.uv0,fA.min.uv1,fA.min.point,d,x),new Kt(fA.max.uv0,fA.max.uv1,fA.max.point,d,x))},WA.clipRayInCoplanarTriangle=function(h,d,v){for(var x=d.faces[v],F=[d.points[x[0]],d.points[x[1]],d.points[x[2]]],Y=[d.uvs[x[0]],d.uvs[x[1]],d.uvs[x[2]]],K=[V.sub(Y[1],Y[0]),V.sub(Y[2],Y[1]),V.sub(Y[0],Y[2])],q=[V.sub(F[1],F[0]),V.sub(F[2],F[1]),V.sub(F[0],F[2])],j=q.map(V.normalized),rA=q.map(V.norm),gA=null,cA=null,uA=0;uA<3;){var fA=uA++,pA=F[fA],MA=j[fA],vA=WA.rays(pA,MA,h.origin,h.dir);if(vA!=null){var TA=vA.u0,SA=vA.u1;TA<-bA.EPSILON||TA>rA[fA]+bA.EPSILON||((gA==null||SA<gA.u)&&(gA=new le(SA,V.onRay(h.origin,h.dir,SA),V.onRay(Y[fA],K[fA],TA/rA[fA]))),(cA==null||SA>cA.u)&&(cA=new le(SA,V.onRay(h.origin,h.dir,SA),V.onRay(Y[fA],K[fA],TA/rA[fA]))))}}return cA==null||gA==null?null:new Ft(gA,cA)},WA.mergeTriangleClipIntervals=function(h,d,v,x,F,Y){if(d.min.u>h.max.u+bA.EPSILON||h.min.u>d.max.u+bA.EPSILON)return null;var K;h.min.u>d.min.u?K=new Tt(h.min,0):K=new Tt(d.min,1);var q;h.max.u<d.max.u?q=new Tt(h.max,0):q=new Tt(d.max,1);var j=new Ft(new Kt(null,null,K.item0.point,x,Y),new Kt(null,null,q.item0.point,x,Y));return K.item1==0?(j.min.uv0=K.item0.uv,j.min.uv1=$A.triangleUVFromPoint(F,Y,K.item0.point)):(j.min.uv0=$A.triangleUVFromPoint(v,x,K.item0.point),j.min.uv1=K.item0.uv),q.item1==0?(j.max.uv0=q.item0.uv,j.max.uv1=$A.triangleUVFromPoint(F,Y,q.item0.point)):(j.max.uv0=$A.triangleUVFromPoint(v,x,q.item0.point),j.max.uv1=q.item0.uv),j},WA.planes=function(h,d,v,x){var F=V.cross(d,x);if(V.dot(F,F)<bA.EPSILON)return null;var Y=0,K=Math.abs(F[0]),q=Math.abs(F[1]),j=Math.abs(F[2]);q>K&&(Y=1,K=q),j>K&&(Y=2,K=j);var rA,gA,cA,uA;Y==0?(rA=d[1],gA=d[2],cA=x[1],uA=x[2]):Y==1?(rA=d[0],gA=d[2],cA=x[0],uA=x[2]):(rA=d[0],gA=d[1],cA=x[0],uA=x[1]);var fA=-V.dot(h,d),pA=-V.dot(v,x),MA=rA*uA-gA*cA,vA=(gA*pA-fA*uA)/MA,TA=(fA*cA-rA*pA)/MA,SA;return Y==0?SA=[0,vA,TA]:Y==1?SA=[vA,0,TA]:SA=[vA,TA,0],new St(SA,V.normalized(F))},WA.threePlanes=function(h,d,v,x,F,Y){var K=V.cross(v,F),q=V.dot(h,K);if(Math.abs(q)<bA.EPSILON)return null;var j=V.sub(V.mul(Y,v),V.mul(x,F)),rA=V.add(V.mul(d,K),V.cross(h,j));return V.mul(1/q,rA)},WA.polylines=function(h,d,v){for(var x=WA.boundingBoxTrees(new RA(h),new RA(d),v),F=[],Y=0;Y<x.length;){var K=x[Y];++Y;var q=K.item0,j=K.item1,rA=WA.segments(h.points[q],h.points[q+1],d.points[j],d.points[j+1],v);rA!=null&&(rA.u0=V.lerp(rA.u0,[h.params[q]],[h.params[q+1]])[0],rA.u1=V.lerp(rA.u1,[d.params[j]],[d.params[j+1]])[0],F.push(rA))}return F},WA.segments=function(h,d,v,x,F){var Y=V.sub(d,h),K=Math.sqrt(V.dot(Y,Y)),q=V.mul(1/K,Y),j=V.sub(x,v),rA=Math.sqrt(V.dot(j,j)),gA=V.mul(1/rA,j),cA=WA.rays(h,q,v,gA);if(cA!=null){var uA=Math.min(Math.max(0,cA.u0/K),1),fA=Math.min(Math.max(0,cA.u1/rA),1),pA=V.onRay(h,Y,uA),MA=V.onRay(v,j,fA),vA=V.distSquared(pA,MA);if(vA<F*F)return new jt(pA,MA,uA,fA)}return null},WA.rays=function(h,d,v,x){var F=V.dot(d,x),Y=V.dot(d,v),K=V.dot(d,h),q=V.dot(x,v),j=V.dot(x,h),rA=V.dot(d,d),gA=V.dot(x,x),cA=rA*gA-F*F;if(Math.abs(cA)<bA.EPSILON)return null;var uA=F*(Y-K)-rA*(q-j),fA=uA/cA,pA=(Y-K+fA*F)/rA,MA=V.onRay(h,d,pA),vA=V.onRay(v,x,fA);return new jt(MA,vA,pA,fA)},WA.segmentWithTriangle=function(h,d,v,x){var F=v[x[0]],Y=v[x[1]],K=v[x[2]],q=V.sub(Y,F),j=V.sub(K,F),rA=V.cross(q,j),gA=V.sub(d,h),cA=V.sub(h,F),uA=-V.dot(rA,cA),fA=V.dot(rA,gA);if(Math.abs(fA)<bA.EPSILON)return null;var pA=uA/fA;if(pA<0||pA>1)return null;var MA=V.add(h,V.mul(pA,gA)),vA=V.dot(q,j),TA=V.dot(q,q),SA=V.dot(j,j),kA=V.sub(MA,F),HA=V.dot(kA,q),zA=V.dot(kA,j),ZA=vA*vA-TA*SA;if(Math.abs(ZA)<bA.EPSILON)return null;var VA=(vA*zA-SA*HA)/ZA,KA=(vA*HA-TA*zA)/ZA;return VA>1+bA.EPSILON||KA>1+bA.EPSILON||KA<-bA.EPSILON||VA<-bA.EPSILON||VA+KA>1+bA.EPSILON?null:new De(MA,VA,KA,pA)},WA.segmentAndPlane=function(h,d,v,x){var F=V.dot(x,V.sub(d,h));if(Math.abs(F)<bA.EPSILON)return null;var Y=V.dot(x,V.sub(v,h)),K=Y/F;return K>1+bA.EPSILON||K<-bA.EPSILON?null:{p:K}};var Et=o.eval.Make=function(){};a["verb.eval.Make"]=Et,Et.__name__=["verb","eval","Make"],Et.rationalTranslationalSurface=function(h,d){for(var v=mA.rationalCurvePoint(d,DA.first(d.knots)),x=DA.first(d.knots),F=DA.last(d.knots),Y=2*d.controlPoints.length,K=(F-x)/(Y-1),q=[],j=0;j<Y;){var rA=j++,gA=V.sub(mA.rationalCurvePoint(d,x+rA*K),v),cA=dt.rationalCurveTransform(h,[[1,0,0,gA[0]],[0,1,0,gA[1]],[0,0,1,gA[2]],[0,0,0,1]]);q.push(cA)}return Et.loftedSurface(q)},Et.surfaceBoundaryCurves=function(h){var d=Et.surfaceIsocurve(h,DA.first(h.knotsU),!1),v=Et.surfaceIsocurve(h,DA.last(h.knotsU),!1),x=Et.surfaceIsocurve(h,DA.first(h.knotsV),!0),F=Et.surfaceIsocurve(h,DA.last(h.knotsV),!0);return[d,v,x,F]},Et.surfaceIsocurve=function(h,d,v){v==null&&(v=!1);var x;v?x=h.knotsV:x=h.knotsU;var F;v?F=h.degreeV:F=h.degreeU;for(var Y=wt.knotMultiplicities(x),K=-1,q=0,j=Y.length;q<j;){var rA=q++;if(Math.abs(d-Y[rA].knot)<bA.EPSILON){K=rA;break}}var gA=F+1;K>=0&&(gA=gA-Y[K].mult);var cA;gA>0?cA=dt.surfaceKnotRefine(h,V.rep(gA,d),v):cA=h;var uA=mA.knotSpan(F,d,x);return Math.abs(d-DA.first(x))<bA.EPSILON?uA=0:Math.abs(d-DA.last(x))<bA.EPSILON&&(uA=(v?cA.controlPoints[0].length:cA.controlPoints.length)-1),v?new gt(cA.degreeU,cA.knotsU,(function(fA){for(var pA,MA=[],vA=0,TA=cA.controlPoints;vA<TA.length;){var SA=TA[vA];++vA,MA.push(SA[uA])}return pA=MA,pA})()):new gt(cA.degreeV,cA.knotsV,cA.controlPoints[uA])},Et.loftedSurface=function(h,d,v){v||(h=dt.unifyCurveKnotVectors(h));var x=h[0].degree;d==null&&(d=3),d>h.length-1&&(d=h.length-1);for(var F=h[0].knots,Y=[],K=[],q=0,j=h[0].controlPoints.length;q<j;){var rA=[q++],gA=h.map((function(uA){return function(fA){return fA.controlPoints[uA[0]]}})(rA)),cA=Et.rationalInterpCurve(gA,d,!0);K.push(cA.controlPoints),Y=cA.knots}return new it(x,d,F,Y,K)},Et.clonedCurve=function(h){return new gt(h.degree,h.knots.slice(),h.controlPoints.map(function(d){return d.slice()}))},Et.rationalBezierCurve=function(h,d){for(var v=h.length-1,x=[],F=0,Y=v+1;F<Y;)F++,x.push(0);for(var K=0,q=v+1;K<q;)K++,x.push(1);return d==null&&(d=V.rep(h.length,1)),new gt(v,x,mA.homogenize1d(h,d))},Et.fourPointSurface=function(h,d,v,x,F){F==null&&(F=3);for(var Y=F,K=[],q=0,j=F+1;q<j;){for(var rA=q++,gA=[],cA=0,uA=F+1;cA<uA;){var fA=cA++,pA=1-rA/Y,MA=V.lerp(pA,h,d),vA=V.lerp(pA,x,v),TA=V.lerp(1-fA/Y,MA,vA);TA.push(1),gA.push(TA)}K.push(gA)}var SA=V.rep(F+1,0),kA=V.rep(F+1,1);return new it(F,F,SA.concat(kA),SA.concat(kA),K)},Et.ellipseArc=function(h,d,v,x,F){var Y=V.norm(d),K=V.norm(v);d=V.normalized(d),v=V.normalized(v),F<x&&(F=2*Math.PI+x);var q=F-x,j=0;q<=Math.PI/2?j=1:q<=Math.PI?j=2:q<=3*Math.PI/2?j=3:j=4;var rA=q/j,gA=Math.cos(rA/2),cA=V.add(h,V.add(V.mul(Y*Math.cos(x),d),V.mul(K*Math.sin(x),v))),uA=V.sub(V.mul(Math.cos(x),v),V.mul(Math.sin(x),d)),fA=[],pA=V.zeros1d(2*j+3),MA=0,vA=x,TA=V.zeros1d(j*2);fA[0]=cA,TA[0]=1;for(var SA=1,kA=j+1;SA<kA;){var HA=SA++;vA+=rA;var zA=V.add(h,V.add(V.mul(Y*Math.cos(vA),d),V.mul(K*Math.sin(vA),v)));TA[MA+2]=1,fA[MA+2]=zA;var ZA=V.sub(V.mul(Math.cos(vA),v),V.mul(Math.sin(vA),d)),VA=WA.rays(cA,V.mul(1/V.norm(uA),uA),zA,V.mul(1/V.norm(ZA),ZA)),KA=V.add(cA,V.mul(VA.u0,uA));TA[MA+1]=gA,fA[MA+1]=KA,MA+=2,HA<j&&(cA=zA,uA=ZA)}for(var jA=2*j+1,tt=0;tt<3;){var ot=tt++;pA[ot]=0,pA[ot+jA]=1}switch(j){case 2:pA[3]=pA[4]=.5;break;case 3:pA[3]=pA[4]=.3333333333333333,pA[5]=pA[6]=.6666666666666666;break;case 4:pA[3]=pA[4]=.25,pA[5]=pA[6]=.5,pA[7]=pA[8]=.75;break}return new gt(2,pA,mA.homogenize1d(fA,TA))},Et.arc=function(h,d,v,x,F,Y){return Et.ellipseArc(h,V.mul(x,V.normalized(d)),V.mul(x,V.normalized(v)),F,Y)},Et.polyline=function(h){for(var d=[0,0],v=0,x=0,F=h.length-1;x<F;){var Y=x++;v+=V.dist(h[Y],h[Y+1]),d.push(v)}d.push(v),d=V.mul(1/v,d);for(var K,q=[],j=0,rA=h.length;j<rA;)j++,q.push(1);return K=q,new gt(1,d,mA.homogenize1d(h.slice(0),K))},Et.extrudedSurface=function(h,d,v){for(var x=[[],[]],F=[[],[]],Y=mA.dehomogenize1d(v.controlPoints),K=mA.weight1d(v.controlPoints),q=V.mul(d,h),j=0,rA=Y.length;j<rA;){var gA=j++;x[1][gA]=Y[gA],x[0][gA]=V.add(q,Y[gA]),F[0][gA]=K[gA],F[1][gA]=K[gA]}return new it(1,v.degree,[0,0,1,1],v.knots,mA.homogenize2d(x,F))},Et.cylindricalSurface=function(h,d,v,x,F){var Y=V.cross(h,d),K=Et.arc(v,d,Y,F,0,2*Math.PI);return Et.extrudedSurface(h,x,K)},Et.revolvedSurface=function(h,d,v,x){var F=mA.dehomogenize1d(h.controlPoints),Y=mA.weight1d(h.controlPoints),K,q;x<=Math.PI/2?(K=1,q=V.zeros1d(6+2*(K-1))):x<=Math.PI?(K=2,q=V.zeros1d(6+2*(K-1)),q[3]=q[4]=.5):x<=3*Math.PI/2?(K=3,q=V.zeros1d(6+2*(K-1)),q[3]=q[4]=.3333333333333333,q[5]=q[6]=.6666666666666666):(K=4,q=V.zeros1d(6+2*(K-1)),q[3]=q[4]=.25,q[5]=q[6]=.5,q[7]=q[8]=.75);for(var j=x/K,rA=3+2*(K-1),gA=0;gA<3;){var cA=gA++;q[cA]=0,q[rA+cA]=1}for(var uA=Math.cos(j/2),fA=0,pA=V.zeros1d(K+1),MA=V.zeros1d(K+1),vA=V.zeros3d(2*K+1,F.length,3),TA=V.zeros2d(2*K+1,F.length),SA=1,kA=K+1;SA<kA;){var HA=SA++;fA+=j,MA[HA]=Math.cos(fA),pA[HA]=Math.sin(fA)}for(var zA=0,ZA=F.length;zA<ZA;){var VA=zA++,KA=yt.rayClosestPoint(F[VA],d,v),jA=V.sub(F[VA],KA),tt=V.norm(jA),ot=V.cross(v,jA);tt>bA.EPSILON&&(jA=V.mul(1/tt,jA),ot=V.mul(1/tt,ot)),vA[0][VA]=F[VA];var ct=F[VA];TA[0][VA]=Y[VA];for(var lt=ot,ut=0,Bt=1,rt=K+1;Bt<rt;){var ht=Bt++,qA;tt==0?qA=KA:qA=V.add(KA,V.add(V.mul(tt*MA[ht],jA),V.mul(tt*pA[ht],ot))),vA[ut+2][VA]=qA,TA[ut+2][VA]=Y[VA];var Qt=V.sub(V.mul(MA[ht],ot),V.mul(pA[ht],jA));if(tt==0)vA[ut+1][VA]=KA;else{var mt=WA.rays(ct,V.mul(1/V.norm(lt),lt),qA,V.mul(1/V.norm(Qt),Qt)),Ut=V.add(ct,V.mul(mt.u0,lt));vA[ut+1][VA]=Ut}TA[ut+1][VA]=uA*Y[VA],ut+=2,ht<K&&(ct=qA,lt=Qt)}}return new it(2,h.degree,q,h.knots,mA.homogenize2d(vA,TA))},Et.sphericalSurface=function(h,d,v,x){var F=Et.arc(h,V.mul(-1,d),v,x,0,Math.PI);return Et.revolvedSurface(F,h,d,2*Math.PI)},Et.conicalSurface=function(h,d,v,x,F){var Y=2*Math.PI,K=1,q=[V.add(v,V.mul(x,h)),V.add(v,V.mul(F,d))],j=[0,0,1,1],rA=[1,1],gA=new gt(K,j,mA.homogenize1d(q,rA));return Et.revolvedSurface(gA,v,h,Y)},Et.rationalInterpCurve=function(h,d,v,x,F){if(v==null&&(v=!1),d==null&&(d=3),h.length<d+1)throw new W("You need to supply at least degree + 1 points! You only supplied "+h.length+" points.");for(var Y=[0],K=1,q=h.length;K<q;){var j=K++,rA=V.norm(V.sub(h[j],h[j-1])),gA=Y[Y.length-1];Y.push(gA+rA)}for(var cA=Y[Y.length-1],uA=0,fA=Y.length;uA<fA;){var pA=uA++;Y[pA]=Y[pA]/cA}var MA=V.rep(d+1,0),vA=x!=null&&F!=null,TA;vA?TA=0:TA=1;var SA;vA?SA=Y.length-d+1:SA=Y.length-d;for(var kA=TA;kA<SA;){for(var HA=kA++,zA=0,ZA=0;ZA<d;){var VA=ZA++;zA+=Y[HA+VA]}MA.push(1/d*zA)}var KA=MA.concat(V.rep(d+1,1)),jA=[],tt;vA?tt=h.length+1:tt=h.length-1;var ot;vA?ot=h.length-(d-1):ot=h.length-(d+1);for(var ct=0;ct<Y.length;){var lt=Y[ct];++ct;var ut=mA.knotSpanGivenN(tt,d,lt,KA),Bt=mA.basisFunctionsGivenKnotSpanIndex(ut,lt,d,KA),rt=ut-d,ht=V.zeros1d(rt),qA=V.zeros1d(ot-rt);jA.push(ht.concat(Bt).concat(qA))}if(vA){var Qt=jA[0].length-2,mt=[-1,1].concat(V.zeros1d(Qt)),Ut=V.zeros1d(Qt).concat([-1,1]);DA.spliceAndInsert(jA,1,0,mt),DA.spliceAndInsert(jA,jA.length-1,0,Ut)}for(var kt=h[0].length,_t=[],Ot=(1-KA[KA.length-d-2])/d,ge=KA[d+1]/d,Qe=0;Qe<kt;){var Zt=[Qe++],$t;if(!vA)$t=h.map((function(Ht){return function(Se){return Se[Ht[0]]}})(Zt));else{$t=[h[0][Zt[0]]],$t.push(ge*x[Zt[0]]);for(var ae=1,Vt=h.length-1;ae<Vt;){var fe=ae++;$t.push(h[fe][Zt[0]])}$t.push(Ot*F[Zt[0]]),$t.push(DA.last(h)[Zt[0]])}var Ne=GA.solve(jA,$t);_t.push(Ne)}var Ie=GA.transpose(_t);if(!v){var pe=V.rep(Ie.length,1);Ie=mA.homogenize1d(Ie,pe)}return new gt(d,KA,Ie)};var dt=o.eval.Modify=function(){};a["verb.eval.Modify"]=dt,dt.__name__=["verb","eval","Modify"],dt.curveReverse=function(h){return new gt(h.degree,dt.knotsReverse(h.knots),DA.reversed(h.controlPoints))},dt.surfaceReverse=function(h,d){return d==null&&(d=!1),d?new it(h.degreeU,h.degreeV,h.knotsU,dt.knotsReverse(h.knotsV),(function(v){for(var x,F=[],Y=0,K=h.controlPoints;Y<K.length;){var q=K[Y];++Y,F.push(DA.reversed(q))}return x=F,x})()):new it(h.degreeU,h.degreeV,dt.knotsReverse(h.knotsU),h.knotsV,DA.reversed(h.controlPoints))},dt.knotsReverse=function(h){var d=DA.first(h);DA.last(h);for(var v=[d],x=h.length,F=1;F<x;){var Y=F++;v.push(v[Y-1]+(h[x-Y]-h[x-Y-1]))}return v},dt.unifyCurveKnotVectors=function(h){h=h.map(Et.clonedCurve);for(var d=u.fold(h,function(KA,jA){return dt.imax(KA.degree,jA)},0),v=0,x=h.length;v<x;){var F=v++;h[F].degree<d&&(h[F]=dt.curveElevateDegree(h[F],d))}for(var Y,K=[],q=0;q<h.length;){var j=h[q];++q,K.push(new Ft(DA.first(j.knots),DA.last(j.knots)))}Y=K;for(var rA=0,gA=h.length;rA<gA;){var cA=rA++,uA=[Y[cA].min];h[cA].knots=h[cA].knots.map((function(KA){return function(jA){return jA-KA[0]}})(uA))}for(var fA=Y.map(function(KA){return KA.max-KA.min}),pA=u.fold(fA,function(KA,jA){return Math.max(KA,jA)},0),MA=0,vA=h.length;MA<vA;){var TA=MA++,SA=[pA/fA[TA]];h[TA].knots=h[TA].knots.map((function(KA){return function(jA){return jA*KA[0]}})(SA))}for(var kA=u.fold(h,function(KA,jA){return V.sortedSetUnion(KA.knots,jA)},[]),HA=0,zA=h.length;HA<zA;){var ZA=HA++,VA=V.sortedSetSub(kA,h[ZA].knots);VA.length==0&&(h[ZA]=h[ZA]),h[ZA]=dt.curveKnotRefine(h[ZA],VA)}return h},dt.imin=function(h,d){return h<d?h:d},dt.imax=function(h,d){return h>d?h:d},dt.curveElevateDegree=function(h,d){if(d<=h.degree)return h;var v=h.knots.length-h.degree-2,x=h.degree,F=h.knots,Y=h.controlPoints,K=d-h.degree,q=h.controlPoints[0].length,j=V.zeros2d(x+K+1,x+1),rA=[],gA=[],cA=[],uA=v+x+1,fA=d,pA=Math.floor(fA/2),MA=[],vA=[];j[0][0]=1,j[fA][x]=1;for(var TA=1,SA=pA+1;TA<SA;)for(var kA=TA++,HA=1/UA.get(fA,kA),zA=dt.imin(x,kA),ZA=dt.imax(0,kA-K),VA=zA+1;ZA<VA;){var KA=ZA++;j[kA][KA]=HA*UA.get(x,KA)*UA.get(K,kA-KA)}for(var jA=pA+1;jA<fA;)for(var tt=jA++,ot=dt.imin(x,tt),ct=dt.imax(0,tt-K),lt=ot+1;ct<lt;){var ut=ct++;j[tt][ut]=j[fA-tt][x-ut]}var Bt=fA+1,rt=-1,ht=x,qA=x+1,Qt=1,mt=F[0];MA[0]=Y[0];for(var Ut=0,kt=fA+1;Ut<kt;){var _t=Ut++;vA[_t]=mt}for(var Ot=0,ge=x+1;Ot<ge;){var Qe=Ot++;rA[Qe]=Y[Qe]}for(;qA<uA;){for(var Zt=qA;qA<uA&&F[qA]==F[qA+1];)qA=qA+1;var $t=qA-Zt+1,ae=F[qA],Vt=rt;rt=x-$t;var fe;Vt>0?fe=Math.floor((Vt+2)/2):fe=1;var Ne;if(rt>0?Ne=Math.floor(fA-(rt+1)/2):Ne=fA,rt>0){for(var Ie=ae-mt,pe=[],Ht=x;Ht>$t;)pe[Ht-$t-1]=Ie/(F[ht+Ht]-mt),Ht--;for(var Se=1,Oe=rt+1;Se<Oe;){for(var Ye=Se++,ze=rt-Ye,Xe=$t+Ye,Pe=x;Pe>=Xe;)rA[Pe]=V.add(V.mul(pe[Pe-Xe],rA[Pe]),V.mul(1-pe[Pe-Xe],rA[Pe-1])),Pe--;cA[ze]=rA[x]}}for(var Ve=fe,$=fA+1;Ve<$;){var eA=Ve++;gA[eA]=V.zeros1d(q);for(var EA=dt.imin(x,eA),NA=dt.imax(0,eA-K),FA=EA+1;NA<FA;){var OA=NA++;gA[eA]=V.add(gA[eA],V.mul(j[eA][OA],rA[OA]))}}if(Vt>1)for(var JA=Bt-2,xA=Bt,At=ae-mt,ft=(ae-vA[Bt-1])/At,Gt=1;Gt<Vt;){for(var Yt=Gt++,he=JA,ne=xA,Ce=ne-Bt+1;ne-he>Yt;){if(he<Qt){var Ke=(ae-vA[he])/(mt-vA[he]);MA[he]=V.lerp(Ke,MA[he],MA[he-1])}if(ne>=fe){if(ne-Yt<=Bt-fA+Vt){var je=(ae-vA[ne-Yt])/At;gA[Ce]=V.lerp(je,gA[Ce],gA[Ce+1])}}else gA[Ce]=V.lerp(ft,gA[Ce],gA[Ce+1]);he=he+1,ne=ne-1,Ce=Ce-1}JA=JA-1,xA=xA+1}if(ht!=x)for(var We=0,sn=fA-Vt;We<sn;)We++,vA[Bt]=mt,Bt=Bt+1;for(var Ze=fe,rn=Ne+1;Ze<rn;){var on=Ze++;MA[Qt]=gA[on],Qt=Qt+1}if(qA<uA){for(var $e=0;$e<rt;){var An=$e++;rA[An]=cA[An]}for(var tn=rt,gn=x+1;tn<gn;){var en=tn++;rA[en]=Y[qA-x+en]}ht=qA,qA=qA+1,mt=ae}else for(var nn=0,an=fA+1;nn<an;){var In=nn++;vA[Bt+In]=ae}}return new gt(d,vA,MA)},dt.rationalSurfaceTransform=function(h,d){for(var v=mA.dehomogenize2d(h.controlPoints),x=0,F=v.length;x<F;)for(var Y=x++,K=0,q=v[Y].length;K<q;){var j=K++,rA=v[Y][j];rA.push(1),v[Y][j]=GA.dot(d,rA).slice(0,rA.length-1)}return new it(h.degreeU,h.degreeV,h.knotsU.slice(),h.knotsV.slice(),mA.homogenize2d(v,mA.weight2d(h.controlPoints)))},dt.rationalCurveTransform=function(h,d){for(var v=mA.dehomogenize1d(h.controlPoints),x=0,F=v.length;x<F;){var Y=x++,K=v[Y];K.push(1),v[Y]=GA.dot(d,K).slice(0,K.length-1)}return new gt(h.degree,h.knots.slice(),mA.homogenize1d(v,mA.weight1d(h.controlPoints)))},dt.surfaceKnotRefine=function(h,d,v){var x=[],F,Y,K;v?(K=h.controlPoints,F=h.knotsV,Y=h.degreeV):(K=GA.transpose(h.controlPoints),F=h.knotsU,Y=h.degreeU);for(var q=null,j=0;j<K.length;){var rA=K[j];++j,q=dt.curveKnotRefine(new gt(Y,F,rA),d),x.push(q.controlPoints)}var gA=q.knots;return v?new it(h.degreeU,h.degreeV,h.knotsU.slice(),gA,x):(x=GA.transpose(x),new it(h.degreeU,h.degreeV,gA,h.knotsV.slice(),x))},dt.decomposeCurveIntoBeziers=function(h){for(var d=h.degree,v=h.controlPoints,x=h.knots,F=wt.knotMultiplicities(x),Y=d+1,K=0;K<F.length;){var q=F[K];if(++K,q.mult<Y){var j=V.rep(Y-q.mult,q.knot),rA=dt.curveKnotRefine(new gt(d,x,v),j);x=rA.knots,v=rA.controlPoints}}x.length/Y-1;for(var gA=Y*2,cA=[],uA=0;uA<v.length;){var fA=x.slice(uA,uA+gA),pA=v.slice(uA,uA+Y);cA.push(new gt(d,fA,pA)),uA+=Y}return cA},dt.curveKnotRefine=function(h,d){if(d.length==0)return Et.clonedCurve(h);for(var v=h.degree,x=h.controlPoints,F=h.knots,Y=x.length-1,K=Y+v+1,q=d.length-1,j=mA.knotSpan(v,d[0],F),rA=mA.knotSpan(v,d[q],F),gA=[],cA=[],uA=0,fA=j-v+1;uA<fA;){var pA=uA++;gA[pA]=x[pA]}for(var MA=rA-1,vA=Y+1;MA<vA;){var TA=MA++;gA[TA+q+1]=x[TA]}for(var SA=0,kA=j+1;SA<kA;){var HA=SA++;cA[HA]=F[HA]}for(var zA=rA+v,ZA=K+1;zA<ZA;){var VA=zA++;cA[VA+q+1]=F[VA]}for(var KA=rA+v-1,jA=rA+v+q,tt=q;tt>=0;){for(;d[tt]<=F[KA]&&KA>j;)gA[jA-v-1]=x[KA-v-1],cA[jA]=F[KA],jA=jA-1,KA=KA-1;gA[jA-v-1]=gA[jA-v];for(var ot=1,ct=v+1;ot<ct;){var lt=ot++,ut=jA-v+lt,Bt=cA[jA+lt]-d[tt];Math.abs(Bt)<bA.EPSILON?gA[ut-1]=gA[ut]:(Bt=Bt/(cA[jA+lt]-F[KA-v+lt]),gA[ut-1]=V.add(V.mul(Bt,gA[ut-1]),V.mul(1-Bt,gA[ut])))}cA[jA]=d[tt],jA=jA-1,tt--}return new gt(v,cA,gA)},dt.curveKnotInsert=function(h,d,v){for(var x=h.degree,F=h.controlPoints,Y=h.knots,K=0,q=F.length,j=mA.knotSpan(x,d,Y),rA=[],gA=[],cA=[],uA=1,fA=j+1;uA<fA;){var pA=uA++;gA[pA]=Y[pA]}for(var MA=1,vA=v+1;MA<vA;){var TA=MA++;gA[j+TA]=d}for(var SA=j+1,kA=Y.length;SA<kA;){var HA=SA++;gA[HA+v]=Y[HA]}for(var zA=0,ZA=j-x+1;zA<ZA;){var VA=zA++;cA[VA]=F[VA]}for(var KA=j-K;KA<q;){var jA=KA++;cA[jA+v]=F[jA]}for(var tt=0,ot=x-K+1;tt<ot;){var ct=tt++;rA[ct]=F[j-x+ct]}for(var lt=0,ut=0,Bt=1,rt=v+1;Bt<rt;){var ht=Bt++;lt=j-x+ht;for(var qA=0,Qt=x-ht-K+1;qA<Qt;){var mt=qA++;ut=(d-Y[lt+mt])/(Y[mt+j+1]-Y[lt+mt]),rA[mt]=V.add(V.mul(ut,rA[mt+1]),V.mul(1-ut,rA[mt]))}cA[lt]=rA[0],cA[j+v-ht-K]=rA[x-ht-K]}for(var Ut=lt+1,kt=j-K;Ut<kt;){var _t=Ut++;cA[_t]=rA[_t-lt]}return new gt(x,gA,cA)};var xt=o.eval.Tess=function(){};a["verb.eval.Tess"]=xt,xt.__name__=["verb","eval","Tess"],xt.rationalCurveRegularSample=function(h,d,v){return xt.rationalCurveRegularSampleRange(h,h.knots[0],DA.last(h.knots),d,v)},xt.rationalCurveRegularSampleRange=function(h,d,v,x,F){x<1&&(x=2);for(var Y=[],K=(v-d)/(x-1),q=0,j=0;j<x;){var rA=j++;q=d+K*rA,F?Y.push([q].concat(mA.rationalCurvePoint(h,q))):Y.push(mA.rationalCurvePoint(h,q))}return Y},xt.rationalCurveAdaptiveSample=function(h,d,v){if(v==null&&(v=!1),d==null&&(d=1e-6),h.degree==1)if(v){for(var x=[],F=0,Y=h.controlPoints.length;F<Y;){var K=F++;x.push([h.knots[K+1]].concat(mA.dehomogenize(h.controlPoints[K])))}return x}else return h.controlPoints.map(mA.dehomogenize);return xt.rationalCurveAdaptiveSampleRange(h,h.knots[0],DA.last(h.knots),d,v)},xt.rationalCurveAdaptiveSampleRange=function(h,d,v,x,F){var Y=mA.rationalCurvePoint(h,d),K=mA.rationalCurvePoint(h,v),q=.5+.2*Math.random(),j=d+(v-d)*q,rA=mA.rationalCurvePoint(h,j),gA=V.sub(Y,K),cA=V.sub(Y,rA);if(V.dot(gA,gA)<x&&V.dot(cA,cA)>x||!yt.threePointsAreFlat(Y,rA,K,x)){var uA=d+(v-d)*.5,fA=xt.rationalCurveAdaptiveSampleRange(h,d,uA,x,F),pA=xt.rationalCurveAdaptiveSampleRange(h,uA,v,x,F);return fA.slice(0,-1).concat(pA)}else return F?[[d].concat(Y),[v].concat(K)]:[Y,K]},xt.rationalSurfaceNaive=function(h,d,v){d<1&&(d=1),v<1&&(v=1),h.degreeU,h.degreeV,h.controlPoints;for(var x=h.knotsU,F=h.knotsV,Y=DA.last(x)-x[0],K=DA.last(F)-F[0],q=Y/d,j=K/v,rA=[],gA=[],cA=[],uA=0,fA=d+1;uA<fA;)for(var pA=uA++,MA=0,vA=v+1;MA<vA;){var TA=MA++,SA=pA*q,kA=TA*j;gA.push([SA,kA]);var HA=mA.rationalSurfaceDerivatives(h,SA,kA,1),zA=HA[0][0];rA.push(zA);var ZA=V.normalized(V.cross(HA[1][0],HA[0][1]));cA.push(ZA)}for(var VA=[],KA=0;KA<d;)for(var jA=KA++,tt=0;tt<v;){var ot=tt++,ct=jA*(v+1)+ot,lt=(jA+1)*(v+1)+ot,ut=lt+1,Bt=ct+1,rt=[ct,lt,ut],ht=[ct,ut,Bt];VA.push(rt),VA.push(ht)}return new Nt(VA,rA,cA,gA)},xt.divideRationalSurfaceAdaptive=function(h,d){d==null&&(d=new Be),d.minDivsU!=null?d.minDivsU=d.minDivsU:d.minDivsU=1,d.minDivsV!=null?d.minDivsU=d.minDivsV:d.minDivsU=1,d.refine!=null?d.refine=d.refine:d.refine=!0;var v=(h.controlPoints.length-1)*2,x=(h.controlPoints[0].length-1)*2,F;d.minDivsU>v?F=d.minDivsU=d.minDivsU:F=d.minDivsU=v;var Y;d.minDivsV>x?Y=d.minDivsV=d.minDivsV:Y=d.minDivsV=x;for(var K=DA.last(h.knotsU),q=h.knotsU[0],j=DA.last(h.knotsV),rA=h.knotsV[0],gA=(K-q)/F,cA=(j-rA)/Y,uA=[],fA=[],pA=0,MA=Y+1;pA<MA;){for(var vA=pA++,TA=[],SA=0,kA=F+1;SA<kA;){var HA=SA++,zA=q+gA*HA,ZA=rA+cA*vA,VA=mA.rationalSurfaceDerivatives(h,zA,ZA,1),KA=V.normalized(V.cross(VA[0][1],VA[1][0]));TA.push(new Xt(VA[0][0],KA,[zA,ZA],-1,V.isZero(KA)))}fA.push(TA)}for(var jA=0;jA<Y;)for(var tt=jA++,ot=0;ot<F;){var ct=ot++,lt=[fA[Y-tt-1][ct],fA[Y-tt-1][ct+1],fA[Y-tt][ct+1],fA[Y-tt][ct]];uA.push(new zt(h,lt))}if(!d.refine)return uA;for(var ut=0;ut<Y;)for(var Bt=ut++,rt=0;rt<F;){var ht=rt++,qA=Bt*F+ht,Qt=xt.north(qA,Bt,ht,F,Y,uA),mt=xt.east(qA,Bt,ht,F,Y,uA),Ut=xt.south(qA,Bt,ht,F,Y,uA),kt=xt.west(qA,Bt,ht,F,Y,uA);uA[qA].neighbors=[Ut,mt,Qt,kt],uA[qA].divide(d)}return uA},xt.north=function(h,d,v,x,F,Y){return d==0?null:Y[h-x]},xt.south=function(h,d,v,x,F,Y){return d==F-1?null:Y[h+x]},xt.east=function(h,d,v,x,F,Y){return v==x-1?null:Y[h+1]},xt.west=function(h,d,v,x,F,Y){return v==0?null:Y[h-1]},xt.triangulateAdaptiveRefinementNodeTree=function(h){for(var d=Nt.empty(),v=0;v<h.length;){var x=h[v];++v,x.triangulate(d)}return d},xt.rationalSurfaceAdaptive=function(h,d){d!=null?d=d:d=new Be;var v=xt.divideRationalSurfaceAdaptive(h,d);return xt.triangulateAdaptiveRefinementNodeTree(v)};var Be=o.core.AdaptiveRefinementOptions=function(){this.minDivsV=1,this.minDivsU=1,this.refine=!0,this.maxDepth=10,this.minDepth=0,this.normTol=.025};a["verb.eval.AdaptiveRefinementOptions"]=Be,Be.__name__=["verb","eval","AdaptiveRefinementOptions"],Be.prototype={__class__:Be};var zt=o.core.AdaptiveRefinementNode=function(h,d,v){if(this.srf=h,v==null?this.neighbors=[null,null,null,null]:this.neighbors=v,this.corners=d,this.corners==null){var x=h.knotsU[0],F=DA.last(h.knotsU),Y=h.knotsV[0],K=DA.last(h.knotsV);this.corners=[Xt.fromUv(x,Y),Xt.fromUv(F,Y),Xt.fromUv(F,K),Xt.fromUv(x,K)]}};a["verb.eval.AdaptiveRefinementNode"]=zt,zt.__name__=["verb","eval","AdaptiveRefinementNode"],zt.prototype={isLeaf:function(){return this.children==null},center:function(){return this.centerPoint!=null?this.centerPoint:this.evalSrf(this.u05,this.v05)},evalCorners:function(){this.u05=(this.corners[0].uv[0]+this.corners[2].uv[0])/2,this.v05=(this.corners[0].uv[1]+this.corners[2].uv[1])/2;for(var h=0;h<4;){var d=h++;if(this.corners[d].point==null){var v=this.corners[d];this.evalSrf(v.uv[0],v.uv[1],v)}}},evalSrf:function(h,d,v){var x=mA.rationalSurfaceDerivatives(this.srf,h,d,1),F=x[0][0],Y=V.cross(x[0][1],x[1][0]),K=V.isZero(Y);return K||(Y=V.normalized(Y)),v!=null?(v.degen=K,v.point=F,v.normal=Y,v):new Xt(F,Y,[h,d],-1,K)},getEdgeCorners:function(h){if(this.isLeaf())return[this.corners[h]];if(this.horizontal)switch(h){case 0:return this.children[0].getEdgeCorners(0);case 1:return this.children[0].getEdgeCorners(1).concat(this.children[1].getEdgeCorners(1));case 2:return this.children[1].getEdgeCorners(2);case 3:return this.children[1].getEdgeCorners(3).concat(this.children[0].getEdgeCorners(3))}switch(h){case 0:return this.children[0].getEdgeCorners(0).concat(this.children[1].getEdgeCorners(0));case 1:return this.children[1].getEdgeCorners(1);case 2:return this.children[1].getEdgeCorners(2).concat(this.children[0].getEdgeCorners(2));case 3:return this.children[0].getEdgeCorners(3)}return null},getAllCorners:function(h){var d=[this.corners[h]];if(this.neighbors[h]==null)return d;var v=this.neighbors[h].getEdgeCorners((h+2)%4),x=h%2,F=bA.EPSILON,Y=this,K=[function(j){return j.uv[0]>Y.corners[0].uv[0]+F&&j.uv[0]<Y.corners[2].uv[0]-F},function(j){return j.uv[1]>Y.corners[0].uv[1]+F&&j.uv[1]<Y.corners[2].uv[1]-F}],q=v.filter(K[x]);return q.reverse(),d.concat(q)},midpoint:function(h){if(this.midPoints==null&&(this.midPoints=[null,null,null,null]),this.midPoints[h]!=null)return this.midPoints[h];switch(h){case 0:this.midPoints[0]=this.evalSrf(this.u05,this.corners[0].uv[1]);break;case 1:this.midPoints[1]=this.evalSrf(this.corners[1].uv[0],this.v05);break;case 2:this.midPoints[2]=this.evalSrf(this.u05,this.corners[2].uv[1]);break;case 3:this.midPoints[3]=this.evalSrf(this.corners[0].uv[0],this.v05);break}return this.midPoints[h]},hasBadNormals:function(){return this.corners[0].degen||this.corners[1].degen||this.corners[2].degen||this.corners[3].degen},fixNormals:function(){for(var h=this.corners.length,d=0;d<h;){var v=d++;if(this.corners[v],this.corners[v].degen){var x=this.corners[(v+1)%h],F=this.corners[(v+3)%h];x.degen?this.corners[v].normal=F.normal:this.corners[v].normal=x.normal}}},shouldDivide:function(h,d){if(d<h.minDepth)return!0;if(d>=h.maxDepth)return!1;if(this.hasBadNormals())return this.fixNormals(),!1;if(this.splitVert=V.normSquared(V.sub(this.corners[0].normal,this.corners[1].normal))>h.normTol||V.normSquared(V.sub(this.corners[2].normal,this.corners[3].normal))>h.normTol,this.splitHoriz=V.normSquared(V.sub(this.corners[1].normal,this.corners[2].normal))>h.normTol||V.normSquared(V.sub(this.corners[3].normal,this.corners[0].normal))>h.normTol,this.splitVert||this.splitHoriz)return!0;var v=this.center();return V.normSquared(V.sub(v.normal,this.corners[0].normal))>h.normTol||V.normSquared(V.sub(v.normal,this.corners[1].normal))>h.normTol||V.normSquared(V.sub(v.normal,this.corners[2].normal))>h.normTol||V.normSquared(V.sub(v.normal,this.corners[3].normal))>h.normTol},divide:function(h){h==null&&(h=new Be),h.normTol==null&&(h.normTol=.085),h.minDepth==null&&(h.minDepth=0),h.maxDepth==null&&(h.maxDepth=10),this._divide(h,0,!0)},_divide:function(h,d,v){if(this.evalCorners(),!!this.shouldDivide(h,d)){if(d++,this.splitVert&&!this.splitHoriz?v=!1:!this.splitVert&&this.splitHoriz&&(v=!0),this.horizontal=v,this.horizontal){var x=[this.corners[0],this.corners[1],this.midpoint(1),this.midpoint(3)],F=[this.midpoint(3),this.midpoint(1),this.corners[2],this.corners[3]];this.children=[new zt(this.srf,x),new zt(this.srf,F)],this.children[0].neighbors=[this.neighbors[0],this.neighbors[1],this.children[1],this.neighbors[3]],this.children[1].neighbors=[this.children[0],this.neighbors[1],this.neighbors[2],this.neighbors[3]]}else{var Y=[this.corners[0],this.midpoint(0),this.midpoint(2),this.corners[3]],K=[this.midpoint(0),this.corners[1],this.corners[2],this.midpoint(2)];this.children=[new zt(this.srf,Y),new zt(this.srf,K)],this.children[0].neighbors=[this.neighbors[0],this.children[1],this.neighbors[2],this.neighbors[3]],this.children[1].neighbors=[this.neighbors[0],this.neighbors[1],this.neighbors[2],this.children[0]]}for(var q=0,j=this.children;q<j.length;){var rA=j[q];++q,rA._divide(h,d,!v)}}},triangulate:function(h){if(h==null&&(h=Nt.empty()),this.isLeaf())return this.triangulateLeaf(h);for(var d=0,v=this.children;d<v.length;){var x=v[d];if(++d,x==null)break;x.triangulate(h)}return h},triangulateLeaf:function(h){for(var d=h.points.length,v=[],x=[],F=0,Y=0;Y<4;){var K=Y++,q=this.getAllCorners(K);q.length==2&&(F=K+1);for(var j=0,rA=q.length;j<rA;){var gA=j++;v.push(q[gA])}}for(var cA=0;cA<v.length;){var uA=v[cA];if(++cA,uA.id!=-1){x.push(uA.id);continue}h.uvs.push(uA.uv),h.points.push(uA.point),h.normals.push(uA.normal),uA.id=d,x.push(d),d++}if(v.length==4)return h.faces.push([x[0],x[3],x[1]]),h.faces.push([x[3],x[2],x[1]]),h;if(v.length==5){var fA=x.length;return h.faces.push([x[F],x[(F+2)%fA],x[(F+1)%fA]]),h.faces.push([x[(F+4)%fA],x[(F+3)%fA],x[F]]),h.faces.push([x[F],x[(F+3)%fA],x[(F+2)%fA]]),h}var pA=this.center();h.uvs.push(pA.uv),h.points.push(pA.point),h.normals.push(pA.normal);for(var MA=h.points.length-1,vA=0,TA=v.length-1;vA<v.length;)h.faces.push([MA,x[vA],x[TA]]),TA=vA++;return h},__class__:zt};var me=function(){};a["verb.geom.ICurve"]=me,me.__name__=["verb","geom","ICurve"],me.__interfaces__=[et],me.prototype={__class__:me};var Rt=o.geom.NurbsCurve=function(h){this._data=ie.isValidNurbsCurveData(h)};a["verb.geom.NurbsCurve"]=Rt,Rt.__name__=["verb","geom","NurbsCurve"],Rt.__interfaces__=[me],Rt.byKnotsControlPointsWeights=function(h,d,v,x){return new Rt(new gt(h,d.slice(),mA.homogenize1d(v,x)))},Rt.byPoints=function(h,d){return d==null&&(d=3),new Rt(Et.rationalInterpCurve(h,d))},Rt.__super__=nt,Rt.prototype=c(nt.prototype,{degree:function(){return this._data.degree},knots:function(){return this._data.knots.slice(0)},controlPoints:function(){return mA.dehomogenize1d(this._data.controlPoints)},weights:function(){return mA.weight1d(this._data.controlPoints)},asNurbs:function(){return new gt(this.degree(),this.knots(),mA.homogenize1d(this.controlPoints(),this.weights()))},clone:function(){return new Rt(this._data)},domain:function(){return new Ft(DA.first(this._data.knots),DA.last(this._data.knots))},transform:function(h){return new Rt(dt.rationalCurveTransform(this._data,h))},point:function(h){return mA.rationalCurvePoint(this._data,h)},tangent:function(h){return mA.rationalCurveTangent(this._data,h)},derivatives:function(h,d){return d==null&&(d=1),mA.rationalCurveDerivatives(this._data,h,d)},closestPoint:function(h){return wt.rationalCurveClosestPoint(this._data,h)},closestParam:function(h){return wt.rationalCurveClosestParam(this._data,h)},length:function(){return wt.rationalCurveArcLength(this._data)},lengthAtParam:function(h){return wt.rationalCurveArcLength(this._data,h)},paramAtLength:function(h,d){return wt.rationalCurveParamAtArcLength(this._data,h,d)},divideByEqualArcLength:function(h){return Ae.rationalCurveByEqualArcLength(this._data,h)},divideByArcLength:function(h){return Ae.rationalCurveByArcLength(this._data,h)},split:function(h){return Ae.curveSplit(this._data,h).map(function(d){return new Rt(d)})},reverse:function(){return new Rt(dt.curveReverse(this._data))},tessellate:function(h){return xt.rationalCurveAdaptiveSample(this._data,h,!1)},__class__:Rt});var ye=o.geom.Arc=function(h,d,v,x,F,Y){Rt.call(this,Et.arc(h,d,v,x,F,Y)),this._center=h,this._xaxis=d,this._yaxis=v,this._radius=x,this._minAngle=F,this._maxAngle=Y};a["verb.geom.Arc"]=ye,ye.__name__=["verb","geom","Arc"],ye.__super__=Rt,ye.prototype=c(Rt.prototype,{center:function(){return this._center},xaxis:function(){return this._xaxis},yaxis:function(){return this._yaxis},radius:function(){return this._radius},minAngle:function(){return this._minAngle},maxAngle:function(){return this._maxAngle},__class__:ye});var Fe=o.geom.BezierCurve=function(h,d){Rt.call(this,Et.rationalBezierCurve(h,d))};a["verb.geom.BezierCurve"]=Fe,Fe.__name__=["verb","geom","BezierCurve"],Fe.__super__=Rt,Fe.prototype=c(Rt.prototype,{__class__:Fe});var Le=o.geom.Circle=function(h,d,v,x){ye.call(this,h,d,v,x,0,Math.PI*2)};a["verb.geom.Circle"]=Le,Le.__name__=["verb","geom","Circle"],Le.__super__=ye,Le.prototype=c(ye.prototype,{__class__:Le});var ve=function(){};a["verb.geom.ISurface"]=ve,ve.__name__=["verb","geom","ISurface"],ve.__interfaces__=[et],ve.prototype={__class__:ve};var pt=o.geom.NurbsSurface=function(h){this._data=ie.isValidNurbsSurfaceData(h)};a["verb.geom.NurbsSurface"]=pt,pt.__name__=["verb","geom","NurbsSurface"],pt.__interfaces__=[ve],pt.byKnotsControlPointsWeights=function(h,d,v,x,F,Y){return new pt(new it(h,d,v,x,mA.homogenize2d(F,Y)))},pt.byCorners=function(h,d,v,x){return new pt(Et.fourPointSurface(h,d,v,x))},pt.byLoftingCurves=function(h,d){return new pt(Et.loftedSurface((function(v){for(var x,F=[],Y=0;Y<h.length;){var K=h[Y];++Y,F.push(K.asNurbs())}return x=F,x})(),d))},pt.__super__=nt,pt.prototype=c(nt.prototype,{degreeU:function(){return this._data.degreeU},degreeV:function(){return this._data.degreeV},knotsU:function(){return this._data.knotsU.slice(0)},knotsV:function(){return this._data.knotsV.slice(0)},controlPoints:function(){return mA.dehomogenize2d(this._data.controlPoints)},weights:function(){return mA.weight2d(this._data.controlPoints)},asNurbs:function(){return new it(this.degreeU(),this.degreeV(),this.knotsU(),this.knotsV(),mA.homogenize2d(this.controlPoints(),this.weights()))},clone:function(){return new pt(this.asNurbs())},domainU:function(){return new Ft(DA.first(this._data.knotsU),DA.last(this._data.knotsU))},domainV:function(){return new Ft(DA.first(this._data.knotsV),DA.last(this._data.knotsV))},point:function(h,d){return mA.rationalSurfacePoint(this._data,h,d)},normal:function(h,d){return mA.rationalSurfaceNormal(this._data,h,d)},derivatives:function(h,d,v){return v==null&&(v=1),mA.rationalSurfaceDerivatives(this._data,h,d,v)},closestParam:function(h){return wt.rationalSurfaceClosestParam(this._data,h)},closestPoint:function(h){return wt.rationalSurfaceClosestPoint(this._data,h)},split:function(h,d){return d==null&&(d=!1),Ae.surfaceSplit(this._data,h,d).map(function(v){return new pt(v)})},reverse:function(h){return h==null&&(h=!1),new pt(dt.surfaceReverse(this._data,h))},isocurve:function(h,d){return d==null&&(d=!1),new Rt(Et.surfaceIsocurve(this._data,h,d))},boundaries:function(h){return Et.surfaceBoundaryCurves(this._data).map(function(d){return new Rt(d)})},tessellate:function(h){return xt.rationalSurfaceAdaptive(this._data,h)},transform:function(h){return new pt(dt.rationalSurfaceTransform(this._data,h))},__class__:pt});var Re=o.geom.ConicalSurface=function(h,d,v,x,F){pt.call(this,Et.conicalSurface(h,d,v,x,F)),this._axis=h,this._xaxis=d,this._base=v,this._height=x,this._radius=F};a["verb.geom.ConicalSurface"]=Re,Re.__name__=["verb","geom","ConicalSurface"],Re.__super__=pt,Re.prototype=c(pt.prototype,{axis:function(){return this._axis},xaxis:function(){return this._xaxis},base:function(){return this._base},height:function(){return this._height},radius:function(){return this._radius},__class__:Re});var qt=o.geom.CylindricalSurface=function(h,d,v,x,F){pt.call(this,Et.cylindricalSurface(h,d,v,x,F)),this._axis=h,this._xaxis=d,this._base=v,this._height=x,this._radius=F};a["verb.geom.CylindricalSurface"]=qt,qt.__name__=["verb","geom","CylindricalSurface"],qt.__super__=pt,qt.prototype=c(pt.prototype,{axis:function(){return this._axis},xaxis:function(){return this._xaxis},base:function(){return this._base},height:function(){return this._height},radius:function(){return this._radius},__class__:qt});var te=o.geom.EllipseArc=function(h,d,v,x,F){Rt.call(this,Et.ellipseArc(h,d,v,x,F)),this._center=h,this._xaxis=d,this._yaxis=v,this._minAngle=x,this._maxAngle=F};a["verb.geom.EllipseArc"]=te,te.__name__=["verb","geom","EllipseArc"],te.__super__=Rt,te.prototype=c(Rt.prototype,{center:function(){return this._center},xaxis:function(){return this._xaxis},yaxis:function(){return this._yaxis},minAngle:function(){return this._minAngle},maxAngle:function(){return this._maxAngle},__class__:te});var Ee=o.geom.Ellipse=function(h,d,v){te.call(this,h,d,v,0,Math.PI*2)};a["verb.geom.Ellipse"]=Ee,Ee.__name__=["verb","geom","Ellipse"],Ee.__super__=te,Ee.prototype=c(te.prototype,{__class__:Ee});var Me=o.geom.ExtrudedSurface=function(h,d){pt.call(this,Et.extrudedSurface(V.normalized(d),V.norm(d),h.asNurbs())),this._profile=h,this._direction=d};a["verb.geom.ExtrudedSurface"]=Me,Me.__name__=["verb","geom","ExtrudedSurface"],Me.__super__=pt,Me.prototype=c(pt.prototype,{profile:function(){return this._profile},direction:function(){return this._direction},__class__:Me});var Ue=o.geom.Intersect=function(){};a["verb.geom.Intersect"]=Ue,Ue.__name__=["verb","geom","Intersect"],Ue.curves=function(h,d,v){return v==null&&(v=.001),WA.curves(h.asNurbs(),d.asNurbs(),v)},Ue.curveAndSurface=function(h,d,v){return v==null&&(v=.001),WA.curveAndSurface(h.asNurbs(),d.asNurbs(),v)},Ue.surfaces=function(h,d,v){return v==null&&(v=.001),WA.surfaces(h.asNurbs(),d.asNurbs(),v).map(function(x){return new Rt(x)})};var ke=o.geom.Line=function(h,d){Rt.call(this,Et.polyline([h,d])),this._start=h,this._end=d};a["verb.geom.Line"]=ke,ke.__name__=["verb","geom","Line"],ke.__super__=Rt,ke.prototype=c(Rt.prototype,{start:function(){return this._start},end:function(){return this._end},__class__:ke});var Ge=o.geom.RevolvedSurface=function(h,d,v,x){pt.call(this,Et.revolvedSurface(h.asNurbs(),d,v,x)),this._profile=h,this._center=d,this._axis=v,this._angle=x};a["verb.geom.RevolvedSurface"]=Ge,Ge.__name__=["verb","geom","RevolvedSurface"],Ge.__super__=pt,Ge.prototype=c(pt.prototype,{profile:function(){return this._profile},center:function(){return this._center},axis:function(){return this._center},angle:function(){return this._angle},__class__:Ge});var Te=o.geom.SphericalSurface=function(h,d){pt.call(this,Et.sphericalSurface(h,[0,0,1],[1,0,0],d)),this._center=h,this._radius=d};a["verb.geom.SphericalSurface"]=Te,Te.__name__=["verb","geom","SphericalSurface"],Te.__super__=pt,Te.prototype=c(pt.prototype,{center:function(){return this._center},radius:function(){return this._radius},__class__:Te});var bt=o.geom.SweptSurface=function(h,d){pt.call(this,Et.rationalTranslationalSurface(h.asNurbs(),d.asNurbs())),this._profile=h,this._rail=d};a["verb.geom.SweptSurface"]=bt,bt.__name__=["verb","geom","SweptSurface"],bt.__super__=pt,bt.prototype=c(pt.prototype,{profile:function(){return this._profile},rail:function(){return this._rail},__class__:bt});function oe(h){return h instanceof Array?function(){return E.iter(h)}:typeof h.iterator=="function"?at(h,h.iterator):h.iterator}var Wt,Je=0;function at(h,d){if(d==null)return null;d.__id__==null&&(d.__id__=Je++);var v;return h.hx__closures__==null?h.hx__closures__={}:v=h.hx__closures__[d.__id__],v==null&&(v=function(){return v.method.apply(v.scope,arguments)},v.scope=h,v.method=d,h.hx__closures__[d.__id__]=v),v}a.Math=Math,String.prototype.__class__=a.String=String,String.__name__=["String"],a.Array=Array,Array.__name__=["Array"],Date.prototype.__class__=a.Date=Date,Date.__name__=["Date"];var He=a.Int={__name__:["Int"]},de=a.Dynamic={__name__:["Dynamic"]},qe=a.Float=Number;qe.__name__=["Float"];var be=a.Bool=Boolean;be.__ename__=["Bool"];var ee=a.Class={__name__:["Class"]},f={};Array.prototype.map==null&&(Array.prototype.map=function(h){for(var d=[],v=0,x=this.length;v<x;){var F=v++;d[F]=h(this[F])}return d}),Array.prototype.filter==null&&(Array.prototype.filter=function(h){for(var d=[],v=0,x=this.length;v<x;){var F=v++,Y=this[F];h(Y)&&d.push(Y)}return d});var m={},P=g.ArrayBuffer||hA;P.prototype.slice==null&&(P.prototype.slice=hA.sliceImpl),g.DataView;var L=g.Uint8Array||PA._new;(function(h,d){if(h.setImmediate)return;var v=1,x={},F=!1,Y=h.document,K;function q(SA){return x[v]=j.apply(d,SA),v++}function j(SA){var kA=[].slice.call(arguments,1);return function(){typeof SA=="function"?SA.apply(d,kA):new Function(""+SA)()}}function rA(SA){if(F)setTimeout(j(rA,SA),0);else{var kA=x[SA];if(kA){F=!0;try{kA()}finally{gA(SA),F=!1}}}}function gA(SA){delete x[SA]}function cA(){K=function(){var SA=q(arguments);return process.nextTick(j(rA,SA)),SA}}function uA(){if(h.postMessage&&!h.importScripts){var SA=!0,kA=h.onmessage;return h.onmessage=function(){SA=!1},h.postMessage("","*"),h.onmessage=kA,SA}}function fA(){var SA="setImmediate$"+Math.random()+"$",kA=function(HA){HA.source===h&&typeof HA.data=="string"&&HA.data.indexOf(SA)===0&&rA(+HA.data.slice(SA.length))};h.addEventListener?h.addEventListener("message",kA,!1):h.attachEvent("onmessage",kA),K=function(){var HA=q(arguments);return h.postMessage(SA+HA,"*"),HA}}function pA(){var SA=new MessageChannel;SA.port1.onmessage=function(kA){var HA=kA.data;rA(HA)},K=function(){var kA=q(arguments);return SA.port2.postMessage(kA),kA}}function MA(){var SA=Y.documentElement;K=function(){var kA=q(arguments),HA=Y.createElement("script");return HA.onreadystatechange=function(){rA(kA),HA.onreadystatechange=null,SA.removeChild(HA),HA=null},SA.appendChild(HA),kA}}function vA(){K=function(){var SA=q(arguments);return setTimeout(j(rA,SA),0),SA}}var TA=Object.getPrototypeOf&&Object.getPrototypeOf(h);TA=TA&&TA.setTimeout?TA:h,{}.toString.call(h.process)==="[object process]"?cA():uA()?fA():h.MessageChannel?pA():Y&&"onreadystatechange"in Y.createElement("script")?MA():vA(),TA.setImmediate=K,TA.clearImmediate=gA})(new Function("return this")()),b.USE_CACHE=!1,b.USE_ENUM_INDEX=!1,b.BASE64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%:",G.DEFAULT_RESOLVER=S,G.BASE64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%:",H.count=0,iA.i64tmp=(function(h){var d,v=new U(0,0);return d=v,d})(),oA.__toStr={}.toString,PA.BYTES_PER_ELEMENT=1,aA.queue=new Q,UA.memo=new O,bA.TOLERANCE=1e-6,bA.EPSILON=1e-10,bA.VERSION="2.0.0",wt.Tvalues=[[],[],[-.5773502691896257,.5773502691896257],[0,-.7745966692414834,.7745966692414834],[-.33998104358485626,.33998104358485626,-.8611363115940526,.8611363115940526],[0,-.5384693101056831,.5384693101056831,-.906179845938664,.906179845938664],[.6612093864662645,-.6612093864662645,-.2386191860831969,.2386191860831969,-.932469514203152,.932469514203152],[0,.4058451513773972,-.4058451513773972,-.7415311855993945,.7415311855993945,-.9491079123427585,.9491079123427585],[-.1834346424956498,.1834346424956498,-.525532409916329,.525532409916329,-.7966664774136267,.7966664774136267,-.9602898564975363,.9602898564975363],[0,-.8360311073266358,.8360311073266358,-.9681602395076261,.9681602395076261,-.3242534234038089,.3242534234038089,-.6133714327005904,.6133714327005904],[-.14887433898163122,.14887433898163122,-.4333953941292472,.4333953941292472,-.6794095682990244,.6794095682990244,-.8650633666889845,.8650633666889845,-.9739065285171717,.9739065285171717],[0,-.26954315595234496,.26954315595234496,-.5190961292068118,.5190961292068118,-.7301520055740494,.7301520055740494,-.8870625997680953,.8870625997680953,-.978228658146057,.978228658146057],[-.1252334085114689,.1252334085114689,-.3678314989981802,.3678314989981802,-.5873179542866175,.5873179542866175,-.7699026741943047,.7699026741943047,-.9041172563704749,.9041172563704749,-.9815606342467192,.9815606342467192],[0,-.2304583159551348,.2304583159551348,-.44849275103644687,.44849275103644687,-.6423493394403402,.6423493394403402,-.8015780907333099,.8015780907333099,-.9175983992229779,.9175983992229779,-.9841830547185881,.9841830547185881],[-.10805494870734367,.10805494870734367,-.31911236892788974,.31911236892788974,-.5152486363581541,.5152486363581541,-.6872929048116855,.6872929048116855,-.827201315069765,.827201315069765,-.9284348836635735,.9284348836635735,-.9862838086968123,.9862838086968123],[0,-.20119409399743451,.20119409399743451,-.3941513470775634,.3941513470775634,-.5709721726085388,.5709721726085388,-.7244177313601701,.7244177313601701,-.8482065834104272,.8482065834104272,-.937273392400706,.937273392400706,-.9879925180204854,.9879925180204854],[-.09501250983763744,.09501250983763744,-.2816035507792589,.2816035507792589,-.45801677765722737,.45801677765722737,-.6178762444026438,.6178762444026438,-.755404408355003,.755404408355003,-.8656312023878318,.8656312023878318,-.9445750230732326,.9445750230732326,-.9894009349916499,.9894009349916499],[0,-.17848418149584785,.17848418149584785,-.3512317634538763,.3512317634538763,-.5126905370864769,.5126905370864769,-.6576711592166907,.6576711592166907,-.7815140038968014,.7815140038968014,-.8802391537269859,.8802391537269859,-.9506755217687678,.9506755217687678,-.9905754753144174,.9905754753144174],[-.0847750130417353,.0847750130417353,-.2518862256915055,.2518862256915055,-.41175116146284263,.41175116146284263,-.5597708310739475,.5597708310739475,-.6916870430603532,.6916870430603532,-.8037049589725231,.8037049589725231,-.8926024664975557,.8926024664975557,-.9558239495713977,.9558239495713977,-.9915651684209309,.9915651684209309],[0,-.16035864564022537,.16035864564022537,-.31656409996362983,.31656409996362983,-.46457074137596094,.46457074137596094,-.600545304661681,.600545304661681,-.7209661773352294,.7209661773352294,-.8227146565371428,.8227146565371428,-.9031559036148179,.9031559036148179,-.96020815213483,.96020815213483,-.9924068438435844,.9924068438435844],[-.07652652113349734,.07652652113349734,-.22778585114164507,.22778585114164507,-.37370608871541955,.37370608871541955,-.5108670019508271,.5108670019508271,-.636053680726515,.636053680726515,-.7463319064601508,.7463319064601508,-.8391169718222188,.8391169718222188,-.912234428251326,.912234428251326,-.9639719272779138,.9639719272779138,-.9931285991850949,.9931285991850949],[0,-.1455618541608951,.1455618541608951,-.2880213168024011,.2880213168024011,-.4243421202074388,.4243421202074388,-.5516188358872198,.5516188358872198,-.6671388041974123,.6671388041974123,-.7684399634756779,.7684399634756779,-.8533633645833173,.8533633645833173,-.9200993341504008,.9200993341504008,-.9672268385663063,.9672268385663063,-.9937521706203895,.9937521706203895],[-.06973927331972223,.06973927331972223,-.20786042668822127,.20786042668822127,-.34193582089208424,.34193582089208424,-.469355837986757,.469355837986757,-.5876404035069116,.5876404035069116,-.6944872631866827,.6944872631866827,-.7878168059792081,.7878168059792081,-.8658125777203002,.8658125777203002,-.926956772187174,.926956772187174,-.9700604978354287,.9700604978354287,-.9942945854823992,.9942945854823992],[0,-.1332568242984661,.1332568242984661,-.26413568097034495,.26413568097034495,-.3903010380302908,.3903010380302908,-.5095014778460075,.5095014778460075,-.6196098757636461,.6196098757636461,-.7186613631319502,.7186613631319502,-.8048884016188399,.8048884016188399,-.8767523582704416,.8767523582704416,-.9329710868260161,.9329710868260161,-.9725424712181152,.9725424712181152,-.9947693349975522,.9947693349975522],[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213]],wt.Cvalues=[[],[],[1,1],[.8888888888888888,.5555555555555556,.5555555555555556],[.6521451548625461,.6521451548625461,.34785484513745385,.34785484513745385],[.5688888888888889,.47862867049936647,.47862867049936647,.23692688505618908,.23692688505618908],[.3607615730481386,.3607615730481386,.46791393457269104,.46791393457269104,.17132449237917036,.17132449237917036],[.4179591836734694,.3818300505051189,.3818300505051189,.27970539148927664,.27970539148927664,.1294849661688697,.1294849661688697],[.362683783378362,.362683783378362,.31370664587788727,.31370664587788727,.22238103445337448,.22238103445337448,.10122853629037626,.10122853629037626],[.3302393550012598,.1806481606948574,.1806481606948574,.08127438836157441,.08127438836157441,.31234707704000286,.31234707704000286,.26061069640293544,.26061069640293544],[.29552422471475287,.29552422471475287,.26926671930999635,.26926671930999635,.21908636251598204,.21908636251598204,.1494513491505806,.1494513491505806,.06667134430868814,.06667134430868814],[.2729250867779006,.26280454451024665,.26280454451024665,.23319376459199048,.23319376459199048,.18629021092773426,.18629021092773426,.1255803694649046,.1255803694649046,.05566856711617366,.05566856711617366],[.24914704581340277,.24914704581340277,.2334925365383548,.2334925365383548,.20316742672306592,.20316742672306592,.16007832854334622,.16007832854334622,.10693932599531843,.10693932599531843,.04717533638651183,.04717533638651183],[.2325515532308739,.22628318026289723,.22628318026289723,.2078160475368885,.2078160475368885,.17814598076194574,.17814598076194574,.13887351021978725,.13887351021978725,.09212149983772845,.09212149983772845,.04048400476531588,.04048400476531588],[.2152638534631578,.2152638534631578,.2051984637212956,.2051984637212956,.18553839747793782,.18553839747793782,.15720316715819355,.15720316715819355,.12151857068790319,.12151857068790319,.08015808715976021,.08015808715976021,.03511946033175186,.03511946033175186],[.2025782419255613,.19843148532711158,.19843148532711158,.1861610000155622,.1861610000155622,.16626920581699392,.16626920581699392,.13957067792615432,.13957067792615432,.10715922046717194,.10715922046717194,.07036604748810812,.07036604748810812,.03075324199611727,.03075324199611727],[.1894506104550685,.1894506104550685,.18260341504492358,.18260341504492358,.16915651939500254,.16915651939500254,.14959598881657674,.14959598881657674,.12462897125553388,.12462897125553388,.09515851168249279,.09515851168249279,.062253523938647894,.062253523938647894,.027152459411754096,.027152459411754096],[.17944647035620653,.17656270536699264,.17656270536699264,.16800410215645004,.16800410215645004,.15404576107681028,.15404576107681028,.13513636846852548,.13513636846852548,.11188384719340397,.11188384719340397,.08503614831717918,.08503614831717918,.0554595293739872,.0554595293739872,.02414830286854793,.02414830286854793],[.1691423829631436,.1691423829631436,.16427648374583273,.16427648374583273,.15468467512626524,.15468467512626524,.14064291467065065,.14064291467065065,.12255520671147846,.12255520671147846,.10094204410628717,.10094204410628717,.07642573025488905,.07642573025488905,.0497145488949698,.0497145488949698,.02161601352648331,.02161601352648331],[.1610544498487837,.15896884339395434,.15896884339395434,.15276604206585967,.15276604206585967,.1426067021736066,.1426067021736066,.12875396253933621,.12875396253933621,.11156664554733399,.11156664554733399,.09149002162245,.09149002162245,.06904454273764123,.06904454273764123,.0448142267656996,.0448142267656996,.019461788229726478,.019461788229726478],[.15275338713072584,.15275338713072584,.14917298647260374,.14917298647260374,.14209610931838204,.14209610931838204,.13168863844917664,.13168863844917664,.11819453196151841,.11819453196151841,.10193011981724044,.10193011981724044,.08327674157670475,.08327674157670475,.06267204833410907,.06267204833410907,.04060142980038694,.04060142980038694,.017614007139152118,.017614007139152118],[.14608113364969041,.14452440398997005,.14452440398997005,.13988739479107315,.13988739479107315,.13226893863333747,.13226893863333747,.12183141605372853,.12183141605372853,.10879729916714838,.10879729916714838,.09344442345603386,.09344442345603386,.0761001136283793,.0761001136283793,.057134425426857205,.057134425426857205,.036953789770852494,.036953789770852494,.016017228257774335,.016017228257774335],[.13925187285563198,.13925187285563198,.13654149834601517,.13654149834601517,.13117350478706238,.13117350478706238,.12325237681051242,.12325237681051242,.11293229608053922,.11293229608053922,.10041414444288096,.10041414444288096,.08594160621706773,.08594160621706773,.06979646842452049,.06979646842452049,.052293335152683286,.052293335152683286,.03377490158481415,.03377490158481415,.0146279952982722,.0146279952982722],[.13365457218610619,.1324620394046966,.1324620394046966,.12890572218808216,.12890572218808216,.12304908430672953,.12304908430672953,.11499664022241136,.11499664022241136,.10489209146454141,.10489209146454141,.09291576606003515,.09291576606003515,.07928141177671895,.07928141177671895,.06423242140852585,.06423242140852585,.04803767173108467,.04803767173108467,.030988005856979445,.030988005856979445,.013411859487141771,.013411859487141771],[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872]],YA.main()})(typeof console<"u"?console:{},l,[s,globalThis,t,this].find(i=>typeof i<"u")),l}),verb=__verb,geom=verb.geom,core=verb.core,evalApi=verb.eval;var __getOwnPropDesc$n=Object.getOwnPropertyDescriptor,__decorateClass$n=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$n(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.NurbsCurve3=class extends Curve3{static merge(t,e,n,s=3){let r=t.clone(),i=e.clone();if(n){n.isSameDirection||(i=i.reverse());const Q=n.range1.getMid();r=r.splitCurve(Q)[0];const p=i.getParamAt(r.getPtAt(Q));i=i.splitCurve(p)[1]}else if(r.getEndPt().equals(i.getEndPt()))i=i.reverse();else if(r.getStartPt().equals(i.getStartPt()))r=r.reverse();else if(r.getStartPt().equals(i.getEndPt()))[r,i]=[i,r];else if(!r.getEndPt().equals(i.getStartPt()))return;const o=r.getControlPoints(),g=r.getKnots(),a=i.getKnots();o.pop();const I=o.concat(i.getControlPoints()),c=g.slice(0,g.length-1),E=c[c.length-1],u=a[0];for(let Q=s+1;Q<a.length;Q++)c.push(a[Q]+E-u);return exports.NurbsCurve3.makeByControlPoints(I,s,c)}static makeBezier(t,e){const n=this._fiterCoPoint(t),s=n.length-1,r=exports.NurbsCurve3.getBezierKnots(s);return exports.NurbsCurve3.makeByControlPoints(n,s,r,e,[0,1])}static makeByControlPoints(t,e=3,n,s,r){let i=t;n||(i=this._fiterCoPoint(t)),MathAssert.assert(i.length>=e+1,"nurbs curve 控制点数量需大于曲线次数"),MathAssert.assert(!s||s.length===i.length,"控制点和权值数量应相等");const o=s||new Array(i.length).fill(1);let g;if(n)g=n;else{g=new Array(i.length+e+1);const c=g.length,E=i.length;for(let u=0;u<c;u++)u<=e?g[u]=0:u<=E?g[u]=u-e:g[u]=g[u-1]}const a=i.map(c=>[c.x,c.y,c.z]),I=geom.NurbsCurve.byKnotsControlPointsWeights(e,g,a,o);return new exports.NurbsCurve3(I,r)}static makeByInterpolationPts(t,e=3,n=!1){const s=this._fiterCoPoint(t);if(s.length<=1)return MathAssert.warn(!1,"nurbs curve 至少需要 2 个点进行插值"),new exports.Ln3(s.length>0?s[0]:exports.Vec3.O(),exports.Vec3.X(),[0,0]);const r=Math.min(e,s.length-1),i=s.map(g=>[g.x,g.y,g.z]);let o;if(r===3)if(n&&new exports.Vec3(t[0]).equals(t[t.length-1])){const a=this._make3dNurbsByInterPoint(i).tangent(0);o=new geom.NurbsCurve(evalApi.Make.rationalInterpCurve(i,3,!1,a,a))}else o=this._make3dNurbsByInterPoint(i);else if(n&&new exports.Vec3(t[0]).equals(t[t.length-1])){const a=geom.NurbsCurve.byPoints(i,r).tangent(0);o=new geom.NurbsCurve(evalApi.Make.rationalInterpCurve(i,r,!1,a,a))}else o=geom.NurbsCurve.byPoints(i,r);return new exports.NurbsCurve3(o)}static makeByInterpolationPointsInPlane(t,e,n=3,s=!1){const i=t.map(c=>e.getLocalPtAt(c)).map(c=>({x:c.x,y:c.y,z:0})),o=exports.NurbsCurve3.makeByInterpolationPts(i,n,s),g=o.getControlPoints().map(c=>e.getWorldPtAt(c)),a=o.getKnots(),I=o.getWeights();return exports.NurbsCurve3.makeByControlPoints(g,o.getDegree(),a,I)}static getBezierKnots(t){const e=[],n=t+1;for(let s=0;s<n;s++)e.push(0);for(let s=0;s<n;s++)e.push(1);return e}static _fiterCoPoint(t){const e=[];e.push(t[0]);for(let n=1;n<t.length;++n)Tol.DEFAULT.areNear(t[n],t[n-1])||e.push(t[n]);return e}static _make3dNurbsByInterPoint(t){for(var e=[0],n=1,s=t.length;n<s;){var r=n++,i=core.Vec.norm(core.Vec.sub(t[r],t[r-1])),o=e[e.length-1];e.push(o+i)}for(var g=e[e.length-1],a=0,I=e.length;a<I;){var c=a++;e[c]=e[c]/g}for(var E=[0,0,0,0],u=1,Q=e.length-3,p=u;p<Q;){for(var w=p++,y=0,M=0;M<3;){var N=M++;y+=e[w+N]}E.push(1/3*y)}for(var S=E.concat([1,1,1,1]),R=[],U=t.length-1,b=0,G=t.length-4;b<e.length;){var O=e[b];++b;var H=evalApi.Eval.knotSpanGivenN(U,3,O,S),z=evalApi.Eval.basisFunctionsGivenKnotSpanIndex(H,O,3,S),tA=H-3,nA=core.Vec.zeros1d(tA),IA=core.Vec.zeros1d(G-tA);R.push(nA.concat(z).concat(IA))}for(var iA=t[0].length,W=[],oA=0;oA<iA;){var hA=[oA++],dA;dA=t.map((function(BA){return function(lA){return lA[BA[0]]}})(hA));var PA;if(R.length>5){var yA=R.map(BA=>BA.slice());PA=this._quickSolve(yA,dA.slice())}else PA=core.Mat.solve(R,dA);W.push(PA)}var _A=core.Mat.transpose(W),LA=core.Vec.rep(_A.length,1);return _A=evalApi.Eval.homogenize1d(_A,LA),new geom.NurbsCurve(new core.NurbsCurveData(3,S,_A))}static _quickSolve(t,e){const n=t.length;for(let s=0;s<3;++s)for(let r=n-3+s;r>0;--r){const i=t[r],o=t[r-1];let g=r+2-s<n?r+2-s:n-1;if(Tol.DEFAULT.isLengthZero(o[g]))continue;const a=o[g]/i[g];for(e[r-1]-=e[r]*a;g>r-6&&g>=0;--g)o[g]-=i[g]*a}for(let s=0;s<3;++s)for(let r=2-s;r<n-1;++r){const i=t[r+1],o=t[r];let g=r-2+s>0?r-2+s:0;if(Tol.DEFAULT.isLengthZero(i[g]))continue;const a=i[g]/o[g];for(e[r+1]-=e[r]*a;g<r+6&&g<n;++g)i[g]-=o[g]*a}for(let s=0;s<n;++s)e[s]*=1/t[s][s];return e}constructor(t,e){if(super(),t){this._verbCurve=t,this._updateParameters();const n=this._controlPoints[0].sqDistanceTo(this._controlPoints[this._controlPoints.length-1])<Tol.LENGTH_2;if(e)if(n){const s=t.domain();this._range=new PeriodInterval(e[0],e[1],s.max-s.min)}else this._range=new Interval(e[0],e[1]);else{const s=t.domain();this._range=n?new PeriodInterval(s.min,s.max,s.max-s.min):new Interval(s.min,s.max)}}}toVerbNurbs(){return this._verbCurve.clone()}getDegree(){return this._degree}getWeights(){return this._weights}getKnots(){return this._knots}getControlPoints(){return this._controlPoints}getDomain(){const t=this._verbCurve.domain();return this._range instanceof PeriodInterval?new PeriodInterval(t.min,t.max,t.max-t.min):new Interval(t.min,t.max)}isBezier(){const t=this._controlPoints.length;if(this._degree+1!==t)return!1;for(let e=0;e<t;e++)if(this._knots[e]!==0||this._knots[e+t]!==0)return!1;return!0}getCoincideLine(t=Tol.ANGLE){const e=this._controlPoints[this._controlPoints.length-1].subtracted(this._controlPoints[0]).normalize(),n=new exports.Ln3(this._controlPoints[0],e,Interval.infinitArray());for(let s=1;s<this._controlPoints.length;s++){const r=this._controlPoints[s].subtracted(this._controlPoints[0]).normalize();if(!e.isParallel(r,t))return}return n}isPlaneCurve3d(t=Tol.ANGLE){const e=this._controlPoints;if(e.length<4)return!0;let n;const s=e[0],r=exports.Vec3.O(),i=e[1].subtracted(s).normalized();for(let o=2;o<e.length;o++){const g=e[o].subtracted(s);if(g.equals(r))continue;const a=g.normalized();if(n===void 0){const I=i.cross(a).normalized();I.equals(new exports.Vec3(0,0,0))||(n=I)}else{const I=n.dot(a);if(Math.abs(I)>t)return!1}}return n||!0}getPtAt(t){const e=this.getDomain(),n=e instanceof PeriodInterval?e.getRegularParam(t):t,s=this._verbCurve.point(n);return new exports.Vec3(s[0],s[1],s[2])}getAllFootParams(t,e=Tol.LENGTH,n=Tol.ANGLE){const s=[],r=!this.isPeriodic(),i=this.getDomain(),o=this._degree*this._controlPoints.length,g=(i.max-i.min)/o,a=new exports.Vec3(t);let I=i.min,c=this.getPtAt(I).subtracted(a),E=this.getTangentAt(I).dot(c);Math.abs(E)<e&&s.push(I);for(let Q=1;Q<=o;++Q){const p=i.min+g*Q,w=this.getPtAt(p).subtracted(a),y=this.getTangentAt(p).dot(w);if(Math.abs(y)<e){s.push(p);continue}if(E*y<0){let M;E>0?M=I:M=p;const N=this.getFootByIterate(t,M,e,n,r);if(N!==void 0){const S=r?N:i.clamp(N);if(S<p+e&&S>I-e)s.push(S);else{const R=this.getFootByDichotomy(t,I,p,e,n,r);R===void 0?MathError.warn("nurbs3d反求参数失败!"):s.push(R)}}}I=p,c=w,E=y}if(s.length<1)return[];s.sort();const u=[s[0]];for(let Q=1;Q<s.length;++Q)Math.abs(s[Q-1]-s[Q])<e||u.push(s[Q]);return u.length>1&&i instanceof PeriodInterval&&Math.abs(u[u.length-1]-u[0]-i.period)<e&&u.pop(),u}getParamAt(t){const e=this.getDomain(),n=10;var s=evalApi.Tess.rationalCurveRegularSampleRange(this._verbCurve.asNurbs(),e.min,e.max,this._controlPoints.length*n,!0);const r=this._getParamAtWithPoints(t,s);if(this.getPtAt(r).equals(t))return r;s=[];for(let i=0;i<this._knots.length-1;i++){const[o,g]=[this._knots[i],this._knots[i+1]];if(o!==g){const a=(g-o)/n;for(let I=0;I<n;I++){const c=o+a*I;s.push([c,...this._verbCurve.point(c)])}}}return s.push(this._verbCurve.point(this._knots[this._knots.length-1])),this._getParamAtWithPoints(t,s)}_getParamAtWithPoints(t,e){const n=[t.x,t.y,t.z];for(var s=1/0,r=this.getDomain().min,i=0,o=e.length-1;i<o;){var g=i++,a=e[g][0],I=e[g+1][0],c=e[g].slice(1),E=e[g+1].slice(1),u=core.Trig.segmentClosestPoint(n,c,E,a,I),Q=core.Vec.norm(core.Vec.sub(n,u.pt));Math.abs(Q-s)<Tol.EDGE_LENGTH_EPS?this._range.containsPt(u.u)&&!this._range.containsPt(r)&&(s=Q,r=u.u):Q<s&&(s=Q,r=u.u)}for(var p=20,w=0,y,M=1e-6,N=1e-7,S,R=this._knots[0],U=this._knots[this._knots.length-1],b=this._controlPoints[0].equals(this._controlPoints[this._controlPoints.length-1],core.Constants.EPSILON),G=r,O=function(hA,dA,PA){var yA=core.Vec.dot(dA[1],PA),_A=core.Vec.dot(dA[2],PA),LA=core.Vec.dot(dA[1],dA[1]),BA=_A+LA;return hA-yA/BA};w<p;){y=evalApi.Eval.rationalCurveDerivatives(this._verbCurve.asNurbs(),G,2);for(const hA of y)hA.length>n.length&&hA.splice(n.length);S=core.Vec.sub(y[0],n);var H=core.Vec.norm(S),z=core.Vec.dot(y[1],S),tA=core.Vec.norm(y[1])*H,nA=z/tA,IA=H<M,iA=Math.abs(nA)<N;if(IA&&iA)return G;var W=O(G,y,S);W<R?b?W=U-(W-R):W=R:W>U&&(b?W=R+(W-U):W=U);var oA=core.Vec.norm(core.Vec.mul(W-G,y[1]));if(oA<M)return G;G=W,w++}return G}getNearestT(t,e){const n=[t.x,t.y,t.z],s=e||this._range;var r=1/0,i=s.min;const o=(this._controlPoints.length-this._degree)*this._degree*3;for(var g=evalApi.Tess.rationalCurveRegularSampleRange(this._verbCurve.asNurbs(),s.min,s.max,o,!0),a=0,I=g.length-1;a<I;){var c=a++,E=g[c][0],u=g[c+1][0],Q=g[c].slice(1),p=g[c+1].slice(1),w=core.Trig.segmentClosestPoint(n,Q,p,E,u),y=core.Vec.norm(core.Vec.sub(n,w.pt));y<r&&(r=y,i=w.u)}for(var M=20,N=0,S,R=1e-6,U=1e-7,b,G=s.min,O=s.max,H=i,z=function(PA,yA,_A){var LA=core.Vec.dot(yA[1],_A),BA=core.Vec.dot(yA[2],_A),lA=core.Vec.dot(yA[1],yA[1]),aA=BA+lA;return PA-LA/aA};N<M;){S=evalApi.Eval.rationalCurveDerivatives(this._verbCurve.asNurbs(),H,2);for(const PA of S)PA.length>n.length&&PA.splice(n.length);b=core.Vec.sub(S[0],n);var tA=core.Vec.norm(b),nA=core.Vec.dot(S[1],b),IA=core.Vec.norm(S[1])*tA,iA=nA/IA,W=tA<R,oA=Math.abs(iA)<U;if(W&&oA)return H;var hA=z(H,S,b);hA<G?s instanceof PeriodInterval?hA=hA+s.period:hA=G:hA>O&&(s instanceof PeriodInterval?hA=hA-s.period:hA=O);var dA=core.Vec.norm(core.Vec.mul(hA-H,S[1]));if(dA<R)return H;H=hA,N++}return H}getTangentAt(t){const e=this.getDomain();let n;e instanceof PeriodInterval&&(t>e.max+Tol.CALCULATE_EPS||t<e.min-Tol.CALCULATE_EPS)?n=e.getRegularParam(t,Tol.CALCULATE_EPS):(n=t,MathError.warn(e.containsPt(t,Tol.CALCULATE_EPS),"nurbs getTangentAt: 参数超出参数域"));const s=this._verbCurve.tangent(n);return new exports.Vec3(s[0],s[1],s[2]).normalize()}getDerivatives(t,e){const n=this.getDomain();let s;return n instanceof PeriodInterval&&(t>n.max+Tol.CALCULATE_EPS||t<n.min-Tol.CALCULATE_EPS)?s=n.getRegularParam(t,Tol.CALCULATE_EPS):(s=t,n.containsPt(t,Tol.CALCULATE_EPS)||MathError.warn("nurbs getDerivatives: 参数超出参数域")),this._verbCurve.derivatives(s,e).map(r=>new exports.Vec3(r))}getTangentCone(t,e=!0){const n=t||this._range,s=n.min,r=n.max,i=this.getDomain();if(r<i.min||s>i.max)return new TangentCone(exports.Vec3.O(),0);const o=this.clone();let g;s<i.min?g=o.splitCurve(r)[0]:s<i.min?g=o.splitCurve(s)[1]:g=o.splitCurve(s)[1].splitCurve(s)[0];const a=Tol.LENGTH*Tol.LENGTH,I=new TangentCone(exports.Vec3.O(),0),c=g.getControlPoints();let E=1;for(;E<c.length;){const u=c[E].subtracted(c[E-1]);if(u.getSqLength()>a){I.dir=u;break}E++}if(E===c.length)I.dir=exports.Vec3.X(),I.angle=0;else for(E++;E<c.length;){const u=c[E].subtracted(c[E-1]);u.getSqLength()>a&&I.mergeCone(u),E++}return I}getEqualDiversionPts(t=3){MathAssert.assert(t>=3,"getEqualDiversionPts,请传入大于3的数字",t);const e=[],n=this.getLength(),s=n/(t-1);for(let r=0;r<=n;r+=s){const i=this.getPtAt(r);e.push(i)}return e}getKontIndex(t,e=Tol.LENGTH){let n=0;for(;n<this._knots.length-1&&!(t>this._knots[n]-e&&t<=this._knots[n+1]-e);n++);return n}getMultiplicityOfKnot(t,e,n=Tol.LENGTH){let s=0;if(Math.abs(t-this._knots[e])<n){s++;for(let r=e+1;r<this._knots.length&&Math.abs(t-this._knots[r])<n;r++)s++}else if(Math.abs(t-this._knots[e+1])<n)for(let r=e+2;r<this._knots.length&&Math.abs(t-this._knots[r])<n;r++)s++;return s}insertKnot(t,e=Tol.LENGTH){const n=this.getDomain(),s=n instanceof PeriodInterval?n.getRegularParam(t):t;if(s<n.min+e||s>n.max-e)return;const r=this.getKontIndex(t,e),i=this._newCtrlPtsAtInsertKnot(r,s),o=this._degree;this._knots.splice(r+1,0,s),this._controlPoints.splice(r-o+1,o-1,...i),this._weights.splice(r-o+1,0,1);const g=[];i.map(I=>g.push([I.x,I.y,I.z]));const a=this._verbCurve.controlPoints();a.splice(r-o+1,o-1,...g),this._verbCurve=geom.NurbsCurve.byKnotsControlPointsWeights(o,this._knots,a,this._weights)}insertMultiKnot(t,e,n=Tol.LENGTH){const s=this.getDomain(),r=s instanceof PeriodInterval?s.getRegularParam(t):t;if(r<s.min+n||r>s.max-n)return;const i=this._degree,o=this.getKontIndex(t,n),g=this.getMultiplicityOfKnot(r,o,n),a=this._newCtrlPtsAtInsertMultiKnot(o,r,e,g),I=new Array(e);I.fill(r);const c=new Array(e);c.fill(1),this._knots.splice(o+1,0,...I),this._controlPoints.splice(o-i+1,i-g-1,...a),this._weights.splice(o-i+1,0,...c);const E=[];a.map(Q=>E.push([Q.x,Q.y,Q.z]));const u=this._verbCurve.controlPoints();u.splice(o-i+1,i-g-1,...E),this._verbCurve=geom.NurbsCurve.byKnotsControlPointsWeights(i,this._knots,u,this._weights)}insertKnots(t,e=Tol.LENGTH){}getBox(t){const e=t||this._range,n=e.getLength(),s=this.getDomain();if(e.containsInterval(s))return new Box3(this._controlPoints);s instanceof PeriodInterval&&(e.min=s.getRegularParam(e.min),e.max=e.min+n);const r=this._degree,i=this.getKnots().slice(),o=this.getControlPoints().slice();let g=this.getKontIndex(e.min);if(e.min-this.getDomain().min>Tol.NUMBER&&e.min-this.getDomain().max<-Tol.NUMBER){const c=this.getMultiplicityOfKnot(e.min,g),E=this._degree-c,u=this._newCtrlPtsAtInsertMultiKnot(g,e.min,E,c),Q=new Array(E);Q.fill(e.min),this._knots.splice(g+1,0,...Q),this._controlPoints.splice(g-r+1,r-c-1,...u),g=g-r+E}else g-=r;let a=this.getKontIndex(e.max);if(e.max-this.getDomain().min>Tol.NUMBER&&e.max-this.getDomain().max<-Tol.NUMBER){const c=this.getMultiplicityOfKnot(e.max,a),E=this._degree-c,u=this._newCtrlPtsAtInsertMultiKnot(a,e.max,E,c),Q=new Array(E);Q.fill(e.max),this._knots.splice(a+1,0,...Q),this._controlPoints.splice(a-r+1,r-c-1,...u),a=a-r+E}else a-=r;const I=this.getControlPoints().slice(g,a+1);return this._knots=i,this._controlPoints=o,new Box3(I)}knotRefinement(t=!1){const e=this._degree,n=this.getKnots(),s=this.getDomain().getLength()/10;for(let r=e;r<n.length-e+1&&(n[r+1]-n[r]>s&&(this.insertKnot((n[r+1]+n[r])/2),r--),!(n.length>30));r++);}splitCurve(t,e=!0){const n=this.getDomain(),s=n instanceof PeriodInterval?n.getRegularParam(t):t,r=this._verbCurve.split(s);if(r.length<2)return MathAssert.warn(!0,"NurbsCurve 分割错误:参数有误",s),[];const i=r[0].knots();let o=1;for(let I=i.length-2;I>=0;I--)Util.isNearlyEqual(i[I],i[i.length-1])&&o++;if(o>r[0].degree()+1){const I=r[0].controlPoints();for(let c=0;c<o-r[1].degree()-1;c++){const E=I.length;new exports.Vec3(I[E-1]).equals(new exports.Vec3(I[E-2]))&&(I.pop(),i.pop())}r[0]=geom.NurbsCurve.byKnotsControlPointsWeights(r[0].degree(),i,I)}const g=r[1].knots();let a=1;for(let I=1;I<g.length;I++)Util.isNearlyEqual(g[I],g[0])&&a++;if(a>r[1].degree()+1){const I=r[1].controlPoints();for(let c=0;c<a-r[1].degree()-1;c++)new exports.Vec3(I[0]).equals(new exports.Vec3(I[1]))&&(I.splice(0,1),g.splice(0,1));r[1]=geom.NurbsCurve.byKnotsControlPointsWeights(r[1].degree(),g,I)}if(e){const I=this._verbCurve.point(this._range.min),c=this._verbCurve.point(this._range.max),E=this._verbCurve.point(s),u=r[0].closestParam(I),Q=r[0].closestParam(E),p=r[1].closestParam(E),w=r[1].closestParam(c),y=new exports.NurbsCurve3(r[0],[u,Q]),M=new exports.NurbsCurve3(r[1],[p,w]);return[y,M]}return[new exports.NurbsCurve3(r[0]),new exports.NurbsCurve3(r[1])]}reverse(){const t=this.getRange(),e=this.getDomain(),n=Math.abs(t.min-e.min)<Tol.NUMBER,s=Math.abs(t.max-e.max)<Tol.NUMBER;this._verbCurve=this._verbCurve.reverse(),this._updateParameters();const r=this.getDomain(),i=n?r.max:r.max-(t.min-e.min),o=s?r.min:e.max-t.max+r.min;return this._range.set(o,i),this}clone(){const t=new exports.NurbsCurve3(this._verbCurve.clone(),this._range.toArray());return t.userData=this.userData,t}getLength(t){const e=t||this._range,n=this._verbCurve.lengthAtParam(e.min);return this._verbCurve.lengthAtParam(e.max)-n}transform(t){const e=t.data||t,n=new exports.Matrix4(e).transpose().data;return this._verbCurve=this._verbCurve.transform(n),this._updateParameters(),this}discrete(t=DiscreteParam.NORMAL){return DiscreteUtil.discreteCurve3d(this,t)}getType(){return EN_GEO_TYPE.NURBS_CURVE_3D}dump(){const t=this._controlPoints.map(s=>s.toArray3());let e=!0;const n=this._weights[0];for(const s of this._weights)if(s!==n){e=!1;break}return{type:EN_GEO_TYPE.NURBS_CURVE_3D,data:[this._degree,t,this.isBezier()?[]:[...this._knots],e?[]:[...this._weights],this._range.toArray()]}}load({data:[t,e,n,s,r]}){const i=n.length===0?exports.NurbsCurve3.getBezierKnots(t):n,o=s.length===0?new Array(e.length).fill(1):s;this._verbCurve=geom.NurbsCurve.byKnotsControlPointsWeights(t,i,e,o),this._updateParameters();const g=this._controlPoints[0],a=this._controlPoints[this._controlPoints.length-1];if(g.sqDistanceTo(a)<Tol.LENGTH_2){const c=this._verbCurve.domain();this._range=new PeriodInterval(r[0],r[1],c.max-c.min)}else this._range=new Interval(r[0],r[1]);return this}_updateParameters(){this._degree=this._verbCurve.degree(),this._knots=this._verbCurve.knots(),this._weights=this._verbCurve.weights(),this._controlPoints=this._verbCurve.controlPoints().map(t=>new exports.Vec3(t))}_newCtrlPtsAtInsertKnot(t,e){const n=[];for(let r=t-this._degree+1;r<=t;r++)n.push((e-this._knots[r])/(this._knots[r+this._degree]-this._knots[r]));const s=[];for(let r=t-this._degree+1;r<=t;r++){const i=n[r-(t-this._degree+1)],o=this._controlPoints[r].multiplied(i).add(this._controlPoints[r-1].multiplied(1-i));s.push(o)}return s}_newCtrlPtsAtInsertMultiKnot(t,e,n,s){const r=this._degree;MathError.warn(n+s<=r,"插入节点重复度太多");const i=Math.min(n,r-s),o=this._controlPoints,g=[];let a=o.slice(t-r,t-s+1);for(let c=1;c<=i;c++){const E=[];let u=1;for(let Q=t-r+c;Q<=t-s;Q++){const p=(e-this._knots[Q])/(this._knots[Q+r-c+1]-this._knots[Q]),w=a[u].multiplied(p).add(a[u-1].multiplied(1-p));E.push(w),u++}a=E,g.push(E)}const I=[];for(const c of g)I.push(c[0]);for(let c=g.length-1;c>=0;c--){const E=g[c];E.length<2||I.push(E[E.length-1])}return I}};exports.NurbsCurve3=__decorateClass$n([registerGeo],exports.NurbsCurve3);var __getOwnPropDesc$m=Object.getOwnPropertyDescriptor,__decorateClass$m=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$m(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.NurbsCurve2=class extends Curve2{static makeBezier(t,e){const n=this._fiterCoPoint(t),s=n.length-1,r=exports.NurbsCurve3.getBezierKnots(s);return exports.NurbsCurve2.makeByControlPoints(n,s,r,e,[0,1])}static makeByControlPoints(t,e=3,n,s,r){const i=t.map(g=>({x:g.x,y:g.y,z:0})),o=exports.NurbsCurve3.makeByControlPoints(i,e,n,s,r);return new exports.NurbsCurve2(o)}static makeByInterpolationPts(t,e=3,n=!1){const s=t.map(r=>({x:r.x,y:r.y,z:0}));return new exports.NurbsCurve2(exports.NurbsCurve3.makeByInterpolationPts(s,e,n))}static _fiterCoPoint(t){const e=[];e.push(t[0]);for(let n=1;n<t.length;++n)Tol.DEFAULT.areNear(t[n],t[n-1])||e.push(t[n]);return e}constructor(t){super(),t&&(this._nurbsCurve3d=t,this._range=t.getRange())}getDegree(){return this._nurbsCurve3d.getDegree()}getWeights(){return this._nurbsCurve3d.getWeights()}getKnots(){return this._nurbsCurve3d.getKnots()}getControlPoints(){return this._nurbsCurve3d.getControlPoints().map(t=>new exports.Vec2(t))}getDomain(){return this._nurbsCurve3d.getDomain()}isBezier(){return this._nurbsCurve3d.isBezier()}getAllFootParams(t,e=Tol.LENGTH){return this._nurbsCurve3d.getAllFootParams({x:t.x,y:t.y,z:0},e)}getPtAt(t){return new exports.Vec2(this._nurbsCurve3d.getPtAt(t))}getParamAt(t){return this._nurbsCurve3d.getParamAt({x:t.x,y:t.y,z:0})}getTangentAt(t){return new exports.Vec2(this._nurbsCurve3d.getTangentAt(t))}getDerivatives(t,e){return this._nurbsCurve3d.getDerivatives(t,e).map(n=>new exports.Vec2(n))}getEqualDiversionPts(t=3){return this._nurbsCurve3d.getEqualDiversionPts(t).map(e=>new exports.Vec2(e))}splitCurve(t,e=!0){return this._nurbsCurve3d.splitCurve(t,e).map(s=>new exports.NurbsCurve2(s))}reverse(){return this._nurbsCurve3d.reverse(),this}offset(t){return!1}clone(){const t=new exports.NurbsCurve2(this._nurbsCurve3d.clone());return t.userData=this.userData,t}getRange(){return this._nurbsCurve3d.getRange()}setRange(t,e){return t instanceof Interval?this._nurbsCurve3d.setRange(t):this._nurbsCurve3d.setRange(t,e),this}getLength(t){return this._nurbsCurve3d.getLength(t)}getBBox(t){const e=this._nurbsCurve3d.getBBox(t);return new Box2([e.min,e.max])}transform(t){const e=exports.Matrix4.makeByMatrix3(t);return this._nurbsCurve3d.transform(e),this}discrete(t=DiscreteParam.NORMAL){return this._nurbsCurve3d.discrete(t).map(e=>new exports.Vec2(e))}getType(){return EN_GEO_TYPE.NURBS_CURVE_2D}dump(){const t=this._nurbsCurve3d.dump();t.type=EN_GEO_TYPE.NURBS_CURVE_2D;for(const e of t.data[1])e.pop();return t}load(t){const e=t.data[1];for(const n of e)n.push(0);return this._nurbsCurve3d||(this._nurbsCurve3d=new exports.NurbsCurve3),this._nurbsCurve3d.load(t),this._range=this._nurbsCurve3d.getRange(),this}};exports.NurbsCurve2=__decorateClass$m([registerGeo],exports.NurbsCurve2);var __getOwnPropDesc$l=Object.getOwnPropertyDescriptor,__decorateClass$l=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$l(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s},ArcType=(l=>(l[l.HalfArc=0]="HalfArc",l[l.SmallArc=-1]="SmallArc",l[l.BigArc=1]="BigArc",l))(ArcType||{});function makeCircleByThreePoints(l,t,e){const n=l.x-t.x,s=l.y-t.y,r=(l.x*l.x-t.x*t.x+l.y*l.y-t.y*t.y)/2,i=e.x-t.x,o=e.y-t.y,g=(e.x*e.x-t.x*t.x+e.y*e.y-t.y*t.y)/2,a=n*o-i*s;if(Util.isNearlyEqual(a,0))return;const I=new exports.Vec2((r*o-g*s)/a,(n*g-i*r)/a),c=I.distanceTo(l);return{center:I,radius:c}}exports.Arc2=class extends Curve2{constructor(t,e,n,s,r){super(),this._range=new PeriodInterval(0,CONST.PI2),this._a=1,this._b=1,this._coord=exports.Coord2.XOY(),this._clockSign=1,e!==void 0&&n!==void 0&&t&&s!==void 0&&(this._a=e,this._b=n,this._coord=t.clone(),this._clockSign=s?1:-1,this._range=r?new PeriodInterval(r[0],r[1]):new PeriodInterval(0,CONST.PI2))}static makeArcByStartEndAngles(t,e,n,s,r){let i,o;return r?(i=n,o=s):(i=-n,o=-s),i=PeriodInterval.RegularizeParam(i),o=PeriodInterval.RegularizeParam(o-i)+i,Util.isNearlyEqual(i,o)&&!Util.isNearlyEqual(n,s)&&(o=i+CONST.PI2),new exports.Arc2(new exports.Coord2(t,exports.Vec2.X()),e,e,r,[i,o])}static makeArcByThreePoints(t,e,n){const s=makeCircleByThreePoints(t,e,n);if(!s)return;const{center:r,radius:i}=s,o=new exports.Vec2(t).subtract(e),a=new exports.Vec2(n).subtract(e).cross(o)>0,I=new exports.Vec2(t).subtract(r),c=Math.atan2(I.y,I.x),E=new exports.Vec2(n).subtract(r),u=Math.atan2(E.y,E.x);return exports.Arc2.makeArcByStartEndAngles(r,i,c,u,a)}static makeArcByStartEndPoints(t,e,n,s){const r=new exports.Vec2(e).subtract(t),i=new exports.Vec2(n).subtract(t),o=Math.atan2(r.y,r.x);let g=Math.atan2(i.y,i.x);return Util.isNearlyEqual(o,g)&&(g+=CONST.PI2),exports.Arc2.makeArcByStartEndAngles(t,new exports.Vec2(t).distanceTo(e),o,g,s)}static makeEllipseByFivePoints(t,e,n,s,r,i=new Tol){const o=new exports.Vec2(e).subtract(t),g=new exports.Vec2(n).subtract(t),a=o.getLength();let I=g.getLength();if(i.isLengthZero(a)||i.isLengthZero(I)||i.areParralel(o,g))return;g.subtract(o.multiplied(g.dot(o)/a/a)),I=g.getLength();const c=o.cross(g)>0?1:-1,E=new exports.Coord2(t,o),u=E.getLocalPtAt(s),Q=E.getLocalPtAt(r),p=Math.atan2(u.y/I,u.x/a)*c,w=i.areNear(s,r)?p+CONST.PI2:Math.atan2(Q.y/I,Q.x/a)*c;return new exports.Arc2(E,a,I,c>0,[p,w])}static makeEllipseByCenterAndThreePoints(t,e,n=1){if(e.length!==3)return;const s=new exports.Coord2(t,exports.Vec2.X()),r=e.map(G=>s.getLocalPtAt(G)),i=[];for(const G of r)i.push([G.x*G.x,G.x*G.y,G.y*G.y]);const o=[1,1,1],g=LinearSystem.execute(i,o);if(!g)return;const a=1,[I,c,E]=g,u=.5*Math.atan(c/(I-E)),Q=Math.cos(u),p=Math.sin(u),w=exports.Vec2.X().multiplied(Q).added(exports.Vec2.Y().multiplied(p)),y=new exports.Coord2(t,w),M=I*Q*Q+E*p*p+c*Q*p,N=E*Q*Q+I*p*p-c*Q*p,S=Math.sqrt(a/M),R=Math.sqrt(a/N),U=Math.atan2(r[0].y/R,r[0].x/S)*n,b=r[0].equals(r[2])?U+CONST.PI2:Math.atan2(r[2].y/R,r[2].x/S)*n;return new exports.Arc2(y,S,R,n>0,[U,b])}static makeEllipseByFiveArcPoints(t,e=1){if(t.length!==5)return;const n=[];for(const H of t)n.push([H.x*H.x,H.x*H.y,H.y*H.y,H.x,H.y]);const s=[1,1,1,1,1],r=LinearSystem.execute(n,s);if(!r)return;const i=1,[o,g,a,I,c]=r,E=.5*Math.atan(g/(o-a)),u=Math.cos(E),Q=Math.sin(E),p=exports.Vec2.X().multiplied(u).added(exports.Vec2.Y().multiplied(Q)),w=new exports.Vec2(-I/2,-c/2),y=new exports.Coord2(w,p),M=o*u*u+a*Q*Q+g*u*Q,N=a*u*u+o*Q*Q-g*u*Q,S=Math.sqrt(i/M),R=Math.sqrt(i/N),U=new exports.Vec2(t[0].x-w.x,t[0].y-w.y),b=Math.atan2(U.y/R,U.x/S)*e,G=new exports.Vec2(t[4].x-w.x,t[4].y-w.y),O=U.equals(G)?b+CONST.PI2:Math.atan2(G.y/R,G.x/S)*e;return new exports.Arc2(y,S,R,e>0,[b,O])}getA(){return this._a}setA(t){this._a=t}getB(){return this._b}setB(t){this._b=t}getCoord(){return this._coord}setCoord(t){this._coord=t.clone()}getRange(){return this._range}getCenter(){return this._coord.getOrigin()}getRadius(){return this._assertCircle(),(this._a+this._b)/2}isCCW(){return this._clockSign>0}getPtAt(t){const e=this._a*Math.cos(t),n=this._b*Math.sin(t)*this._clockSign;return this._coord.getWorldPtAt({x:e,y:n})}getAngleFromParam(t){return this._clockSign*t}getStartAngle(){return this.getAngleFromParam(this.getStartParam())}getEndAngle(){return this.getAngleFromParam(this.getEndParam())}getArcType(){const t=this.getRange().getLength();return Util.isNearlyEqual(t,CONST.PI)?0:Util.isNearlyBigger(t,CONST.PI)?1:-1}IsInRangeInner(t,e,n){if(e.sqDistanceTo(n)<Tol.LENGTH_2)return!0;const s=this.getCenter(),r=e.subtracted(s).normalize(),i=n.subtracted(s).normalize();let o,g;this._clockSign===1?(o=r.angleTo(i),g=r):(o=i.angleTo(r),g=i);const a=t.subtracted(s).normalize();return g.angleTo(a)<o}getBBox(t){const e=this.getCoord().getDx().x,n=this.getCoord().getDx().y,s=this._a*e,r=this._b*n;let i=Math.atan2(r,-s);i<0&&(i+=CONST.PI2);let o=i+CONST.PI;o>CONST.PI2&&(o-=CONST.PI2);const g=this._a*n,a=this._b*e;let I=Math.atan2(a,g);I<0&&(I+=CONST.PI2);let c=I+CONST.PI;c>CONST.PI2&&(c-=CONST.PI2);const E=this.getCenter(),u=[],Q=[i,o,I,c];for(const N of Q){const S=Math.sin(N),R=Math.cos(N),U=new exports.Vec2(s*R-r*S,g*R+a*S);u.push(U.add(E))}const p=t||this.getRange(),w=this.getPtAt(p.min),y=this.getPtAt(p.max),M=new Box2([w,y]);for(const N of u)this.IsInRangeInner(N,w,y)&&M.expandByPoint(N);return M}getParamAt(t,e=Tol.LENGTH){const n=this._coord.getLocalPtAt(t),s=n.x/this._a,r=n.y/this._b,i=Math.atan2(r,s)*this._clockSign;if(Util.isNearlyEqual(this._a,this._b,e))return this._range.getRegularParam(i);const o=e/(this._a+this._b),g=s*s+r*r;if(Math.abs(g-1)<=o){const c=this._coord,E=c.getDx().angleTo(new exports.Vec2(t).subtract(c.getOrigin()).normalize()),u=Math.atan2(Math.sin(E)/this.getB(),Math.cos(E)/this.getA()),Q=this.isCCW()?u:CONST.PI2-u;return this._range.getRegularParam(Q)}if(g>1)return this._range.getRegularParam(this.getFootByIterate(t,i,o));let a,I;return this._a>this._b?n.y>-e?(a=this.getFootByIterate(t,CONST.PI_2*this._clockSign,o),n.y<e&&Math.abs(Math.sin(a))>o&&(I=-a)):a=this.getFootByIterate(t,-CONST.PI_2*this._clockSign,o):n.x>-e?(a=this.getFootByIterate(t,0,o),n.x<e&&Math.abs(Math.cos(a))>o&&(I=CONST.PI-a)):a=this.getFootByIterate(t,CONST.PI,o),a=this._range.getRegularParam(a),I===void 0||this._range.containsPt(a)?a:(I=this._range.getRegularParam(I),this._range.containsPt(I)?I:a)}getAllFootParams(t,e=Tol.LENGTH){if(this.isEqualAB())return[this.getParamAt(t)];const n=e/(this._a+this._b),s=[];s.push(this.getFootByIterate(t,0,n)),s.push(this.getFootByIterate(t,CONST.PI_2,n)),s.push(this.getFootByIterate(t,CONST.PI,n)),s.push(this.getFootByIterate(t,CONST.PI_2*3,n));for(let i=0;i<s.length;i++)s[i]=PeriodInterval.RegularizeParam(s[i]);const r=Util.getUniqueOnes(s,(i,o)=>{const g=PeriodInterval.RegularizeParam(i-o);return g<n||g>CONST.PI2-n});for(let i=0;i<r.length;){const o=r[i],g=this.getPtAt(o).subtract(t),a=g.getLength();if(a<e){i++;continue}g.multiply(1/a);const I=this.getTangentAt(o);Math.abs(g.dot(I))<e?i++:r.splice(i,1)}return r.map(i=>this._range.getRegularParam(i))}getParamRangeAt(t,e){const n=this.getParamAt(t),s=this.getParamAt(e);return new PeriodInterval(n,s)}getTangentAt(t){const e=-this._a*Math.sin(t),n=this._b*Math.cos(t)*this._clockSign;return this._coord.getWorldVectorAt({x:e,y:n}).normalize()}isEqualAB(){return Math.abs(this._a-this._b)<Tol.LENGTH}getDerivatives(t,e){const n=this._a,s=this._b*this._clockSign,r=Math.cos(t),i=Math.sin(t),o=[r,-i,-r,i],g=[i,r,-i,-r],a=[];a.push(this.getPtAt(t));for(let I=1;I<=e;I++){const c=new exports.Vec2(o[I%4]*n,g[I%4]*s);a.push(this._coord.getWorldVectorAt(c))}return a}getLength(t){const e=t||this.getRange();return this.isEqualAB()?this.getRadius()*e.getLength():super.getLength(t)}isClosed(){return Util.isNearlyEqual(this._range.getLength(),CONST.PI2)}reverse(){return this._clockSign=-this._clockSign,this._range=new PeriodInterval(-this._range.max,-this._range.min,CONST.PI2),this}split(t,e){const n=t.filter(r=>this._range.containsPt(r,e)&&!this._range.containsPtAtStartOrEnd(r,e));return n.length?this._range.splited(...n).map(r=>new exports.Arc2(this._coord,this._a,this._b,this._clockSign>0,r.toArray())):[]}offset(t){this._assertCircle();const e=t*this._clockSign;return e+Math.min(this._a,this._b)<0?!1:(this._a+=e,this._b+=e,!0)}transform(t){const e=this._coord.getDx(),n=this._coord.getDy(),s=e.multiply(this._a).vecTransform(t),r=n.multiply(this._b*this._clockSign).vecTransform(t);let i,o;if(s.normalized().isPerpendicular(r.normalized()))i=s,o=r;else{const I=Math.atan2(2*s.dot(r),s.getSqLength()-r.getSqLength())*.5,c=Math.sin(I),E=Math.cos(I);i=s.multiplied(E).add(r.multiplied(c)),o=s.multiplied(-c).add(r.multiplied(E))}const a=(I=>{const c=(I.x*i.x+I.y*i.y)/i.getSqLength(),E=(I.x*o.x+I.y*o.y)/o.getSqLength();return Math.atan2(E,c)})(s.multiplied(Math.cos(this._range.min)).add(r.multiplied(Math.sin(this._range.min))));return this._range=new PeriodInterval(a,this._range.getLength()+a),this._clockSign=s.cross(r)<0?-1:1,this._a=i.getLength(),this._b=o.getLength(),this._coord.setOrigin(this._coord.getOrigin().transform(t)),this._coord.setDx(i.normalized()),this}translate(t){return this._coord.translate(t),this}rotate(t,e={x:0,y:0}){const n=exports.Matrix3.makeRotate(e,t);return this._coord.transform(n),this}scale(t,e={x:0,y:0}){this._a*=t,this._b*=t;const n=this._coord.getOrigin().subtract(e).multiply(t).add(e);return this._coord.setOrigin(n),this}getDiscreteHintSegmentCount(t=DiscreteParam.NORMAL){return Math.ceil((this._range.max-this._range.min)/t.tolerance.angleEps+2)}discrete(t=DiscreteParam.NORMAL){const e=this.getDiscreteHintSegmentCount(t);return DiscreteUtil.discreteCurve2d(this,t.clone({hintSegmentCount:e}))}getType(){return EN_GEO_TYPE.ARC_2}toNurbs(t=2,e=Tol.LENGTH){const n=this.getCenter(),s=this.getCoord().getDx().multiply(this._a),r=this.getCoord().getDy().multiply(this._b),i=[n.added(s),n.added(s).added(r),n.added(r).subtracted(s),n.subtracted(s),n.subtracted(s).subtracted(r),n.subtracted(r).added(s),n.added(s)],o=[1,.5,.5,1,.5,.5,1],g=[0,0,0,.25,.5,.5,.75,1,1,1];return this._clockSign<0&&i.reverse(),exports.NurbsCurve2.makeByControlPoints(i,2,g,o)}clone(){const t=new exports.Arc2(this._coord,this._a,this._b,this._clockSign>0,this.getRange().toArray());return t.userData=this.userData,t}dump(){return{...super.dump(),data:[this._a,this._b,this._coord.dump(),this._clockSign,this.getRange().toArray()]}}load(t){const{data:[e,n,s,r,i]}=t;return this._a=e,this._b=n,this._coord.load(s),this._clockSign=r,this._range=new PeriodInterval(i[0],i[1]),super.load(t)}_getMinDistanceToStartEndPoints(t){const e=this.getStartPt().sqDistanceTo(t),n=this.getEndPt().sqDistanceTo(t);return e<n?{param:this.getStartParam(),sqDist:e}:{param:this.getEndParam(),sqDist:n}}_assertCircle(){MathAssert.warn(this.isEqualAB(),"圆弧非正圆,计算结果不精确")}};exports.Arc2=__decorateClass$l([registerGeo],exports.Arc2);var __getOwnPropDesc$k=Object.getOwnPropertyDescriptor,__decorateClass$k=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$k(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Circle3d=class extends Curve3{constructor(t,e){super(),this._ccs=exports.Coord3.XOY(),this._radius=0,t&&e&&(this._ccs=t.clone(),this._radius=e,this._range=new Interval(0,CONST.PI2*e))}static makeCircleByCCSRadius(t,e,n,s){return new exports.Circle3d(new exports.Coord3(t,e,n),s)}static makeCircleByThreePoints(t,e,n){const s=exports.Circle3d._makeCircleCCSByThreePoints(new exports.Vec3(t),new exports.Vec3(e),new exports.Vec3(n));if(!s)return;const r=s.getOrigin().distanceTo(t);return new exports.Circle3d(s,r)}static _makeCircleCCSByThreePoints(t,e,n){const s=exports.Plane.makeBy3Pts(t,e,n);if(!s)return;const r=s.getNorm(),i=t.clone().interpolate(e,.5),o=e.clone().interpolate(n,.5),g=e.subtracted(t).normalize(),a=n.subtracted(e).normalize(),I=r.cross(g),c=r.cross(a),E=I.cross(c),u=o.subtracted(i),Q=E.multiplied(-1),p=c.cross(u);let w=p.getLength()/Q.getLength();Q.dot(p)<0&&(w=-w);const y=i.added(I.multiplied(w)),M=t.subtracted(y).normalize(),N=r.cross(M);return new exports.Coord3(y,M,N)}toVerbNurbs(t){throw new Error("Method not implemented.")}getCCS(){return this._ccs.clone()}getCenter(){return this._ccs.getOrigin()}getNormal(){return this._ccs.getDz()}getRadius(){return this._radius}getPtAt(t){const e=t/this._radius,n=this._ccs.getDx(),s=this._ccs.getDy(),i=n.multiply(Math.cos(e)).add(s.multiply(Math.sin(e))).multiply(this._radius);return this.getCenter().add(i)}getLength(t){throw new Error("暂时还没有实现")}getParamAt(t){const e=this._ccs.getLocalPtAt(t);return Math.atan2(e.y,e.x)*this._radius}getTangentAt(t){const e=this.getPtAt(t);return e.subtract(this.getCenter()),this.getNormal().cross(e).normalize()}isPlaneCurve3d(t){return this._ccs.getDz()}getDerivatives(t,e){throw new Error("未实现!")}reverse(){throw new Error("not implement")}offset(t){const e=this._radius+t;return e<Tol.LENGTH?!1:(this._radius=e,this._range=new Interval(0,CONST.PI2*this._radius),!0)}transform(t){return this._radius=new exports.Vec3(this._radius,0,0).vecTransform(t).getLength(),this._ccs.transform(t),this._range=new Interval(0,CONST.PI2*this._radius),this}getBBox(t){const e=new Box3,n=this.getCenter();return e.expandByPoint(this.getProjectedPtBy(n.clone().add(exports.Vec3.X()))),e.expandByPoint(this.getProjectedPtBy(n.clone().add(exports.Vec3.X().reverse()))),e.expandByPoint(this.getProjectedPtBy(n.clone().add(exports.Vec3.Y()))),e.expandByPoint(this.getProjectedPtBy(n.clone().add(exports.Vec3.Y().reverse()))),e.expandByPoint(this.getProjectedPtBy(n.clone().add(exports.Vec3.Z()))),e.expandByPoint(this.getProjectedPtBy(n.clone().add(exports.Vec3.Z().reverse()))),e}split(t,e){throw new Error("暂未实现")}discrete(t=DiscreteParam.NORMAL){const e=t.tolerance,n=Math.acos(1-e.lengthEps/this._radius)*2,s=this._range.getLength()/this._radius/Math.min(n,e.angleEps);return DiscreteUtil.discreteCurve3d(this,t.clone({hintSegmentCount:s+2}))}getType(){return EN_GEO_TYPE.CIRCLE_3}clone(){return new exports.Circle3d(this._ccs,this._radius)}dump(){return{...super.dump(),data:[this._ccs.dump(),this._radius]}}load(t){const{data:[e,n]}=t;return this._ccs.load(e),this._radius=n,this._range=new Interval(0,CONST.PI2*n),super.load(t)}};exports.Circle3d=__decorateClass$k([registerGeo],exports.Circle3d);var __getOwnPropDesc$j=Object.getOwnPropertyDescriptor,__decorateClass$j=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$j(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Arc3=class extends Curve3{constructor(t,e,n,s){super(),this._coord=new exports.Coord3,e!==void 0&&n!==void 0&&t&&(this._a=e,this._b=n,this._coord=t.clone(),this._range=s?new PeriodInterval(s[0],s[1]):new PeriodInterval(0,CONST.PI2))}static makeArcByThreePoints(t,e,n){const s=exports.Circle3d.makeCircleByThreePoints(t,e,n);if(!s)return;const r=new exports.Arc3(s.getCCS(),s.getRadius(),s.getRadius(),[0,CONST.PI2]),i=new exports.Vec3(t),o=PeriodInterval.RegularizeParam(r.getParamAt(t));let g=PeriodInterval.RegularizeParam(r.getParamAt(n)-o);return i.equals(n)&&(i.equals(e)?g=0:g=CONST.PI2),r.setRange(o,o+g)}static makeArcByStartEndPoints(t,e,n,s,r,i){const g=new exports.Vec3(s).subtracted(t).normalize(),a=new exports.Vec3(n).cross(g).normalize().multiply(i?1:-1),I=new exports.Coord3(t,g,a),c=new exports.Arc3(I,e,e,[0,CONST.PI2]),E=c.getParamAt(s);let u=c.getParamAt(r);return Util.isNearlyEqual(E,u)&&(u+=CONST.PI2),c.setRange(E,u),c}static makeArcByCircleAndPts(t,e,n,s){const r=t.clone();let i=r.getParamAt(e),o=r.getParamAt(n);const g=r.getCCS();return s||(g.setXYDirs(g.getDx(),g.getDy().multiply(-1)),i=-i,o=-o),Util.isNearlyEqual(i,o)&&(o=i+CONST.PI2),new exports.Arc3(g,t.getRadius(),t.getRadius(),[i,o])}static makeEllipseByFivePoints(t,e,n,s,r,i=new Tol){const o=new exports.Vec3(e).subtract(t),g=new exports.Vec3(n).subtract(t),a=o.getLength();let I=g.getLength();if(i.isLengthZero(a)||i.isLengthZero(I)||i.areParralel(o,g))return;g.subtract(o.multiplied(g.dot(o)/a/a)),I=g.getLength();const c=new exports.Coord3(t,o,g),E=c.getLocalPtAt(s),u=c.getLocalPtAt(r),Q=Math.atan2(E.y/I,E.x/a),p=i.areNear(s,r)?Q+CONST.PI2:Math.atan2(u.y/I,u.x/a);return new exports.Arc3(c,a,I,[Q,p])}getA(){return this._a}setA(t){this._a=t}getB(){return this._b}setB(t){this._b=t}getCoord(){return this._coord}setCoord(t){this._coord=t.clone()}getRange(){return this._range}getCenter(){return this._coord.getOrigin()}getNormal(){return this._coord.getDz()}getCircle(){return this._assertCircle(),new exports.Circle3d(this._coord,this._a)}getRadius(){return this._assertCircle(),(this._a+this._b)/2}getPtAt(t){const e=new exports.Vec3(Math.cos(t)*this._a,Math.sin(t)*this._b,0);return this._coord.getWorldPtAt(e)}getParamAt(t,e=Tol.LENGTH){const n=this._coord.getLocalPtAt(t);return new exports.Arc2(exports.Coord2.XOY(),this._a,this._b,!0,this._range.toArray()).getParamAt(n,e)}containsPt(t,e=Tol.LENGTH){const n=e*e;if(this.getStartPt().sqDistanceTo(t)<n||this.getEndPt().sqDistanceTo(t)<n)return!0;const s=this.getParamAt(t);if(this.getPtAt(s).sqDistanceTo(t)>n)return!1;const i=2*e/(this._a+this._b);return this._range.containsPt(s,i)}getAllFootParams(t,e=Tol.LENGTH){if(this.isEqualAB())return[this.getParamAt(t)];const n=this._coord.getLocalPtAt(t);return new exports.Arc2(exports.Coord2.XOY(),this._a,this._b,!0,this._range.toArray()).getAllFootParams(n,e)}getParamRangeAt(t,e){const n=this.getParamAt(t),s=this.getParamAt(e);return new PeriodInterval(n,s)}getTangentAt(t){const e=new exports.Vec3(-this._a*Math.sin(t),this._b*Math.cos(t),0);return this._coord.getWorldVectorAt(e).normalize()}getTangentCone(t,e=!0){const n=t||this._range,s=new TangentCone(exports.Vec3.O(),0),r=n.getLength();if(Util.isNearlyBiggerOrEqual(r,CONST.PI,Tol.ANGLE))s.dir=exports.Vec3.X(),s.angle=CONST.PI;else{const i=this.getTangentAt(n.min),o=this.getTangentAt(n.max),g=i.angleTo(o,this._coord.getDz()),a=i;a.vecRotate(this._coord.getDz(),g/2),s.dir=a,s.angle=g/2}return s}isEqualAB(){return Math.abs(this._a-this._b)<Tol.LENGTH}getDerivatives(t,e){const n=this._a,s=this._b,r=Math.cos(t),i=Math.sin(t),o=[r,-i,-r,i],g=[i,r,-i,-r],a=[];a.push(this.getPtAt(t));for(let I=1;I<=e;I++){const c=new exports.Vec3(o[I%4]*n,g[I%4]*s,0);a.push(this._coord.getWorldVectorAt(c))}return a}isClosed(){return this._range.isClosed()}getLength(t){const e=t||this.getRange();return this.isEqualAB()?this.getRadius()*e.getLength():super.getLength(t)}reverse(){return this._range=new PeriodInterval(-this._range.max,-this._range.min),this._coord.setXYDirs(this._coord.getDx(),this._coord.getDy().multiply(-1)),this}split(t,e){const n=t.filter(r=>this._range.containsPt(r,e)&&!this._range.containsPtAtStartOrEnd(r,e));return n.length?this._range.splited(...n).map(r=>new exports.Arc3(this._coord,this._a,this._b,[r.min,r.max])):[]}transform(t){const e=this._coord.getDx().multiply(this._a).vecTransform(t),n=this._coord.getDy().multiply(this._b).vecTransform(t);let s,r;if(e.normalized().isPerpendicular(n.normalized()))s=e,r=n;else{const g=Math.atan2(2*e.dot(n),e.getSqLength()-n.getSqLength())*.5,a=Math.sin(g),I=Math.cos(g);s=e.multiplied(I).add(n.multiplied(a)),r=e.multiplied(-a).add(n.multiplied(I))}const o=(g=>{const a=(g.x*s.x+g.y*s.y+g.z*s.z)/s.getSqLength(),I=(g.x*r.x+g.y*r.y+g.z*r.z)/r.getSqLength();return Math.atan2(I,a)})(e.multiplied(Math.cos(this._range.min)).add(n.multiplied(Math.sin(this._range.min))));return this._range=new PeriodInterval(o,this._range.getLength()+o),this._coord.setOrigin(this._coord.getOrigin().transform(t)),this._coord.setDx(s.normalized()),this._coord.setDy(r.normalized()),this._a=s.getLength(),this._b=r.getLength(),this}translate(t){return this._coord.translate(t),this}rotate(t,e,n={x:0,y:0,z:1}){const s=exports.Matrix4.makeRotate(e,n,t);return this._coord.transform(s),this}scale(t,e){this._a*=t,this._b*=t;const n=this._coord.getOrigin().subtract(e).multiply(t).add(e);return this._coord.setOrigin(n),this}isPlaneCurve3d(t){return this._coord.getDz()}discrete(t=DiscreteParam.NORMAL){return DiscreteUtil.discreteCurve3d(this,t)}discreteBySpan(t=CONST.APPROX_ARC_MAX){const e=Math.ceil((this._range.max-this._range.min)/t),n=(this._range.max-this._range.min)/e,s=[];for(let r=0;r<e;r++)s.push(this.getPtAt(this._range.min+r*n));return s.push(this.getEndPt()),s}getType(){return EN_GEO_TYPE.ARC_3}toNurbs(t=2,e=Tol.LENGTH){const n=this.getCenter(),s=this.getCoord().getDx().multiply(this._a),r=this.getCoord().getDy().multiply(this._b),i=[n.added(s),n.added(s).added(r),n.added(r).subtracted(s),n.subtracted(s),n.subtracted(s).subtracted(r),n.subtracted(r).added(s),n.added(s)],o=[1,.5,.5,1,.5,.5,1],g=[0,0,0,.25,.5,.5,.75,1,1,1];return exports.NurbsCurve3.makeByControlPoints(i,2,g,o)}toVerbNurbs(){return new geom.Arc(this.getCenter().toArray3(),this.getCoord().getDx().toArray3(),this.getCoord().getDy().toArray3(),this.getRadius(),this.getStartParam(),this.getEndParam())}clone(){const t=new exports.Arc3(this._coord,this._a,this._b,this._range.toArray());return t.userData=this.userData,t}dump(){return{...super.dump(),data:[this._coord.dump(),this._a,this._b,this._range.toArray()]}}load(t){const{data:[e,n,s,r]}=t;return this._a=n,this._b=s,this._coord.load(e),this._range=new PeriodInterval(r[0],r[1],CONST.PI2),super.load(t)}_assertCircle(){MathAssert.warn(this.isEqualAB(),"圆弧非正圆,计算结果不精确")}};exports.Arc3=__decorateClass$j([registerGeo],exports.Arc3);class QuadraticEquation{static solve(t,e,n,s=Tol.CALCULATE_EPS){if(Math.abs(t)<s)return Math.abs(e)<s?(MathError.warn("QuadraticEquation方程不合法:a = b = 0"),Math.abs(n)>s?[NaN]:[0]):[n/e];const r=s*s,i=e*e,o=4*t*n;let g=i-o;const a=(i+Math.abs(o))/2;if(g<-r||a>1e12&&g/a<-r)return MathError.warn("QuadraticEquation方程无解:b * b - 4 * a * c < 0"),[];g<r&&(g=0);const I=Math.sqrt(g),c=(-e-I)/(2*t),E=(-e+I)/(2*t);return Math.abs(E-c)<s?[c]:[c,E]}}class Plurality{constructor(t,e){this.a=t,this.b=e}added(t){return new Plurality(this.a+t.a,this.b+t.b)}subed(t){return new Plurality(this.a-t.a,this.b-t.b)}scaled(t){return new Plurality(this.a*t,this.b*t)}multiplied(t){const e=this.a*t.a-this.b*t.b,n=this.a*t.b+this.b*t.a;return new Plurality(e,n)}}function sqrt3(l){const t=Math.abs(l)**.3333333333333333;return l>0?t:-t}class CubicEquation{static solve(t,e,n,s){if(Math.abs(t)<1e-12)return QuadraticEquation.solve(e,n,s);const r=(3*t*n-e*e)/(3*t*t),i=(27*t*t*s-9*t*e*n+2*e*e*e)/(27*t*t*t),g=(()=>{if(Math.abs(r)<1e-12&&Math.abs(i)<1e-12)return[0];const c=i/2,E=r/3,u=c*c+E*E*E;if(u>-1e-16){const S=Math.sqrt(Math.abs(u)),R=sqrt3(-c+S),U=sqrt3(-c-S),b=R+U;if(u>1e-7)return[b];const G=new Plurality(-1/2,Math.sqrt(3)/2),O=G.multiplied(G),H=G.scaled(R).added(O.scaled(U)),z=O.scaled(R).added(G.scaled(U));return[b,H.added(z).a/2]}const Q=Math.sqrt(-E*E*E),p=2*sqrt3(Q),w=Math.acos(-i/(2*Q)),y=p*Math.cos(w),M=p*Math.cos(w+Math.PI*2/3),N=p*Math.cos(w+Math.PI*4/3);return[y,M,N]})(),a=-e/(3*t);return g.map(c=>c+a)}static solve2(t,e,n,s){if(Math.abs(t)<1e-12)return QuadraticEquation.solve(e,n,s);const r=e*e-3*t*n,i=e*n-9*t*s,o=n*n-3*e*s;if(Math.abs(r)<1e-12&&Math.abs(i)<1e-12)return Math.abs(t)>Math.abs(e)?Math.abs(t)>=Math.abs(n)?[-e/(3*t)]:[-(3*s)/n]:Math.abs(e)>=Math.abs(n)?[-n/e]:[-e/(3*t)];const g=i*i-4*r*o;if(g>1e-12){const w=Math.sqrt(g),y=r*e+3*t*(-i+w)/2,M=r*e+3*t*(-i-w)/2,N=sqrt3(y),S=sqrt3(M),R=(-e-N-S)/(3*t);if(Math.abs(N-S)>1e-8)return[R];const U=-e/(3*t)+(N+S)/(6*t);return[R,U]}if(Math.abs(g)<1e-12){if(Math.abs(r)<1e-12){MathAssert.warn("解三次方程错误!");return}const w=i/r,y=-e/t+w,M=-w/2;return[y,M]}const a=(2*r*e-3*t*i)/(2*r**(1/3)),I=Math.acos(a),c=Math.cos(I/3),E=Math.sqrt(r),u=(-e-2*E*c)/(3*t),Q=(-e+E*(c+1.7320508075688772*Math.sin(I/3)))/(3*t),p=(-e+E*(c-1.7320508075688772*Math.sin(I/3)))/(3*t);return[u,Q,p]}}class SolveEquationUtil{static solveQuadraticEquation(t,e,n){return QuadraticEquation.solve(t,e,n)}static solveCubicEquation(t,e,n,s){return CubicEquation.solve(t,e,n,s)}static execute(t,e,n,s=Tol.NUMBER_CALC_EPS){return this.quadraticInterpolation(t,e,n,s)}static iterationNewton(t,e,n,s=Tol.NUMBER_CALC_EPS,r,i){let o=0,g=n,a=!0;for(;o<CONST.NORMAL_ITER_NUM||a;){const I=t(g),c=e(g),E=g-I/c;if(Math.abs(E-g)<s||o>(i||CONST.MAX_ITER_NUM)){g=E;break}if(o>=CONST.NORMAL_ITER_NUM){const u=t(E);a=Math.abs(u)<Math.abs(I)-Tol.CALCULATE_EPS}g=E,o++}if(Math.abs(t(g))<(r||s))return g}static linearInterpolation(t,e,n=Tol.NUMBER_CALC_EPS){let s=0,r=e,i=!0;const o=1e-4;for(;s<CONST.NORMAL_ITER_NUM||i;){const g=t(r),a=t(r+o),I=r-g*o/(a-g);if(Math.abs(I-r)<n||s>CONST.MAX_ITER_NUM){r=I;break}s>=CONST.NORMAL_ITER_NUM&&(i=Math.abs(t(I))<Math.abs(t(r))-Tol.CALCULATE_EPS),r=I,s++}if(Math.abs(t(r))<n)return r}static quadraticInterpolation(t,e,n,s=Tol.NUMBER_CALC_EPS){let r=0,i=n;const o=[e,n,(e+n)/2],g=[t(o[0]),t(o[1]),t(o[2])];let a=!0;for(;r<CONST.NORMAL_ITER_NUM||a;){const I=o[1]-o[0],c=o[2]-o[1],E=(g[1]-g[0])/I,u=(g[2]-g[1])/c,Q=(u-E)/(I+c),p=Q*c+u,w=g[2],y=p*p,M=4*Q*w;if(y-M<0){if(i=-p/(2*Q),Math.abs(i-o[2])<s)break}else{let N=Math.sqrt(y-M);N=p>0?N:-N;const S=-(2*w)/(p+N);if(i=o[2]+S,Math.abs(S)<s)break}if(Math.abs(i-o[1])<Math.abs(i-o[0])?([o[0],o[1],o[2]]=[o[1],o[2],i],[g[0],g[1],g[2]]=[g[1],g[2],t(i)]):([o[1],o[2]]=[o[2],i],[g[1],g[2]]=[g[2],t(i)]),r>=CONST.NORMAL_ITER_NUM&&(a=Math.abs(g[2])<Math.abs(g[1])-Tol.CALCULATE_EPS),r>CONST.MAX_ITER_NUM)break;r++}if(Math.abs(t(i))<s)return i}static inverseQuadraticInterpolation(t,e=.5,n,s=Tol.NUMBER_CALC_EPS){let r=0,i=e;const o=[e-n,e+n,e],g=[t(o[0]),t(o[1]),t(o[2])];let a=!0;for(;r<CONST.NORMAL_ITER_NUM||a;){if(Math.abs(g[0]-g[1])<s||Math.abs(g[0]-g[2])<s){if(i=o[2]-g[2]*(o[1]-o[2])/(g[1]-g[2]),Math.abs(i-o[2])<s)break;[o[0],o[1],o[2]]=[o[1],o[2],i],[g[0],g[1],g[2]]=[g[1],g[2],t(i)],r++;continue}else if(Math.abs(g[1]-g[2])<s){if(i=o[2]-g[2]*(o[0]-o[2])/(g[0]-g[2]),Math.abs(i-o[2])<s)break;[o[1],o[2]]=[o[2],i],[g[1],g[2]]=[g[2],t(i)],r++;continue}const I=g[0]-g[1],c=g[1]-g[2],E=g[2]-g[0];if(i=o[0]*g[1]*g[2]/(I*-E)+o[1]*g[0]*g[2]/(c*-I)+o[2]*g[0]*g[1]/(E*-c),Math.abs(i-o[2])<s||(Math.abs(i-o[1])<Math.abs(i-o[0])?([o[0],o[1],o[2]]=[o[1],o[2],i],[g[0],g[1],g[2]]=[g[1],g[2],t(i)]):([o[1],o[2]]=[o[2],i],[g[1],g[2]]=[g[2],t(i)]),r>=CONST.NORMAL_ITER_NUM&&(a=Math.abs(g[2])<Math.abs(g[1])-Tol.CALCULATE_EPS),r>CONST.MAX_ITER_NUM))break;r++}if(Math.abs(t(i))<s)return i}}class NonlinearSystem{static execute(t,e,n,s=Tol.LENGTH,r=Tol.ANGLE,i){const o=Math.sin(r),g=s*.01,a=Math.sin(r*.01),I=(w,y)=>{const M=e(w);if(Math.abs(M[0][0]*M[1][1]-M[0][1]*M[1][0])<Tol.CALCULATE_EPS)return[];const N=LinearSystem.execute(M,y);return N!==void 0?N:[]},c=(w,y,M,N)=>!!(Math.abs(y[0])<N&&Math.abs(y[1])<N&&(i===void 0||i(w,M)));let E=0,u=n,Q=t(u),p=!0;for(;E<CONST.NORMAL_ITER_NUM||p;){const w=I(u,Q);if(w.length===0)return c(u,Q,s,o)?u:[];const y=[u[0]-w[0],u[1]-w[1]],M=t(y);if(c(y,M,g,a))return y;if(E>=CONST.NORMAL_ITER_NUM&&Math.abs(M[0])<Math.abs(Q[0])-Tol.CALCULATE_EPS&&Math.abs(M[1])<Math.abs(Q[1])-Tol.CALCULATE_EPS&&(p=!0),u=y,Q=M,E>CONST.MAX_ITER_NUM)break;E++}return c(u,Q,s,o)?u:[]}}var ParamType=(l=>(l[l.Normal=0]="Normal",l[l.Reversed=1]="Reversed",l[l.StartGap=2]="StartGap",l[l.MidGap=3]="MidGap",l[l.EndGap=4]="EndGap",l))(ParamType||{});class OffsetParameterMapper{constructor(t,e=0,n=0,s=[]){this._domains=t,this._period=e,this._basePeriod=n,this._singularities=s}static ByArc(t,e,n){const s=e.getA(),r=e.getB(),i=r*r/s,o=s*s/r;if(n>-Math.min(i,o))return new OffsetParameterMapper(void 0,CONST.PI2,CONST.PI2,[]);if(n<-Math.max(s,r)){const M={min:0,baseMin:0,length:CONST.PI2,isReversed:!0};return new OffsetParameterMapper([M],CONST.PI2,CONST.PI2,[])}const g=M=>t.getDerivatives(M,1)[1].dot(e.getTangentAt(M)),I=((M,N)=>{const S=PeriodInterval.RegularizeParam(N-M)+M;return SolveEquationUtil.quadraticInterpolation(g,M,S)})(0,CONST.PI_2),c=[I,CONST.PI-I,CONST.PI+I,CONST.PI2-I,CONST.PI2+I];if(n<-Math.min(s,r)){const M=s>r?1:0,N=[];for(let S=0;S<4;S++)N.push({min:c[S],baseMin:c[S],length:c[S+1]-c[S],isReversed:S%2===M});return new OffsetParameterMapper(N,CONST.PI2,CONST.PI2,c)}function E(M,N,S,R){const U=M.length,b=(N+U-1)%U,G=M[b],O=M[N],H=G.baseMin+G.length,z=PeriodInterval.RegularizeParam(O.baseMin-H),tA=e.getRange(),nA=PeriodInterval.RegularizeParam(tA.min-H),IA=PeriodInterval.RegularizeParam(tA.max-H),iA=nA>Tol.NUMBER&&nA<z-Tol.NUMBER,W=IA>Tol.NUMBER&&IA<z-Tol.NUMBER;if(iA===W)return 0;if(iA){const oA=PeriodInterval.RegularizeParam(O.baseMin-R-Tol.NUMBER);O.baseMin=R,O.length+=oA;for(let hA=N+1;hA<U;hA++)M[hA].min+=oA;return 2}{const oA=PeriodInterval.RegularizeParam(S-H-Tol.NUMBER);G.length+=oA;for(let hA=b+1;hA<U;hA++)M[hA].min+=oA;return 1}}const u=-n;let Q,p,w;if(s>r){const M=((s/r*u)**2-r*r)/(s*s-r*r),N=Math.asin(M**.5),S=CONST.PI-2*N;Q=[{baseMin:N,min:0,length:S,isReversed:!1},{baseMin:CONST.PI+N,min:S,length:S,isReversed:!1}],p=E(Q,0,c[3],c[0]),w=E(Q,1,c[1],c[2])}else{const M=((r/s*u)**2-s*s)/(r*r-s*s),N=Math.acos(M**.5);Q=[{baseMin:CONST.PI-N,min:0,length:N*2,isReversed:!1},{baseMin:CONST.PI2-N,min:N*2,length:N*2,isReversed:!1}],p=E(Q,0,c[0],c[1]),w=E(Q,1,c[2],c[3])}if(p&&w)return p===1?(Q[1].min=0,new OffsetParameterMapper([Q[1]],0,CONST.PI2,[])):new OffsetParameterMapper([Q[0]],0,CONST.PI2,[]);if(p)return new OffsetParameterMapper(Q,0,CONST.PI2,[Q[0].length]);if(w)return Q[1].min=0,Q[0].min=Q[1].length,Q[0].baseMin+=CONST.PI2,new OffsetParameterMapper([Q[1],Q[0]],0,CONST.PI2,[Q[1].length]);const y=Q[0].length;return new OffsetParameterMapper(Q,y*2,CONST.PI2,[0,y])}static periodicBaseCurve(t,e){const n=t.getBaseCurve(),s=n.getDomain();let r;if(s instanceof PeriodInterval)r=s.period;else return new OffsetParameterMapper;const i=n.getTangentAt(s.min,!1),o=n.getTangentAt(s.max,!0);if(i.equals(o))return new OffsetParameterMapper(void 0,r,r);let g;if(t instanceof exports.OffsetCurve3){const a=t.getDz();g=o.angleTo(i,a)}else g=o.angleTo(i);if(g<CONST.PI&&e<0||g>CONST.PI&&e>0){const a=s.min,I=s.max;n.isNurbsCurve()&&t.setRange(a,I);let c;if(t.isOffsetCurve3d()){const E=OffsetParameterMapper._calcSelfIntersect(t,Tol.DEFAULT);if(E){const u=[E.param1,E.param2];u[0]>u[1]&&([u[0],u[1]]=[u[1],u[0]]);const Q=u[1]-u[0];c={baseMin:u[0],min:0,length:Q,isReversed:!1}}}else if(t.isOffsetCurve2d()){const E=OffsetParameterMapper._calcSelfIntersect(t,Tol.DEFAULT);if(E){const u=[E.param1,E.param2];u[0]>u[1]&&([u[0],u[1]]=[u[1],u[0]]);const Q=u[1]-u[0];c={baseMin:u[0],min:0,length:Q,isReversed:!1}}}if(c)return new OffsetParameterMapper([c],c.length,r,[c.min])}return new OffsetParameterMapper}static Simple(){return new OffsetParameterMapper}static _calcSelfIntersect(t,e){const n=t.getBaseCurve(),s=n.getDomain(),r=s.min,i=s.max,o=c=>{const E=t.getDerivatives(c[0],1),u=t.getDerivatives(c[1],1),Q=E[0].subtracted(u[0]);return[Q.dot(E[1]),Q.dot(u[1])]},g=c=>{const E=t.getDerivatives(c[0],2),u=t.getDerivatives(c[1],2),Q=E[0].subtracted(u[0]),p=[E[1].dot(E[1])+Q.dot(E[2]),-u[1].dot(E[1])],w=[E[1].dot(u[1]),-u[1].dot(u[1])+Q.dot(u[2])];return[p,w]},a=(c,E)=>{c[0]=PeriodInterval.RegularizeParam(c[0],s.period),c[1]=PeriodInterval.RegularizeParam(c[1],s.period);const u=t.getPtAt(c[0]),Q=t.getPtAt(c[1]);return u.sqDistanceTo(Q)<E*E},I=n.getDomain().getLength()/11;for(let c=0;c<5;c++){const E=r+c*I;for(let u=0;u<5;u++){const Q=i-u*I;if(t.isOffsetCurve3d()){const p=NonlinearSystem.execute(o,g,[E,Q],e.lengthEps,e.angleEps,a);if(p.length>0&&Math.abs(p[1]-p[0])>Tol.NUMBER)return{point:t.getPtAt(p[0]),param1:p[0],param2:p[1]}}else if(t.isOffsetCurve2d()){const p=NonlinearSystem.execute(o,g,[E,Q],e.lengthEps,e.angleEps,a);if(p.length>0&&Math.abs(p[1]-p[0])>Tol.NUMBER)return{point:t.getPtAt(p[0]),param1:p[0],param2:p[1]}}}}}getBaseParam(t,e=!0,n=Tol.CALCULATE_EPS){if(!this._domains)return t;const s=this._period>0?PeriodInterval.RegularizeParam(t,this._period):t;let r;if(e){if(this._period>0&&s<n){const o=this._domains[this._domains.length-1];return o.baseMin+o.length}r=n}else{if(this._period>0&&s>this._period-n)return this._domains[0].baseMin;r=-n}for(const o of this._domains){const g=s-o.min;if(g<o.length+r)return o.baseMin+g}MathAssert.warn(!0,"Invalid t",t);const i=this._domains[this._domains.length-1];return t-i.min+i.baseMin}getParam(t,e=!0){return this.getParamInfo(t,e).param}getParamInfo(t,e=!0){if(!this._domains)return{param:t,type:0};const n=this._basePeriod>0?PeriodInterval.RegularizeParam(t,this._basePeriod,this._domains[0].baseMin):t,s=this._basePeriod>0?(t-n)/this._basePeriod*this._period:0;for(let r=0;r<this._domains.length;r++){const i=this._domains[r],o=n-i.baseMin;if(o<0)return{param:i.min+s,type:r===0?2:3};if(o<=i.length)return{param:o+i.min+s,type:i.isReversed?1:0}}if(this._basePeriod===0||e){const r=this._domains[this._domains.length-1];return{param:r.min+r.length+s,type:this._period===0?4:3}}return{param:this._domains[0].min+s,type:this._period===0?2:3}}isPeriod(){return this._period>0}getPeriod(){return this._period}getBasePeriod(){return this._basePeriod}getRange(t){const[e,n]=t instanceof Interval?t.toArray():t,s=this.getParam(e,!1),r=this.getParam(n,!0);if(this._period>0){const i=Util.isNearlyEqual(s,r,Tol.NUMBER)&&n-e>this._basePeriod/2?s+this._period:r;return new PeriodInterval(s,i,this._period)}return new Interval(s,r)}getSingularities(){return this._singularities.slice(0)}getDomain(){if(!this._domains)return this._period?new PeriodInterval(0,this._period,this._period):Interval.infinit();const t=this._domains[this._domains.length-1];return this._period?new PeriodInterval(this._domains[0].min,t.min+t.length,this._period):new Interval(this._domains[0].min,t.min+t.length)}clone(){const t=this._domains?.map(e=>({min:e.min,baseMin:e.baseMin,length:e.length,isReversed:e.isReversed}));return new OffsetParameterMapper(t,this._period,this._basePeriod,this._singularities.slice(0))}}class PtToCurve3Distance{static execute(t,e){return e instanceof exports.Ln3||e instanceof exports.Circle3d||e instanceof exports.Arc3&&e.isEqualAB()?this.simple(t,e):this.general(t,e)}static simple(t,e){let n=e.getParamAt(t);const s=e.getRange();if(s.containsPt(n)){const i=e.getPtAt(n);return PeriodInterval.isPeriod(s)&&!s.containsPt(n,0)&&(n-=Math.round((n-s.min)/s.period)*s.period),{param:n,foot:i,distance:i.distanceTo(t)}}const r=PtToCurve3Distance._sqDistanceToCurveEndAndSingularities(t,e);return r.distance=Math.sqrt(r.distance),r}static general(t,e){const n=PtToCurve3Distance._sqDistanceToCurveEndAndSingularities(t,e),s=this._getMinDistFootParamInRange(t,e);if(s!==void 0){const r=e.getPtAt(s),i=r.sqDistanceTo(t);if(i<n.distance)return{param:s,foot:r,distance:Math.sqrt(i)}}return n.distance=Math.sqrt(n.distance),n}static curves(t,e,n=Tol.LENGTH){let s=CONST.MODEL_MAX_LENGTH;const r=[];for(const i of e){const o=PtToCurve3Distance.execute(t,i);o.distance<s-n?(r.length=0,r.push(o),s=o.distance):o.distance<s+n&&(r.push(o),o.distance<s&&(s=o.distance))}return r}static _sqDistanceToCurveEndAndSingularities(t,e){const n=e.getStartPt(),s={param:e.getStartParam(),foot:n,distance:n.sqDistanceTo(t)},r=[e.getRange().max].concat(e.getSingularities()),i=Tol.PROCESS_LENGTH_EPS;for(const o of r){const g=e.getPtAt(o),a=g.sqDistanceTo(t);a<s.distance+i&&(s.param=o,s.foot=g,s.distance=a)}return s}static _getMinDistFootParamInRange(t,e){if(e instanceof exports.Arc3){const s=e.getAllFootParams(t).filter(g=>e.getRange().containsPt(g));if(s.length<1)return;const r=e.getPtAt(s[0]),i={t:s[0],pt:r};let o=r.sqDistanceTo(t);for(let g=1;g<s.length;g++){const a=e.getPtAt(s[g]),I=a.sqDistanceTo(t);I<o&&(o=I,i.pt=a,i.t=s[g])}return PeriodInterval.RegularizeParam(i.t,CONST.PI2,e.getRange().min)}if(e instanceof exports.NurbsCurve3)return e.getParamAt(t);if(e instanceof exports.OffsetCurve3){const n=e.getParamMapper(),s=e.getRange(),r=n.getBaseParam(s.min,!1),i=n.getBaseParam(s.max,!0),o=PeriodInterval.make(r,i,n.getBasePeriod()),g=e.getBaseCurve(),a=g.getRange().clone();g.setRange(o);const I=r-g.getRange().min,c=this._getMinDistFootParamInRange(t,g);return g.setRange(a),c===void 0?void 0:n.getParam(c+I)}}}class LoopArea{static areaOfPoints(t){let e=0;const n=t.length;for(let s=n-1,r=0;r<n;s=r++)e+=t[s].x*t[r].y-t[r].x*t[s].y;return e*.5}static areaOfLoop(t){let e=0;if(!t.length)return e;let n=t[0].getStartPt().clone(),s=!1;for(const r of t)r instanceof exports.Arc2&&(s?n=n.midTo(r.getCenter()):(n=r.getCenter(),s=!0));for(const r of t)e+=this._areaOfCurve2d(r,n);return e}static areaOfPoint3ds(t,e){const n=LoopArea.areaVectorOfPoint3ds(t),s=e.normalized();return n.dot(s)}static areaVectorOfPoint3ds(t){const e=new exports.Vec3(t[t.length-1]).cross(t[0]);for(let n=1;n<t.length;n++)e.add(new exports.Vec3(t[n-1]).cross(t[n]));return e.multiply(.5)}static areaVectorOfCurve3ds(t,e=DiscreteParam.NORMAL){const n=[];for(const s of t)n.push(...s.discrete(e));return LoopArea.areaVectorOfPoint3ds(n)}static _areaOfCurve2d(t,e){let n=0;if(t.isLine2d()){const s=t.getStartPt().subtracted(e),r=t.getEndPt().subtracted(e);n=.5*s.cross(r)}else if(t.isArc2d()){const s=t,r=s.getA()*s.getB()*s.getRange().getLength()*(s.isCCW()?1:-1)*.5,i=LoopArea._areaOfTriangle(s.getStartPt(),s.getEndPt(),s.getCenter()),o=LoopArea._areaOfTriangle(s.getStartPt(),s.getEndPt(),e);n=r-i+o}else if(t.isSmoothPoly2d())t.getSegments().forEach(s=>{n+=this._areaOfCurve2d(s,e)});else{const s=DiscreteUtil.discreteCurve2d(t,DiscreteParam.NORMAL);for(let r=1;r<s.length;r++){const i=s[r-1].subtracted(e),o=s[r].subtracted(e);n+=.5*i.cross(o)}}return n}static _areaOfTriangle(t,e,n){return t.subtract(n).cross(e.subtract(n))*.5}}var __getOwnPropDesc$i=Object.getOwnPropertyDescriptor,__decorateClass$i=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$i(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.OffsetCurve2=class extends Curve2{static makeByOffset(t,e=0){if(t instanceof exports.Ln2){const n=t.getOrigin(),s=t.getDirection(),r={x:n.x+s.y*e,y:n.y-s.x*e};return new exports.Ln2(r,s,t.getRange().toArray())}if(t instanceof exports.Arc2&&t.isEqualAB()){const n=e+(t.getA()+t.getB())/2;return new exports.Arc2(t.getCoord(),n,n,t.isCCW(),t.getRange().toArray())}if(t instanceof exports.OffsetCurve2){const n=t.getOffset()+e,s=new exports.OffsetCurve2(t.getBaseCurve().clone(),n);if(!t.getStartPt().equals(t.getEndPt(),Tol.LENGTH)){const r=t.getParamMapper(),i=t.getRange(),o=r.getBaseParam(i.min,!1),g=r.getBaseParam(i.max,!0),a=s.getParamMapper(),I=a.getParam(o),c=a.getParam(g);s.setRange(I,c)}return s}return new exports.OffsetCurve2(t.clone(),e)}constructor(t,e=0,n){super(),t&&(this._baseCurve=t,this._offset=e,this._updateParamMapper(),this._initRange(n))}getBaseCurve(){return this._baseCurve}getParamMapper(){return this._paramMapper}getDomain(){if(this._baseCurve instanceof exports.NurbsCurve2&&!this.isPeriodic()){const t=this._baseCurve.getDomain();return new Interval(t.min,t.max)}return this._paramMapper.getDomain()}isPeriodic(){const t=this._baseCurve;if(t instanceof exports.Arc2&&Math.abs(t.getRange().getLength()-CONST.PI2)<Tol.ANGLE)return!0;if(t instanceof exports.NurbsCurve2){const e=t.getControlPoints();if(e[0].sqDistanceTo(e[e.length-1])<Tol.LENGTH_2)return!0}return!1}isLineLike(){return this._baseCurve.isLineLike()}getOffset(){return this._offset}setOffset(t){const e=this._startSettingChange();this._offset=t,this._updateParamMapper(),this._endSettingChange(e)}getPtAt(t){const e=this._paramMapper.getBaseParam(t),n=this._baseCurve.getPtAt(e),s=this._baseCurve.getTangentAt(e).normalize();return n.add({x:s.y*this._offset,y:-s.x*this._offset})}getParamAt(t){const e=[this._range.min,this._range.max];if(e.push(...this.getSingularities()),this._baseCurve.isPeriodic()&&!this.isPeriodic()){const i=this._baseCurve.getDomain();e.push(i.min,i.max)}for(const i of e)if(this.getPtAt(i).equals(t))return i;const n=this._baseCurve.getParamAt(t),s=this._paramMapper.getParam(n),r=this._range;return r instanceof PeriodInterval?r.getRegularParam(s):s}getAllFootParams(t,e=Tol.LENGTH){const n=this._baseCurve.getAllFootParams(t,e),s=[];for(const r of n){const i=this._paramMapper.getParamInfo(r);i.type===ParamType.Normal&&s.push(i.param)}return s}getDerivatives(t,e,n){const s=this._getSnapToPrevious(t,n),r=this._paramMapper.getBaseParam(t,s),i=this._baseCurve.getDerivatives(r,e+1,s),o=(G,O)=>{const H=this._offset*O;return new exports.Vec2(G.y*H,-G.x*H)},g=i[1].getSqLength(),a=Math.sqrt(g),I=o(i[1],1/a),c=[i[0].added(I)];if(e<=0)return c;const E=i[1].dot(i[2]),u=o(i[2],g).subtract(o(i[1],E)),Q=g*a;if(c.push(i[1].added(u.multiplied(1/Q))),e<=1)return c;const p=i[1].dot(i[3])+i[2].dot(i[2]),w=o(i[3],g).add(o(i[2],E)).add(o(i[1],-p)),y=3*a*E,M=w.multiplied(Q).subtract(u.multiplied(y)).multiply(1/(Q*Q));if(c.push(i[2].added(M)),e<=2)return c;const N=i[1].dot(i[4])+3*i[2].dot(i[3]),S=o(i[4],g).add(o(i[3],3*E)).subtract(o(i[1],N)),R=3*E*E/a+3*a*N,U=S.multiplied(Q).subtract(u.multiplied(R)).multiply(1/(Q*Q)),b=M.multiplied(-2*y/Q);if(c.push(i[3].added(U).add(b)),e<=3)return c;throw new Error("unimplemented: Offset Curve derivatives: nth > 3 not supported yet")}getSingularities(){const t=this._paramMapper.getSingularities();return this._range.filterParams(t)}getContinuousRanges(){const t=this._paramMapper.getSingularities();return this._range.splited(...t)}reverse(){const t=this._range instanceof PeriodInterval&&this._range.isClosed(),{min:e,max:n}=this._range,s=this._baseCurve.getPtAt(this._paramMapper.getBaseParam(e)),r=this._baseCurve.getPtAt(this._paramMapper.getBaseParam(n));this._baseCurve.reverse(),this._offset=-this._offset,this._updateParamMapper();const i=this._baseCurve.getParamAt(r),o=this._paramMapper.getParam(i,!1),g=this._paramMapper.getPeriod();if(t)this._range=new PeriodInterval(o,o+g,g);else{let a=this._baseCurve.getParamAt(s);const I=this._baseCurve.getRange();Util.isNearlyBiggerOrEqual(i,a)&&I instanceof PeriodInterval&&(a+=I.period);const c=this._paramMapper.getParam(a,!0);this._range=g>0?new PeriodInterval(o,c,g):new Interval(o,c)}return this}offset(t){return this._offset+=t,!0}toNurbs(t=3,e=Tol.LENGTH){const n=this.getSingularities();n.sort();const s=this._range,r=s.clone(),i=[];let o=s;for(const u of n){const Q=o.splited(u);i.push(Q[0]),o=Q[1]}i.push(o);const g=[];for(const u of i){this.setRange(u);const Q=this.getInterpPts(e).pts,p=exports.NurbsCurve2.makeByInterpolationPts(Q,t);g.push(p)}if(this.setRange(r),g.length===1)return g[0];let a=[],I=[],c=[];for(const u of g)if(I.length===0)I=u.getControlPoints(),c=u.getWeights(),a=u.getKnots();else{a.pop(),I.pop(),c.pop(),I=I.concat(u.getControlPoints()),c=c.concat(u.getWeights());const Q=a[a.length-1];for(let p=t+1;p<u.getKnots().length;p++)a.push(u.getKnots()[p]+Q)}return exports.NurbsCurve2.makeByControlPoints(I,t,a,c)}transform(t,e){const n=e?.svd||exports.Matrix3.make(t,!1).decompose();return exports.Matrix3.assertScaleEqual(n.scale),this._baseCurve.transform(t,e),this._offset*=n.scale.x,this}transformed(t,e){const n=e?.svd||exports.Matrix3.make(t,!1).decompose();if(Math.abs(Math.abs(n.scale.y/n.scale.x)-1)<Tol.NUMBER){const i=this._baseCurve.clone();i.transform(t,e);const o=this._offset*n.scale.x;return new exports.OffsetCurve2(i,o)}const r=this.toNurbs();return r.transform(t),r}discrete(t=DiscreteParam.NORMAL){const e=this.getContinuousRanges(),n=this._range,s=e.map(i=>(this._range=i,DiscreteUtil.discreteCurve2d(this,t))),r=s.length?s[0]:[];for(let i=1;i<s.length;i++)r.push(...s[i].slice(1));return this._range=n,r}getType(){return EN_GEO_TYPE.OFFSET_CURVE_2D}clone(){const t=new exports.OffsetCurve2(this._baseCurve.clone(),this._offset,this._range.toArray());return t.userData=this.userData,t}dump(){return{...super.dump(),data:[this._baseCurve.dump(),this._offset,this._range.toArray()]}}load(t){const{data:[e,n,s]}=t;return this._offset=n,this._baseCurve=Loader.load(e),this._updateParamMapper(),this._initRange(s),super.load(t)}_refineDegerateTangent(t,e,n){const s=this._paramMapper.getBaseParam(t,e),r=this._baseCurve.getTangentAt(s,e);return r.isParallel(n,Tol.ROUGH_ANGLE_EPS)?r.multiply(Math.sign(r.dot(n))):n}_updateParamMapper(){if(this._paramMapper=new OffsetParameterMapper,this._baseCurve instanceof exports.Arc2){const t=this._baseCurve,e=this._baseCurve.isCCW()?this._offset:-this._offset;this._paramMapper=OffsetParameterMapper.ByArc(this,t,e)}else this._baseCurve.isPeriodic()&&(this._paramMapper=OffsetParameterMapper.periodicBaseCurve(this,this._offset))}_initRange(t){if(t)this._range=PeriodInterval.make(t[0],t[1],this._paramMapper.getPeriod());else{const e=this._baseCurve.getRange();this._range=this._paramMapper.getRange(e)}}_startSettingChange(){if(this._range instanceof PeriodInterval&&this._range.isClosed())return this._baseCurve.getRange().toArray();const t=this._paramMapper.getBaseParam(this._range.min,!1),e=this._paramMapper.getBaseParam(this._range.max,!0);return[t,e]}_endSettingChange(t){this._range=this._paramMapper.getRange(t)}};exports.OffsetCurve2=__decorateClass$i([registerGeo],exports.OffsetCurve2);var __getOwnPropDesc$h=Object.getOwnPropertyDescriptor,__decorateClass$h=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$h(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.SmoothPoly2=class extends Curve2{constructor(t){super(),this._pts=[],this._ts=[],t&&(this._pts=t.map(e=>new exports.Vec2(e)),this._calParams())}getPoints(){return this._pts}getTs(){return this._ts}getSegments(){if(this._pts.length<2)return[];const t=[];for(let e=1;e<this._pts.length;e++)t.push(new exports.Ln2(this._pts[e-1],this._pts[e]));return t}getPtAt(t){const e=this._getSegment(t),n=t-this._ts[e-1],s=this._ts[e]-this._ts[e-1];return Util.isNearly0(s,Tol.LENGTH)?this._pts[e]:this._pts[e-1].interpolated(this._pts[e],n/s)}getParamAt(t){if(this._pts.length<2)return 0;const e=new exports.Ln2(this._pts[0],this._pts[1]);let n=PtToCv2Distance.simple(t,e);for(let s=1;s<this._pts.length;s++){const r=new exports.Ln2(this._pts[s-1],this._pts[s]),i=PtToCv2Distance.simple(t,r);i.distance<n.distance&&(i.param+=this._ts[s-1],n=i)}return n.param}getTangentAt(t){const e=this._getSegment(t);return this._pts[e].subtracted(this._pts[e-1]).normalize()}getDerivatives(t,e){throw new Error("暂时还没有实现!")}getLength(t){return t?t.getLength():this._range.getLength()}reverse(){let t=0,e=this._pts.length-1;for(;t<e;t++,e--){const n=this._pts[e];this._pts[e]=this._pts[t],this._pts[t]=n;const s=-this._ts[e]+this._ts[this._ts.length-1];this._ts[e]=-this._ts[t]+this._ts[this._ts.length-1],this._ts[t]=s}return t===e&&(this._ts[t]=-this._ts[t]+this._ts[this._ts.length-1]),this._range=new Interval(this._ts[0],this._ts[this._ts.length-1]),this}offset(t){throw new Error("暂时还没有实现")}split(t,e){throw new Error("暂时还没有实现")}transform(t){for(let e=0;e<this._pts.length;e++)this._pts[e]=this._pts[e].transform(t);return this._calParams(),this}getBBox(t){const e=new Box2,n=(a,I)=>{const c=a-this._ts[I-1],E=this._ts[I]-this._ts[I-1];return Util.isNearly0(E,Tol.LENGTH)?this._pts[I]:this._pts[I-1].interpolated(this._pts[I],c/E)},s=t||this._range,r=this._getSegment(s.min),i=n(s.min,r),o=this._getSegment(s.max),g=n(s.max,o);e.expandByPoint(g),e.expandByPoint(i);for(let a=r;a<o;a++)e.expandByPoint(this._pts[a]);return e}discrete(t=DiscreteParam.NORMAL){const e=this._getSegment(this._range.min),n=this._getSegment(this._range.max),s=[this.getStartPt()];for(let r=e;r<n;r++)s.push(this._pts[r].clone());return s.push(this.getEndPt()),s}getType(){return EN_GEO_TYPE.SMOOTHPOLY_2D}clone(){return super.clone()}dump(){return{...super.dump(),data:[this._pts.map(t=>t.toArray2())]}}load(t){const{data:[e]}=t;return this._pts=e.map(n=>new exports.Vec2(n)),this._calParams(),super.load(t)}_getSegment(t){if(MathError.assert(this._pts.length>=2,"不合法的SmoothPoly"),this._pts.length===2)return 1;let e,n,s;for(n=0,s=this._ts.length-1;this._ts[n]===this._ts[n+1];)n++;for(;this._ts[s]===this._ts[s-1];)s--;for(;n+1<s;)if(e=Math.floor((n+s)/2),t<this._ts[e])for(s=e;this._ts[s]===this._ts[s-1];)s--;else for(n=e;this._ts[n]===this._ts[n+1];)n++;return s}_calParams(){this._ts=[0];for(let t=1;t<this._pts.length;){const e=this._pts[t].distanceTo(this._pts[t-1]);e<Tol.LENGTH?this._pts.splice(t,1):(this._ts.push(this._ts[t-1]+e),t++)}this._range=new Interval(this._ts[0],this._ts[this._ts.length-1])}};exports.SmoothPoly2=__decorateClass$h([registerGeo],exports.SmoothPoly2);var __getOwnPropDesc$g=Object.getOwnPropertyDescriptor,__decorateClass$g=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$g(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.SmoothPoly3=class extends Curve3{constructor(t,e){super(),this._pts=[],this._ts=[],t&&(this._pts=t.map(n=>new exports.Vec3(n)),this._calParams()),e&&(this._curve=e)}getPoints(){return this._pts}toVerbNurbs(t){throw new Error("Method not implemented.")}getTs(){return this._ts}getCurve(){return this._curve}getSegments(){if(this._pts.length<2)return[];const t=[];for(let e=1;e<this._pts.length;e++)t.push(new exports.Ln3(this._pts[e-1],this._pts[e]));return t}getPtAt(t){const e=this._getSegment(t),n=t-this._ts[e-1],s=this._ts[e]-this._ts[e-1];return Util.isNearly0(s,Tol.LENGTH)?this._pts[e]:this._pts[e-1].interpolated(this._pts[e],n/s)}getParamAt(t){if(this._pts.length<2)return 0;const e=new exports.Ln3(this._pts[0],this._pts[1]);let n=PtToCurve3Distance.simple(t,e);for(let s=1;s<this._pts.length;s++){const r=new exports.Ln3(this._pts[s-1],this._pts[s]),i=PtToCurve3Distance.simple(t,r);i.distance<n.distance&&(i.param+=this._ts[s-1],n=i)}return n.param}getTangentAt(t){const e=this._getSegment(t);return this._pts[e].subtracted(this._pts[e-1]).normalize()}getDerivatives(t,e){throw new Error("暂时还没有实现!")}getLength(t){return t?t.getLength():this._range.getLength()}reverse(){let t=0,e=this._pts.length-1;for(;t<e;t++,e--){const n=this._pts[e];this._pts[e]=this._pts[t],this._pts[t]=n;const s=-this._ts[e]+this._ts[this._ts.length-1];this._ts[e]=-this._ts[t]+this._ts[this._ts.length-1],this._ts[t]=s}return t===e&&(this._ts[t]=-this._ts[t]+this._ts[this._ts.length-1]),this._range=new Interval(this._ts[0],this._ts[this._ts.length-1]),this}offset(t){throw new Error("暂时还没有实现")}split(t,e){throw new Error("暂时还没有实现")}transform(t){for(let e=0;e<this._pts.length;e++)this._pts[e]=this._pts[e].transform(t);return this._calParams(),this}getBBox(t){if(this._pts.length===1)return new Box3(this._pts);const e=new Box3,n=(a,I)=>{const c=a-this._ts[I-1],E=this._ts[I]-this._ts[I-1];return Util.isNearly0(E,Tol.LENGTH)?this._pts[I]:this._pts[I-1].interpolated(this._pts[I],c/E)},s=t||this._range,r=this._getSegment(s.min),i=n(s.min,r),o=this._getSegment(s.max),g=n(s.max,o);e.expandByPoint(g),e.expandByPoint(i);for(let a=r;a<o;a++)e.expandByPoint(this._pts[a]);return e}discrete(t=DiscreteParam.NORMAL){const e=this._getSegment(this._range.min),n=this._getSegment(this._range.max),s=[this.getStartPt()];for(let r=e;r<n;r++)s.push(this._pts[r].clone());return s.push(this.getEndPt()),s}getType(){return EN_GEO_TYPE.SMOOTHPOLY_3D}clone(){return super.clone()}dump(){return{...super.dump(),data:[this._pts.map(t=>t.toArray3())]}}load(t){const{data:[e]}=t;return this._pts=e.map(n=>new exports.Vec3(n)),this._calParams(),super.load(t)}_getSegment(t){if(MathError.assert(this._pts.length>=2,"不合法的SmoothPoly"),this._pts.length===2)return 1;let e,n,s;for(n=0,s=this._ts.length-1;this._ts[n]===this._ts[n+1];)n++;for(;this._ts[s]===this._ts[s-1];)s--;for(;n+1<s;)if(e=Math.floor((n+s)/2),t<this._ts[e])for(s=e;this._ts[s]===this._ts[s-1];)s--;else for(n=e;this._ts[n]===this._ts[n+1];)n++;return s}_calParams(){this._ts=[0];for(let t=1;t<this._pts.length;){const e=this._pts[t].distanceTo(this._pts[t-1]);e<Tol.LENGTH?this._pts.splice(t,1):(this._ts.push(this._ts[t-1]+e),t++)}this._range=new Interval(this._ts[0],this._ts[this._ts.length-1])}};exports.SmoothPoly3=__decorateClass$g([registerGeo],exports.SmoothPoly3);class EvolutionMap extends Map{add(t,...e){const n=this.get(t);n?n.push(...e):this.set(t,e)}remove(t,e){const n=this.get(e),s=(i,o)=>{const g=o.findIndex(a=>a===t);return g<0?!1:(o.length===1?this.delete(i):o.splice(g,1),!0)};if(n)return s(e,n);if(e)return!1;let r=!1;for(const[i,o]of this.entries())r=r||s(i,o);return r}connectValueMap(t,e=!0){const n=new EvolutionMap;for(const[s,r]of this){const i=new Set;for(const o of r){const g=t.get(o);g&&g.forEach(a=>i.add(a))}(i.size>0||e)&&n.set(s,Array.from(i))}return n}connectKeyMap(t,e=!0){return t.connectValueMap(this,e)}mergeValueMap(t){const e=new EvolutionMap,n=new Set;for(const[s,r]of this){const i=new Set;for(const o of r){const g=t.get(o);g?(g.forEach(a=>i.add(a)),n.add(o)):i.add(o)}e.set(s,Array.from(i))}for(const[s,r]of t)if(!n.has(s)){const i=e.get(s);i?i.push(...r):e.set(s,r)}return e}mergeKeyMap(t){return t.mergeValueMap(this)}appendKey(t,e){for(const[n,s]of t)if(n!==void 0)for(const r of s){const i=this.get(r);i&&this.add(n,...i)}if(e instanceof Array)for(const n of e)this.delete(n);else if(e)for(const n of t.values())for(const s of n)t.has(s)||this.delete(s)}uniqueValues(){const t=new Set;for(const e of this.values())for(const n of e)t.add(n);return[...t]}reversed(){const t=new EvolutionMap;for(const[e,n]of this)for(const s of n)t.add(s,e);return t}reversedWithEmptyValue(){const t=new EvolutionMap;for(const[e,n]of this)if(n.length===0)t.add(void 0,e);else for(const s of n)t.add(s,e);return t}clearUnusedKeys(t){const e=[];for(const n of this)t.has(n[0])||(e.push(n),this.delete(n[0]));return e}clearUnusedValues(t){const e=[],n=new Set;for(const[s,r]of this)for(let i=r.length-1;i>=0;i--)t.has(r[i])||(n.add(r[i]),r.length===1?(e.push(s),this.delete(s)):r.splice(i,1));return{keys:e,values:Array.from(n)}}}class CurveUtil{static getDzByCurve(t,e){if(t instanceof exports.OffsetCurve3)return t.getDz();if(t instanceof exports.Arc3)return t.getNormal();if(t instanceof exports.NurbsCurve3){const s=CurveUtil.getDzByPoints(t.getControlPoints());if(s)return s}if(t instanceof exports.SmoothPoly3){const s=CurveUtil.getDzByPoints(t.getPoints());if(s)return s}return e||(t instanceof exports.Ln3?t.getDirection():t.getMidPt().subtract(t.getStartPt())).getPerpendicular()}static getDzByPlaneCurve(t,e=Tol.ANGLE){if(t.isLineLike())return new exports.Vec3;if(t instanceof exports.Arc3)return t.getNormal();if(t instanceof exports.OffsetCurve3)return t.getDz();const n=DiscreteParam.LOW.hintSegmentCount,s=[],{min:r,max:i}=t.getRange(),o=(i-r)/n;for(let a=0;a<=n;a++){const I=o*a+r;s.push(t.getPtAt(I))}const g=new exports.Vec3;for(let a=1;a<s.length;a++)s[a].subtract(s[0]);for(let a=2;a<s.length;a++){const I=s[a-1].cross(s[a]);if(!I.isParallel(g,e))return;g.add(I)}return g.normalize()}static getDzByCurves(t,e){const n=[];if(t.length>1){for(const i of t){const o=i.discrete(DiscreteParam.LOW);o.pop(),n.push(...o)}const r=t[t.length-1].getEndPt();n[0].sqDistanceTo(r)>Tol.LENGTH_2&&n.push(r)}else{const i=t[0],o=i.getRange().min,g=i.getRange().getLength()/9;for(let a=0;a<10;a++)n.push(i.getPtAt(o+g*a))}const s=CurveUtil.getDzByPoints(n);return s||e||t[0].getStartTangent().getPerpendicular()}static getDzByPoints(t){const e=LoopArea.areaVectorOfPoint3ds(t),n=e.getLength();return n<Tol.LENGTH_2?void 0:e.multiply(1/n)}static makeRectangleByXY(t,e,n,s){const r=[{x:t,y:n},{x:e,y:n},{x:e,y:s},{x:t,y:s}];return[new exports.Ln2(r[0],r[1]),new exports.Ln2(r[1],r[2]),new exports.Ln2(r[2],r[3]),new exports.Ln2(r[3],r[0])]}static simplifyCurves2d(t,e={}){const n=[],s=new EvolutionMap,r=(i,o)=>{n.push(i),s.set(i,[o])};for(const i of t){if(i instanceof exports.OffsetCurve2){if(e.splitOffsetCurve){const o=i.getContinuousRanges();if(o.length>1){for(const g of o)r(i.clone().setRange(g),i);continue}}}else if(i instanceof exports.SmoothPoly2){if(e.smoothPolyToNurbs){const o=i.discrete();r(exports.NurbsCurve2.makeByInterpolationPts(o),i);continue}else if(e.smoothPolyToLines){const o=i.discrete();for(let g=1;g<o.length;g++)r(new exports.Ln2(o[g-1],o[g]),i);continue}}r(e.clone?i.clone():i,i)}return{curves:n,evolution:s}}static simplifyCurves3d(t,e={}){const n=[],s=new EvolutionMap,r=(i,o)=>{n.push(i),s.set(i,[o])};for(const i of t){if(i instanceof exports.OffsetCurve3){if(e.splitOffsetCurve){const o=i.getContinuousRanges();if(o.length>1){for(const g of o)r(i.clone().setRange(g),i);continue}}}else if(i instanceof exports.SmoothPoly3){const o=i.getCurve();if(o)r(o,i);else if(e.smoothPolyToNurbs){const g=i.discrete();r(exports.NurbsCurve3.makeByInterpolationPts(g),i);continue}else if(e.smoothPolyToLines){const g=i.discrete();for(let a=1;a<g.length;a++)r(new exports.Ln3(g[a-1],g[a]),i);continue}}r(e.clone?i.clone():i,i)}return{curves:n,evolution:s}}static filterParamsByDistance(t,e,n,s=Tol.EDGE_LENGTH_EPS){if(t.length<1)return[];let r=CONST.MODEL_MAX_LENGTH;const i=[],o=[];t.sort((g,a)=>g-a),o.push(t[0]);for(let g=1;g<t.length;++g)Util.isNearlyEqual(o[o.length-1],t[g])||o.push(t[g]);for(const g of o){const I=n.getPtAt(g).distanceTo(e);I<r-s?(i.splice(0,i.length,g),r=I):I<r+s&&(i.push(g),r=(r*(i.length-1)+g)/i.length)}return i}static getArc3dPoles(t){return[0,CONST.PI_2,CONST.PI,CONST.PI*3/2].map(s=>t.getPtAt(s)).filter(s=>t.containsPt(s))}static filterCurvesBurr(t,e,n){if(t.length<3)return t;const s=[];s.push(t[0]);for(let r=1;r<t.length;++r){if(s.length<1){s.push(t[r]);continue}const i=s[s.length-1],o=t[r];if(i.isLine3d()&&o.isLine3d()&&i.isParallelTo(o,e)){if(i.getStartPt().distanceTo(o.getEndPt())<n&&Util.isNearlyEqual(i.getLength(),o.getLength(),n)){s.pop();continue}}else if(i.isArc()&&o.isArc()&&i.getCenter().distanceTo(o.getCenter())<n&&i.getStartPt().distanceTo(o.getEndPt())<n&&Util.isNearlyEqual(i.getLength(),o.getLength(),n)){s.pop();continue}s.push(t[r])}if(s.length>2&&s[0].getStartPt().equals(s[s.length-1].getEndPt())){const r=s[s.length-1],i=s[0];r.isLine3d()&&i.isLine3d()&&r.isParallelTo(i,e)?r.getStartPt().distanceTo(i.getEndPt())<n&&Util.isNearlyEqual(r.getLength(),i.getLength(),n)&&(s.pop(),s.shift()):r.isArc()&&i.isArc()&&r.getCenter().distanceTo(i.getCenter())<n&&r.getStartPt().distanceTo(i.getEndPt())<n&&Util.isNearlyEqual(r.getLength(),i.getLength(),n)&&(s.pop(),s.shift())}return s}static setCurveRange(t,e,n,s){let r=t.getParamAt(e),i=t.getParamAt(n);if(!t.isPeriodic())return r>i?(t.setRange(i,r),!0):(t.setRange(r,i),!1);const o=t.getRange().period;if(e.equals(n,Tol.EDGE_LENGTH_EPS))return t.setRange(r,r+o),!1;if(s===void 0)return r>i+Tol.NUMBER?t.setRange(r,i+o):t.setRange(r,i),!1;let g=!1;const a=(r+i)/2,I=t.getPtAt(a),c=t.getPtAt(a+o/2);return r<i?I.sqDistanceTo(s)>c.sqDistanceTo(s)&&(r+=o,g=!0):I.sqDistanceTo(s)<c.sqDistanceTo(s)?g=!0:i+=o,g?(t.setRange(i,r),!0):(t.setRange(r,i),!1)}}var __getOwnPropDesc$f=Object.getOwnPropertyDescriptor,__decorateClass$f=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$f(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.OffsetCurve3=class extends Curve3{static makeByOffset(t,e,n,s=0){if(t instanceof exports.Ln3){const r=t.getDirection(),i=e.multiplied(s).add(r.cross(e).multiply(n));return new exports.Ln3(t.getOrigin().added(i),t.getDirection(),t.getRange().toArray())}if(t instanceof exports.Arc3&&t.isEqualAB()&&e.isParallel(t.getNormal())){const r=e.dot(t.getNormal()),i=t.getRadius()+n*r;return new exports.Arc3(t.getCoord().translated(e.multiplied(s)),i,i,t.getRange().toArray())}if(t instanceof exports.OffsetCurve3){MathError.warn(()=>t.getDz().isParallel(e),"Offset: none parralleled offset unsupported",MathErrorType.Unimplemented);const r=t.getDz().dot(e),i=t.getOffsetXY()+r*n,o=t.getOffsetZ()+r*s;if(Math.abs(i)<Tol.CALCULATE_EPS&&Math.abs(o)<Tol.CALCULATE_EPS)return t.getBaseCurve().clone();const g=new exports.OffsetCurve3(t.getBaseCurve().clone(),e,i,o);if(!t.getStartPt().equals(t.getEndPt(),Tol.LENGTH)){const a=t.getParamMapper(),I=t.getRange(),c=a.getBaseParam(I.min,!1),E=a.getBaseParam(I.max,!0),u=g.getParamMapper(),Q=u.getParam(c),p=u.getParam(E);g.setRange(Q,p)}return g}return new exports.OffsetCurve3(t.clone(),e,n,s)}static makeByTargetPoint(t,e){if(t instanceof exports.Ln3){const I=t.getParamAt(e),c=t.getPtAt(I),E=new exports.Vec3(e).subtract(c);return new exports.Ln3(t.getStartPt().added(E),t.getStartTangent(),t.getRange().toArray())}let n=PtToCurve3Distance.execute(e,t),s;const r=t.getRange();if(Util.isNearlyEqual(n.param,r.min)){s=t.getStartTangent();const I=new exports.Ln3(t.getStartPt(),s,Interval.infinitArray());n=PtToCurve3Distance.simple(e,I)}else if(Util.isNearlyEqual(n.param,r.max)){s=t.getEndTangent();const I=new exports.Ln3(t.getEndPt(),t.getEndTangent(),Interval.infinitArray());n=PtToCurve3Distance.simple(e,I)}else s=t.getTangentAt(n.param);const i=new exports.Vec3(e).subtract(n.foot),o=CurveUtil.getDzByCurve(t,i),g=o.dot(i),a=s.cross(o).dot(i);return exports.OffsetCurve3.makeByOffset(t,o,a,g)}constructor(t,e,n=0,s=0,r){super(),t&&e&&(this._baseCurve=t,this._dz=e.clone(),this._offsetXY=n,this._offsetZ=s,this._updateParamMapper(),this._initRange(r))}getBaseCurve(){return this._baseCurve}getParamMapper(){return this._paramMapper}getDomain(){if(this._baseCurve instanceof exports.NurbsCurve3&&!this.isPeriodic()){const t=this._baseCurve.getDomain();return new Interval(t.min,t.max)}return this._paramMapper.getDomain()}isLineLike(){return this._baseCurve.isLineLike()}toVerbNurbs(){return this.toNurbs()._verbCurve}getOffsetXY(){return this._offsetXY}setOffsetXY(t){const e=this._startSettingChange();this._offsetXY=t,this._updateParamMapper(),this._endSettingChange(e)}getOffsetZ(){return this._offsetZ}setOffsetZ(t){this._offsetZ=t}getDz(){return this._dz.clone()}getPtAt(t){const e=this._paramMapper.getBaseParam(t),n=this._baseCurve.getPtAt(e),r=this._baseCurve.getTangentAt(e).normalize().cross(this._dz).multiply(this._offsetXY);return n.add(r).add(this._dz.multiplied(this._offsetZ))}getParamAt(t){const e=[this._range.min,this._range.max];if(e.push(...this.getSingularities()),this._baseCurve.isPeriodic()&&!this.isPeriodic()){const i=this._baseCurve.getDomain();e.push(i.min,i.max)}for(const i of e)if(this.getPtAt(i).equals(t))return i;const n=this._range,s=this._baseCurve.getParamAt(t),r=this._paramMapper.getParam(s);return n instanceof PeriodInterval?n.getRegularParam(r):r}isPlaneCurve3d(t=Tol.ANGLE){return this.getBaseCurve().isPlaneCurve3d(t)}getAllFootParams(t,e=Tol.LENGTH){const n=this._baseCurve.getAllFootParams(t,e),s=[];for(const r of n){const i=this._paramMapper.getParamInfo(r);i.type===ParamType.Normal&&s.push(i.param)}return s}getDerivatives(t,e,n){const s=this._getSnapToPrevious(t,n),r=this._paramMapper.getBaseParam(t,s),i=this._baseCurve.getDerivatives(r,e+1,s),o=(O,H)=>O.cross(this._dz).multiply(this._offsetXY*H),g=i[1].getSqLength(),a=Math.sqrt(g),I=o(i[1],1/a),c=this._dz.multiplied(this._offsetZ),E=[i[0].added(I).add(c)];if(e<=0)return E;const u=i[1].dot(i[2]),Q=o(i[2],g).subtract(o(i[1],u)),p=g*a;if(E.push(i[1].added(Q.multiplied(1/p))),e<=1)return E;const w=i[1].dot(i[3])+i[2].dot(i[2]),y=o(i[3],g).add(o(i[2],u)).add(o(i[1],-w)),M=3*a*u,N=y.multiplied(p).subtract(Q.multiplied(M)).multiply(1/(p*p));if(E.push(i[2].added(N)),e<=2)return E;const S=i[1].dot(i[4])+3*i[2].dot(i[3]),R=o(i[4],g).add(o(i[3],3*u)).subtract(o(i[1],S)),U=3*u*u/a+3*a*S,b=R.multiplied(p).subtract(Q.multiplied(U)).multiply(1/(p*p)),G=N.multiplied(-2*M/p);if(E.push(i[3].added(b).add(G)),e<=3)return E;throw new Error("unimplemented: Offset Curve derivatives: nth > 3 not supported yet")}getSingularities(){const t=this._paramMapper.getSingularities();return this._range.filterParams(t)}getContinuousRanges(){const t=this._paramMapper.getSingularities();return this._range.splited(...t)}reverse(){const t=this._range instanceof PeriodInterval&&this._range.isClosed(),{min:e,max:n}=this._range,s=this._baseCurve.getPtAt(this._paramMapper.getBaseParam(e)),r=this._baseCurve.getPtAt(this._paramMapper.getBaseParam(n));this._baseCurve.reverse(),this._offsetXY=-this._offsetXY,this._updateParamMapper();const i=this._baseCurve.getParamAt(r),o=this._paramMapper.getParam(i,!1),g=this._paramMapper.getPeriod();if(t)this._range=new PeriodInterval(o,o+g,g);else{let a=this._baseCurve.getParamAt(s);const I=this._baseCurve.getRange();Util.isNearlyBiggerOrEqual(i,a)&&I instanceof PeriodInterval&&(a+=I.period);const c=this._paramMapper.getParam(a,!0);this._range=g>0?new PeriodInterval(o,c,g):new Interval(o,c)}return this}toNurbs(t=3,e=Tol.LENGTH){const n=this.getSingularities();n.sort();const s=this._range,r=s.clone(),i=[];let o=s;for(const u of n){const Q=o.splited(u);i.push(Q[0]),o=Q[1]}i.push(o);const g=[];for(const u of i){this.setRange(u);const Q=this.getInterpPts(e).pts,p=exports.NurbsCurve3.makeByInterpolationPts(Q,t);g.push(p)}if(this.setRange(r),g.length===1)return g[0];let a=[],I=[],c=[];for(const u of g)if(I.length===0)I=u.getControlPoints(),c=u.getWeights(),a=u.getKnots();else{a.pop(),I.pop(),c.pop(),I=I.concat(u.getControlPoints()),c=c.concat(u.getWeights());const Q=a[a.length-1];for(let p=t+1;p<u.getKnots().length;p++)a.push(u.getKnots()[p]+Q)}return exports.NurbsCurve3.makeByControlPoints(I,t,a,c)}transform(t,e){const n=e?.svd||exports.Matrix4.make(t,!1).decompose();return exports.Matrix4.assertScaleEqual(n.scale),this._baseCurve.transform(t,e),this._dz.vecTransform(t).normalize(),this._offsetXY*=n.scale.x,this._offsetZ*=n.scale.y,this}transformed(t,e){const n=e?.svd||exports.Matrix4.make(t,!1).decompose();if(exports.Matrix4.isScaleEqual(n.scale)){const i=this._baseCurve.clone();i.transform(t,e);const o=this._dz.vecTransformed(t).normalize(),g=this._offsetXY*n.scale.x,a=this._offsetZ*n.scale.y;return new exports.OffsetCurve3(i,o,g,a)}const r=this.toNurbs();return r.transform(t),r}discrete(t=DiscreteParam.NORMAL){const e=this.getContinuousRanges(),n=this._range,s=e.map(i=>(this._range=i,DiscreteUtil.discreteCurve3d(this,t))),r=s.length?s[0]:[];for(let i=1;i<s.length;i++)r.push(...s[i].slice(1));return this._range=n,r}getType(){return EN_GEO_TYPE.OFFSET_CURVE_3D}clone(){const t=new exports.OffsetCurve3(this._baseCurve.clone(),this._dz,this._offsetXY,this._offsetZ,this._range.toArray());return t.userData=this.userData,t}dump(){return{...super.dump(),data:[this._baseCurve.dump(),this._dz.toArray3(),this._offsetXY,this._offsetZ,this._range.toArray()]}}load(t){const{data:[e,n,s,r,i]}=t;return this._baseCurve=Loader.load(e),this._dz=new exports.Vec3(n),this._offsetXY=s,this._offsetZ=r,this._updateParamMapper(),this._initRange(i),super.load(t)}_refineDegerateTangent(t,e,n){const s=this._paramMapper.getBaseParam(t,e),r=this._baseCurve.getTangentAt(s,e);return r.isParallel(n,Tol.ROUGH_ANGLE_EPS)?r.multiplied(Math.sign(r.dot(n))):n}_updateParamMapper(){if(this._paramMapper=new OffsetParameterMapper,this._baseCurve instanceof exports.Arc3){const t=this._baseCurve,e=this._offsetXY*this._dz.dot(t.getNormal());this._paramMapper=OffsetParameterMapper.ByArc(this,t,e)}else this._baseCurve.isPeriodic()&&(this._paramMapper=OffsetParameterMapper.periodicBaseCurve(this,this._offsetXY))}_initRange(t){if(t)this._range=PeriodInterval.make(t[0],t[1],this._paramMapper.getPeriod());else{const e=this._baseCurve.getRange();this._range=this._paramMapper.getRange(e)}}_startSettingChange(){if(this._range instanceof PeriodInterval&&this._range.isClosed())return this._baseCurve.getRange().toArray();const t=this._paramMapper.getBaseParam(this._range.min,!1),e=this._paramMapper.getBaseParam(this._range.max,!0);return[t,e]}_endSettingChange(t){this._range=this._paramMapper.getRange(t)}};exports.OffsetCurve3=__decorateClass$f([registerGeo],exports.OffsetCurve3);class CurvesProject{static lines(t,e){const n=e.getParamAt(t.getStartPt()),s=e.getParamAt(t.getEndPt());return new Interval(n,s,!0)}}function getParam(l,t,e){const n=l.getParamAt(t);return l.getPtAt(n).sqDistanceTo(t)<e?n:void 0}class CurvesOverlap{static curve2ds(t,e,n=new Tol){let s;if(t instanceof exports.Ln2){if(e instanceof exports.Ln2)return CurvesOverlap.lines(t,e,n)}else if(t instanceof exports.Arc2){if(e instanceof exports.Arc2)return CurvesOverlap.arcs(t,e,n)}else if(t instanceof exports.OffsetCurve2&&e instanceof exports.OffsetCurve2&&(s=CurvesOverlap.offsetCurves(t,e,n),s))return s;return t instanceof exports.NurbsCurve2||t instanceof exports.SmoothPoly2||e instanceof exports.NurbsCurve2||e instanceof exports.SmoothPoly2?CurvesOverlap.generalCurves(t,e,n):[]}static curve3ds(t,e,n=Tol.DEFAULT){let s;if(t instanceof exports.Ln3){if(e instanceof exports.Ln3)return CurvesOverlap.lines(t,e,n)}else if(t instanceof exports.Arc3){if(e instanceof exports.Arc3)return CurvesOverlap.arcs(t,e,n)}else if(t instanceof exports.OffsetCurve3&&e instanceof exports.OffsetCurve3&&(s=CurvesOverlap.offsetCurves(t,e,n),s))return s;return t instanceof exports.NurbsCurve3&&e instanceof exports.NurbsCurve3&&(s=CurvesOverlap.nurbsCurves(t,e,n),s)?s:t instanceof exports.NurbsCurve3||t instanceof exports.SmoothPoly3||e instanceof exports.NurbsCurve3||e instanceof exports.SmoothPoly3?CurvesOverlap.generalCurves(t,e,n):[]}static lines(t,e,n=Tol.DEFAULT){if(CurvesColinear.lines(t,e,n))return CurvesOverlap._linesOverlap(t,e,n);function s(o,g){return g.getPtAt(g.getParamAt(o)).sqDistanceTo(o)}const r=t.getRange().getLength(),i=e.getRange().getLength();if(r>1&&i>1)return[];if(r<i){if(s(t.getStartPt(),e)<n.lengthEps2&&s(t.getEndPt(),e)<n.lengthEps2){const o=CurvesOverlap._linesOverlap(e,t,n);return o.length>0&&([o[0].range1,o[0].range2]=[o[0].range2,o[0].range1]),o}}else if(s(e.getStartPt(),t)<n.lengthEps2&&s(e.getEndPt(),t)<n.lengthEps2)return CurvesOverlap._linesOverlap(t,e,n);return[]}static arcs(t,e,n=Tol.DEFAULT){return CurvesColinear.arcs(t,e,n)?CurvesOverlap._arcsOverlap(t,e,n):[]}static offsetCurves(t,e,n=Tol.DEFAULT){return CurvesColinear.offsetCurves(t,e,n)?CurvesOverlap._offsetCurvesOverlap(t,e,n):[]}static extendCurves(t,e,n=Tol.DEFAULT){return CurvesColinear.extendCurves(t,e,n)?CurvesOverlap._extendCurvesOverlap(t,e,n):[]}static nurbsCurves(t,e,n=Tol.DEFAULT){if(CurvesColinear.nurbsCurves(t,e,n))return CurvesOverlap._nurbsCurvesOverlap(t,e,n)}static generalCurves(t,e,n=Tol.DEFAULT,s=DiscreteParam.NORMAL.hintSegmentCount){const r=n.edgeLengthEps2,i=t.getStartPt().sqDistanceTo(t.getEndPt())<r,o=e.getStartPt().sqDistanceTo(e.getEndPt())<r;if(i&&o){const g=e.getStartPt(),a=t.getParamAt(g),c=t.getTangentAt(a).dot(e.getStartTangent())>0;if(CurvesColinear.testBySamples(t,e,e.getRange(),n)){const E=t.getRange().clone(),u=e.getRange().clone();return[{range1:E,range2:u,isSameDirection:c}]}return[]}if(i){const g=CurvesOverlap._generalOpenCurves(e,t,!0,n,s);for(const a of g)[a.range1,a.range2]=[a.range2,a.range1];return g}return CurvesOverlap._generalOpenCurves(t,e,o,n,s)}static _linesOverlap(t,e,n=Tol.DEFAULT){const s=t.getRange(),r=CurvesProject.lines(e,t),i=s.intersected(r,n.lengthEps);if(i.length===0)return[];const o=i[0],g=t.getDirection().dot(e.getDirection())>0,a=e.getParamAt(t.getPtAt(o.min)),I=e.getParamAt(t.getPtAt(o.max));return[{range1:o,range2:g?new Interval(a,I):new Interval(I,a),isSameDirection:g}]}static _arcsOverlap(t,e,n){const s=t.getRange(),r=e.getRange(),i=CurvesColinear.areArcsSameDirection(t,e);if(t.isClosed()&&e.isClosed())return[{range1:s,range2:r,isSameDirection:i}];const o=t.getParamAt(e.getStartPt()),g=t.getParamAt(e.getEndPt()),a=i?new PeriodInterval(o,g):new PeriodInterval(g,o);return s.intersected(a,n.numberEps).map(E=>{const u=t.getPtAt(E.min),Q=t.getPtAt(E.max);return{range1:E,range2:i?e.getParamRangeAt(u,Q):e.getParamRangeAt(Q,u),isSameDirection:i}})}static _offsetCurvesOverlap(t,e,n){const s=t.getRange(),r=e.getRange(),i=t.getBaseCurve(),o=e.getBaseCurve();if(i instanceof exports.Arc3&&o instanceof exports.Arc3||i instanceof exports.Arc2&&o instanceof exports.Arc2){const g=CurvesColinear.areArcsSameDirection(i,o),a=Math.abs(s.getLength()-s.period)<n.numberEps,I=Math.abs(r.getLength()-r.period)<n.numberEps;if(a&&I)return[{range1:s,range2:r,isSameDirection:g}];const c=s.period,E=t.getParamAt(e.getStartPt()),u=t.getParamAt(e.getEndPt()),Q=g?new PeriodInterval(E,u,c):new PeriodInterval(u,E,c);return s.intersected(Q,n.numberEps).map(y=>{const M=t.getPtAt(y.min),N=t.getPtAt(y.max),S=e.getParamAt(M),R=e.getParamAt(N),U=e.getParamMapper().getPeriod(),b=g?new PeriodInterval(S,R,U):new PeriodInterval(R,S,U);return{range1:y,range2:b,isSameDirection:g}})}if(i instanceof exports.NurbsCurve3&&o instanceof exports.NurbsCurve3||i instanceof exports.NurbsCurve2&&o instanceof exports.NurbsCurve2){const g=o.getParamAt(i.getStartPt()),a=i.getStartTangent().dot(o.getTangentAt(g))>0;if(s instanceof PeriodInterval&&r instanceof PeriodInterval){const p=Math.abs(s.getLength()-s.period)<n.numberEps,w=Math.abs(r.getLength()-r.period)<n.numberEps;if(p&&w)return[{range1:s,range2:r,isSameDirection:a}]}const I=t.getParamAt(e.getStartPt()),c=t.getParamAt(e.getEndPt());let E;if(s instanceof PeriodInterval&&r instanceof PeriodInterval){const p=s.period;E=a?new PeriodInterval(I,c,p):new PeriodInterval(c,I,p)}else E=a?new Interval(I,c):new Interval(c,I);return s.intersected(E,n.numberEps).map(p=>{const w=t.getPtAt(p.min),y=t.getPtAt(p.max),M=e.getParamAt(w),N=e.getParamAt(y),S=e.getParamMapper().getPeriod();let R;return S?R=a?new PeriodInterval(M,N,S):new PeriodInterval(N,M,S):R=a?new Interval(M,N):new Interval(N,M),{range1:p,range2:R,isSameDirection:a}})}}static _extendCurvesOverlap(t,e,n){const s=t.getRange(),r=e.getBaseCurve().getMidPt(),i=t.getParamAt(r);let o;const g=t.getTangentAt(i),a=e.getBaseCurve().getMidTangent();if(g.isSameDirection(a,n.lengthEps))o=!0;else if(g.isOpposite(a,n.lengthEps))o=!1;else{const p=e.getBaseCurve().getRange(),w=e.getPtAt(p.min-.1),y=t.getParamAt(w),M=t.getTangentAt(y),N=e.getTangentAt(p.min-.1);o=M.isSameDirection(N,n.lengthEps)}const I=t.getParamAt(e.getStartPt()),c=t.getParamAt(e.getEndPt()),E=o?new Interval(I,c):new Interval(c,I);return s.intersected(E,n.numberEps).map(p=>{const w=t.getPtAt(p.min),y=t.getPtAt(p.max),M=e.getParamAt(w),N=e.getParamAt(y),S=o?new Interval(M,N):new Interval(N,M);return{range1:p,range2:S,isSameDirection:o}})}static _nurbsCurvesOverlap(t,e,n){const s=t.getRange(),r=e.getRange(),i=t.getParamAt(e.getStartPt());let o;const g=t.getTangentAt(i),a=e.getStartTangent();if(g.isSameDirection(a,n.lengthEps))o=!0;else if(g.isOpposite(a,n.lengthEps))o=!1;else{const Q=e.getRange();if(Q instanceof PeriodInterval){const p=Q.period-i,w=t.getTangentAt(p,!1);w.isSameDirection(a,n.lengthEps)?o=!0:w.isOpposite(a,n.lengthEps)?o=!1:o=g.dot(a)>0}else o=g.dot(a)>0}if(s instanceof PeriodInterval&&s.isClosed()&&r instanceof PeriodInterval&&r.isClosed())return[{range1:s,range2:r,isSameDirection:o}];const I=t.getParamAt(e.getEndPt());let c;if(s instanceof PeriodInterval&&r instanceof PeriodInterval){const Q=s.period;c=o?new PeriodInterval(i,I,Q):new PeriodInterval(I,i,Q)}else c=o?new Interval(i,I):new Interval(I,i);return s.intersected(c,n.numberEps).map(Q=>{const p=t.getPtAt(Q.min),w=t.getPtAt(Q.max),y=e.getParamAt(p),M=e.getParamAt(w);let N;return r instanceof PeriodInterval?N=o?new PeriodInterval(y,M,r.period):new PeriodInterval(M,y,r.period):N=o?new Interval(y,M):new Interval(M,y),{range1:Q,range2:N,isSameDirection:o}})}static _generalOpenCurves(t,e,n,s,r){const i=[{t1:t.getRange().min},{t1:t.getRange().max},{t2:e.getRange().min},{t2:e.getRange().max}],o=[];for(const c of i)c.t1!==void 0?(c.pt=t.getPtAt(c.t1),c.t2=getParam(e,c.pt,s.edgeLengthEps2),c.t2!==void 0&&o.push(c)):(c.pt=e.getPtAt(c.t2),c.t1=getParam(t,c.pt,s.edgeLengthEps2),c.t1!==void 0&&o.push(c));if(o.length<2)return[];const g=[],a=(c,E,u)=>{const Q=c.t2<E.t2;if(Q!==u)return;const p=e.getRange().clone(),w=Q?p.set(c.t2,E.t2):p.set(E.t2,c.t2);if(!(Util.isNearlySmallerOrEqual(e.getRange().max,w.min)||Util.isNearlyBiggerOrEqual(e.getRange().min,w.max))&&e.getPtAt(w.min).sqDistanceTo(e.getPtAt(w.max))>s.edgeLengthEps2&&CurvesColinear.testBySamples(t,e,w,s)){const y=t.getRange().clone().set(c.t1,E.t1);g.push({range1:y,range2:w,isSameDirection:Q})}};o.sort((c,E)=>c.t1!==E.t1?c.t1-E.t1:c.t2-E.t2);const I=t.getTangentAt(o[0].t1).dot(e.getTangentAt(o[0].t2))>0;if(n&&o.length===4){const c=i;I?(a(c[0],c[3],I),a(c[2],c[1],I)):(a(c[0],c[2],I),a(c[3],c[1],I))}else for(let c=1;c<o.length;c++)o[c].pt.sqDistanceTo(o[c-1].pt)>s.edgeLengthEps2&&a(o[c-1],o[c],I);return g}}class CurvesColinear{static curve3ds(t,e,n=Tol.DEFAULT){if(t instanceof exports.Ln3){if(e instanceof exports.Ln3)return CurvesColinear.lines(t,e,n)}else if(t instanceof exports.Arc3){if(e instanceof exports.Arc3)return CurvesColinear.arcs(t,e,n)}else if(t instanceof exports.OffsetCurve3){if(e instanceof exports.OffsetCurve3)return CurvesColinear.offsetCurves(t,e,n)}else if(t instanceof exports.NurbsCurve3&&e instanceof exports.NurbsCurve3)return CurvesColinear.nurbsCurves(t,e,n);return t instanceof exports.NurbsCurve3||t instanceof exports.SmoothPoly3||e instanceof exports.NurbsCurve3||e instanceof exports.SmoothPoly3?CurvesOverlap.generalCurves(t,e,n).length>0:!1}static curve2ds(t,e,n=Tol.DEFAULT){if(t instanceof exports.Ln2){if(e instanceof exports.Ln2)return CurvesColinear.lines(t,e,n)}else if(t instanceof exports.Arc2){if(e instanceof exports.Arc2)return CurvesColinear.arcs(t,e,n)}else if(t instanceof exports.OffsetCurve2){if(e instanceof exports.OffsetCurve2)return CurvesColinear.offsetCurves(t,e,n)}else if(t instanceof exports.NurbsCurve2&&e instanceof exports.NurbsCurve2)return CurvesColinear.nurbsCurves(t,e,n);return t instanceof exports.NurbsCurve2||t instanceof exports.SmoothPoly2||e instanceof exports.NurbsCurve2||e instanceof exports.SmoothPoly2?CurvesOverlap.generalCurves(t,e,n).length>0:!1}static lines(t,e,n=Tol.DEFAULT){function s(r,i){return i.getPtAt(i.getParamAt(r)).sqDistanceTo(r)}return t.getDirection().isParallel(e.getDirection(),n.angleEps)&&(s(t.getMidPt(),e)<n.lengthEps2||s(e.getMidPt(),t)<n.lengthEps2)}static arcs(t,e,n){if(!t.getCenter().equals(e.getCenter(),n.lengthEps)||t instanceof exports.Arc3&&e instanceof exports.Arc3&&!t.getNormal().isParallel(e.getNormal(),n.angleEps))return!1;const s=t.getA(),r=t.getB(),i=e.getA(),o=e.getB();return Math.abs(s-r)<n.lengthEps?Math.abs(i-o)<n.lengthEps&&Math.abs(s+r-i-o)<n.lengthEps*2:Math.abs(s-i)<n.lengthEps?Math.abs(r-o)<n.lengthEps&&t.getCoord().getDx().isParallel(e.getCoord().getDx(),n.angleEps):Math.abs(s-o)<n.lengthEps?Math.abs(i-r)<n.lengthEps&&t.getCoord().getDx().isPerpendicular(e.getCoord().getDx(),n.angleEps):!1}static areArcsSameDirection(t,e){return t instanceof exports.Arc2&&e instanceof exports.Arc2?t.isCCW()===e.isCCW():t instanceof exports.Arc3&&e instanceof exports.Arc3?t.getNormal().dot(e.getNormal())>0:(MathError.assert("arc1 and arc2 not same type"),!1)}static offsetCurves(t,e,n){if(t instanceof exports.OffsetCurve2&&e instanceof exports.OffsetCurve2)return Util.isNearlyEqual(t.getOffset(),e.getOffset(),n.lengthEps)?CurvesColinear.curve2ds(t.getBaseCurve(),e.getBaseCurve(),n):!1;if(t instanceof exports.OffsetCurve3&&e instanceof exports.OffsetCurve3){const s=t.getBaseCurve(),r=e.getBaseCurve();if(!t.getDz().isParallel(e.getDz(),n.angleEps))return!1;const i=t.getDz().dot(e.getDz());if(!Util.isNearlyEqual(t.getOffsetZ(),e.getOffsetZ()*i,n.lengthEps))return!1;let o=i;if(s instanceof exports.Arc3&&r instanceof exports.Arc3){const g=s.getNormal().dot(r.getNormal());o*=g}else if(s instanceof exports.NurbsCurve3&&r instanceof exports.NurbsCurve3){const g=CurveUtil.getDzByCurve(s).dot(CurveUtil.getDzByCurve(r));o*=g}return Util.isNearlyEqual(t.getOffsetXY(),e.getOffsetXY()*o,n.lengthEps)?CurvesColinear.curve3ds(s,r,n):!1}return!1}static extendCurves(t,e,n){const s=t.getBaseCurve(),r=e.getBaseCurve();if(s instanceof Curve3&&r instanceof Curve3&&!CurvesColinear.curve3ds(s,r,n)||s instanceof Curve2&&r instanceof Curve2&&!CurvesColinear.curve2ds(s,r,n))return!1;const i=s.getRange(),o=r.getRange();return i.equals(o,n.numberEps)}static testBySamples(t,e,n=e.getRange(),s=Tol.DEFAULT,r=DiscreteParam.NORMAL.hintSegmentCount){const i=(n.max-n.min)/(r+1),o=t.getRange();for(let g=0;g<r;g++){const a=i*(g+.9+Math.random()*.2)+n.min,I=e.getPtAt(a),c=t.getParamAt(I),E=t.getPtAt(c);if(!o.containsPt(c)||E.sqDistanceTo(I)>s.edgeLengthEps2)return!1}return!0}static nurbsCurves(t,e,n){const s=t.getDegree(),r=e.getDegree(),i=t.getKnots(),o=e.getKnots(),g=t.getControlPoints(),a=e.getControlPoints();if(s!==r||i.length!==o.length||g.length!==a.length)return!1;let I=!0;for(let Q=0;Q<g.length;Q++)if(!g[Q].equals(a[Q],n.lengthEps)){I=!1;break}let c=!0;if(!I){let Q=!0;for(let p=0;p<g.length;p++)if(!g[p].equals(a[g.length-1-p],n.lengthEps)){Q=!1;break}if(Q)c=!1;else return!1}for(let Q=0;Q<i.length;Q++){let p=o[Q];if(c||(p=o[o.length-1]-o[o.length-1-Q]),!Util.isNearlyEqual(i[Q],p,n.numberEps))return!1}const E=t.getWeights(),u=e.getWeights();for(let Q=0;Q<E.length;Q++)if(!Util.isNearlyEqual(E[Q],u[Q],n.numberEps))return!1;return!0}}var __getOwnPropDesc$e=Object.getOwnPropertyDescriptor,__decorateClass$e=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$e(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Ln3=class extends Curve3{constructor(t,e,n){if(super(),this._origin=exports.Vec3.O(),this._dir=exports.Vec3.X(),!n&&t&&e){this.reset(t,e);return}t&&e&&n&&(this._origin=new exports.Vec3(t),this._dir=new exports.Vec3(e),this._dir.normalize(),this._range=new Interval(n[0],n[1]))}getOrigin(){return this._origin}setOrigin(t){return this._origin.copy(t)}toVector3(){return new exports.Vec3(this.getStartPt(),this.getEndPt())}toInfiniteLine(){const t=this.clone();return t.setRange(new Interval(-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH)),t}reset(t,e){const n=new exports.Vec3(t,e),s=n.getLength();s<Tol.CALCULATE_EPS?this._dir=exports.Vec3.X():this._dir=n.multiply(1/s),this._origin=new exports.Vec3(t),this._range=new Interval(0,s)}getDirection(){return this._dir.clone()}setDirection(t){this._dir=new exports.Vec3(t).normalize()}isLineLike(){return!0}isParallelTo(t,e=Tol.ANGLE){return this._dir.isParallel(t._dir,e)}isColinearWith(t,e=Tol.LENGTH){return CurvesColinear.lines(this,t,new Tol(e))}isPerpendicularTo(t,e=Tol.ANGLE){return this._dir.isPerpendicular(t._dir,e)}getPtAt(t){return this._dir.multiplied(t).add(this._origin)}getParamAt(t){return new exports.Vec3(t).subtract(this._origin).dot(this._dir)}getClosestPoint(t){const e=this.getParamAt(t);return e<this._range.min?this.getStartPt():e>this._range.max?this.getEndPt():this.getPtAt(e)}getAllFootParams(t,e=Tol.LENGTH){return[this.getParamAt(t)]}getFootByIterate(t,e){return new exports.Vec3(t).subtract(this._origin).dot(this._dir)}getTangentAt(t){return this.getDirection()}getTangentCone(t,e=!0){return new TangentCone(this.getDirection(),0)}getDerivatives(t,e){const n=[];n.push(this.getPtAt(t)),e>=1&&n.push(this.getDirection());for(let s=2;s<=e;s++)n.push(new exports.Vec3);return n}getLength(t){return t!==void 0?t.getLength():this._range.getLength()}getInfinitClone(){return new exports.Ln3(this._origin,this._dir,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH])}isPlaneCurve3d(t){return!0}reverse(){return this._dir.reverse(),this._range.set(-this._range.max,-this._range.min),this}transform(t){this._origin.transform(t),this._dir.vecTransform(t);const e=this._dir.getLength();return this._dir.multiply(1/e),this._range.multiply(e),this}split(t,e){const n=t.filter(r=>this._range.containsPt(r,e)&&!this._range.containsPtAtStartOrEnd(r,e));return n.length?this._range.splited(...n).map(r=>new exports.Ln3(this.getOrigin(),this.getDirection(),r.toArray())):[]}toVerbNurbs(){return new geom.Line(this.getStartPt().toArray3(),this.getEndPt().toArray3())}toNurbs(t=1,e=Tol.LENGTH){const n=[this.getStartPt()],s=this._range.getLength()/t;for(let i=1;i<=t;i++){const o=this.getPtAt(i*s);n.push(o)}return exports.NurbsCurve3.makeByInterpolationPts(n,t)}getBBox(t){const e=t||this._range;return new Box3([this.getPtAt(e.min),this.getPtAt(e.max)])}getType(){return EN_GEO_TYPE.LN_3}clone(){return super.clone()}dump(){return{...super.dump(),data:[this._origin.toArray3(),this._dir.toArray3(),[this.getRange().min,this.getRange().max]]}}load(t){const{data:[e,n,s]}=t;return this._origin.resetFromArray(e),this._dir.resetFromArray(n),this._range=new Interval(s[0],s[1]),super.load(t)}translate(t){return this._origin.add(t),this}};exports.Ln3=__decorateClass$e([registerGeo],exports.Ln3);class Geometry3d extends GeoElement{translate(t){const e=exports.Matrix4.makeTranslate(t);return this.transform(e)}rotate(t,e,n){const s=n||{x:0,y:0,z:1},r=exports.Matrix4.makeRotate(e,s,t);return this.transform(r)}scale(t,e){const n=exports.Matrix4.makeScale(e,t);return this.transform(n)}}class SurfaceUtil{static unifyCurve2dUVBetweenCurves(t,e,n,s=Tol.DEFAULT){if(t.length<1)return;const r=s.edgeLengthEps;if(!t[0].getStartPt().equals(t[t.length-1].getEndPt(),r))return;for(let E=1;E<t.length;E++)if(!t[E].getStartPt().equals(t[E-1].getEndPt(),r))return;const i=e.getDomainU(),o=e.getDomainV();if(!(i instanceof PeriodInterval)&&!(o instanceof PeriodInterval))return;for(let E=1;E<n.length;E++){const u=n[E-1].getEndPt(),Q=n[E].getStartPt(),p=u.subtracted(Q),w=p.getSqLength();w<s.edgeLengthEps2||(n[E-1].isNurbsCurve2d()||n[E].isNurbsCurve2d())&&w<s.edgeLengthEps2*1e4||n[E].translate(p)}let g=0,a=0;const I=n.map(E=>E.getStartPt()),c=(E,u)=>{const Q=Math.max(...u),p=Math.min(...u);return Util.isNearlyBiggerOrEqual(p,E)?-Math.round(p/E)*E:Util.isNearlySmallerOrEqual(Q,0)?Math.round((E-Q)/E)*E:0};if(i instanceof PeriodInterval){const E=I.map(u=>u.x);g=c(i.period,E)}if(o instanceof PeriodInterval){const E=I.map(u=>u.y);a=c(o.period,E)}if(g||a){const E=new exports.Vec2(g,a);n.forEach(u=>u.translate(E))}}}class Surface extends Geometry3d{constructor(){super()}isUPeriodic(){return this.getDomainU()instanceof PeriodInterval}isVPeriodic(){return this.getDomainV()instanceof PeriodInterval}isRuled(){return!1}getDomainU(){return Interval.infinit()}getDomainV(){return Interval.infinit()}clampInDomain(t){}getBBox(){throw new Error("No bounding box for Surface")}getBox(t,e){const n=t||this.getDomainU(),s=e||this.getDomainV(),r=[this.getIsoCurve(n.min,!1).setRange(s),this.getIsoCurve(n.max,!1).setRange(s),this.getIsoCurve(s.min,!0).setRange(n),this.getIsoCurve(s.max,!0).setRange(n)],i=new Box3;return r.forEach(o=>{i.union(o.getBBox())}),i}getNormAtPoint(t){const e=this.getUVAt(t);return this.getNormAt(e)}getSingularPoints(){return[]}translate(t){return super.translate(t)}rotate(t,e,n){return super.rotate(t,e,n)}clone(){return super.clone()}transformed(t,e){return this.clone().transform(t,e)}getProjectedPtBy(t){const e=this.getUVAt(t);return this.getPtAt(e)}containsPt(t,e=Tol.LENGTH){const n=this.getPtAt(this.getUVAt(t)).sqDistanceTo(t);return Util.isNearly0(n,e*e)}distanceToPoint(t){return this.getPtAt(this.getUVAt(t)).distanceTo(t)}signDistanceToPoint(t){const e=this.getUVAt(t),n=this.getPtAt(e);let s=n.distanceTo(t);return n.subtracted(t).dot(this.getNormAt(e))>0&&(s=-s),s}getUVNearParam(t,e,n=Tol.ANGLE,s=Tol.LENGTH,r,i){const o=Math.sin(s),g=n*n;let a=!1;const I={x:e.x,y:e.y};let c=0;for(;c<CONST.NORMAL_ITER_NUM;c++){const p=this.getDerivatives(I,2),w=p[0].subtracted(t),y=[w.dot(p[1]),w.dot(p[2])];if(w.getSqLength()<g){a=!0;break}if(Math.abs(y[0])<o&&Math.abs(y[1])<o){a=!0;break}const M=p[1].dot(p[1])+w.dot(p[3]),N=p[2].dot(p[1]),S=N,R=p[2].dot(p[2])+w.dot(p[5]),U=[[M,N],[S,R]];if(Math.abs(U[0][0]*U[1][1]-U[0][1]*U[1][0])<Tol.CALCULATE_EPS){a=!1;break}const b=LinearSystem.execute(U,y);if(b===void 0){a=!1;break}I.x-=b[0],I.y-=b[1]}let E=!1,u=!1;if(a){if(!r&&!i)return new exports.Vec2(I);if(!r)E=!0;else if(Math.abs(I.x-e.x)<r)E=!0;else if(Math.abs(I.x-e.x)>r){const p=this.getDomainU();p instanceof PeriodInterval&&(I.x=p.getRegularParam(I.x),Math.abs(I.x-e.x)<r&&(E=!0),Math.abs(I.x-p.period-e.x)<r&&(I.x-=p.period,E=!0),Math.abs(I.x+p.period-e.x)<r&&(I.x+=p.period,E=!0))}if(!i)u=!0;else if(Math.abs(I.y-e.y)<i)u=!0;else if(Math.abs(I.y-e.y)>i){const p=this.getDomainV();p instanceof PeriodInterval&&(I.x=p.getRegularParam(I.x),Math.abs(I.y-e.y)<i&&(u=!0),Math.abs(I.y-p.period-e.y)<i&&(I.y-=p.period,u=!0),Math.abs(I.y+p.period-e.y)<i&&(I.y+=p.period,u=!0))}}return E&&u?new exports.Vec2(I):this.getUVAt(t)}getCurve2dForIsoCurve(t){if(t.length>200&&!this.isPlane()){const e=this.getUVAt(t[0]),n=this.getIsoCurve(e.x,!1),s=DiscreteUtil.discreteCurve3d(n,DiscreteParam.NORMAL);if(Math.abs(s.length/t.length-1)<.01){let o=!0;for(let g=0;g<t.length;g+=2)if(!n.containsPt(t[g])){o=!1;break}if(o){const g=this.getUVAt(t[t.length-1]);if(Math.abs(e.x-g.x)<Tol.LENGTH)return new exports.Ln2(e,g);if(Math.abs(e.x-g.x)>Tol.LENGTH&&this.isUPeriodic()){const I=this.getDomainU().period;if(Math.abs((g.x-e.x)/I-1)<Tol.LENGTH)return g.x=e.x,new exports.Ln2(e,g)}}}const r=this.getIsoCurve(e.y,!0),i=DiscreteUtil.discreteCurve3d(r,DiscreteParam.NORMAL);if(Math.abs(i.length/t.length-1)<.01){let o=!0;for(let g=0;g<t.length;g+=2)if(!r.containsPt(t[g])){o=!1;break}if(o){const g=this.getUVAt(t[t.length-1]);if(Math.abs(e.y-g.y)<Tol.LENGTH)return new exports.Ln2(e,g);if(Math.abs(e.y-g.y)>Tol.LENGTH&&this.isVPeriodic()){const I=this.getDomainU().period;if(Math.abs((g.y-e.y)/I-1)<Tol.LENGTH)return g.y=e.y,new exports.Ln2(e,g)}}}}}getCurve2d(t){const e=DiscreteUtil.discreteCurve3d(t,DiscreteParam.NORMAL),n=this.getCurve2dForIsoCurve(e);if(n)return n;const s=e.map(I=>this.getUVAt(I)),r=this.getDomainU();if(r instanceof PeriodInterval){const I=r.period;if(s.length>2){let c=!0;for(;c;){let E=0,u=0;for(;E<s.length-2;E++){const Q=s[E+1].x-s[E].x,p=Math.abs(s[E+2].x-s[E+1].x);if(Math.abs(Q)>I/2&&Math.abs(Q)>p*2){u=Q<0?1:-1;break}}if(u===0){const Q=s[E+1].x-s[E].x,p=Math.abs(s[E].x-s[E-1].x);Math.abs(Q)>I/2&&Math.abs(Q)>p*2?u=Q<0?1:-1:E++}if(c=u!==0,u!==0)for(u>0&&E++;E>=0&&E<s.length;)s[E].x+=I,E+=u}}if(Math.min(s[0].x,s[s.length-1].x)>I-Tol.NUMBER)for(const c of s)c.x-=I;else if(Math.max(s[0].x,s[s.length-1].x)<Tol.NUMBER)for(const c of s)c.x+=I}const i=this.getDomainV();if(i instanceof PeriodInterval){const I=i.period;if(s.length>2){let c=!0;for(;c;){let E=0,u=0;for(;E<s.length-2;E++){const Q=s[E+1].y-s[E].y,p=Math.abs(s[E+2].y-s[E+1].y);if(Math.abs(Q)>I/2&&Math.abs(Q)>p*2){u=Q<0?1:-1;break}}if(u===0){const Q=s[E+1].y-s[E].y,p=Math.abs(s[E].y-s[E-1].y);Math.abs(Q)>I/2&&Math.abs(Q)>p*2?u=Q<0?1:-1:E++}if(c=u!==0,u!==0)for(u>0&&E++;E>=0&&E<s.length;)s[E].y+=I,E+=u}}if(Math.min(s[0].y,s[s.length-1].y)>I-Tol.NUMBER)for(const c of s)c.y-=I;else if(Math.max(s[0].y,s[s.length-1].y)<Tol.NUMBER)for(const c of s)c.y+=I}const o=s[s.length-1].subtracted(s[0]);if(o.isZero()){for(let I=1;I<s.length;I++)if(s[I].subtracted(s[0]).getSqLength()>Tol.LENGTH_2)return exports.NurbsCurve2.makeByInterpolationPts(s);return new exports.Ln2(s[0],s[s.length-1])}const g=o.normalized();let a=!0;for(let I=1;I<s.length;I++){const c=s[I].subtracted(s[0]).normalize();if(!g.isParallel(c,Tol.ANGLE)){a=!1;break}}return a?new exports.Ln2(s[0],g,[0,o.getLength()]):exports.NurbsCurve2.makeByInterpolationPts(s)}getCurve3d(t){const e=DiscreteUtil.discreteCurve2dOnSurface(t,this,DiscreteParam.CALCULATE).points;return new exports.SmoothPoly3(e)}wireToUV(t,e=Tol.DEFAULT){const n=new Map,s=t.map(r=>{const i=this.getCurve2d(r);return n.set(r,i),i});return SurfaceUtil.unifyCurve2dUVBetweenCurves(t,this,s,e),{loop:s,mapping:n}}firstFundamentalForm(t){const e=this.getDerivatives(t,1),n=e[1].dot(e[1]),s=e[1].dot(e[2]),r=e[2].dot(e[2]);return[n,s,r]}tessellate(t=DiscreteParam.NORMAL,e=Tol.DEFAULT){const n=this.discrete(t,e),s=this.getDomainU();s.min=Math.max(s.min,-1e3),s.max=Math.min(s.max,1e3);const r=this.getDomainV();r.min=Math.max(r.min,-1e3),r.max=Math.min(r.max,1e3),this.getIsoCurve(r.min,!0).setRange(s),this.getIsoCurve(s.max,!1).setRange(r);const g=this.getIsoCurve(r.max,!0);g.setRange(s),g.reverse();const a=this.getIsoCurve(s.min,!1);return a.setRange(r),a.reverse(),{mesh:n}}discrete(t=DiscreteParam.NORMAL,e=Tol.DEFAULT){const n=this.getDomainU();n.min=Math.max(n.min,-1e3),n.max=Math.min(n.max,1e3);const s=this.getDomainV();s.min=Math.max(s.min,-1e3),s.max=Math.min(s.max,1e3);const r=[new exports.Vec2(n.min,s.min),new exports.Vec2(n.max,s.min),new exports.Vec2(n.max,s.max),new exports.Vec2(n.min,s.max)],i=[{pCurve:new exports.Ln2(r[0],r[1])},{pCurve:new exports.Ln2(r[1],r[2])},{pCurve:new exports.Ln2(r[2],r[3])},{pCurve:new exports.Ln2(r[3],r[0])}];return DiscreteUtil.discreteSurface(this,[i],!0,t,e)}_containsBaseCurve(t,e=Tol.LENGTH){if(t.isLine3d())return this.containsPt(t.getStartPt(),e)&&this.containsPt(t.getEndPt(),e)&&this.containsPt(t.getMidPt(),e);if(t.isArc3d())return this.containsPt(t.getPtAt(0),e)&&this.containsPt(t.getPtAt(CONST.PI),e)&&this.containsPt(t.getPtAt(CONST.PI_2),e)&&this.containsPt(t.getPtAt(CONST.PI_2*3),e);if(t.isNurbsCurve3d()){const n=t;return n.getCoincideLine()!==void 0&&this.containsPt(n.getStartPt(),e)&&this.containsPt(n.getEndPt(),e)&&this.containsPt(t.getMidPt(),e)}return!1}}class CoordBasedSurface extends Surface{constructor(){super(...arguments),this._coord=new exports.Coord3}getCoord(){return this._coord}setCoord(t){this._coord=t.clone()}translate(t){return this._coord.translate(t),this}rotate(t,e,n={x:0,y:0,z:1}){const s=exports.Matrix4.makeRotate(e,n,t);return this._coord.transform(s),this}}function isExpectedSqureMatrix(l,t){const[e,n]=numeric1_2_6Exports.dim(l);return e===n&&t===e}function convertToMatrix3(l){const t=l.data||l;return t.length===3?t:[[t[0][0],t[0][1],t[0][3]],[t[1][0],t[1][1],t[1][3]],[t[3][0],t[3][1],t[3][3]]]}function convertToMatrix4(l){const t=l.data||l;return t.length===4?t:[[t[0][0],t[0][1],0,t[0][2]],[t[1][0],t[1][1],0,t[1][2]],[0,0,1,0],[t[2][0],t[2][1],0,t[2][2]]]}function isMirror(l){const t=l.data||l;return numeric1_2_6Exports.det(t)<0}const matrix_util=Object.freeze(Object.defineProperty({__proto__:null,convertToMatrix3,convertToMatrix4,isExpectedSqureMatrix,isMirror},Symbol.toStringTag,{value:"Module"}));class GeomUtil{static curvesConnected(t,e=Tol.LENGTH){for(let n=0;n<t.length-1;n++){const s=t[n],r=t[n+1];if(!s.getEndPt().equals(r.getStartPt(),e))return!1}return!0}static createPlaneFromPts(t){if(t.length<3)return;const e=[0,0,0];for(let r=0;r<t.length;r++){const i=(r+1)%t.length,o=t[r],g=t[i];e[0]+=(o.y-g.y)*(o.z+g.z),e[1]+=(o.z-g.z)*(o.x+g.x),e[2]+=(o.x-g.x)*(o.y+g.y)}let n=new exports.Vec3(e[0],e[1],e[2]);n.isZero()||(n=n.normalized());const s=t[0];if(n.equals(new exports.Vec3(0,0,0))){const r=t[1].subtracted(s).normalized();for(let i=2;i<t.length;i++){const o=t[i].subtracted(s).normalized(),g=r.cross(o).normalized();if(!g.equals(new exports.Vec3(0,0,0))){n=g;break}}}if(!n.equals(new exports.Vec3(0,0,0)))return n}static splitCurveByPoints(t,e,n=Tol.NUMBER){const s=[];for(const r of e)if(!r.equals(t.getStartPt())&&!r.equals(t.getEndPt())){const i=t.getParamAt(r);s.push(i)}return t.split(s,n)}}var __getOwnPropDesc$d=Object.getOwnPropertyDescriptor,__decorateClass$d=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$d(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Plane=class extends CoordBasedSurface{static XOY(t=0){return new exports.Plane(new exports.Vec3(0,0,t),exports.Vec3.X(),exports.Vec3.Y())}static YOZ(t=0){return new exports.Plane(new exports.Vec3(t,0,0),exports.Vec3.Y(),exports.Vec3.Z())}static ZOX(t=0){return new exports.Plane(new exports.Vec3(0,t,0),exports.Vec3.Z(),exports.Vec3.X())}static makeBy3Pts(t,e,n){const s=new exports.Vec3(e).subtract(t).normalize(),r=new exports.Vec3(n).subtract(t),i=r.subtract(s.multiplied(r.dot(s))).normalize();if(!(Util.isNearly0(s.getLength())||Util.isNearly0(i.getLength())))return new exports.Plane(t,s,i)}static makeByPoints(t,e){const n=GeomUtil.createPlaneFromPts(t);if(n)return exports.Plane.makeByPtNormal(t[0],n,e)}static makeByPtNormal(t,e,n){if(n&&!new exports.Vec3(n).isParallel(e)){const s=new exports.Vec3(e).cross(n),r=s.cross(e);return new exports.Plane(t,r,s)}return new exports.Plane(t,e)}constructor(t,e,n){super(),n?this._coord=new exports.Coord3(t,e,n):e?this._coord=new exports.Coord3(t,e):t&&(this._coord=t.clone())}getOrigin(){return this._coord.getOrigin()}getNorm(){return this._coord.getDz()}reverse(){return this._coord.setDy(this._coord.getDy().multiply(-1)),this}getUDir(){return this._coord.getDx().clone()}getVDir(){return this._coord.getDy().clone()}getPtAt(t){return this._coord.getWorldPtAt(t)}getNormAt(t){return this._coord.getDz()}getDerivatives(t,e=1){const n=[];if(n.push(this.getPtAt(t)),e>=1){n.push(this.getUDir()),n.push(this.getVDir());for(let s=2;s<=e;s++)for(let r=0;r<=s;r++)n.push(exports.Vec3.O())}return n}getUVAt(t){const e=this._coord.getLocalPtAt(t);return new exports.Vec2(e.x,e.y)}getLine3DByPts(t,e){const n=this.getPtAt(t),s=this.getPtAt(e);return new exports.Ln3(n,s)}getLine3D(t){return this.getLine3DByPts(t.getStartPt(),t.getEndPt())}isRuled(){return!0}isParellel(t,e=Tol.ANGLE){return this._coord.getDz().isParallel(t._coord.getDz(),e)}isPerpendicular(t,e=Tol.ANGLE){return this._coord.getDz().isPerpendicular(t._coord.getDz(),e)}isCoplanar(t,e=new Tol){return t.isPlane()?this._coord.getDz().isParallel(t._coord.getDz(),e.angleEps)&&(this.containsPt(t._coord.getOrigin(),e.lengthEps)||t.containsPt(this._coord.getOrigin(),e.lengthEps)):!1}containsCurve(t,e=Tol.LENGTH,n=Tol.ANGLE){const s=r=>{if(r instanceof exports.Ln3)return this.containsPt(r.getStartPt(),e)&&this.containsPt(r.getEndPt(),e);if(r instanceof exports.Arc3){let i=this.containsPt(r.getCoord().getOrigin(),e);return i=i&&this._coord.getDz().isParallel(r.getCoord().getDz(),n),i}if(r instanceof exports.NurbsCurve3){const i=r.getControlPoints();for(const o of i)if(!this.containsPt(o,e))return!1;return!0}return!1};if(t.isLine3d()||t.isArc3d()||t.isNurbsCurve3d())return s(t);if(t instanceof exports.OffsetCurve3){const r=t.getOffsetZ(),i=t.getBaseCurve();if(r<e)return s(i);const o=i.clone().translate(new exports.Vec3(t.getDz().multiply(r)));return s(o)}throw new Error("暂不支持该种类型")}getIsoCurve(t,e){if(e){const r=this.getUDir(),i=this.getPtAt(new exports.Vec2(0,t));return new exports.Ln3(i,r,Interval.infinitArray())}const n=this.getVDir(),s=this.getPtAt(new exports.Vec2(t,0));return new exports.Ln3(s,n,Interval.infinitArray())}getLine2D(t){const e=this.getUVAt(t.getStartPt()),n=this.getUVAt(t.getEndPt());if(!e.equals(n))return new exports.Ln2(e,n)}getCurve2d(t){const e=this._coord;if(t instanceof exports.Ln3){const n=e.getLocalPtAt(t.getStartPt()),s=e.getLocalPtAt(t.getEndPt());return new exports.Ln2(n,s)}if(t instanceof exports.Arc3){const n=t,s=e.getLocalVectorAt(n.getCoord().getDx()),r=e.getLocalVectorAt(n.getCoord().getDy()),i=e.getLocalPtAt(n.getCoord().getOrigin()),o=new exports.Coord2(i,s),g=n.getRange().toArray();return o.getDy().dot(r)>0?new exports.Arc2(o,n.getA(),n.getB(),!0,g):new exports.Arc2(o,n.getA(),n.getB(),!1,[g[0],g[1]])}if(t instanceof exports.NurbsCurve3){const n=t.getKnots(),s=t.getDegree(),r=t.getWeights(),o=t.getControlPoints().map(a=>e.getLocalPtAt(a)),g=t.getRange();return exports.NurbsCurve2.makeByControlPoints(o,s,n,r,g.toArray())}if(t instanceof exports.OffsetCurve3){const n=t.getBaseCurve(),s=t.getOffsetXY(),r=this.getCurve2d(n),i=Math.sign(t.getDz().dot(e.getDz()));return new exports.OffsetCurve2(r,s*i,t.getRange().toArray())}if(t instanceof exports.SmoothPoly3){const n=t.getPoints().map(s=>e.getLocalPtAt(s));return new exports.SmoothPoly2(n)}throw new Error("暂不支持该种类型")}getCurve3d(t){const e=this._coord;if(t instanceof exports.Ln2)return this.getLine3D(t);if(t instanceof exports.Arc2){const n=new exports.Coord3(e.getWorldPtAt(t.getCoord().getOrigin()),e.getWorldVectorAt(t.getCoord().getDx()),e.getWorldVectorAt(t.getCoord().getDy()).multiply(t.isCCW()?1:-1));return new exports.Arc3(n,t.getA(),t.getB(),t.getRange().toArray())}if(t instanceof exports.NurbsCurve2){const n=t.getKnots(),s=t.getDegree(),r=t.getWeights(),o=t.getControlPoints().map(a=>e.getWorldPtAt(a)),g=t.getRange();return exports.NurbsCurve3.makeByControlPoints(o,s,n,r,g.toArray())}if(t instanceof exports.OffsetCurve2){const n=t.getBaseCurve(),s=t.getOffset(),r=this.getCurve3d(n);return new exports.OffsetCurve3(r,e.getDz(),s,0,t.getRange().toArray())}if(t instanceof exports.SmoothPoly2){const n=t.getPoints().map(s=>this._coord.getWorldPtAt(s));return new exports.SmoothPoly3(n)}throw new Error("暂不支持该种类型")}transform(t){return this._coord.transform(t),isMirror(t)&&this._coord.setDx(this._coord.getDx().reverse()),this}clone(){return super.clone()}getType(){return EN_GEO_TYPE.PLANE}dump(){return{...super.dump(),data:[this._coord.dump()]}}load(t){const{data:[e]}=t;return this._coord.load(e),super.load(t)}};exports.Plane=__decorateClass$d([registerGeo],exports.Plane);var __getOwnPropDesc$c=Object.getOwnPropertyDescriptor,__decorateClass$c=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$c(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Ln2=class extends Curve2{constructor(t,e,n){if(super(),this._origin=exports.Vec2.O(),this._dir=exports.Vec2.X(),!n&&t&&e){this.reset(t,e);return}t&&e&&n&&(this._origin=new exports.Vec2(t),this._dir=new exports.Vec2(e),this._dir.normalize(),this._range=new Interval(n[0],n[1]))}toVector2(){return new exports.Vec2(this.getStartPt(),this.getEndPt())}reset(t,e){const n=new exports.Vec2(t,e),s=n.getLength();s<Tol.CALCULATE_EPS?(MathError.mutedWarn(!1,"two points are too near to determine line direction"),this._dir=exports.Vec2.X()):this._dir=n.multiply(1/s),this._origin=new exports.Vec2(t),this._range=new Interval(0,s)}getOrigin(){return this._origin}setOrigin(t){return this._origin.copy(t)}getDirection(){return this._dir.clone()}setDirection(t){this._dir=new exports.Vec2(t).normalize()}getLeftNormal(){return new exports.Vec2(-this._dir.y,this._dir.x).normalize()}getRightNormal(){return this.getLeftNormal().reverse()}isLineLike(){return!0}isParallelTo(t,e=Tol.ANGLE){return this._dir.isParallel(t._dir,e)}isColinearWith(t,e=Tol.LENGTH){return CurvesColinear.lines(this,t,new Tol(e))}isPerpendicularTo(t,e=Tol.ANGLE){return this._dir.isPerpendicular(t._dir,e)}side(t,e){const n=this._origin.added(this._dir),s=(this._origin.x-t.x)*(n.y-t.y)-(this._origin.y-t.y)*(n.x-t.x);return Util.isNearly0(s,e)?0:s>0?1:-1}getPtAt(t){return this._dir.multiplied(t).add(this._origin)}getParamAt(t){return new exports.Vec2(t).subtract(this._origin).dot(this._dir)}getClosestPoint(t){const e=this.getParamAt(t);return e<this._range.min?this.getStartPt():e>this._range.max?this.getEndPt():this.getPtAt(e)}getAllFootParams(t,e=Tol.LENGTH){return[this.getParamAt(t)]}getFootByIterate(t,e){return new exports.Vec2(t).subtract(this._origin).dot(this._dir)}getDerivatives(t,e){const n=[];n.push(this.getPtAt(t)),e>=1&&n.push(this.getDirection());for(let s=2;s<=e;s++)n.push(new exports.Vec2);return n}getTangentAt(t){return this.getDirection()}getLength(t){return t!==void 0?t.getLength():this._range.getLength()}reverse(){return this._dir.reverse(),this._range.set(-this._range.max,-this._range.min),this}split(t,e){const n=t.filter(r=>this._range.containsPt(r,e)&&!this._range.containsPtAtStartOrEnd(r,e));return n.length?this._range.splited(...n).map(r=>new exports.Ln2(this.getOrigin(),this.getDirection(),r.toArray())):[]}toNurbs(t=1,e=Tol.LENGTH){const n=[this.getStartPt()],s=this._range.getLength()/t;for(let i=1;i<=t;i++){const o=this.getPtAt(i*s);n.push(o)}return exports.NurbsCurve2.makeByInterpolationPts(n,t)}toCurve3d(t){return new exports.Plane(t).getCurve3d(this)}toInfiniteLine(){const t=this.clone();return t.setRange(new Interval(-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH)),t}offset(t){const e=this.getDirection();e.vecRotate(-CONST.PI_2);const n=e.multiplied(t);return this._origin.add(n),!0}transform(t){this._origin.transform(t),this._dir.vecTransform(t);const e=this._dir.getLength();return e&&this._dir.multiply(1/e),this._range.multiply(e),this}getBBox(t){const e=t||this._range;return new Box2([this.getPtAt(e.min),this.getPtAt(e.max)])}getType(){return EN_GEO_TYPE.LN_2}clone(){return super.clone()}dump(){return{...super.dump(),data:[this._origin.toArray2(),this._dir.toArray2(),this._range.toArray()]}}load(t){const{data:[e,n,s]}=t;return this._origin.resetFromArray(e),this._dir.resetFromArray(n).normalize(),this._range=new Interval(s[0],s[1]),super.load(t)}translate(t){return this._origin.add(t),this}};exports.Ln2=__decorateClass$c([registerGeo],exports.Ln2);class PtToCv2Distance{static execute(t,e,n=!1){if(e instanceof exports.Ln2||e instanceof exports.Arc2&&e.isEqualAB())return this.simple(t,e,n);const s=e.getRange(),i=e.getAllFootParams(t).filter(a=>s.containsPt(a));let o=s.min,g=CONST.MAX_INTEGER;for(const a of i){const I=e.getPtAt(a),c=e.getTangentAt(a),E=-I.subtracted(t).cross(c);Math.abs(E)<Math.abs(g)&&(o=a,g=n?E:Math.abs(E))}return i.length>0?{param:o,distance:g,foot:e.getPtAt(o)}:this._toCurveEnd(t,e,g>-Tol.PROCESS_LENGTH_EPS,n)}static simple(t,e,n=!1){const s=e.getParamAt(t),r=e.getPtAt(s),i=e.getTangentAt(s),o=-r.subtracted(t).cross(i);return e.getRange().containsPt(s)?{param:s,distance:n?o:Math.abs(o),foot:r}:this._toCurveEnd(t,e,o>-Tol.PROCESS_LENGTH_EPS,n)}static _toCurveEnd(t,e,n,s=!1){const r=e.getStartPt(),i=e.getEndPt(),o=r.distanceTo(t),g=i.distanceTo(t),a=e.getRange();return o<g+Tol.PROCESS_LENGTH_EPS?{param:a.min,foot:r,distance:s&&!n?-o:o}:{param:a.max,foot:i,distance:s&&!n?-g:g}}}class CircularSurface extends CoordBasedSurface{getA(){return this._a}setA(t){this._a=t}getB(){return this._b}setB(t){this._b=t}getRadius(){return MathAssert.assert(this.isEqualAB(),"获取半径时,圆弧长短轴长度不一致"),this._a}isEqualAB(t=Tol.LENGTH){return Math.abs(this._a-this._b)<t}wireToUV(t,e=Tol.DEFAULT){const n=new Map,s=t.map(i=>{const o=this.getCurve2d(i);return MathAssert.assert(o,"result crv2d is undefined",i),n.set(i,o),o}),r=[];for(let i=0;i<s.length;i++){const o=i-1<0?i-1+s.length:i-1,g=s[o].getEndPt(),a=s[i].getStartPt();if(!a.equals(g,e.lengthEps)&&s[i].isLine2d()){const I=g.x-a.x,c=[i];let E=s[i],u=E.getEndPt(),Q=(i+1)%s.length;for(;s[Q].isLine2d()&&s[Q].getStartPt().equals(u,e.lengthEps);){const y=s[Q];if(!y.getDirection().isParallel(E.getDirection(),e.angleEps))break;c.push(Q),E=y,u=y.getEndPt(),Q=(Q+1)%s.length,i++}const p=t[o],w=t[Q];if(p.isPeriodic()||t[Q].isPeriodic()){const M=(p.isPeriodic()?p.getRange():w.getRange()).period;if(Util.isNearlyEqual(I,M,e.numberEps)){for(const N of c)s[N].getOrigin().add(new exports.Vec2(M,0));continue}}else t[i].getLength()<e.lengthEps&&r.push(i)}}for(const i of r){const o=i-1<0?i-1+s.length:i-1,g=(i+1)%s.length,a=s[o].getEndPt(),I=s[g].getStartPt();s[i]=new exports.Ln2(a,I)}return{loop:s,mapping:n}}getCurve2d(t){return t instanceof exports.Ln3?this._line3dToUV(t):t instanceof exports.Arc3&&t.getNormal().isParallel(this.getCoord().getDz())?this._arc3dToUV(t):super.getCurve2d(t)}containsCurve(t,e=Tol.LENGTH){if(t.isLine3d()||t.isArc3d()||t.isNurbsCurve3d())return this._containsBaseCurve(t);if(t instanceof exports.OffsetCurve3){const n=t.getBaseCurve();return n instanceof exports.NurbsCurve3&&n.getCoincideLine()!==void 0?this.containsPt(t.getStartPt(),e)&&this.containsPt(t.getEndPt(),e):!1}return!1}_line3dToUV(t){const e=this.getUVAt(t.getStartPt()),n=new exports.Vec2(e.x,this.getUVAt(t.getEndPt()).y);return e.equals(n)?new exports.Ln2(e,exports.Vec2.X(),[0,0]):new exports.Ln2(e,n)}_arc3dToUV(t){const e=this.getUVAt(t.getStartPt()),n=t.getCoord().getDz().isParallel(this._coord.getDz()),s=t.getCoord().getDz().dot(this._coord.getDz())>0,r=t.getRange().getLength();let i=s?e.x+r:e.x-r,o=e.y;if(!n){const I=this.getUVAt(t.getEndPt());o=I.y,this.isEqualAB()||(s&&I.x<e.x?i+=CONST.PI2:!s&&I.x>e.x&&(i-=CONST.PI2))}const g=2*Tol.LENGTH/(this._a+this._b);Util.isNearlySmaller(i,0,g)&&e.x<g&&(e.x+=CONST.PI2,i+=CONST.PI2),Util.isNearlyBigger(i,CONST.PI2,g)&&e.x>CONST.PI2+g&&(e.x-=CONST.PI2,i-=CONST.PI2);const a=new exports.Vec2(i,o);return new exports.Ln2(e,a)}}var __getOwnPropDesc$b=Object.getOwnPropertyDescriptor,__decorateClass$b=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$b(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Cylinder=class extends CircularSurface{static makeCylinderByArc3d(t){return new exports.Cylinder(t.getCoord(),t.getA(),t.getB())}constructor(t,e,n){super(),t&&e!==void 0&&(this._coord=t.clone(),this._a=e,this._b=n===void 0?e:n)}getRadius(){return MathAssert.assert(this.isEqualAB(Tol.NUMBER_CALC_EPS),"椭圆柱调用了获取圆半径函数 getRadius()"),(this._a+this._b)/2}getCenterAxis(){return this._coord.getDz()}getPtAt(t){return this.getCoord().getWorldPtAt({x:this._a*Math.cos(t.x),y:this._b*Math.sin(t.x),z:t.y})}getNormAt(t){const e={x:this._b*Math.cos(t.x),y:this._a*Math.sin(t.x),z:0};return this._coord.getWorldVectorAt(e).normalize()}isRuled(){return!0}getDerivatives(t,e=1){const n=[],s=this._a,r=this._b,i=Math.cos(t.x),o=Math.sin(t.x),g=s*i,a=r*o,I=new exports.Vec3(g,a,t.y);if(n.push(this._coord.getWorldPtAt(I)),e<=0)return n;const c=new exports.Vec3(-s*o,r*i,0);if(n.push(this._coord.getWorldVectorAt(c)),n.push(this._coord.getDz()),e<=1)return n;const E=new exports.Vec3(-g,-a,0);if(n.push(this._coord.getWorldVectorAt(E)),n.push(new exports.Vec3(0,0,0)),n.push(new exports.Vec3(0,0,0)),e<=2)return n;const u=new exports.Vec3(s*o,-r*i,0);if(n.push(this._coord.getWorldVectorAt(u)),n.push(new exports.Vec3(0,0,0)),n.push(new exports.Vec3(0,0,0)),n.push(new exports.Vec3(0,0,0)),e<=3)return n;const Q=new exports.Vec3(g,a,0);if(n.push(this._coord.getWorldVectorAt(Q)),n.push(new exports.Vec3(0,0,0)),n.push(new exports.Vec3(0,0,0)),n.push(new exports.Vec3(0,0,0)),n.push(new exports.Vec3(0,0,0)),e<=4)return n;throw new Error("n > 4高阶导数计算未实现!")}getUVAt(t){const e=this._coord.getLocalPtAt(t),n=Math.atan2(e.y/this._b,e.x/this._a);return new exports.Vec2(PeriodInterval.RegularizeParam(n),e.z)}isCoplanar(t,e=new Tol){if(!t.isCylinder())return!1;const n=t,s=this.getCoord(),r=n.getCoord(),i=new exports.Ln3(s.getOrigin(),s.getDz(),Interval.infinitArray()),o=new exports.Ln3(r.getOrigin(),r.getDz(),Interval.infinitArray());if(!CurvesColinear.lines(i,o,e))return!1;const g=this.getA(),a=this.getB(),I=n.getA(),c=n.getB();return Math.abs(g-a)<e.lengthEps?Math.abs(I-c)<e.lengthEps&&Math.abs(g+a-I-c)<e.lengthEps*2:Math.abs(g-I)<e.lengthEps?Math.abs(a-c)<e.lengthEps&&s.getDx().isParallel(r.getDx(),e.angleEps):Math.abs(g-c)<e.lengthEps?Math.abs(I-a)<e.lengthEps&&s.getDx().isPerpendicular(r.getDx(),e.angleEps):!1}containsCurve(t,e=Tol.NUMBER){if(t instanceof exports.Ln3){const n=t.getStartPt(),s=this.getUVAt(n);if(this.getPtAt(s).sqDistanceTo(n)>e*e)return!1;const i=t.getEndPt(),o=this.getUVAt(i);return this.getPtAt(o).sqDistanceTo(i)>e*e?!1:PeriodInterval.areEqual(s.x,o.x,CONST.PI2,e)}if(t instanceof exports.Arc3){const n=t;return this.containsPt(n.getPtAt(0))&&this.containsPt(n.getPtAt(CONST.PI_2))&&this.containsPt(n.getPtAt(CONST.PI2))&&this.containsPt(n.getPtAt(CONST.PI*1.5))}return!1}getDomainU(){return new PeriodInterval(0,CONST.PI2)}getIsoCurve(t,e){if(e){const s=this._coord.translated(this._coord.getDz().multiply(t));return new exports.Arc3(s,this._a,this._b,[0,CONST.PI2])}const n=this.getPtAt(new exports.Vec2(t,0));return new exports.Ln3(n,this.getCenterAxis(),Interval.infinitArray())}getCurve3d(t){if(t.getType()===EN_GEO_TYPE.LN_2){const e=t,n=e.getDirection(),s=e.getStartPt(),r=e.getEndPt();if(n.isParallel(exports.Vec2.X())){const i=this._coord.getWorldPtAt({x:0,y:0,z:(s.y+r.y)/2}),o=this._coord.getDx(),g=this._coord.getDy();return n.x>0?new exports.Arc3(new exports.Coord3(i,o,g),this._a,this._b,[s.x,r.x]):new exports.Arc3(new exports.Coord3(i,o,g.multiply(-1)),this._a,this._b,[-s.x,-r.x])}if(n.isParallel(exports.Vec2.Y()))return new exports.Ln3(this.getPtAt(s),this.getPtAt(r))}return super.getCurve3d(t)}transform(t){const e=this._coord.getOrigin().transform(t),n=this._coord.getDx().multiply(this._a).vecTransform(t),s=this._coord.getDy().multiply(this._b).vecTransform(t),r=this._coord.getDz().vecTransform(t).normalized();let i,o;if(n.normalized().isPerpendicular(s.normalized()))i=n,o=s;else{const M=Math.atan2(2*n.dot(s),n.getSqLength()-s.getSqLength())*.5,N=Math.sin(M),S=Math.cos(M);i=n.multiplied(S).add(s.multiplied(N)),o=n.multiplied(-N).add(s.multiplied(S))}if(r.isPerpendicular(i)&&r.isPerpendicular(o))return n.cross(s).dot(r)<0&&o.multiply(-1),this._a=i.getLength(),this._b=o.getLength(),this._coord=new exports.Coord3(e,i,o),this;const g=new exports.Coord3(e,i,o),a=i.getLength(),I=o.getLength(),c=new exports.Arc3(g,a,I),E=new exports.Coord3(e,r),Q=[c.getPtAt(0),c.getPtAt(CONST.PI_4),c.getPtAt(CONST.PI_2)].map(M=>E.getLocalPtAt(M)),p=exports.Arc2.makeEllipseByCenterAndThreePoints(exports.Vec2.O(),Q);if(!p)throw new Error("");const w=E.getWorldVectorAt(p.getCoord().getDx()),y=E.getWorldVectorAt(p.getCoord().getDy());return this._coord=new exports.Coord3(e,w,y),this._a=p.getA(),this._b=p.getB(),this}clone(){return super.clone()}getType(){return EN_GEO_TYPE.CYLINDER}dump(){return{...super.dump(),data:[this._coord.dump(),this._a,this._b]}}load(t){const{data:[e,n,s]}=t;return this._coord.load(e),this._a=n,this._b=s,super.load(t)}};exports.Cylinder=__decorateClass$b([registerGeo],exports.Cylinder);class PtToSurfDistance{static execute(t,e,n){if(e instanceof exports.Plane)return PtToSurfDistance._PtToPlaneDistance(t,e,n);if(e instanceof exports.Cylinder)return PtToSurfDistance._PtToCylinderDistance(t,e,n);const s=e.getUVAt(t),r=e.getPtAt(s),i=e.getNormAt(s),o=r.distanceTo(t);return n&&n.copy(r),i.dot(t.subtracted(r).normalize())<0?-o:o}static _PtToPlaneDistance(t,e,n){const s=new exports.Vec3(e.getOrigin(),t),r=e.getNorm(),i=s.dot(r);if(n){const o=t.subtracted(e.getNorm().multiply(i));n.copy(o)}return i}static _PtToCylinderDistance(t,e,n){const s=e.getCoord().getLocalPtAt(t),r=s.x/e.getA(),i=s.y/e.getB(),o=Math.atan2(i,r),g=new exports.Vec2(PeriodInterval.RegularizeParam(o),s.z),a=e.getPtAt(g),I=a.distanceTo(t);return n&&n.copy(a),r*r+i*i<1?-I:I}}class PtsToPtsDistance{static execute(t,e,n,s){let r=CONST.MAX_INTEGER;for(const i of t)for(const o of e){const g=i.sqDistanceTo(o);if(g<r&&(r=g,n.copy(i),s.copy(o),r<Tol.LENGTH))return Math.sqrt(r)}return Math.sqrt(r)}}class PtsToCurvesDistance{static execute(t,e,n,s,r=CONST.MAX_INTEGER){let i=r;for(const o of t)for(const g of e){const a=PtToCurve3Distance.execute(o,g);if(a.distance<i&&(i=a.distance,n.copy(o),s.copy(a.foot)),i<Tol.LENGTH)return i}return i}}class CurveSegment{static getEndPoints(t){const e=[];e.push(t[0].curve.getStartPt()),e.push(t[0].curve.getEndPt());for(let n=1;n<t.length;n++){const s=t[n].curve,r=s.getStartPt(),i=s.getEndPt();r.equals(e[e.length-1])||e.push(r),e.push(i)}return e}static subdivideCurveSegment(t,e){const n=e[0],s=e[1];if(t.curve.isNurbsCurve()){const r=t.curve,i=r.getControlPoints(),o=r.getDegree()%2?(r.getDegree()+1)/2:r.getDegree()/2,g=r.getKnots().some(I=>t.range.containsPt(I));if(t.depth>3&&i.length<2**(t.depth-o)&&!g)return;const a=t.range.getMid();n.curve=t.curve,n.range=new Interval(t.range.min,a),s.curve=t.curve,s.range=new Interval(a,t.range.max)}else if(t.curve.isArc()){if(t.range.getLength()<CONST.PI_16-Tol.ANGLE)return;const r=t.range.getMid();n.curve=t.curve,n.range=new Interval(t.range.min,r),s.curve=t.curve,s.range=new Interval(r,t.range.max)}else if(t.curve.isLine()){if(t.depth>5)return;const r=t.range.getMid();n.curve=t.curve,n.range=new Interval(t.range.min,r),s.curve=t.curve,s.range=new Interval(r,t.range.max)}else if(t.curve.isOffsetCurve3d()||t.curve.isOffsetCurve2d()){if(t.depth>5)return;const r=t.range.getMid();n.curve=t.curve,n.range=new Interval(t.range.min,r),s.curve=t.curve,s.range=new Interval(r,t.range.max)}else throw new Error("unexpected curve type");n.depth=t.depth+1,s.depth=t.depth+1,t.child.push(n),t.child.push(s)}}class Curve2dSegment extends CurveSegment{constructor(t){super(),this.curve=t,this.child=[]}getSegBox(){return this._box||(this._box=this.curve.getBBox(this.range)),this._box}}class Curve3dSegment extends CurveSegment{constructor(t){super(),this.curve=t,this.child=[]}getSegBox(){return this._box||(this._box=this.curve.getBox(this.range)),this._box}}class CurveSegmentPair{static combineCurveSegmentPairs(t,e){let n=!1;for(const s of t){if(s.segment1.child.length===0&&s.segment2.child.length===0){e.push(s);continue}if(s.segment1.child.length>1)for(const r of s.segment1.child)if(s.segment2.child.length>1)for(const i of s.segment2.child){const o=new CurveSegmentPair(r,i);e.push(o)}else{const i=new CurveSegmentPair(r,s.segment2);e.push(i)}else for(const r of s.segment2.child){const i=new CurveSegmentPair(s.segment1,r);e.push(i)}n=!0}return n}static refreshCurveSegments(t,e,n){const s=new Set,r=new Set;for(const i of t)s.add(i.segment1),r.add(i.segment2);e.splice(0),e.push(...s),n.splice(0),n.push(...r)}get segment1(){return this._segment1}get segment2(){return this._segment2}constructor(t,e){this._segment1=t,this._segment2=e}getTwoBoxsMinDistance(){if(this._boxMinDist===void 0){const t=this.segment1.getSegBox(),e=this.segment2.getSegBox();if(t instanceof Box3&&e instanceof Box3)this._boxMinDist=Math.sqrt(t.getSquareDistanceTo(e));else if(t instanceof Box2&&e instanceof Box2)this._boxMinDist=Math.sqrt(t.getSquareDistanceTo(e));else throw new Error("包围盒计算距离:不可能出现的类型!")}return this._boxMinDist}}class Curve2dSegmentPair extends CurveSegmentPair{get segment1(){return this._segment1}get segment2(){return this._segment2}}class Curve3dSegmentPair extends CurveSegmentPair{get segment1(){return this._segment1}get segment2(){return this._segment2}}class SurfacePatch{static subdivideSurfacePatch(t,e=3){const n=[];if(t.surface.isCylinder()){if(t.depth>e||t.rangeU.getLength()<CONST.PI_6)return n;const s=[],r=t.surface,i=r.getA()>r.getB()?r.getA():r.getB();if(t.rangeV.getLength()>i){const a=t.rangeV.getMid(),I=new Interval(t.rangeV.min,a),c=new Interval(a,t.rangeV.max);s.push(I),s.push(c)}else s.push(t.rangeV);const o=[],g=t.rangeU.getMid();o.push(new Interval(t.rangeU.min,g)),o.push(new Interval(g,t.rangeU.max));for(const a of o)for(const I of s){const c=new SurfacePatch(t.surface);c.rangeU=a,c.rangeV=I,n.push(c)}}else if(t.surface.isPlane()){if(t.depth>e||t.rangeU.getLength()<=10&&t.rangeV.getLength()<=10)return n;const s=[];if(t.rangeU.getLength()>1){const i=t.rangeU.getMid(),o=new Interval(t.rangeU.min,i),g=new Interval(i,t.rangeU.max);s.push(o),s.push(g)}const r=[];if(t.rangeV.getLength()>1){const i=t.rangeV.getMid(),o=new Interval(t.rangeV.min,i),g=new Interval(i,t.rangeV.max);r.push(o),r.push(g)}for(const i of s)for(const o of r){const g=new SurfacePatch(t.surface);g.rangeU=i,g.rangeV=o,n.push(g)}}for(const s of n)s.depth=t.depth+1,t.child.push(s);return n}constructor(t,e){this.surface=t,this.child=[],e&&(this.rangeU=e[0],this.rangeV=e[1])}getPatchBox3d(){return this._box||(this._box=this.surface.getBox(this.rangeU,this.rangeV)),this._box}}class Curve3sDistance{static execute(t,e,n,s){return t.isLine3d()&&e.isLine3d()?this._Line3dToLine3dDistance(t,e,n,s):this._Curve3dToCurve3dDistance(t,e,n,s)}static _Line3dToLine3dDistance(t,e,n,s){if(!t.isParallelTo(e)){const r=Line3dToLine3dDistanceParamed.execute(t.getOrigin(),e.getOrigin(),t.getDirection(),e.getDirection());if(t.getRange().containsPt(r[0])&&e.getRange().containsPt(r[1])){const i=t.getPtAt(r[0]),o=e.getPtAt(r[1]);return n&&n.copy(i),s&&s.copy(o),i.distanceTo(o)}}return CurvedDistanceUtil.minAtEnds3d(t,e,n,s)}static _Curve3dToCurve3dDistance(t,e,n,s){let r=CONST.MAX_INTEGER;const i=[],o=[],g=new Curve3dSegment(t);g.range=t.getRange(),g.depth=0;const a=new Curve3dSegment(e);a.range=e.getRange(),a.depth=0,i.push(g),o.push(a);const I=Curve3dSegment.getEndPoints(i),c=Curve3dSegment.getEndPoints(o),E=new exports.Vec3,u=new exports.Vec3;let Q=PtsToPtsDistance.execute(I,c,E,u);if(Q<r&&(r=Q,n&&n.copy(E),s&&s.copy(u),r<Tol.LENGTH))return r;const p=[e];if(Q=PtsToCurvesDistance.execute(I,p,E,u,r),Q<r&&(r=Q,n&&n.copy(E),s&&s.copy(u),r<Tol.LENGTH))return r;const w=[t];if(Q=PtsToCurvesDistance.execute(c,w,u,E,r),Q<r&&(r=Q,n&&n.copy(E),s&&s.copy(u),r<Tol.LENGTH))return r;const y=[],M=new Curve3dSegmentPair(g,a);return y.push(M),Q=CurvedDistanceUtil.execute(i,o,y,E,u,r),Q<r&&(r=Q,n&&n.copy(E),s&&s.copy(u)),r}}function estimateRootMultiplicity(l){const t=l.length;return t<3?1:Math.abs(l[t-1]-l[t-2])<.01&&Math.abs(l[t-2]-l[t-3])<.01?2:1}function calcNextCurvesIteration(l,t,e){const n=l.getDerivatives(e[0],2),s=t.getDerivatives(e[1],2),r=n[0].subtracted(s[0]),i=[r.dot(n[1]),r.dot(s[1])],o=[n[1].dot(n[1])+r.dot(n[2]),-s[1].dot(n[1])],g=[n[1].dot(s[1]),-s[1].dot(s[1])+r.dot(s[2])];if(Math.abs(o[0]*g[1]-o[1]*g[0])<Tol.CALCULATE_EPS)return[];const a=LinearSystem.execute([o,g],i);return a===void 0?[]:a}function curvesIteration(l,t,e,n=Tol.DEFAULT){const s=n.lengthEps*n.lengthEps,r=s*1e-4;let i=l.getPtAt(e[0]),o=t.getPtAt(e[1]),g=i.sqDistanceTo(o);if(g<Tol.CALCULATE_EPS2)return!0;let a=0,I=1;const c=[];let E=!0;for(;a<CONST.NORMAL_ITER_NUM||E;a++){I=I>1?I:estimateRootMultiplicity(c);const u=calcNextCurvesIteration(l,t,e);if(u.length===0)return g<s;const Q=[e[0]-u[0],e[1]-u[1]];Q[0]=l.getDomain().clamp(Q[0]),Q[1]=t.getDomain().clamp(Q[1]);let p=l.getPtAt(Q[0]),w=t.getPtAt(Q[1]),y=p.sqDistanceTo(w),M=y/g;if(M>1-.1&&(Q[0]=e[0]-.5*u[0],Q[1]=e[1]-.5*u[1],Q[0]=l.getDomain().clamp(Q[0]),Q[1]=t.getDomain().clamp(Q[1]),p=l.getPtAt(Q[0]),w=t.getPtAt(Q[1]),y=p.sqDistanceTo(w),M=y/g),M>1&&y<Tol.CALCULATE_EPS2||(e[0]=Q[0],e[1]=Q[1],y<Tol.ZERO_JUDGE_EPS2))return!0;if(i.sqDistanceTo(p)<r&&o.sqDistanceTo(w)<r||a>CONST.MAX_ITER_NUM)return y<s;a>=CONST.NORMAL_ITER_NUM&&(E=y<g),i=p,o=w,g=y,c.push(M)}return g<s}function calcNextSurfaceSurfaceIterationSimple(l,t,e){const n=l.getDerivatives(e[0],2),s=t.getDerivatives(e[1],2),r=1/n[1].getLength(),i=1/n[2].getLength(),o=1/s[1].getLength(),g=1/s[2].getLength();n[1]=n[1].multiply(r),n[2]=n[2].multiply(i),s[1]=s[1].multiply(o),s[2]=s[2].multiply(g);const a=n[0].subtracted(s[0]),I=[a.dot(n[1]),a.dot(n[2]),a.dot(s[1]),a.dot(s[2])],c=[n[1].dot(n[1]),n[2].dot(n[1]),-s[1].dot(n[1]),-s[2].dot(n[1])],E=[n[1].dot(n[2]),n[2].dot(n[2]),-s[1].dot(n[2]),-s[2].dot(n[2])],u=[n[1].dot(s[1]),n[2].dot(s[1]),-s[1].dot(s[1]),-s[2].dot(s[1])],Q=[n[1].dot(s[2]),n[2].dot(s[2]),-s[1].dot(s[2]),-s[2].dot(s[2])],p=LinearSystem.execute([c,E,u,Q],I);return p===void 0?[]:(p[0]*=r,p[1]*=i,p[2]*=o,p[3]*=g,p)}function calcNextSurfaceSurfaceIteration(l,t,e){const n=l.getDerivatives(e[0],2),s=t.getDerivatives(e[1],2),r=n[0].subtracted(s[0]),i=[r.dot(n[1]),r.dot(n[2]),r.dot(s[1]),r.dot(s[2])],o=Tol.CALCULATE_EPS;if(Math.abs(i[0])<o&&Math.abs(i[2])<o&&Math.abs(i[1])>o&&Math.abs(i[3])>o){const Q=[n[2].dot(n[2])+r.dot(n[5]),-s[2].dot(n[2])],p=[n[2].dot(s[2]),-s[2].dot(s[2])+r.dot(s[5])],w=LinearSystem.execute([Q,p],[i[1],i[3]]);return w===void 0?[]:[0,w[0],0,w[1]]}if(Math.abs(i[1])<o&&Math.abs(i[3])<o&&Math.abs(i[0])>o&&Math.abs(i[2])>o){const Q=[n[1].dot(n[1])+r.dot(n[3]),-s[1].dot(n[1])],p=[n[1].dot(s[1]),-s[1].dot(s[1])+r.dot(s[3])],w=LinearSystem.execute([Q,p],[i[0],i[2]]);return w===void 0?[]:[w[0],0,w[1],0]}const g=[n[1].dot(n[1])+r.dot(n[3]),n[2].dot(n[1])+r.dot(n[4]),-s[1].dot(n[1]),-s[2].dot(n[1])],a=[n[1].dot(n[2])+r.dot(n[4]),n[2].dot(n[2])+r.dot(n[5]),-s[1].dot(n[2]),-s[2].dot(n[2])],I=[n[1].dot(s[1]),n[2].dot(s[1]),-s[1].dot(s[1])+r.dot(s[3]),-s[2].dot(s[1])+r.dot(s[4])],c=[n[1].dot(s[2]),n[2].dot(s[2]),-s[1].dot(s[2])+r.dot(s[4]),-s[2].dot(s[2])+r.dot(s[5])],E=numeric1_2_6Exports.det([g,a,I,c]);if(Math.abs(E)<Tol.CALCULATE_EPS)return calcNextSurfaceSurfaceIterationSimple(l,t,e);const u=LinearSystem.execute([g,a,I,c],i);return u===void 0?[]:u}function calcNextIterationThreeSurfaces(l,t,e,n){const s=l.getDerivatives(n[0],1),r=t.getDerivatives(n[1],1),i=e.getDerivatives(n[2],1),o=[s[0].x-r[0].x,s[0].y-r[0].y,s[0].z-r[0].z,r[0].x-i[0].x,r[0].y-i[0].y,r[0].z-i[0].z],g=[s[1].x,s[2].x,-r[1].x,-r[2].x,0,0],a=[s[1].y,s[2].y,-r[1].y,-r[2].y,0,0],I=[s[1].z,s[2].z,-r[1].z,-r[2].z,0,0],c=[0,0,r[1].x,r[2].x,-i[1].x,-i[2].x],E=[0,0,r[1].y,r[2].y,-i[1].y,-i[2].y],u=[0,0,r[1].z,r[2].z,-i[1].z,-i[2].z],Q=numeric1_2_6Exports.det([g,a,I,c,E,u]);if(Math.abs(Q)<Tol.CALCULATE_EPS)return[];const p=LinearSystem.execute([g,a,I,c,E,u],o);return p===void 0?[]:p}function surfaceSurfaceIteration(l,t,e,n=Tol.LENGTH,s=!0){const r=n*n,i=r*.01;let o=l.getPtAt(e[0]),g=t.getPtAt(e[1]),a=o.sqDistanceTo(g);if(a<i)return!0;let I=0,c=1;const E=[];let u=!0;for(;I<CONST.NORMAL_ITER_NUM||u;I++){c=c>1?c:estimateRootMultiplicity(E);let Q;if(s&&I>1){if(Q=calcNextSurfaceSurfaceIteration(l,t,e),Q.length===0)return a<r}else if(Q=calcNextSurfaceSurfaceIterationSimple(l,t,e),Q.length===0)return a<r;const p=[{x:e[0].x-Q[0],y:e[0].y-Q[1]},{x:e[1].x-Q[2],y:e[1].y-Q[3]}];l.clampInDomain(p[0]),t.clampInDomain(p[1]);let w=l.getPtAt(p[0]),y=t.getPtAt(p[1]),M=w.sqDistanceTo(y),N=M/a;if(N>1-.1&&(p[0].x=e[0].x-.5*Q[0],p[0].y=e[0].y-.5*Q[1],p[1].x=e[1].x-.5*Q[2],p[1].y=e[1].y-.5*Q[3],l.clampInDomain(p[0]),t.clampInDomain(p[1]),w=l.getPtAt(p[0]),y=t.getPtAt(p[1]),M=w.sqDistanceTo(y),N=M/a),N>1&&M<Tol.CALCULATE_EPS2||(e[0]=p[0],e[1]=p[1],M<Tol.ZERO_JUDGE_EPS2))return!0;if(o.sqDistanceTo(w)<i&&g.sqDistanceTo(y)<i||I>CONST.MAX_ITER_NUM)return M<r;I>=CONST.NORMAL_ITER_NUM&&(u=M<a-Tol.CALCULATE_EPS2),o=w,g=y,a=M,E.push(N)}return a<r*1e4}function threeSurfacesIteration(l,t,e,n,s=Tol.LENGTH){const r=s*s,i=r*.01;let o=l.getPtAt(n[0]),g=t.getPtAt(n[1]),a=e.getPtAt(n[2]),I=o.sqDistanceTo(g),c=o.sqDistanceTo(a),E=g.sqDistanceTo(a);if(I<Tol.CALCULATE_EPS2&&c<Tol.CALCULATE_EPS2&&E<Tol.CALCULATE_EPS2)return!0;let u=0,Q=!0;for(;u<CONST.NORMAL_ITER_NUM||Q;u++){const p=calcNextIterationThreeSurfaces(l,t,e,n);if(p.length===0)return I<r&&c<r&&E<r;const w=[{x:n[0].x-p[0],y:n[0].y-p[1]},{x:n[1].x-p[2],y:n[1].y-p[3]},{x:n[2].x-p[4],y:n[2].y-p[5]}];l.clampInDomain(w[0]),t.clampInDomain(w[1]),e.clampInDomain(w[2]);const y=l.getPtAt(w[0]),M=t.getPtAt(w[1]),N=e.getPtAt(w[2]),S=y.sqDistanceTo(M),R=y.sqDistanceTo(N),U=M.sqDistanceTo(N);if(n[0]=w[0],n[1]=w[1],n[2]=w[2],o.sqDistanceTo(y)<i&&g.sqDistanceTo(M)<i&&a.sqDistanceTo(N)<i||u>CONST.MAX_ITER_NUM)return S<r&&R<r&&U<r;u>=CONST.NORMAL_ITER_NUM&&(Q=S<I-Tol.CALCULATE_EPS2&&R<c-Tol.CALCULATE_EPS2&&U<E-Tol.CALCULATE_EPS2),o=y,g=M,a=N,I=S,c=R,E=U}return I<r&&c<r&&E<r}class CurvedDistanceUtil{static minAtEnds2d(t,e,n,s){const r=[t.getStartPt(),t.getEndPt(),new exports.Vec2,new exports.Vec2],i=[new exports.Vec2,new exports.Vec2,e.getStartPt(),e.getEndPt()],o=new Array(4);o[0]=D.ptToCurve2d(r[0],e,i[0]),o[1]=D.ptToCurve2d(r[1],e,i[1]),o[2]=D.ptToCurve2d(i[2],t,r[2]),o[3]=D.ptToCurve2d(i[3],t,r[3]);let g=o[0],a=0;for(let I=1;I<4;I++)o[I]<g-Tol.PROCESS_LENGTH_EPS&&(g=o[I],a=I);return n&&n.copy(r[a]),s&&s.copy(i[a]),g}static minAtEnds3d(t,e,n,s){const r=[t.getStartPt(),t.getEndPt(),new exports.Vec3,new exports.Vec3],i=[new exports.Vec3,new exports.Vec3,e.getStartPt(),e.getEndPt()],o=new Array(4);o[0]=D.ptToCurve3d(r[0],e,i[0]),o[1]=D.ptToCurve3d(r[1],e,i[1]),o[2]=D.ptToCurve3d(i[2],t,r[2]),o[3]=D.ptToCurve3d(i[3],t,r[3]);let g=o[0],a=0;for(let I=1;I<4;I++)o[I]<g-Tol.PROCESS_LENGTH_EPS&&(g=o[I],a=I);return n&&n.copy(r[a]),s&&s.copy(i[a]),g}static execute(t,e,n,s,r,i=CONST.MAX_INTEGER){let o=[],g=i+1;const a=[];let I=0;for(;I<CONST.MAX_SUBDEVIDE_DEPTH;){if(g<Tol.LENGTH)return g;for(const u of t){const Q=[],p=new Curve3dSegment(u.curve),w=new Curve3dSegment(u.curve);Q.push(p),Q.push(w),CurveSegment.subdivideCurveSegment(u,Q)}for(const u of e){const Q=[],p=new Curve3dSegment(u.curve),w=new Curve3dSegment(u.curve);Q.push(p),Q.push(w),CurveSegment.subdivideCurveSegment(u,Q)}const c=Curve3dSegmentPair.combineCurveSegmentPairs(n,o);if(I>0&&!c)break;const E=this._calCurvSegmentPairsDist(o,a,s,r,g);if(o=o.filter(u=>u.getTwoBoxsMinDistance()<=E),o.length===0||I>3&&a.length===0||Math.abs(E-g)<Tol.LENGTH*100&&a.length!==0)break;Curve3dSegmentPair.refreshCurveSegments(o,t,e),n.splice(0),n.push(...o),g=E,o=[],I++}return g}static _calCurvSegmentPairsDist(t,e,n,s,r=CONST.MAX_INTEGER){let i=r;const o=[];for(const g of t){if(g.getTwoBoxsMinDistance()>i)continue;const a=g.segment1,I=g.segment2,c=a.curve,E=I.curve;if(c.isLine3d()&&E.isLine3d()){const p=new exports.Vec3,w=new exports.Vec3,y=Curve3sDistance.execute(c,E,p,w);y<i&&(i=y,n.copy(p),s.copy(w));continue}const u=[a.range.getMid(),I.range.getMid()];if(this._calcCurvCurvIteration(c,E,u,i)&&a.range.containsPt(u[0])&&I.range.containsPt(u[1])){const p=c.getPtAt(u[0]),w=E.getPtAt(u[1]),y=p.sqDistanceTo(w);if(y<i*i-Tol.LENGTH_2){const M={point1:p,point2:w,sqrDistance:y};e.push(M),i=Math.sqrt(y),n.copy(M.point1),s.copy(M.point2)}}o.push(g)}return t.splice(0),t.push(...o),i}static _calcCurvCurvIteration(t,e,n,s){const r=Tol.LENGTH_2,i=r*1e-4;let o=t.getPtAt(n[0]),g=e.getPtAt(n[1]),a=CONST.MAX_INTEGER,I=g.sqDistanceTo(g);if(a<i)return!0;let c=0,E=!0;for(;(c<CONST.NORMAL_ITER_NUM||E)&&!(c>CONST.MAX_ITER_NUM);c++){a=I;const u=calcNextCurvesIteration(t,e,n);if(u.length===0)return!0;const Q=[n[0]-u[0],n[1]-u[1]];n[0]=t.getRange().clamp(Q[0]),n[1]=e.getRange().clamp(Q[1]);const p=t.getPtAt(n[0]),w=e.getPtAt(n[1]);if(I=p.sqDistanceTo(w),o.sqDistanceTo(p)<r&&g.sqDistanceTo(w)<r)return!(Util.isNearlyEqual(Q[0],t.getStartParam())||Util.isNearlyEqual(Q[0],t.getEndParam())||Util.isNearlyEqual(Q[1],e.getStartParam())||Util.isNearlyEqual(Q[1],t.getEndParam()));c>=CONST.NORMAL_ITER_NUM&&(E=I<a),o=p,g=w}return Math.abs(I-a)<r&&Math.sqrt(I)<s}}class Line2sDistance{static execute(t,e,n,s){if(!t.isParallelTo(e)){const r=t.getDirection(),i=e.getDirection(),o=e.getOrigin().subtracted(t.getOrigin()),g=[[r.x,-i.x],[r.y,-i.y]],a=[o.x,o.y],I=numeric1_2_6Exports.solve(g,a);if(t.getRange().containsPt(I[0])&&e.getRange().containsPt(I[1]))return n&&n.copy(t.getPtAt(I[0])),s&&s.copy(e.getPtAt(I[1])),0}return CurvedDistanceUtil.minAtEnds2d(t,e,n,s)}}class Line2dToArc2dDistance{static execute(t,e,n,s){const r=e.getCenter(),i=e.getRadius(),o=t.getDirection(),g=new exports.Vec2(o.y,-o.x),a=t.getStartPt().subtract(r),I=Math.abs(a.dot(g)),c=t.getParamAt(r),E=t.getPtAt(c),u=e.getParamAt(E);if(Util.isNearlySmallerOrEqual(I,e.getRadius(),Tol.LENGTH)){const Q=Math.sqrt(i*i-I*I),p=c-Q,w=c+Q,y=new exports.Vec2;if(this._IsIntPtInRange(t,e,p,y)||this._IsIntPtInRange(t,e,w,y))return n&&n.copy(y),s&&s.copy(y),0}if(I>e.getRadius()&&t.getRange().containsPt(c)&&e.getRange().containsPt(u)){const Q=I-i;return n&&n.copy(t.getPtAt(c)),s&&s.copy(e.getPtAt(u)),Q}return CurvedDistanceUtil.minAtEnds2d(t,e,n,s)}static _IsIntPtInRange(t,e,n,s){if(t.getRange().containsPt(n)){const r=t.getPtAt(n),i=e.getParamAt(r);return e.getRange().containsPt(i)?(s.copy(r),!0):!1}return!1}}class Arc2sDistance{static execute(t,e,n,s){const r=t.getCenter(),i=e.getCenter(),o=t.getRadius(),g=e.getRadius(),a=r.distanceTo(i);if(a<Tol.LENGTH)return CurvedDistanceUtil.minAtEnds2d(t,e,n,s);let I,c;o>g?(I=t.getParamAt(i),o*o-g*g>a*a?c=e.getParamAt(t.getPtAt(I)):c=e.getParamAt(r)):(c=e.getParamAt(r),g*g-o*o>a*a?I=t.getParamAt(e.getPtAt(c)):I=t.getParamAt(i));const E=new exports.Vec2;if(this._IsIntsectTwoArc2d(t,e,I,c,E))return n&&n.copy(E),s&&s.copy(E),0;if(a>o+g){if(t.getRange().containsPt(I)&&e.getRange().containsPt(c)){const u=Math.abs(a-(o+g));return n&&n.copy(t.getPtAt(I)),s&&s.copy(e.getPtAt(c)),u}}else if(Math.abs(o-g)>a&&t.getRange().containsPt(I)&&e.getRange().containsPt(c)){const u=Math.abs(o-g)-a;return n&&n.copy(t.getPtAt(I)),s&&s.copy(e.getPtAt(c)),u}return CurvedDistanceUtil.minAtEnds2d(t,e,n,s)}static _IsIntsectTwoArc2d(t,e,n,s,r){const i=t.getCenter(),o=e.getCenter(),g=t.getRadius(),a=e.getRadius(),I=i.distanceTo(o);if(Util.isNearlySmallerOrEqual(I,g+a,Tol.LENGTH)&&Util.isNearlyBiggerOrEqual(I,Math.abs(g-a),Tol.LENGTH))if(Util.isNearlyEqual(I,g+a,Tol.LENGTH)||Util.isNearlyEqual(I,Math.abs(g-a),Tol.LENGTH)){if(t.getRange().containsPt(n)&&e.getRange().containsPt(s))return r.copy(t.getPtAt(n)),!0}else{const c=Math.abs(g*g-a*a+I*I)/(2*I),E=Math.acos(c/g),u=n-E,Q=n+E,p=new exports.Vec2;if(this._IsIntPtInRange(t,e,u,p)||this._IsIntPtInRange(t,e,Q,p))return r.copy(p),!0}return!1}static _IsIntPtInRange(t,e,n,s){let r=n;for(;Util.isNearlySmaller(r,t.getRange().min,Tol.LENGTH);)r+=CONST.PI2;for(;Util.isNearlyBigger(r,t.getRange().max,Tol.LENGTH);)r-=CONST.PI2;const i=t.getPtAt(r),o=e.getParamAt(i);return t.getRange().containsPt(r)&&e.getRange().containsPt(o)?(s.copy(i),!0):!1}}class Curve2sDistance{static execute(t,e,n,s){if(t instanceof exports.Ln2&&e instanceof exports.Ln2)return Line2sDistance.execute(t,e,n,s);if(t instanceof exports.Ln2&&e instanceof exports.Arc2)return Line2dToArc2dDistance.execute(t,e,n,s);if(t instanceof exports.Arc2&&t.isEqualAB()&&e instanceof exports.Ln2)return Line2dToArc2dDistance.execute(e,t,s,n);if(t instanceof exports.Arc2&&t.isEqualAB()&&e instanceof exports.Arc2&&e.isEqualAB())return Arc2sDistance.execute(t,e,n,s);throw new Error(`请实现点到曲线距离${t.getType()}${e.getType()}`)}}class D{static ptToCurve2d(t,e,n){const s=PtToCv2Distance.execute(t,e,!1);return n&&n.copy(s.foot),s.distance}static ptToCurve2dSigned(t,e,n){const s=PtToCv2Distance.execute(t,e,!0);return n&&n.copy(s.foot),s.distance}static ptToCurve2dSignedInfo(t,e){return PtToCv2Distance.execute(t,e,!0)}static ptToCurve3d(t,e,n){const s=PtToCurve3Distance.execute(t,e);return n&&n.copy(s.foot),s.distance}static ptToCurve3dInfo(t,e){return PtToCurve3Distance.execute(t,e)}static ptToCurve3dsInfos(t,e,n=Tol.LENGTH){return PtToCurve3Distance.curves(t,e,n)}static ptToSurf(t,e,n){return Math.abs(PtToSurfDistance.execute(t,e,n))}static ptToSurfSigned(t,e,n){return PtToSurfDistance.execute(t,e,n)}static curve2s(t,e,n,s){return Curve2sDistance.execute(t,e,n,s)}static curve3s(t,e,n,s){return Curve3sDistance.execute(t,e,n,s)}}class XInfoUtil{static curvesFromOverlap(t,e,n,s){const r=t.range1.getMid(),i=e.getPtAt(r),o=n.getParamAt(i),g=t.range1.getLength()>s.numberEps,a={point:i,param1:r,param2:o,isOverlap:g};return g&&(a.overlap1=t.range1,a.overlap2=t.range2,a.overlapSameDirection=t.isSameDirection),a}}class LinesX{static line2ds(t,e,n=Tol.DEFAULT){const s=CurvesOverlap.lines(t,e,n);if(s.length>0)return s.map(g=>XInfoUtil.curvesFromOverlap(g,t,e,n));const r=LinesXUtil.line2dsParamed(t.getOrigin(),e.getOrigin(),t.getDirection(),e.getDirection());return!t.getRange().containsPt(r[0],n.lengthEps)||!e.getRange().containsPt(r[1],n.lengthEps)?[]:[{point:t.getPtAt(r[0]),param1:r[0],param2:r[1],isOverlap:!1}]}static line3ds(t,e,n=Tol.DEFAULT){const s=CurvesOverlap.lines(t,e,n);if(s.length>0)return s.map(Q=>XInfoUtil.curvesFromOverlap(Q,t,e,n));const r=t.getDirection(),i=e.getDirection(),o=r.cross(i),g=e.getOrigin().subtracted(t.getOrigin());if(!Util.isNearly0(g.dot(o),n.lengthEps))return[];const a=o.multiplied(-1),I=i.cross(g);let c=I.getLength()/a.getLength();a.dot(I)<0&&(c=-c);const E=t.getPtAt(c);return!t.containsPt(E,n.lengthEps)||!e.containsPt(E,n.lengthEps)?[]:[{point:E,param1:c,param2:e.getParamAt(E),isOverlap:!1}]}}class LineCircleX{static line2dAndArc2d(t,e,n=Tol.DEFAULT){if(!e.isEqualAB())return this._line2dAndEllipse2d(t,e,n);let s=!1;for(const y of[t.getStartParam(),t.getEndParam()])for(const M of[e.getStartParam(),e.getEndParam()])if(t.getPtAt(y).equals(e.getPtAt(M),n.lengthEps)){if(!e.getTangentAt(M).isParallel(t.getTangentAt(y),n.angleEps))return[{point:t.getPtAt(y),param1:y,param2:M,isOverlap:!1}];s=!0;break}const r=e.getCenter(),i=t.getParamAt(r),o=t.getPtAt(i),g=r.distanceTo(o),a=g*g,I=(e.getA()+e.getB())/2,c=n.lengthEps/e.getRadius();if(!s&&Math.abs(g-I)<Tol.LENGTH){const y=e.getParamAt(o);return t.getRange().containsPt(i,n.lengthEps)&&e.getRange().containsPt(y,c)?[{point:o,param1:i,param2:y,isOverlap:!1}]:[]}if(g>I)return[];const E=y=>{const M=t.getPtAt(y),N=e.getParamAt(M);if(e.getRange().containsPt(N,c))return{point:M,param1:y,param2:N,isOverlap:!1}},u=[],Q=Math.sqrt(I*I-a),p=i-Q;if(t.getRange().containsPt(p)){const y=E(p);y&&u.push(y)}const w=i+Q;if(t.getRange().containsPt(w)){const y=E(w);y&&u.push(y)}return u}static line3dAndArc3d(t,e,n=Tol.DEFAULT){if(!e.isEqualAB())return this._line3dAndEllipse3d(t,e,n);const s=e.clone();s.setRange(0,CONST.PI2);const r=this.line3dAndCircle3d(t,s,n),i=n.lengthEps/e.getRadius(),o=r.filter(g=>t.getRange().containsPt(g.param1,n.lengthEps)&&e.getRange().containsPt(g.param2,i));for(const g of o)g.param2=e.getRange().getRegularParam(g.param2);return o}static line3dAndCircle3d(t,e,n=Tol.DEFAULT){const s=new exports.Plane(e.getCoord()),r=e.getNormal().dot(t.getDirection()),i=s.getProjectedPtBy(t.getOrigin()).distanceTo(t.getOrigin());if(Util.isNearly0(r,n.lengthEps)&&!Util.isNearly0(i,n.lengthEps))return[];if(!Util.isNearly0(r,n.lengthEps)){const Q=(t.getOrigin().subtracted(s.getOrigin()).dot(s.getNorm())<0?1:-1)*i/r,p=t.getPtAt(Q);if(e.containsPt(p,n.lengthEps)){const w=e.getParamAt(p);return[{point:p,param1:Q,param2:w,isOverlap:!1}]}return[]}const o=[],g=t.getDirection().dot(t.getDirection()),a=t.getOrigin().subtracted(e.getCenter()),I=2*t.getDirection().dot(a),c=a.dot(a)-e.getRadius()*e.getRadius(),E=I*I-4*g*c;if(Util.isNearly0(E)){const u=-1*I/(2*g),Q=t.getPtAt(u),p=e.getParamAt(Q);o.push({point:Q,param1:u,param2:p,isOverlap:!1})}else{if(E<0)return o;{let u=(-1*I+Math.sqrt(I*I-4*g*c))/(2*g);const Q=t.getPtAt(u);let p=e.getParamAt(Q);o.push({point:Q,param1:u,param2:p,isOverlap:!1}),u=(-1*I-Math.sqrt(I*I-4*g*c))/(2*g);const w=t.getPtAt(u);p=e.getParamAt(w),o.push({point:w,param1:u,param2:p,isOverlap:!1})}}return o}static _line2dAndEllipse2d(t,e,n){const s=e.getCenter();if(t.containsPt(s)){const M=G=>{const O=e.getPtAt(G),H=t.getParamAt(O);if(t.getRange().containsPt(H))return{point:O,param1:H,param2:G,isOverlap:!1}},N=e.getCoord().getDx().angleTo(t.getDirection()),S=Math.atan2(Math.sin(N)/e.getB(),Math.cos(N)/e.getA());let R=e.isCCW()?S:CONST.PI2-S;R=e.getRange().getRegularParam(R);const U=[];if(e.getRange().containsPt(R)){const G=M(R);G&&U.push(G)}const b=R+CONST.PI;if(e.getRange().containsPt(b)){const G=M(b);G&&U.push(G)}return U}const r=e.getCoord(),i=t.getOrigin(),o=t.getDirection(),g=new exports.Ln2(r.getLocalPtAt(i),r.getLocalVectorAt(o),t.getRange().toArray()),a=g.getOrigin(),I=g.getDirection(),c=e.getA()*e.getA(),E=e.getB()*e.getB(),u=I.x*I.x*E+I.y*I.y*c,Q=2*I.x*a.x*E+2*I.y*a.y*c,p=a.x*a.x*E+a.y*a.y*c-c*E;let w=QuadraticEquation.solve(u,Q,p);if(w.length<1)return[];if(w=w.filter(M=>g.getRange().containsPt(M)),w.length<1)return[];const y=[];for(const M of w){const N=g.getPtAt(M),S=r.getWorldPtAt(N),R=e.getParamAt(S);if(!e.getRange().containsPt(R))continue;const U={point:S,param1:M,param2:R,isOverlap:!1};y.push(U)}if(y.length>1){const M=y[0],N=t.getPtAt(M.param1),S=y[1],R=t.getPtAt(S.param1);if(R.sqDistanceTo(N)<n.lengthEps*n.lengthEps){const U=e.getTangentAt(M.param2),b=e.getTangentAt(S.param2);if(U.isSameDirection(b,n.angleEps)){const G=(M.param2+S.param2)/2,O=R.midTo(N);return[{point:O,param1:t.getParamAt(O),param2:G,isOverlap:!1}]}}}return y}static _line3dAndEllipse3d(t,e,n){const s=e.getCoord(),r=new exports.Ln2(s.getLocalPtAt(t.getOrigin()),s.getLocalVectorAt(t.getDirection()),t.getRange().toArray()),i=[],o=new exports.Arc2(exports.Coord2.XOY(),e.getA(),e.getB(),!0,e.getRange().toArray()),g=this._line2dAndEllipse2d(r,o,n);for(const a of g){const I=s.getWorldPtAt(a.point);t.containsPt(I,n.lengthEps)&&i.push({point:I,param1:t.getParamAt(I),param2:a.param2,isOverlap:!1})}for(const a of i)a.param2=e.getRange().getRegularParam(a.param2);return i}}class IntersectCurve3 extends Curve3{constructor(t,e){if(super(),t&&t.length>=2){this._surface=t;const n=[0];if(e){this._ptsChart=e;let s=0;for(let r=1;r<this._ptsChart.length;r++)s+=this._ptsChart[r].point.distanceTo(this._ptsChart[r-1].point),n.push(s);this._domain=new Interval(0,s)}else this._ptsChart=[],n.push(0),this._domain=new Interval(0,0);this._knots=n,this._range=this._domain}}toVerbNurbs(t){throw new Error("Method not implemented.")}updateKonts(){let t=0;const e=[0];for(let n=1;n<this._ptsChart.length;n++)t+=this._ptsChart[n].point.distanceTo(this._ptsChart[n-1].point),e.push(t);this._knots=e,this._domain=new Interval(0,t),this._range=this._domain}getAllPoints(){return this._ptsChart.map(t=>t.point)}getIntersectPtsChart(){return this._ptsChart}getDomain(){return this._domain}isPeriodic(){return!!(this._ptsChart.length>1&&this.getStartPt().equals(this.getEndPt()))}getStartPt(){return this._ptsChart[0].point}getEndPt(){return this._ptsChart[this._ptsChart.length-1].point}getPtAt(t){if(!this._domain.containsPt(t))throw new Error("parameter out domain!");return this.getIntersectPtInfoAt(t).point}getIntersectPtInfoAt(t){if(!this._domain.containsPt(t))throw new Error("parameter out domain!");if(Math.abs(t)<=Tol.LENGTH)return this._ptsChart[0];if(Math.abs(t-this._range.max)<=Tol.LENGTH)return this._ptsChart[this._ptsChart.length-1];let e=0,n=0,s=0;for(let a=1;a<this._ptsChart.length;a++){if(e=n,n+=this._ptsChart[a].point.distanceTo(this._ptsChart[a-1].point),Math.abs(t-n)<=Tol.LENGTH)return this._ptsChart[a];if(t<n){s=a-1;break}}const r=this._ptsChart[s],i=this._ptsChart[s+1],o=(t-e)/(n-e),g=this._getInsertPt(r,i,o);if(g===void 0)throw new Error("计算失败!");return g}getBBox(t){throw new Error("unimplemented")}getTangentAt(t,e=!0){const n=this.getIntersectPtInfoAt(t);return this.getDerivativesAtPt(n,1,e)[1].normalized()}getParamAt(t){const e=this._surface[0].getUVAt(t),n=this._surface[1].getUVAt(t);if(this._surface[0].getPtAt(e).sqDistanceTo(t)<Tol.LENGTH_2&&this._surface[1].getPtAt(n).sqDistanceTo(t)<Tol.LENGTH_2){const g=[];for(let a=0;a<this._ptsChart.length-1;a++){const I=this._ptsChart[a+1].point.sqDistanceTo(this._ptsChart[a].point),c=this._ptsChart[a].point.sqDistanceTo(t),E=this._ptsChart[a+1].point.sqDistanceTo(t);if(c<I&&E<I){const u=this._ptsChart[a].point,Q=this._ptsChart[a+1].point,w=new exports.Ln3(u,Q).getParamAt(t);g.push(this._knots[a]+w)}}if(g.length===1){const a=this.getIntersectPtInfoAt(g[0]);if(a.point.sqDistanceTo(t)<Tol.LENGTH_2)return g[0];const c=this.getDerivativesAtPt(a,1)[1].normalized();if(Math.abs(c.dot(a.point.subtracted(t).normalized()))<Tol.ANGLE)return g[0];throw new Error("反求参数失败")}for(const a of g)if(this.getPtAt(a).sqDistanceTo(t)<Tol.LENGTH_2)return a}const s=[];for(let g=0;g<this._ptsChart.length-1;g++){const a=this._ptsChart[g+1].point.sqDistanceTo(this._ptsChart[g].point),I=this._ptsChart[g].point.sqDistanceTo(t),c=this._ptsChart[g+1].point.sqDistanceTo(t),E=I<=c?I:c;E<a&&s.push({dist:E,index:g})}const r=[];for(const g of s){const a=(this._knots[g.index]+this._knots[g.index+1])/2,I=this.getFootByIterate(t,a);I!==void 0&&r.push(I)}if(r.length===0)throw new Error("反求参数失败");if(r.length===1)return r[0];let i=r[0],o=CONST.MAX_INTEGER;for(const g of r){const I=this.getPtAt(g).sqDistanceTo(t);I<o&&(o=I,i=g)}return i}getKontIndex(t){if(this._ptsChart.length<1)throw new Error("invalid IntersectCurve!");let e=0,n=this._ptsChart[0].point.sqDistanceTo(t);for(let s=1;s<this._ptsChart.length;s++){const r=new exports.Ln3(this._ptsChart[s-1].point,this._ptsChart[s].point),i=r.getParamAt(t);if(r.getRange().containsPt(i,Tol.LENGTH)&&r.getPtAt(i).sqDistanceTo(t)<r.getRange().getLength()*.005)return s-1;const g=this._ptsChart[s].point.sqDistanceTo(t);g<n&&(e=s,n=g)}if(e===0){const s=new exports.Ln3(this._ptsChart[e].point,this._ptsChart[e+1].point),r=s.getParamAt(t),i=s.getRange();return r>i.min-Tol.LENGTH?e:e-1}if(e>0){const s=new exports.Ln3(this._ptsChart[e-1].point,this._ptsChart[e].point),r=s.getParamAt(t),i=s.getRange();return r>i.max+Tol.LENGTH?e:e-1}return e}getDerivatives(t,e){throw new Error("未实现!")}getDerivativesAtPt(t,e,n=!0,s){const r=[];r.push(t.point);const i=this._surface[0],o=this._surface[1];if(e>=1){const g=i.getNormAt(t.uvPara1).normalized(),a=o.getNormAt(t.uvPara2).normalized(),I=g.cross(a),c=Tol.ANGLE*Tol.ANGLE*1e4;if(I.getSqLength()<c){const u=this._getDerivativesAtTangentialPoint(t,e,n,s);return MathAssert.warn(u.length!==e,"intersectCurve: getDerivativesAtTangentialPoint计算失败!"),u}const E=I.normalized();if(s!==void 0&&s.dot(E)<0&&E.reverse(),r.push(E),e>=2){const u=g.dot(a),Q=1-u*u,p=(R,U)=>{const b=R[3].dot(U),G=R[4].dot(U),O=R[5].dot(U),H=R[1].dot(R[1]),z=R[1].dot(R[2]),tA=R[2].dot(R[2]),nA=H*tA-z*z,IA=(R[1].dot(E)*tA-R[2].dot(E)*z)/nA,iA=(R[2].dot(E)*H-R[1].dot(E)*z)/nA;return b*IA*IA+2*G*IA*iA+O*iA*iA},w=i.getDerivatives(t.uvPara1,e),y=o.getDerivatives(t.uvPara2,e),M=p(w,g),N=p(y,a),S=g.multiplied((M-N*u)/Q).add(a.multiplied((N-M*u)/Q));r.push(S)}}return r}getLength(t){throw new Error("unimplemented")}getType(){return EN_GEO_TYPE.INTERSECT_3D}reverse(){this._ptsChart.reverse();const t=this._knots[this._knots.length-1];for(let e=0;e<this._knots.length;e++)this._knots[e]=t-this._knots[e];return this._knots.reverse(),this}split(t,e){throw new Error("unimplemented")}transform(t){for(const e of this._surface)e.transform(t);for(const e of this._ptsChart)e.point.transform(t);return this.updateKonts(),this}toSimpleCurve3d(t=3){const e=[];if(this._ptsChart.map(s=>e.push(s.point)),e.length===2){const s=this.getInsertPt(0,.5,!0);e.splice(1,0,s)}if(e.length===3){const s=e[1].subtracted(e[0]).normalize(),r=e[2].subtracted(e[1]).normalize();if(s.isParallel(r))return new exports.Ln3(e[0],e[2])}if(t>2&&e.length<t+1){const s=t+1-e.length;for(let r=0;r<s;r++){let i=0,o=0;for(let a=0;a<e.length-1;a++){const I=e[a].sqDistanceTo(e[a+1]);I>i&&(i=I,o=a)}const g=this.getInsertPt(o,.5);e.splice(o+1,0,g)}}return exports.NurbsCurve3.makeByInterpolationPts(e,t)}toNurbs(t=3,e=Tol.LENGTH){const n=[];if(this._ptsChart.map(r=>n.push(r.point)),n.length===2){const r=this.getInsertPt(0,.5);n.splice(1,0,r)}if(t>2&&n.length<t+1){const r=t+1-n.length;for(let i=0;i<r;i++){let o=0,g=0;for(let I=0;I<n.length-1;I++){const c=n[I].sqDistanceTo(n[I+1]);c>o&&(o=c,g=I)}const a=this.getInsertPt(g,.5);n.splice(g+1,0,a)}}return exports.NurbsCurve3.makeByInterpolationPts(n,t)}toNurbsBetweenPoints(t=3,e,n,s){const r=[];if(this._ptsChart.map(y=>r.push(y.point)),r.length===2){const y=this.getInsertPt(0,.5);r.splice(1,0,y)}if(r.length===3){const y=r[1].subtracted(r[0]).normalize(),M=r[2].subtracted(r[1]).normalize();if(y.isParallel(M)){const N=new exports.Ln3(e,n);return s&&s.dot(N.getDirection())<0?N.reverse():N}}const i=this.getKontIndex(e)+1,o=this.getKontIndex(n);let[g,a]=[e,n],[I,c]=[i,o];I>c&&([g,a]=[a,g],[I,c]=[c,I]),s&&this._ptsChart[0].point.equals(this._ptsChart[this._ptsChart.length-1].point,Tol.LENGTH)&&(I<this._ptsChart.length-2?this._ptsChart[I].point.subtracted(this._ptsChart[I+1].point):this._ptsChart[I-1].point.subtracted(this._ptsChart[I].point)).dot(s)<0&&([g,a]=[a,g],c=I+this._ptsChart.length);const E=[];for(let y=I+1;y<=c;y++)E.push(this._ptsChart[y%this._ptsChart.length].point);if(E.length===2){const y=this.getInsertPt(I,.5);E.splice(I+1,0,y)}const u=E[0].sqDistanceTo(E[1]);g.sqDistanceTo(E[0])>u/1e4?E.splice(0,0,g):E[0]=g;const Q=E[E.length-1].sqDistanceTo(E[E.length-2]);a.sqDistanceTo(E[E.length-1])>Q/1e4?E.push(a):E[E.length-1]=a;const p=E.length<=t?t-1:t;return exports.NurbsCurve3.makeByInterpolationPts(E,p)}getInsertPt(t,e,n=!1){const s=this._ptsChart[t],r=this._ptsChart[t+1],i=this._getInsertPt(s,r,e);return i!==void 0?(n&&this._ptsChart.splice(t+1,0,i),i.point):s.point.multiplied(1-e).add(r.point.multiplied(e))}insertPt(t,e){const n=this._ptsChart[t],s=this._ptsChart[t+1],r=this._getInsertPt(n,s,e);return r===void 0?!1:(this._ptsChart.splice(t+1,0,r),!0)}clone(){const t=[...this._surface],e=[];for(const s of this._ptsChart){const r={point:s.point.clone(),uvPara1:{x:s.uvPara1.x,y:s.uvPara1.y},uvPara2:{x:s.uvPara2.x,y:s.uvPara2.y},isSingularity:s.isSingularity};e.push(r)}return new IntersectCurve3(t,e)}dump(){return this.toSimpleCurve3d().dump()}load(){return this}_getDerivativesAtTangentialPoint(t,e,n=!0,s){const r=[];r.push(t.point);const i=this._surface[0],o=this._surface[1],g=i.getNormAt(t.uvPara1).normalized(),a=o.getNormAt(t.uvPara2).normalized(),I=(W,oA)=>{const hA=W[3].dot(oA),dA=W[4].dot(oA),PA=W[5].dot(oA);return{L:hA,M:dA,N:PA}},c=i.getDerivatives(t.uvPara1,e+1),E=o.getDerivatives(t.uvPara2,e+1),u=I(c,g),Q=I(E,a),p=g,w=1/E[1].cross(E[2]).dot(p),y=c[1].cross(E[2]),M=c[2].cross(E[2]),N=E[1].cross(c[1]),S=E[1].cross(c[2]),R=y.dot(p)*w,U=M.dot(p)*w,b=N.dot(p)*w,G=S.dot(p)*w,O=R*R*Q.L+2*R*b*Q.M+b*b*Q.N-u.L,H=R*U*Q.L+(R*G+U*b)*Q.M+b*G*Q.N-u.M,z=U*U*Q.L+2*U*G*Q.M+G*G*Q.N-u.N;let tA,nA,IA;const iA=Tol.NUMBER_CALC_EPS;if(Math.abs(O)<=iA)if(Math.abs(H)>iA){const W=-z/(2*H),oA=c[1].multiplied(W).add(c[2]);nA=1/oA.getLength(),tA=W*nA,IA=oA.normalized()}else if(Math.abs(z)>iA){const W=-(2*H)/z,oA=c[1].added(c[2].multiplied(W));tA=1/oA.getLength(),nA=W*tA,IA=oA.normalized()}else{const W=c[1].equals(E[1]),oA=c[2].equals(E[2]);if(oA&&!W)nA=1/c[2].getLength(),tA=0,IA=c[2].normalized();else if(W&&!oA)tA=1/c[1].getLength(),nA=0,IA=c[1].normalized();else return MathAssert.warn("getDerivativesAtTangentialPoint: 高阶相切,不能用此方法计算切线"),r}else{const W=QuadraticEquation.solve(O,2*H,z,iA);if(W.length===0)return MathAssert.warn("getDerivativesAtTangentialPoint: 曲面相切,只有一个孤立的切点,没有切向和曲率"),r;if(W.length===1){const oA=W[0],hA=c[1].multiplied(oA).add(c[2]);nA=1/hA.getLength(),tA=oA*nA,IA=hA.normalized()}else{const oA=c[1].multiplied(W[0]).add(c[2]),hA=c[1].multiplied(W[1]).add(c[2]);if(s){let dA=s.angle(oA);dA=dA>CONST.PI_2?CONST.PI-dA:dA;let PA=s.angle(hA);PA=PA>CONST.PI_2?CONST.PI-PA:PA,PA<dA?(nA=1/hA.getLength(),tA=W[1]*nA,IA=hA.normalized()):(nA=1/oA.getLength(),tA=W[0]*nA,IA=oA.normalized())}else nA=1/oA.getLength(),IA=oA.normalized(),tA=W[0]*nA}}if(s!==void 0&&s.dot(IA)<0&&IA.reverse(),r.push(IA),tA=Math.abs(tA)<Tol.ZERO_JUDGE_EPS?0:tA,nA=Math.abs(nA)<Tol.ZERO_JUDGE_EPS?0:nA,e>=2){const W=R*tA+U*nA,oA=b*tA+G*nA,hA=tA*tA,dA=nA*nA,PA=W*W,yA=oA*oA,_A=c[3].multiplied(hA).add(c[4].multiplied(2*tA*nA)).add(c[5].multiplied(dA)),BA=E[3].multiplied(PA).add(E[4].multiplied(2*W*oA)).add(E[5].multiplied(yA)).subtracted(_A),lA=BA.cross(E[2]).dot(p)*w,aA=E[1].cross(BA).dot(p)*w,wA=c[6].dot(g)*hA*tA+3*c[7].dot(g)*hA*nA+3*c[8].dot(g)*tA*dA+c[9].dot(g)*nA*dA,YA=E[6].dot(a)*PA*W+3*E[7].dot(a)*PA*oA+3*E[8].dot(a)*W*yA+E[9].dot(a)*oA*yA,DA=u.L*tA,UA=u.M*tA,XA=u.M*nA,bA=u.N*nA,nt=Q.L*W,It=Q.M*W,St=Q.M*oA,gt=Q.N*oA,it=nt*R+It*b+St*R+gt*b-DA-XA,Nt=nt*U+It*G+St*U+gt*G-UA-bA,Pt=nt*lA+It*aA+St*lA+gt*aA+YA/3-wA/3,se=c[1].dot(IA),Tt=c[2].dot(IA),Ft=c[3].dot(IA)*hA+2*c[4].dot(IA)*tA*nA+c[5].dot(IA)*dA,jt=[[it,Nt],[se,Tt]],re=[-Pt,-Ft],Kt=LinearSystem.execute(jt,re);if(Kt===void 0)return r;const ue=_A.added(c[1].multiplied(Kt[0])).added(c[2].multiplied(Kt[1]));r.push(ue)}return r}_getInsertPt(t,e,n,s=Tol.DEFAULT){const r=this._surface[0],i=this._surface[1],o={x:t.uvPara1.x*(1-n)+e.uvPara1.x*n,y:t.uvPara1.y*(1-n)+e.uvPara1.y*n},g={x:t.uvPara2.x*(1-n)+e.uvPara2.x*n,y:t.uvPara2.y*(1-n)+e.uvPara2.y*n},a=new exports.Vec3(t.point.x*(1-n)+e.point.x*n,t.point.y*(1-n)+e.point.y*n,t.point.z*(1-n)+e.point.z*n),I=t.point.subtracted(e.point),c=new exports.Plane(a,I),u=[o,g,{x:0,y:0}],Q=threeSurfacesIteration(this._surface[0],this._surface[1],c,u,s.lengthEps);let p;if(Q&&r.getDomainU().containsPt(u[0].x)&&r.getDomainV().containsPt(u[0].y)&&i.getDomainU().containsPt(u[1].x)&&i.getDomainV().containsPt(u[1].y)&&(p=c.getPtAt(u[2]),p.sqDistanceTo(a)<.01))return{point:p,uvPara1:u[0],uvPara2:u[1]};const w=[o,g],y=n<.5?t.point:e.point;if(surfaceSurfaceIteration(this._surface[0],this._surface[1],w,s.lengthEps)&&r.getDomainU().containsPt(w[0].x)&&r.getDomainV().containsPt(w[0].y)&&i.getDomainU().containsPt(w[1].x)&&i.getDomainV().containsPt(w[1].y)){const S=r.getPtAt(w[0]);if(p&&p.sqDistanceTo(a)<S.sqDistanceTo(a))return{point:p,uvPara1:u[0],uvPara2:u[1]};if(S.sqDistanceTo(y)<t.point.sqDistanceTo(e.point))return{point:S,uvPara1:w[0],uvPara2:w[1]}}if(surfaceSurfaceIteration(this._surface[0],this._surface[1],w,s.lengthEps,!1)&&r.getDomainU().containsPt(w[0].x)&&r.getDomainV().containsPt(w[0].y)&&i.getDomainU().containsPt(w[1].x)&&i.getDomainV().containsPt(w[1].y)){const S=r.getPtAt(w[0]);if(p&&p.sqDistanceTo(a)<S.sqDistanceTo(a))return{point:p,uvPara1:u[0],uvPara2:u[1]};if(S.sqDistanceTo(y)<t.point.sqDistanceTo(e.point))return{point:S,uvPara1:w[0],uvPara2:w[1]}}}}class CurvesPJ{static execute(t,e,n=Tol.LENGTH,s=Tol.ANGLE){if(t.isNurbsCurve()||e.isNurbsCurve())return CurvesPJType.NOT_INTERSECT;function r(g){return!(!g.isArc()&&!g.isLine()&&!g.isOffsetCurve())}if(!r(t)||!r(e))return console.error("曲线位置关系判断暂时返回-1,请添加该方法"),-1;const i=new Tol(n,s);let o;if(t instanceof Curve2&&e instanceof Curve2)o=CurvesX.curve2ds(t,e,i);else if(t instanceof Curve3&&e instanceof Curve3)o=CurvesX.curve3ds(t,e,i);else throw new Error("unknown curve type");return o.length<1?CurvesPJType.NOT_INTERSECT:o.some(g=>g.isOverlap)?o.length===1&&o[0].overlap1?.equals(t.getRange())&&o[0].overlap2?.equals(e.getRange())?CurvesPJType.TOTALLY_OVERLAP:CurvesPJType.OVERLAP:o.some(g=>!t.getRange().containsPtAtStartOrEnd(g.param1,n)||!e.getRange().containsPtAtStartOrEnd(g.param2,n))?CurvesPJType.INTERSECT_IN:CurvesPJType.INTERSECT_ON}}class LoopCentroid{static centroidOfPoints(t,e=Tol.NUMBER){let n=0,s=0,r=0;const i=t.length;for(let g=i-1,a=0;a<i;g=a++){const I=t[g].x*t[a].y-t[a].x*t[g].y;n+=I,s+=(t[g].x+t[a].x)*I,r+=(t[g].y+t[a].y)*I}if(Util.isNearlyEqual(n,0,e))return new exports.Vec2(s,r);const o=3*n;return s/=o,r/=o,new exports.Vec2(s,r)}static centroidOfLoop(t,e=Tol.LENGTH){if(!t.length)return new exports.Vec2;let n=0,s=0,r=0;const i=t[0].getStartPt(),o={x:i.x,y:i.y};for(const g of t){const a=this._integralForCurve2d(g,o);s+=a.x,r+=a.y,n+=a.area}return Math.abs(n)<e?t[0].getStartPt():(s/=n,r/=n,new exports.Vec2(s,r).add(o))}static centroidOfPoint3ds(t,e=Tol.LENGTH){return LoopCentroid.centroidInfoOfPoint3ds(t,e).centroid}static centroidInfoOfPoint3ds(t,e=Tol.LENGTH){const n=exports.Vec3.O(),s=exports.Vec3.O(),r=exports.Vec3.O(),i=exports.Vec3.O(),o=(p,w)=>{const y=t[p],M=t[w],N=new exports.Vec3(y).cross(M);n.add(N),s.add(N.multiplied(y.x+M.x)),r.add(N.multiplied(y.y+M.y)),i.add(N.multiplied(y.z+M.z))};o(t.length-1,0);for(let p=1;p<t.length;p++)o(p-1,p);const g=n.getLength();if(g<e){const p=new exports.Vec3(t[0],t[1]).cross(new exports.Vec3(t[1],t[2]));return{centroid:new exports.Vec3(t[0]),area:0,areaNormal:p}}const a=n.multiplied(1/g),I=new exports.Coord3(exports.Vec3.O(),a),c=a.multiplied(1/(g*3)),E=new exports.Vec3(s.dot(c),r.dot(c),i.dot(c)),u=I.getLocalVectorAt(E);return u.z*=1.5,{centroid:I.getWorldVectorAt(u),area:g*.5,areaNormal:a}}static centroidOfCurve3ds(t,e=DiscreteParam.HIGH,n=Tol.LENGTH){return LoopCentroid.centroidInfoOfCurve3ds(t,e,n).centroid}static centroidInfoOfCurve3ds(t,e=DiscreteParam.HIGH,n=Tol.LENGTH){const s=[];for(const r of t)s.push(...r.discrete(e));return LoopCentroid.centroidInfoOfPoint3ds(s,n)}static _integralForCurve2d(t,e){if(t instanceof exports.Ln2)return this._integralForLine2d(t.getStartPt(),t.getEndPt(),e);if(t instanceof exports.Arc2)return this._integralForArc2d(t,e);const n=t.discrete(DiscreteParam.CALCULATE);return LoopCentroid._integralForPoints(n,e)}static _integralForLine2d(t,e,n){const s=t.x-n.x,r=t.y-n.y,i=e.x-n.x,o=e.y-n.y,g=(s*o-r*i)/2;return{area:g,x:(s+i)*g/3,y:(r+o)*g/3}}static _integralForPoints(t,e){let n=0,s=0,r=0;for(let i=1;i<t.length;i++){const o=this._integralForLine2d(t[i-1],t[i],e);s+=o.x,r+=o.y,n+=o.area}return{x:s,y:r,area:n}}static _integralForArc2d(t,e){const n=t.getRange(),s=n.getLength()/2,r=t.getA(),i=t.getB(),o=Math.sin(s)*2/(s*3),g=n.getMid(),a=t.isCCW()?1:-1,I=Math.cos(g)*o*r,c=Math.sin(g)*o*i*a,E=t.getCoord().getWorldPtAt({x:I,y:c}).subtract(e),u=r*i*s*(t.isCCW()?1:-1),Q=LoopCentroid._integralForPoints([t.getStartPt(),t.getCenter(),t.getEndPt()],e);return Q.x+=E.x*u,Q.y+=E.y*u,Q.area+=u,Q}}class Geometry2d extends GeoElement{translate(t){const e=exports.Matrix3.makeTranslate(t);return this.transform(e)}rotate(t,e){const n=exports.Matrix3.makeRotate(e,t);return this.transform(n)}scale(t,e){const n=exports.Matrix3.makeScale(e,t);return this.transform(n)}}var __getOwnPropDesc$a=Object.getOwnPropertyDescriptor,__decorateClass$a=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$a(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.PolyCurve=class extends Geometry2d{constructor(t){if(super(),this._curves=[],t&&t.length>0)if(t[0]instanceof Curve2)t.forEach(e=>this.addCurve(e));else for(let e=0;e<t.length-1;e++)new exports.Vec2(t[e]).equals(t[(e+1)%t.length])||this.addCurve(new exports.Ln2(t[e],t[e+1]))}addCurve(t){return this._curves.push(t),t}offset(t){return this.getAllCurves().forEach(e=>{e.offset(t)}),this.makeStartEndConnected(),!0}makeStartEndConnected(t=!1){for(let e=0;e<this._curves.length-1;++e){const n=this._curves[e],s=this._curves[e+1];n.getEndPt().equals(s.getEndPt())&&s.reverse()}return this}insertCurve(t,...e){this._curves.splice(t,0,...e)}deleteByArrayIdx(t){return!!this._curves.splice(t,1).length}copyAllCurves(){return this._curves.map(t=>t.clone())}getAllCurves(){return[...this._curves]}clear(){this._curves.splice(0)}isEmpty(){return!this._curves.length}isAnticlockwise(){return this.calcArea()>0}reverse(){for(const t of this._curves)t.reverse();return this._curves.reverse(),this}calcArea(){const{length:t}=this._curves;return t?LoopArea.areaOfLoop(this._curves):0}isValid(t=new Tol){const{length:e}=this._curves;if(!GeomUtil.curvesConnected(this._curves,t.edgeLengthEps))return!1;for(let n=0;n<e;n++){const s=this._curves[n];for(let r=n+1;r<e;r++){const i=this._curves[r],o=CurvesPJ.execute(s,i,t.edgeLengthEps,t.angleEps);if(o!==CurvesPJType.INTERSECT_ON&&o!==CurvesPJType.NOT_INTERSECT)return!1}}return!0}isOnlyLines(){return!this._curves.find(t=>t.getType()!==EN_GEO_TYPE.LN_2)}translate(t){return this._curves.forEach(e=>e.translate(t)),this}rotate(t,e){return this._curves.forEach(n=>n.rotate(t,e)),this}scale(t,e=exports.Vec2.O()){return this._curves.forEach(n=>n.scale(t,e)),this}transform(t){return this._curves.forEach(e=>e.transform(t)),isMirror(t)&&this.reverse(),this}reversed(){return this.clone().reverse()}transformed(t){return this.clone().transform(t)}getBBox(){const t=new Box2;return this._curves.forEach(e=>t.union(e.getBBox())),t}toPath(){const t=this._curves.map(e=>e.getStartPt());return t.push(this._curves[this._curves.length-1].getEndPt()),t}getCentroidPoint(){const t=this.getAllCurves();return LoopCentroid.centroidOfLoop(t)}getType(){return EN_GEO_TYPE.POLY_CURVE}clone(){const t=super.clone();return t._curves.forEach((e,n)=>e.userData=this._curves[n].userData),t}dump(){return{type:this.getType(),data:this._curves.map(t=>t.dump())}}load({data:t}){return this._curves=t.map(e=>Loader.load(e)),this}};exports.PolyCurve=__decorateClass$a([registerGeo],exports.PolyCurve);var __getOwnPropDesc$9=Object.getOwnPropertyDescriptor,__decorateClass$9=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$9(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Loop=class extends exports.PolyCurve{static createByRectangle(t,e){let n,s,r,i;t.x>e.x?(n=e.x,r=t.x):(n=t.x,r=e.x),t.y>e.y?(s=e.y,i=t.y):(s=t.y,i=e.y);const o=[new exports.Vec2(n,s),new exports.Vec2(r,s),new exports.Vec2(r,i),new exports.Vec2(n,i)];return new exports.Loop(o)}constructor(t){if(super(),t&&t.length>0)if(t[0]instanceof Curve2)t.forEach(e=>this.addCurve(e));else for(let e=0;e<t.length;e++)new exports.Vec2(t[e]).equals(t[(e+1)%t.length])||this.addCurve(new exports.Ln2(t[e],t[(e+1)%t.length]))}isClosed(t=new Tol){const e=this._curves,n=e.length;for(let s=0;s<n;s++){const r=s-1<0?s-1+n:s-1;if(!e[s].getStartPt().equals(e[r].getEndPt(),t.lengthEps))return!1}return!0}isValid(t=new Tol){if(!super.isValid(t))return!1;const{length:e}=this._curves;return e<=0?!1:this._curves[0].getStartPt().equals(this._curves[this._curves.length-1].getEndPt(),t.edgeLengthEps)}toPath(t=DiscreteParam.NORMAL){const e=[];return this._curves.forEach(n=>{if(n.isLine2d())e.push(n.getStartPt());else{const s=n.discrete(t);s.pop(),e.push(...s)}}),e}getAllPoints(){const t=[];return this._curves.forEach(e=>{t.push(e.getStartPt())}),t}getType(){return EN_GEO_TYPE.LOOP}dump(){return super.dump()}load(t){return super.load(t)}clone(){return super.clone()}makeStartEndConnected(){return super.makeStartEndConnected(!0),this}};exports.Loop=__decorateClass$9([registerGeo],exports.Loop);var __getOwnPropDesc$8=Object.getOwnPropertyDescriptor,__decorateClass$8=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$8(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.Polygon=class extends Geometry2d{constructor(t){if(super(),this.loops=[],!!t&&(t instanceof exports.Loop&&this.addLoop(t),t instanceof Array&&t.length>0)){if(t[0]instanceof Array){const e=t.map(n=>new exports.Loop(n));this._sortLoopByArea(e),e.forEach(n=>this.addLoop(n,!1));return}if(t[0]instanceof exports.Loop){const e=[...t];this._sortLoopByArea(e),e.forEach(n=>this.addLoop(n,!1));return}typeof t[0]=="object"&&t[0].x!==void 0&&typeof t[0].x=="number"&&t[0].y!==void 0&&typeof t[0].y=="number"&&this.addLoop(new exports.Loop(t))}}static createByRectangle(t,e){return new exports.Polygon(exports.Loop.createByRectangle(t,e))}static fromPolygonEx(t){const e=[];t.forEach(s=>{e.push(...s.getLoops())});const n=new exports.Polygon;return e.forEach(s=>n.addLoop(s,!1)),n}getLoops(){return this.loops}isEmpty(){return this.loops.length<1}reverse(){return this.loops.forEach(t=>{t.reverse()}),this}isOnlyLines(){for(const t of this.loops)if(!t.isOnlyLines())return!1;return!0}isValid(t=new Tol){if(this.loops.length<1)return!0;for(const n of this.loops)if(!n.isValid(t))return!1;if(this.loops.length===1)return!!this.loops[0].isAnticlockwise();const e=this.loops.map(n=>n.getBBox());for(let n=0;n<this.loops.length;n++)for(let s=n+1;s<this.loops.length;s++){const r=this.loops[n],i=this.loops[s];if(e[n].intersectsBox(e[s])){for(const o of r.getAllCurves())for(const g of i.getAllCurves())if(CurvesX.curve2ds(o,g,t).length)return!1}}return!0}addLoop(t,e=!0){return this.loops.push(t),e&&this._sortLoopByArea(this.loops),!0}makeStartEndConnected(){this.getLoops().forEach(t=>t.makeStartEndConnected())}deleteAllLoops(){return this.loops.splice(0,this.loops.length),!0}copyAllCurves(){const t=[];return this.loops.forEach(e=>{t.push(...e.copyAllCurves())}),t}getAllCurves(){const t=[];return this.loops.forEach(e=>{t.push(...e.getAllCurves())}),t}calcArea(){let t=0;for(const e of this.loops)t+=e.calcArea();return t}getType(){return EN_GEO_TYPE.POLYGON}translate(t){return this.loops.forEach(e=>e.translate(t)),this}rotate(t,e){return this.loops.forEach(n=>n.rotate(t,e)),this}scale(t,e=exports.Vec2.O()){return this.loops.forEach(n=>n.scale(t,e)),this}transform(t){return this.loops.forEach(e=>e.transform(t)),this}reversed(){return this.clone().reverse()}transformed(t){return this.clone().transform(t)}getBBox(){const t=new Box2;for(const e of this.loops){const n=e.getBBox();t.union(n)}return t}toPaths(){return this.getLoops().map(t=>t.toPath())}dump(){return{type:this.getType(),data:this.loops.map(t=>t.dump())}}load({data:t}){return t.map(n=>new exports.Loop().load(n)).forEach(n=>this.addLoop(n,!1)),this}clone(){const t=super.clone();return t.loops.forEach((e,n)=>e.userData=this.loops[n].userData),t}getCentroidPoint(){const t=this.getAllCurves();return LoopCentroid.centroidOfLoop(t)}_sortLoopByArea(t){const e=t.map(n=>({area:n.calcArea(),loop:n})).sort((n,s)=>s.area-n.area);for(let n=0;n<e.length;n++)t[n]=e[n].loop}};exports.Polygon=__decorateClass$8([registerGeo],exports.Polygon);class PtLoopPJ{static execute(t,e,n=Tol.LENGTH){const s=new Tol(n);MathError.mutedWarn(e.isClosed(s),"PtLoopPJ: loop不封闭!!!!!!");const r=e.getAllCurves(),i=r.length;if(i<1)return{type:PtLoopPJType.OUT};for(let Q=0;Q<i;++Q){const p=r[Q],w=p.getStartPt();if(t.equals(w,n))return{type:PtLoopPJType.ONVERTEX,curve:p}}const o=t.x,g=t.y;let a=0,I,c=[];const E=r[0].getStartPt();if(Util.isNearlyEqual(E.y,g,n)&&Util.isNearlyBigger(E.x,o,n)){let Q=i-1;for(I=r[Q];I instanceof exports.Ln2&&Math.abs(I.getDirection().y)<n;)Q--,I=r[Q];if(I===void 0)return this._dealHorizontalLineLoop(t,e,n);const p=new exports.Ln2(t,exports.Vec2.X(),Interval.infinitArray());c=CurvesX.curve2ds(p,I,s),c.sort((y,M)=>y.param2-M.param2),a=this._getRefPt(I,c,!1,n).y-t.y}let u=0;for(let Q=0;Q<i;++Q){const p=r[Q],w=p.getStartPt(),y=p.getEndPt();if(p instanceof exports.Ln2){if(Util.isNearlyEqual(w.y,g,n)&&Util.isNearlyEqual(y.y,g,n)){if(Util.isNearlySmaller(y.x,o,n)===Util.isNearlyBigger(w.x,o,n))return{type:PtLoopPJType.ONEDGE,curve:p};continue}if(new Interval(w.y,y.y,!0).containsPt(g,n)){const N=(g-p.getOrigin().y)/p.getDirection().y;if(p.getRange().containsPt(N,n)){const S=p.getOrigin().x+N*p.getDirection().x;if(Util.isNearlyEqual(S,o,n)||p.containsPt(t,n))return{type:PtLoopPJType.ONEDGE,curve:p};Util.isNearlyBigger(S,o,n)&&(Util.isNearlyEqual(w.y,g,n)?u=(y.y-g)*a<0?u+1:u:Util.isNearlyEqual(y.y,g,n)?a=w.y-g:u++)}else Util.isNearlyEqual(y.y,g,n)&&(a=w.y-g)}}else{let M;if(p===I)M=c;else{const N=new exports.Ln2(t,exports.Vec2.X(),Interval.infinitArray());M=CurvesX.curve2ds(N,p,s),M.sort((S,R)=>S.param2-R.param2)}for(let N=0;N<M.length;N++){const S=M[N];if(!(S.param1<-n)){if(Util.isNearlyEqual(S.param1,0,n)||p.containsPt(t,n))return{type:PtLoopPJType.ONEDGE,curve:p};if(Util.isNearlyEqual(S.param2,p.getStartParam(),n))u=(this._getRefPt(p,M,!0,n).y-t.y)*a<0?u+1:u;else if(Util.isNearlyEqual(S.param2,p.getEndParam(),n))a=this._getRefPt(p,M,!1,n).y-t.y;else{const R=p.getTangentAt(S.param2);if(Math.abs(R.y)<n){let U;N-1<0?U=p.getStartParam():U=M[N-1].param2;const G=p.getPtAt((S.param2+U)/2).y-t.y;let O;N+1>M.length-1?O=p.getStartParam():O=M[N+1].param2;const z=p.getPtAt((S.param2+O)/2).y-t.y;if(G*z>0)continue}u++}}}}}return{type:u%2}}static _dealHorizontalLineLoop(t,e,n=Tol.LENGTH){const s=t.x;for(const r of e.getAllCurves())return Util.isNearlyEqual(r.getStartPt().x,s,n)?{type:PtLoopPJType.ONVERTEX,curve:r}:Util.isNearlyBigger(r.getStartPt().x,s,n)===Util.isNearlySmaller(r.getEndPt().x,s,n)?{type:PtLoopPJType.ONEDGE,curve:r}:{type:PtLoopPJType.OUT};return{type:PtLoopPJType.OUT}}static _getRefPt(t,e,n,s=Tol.LENGTH){let r;if(e.length<2)r=n?t.getEndParam():t.getStartParam();else{const i=n?t.getStartParam():t.getEndParam();let o;t.getStartPt().equals(t.getEndPt(),s)?Math.abs(t.getStartParam()-e[0].param2)<s?o=n?e[1].param2:e[e.length-1].param2:o=n?e[0].param2:e[e.length-2].param2:o=n?e[1].param2:e[e.length-2].param2,r=(o+i)/2}return t.getPtAt(r)}}class PtPolygonPJ{static execute(t,e,n=Tol.LENGTH){const s=e.getBBox();if(!s.isValid()||!s.containsPt(t,n))return PtLoopPJType.OUT;const r=PtLoopPJ.execute(t,e.getLoops()[0],n);if(r.type===PtLoopPJType.ONEDGE||r.type===PtLoopPJType.ONVERTEX)return r.type;const i=e.getLoops();for(let o=1;o<i.length;o++){const g=PtLoopPJ.execute(t,i[o],n);if(g.type===PtLoopPJType.ONEDGE||g.type===PtLoopPJType.ONVERTEX)return g.type;if(g.type===PtLoopPJType.IN)return PtLoopPJType.OUT}return r.type}}var __getOwnPropDesc$7=Object.getOwnPropertyDescriptor,__decorateClass$7=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$7(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};exports.TrimmedSurface=class extends Surface{constructor(t,e,n,s){super(),this._bPositive=!0,!(!t||!e||n===void 0)&&(this._surface=t,this._uvPolygon=e,this._bPositive=n,this._loops=s||this._uvPolygon.getLoops().map(r=>r.getAllCurves().map(i=>this._surface.getCurve3d(i))))}static createPlane(t,e,n){const s=[[-1,-1],[1,-1],[1,1],[-1,1]],r=n||e,i=s.map(o=>({x:o[0]*e,y:o[1]*r}));return new exports.TrimmedSurface(new exports.Plane(t),new exports.Polygon(i),!0)}static createByRangeUV(t,e,n,s=!0){const r=[new exports.Vec2(e.min,n.min),new exports.Vec2(e.max,n.min),new exports.Vec2(e.max,n.max),new exports.Vec2(e.min,n.max)],i=new exports.Polygon(new exports.Loop(r));return new exports.TrimmedSurface(t,i,s)}static createByBoundary2d(t,e,n){const s=e.map(o=>o.map(g=>t.getCurve3d(g))),r=new exports.Polygon(e.map(o=>new exports.Loop(o)));return new exports.TrimmedSurface(t,r,n,s)}static createByBoundary3d(t,e,n){if(t instanceof exports.Plane||t instanceof exports.Cylinder){const s=e.map(i=>new exports.Loop(t.wireToUV(i).loop));return new exports.TrimmedSurface(t,new exports.Polygon(s),n,e)}throw new Error("not implemented")}getSurface(){return this._surface}getSameDirWithSurface(){return this._bPositive}getUVPolygon(){return this._uvPolygon}getLoops(){return this._loops}reverse(){return this._bPositive=!this._bPositive,this}getPtAt(t){return this._surface.getPtAt(t)}getNormAt(t){return this._surface.getNormAt(t).multiply(this._bPositive?1:-1)}getDerivatives(t,e=1){return this._surface.getDerivatives(t,e)}getUVAt(t){return this._surface.getUVAt(t)}containsPt(t,e=Tol.LENGTH){if(!this._surface.containsPt(t,e))return!1;const n=this._surface.getUVAt(t);return PtPolygonPJ.execute(n,this._uvPolygon,e)!==PtLoopPJType.OUT}containsCurve(t,e=Tol.LENGTH){if(!this._surface.containsCurve(t,e)||!this.getCurve2d(t))return!1;throw new Error("not implemented")}getDomainU(){return this._surface.getDomainU()}getDomainV(){return this._surface.getDomainV()}getIsoCurve(t,e){return this._surface.getIsoCurve(t,e)}getCurve2d(t){return this._surface.getCurve2d(t)}getCurve3d(t){return this._surface.getCurve3d(t)}getBBox(){const t=new Box3;if(this._loops.length<1)return t;for(const e of this._loops[0])t.union(e.getBBox());return t}isCoplanar(t,e){return this._surface.isCoplanar(t,e)}transform(t,e){return this._surface.transform(t,e),this._loops.forEach(n=>n.forEach(s=>s.transform(t,{svd:e?.svd}))),this._updateUvs(),this}transformed(t,e){return this.clone().transform(t,e)}clone(){const t=this._loops.map(n=>n.map(s=>s.clone())),e=new exports.TrimmedSurface(this._surface.clone(),this._uvPolygon.clone(),this._bPositive,t);return e.userData=this.userData,e}getType(){return EN_GEO_TYPE.TRIM}dump(){return{type:this.getType(),data:[this._surface.dump(),this._bPositive,this._uvPolygon.dump()]}}load({data:[t,e,n]}){return this._surface=Loader.load(t),this._bPositive=e,this._uvPolygon=Loader.load(n),this._loops=this._uvPolygon.getLoops().map(s=>s.getAllCurves().map(r=>this.getCurve3d(r))),this}tessellate(t=DiscreteParam.NORMAL,e=Tol.DEFAULT){return{mesh:this.discrete(t,e)}}discrete(t=DiscreteParam.NORMAL,e=Tol.DEFAULT){const s=this._uvPolygon.getLoops().map(i=>i.getAllCurves().map(o=>({pCurve:o})));return DiscreteUtil.discreteSurface(this._surface,s,this._bPositive,t,e)}_updateUvs(){this._uvPolygon=new exports.Polygon(this._loops.map(t=>new exports.Loop(this._surface.wireToUV(t).loop)))}};exports.TrimmedSurface=__decorateClass$7([registerGeo],exports.TrimmedSurface);class TiltBox3 extends Box3{constructor(t,e){super(),this.min=t.min,this.max=t.max,this.coord=e}getCoord(){return this.coord.clone()}getBox(){return new Box3([this.min,this.max])}getCornerPts(){const t=[],e=this.coord;for(const n of this.getBox().getCornerPts()){const s=e.getWorldPtAt(n);t.push(s)}return t}union(t){if(!t.isValid())return this;const e=t.getCornerPts();for(const n of e){const s=this.coord.getLocalPtAt(n);this.expandByPoint(s)}return this}}function boxToTrimmedSurfaces(l){const t=(l.max.x-l.min.x)/2,e=(l.max.y-l.min.y)/2,n=(l.max.z-l.min.z)/2,s=l.getCenter(),r=s.translated(exports.Vec3.Z().multiplied(n)),i=new exports.Coord3(r,exports.Vec3.X(),exports.Vec3.Y()),o=exports.TrimmedSurface.createPlane(i,t,e),g=s.translated(exports.Vec3.Z().multiplied(-n)),a=new exports.Coord3(g,exports.Vec3.X(),exports.Vec3.Y().reversed()),I=exports.TrimmedSurface.createPlane(a,t,e),c=s.translated(exports.Vec3.X().multiplied(t)),E=new exports.Coord3(c,exports.Vec3.Y(),exports.Vec3.Z()),u=exports.TrimmedSurface.createPlane(E,e,n),Q=s.translated(exports.Vec3.X().multiplied(-t)),p=new exports.Coord3(Q,exports.Vec3.Y().reversed(),exports.Vec3.Z()),w=exports.TrimmedSurface.createPlane(p,e,n),y=s.translated(exports.Vec3.Y().multiplied(e)),M=new exports.Coord3(y,exports.Vec3.X().reversed(),exports.Vec3.Z()),N=exports.TrimmedSurface.createPlane(M,t,n),S=s.translated(exports.Vec3.Y().multiplied(-e)),R=new exports.Coord3(S,exports.Vec3.X(),exports.Vec3.Z()),U=exports.TrimmedSurface.createPlane(R,t,n),b=[o,I,u,w,N,U];if(l instanceof TiltBox3){const G=l.getCoord().getLocalToWorldMatrix();for(const O of b)O.transform(G)}return b}function boxCutLine(l,t){const e=l.clone();if(e.setRange(-1e7,1e7),t instanceof TiltBox3){const I=t.getCoord().getWorldToLocalMatrix();e.transform(I)}const n=e.getDirection(),s=I=>{const c=I.getSurface(),E=I.getUVPolygon().getLoops()[0].getAllCurves(),u=new Interval(E[0].getStartPt().x,E[0].getEndPt().x),Q=new Interval(E[1].getStartPt().y,E[1].getEndPt().y),p=new exports.Vec3(e.getOrigin(),c.getOrigin());if(Math.abs(n.dot(c.getNorm()))<Tol.ANGLE)return;const w=p.dot(c.getNorm())/n.dot(c.getNorm()),y=e.getPtAt(w),M=c.getUVAt(y);if(u.containsPt(M.x,Tol.NUMBER)&&Q.containsPt(M.y,Tol.NUMBER))return w},r=[],i=new Box3([t.min,t.max]),o=boxToTrimmedSurfaces(i);for(const I of o){const c=s(I);c!==void 0&&r.push(c)}if(r.length===0)return;let g;r.length===1?g=new Interval(r[0]-Tol.LENGTH,r[0]+Tol.LENGTH):g=new Interval(r[0],r[1],!0);const a=l.getRange().intersected(g);if(a.length!==0)return a[0]}class CurveSurfaceXUtil{static dealRedundantIntersect(t,e,n,s,r=Tol.DEFAULT){const i=r.lengthEps2*1e6;for(let o=0;o<s.length;o++){const g=n.point.sqDistanceTo(s[o].point);if(g<=r.lengthEps2){const a=t.getPtAt(s[o].curveT).sqDistanceTo(e.getPtAt(s[o].surfaceUV));return t.getPtAt(n.curveT).sqDistanceTo(e.getPtAt(n.surfaceUV))<a&&s.splice(o,1,n),!0}if(g<=i){const a=t.getPtAt(s[o].curveT).sqDistanceTo(e.getPtAt(s[o].surfaceUV)),I=t.getPtAt(n.curveT).sqDistanceTo(e.getPtAt(n.surfaceUV)),c=(s[o].curveT+n.curveT)/2,E=new exports.Vec2((s[o].surfaceUV.x+n.surfaceUV.x)/2,(s[o].surfaceUV.y+n.surfaceUV.y)/2),u=t.getPtAt(c).sqDistanceTo(e.getPtAt(E));if(u<a&&u<I){const Q={point:t.getPtAt(c),curveT:c,surfaceUV:E};return s.splice(o,1,Q),!0}return a>Tol.CALCULATE_EPS&&I<a&&s.splice(o,1,n),!0}}return s.push(n),!1}constructor(t,e,n=new Tol){this._curve=t,this._surface=e,this._tol=n}calAllIntersects(t){const e=new Curve3dSegment(this._curve);e.range=this._curve.getRange(),e.depth=0;const n=new SurfacePatch(this._surface);if(this._surfaceRangeUV=t||[this._surface.getDomainU(),this._surface.getDomainV()],n.depth=0,!this._shrinkCurveRange(e,n))return[];if(this._shrinkSurfacePatchRanges(n,e),t){if(!t[0].containsInterval(Interval.infinit())){const I=n.rangeU.intersected(t[0]);if(I.length===0)return[];n.rangeU=I[0]}if(!t[1].containsInterval(Interval.infinit())){const I=n.rangeV.intersected(t[1]);if(I.length===0)return[];n.rangeV=I[0]}}const r=[e],i=[n],o=[],g={segment:e,patch:n};return o.push(g),this._calCurveSurfacePairsIntersect(r,i,o)}calSingleIntersect(t,e){const n=new Curve3dSegment(this._curve);n.range=this._curve.getRange(),this._surfaceRangeUV=e||[this._surface.getDomainU(),this._surface.getDomainV()];const s=this._surfaceRangeUV,r=new SurfacePatch(this._surface,s),i={segment:n,patch:r};return this._curveSurfacePairIntersect(i,t)}hasIntersect(t,e=Tol.DEFAULT){const n=new Curve3dSegment(this._curve);n.range=this._curve.getRange(),n.depth=0;const s=new SurfacePatch(this._surface);if(this._surfaceRangeUV=t||[this._surface.getDomainU(),this._surface.getDomainV()],s.depth=0,!this._shrinkCurveRange(n,s))return!1;if(this._shrinkSurfacePatchRanges(s,n),t){if(!t[0].containsInterval(Interval.infinit())){const I=s.rangeU.intersected(t[0]);if(I.length===0)return!1;s.rangeU=I[0]}if(!t[1].containsInterval(Interval.infinit())){const I=s.rangeV.intersected(t[1]);if(I.length===0)return!1;s.rangeV=I[0]}}const i=[n],o=[s],g=[],a={segment:n,patch:s};return g.push(a),this._findCurveSurfacePairsIntersect(i,o,g)}_shrinkCurveRange(t,e){if(!t.curve.isLine3d())return!0;const n=e.surface;let s;if(s=n.getBox(),!s)return!0;const r=boxCutLine(t.curve,s);return r?(t.range=r,!0):!1}_shrinkSurfacePatchRanges(t,e){const n=e.getSegBox();if(t.surface.isPlane()){const s=t.surface,r=[CONST.MODEL_MAX_LENGTH,-CONST.MODEL_MAX_LENGTH],i=[CONST.MODEL_MAX_LENGTH,-CONST.MODEL_MAX_LENGTH];for(const o of n.getCornerPts()){const g=s.getUVAt(o);g.x>r[1]&&(r[1]=g.x),g.x<r[0]&&(r[0]=g.x),g.y>i[1]&&(i[1]=g.y),g.y<i[0]&&(i[0]=g.y)}t.rangeU=new Interval(r[0],r[1]),t.rangeV=new Interval(i[0],i[1])}else if(t.surface.isCylinder()){const r=t.surface.getCoord(),i=new exports.Ln3(r.getOrigin(),r.getDz(),Interval.infinitArray()),o=[CONST.MODEL_MAX_LENGTH,-CONST.MODEL_MAX_LENGTH];for(const g of n.getCornerPts()){const a=i.getParamAt(g);a>o[1]&&(o[1]=a),a<o[0]&&(o[0]=a)}t.rangeV=new Interval(o[0],o[1]),t.rangeU=new PeriodInterval(0,CONST.PI2)}else throw new Error("暂未支持的曲面类型!")}_calCurveSurfacePairsIntersect(t,e,n){let s=[],r=0;for(;r<CONST.MAX_SUBDEVIDE_DEPTH;){for(const a of t){const I=[],c=new Curve3dSegment(a.curve),E=new Curve3dSegment(a.curve);I.push(c),I.push(E),CurveSegment.subdivideCurveSegment(a,I)}if(e.map(a=>SurfacePatch.subdivideSurfacePatch(a,8)),!this._combineCurveSurfacePairs(n,s))break;const g=this._FilterCurveSurfacePairs(s);if(g.length===0){n.splice(0);break}this._refreshSegmentPatchs(g,t,e),n.splice(0),n.push(...g),s=[],r++}const i=[];for(const o of n){const g=this._curveSurfacePairIntersect(o);g&&CurveSurfaceXUtil.dealRedundantIntersect(o.segment.curve,o.patch.surface,g,i)}return i}_findCurveSurfacePairsIntersect(t,e,n){let s=[],r=0;for(;r<CONST.MAX_SUBDEVIDE_DEPTH;){for(const g of t){const a=[],I=new Curve3dSegment(g.curve),c=new Curve3dSegment(g.curve);a.push(I),a.push(c),CurveSegment.subdivideCurveSegment(g,a)}if(e.map(g=>SurfacePatch.subdivideSurfacePatch(g,8)),!this._combineCurveSurfacePairs(n,s))break;const o=this._FilterCurveSurfacePairs(s);if(o.length===0){n.splice(0);break}this._refreshSegmentPatchs(o,t,e),n.splice(0),n.push(...o),s=[],r++}for(const i of n)if(this._curveSurfacePairIntersect(i))return!0;return!1}_curveSurfacePairIntersect(t,e){const n=t.segment,s=t.patch;let r=[];if(e){let g,a;e instanceof exports.Vec3?(g=this._curve.getParamAt(e),a=this._surface.getUVAt(e)):(g=e.curveT,a=e.uvPara),g=n.curve.getRange().clamp(g),s.surface.clampInDomain(a),r.push(g,a.x,a.y)}else r=[n.range.getMid(),s.rangeU.getMid(),s.rangeV.getMid()],n.curve.isLine3d()&&(r[0]=n.curve.getParamAt(s.getPatchBox3d().getCenter()));const i=(g,a)=>{if(g instanceof PeriodInterval){const I=PeriodInterval.RegularizeParam(a,g.period);return I<g.min-this._tol.numberEps||I>g.max+this._tol.numberEps?I+g.period:I}return a};if(this._curveSurfaceIteration(n.curve,s.surface,r,this._tol.lengthEps)&&n.curve.getRange().containsPt(r[0])&&this._surfaceRangeUV[0].containsPt(r[1])&&this._surfaceRangeUV[1].containsPt(r[2])){const g=n.curve.getPtAt(r[0]);return r[0]=i(n.curve.getRange(),r[0]),r[1]=i(this._surfaceRangeUV[0],r[1]),r[2]=i(this._surfaceRangeUV[1],r[2]),{point:g,curveT:r[0],surfaceUV:{x:r[1],y:r[2]}}}}_calcCurveSurfaceDeltaParams(t,e,n,s){const r=t.getDerivatives(n[0],1),i=e.getDerivatives(new exports.Vec2(n[1],n[2]),1),o=[r[0].x-i[0].x,r[0].y-i[0].y,r[0].z-i[0].z],g=[r[1].x,-i[1].x,-i[2].x],a=[r[1].y,-i[1].y,-i[2].y],I=[r[1].z,-i[1].z,-i[2].z],c=numeric1_2_6Exports.det([g,a,I]);if(Math.abs(c)>Tol.CALCULATE_EPS){const R=LinearSystem.execute([g,a,I],o);return R===void 0?[]:(R[0]*=s,R[1]*=s,R[2]*=s,R)}if(Math.abs(o[0])>Tol.CALCULATE_EPS&&Math.abs(o[1])>Tol.CALCULATE_EPS&&Math.abs(o[2])>Tol.CALCULATE_EPS)return[];const E=[g,a,I],u=[...o];for(let R=0;R<E.length;R++)Math.abs(E[R][0])+Math.abs(E[R][1])+Math.abs(E[R][2])<Tol.CALCULATE_EPS&&(E.splice(R,1),u.splice(R,1),R--);if(E.length===2){let R=0,U=Math.abs(E[0][0])+Math.abs(E[1][0]);for(let G=1;G<E[0].length;G++){const O=Math.abs(E[0][G])+Math.abs(E[1][G]);O>U&&(U=O,R=G)}for(const G of E)G.splice(R,1);const b=LinearSystem.execute(E,u);return b===void 0?[]:(b.splice(R,0,0),b[0]*=s,b[1]*=s,b[2]*=s,b)}if(r[1].getSqLength()<Tol.CALCULATE_EPS2||i[1].getSqLength()<Tol.CALCULATE_EPS2||i[2].getSqLength()<Tol.CALCULATE_EPS2)return[];const Q=1/r[1].getLength(),p=1/i[1].getLength(),w=1/i[2].getLength();r[1]=r[1].multiply(Q),i[1]=i[1].multiply(p),i[2]=i[2].multiply(w);const y=[r[1].x,-i[1].x,-i[2].x],M=[r[1].y,-i[1].y,-i[2].y],N=[r[1].z,-i[1].z,-i[2].z],S=LinearSystem.execute([y,M,N],o);return S===void 0?[]:(S[0]*=Q*s,S[1]*=p*s,S[2]*=w*s,S)}_curveSurfaceIteration(t,e,n,s=Tol.LENGTH){const r=s*s*.01;let i=t.getPtAt(n[0]),o=e.getPtAt(new exports.Vec2(n[1],n[2])),g=i.sqDistanceTo(o);if(g<r)return!0;let a=0,I=1;const c=[];let E=!0;for(;a<CONST.NORMAL_ITER_NUM||E;a++){I=I>1?I:estimateRootMultiplicity(c);const u=this._calcCurveSurfaceDeltaParams(t,e,n,I);if(u.length===0)return g<r;const Q=[n[0]-u[0],n[1]-u[1],n[2]-u[2]];Q[0]=t.getRange().clamp(Q[0]);const p=new exports.Vec2(Q[1],Q[2]);e.clampInDomain(p),Q[1]=p.x,Q[2]=p.y;let w=t.getPtAt(Q[0]),y=e.getPtAt(p),M=w.sqDistanceTo(y),N=M/g;if(N>1-.1){Q[0]=n[0]-.5*u[0],Q[1]=n[1]-.5*u[1],Q[2]=n[2]-.5*u[2],Q[0]=t.getRange().clamp(Q[0]);const S=new exports.Vec2(Q[1],Q[2]);e.clampInDomain(S),Q[1]=S.x,Q[2]=S.y,w=t.getPtAt(Q[0]),y=e.getPtAt(S),M=w.sqDistanceTo(y),N=M/g}if(N>1&&M<Tol.CALCULATE_EPS2||(n[0]=Q[0],n[1]=Q[1],n[2]=Q[2],M<Tol.ZERO_JUDGE_EPS2))return!0;if(i.sqDistanceTo(w)<r&&o.sqDistanceTo(y)<r||a>CONST.MAX_ITER_NUM)return M<r;a>=CONST.NORMAL_ITER_NUM&&(E=M<g-Tol.CALCULATE_EPS2),i=w,o=y,g=M,c.push(N)}return g<s}_combineCurveSurfacePairs(t,e){let n=!1;for(const s of t){if(s.segment.child.length===0&&s.patch.child.length===0){e.push(s);continue}const r=s.segment.child.length>1?s.segment.child:[s.segment],i=s.patch.child.length>1?s.patch.child:[s.patch];for(const o of r)for(const g of i){const a={segment:o,patch:g};e.push(a)}n=!0}return n}_FilterCurveSurfacePairs(t){const e=[];for(const n of t){const s=n.segment,r=n.patch,i=s.getSegBox(),o=r.getPatchBox3d();i.intersectsBox(o)&&e.push(n)}return e}_refreshSegmentPatchs(t,e,n){const s=new Set,r=new Set;for(const i of t)s.add(i.segment),r.add(i.patch);e.splice(0),e.push(...s),n.splice(0),n.push(...r)}}class CurveSurfaceCoincide{static execute(t,e,n){return e instanceof exports.Plane?e.containsCurve(t,n.lengthEps,n.angleEps):e.containsCurve(t,n.lengthEps)}}class ClipperFormatConverter{static vector2ToXY(t){const e=t.x,n=t.y;return{X:e,Y:n}}static vector2sToXY(t){return t.map(e=>({X:e.x,Y:e.y}))}static pathsToPolygon(t){const e=[];for(const n of t){const s=ClipperFormatConverter.pathToLoop(n);s&&!s.isEmpty()&&e.push(s)}return new exports.Polygon(e)}static pathToLoop(t){return new exports.Loop(t.map(e=>({x:e.X,y:e.Y})))}static loopToPath(t){return t.toPath().map(e=>ClipperFormatConverter.vector2ToXY(e))}static pathToPolyline(t){return new exports.PolyCurve(t.map(e=>({x:e.X,y:e.Y})))}static polylineToPath(t){return t.toPath().map(n=>{const s=n.x,r=n.y;return{X:s,Y:r}})}static polygonToPaths(t){const e=[];return t.getLoops().forEach(s=>{const r=s.getAllCurves(),i=[];for(let g=0;g<r.length;g++){const I=r[g].discrete();(g!==r.length-1||s.getType()===EN_GEO_TYPE.LOOP)&&I.pop(),i.push(...I)}const o=[];i.forEach(g=>o.push({X:g.x,Y:g.y})),i.length>0&&e.push(o)}),e}static clpExPolygonToPolygon(t){const e=[];for(let s=0;s<t.outer.length;s++)e.push(t.outer[s]);const n=ClipperFormatConverter.pathsToPolygon([e]);for(let s=0;s<t.holes.length;s++){const r=[];for(let i=0;i<t.holes[s].length;i++)r.push(t.holes[s][i]);n.addLoop(ClipperFormatConverter.pathToLoop(r))}return n}static clipperExPolygonsToPolygon(t){return t.map(e=>ClipperFormatConverter.clpExPolygonToPolygon(e))}}class Log{static{this.showError=!0}static instance(){return this._instance||(this._instance=new Log),Log._instance}static d(t,e="",n=""){let s=`${e}
186
+ `;s+=Log.toString(t),s+=`
187
+ ${n}`,console.log(s)}static e(t,e="",n=""){let s=`${e}
188
+ `;s+=Log.toString(t),s+=`
189
+ ${n}`,console.error(s)}static w(t,e="",n=""){let s=`${e}
190
+ `;s+=Log.toString(t),s+=`
191
+ ${n}`,console.warn(s)}static toString(t){let e="";return t instanceof Array?t.forEach(n=>{e+=`${n}
192
+ `}):e+=`${t}`,e}}class BoolOperateClipper{static curvePolygon(t,e,n){const s=[];if(e.forEach(g=>{s.push(...g.copyAllCurves())}),!s.length)return n?[]:[[t.getStartPt(),t.getEndPt()]];let r=[t];for(const g of s){const a=[];for(const I of r){const c=LinesX.line2ds(I,g);c.length?c.forEach(({point:E,isOverlap:u})=>{u||(a.push(new exports.Ln2(I.getStartPt(),E)),a.push(new exports.Ln2(E,I.getEndPt())))}):a.push(I)}r=a}const i=[],o=[];for(const g of r)e.find(I=>I instanceof exports.Polygon?PtPolygonPJ.execute(g.getMidPt(),I)===PtLoopPJType.IN:PtLoopPJ.execute(g.getMidPt(),I,Tol.LENGTH).type===PtLoopPJType.IN)?i.push(g):o.push(g);return n?i.map(g=>[g.getStartPt(),g.getEndPt()]):o.map(g=>[g.getStartPt(),g.getEndPt()])}static boolOperate(t,e,n){return exports.Polygon.fromPolygonEx(this.boolOperateEx(t,e,n))}static boolOperateEx(t,e,n){const s=new(void 0),r=Tol.CLIPPER_SCALE;let i=!0;for(const u of t){if(u.getType()===EN_GEO_TYPE.LOOP){const Q=[ClipperFormatConverter.loopToPath(u)];if(!Q.length)continue;(void 0).ScaleUpPaths(Q,r),s.AddPaths(Q,(void 0).ptSubject,!0)}else if(u.getType()===EN_GEO_TYPE.POLYGON){const Q=ClipperFormatConverter.polygonToPaths(u);if(!Q.length)continue;(void 0).ScaleUpPaths(Q,r),s.AddPaths(Q,(void 0).ptSubject,!0)}else throw new Error("not support this type");i=!1}if(n)for(const u of n)if(u.getType()===EN_GEO_TYPE.LOOP){const Q=[ClipperFormatConverter.loopToPath(u)];if(!Q.length)continue;(void 0).ScaleUpPaths(Q,r),s.AddPaths(Q,(void 0).ptClip,!0)}else if(u.getType()===EN_GEO_TYPE.POLYGON){const Q=ClipperFormatConverter.polygonToPaths(u);if(!Q.length)continue;(void 0).ScaleUpPaths(Q,r),s.AddPaths(Q,(void 0).ptClip,!0)}else throw new Error("not support this type");let o=-1;if(e===0)o=(void 0).ctUnion;else if(e===1){if(o=(void 0).ctIntersection,i)return[new exports.Polygon]}else if(e===2&&(o=(void 0).ctDifference,i))return[new exports.Polygon];const g=new(void 0);s.Execute(o,g,(void 0).pftNonZero,(void 0).pftNonZero)||Log.e([...t,...n],"clipper运算失败");const I=[],c=g.Childs(),E=u=>((void 0).ScaleDownPath(u,r),ClipperFormatConverter.pathToLoop(u));for(;c.length>0;){const u=c.pop(),Q=[E(u.Contour())];for(const p of u.Childs())Q.push(E(p.Contour())),c.push(...p.Childs());I.push(new exports.Polygon(Q))}return I}}class SearchSimpleLoop{static execute(t,e=Tol.LENGTH){if(t.length<1)return[];if(t.length===1)return[new exports.PolyCurve([t[0].clone()])];const n=[],s=new Map;for(t.forEach((r,i)=>s.set(r,i));s.size;){const i=[SearchSimpleLoop._findAndRemoveLongestCurve(s)];for(;s.size;){const g=SearchSimpleLoop._findAndRemoveNextCurve(i[i.length-1][0].getEndPt(),s,e);if(g)i.push(g);else break}for(;s.size;){const g=SearchSimpleLoop._findAndRemoveNextCurve(i[0][0].getStartPt(),s,e);if(g)g[0].reverse(),i.splice(0,0,g);else break}const o=new exports.Loop;for(const[g]of i)o.addCurve(g);if(o.isValid())n.push(o);else{const g=new exports.PolyCurve;o.getAllCurves().forEach(a=>{g.addCurve(a)}),n.push(g)}}return n.forEach(r=>{r.isAnticlockwise()||r.reverse()}),n}static _findAndRemoveLongestCurve(t){MathAssert.assert(t.size);let e=-1,n;for(const[s,r]of t){const i=s.getLength();i>e&&(e=i,n=[s,r])}return MathAssert.assert(n),t.delete(n[0]),n}static _findAndRemoveNextCurve(t,e,n){const s=[];for(const[g]of e){const a=g.getStartPt().distanceTo(t),I=g.getEndPt().distanceTo(t);a<n&&I<n?a>I?s.push({cv:g,d:I,reverse:!0}):s.push({cv:g,d:a,reverse:!1}):a<n?s.push({cv:g,d:a,reverse:!1}):I<n&&s.push({cv:g,d:I,reverse:!0})}if(s.length<1)return;s.sort((g,a)=>g.d-a.d);const r=s[0],i=e.get(r.cv);MathAssert.assert(i!==void 0),e.delete(r.cv);const o=r.cv.clone();return r.reverse&&o.reverse(),[o,i]}}class PolycurvePolygonBool{static execute(t,e,n,s,r){const i=r,o=s?[PtLoopPJType.IN,PtLoopPJType.ONEDGE,PtLoopPJType.ONVERTEX]:[PtLoopPJType.IN],g=s?[PtLoopPJType.IN]:[PtLoopPJType.IN,PtLoopPJType.ONEDGE,PtLoopPJType.ONVERTEX],a=t.copyAllCurves(),I=a.map(u=>u.getBBox()),c=e.map(u=>u.getBBox()),E=[];return a.forEach((u,Q)=>{const p=[],w=(N,S)=>{S.some(R=>R.equals(N,i))||S.push(N)},y=[];e.forEach((N,S)=>{if(I[Q].intersectsBox(c[S])){y.push(N);for(const R of N.getAllCurves())CurvesX.curve2ds(u,R).forEach(b=>{b.isOverlap?(w(u.getPtAt(b.overlap1.min),p),w(u.getPtAt(b.overlap1.max),p)):w(b.point,p)})}});let M=u.split(p.map(N=>u.getParamAt(N)));M.length||(M=[u]);for(const N of M){let S=!1;n?S=y.some(R=>{let U;return R instanceof exports.Polygon?U=PtPolygonPJ.execute(N.getMidPt(),R,i):U=PtLoopPJ.execute(N.getMidPt(),R,i).type,o.some(b=>b===U)}):S=y.every(R=>{let U;return R instanceof exports.Polygon?U=PtPolygonPJ.execute(N.getMidPt(),R,i):U=PtLoopPJ.execute(N.getMidPt(),R,i).type,g.every(b=>b!==U)}),S&&E.push(N)}}),SearchSimpleLoop.execute(E,i)}}class CurvesOverlapJudge{static execute(t,e,n=Tol.LENGTH,s=Tol.ANGLE){let r;const i=new Tol(n,s);if(t instanceof Curve2&&e instanceof Curve2)r=CurvesOverlap.curve2ds(t,e,i);else if(t instanceof Curve3&&e instanceof Curve3)r=CurvesOverlap.curve3ds(t,e,i);else throw new Error("Unknown curve types");const o=r.filter(a=>a.range1.getLength()>Tol.NUMBER);if(r.length===0)return CurvesPJType.NOT_INTERSECT;if(o.length===0)return CurvesPJType.INTERSECT_ON;if(r.length>1)return CurvesPJType.OVERLAP;const g=o[0];return Util.isNearlyEqual(g.range1.getLength(),t.getRange().getLength(),n)&&Util.isNearlyEqual(g.range2.getLength(),e.getRange().getLength(),n)?CurvesPJType.TOTALLY_OVERLAP:CurvesPJType.OVERLAP}}class SearchLoop2D{static execute(t,e,n=Tol.LENGTH){const s=new Map;for(const g of t){const a=g.getStartPt();let I;for(const[c,E]of s)if(c.equals(a,n)){I=E;break}I||(I=[],s.set(a,I)),I.push(g)}const r=[],i=new Set,o=t.slice();for(const g of o){if(!g||i.has(g))continue;const a=[],I=new Set;let c=g;for(;c;){I.add(c);const E=a.length,u=E>0?a[E-1]:null;u&&CurvesOverlapJudge.execute(u,c,n)===CurvesPJType.TOTALLY_OVERLAP?(c.getStartPt().equals(c.getEndPt(),n)&&Util.isNearlyBigger(c.getLength(),n)&&(r.push([u]),r.push([c]),i.add(u),i.add(c)),a.pop()):a.push(c);const Q=c.getEndPt();let p=[];for(const[y,M]of s)if(y.equals(Q,n)){p=M;break}const w=this._findMaxTurning2D(c,p,e,n);if(!w||i.has(w)||I.has(w))break;c=w}for(;a.length>=1;){const E=a[0].getStartPt(),u=a[a.length-1].getEndPt();if(E.equals(u,n)){for(;a.length>=2&&CurvesOverlapJudge.execute(a[0],a[a.length-1],n)===CurvesPJType.TOTALLY_OVERLAP;)a.shift(),a.pop();a.length&&(r.push(a),a.forEach(Q=>i.add(Q)));break}a.shift()}}return r.map(g=>new exports.Loop(g))}static _findMaxTurning2D(t,e,n,s){let r=-10,i,o=!1;const g=100,a=t.getEndTangent();for(const I of e){const c=I.getStartTangent();let E=0,u=!1;if(CurvesOverlapJudge.execute(t,I,s)===CurvesPJType.TOTALLY_OVERLAP)E=-Math.PI,u=!0;else if(E=n?a.angleTo(c):c.angleTo(a),E>=Math.PI&&(E-=Math.PI*2),!(I instanceof exports.Ln2)||!(t instanceof exports.Ln2)){let w=1;const y=this._getAppropriateUnitStepLength([I,t]);for(;w<g&&(Util.isNearlyEqual(E,Math.PI,.01)||Util.isNearlyEqual(E,-Math.PI,.01));)E=this._calcStepAngle(t,I,a,c,y*w,n),w++}if(Util.isNearlyBigger(E,r)){i=I,o=u,r=E;continue}let Q=E,p=r;if(!(I instanceof exports.Ln2)||!(t instanceof exports.Ln2)||!(i instanceof exports.Ln2)){const w=this._getAppropriateUnitStepLength([I,t,i]);let y=1;for(;Util.isNearlyEqual(Q,p,s)&&y<=g;)(!(I instanceof exports.Ln2)||!(t instanceof exports.Ln2))&&(Q=this._calcStepAngle(t,I,a,c,w*y,n)),(!(i instanceof exports.Ln2)||!(t instanceof exports.Ln2))&&(p=this._calcStepAngle(t,i,a,c,w*y,n)),y++}(Q>p||Q===p&&o)&&(i=I,o=u)}return i}static _getAppropriateUnitStepLength(t){let e=Number.MIN_VALUE;for(const n of t){let s=e;n instanceof exports.Arc2?s=n.getRadius()*.01:s=.1,e=Math.max(e,s)}return e}static _calcStepAngle(t,e,n,s,r,i=!0){let o=s;if(!(e instanceof exports.Ln2)){const I=this._getAppropriateParamStep(e,r),c=e.getRange().min+I;o=e.getTangentAt(c)}let g=n;if(!(t instanceof exports.Ln2)){const I=this._getAppropriateParamStep(t,r),c=t.getRange().max-I;g=e.getTangentAt(c)}let a=0;return a=i?g.angleTo(o):o.angleTo(g),a>=Math.PI&&(a-=2*Math.PI),a}static _getAppropriateParamStep(t,e){const n=e/t.getLength(),s=t.getRange().getLength();let r=s*n;return r>s&&(r=s*.5),r}}class ILoopsToPolygonExes{static execute(t,e,n=!1,s=r=>(MathAssert.assert(r instanceof exports.Loop,"请添加该参数"),r)){if(!t.length)return[];const r=[],i=this.getNestedLoops(t,s),o=new Map;t.forEach(g=>o.set(g,!1));for(const g of i)g.level===0&&this.createFaces(g,n,o,r);return r.map(g=>g.map((a,I)=>(e&&(a.isCCW?I!==0&&a.loop.reverse():I===0&&a.loop.reverse()),a.loop)))}static getNestedLoops(t,e){const n=new Map;t.forEach(r=>n.set(r,e(r)));const s=t.map(r=>({loop:r,nesting:[],level:0,isCCW:n.get(r).isAnticlockwise()}));for(let r=0;r<s.length;++r){const i=s[r];for(let o=0;o<s.length;++o){if(r===o)continue;const g=s[o];this._loopContainsLoop(n.get(i.loop),n.get(g.loop))&&(i.nesting.push(g),g.level++)}}for(const r of s)r.nesting.sort((i,o)=>i.level-o.level);return s.filter(r=>r.level===0)}static createFaces(t,e,n,s){const r=t.loop,i=[t];s.push(i),n.set(r,!0);let o=-1,g=0;for(const a of t.nesting)a.level>o&&(o=a.level,g++),!n.get(a.loop)&&(g===2?this.createFaces(a,e,n,s):g===1&&(e?a.isCCW!==t.isCCW?(i.push(a),n.set(a.loop,!0)):this.createFaces(a,e,n,s):(i.push(a),n.set(a.loop,!0))))}static _loopContainsLoop(t,e){let n=e.getAllCurves().map(r=>r.getMidPt());n.sort(()=>.5-Math.random()),n=n.slice(0,Math.min(3,n.length));let s=t;if(t.getAllCurves().some(r=>r instanceof exports.SmoothPoly2)){const r=t.getAllCurves().map(i=>i instanceof exports.SmoothPoly2?i.getSegments():[i]).flat();s=new exports.Loop(r)}for(const r of n)if(PtLoopPJ.execute(r,s).type!==PtLoopPJType.IN)return!1;return!0}}class Curve2dGroup{static curvesEqual(t,e,n,s){if(t.curves.length!==e.curves.length)return!1;for(const r of t.curves)if(e.curves.every(i=>CurvesOverlapJudge.execute(r,i,n,s)!==CurvesPJType.TOTALLY_OVERLAP))return!1;return!0}constructor(t,e){this.face=t,this.curves=e}addInsideFace(t){this.insideFaces||(this.insideFaces=[]),this.insideFaces.push(t)}addOnFace(t){this.onFaces||(this.onFaces=[]),this.onFaces.push(t)}getReversedCurves(t){const e=[];for(const n of this.curves){const s=n.clone();if(s.reverse(),e.push(s),t){const r=t.get(n);r?t.set(s,r):t.set(s,n)}}return e}cloneCurves(t){const e=[];for(const n of this.curves){const s=n.clone();if(e.push(s),t){const r=t.get(n);r?t.set(s,r):t.set(s,n)}}return e}}function addToListMap(l,t,e,n,s){let r;if(n){for(const i of l.keys())if(n(i,t)){r=l.get(i);break}}else r=l.get(t);r||(r=[],l.set(t,r)),s?r.every(i=>!s(i,e))&&r.push(e):r.push(e)}function splitCurve(l,t,e,n){const s=l.split(t,n);s.length||s.push(l),e.push(...s)}function intersectFaces(l,t,e,n){const s=[...l,...t],r=[];for(const a of s)a.loops.forEach(I=>r.push(...I));const i=r.map(a=>a.getBBox()),o=new Map,g=new Tol(e,n);for(let a=0;a<r.length;a++)for(let I=a+1;I<r.length;I++)if(i[a].intersectsBox(i[I])){const c=CurvesX.curve2ds(r[a],r[I],g);for(const E of c)E.isOverlap?(addToListMap(o,r[a],E.overlap1.min),addToListMap(o,r[a],E.overlap1.max),addToListMap(o,r[I],E.overlap2.min),addToListMap(o,r[I],E.overlap2.max)):(addToListMap(o,r[a],E.param1),addToListMap(o,r[I],E.param2))}for(const a of s){const I=[];for(const c of a.loops){const E=[];for(const u of c){const Q=o.get(u);Q?splitCurve(u,Q,E,e):E.push(u)}I.push(E)}a.loops.splice(0,a.loops.length),I.forEach(c=>a.loops.push(c))}}function splitLoopByPoints(l,t,e,n){const s=t.map(r=>l.findIndex(i=>i.getStartPt().equals(r,n)));s.sort((r,i)=>r-i);for(let r=0;r<s.length-1;r++)e.push(l.slice(s[r],s[r+1]));e.push(l.slice(s[s.length-1],l.length).concat(l.slice(0,s[0])))}function splitLoopsIntoGroup(l,t,e){const n=[...l,...t],s=new Map;for(const i of n)for(const o of i.loops)for(const g of o)addToListMap(s,g.getStartPt(),o,(a,I)=>a.equals(I,e),(a,I)=>a===I);const r=new Map;for(const[i,o]of s)o.length>1&&o.forEach(g=>addToListMap(r,g,i));for(const i of n){i.bcGroups=[];for(const o of i.loops){const g=[],a=r.get(o);a&&a.length>1?splitLoopByPoints(o,a,g,e):g.push(o),g.forEach(I=>i.bcGroups.push(new Curve2dGroup(i,I)))}}}function calculateFaceBBox(l){if(l.box=new Box2,l.bcGroups)for(const t of l.bcGroups){t.box=new Box2;for(const e of t.curves)t.box.union(e.getBBox());l.box.union(t.box)}else for(const t of l.loops)for(const e of t)l.box.union(e.getBBox())}function calculatePositionInfo(l,t,e,n,s){for(const r of t)if(l!==r&&!(!l.box||!r.box||!l.box.intersectsBox(r.box)))for(const i of l.bcGroups){if(!i.curves.length||!i.box.intersectsBox(r.box))continue;const o=i.curves[0],g=r.loops.map(I=>new exports.Loop(I)),a=PtPolygonPJ.execute(o.getMidPt(),new exports.Polygon(g),e);a===PtLoopPJType.IN?(i.addInsideFace(r),s&&addToListMap(s,r,i,void 0,(I,c)=>Curve2dGroup.curvesEqual(I,c,e,n))):(a===PtLoopPJType.ONEDGE||a===PtLoopPJType.ONVERTEX)&&i.addOnFace(r)}}function validateOverlapCurveGroup(l,t=Tol.LENGTH,e=!1){if(l.bValid===!1)return;const n=l.curves,s=n[0].getStartPt(),r=n[0].getMidPt(),i=n[n.length-1].getMidPt(),o=n[n.length-1].getEndPt();l.bValid=!0;for(const g of l.onFaces){if(g.bPositive===void 0)continue;const a=l.face.bPositive!==g.bPositive!==e;for(const I of g.bcGroups){let c=!1,E=!1;const u=I.curves;if(u.length===n.length&&(!c&&u[0].getStartPt().equals(s,t)&&u[u.length-1].getEndPt().equals(o,t)?u[0].containsPt(r,t)&&u[u.length-1].containsPt(i,t)&&(c=!0):!E&&u[0].getStartPt().equals(o,t)&&u[u.length-1].getEndPt().equals(s,t)&&u[0].containsPt(i,t)&&u[u.length-1].containsPt(r,t)&&(E=!0),!a&&E||a&&c)){l.bValid=!1,I.bValid=!1;break}}}}function areFacesTotallyOverlap(l,t,e,n){if(!l.loops.length||!t.loops.length||l.loops.length!==t.loops.length||l.loops[0].length!==t.loops[0].length)return!1;const s=l.loops.flat(),r=t.loops.flat();for(const i of s){let o=!1;for(const g of r)if(CurvesOverlapJudge.execute(i,g,e,n)===CurvesPJType.TOTALLY_OVERLAP){o=!0;break}if(!o)return!1}return!0}function areFacesMainPositive(l){const t=l.filter(e=>e.bPositive).length;return l.length-t<=t}function getCandidateOriginFaces(l,t){const e=new Set;for(const n of l.loops)for(const s of n){const r=t.get(s);r&&r.forEach(i=>e.add(i))}return e}function generateResult(l,t,e,n,s,r,i){const o=areFacesMainPositive(l),g=new Map;for(const y of l)y.bPositive!==void 0&&(y.bPositive!==o?g.set(y,!0):g.set(y,!1));const a="overlap",I=new Map,c=new Map;for(const y of l){let M;e===Bool2dType.difference?M=g.get(y)===y.bBlankFace:M=g.get(y);for(const N of y.bcGroups)N.bValid&&(!N.onFaces||!N.onFaces.length?M?N.getReversedCurves(i).forEach(S=>c.set(S,[y])):N.curves.forEach(S=>c.set(S,[y])):addToListMap(I,a,N,void 0,(S,R)=>Curve2dGroup.curvesEqual(S,R,s,r)))}const E=I.get(a);if(E)for(const y of E){let M;e===Bool2dType.difference?M=g.get(y.face)===y.face.bBlankFace:M=g.get(y.face),M?y.getReversedCurves(i).forEach(N=>c.set(N,[y.face,...y.onFaces])):y.curves.forEach(N=>c.set(N,[y.face,...y.onFaces]))}const u=Array.from(c.keys()),Q=SearchLoop2D.execute(u,o,s);ILoopsToPolygonExes.execute(Q,!1,!0).map(y=>({loops:y.map(M=>M.getAllCurves()),bPositive:y[0].isAnticlockwise()})).forEach(y=>{const M=getCandidateOriginFaces(y,c);y.originFaces=n(y,M),t.push(y)})}function validateCurveGroup$2(l,t=Tol.LENGTH){l.insideFaces&&l.insideFaces.length?l.face.bBlankFace?l.bValid=!1:l.bValid=!0:l.onFaces&&l.onFaces.length?l.face.bBlankFace?validateOverlapCurveGroup(l,t,!0):l.bValid=!1:l.bValid=!!l.face.bBlankFace}function intersectionSet(l,t){const e=new Set;for(const n of l)t.has(n)&&e.add(n);return e}function getOriginFaces$3(l,t){l.box||calculateFaceBBox(l);let e=Array.from(t).filter(s=>s.bBlankFace);if(!e.length){let s;for(const r of t){const i=new Set;for(const o of r.bcGroups)o.insideFaces&&o.insideFaces.filter(g=>g.bBlankFace).forEach(g=>i.add(g));s?s=intersectionSet(s,i):s=i}s&&(e=Array.from(s))}const n=new Set;for(const s of e)s.originFaces.forEach(r=>{r.box.intersectsBox(l.box)&&n.add(r)});return Array.from(n).sort((s,r)=>(s.bBlankFace?0:1)-(r.bBlankFace?0:1))}function faces2DDifference(l,t,e,n,s){const r=[];l.forEach(a=>{a.bBlankFace=!0}),t.forEach(a=>{a.bBlankFace=!1}),splitLoopsIntoGroup(l,t,e);const i=[...l,...t];i.forEach(a=>calculateFaceBBox(a));const o=new Map;l.forEach(a=>calculatePositionInfo(a,t,e,n,o)),t.forEach(a=>calculatePositionInfo(a,l,e,n,o));for(const a of i)!a.loops.length||a.bPositive!==void 0||(a.bPositive=new exports.Loop(a.loops[0]).isAnticlockwise());for(const a of i)if(a.bPositive!==void 0)for(const I of a.bcGroups)validateCurveGroup$2(I,e);const g=[];for(const a of l)a.bcGroups.length&&(a.bcGroups.every(I=>I.bValid)&&!o.get(a)?(a.originFaces=getOriginFaces$3(a,new Set([a])),r.push(a)):g.push(a));return g.length&&(generateResult([...g,...t],r,2,getOriginFaces$3,e,n,s),r.forEach(a=>{if(a.originFaces&&a.originFaces.length===1&&a.originFaces[0].bPositive!==a.bPositive){const I=a.loops.map(c=>(c.reverse(),c.forEach(E=>E.reverse()),c));a.loops=I}})),r}function getOriginFaces$2(l,t){const e=Array.from(t);for(;e.length;){const s=e.pop();let r=[];for(const i of s.bcGroups)i.onFaces&&(r=r.concat(i.onFaces)),i.insideFaces&&(r=r.concat(i.insideFaces));r=r.filter(i=>i&&!t.has(i)),r.forEach(i=>{e.push(i),t.add(i)})}const n=Array.from(t);return n.sort((s,r)=>(s.bBlankFace?0:1)-(r.bBlankFace?0:1)),n}function validateCurveGroup$1(l,t=Tol.LENGTH){l.insideFaces&&l.insideFaces.length?l.bValid=!1:l.onFaces&&l.onFaces.length?validateOverlapCurveGroup(l,t):l.bValid=!0}function faces2DUnion(l,t,e,n,s){const r=[];l.forEach(g=>{g.bBlankFace=!0}),t.forEach(g=>{g.bBlankFace=!1}),splitLoopsIntoGroup(l,t,e);const i=[...l,...t];i.forEach(g=>calculateFaceBBox(g)),i.forEach(g=>calculatePositionInfo(g,i,e,n));for(const g of i)!g.loops.length||g.bPositive!==void 0||(g.bPositive=new exports.Loop(g.loops[0]).isAnticlockwise());for(const g of i)if(g.bPositive!==void 0)for(const a of g.bcGroups)validateCurveGroup$1(a,e);const o=[];for(const g of i)g.bcGroups.length&&(g.bcGroups.every(a=>a.bValid&&(!a.onFaces||!a.onFaces.length))?(g.originFaces=getOriginFaces$2(g,new Set([g])),r.push(g)):o.push(g));return o.length&&generateResult(o,r,0,getOriginFaces$2,e,n,s),r}function validateCurveGroup(l,t=Tol.LENGTH){l.insideFaces&&l.insideFaces.length?l.bValid=!0:l.onFaces&&l.onFaces.length&&l.face.bBlankFace?validateOverlapCurveGroup(l,t):l.bValid=!1}function getOriginFaces$1(l,t){l.box||calculateFaceBBox(l);const e=new Set;for(const s of t)s.originFaces.forEach(r=>{r.box.intersectsBox(l.box)&&e.add(r)});const n=Array.from(e);return n.sort((s,r)=>(s.bBlankFace?0:1)-(r.bBlankFace?0:1)),n}function faces2DIntersect(l,t,e,n,s){const r=[];l.forEach(o=>{o.bBlankFace=!0}),t.forEach(o=>{o.bBlankFace=!1}),splitLoopsIntoGroup(l,t,e);const i=[...l,...t];i.forEach(o=>calculateFaceBBox(o)),l.forEach(o=>calculatePositionInfo(o,t,e,n)),t.forEach(o=>calculatePositionInfo(o,l,e,n));for(const o of i)!o.loops.length||o.bPositive!==void 0||(o.bPositive=new exports.Loop(o.loops[0]).isAnticlockwise());for(const o of i)if(o.bPositive!==void 0)for(const g of o.bcGroups)validateCurveGroup(g,e);return generateResult(i,r,1,getOriginFaces$1,e,n,s),r}class UniqueCurveInfo{constructor(t){this.curve=t,this.validP=!0,this.validN=!0}}function calKey(l){let t;return l instanceof Curve2?t=l.getMidPt():t=LoopCentroid.centroidOfLoop(l.loops[0]),`${Math.round(t.x*1e3)}/${Math.round(t.y*1e3)}`}function getOriginFaces(l){let t,e=[l];for(;e&&e.length&&e!==t;)t=e,e=e[0].originFaces;return t}function getValidFlag(l,t){return t===l.dir>0?l.uCurve.validP:l.uCurve.validN}function updateValidFlag(l,t){l&&(t===l.dir>0?l.uCurve.validP=!1:l.uCurve.validN=!1)}function dealWithDuplicates(l,t,e,n,s){const r=new Map;for(const i of l.keys()){const o=calKey(i);let g=r.get(o);g||(g=[],r.set(o,g)),g.push(i)}for(const i of r.values()){const o=i.filter(c=>c instanceof Curve2),g=[];o.forEach(c=>{let E,u=1;for(const Q of g)if(CurvesOverlapJudge.execute(Q.curve,c,n,s)===CurvesPJType.TOTALLY_OVERLAP){E=Q,(!Q.curve.getStartPt().equals(c.getStartPt())||!Q.curve.getStartTangent().equals(c.getStartTangent()))&&(u=0);break}E||(E=new UniqueCurveInfo(c),g.push(E)),t.set(c,{uCurve:E,dir:u})});const a=i.filter(c=>!(c instanceof Curve2)),I=[];a.forEach(c=>{let E=!0;for(const u of I)if(areFacesTotallyOverlap(c,u,n,s)){E=!1;break}E&&c.loops.length&&I.push(c)}),e.push(...I)}}function faces2DSplit(l,t,e,n,s){const r=[];l.forEach(E=>{E.bBlankFace=!0});const i=new Box2,o=new Map;for(const E of[...l,...t]){const u=new Box2;for(const Q of E.loops)for(const p of Q){const w=p.getBBox();o.set(p,w),u.union(w)}o.set(E,u),i.union(u),E.loops.length&&(E.bPositive=new exports.Loop(E.loops[0]).isAnticlockwise())}const g=[];for(const[E,u]of o){const Q=u.getSize();g.push({x:Math.round(u.min.x),y:Math.round(u.min.y),width:Q.x+2,height:Q.y+2,obj:E})}const a=new Quadtree({x:Math.round(i.min.x)-50,y:Math.round(i.min.y)-50,width:i.getSize().x+100,height:i.getSize().y+100,maxElements:20});a.pushAll(g);const I=[],c=new Map;dealWithDuplicates(o,c,I,e,n),I.sort((E,u)=>(E.bBlankFace?0:1)-(u.bBlankFace?0:1));for(const E of I){const u=o.get(E),Q=u.getSize(),p=new Set;E.loops.forEach(O=>O.forEach(H=>p.add(H)));let w=a.colliding({x:Math.round(u.min.x)-2,y:Math.round(u.min.y)-2,width:Q.x+4,height:Q.y+4});w=w.filter(O=>O.obj instanceof Curve2&&!p.has(O.obj));const y=[],M=E.loops.map(O=>new exports.Loop(O)),N=new exports.Polygon;M.forEach(O=>N.addLoop(O,!1)),w.forEach(O=>{PtPolygonPJ.execute(O.obj.getMidPt(),N,e)===PtLoopPJType.IN&&y.push(O.obj)});const S=new Map,R=new Set;if(y.forEach(O=>{const H=c.get(O);if(!R.has(H.uCurve)){if(getValidFlag(H,E.bPositive)&&S.set(O,H),getValidFlag(H,!E.bPositive)){const z=O.clone();z.reverse(),S.set(z,{uCurve:H.uCurve,dir:H.dir?0:1})}R.add(H.uCurve)}}),p.forEach(O=>{const H=c.get(O);getValidFlag(H,E.bPositive)&&S.set(O,H)}),!y.length&&p.size&&p.size===S.size){E.originFaces=getOriginFaces(E),r.push(E),E.loops.forEach(O=>O.forEach(H=>{const z=S.get(H);z&&updateValidFlag(z,E.bPositive)}));continue}const U=SearchLoop2D.execute(Array.from(S.keys()),E.bPositive,e);ILoopsToPolygonExes.execute(U,!1,!0).map(O=>({loops:O.map(H=>H.getAllCurves()),bPositive:O[0].isAnticlockwise()})).forEach(O=>{O.originFaces=getOriginFaces(E),r.push(O),O.loops.forEach(H=>H.forEach(z=>{const tA=S.get(z);tA&&(updateValidFlag(tA,O.bPositive),s?.set(z,tA.uCurve.curve))}))})}return r}var Bool2dType=(l=>(l[l.union=0]="union",l[l.intersect=1]="intersect",l[l.difference=2]="difference",l[l.xor=3]="xor",l[l.split=4]="split",l))(Bool2dType||{});class Bool2d{static boolOperate(t,e,n,s=Tol.LENGTH,r=Tol.ANGLE){const i=t.map(a=>this._toFace2d(a)),o=e.map(a=>this._toFace2d(a));return intersectFaces(i,o,s,r),this.boolOperateCore(i,o,n,s,r).map(a=>{const I=a.loops.map(E=>new exports.Loop(E)),c=new exports.Polygon;return I.forEach(E=>c.addLoop(E,!1)),c})}static boolOperateCore(t,e,n,s=Tol.LENGTH,r=Tol.ANGLE,i,o,g){if(n===2){let a=t;o||(a=faces2DUnion(t,[],s,r,i));let I=e;return g||(I=faces2DUnion([],e,s,r,i)),faces2DDifference(a,I,s,r,i)}if(n===0)return faces2DUnion(t,e,s,r,i);if(n===1){let a=t;o||(a=faces2DUnion(t,[],s,r,i));let I=e;return g||(I=faces2DUnion([],e,s,r,i)),faces2DIntersect(a,I,s,r,i)}if(n===4)return faces2DSplit(t,e,s,r,i);throw new Error("二维布尔运算类型:暂未支持")}static _toFace2d(t){return t instanceof exports.Loop?{loops:[t.getAllCurves().map(e=>e.clone())]}:{loops:t.getLoops().map(e=>e.getAllCurves().map(n=>n.clone()))}}}class BoolOperate2d{static union(t){return t.length?BoolOperateClipper.boolOperate(t,0,[]):new exports.Polygon}static intersect(t){if(!t.length)return new exports.Polygon;let e=t[0];e.getType()===EN_GEO_TYPE.LOOP&&(e=new exports.Polygon(e.clone()));for(let n=1;n<t.length;n++)e=BoolOperateClipper.boolOperate([e],1,[t[n]]);return e}static difference(t,e){return t.isEmpty()?new exports.Polygon:e.length?BoolOperateClipper.boolOperate([t],2,e):t instanceof exports.Polygon?t.clone():new exports.Polygon(t.clone())}static polygonExUnion(t,e=Tol.LENGTH,n=Tol.ANGLE){if(!t.length)return[];const s=Math.ceil(t.length/2);return Bool2d.boolOperate(t.slice(0,s),t.slice(s,t.length),0,e,n)}static polygonExIntersect(t,e,n=Tol.LENGTH,s=Tol.ANGLE){return t.length?Bool2d.boolOperate(t,e,1,n,s):[]}static polygonExDifference(t,e,n=Tol.LENGTH,s=Tol.ANGLE){return t.length?Bool2d.boolOperate(t,e,2,n,s):[]}static polylineIntersect(t,e,n,s=Tol.NUMBER){return!e.length||t.isEmpty()?[]:PolycurvePolygonBool.execute(t,e,!0,n,s)}static polylineDifference(t,e,n,s=Tol.NUMBER){return t.isEmpty()?[]:e.length?PolycurvePolygonBool.execute(t,e,!1,n,s):[t]}}class LoopsPJ{static execute(t,e,n=Tol.LENGTH,s=!1){const r=BoolOperate2d.intersect([t,e]),i=()=>{for(const c of t.getAllCurves())for(const E of e.getAllCurves())if(X.curve2ds(c,E).length>0)return!0;return!1};if(!this._polygonIsValid(r))return s&&i()?LoopsPJType.INTERSECT:LoopsPJType.OUT;const o=BoolOperate2d.difference(t,[e]),g=BoolOperate2d.difference(e,[t]),a=this._polygonIsValid(o),I=this._polygonIsValid(g);if(!a&&!I)return LoopsPJType.EQUAL;if(!a&&I)return s&&i()?LoopsPJType.INTERSECT:LoopsPJType.IN;if(a&&!I)return s&&i()?LoopsPJType.INTERSECT:LoopsPJType.CONTAIN;if(a&&I)return LoopsPJType.INTERSECT;throw new Error("未知类型")}static _polygonIsValid(t){return t.calcArea()>Tol.DELTA_EPS}}class PJ{static isPtAbovePlane(t,e){return D.ptToSurfSigned(t,e)>0}static curveToCurve(t,e,n=Tol.LENGTH,s=Tol.ANGLE){return CurvesPJ.execute(t,e,n,s)}static curvesOverlap(t,e,n=Tol.LENGTH,s=Tol.ANGLE){return CurvesOverlapJudge.execute(t,e,n,s)}static ptToLoop(t,e,n=Tol.LENGTH){return PtLoopPJ.execute(t,e,n)}static ptToPolygon(t,e,n=Tol.LENGTH){return PtPolygonPJ.execute(t,e,n)}static loopToLoop(t,e,n=Tol.LENGTH,s=!1){return LoopsPJ.execute(t,e,n,s)}}class CurveSurfaceX{static execute(t,e,n=Tol.DEFAULT,s){const r=this._preciseMethod(t,e,n,s);if(r)return r;if(CurveSurfaceCoincide.execute(t,e,n)){const i=t.getStartPt();return[{point:i,curveT:t.getStartParam(),surfaceUV:e.getUVAt(i),overlapRange:t.getRange()}]}return this._complexMethod(t,e,n,s)}static allPoints(t,e,n=Tol.DEFAULT,s){const r=this._preciseMethod(t,e,n);return r?r.map(o=>o.point):CurveSurfaceCoincide.execute(t,e,n)?[]:this._complexMethod(t,e,n,s).map(o=>o.point)}static hasIntersect(t,e,n,s=Tol.DEFAULT){const r=this._preciseMethod(t,e,s);if(r){if(n===void 0)return r.length>0;for(const E of r)if(PJ.ptToPolygon(new exports.Vec2(E.surfaceUV),n,s.lengthEps)!==PtLoopPJType.OUT)return!0;return!1}if(n===void 0)return new CurveSurfaceXUtil(t,e,s).hasIntersect(n);const i=E=>{const u=e.getDomainU(),Q=e.getDomainV();return u.set(E.min.x,E.max.x),Q.set(E.min.y,E.max.y),[u,Q]},g=(E=>{if(E.getLoops().length>1)return[];for(const p of E.getAllCurves())if(p.isLine2d()||p.isNurbsCurve2d()&&p.isLineLike()){const w=p.getStartTangent();if(w.isPerpendicular(exports.Vec2.X(),s.angleEps)||w.isPerpendicular(exports.Vec2.Y(),s.angleEps))continue;return[]}else return[];const u=n.getBBox();return i(u)})(n);if(g.length>0)return new CurveSurfaceXUtil(t,e,s).hasIntersect(g);const a=n.getBBox(),I=i(a),c=this._complexMethod(t,e,s,I);for(const E of c)if(PJ.ptToPolygon(new exports.Vec2(E.surfaceUV),n,s.lengthEps)!==PtLoopPJType.OUT)return!0;return!1}static nearPoint(t,e,n,s=Tol.DEFAULT){const r=n instanceof exports.Vec3?n:n.point;let i,o=CONST.MAX_INTEGER;const g=this._preciseMethod(t,e,s);if(g){for(const c of g){const E=r.sqDistanceTo(c.point);E<o&&(i=c,o=E)}return i}const a=[t],I=[{surface:e}];for(const c of a)for(const E of I){const u=this._preciseMethod(c,E.surface,s,void 0);if(u){for(const w of u){const y=r.sqDistanceTo(w.point);y<o&&(i=w,o=y)}continue}const p=new CurveSurfaceXUtil(c,E.surface,s).calSingleIntersect(n,void 0);if(p){const w=r.sqDistanceTo(p.point);w<o&&(i=p,o=w)}}return i}static nearParam(t,e,n,s,r=Tol.DEFAULT){const i=t.getPtAt(n).midTo(e.getPtAt(s));let o,g=CONST.MAX_INTEGER;const a=this._preciseMethod(t,e,r);if(a){for(const u of a){const Q=i.sqDistanceTo(u.point);Q<g&&(o=u,g=Q)}return o}const I={point:i,curveT:n,uvPara:s};return new CurveSurfaceXUtil(t,e,r).calSingleIntersect(I)}static _complexMethod(t,e,n,s){const r=[t],i=[];i.push({surface:e,rangeUV:s});const o=this._getCurveEndPtIntersects(t,e,n,s);for(const g of r)for(const a of i){const I=this._preciseMethod(g,a.surface,n,a.rangeUV);if(I){for(const y of I)CurveSurfaceXUtil.dealRedundantIntersect(t,e,y,o,n),y.surfaceUV=e.getUVAt(y.point);continue}const c=this._getSurfaceLocalCoord(a.surface);if(!c||c.getDz().isParallel(exports.Vec3.X())||c.getDz().isParallel(exports.Vec3.Y())||c.getDz().isParallel(exports.Vec3.Z())){new CurveSurfaceXUtil(t,a.surface,n).calAllIntersects(a.rangeUV).map(N=>CurveSurfaceXUtil.dealRedundantIntersect(t,e,N,o,n));continue}const E=c.getWorldToLocalMatrix(),u=a.surface.transformed(E),Q=t.transformed(E),w=new CurveSurfaceXUtil(Q,u,n).calAllIntersects(a.rangeUV);for(const y of w)y.point=c.getWorldPtAt(y.point);w.map(y=>CurveSurfaceXUtil.dealRedundantIntersect(t,e,y,o,n))}return o}static _getSurfaceLocalCoord(t){if(t instanceof CoordBasedSurface)return t.getCoord()}static _getCurveEndPtIntersects(t,e,n,s){const r=[],i=[];i.push({pt:t.getStartPt(),param:t.getStartParam()}),i.push({pt:t.getEndPt(),param:t.getEndParam()});for(const o of i){const g=e.getUVAt(o.pt);if(!(s&&(!s[0].containsPt(g.x,n.numberEps)||!s[1].containsPt(g.y,n.numberEps)))&&e.getPtAt(g).sqDistanceTo(o.pt)<n.lengthEps2){const a={point:o.pt,curveT:o.param,surfaceUV:g};CurveSurfaceXUtil.dealRedundantIntersect(t,e,a,r)}}return r}static _preciseMethod(t,e,n=Tol.DEFAULT,s){let r=[];if(t.isLine3d()){const i=t;if(e.isPlane()){const o=e;r=this._line3dPlane(i,o,n)}else if(e.isCylinder()){const o=e;r=this._line3dCylinder(i,o,n)}else return}else if(t instanceof exports.Arc3&&e.isPlane())r=this._circle3dPlane(t,e,n).filter(o=>t.getRange().containsPt(o.curveT));else return;return s?r.filter(o=>s[0].containsPt(o.surfaceUV.x)&&s[1].containsPt(o.surfaceUV.y)):r}static _line3dPlane(t,e,n){const s=t.getDirection();if(Util.isNearly0(s.dot(e.getNorm())))return[];const i=new exports.Vec3(t.getOrigin(),e.getOrigin()).dot(e.getNorm())/s.dot(e.getNorm());if(!t.getRange().containsPt(i))return[];const o=t.getPtAt(i);return[{point:o,curveT:t.getParamAt(o),surfaceUV:e.getUVAt(o)}]}static _circle3dPlane(t,e,n){const s=new exports.Plane(t.getCoord()),r=SurfacesX.allIntersections(e,s);if(r.length===0)return[];const i=[],o=r[0].curve,g=CurvesX.curve3ds(t,o);for(const a of g){const I={point:a.point,curveT:a.param1,surfaceUV:e.getUVAt(a.point)};i.push(I)}return i}static _line3dCylinder(t,e,n){const s=e.getCoord(),r=e.getA(),i=e.getB(),o=s.getLocalToWorldMatrix(),g=o.inversed();if(!g)return MathAssert.warn("transform matrix error!"),[];const a=t.clone().transform(g),I=a.getDirection(),c=a.getOrigin(),E=r*r,u=i*i,Q=u*I.x*I.x+E*I.y*I.y,p=2*(u*I.x*c.x+E*I.y*c.y),w=u*c.x*c.x+E*c.y*c.y-E*u,y=[];if(Q<n.lengthEps){if(Math.abs(w)<n.lengthEps){const R=t.getStartPt(),U={point:R,curveT:t.getStartParam(),surfaceUV:e.getUVAt(R),overlapRange:t.getRange()};return y.push(U),y}return[]}const M=n.lengthEps*n.lengthEps,N=p*p-4*Q*w,S=(Math.abs(Q*w)+p*p)/2;if(N/S>M){const R=[NaN,NaN];R[0]=(-p+Math.sqrt(N))/(2*Q),R[1]=(-p-Math.sqrt(N))/(2*Q);const U=(r+i)/2;if(Math.abs(R[0]-R[1])/U<n.numberEps){const b=-p/(2*Q);if(a.getRange().containsPt(b)){const G=a.getPtAt(b).transformed(o),O={point:G,curveT:b,surfaceUV:e.getUVAt(G)};return y.push(O),y}}if(a.getRange().containsPt(R[0])){const b=a.getPtAt(R[0]).transformed(o),G={point:b,curveT:R[0],surfaceUV:e.getUVAt(b)};y.push(G)}if(a.getRange().containsPt(R[1])){const b=a.getPtAt(R[1]).transformed(o),G={point:b,curveT:R[1],surfaceUV:e.getUVAt(b)};y.push(G)}return y}else if(Math.abs(N/S)<=M){const R=-p/(2*Q);if(a.getRange().containsPt(R)){const U=a.getPtAt(R).transformed(o),b={point:U,curveT:R,surfaceUV:e.getUVAt(U)};y.push(b)}return y}return[]}}class SurfacesXUtil{constructor(t,e,n=new Tol,s,r){this._surface=[t,e],this._tol=n,this._initBoudaryUVs(0,s),this._initBoudaryUVs(1,r)}calAllIntersects(t,e,n,s,r=!1){if(this._surface.length<2)return[];const i=new SurfacePatch(this._surface[0]),o=new SurfacePatch(this._surface[1]);this._initSurfacePatch(this._surface[0],i),this._initSurfacePatch(this._surface[1],o),!t||!e||!n||!s?this._shrinkSurfacePatchRanges(this._surface[0],this._surface[1],i,o):(i.rangeU=t,i.rangeV=e,o.rangeU=n,o.rangeV=s);const g=i.getPatchBox3d(),a=o.getPatchBox3d();if(!g.intersectsBox(a))return[];const I=[],c=[];I.push(i),c.push(o);const E=[],u={patch1:i,patch2:o};E.push(u);const Q=this._surfacePatchsIntersectPoints(I,c,E);this._useHighPrecision=r;const p=[];for(const w of Q){const y=this._calTwoSurfaceSingleIntersect(w,Q);y&&p.push(y)}return p}calSingleIntersect(t,e,n=!1){const s=this.findSurfaceIntersectPoint(t);return s?(this._useHighPrecision=n,this._calTwoSurfaceSingleIntersect(s,[],e)):void 0}findSurfaceIntersectPoint(t){const e=new SurfacePatch(this._surface[0]);e.rangeU=this._surf1BoundaryUVs.rangeU?this._surf1BoundaryUVs.rangeU:this._surface[0].getDomainU(),e.rangeV=this._surf1BoundaryUVs.rangeV?this._surf1BoundaryUVs.rangeV:this._surface[0].getDomainV();const n=new SurfacePatch(this._surface[1]);n.rangeU=this._surf2BoundaryUVs.rangeU?this._surf2BoundaryUVs.rangeU:this._surface[1].getDomainU(),n.rangeV=this._surf2BoundaryUVs.rangeV?this._surf2BoundaryUVs.rangeV:this._surface[1].getDomainV();const s={patch1:e,patch2:n},r=this._surface[0].getUVAt(t),i=this._surface[1].getUVAt(t),o={uvPara1:r,uvPara2:i};let g=this._calcSurfacePatchPairIntersectPoint(s,o);return g===void 0&&(g=this._calcSurfacePatchPairIntersectPoint(s,o,!1)),g}calSingleSelfIntersect(t,e,n,s=!1){const r=new SurfacePatch(this._surface[0]);r.rangeU=this._surf1BoundaryUVs.rangeU?this._surf1BoundaryUVs.rangeU:this._surface[0].getDomainU(),r.rangeV=this._surf1BoundaryUVs.rangeV?this._surf1BoundaryUVs.rangeV:this._surface[0].getDomainV();const i=new SurfacePatch(this._surface[1]);i.rangeU=this._surf2BoundaryUVs.rangeU?this._surf2BoundaryUVs.rangeU:this._surface[1].getDomainU(),i.rangeV=this._surf2BoundaryUVs.rangeV?this._surf2BoundaryUVs.rangeV:this._surface[1].getDomainV();const o={patch1:r,patch2:i},g={uvPara1:t,uvPara2:e};let a=this._calcSurfacePatchPairIntersectPoint(o,g);return a===void 0&&(a=this._calcSurfacePatchPairIntersectPoint(o,g,!1)),a?(this._useHighPrecision=s,this._calTwoSurfaceSingleIntersect(a,[],n)):void 0}_initBoudaryUVs(t,e){const n=this._surface[t],s=g=>!!(g instanceof PeriodInterval&&Util.isNearlyEqual(g.getLength(),g.period));let r,i;n instanceof exports.Plane&&(r=n.getDomainU(),i=n.getDomainV());const o=(g,a)=>{if(g===void 0&&a===void 0)return;if(g!==void 0&&a!==void 0){const c=g.intersected(a);if(c.length===0){MathAssert.warn(!1,"Interval intersected result is empty");return}return c[0]}return g||a};e&&e.length>1&&(s(e[0])||(r=o(r,e[0])),s(e[1])||(i=o(i,e[1]))),t===0?this._surf1BoundaryUVs={rangeU:r,rangeV:i}:t===1&&(this._surf2BoundaryUVs={rangeU:r,rangeV:i})}_initSurfacePatch(t,e){e.depth=0}_shrinkSurfacePatchRangesByAnotherSurfaceBox(t,e){const n=e.surface;if(n.getType()===EN_GEO_TYPE.PLANE){const s=n,r=[CONST.MODEL_MAX_LENGTH,-CONST.MODEL_MAX_LENGTH],i=[CONST.MODEL_MAX_LENGTH,-CONST.MODEL_MAX_LENGTH];for(const o of t.getCornerPts()){const g=s.getUVAt(o);g.x>r[1]&&(r[1]=g.x),g.x<r[0]&&(r[0]=g.x),g.y>i[1]&&(i[1]=g.y),g.y<i[0]&&(i[0]=g.y)}e.rangeU=new Interval(r[0],r[1]),e.rangeV=new Interval(i[0],i[1])}else{e.rangeU=new Interval(0,CONST.PI2);let s;if(n.getType()===EN_GEO_TYPE.CYLINDER){const i=n,o=i.getCoord().getDz();s=new exports.Ln3(i.getCoord().getOrigin(),o,Interval.infinitArray())}const r=[CONST.MODEL_MAX_LENGTH,-CONST.MODEL_MAX_LENGTH];for(const i of t.getCornerPts()){const o=s.getParamAt(i);o>r[1]&&(r[1]=o),o<r[0]&&(r[0]=o)}e.rangeV=new Interval(r[0],r[1])}}_isSurfaceRangeUVFinite(t){return(n=>(n.isPlane()||n.isCylinder(),!1))(t)}_shrinkSurfacePatchRanges(t,e,n,s){if(this._isSurfaceRangeUVFinite(t)&&this._isSurfaceRangeUVFinite(e))n.rangeU=t.getDomainU(),n.rangeV=t.getDomainV(),s.rangeU=e.getDomainU(),s.rangeV=e.getDomainV();else if(this._isSurfaceRangeUVFinite(t)&&!this._isSurfaceRangeUVFinite(e)||!this._isSurfaceRangeUVFinite(t)&&this._isSurfaceRangeUVFinite(e))if(this._isSurfaceRangeUVFinite(t)){n.rangeU=t.getDomainU(),n.rangeV=t.getDomainV();const r=t.getBox();this._shrinkSurfacePatchRangesByAnotherSurfaceBox(r,s)}else{s.rangeU=e.getDomainU(),s.rangeV=e.getDomainV();const r=e.getBox();this._shrinkSurfacePatchRangesByAnotherSurfaceBox(r,n)}else if(t.isCylinder()&&e.isCylinder()){const r=t,i=e,o=r.getCoord().getDz(),g=i.getCoord().getDz(),a=new exports.Ln3(r.getCoord().getOrigin(),o,Interval.infinitArray()),I=new exports.Ln3(i.getCoord().getOrigin(),g,Interval.infinitArray()),c=new exports.Vec3,E=new exports.Vec3;D.curve3s(a,I,c,E);const u=a.getParamAt(c),Q=I.getParamAt(E),p=o.dot(g),w=Math.sqrt(1-p*p),y=r.getA()>r.getB()?r.getA():r.getB(),M=i.getA()>i.getB()?i.getA():i.getB(),N=(y+M)/w;n.rangeU=new Interval(0,CONST.PI2),n.rangeV=new Interval(u-N,u+N),s.rangeU=new Interval(0,CONST.PI2),s.rangeV=new Interval(Q-N,Q+N)}else throw new Error("unexpected surface type")}_surfacePatchsIntersectPoints(t,e,n){let s=[],r=0;for(;r<CONST.MAX_SUBDEVIDE_DEPTH&&(t.map(g=>SurfacePatch.subdivideSurfacePatch(g)),e.map(g=>SurfacePatch.subdivideSurfacePatch(g)),!!this._combineSurfacePatchPairs(n,s));)this._FilterSurfacePatchPairs(s),this._refreshSurfacePatchs(s,t,e),n.splice(0),n.push(...s),s=[],r++;const i=[];for(const o of n){const g=this._calcSurfacePatchPairIntersectPoint(o);if(g){let a=!1;for(const I of i)if(I.point.equals(g.point)){a=!0;break}a||i.push(g)}}return i}_combineSurfacePatchPairs(t,e){let n=!1;for(const s of t){if(s.patch1.child.length===0&&s.patch2.child.length===0){e.push(s);continue}const r=s.patch1.child.length>1?s.patch1.child:[s.patch1],i=s.patch2.child.length>1?s.patch2.child:[s.patch2];for(const o of r)for(const g of i){const a={patch1:o,patch2:g};e.push(a)}n=!0}return n}_FilterSurfacePatchPairs(t){for(let e=0;e<t.length;e++){const n=t[e],s=n.patch1,r=n.patch2,i=s.getPatchBox3d(),o=r.getPatchBox3d();i.intersectsBox(o)||(t.splice(e,1),e--)}}_refreshSurfacePatchs(t,e,n){const s=new Set,r=new Set;for(const i of t)s.add(i.patch1),r.add(i.patch2);e.splice(0),e.push(...s),n.splice(0),n.push(...r)}_calcSurfacePatchPairIntersectPoint(t,e,n=!0){const s=t.patch1,r=t.patch2,i=s.surface,o=r.surface;let g;if(e)g=[e.uvPara1,e.uvPara2],i.clampInDomain(g[0]),o.clampInDomain(g[1]);else{const p={x:s.rangeU.getMid(),y:s.rangeV.getMid()},w={x:r.rangeU.getMid(),y:r.rangeV.getMid()};g=[p,w]}const a=(p,w)=>{if(p instanceof PeriodInterval){const y=PeriodInterval.RegularizeParam(w,p.period);return y<p.min-this._tol.numberEps||y>p.max+this._tol.numberEps?y+p.period:y}return w};if(surfaceSurfaceIteration(i,o,g,this._tol.lengthEps,n)&&s.rangeU.containsPt(g[0].x,this._tol.numberEps)&&s.rangeV.containsPt(g[0].y,this._tol.numberEps)&&r.rangeU.containsPt(g[1].x,this._tol.numberEps)&&r.rangeV.containsPt(g[1].y,this._tol.numberEps)){const p=s.surface.getPtAt(g[0]),w=r.surface.getPtAt(g[1]);return g[0].x=a(s.rangeU,g[0].x),g[0].y=a(s.rangeV,g[0].y),g[1].x=a(r.rangeU,g[1].x),g[1].y=a(r.rangeV,g[1].y),{point:p.midTo(w),uvPara1:g[0],uvPara2:g[1]}}const c=i.getPtAt(g[0]),E=o.getPtAt(g[1]),u=c.sqDistanceTo(E),Q=.01;if(u<Q*Q){let p;const w=this._surf1BoundaryUVs;if(w.rangeU&&(Util.isNearlyEqual(w.rangeU.min,g[0].x,Q)?p=this._surface[0].getIsoCurve(w.rangeU.min,!1):Util.isNearlyEqual(w.rangeU.max,g[0].x,Q)&&(p=this._surface[0].getIsoCurve(w.rangeU.max,!1))),w.rangeV&&(Util.isNearlyEqual(w.rangeV.min,g[0].y,Q)?p=this._surface[0].getIsoCurve(w.rangeV.min,!1):Util.isNearlyEqual(w.rangeV.max,g[0].y,Q)&&(p=this._surface[0].getIsoCurve(w.rangeV.max,!1))),p){const N=CurveSurfaceX.nearPoint(p,o,c);if(N&&N.point.sqDistanceTo(c)<Q*Q){const S=i.getUVAt(N.point);return{point:N.point,uvPara1:S,uvPara2:N.surfaceUV}}}let y;const M=this._surf2BoundaryUVs;if(M.rangeU&&(Util.isNearlyEqual(M.rangeU.min,g[1].x,Q)?y=this._surface[1].getIsoCurve(M.rangeU.min,!1):Util.isNearlyEqual(M.rangeU.max,g[1].x,Q)&&(y=this._surface[1].getIsoCurve(M.rangeU.max,!1))),M.rangeV&&(Util.isNearlyEqual(M.rangeV.min,g[1].y,Q)?y=this._surface[1].getIsoCurve(M.rangeV.min,!1):Util.isNearlyEqual(M.rangeV.max,g[1].y,Q)&&(y=this._surface[1].getIsoCurve(M.rangeV.max,!1))),y){const N=CurveSurfaceX.nearPoint(y,i,c);if(N&&N.point.sqDistanceTo(c)<Q*Q){const S=o.getUVAt(N.point);return{point:N.point,uvPara1:N.surfaceUV,uvPara2:S}}}}}_removeInitialIntersectPts(t,e,n){for(let s=0;s<e.length;s++)t.point.sqDistanceTo(e[s].point)<n&&(e.splice(s,1),s--)}_calTwoSurfaceSingleIntersect(t,e,n){const s=new IntersectCurve3(this._surface),r=s.getIntersectPtsChart();r.push(t);let i=1,o=t,g=0;for(;r.length<CONST.MAX_INTERSECTION_NUM;){const I=this._calcNextInterscetPointInfo(o,s,i,n);if(I.isArriveBoundary===0)break;const c=I.newIntCurvPt;if(!c)return;let E;if(r.length===1?(g=t.point.sqDistanceTo(c.point),E=g):E=o.point.sqDistanceTo(c.point),e.length>0&&this._removeInitialIntersectPts(c,e,E),E<this._tol.lengthEps*this._tol.lengthEps)break;if(r.push(c),o=c,c.point.sqDistanceTo(t.point)<g)return r.push(t),s.updateKonts(),{curve:s};if(I.isArriveBoundary===1)break}for(i=-1,r.reverse(),o=t;r.length<CONST.MAX_INTERSECTION_NUM;){const I=this._calcNextInterscetPointInfo(o,s,i,n);if(I.isArriveBoundary===0)break;const c=I.newIntCurvPt;if(!c)return;const E=o.point.sqDistanceTo(c.point);if(e.length>0&&this._removeInitialIntersectPts(c,e,E),E<this._tol.lengthEps*this._tol.lengthEps||(r.push(c),o=c,I.isArriveBoundary===1))break}return r.reverse(),s.updateKonts(),{curve:s}}_estimateNewIntersectPt(t,e,n=1){let s;const r=CONST.MODEL_MAX_LENGTH*10,o=1/(6*(this._useHighPrecision?2:1)*e[2].getLength());if(o>r){const g=r;s=t.point.added(e[1].multiplied(n*g))}else{let g=o;o>50&&(g=Math.sqrt(o-50)+50),s=t.point.added(e[1].multiplied(n*g)).add(e[2].multiplied(g*g/2))}return s}_calcNextInterscetPointInfo(t,e,n,s){let r;const i=e.getIntersectPtsChart();if(i.length<2)s&&(r=s.normalized());else{const w=i[i.length-2].point;r=t.point.subtracted(w).normalize(),r.multiply(n)}const o=e.getDerivativesAtPt(t,2,n>0,r);let g;if(o.length===3)g=this._estimateNewIntersectPt(t,o,n);else{if(o.length<2){o[0]=t.point;const w=this._surface[0].getNormAt(t.uvPara1),y=this._surface[1].getNormAt(t.uvPara2);let M;if(w.equals(y)?M=w.added(y).multiply(.5):M=w.subtracted(y).multiply(.5),!r)throw new Error("防御了这么多层,还出问题,简直绝了!");const N=r.cross(M);N.getSqLength()<Tol.LENGTH_2?o[1]=r:o[1]=M.cross(N).normalize()}if(i.length<2){MathError.warn("可能是曲面重合了!");const w=this._surface[0].getDerivatives(t.uvPara1,2),y=this._surface[1].getDerivatives(t.uvPara2,2);let M=CONST.MAX_INTEGER;const N=[w[3],w[4],w[5],y[3],y[4],y[5]];for(const U of N){const b=U.getSqLength();b<Tol.EDGE_LENGTH_EPS||b<M&&(M=b)}const S=Math.sqrt(M)/10,R=Math.min(S,50);g=t.point.added(o[1].multiplied(n*R))}else{const w=i[i.length-2].point,y=t.point.subtracted(w).getLength();g=t.point.added(o[1].multiplied(n*y))}}const a=this._tol.lengthEps*this._tol.lengthEps*1e4,I=this._adjustEstimatedPtByBoundary(t,o,g,n);if(I){let w=1;return I.point.sqDistanceTo(t.point)<a&&(w=0),{isArriveBoundary:w,newIntCurvPt:I}}const c=(w,y,M)=>{const N=w.getDerivatives(y,1),S=M.subtracted(N[0]),R=N[1].getLength(),U=N[2].getLength(),b=S.dot(N[1].normalized()),G=y.x+b/R,O=S.dot(N[2].normalized()),H=y.y+O/U;return{x:G,y:H}},E=c(this._surface[0],t.uvPara1,g),u=c(this._surface[1],t.uvPara2,g),Q={pt:g,uv1:E,uv2:u};return{isArriveBoundary:-1,newIntCurvPt:this._refineNewIntersectPtIteratively(Q,t.point)}}_estimateSurfaceUV(t,e,n){const s=e.subtracted(t[0]),r=t[1].getLength(),i=t[2].getLength(),o=s.dot(t[1].normalized()),g=n.x+o/r,a=s.dot(t[2].normalized()),I=n.y+a/i;return{x:g,y:I}}_estimateCurveT(t,e,n){const s=t.getDerivatives(n,1),r=e.subtracted(s[0]),i=s[1].getLength(),o=r.dot(s[1].normalized());return n+o/i}_adjustEstimatedPtByBoundary(t,e,n,s=1){const r=n.subtracted(t.point),i=r.normalized(),o=r.getLength(),g=this._tol.lengthEps*100,a=(p,w,y)=>{const M={arriveBoundary:!1,newStepLength:CONST.MAX_INTEGER},N=p===0?this._surf1BoundaryUVs:this._surf2BoundaryUVs;if(!N.rangeU&&!N.rangeV)return M;const S=g*100,R=this._estimateSurfaceUV(y,n,w);if(N.rangeU){const U=i.dot(y[1].normalized());if(Math.abs(U)>S/o){const b=S/y[1].getLength();Util.isNearlyBiggerOrEqual(R.x,N.rangeU.max,b)?(M.newStepLength=Math.abs((N.rangeU.max-w.x)/(R.x-w.x))*o,M.arriveBoundary=!0,M.isArriveVBound=!1,M.boundParam=N.rangeU.max):Util.isNearlySmallerOrEqual(R.x,N.rangeU.min,b)&&(M.newStepLength=Math.abs((w.x-N.rangeU.min)/(w.x-R.x))*o,M.arriveBoundary=!0,M.isArriveVBound=!1,M.boundParam=N.rangeU.min)}}if(N.rangeV){const U=i.dot(y[2].normalized());if(Math.abs(U)>S/o){const b=S/y[2].getLength();if(Util.isNearlyBiggerOrEqual(R.y,N.rangeV.max,b)){const G=Math.abs((N.rangeV.max-w.y)/(R.y-w.y))*o;G<M.newStepLength&&(M.newStepLength=G,M.isArriveVBound=!0,M.boundParam=N.rangeV.max),M.arriveBoundary=!0}else if(Util.isNearlySmallerOrEqual(R.y,N.rangeV.min,b)){const G=Math.abs((w.y-N.rangeV.min)/(w.y-R.y))*o;G<M.newStepLength&&(M.newStepLength=G,M.isArriveVBound=!0,M.boundParam=N.rangeV.min),M.arriveBoundary=!0}}}return M},I=this._surface[0].getDerivatives(t.uvPara1,1),c=this._surface[1].getDerivatives(t.uvPara2,1),E=a(0,t.uvPara1,I),u=a(1,t.uvPara2,c);if(!E.arriveBoundary&&!u.arriveBoundary)return;const Q=Math.min(E.newStepLength,u.newStepLength);if(Q<g)return t;if(e.length<3||e[2].getLength()<this._tol.lengthEps)n.copy(t.point.added(i.multiplied(Q)));else{const p=t.point.added(e[1].multiplied(s*Q)).add(e[2].multiplied(Q*Q/2));n.copy(p)}if(E.newStepLength<=u.newStepLength){const p=this._surface[0].getIsoCurve(E.boundParam,E.isArriveVBound),w=E.isArriveVBound?t.uvPara1.x:t.uvPara1.y,y=this._estimateCurveT(p,n,w),M=this._estimateSurfaceUV(c,n,t.uvPara2),N=CurveSurfaceX.nearParam(p,this._surface[1],y,M,this._tol);if(N){const S=this._estimateSurfaceUV(I,N.point,t.uvPara1);return{point:N.point,uvPara1:S,uvPara2:N.surfaceUV}}}else{const p=this._surface[1].getIsoCurve(u.boundParam,u.isArriveVBound),w=u.isArriveVBound?t.uvPara2.x:t.uvPara2.y,y=this._estimateCurveT(p,n,w),M=this._estimateSurfaceUV(I,n,t.uvPara1),N=CurveSurfaceX.nearParam(p,this._surface[0],y,M,this._tol);if(N){const S=this._estimateSurfaceUV(c,N.point,t.uvPara2);return{point:N.point,uvPara1:N.surfaceUV,uvPara2:S}}}}_refineNewIntersectPtIteratively(t,e){const n=this._surface[0],s=this._surface[1];if(n.getPtAt(t.uv1).equals(t.pt)&&s.getPtAt(t.uv2).equals(t.pt))return{point:t.pt,uvPara1:t.uv1,uvPara2:t.uv2};const r=new SurfacePatch(n,[n.getDomainU(),n.getDomainV()]),i=new SurfacePatch(s,[s.getDomainU(),s.getDomainV()]),o={uvPara1:t.uv1,uvPara2:t.uv2},g={patch1:r,patch2:i};let a=this._calcSurfacePatchPairIntersectPoint(g,o);if(a===void 0){if(a=this._calcSurfacePatchPairIntersectPoint(g,o,!1),a===void 0)return}else if(a.point.sqDistanceTo(t.pt)>e.sqDistanceTo(t.pt)*.81){const I=this._calcSurfacePatchPairIntersectPoint(g,o,!1);I!==void 0&&a.point.sqDistanceTo(t.pt)>I.point.sqDistanceTo(t.pt)&&(a=I)}return a}}class SurfacesXSpecial{static execute(t,e,n=new Tol){if(t.isPlane()&&e.isPlane()){const s=t,r=e;return this._planePlane(s,r,n)}if(t.isPlane()&&e.isCylinder()){const s=t,r=e;return this._planeCylinder(s,r,n)}if(e.isPlane()&&t.isCylinder()){const s=e,r=t;return this._planeCylinder(s,r,n)}if(t.isCylinder()&&e.isCylinder()){const s=t,r=e;return this._cylinderCylinder(s,r,n)}}static _planePlane(t,e,n){if(t.getNorm().isParallel(e.getNorm(),n.angleEps))return[];const s=t.getNorm(),r=e.getNorm(),i=s.cross(r).normalize(),o=i.cross(s),a=e.getOrigin().subtract(t.getOrigin()).dot(r)/r.dot(o),I=o.multiplied(a).add(t.getOrigin());return[{curve:new exports.Ln3(I,i,Interval.infinitArray())}]}static _planeCylinder(t,e,n){if(!e.isEqualAB())return this._planeEllipseCylinder(t,e,n);const s=t.getNorm(),r=t.getOrigin(),i=e.getCenterAxis(),o=e.getCoord().getOrigin(),g=e.getA(),a=i.dot(s),I=D.ptToSurfSigned(o,t),c=o.subtracted(s.multiplied(I)),E=Math.abs(I);if(s.isPerpendicular(i,Tol.ANGLE)){if(E-g>Tol.LENGTH)return[];if(Math.abs(E-g)<=Tol.LENGTH)return[{curve:new exports.Ln3(c,i,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH])}];const S=i.cross(s),R=Math.sqrt(g*g-E*E),U=c.subtracted(S.multiplied(R)),b=c.added(S.multiplied(R)),G=new exports.Ln3(U,i,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),O=new exports.Ln3(b,i,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]);return[{curve:G},{curve:O}]}if(s.isParallel(i,Tol.ANGLE)){const S=new exports.Coord3(c,i);return[{curve:new exports.Arc3(S,g,g,[0,CONST.PI2])}]}const u=r.subtracted(o).dot(s),Q=o.added(i.multiplied(u/a)),p=i.subtracted(s.multiplied(a)),w=s.cross(p),y=new exports.Coord3(Q,p,w);return[{curve:new exports.Arc3(y,g/Math.abs(a),g,[0,CONST.PI2])}]}static _planeEllipseCylinder(t,e,n){const s=e.getCoord(),r=e.getA(),i=e.getB();if(t.getNorm().isParallel(e.getCenterAxis())){const hA=new exports.Ln3(s.getOrigin(),s.getDz(),[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),dA=CurveSurfaceX.allPoints(hA,t),PA=s.clone();return PA.setOrigin(dA[0]),[{curve:new exports.Arc3(PA,r,i,[0,CONST.PI2])}]}const o=s.getLocalToWorldMatrix(),g=o.inversed();if(!g)return MathAssert.warn("transform matrix error!"),[];const a=t.clone().transform(g),I=a.getNorm();if(I.isPerpendicular(new exports.Vec3(0,0,1))){const hA=new exports.Coord2(new exports.Vec2(0,0),new exports.Vec2(1,0)),dA=new exports.Arc2(hA,r,i,!0,[0,CONST.PI2]),PA=a.getOrigin(),yA=new exports.Ln2(new exports.Vec2(PA.x,PA.y),new exports.Vec2(-I.y,I.x),[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),_A=CurvesX.curve2ds(yA,dA);if(_A.length===0)return[];const LA=[];for(const BA of _A){const lA=BA.point,aA=new exports.Ln3(new exports.Vec3(lA.x,lA.y,0),new exports.Vec3(0,0,1),[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]);aA.transform(o);const wA={curve:aA};LA.push(wA)}return LA}const c=new exports.Ln3(new exports.Vec3(0,0,0),new exports.Vec3(0,0,1),[-1e7,1e7]),E=CurveSurfaceX.allPoints(c,a);a.getCoord().setOrigin(E[0]);const u=a.getUDir(),Q=a.getVDir(),p=r*r,w=i*i,y=w*u.x*u.x+p*u.y*u.y,M=2*(w*u.x*Q.x+p*u.y*Q.y),N=w*Q.x*Q.x+p*Q.y*Q.y,S=p*w,R=.5*Math.atan(M/(y-N)),U=Math.cos(R),b=Math.sin(R),G=u.multiplied(U).added(Q.multiplied(b)),H=a.getNorm().cross(G),z=new exports.Coord3(E[0],G,H),tA=y*U*U+N*b*b+M*U*b,nA=N*U*U+y*b*b-M*U*b,IA=Math.sqrt(S/tA),iA=Math.sqrt(S/nA),W=new exports.Arc3(z,IA,iA,[0,CONST.PI2]);return W.transform(o),[{curve:W}]}static _cylinderCylinder(t,e,n){const s=t.getCenterAxis(),r=e.getCenterAxis();if(s.isParallel(r)){if(t.isEqualAB()&&e.isEqualAB()){const N=t.getA(),S=e.getA(),R=t.getCoord().getOrigin(),U=e.getCoord().getOrigin(),b=U.subtracted(R),G=s.dot(b.normalized()),O=b.getSqLength()*(1-G*G),H=(N+S)*(N+S);if(Util.isNearlyBigger(O,H,Tol.LENGTH*Tol.LENGTH))return[];if(Util.isNearlyEqual(O,H,Tol.LENGTH*Tol.LENGTH)){const z=R.added(U).multiplied(.5);return[{curve:new exports.Ln3(z,s,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH])}]}}const I=t.getCoord(),c=exports.Coord2.XOY(),E=new exports.Arc2(c,t.getA(),t.getB(),!0,[0,CONST.PI2]),u=e.getCoord().getOrigin(),Q=I.getLocalPtAt(u),p=c.clone();p.setOrigin(Q.toXY());const w=new exports.Arc2(p,e.getA(),e.getB(),!0,[0,CONST.PI2]),y=CurvesX.curve2ds(E,w);if(y.length===0)return[];const M=[];for(const N of y){const S=I.getWorldPtAt(N.point),U={curve:new exports.Ln3(S,s,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH])};M.push(U)}return M}const i=CONST.MODEL_MAX_LENGTH,o=new exports.Ln3(t.getCoord().getOrigin(),s,[-i,i]),g=new exports.Ln3(e.getCoord().getOrigin(),r,[-i,i]),a=CurvesX.curve3ds(o,g);if(a.length>0&&t.isEqualAB()&&e.isEqualAB()){const I=t.getA(),c=e.getA();if(Util.isNearlyEqual(I,c)){const E=a[0].point,u=s.added(r).normalize(),Q=s.subtracted(r).normalize(),p=u.cross(Q),w=u.dot(s),y=Math.sqrt(1-w*w),M=I/y,N=I/w,S=new exports.Coord3(E,u,p),R=new exports.Arc3(S,M,I,[0,CONST.PI2]),U=new exports.Coord3(E,Q,p),b=new exports.Arc3(U,N,c,[0,CONST.PI2]);return[{curve:R},{curve:b}]}}}}class SurfacesCoplaner{static simple(t,e,n){return t.isCoplanar(e,n)}}class SurfacesXComplex{constructor(t,e,n=new Tol){this._surfacePatchs1=[],this._surfacePatchs2=[],this._singularCurvePatchs1=[],this._singularCurvePatchs2=[],this._surface1=t,this._surface2=e,this._tol=n,this._splitSurface(t,e)}allIntersects(){const t=[];for(const e of this._surfacePatchs1)for(const n of this._surfacePatchs2){const s=SurfacesXSpecial.execute(e.surface,n.surface,this._tol);if(s!==void 0){t.push(...s);continue}const r=new SurfacesXUtil(e.surface,n.surface,this._tol,e.rangeUV,n.rangeUV);t.push(...r.calAllIntersects())}return t}singleIntersectCurve(t,e,n=!1,s=!0){const i=new SurfacesXUtil(this._surface1,this._surface2,this._tol).findSurfaceIntersectPoint(t);if(i===void 0)return;const o=this._getOverlapSurfaceIntersection(i.point);if(o)return o;let g,a;g=this._surfacePatchs1[0],a=this._surfacePatchs2[0];const I={patch1:g,patch2:a,points:[i.point],dir:e,isUsed:!1},c=[];c.push(I);const E=[],u=[],Q=this._tol.lengthEps*1e3;for(const y of c){if(y.isUsed)continue;y.isUsed=!0;const N=new SurfacesXUtil(y.patch1.surface,y.patch2.surface,this._tol,y.patch1.rangeUV,y.patch2.rangeUV).calSingleIntersect(y.points[0],y.dir,n);if(N===void 0){MathAssert.warn(!0,"谨慎核查:一段交线计算失败!!");continue}const S=N.curve,R=S.getIntersectPtsChart();if(R.length===2){const b=S.insertPt(0,.5);MathAssert.warn(b,"交线插点失败!!")}let U=0;for(let b=1;b<R.length;b++){const G=R[b].point.sqDistanceTo(R[b-1].point);U+=G}if(Math.sqrt(U)<Q*10){this._getNextPatchPairForOnePtCurve(y,S,y.dir,u,c,Q);continue}E.push(S),y.points=[R[0].point,R[R.length-1].point],this._updateConnectPatchPairs(y,S,c,Q),this._getNextPatchPair(y,S,u,c,Q)}const p=n?3:2;return E.length<2?E.length===0?void 0:s?E[0].toSimpleCurve3d(p):E[0]:(s||console.warn("复合曲线求交:convertToNurbs失效!!!"),this._spliceIntersectCurves(E,i.point,p,Q))}_splitSurface(t,e){this._surfacePatchs1=[{surface:t}],this._surfacePatchs2=[{surface:e}]}_getNextPatchPairForOnePtCurve(t,e,n,s,r,i){const o=e.getIntersectPtsChart()[0];let g=!1;for(const c of s)if(c.equals(o.point,i)){g=!0;break}if(g)return;s.push(o.point);const a=[];for(const c of this._singularCurvePatchs1)c.curve.containsPt(o.point,i)&&a.push(...c.surfPatchs);const I=[];for(const c of this._singularCurvePatchs2)c.curve.containsPt(o.point,i)&&I.push(...c.surfPatchs);if(a.length===2&&I.length===0){const c=t.patch1===a[0]?a[1]:a[0];r.push({patch1:c,patch2:t.patch2,points:[o.point],dir:n,isUsed:!1})}else if(a.length===0&&I.length===2){const c=t.patch2===I[0]?I[1]:I[0];r.push({patch1:t.patch1,patch2:c,points:[o.point],dir:n,isUsed:!1})}else if(a.length===2&&I.length===2){const c=(E,u,Q)=>{for(const p of r)if(p.patch1===E&&p.patch2===u){for(const w of p.points)if(w.equals(Q,i))return!0;return!1}return!1};for(const E of a)for(const u of I)c(E,u,o.point)||r.push({patch1:E,patch2:u,points:[o.point],dir:n,isUsed:!1})}}_updateConnectPatchPairs(t,e,n,s){const r=e.getIntersectPtsChart(),i=[r[0].point,r[r.length-1].point];for(const o of n)o.isUsed||o.patch1===t.patch1&&o.patch2===t.patch2&&(o.points[0].equals(i[0],s)||o.points[0].equals(i[1],s))&&(o.isUsed=!0)}_getNextPatchPair(t,e,n,s,r){const i=e.getIntersectPtsChart(),o=[i[0],i[i.length-1]];for(let g=0;g<o.length;g++){const a=o[g];let I=!1;for(const Q of n)if(Q.equals(a.point,r)){I=!0;break}if(I)continue;n.push(a.point);const c=[];for(const Q of this._singularCurvePatchs1)if(Q.curve.containsPt(a.point,r)){let p=!0;const w=t.patch1===Q.surfPatchs[0]?Q.surfPatchs[0]:Q.surfPatchs[1],y=w.surface.getUVAt(Q.curve.getStartPt()),M=w.surface.getUVAt(Q.curve.getMidPt()),N=Util.isNearlyEqual(y.x,M.x),S=Util.isNearlyEqual(y.y,M.y),R=w.surface.getDerivatives(y,1);if(N&&S)throw new Error("");if(N){const U=y.x,b=r/R[1].getLength();for(const G of i)if(!Util.isNearlyEqual(G.uvPara1.x,U,b)){p=!1;break}}else if(S){const U=y.y,b=r/R[2].getLength();for(const G of i)if(!Util.isNearlyEqual(G.uvPara1.y,U,b)){p=!1;break}}if(p)return;c.push(...Q.surfPatchs)}const E=[];for(const Q of this._singularCurvePatchs2)if(Q.curve.containsPt(a.point,r)){let p=!0;const w=t.patch2===Q.surfPatchs[0]?Q.surfPatchs[0]:Q.surfPatchs[1],y=w.surface.getUVAt(Q.curve.getStartPt()),M=w.surface.getUVAt(Q.curve.getMidPt()),N=Util.isNearlyEqual(y.x,M.x),S=Util.isNearlyEqual(y.y,M.y),R=w.surface.getDerivatives(y,1);if(N&&S)throw new Error("");if(N){const U=y.x,b=r/R[1].getLength();for(const G of i)if(!Util.isNearlyEqual(G.uvPara2.x,U,b)){p=!1;break}}else if(S){const U=y.y,b=r/R[2].getLength();for(const G of i)if(!Util.isNearlyEqual(G.uvPara2.y,U,b)){p=!1;break}}if(p)return;E.push(...Q.surfPatchs)}let u;if(g===0?u=i[0].point.subtracted(i[1].point):u=i[i.length-1].point.subtracted(i[i.length-2].point),c.length===2&&E.length===0){const Q=t.patch1===c[0]?c[1]:c[0];s.push({patch1:Q,patch2:t.patch2,points:[a.point],dir:u,isUsed:!1})}else if(c.length===0&&E.length===2){const Q=t.patch2===E[0]?E[1]:E[0];s.push({patch1:t.patch1,patch2:Q,points:[a.point],dir:u,isUsed:!1})}else if(c.length===2&&E.length===2){const p=t.patch1.surface.getDerivatives(a.uvPara1,1)[2],w=t.patch1.rangeUV[1];Math.abs(a.uvPara1.y-w.min)<Math.abs(a.uvPara1.y-w.max)&&p.reverse();const y=t.patch1===c[0]?c[1]:c[0],M=u.dot(p)>0?y:t.patch1,S=t.patch2.surface.getDerivatives(a.uvPara2,1)[2],R=t.patch2.rangeUV[1];Math.abs(a.uvPara2.y-R.min)<Math.abs(a.uvPara2.y-R.max)&&S.reverse();const U=t.patch2===E[0]?E[1]:E[0],b=u.dot(S)>0?U:t.patch2;s.push({patch1:M,patch2:b,points:[a.point],dir:u,isUsed:!1})}}}_spliceIntersectCurves(t,e,n,s){for(const o of t){const g=o.getIntersectPtsChart();if(g.length>3){let a=1;for(;a<g.length-1;a++){const I=g[a].point.sqDistanceTo(g[a-1].point),c=g[a+1].point.sqDistanceTo(g[a-1].point);I<c/1e4&&g.splice(a,1)}if(g.length>3){const I=g.length-1,c=g[I].point.sqDistanceTo(g[I-1].point),E=g[I].point.sqDistanceTo(g[I-2].point);c<E/1e4&&g.splice(I-1,1)}}}const r=[];for(let o=1;o<t.length;o++){let g=t[o];if(o===1){const a=t[0],I=t[1];let c=a;if(a.getIntersectPtsChart().length<I.getIntersectPtsChart().length&&(c=I,g=a),c.getIntersectPtsChart().map(E=>r.push(E.point)),r.length===2){const E=c.getInsertPt(0,.5);r.splice(1,0,E)}}this._spliceCurve(r,g,s)}if(r[0].equals(r[r.length-1],s)&&!r[0].equals(e,s)){const o=r.findIndex(g=>g.equals(e,s));if(o>0){r.pop();const g=r.slice(0,o);r.splice(0,o),r.push(...g),r.push(r[0])}}return exports.NurbsCurve3.makeByInterpolationPts(r,n)}_spliceCurve(t,e,n){const s=t[0],r=t[t.length-1];if(s.sqDistanceTo(r)<n*n){MathAssert.warn(!0,"未实现:周期性交线拼接曲线!");return}const i=e.getStartPt(),o=e.getEndPt(),g=[];g.push(s.sqDistanceTo(i)),g.push(s.sqDistanceTo(o)),g.push(r.sqDistanceTo(i)),g.push(r.sqDistanceTo(o));let a=0,I=g[0];for(let E=1;E<4;E++)g[E]<I&&(a=E,I=g[E]);if(I>n)throw new Error("曲线不相连!");const c=[.05,.1];if(e.isLine3d()){if(e.getLength()<n)return;if(a===0||a===1){a===0&&e.reverse();const u=e.getStartPt(),Q=e.getEndPt(),p=u.multiplied(c[1]).add(Q.multiplied(1-c[1])),w=u.multiplied(c[0]).add(Q.multiplied(1-c[0]));t.splice(0,0,u,p,w)}else{a===3&&e.reverse();const u=e.getStartPt(),Q=e.getEndPt(),p=u.multiplied(1-c[0]).add(Q.multiplied(c[0])),w=u.multiplied(1-c[1]).add(Q.multiplied(c[1]));t.push(p,w,Q)}}else if(e instanceof IntersectCurve3){const E=e.getIntersectPtsChart(),u=[];if(E.map(Q=>u.push(Q.point)),a===0||a===2){if(u.length===2){const Q=e.getInsertPt(0,c[0]),p=e.getInsertPt(0,c[1]);u.splice(0,1,Q,p)}else if(u.length===3){const Q=e.getInsertPt(0,c[0]);u.splice(0,1,Q)}else u.splice(0,1);a===0?(u.reverse(),t.splice(0,0,...u)):t.push(...u)}else{if(u.length===2){const Q=e.getInsertPt(0,1-c[1]),p=e.getInsertPt(0,1-c[0]);u.pop(),u.push(Q,p)}else if(u.length===3){const Q=e.getInsertPt(1,c[0]);u.pop(),u.push(Q)}else u.pop();a===1?t.splice(0,0,...u):(u.reverse(),t.push(...u))}}else throw new Error("")}_getOverlapSurfaceIntersection(t){for(let e=0;e<this._surfacePatchs1.length;e++){const n=this._surfacePatchs1[e];for(let s=0;s<this._surfacePatchs2.length;s++){const r=this._surfacePatchs2[s];if(SurfacesCoplaner.simple(n.surface,r.surface,this._tol)){let i;if(this._surfacePatchs1.length>1){if(e===0)i=this._singularCurvePatchs1[0].curve;else if(e===2)i=this._singularCurvePatchs1[1].curve;else if(e===1){const g=PtToCurve3Distance.execute(t,this._singularCurvePatchs1[0].curve),a=PtToCurve3Distance.execute(t,this._singularCurvePatchs1[1].curve);i=g.distance<a.distance?this._singularCurvePatchs1[0].curve:this._singularCurvePatchs1[1].curve}}let o;if(this._surfacePatchs2.length>1){if(s===0)o=this._singularCurvePatchs2[0].curve;else if(s===2)o=this._singularCurvePatchs2[1].curve;else if(s===1){const g=PtToCurve3Distance.execute(t,this._singularCurvePatchs2[0].curve),a=PtToCurve3Distance.execute(t,this._singularCurvePatchs2[1].curve);i=g.distance<a.distance?this._singularCurvePatchs2[0].curve:this._singularCurvePatchs2[1].curve}}if(i&&!o)return i;if(!i&&o)return o;if(i&&o){const g=i.getStartPt(),a=i.getEndPt(),I=this._surface2.containsPt(g),c=this._surface2.containsPt(a);if(I||c){if(I&&c)return i;const S=this._surface2.getDomainU();if(I){const R=this._surface2.getIsoCurve(S.max,!1),U=X.curve3ds(R,i);if(U)return MathAssert.warn(U.length>1,"奇异曲线交点个数大于1"),i.getRange().max=U[0].param2,i;const b=this._surface2.getIsoCurve(S.min,!1),G=X.curve3ds(b,i);if(G)return MathAssert.warn(G.length>1,"奇异曲线交点个数大于1"),i.getRange().max=G[0].param2,i;MathAssert.warn(!1,"奇异曲线交点个数错误")}else{const R=this._surface2.getIsoCurve(S.min,!1),U=X.curve3ds(R,i);if(U)return MathAssert.warn(U.length>1,"奇异曲线交点个数大于1"),i.getRange().min=U[0].param2,i;const b=this._surface2.getIsoCurve(S.max,!1),G=X.curve3ds(b,i);if(G)return MathAssert.warn(G.length>1,"奇异曲线交点个数大于1"),i.getRange().min=G[0].param2,i;MathAssert.warn(!1,"奇异曲线交点个数错误")}return i}const E=o.getStartPt(),u=o.getEndPt(),Q=this._surface1.containsPt(E),p=this._surface1.containsPt(u);if(Q||p){if(Q&&p)return o;const S=this._surface1.getDomainU();if(I){const R=this._surface1.getIsoCurve(S.max,!1),U=X.curve3ds(R,o);if(U)return MathAssert.warn(U.length>1,"奇异曲线交点个数大于1"),o.getRange().max=U[0].param2,o;const b=this._surface1.getIsoCurve(S.min,!1),G=X.curve3ds(b,i);if(G)return MathAssert.warn(G.length>1,"奇异曲线交点个数大于1"),o.getRange().max=G[0].param2,o;MathAssert.warn(!1,"奇异曲线交点个数错误")}else{const R=this._surface1.getIsoCurve(S.min,!1),U=X.curve3ds(R,i);if(U)return MathAssert.warn(U.length>1,"奇异曲线交点个数大于1"),o.getRange().min=U[0].param2,o;const b=this._surface1.getIsoCurve(S.max,!1),G=X.curve3ds(b,o);if(G)return MathAssert.warn(G.length>1,"奇异曲线交点个数大于1"),o.getRange().min=G[0].param2,o;MathAssert.warn(!1,"奇异曲线交点个数错误")}return o}const w=[],y=this._surface1.getDomainU().toArray();for(const S of y){const R=this._surface1.getIsoCurve(S,!1),U=X.curve3ds(R,o);U&&(MathAssert.warn(U.length>1,"奇异曲线交点个数大于1"),w.push(U[0].param2))}if(w.length>0)return w.length===2?(w[0]>w[1]&&([w[0],w[1]]=[w[1],w[0]]),o.setRange(w[0],w[1])):MathAssert.warn(w.length===2,"奇异曲线交点个数错误"),o;const M=[],N=this._surface2.getDomainU().toArray();for(const S of N){const R=this._surface2.getIsoCurve(S,!1),U=X.curve3ds(R,i);U&&(MathAssert.warn(U.length>1,"奇异曲线交点个数大于1"),M.push(U[0].param2))}return M.length>0?(M.length===2?(M[0]>M[1]&&([M[0],M[1]]=[M[1],M[0]]),i.setRange(M[0],M[1])):MathAssert.warn(M.length===2,"奇异曲线交点个数错误"),i):void 0}}}}}}class SurfaceSelfX{static singleIntersectCurve(t,e,n,s,r=Tol.DEFAULT,i=!1){}}class SurfacesX{static allIntersections(t,e,n,s,r,i,o=Tol.DEFAULT,g=!1){if(this._isComplexSurface(t)||this._isComplexSurface(e))return new SurfacesXComplex(t,e,o).allIntersects();const a=SurfacesXSpecial.execute(t,e,o);return a!==void 0?a:new SurfacesXUtil(t,e,o).calAllIntersects(n,s,r,i,g)}static singleCurveBetweenTwoPoints(t,e,n,s,r,i=Tol.DEFAULT,o=!1){const g=SurfacesXSpecial.execute(t,e,i);if(g!==void 0){const u=[];for(const N of g)N.curve&&u.push(N.curve);const Q=this.getNearstCurve(u,n,r);if(!Q)return;const p=Q.getParamAt(n),w=Q.getTangentAt(p);r&&w.dot(r)<0&&Q.reverse();let y=Q.getParamAt(s);if(!Q.isPeriodic())return p>y?Q.setRange(y,p):Q.setRange(p,y),Q;const M=Q.getRange().period;return Util.isNearlySmallerOrEqual(y,p,i.numberEps)&&(y+=M),Q.setRange(p,y),Q}if(SurfacesCoplaner.simple(t,e,i)){MathAssert.warn("简单曲面重合,没有单条交线!");return}const I=new SurfacesXUtil(t,e,i).calSingleIntersect(n,r,o);if(I===void 0||I.curve===void 0)return;const c=o?3:2;return I.curve.toNurbsBetweenPoints(c,n,s,r)}static singleCurveNearPointSimple(t,e,n,s,r=Tol.DEFAULT,i=!1){const o=SurfacesXSpecial.execute(t,e,r);if(o!==void 0){const g=[];for(const a of o)a.curve&&g.push(a.curve);return this.getNearstCurve(g,n,s)}if(SurfacesCoplaner.simple(t,e,r)){MathAssert.warn("简单曲面重合,没有单条交线!");return}return this._singleCurveNearPoint(t,e,n,s,r,i)}static singleCurveNearPoint(t,e,n,s,r=Tol.DEFAULT,i=!1,o=!0){const g=SurfacesXSpecial.execute(t,e,r);if(g!==void 0){const a=[];for(const I of g)I.curve&&a.push(I.curve);return this.getNearstCurve(a,n,s)}if(this._isComplexSurface(t)||this._isComplexSurface(e)){const I=new SurfacesXComplex(t,e,r).singleIntersectCurve(n,s,i);return I||this._singleCurveNearPoint(t,e,n,s,r,i,o)}if(SurfacesCoplaner.simple(t,e,r)){MathAssert.warn("简单曲面重合,没有单条交线!");return}return this._singleCurveNearPoint(t,e,n,s,r,i,o)}static selfIntersectCurve(t,e,n,s,r=Tol.DEFAULT,i=!1){return SurfaceSelfX.singleIntersectCurve(t,e,n,s,r,i),this.singleCurveNearParam(t,t,e,n,s,r,i)}static singleCurveNearParam(t,e,n,s,r,i=Tol.DEFAULT,o=!1){const a=new SurfacesXUtil(t,e,i).calSingleSelfIntersect(n,s,r,o);if(a)return a.curve.toSimpleCurve3d(3)}static getNearstCurve(t,e,n){if(t.length<1)return;if(t.length===1)return t[0];let s=[],r=CONST.MODEL_MAX_LENGTH;for(let g=0;g<t.length;g++){const a=D.ptToCurve3d(e,t[g]);Util.isNearlySmaller(a,r)?(s=[g],r=a):Util.isNearlyEqual(a,r)&&s.push(g)}if(s.length===1||n===void 0)return t[s[0]];let i=s[0],o=CONST.PI;for(const g of s){const a=t[g].getParamAt(e),I=t[g].getTangentAt(a);let c=n.angle(I);c=c>CONST.PI_2-Tol.ANGLE?CONST.PI-c:c,c<o&&(i=g,o=c)}return t[i]}static _isComplexSurface(t){return!1}static _singleCurveNearPoint(t,e,n,s,r,i,o=!0){const a=new SurfacesXUtil(t,e,r).calSingleIntersect(n,s,i);if(a){if(!o)return a.curve;const I=a.curve,c=i?3:2;return I.toSimpleCurve3d(c)}}}class CurvesXUtil{static curve2dCurve2d(t,e,n=Tol.DEFAULT){if(!t||!e)return[];const s=t.getBBox(),r=e.getBBox();if(!s.intersectsBox(r,n.lengthEps))return[];const i=new Curve2dSegment(t);i.range=t.getRange(),i.depth=0;const o=new Curve2dSegment(e);o.range=e.getRange(),o.depth=0;const g=[],a=[];g.push(i),a.push(o);const I=[],c=new Curve2dSegmentPair(i,o);I.push(c);const E=this.getEndPtIntersect(t,e,n);return this._dealSingularityIntersect(t,e,E,n),this._calCurve2dSegmentsIntersect(g,a,I,E,n),E}static curve3dCurve3d(t,e,n=Tol.DEFAULT){if(!t||!e)return[];const s=t.getBBox(),r=e.getBBox();if(!s.intersectsBox(r,n.lengthEps))return[];let i;t.isNurbsCurve3d()&&t.getControlPoints().length<10?(i=t.clone(),i.knotRefinement()):i=t;let o;e.isNurbsCurve3d()&&e.getControlPoints().length<10?(o=e.clone(),o.knotRefinement()):o=e;const g=new Curve3dSegment(i);g.range=i.getRange(),g.depth=0;const a=new Curve3dSegment(o);a.range=o.getRange(),a.depth=0;const I=[],c=[];I.push(g),c.push(a);const E=[],u=new Curve3dSegmentPair(g,a);E.push(u);const Q=this.getEndPtIntersect(i,o,n);return this._dealSingularityIntersect(i,o,Q,n),this._calCurve3dSegmentsIntersect(I,c,E,Q,n),Q}static curve2dsSingleX(t,e,n,s=Tol.DEFAULT){const r=new Curve2dSegment(t),i=new Curve2dSegment(e);r.range=t.getRange(),i.range=e.getRange();const o=new Curve2dSegmentPair(r,i),g=this._calCurveSegmentPairIntersect(o,s,n);return g||this._getNearestSingularityIntersect(t,e,n)}static curve3dsSingleX(t,e,n,s=Tol.DEFAULT){const r=new Curve3dSegment(t),i=new Curve3dSegment(e);r.range=t.getRange(),i.range=e.getRange();const o=new Curve3dSegmentPair(r,i),g=this._calCurveSegmentPairIntersect(o,s,n);return g||this._getNearestSingularityIntersect(t,e,n)}static getEndPtIntersect(t,e,n){const s=[],r=[t.getStartPt(),t.getEndPt()];for(let o=0;o<r.length;o++){if(this._isRedundantPt(r[o],s,n))continue;const g=e.getParamAt(r[o]);if(e.getPtAt(g).sqDistanceTo(r[o])<n.lengthEps2&&e.getRange().containsPt(g,n.lengthEps)){const I={point:r[o],param1:o===0?t.getStartParam():t.getEndParam(),param2:g,isOverlap:!1};s.push(I)}}const i=[e.getStartPt(),e.getEndPt()];for(let o=0;o<i.length;o++){if(this._isRedundantPt(i[o],s,n))continue;const g=t.getParamAt(i[o]);if(t.getPtAt(g).sqDistanceTo(i[o])<n.lengthEps2&&t.getRange().containsPt(g,n.lengthEps)){const I={point:i[o],param1:g,param2:o===0?e.getStartParam():e.getEndParam(),isOverlap:!1};s.push(I)}}return s}static _getNearestSingularityIntersect(t,e,n,s=Tol.DEFAULT){const r=this._dealSingularityIntersect(t,e,[],s);if(r.length===0)return;let i=r[0];if(n instanceof exports.Vec3){let o=i.point.sqDistanceTo(n);for(let g=1;g<r.length;g++){const a=r[g].point.sqDistanceTo(n);a<o&&(o=a,i=r[g])}}else if(Array.isArray(n)){const o=t.getPtAt(n[0]),g=e.getPtAt(n[1]);let a=o.sqDistanceTo(i.point)+g.sqDistanceTo(i.point);for(let I=1;I<r.length;I++){const c=r[I].point,E=c.sqDistanceTo(o)+c.sqDistanceTo(g);E<a&&(a=E,i=r[I])}}else throw new Error("unexcepted case");return i}static _calCurve2dSegmentsIntersect(t,e,n,s,r=Tol.DEFAULT){let i=[],o=0;for(;o<CONST.MAX_SUBDEVIDE_DEPTH;){for(const a of t){const I=[],c=new Curve2dSegment(a.curve),E=new Curve2dSegment(a.curve);I.push(c),I.push(E),CurveSegment.subdivideCurveSegment(a,I)}for(const a of e){const I=[],c=new Curve2dSegment(a.curve),E=new Curve2dSegment(a.curve);I.push(c),I.push(E),CurveSegment.subdivideCurveSegment(a,I)}if(!CurveSegmentPair.combineCurveSegmentPairs(n,i))break;if(this._FilterCurvSegmentPairs(i,r.lengthEps),i.length===0){n.splice(0);break}Curve3dSegmentPair.refreshCurveSegments(i,t,e),n.splice(0),n.push(...i),i=[],o++}for(const g of n){const a=this._calCurveSegmentPairIntersect(g,r);a&&!this._dealRedundantIntersect(g,a,s,r)&&s.push(a)}}static _calCurve3dSegmentsIntersect(t,e,n,s,r=Tol.DEFAULT){let i=[],o=0;for(;o<CONST.MAX_SUBDEVIDE_DEPTH;){for(const a of t){const I=[],c=new Curve3dSegment(a.curve),E=new Curve3dSegment(a.curve);I.push(c),I.push(E),CurveSegment.subdivideCurveSegment(a,I)}for(const a of e){const I=[],c=new Curve3dSegment(a.curve),E=new Curve3dSegment(a.curve);I.push(c),I.push(E),CurveSegment.subdivideCurveSegment(a,I)}if(!CurveSegmentPair.combineCurveSegmentPairs(n,i))break;if(this._FilterCurvSegmentPairs(i,r.lengthEps),i.length===0){n.splice(0);break}Curve3dSegmentPair.refreshCurveSegments(i,t,e),n.splice(0),n.push(...i),i=[],o++}for(const g of n){const a=this._calCurveSegmentPairIntersect(g,r);a&&!this._dealRedundantIntersect(g,a,s,r)&&s.push(a)}}static _dealSingularityIntersect(t,e,n,s=Tol.DEFAULT){const r=s.lengthEps*s.lengthEps*.01,i=[],o=(g,a,I)=>{let c=[];(g instanceof exports.OffsetCurve3||g instanceof exports.OffsetCurve2)&&(c=g.getSingularities());for(const E of c){const u=g.getPtAt(E);if(this._isRedundantPt(u,n,s))continue;const Q=I.getParamAt(u);I.getPtAt(Q).sqDistanceTo(u)<r&&I.getRange().containsPt(Q,s.lengthEps)&&(a?i.push({point:u,param1:E,param2:Q,isOverlap:!1}):i.push({point:u,param1:Q,param2:E,isOverlap:!1}))}};return o(t,!0,e),o(e,!1,t),i}static _isRedundantPt(t,e,n){for(const s of e)if(t.equals(s.point,n.lengthEps))return!0;return!1}static _dealRedundantIntersect(t,e,n,s=Tol.DEFAULT){const r=s.angleEps*100;for(let i=0;i<n.length;i++){const o=t.segment1.curve,g=t.segment2.curve,a=e.point.sqDistanceTo(n[i].point);if(a<=s.lengthEps2){const I=o.getPtAt(n[i].param1).sqDistanceTo(g.getPtAt(n[i].param2));return o.getPtAt(e.param1).sqDistanceTo(g.getPtAt(e.param2))<I&&n.splice(i,1,e),!0}if(a<=s.edgeLengthEps2){const I=o.getPtAt(n[i].param1).sqDistanceTo(g.getPtAt(n[i].param2)),c=o.getPtAt(e.param1).sqDistanceTo(g.getPtAt(e.param2)),E=Math.sqrt(Math.min(I,c));if(E>Tol.PROCESS_LENGTH_EPS/100){const Q=Math.min(E/10,Tol.PROCESS_LENGTH_EPS),p=e.point.midTo(n[i].point),w=o.getFootByIterate(p,e.param1,Q),y=g.getFootByIterate(p,e.param2,Q),M=w!==void 0&&y!==void 0?o.getPtAt(w).sqDistanceTo(g.getPtAt(y)):CONST.MODEL_MAX_LENGTH;if(M<I&&M<c){const N={point:o.getPtAt(w),param1:w,param2:y,isOverlap:!1};return n.splice(i,1,N),!0}}const u=Q=>{const p=o.getTangentAt(Q.param1,!0),w=o.getTangentAt(Q.param1,!1),y=g.getTangentAt(Q.param2,!0),M=g.getTangentAt(Q.param2,!1);return p.isParallel(y,r)||p.isParallel(M,r)||w.isParallel(y,r)||w.isParallel(M,r)};if(I>Tol.CALCULATE_EPS2&&c<I){if(u(e))return n.splice(i,1,e),!0}else if(u(n[i]))return!0}}return!1}static _FilterCurvSegmentPairs(t,e=Tol.LENGTH){for(let n=0;n<t.length;n++){const s=t[n],r=s.segment1,i=s.segment2,o=r.getSegBox(),g=i.getSegBox();if(o instanceof Box2&&g instanceof Box2)o.intersectsBox(g,e)||(t.splice(n,1),n--);else if(o instanceof Box3&&g instanceof Box3)o.intersectsBox(g,e)||(t.splice(n,1),n--);else throw new Error("curve求交:curve3d和curve2d混合搭配!")}}static _calCurveSegmentPairIntersect(t,e=Tol.DEFAULT,n){const s=t.segment1,r=t.segment2,i=s.curve,o=r.curve;let g;if(n)n instanceof Vec?(g=[i.getParamAt(n),o.getParamAt(n)],g[0]=i.getDomain().clamp(g[0]),g[1]=o.getDomain().clamp(g[1])):g=n;else if(i instanceof Curve2&&o instanceof Curve2){const w=i.getPtAt(s.range.min),y=i.getPtAt(s.range.max),M=o.getPtAt(r.range.min),N=o.getPtAt(r.range.max),S=new exports.Ln2(w,y),R=new exports.Ln2(M,N),U=new exports.Vec2,b=new exports.Vec2;if(D.curve2s(S,R,U,b)<e.lengthEps*100){const O=i.getParamAt(U),H=o.getParamAt(b);g=[O,H],g[0]=i.getDomain().clamp(g[0]),g[1]=o.getDomain().clamp(g[1])}else g=[s.range.getMid(),r.range.getMid()],i.isLine2d()&&(g[0]=i.getParamAt(r.getSegBox().getCenter())),o.isLine2d()&&(g[1]=o.getParamAt(s.getSegBox().getCenter()))}else g=[s.range.getMid(),r.range.getMid()],i.isLine3d()&&(g[0]=i.getParamAt(r.getSegBox().getCenter())),o.isLine3d()&&(g[1]=o.getParamAt(s.getSegBox().getCenter()));if(!curvesIteration(s.curve,r.curve,g,e))return;if(s.curve.getRange().containsPt(g[0],e.lengthEps)&&r.curve.getRange().containsPt(g[1],e.lengthEps)){const w=s.curve.getPtAt(g[0]),y=s.curve.getRange();y instanceof PeriodInterval&&(g[0]=y.getRegularParam(g[0],e.lengthEps));const M=r.curve.getRange();return M instanceof PeriodInterval&&(g[1]=M.getRegularParam(g[1],e.lengthEps)),{point:w,param1:g[0],param2:g[1],isOverlap:!1}}const I=s.curve.getDerivatives(g[0],1)[1],c=r.curve.getDerivatives(g[1],1)[1];if(!I.isParallel(c,e.angleEps*100))return;const E=I.getLength(),u=c.getLength(),Q=Math.sign(I.dot(c));function p(w,y){let M,N,S,R,U;y?(M=r,N=s,S=g[1],R=g[0],U=u/E*Q):(M=s,N=r,S=g[0],R=g[1],U=E/u*Q);const b=w-S,G=R+b*U;if(!N.range.containsPt(G))return;const O=M.curve.getPtAt(w),H=N.curve.getPtAt(G);if(O.sqDistanceTo(H)<e.lengthEps*e.lengthEps)return{point:O.add(H).multiply(.5),param1:y?G:w,param2:y?w:G,isOverlap:!1}}if(g[0]<s.range.min)return p(s.range.min,!1);if(g[0]>s.range.max)return p(s.range.max,!1);if(g[1]<r.range.min)return p(r.range.min,!0);if(g[1]>s.range.max)return p(r.range.max,!0)}}class CircularsX{static arc2dAndArc2d(t,e,n=Tol.DEFAULT){const s=CurvesOverlap.arcs(t,e,n);return s.length>0?s.map(i=>XInfoUtil.curvesFromOverlap(i,t,e,n)):!t.isEqualAB()||!e.isEqualAB()?this._ellipse2s(t,e,n):this._circle2dAndCircle2d(t,e,n.lengthEps)}static arc3dAndArc3d(t,e,n=Tol.DEFAULT){const s=CurvesOverlap.arcs(t,e,n);if(s.length>0)return s.map(I=>XInfoUtil.curvesFromOverlap(I,t,e,n));const r=[],i=new exports.Plane(t.getCenter(),t.getCoord().getDx(),t.getCoord().getDy()),o=new exports.Plane(e.getCenter(),e.getCoord().getDx(),e.getCoord().getDy());if(i.getNorm().isParallel(o.getNorm(),n.angleEps)){const a=t.getCenter().subtract(e.getCenter()).dot(i.getNorm());if(Util.isNearly0(a,n.lengthEps)){const I=new exports.Arc2(exports.Coord2.XOY(),t.getA(),t.getB(),!0,t.getRange().toArray()),c=t.getCoord(),E=e.getCoord(),u=new exports.Coord2(c.getLocalPtAt(E.getOrigin()),c.getLocalVectorAt(E.getDx())),Q=i.getNorm().dot(o.getNorm())>0,p=new exports.Arc2(u,e.getA(),e.getB(),Q,e.getRange().toArray());let w;!I.isEqualAB()||!p.isEqualAB()?w=this._ellipse2s(I,p,n):w=this._circle2dAndCircle2d(I,p,n.lengthEps);for(const y of w)r.push({point:c.getWorldPtAt(y.point),param1:y.param1,param2:y.param2,isOverlap:!1})}else return[]}else{const a=SurfacesX.allIntersections(i,o);if(a.length<1||a[0].curve===void 0)return[];const I=new exports.Arc2(exports.Coord2.XOY(),t.getA(),t.getB(),!0,t.getRange().toArray()),c=a[0].curve,E=t.getCoord().getLocalPtAt(c.getOrigin()),u=t.getCoord().getLocalVectorAt(c.getDirection()),Q=new exports.Ln2(E,u,Interval.infinitArray()),p=LineCircleX.line2dAndArc2d(Q,I,Tol.DEFAULT),w=[];for(const y of p){const M=t.getCoord().getWorldPtAt(y.point);w.push({intersectPt:M,param:y.param2})}for(const y of w){const M=e.getParamAt(y.intersectPt);if(e.getPtAt(M).distanceTo(y.intersectPt)>n.lengthEps)continue;const S=n.lengthEps/(e.getA()+e.getB());e.getRange().containsPt(M,S)&&r.push({point:y.intersectPt,param1:y.param,param2:M,isOverlap:!1})}}return r}static _ellipse2s(t,e,n=Tol.DEFAULT){return CurvesXUtil.curve2dCurve2d(t,e,n)}static _circle2dAndCircle2d(t,e,n=Tol.LENGTH){const s=t.getCenter(),r=e.getCenter(),i=(t.getA()+t.getB())/2,o=(e.getA()+e.getB())/2,g=r.subtracted(s),a=g.clone().normalize(),I=g.getLength(),c=i+o,E=Math.abs(i-o);if(g.isZero(n)){if(!Util.isNearlyEqual(i,o,n))return[];if(Util.isNearlyEqual(i,o,n)){const y=t.getParamAt(e.getStartPt());if(t.getRange().containsPt(y,n))return[{point:e.getStartPt(),param1:y,param2:e.getRange().min,isOverlap:!1}];const M=t.getParamAt(e.getEndPt());if(t.getRange().containsPt(M,n))return[{point:e.getEndPt(),param1:M,param2:e.getRange().max,isOverlap:!1}];const N=e.getParamAt(t.getStartPt());if(e.getRange().containsPt(N,n))return[{point:t.getStartPt(),param1:t.getRange().min,param2:N,isOverlap:!1}];const S=e.getParamAt(t.getEndPt());return e.getRange().containsPt(S,n)?[{point:t.getEndPt(),param1:t.getRange().max,param2:S,isOverlap:!1}]:[]}}if(I>c+n||I<E-n)return[];const u=[],Q=Math.min(Tol.LENGTH,n);if(Util.isNearlyBiggerOrEqual(I,c,Q)&&Util.isNearlyEqual(I,c,n)){const y=s.clone().add(a.multiply(i)),M=t.getParamAt(y),N=e.getParamAt(y);u.push({point:y,param1:M,param2:N,isOverlap:!1})}else if(Util.isNearlySmallerOrEqual(I,E,Q)&&Util.isNearlyEqual(I,E,n)){let y;o>=i?y=s.add(a.multiply(-i)):y=r.add(a.multiply(o));const M=t.getParamAt(y),N=e.getParamAt(y);u.push({point:y,param1:M,param2:N,isOverlap:!1})}else{const y=new exports.Vec2(-a.y,a.x),M=I*I+i*i-o*o,N=.5*M/I,S=.5*Math.sqrt(4*I*I*i*i-M*M)/I,R=s.clone().add(a.multiplied(N)).add(y.multiplied(S)),U=s.clone().add(a.multiplied(N)).add(y.multiplied(-S));if(R.equals(U,n)){const b=R.interpolate(U,.5);u.push({point:b,param1:t.getParamAt(b),param2:e.getParamAt(b),isOverlap:!1})}else{let b=t.getParamAt(R),G=e.getParamAt(R);u.push({point:R,param1:b,param2:G,isOverlap:!1}),b=t.getParamAt(U),G=e.getParamAt(U),u.push({point:U,param1:b,param2:G,isOverlap:!1})}}const p=n/t.getA(),w=n/e.getA();return u.filter(y=>t.getRange().containsPt(y.param1,p)&&e.getRange().containsPt(y.param2,w))}}class CurvesX{static curve2ds(t,e,n=Tol.DEFAULT){if(t instanceof exports.Ln2){if(e instanceof exports.Ln2)return LinesX.line2ds(t,e,n);if(e instanceof exports.Arc2){const r=LineCircleX.line2dAndArc2d(t,e,n);return r.length>0?r:CurvesXUtil.getEndPtIntersect(t,e,n)}}else if(t instanceof exports.Arc2){if(e instanceof exports.Ln2){const r=LineCircleX.line2dAndArc2d(e,t,n),i=CurvesX._swapParams(r);return i.length>0?i:CurvesXUtil.getEndPtIntersect(t,e,n)}if(e instanceof exports.Arc2){const r=CircularsX.arc2dAndArc2d(t,e,n);return r.length>0?r:CurvesXUtil.getEndPtIntersect(t,e,n)}}const s=CurvesOverlap.curve2ds(t,e,n);return s.length>0?s.map(i=>XInfoUtil.curvesFromOverlap(i,t,e,n)):CurvesXUtil.curve2dCurve2d(t,e,n)}static curve3ds(t,e,n=Tol.DEFAULT){return CurvesX._curve3dsSimple(t,e,n)}static curve3dsNearPoint(t,e,n,s=Tol.DEFAULT){let r;return t.isLine3d()?e.isLine3d()||e.isArc3d()?r=this._byGeometricOrAnalyticMethod(t,e,s):r=void 0:e.isLine3d()&&(t.isLine3d()||t.isArc3d()?r=this._byGeometricOrAnalyticMethod(t,e,s):r=void 0),r!==void 0?(r.sort((i,o)=>i.point.sqDistanceTo(n)-o.point.sqDistanceTo(n)),r[0]):CurvesXUtil.curve3dsSingleX(t,e,n,s)}static _curve3dsSimple(t,e,n=Tol.DEFAULT){const s=this._byGeometricOrAnalyticMethod(t,e,n);if(s){if(s.length===1&&s[0].isOverlap===!1&&t.getTangentAt(s[0].param1).isParallel(e.getTangentAt(s[0].param2),n.angleEps)){const i=n.lengthEps/100;if(t.getStartPt().equals(e.getStartPt(),i)){const o=t.getStartPt().midTo(e.getStartPt());if(o.equals(s[0].point,n.edgeLengthEps))return[{point:o,param1:t.getStartParam(),param2:e.getStartParam(),isOverlap:!1}]}else if(t.getStartPt().equals(e.getEndPt(),i)){const o=t.getStartPt().midTo(e.getEndPt());if(o.equals(s[0].point,n.edgeLengthEps))return[{point:o,param1:t.getStartParam(),param2:e.getEndParam(),isOverlap:!1}]}else if(t.getEndPt().equals(e.getEndPt(),i)){const o=t.getEndPt().midTo(e.getEndPt());if(o.equals(s[0].point,n.edgeLengthEps))return[{point:o,param1:t.getEndParam(),param2:e.getEndParam(),isOverlap:!1}]}else if(t.getEndPt().equals(e.getStartPt(),i)){const o=t.getEndPt().midTo(e.getStartPt());if(o.equals(s[0].point,n.edgeLengthEps))return[{point:o,param1:t.getEndParam(),param2:e.getStartParam(),isOverlap:!1}]}}return s}const r=CurvesOverlap.curve3ds(t,e,n);return r.length>0?r.map(o=>XInfoUtil.curvesFromOverlap(o,t,e,n)):CurvesXUtil.curve3dCurve3d(t,e,n)}static _byGeometricOrAnalyticMethod(t,e,n=Tol.DEFAULT){if(t instanceof exports.Ln3){if(e instanceof exports.Ln3)return LinesX.line3ds(t,e,n);if(e instanceof exports.Arc3){const s=LineCircleX.line3dAndArc3d(t,e,n);return s.length>0?s:CurvesXUtil.getEndPtIntersect(t,e,n)}}else if(t instanceof exports.Arc3){if(e instanceof exports.Ln3){const s=LineCircleX.line3dAndArc3d(e,t,n),r=CurvesX._swapParams(s);return r.length>0?r:CurvesXUtil.getEndPtIntersect(t,e,n)}if(e instanceof exports.Arc3){const s=CircularsX.arc3dAndArc3d(t,e,n);return s.length>0?s:CurvesXUtil.getEndPtIntersect(t,e,n)}}return this._isTwoPlaneCurve3dsCoplane(t,e,n)}static _isLineXPlaneCurve3d(t,e,n){let s;t.isLine3d()?s=t.getDirection():(s=t.getEndPt().subtracted(t.getStartPt()),s.equals(exports.Vec3.O())&&(s=t.getEndPt().subtracted(t.getMidPt())),s.normalize());const r=e.isPlaneCurve3d();if(r instanceof exports.Vec3){if(!r.isPerpendicular(s,n.angleEps))return;const i=e.getStartPt().subtracted(t.getStartPt());if(i.getSqLength()>n.lengthEps2)return i.normalize(),Math.abs(i.dot(r))<n.angleEps?void 0:[]}}static _isTwoPlaneCurve3dsCoplane(t,e,n){const s=t.isPlaneCurve3d(),r=e.isPlaneCurve3d();if(s instanceof exports.Vec3&&r instanceof exports.Vec3){if(!s.isParallel(r,n.angleEps))return;const i=e.getStartPt().subtracted(t.getStartPt());if(i.getSqLength()>n.lengthEps2)return i.normalize(),Math.abs(i.dot(s))<n.angleEps?void 0:[]}else{if(s&&r instanceof exports.Vec3)return this._isLineXPlaneCurve3d(t,e,n);if(s instanceof exports.Vec3&&r)return this._isLineXPlaneCurve3d(e,t,n)}}static _curve3dAndExtendCurve3d(t,e,n=Tol.DEFAULT){const s=[];s.push(t);const r=[];r.push(e);const i=(g,a)=>{for(const I of a)if(I.point.equals(g.point))return!0;return!1},o=[];for(const g of s)for(const a of r){const I=CurvesX._curve3dsSimple(g,a,n);for(const c of I)i(c,o)||o.push(c)}return o}static _getOriginParamForExtendCurve(t,e,n,s){if(n.isLine()){const r=s.getBaseCurve().getRange();let i;if(e<-Tol.EDGE_LENGTH_EPS)i=!0;else if(e>Tol.EDGE_LENGTH_EPS)i=!1;else{const o=t.sqDistanceTo(s.getPtAt(r.min)),g=t.sqDistanceTo(s.getPtAt(r.max));o<g?i=!0:i=!1}if(i){const o=s.getHeadScale();return r.min+e/o}if(!i){const o=s.getTailScale();return r.max+e/o}}else if(n.isArc()){const{min:r,max:i}=n.getRange();if(Util.isNearlyEqual(e,r))return r;if(e<r)return e+CONST.PI2*Math.ceil((r-e)/CONST.PI2);if(Util.isNearlyEqual(e,i))return i;if(e>i)return e-CONST.PI2*Math.ceil((e-i)/CONST.PI2)}return e}static _swapParams(t){return t.forEach(e=>{[e.param1,e.param2]=[e.param2,e.param1],e.isOverlap&&([e.overlap1,e.overlap2]=[e.overlap2,e.overlap1])}),t}}class CurveSelfX{static isCurve2dSelfX(t,e=Tol.DEFAULT){return t.isLine2d()||t.isArc2d()?!1:CurveSelfX.curve2dSelfX(t,e).length>0}static curve2dSelfX(t,e=Tol.DEFAULT){return CurveSelfX._selfIntersectSimple(t,e)}static curve3dSelfX(t,e=Tol.DEFAULT){return CurveSelfX._selfIntersectSimple(t,e)}static _dealRedundant(t,e,n,s){let r=!1;const i=t.getPtAt(e.param1).sqDistanceTo(t.getPtAt(e.param2));for(const o of n)if(o.point.sqDistanceTo(e.point)<s.lengthEps2){r=!0,t.getPtAt(o.param1).sqDistanceTo(t.getPtAt(o.param2))<i&&(e.point=o.point,e.param1=o.param1,e.param2=o.param2);break}r||n.push(e)}static _selfIntersectSimple(t,e){if(t.isLine()||t.isArc())return[];if(t.isNurbsCurve3d()&&!this._isNurbs3dCtrlPtsIsIntersect(t,e)||t.isNurbsCurve2d()&&!this._isNurbs2dCtrlPtsIsIntersect(t,e))return[];const n=[],s=t.getRange(),r=s.min,i=s.getLength()/15;for(let o=0;o<15;o++){const g=r+o*i;for(let a=15;a>o;a--){const I=r+a*i,c=[g,I];if(curvesIteration(t,t,c,e)){if(s instanceof PeriodInterval){c[1]=s.clamp(c[1]),c[1]=s.clamp(c[1]);const p=s.period;if(Math.abs(Math.abs(c[1]-c[0])-p)<e.numberEps)continue}if(Math.abs(c[1]-c[0])<e.numberEps||!s.containsPt(c[0],e.numberEps)||!s.containsPt(c[1],e.numberEps))continue;const Q={point:t.getPtAt(c[0]),param1:c[0],param2:c[1],isOverlap:!1};this._dealRedundant(t,Q,n,e)}}}return n}static _isNurbs3dCtrlPtsIsIntersect(t,e){const n=t.getControlPoints();for(let s=1;s<n.length;s++){const r=new exports.Ln3(n[s],n[s-1]);for(let i=s+1;i<n.length;i++){const o=new exports.Ln3(n[i],n[i-1]);if(LinesX.line3ds(r,o,e).length>0)return!0}}return!1}static _isNurbs2dCtrlPtsIsIntersect(t,e){const n=t.getControlPoints();for(let s=1;s<n.length;s++){const r=new exports.Ln2(n[s],n[s-1]);for(let i=s+1;i<n.length;i++){const o=new exports.Ln2(n[i],n[i-1]);if(LinesX.line2ds(r,o,e).length>0)return!0}}return!1}}class X{static curve2ds(t,e,n=Tol.DEFAULT){return CurvesX.curve2ds(t,e,n)}static curve3ds(t,e,n=Tol.DEFAULT){return CurvesX.curve3ds(t,e,n)}static curve2dsNearPoint(t,e,n,s=Tol.DEFAULT){const r=CurvesX.curve2ds(t,e,s);return r.sort((i,o)=>i.point.sqDistanceTo(n)-o.point.sqDistanceTo(n)),r[0]}static curve2dsNearParams(t,e,n,s,r=Tol.DEFAULT){return CurvesXUtil.curve2dsSingleX(t,e,[n,s],r)}static curve3dsNearPoint(t,e,n,s=Tol.DEFAULT){return CurvesX.curve3dsNearPoint(t,e,n,s)}static curve3dsNearParams(t,e,n,s,r=Tol.DEFAULT){return CurvesXUtil.curve3dsSingleX(t,e,[n,s],r)}static curve2dsOverlap(t,e,n=Tol.DEFAULT){return CurvesOverlap.curve2ds(t,e,n).map(s=>XInfoUtil.curvesFromOverlap(s,t,e,n))}static curve3dsOverlap(t,e,n=Tol.DEFAULT){return CurvesOverlap.curve3ds(t,e,n).map(s=>XInfoUtil.curvesFromOverlap(s,t,e,n))}static curve2dSelfX(t,e=Tol.DEFAULT){return CurveSelfX.curve2dSelfX(t,e)}static isCurve2dSelfX(t,e=Tol.DEFAULT){return CurveSelfX.isCurve2dSelfX(t,e)}static curve3dSelfX(t,e=Tol.DEFAULT){return CurveSelfX.curve3dSelfX(t,e)}static curveSurface(t,e,n=Tol.DEFAULT,s){return CurveSurfaceX.allPoints(t,e,n,s)}static curveSurfaceAll(t,e,n=Tol.DEFAULT,s){return CurveSurfaceX.execute(t,e,n,s)}static curveSurfaceNearPoint(t,e,n,s=Tol.DEFAULT){return CurveSurfaceX.nearPoint(t,e,n,s)?.point}static curveSurfaceNearParams(t,e,n,s,r=Tol.DEFAULT){return CurveSurfaceX.nearParam(t,e,n,s,r)?.point}static isIntersectCurveSurface(t,e,n,s=Tol.DEFAULT){return CurveSurfaceX.hasIntersect(t,e,n,s)}static surfaces(t,e,n,s,r,i,o=Tol.DEFAULT){return SurfacesX.allIntersections(t,e,n,s,r,i,o)}static surfacesSimplified(t,e,n,s,r,i,o=Tol.DEFAULT,g=!1,a=!1){const I=SurfacesX.allIntersections(t,e,n,s,r,i,o,g),c=[];for(const E of I)if(E.curve){const u=E.curve;if(u instanceof IntersectCurve3&&a){const Q=u.toSimpleCurve3d(3);c.push(Q)}else c.push(E.curve)}return c}static surfacesNearPointSimple(t,e,n,s,r=Tol.DEFAULT,i=!1){let o;try{o=SurfacesX.singleCurveNearPointSimple(t,e,n,s,r,i)}catch{return}return o}static surfacesBetweenTwoPoints(t,e,n,s,r,i=Tol.DEFAULT,o=!1){let g;try{g=SurfacesX.singleCurveBetweenTwoPoints(t,e,n,s,r,i,o)}catch{return}return g}static surfacesNearPoint(t,e,n,s,r=Tol.DEFAULT,i=!1,o=!0){let g;try{g=SurfacesX.singleCurveNearPoint(t,e,n,s,r,i,o)}catch{return}return g}static surfacesNearParams(t,e,n,s,r,i=new Tol,o=!1){let g;try{g=SurfacesX.singleCurveNearParam(t,e,n,s,r,i,o)}catch{return}return g}static surfacesSelfIntersect(t,e,n,s,r=new Tol,i=!1){let o;try{o=SurfacesX.selfIntersectCurve(t,e,n,s,r,i)}catch{return}return o}}class CalcOverlap{static curve2dsColinear(t,e,n=Tol.DEFAULT){return CurvesColinear.curve2ds(t,e,n)}static curve2ds(t,e,n=Tol.DEFAULT){return CurvesOverlap.curve2ds(t,e,n)}static curve3dsColinear(t,e,n=Tol.DEFAULT){return CurvesColinear.curve3ds(t,e,n)}static curve3ds(t,e,n=Tol.DEFAULT){return CurvesOverlap.curve3ds(t,e,n)}static isSurfacesCoplaner(t,e,n=Tol.DEFAULT){return SurfacesCoplaner.simple(t,e,n)}static isCurveSurfaceOverlap(t,e,n=Tol.DEFAULT){return CurveSurfaceCoincide.execute(t,e,n)}}var MergeReverseMode=(l=>(l[l.merge=0]="merge",l[l.remove=1]="remove",l))(MergeReverseMode||{});class CurvesMerge{static mergeLoopCurve3ds(t,e=Tol.DEFAULT){const n=[],s=(r,i)=>r.isLine3d()&&i.isLine3d()?CalcOverlap.curve3dsColinear(r,i,e)?[new exports.Ln3(r.getStartPt(),i.getEndPt())]:void 0:this.curve3ds(r,i,0,e);n.push(t[0]);for(let r=1;r<t.length;++r){const i=n[n.length-1],o=t[r],g=s(i,o);if(!g){n.push(t[r]);continue}n.pop(),n.push(...g)}if(n.length>3&&n[0].getStartPt().equals(n[n.length-1].getEndPt())){const r=s(n[n.length-1],n[0]);r&&(n.pop(),n.splice(0,1,...r))}return n}static mergeCurves3ds(t,e=Tol.DEFAULT){const n=[];n.push(t[0]);for(let s=1;s<t.length;++s){const r=n[n.length-1],i=t[s],o=this.curve3ds(r,i,0,e);if(!o){n.push(t[s]);continue}n.pop(),n.push(...o)}if(n.length>3&&n[0].getStartPt().equals(n[n.length-1].getEndPt())){const s=this.curve3ds(n[0],n[n.length-1],0,e);s&&(n.pop(),n.shift(),n.push(...s))}return n}static mergeCurves2ds(t,e=Tol.DEFAULT){const n=[];n.push(t[0]);for(let s=1;s<t.length;++s){const r=n[n.length-1],i=t[s],o=this.curve2ds(r,i,0,e);if(!o){n.push(t[s]);continue}n.pop(),n.push(...o)}if(n.length>3&&n[0].getStartPt().equals(n[n.length-1].getEndPt())){const s=this.curve2ds(n[0],n[n.length-1],0,e);s&&(n.pop(),n.shift(),n.push(...s))}return n}static curve2ds(t,e,n=0,s=Tol.DEFAULT){const r=CurvesMerge.curve2dsEvolution(t,e,n,s);return r?Array.from(r.keys()):void 0}static curve2dsEvolution(t,e,n=0,s=Tol.DEFAULT){if(t instanceof exports.Ln2){if(e instanceof exports.Ln2)return CurvesMerge.linesEvolution(t,e,n,s)}else if(t instanceof exports.Arc2){if(e instanceof exports.Arc2)return CurvesMerge.arcsEvolution(t,e,n,s)}else if(t instanceof exports.NurbsCurve2){if(e instanceof exports.NurbsCurve2)return CurvesMerge.nurbsEvolution(t,e,n,s)}else if(t instanceof exports.OffsetCurve2&&e instanceof exports.OffsetCurve2)return CurvesMerge.offsetCurvesEvolution(t,e,n,s)}static curve3ds(t,e,n=0,s=Tol.DEFAULT){const r=CurvesMerge.curve3dsEvolution(t,e,n,s);return r?Array.from(r.keys()):void 0}static curve3dsEvolution(t,e,n=0,s=Tol.DEFAULT){if(t instanceof exports.Ln3){if(e instanceof exports.Ln3)return CurvesMerge.linesEvolution(t,e,n,s)}else if(t instanceof exports.Arc3){if(e instanceof exports.Arc3)return CurvesMerge.arcsEvolution(t,e,n,s)}else if(t instanceof exports.NurbsCurve3){if(e instanceof exports.NurbsCurve3)return CurvesMerge.nurbsEvolution(t,e,n,s)}else if(t instanceof exports.OffsetCurve3&&e instanceof exports.OffsetCurve3)return CurvesMerge.offsetCurvesEvolution(t,e,n,s)}static lines(t,e,n=0,s=Tol.DEFAULT){const r=CurvesMerge.linesEvolution(t,e,n,s);return r?Array.from(r.keys()):void 0}static linesEvolution(t,e,n=0,s=Tol.DEFAULT){if(CurvesColinear.lines(t,e,s))return CurvesMerge._simpleCurves(t,e,n,s)}static arcs(t,e,n=0,s=Tol.DEFAULT){const r=CurvesMerge.arcsEvolution(t,e,n,s);return r?Array.from(r.keys()):void 0}static arcsEvolution(t,e,n=0,s=Tol.DEFAULT){if(!CurvesColinear.arcs(t,e,s))return;const r=CurvesColinear.areArcsSameDirection(t,e);return CurvesMerge._periodCurves(t,e,r,n,s)}static nurbsEvolution(t,e,n=0,s=Tol.DEFAULT){if(CurvesColinear.nurbsCurves(t,e,s))return CurvesMerge._nurbsRange(t,e,n,s)}static offsetCurvesEvolution(t,e,n=0,s=Tol.DEFAULT){if(!CurvesColinear.offsetCurves(t,e,s))return;const r=t.getRange(),i=e.getRange(),o=r instanceof PeriodInterval,g=i instanceof PeriodInterval;return o&&g?CurvesMerge._periodCurves(t,e,void 0,n,s):(!o&&!g||MathError.warn(!1,"period offsetCrv merge with non-period offsetCrv not supported",MathErrorType.Unimplemented,t,e),CurvesMerge._simpleCurves(t,e,n,s))}static _simpleCurves(t,e,n,s){const r=t.getRange(),i=t.getParamAt(e.getStartPt()),o=t.getParamAt(e.getEndPt()),[g,a]=i<o?[i,o]:[o,i],I=new EvolutionMap;function c(E,u){if(E<u){const Q=t.clone().setRange(E,u);I.set(Q,[t])}else{const Q=t.clone().setRange(u,E).reverse();I.set(Q,[e])}}if(i>o&&n===1)return g>r.max-s.lengthEps||a<r.min+s.lengthEps?void 0:(Math.abs(r.min-g)>s.lengthEps&&c(r.min,g),Math.abs(r.max-a)>s.lengthEps&&c(a,r.max),I);{if(r.max<g-s.lengthEps||a<r.min-s.lengthEps)return;const E=Math.min(r.min,g),u=Math.max(r.max,a),Q=t.clone().setRange(E,u);return I.set(Q,[t,e]),I}}static _nurbsRange(t,e,n,s){const r=new EvolutionMap;let i=!1;t.getControlPoints()[0].equals(e.getControlPoints()[0])&&t.getControlPoints()[1].equals(e.getControlPoints()[1])&&(i=!0);const o=i?e:e.clone().reverse(),g=s.numberEps,a=t.getRange(),I=o.getRange();if(n===1&&!i){if(a.min-g>I.min&&a.min+g<I.max&&a.max-g>I.max)o.setRange(I.max,a.max),r.set(o,[t,e]);else if(a.min+g<I.min&&I.max-g>I.max){const u=t.clone().setRange(a.min,I.min);o.setRange(I.max,a.max),r.set(u,[t,e]),r.set(o,[t,e])}else a.min+g<I.min&&a.max-g>I.min&&(o.setRange(a.min,I.min),r.set(o,[t,e]));return r.size>0?r:void 0}const c=a.min<I.min?a.min:I.min,E=a.max>I.max?a.max:I.max;return a.getLength()+I.getLength()<E-c+g&&(o.setRange(c,E),r.set(o,[t,e])),r.size>0?r:void 0}static _periodCurves(t,e,n,s,r){const i=t.getRange(),o=i.period,g=e.getRange().period;if(Math.abs(o-g)>r.numberEps)return;const a=t.getParamAt(e.getStartPt()),I=t.getParamAt(e.getEndPt());let c;if(n===void 0){const p=t.getRange().getMid(),w=t.getTangentAt(p),y=t.getPtAt(p),M=e.getParamAt(y),N=e.getTangentAt(M);c=w.dot(N)>0}else c=n;const E=c?new PeriodInterval(a,I,o):new PeriodInterval(I,a,o),u=new EvolutionMap,Q=(p,w,y=!1)=>{for(const M of p){const N=t.clone().setRange(M.min,M.max);y&&N.reverse(),u.set(N,w.slice())}};if(!c&&s===1){const p=i.subtracted(E),w=E.subtracted(i);let y=!1;return(p.length!==1||Math.abs(p[0].getLength()-i.getLength())>Tol.DEFAULT.numberEps)&&(Q(p,[t]),y=!0),(w.length!==1||Math.abs(w[0].getLength()-E.getLength())>Tol.DEFAULT.numberEps)&&(Q(w,[e],!0),y=!0),y?u:void 0}{const p=PeriodInterval.merge([i,E]);return p.length===2?void 0:(Q(p,[t,e]),u)}}}class HalfPlane{static createByLine2d(t){const e=t.getDirection(),n=t.getStartPt();return new HalfPlane({x:-e.y,y:e.x},n.x*e.y-n.y*e.x)}constructor(t,e){if(typeof e.x=="number"){this.w={x:t.y-e.y,y:e.x-t.x};const n=Math.sqrt(this.w.x*this.w.x+this.w.y*this.w.y);this.w.x/=n,this.w.y/=n,this.b=-(this.w.x*t.x+this.w.y*t.y)}else this.w={x:t.x,y:t.y},this.b=e}get normal(){return new exports.Vec2(this.w)}distance(t){return this.w.x*t.x+this.w.y*t.y+this.b}clone(){return new HalfPlane(this.w,this.b)}toLine2d(){let t;return Math.abs(this.w.x)>Math.abs(this.w.y)?t={x:-this.b/this.w.x,y:0}:t={x:0,y:-this.b/this.w.y},new exports.Ln2(t,{x:t.x+this.w.y,y:t.y-this.w.x})}offset(t){return this.b-=t,this}intersect(t){const n=((s,r)=>s.x*r.y-s.y*r.x)(this.w,t.w);return{x:(this.w.y*t.b-t.w.y*this.b)/n,y:(t.w.x*this.b-this.w.x*t.b)/n}}parallel(t,e=1e-6){return Math.abs(t.w.x*this.w.y-t.w.y*this.w.x)<e}dump(){return{w:{x:this.w.x,y:this.w.y},b:this.b}}load(t){return new HalfPlane(t.w,t.b)}}class Disjoint{constructor(){this.set=[]}clear(){this.set.length=0}find(t){for(;this.set.length<=t;)this.set.push(this.set.length);return t===this.set[t]?t:this.set[t]=this.find(this.set[t])}merge(t,e){if(t<0||e<0)return;const n=this.find(t),s=this.find(e);n<s?this.set[s]=n:this.set[n]=s}}class MergePoint{constructor(){this._tmp=[[],[],[]],this._disjoint=new Disjoint}clear(){this._disjoint.clear()}merge(t,e=1e-6){if(t.length===0)return{index:[],points:[]};const n=t[0].length-1,s=[];for(let i=0;i<t.length;++i)s.push(i);this.clear(),s.sort((i,o)=>t[i][n]-t[o][n]),this._mergeex(t,s,0,s.length,n,e);const r=[];for(let i=0;i<t.length;++i)this._disjoint.find(i)!==i?s[i]=s[this._disjoint.find(i)]:(s[i]=r.length,r.push(t[i]));return{index:s,points:r}}_mergeex(t,e,n,s,r,i){if(!(s-n<2))if(r){const o=s+n>>1,g=t[e[o]][r];this._mergeex(t,e,n,o,r,i),this._mergeex(t,e,o,s,r,i);const a=this._tmp[r];a.length=0;for(let c=n;c<s;++c)Math.abs(t[e[c]][r]-g)>i||a.push(e[c]);const I=r-1;a.sort((c,E)=>t[c][I]-t[E][I]),this._mergeex(t,a,0,a.length,I,i)}else for(let o=1;o<e.length;++o){const g=t[this._disjoint.find(e[o])][0],a=t[this._disjoint.find(e[o-1])][0];Math.abs(g-a)>i||this._disjoint.merge(e[o],e[o-1])}}}function isEqualArcs(l,t,e=Tol.LENGTH){return!!(l.pos.equals(t.pos,e)&&Math.abs(l.radius-t.radius)<e)}class MergeCurve{static mergeCurve2d(t,e=Tol.LENGTH){const n=[],s=[],r=[];for(const a of t)a.isLine2d()?s.push(a):a.isArc2d()&&a.isEqualAB()?n.push(a):r.push(a);const i=MergeCurve.mergeArc2d(n,e).result,o=MergeCurve.mergeCurveLine2d(s,e);return i.concat(o).concat(r)}static mergeCurve2dEx(t,e=Tol.LENGTH){const n=[],s=[],r=[];for(const I of t)I.isLine2d()?s.push(I):I.isArc2d()&&I.isEqualAB()?n.push(I):r.push(I);const i=MergeCurve.mergeArc2d(n,e),o=MergeCurve.mergeCurveLine2dEx(s,e),g=i.result.concat(o.result);g.push(...r);const a=i.mapper;for(const I of o.mapper)a.set(I[0],I[1]);for(const I of r)a.set(I,[I]);return{result:g,mapper:a}}static mergeCurveLine2d(t,e){const n=[],s=[];for(let I=0;I<t.length;++I)t[I].getType()===EN_GEO_TYPE.LN_2&&s.push(t[I]);const r=[];for(let I=0;I<s.length;++I){const c=s[I].getDirection(),E=new HalfPlane(s[I].getStartPt(),s[I].getEndPt());Math.abs(c.x)>e?c.x>0?r.push([E.w.x,E.w.y,E.b]):r.push([-E.w.x,-E.w.y,-E.b]):c.y>0?r.push([E.w.x,E.w.y,E.b]):r.push([-E.w.x,-E.w.y,-E.b])}const o=new MergePoint().merge(r,e*50),g=[];for(let I=0;I<o.points.length;++I)g.push(new HalfPlane({x:o.points[I][0],y:o.points[I][1]},o.points[I][2]));const a=e*30;for(let I=0;I<g.length;++I){let c=!0;const E=g[I],u=E.toLine2d(),Q=[];for(const N of s)Math.abs(E.distance(N.getStartPt()))>a||Math.abs(E.distance(N.getEndPt()))>a||(u.getDirection().dot(N.getDirection())>0?(Q.push({t:u.getParamAt(N.getStartPt()),wind:1}),Q.push({t:u.getParamAt(N.getEndPt()),wind:-1}),c=!0):(Q.push({t:u.getParamAt(N.getStartPt()),wind:-1}),Q.push({t:u.getParamAt(N.getEndPt()),wind:1}),c=!1));Q.sort((N,S)=>N.t-S.t);let p=!1,w=!1,y=0,M=1/0;for(let N=0;N<Q.length;){const S=Q[N].t;for(;N<Q.length&&Math.abs(Q[N].t-S)<e;)y+=Q[N++].wind;if(p=y>0,w!==p){const R=new exports.Ln2(u.getPtAt(M),u.getPtAt(S));p||n.push(c?R:R.reverse()),M=S}w=p}}return n}static mergeCurveLine2dEx(t,e){const n=[];for(const g of t){let a=exports.Vec2.X().angleTo(g.getDirection());a=a>=CONST.PI?a-CONST.PI:a,n.push({line:g,angle:a})}const s=(g,a)=>{if(Math.abs(g.angle-a.angle)<e){const I=g.line.getDirection(),c=a.line.getDirection(),E=g.line.getOrigin(),u=a.line.getOrigin();if(Math.abs(I.y)<e||Math.abs(c.y)<e)return E.y-u.y;const Q=E.x-I.x*E.y/I.y,p=u.x-c.x*u.y/c.y;return Q-p}return g.angle-a.angle};n.sort((g,a)=>s(g,a));const r=new Map,i=[],o=[];for(let g=0;g<n.length;){let a=g+1;for(;a<n.length&&CurvesColinear.lines(n[g].line,n[a].line);a++);const I=[];for(let c=g;c<a;c++)I.push(n[c].line);o.push(I),g+=I.length}for(const g of o){const a=CurvesMerge.mergeCurves2ds(g);a.length>1&&MathError.warn(!0,"overlap但不重合"),i.push(...a);for(const I of a)r.set(I,g)}return{result:i,mapper:r}}static mergeArc2d(t,e=Tol.LENGTH){const n=new Map,s=[],r=[];for(let g=0;g<t.length;++g)t[g].getType()===EN_GEO_TYPE.ARC_2&&r.push(t[g]);const i=[];for(const g of r){const a=g.getCenter();i.push({pos:a,radius:g.getRadius()})}const o=[];for(let g=0;g<i.length;g++){const a=o.find(I=>isEqualArcs(I.arcInfo,i[g],e));a?a.indexs.push(g):o.push({arcInfo:i[g],indexs:[g]})}for(const g of o){const a=g.arcInfo,I=[],c=g.indexs,E=[];c.map(Q=>E.push(r[Q]));for(const Q of c){const p=r[Q].getStartPt(),w=r[Q].getEndPt(),y=r[Q].getRange().getLength(),M=r[Q].isCCW()?exports.Vec2.X().angleTo(p.subtracted(a.pos)):exports.Vec2.X().angleTo(w.subtracted(a.pos)),N=new PeriodInterval(M,M+y,CONST.PI2);I.push(N)}const u=Interval.merge(I);for(const Q of u){const p=new exports.Coord2(a.pos,exports.Vec2.X()),w=new exports.Arc2(p,a.radius,a.radius,!0,Q.toArray());s.push(w),n.set(w,E)}}return{result:s,mapper:n}}}class GeometryMerge{static mergeCurve2ds(t,e=Tol.LENGTH){return MergeCurve.mergeCurve2d(t,e)}static mergeCurve2dsEx(t,e=Tol.LENGTH){return MergeCurve.mergeCurve2dEx(t,e)}static mergePoints(t,e=Tol.LENGTH){return new MergePoint().merge(t,e)}static mergeTwoCurve2ds(t,e,n=MergeReverseMode.merge,s=Tol.DEFAULT){return CurvesMerge.curve2ds(t,e,n,s)}static mergeTwoCurve3ds(t,e,n=MergeReverseMode.merge,s=Tol.DEFAULT){return CurvesMerge.curve3ds(t,e,n,s)}}class Curve3ProjectToPlane{constructor(t,e,n=Tol.DEFAULT){this._plane=e,this._curve=t,this._tol=n}execute(){if(this._curve.isLine3d()){const n=this._plane.getUVAt(this._curve.getStartPt()),s=this._plane.getUVAt(this._curve.getEndPt());return n.equals(s)?void 0:new exports.Ln2(n,s)}if(this._curve.isArc3d()){const n=this._curve;if(n.getNormal().isParallel(this._plane.getNorm(),this._tol.angleEps)){const O=n.getCoord(),H=this._plane.getCoord(),z=H.getLocalVectorAt(O.getDx()),tA=H.getLocalPtAt(O.getOrigin()),nA=new exports.Coord2(tA,z),IA=n.getRange().toArray(),iA=n.getNormal().dot(H.getDz())>0;return new exports.Arc2(nA,n.getA(),n.getB(),iA,IA)}const s=this._plane.getCoord().getWorldToLocalMatrix(),r=n.transformed(s);if(n.getNormal().isPerpendicular(this._plane.getNorm(),this._tol.angleEps)){const O=Math.abs(exports.Vec3.Z().dot(r.getCoord().getDx())),H=Math.sqrt(1-O*O),z=Math.atan2(O/r.getA(),H/r.getB()),tA=r.getCoord().getDy().z>=0?z:-z,nA=r.getPtAt(tA),IA=r.getPtAt(tA+CONST.PI),iA=new exports.Ln2(nA,IA);if(!r.getRange().containsPt(tA)){const W=iA.getParamAt(r.getStartPt()),oA=iA.getParamAt(r.getEndPt());iA.setRange(W<oA?W:oA,iA.getRange().max)}if(!r.getRange().containsPt(tA+CONST.PI)){const W=iA.getParamAt(r.getStartPt()),oA=iA.getParamAt(r.getEndPt());iA.setRange(iA.getRange().min,W>oA?W:oA)}return iA}const i=r.getCenter(),o=r.getPtAt(0).subtract(i),g=r.getPtAt(CONST.PI_4).subtract(i),a=r.getPtAt(CONST.PI_2).subtract(i),I=[[o.x*o.x,o.x*o.y,o.y*o.y],[g.x*g.x,g.x*g.y,g.y*g.y],[a.x*a.x,a.x*a.y,a.y*a.y]],c=[1,1,1],E=LinearSystem.execute(I,c);if(E===void 0)return;const u=.5*Math.atan(E[1]/(E[0]-E[2])),Q=Math.cos(u),p=Math.sin(u),w=E[0]*Q*Q+E[2]*p*p+E[1]*Q*p,y=E[2]*Q*Q+E[0]*p*p-E[1]*Q*p,M=Math.sqrt(1/w),N=Math.sqrt(1/y),S=new exports.Coord2(i,new exports.Vec2(Q,p)),R=r.getNormal().dot(exports.Vec3.Z())>0,U=new exports.Arc2(S,M,N,R),b=U.getParamAt(r.getStartPt());let G;return Math.sqrt(r.getRange().getLength()-CONST.PI2)<this._tol.numberEps?G=b+CONST.PI2:G=U.getParamAt(r.getEndPt()),U.setRange(b,G),U}if(this._curve instanceof exports.SmoothPoly3){const n=this._curve.getPoints().map(s=>this._plane.getUVAt(s));return new exports.SmoothPoly2(n)}const e=DiscreteUtil.discreteCurve3d(this._curve,DiscreteParam.NORMAL).map(n=>this._plane.getUVAt(n));return exports.NurbsCurve2.makeByInterpolationPts(e)}}class Project{static curve3dTo2d(t,e){return new exports.Plane(e).getCurve2d(t)}static curveToPlane(t,e){return new Curve3ProjectToPlane(t,e).execute()}static line1ToLine2(t,e){return CurvesProject.lines(t,e)}static curve2dTo3d(t,e){return new exports.Plane(e).getCurve3d(t)}}class Loop2dOffset{static execute(t,e,n=Tol.DEFAULT,s=!0,r){const i={smoothPolyToNurbs:!0},{curves:o,evolution:g}=CurveUtil.simplifyCurves2d(t,i),a=o.map((M,N)=>r&&r.indexOf(N)<0?M:exports.OffsetCurve2.makeByOffset(M,e)),I=new Map;for(let M=0;M<a.length;M++){if(this._isDegeneratedCurve2d(a[M])){a.splice(M,1),M--;continue}I.set(a[M],o[M])}let c;try{c=Loop2dOffset._connectCurve2ds(a,e,!0,Tol.DEFAULT,s,r)}catch{return{loops:[],evolution:new EvolutionMap}}const E=Array.from(c.keys()),u=Loop2dOffset._makeJoints(E,n),Q=Loop2dOffset._findLoop2ds(E,u,e>0),p=new EvolutionMap,w=Q.map(M=>{const N=[];for(let S=0;S<M.length;S++){const R=M[S];for(;S+1<M.length&&M[S+1].curveId===R.curveId;)S++;const U=u[R.curveId][M[S].jointId+1].param,b=E[R.curveId],G=b.clone().setRange(R.param,U);N.push(G),p.set(G,[b])}return N}),y=p.connectValueMap(c);for(const M of y.values())for(let N=0;N<M.length;N++)M[N]=g.get(I.get(M[N]))[0];return{loops:w,evolution:y}}static offsetCurve2dList(t,e){const n=t[0].getStartPt().equals(t[t.length-1].getEndPt()),s=t.map(g=>exports.OffsetCurve2.makeByOffset(g,e)),r=new Map;for(let g=0;g<s.length;g++){if(this._isDegeneratedCurve2d(s[g])){s.splice(g,1),g--;continue}r.set(s[g],t[g])}let i;try{i=Loop2dOffset._connectCurve2ds(s,e,n,Tol.DEFAULT)}catch{return{curveList:[],evolution:new EvolutionMap}}return{curveList:Array.from(i.keys()),evolution:i}}static _isDegeneratedCurve2d(t){if(t.getRange().getLength()<Tol.NUMBER)return!0;if(t.isArc2d())return t.getA()<Tol.LENGTH&&t.getB()<Tol.LENGTH;if(t.isNurbsCurve2d()){const e=t.getControlPoints();let n=0;for(let s=1;s<e.length;s++){const r=e[s].sqDistanceTo(e[s-1]);n+=r}return n<Tol.LENGTH_2}return!1}static _connectCurve2ds(t,e,n,s,r=!0,i=[]){const o=new EvolutionMap,g=n?t.length+1:t.length;n||o.set(t[0],[t[0]]);const a=I=>{if(I instanceof exports.OffsetCurve2&&I.isPeriodic()){const c=I.getBaseCurve(),E=c.getDomain().getLength()-I.getDomain().getLength();if(c.isNurbsCurve2d()&&I.getRange().max-I.getDomain().max<E)return!0}return!1};for(let I=1;I<g;I++){const c=I-1,E=t[c],u=I%t.length,Q=t[u],p=E instanceof exports.OffsetCurve2?E.getBaseCurve().getEndTangent():E.getEndTangent(),w=Q instanceof exports.OffsetCurve2?Q.getBaseCurve().getStartTangent():Q.getStartTangent(),y=E.getEndPt().sqDistanceTo(Q.getStartPt()),M=p.angleTo(w),N=i.includes(I)&&!i.includes(c)||i.includes(c)&&!i.includes(I);if(y>Tol.LENGTH_2)if(e>0?M<CONST.PI:M>CONST.PI){let S,R;if(E instanceof exports.Ln2)S=E,S.getRange().max=CONST.MODEL_MAX_LENGTH;else{const G=E instanceof exports.OffsetCurve2?E.getParamMapper().getParamInfo(E.getBaseCurve().getEndParam(),!0).type:ParamType.Normal;if(G===ParamType.Normal)S=new exports.Ln2(E.getEndPt(),p,[0,CONST.MODEL_MAX_LENGTH]);else{const O=new exports.Vec2(p.y,-p.x),z=E.getBaseCurve().getEndPt().add(O.multiply(e));if(S=new exports.Ln2(z,p,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),G===ParamType.EndGap||G===ParamType.Reversed){const tA=CurvesX.curve2ds(E,S);MathError.assert(tA.length>0,"No Intersect when tirm OffsetCurve end");let nA=tA[0];for(let IA=1;IA<tA.length;IA++)tA[IA].param2>nA.param2&&(nA=tA[IA]);S.getRange().min=nA.param2,E.getRange().max=nA.param1}else S.getRange().min=0}o.set(S,[t[c]])}if(Q instanceof exports.Ln2)R=Q,R.getRange().min=-CONST.MODEL_MAX_LENGTH;else{const G=Q instanceof exports.OffsetCurve3?Q.getParamMapper().getParamInfo(Q.getBaseCurve().getStartParam(),!1).type:ParamType.Normal;if(G===ParamType.Normal)R=new exports.Ln2(Q.getStartPt(),w,[-CONST.MODEL_MAX_LENGTH,0]);else{const O=new exports.Vec2(w.y,-w.x),z=Q.getBaseCurve().getStartPt().add(O.multiply(e));if(R=new exports.Ln2(z,w,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),G===ParamType.StartGap||G===ParamType.Reversed){const tA=CurvesX.curve2ds(Q,R);MathError.assert(tA.length>0,"No Intersect when trim OffsetCurve start");let nA=tA[0];for(let IA=1;IA<tA.length;IA++)tA[IA].param2<nA.param2&&(nA=tA[IA]);R.getRange().max=nA.param2,Q.getRange().min=nA.param1}else R.getRange().max=0}o.set(R,[t[u]])}const U=LinesX.line2ds(S,R);MathError.assert(U.length>0,"No Intersection found between preline & curline");const b=U[0];S.getRange().max=b.param1,R.getRange().min=b.param2}else if(N){if(i.includes(I)){let S=new exports.Ln2;if(Q instanceof exports.Ln2)S=Q,S.getRange().min=-CONST.MODEL_MAX_LENGTH;else{const U=Q instanceof exports.OffsetCurve3?Q.getParamMapper().getParamInfo(Q.getBaseCurve().getStartParam(),!1).type:ParamType.Normal;if(U===ParamType.Normal)S=new exports.Ln2(Q.getStartPt(),w,[-CONST.MODEL_MAX_LENGTH,0]);else{const b=new exports.Vec2(w.y,-w.x),O=Q.getBaseCurve().getStartPt().add(b.multiply(e));if(S=new exports.Ln2(O,w,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),U===ParamType.StartGap||U===ParamType.Reversed){const H=CurvesX.curve2ds(Q,S);MathError.assert(H.length>0,"No Intersect when trim OffsetCurve start");let z=H[0];for(let tA=1;tA<H.length;tA++)H[tA].param2<z.param2&&(z=H[tA]);S.getRange().max=z.param2,Q.getRange().min=z.param1}else S.getRange().max=0}o.set(S,[t[u]])}const R=X.curve2dsNearPoint(E,S,E.getEndPt());if(R)E.getRange().max=R.param1,S.getRange().min=R.param2;else{let U,b;if(a(E)){const G=E.getEndPt(),O=new exports.Vec2(p.y,-p.x),z=E.getBaseCurve().getEndPt().add(O.multiply(e));U=new exports.Ln2(G,z),o.set(U,[t[c]])}if(a(S)){const G=new exports.Vec2(w.y,-w.x),H=S.getBaseCurve().getStartPt().add(G.multiply(e)),z=S.getStartPt();b=new exports.Ln2(H,z),o.delete(S),o.set(b,[t[u]])}if(U&&b){const G=LinesX.line2ds(U,b);MathError.assert(G.length>0,"No Intersection found between preline & curline");const O=G[0];U.getRange().max=O.param1,b.getRange().min=O.param2}else if(U){const G=X.curve2dsNearParams(U,S,U.getStartParam(),S.getStartParam());G?(U.getRange().max=G.param1,S.getRange().min=G.param2):MathError.assert(G,"No Intersection found between preline & curline")}else if(b){const G=X.curve2dsNearParams(E,b,E.getEndParam(),b.getEndParam());G?(E.getRange().max=G.param1,b.getRange().min=G.param2):MathError.assert(G,"No Intersection found between preline & curline")}}}else if(i.includes(c)){let S=new exports.Ln2;if(E instanceof exports.Ln2)S=E,S.getRange().max=CONST.MODEL_MAX_LENGTH;else{const U=E instanceof exports.OffsetCurve2?E.getParamMapper().getParamInfo(E.getBaseCurve().getEndParam(),!0).type:ParamType.Normal;if(U===ParamType.Normal)S=new exports.Ln2(E.getEndPt(),p,[0,CONST.MODEL_MAX_LENGTH]);else{const b=new exports.Vec2(p.y,-p.x),O=E.getBaseCurve().getEndPt().add(b.multiply(e));if(S=new exports.Ln2(O,p,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),U===ParamType.EndGap||U===ParamType.Reversed){const H=CurvesX.curve2ds(E,S);MathError.assert(H.length>0,"No Intersect when tirm OffsetCurve end");let z=H[0];for(let tA=1;tA<H.length;tA++)H[tA].param2>z.param2&&(z=H[tA]);S.getRange().min=z.param2,E.getRange().max=z.param1}else S.getRange().min=0}o.set(S,[t[c]])}const R=X.curve2dsNearPoint(S,Q,Q.getStartPt());if(R)S.getRange().max=R.param1,Q.getRange().min=R.param2;else{let U,b;if(a(S)){const G=S.getEndPt(),O=new exports.Vec2(p.y,-p.x),z=S.getBaseCurve().getEndPt().add(O.multiply(e));U=new exports.Ln2(G,z),o.delete(S),o.set(U,[t[c]])}if(a(Q)){const G=new exports.Vec2(w.y,-w.x),H=Q.getBaseCurve().getStartPt().add(G.multiply(e)),z=Q.getStartPt();b=new exports.Ln2(H,z),o.set(b,[t[u]])}if(U&&b){const G=LinesX.line2ds(U,b);MathError.assert(G.length>0,"No Intersection found between preline & curline");const O=G[0];U.getRange().max=O.param1,b.getRange().min=O.param2}else if(U){const G=X.curve2dsNearParams(U,Q,U.getStartParam(),Q.getStartParam());G?(U.getRange().max=G.param1,Q.getRange().min=G.param2):MathError.assert(G,"No Intersection found between preline & curline")}else if(b){const G=X.curve2dsNearParams(S,b,S.getEndParam(),b.getEndParam());G?(S.getRange().max=G.param1,b.getRange().min=G.param2):MathError.assert(G,"No Intersection found between preline & curline")}}}}else{const S=X.curve2dsNearParams(E,Q,E.getEndParam(),Q.getStartParam());if(S)E.getRange().max=S.param1,Q.getRange().min=S.param2;else{let R,U;if(a(E)){const b=E.getEndPt(),G=new exports.Vec2(p.y,-p.x),H=E.getBaseCurve().getEndPt().add(G.multiply(e));R=new exports.Ln2(b,H),o.set(R,[t[c]])}if(a(Q)){const b=new exports.Vec2(w.y,-w.x),O=Q.getBaseCurve().getStartPt().add(b.multiply(e)),H=Q.getStartPt();U=new exports.Ln2(O,H),o.set(U,[t[u]])}if(R&&U){const b=LinesX.line2ds(R,U);MathError.assert(b.length>0,"No Intersection found between preline & curline");const G=b[0];R.getRange().max=G.param1,U.getRange().min=G.param2}else if(R){const b=X.curve2dsNearParams(R,Q,R.getStartParam(),Q.getStartParam());b?(R.getRange().max=b.param1,Q.getRange().min=b.param2):MathError.assert(b,"No Intersection found between preline & curline")}else if(U){const b=X.curve2dsNearParams(E,U,E.getEndParam(),U.getEndParam());b?(E.getRange().max=b.param1,U.getRange().min=b.param2):MathError.assert(b,"No Intersection found between preline & curline")}}}o.set(Q,[t[u]])}if(r){const I=Array.from(o.keys());A:for(let c=0;c<I.length;){for(let E=c+1;E<I.length;E++){const u=CurvesMerge.curve2dsEvolution(I[c],I[E],MergeReverseMode.remove,s);if(u){o.appendKey(u,[I[c],I[E]]),I.splice(E,1),I.splice(c,1),I.push(...u.keys());continue A}}c++}}return o}static _makeJoints(t,e){const n=t.map(()=>[]),s=t.length;function r(i,o,g,a,I){const c={curveId:i,jointId:-1,done:!1,point:g,param:a,thats:[]},E={curveId:o,jointId:-1,done:!1,point:g,param:I,thats:[c]};c.thats.push(E),n[i].push(c),n[o].push(E)}for(let i=0;i<s;i++){const o=t[i];if(o.getRange()instanceof PeriodInterval){const g=o.getStartPt(),a=o.getEndPt();g.equals(a,e.lengthEps)&&r(i,i,o.getStartPt(),o.getStartParam(),o.getEndParam())}else if(o instanceof exports.OffsetCurve2)if(o.getBaseCurve().getRange()instanceof PeriodInterval){const a=o.getStartPt(),I=o.getEndPt();a.equals(I,e.lengthEps)&&r(i,i,o.getStartPt(),o.getStartParam(),o.getEndParam())}else{const a=o.getBaseCurve(),I=o.getParamMapper(),c=o.getStartTangent(),E=o.getEndTangent(),u=a.getPtAt(I.getBaseParam(o.getStartParam(),!0)),p=a.getPtAt(I.getBaseParam(o.getEndParam(),!1)).subtracted(u);if(p.dot(c)>0&&p.dot(E)>0)continue;const w=o.getEndPt().subtract(o.getStartPt());if(!(w.dot(c)>0&&w.dot(E)>0))continue;const y=X.curve2dsNearParams(o,o,o.getStartParam(),o.getEndParam());if(!y)continue;r(i,i,y.point,y.param1,y.param2)}}for(let i=0;i<s;i++)for(let o=i+1;o<s;o++){const g=X.curve2ds(t[i],t[o]);for(const a of g)a.isOverlap||r(i,o,a.point,a.param1,a.param2)}for(const i of n){if(i.length===0)continue;{const I=t[i[0].curveId].getRange();if(I instanceof PeriodInterval){const c=i.some(E=>Math.abs(E.param-I.min)<Tol.NUMBER);for(const E of i){const u=Math.abs(E.param-I.max)<Tol.NUMBER;E.param=c&&u?E.param:I.getRegularParam(E.param)}}}i.sort((a,I)=>{const c=a.overlap?a.overlap.getMid():a.param,E=I.overlap?I.overlap.getMid():I.param;return c===E?a.jointId-I.jointId:c-E});for(let a=0;a<i.length;a++){const I=i[a];I.jointId=a;let c=a+1;for(;c<i.length&&!(Math.abs(I.param-i[c].param)>e.numberEps);c++);if(c>a+1){const E=I.point;let u=I.param;for(let Q=a+1;Q<c;Q++){const p=i[Q];E.add(p.point),u+=p.param,I.thats.push(...p.thats);for(const w of p.thats){const y=w.thats.findIndex(M=>M===p);w.thats[y]=I}}I.point=E.multiply(1/(c-a)),I.param=u/(c-a),i.splice(a+1,c-a-1)}}if(i.length<2)continue;const o=i[0],g=i[i.length-1];if(o.point.equals(g.point)){for(const a of o.thats)a!==g&&!g.thats.includes(a)&&(g.thats.push(a),a.thats.push(g));for(const a of g.thats)a!==o&&!o.thats.includes(a)&&(o.thats.push(a),a.thats.push(o))}}return n}static _findLoop2ds(t,e,n){const s=[],r=t.length;for(let i=0;i<r;i++){const o=e[i];for(let g=0;g<o.length-1;g++){const a=o[g];if(a.done)continue;let I={joint:a,direction:!0};const c=[];let E=!0;do{I.direction?I.joint.done=!0:E=!1;const u=I.joint;c.push(u);const Q=e[u.curveId],p=Q[u.jointId+(I.direction?1:-1)],w=t[u.curveId].getTangentAt(p.param);I.direction&&w.reverse();let y;const M=N=>{(!y||y.angle>N.angle===n)&&(y=N)};I.direction?p.jointId+1<Q.length&&M({joint:p,angle:Math.PI,direction:!0}):p.jointId>0&&M({joint:p,angle:Math.PI,direction:!1});for(const N of p.thats){const S=t[N.curveId].getTangentAt(N.param);if(N.jointId<e[N.curveId].length-1){const R=w.angleTo(S);M({angle:R,joint:N,direction:!0})}if(N.jointId>0){const R=w.angleTo(S.reverse());M({angle:R,joint:N,direction:!1})}}if(!y){E=!1;break}if(c.length>1e4){console.warn("There are too many ISegments in loop! there maybe exit unlimited cricle.");break}I=y}while(I.joint!==a);E&&s.push(c)}}return s}}class Offset{static curve3dsByPoint(t,e,n=Tol.DEFAULT){const s=t.length,r=CurveUtil.getDzByCurves(t),i=t.map(p=>PtToCurve3Distance.execute(e,p));let o=0;for(let p=1;p<s;p++)i[p].distance<i[o].distance&&(o=p);const g=i[o],a=t[o],I=a.getRange();let c=-1;g.param===I.min?c=o:g.param===I.max&&(c=(o+1)%s);const E=new exports.Vec3(e).subtract(g.foot),u=E.dot(r);let Q;if(c<0){const w=a.getTangentAt(g.param).cross(r);Q=E.dot(w)}else{const p=t[(c+s-1)%s],w=t[c],y=p.getEndTangent(),M=w.getStartTangent(),N=y.cross(r).dot(E),S=M.cross(r).dot(E);Q=Math.max(N,S)}return Offset.curve3dsByOffsets(t,Q,u,r,n)}static curve3dsByOffsets(t,e,n,s,r=Tol.DEFAULT){const i=s||CurveUtil.getDzByCurves(t),o={smoothPolyToNurbs:!0},{curves:g,evolution:a}=CurveUtil.simplifyCurves3d(t,o),I=g.map(N=>exports.OffsetCurve3.makeByOffset(N,i,e,n)),c=new Map;for(let N=0;N<I.length;N++){if(this._isDegeneratedCurve(I[N])){I.splice(N,1),N--;continue}c.set(I[N],g[N])}let E;try{E=Offset._connectCurves(I,i,e,!0,r)}catch{return{loops:[],evolution:new EvolutionMap}}const u=Array.from(E.keys()),Q=Offset._makeJoints(u,r),p=Offset._findLoops(u,Q,i,e>0),w=new EvolutionMap,y=p.map(N=>{const S=[];for(let R=0;R<N.length;R++){const U=N[R];for(;R+1<N.length&&N[R+1].curveId===U.curveId;)R++;const b=Q[U.curveId][N[R].jointId+1].param,G=u[U.curveId],O=G.clone().setRange(U.param,b);S.push(O),w.set(O,[G])}return S}),M=w.connectValueMap(E);for(const N of M.values())for(let S=0;S<N.length;S++)N[S]=a.get(c.get(N[S]))[0];return{loops:y,evolution:M}}static offsetCurve3dList(t,e,n){const s=n;if(t[0].getStartPt().equals(t[t.length-1].getEndPt())){const E=Offset.curve3dsByOffsets(t,e,0,n),u=[];return E.loops.map(Q=>u.push(...Q)),{curveList:u,evolution:E.evolution}}const i={smoothPolyToNurbs:!0},{curves:o}=CurveUtil.simplifyCurves3d(t,i),g=o.map(E=>exports.OffsetCurve3.makeByOffset(E,s,e)),a=new Map;for(let E=0;E<g.length;E++){if(this._isDegeneratedCurve(g[E])){g.splice(E,1),E--;continue}a.set(g[E],o[E])}let I;try{I=Offset._connectCurves(g,s,e,!1,Tol.DEFAULT)}catch{return{curveList:[],evolution:new EvolutionMap}}return{curveList:Array.from(I.keys()),evolution:I}}static offsetLoop2d(t,e,n=Tol.DEFAULT,s=!0,r){return Loop2dOffset.execute(t,e,n,s,r)}static offsetCurve2dList(t,e){return Loop2dOffset.offsetCurve2dList(t,e)}static _isDegeneratedCurve(t){if(t.getRange().getLength()<Tol.NUMBER)return!0;if(t.isArc3d())return t.getA()<Tol.LENGTH&&t.getB()<Tol.LENGTH;if(t.isNurbsCurve3d()){const e=t.getControlPoints();let n=0;for(let s=1;s<e.length;s++){const r=e[s].sqDistanceTo(e[s-1]);n+=r}return n<Tol.LENGTH_2}return!1}static _connectCurves(t,e,n,s,r){const i=new EvolutionMap;for(let g=0;g<t.length;g++){if(!s&&g===0){i.set(t[0],[t[0]]);continue}const a=(g+t.length-1)%t.length,I=t[a],c=t[g],E=I instanceof exports.OffsetCurve3?I.getBaseCurve().getEndTangent():I.getEndTangent(),u=c instanceof exports.OffsetCurve3?c.getBaseCurve().getStartTangent():c.getStartTangent(),Q=E.cross(u).dot(e);if(I.getEndPt().sqDistanceTo(c.getStartPt())>Tol.LENGTH_2)if(n>0?Q>r.angleEps:Q<-r.angleEps){let w,y;if(I instanceof exports.Ln3)w=I,w.getRange().max=CONST.MODEL_MAX_LENGTH;else{const S=I instanceof exports.OffsetCurve3?I.getParamMapper().getParamInfo(I.getBaseCurve().getEndParam(),!0).type:ParamType.Normal;if(S===ParamType.Normal)w=new exports.Ln3(I.getEndPt(),E,[0,CONST.MODEL_MAX_LENGTH]);else{const R=E.cross(e),b=I.getBaseCurve().getEndPt().add(R.multiply(n));if(w=new exports.Ln3(b,E,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),S===ParamType.EndGap||S===ParamType.Reversed){const G=CurvesX.curve3ds(I,w);MathError.assert(G.length>0,"No Intersect when tirm OffsetCurve end");let O=G[0];for(let H=1;H<G.length;H++)G[H].param2>O.param2&&(O=G[H]);w.getRange().min=O.param2,I.getRange().max=O.param1}else w.getRange().min=0}i.set(w,[t[a]])}if(c instanceof exports.Ln3)y=c,y.getRange().min=-CONST.MODEL_MAX_LENGTH;else{const S=c instanceof exports.OffsetCurve3?c.getParamMapper().getParamInfo(c.getBaseCurve().getStartParam(),!1).type:ParamType.Normal;if(S===ParamType.Normal)y=new exports.Ln3(c.getStartPt(),u,[-CONST.MODEL_MAX_LENGTH,0]);else{const R=u.cross(e),b=c.getBaseCurve().getStartPt().add(R.multiply(n));if(y=new exports.Ln3(b,u,[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]),S===ParamType.StartGap||S===ParamType.Reversed){const G=CurvesX.curve3ds(c,y);MathError.assert(G.length>0,"No Intersect when trim OffsetCurve start");let O=G[0];for(let H=1;H<G.length;H++)G[H].param2<O.param2&&(O=G[H]);y.getRange().max=O.param2,c.getRange().min=O.param1}else y.getRange().max=0}i.set(y,[t[g]])}const M=LinesX.line3ds(w,y);MathError.assert(M.length>0,"No Intersection found between preline & curline");const N=M[0];w.getRange().max=N.param1,y.getRange().min=N.param2}else{const w=M=>{if(M instanceof exports.OffsetCurve3&&M.isPeriodic()){const N=M.getBaseCurve(),S=N.getDomain().getLength()-M.getDomain().getLength();if(N.isNurbsCurve3d()&&M.getRange().max-M.getDomain().max<S)return!0}return!1},y=X.curve3dsNearParams(I,c,I.getEndParam(),c.getStartParam());if(y)I.getRange().max=y.param1,c.getRange().min=y.param2;else{let M,N;if(w(I)){const S=I.getEndPt(),R=E.cross(e),b=I.getBaseCurve().getEndPt().add(R.multiply(n));M=new exports.Ln3(S,b),i.set(M,[t[a]])}if(w(c)){const S=u.cross(e),U=c.getBaseCurve().getStartPt().add(S.multiply(n)),b=c.getStartPt();N=new exports.Ln3(U,b),i.set(N,[t[g]])}if(M&&N){const S=LinesX.line3ds(M,N);MathError.assert(S.length>0,"No Intersection found between preline & curline");const R=S[0];M.getRange().max=R.param1,N.getRange().min=R.param2}else if(M){const S=X.curve3dsNearParams(M,c,M.getStartParam(),c.getStartParam());S?(M.getRange().max=S.param1,c.getRange().min=S.param2):MathError.assert(S,"No Intersection found between preline & curline")}else if(N){const S=X.curve3dsNearParams(I,N,I.getEndParam(),N.getEndParam());S?(I.getRange().max=S.param1,N.getRange().min=S.param2):MathError.assert(S,"No Intersection found between preline & curline")}}}i.set(c,[t[g]])}const o=Array.from(i.keys());A:for(let g=0;g<o.length;){for(let a=g+1;a<o.length;a++){const I=CurvesMerge.curve3dsEvolution(o[g],o[a],MergeReverseMode.remove,r);if(I){i.appendKey(I,[o[g],o[a]]),o.splice(a,1),o.splice(g,1),o.push(...I.keys());continue A}}g++}return i}static _makeJoints(t,e){const n=t.map(()=>[]),s=t.length;function r(i,o,g,a,I){const c={curveId:i,jointId:-1,done:!1,point:g,param:a,thats:[]},E={curveId:o,jointId:-1,done:!1,point:g,param:I,thats:[c]};c.thats.push(E),n[i].push(c),n[o].push(E)}for(let i=0;i<s;i++){const o=t[i];if(o.getRange()instanceof PeriodInterval){const g=o.getStartPt(),a=o.getEndPt();g.equals(a,e.lengthEps)&&r(i,i,o.getStartPt(),o.getStartParam(),o.getEndParam())}else if(o instanceof exports.OffsetCurve3)if(o.getBaseCurve().getRange()instanceof PeriodInterval){const a=o.getStartPt(),I=o.getEndPt();a.equals(I,e.lengthEps)&&r(i,i,o.getStartPt(),o.getStartParam(),o.getEndParam())}else{const a=o.getBaseCurve(),I=o.getParamMapper(),c=o.getStartTangent(),E=o.getEndTangent(),u=a.getPtAt(I.getBaseParam(o.getStartParam(),!0)),p=a.getPtAt(I.getBaseParam(o.getEndParam(),!1)).subtracted(u);if(p.dot(c)>0&&p.dot(E)>0)continue;const w=o.getEndPt().subtract(o.getStartPt());if(!(w.dot(c)>0&&w.dot(E)>0))continue;const y=X.curve3dsNearParams(o,o,o.getStartParam(),o.getEndParam());if(!y)continue;r(i,i,y.point,y.param1,y.param2)}}for(let i=0;i<s;i++)for(let o=i+1;o<s;o++){const g=X.curve3ds(t[i],t[o]);for(const a of g)a.isOverlap||t[i].containsPt(a.point)&&t[o].containsPt(a.point)&&r(i,o,a.point,a.param1,a.param2)}for(const i of n){if(i.length===0)continue;{const I=t[i[0].curveId].getRange();if(I instanceof PeriodInterval){const c=i.some(E=>Math.abs(E.param-I.min)<Tol.NUMBER);for(const E of i){const u=Math.abs(E.param-I.max)<Tol.NUMBER;E.param=c&&u?E.param:I.getRegularParam(E.param,Tol.NUMBER)}}}i.sort((a,I)=>{const c=a.overlap?a.overlap.getMid():a.param,E=I.overlap?I.overlap.getMid():I.param;return c===E?a.jointId-I.jointId:c-E});for(let a=0;a<i.length;a++){const I=i[a];I.jointId=a;let c=a+1;for(;c<i.length&&!(Math.abs(I.param-i[c].param)>e.numberEps);c++);if(c>a+1){const E=I.point;let u=I.param;for(let Q=a+1;Q<c;Q++){const p=i[Q];E.add(p.point),u+=p.param,I.thats.push(...p.thats);for(const w of p.thats){const y=w.thats.findIndex(M=>M===p);w.thats[y]=I}}I.point=E.multiply(1/(c-a)),I.param=u/(c-a),i.splice(a+1,c-a-1)}}if(i.length<2)continue;const o=i[0],g=i[i.length-1];if(o.point.equals(g.point)){for(const a of o.thats)a!==g&&!g.thats.includes(a)&&(g.thats.push(a),a.thats.push(g));for(const a of g.thats)a!==o&&!o.thats.includes(a)&&(o.thats.push(a),a.thats.push(o))}}return n}static _findLoops(t,e,n,s){const r=[],i=t.length;for(let o=0;o<i;o++){const g=e[o];for(let a=0;a<g.length-1;a++){const I=g[a];if(I.done)continue;let c={joint:I,direction:!0};const E=[];let u=!0;do{c.direction?c.joint.done=!0:u=!1;const Q=c.joint;if(E.push(Q),E.length>2*i)break;const p=e[Q.curveId],w=p[Q.jointId+(c.direction?1:-1)],y=t[Q.curveId].getTangentAt(w.param);c.direction&&y.reverse();let M;const N=S=>{(!M||M.angle>S.angle===s)&&(M=S)};c.direction?w.jointId+1<p.length&&N({joint:w,angle:Math.PI,direction:!0}):w.jointId>0&&N({joint:w,angle:Math.PI,direction:!1});for(const S of w.thats){const R=t[S.curveId].getTangentAt(S.param);if(S.jointId<e[S.curveId].length-1){const U=y.angleTo(R,n);N({angle:U,joint:S,direction:!0})}if(S.jointId>0){const U=y.angleTo(R.reverse(),n);N({angle:U,joint:S,direction:!1})}}if(!M){u=!1;break}c=M}while(c.joint!==I);u&&r.push(E)}}return r}}class PolygonOffset{static execute(t,e,n){if(t.isEmpty())return{offsetPolygon:new exports.Polygon};const s=Tol.CLIPPER_SCALE,r=ClipperFormatConverter.polygonToPaths(t);(void 0).ScaleUpPaths(r,s);const i=new(void 0)(Number.MAX_VALUE);i.AddPaths(r,(void 0).jtMiter,(void 0).etClosedPolygon),i.Execute(r,e*s),(void 0).ScaleDownPaths(r,s);const o=ClipperFormatConverter.pathsToPolygon(r);let g;return n&&(g=this._calEvolution(t,o,e)),{offsetPolygon:o,evolution:g}}static offsetCurves(t,e,n,s=!0){const r=t.clone().getLoops(),i=new exports.Polygon;if(r.forEach((o,g)=>{const a=n.filter(I=>I.length>1&&I[0]===g);if(a.length){const I=a.map(u=>u[1]);Loop2dOffset.execute(o.getAllCurves(),e,void 0,s,I).loops.map(u=>new exports.Loop(u)).forEach(u=>{i.addLoop(u)})}else i.addLoop(o)}),i.isEmpty())return new exports.Polygon;if(s||!i.isValid()){const o=Tol.CLIPPER_SCALE,g=ClipperFormatConverter.polygonToPaths(i);(void 0).ScaleUpPaths(g,o);const a=(void 0).SimplifyPolygons(g,(void 0).pftPositive);return(void 0).ScaleDownPaths(a,o),ClipperFormatConverter.pathsToPolygon(a)}else return i}static _calEvolution(t,e,n){const s=(g,a)=>{if(!g.getDirection().isSameDirection(a.getDirection()))return!1;const I=PtToCv2Distance.simple(a.getStartPt(),g,!0);return Util.isNearlyEqual(-I.distance,n)},r=new Map,i=t.getAllCurves(),o=e.getAllCurves();for(const g of o){const a=g.clone().extendDouble(CONST.MODEL_MAX_LENGTH),I=i.filter(E=>s(a,E));if(!I.length)continue;const c=g.getMidPt();I.sort((E,u)=>c.distanceTo(E.getMidPt())-c.distanceTo(u.getMidPt())),r.set(g,I[0])}return r}}class LoopTreeNode{constructor(){this.children=[]}addToChild(t){this.children||(this.children=[]),this.children.push(t)}isPolygonValid(){let t=!1;if(this.data&&(t=this.data.isAnticlockwise()),!this.children||this.children.length<1)return!0;for(const e of this.children)if(!e.data||t===e.data.isAnticlockwise()||!e.isPolygonValid())return!1;return!0}makeValid(t){this.data&&(t?this._makeClockwise():this._makeAnticlockwise()),this.children&&this.children.length&&this.children.forEach(e=>{e.makeValid(!t)})}collectLoops(t){this.data&&t.push(this.data),this.children&&this.children.length&&this.children.forEach(e=>{e.collectLoops(t)})}collectHoles(t){if(this.data&&!this.data.isAnticlockwise()){const e=new exports.Polygon(this.data);this.children&&this.children.length&&this.children.forEach(n=>{n.data&&(MathAssert.assert(n.data.isAnticlockwise()),e.addLoop(n.data))}),t.push(e)}this.children&&this.children.length&&this.children.forEach(e=>{e.collectHoles(t)})}collectNewPolygonExes(t){if(this.data&&this.data.isAnticlockwise()){const e=new exports.Polygon(this.data);this.children&&this.children.length&&this.children.forEach(n=>{n.data&&(MathAssert.assert(!n.data.isAnticlockwise()),e.addLoop(n.data.clone()))}),t.push(e)}this.children&&this.children.length&&this.children.forEach(e=>{e.collectNewPolygonExes(t)})}_makeClockwise(){this.data?this.data.isAnticlockwise()&&this.data.reverse():this.children&&this.children.length&&this.children.forEach(t=>{t.data&&t.data.isAnticlockwise()&&t.data.reverse()})}_makeAnticlockwise(){this.data?this.data.isAnticlockwise()||this.data.reverse():this.children&&this.children.length&&this.children.forEach(t=>{t.data&&(t.data.isAnticlockwise()||t.data.reverse())})}}class DiscreteTopology{static tessPolygonEx(t,e=DiscreteParam.NORMAL,n=0){if(t.getAllCurves().length<1)return console.error("input error"),{vertices:[],faces:[]};const s=t.getLoops().map(r=>DiscreteTopology.discretePolyline(r,e));return DiscreteUtil.tessVector2(s)}static tessPolygon(t,e=DiscreteParam.NORMAL,n=!0){const s={vertices:[],faces:[]};if(t.getLoops().length<1)return s;let r;t.isOnlyLines()?r=t:r=new exports.Polygon(DiscreteTopology.discretePolygon(t,e));let i=[r];n&&(i=SearchGraph.loopsToPolygonExes(r.getLoops())),r.getLoops().length>0&&i.length<1&&(t.getLoops().length===1?i=[r]:console.log("离散出错"));let o=0;for(const g of i){o=s.vertices.length;const a=DiscreteTopology.tessPolygonEx(g,e,o);s.vertices.push(...a.vertices),s.faces.push(...a.faces)}return s}static discretePolyline(t,e=DiscreteParam.NORMAL){const n=t.getAllCurves(),s=[];for(let r=0;r<n.length;r++){const o=n[r].discrete(e);(r!==n.length-1||t.getType()===EN_GEO_TYPE.LOOP)&&o.pop(),s.push(...o)}return s}static discretePolygon(t,e=DiscreteParam.NORMAL){const n=[];return t.getLoops().forEach(s=>{const r=DiscreteTopology.discretePolyline(s,e);n.push(r)}),n}}class LoopsToLoopTreeSearchGraph{static{this.scale=1e5}static execute(t){const e=t.map(o=>{const g=DiscreteTopology.discretePolyline(o,DiscreteParam.CALCULATE);return ClipperFormatConverter.vector2sToXY(g)});(void 0).ScaleUpPaths(e,LoopsToLoopTreeSearchGraph.scale);const n=new(void 0);n.AddPaths(e,(void 0).ptClip,!0),n.AddPath([],(void 0).ptSubject,!0);const s=new(void 0);n.Execute((void 0).ctUnion,s);const r=t.map(o=>LoopsToLoopTreeSearchGraph._ptsToKey(o.toPath()));return LoopsToLoopTreeSearchGraph._polyTreeToLoopTree(s,void 0,r,[...t])}static _ptToKey(t){const e=t.multiplied(LoopsToLoopTreeSearchGraph.scale);return`${Math.round(e.x)}_${Math.round(e.y)}`}static _ptsToKey(t){let e="";return t.forEach(n=>{e+=`${LoopsToLoopTreeSearchGraph._ptToKey(new exports.Vec2(n))},`}),e}static _polyTreeToLoopTree(t,e,n,s){const r=new LoopTreeNode;if(e&&e.addToChild(r),t.m_polygon&&t.m_polygon.length>0){const i=ClipperFormatConverter.pathToLoop(t.m_polygon),o=LoopsToLoopTreeSearchGraph._findLoop(i,n,s);i.isAnticlockwise()!==o.isAnticlockwise()&&o.reverse(),r.data=o}if(!t.m_Childs||t.m_Childs.length<1)return r;for(const i of t.m_Childs)LoopsToLoopTreeSearchGraph._polyTreeToLoopTree(i,r,n,s);return r}static _findLoop(t,e,n){const s=1/LoopsToLoopTreeSearchGraph.scale,r=t.toPath().map(I=>I.multiply(s)),i=[];n.forEach(I=>i.push(0));for(const I of r){const c=I,E=`,${LoopsToLoopTreeSearchGraph._ptToKey(c)},`;e.forEach((u,Q)=>{u.includes(E)&&i[Q]++})}const o=Math.max(...i);if(o===0)throw new Error("cant find, bug!!");const g=i.findIndex(I=>I===o);return e.splice(g,1),n.splice(g,1)[0]}}class PolygonToPolygonExes{static execute(t){return ILoopsToPolygonExes.execute(t.getLoops(),!1).map(e=>new exports.Polygon(e))}}class SearchGraph{static searchLoop2D(t,e,n=Tol.LENGTH){return SearchLoop2D.execute(t,e,n)}static simpleLoop(t,e=Tol.LENGTH){return SearchSimpleLoop.execute(t,e)}static simplePolygon(t,e=Tol.LENGTH){const n=SearchGraph.simpleLoop(t,e);if(!n.length)return;for(const i of n)if(i.getType()!==EN_GEO_TYPE.LOOP){console.error("不是合法的polygon");return}const s=LoopsToLoopTreeSearchGraph.execute(n);s.makeValid(!0);const r=[];return s.collectLoops(r),new exports.Polygon(r)}static loopsToPolygonExes(t){return ILoopsToPolygonExes.execute(t,!0).map(e=>{const n=new exports.Polygon;return e.forEach(s=>n.addLoop(s,!1)),n})}static polygonToPolygonExes(t){return t.getLoops().length<2?[t]:PolygonToPolygonExes.execute(t)}}class TopologyEdit{static splitPolygonRegion(t){if(t.getLoops().length===0)return new exports.Loop;let e=t.getLoops()[0].clone();for(let n=1;n<t.getLoops().length;n++)e=this._splitLoopLoopRegion(e,t.getLoops()[n].clone());return e}static _splitLoopLoopRegion(t,e){if(t.getAllCurves().length===0||e.getAllCurves().length===0)return e.getAllCurves().length>0?e:t;const n={minDist:t.getAllCurves()[0].getStartPt().sqDistanceTo(e.getAllCurves()[0].getStartPt()),index1:0,index2:0};for(let E=0;E<t.getAllCurves().length;E++){const u=t.getAllCurves()[E];for(let Q=0;Q<e.getAllCurves().length;Q++){const p=e.getAllCurves()[Q],w=u.getStartPt().sqDistanceTo(p.getStartPt());w<n.minDist&&(n.minDist=w,n.index1=E,n.index2=Q)}}const s=new exports.Ln2(t.getAllCurves()[n.index1].getStartPt(),e.getAllCurves()[n.index2].getStartPt());let r,i;for(let E=0;E<t.getAllCurves().length;E++){const u=t.getAllCurves()[E];if(u.isLine2d())continue;const p=X.curve2ds(s,u).filter(w=>!w.point.equals(u.getStartPt())&&!w.point.equals(u.getEndPt()));if(p.length>0){i=p,r=E;break}}let o,g;for(let E=0;E<e.getAllCurves().length;E++){const u=e.getAllCurves()[E];if(u.isLine2d())continue;const p=X.curve2ds(s,u).filter(w=>!w.point.equals(u.getStartPt())&&!w.point.equals(u.getEndPt()));if(p.length>0){g=p,o=E;break}}if(r!==void 0){i.sort((Q,p)=>p.param1-Q.param1),s.getRange().min=i[0].param1;const E=t.getAllCurves()[r],u=E.clone();u.getRange().min=i[0].param2,E.getRange().max=i[0].param2,t.insertCurve(r+1,u),n.index1=r+1}else if(o!==void 0){g.sort((Q,p)=>Q.param1-p.param1),s.getRange().max=g[0].param1;const E=e.getAllCurves()[o],u=E.clone();u.getRange().min=g[0].param2,E.getRange().max=g[0].param2,e.insertCurve(o+1,u),n.index2=o+1}t.insertCurve(n.index1,s);const a=e.getAllCurves().slice(n.index2),I=e.getAllCurves().slice(0,n.index2);t.insertCurve(n.index1+1,...a),t.insertCurve(n.index1+1+a.length,...I);const c=s.clone();return c.reverse(),t.insertCurve(n.index1+1+e.getAllCurves().length,c),t}}class ClipMesh{static clipFaceMesh(t,e,n=!1,s=!0){const r=new Set,i=new Set,o=new Set;t.mesh.vertices.forEach((p,w)=>{const y=new exports.Vec3(p),M=D.ptToSurfSigned(y,e),N=Tol.LENGTH;M>N?r.add(w):M<-N?o.add(w):Math.abs(M)<=N&&i.add(w)});const g=[],a=new Set,I=new Set,c=[];t.mesh.faces.forEach(([p,w,y],M)=>{i.has(p)&&i.has(w)&&i.has(y)?(g.push([p,w,y]),a.add(g.length-1)):!o.has(p)&&!o.has(w)&&!o.has(y)?g.push([p,w,y]):!r.has(p)&&!r.has(w)&&!r.has(y)?c.push([p,w,y]):I.add(M)});const E=t;let u;n&&(u=this._cloneRenderMesh(t)),I.forEach(p=>{const w=t.mesh.faces[p],y=w.filter(R=>r.has(R)),M=w.filter(R=>o.has(R)),N=w.filter(R=>i.has(R)),S=this._calNormal(t.mesh.vertices,w[0],w[1],w[2]);if(y.length===1&&M.length===1){const R=ClipMesh._getVertexInfo(t,y[0]),U=ClipMesh._getVertexInfo(t,M[0]),b=this._calIntersectInfo(e,R,U);E.mesh.vertices.push(b.point),E.mesh.normals.push(b.normal),E.mesh.uvs.push(b.uv);const G=E.mesh.vertices.length-1;n&&(u.mesh.vertices.push(b.point.slice()),u.mesh.normals.push(b.normal.slice()),u.mesh.uvs.push(b.uv.slice())),g.push(this._reorderPts(t.mesh.vertices,S,y[0],N[0],G)),n&&c.push(this._reorderPts(t.mesh.vertices,S,M[0],N[0],G))}else if(y.length===1&&M.length===2){const R=ClipMesh._getVertexInfo(t,y[0]),U=ClipMesh._getVertexInfo(t,M[0]),b=ClipMesh._getVertexInfo(t,M[1]),G=this._calIntersectInfo(e,R,U);E.mesh.vertices.push(G.point),E.mesh.normals.push(G.normal),E.mesh.uvs.push(G.uv);const O=E.mesh.vertices.length-1;n&&(u.mesh.vertices.push(G.point.slice()),u.mesh.normals.push(G.normal.slice()),u.mesh.uvs.push(G.uv.slice()));const H=this._calIntersectInfo(e,R,b);E.mesh.vertices.push(H.point),E.mesh.normals.push(H.normal),E.mesh.uvs.push(H.uv);const z=E.mesh.vertices.length-1;n&&(u.mesh.vertices.push(H.point.slice()),u.mesh.normals.push(H.normal.slice()),u.mesh.uvs.push(H.uv.slice())),g.push(this._reorderPts(t.mesh.vertices,S,y[0],O,z)),n&&(c.push(this._reorderPts(t.mesh.vertices,S,M[0],O,z)),c.push(this._reorderPts(t.mesh.vertices,S,M[0],M[1],z)))}else if(y.length===2&&M.length===1){const R=ClipMesh._getVertexInfo(t,y[0]),U=ClipMesh._getVertexInfo(t,y[1]),b=ClipMesh._getVertexInfo(t,M[0]),G=this._calIntersectInfo(e,R,b);E.mesh.vertices.push(G.point),E.mesh.normals.push(G.normal),E.mesh.uvs.push(G.uv);const O=E.mesh.vertices.length-1;n&&(u.mesh.vertices.push(G.point.slice()),u.mesh.normals.push(G.normal.slice()),u.mesh.uvs.push(G.uv.slice()));const H=this._calIntersectInfo(e,U,b);E.mesh.vertices.push(H.point),E.mesh.normals.push(H.normal),E.mesh.uvs.push(H.uv);const z=E.mesh.vertices.length-1;n&&(u.mesh.vertices.push(H.point.slice()),u.mesh.normals.push(H.normal.slice()),u.mesh.uvs.push(H.uv.slice())),g.push(this._reorderPts(t.mesh.vertices,S,y[0],O,z)),g.push(this._reorderPts(t.mesh.vertices,S,y[0],z,y[1])),n&&c.push(this._reorderPts(t.mesh.vertices,S,M[0],O,z))}}),s&&Array.from(a).sort((w,y)=>y-w).forEach(w=>{g.splice(w,1)}),E.mesh.faces=g,n&&(u.mesh.faces=c);let Q=!1;return s&&a.size>0&&(Q=!0),n&&I.size>0&&(Q=!0),!n&&o.size>0&&(Q=!0),{clipped:Q,aboveMesh:E,downMesh:n?u:void 0}}static meshPlaneIntersect(t,e){const n=new Set,s=new Set,r=new Set;t.mesh.vertices.forEach((I,c)=>{const E=new exports.Vec3(I),u=D.ptToSurfSigned(E,e),Q=Tol.LENGTH;u>Q?n.add(c):u<-Q?r.add(c):Math.abs(u)<=Q&&s.add(c)});const i=new Set;t.mesh.faces.forEach(([I,c,E],u)=>{(n.has(I)||n.has(c)||n.has(E))&&(!n.has(I)||!n.has(c)||!n.has(E))&&i.add(u)});const o=[];if(i.forEach(I=>{const c=t.mesh.faces[I],E=c.filter(p=>n.has(p)),u=c.filter(p=>r.has(p)),Q=c.filter(p=>s.has(p));if(E.length===1&&u.length===1){const p=ClipMesh._getVertexInfo(t,E[0]),w=ClipMesh._getVertexInfo(t,u[0]),y=ClipMesh._getVertexInfo(t,Q[0]),M=new exports.Ln3(p?.vector,w?.vector),N=X.curveSurface(M,e)[0];o.push(new exports.Ln3(y?.vector,N))}else if(E.length===1&&u.length===2){const p=ClipMesh._getVertexInfo(t,E[0]),w=ClipMesh._getVertexInfo(t,u[0]),y=ClipMesh._getVertexInfo(t,u[1]),M=new exports.Ln3(p?.vector,w?.vector),N=X.curveSurface(M,e)[0],S=new exports.Ln3(p?.vector,y?.vector),R=X.curveSurface(S,e)[0];o.push(new exports.Ln3(N,R))}else if(E.length===2&&u.length===1){const p=ClipMesh._getVertexInfo(t,E[0]),w=ClipMesh._getVertexInfo(t,E[1]),y=ClipMesh._getVertexInfo(t,u[0]),M=new exports.Ln3(p?.vector,y?.vector),N=X.curveSurface(M,e)[0],S=new exports.Ln3(w?.vector,y?.vector),R=X.curveSurface(S,e)[0];o.push(new exports.Ln3(N,R))}else if(E.length===1&&Q.length===2){const p=t.mesh.vertices[Q[0]],w=new exports.Vec3(p),y=t.mesh.vertices[Q[1]],M=new exports.Vec3(y);o.push(new exports.Ln3(w,M))}}),o.length<3)return new exports.Polygon;const g=o.map(I=>e.getLine2D(I)),a=SearchGraph.simplePolygon(g.filter(I=>!!I));return a||new exports.Polygon}static _calIntersectInfo(t,e,n){const s=new exports.Ln3(e.vector,n.vector),r=X.curveSurface(s,t)[0],i=r.distanceTo(e?.vector),o=r.distanceTo(n?.vector),g=i/(o+i),a=new exports.Vec3(e?.normal).interpolate(new exports.Vec3(n.normal),g),I=new exports.Vec2(e.uv).interpolate(new exports.Vec2(n.uv),g);return{point:r.toArray3(),vector:r,normal:a.toArray3(),uv:I.toArray2()}}static _getVertexInfo(t,e){const n=t.mesh.vertices[e],s=new exports.Vec3(n),r=t.mesh.normals[e],i=t.mesh.uvs[e];return{point:n,vector:s,normal:r,uv:i}}static _cloneRenderMesh(t){return{mesh:{vertices:t.mesh.vertices.map(e=>e.slice()),faces:t.mesh.faces.map(e=>e.slice()),normals:t.mesh.normals.map(e=>e.slice()),uvs:t.mesh.uvs.map(e=>e.slice())}}}static _calNormal(t,e,n,s){return new exports.Vec3(new exports.Vec3(t[e]),new exports.Vec3(t[n])).cross(new exports.Vec3(new exports.Vec3(t[n]),new exports.Vec3(t[s])))}static _reorderPts(t,e,n,s,r){const i=new exports.Vec3(new exports.Vec3(t[n]),new exports.Vec3(t[s])).cross(new exports.Vec3(new exports.Vec3(t[s]),new exports.Vec3(t[r])));return e.dot(i)>0?[n,s,r]:[n,r,s]}}class ClipperUtil{static clipperTreeToPathLists(t){const e=[],n=t.Childs();for(;n.length>0;){const s=n.pop(),r=[s.Contour()];for(const i of s.Childs())r.push(i.Contour()),n.push(...i.Childs());e.push(r)}return e}static xyLoopsToClipper(t,e=Tol.CLIPPER_SCALE){const n=t.map(s=>s.map(r=>new(void 0)(r.x,r.y)));return(void 0).ScaleUpPaths(n,e),n}static clipperPathsToXys(t,e=Tol.CLIPPER_SCALE){return t.map(n=>n.map(s=>({x:s.X/e,y:s.Y/e})))}static boolAsClipperPoint(t,e,n){const s=new(void 0);for(const i of t){const o=i[0][0]instanceof void 0?i:ClipperUtil.xyLoopsToClipper(i);s.AddPaths(o,(void 0).ptSubject,!0)}for(const i of e){const o=i[0][0]instanceof void 0?i:ClipperUtil.xyLoopsToClipper(i);s.AddPaths(o,(void 0).ptClip,!0)}const r=new(void 0);return s.Execute(n,r,(void 0).pftEvenOdd,(void 0).pftEvenOdd),ClipperUtil.clipperTreeToPathLists(r)}static boolAsXys(t,e,n){return ClipperUtil.boolAsClipperPoint(t,e,n).map(r=>ClipperUtil.clipperPathsToXys(r))}static removeGapByOffset(t,e){const n=Tol.CLIPPER_SCALE,s=ClipperUtil.xyLoopsToClipper(t,n),r=[1,-1,-1,1];for(const o of r){const g=new(void 0);g.AddPaths(s,(void 0).jtMiter,(void 0).etClosedPolygon),g.Execute(s,o*e*n)}return ClipperUtil.clipperPathsToXys(s,n)}}function getId(l,t,e){const[n,s]=t<e?[t,e]:[e,t];return l*n+s}function getIdInfo(l,t){const e=Math.floor(t/l),n=t%l;return{vi:e,vj:n}}class MeshContour{static execute(t){const e=MeshContour._isFacesUp(t,Tol.EDGE_LENGTH_EPS),n=MeshAssist.getEdgeNeighbourMap(t.faces),s=MeshContour._splitMesh(t,e,n);if(!s.length)return[];const r=s.map(g=>MeshContour._getOuterLoop(g));MeshContour._filterLoops(r,s),MeshContour._sortMeshes(s,r);const i=MeshContour._mixContours(r);return MeshContour._filterSmallLoops(i)}static getUpMesh(t){const e=MeshContour._isFacesUp(t,Tol.EDGE_LENGTH_EPS),n=MeshAssist.getEdgeNeighbourMap(t.faces),s=MeshContour._splitMesh(t,e,n);if(!s.length)return[];const r=s.map(i=>MeshContour._getOuterLoop(i));return MeshContour._filterLoops(r,s),MeshContour._sortMeshes(s,r),s}static getHeightAtProjectPoint(t,e){const n=(o,g)=>o.x*g.y-o.y*g.x,s=({vertices:o,faces:g},a)=>{const I=g[a]*3;return new exports.Vec3(o[I],o[I+1],o[I+2])},r=[],i=Tol.NUMBER_CALC_EPS;for(let o=0;o<t.faces.length;o+=3){const g=[0,1,2].map(E=>{const u=t.faces[o+E];return{x:e.x-t.vertices[u*3],y:e.y-t.vertices[u*3+1]}});let a=0,I=0;const c=(E,u)=>{const Q=n(g[E],g[u]);Q>i&&a++,Q<-i&&I++};if(c(0,1),c(1,2),c(2,0),a===0||I===0){const E=s(t,o),u=s(t,o+1),Q=s(t,o+2),p=u.subtracted(E).cross(Q.subtracted(E)).normalize(),w=-p.x/p.z,y=-p.y/p.z,M=E.z+(e.x-E.x)*w+(e.y-E.y)*y;r.push(M)}}return r}static _isFacesUp(t,e){const n=new Array(t.faces.length/3);for(let s=0;s<t.faces.length;s+=3){const r=t.faces[s],i=t.faces[s+1],o=t.faces[s+2],g=MeshContour._getArea(t.vertices,r,i,o);n[s/3]=g>e?!0:g<-e?!1:void 0}return n}static _splitMesh(t,e,n){const s=[],r=new Set;for(let i=0;i<t.faces.length;i+=3)r.add(i);for(;r.size>0;){const i=r.values().next().value;if(i===void 0)break;r.delete(i);const o=e[i/3];if(o===void 0)continue;const g=[t.faces[i],t.faces[i+1],t.faces[i+2]],a=c=>{const E=e[c/3];return E===o||E===void 0},I=MeshAssist.pickNeighbourFaces(t.faces,g,[i],a,n);for(const c of I)r.delete(c);s.push({faces:g,vertices:t.vertices,normals:t.normals,uvs:t.uvs})}return s}static _getOuterLoop(t){const e=new Map,n=t.vertices.length/3;for(let i=0;i<t.faces.length;i+=3)for(let o=0;o<3;o++){const g=t.faces[i+o],a=t.faces[i+(o+1)%3],I=getId(n,g,a);e.has(I)?e.delete(I):e.set(I,g)}const s=MeshContour._idFiMap2NextMap(e,n);return MeshAssist.getLoop2ds(t,s,exports.Coord3.XOY()).flat()}static _idFiMap2NextMap(t,e){const n=new Map;for(const[s,r]of t){const i=getIdInfo(e,s),o=i.vi===r?i.vj:i.vi,g=n.get(r);g===void 0?n.set(r,[o]):g.push(o)}return n}static _filterLoops(t,e,n=.001){for(let i=t.length-1;i>=0;i--)t[i].length===0&&(e.splice(i,1),t.splice(i,1));const s=t.map(i=>Math.abs(LoopArea.areaOfPoints(i[0]))),r=Math.max(...s);for(let i=t.length-1;i>=0;i--)s[i]<r*n&&(e.splice(i,1),t.splice(i,1))}static _sortMeshes(t,e){const n=new Array(t.length).fill(0),s=t.map(I=>new Array(t.length).fill(void 0));for(let I=0;I<t.length;I++)for(let c=I+1;c<t.length;c++){const E=MeshContour._isMeshLower(t[I],t[c],e[I],e[c]);E!==void 0&&(s[I][c]=E,s[c][I]=!E,n[E?I:c]++)}const r=[],i=[];for(let I=0;I<t.length;I++)n[I]===0?i.push(I):r.push(I);const o=(I,c)=>{for(let E=0;E<I.length;E++){const u=I[E];if(s[c][u])return E}};for(;r.length>0;){const I=i.length;for(let c=0;c<r.length;c++)if(!o(r,r[c])){i.push(r[c]),r.splice(c,1);break}if(I===i.length)break}const g=[],a=[];for(const I of i)g.push(t[I]),a.push(e[I]);t.splice(0,t.length,...g),e.splice(0,t.length,...a)}static _isMeshLower(t,e,n,s){const r=ClipperUtil.boolAsXys([n],[s],(void 0).ctIntersection);if(r.length===0)return;let i,o;for(const u of r){const Q=DiscreteUtil.tessVector2(u);Q.faces.length!==0&&(i=Q.vertices,o=Q.faces)}if(!i||!o)return;let g=0,a=0;for(let u=0;u<o.length;u+=3){const Q=LoopArea.areaOfPoints([i[o[u]],i[o[u+1]],i[o[u+2]]]);Q>g&&(g=Q,a=u)}const I=LoopCentroid.centroidOfPoints([i[o[a]],i[o[a+1]],i[o[a+2]]]),c=MeshContour.getHeightAtProjectPoint(t,I),E=MeshContour.getHeightAtProjectPoint(e,I);if(!(!c.length||!E.length))return c[0]<E[0]}static _mixContours(t){const e=[t[0]];let n=[ClipperUtil.xyLoopsToClipper(t[0])];for(let s=1;s<t.length;s++){const r=ClipperUtil.xyLoopsToClipper(t[s]),i=ClipperUtil.boolAsXys([r],n,(void 0).ctDifference);e.push(...i),n=ClipperUtil.boolAsClipperPoint([r],n,(void 0).ctUnion)}return e}static _filterSmallLoops(t){let e=0;const n=new Map;for(const o of t){const g=Math.abs(LoopArea.areaOfPoints(o[0]));n.set(o,g),g>e&&(e=g)}const s=[],r=e*.001;for(const o of t){if(n.get(o)<r)continue;const g=[o[0]];for(let a=1;a<o.length;a++)Math.abs(LoopArea.areaOfPoints(o[a]))>r&&g.push(o[a]);s.push(g)}return s.map(o=>ClipperUtil.removeGapByOffset(o,Tol.EDGE_LENGTH_EPS))}static _getArea(t,e,n,s,r=3){const i=e*r,o=n*r,g=s*r,a=t[o]-t[i],I=t[o+1]-t[i+1],c=t[g]-t[i],E=t[g+1]-t[i+1];return(a*E-I*c)/2}}class MeshUtil{static boxClip(t,e,n=!0){const s=[];for(let o=0;o<t.vertices.length;o+=3)s.push(new exports.Vec3([t.vertices[o],t.vertices[o+1],t.vertices[o+2]]));const r=[];for(let o=0;o<t.faces.length;o+=3){const g=exports.Plane.makeBy3Pts(s[t.faces[o]],s[t.faces[o+1]],s[t.faces[o+2]]);if(g)for(let a=(o+3)%t.faces.length;a<t.faces.length+3;a+=3){const I=D.ptToSurfSigned(s[t.faces[a%t.faces.length]],g),c=D.ptToSurfSigned(s[t.faces[(a+1)%t.faces.length]],g),E=D.ptToSurfSigned(s[t.faces[(a+2)%t.faces.length]],g);if(Util.isNearly0(I)&&Util.isNearly0(c)&&Util.isNearly0(E)){o+=3;continue}if(Util.isNearlyBigger(I,0)||Util.isNearlyBigger(c,0)||Util.isNearlyBigger(E,0)){r.push(g);break}g.reverse(),r.push(g);break}}MathError.assert(r.length===6,"切割box暂时只支持矩形");let i=e;for(const o of r)i=this.clip(i,o.getCoord(),n);return i}static createFlatMeshByMesh2d(t,e=new exports.Plane(exports.Coord3.XOY())){const n=t.faces.slice(),s=[],r=[],i=[];for(const o of t.vertices)i.push(o.x,o.y),s.push(...e.getPtAt(o).data),r.push(...e.getNormAt(o).data);return{faces:n,vertices:s,uvs:i,normals:r}}static createFlatMesh(){return{faces:[],vertices:[],normals:[],uvs:[]}}static createFlatMeshByBox2(t,e=0){const{x:n,y:s}=t.min,{x:r,y:i}=t.max;return{faces:[0,1,2,2,3,0],vertices:[n,s,e,r,s,e,r,i,e,n,i,e],normals:[0,0,1,0,0,1,0,0,1,0,0,1],uvs:[n,s,r,s,r,i,n,i]}}static createFlatMeshByBox3(t){const e=[{x:t.min.x,y:t.min.y},{x:t.max.x,y:t.min.y},{x:t.max.x,y:t.max.y},{x:t.min.x,y:t.max.y}],n=exports.Coord3.XOY().translate({x:0,y:0,z:t.min.z}),s={x:0,y:0,z:t.max.z-t.min.z};return MeshUtil.extrude([e],n,s)}static toFlatMesh(t){return{vertices:t.vertices.flat(),faces:t.faces.flat(),normals:t.normals.flat(),uvs:t.uvs.flat()}}static toMesh(t){const e={vertices:[],faces:[],normals:[],uvs:[]};for(let n=0;n<t.vertices.length;n+=3)e.vertices.push(t.vertices.slice(n,n+3));for(let n=0;n<t.faces.length;n+=3)e.faces.push(t.faces.slice(n,n+3));for(let n=0;n<t.normals.length;n+=3)e.normals.push(t.normals.slice(n,n+3));for(let n=0;n<t.uvs.length;n+=2)e.uvs.push(t.uvs.slice(n,n+2));return e}static clone(t){const e={};for(const n of Object.keys(t))e[n]=t[n].slice();return e}static merge(...t){const e=MeshUtil.createFlatMesh();for(const n of t){const s=e.vertices.length/3;for(const r of n.faces)e.faces.push(r+s);e.vertices.push(...n.vertices),e.normals.push(...n.normals),e.uvs.push(...n.uvs)}return e}static getContour(t){return MeshContour.execute(t)}static intersectLine(t,e){const n=new exports.Coord3(e.getOrigin(),e.getDirection()),s=new Array(t.vertices.length);for(let g=0;g<t.vertices.length;g+=3){const a=n.getLocalPtAt({x:t.vertices[g],y:t.vertices[g+1],z:t.vertices[g+2]});s[g]=a.x,s[g+1]=a.y,s[g+2]=a.z}const r={vertices:s,uvs:t.uvs,faces:t.faces,normals:t.normals},i=MeshContour.getHeightAtProjectPoint(r,{x:0,y:0}),o=e.getRange();return i.filter(g=>o.containsPt(g)).sort((g,a)=>g-a)}static clipSeperate(t,e,n=!1,s,r){const i=[],o=[],g=[],a=[],I=new Map;for(let E=0;E<t.length;++E){const u=t[E],Q=s?s[E]:void 0,{newMesh:p,newUvsList:w,nextMap:y,attrs:M}=this._clip(u,e,n,Q,r);I.set(p,t[E]),i.push(p),o.push(M),g.push(w),a.push(y)}const c=new Map;if(n){const E={faces:[],normals:[],uvs:[],vertices:[]};for(const y of o[0])E[y.name]=[];const u=new Map;let Q=0;for(let y=0;y<i.length;++y){i[y].faces.forEach(M=>E.faces.push(M+Q));for(const M of o[y])i[y][M.name].forEach(N=>E[M.name].push(N));for(const M of a[y]){const N=M[1].map(S=>S+Q);u.set(M[0]+Q,N)}Q+=i[y].vertices.length/3}const p=MeshUtil._fillClipSeperate(E,u,e),w=[...p.uvs];for(let y=1;y<g[0].length;++y)p.uvs.push(...w);c.set(p,void 0)}for(let E=0;E<i.length;++E){const u=i[E],Q=o[E],p=g[E],w=u.vertices.length/3,y=new Array(w).fill(-1);for(const R of u.faces)y[R]=0;const M={};for(const R of Q)M[R.name]=[];const N=p.map(R=>[]);let S=0;for(let R=0;R<w;R++)if(y[R]===0){y[R]=S++;for(const b of Q){const G=b.name,O=R*b.stride;for(let H=0;H<b.stride;H++)M[G].push(u[G][O+H])}const U=R*2;for(let b=0;b<N.length;b++){const G=p[b];N[b].push(G[U],G[U+1])}}if(M.uvs=[],N.forEach(R=>M.uvs.push(...R)),M.faces=u.faces.map(R=>y[R]),M.faces.length>0){const R=I.get(u);c.set(M,R)}}return c}static clip(t,e,n=!1,s,r){const{newMesh:i,newUvsList:o,newUvs1List:g,nextMap:a,attrs:I,uvTransform:c,uvTransform1:E}=this._clip(t,e,n,s,r);n&&MeshUtil._fillClip(i,o,a,e,c,g,E);const u=i.vertices.length/3,Q=new Array(u).fill(-1);for(const N of i.faces)Q[N]=0;const p={};for(const N of I)p[N.name]=[];const w=o.map(N=>[]),y=g.map(N=>[]);let M=0;for(let N=0;N<u;N++)if(Q[N]===0){Q[N]=M++;for(const R of I){const U=R.name,b=N*R.stride;for(let G=0;G<R.stride;G++)p[U].push(i[U][b+G])}const S=N*2;for(let R=0;R<w.length;R++){const U=o[R];w[R].push(U[S],U[S+1])}for(let R=0;R<y.length;R++){const U=g[R];y[R].push(U[S],U[S+1])}}return p.uvs=[],w.forEach(N=>{p.uvs=p.uvs.concat(N)}),y.length&&(p.uvs1=[],y.forEach(N=>{p.uvs1=p.uvs1?.concat(N)})),p.faces=i.faces.map(N=>Q[N]),p}static clipBoneInterpolation(t,e,n,s,r){const i=[];for(let o=0;o<4;o++){const g=n*4+o,a=t.boneWeights[g]*r;a>0&&i.push([t.boneIndices[g],a])}for(let o=0;o<4;o++){const g=s*4+o,a=t.boneWeights[g]*(1-r);if(a>0){const I=t.boneIndices[g],c=i.find(E=>E[0]===I);c?c[1]+=a:i.push([I,a])}}if(i.sort((o,g)=>o[1]===g[1]?o[0]-g[0]:g[1]-o[1]),i.length>4){i.length=4;let o=0;for(const g of i)o+=g[1];for(const g of i)g[1]/=o}for(const o of i)e.boneIndices.push(o[0]),e.boneWeights.push(o[1]);for(let o=i.length;o<4;o++)e.boneIndices.push(0),e.boneWeights.push(0)}static brepToMesh(t,e){const n=t.getFaces().map(s=>MeshUtil.toFlatMesh(s.tessellate(e).mesh));return MeshUtil.merge(...n)}static sweep(t,e,n,s,r=!0,i=!1){const o=BodyBuilder.sweep(t,e,n,r,i);return MeshUtil.brepToMesh(o,s)}static extrude(t,e,n,s){const r=this.extrudeSeperateFaces(t,e,n,s);return MeshUtil.merge(r.top,r.bottom,...r.sides.flat())}static extrudeSeperateFaces(t,e,n,s){const r=DiscreteUtil.tessVector2(t),i=e.getDz().data,o=[-i[0],-i[1],-i[2]],g=e.translated(n),a=MeshUtil.createFlatMesh();for(const u of r.vertices)a.vertices.push(...g.getWorldPtAt(u).data),a.normals.push(...i),a.uvs.push(u.x,u.y);a.faces=r.faces.slice();const I=MeshUtil.createFlatMesh();for(const u of r.vertices)I.vertices.push(...e.getWorldPtAt(u).data),I.normals.push(...o),I.uvs.push(u.x,u.y);for(let u=0;u<r.faces.length;u+=3)I.faces.push(r.faces[u],r.faces[u+2],r.faces[u+1]);const c=[],E=e.getDz().dot(n);for(let u=0;u<t.length;u++){const Q=[MeshUtil.createFlatMesh()],p=t[u],w=s?.[u];let y=0,M;{const N=new exports.Vec2(p[p.length-1],p[0]).normalize();M=e.getWorldVectorAt({x:N.y,y:-N.x})}for(let N=0;N<p.length;N++){const S=p[N],R=e.getWorldPtAt(S),U=R.added(n),b=new exports.Vec2(p[(N+1)%p.length]).subtract(S),G=b.getLength();b.multiply(1/G);const O=e.getWorldVectorAt({x:b.y,y:-b.x}),H=Q[Q.length-1],z=H.vertices.length/3;H.faces.push(z-2,z,z-1),H.faces.push(z-1,z,z+1);const tA=(nA,IA,iA)=>{nA.vertices.push(...R.data,...U.data),nA.uvs.push(IA,0,IA,E),nA.normals.push(...iA.data,...iA.data)};if(w&&w[N]){const nA=M.midTo(O).normalize();tA(H,y,nA),N===0&&tA(H,y,nA)}else{tA(H,y,M);const nA=MeshUtil.createFlatMesh();tA(nA,y,O),Q.push(nA)}y+=G,M=O}if(Q[0].uvs[0]=y,Q[0].uvs[2]=y,Q.length===1){const N=Q[0],S=N.vertices.length/3;N.faces[0]=S-2,N.faces[2]=S-1,N.faces[3]=S-1}else{const N=Q.pop(),S=MeshUtil.merge(N,Q[0]);Q[0]=S}c.push(Q)}return{top:a,bottom:I,sides:c}}static _clip(t,e,n=!1,s,r){const i=t.vertices.length/3,o=[];for(const O of Object.keys(t))O!=="faces"&&O!=="uvs"&&O!=="uvs1"&&o.push({name:O,stride:t[O].length/i});const g=e.getOrigin(),a=e.getDz(),I=new Map,c=(O,H,z)=>{const[tA,nA]=z?[O,H]:[H,O],IA=I.get(tA);IA?IA.push(nA):I.set(tA,[nA])},E=new Array(i);for(let O=0;O<i;O++){const H=MeshUtil._distanceToPlane(t.vertices,O,g,a);H>Tol.LENGTH?E[O]=2:H<-Tol.LENGTH?E[O]=0:E[O]=1}const u={faces:[]};for(const O of o)u[O.name]=t[O.name].slice();const Q=[],p=t.uvs.length/2/i;for(let O=0;O<p;O++)Q.push(t.uvs.slice(O*i*2,(O+1)*i*2));let w=[],y=0;if(t.uvs1){w=[],y=t.uvs1.length/2/i;for(let O=0;O<y;O++)w.push(t.uvs1.slice(O*i*2,(O+1)*i*2))}const M=new Map,N=[],S=new Set,R=(O,H)=>{const z=O<H?O*i+H:H*i+O,tA=M.get(z);if(tA!==void 0)return tA;const nA=Math.abs(MeshUtil._distanceToPlane(t.vertices,O,g,a)),IA=Math.abs(MeshUtil._distanceToPlane(t.vertices,H,g,a)),iA=IA/(nA+IA),W=1-iA;if(s){const dA={x:t.vertices[O*3]*iA+t.vertices[H*3]*W,y:t.vertices[O*3+1]*iA+t.vertices[H*3+1]*W,z:t.vertices[O*3+2]*iA+t.vertices[H*3+2]*W},PA=e.getLocalPtAt(dA).x;if(PA<s[0]||PA>s[1])return-1}const oA=t.normals.length>0;for(let dA=0;dA<3;dA++)oA&&u.normals.push(t.normals[O*3+dA]*iA+t.normals[H*3+dA]*W),u.vertices.push(t.vertices[O*3+dA]*iA+t.vertices[H*3+dA]*W);for(let dA=0;dA<p;dA++){const PA=Q[dA],yA=dA*i*2;for(let _A=0;_A<2;_A++)PA.push(t.uvs[O*2+_A+yA]*iA+t.uvs[H*2+_A+yA]*W)}if(t.uvs1)for(let dA=0;dA<y;dA++){const PA=w[dA],yA=dA*i*2;for(let _A=0;_A<2;_A++)PA.push(t.uvs1[O*2+_A+yA]*iA+t.uvs1[H*2+_A+yA]*W)}r&&r(t,u,O,H,iA);const hA=u.vertices.length/3-1;return M.set(z,hA),hA},U=(O,H,z,tA)=>{tA?u.faces.push(O,H,z):u.faces.push(O,z,H)};for(let O=0;O<t.faces.length;O+=3){const H=[[],[],[]],[z,tA,nA]=H;for(let _A=O;_A<O+3;_A++){const LA=E[t.faces[_A]];H[LA].push(_A)}if(tA.length===3)continue;if(z.length===0){if(u.faces.push(t.faces[O],t.faces[O+1],t.faces[O+2]),N.push(O),tA.length===2&&n){const _A=!MeshUtil._isNext(tA[0],tA[1]);c(t.faces[tA[0]],t.faces[tA[1]],_A)}continue}else if(nA.length===0){if(s&&tA.findIndex(LA=>{const BA=t.faces[LA],lA={x:t.vertices[BA*3],y:t.vertices[BA*3+1],z:t.vertices[BA*3+2]},aA=e.getLocalPtAt(lA).x;return s[0]<aA&&aA<s[1]})>=0)for(const LA of z)S.add(t.faces[LA]);continue}const IA=z[0],iA=nA[0],W=nA.length===2?nA[1]:z.length===2?z[1]:tA[0],oA=t.faces[IA],hA=t.faces[iA],dA=t.faces[W],PA=MeshUtil._isNext(IA,iA),yA=R(oA,hA);if(!(yA<0)){if(E[dA]===0){const _A=R(dA,hA);if(_A<0)continue;U(yA,hA,_A,PA),n&&c(yA,_A,PA)}else if(E[dA]===1)U(yA,hA,dA,PA),n&&c(yA,dA,PA);else{const _A=R(dA,oA);if(_A<0)continue;U(yA,hA,dA,PA),U(yA,dA,_A,PA),n&&c(yA,_A,PA)}N.push(O);for(const _A of z)S.add(t.faces[_A])}}if(s){const O=H=>[0,1,2].findIndex(z=>S.has(t.faces[H+z]))<0;MeshAssist.pickNeighbourFaces(t.faces,u.faces,N,O)}let b=e.getWorldToLocalMatrix(),G;if(M.size>0){const H=Array.from(M.values()).map(nA=>new exports.Vec3(u.vertices[3*nA],u.vertices[3*nA+1],u.vertices[3*nA+2])).map(nA=>nA.transformed(b)),z=new Box2(H),tA=exports.Matrix4.makeTranslate({x:-z.min.x,y:-z.min.y,z:0});if(G=b=b.preMultiplied(tA),t.faces.length>3){const nA=t.faces[0],IA=t.faces[1],iA=new exports.Vec3({x:t.vertices[nA*3],y:t.vertices[nA*3+1],z:t.vertices[nA*3+2]}),W=new exports.Vec3({x:t.vertices[IA*3],y:t.vertices[IA*3+1],z:t.vertices[IA*3+2]}),oA=new exports.Vec2({x:t.uvs[nA*2],y:t.uvs[nA*2+1]}),hA=new exports.Vec2({x:t.uvs[IA*2],y:t.uvs[IA*2+1]}),dA=oA.distanceTo(hA)/iA.distanceTo(W);if(b=b.preMultiplied(exports.Matrix4.makeScale({x:0,y:0,z:9},dA)),t.uvs1){const PA=new exports.Vec2({x:t.uvs1[nA*2],y:t.uvs1[nA*2+1]}),yA=new exports.Vec2({x:t.uvs1[IA*2],y:t.uvs1[IA*2+1]}),_A=PA.distanceTo(yA)/iA.distanceTo(W);G=G.preMultiplied(exports.Matrix4.makeScale({x:0,y:0,z:9},_A))}}}return{newMesh:u,newUvsList:Q,newUvs1List:w,nextMap:I,attrs:o,uvTransform:b,uvTransform1:G}}static _fillClip(t,e,n,s,r,i=[],o){const g=MeshAssist.getLoop2ds(t,n,s),a=s.getDz(),I=t.vertices.length/3,c=Object.keys(t).filter(w=>!["faces","uvs","uvs1","normals","vertices"].includes(w)).map(w=>({name:w,stride:t[w].length/I})),E=new Map,u=-Math.log10(Tol.LENGTH),Q=w=>{const y=w*3;return`${t.vertices[y].toFixed(u)}_${t.vertices[y+1].toFixed(u)}_${t.vertices[y+2].toFixed(u)}`};if(c.length>0)for(let w=0;w<I;w++)E.set(Q(w),w);const p=[-a.x,-a.y,-a.z];for(const w of g){const y=DiscreteUtil.tessVector2(w),M=t.vertices.length/3;for(let N=0;N<y.faces.length;N+=3)t.faces.push(y.faces[N]+M,y.faces[N+2]+M,y.faces[N+1]+M);for(const N of y.vertices){const S=s.getWorldPtAt(N);t.vertices.push(...S.data),t.normals.push(...p);const R=S.transformed(r);if(e.forEach(U=>U.push(R.x,R.y)),o){const U=S.transformed(o);i.forEach(b=>b.push(U.x,U.y))}if(c.length>0){const U=Q(t.vertices.length/3-1),b=E.get(U)||0;for(const G of c){const O=b*G.stride,H=t[G.name];for(let z=0;z<G.stride;z++)H.push(H[O+z])}}}}}static _fillClipSeperate(t,e,n){const s=MeshAssist.getLoop2ds(t,e,n),r=n.getDz(),i=t.vertices.length/3,o=Object.keys(t).filter(u=>!["faces","uvs","normals","vertices"].includes(u)).map(u=>({name:u,stride:t[u].length/i})),g=new Map,a=-Math.log10(Tol.LENGTH),I=u=>{const Q=u*3;return`${t.vertices[Q].toFixed(a)}_${t.vertices[Q+1].toFixed(a)}_${t.vertices[Q+2].toFixed(a)}`};if(o.length>0)for(let u=0;u<i;u++)g.set(I(u),u);const c={faces:[],normals:[],uvs:[],vertices:[]};for(const u of o)c[u.name]=[];const E=[-r.x,-r.y,-r.z];for(const u of s){const Q=DiscreteUtil.tessVector2(u),p=c.vertices.length/3;for(let w=0;w<Q.faces.length;w+=3)c.faces.push(Q.faces[w]+p,Q.faces[w+2]+p,Q.faces[w+1]+p);for(const w of Q.vertices){const y=n.getWorldPtAt(w);if(c.vertices.push(...y.data),c.normals.push(...E),c.uvs.push(w.x,w.y),o.length>0){const M=I(t.vertices.length/3-1),N=g.get(M)||0;for(const S of o){const R=N*S.stride,U=c[S.name],b=t[S.name];for(let G=0;G<S.stride;G++)U.push(b[R+G])}}}}return c}static _distanceToPlane(t,e,n,s){const r=e*3,i={x:t[r],y:t[r+1],z:t[r+2]};return-n.subtracted(i).dot(s)}static _isNext(t,e){return(e-t+3)%3===1}}class Extruder{constructor(t,e,n){if(e.getAllCurves().some(s=>!(s instanceof exports.Ln2))){console.assert(!1,"mesh clip: given loop should be constructed by line2d!");return}this._coord=t,this._loop=e,this._height=n,this._planeCache=new exports.Plane(t),this._localLine3dsCache=[],this._line2dsCache=[],this.boundingBox2=new Box2(this._loop.getAllPoints()),this.curveBoundingBoxList=this._loop.getAllCurves().map(s=>new Box2([s.getStartPt(),s.getEndPt()])),this._lpts=this._loop.getAllPoints()}get loop(){return this._loop}get origin(){return this._coord.getOrigin()}get normal(){return this._coord.getDz()}get localBoundingBox3(){return this._boundingBox3||(this._boundingBox3=new Box3(this.localCorners)),this._boundingBox3}get worldBoundingBox3(){return this._boundingBox3||(this._boundingBox3=new Box3(this.worldCorners)),this._boundingBox3}get localLine3ds(){return this._localLine3dsCache.length>0?this._localLine3dsCache:(this._localLine3dsCache=this._loop.getAllCurves().map(t=>{const e=t.getStartPt(),n=t.getEndPt();return new exports.Ln3({x:e.x,y:e.y,z:0},{x:n.x,y:n.y,z:0})}),this._localLine3dsCache)}get line2ds(){return this._line2dsCache.length>0?this._line2dsCache:(this._line2dsCache=this._loop.getAllCurves(),this._line2dsCache)}get height(){return this._height}get world2localMatrix(){return this._coord.getWorldToLocalMatrix()}get local2worldMatrix(){return this._coord.getLocalToWorldMatrix()}get worldCorners(){const t=this._loop.getAllPoints(),e=[];return t.forEach(n=>{const s=this._coord.getWorldPtAt({x:n.x,y:n.y,z:0}),r=this._coord.getWorldPtAt({x:n.x,y:n.y,z:this._height});e.push(s),e.push(r)}),e}get localCorners(){const t=this._loop.getAllPoints(),e=[];return t.forEach(n=>{e.push({x:n.x,y:n.y,z:-20}),e.push({x:n.x,y:n.y,z:this._height-20})}),e}transformWorldMesh2Local(t){return this.transformMesh(t,this.world2localMatrix)}transformLocalMesh2World(t){return this.transformMesh(t,this.local2worldMatrix)}transformMesh(t,e){const n=t.vertices.length/3,s=[],r=[];for(let o=0;o<n;++o){const g={x:t.vertices[3*o],y:t.vertices[3*o+1],z:t.vertices[3*o+2]},a={x:t.normals[3*o],y:t.normals[3*o+1],z:t.normals[3*o+2]},I=e.data[0][0]*g.x+e.data[1][0]*g.y+e.data[2][0]*g.z+e.data[3][0],c=e.data[0][1]*g.x+e.data[1][1]*g.y+e.data[2][1]*g.z+e.data[3][1],E=e.data[0][2]*g.x+e.data[1][2]*g.y+e.data[2][2]*g.z+e.data[3][2];s.push(I),s.push(c),s.push(E);const u=e.data[0][0]*a.x+e.data[1][0]*a.y+e.data[2][0]*a.z,Q=e.data[0][1]*a.x+e.data[1][1]*a.y+e.data[2][1]*a.z,p=e.data[0][2]*a.x+e.data[1][2]*a.y+e.data[2][2]*a.z;r.push(u),r.push(Q),r.push(p)}const i={vertices:s,faces:t.faces.slice(),uvs:t.uvs.slice(),normals:r};return t.uvs1&&(i.uvs1=t.uvs1.slice()),i}getUVAt(t){return this._planeCache.getUVAt(t)}intersect(t,e){const n=new Box3,s=t.vertices.length/3;for(let i=0;i<s;++i){const o={x:t.vertices[3*i],y:t.vertices[3*i+1],z:t.vertices[3*i+2]};if(e?this.localBoundingBox3.containsPt(o):this.worldBoundingBox3.containsPt(o))return!0;n.expandByPoint(o)}const r=this.localCorners;for(let i=0;i<r.length;++i)if(n.containsPt(r[i]))return!0;return!!this.localBoundingBox3.intersectsBox(n)}edgeBoxInterTri(t,e,n){const s=new Box2([t.v,e.v,n.v]);return this.curveBoundingBoxList.some(r=>r.intersectsBox(s))}inside(t){let e=t.x,n=t.y,s=!1;for(let r=0,i=this._lpts.length-1;r<this._lpts.length;i=r++){let o=this._lpts[r].x,g=this._lpts[r].y,a=this._lpts[i].x,I=this._lpts[i].y;g>n!=I>n&&e<(a-o)*(n-g)/(I-g)+o&&(s=!s)}return s}log(){Log.d(this._coord),Log.d(this._loop)}}class ExtrudeClip{static{this.tol=1e-6}static multiClip(t,e,n){if(e.length===0)return{clipped:[]};const s={clipped:[],patch:void 0},r=new Map;if(e.forEach(i=>{const o=ExtrudeClip.clip(t,i,n?{transformed:n.transformed,fill:n.fill,faceEdgeMap:r}:void 0);o.vertices.length!==i.vertices.length&&this.mergeVertex(o),s.clipped.push(o)}),n?.fill){s.patch={vertices:[],faces:[],normals:[],uvs:[]};let i=.1;const o=e[0];if(o){const g={x:o.vertices[3*o.faces[0]],y:o.vertices[3*o.faces[0]+1],z:o.vertices[3*o.faces[0]+2]},a={x:o.vertices[3*o.faces[1]],y:o.vertices[3*o.faces[1]+1],z:o.vertices[3*o.faces[1]+2]},I={x:o.uvs[2*o.faces[0]],y:o.uvs[2*o.faces[0]+1]},c={x:o.uvs[2*o.faces[1]],y:o.uvs[2*o.faces[1]+1]},E=Math.sqrt((I.x-c.x)*(I.x-c.x)+(I.y-c.y)*(I.y-c.y)),u=Math.sqrt((g.x-a.x)*(g.x-a.x)+(g.y-a.y)*(g.y-a.y)+(g.z-a.z)*(g.z-a.z));i=E/u}s.patch=ExtrudeClip.fillClip(t,s.patch,r,i)}return s}static clip(t,e,n){console.time("extrude clip");const s=n?.faceEdgeMap?n.faceEdgeMap:new Map;if(!t.intersect(e,n?.transformed))return console.timeEnd("extrude clip"),e;const r=n?.transformed?e:t.transformWorldMesh2Local(e);let i={vertices:[],faces:[],normals:[],uvs:[]};e.uvs1&&(i.uvs1=[]);const o=r.faces.length/3;for(let g=0;g<o;++g){const a=r.faces[3*g],I=r.faces[3*g+1],c=r.faces[3*g+2],E={x:r.vertices[3*a],y:r.vertices[3*a+1],z:r.vertices[3*a+2]},u={x:r.vertices[3*I],y:r.vertices[3*I+1],z:r.vertices[3*I+2]},Q={x:r.vertices[3*c],y:r.vertices[3*c+1],z:r.vertices[3*c+2]},p={x:r.normals[3*a],y:r.normals[3*a+1],z:r.normals[3*a+2]},w={x:r.normals[3*I],y:r.normals[3*I+1],z:r.normals[3*I+2]},y={x:r.normals[3*c],y:r.normals[3*c+1],z:r.normals[3*c+2]},M={x:r.uvs[2*a],y:r.uvs[2*a+1]},N={x:r.uvs[2*I],y:r.uvs[2*I+1]},S={x:r.uvs[2*c],y:r.uvs[2*c+1]};let R,U,b;r.uvs1&&(R={x:r.uvs1[2*a],y:r.uvs1[2*a+1]},U={x:r.uvs1[2*I],y:r.uvs1[2*I+1]},b={x:r.uvs1[2*c],y:r.uvs1[2*c+1]});const G=ExtrudeClip.cutTriangle(t,{v:E,n:p,uv:M,uv1:R},{v:u,n:w,uv:N,uv1:U},{v:Q,n:y,uv:S,uv1:b});for(const O of G)ExtrudeClip.insertTriangle(O,i,t,n?.fill?s:void 0)}return n?.fill&&!n?.faceEdgeMap&&(i=ExtrudeClip.fillClip(t,i,s)),n?.transformed||(i=t.transformLocalMesh2World(i)),console.timeEnd("extrude clip"),i}static mergeVertex(t){const e=t.vertices.length/3;if(e<=3)return;const n=[];for(let s=0;s<e-1;++s){if(n.includes(s))continue;const r=new exports.Vec3(t.vertices[3*s],t.vertices[3*s+1],t.vertices[3*s+2]);for(let i=s+1;i<e;++i){if(n.includes(i))continue;const o=new exports.Vec3(t.vertices[3*i],t.vertices[3*i+1],t.vertices[3*i+2]);r.equals(o)&&(t.faces=t.faces.map(g=>g===i?s:g),n.push(i))}}}static fillClip(t,e,n,s=.1){const r=(o,g,a)=>{const I=o.x*g+a.x,c=o.y*g+a.y;return{x:I,y:c}},i=new exports.Loop(t.line2ds).getCentroidPoint();for(const o of t.line2ds){let g=n.get(o);if(!g)continue;const a=o.getStartPt(),I=o.getEndPt(),c=exports.Plane.makeBy3Pts({x:a.x,y:a.y,z:0},{x:I.x,y:I.y,z:0},{x:I.x,y:I.y,z:10});if(!c)continue;const E=c.getNorm(),u={x:(a.x+I.x)/2,y:(a.y+I.y)/2},Q={x:u.x+E.x/10,y:u.y+E.y/10},p=i.distanceTo(Q),w=i.distanceTo(u);p>w&&E.reverse();const y=[],M=[],N=[];if(g.forEach(R=>{const U=c?.getCurve2d(R);y.push(U),y.push(U.reversed());const b=R.getStartPt(),G=R.getEndPt();Math.abs(b.x-G.x)<ExtrudeClip.tol&&Math.abs(b.y-G.y)<ExtrudeClip.tol||(a.equals(b)&&M.push(b),a.equals(G)&&M.push(G),I.equals(b)&&N.push(b),I.equals(G)&&N.push(G))}),M.length>=2){M.sort((R,U)=>R.z-U.z);for(let R=0;R<M.length-1;++R){const U=new exports.Ln3(M[R],M[R+1]),b=c?.getCurve2d(U);b&&(y.push(b),y.push(b.reversed()))}}if(N.length>=2){N.sort((R,U)=>R.z-U.z);for(let R=0;R<N.length-1;++R){const U=new exports.Ln3(N[R],N[R+1]),b=c?.getCurve2d(U);b&&(y.push(b),y.push(b.reversed()))}}SearchGraph.searchLoop2D(y,!1,1e-4).forEach(R=>{const U=new Box2(R.getAllPoints()),b={x:-U.min.x,y:-U.min.y};if(!R.isAnticlockwise())return;const G=R.getAllPoints().reduce((z,tA)=>(z.push(tA.x),z.push(tA.y),z),[]),O=earcut(G,void 0,2),H=O.length/3;for(let z=0;z<H;++z){const tA=O[3*z],nA=O[3*z+1],IA=O[3*z+2],iA={x:G[2*tA],y:G[2*tA+1]},W={x:G[2*nA],y:G[2*nA+1]},oA={x:G[2*IA],y:G[2*IA+1]},hA=c.getPtAt(iA),dA=c.getPtAt(W),PA=c.getPtAt(oA),yA=ExtrudeClip.reviseTriangleDir([hA,dA,PA],E),_A=yA[0],LA=yA[1],BA=yA[2];let lA=E,aA=E,wA=E;const YA=r(iA,s,b),DA=r(W,s,b),UA=r(oA,s,b),XA={v:_A,n:lA,uv:YA,uv1:e.uvs1?YA:void 0},bA={v:LA,n:aA,uv:DA,uv1:e.uvs1?DA:void 0},nt={v:BA,n:wA,uv:UA,uv1:e.uvs1?UA:void 0};this.insertTriangle({vertex1:XA,vertex2:bA,vertex3:nt},e,t)}})}return e}static insertTriangle(t,e,n,s){e.vertices.push(t.vertex1.v.x),e.vertices.push(t.vertex1.v.y),e.vertices.push(t.vertex1.v.z);const r=t.vertex1.uv.x,i=t.vertex1.uv.y;e.uvs.push(r),e.uvs.push(i),t.vertex1.uv1&&(e.uvs1?.push(t.vertex1.uv1.x),e.uvs1?.push(t.vertex1.uv1.y)),e.normals.push(t.vertex1.n.x),e.normals.push(t.vertex1.n.y),e.normals.push(t.vertex1.n.z),e.faces.push(e.vertices.length/3-1),e.vertices.push(t.vertex2.v.x),e.vertices.push(t.vertex2.v.y),e.vertices.push(t.vertex2.v.z);const o=t.vertex2.uv.x,g=t.vertex2.uv.y;e.uvs.push(o),e.uvs.push(g),t.vertex2.uv1&&(e.uvs1?.push(t.vertex2.uv1.x),e.uvs1?.push(t.vertex2.uv1.y)),e.normals.push(t.vertex2.n.x),e.normals.push(t.vertex2.n.y),e.normals.push(t.vertex2.n.z),e.faces.push(e.vertices.length/3-1),e.vertices.push(t.vertex3.v.x),e.vertices.push(t.vertex3.v.y),e.vertices.push(t.vertex3.v.z);const a=t.vertex3.uv.x,I=t.vertex3.uv.y;if(e.uvs.push(a),e.uvs.push(I),t.vertex3.uv1&&(e.uvs1?.push(t.vertex3.uv1.x),e.uvs1?.push(t.vertex3.uv1.y)),e.normals.push(t.vertex3.n.x),e.normals.push(t.vertex3.n.y),e.normals.push(t.vertex3.n.z),e.faces.push(e.vertices.length/3-1),s)for(const c of n.line2ds){const E=this.calcLinePlaneEdge(c,t.vertex1.v,t.vertex2.v);E&&(s.has(c)?s.get(c).push(E):s.set(c,[E]));const u=this.calcLinePlaneEdge(c,t.vertex2.v,t.vertex3.v);u&&(s.has(c)?s.get(c).push(u):s.set(c,[u]));const Q=this.calcLinePlaneEdge(c,t.vertex3.v,t.vertex1.v);if(Q){const p=Q;s.has(c)?s.get(c).push(p):s.set(c,[p])}}}static calcLinePlaneEdge(t,e,n){if(Math.abs(e.x-n.x)<1e-6&&Math.abs(e.y-n.y)<1e-6&&(t.containsPt(e)||t.getStartPt().equals(e)||t.getEndPt().equals(e)))return new exports.Ln3(e,n);const s=new exports.Ln2(e,n),r=CalcOverlap.curve2ds(t,s);if(r.length>0&&r[0].range2.getLength()>1e-6){const i=new exports.Ln3(e,n);return i.setRange(r[0].range2),i}}static cutTriangle(t,e,n,s){const r={x:n.v.x-e.v.x,y:n.v.y-e.v.y,z:n.v.z-e.v.z},i={x:s.v.x-e.v.x,y:s.v.y-e.v.y,z:s.v.z-e.v.z},o={x:r.y*i.z-i.y*r.z,y:-(r.x*i.z-i.x*r.z),z:r.x*i.y-i.x*r.y},g=this.crossVector3(r,i);return Math.abs(this.V3SQLength(g))<1e-16?[]:t.edgeBoxInterTri(e,n,s)?Math.abs(o.z)<1e-6?ExtrudeClip.cutVerticalTriangle(t,e,n,s):ExtrudeClip.cutInVerticalTriangle(t,e,n,s):t.inside(e.v)?[]:[{vertex1:e,vertex2:n,vertex3:s}]}static cutVerticalTriangle(t,e,n,s){const r=exports.Plane.makeBy3Pts(e.v,n.v,s.v);if(!r)return[];const i=[];if(t.localLine3ds.forEach(o=>{r.containsCurve(o)&&i.push(o)}),i.length===0){const o=Math.sqrt(Math.pow(e.v.x-n.v.x,2)+Math.pow(e.v.y-n.v.y,2))<this.tol?new exports.Ln2({x:e.v.x,y:e.v.y},{x:s.v.x,y:s.v.y}):new exports.Ln2({x:e.v.x,y:e.v.y},{x:n.v.x,y:n.v.y}),g=[o.getStartParam(),o.getEndParam(),o.getParamAt({x:s.v.x,y:s.v.y})];o.setRange(Math.min(...g),Math.max(...g));const a=new exports.PolyCurve([o]),I=BoolOperate2d.polylineDifference(a,[t.loop],!0);let c=[];if(I.length===0)c=[];else{if(I.length===1&&I[0].getAllCurves().length===1&&Math.abs(I[0].getAllCurves()[0].getLength()-o.getLength())<=ExtrudeClip.tol)return[{vertex1:e,vertex2:n,vertex3:s}];c=I.reduce((S,R)=>(S.push(...R.getAllCurves()),S),[])}if(c.length===0)return[];const E=o.getDirection(),u=c.map(S=>S.getDirection().isSameDirection(E)?{startParam:o.getParamAt(S.getStartPt()),endParam:o.getParamAt(S.getEndPt())}:{startParam:o.getParamAt(S.getEndPt()),endParam:o.getParamAt(S.getStartPt())});u.sort((S,R)=>S.startParam-R.startParam);const Q=[],p=o.getStartParam(),w=o.getEndParam();let y=p,M=u.length>0?u[0].startParam:w,N=0;for(;y<w&&N<=u.length;){if(N===u.length?M=w:M=u[N].startParam,Math.abs(y-M)>ExtrudeClip.tol){const S=o.getPtAt(y),R=o.getPtAt(M);Q.push(new exports.Ln3({x:S.x,y:S.y,z:-20},{x:R.x,y:R.y,z:-20}))}if(N>u.length)break;N===u.length?y=w:y=u[N].endParam,++N}return ExtrudeClip.cutVerticalTriangleByLines(t,r,e,n,s,Q)}return ExtrudeClip.cutVerticalTriangleByLines(t,r,e,n,s,i)}static cutVerticalTriangleByLines(t,e,n,s,r,i){const o=ExtrudeClip.getTriangleNorm(n.v,s.v,r.v),g=new exports.Loop([e.getUVAt(n.v),e.getUVAt(s.v),e.getUVAt(r.v)]);g.isAnticlockwise()||g.reverse();const a=[];i.forEach(w=>{const y=w.getStartPt().toXYZ(),M=w.getEndPt().toXYZ(),N={x:M.x,y:M.y,z:M.z+t.height},S={x:y.x,y:y.y,z:y.z+t.height},R=e.getUVAt(y),U=e.getUVAt(M),b=e.getUVAt(N),G=e.getUVAt(S),O=new exports.Loop([R,U,b,G]);O.isAnticlockwise()||O.reverse(),a.push(O)});let I;const E=BoolOperate2d.difference(g,a).getLoops(),u=[],Q=[];for(let w=0;w<E.length;++w){if(Math.abs(E[w].calcArea())<1e-8||!E[w].isClosed())continue;const y=E[w].getAllPoints().reduce((M,N)=>(M.push(N.x),M.push(N.y),M),[]);y.length<=4||(E[w].isAnticlockwise()?(u.push(y),Q.push([])):(Q[Q.length-1].push(u[u.length-1].length/2),u[u.length-1].push(...y)))}const p=[];for(let w=0;w<u.length;++w){const y=earcut(u[w],Q[w].length?Q[w]:void 0,2),M=y.length/3;for(let N=0;N<M;++N){const S=y[3*N],R=y[3*N+1],U=y[3*N+2],b=e.getPtAt({x:u[w][2*S],y:u[w][2*S+1]}),G=e.getPtAt({x:u[w][2*R],y:u[w][2*R+1]}),O=e.getPtAt({x:u[w][2*U],y:u[w][2*U+1]}),H=ExtrudeClip.reviseTriangleDir([b,G,O],o),z=H[0],tA=H[1],nA=H[2];let IA=o,iA=o,W=o;ExtrudeClip.sameVertex(z,n.v)?IA=n.n:ExtrudeClip.sameVertex(z,s.v)?IA=s.n:ExtrudeClip.sameVertex(z,r.v)&&(IA=r.n),ExtrudeClip.sameVertex(tA,n.v)?iA=n.n:ExtrudeClip.sameVertex(tA,s.v)?iA=s.n:ExtrudeClip.sameVertex(tA,r.v)&&(iA=r.n),ExtrudeClip.sameVertex(nA,n.v)?W=n.n:ExtrudeClip.sameVertex(nA,s.v)?W=s.n:ExtrudeClip.sameVertex(nA,r.v)&&(W=r.n);const[[oA,hA],[dA,PA],[yA,_A]]=[z,tA,nA].map(aA=>[!1,!0].map(wA=>{let YA=ExtrudeClip.getUVBySplit(aA,n,s,r,wA);return YA||(I||(I=ExtrudeClip.getTriangleUVTransform(n,s,r,wA)),YA=ExtrudeClip.getUVByUVTransform(aA,I)),YA})),LA={v:z,n:IA,uv:oA,uv1:hA},BA={v:tA,n:iA,uv:dA,uv1:PA},lA={v:nA,n:W,uv:yA,uv1:_A};p.push({vertex1:LA,vertex2:BA,vertex3:lA})}}return p}static cutInVerticalTriangle(t,e,n,s){const r=exports.Plane.makeBy3Pts(e.v,n.v,s.v);if(!r)return[];const i=ExtrudeClip.getTriangleNorm(e.v,n.v,s.v),o=new exports.Loop([e.v,n.v,s.v]);o.isAnticlockwise()||o.reverse();const g=BoolOperate2d.difference(o,[t.loop]);if(g.getLoops().length===0)return[];if(g.getLoops().length===1&&g.getLoops()[0].getAllPoints().length===3&&Math.abs(1-g.getLoops()[0].calcArea()/ExtrudeClip.calcTriangleArea(e.v,n.v,s.v))<ExtrudeClip.tol)return[{vertex1:e,vertex2:n,vertex3:s}];let a;const I=r.getOrigin(),c=r.getNorm(),E=g.getLoops(),u=[],Q=[];for(let w=0;w<E.length;++w){if(Math.abs(E[w].calcArea())<1e-8||!E[w].isClosed())continue;const y=E[w].getAllPoints().reduce((M,N)=>{const S=I.z-(c.x*(N.x-I.x)+c.y*(N.y-I.y))/c.z;return M.push(N.x,N.y,S),M},[]);y.length<=4||(E[w].isAnticlockwise()?(u.push(y),Q.push([])):(Q[Q.length-1].push(u[u.length-1].length/3),u[u.length-1].push(...y)))}const p=[];for(let w=0;w<u.length;++w){const y=earcut(u[w],Q[w].length?Q[w]:void 0,3),M=y.length/3;for(let N=0;N<M;++N){const S=y[3*N],R=y[3*N+1],U=y[3*N+2],b={x:u[w][3*S],y:u[w][3*S+1],z:u[w][3*S+2]},G={x:u[w][3*R],y:u[w][3*R+1],z:u[w][3*R+2]},O={x:u[w][3*U],y:u[w][3*U+1],z:u[w][3*U+2]},H=ExtrudeClip.reviseTriangleDir([b,G,O],i),z=H[0],tA=H[1],nA=H[2];let IA=i,iA=i,W=i;ExtrudeClip.sameVertex(z,e.v)?IA=e.n:ExtrudeClip.sameVertex(z,n.v)?IA=n.n:ExtrudeClip.sameVertex(z,s.v)&&(IA=s.n),ExtrudeClip.sameVertex(tA,e.v)?iA=e.n:ExtrudeClip.sameVertex(tA,n.v)?iA=n.n:ExtrudeClip.sameVertex(tA,s.v)&&(iA=s.n),ExtrudeClip.sameVertex(nA,e.v)?W=e.n:ExtrudeClip.sameVertex(nA,n.v)?W=n.n:ExtrudeClip.sameVertex(nA,s.v)&&(W=s.n);const[[oA,hA],[dA,PA],[yA,_A]]=[z,tA,nA].map(aA=>[!1,!0].map(wA=>{let YA=ExtrudeClip.getUVBySplit(aA,e,n,s,wA);return YA||(a||(a=ExtrudeClip.getTriangleUVTransform(e,n,s,wA)),YA=ExtrudeClip.getUVByUVTransform(aA,a)),YA})),LA={v:z,n:IA,uv:oA,uv1:hA},BA={v:tA,n:iA,uv:dA,uv1:PA},lA={v:nA,n:W,uv:yA,uv1:_A};p.push({vertex1:LA,vertex2:BA,vertex3:lA})}}return p}static reviseTriangleDir(t,e){if(t.length!==3)return console.assert(!1,"extrude clip: please give three point!"),[];const n=ExtrudeClip.getTriangleNorm(t[0],t[1],t[2]);return Math.abs(n.x-e.x)<=1e-6&&Math.abs(n.y-e.y)<=1e-6&&Math.abs(n.z-e.z)<=1e-6?t:[t[2],t[1],t[0]]}static calcTriangleArea(t,e,n){const s=Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)+Math.pow(t.z-e.z,2)),r=Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2)+Math.pow(e.z-n.z,2)),i=Math.sqrt(Math.pow(n.x-t.x,2)+Math.pow(n.y-t.y,2)+Math.pow(n.z-t.z,2)),o=(s+r+i)/2;return Math.sqrt(o*(o-s)*(o-r)*(o-i))}static getTriangleNorm(t,e,n){const s={x:e.x-t.x,y:e.y-t.y,z:e.z-t.z},r={x:n.x-t.x,y:n.y-t.y,z:n.z-t.z},i={x:s.y*r.z-r.y*s.z,y:-(s.x*r.z-r.x*s.z),z:s.x*r.y-r.x*s.y},o=Math.sqrt(i.x*i.x+i.y*i.y+i.z*i.z);return{x:i.x/o,y:i.y/o,z:i.z/o}}static getTriangleUVTransform(t,e,n,s=!1){const r=t.v,i=e.v,o=n.v;let g=t.uv,a=e.uv,I=n.uv;s&&t.uv1&&e.uv1&&n.uv1&&(g=t.uv1,a=e.uv1,I=n.uv1);const c=exports.Plane.makeBy3Pts(r,i,o);if(!c)return new exports.Matrix4;const u=c.getCoord().getWorldToLocalMatrix(),Q=this.transformXYZ(r,u),p=this.transformXYZ(i,u),w=this.transformXYZ(o,u),y=exports.Plane.makeBy3Pts(Q,p,w),M=exports.Plane.makeBy3Pts({x:g.x,y:g.y,z:0},{x:a.x,y:a.y,z:0},{x:I.x,y:I.y,z:0});if(!y||!M)return new exports.Matrix4;const N=y.getOrigin(),S=M.getOrigin(),R=S.x-N.x,U=S.y-N.y,b=new exports.Vec2({x:p.x-Q.x,y:p.y-Q.y}),G=new exports.Vec2({x:a.x-g.x,y:a.y-g.y}),O=exports.Matrix4.makeRotateZ(b.angleTo(G)),H=exports.Matrix4.makeTranslate({x:R,y:U,z:0}),z=this.transformXYZ(this.transformXYZ(Q,O),H),tA=this.transformXYZ(this.transformXYZ(p,O),H),nA=this.transformXYZ(this.transformXYZ(w,O),H);let IA=1;Math.abs(a.x-g.x)>1e-6&&Math.abs(tA.x-z.x)>1e-6?IA=Math.abs(a.x-g.x)/Math.abs(tA.x-z.x):Math.abs(I.x-g.x)>1e-6&&Math.abs(nA.x-z.x)>1e-6?IA=Math.abs(I.x-g.x)/Math.abs(nA.x-z.x):Math.abs(I.x-a.x)>1e-6&&Math.abs(nA.x-tA.x)>1e-6&&(IA=Math.abs(I.x-a.x)/Math.abs(nA.x-tA.x));let iA=1;Math.abs(a.y-g.y)>1e-6&&Math.abs(tA.y-z.y)>1e-6?iA=Math.abs(a.y-g.y)/Math.abs(tA.y-z.y):Math.abs(I.y-g.y)>1e-6&&Math.abs(nA.y-z.y)>1e-6?iA=Math.abs(I.y-g.y)/Math.abs(nA.y-z.y):Math.abs(I.y-a.y)>1e-6&&Math.abs(nA.y-tA.y)>1e-6&&(iA=Math.abs(I.y-a.y)/Math.abs(nA.y-tA.y));const oA=exports.Matrix4.makeScale({x:0,y:0,z:0},{x:IA,y:iA,z:1}),hA=this.transformXYZ(z,oA),dA=hA.x-g.x,PA=hA.y-g.y,yA=exports.Matrix4.makeTranslate({x:-dA,y:-PA,z:0});return u.preMultiplied(O).preMultiplied(H).preMultiplied(oA).preMultiplied(yA)}static transformXYZ(t,e){return{x:e.data[0][0]*t.x+e.data[1][0]*t.y+e.data[2][0]*t.z+e.data[3][0],y:e.data[0][1]*t.x+e.data[1][1]*t.y+e.data[2][1]*t.z+e.data[3][1],z:e.data[0][2]*t.x+e.data[1][2]*t.y+e.data[2][2]*t.z+e.data[3][2]}}static getUVByUVTransform(t,e){return{x:e.data[0][0]*t.x+e.data[1][0]*t.y+e.data[2][0]*t.z+e.data[3][0],y:e.data[0][1]*t.x+e.data[1][1]*t.y+e.data[2][1]*t.z+e.data[3][1]}}static getUVBySplit(t,e,n,s,r=!1){let i=e.uv,o=n.uv,g=s.uv;if(r&&e.uv1&&n.uv1&&s.uv1&&(i=e.uv1,o=n.uv1,g=s.uv1),this.sameVertex(t,e.v))return i;if(this.sameVertex(t,n.v))return o;if(this.sameVertex(t,s.v))return g;const a=(w,y)=>Math.sqrt((w.x-y.x)*(w.x-y.x)+(w.y-y.y)*(w.y-y.y)),I={x:t.x-e.v.x,y:t.y-e.v.y,z:0},c={x:n.v.x-e.v.x,y:n.v.y-e.v.y,z:0};if(this.sameDirection(I,c)){const w=a(e.v,t),y=a(n.v,t),M=y/(w+y),N=1-M;return{x:i.x*M+o.x*N,y:i.y*M+o.y*N}}const E={x:t.x-n.v.x,y:t.y-n.v.y,z:0},u={x:s.v.x-n.v.x,y:s.v.y-n.v.y,z:0};if(this.sameDirection(E,u)){const w=a(n.v,t),y=a(s.v,t),M=y/(w+y),N=1-M;return{x:o.x*M+g.x*N,y:o.y*M+g.y*N}}const Q={x:t.x-s.v.x,y:t.y-s.v.y},p={x:e.v.x-s.v.x,y:e.v.y-s.v.y};if(this.sameDirection(Q,p)){const w=a(s.v,t),y=a(e.v,t),M=y/(w+y),N=1-M;return{x:g.x*M+i.x*N,y:g.y*M+i.y*N}}}static sameDirection(t,e){return new exports.Vec2(t).isParallel(e,.001)}static crossVector3(t,e){const n=t.y*e.z-t.z*e.y,s=t.z*e.x-t.x*e.z,r=t.x*e.y-t.y*e.x;return{x:n,y:s,z:r}}static V3SQLength(t){return t.x*t.x+t.y*t.y+t.z*t.z}static sameVertex(t,e){return Math.abs(t.x-e.x)<=1e-6&&Math.abs(t.y-e.y)<=1e-6&&Math.abs(t.z-e.z)<=1e-6}}function getUVMinMax(l,t,e,n){let s=-1/0,r=1/0,i=-1/0,o=1/0;return e.forEach(g=>{const a={x:g.x-n.x,y:g.y-n.y},[I,c]=getParamAtUV(l,t,a);s=Math.max(s,I),r=Math.min(r,I),i=Math.max(i,c),o=Math.min(o,c)}),{uMin:r,uMax:s,vMin:o,vMax:i}}function getParamAtUV(l,t,e){const n=[[l.x,-t.x],[l.y,-t.y]],s=[e.x,e.y],r=numeric1_2_6Exports.solve(n,s);return[r[0],-r[1]]}function applyMatrix(l,t,e){const n=e,s=l[t]*n[0][0]+l[t+1]*n[1][0]+n[2][0],r=l[t]*n[0][1]+l[t+1]*n[1][1]+n[2][1];l[t]=s,l[t+1]=r}function applyMatrixToPt(l,t){const e=t,n=l.x*e[0][0]+l.y*e[1][0]+e[2][0],s=l.x*e[0][1]+l.y*e[1][1]+e[2][1];return{x:n,y:s}}function multiplyMatrix(l,t){for(var e=l.length,n=[],s=0;s<e;s++){n[s]=[];for(var r=0;r<e;r++){n[s][r]=0;for(var i=0;i<e;i++)n[s][r]+=l[s][i]*t[i][r]}}return n}function transpose(l){let t=new Array(l.length).fill(0).map(e=>new Array(l[0].length).fill(0));for(let e=0;e<t.length;e++)for(let n=0;n<t[0].length;n++)t[e][n]=l[n][e];return t}function det(l){if(l.length!==l[0].length)throw new Error;let t=l.length,e=0;if(t>3)for(let n=0;n<t;n++){let s=new Array(t-1).fill(0).map(r=>new Array(t-1).fill(0));for(let r=0;r<t-1;r++)for(let i=0;i<t-1;i++)i<n?s[r][i]=l[r+1][i]:s[r][i]=l[r+1][i+1];e+=l[0][n]*Math.pow(-1,0+n)*det(s)}else t===3?e=l[0][0]*l[1][1]*l[2][2]+l[0][1]*l[1][2]*l[2][0]+l[0][2]*l[1][0]*l[2][1]-l[0][2]*l[1][1]*l[2][0]-l[0][1]*l[1][0]*l[2][2]-l[0][0]*l[1][2]*l[2][1]:t===2?e=l[0][0]*l[1][1]-l[0][1]*l[1][0]:t===1&&(e=l[0][0]);return e}function adjoint(l){if(l[0].length!==l.length)throw new Error;let t=l.length,e=new Array(t).fill(0).map(n=>new Array(t).fill(0));for(let n=0;n<t;n++)for(let s=0;s<t;s++){let r=[];for(let i=0;i<l.length;i++)if(i!==n){let o=[];for(let g=0;g<l.length;g++)g!==s&&o.push(l[i][g]);r.push(o)}e[n][s]=Math.pow(-1,n+s)*det(r)}return transpose(e)}function inv(l){if(l[0].length!==l.length)throw new Error;let t=det(l),e=adjoint(l);for(let n=0;n<e.length;n++)for(let s=0;s<e.length;s++)e[n][s]/=t;return e}function getBBox(l,t=0){let e=1/0,n=1/0,s=-1/0,r=-1/0;return l.forEach(i=>i.forEach(o=>{e=Math.min(o.x-t,e),n=Math.min(o.y-t,n),s=Math.max(o.x+t,s),r=Math.max(o.y+t,r)})),{right:s,left:e,bottom:r,top:n}}function convert2Js(l,t){const e=t,n=l.size(),s=new Array(n);for(let r=0;r<n;r++){const i=l.get(r),o=i.size(),g=new Array(o);for(let a=0;a<o;a++){const I=i.get(a);g[a]={x:Number(I.x)/e,y:Number(I.y)/e}}s[r]=g}return s}function toArray(l,t=!1){return t?l.reduceRight((e,n)=>(e.push(n.x,n.y),e),[]):l.reduce((e,n)=>(e.push(n.x,n.y),e),[])}function addPolyPathToResult(l,t,e,n){const s=e,r=l.polygon(),i=r.size();if(i>0){const o=[],g=[o];for(let I=0;I<i;I++){const c=r.get(I);o.push({x:Number(c.x)/s,y:Number(c.y)/s})}const a=l.count();for(let I=0;I<a;I++){const c=l.child(I).polygon(),E=c.size(),u=[],Q=[];for(let p=0;p<E;p++){const w=c.get(p);Q[p]={x:w.x,y:w.y},u[p]={x:Number(w.x)/s,y:Number(w.y)/s}}g.push(u),n.push(Q)}t.push(g)}else{const o=l.count();for(let g=0;g<o;g++)addPolyPathToResult(l.child(g),t,e,n)}}class Pattern{constructor(t,e,n=!0){this.precise=1e9,this.recOffset=1e3,this.jointOffset=10,this._bgRects=[],this._enableGap=!0,this._clipper=Clipper2Util.clipper2Z,this.patternData=_.cloneDeep(t),this.patternData.coord.setOrigin(this.patternData.coord.getOrigin().multiply(this.precise)),this.patternData.udir.x*=this.precise,this.patternData.udir.y*=this.precise,this.patternData.vdir.x*=this.precise,this.patternData.vdir.y*=this.precise,this.patternData.gap.unit*=this.precise,this._enableGap=n&&this.patternData.gap.unit!==0;const s=[[...t.coord.getDx().data,0],[...t.coord.getDy().data,0],[0,0,1]];let r=t.units.map(R=>({outer:new exports.Loop(R.outer).toPath(),holes:[]}));r.forEach(R=>{R.outer=R.outer.map(U=>applyMatrixToPt(U,s)),R.outer.forEach(U=>{U.x=Math.round(U.x*this.precise),U.y=Math.round(U.y*this.precise)})});let i=[e.outer,...e.holes].map(R=>new exports.Loop(R).toPath());if(i=i.map(R=>R.map(U=>({x:Math.round(U.x*this.precise),y:Math.round(U.y*this.precise)}))),!this._clipper)return;const{MakePath64:o,Paths64:g,Path64:a,Point64:I,ReversePath64:c,InflatePaths64:E,JoinType:u,EndType:Q,UnionSelf64:p,FillRule:w}=this._clipper;this._clip=new g,this._clipLines=new g;const y=this._holes=new g,M=this._bgRects;i.forEach((R,U)=>{M.push(getBBox([R]));const b=toArray(R);if(this._clip.push_back(o(b)),U!==0){const G=o(b);c(G),y.push_back(G)}b.push(b[0],b[1]),this._clipLines.push_back(o(b))}),this._unitsPaths=r.map(R=>R.outer);const N=new g,S=new g;this._unitsBlock=this._unitsPaths.map((R,U)=>{N.clear();const b=new a;for(let nA=R.length-1;nA>-1;nA--)b.push_back(new I(BigInt(R[nA].x),BigInt(R[nA].y),BigInt(100)));const G=new a;for(let nA=0;nA<R.length;nA++)G.push_back(new I(BigInt(R[nA].x),BigInt(R[nA].y),BigInt(100)));N.push_back(G);const O=E(N,this.patternData.gap.unit/2+this.jointOffset,u.Miter,Q.Polygon,1/0,0),H=new a,z=O.get(0);for(let nA=0;nA<z.size();nA++){const IA=z.get(nA);H.push_back(IA)}S.push_back(H),S.push_back(b);const tA=new g;return tA.push_back(G),tA}),this._unitJoints=p(S,w.NonZero),this._unitRect=getBBox(this._unitsPaths,this.patternData.gap.unit)}getUnit(){const t=inv([[...this.patternData.coord.getDx().data,0],[...this.patternData.coord.getDy().data,0],[0,0,1]]);return{joint:convert2Js(this._unitJoints,this.precise),blocks:this._unitsBlock.map(e=>convert2Js(e,this.precise)),coords:this.patternData.units.map(({coord:e})=>multiplyMatrix(t,inv([[...e.getDx().data,0],[...e.getDy().data,0],[...e.getOrigin().data,1]])))}}isUnitXBackground(t){if(!this._clipper)return-1;const{RectClipLinesPaths64:e,Rect64:n,Point64:s,PointInPolygon64:r}=this._clipper,i=this._unitRect,o=i.left+t.x*this.precise,g=i.top+t.y*this.precise,a=i.right+t.x*this.precise,I=i.bottom+t.y*this.precise,c=this._bgRects[0];if(c.left>a||c.top>I||c.right<o||c.bottom<g)return-1;const E=new n(BigInt(Math.round(o-this.recOffset)),BigInt(Math.round(g-this.recOffset)),BigInt(Math.round(a+this.recOffset)),BigInt(Math.round(I+this.recOffset))),u=e(E,this._clipLines);if(u.size()===0){const p=new s(BigInt(Math.round((o+a)/2)),BigInt(Math.round((g+I)/2)),BigInt(0)),w=r(p,this._clip.get(0)).value;if(w===0)return 0;if(w===2)return-1;const y=this._holes.size();for(let M=0;M<y;M++){const N=this._bgRects[M+1];if(!(N.left>a||N.top>I||N.right<o||N.bottom<g)&&r(p,this._holes.get(M)).value===1)return-1}return p.delete(),0}const Q=this._holes.size();for(let p=0;p<Q;p++){const w=this._bgRects[p+1];if(w.left>o||w.top<g||w.right<a||w.bottom>I)return 2}return E.delete(),u.delete(),1}execute(t,e=!0){if(!this._clipper)return;const{Intersect64:n,FillRule:s,TranslatePaths64:r,ClipType:i,PolyPath64:o,BooleanOpOut64:g}=this._clipper,a=this._clip,I={x:BigInt(Math.round(t.x*this.precise)),y:BigInt(Math.round(t.y*this.precise))},c=[],E=[],u={data:new Map,offset:t};if(this._enableGap){const Q=r(this._unitJoints,I.x,I.y),p=new o;g(i.Intersection,s.NonZero,Q,a,p),Q.delete(),p.count()!==0&&addPolyPathToResult(p,c,this.precise,E),p.delete()}for(let Q=0;Q<this._unitsBlock.length;Q++){const p=this._unitsBlock[Q];if(E.length&&e){const M=p.get(0).get(0);if(E.some(N=>N.some(S=>S.x===M.x+I.x&&S.y===M.y+I.y))){u.data.set(Q,!0);continue}}const w=r(p,I.x,I.y),y=new o;if(g(i.Intersection,s.NonZero,w,a,y),y.count()>=1){const M=[],N=[];addPolyPathToResult(y,M,this.precise,N),u.data.set(Q,M)}w.delete(),y.delete()}return{blocks:u,joints:c}}}function clipBlocks2Geometry(l,t){const e=[],n=[],s=[],r=t.blocks.map(()=>({indices:[],vertices:[],uvs:[]})),i=t.blocks.map(()=>({indices:[],vertices:[],uvs:[]})),o=t.blocks.map(a=>{const I=getBBox(a),c=I.right-I.left,E=I.bottom-I.top;return{left:I.left,top:I.top,width:c,height:E}}),g=t.blocks.map((a,I)=>{const c=triangle(a);for(let E=0;E<c.uvs.length;E+=2)applyMatrix(c.uvs,E,t.coords[I]);return c});return l.forEach(({blocks:a,joints:I})=>{I.forEach(E=>{const u=e.length,Q=[],p=e.length/2;let w=0;E.forEach((y,M)=>{w&&Q.push(w),w+=y.length,y.forEach(N=>{e.push(N.x,N.y),s.push(N.x,N.y,0)})}),earcut(e.slice(u),Q,2).forEach(y=>{n.push(y+p)})});const c=a.offset;a.data.forEach((E,u)=>{if(Array.isArray(E)){const Q=r[u];E.forEach(p=>{const w=Q.vertices.length,y=[];let M=0;p.forEach(N=>{M&&y.push(M),M+=N.length,N.forEach(S=>{Q.uvs.push((S.x-c.x-o[u].left)/o[u].width,(S.y-c.y-o[u].top)/o[u].height),Q.vertices.push(S.x,S.y,0)})}),earcut(Q.vertices.slice(w),y,3).forEach(N=>{Q.indices.push(N+w/3)})})}else{const Q=i[u],p=g[u],w=Q.uvs,y=Q.vertices,M=Q.indices,N=Q.uvs.length;p.uvs.forEach((b,G)=>{w[N+G]=b});const S=Q.vertices.length;for(let b=0;b<p.vertices.length;b+=3)y[S+b]=p.vertices[b]+a.offset.x,y[S+b+1]=p.vertices[b+1]+a.offset.y,y[S+b+2]=0;const R=Q.indices.length,U=N/2;for(let b=0;b<p.indices.length;b++)M[R+b]=p.indices[b]+U}})}),r.forEach((a,I)=>{for(let c=0;c<a.uvs.length;c+=2)applyMatrix(a.uvs,c,t.coords[I])}),{joints:{vertices:s,indices:n,uvs:e},blocks:r.map((a,I)=>({vertices:new Float32Array(a.vertices),uvs:new Float32Array(a.uvs),indices:new Uint32Array(a.indices),unitIndex:I})).concat(i.filter(a=>a.indices.length>0).map((a,I)=>({vertices:new Float32Array(a.vertices),uvs:new Float32Array(a.uvs),indices:new Uint32Array(a.indices),unitIndex:I})))}}function fullBlocks2Geometry(l,t){const e=triangle(t.joint),{uvs:n,vertices:s,indices:r}=e,i={vertices:new Float32Array(s.length*l.length),indices:new Uint32Array(r.length*l.length),uvs:new Float32Array(n.length*l.length)},o=t.blocks.map((a,I)=>{const c=triangle(a);for(let E=0;E<c.uvs.length;E+=2)applyMatrix(c.uvs,E,t.coords[I]);return c}),g=o.map(a=>({uvs:new Float32Array(a.uvs.length*l.length),vertices:new Float32Array(a.vertices.length*l.length),indices:new Uint32Array(a.indices.length*l.length)}));return o.push(e),g.push(i),o.forEach((a,I)=>{const{uvs:c,vertices:E,indices:u}=g[I];let Q=0,p=0,w=0,y=0;for(let M=0;M<l.length;M++){const N=l[M];c.set(a.uvs,p);for(let S=0;S<a.vertices.length;S+=3)E[w+S]=a.vertices[S]+N.x,E[w+S+1]=a.vertices[S+1]+N.y;for(let S=0;S<a.indices.length;S++)u[y+S]=a.indices[S]+Q;Q=Q+a.uvs.length/2,p+=a.uvs.length,w+=a.vertices.length,y+=a.indices.length}}),{blocks:g.slice(0,g.length-1),joints:i}}function triangle(l){const t=[],e=[],n=[];let s=0;const r=getBBox(l),i=r.right-r.left,o=r.bottom-r.top;l.forEach(a=>{s&&n.push(s),s+=a.length,a.forEach(I=>{t.push((I.x-r.left)/i,(I.y-r.top)/o),e.push(I.x,I.y,0)})});const g=earcut(e,n,3);return{uvs:t,indices:g,vertices:e}}class RegionMesh{constructor(){this.buffer=new Object}}class IPavePattern{}class IPolygon{}class PatternUtil{static getRegionMesh(t,e,n=!0){const{clipBlocks:s,fullBlocks:r,unit:i}=this.executeClip(t,e,n),o=fullBlocks2Geometry(r,i),g=clipBlocks2Geometry(s,i),a=new Array(t.units.length+1);for(let c=0;c<t.units.length+1;c++)a[c]=[];return o.blocks.forEach((c,E)=>{a[E].push(c)}),g.blocks.forEach(c=>{a[c.unitIndex].push(c)}),a[t.units.length].push(o.joints,g.joints),a.map((c,E)=>this.geos2IMesh(c,E===a.length-1?t.gap.material:t.units[E].materials[0]))}static executeClip(t,e,n=!0){const s=[],r=[],i=[[...t.coord.getDx().data,0],[...t.coord.getDy().data,0],[...t.coord.getOrigin().data,1]],o=applyMatrixToPt({x:0,y:0},i),g=new Pattern(t,e,n);let{udir:a,vdir:I}=t;const c=applyMatrixToPt(a,i),E=applyMatrixToPt(I,i),u=applyMatrixToPt({x:0,y:0},i);a={x:c.x-u.x,y:c.y-u.y},I={x:E.x-u.x,y:E.y-u.y};const Q=Math.sqrt(I.x*I.x+I.y*I.y),p=Math.sqrt(a.x*a.x+a.y*a.y),w={x:I.x/Q,y:I.y/Q},y={x:a.x/p,y:a.y/p};let M=[e.outer,...e.holes].map(W=>new exports.Loop(W).toPath()),N=t.units.map(W=>new exports.Loop(W.outer).toPath());const S=getUVMinMax(y,w,M[0],o),R=getUVMinMax(y,w,N.flat(),{x:0,y:0}),U=Math.ceil(R.uMax/p)-Math.floor(R.uMin/p),b=Math.ceil(R.vMax/Q)-Math.floor(R.vMin/Q),{setFlag:G,getFlag:O}=buildFlags([Math.floor(S.uMin/p)-U,Math.ceil(S.uMax/p)+U],[Math.floor(S.vMin/Q)-b,Math.ceil(S.vMax/Q)+b]),H=[],z=[];function tA(W,oA,hA){if(O(W,oA)>=0)return;const dA=g.isUnitXBackground(hA);if(dA===-1){G(W,oA,-1);return}else if(dA===0){G(W,oA,0),z.length<1e3?z.push([W,oA]):r.push(hA);return}G(W,oA,1);const PA=g.execute(hA,dA===1);if(PA&&s.push(PA),O(W,oA-1)===void 0){const yA={x:hA.x-a.x,y:hA.y-a.y};H.push([W,oA-1,yA]),G(W,oA-1,-2)}if(O(W-1,oA-1)===void 0){const yA={x:hA.x-a.x-I.x,y:hA.y-a.y-I.y};H.push([W-1,oA-1,yA]),G(W-1,oA-1,-2)}if(O(W-1,oA)===void 0){const yA={x:hA.x-I.x,y:hA.y-I.y};H.push([W-1,oA,yA]),G(W-1,oA,-2)}if(O(W-1,oA+1)===void 0){const yA={x:hA.x+a.x-I.x,y:hA.y+a.y-I.y};H.push([W-1,oA+1,yA]),G(W-1,oA+1,-2)}if(O(W,oA+1)===void 0){const yA={x:hA.x+a.x,y:hA.y+a.y};H.push([W,oA+1,yA]),G(W,oA+1,-2)}if(O(W+1,oA+1)===void 0){const yA={x:hA.x+a.x+I.x,y:hA.y+a.y+I.y};H.push([W+1,oA+1,yA]),G(W+1,oA+1,-2)}if(O(W+1,oA)===void 0){const yA={x:hA.x+I.x,y:hA.y+I.y};H.push([W+1,oA,yA]),G(W+1,oA,-2)}if(O(W+1,oA-1)===void 0){const yA={x:hA.x+I.x-a.x,y:hA.y+I.y-a.y};H.push([W+1,oA-1,yA]),G(W+1,oA-1,-2)}}function nA(W,oA){r.push({x:o.x+I.x*W+a.x*oA,y:o.y+I.y*W+a.y*oA}),O(W,oA-1)===void 0&&(z.push([W,oA-1]),G(W,oA-1,0)),O(W-1,oA-1)===void 0&&(z.push([W-1,oA-1]),G(W-1,oA-1,0)),O(W-1,oA)===void 0&&(z.push([W-1,oA]),G(W-1,oA,-2)),O(W-1,oA+1)===void 0&&(z.push([W-1,oA+1]),G(W-1,oA+1,-2)),O(W,oA+1)===void 0&&(z.push([W,oA+1]),G(W,oA+1,-2)),O(W+1,oA+1)===void 0&&(z.push([W+1,oA+1]),G(W+1,oA+1,-2)),O(W+1,oA)===void 0&&(z.push([W+1,oA]),G(W+1,oA,-2)),O(W+1,oA-1)===void 0&&(z.push([W+1,oA-1]),G(W+1,oA-1,-2))}function IA(W,oA){tA(W,oA,{x:o.x+I.x*W+a.x*oA,y:o.y+I.y*W+a.y*oA})}for(M.forEach(W=>{if(!W.length)return;const oA={x:W[0].x-o.x,y:W[0].y-o.y};let[hA,dA]=getParamAtUV(y,w,oA),PA=Math.floor(hA/p),yA=Math.floor(dA/Q);for(let _A=Math.floor(R.vMin/Q);_A<=Math.ceil(R.vMax/Q)+1;_A++)for(let LA=Math.floor(R.uMin/p);LA<=Math.ceil(R.uMax/p)+1;LA++)IA(yA+_A,PA+LA)});H.length;){const W=Math.min(H.length,100);for(let oA=0;oA<W;oA++){const hA=H[oA];tA(hA[0],hA[1],hA[2])}H.splice(0,W)}for(;z.length;){const W=Math.min(z.length,100);for(let oA=0;oA<W;oA++){const hA=z[oA];nA(hA[0],hA[1])}z.splice(0,W)}const iA=g.getUnit();return{clipBlocks:s,fullBlocks:r,unit:iA}}static geos2IMesh(t,e){const n={uvL:0,verticesL:0,indicesL:0};t.forEach(I=>{n.uvL+=I.uvs.length,n.verticesL+=I.vertices.length,n.indicesL+=I.indices.length});const s={vertices:new Float32Array(n.verticesL),faces:new Uint32Array(n.indicesL),uvs:new Float32Array(n.uvL),normals:new Float32Array(n.verticesL)};let r=0,i=0,o=0,g=0;for(let I=0;I<t.length;I++){const c=t[I];s.uvs.set(c.uvs,i);for(let E=0;E<c.vertices.length;E++)s.vertices[o+E]=c.vertices[E],s.normals[o+E]=E%3===2?1:0;for(let E=0;E<c.indices.length;E++)s.faces[g+E]=c.indices[E]+r;r=r+c.vertices.length/3,i+=c.uvs.length,o+=c.vertices.length,g+=c.indices.length}const a=new RegionMesh;return a.buffer=s,a.material=e,a}}function buildFlags(l,t){const e=l[1]-l[0]+2,n=t[1]-t[0]+2,s=0-l[0]+1,r=0-t[0]+1,i=[];for(let a=0;a<n;a++)i[a]=new Array(e);function o(a,I){return a+r>=i.length||a+r<0||I+s>=i[a+r].length||I+s<0?-1:i[a+r][I+s]}function g(a,I,c){a+r>=i.length||a+r<0||(i[a+r][I+s]=c)}return{setFlag:g,getFlag:o}}const index$3=Object.freeze(Object.defineProperty({__proto__:null,Bool2d,Bool2dType,BoolOperate2d,BoolOperateClipper,BoolType:Bool2dType,CalcOverlap,ClipMesh,CurvesColinear,CurvesMerge,CurvesPJType,D,DiscreteTopology,DiscreteUtil,ExtrudeClip,Extruder,GeometryMerge,ILoopsToPolygonExes,IPavePattern,IPolygon,LoopArea,LoopCentroid,LoopsPJType,MeshUtil,Offset,Overlap:CalcOverlap,PJ,PatternUtil,PolygonOffset,Project,PtLoopPJType,PtPolygonPositionJudger,RegionMesh,SearchGraph,TopologyEdit,X,boxCutLine,boxToTrimmedSurfaces},Symbol.toStringTag,{value:"Module"}));class BrepUtil{static generateUUID(){return uuid.v4()}static generateShortUUID(){return uuid.v4().replace(/-/g,"").substring(0,8)}static dumpMapObj(t){let e;if(t){e={};for(const n in t){let s=t[n];try{s=s.dump()}catch{}e[n]=s}}return e}static loadMapObj(t){let e;if(t){e={};for(const n in t){let s=t[n];try{s=Loader.load(s)}catch{}e[n]=s}}return e}}class TopoObject extends GeoElement{static{this._idGenerator=1}constructor(){super(),this.refId=TopoObject._idGenerator++,this.tag=BrepUtil.generateShortUUID()}setParent(t){this._parent=t}getParent(){return this._parent}getFlags(){return this._flags}setFlags(t){this._flags=t}getData(){return this._data}setData(t){this._data=t}getDebugTag(){return this.userData?.debugTag||this._simpleUUID()}clone(){throw new Error("除了shell和body能clone外,其余topoObject均不可clone")}dump(){return{...super.dump(),tag:this.tag,flag:this._flags,data:BrepUtil.dumpMapObj(this._data)}}load(t){const{tag:e,flag:n,data:s,_d:r}=t;return this.dUserData=r,this.tag=e,this._flags=n,this._data=BrepUtil.loadMapObj(s),super.load(t)}_simpleUUID(t){return t?t.substr(0,8):`${this.tag}`.substr(0,8)}}var __getOwnPropDesc$6=Object.getOwnPropertyDescriptor,__decorateClass$6=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$6(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};let Coedge3d=class extends TopoObject{constructor(l,t,e){super(),l!==void 0&&t!==void 0&&(this.setEdge(l),this._sameDirWithEdge=t,this._pCurve=e)}getEdgeTag(){return this._edge?this._edge.tag:this._edgeTag}getSameDirWithEdge(){return this._sameDirWithEdge}setSameDirWithEdge(l){this._sameDirWithEdge=l}setEdge(l){this._edge&&this._edge.deleteCoedge3d(this),this._edge=l,this._edgeTag=l.tag,this._edge&&this._edge.addCoedge3d(this)}getStartVertex(){return this._sameDirWithEdge?this._edge.getStartVertex():this._edge.getEndVertex()}getEndVertex(){return this._sameDirWithEdge?this._edge.getEndVertex():this._edge.getStartVertex()}getCurve(){const l=this.getEdge().getCurve().clone();return this._sameDirWithEdge?l:l.reverse()}getPCurve(){return this._pCurve}setPCurve(l){this._pCurve=l}reverse(){this._sameDirWithEdge=!this._sameDirWithEdge}getWire(){return this.getParent()}getFace(){const l=this.getWire();if(!(!l||!l.getParent()))return l.getParent()}getShell(){const l=this.getFace();if(!(!l||!l.getParent()))return l.getParent()}getEdge(){return this._edge}dispose(){this._edge&&(this._edge.deleteCoedge3d(this),this._edge.getCoedge3ds().length||this._edge.dispose())}isEdgeInfoValid(){return!!this._edge}getIndexInWire(){const l=this.getWire();return l?l.getCoedge3ds().findIndex(t=>t===this):-1}getPrevCoedge(){const l=this.getWire();if(!l)return;const t=l.getCoedge3ds().findIndex(e=>e===this);return t===0?l.getCoedge3dByIndex(l.getCoedge3ds().length-1):l.getCoedge3dByIndex(t-1)}getNextCoedge(){const l=this.getWire();if(!l)return;const t=l.getCoedge3ds().findIndex(e=>e===this);return t===l.getCoedge3ds().length-1?l.getCoedge3dByIndex(0):l.getCoedge3dByIndex(t+1)}getStartTangent(){let l;return this.getSameDirWithEdge()?l=this.getEdge().getCurve().getStartTangent():(l=this.getEdge().getCurve().getEndTangent(),l.reverse()),l}getEndTangent(){let l;return this.getSameDirWithEdge()?l=this.getEdge().getCurve().getEndTangent():(l=this.getEdge().getCurve().getStartTangent(),l.reverse()),l}getTwin(){const l=this.getEdge();if(!l)return;const t=l.getOtherCoedge3ds(this);if(t.length!==0)return MathAssert.warn(t.length===1,"Multiple twins found"),t[0]}getTwins(){const l=this.getEdge();return l?l.getOtherCoedge3ds(this):[]}getBBox(){return this.getEdge().getBBox()}getType(){return EN_GEO_TYPE.BREP_COEDGE}dump(){const l=super.dump();return l.eTag=this.getEdgeTag(),l.dir=this._sameDirWithEdge?1:0,this._pCurve&&(l.pCrv=this._pCurve.dump()),l.tag=void 0,l}load({tag:l,flag:t,data:e,eTag:n,dir:s,pCrv:r,_d:i}){return super.load({tag:l,flag:t,data:e,_d:i}),this._edgeTag=n,this._sameDirWithEdge=s>0,r?this._pCurve=Loader.load(r):this._pCurve=void 0,this}};Coedge3d=__decorateClass$6([registerGeo],Coedge3d);var __getOwnPropDesc$5=Object.getOwnPropertyDescriptor,__decorateClass$5=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$5(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};let Wire=class extends TopoObject{constructor(l){super(),this._coedge3dList=[],l&&l.forEach(t=>this.addCoedge3d(t))}getFace(){return this.getParent()}deleteCoedge3dAt(l,t=1){const e=Math.min(this._coedge3dList.length-l,t);if(!(e<0)){for(let n=l;n<l+e;n++)this._coedge3dList[n].setParent(void 0);this._coedge3dList.splice(l,e)}}deleteCoedge3d(l){const t=this._coedge3dList.findIndex(e=>e===l);t>-1&&(this._coedge3dList[t].setParent(void 0),this._coedge3dList.splice(t,1))}deleteCoedge3dByTag(l){const t=this._coedge3dList.findIndex(e=>e.tag===l);t>-1&&(this._coedge3dList[t].setParent(void 0),this._coedge3dList.splice(t,1))}addCoedge3d(l){l.tag||(l.tag=BrepUtil.generateShortUUID());const t=l.getWire();t&&t.deleteCoedge3d(l),l.setParent(this),this._coedge3dList.push(l)}insertCoedge3d(l,...t){t.forEach(e=>{e.tag||(e.tag=BrepUtil.generateShortUUID());const n=e.getWire();n&&n.deleteCoedge3d(e),e.setParent(this)}),this._coedge3dList.splice(l,0,...t)}replaceCoedge3d(l,t){if(!(l<0||l>=this._coedge3dList.length)){this._coedge3dList[l].setParent(void 0);for(const e of t)e.tag||(e.tag=BrepUtil.generateShortUUID()),e.setParent(this);this._coedge3dList.splice(l,1,...t)}}getCoedge3ds(){return this._coedge3dList}getCoedge3dByTag(l){if(!this.getCoedge3ds())return;const t=this.getCoedge3ds().findIndex(e=>e.tag===l);if(t>-1)return this.getCoedge3ds()[t]}getCoedge3dByIndex(l){if(l<0||l>this.getCoedge3ds().length-1){MathAssert.assert(!1,"Wire getCoedge3dByIndex(): Out of Range!");return}return this.getCoedge3ds()[l]}dispose(){for(const l of this._coedge3dList)l.getWire()===this&&l.dispose();this._coedge3dList=[]}isEdgeInfoValid(){for(const l of this._coedge3dList)if(!l.isEdgeInfoValid())return!1;return!0}isValid(){for(let l=0;l<this._coedge3dList.length;l++){const t=this._coedge3dList[l],e=this._coedge3dList[(l+1)%this._coedge3dList.length];if(t.getEndVertex()!==e.getStartVertex())return!1}return!0}reverse(){this._coedge3dList.reverse(),this._coedge3dList.forEach(l=>l.reverse())}toPath(){return this.getCoedge3ds().map(l=>l.getCurve())}getBBox(){const l=new Box3;return this._coedge3dList.forEach(t=>{l.union(t.getBBox())}),l}isFaceOutWire(){if(!this.getParent())return;const t=this.getParent().getWires()[0];return this===t}calcLoop(){const l=this.getParent();MathAssert.assert(l);const t=l.getSurface(),e=[],n=new Map;for(const r of this.getCoedge3ds()){const i=r.getPCurve();if(i){e.push(i);continue}const o=t.getCurve2d(r.getCurve());e.push(o)}if(n.size>0)for(let r=0;r<e.length;r++){const o=e[(r-1+e.length)%e.length].getEndPt();if(o.equals(e[r].getStartPt()))continue;const g=n.get(e[r]);if(g)for(const a of g)o.sqDistanceTo(a.getStartPt())<o.sqDistanceTo(e[r].getStartPt())&&e.splice(r,1,a)}const s=this.getCoedge3ds().map(r=>r.getCurve());return SurfaceUtil.unifyCurve2dUVBetweenCurves(s,t,e),new exports.Loop(e)}getType(){return EN_GEO_TYPE.BREP_WIRE}dump(){const l=super.dump();return l.ces=this._coedge3dList.map(t=>{const e=t.dump();return e.type=void 0,e}),l.tag=void 0,l}load({tag:l,flag:t,data:e,ces:n,_d:s}){return super.load({tag:l,flag:t,data:e,_d:s}),this._coedge3dList=[],n.forEach(r=>{r.type=EN_GEO_TYPE.BREP_COEDGE,this.addCoedge3d(Loader.load(r))}),this}};Wire=__decorateClass$5([registerGeo],Wire);var __getOwnPropDesc$4=Object.getOwnPropertyDescriptor,__decorateClass$4=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$4(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};const SMOOTH_MASK$1=1;let Vertex=class extends TopoObject{constructor(l){super(),this._point=exports.Vec3.O(),this._edges=new Set,l&&(this._point=new exports.Vec3(l))}getPoint(){return this._point}setPoint(l){this._point=l}getSmooth(){return this._flags!==void 0?(this._flags&SMOOTH_MASK$1)!==0:!1}setSmooth(l){this._flags=this._flags||0,l?this._flags|=SMOOTH_MASK$1:this._flags&=~SMOOTH_MASK$1}addEdge(l){this._edges.add(l)}deleteEdge(l){this._edges.delete(l)}getShell(){return this.getParent()}getEdges(){return Array.from(this._edges)}getFaces(){const l=this.getEdges(),t=new Set;for(const e of l)e.getFaces().forEach(n=>{t.add(n)});return[...t.values()]}getBBox(){return new Box3([this._point.toXYZ()])}dump(){const l=super.dump();return l.p=this._point.toArray3(),l}load({p:l,tag:t,flag:e,data:n,_d:s}){return super.load({tag:t,flag:e,data:n,_d:s}),this._point=new exports.Vec3(l),this}getType(){return EN_GEO_TYPE.BREP_VERTEX}};Vertex=__decorateClass$4([registerGeo],Vertex);var __getOwnPropDesc$3=Object.getOwnPropertyDescriptor,__decorateClass$3=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$3(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};const SMOOTH_MASK=1,DEGENERATE_MASK=2;let Edge=class extends TopoObject{constructor(l,t,e){super(),this._coedges=[],l&&(this._curve=l),t&&this.setStartVertex(t),e&&this.setEndVertex(e)}getShell(){return this.getParent()}getCurve(){return this._curve}get tolerance(){return this._tol}setCurve(l){this._curve=l}getSmooth(){return this._flags!==void 0?(this._flags&SMOOTH_MASK)!==0:!1}setSmooth(l){this._flags=this._flags||0,l?this._flags|=SMOOTH_MASK:this._flags&=~SMOOTH_MASK}isDegenerate(){return this._flags!==void 0?(this._flags&DEGENERATE_MASK)!==0:!1}setDegenerateFlag(l=!1){this._flags=this._flags||0,l?this._flags|=DEGENERATE_MASK:this._flags&=~DEGENERATE_MASK}addCoedge3d(l){this._coedges.push(l)}deleteCoedge3d(l){const t=this._coedges.indexOf(l);t>=0&&this._coedges.splice(t,1)}deleteAllCoedge3ds(){this._coedges=[]}getBoundedCurve(){const l=this._curve.clone(),t=l.getParamAt(this._startVertex.getPoint()),e=l.getParamAt(this._endVertex.getPoint());if(Math.abs(t-e)<Tol.NUMBER&&this._curve.isPeriodic()){const n=this._curve.getRange();l.setRange(t,t+n.period)}else l.setRange(t,e);return l}getStartVertexTag(){return this._startVertex?this._startVertex.tag:""}getEndVertexTag(){return this._endVertex?this._endVertex.tag:""}setStartVertex(l){if(this._startVertex){if(this._startVertex===l)return;this._endVertex&&this._startVertex!==this._endVertex&&this._startVertex.deleteEdge(this)}this._startVertex=l,this._startVertex&&this._startVertex.addEdge(this)}setEndVertex(l){if(this._endVertex){if(this._endVertex===l)return;this._startVertex&&this._startVertex!==this._endVertex&&this._endVertex.deleteEdge(this)}this._endVertex=l,this._endVertex&&this._endVertex.addEdge(this)}getAnotherVertex(l){return MathAssert.assert(l!==void 0&&(this._startVertex&&this._startVertex.tag===l.tag||this._endVertex&&this._endVertex.tag===l.tag),"Edge.getAnotherVertex: unknown vertex"),this._startVertex&&this._startVertex.tag===l.tag?this._endVertex:this._startVertex}getOtherCoedge3ds(l){return this.getCoedge3ds().filter(t=>t.tag!==l.tag)}getCoedge3ds(){return this._coedges}getFaces(){const l=[];for(const t of this._coedges){const e=t.getFace();e&&l.push(e)}return l}getStartVertex(){return this._startVertex}getEndVertex(){return this._endVertex}dispose(){this.deleteAllCoedge3ds(),this._startVertex&&this._startVertex.deleteEdge(this),this._endVertex&&this._endVertex.deleteEdge(this)}getBBox(){return this._curve.isLine3d()?new Box3([this.getStartVertex().getPoint(),this.getEndVertex().getPoint()]):this._curve.getBBox()}updateTolerance(){if(this._startVertex&&this._endVertex){const l=this._curve.getStartPt().sqDistanceTo(this.getStartVertex().getPoint()),t=this._curve.getEndPt().sqDistanceTo(this.getEndVertex().getPoint()),e=l>t?l:t;e>Tol.LENGTH_2&&(this._tol=Math.sqrt(e))}}discrete(l=DiscreteParam.NORMAL){const t=this._curve.discrete(l);return this._startVertex&&(t[0]=this._startVertex.getPoint().clone()),this._endVertex&&(t[t.length-1]=this._endVertex.getPoint().clone()),t}tessellate(l=DiscreteParam.NORMAL){return{edges:[this._curve.discrete(l).map(e=>e.toArray3())]}}dump(){const l=super.dump();return l.c=this._curve.isLine3d()?void 0:this._curve.dump(),l.sVTag=this._startVertex?this._startVertex.tag:"",l.eVTag=this._endVertex?this._endVertex.tag:"",l}load({tag:l,flag:t,data:e,c:n,_d:s}){if(super.load({tag:l,flag:t,data:e,_d:s}),n){const r=Loader.load(n);this._curve=r}return this}getType(){return EN_GEO_TYPE.BREP_EDGE}};Edge=__decorateClass$3([registerGeo],Edge);var __getOwnPropDesc$2=Object.getOwnPropertyDescriptor,__decorateClass$2=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$2(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};let Shell=class extends TopoObject{constructor(){super(...arguments),this._vTagToVertexMap=new Map,this._eTagToEdgeMap=new Map,this._faceList=[]}isEmpty(){return!this._faceList.length&&!this._eTagToEdgeMap.size}isOnlyPlane(){return this._faceList.every(l=>l.getSurface().isPlane())}clear(){this._faceList.splice(0),this._vTagToVertexMap.clear(),this._eTagToEdgeMap.clear()}getFaces(){return this._faceList}getEdges(){return[...this._eTagToEdgeMap.values()]}getVertexs(){return[...this._vTagToVertexMap.values()]}get tolerance(){return this._tol}createFace(l,t,e,n){const s=new Face(l,t,e);return n&&(s.tag=n),this.addFace(s),s}addFace(l){l.tag||(l.tag=BrepUtil.generateShortUUID()),l.setParent(this),this._faceList.push(l)}deleteFace(l){const t=this._faceList.findIndex(e=>e.tag===l.tag);t<0||(l.setParent(void 0),this._faceList.splice(t,1))}deleteFaceByTag(l){const t=this._faceList.findIndex(e=>l===e.tag);t<0||(this._faceList[t].setParent(void 0),this._faceList.splice(t,1))}getFaceByTag(l){return this._faceList.find(t=>l===t.tag)}createLineEdge(l,t){MathAssert.assert(l&&t,"Shell createLineEdge()失败,Vertex为空!");let e;l===t?e=new exports.Ln3(l.getPoint(),exports.Vec3.X(),[0,0]):e=new exports.Ln3(l.getPoint(),t.getPoint());const n=new Edge(e,l,t);return this.addEdge(n),n}createEdge(l,t,e,n){const s=new Edge(l,t,e);return n&&(s.tag=n),this.addEdge(s),s}addEdge(l){l.tag||(l.tag=BrepUtil.generateShortUUID()),l.setParent(this),this._eTagToEdgeMap.set(l.tag,l)}deleteEdge(l){return this._eTagToEdgeMap.delete(l.tag)}getEdgeByTag(l){return this._eTagToEdgeMap.get(l)}deleteEdgeByTag(l){return this._eTagToEdgeMap.delete(l)}createVertex(l,t){const e=new Vertex(l);return t&&(e.tag=t),this.addVertex(e),e}addVertex(l){l.tag||(l.tag=BrepUtil.generateShortUUID()),l.setParent(this),this._vTagToVertexMap.set(l.tag,l)}deleteVertex(l){this._vTagToVertexMap.delete(l.tag)}getVertexByTag(l){return this._vTagToVertexMap.get(l)}deleteVertexByTag(l){return this._vTagToVertexMap.delete(l)}updateTolerance(){for(const l of this._eTagToEdgeMap)l[1].tolerance&&l[1].tolerance>0&&(this._tol===void 0||l[1].tolerance>this._tol)&&(this._tol=l[1].tolerance)}isTopoValid(){for(const l of this.getFaces())for(const t of l.getWires())for(const e of t.getCoedge3ds())if(e.getShell()!==this||e.getWire()!==t||e.getFace()!==l||!e.getEdge())return!1;for(const l of this.getEdges()){if(!l.getCoedge3ds()||!l.getCoedge3ds().length)return!1;for(const t of l.getCoedge3ds()){const e=t.getFace();if(this._faceList.findIndex(n=>n===e)<0)return!1}}return!0}isTopoValidBrepBody(){for(const l of this.getFaces()){if(l.getWires().length===0)return!1;for(const t of l.getWires()){if(t.getCoedge3ds().length===0)return!1;for(const e of t.getCoedge3ds()){if(e.getShell()!==this||e.getWire()!==t||e.getFace()!==l||!e.getEdge()||e.getTwins().length<1)return!1;for(const n of e.getTwins())if(n.getTwins().findIndex(s=>s.tag===e.tag)===-1)return!1}}}for(const l of this.getEdges())if(l.getParent()!==this||l.getCoedge3ds().length%2>0||!l.getStartVertex()||!l.getEndVertex())return!1;for(const l of this.getVertexs())if(l.getParent()!==this||l.getEdges().length<2&&!l.getEdges()[0].getCurve().isPeriodic())return!1;return!0}transform(l,t){const e=t?.svd||exports.Matrix4.make(l,!1).decompose(),n=exports.Matrix4.isSvdMirror(e),s=exports.Matrix4.isScaleEqual(e.scale);this._vTagToVertexMap.forEach(i=>{i.getPoint().transform(l)});const r=(i,o,g)=>{i.getPCurve()};if(!s){const i=new Map;for(const o of this._faceList){const g=o.calcPolygon().getBBox();g.isValid()&&i.set(o.tag,g)}for(const o of this._eTagToEdgeMap){const a=o[1].getCurve().transformed(l,t);o[1].setCurve(a)}for(const o of this._faceList){const a=o.getSurface().transformed(l,{...t,range:i.get(o.tag)});o.setSurface(a);for(const I of o.getWires())for(const c of I.getCoedge3ds())r(c);n&&o.getWires().forEach(I=>I.reverse())}return this}this._eTagToEdgeMap.forEach(i=>i.getCurve().transform(l,t));for(const i of this._faceList){const o=i.getSurface();o.clone(),o.transform(l,t),!exports.Matrix4.isOnlyTranslateAndRotate(e.scale)&&n&&i.getWires().forEach(g=>g.reverse())}return this}translate(l){const t=exports.Matrix4.makeTranslate({x:l.x,y:l.y,z:l.z||0});return this.transform(t)}rotate(l,t,e){const n=e||{x:0,y:0,z:1},s={x:t.x,y:t.y,z:t.z||0},r=exports.Matrix4.makeRotate(s,n,l);return this.transform(r)}scale(l,t={x:0,y:0,z:0}){const e={x:t.x,y:t.y,z:t.z||0},n=exports.Matrix4.makeScale(e,l);return this.transform(n)}getBBox(){const l=new Box3;return this._faceList.forEach(t=>{l.union(t.getBBox())}),l}clone(){const l=new this.constructor().load(this.dump());return l.dUserData=this.dUserData,l.userData=this.userData,l._faceList.forEach(t=>{const e=this.getFaceByTag(t.tag);if(!e)throw new Error("not find face by tag!");t.userData=e.userData,t.dUserData=e.dUserData,t.getSurface().userData=e.userData,t.getSurface().dUserData=e.dUserData;const n=e.getWires();t.getWires().forEach((s,r)=>{s.userData=n[r].userData,s.dUserData=n[r].dUserData,s.getCoedge3ds().forEach((i,o)=>{const g=n[r].getCoedge3ds()[o];i.userData=g.userData,i.dUserData=g.dUserData;const[a,I]=[i.getPCurve(),i.getEdge()];a&&(a.userData=g.getPCurve().userData,a.dUserData=g.getPCurve().dUserData),I&&(I.userData=g.getEdge().userData,I.dUserData=g.getEdge().dUserData,I.getCurve().userData=g.getEdge().getCurve().userData,I.getCurve().dUserData=g.getEdge().getCurve().dUserData)})})}),l.getEdges().forEach(t=>{const e=this.getEdgeByTag(t.tag);t.userData=e.userData,t.dUserData=e.dUserData,t.getCurve().userData=e.getCurve().userData,t.getCurve().dUserData=e.getCurve().dUserData}),l.getVertexs().forEach(t=>{t.userData=this.getVertexByTag(t.tag).userData,t.dUserData=this.getVertexByTag(t.tag).dUserData}),l}getType(){return EN_GEO_TYPE.BREP_SHELL}replaceFaceTag(l,t){const e=this.getFaceByTag(l);e&&(e.tag=t)}replaceEdgeTag(l,t){const e=this.getEdgeByTag(l);e&&(this._eTagToEdgeMap.delete(l),e.tag=t,this._eTagToEdgeMap.set(t,e))}replaceVertexTag(l,t){const e=this.getVertexByTag(l);e&&(this._vTagToVertexMap.delete(l),e.tag=t,this._vTagToVertexMap.set(t,e))}dump(){const l=super.dump();return l.fs=this._faceList.map(t=>{const e=t.dump();return e.type=void 0,e}),l.es=this.getEdges().map(t=>{const e=t.dump();return e.type=void 0,e}),l.vs=this.getVertexs().map(t=>{const e=t.dump();return e.type=void 0,e}),l}load({tag:l,flag:t,data:e,fs:n,es:s,vs:r,_d:i}){super.load({tag:l,flag:t,data:e,_d:i});const o=new Map;for(const g of r)g.type=EN_GEO_TYPE.BREP_VERTEX,this.addVertex(Loader.load(g));for(const g of s)g.type=EN_GEO_TYPE.BREP_EDGE,this.addEdge(Loader.load(g)),o[g.tag]=[g.sVTag,g.eVTag];for(const g of n)g.type=EN_GEO_TYPE.BREP_FACE,this.addFace(Loader.load(g));return this._buildTopoRelation(o),this}_buildTopoRelation(l){for(const t of this._faceList)t.getCoedge3ds().forEach(e=>{const n=e.getEdgeTag(),s=this.getEdgeByTag(n);s||MathError.assert(s,"Edge not found.",MathErrorType.Input,n),e.setEdge(s)});for(const t of this.getEdges()){const e=l[t.tag],n=this.getVertexByTag(e[0]);MathError.assert(n,"Start vertex not found.",MathErrorType.Input,e[0]),t.setStartVertex(n);const s=this.getVertexByTag(e[1]);MathError.assert(s,"End Vertex not found.",MathErrorType.Input,e[1]),t.setEndVertex(s),t.getCurve()||t.setCurve(new exports.Ln3(n.getPoint(),s.getPoint()))}}};Shell=__decorateClass$2([registerGeo],Shell);var __getOwnPropDesc$1=Object.getOwnPropertyDescriptor,__decorateClass$1=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc$1(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};let Face=class extends TopoObject{constructor(l,t,e){super(),this._wireList=[],this._surface=l,this._sameDirWithSurface=t,e&&e.forEach(n=>this.addWire(n))}static createPlane(l,t,e){const n=[[-1,-1],[1,-1],[1,1],[-1,1]],s=[];for(let i=0;i<n.length;i++){const o=n[i],g=n[(i+1)%n.length];s.push(new exports.Ln2({x:o[0]*t,y:o[1]*t},{x:g[0]*t,y:g[1]*t}))}const r=new exports.Plane(l);return Face.createByBoundary2d(r,[s],!0,e)}static createByBoundary2d(l,t,e,n){const s=t.map(r=>r.map(i=>l.getCurve3d(i)));return Face.createByBoundary(l,t,s,e,n)}static createByBoundary3d(l,t,e,n){const s=t.map(r=>new Array(r.length));return Face.createByBoundary(l,s,t,e,n)}static createByBoundary(l,t,e,n,s){MathAssert.assert(t.length===e.length,"loop length should equal");const r=s||new Shell,i=[];for(let o=0;o<e.length;o++){const g=new Wire,a=e[o],I=t[o],c=a.length,E=new Array(c);for(let u=0;u<c;u++){const Q=a[(u+c-1)%c].getEndPt(),p=a[u].getStartPt();E[u]=r.createVertex(Q.midTo(p))}for(let u=0;u<e[o].length;u++){const Q=r.createEdge(a[u],E[u],E[(u+1)%c]),p=new Coedge3d(Q,!0);p.setPCurve(I[u]),g.addCoedge3d(p)}i.push(g)}return r.createFace(l,n,i)}setSurface(l){this._surface=l.clone()}getSurface(){return this._surface}setSameDirWithSurface(l){this._sameDirWithSurface=l}getSameDirWithSurface(){return this._sameDirWithSurface}reverse(){this._sameDirWithSurface=!this._sameDirWithSurface}getWires(){return this._wireList}setWires(l){this._wireList.forEach(t=>{t.setParent(void 0)}),this._wireList=l.slice(),this._wireList.forEach(t=>{t.setParent(this)})}getNormAt(l){const t=this.getSurface().getNormAt(l);return this._sameDirWithSurface?t:t.reverse()}getCenterNorm(){if(this.getSurface().isPlane())return this.getNormAt(exports.Vec2.O());const l=this.calcPolygon();return l.isEmpty()?(MathAssert.assert(!1,"计算Face的中心点法向失败!"),new exports.Vec3):this.getNormAt(l.getCentroidPoint())}getCentroidPoint(){const l=this.calcPolygon();return l.isEmpty()?(MathAssert.assert(!1,"计算Face的中心点失败!"),new exports.Vec3):this._surface.getPtAt(l.getCentroidPoint())}addWire(l){l.tag||(l.tag=BrepUtil.generateShortUUID());const t=l.getFace();t&&t.deleteWire(l),l.setParent(this),this._wireList.push(l)}insertWire(l,...t){t.forEach(e=>{e.tag||(e.tag=BrepUtil.generateShortUUID());const n=e.getFace();n&&n.deleteWire(e),e.setParent(this)}),this._wireList.splice(l,0,...t)}deleteWire(l){const t=this._wireList.findIndex(e=>l.tag===e.tag);t>-1&&(this._wireList[t].setParent(void 0),this._wireList.splice(t,1))}deleteAllWires(){this._wireList=[]}getWireByTag(l){if(!this._wireList)return;const t=this._wireList.findIndex(e=>e.tag===l);if(t>-1)return this._wireList[t]}deleteWireByTag(l){const t=this._wireList.findIndex(e=>e.tag===l);t>-1&&(this._wireList[t].setParent(void 0),this._wireList.splice(t,1))}getCoedge3ds(){if(this._wireList.length<1)return[];const l=[];for(const t of this._wireList)l.push(...t.getCoedge3ds());return l}getEdges(){const l=new Set;return this.getCoedge3ds().forEach(e=>{const n=e.getEdge();n?l.add(n):MathAssert.assert(!1,"Coedge3d对应的Edge为空 !")}),Array.from(l)}getVertexes(){const l=this.getEdges(),t=new Set;for(const e of l){const n=e.getStartVertex(),s=e.getEndVertex();n&&t.add(n),s&&t.add(s)}return[...t.values()]}getTwinFaces(l=!1){const t=new Set;let e=[];return l&&this._wireList.length?e=this._wireList[0].getCoedge3ds().slice():e=this.getCoedge3ds(),e.forEach(n=>{const s=n.getTwins();for(const r of s){const i=r.getFace();i&&t.add(i)}}),[...t]}getShell(){return this.getParent()}getTrimmedSurface(){const l=this._wireList.map(e=>e.getCoedge3ds().map(n=>n.getCurve()));let t;try{t=exports.TrimmedSurface.createByBoundary3d(this._surface,l,this._sameDirWithSurface)}catch(e){console.log(e)}return t}dispose(){this._wireList.forEach(l=>l.dispose()),this.deleteAllWires()}getType(){return EN_GEO_TYPE.BREP_FACE}isEdgeInfoValid(){for(const l of this._wireList)if(!l.isEdgeInfoValid())return!1;return!0}getBBox(l=DiscreteParam.NORMAL,t=Tol.DEFAULT){const e=this._surface;if(e instanceof exports.Plane||e instanceof exports.Cylinder)return this._wireList[0].getBBox();const n=this._getDirectedLoops(),s=DiscreteUtil.discreteSurfaceIntoPoints(this._surface,n,l,t);return new Box3(s)}discrete(l=DiscreteParam.NORMAL,t=Tol.DEFAULT){const e=this._getDirectedLoops(),n=DiscreteUtil.discreteSurface(this._surface,e,this._sameDirWithSurface,l,t);return n.uvs=UvUtil.parseUvInArcLength(n.uvs,this._surface,!1),n}tessellate(l=DiscreteParam.NORMAL,t=Tol.DEFAULT){return{mesh:this.discrete(l,t)}}calcPolygon(){if(this._wireList.length<1)return new exports.Polygon;if(!this.isEdgeInfoValid())return MathAssert.assert(!1,"面上有Coedge3d未关联Edge,计算Polygon失败!"),new exports.Polygon;const l=new exports.Polygon;for(const t of this._wireList)l.addLoop(t.calcLoop(),!1);return l}calcArea(){const l=this.calcPolygon();let t=0;const e=this.getSurface();for(const n of l.getLoops())for(const s of n.getAllCurves()){const r=o=>{const g=s.getPtAt(o),a=s.getDerivatives(o,1)[1];return gaussIntegration(E=>{const u=e.firstFundamentalForm({x:g.x,y:E}),Q=u[0]*u[2]-u[1]*u[1];return Math.sqrt(Q)},0,g.y,1e-6,1e-6)*a.x},i=s.getRange();t+=gaussIntegration(r,i.min,i.max,1e-6,1e-6)}return-t}calcAreaForOutWire(){if(this.getWires().length<1)return 0;const t=this.getWires()[0].calcLoop();let e=0;const n=this.getSurface();for(const s of t.getAllCurves()){const r=o=>{const g=s.getPtAt(o),a=s.getDerivatives(o,1)[1];return gaussIntegration(E=>{const u=n.firstFundamentalForm({x:g.x,y:E}),Q=u[0]*u[2]-u[1]*u[1];return Math.sqrt(Q)},0,g.y,1e-6,1e-6)*a.x},i=s.getRange();e+=gaussIntegration(r,i.min,i.max,1e-6,1e-6)}return-e}dump(){const l=super.dump();return l.dir=this._sameDirWithSurface?1:0,l.s=this._surface.dump(),l.ws=this._wireList.map(t=>{const e=t.dump();return e.type=void 0,e}),l}load({tag:l,flag:t,data:e,dir:n,s,ws:r,_d:i}){return super.load({tag:l,flag:t,data:e,_d:i}),this.setSameDirWithSurface(n>0),this._surface=Loader.load(s),this._wireList=[],r.forEach(o=>{o.type=EN_GEO_TYPE.BREP_WIRE,this.addWire(Loader.load(o))}),this}_getDirectedLoops(){return this._wireList.map(l=>l.getCoedge3ds().map(t=>({curve:t.getEdge().getCurve(),pCurve:t.getPCurve(),isSameDirection:t.getSameDirWithEdge(),startPoint:t.getStartVertex().getPoint(),endPoint:t.getEndVertex().getPoint()})))}};Face=__decorateClass$1([registerGeo],Face);var __getOwnPropDesc=Object.getOwnPropertyDescriptor,__decorateClass=(l,t,e,n)=>{for(var s=n>1?void 0:n?__getOwnPropDesc(t,e):t,r=l.length-1,i;r>=0;r--)(i=l[r])&&(s=i(s)||s);return s};let BrepBody=class extends Shell{isTopoValid(){for(const l of this.getFaces()){if(l.getWires().length===0)return!1;for(const t of l.getWires()){if(t.getCoedge3ds().length===0)return!1;for(const e of t.getCoedge3ds()){if(e.getShell()!==this||e.getWire()!==t||e.getFace()!==l||!e.getEdge()||e.getTwins().length<1)return!1;for(const n of e.getTwins())if(n.getTwins().findIndex(s=>s.tag===e.tag)===-1)return!1}}}for(const l of this.getEdges()){if(l.getParent()!==this||l.getCoedge3ds().length<2)return!1;for(const t of l.getCoedge3ds())if(t.getShell()!==this)return!1;if(!l.getStartVertex()||!l.getEndVertex())return!1}for(const l of this.getVertexs())if(l.getParent()!==this||l.getEdges().length<2&&!l.getEdges()[0].getCurve().isPeriodic())return!1;return!0}clone(){return super.clone()}getType(){return EN_GEO_TYPE.BREP_BODY}toLump(){return[[this]]}};BrepBody=__decorateClass([registerGeo],BrepBody);const SM_INFO="smooth_poly";class SmoothUtil{static decomposeSmoothPoly(t){const e=[];for(const n of t){if(n instanceof exports.SmoothPoly2||n instanceof exports.SmoothPoly3){n.getSegments().forEach(r=>{r.userData=r.userData||{},r.userData[SM_INFO]=n,e.push(r)});continue}e.push(n)}return e}static hasSmoothInfo(t){return!!(t.userData&&t.userData[SM_INFO]!==void 0)}static getSmoothInfo(t){if(t.userData&&t.userData[SM_INFO]!==void 0)return t.userData[SM_INFO]}static clearSmoothInfo(t){t.userData&&(t.userData[SM_INFO]=void 0)}static isSameSmoothPoly(t,e){return!t.userData||t.userData[SM_INFO]===void 0||!e.userData||e.userData[SM_INFO]===void 0?!1:t.userData[SM_INFO]===e.userData[SM_INFO]}static copySmoothInfo(t,e){!t.userData||t.userData[SM_INFO]===void 0||(e.userData=e.userData||{},e.userData[SM_INFO]=t.userData[SM_INFO])}static updateSmoothVertex(t){if(!t.getSmooth())return;const e=t.getEdges();let n=0;for(let s=0,r=e.length;s<r;s++)e[s].getSmooth()||(n+=1);n!==2&&n!==0&&t.setSmooth(!1)}static udpateSmoothVertices(t){for(const e of t)this.updateSmoothVertex(e)}}class BodyUtil{static getReversedFaces(t,e){const n=t.getFaces(),s=[e||n[0]],r=new Set(s),i=new Set;for(;s.length>0;){const o=s.pop(),g=i.has(o);for(const a of o.getWires())for(const I of a.getCoedge3ds()){const c=I.getTwins();if(c.length===0)continue;if(c.length>1){let Q=1,p=0;for(const w of c){const y=w.getFace();if(!y){MathError.warn("getReversedFaces: coedge对应的face为undefined");continue}r.has(y)||(s.push(y),r.add(y)),I.getSameDirWithEdge()===w.getSameDirWithEdge()==(o.getSameDirWithSurface()===y.getSameDirWithSurface())?Q++:p++}(Q%2||p%2)&&MathError.warn("getReversedFaces: 非流形且face方向存在错误!");continue}const E=c[0],u=E.getFace();!u||r.has(u)||(s.push(u),r.add(u),I.getSameDirWithEdge()!==E.getSameDirWithEdge()==(o.getSameDirWithSurface()===u.getSameDirWithSurface())===g&&i.add(u))}}return i}static unifyFaceDirectOutside(t){if(t.getFaces().length===1)return;const e=t.tolerance||Tol.LENGTH,n=t.getVertexs();let s=[n[0]];for(const I of n)I.getPoint().z>s[0].getPoint().z+e?s=[I]:Math.abs(I.getPoint().z-s[0].getPoint().z)<e&&s.push(I);const r=new Set;for(const I of s)I.getEdges().map(c=>r.add(c));let i=!0;for(const I of r)if(!I.getCurve().isLine3d()){i=!1;break}let o,g=new exports.Vec3(0,0,0);if(i){const I=s[0].getFaces();o=I[0],g=o.getSurface().getNormAtPoint(s[0].getPoint());for(let c=1;c<I.length;c++){const E=I[c].getSurface().getNormAtPoint(s[0].getPoint());Math.abs(E.z)>Math.abs(g.z)&&(o=I[c],g=E)}}else{let I=s[0].getPoint(),c;for(const E of t.getEdges()){const u=E.getCurve();if(!u.isLine3d()){const Q=u.getMidPt();Q.z>I.z+e&&(I=Q,c=E);const p=u.getRange(),w=u.getPtAt(p.min+p.getLength()/4);w.z>I.z+e&&(I=w,c=E);const y=u.getPtAt(p.min+p.getLength()*.75);y.z>I.z+e&&(I=y,c=E)}}if(c){const E=c.getFaces();o=E[0],g=o.getSurface().getNormAtPoint(I);for(let u=1;u<E.length;u++){const Q=E[u].getSurface().getNormAtPoint(I);Math.abs(Q.z)>Math.abs(g.z)&&(o=E[u],g=Q)}}else{const E=s[0].getFaces();o=E[0],g=o.getSurface().getNormAtPoint(s[0].getPoint());for(let u=1;u<E.length;u++){const Q=E[u].getSurface().getNormAtPoint(s[0].getPoint());Math.abs(Q.z)>Math.abs(g.z)&&(o=E[u],g=Q)}}}o.setSameDirWithSurface(g.z>0);const a=BodyUtil.getReversedFaces(t,o);for(const I of a)I.setSameDirWithSurface(!I.getSameDirWithSurface())}static mergeCoincideVertexAndEdges(t){const e=t.getVertexs(),n=(o,g)=>{const a=o.z-g.z;if(a>1e-6)return 1;if(a<-1e-6)return-1;const I=o.y-g.y;return I>1e-6?1:I<-1e-6?-1:o.x-g.x};e.sort((o,g)=>n(o.getPoint(),g.getPoint()));const s=[];for(let o=0;o<e.length-1;o++)if(e[o].getPoint().equals(e[o+1].getPoint())){const g=s.find(a=>a.find(I=>I===e[o]));g?g.push(e[o+1]):s.push([e[o],e[o+1]])}const r=new Set;if(s.length>0)for(const o of s){const g=o[0];for(const a of g.getEdges())r.add(a);for(let a=1;a<o.length;a++){const I=o[a].getEdges();for(const c of I)r.add(c),c.getStartVertex()===o[a]?c.setStartVertex(g):c.setEndVertex(g);t.deleteVertex(o[a])}}const i=[...r];for(let o=0;o<r.size;o++)for(let g=o+1;g<r.size;g++)i[o].getStartVertex()===i[g].getStartVertex()&&i[o].getEndVertex()===i[g].getEndVertex()&&i[o].getCurve().getMidPt().equals(i[g].getCurve().getMidPt())?(this._replaceEdge(i[g],i[o]),i[g].dispose(),t.deleteEdge(i[g])):i[o].getStartVertex()===i[g].getEndVertex()&&i[o].getEndVertex()===i[g].getStartVertex()&&i[o].getCurve().getMidPt().equals(i[g].getCurve().getMidPt())&&(this._replaceEdge(i[g],i[o]),i[g].dispose(),t.deleteEdge(i[g]))}static _replaceEdge(t,e){const n=t.getCoedge3ds();for(let s=0;s<n.length;s++)n[s].setEdge(e),s--}}class ExtrudeBody{static execute(t,e,n,s,r,i=!0,o=!1,g){let a=e;o||(a=this._decomposeSmoothPoly(e)),MathAssert.assert(n.isSameDirection(t.getDz()),`构造拉伸体:限定拉伸方向和coordinate z轴方向必须同向
193
+
194
+ `),MathAssert.assert(()=>a.isValid(),`构造拉伸体:输入polygon 不合法
195
+
196
+ ${a}`),MathAssert.assert(r>s+Tol.NUMBER,`构造拉伸体:endHeight必须大于startHeight
197
+
198
+ `);for(const E of a.getLoops()){const u=E.getAllCurves();for(let Q=0;Q<u.length;Q++)u[Q].getEndPt().equals(u[(Q+1)%u.length].getStartPt(),Tol.LENGTH)||MathAssert.assert(!1,`构造拉伸体:Polygon本身误差过大,请处理${a}`)}let I=[a];i&&(I=SearchGraph.polygonToPolygonExes(a));const c=new BrepBody;for(let E=0;E<=I.length-1;E++){const u=I[E],Q={topVertexs:[],bottomVertexs:[],topEdges:[],sideEdges:[],bottomEdges:[],topFace:new Face(exports.Plane.XOY(),!0),sideFaces:[],bottomFace:new Face(exports.Plane.XOY(),!0)},p=this.extrudePolygonEx(t,u,n,s,r,Q);p.getEdges().forEach(w=>{c.addEdge(w)}),p.getFaces().forEach(w=>{c.addFace(w)}),p.getVertexs().forEach(w=>{c.addVertex(w)}),g&&g.push(Q)}return BodyUtil.mergeCoincideVertexAndEdges(c),c}static extrudePolygonEx(t,e,n,s,r,i){const o=new BrepBody,g=new exports.Plane(t),a=n.clone().normalize(),I=g.clone().translate(a.multiplied(s)),c=g.clone().translate(a.multiplied(r)),E=e.getLoops().slice(),u=E.findIndex(y=>y.isAnticlockwise());if(u>0){const y=E[u];E.splice(u,1),E.unshift(y)}const Q=new Face(I,!1);o.addFace(Q),i.bottomFace=Q;const p=new Face(c,!0);o.addFace(p),i.topFace=p;const w=new Map;for(const y of E){const M=new Wire;p.addWire(M);const N=new Wire;Q.addWire(N);const S=[],R=[],U=y.getAllCurves();for(let z=0;z<U.length;z++){const tA=U[z].getStartPt(),nA=(z+U.length-1)%U.length,IA=SmoothUtil.isSameSmoothPoly(U[z],U[nA]),iA=o.createVertex(I.getPtAt(tA));IA&&iA.setSmooth(!0),R.push(iA);const W=o.createVertex(c.getPtAt(tA));IA&&W.setSmooth(!0),S.push(W)}i.topVertexs.push(S),i.bottomVertexs.push(R);const b=[],G=[],O=[],H=[];for(let z=0;z<U.length;z++){const tA=U[z],nA=S[z],IA=S[(z+1)%S.length],iA=R[z],W=R[(z+1)%R.length];let oA;if(tA.isArc2d()&&tA.isEqualAB()){const lA=tA,aA=I.getPtAt(lA.getCenter()),wA=lA.isCCW()?a:a.clone().reverse(),YA=exports.Arc3.makeArcByStartEndPoints(aA,lA.getRadius(),wA,iA.getPoint(),W.getPoint(),!0);lA.getRange().getLength()<1e-6&&YA.setRange(YA.getRange().min,YA.getRange().min+lA.getRange().getLength()),oA=YA}else if(tA.isArc2d()){const lA=tA,aA=I.getPtAt(lA.getCenter()),wA=exports.Arc3.makeEllipseByFivePoints(aA,I.getPtAt(lA.getPtAt(0)),I.getPtAt(lA.getPtAt(Math.PI*.5)),I.getPtAt(lA.getStartPt()),I.getPtAt(lA.getEndPt()));wA&&lA.getRange().getLength()<1e-6&&wA.setRange(wA.getRange().min,wA.getRange().min+lA.getRange().getLength()),oA=wA}else if(tA.isLine2d())oA=new exports.Ln3(iA.getPoint(),W.getPoint());else if(tA.isNurbsCurve2d())oA=exports.NurbsCurve3.makeByControlPoints(tA.getControlPoints().map(lA=>I.getPtAt(lA)),tA.getDegree(),tA.getKnots(),tA.getWeights()),oA.setRange(tA.getRange());else{const lA=tA.discrete();oA=exports.NurbsCurve3.makeByInterpolationPts(lA.map(aA=>I.getPtAt(aA)))}const hA=o.createEdge(oA,iA,W);G.push(hA);const dA=oA.clone().translate(a.multiplied(r-s)),PA=o.createEdge(dA,nA,IA);b.push(PA),M.addCoedge3d(new Coedge3d(PA,!0)),N.addCoedge3d(new Coedge3d(hA,!0));let yA=w.get(iA.tag+nA.tag);yA||(yA=o.createLineEdge(iA,nA),iA.getSmooth()&&yA.setSmooth(!0),w.set(iA.tag+nA.tag,yA)),O.push(yA);let _A=w.get(W.tag+IA.tag);_A||(_A=o.createLineEdge(W,IA),W.getSmooth()&&_A.setSmooth(!0),w.set(W.tag+IA.tag,_A));const LA=new Wire([new Coedge3d(hA,!0),new Coedge3d(_A,!0),new Coedge3d(PA,!1),new Coedge3d(yA,!1)]);let BA;if(tA.isArc2d()){const lA=exports.Cylinder.makeCylinderByArc3d(oA);tA.isCCW()?BA=new Face(lA,!0,[LA]):(LA.reverse(),BA=new Face(lA,!1,[LA]))}else if(tA.isLine2d()){const lA=new exports.Plane(iA.getPoint(),new exports.Vec3(iA.getPoint(),W.getPoint()),new exports.Vec3(iA.getPoint(),nA.getPoint()));BA=new Face(lA,!0,[LA])}else throw new Error("not supported");o.addFace(BA),H.push(BA)}i.topEdges.push(b),i.bottomEdges.push(G),i.sideEdges.push(O),i.sideFaces.push(H)}return Q.getSurface().reverse(),Q.getWires().forEach(y=>y.reverse()),Q.setSameDirWithSurface(!0),o}static _decomposeSmoothPoly(t){const e=new exports.Polygon;return t.getLoops().forEach(n=>{const s=SmoothUtil.decomposeSmoothPoly(n.getAllCurves());e.addLoop(new exports.Loop(s),!1)}),e}}class SweepBody{constructor(t,e,n,s=!0,r=!1,i){this.coordinate=t,this.polygon2d=e,this.path3d=n,this.adjustProfile=s,this.adjustPath=r,this.topoTrack=i,this._pathClosed=!0,this._profile2ds=[],this._profileReverse=!1}execute(){const t=new BrepBody;this._init();let e;try{const n=this._calcSweepCurves();e=this._trimSweepCurves(n)}catch{return t}return this._buildSweepBody(e,t),t}_init(){!this.polygon2d.getLoops().length||!this.path3d.length||(this._decomposeSmoothPoly(),this._pathClosed=!0,this.path3d[this.path3d.length-1].getEndPt().equals(this.path3d[0].getStartPt(),Tol.LENGTH)||(this._pathClosed=!1),MathAssert.assert(()=>this._pathIsValid(),`构造扫略体:输入路径中曲线类型不支持
199
+
200
+ ${this.path3d}`),MathAssert.assert(()=>this._profileIsValid(),`构造扫略体:输入轮廓中曲线类型不支持
201
+
202
+ ${this.polygon2d}`),this._adjustPath(),this._adjustProfile())}_decomposeSmoothPoly(){this.path3d=SmoothUtil.decomposeSmoothPoly(this.path3d),this.polygon2d.getLoops().forEach(t=>{const e=SmoothUtil.decomposeSmoothPoly(t.getAllCurves());this._profile2ds.push(e)})}_pathIsValid(){return this.path3d.every(t=>t.isArc3d()||t.isLine3d())}_profileIsValid(){for(const t of this._profile2ds)for(const e of t)if(!e.isLine2d())return!1;return!0}_adjustPath(){if(!this.adjustPath)return;const t=this.coordinate.getWorldPtAt(this.polygon2d.getCentroidPoint()),e=this.path3d.map((I,c)=>({d:D.ptToCurve3d(t,I),i:c}));e.sort((I,c)=>I.d-c.d);const n=[e.shift()];let s;for(;;){const I=e.shift();if(!I)break;if(this.path3d[n[n.length-1].i].getStartTangent().isParallel(this.path3d[I.i].getStartTangent())){n.push(I);continue}s=I;break}if(!s)return;const r=n[0],i=s,o=this.path3d[r.i].getStartTangent().cross(this.coordinate.getDz()).getLength(),g=this.path3d[i.i].getStartTangent().cross(this.coordinate.getDz()).getLength();let a=o<g?r.i:i.i;if(this._pathClosed)for(;a;)this.path3d.push(this.path3d.shift()),a--;else{this.coordinate.translate(new exports.Vec3(this.path3d[a].getStartPt(),this.path3d[0].getStartPt()));const I=this.path3d[a].getStartTangent(),c=this.path3d[0].getStartTangent();if(I.isSameDirection(c))return;let E;if(I.isParallel(c)){const Q=new exports.Vec3(this.path3d[a].getStartPt(),this.path3d[0].getStartPt()).normalize();E=I.cross(Q)}else E=I.cross(c);const u=exports.Matrix4.makeRotate(this.path3d[0].getStartPt(),E,I.angleTo(c,E));this.coordinate.transform(u)}}_adjustProfile(){const t=this.path3d[0],e=t.getProjectedPtBy(this.coordinate.getOrigin()),n=t.getTangentAt(t.getParamAt(e)),s=n.dot(this.coordinate.getDz())>=0;if(!n.isParallel(this.coordinate.getDz())){if(!this.adjustProfile)throw new Error("扫略:轮廓曲线不合法");const r=exports.Plane.makeByPtNormal(e,n),i=r.getProjectedPtBy(this.coordinate.getOrigin()),g=r.getProjectedPtBy(this.coordinate.getOrigin().add(this.coordinate.getDx())).subtracted(i).normalize(),a=new exports.Coord3(i,g,n.cross(g)),I=new exports.Plane(a);for(const c of this._profile2ds){const E=c.map(u=>{const Q=u,p=I.getUVAt(this.coordinate.getWorldPtAt(Q.getStartPt())),w=I.getUVAt(this.coordinate.getWorldPtAt(Q.getEndPt())),y=new exports.Ln2(p,w);return SmoothUtil.copySmoothInfo(Q,y),y});c.splice(0,c.length),c.push(...E)}this.coordinate=a}LoopArea.areaOfLoop(this._profile2ds[0])>=0!==s&&(this._profileReverse=!0,this._profile2ds=this._profile2ds.map(r=>(r.forEach(i=>i.reverse()),r.reverse())))}_calcSweepCurves(){const t=[];let e=this.coordinate.clone();for(let n=0;n<this.path3d.length;n++){const s=new exports.Plane(e),r=this._profile2ds.map(I=>I.map(c=>s.getCurve3d(c))),i=this.path3d[n],o=i.getProjectedPtBy(s.getOrigin()),g=i instanceof exports.Arc3?new exports.Plane(i.getCenter(),i.getNormal()):void 0,a=[];for(let I=0;I<r.length;I++){const c=r[I],E=[];for(let u=0;u<c.length;u++){const Q=c[u].getStartPt();if(i instanceof exports.Arc3){const p=g.getProjectedPtBy(Q);if(Util.isNearlySmallerOrEqual(p.subtracted(i.getCenter()).dot(i.getStartPt().subtract(i.getCenter())),0))throw new Error("扫略:轮廓曲线计算失败");const w=p.distanceTo(i.getCenter()),y=i.getCenter().add(i.getEndPt().subtract(i.getCenter()).normalize().multiply(w)),M=exports.Arc3.makeArcByStartEndPoints(i.getCenter(),w,i.getNormal(),p,y,!0);M.translate(Q.subtracted(p)),E.push(M)}else{const p=Q.subtracted(o);E.push(i.clone().translate(p))}}a.push(E)}if(t.push(a),n<this.path3d.length-1){const I=this.path3d[n+1];let c=new exports.Matrix4;i instanceof exports.Arc3?c=exports.Matrix4.makeRotate(i.getCenter(),i.getNormal(),(i.getRange().max-i.getParamAt(o))/i.getRadius()):c=exports.Matrix4.makeTranslate(i.getEndPt().subtracted(o)),e=e.transform(c);const E=i.getTangentAt(i.getRange().max),u=I.getTangentAt(I.getRange().min),Q=E.cross(u);if(!Q.isZero()){Q.normalize();const p=E.angleTo(u,Q);c=exports.Matrix4.makeRotate(I.getStartPt(),Q,p),e=e.transform(c)}}}return t}_trimSweepCurves(t){const e=t.map((n,s)=>n.map(r=>r.map(i=>({path:this.path3d[s],originCurve:i,extendCurve:this._extendCurve(i)}))));for(let n=1;n<e.length;n++)for(let s=0;s<e[n].length;s++)for(let r=0;r<e[n][s].length;r++){const i=e[n-1][s][r],o=e[n][s][r];this._calculateTrimedPoint(i,o)}if(this._pathClosed&&this.path3d.length>1)for(let n=0;n<e[0].length;n++)for(let s=0;s<e[0][n].length;s++){const r=e[e.length-1][n][s],i=e[0][n][s];this._calculateTrimedPoint(r,i)}else for(let n=0;n<e[0].length;n++)for(let s=0;s<e[0][n].length;s++){const r=e[e.length-1][n][s],i=e[0][n][s];r.trimedEPt=r.originCurve.getEndPt(),i.trimedSPt=i.originCurve.getStartPt()}for(let n=0;n<e.length;n++)for(let s=0;s<e[n].length;s++)for(let r=0;r<e[n][s].length;r++)this._calculateTrimedCurve(e[n][s][r]);return e.map(n=>n.map(s=>s.map(r=>r.trimedCurve)))}_calculateTrimedPoint(t,e){if(t.originCurve.getEndPt().equals(e.originCurve.getStartPt())){t.trimedEPt=t.originCurve.getEndPt(),e.trimedSPt=e.originCurve.getStartPt();return}const n=X.curve3ds(t.extendCurve,e.extendCurve);if(!n.length)throw new Error("扫略:裁剪点计算失败");if(n.length===1&&(t.trimedEPt=n[0].point,e.trimedSPt=n[0].point),n.length>1)if(t.originCurve.isLine3d()&&e.originCurve.isArc3d()||t.originCurve.isArc3d()&&e.originCurve.isLine3d()){const s=t.path.getEndPt();n.sort((i,o)=>i.point.distanceTo(s)-o.point.distanceTo(s));const r=n[0].point;t.trimedEPt=r,e.trimedSPt=r}else if(t.originCurve.isArc3d()&&e.originCurve.isArc3d()){const s=t.path.getEndPt();n.sort((i,o)=>i.point.distanceTo(s)-o.point.distanceTo(s));let r=n[0].point;if(Util.isNearlyEqual(n[0].point.distanceTo(s),n[1].point.distanceTo(s))){const i=t.path.getMidPt();n[0].point.distanceTo(i)>n[1].point.distanceTo(i)&&(r=n[1].point)}t.trimedEPt=r,e.trimedSPt=r}else throw new Error("扫略:选择裁剪点失败")}_calculateTrimedCurve(t){if(t.originCurve.getParamAt(t.trimedSPt)>t.originCurve.getParamAt(t.trimedEPt))throw new Error("扫略:裁剪点无效");if(t.originCurve.isLine3d())t.trimedCurve=new exports.Ln3(t.trimedSPt,t.trimedEPt);else if(t.originCurve.isArc3d()){const e=t.extendCurve,n=exports.Arc3.makeArcByCircleAndPts(e,t.trimedSPt,t.trimedEPt,!0);t.trimedCurve=n}else throw new Error("不支持的曲线类型")}_buildSweepBody(t,e){const n=new Map,s=new Map,r=[];for(let a=0;a<t.length;a++){let I;!this._pathClosed&&a===0?I=!1:I=SmoothUtil.isSameSmoothPoly(this.path3d[a],this.path3d[(a+this.path3d.length-1)%this.path3d.length]),r.push(I)}const i=[];for(let a=0;a<t[0].length;a++){const I=[];for(let c=0;c<t[0][a].length;c++){const E=SmoothUtil.isSameSmoothPoly(this._profile2ds[a][c],this._profile2ds[a][(c+t[0][a].length-1)%t[0][a].length]);I.push(E)}i.push(I)}for(let a=0;a<t.length;a++){let I=0;for(let c=0;c<t[a].length;c++)for(let E=0;E<t[a][c].length;E++){const u=t[a][c][E],Q=e.createVertex(u.getStartPt());n.set(`${a}-${I++}`,Q),(r[a]||i[c][E])&&Q.setSmooth(!0)}if(a===t.length-1&&!this._pathClosed){I=0;for(let c=0;c<t[a].length;c++)for(let E=0;E<t[a][c].length;E++){const u=t[a][c][E],Q=e.createVertex(u.getEndPt());n.set(`${a+1}-${I++}`,Q),i[c][E]&&Q.setSmooth(!0)}}}for(let a=0;a<t.length;a++){let I=0;for(let c=0;c<t[a].length;c++){const E=t[a][c].length;for(let u=0;u<E;u++){const Q=`${a}-${u+I}`,p=`${a}-${(u+1)%E+I}`,w=e.createLineEdge(n.get(Q),n.get(p));s.set(`${Q}>${p}`,w),r[a]&&w.setSmooth(!0)}I+=E}if(a===t.length-1&&!this._pathClosed){I=0;for(let c=0;c<t[a].length;c++){const E=t[a][c].length;for(let u=0;u<E;u++){const Q=`${a+1}-${u+I}`,p=`${a+1}-${(u+1)%E+I}`,w=e.createLineEdge(n.get(Q),n.get(p));s.set(`${Q}>${p}`,w)}I+=E}}}const o=this._pathClosed?this.path3d.length:this.path3d.length+1;for(let a=0;a<t.length;a++){let I=0;for(let c=0;c<t[a].length;c++){for(let E=0;E<t[a][c].length;E++){const u=`${a}-${E+I}`,Q=`${(a+1)%o}-${E+I}`,p=e.createEdge(t[a][c][E],n.get(u),n.get(Q));s.set(`${u}>${Q}`,p),i[c][E]&&p.setSmooth(!0)}I+=t[a][c].length}}let g;if(this.topoTrack){g=[];for(let a=0;a<t[0][0].length;a++){const I=[];g?.push(I)}}for(let a=0;a<t.length;a++){const I=(a+1)%o;let c=0;for(let E=0;E<t[a].length;E++){const u=t[a][E].length;for(let Q=0;Q<t[a][E].length;Q++){const p=(Q+1)%u,w=`${a}-${Q+c}`,y=`${a}-${p+c}`,M=`${I}-${Q+c}`,N=`${I}-${p+c}`,S=[new Coedge3d(s.get(`${w}>${y}`),!0),new Coedge3d(s.get(`${y}>${N}`),!0),new Coedge3d(s.get(`${M}>${N}`),!1),new Coedge3d(s.get(`${w}>${M}`),!1)],R=t[a][E][Q],U=t[a][E][p];let b,G=!0;if(this.path3d[a]instanceof exports.Arc3){const z=R,tA=U,nA=tA.getCenter().subtracted(z.getCenter());if(nA.isZero()){const iA=U.getStartPt().subtracted(R.getStartPt()).normalize().cross(R.getStartTangent()).normalize();b=new exports.Plane(R.getStartPt(),iA)}else if(Util.isNearlyEqual(z.getRadius(),tA.getRadius()))b=exports.Cylinder.makeCylinderByArc3d(z),nA.dot(z.getNormal())>0&&(G=!1);else throw new Error("unexpected case")}else{const z=new exports.Vec3(R.getStartPt(),U.getStartPt()).normalize(),tA=U.toVector3().normalized(),IA=z.cross(tA).normalize().cross(tA);b=new exports.Plane(U.getStartPt(),tA,IA)}const O=new Wire(S);G||O.reverse();const H=new Face(b,G,[O]);g?.[Q].push(H),e.addFace(H)}c+=u}}if(this.topoTrack){const a=this.polygon2d.getAllCurves();a.forEach((I,c)=>{const E=this._profileReverse?a.length-c-1:c;this.topoTrack?.set(a[E],g[c])})}if(!this._pathClosed){{let I=0;const c=[];for(let p=0;p<t[0].length;p++){const w=t[0][p].length,y=[];for(let M=0;M<w;M++)y.push(new Coedge3d(s.get(`0-${M+I}>0-${(M+1)%w+I}`),!0));c.push(new Wire(y)),I+=w}const E=c[0].getCoedge3ds()[0].getStartVertex().getPoint(),u=new exports.Plane(E,this.coordinate.getDx(),this.coordinate.getDy()),Q=new Face(u,!1,c);e.addFace(Q),this.topoTrack&&this.topoTrack.set(1,[Q])}{const a=t.length;let I=0;const c=[];for(let y=0;y<t[a-1].length;y++){const M=t[a-1][y].length,N=[];for(let S=0;S<M;S++)N.push(new Coedge3d(s.get(`${a}-${S+I}>${a}-${(S+1)%M+I}`),!0));c.push(new Wire(N)),I+=M}const E=t[t.length-1][0].map(y=>y.getEndPt()),u=this._getPointsCCWNormal(E);if(!u)throw new Error("sweep: get normal failed!");const Q=c[0].getCoedge3ds()[0].getStartVertex().getPoint(),p=new exports.Plane(Q,u),w=new Face(p,!0,c);e.addFace(w),this.topoTrack&&this.topoTrack.set(0,[w])}}}_extendCurve(t){if(t instanceof exports.Ln3)return new exports.Ln3(t.getOrigin(),t.getDirection(),[-CONST.MODEL_MAX_LENGTH,CONST.MODEL_MAX_LENGTH]);if(t instanceof exports.Arc3)return t.getCircle();throw new Error("不支持的曲线类型")}_getPointsCCWNormal(t){const e=this._getNormalOfPtSequence(t);if(!e)return;const n=new exports.Plane(t[0],e),s=t.map(i=>n.getUVAt(i));return new exports.Loop(s).isAnticlockwise()?e:e.reverse()}_getNormalOfPtSequence(t){let e;for(let n=0,s=t.length;n<s;n++){const r=t[n];for(let i=n+1;i<s+n;i++){const o=t[i%s];for(let g=i+1;g<s+n;g++){const a=t[g%s];if(e=this._getNormalOfThreePoints(r,o,a),e)break}if(e)break}if(e)break}return e}_getNormalOfThreePoints(t,e,n){const s=e.subtracted(t),r=n.subtracted(t),i=n.subtracted(e);if(Util.isNearly0(s.getLength())||Util.isNearly0(r.getLength())||Util.isNearly0(i.getLength()))return;const o=s.cross(r);if(!o.isZero())return o.normalize()}}class BasicBodyBuilder{static makeCubic(t,e,n=e,s=e){const r=exports.Loop.createByRectangle(exports.Vec2.rO(),{x:e,y:n});return ExtrudeBody.execute(t,new exports.Polygon([r]),t.getDz(),0,s)}}class BodyBuilder{static createCubic(t,e,n=e,s=e){return BasicBodyBuilder.makeCubic(t,e,n,s)}static extrude(t,e,n,s,r,i=!0,o){return ExtrudeBody.execute(t,e,n,s,r,i,!1,o)}static sweep(t,e,n,s=!0,r=!1,i){return new SweepBody(t.clone(),e,n,s,r,i).execute()}}var PtBodyPositionType=(l=>(l[l.INSIDE=0]="INSIDE",l[l.OUTSIDE=1]="OUTSIDE",l[l.ON_VERTEX=2]="ON_VERTEX",l[l.ON_EDGE=3]="ON_EDGE",l[l.ON_FACE=4]="ON_FACE",l))(PtBodyPositionType||{});class PtBodyPosition{static PJ(t,e,n=Tol.DEFAULT.lengthEps,s=!1,r){const i=r?r.bodyBox:e.getBBox();if(!i.containsPt(t,n))return 1;if(s){const p=i.getSquareDistanceTo(t);return Util.isNearly0(p,n)?4:0}const o=new exports.Ln3(t,new exports.Vec3(i.max.x,t.y,t.z));let g=[];const a=r?.faceBoxMap;for(const p of e.getFaces()){const w=a?.get(p)||p.getBBox();this._isIntersectBox(o,w,n)&&g.push(p)}const I=new Set,c=new Set;for(const p of g){for(const w of p.getVertexes())I.has(w)||I.add(w);for(const w of p.getEdges())c.has(w)||c.add(w)}for(const p of I)if(p.getPoint().equals(t,n))return 2;for(const p of c)if(p.getCurve().containsPt(t,n))return 3;let E=!1,u=[],Q=0;for(;!E;){E=!1;let p=[];for(const w of g){const y=w.getSurface();if(y.containsPt(t,n)&&y.isPlane()&&y.getNorm().isPerpendicular(o.getDirection(),n)){E=!0,p=[];break}const M=new Tol(n),N=X.curveSurfaceAll(o,y,M),S=new exports.Polygon(w.getWires().map(R=>R.calcLoop()));for(const R of N){if(R.overlapRange){E=!0;continue}const U=R.surfaceUV;this._calUVPosition(new exports.Vec2(U),S,y,n)!==PtLoopPJType.OUT&&p.push(R.point)}}u=p;for(let w=0;w<u.length;++w){if(t.equals(u[w],n))return 4;for(let y=w+1;y<u.length;++y)if(u[w].equals(u[y],n)){E=!0;break}if(E)break}if(E){u=[],g=e.getFaces().map(y=>y);const w=this._farthestDis(t,i);o.setDirection({x:Math.random(),y:Math.random(),z:Math.random()}),o.setRange(0,w),E=!1}if(Q>10){E=!0;break}Q++}return u.length%2===0?1:0}static _isIntersectBox(t,e,n){const s=e.min,r=e.max,i=t.getStartPt(),o=t.getEndPt();return!(Util.isNearlyBigger(i.x,r.x,n)||Util.isNearlySmaller(o.x,s.x,n)||Util.isNearlySmaller(i.y,s.y,n)||Util.isNearlyBigger(i.y,r.y,n)||Util.isNearlySmaller(i.z,s.z,n)||Util.isNearlyBigger(i.z,r.z,n))}static _calUVPosition(t,e,n,s){if(n.isCylinder()){const i=e.getAllCurves().map(a=>a.getStartPt());let o=CONST.MAX_INTEGER,g=-CONST.MAX_INTEGER;for(const a of i)o>a.x&&(o=a.x),g<a.x&&(g=a.x);for(;t.x>g;)t.x-=Math.PI*2;for(;t.x<o;)t.x+=Math.PI*2}const r=[];for(const i of e.getLoops()){const o=new exports.Loop(i.getAllCurves().map(g=>g.discrete()).flat());r.push(o)}return PJ.ptToPolygon(t,new exports.Polygon(r),s)}static _farthestDis(t,e){const n=e.getCornerPts();let s=0;for(const r of n){const i=t.distanceTo(r);s<i&&(s=i)}return s}}var BrepBodyPositionType=(l=>(l.INTERSECT="INTERSECT",l.OUTSIDE="OUTSIDE",l.INSIDE="INSIDE",l.CONTAIN="CONTAIN",l.EQUAL="EQUAL",l.INSIDE_AND_TANGENCY="INSIDE_AND_TANGENCY",l.OUTSIDE_AND_TANGENCY="OUTSIDE_AND_TANGENCY",l.CONTAIN_AND_TANGENCY="CONTAIN_AND_TANGENCY",l))(BrepBodyPositionType||{});class BrepBodyPJ{static PJ(t,e,n=Tol.DEFAULT.lengthEps,s=!1,r=!1){let i=t;if(s){const g=t.getBBox(),a=g.getSize();i=BodyBuilder.createCubic(new exports.Coord3(g.getCenter()),a.x/2,a.y/2,a.z/2)}let o=e;if(r){const g=e.getBBox(),a=g.getSize();o=BodyBuilder.createCubic(new exports.Coord3(g.getCenter()),a.x/2,a.y/2,a.z/2)}return BrepBodyPJ.PositionJudgeComplex(i,o,n)}static PositionJudgeSimple(t,e,n=Tol.DEFAULT.lengthEps,s=!1,r=!1){const i=t.getBBox(),o=e.getBBox();if(!i.intersectsBox(o,n))return"OUTSIDE";if(s&&r)return i.containsBox(o,n)?"CONTAIN":o.containsBox(i,n)?"INSIDE":"INTERSECT";if(s){const g=i.getCornerPts();let a=!1,I=!1;for(const c of g){const E=PtBodyPosition.PJ(c,e,n);if(E===PtBodyPositionType.INSIDE&&(a=!0),E===PtBodyPositionType.OUTSIDE&&(I=!0),a&&I)return"INTERSECT"}return a&&!I?"INSIDE":!a&&I?"CONTAIN":"INSIDE"}if(r){const g=o.getCornerPts();let a=!1,I=!1;for(const c of g){const E=PtBodyPosition.PJ(c,t,n);if(E===PtBodyPositionType.INSIDE&&(a=!0),E===PtBodyPositionType.OUTSIDE&&(I=!0),a&&I)return"INTERSECT"}return a&&!I?"CONTAIN":!a&&I?"INSIDE":"CONTAIN"}return this._generalBodyPositionJudge(t,e,n)}static PositionJudgeComplex(t,e,n=Tol.DEFAULT.lengthEps){const s=new Box3,r=new Map;e.getFaces().forEach(u=>{const Q=u.getBBox();s.union(Q),r.set(u,Q)});const i=new Box3,o=new Map,g={in:0,out:0,on:0};let a=t.getFaces();a.length>CONST.MAX_ITER_NUM&&(a=a.slice().sort((u,Q)=>Math.random()>.5?-1:1));let I=0;for(const u of a){const Q=u.getBBox();if(i.union(Q),o.set(u,Q),!Q.intersectsBox(s)){if(g.out++,g.in>0)return"INTERSECT";continue}let p=!1;for(const N of r)if(Q.intersectsBox(N[1])){p=!0;break}let w=[u.getEdges()[0].getStartVertex().getPoint()];p&&(w=[u.getCentroidPoint(),...u.discrete().vertices.map(N=>new exports.Vec3(N))],w.length>CONST.MAX_ITER_NUM&&w.sort((N,S)=>Math.random()>.5?-1:1));const y={in:0,out:0,on:0};let M=!1;for(const N of w){const S=PtBodyPosition.PJ(N,e,n,!1,{bodyBox:s,faceBoxMap:r});if(S===PtBodyPositionType.INSIDE?y.in++:S===PtBodyPositionType.OUTSIDE?y.out++:y.on++,y.in>0&&y.out>0)return"INTERSECT";if(y.on>5&&y.in===0&&y.out===0)break;if(I++,I>CONST.MAX_ITER_NUM){M=!0;break}}if(y.in>0?g.in++:y.out>0&&g.out++,y.on>0&&g.on++,g.in>0&&g.out>0)return"INTERSECT";if(g.on>CONST.NORMAL_ITER_NUM&&i.equals(s))return"EQUAL";if(M)break}if(g.in===0&&g.out===0)return"EQUAL";if(g.in>0)return g.on===0?"INSIDE":"INSIDE_AND_TANGENCY";if(g.on===0){const u=e.getFaces()[0].getEdges()[0].getStartVertex().getPoint();return PtBodyPosition.PJ(u,t,n)===PtBodyPositionType.INSIDE?"CONTAIN":"OUTSIDE"}let c=e.getVertexs().map(u=>u.getPoint());return c.length<g.on+g.out&&(c=e.getEdges().flatMap(u=>u.discrete())),c.some(u=>PtBodyPosition.PJ(u,t,n,!1,{bodyBox:i,faceBoxMap:o})===PtBodyPositionType.INSIDE)?"CONTAIN_AND_TANGENCY":"OUTSIDE_AND_TANGENCY"}static _generalBodyPositionJudge(t,e,n=Tol.DEFAULT.lengthEps){const s=t.getVertexs(),r=e.getVertexs(),i=s>r?r:s,o=s>r?t:e;let g=!1,a=!1;for(const E of i){const u=PtBodyPosition.PJ(E.getPoint(),o,n);if(u===PtBodyPositionType.INSIDE&&(g=!0),u===PtBodyPositionType.OUTSIDE&&(a=!0),g&&a)return"INTERSECT"}const I=t.getBBox(),c=e.getBBox();return I.containsBox(c,n)?"CONTAIN":c.containsBox(I,n)?"INSIDE":I.intersectsBox(c)?"INTERSECT":"OUTSIDE"}}function getOBBFromBox(l){const t=l.getSize();return{center:l.getCenter(),xVt:exports.Vec2.X(t.x/2),yVt:exports.Vec2.Y(t.y/2)}}function getOBBFromPoints(l,t=exports.Vec2.rX()){const e=t.angleTo(exports.Vec2.rX()),n=new Box2(l.map(g=>g.vecRotated(e))),s=getOBBFromBox(n),[r,i,o]=[s.center,s.xVt,s.yVt].map(g=>g.vecRotate(-e));return{center:r,xVt:i,yVt:o}}function isOBBSeparate(l,t,e){const n=t.center.subtracted(l.center),s=[l.xVt,l.yVt,t.xVt,t.yVt],r=(i,o)=>Math.abs(o.dot(i))/i.getLength();return s.some(i=>r(i,n)-r(i,l.xVt)-r(i,l.yVt)-r(i,t.xVt)-r(i,t.yVt)>e)}function isOBB3Separate(l,t,e){const n=t.center.subtracted(l.center),s=[l.xVt,l.yVt,l.zVt],r=[l.xVt,l.yVt,l.zVt],i=s.reduce((g,a,I)=>(r.forEach((c,E)=>{I!==E&&g.push(a.cross(c))}),g),[]),o=(g,a)=>Math.abs(a.dot(g))/g.getLength();return[...s,...r,...i].some(g=>o(g,n)-o(g,l.xVt)-o(g,l.yVt)-o(g,l.zVt)-o(g,t.xVt)-o(g,t.yVt)-o(g,t.zVt)>e)}function isConvexPolygon(l){if(l.getLoops().length>1)return!1;const t=l.getLoops()[0]?.getAllCurves().flatMap(e=>{if(e.isLine())return[e.getStartPt()];if(e.isArc()){const s=e.getRange(),r=s.getLength()/10;return[s.min,s.min+r,s.max-r].map(i=>e.getPtAt(i))}const n=e.discrete(DiscreteParam.LOW);return n.slice(0,n.length-1)});if(!t||t.length<=3)throw new Error("invalid loop!");for(let e=0;e<t.length;e++){const[n,s,r]=[0,1,2].map(i=>t[e+i]||t[e+i-t.length]);if(s.subtracted(n).cross(r.subtracted(s))<0)return!1}return!0}function getArcPtByTangent(l,t){const[e,n]=[l.getA(),l.getB()];let s=new exports.Vec2;if(t.x===0)s=new exports.Vec2(e,0);else if(t.y===0)s=new exports.Vec2(0,n);else{const o=e*e,g=n*n,a=t.y/t.x,I=g/Math.sqrt(a*a*o+g),c=-a*o*I/g;s=new exports.Vec2(c,I)}let r=l.isCCW()?1:-1;t.x===0?r*=t.y>0?1:-1:r*=t.x<0?1:-1,s.multiply(r);const i=l.getCoord().getWorldPtAt(s);if(l.getRange().containsPt(l.getParamAt(i)))return i}function getLeftRightInVector(l,t){if(t.getLength()===0)throw new Error("getLeftRightInVector: input invalid!");const e=new exports.Ln2(exports.Vec2.rO(),{x:t.y,y:-t.x});let n=1/0,s=-1/0,r,i;const o=g=>{const a=e.getParamAt(g);a>s&&(s=a,i=g),a<n&&(n=a,r=g)};if(l.forEach(g=>{g.isArc2d()?(o(g.getStartPt()),[t,t.reversed()].forEach(a=>{const I=getArcPtByTangent(g,a);I&&o(I)})):g.discrete().map(o)}),!i||!r)throw new Error("invalid input!");return{left:r,right:i}}function judgeByCrossDir(l,t,e){const n=l.dir.cross(t.dir),s=new exports.Plane(exports.Vec3.rO(),n),r=c=>{const{x:E,y:u}=c.coordinate.getLocalVectorAt(n),{left:Q,right:p}=getLeftRightInVector(c.polygon.getAllCurves(),new exports.Vec2(E,u)),w=[Q,p].map(U=>c.coordinate.getWorldPtAt(U)),y=c.dir.normalized(),[[M,N],[S,R]]=w.map(U=>[c.startHeight,c.endHeight].map(b=>{const G=U.added(y.multiplied(b));return s.getUVAt(G)}));return{obb:{center:M.midTo(R),xVt:S.subtracted(M).multiply(.5),yVt:N.subtracted(M).multiply(.5)},points:[M,N,S,R]}},[i,o]=[l,t].map(r);if(isOBBSeparate(i.obb,o.obb,e.tol.lengthEps))return BrepBodyPositionType.OUTSIDE,BrepBodyPositionType.OUTSIDE;const g=new exports.Coord2(o.obb.center,o.obb.xVt),a=new Box2(i.points.map(c=>g.getLocalPtAt(c))),I=new Box2(o.points);return a.containsBox(I)?BrepBodyPositionType.CONTAIN:(I.containsBox(a)&&BrepBodyPositionType.INSIDE,BrepBodyPositionType.INTERSECT)}function judgeByBody2Dir(l,t,e){const n=getLoops1InPlane2(l,t),s=n[0],r=t.coordinate.getLocalVectorAt(l.dir.normalized()),[i,o]=[l.startHeight,l.endHeight].map(R=>r.multiplied(R)),g=new exports.Vec2(t.coordinate.getLocalVectorAt(l.dir));let{left:a,right:I}=getLeftRightInVector(s,g),{left:c,right:E}=getLeftRightInVector(s,new exports.Vec2(g.y,-g.x));const u=[a,I,c,E].flatMap(R=>[i,o].map(U=>R.added(U))),Q=getOBBFromPoints(u,g),{lengthEps:p}=e.tol;if(isOBBSeparate(Q,getOBBFromBox(t.polygon.getBBox()),p))return BrepBodyPositionType.OUTSIDE;const w=new exports.Polygon,[y,M,N,S]=u;if(l.dir.isPerpendicular(t.dir))w.addLoop(new exports.Loop([y,N,S,M]));else{[a,I].forEach(O=>{const H=s.findIndex(z=>z.containsPt(O,p)&&!z.isStartPt(O,p)&&!z.isEndPt(O,p));if(H>0){const z=s[H],tA=z.split([z.getParamAt(O)]);s.splice(H,1,...tA)}});const[R,U]=[a,I].map(O=>s.findIndex(H=>H.isStartPt(O)));if(R<0||U<0)throw new Error("split loop error!");const[b,G]=[R,U].map((O,H)=>{const z=H?R:U;return O<z?s.slice(O,z):s.slice(O,s.length-1).concat(s.slice(0,O-1))});if(w.addLoop(new exports.Loop([...b,new exports.Ln2(N,S),...G,new exports.Ln2(M,y)])),n.length>1){const O=n.slice(1),[H,z]=[i,o].map(nA=>O.map(IA=>new exports.Loop(IA).translate(nA)));Bool2d.boolOperate(H,z,Bool2dType.intersect,p,e.tol.angleEps).forEach(nA=>w.addLoop(nA.loops[0]))}}return polygonPositionJudge(w,t.polygon,e)}function polygonPositionJudge(l,t,e){const[n,s]=[l,t].map(g=>g.getAllCurves());if(n.some(g=>s.some(a=>PJ.curveToCurve(g,a,e.tol.lengthEps,e.tol.angleEps)!==CurvesPJType.NOT_INTERSECT)))return BrepBodyPositionType.INTERSECT;const[i,o]=[l,t].map((g,a)=>{const I=g.getLoops()[0]?.getAllPoints()[0];if(!I.isVector2())throw new Error("invalid polygon!");const c=a?l:t;return PJ.ptToPolygon(I,c)});if(i===PtLoopPJType.OUT&&o===PtLoopPJType.OUT)return BrepBodyPositionType.OUTSIDE;if(i===PtLoopPJType.OUT&&o===PtLoopPJType.IN)return BrepBodyPositionType.CONTAIN;if(i===PtLoopPJType.IN&&o===PtLoopPJType.OUT)return BrepBodyPositionType.INSIDE;throw new Error("polygon position judge error!")}function getLoops1InPlane2(l,t){const[e,n]=[l,t].map(s=>new exports.Plane(s.coordinate));if(l.dir.isPerpendicular(t.dir)){const s=l.coordinate.getLocalVectorAt(t.dir);let{left:r,right:i}=getLeftRightInVector(l.polygon.loops[0].getAllCurves(),new exports.Vec2(s));const[o,g]=[r,i].map(a=>t.coordinate.getLocalPtAt(l.coordinate.getWorldPtAt(a)));return[[new exports.Ln2(o,g)]]}return l.polygon.loops.map(s=>s.getAllCurves().map(o=>e.getCurve3d(o)).map(o=>{const g=Project.curveToPlane(o,n);if(!g)throw new Error("project curve to plane error!");return g}))}class ExtrudeBodyPJ{static PJ(t,e,n={}){const s=n.tol||Tol.DEFAULT,r={tol:s};if(![t,e].every(a=>a.coordinate.getDz().isSameDirection(a.dir,s.angleEps)))throw new Error("invalid input: dir is not equal with dz!");if(t.dir.isSameDirection(e.dir,s.angleEps))return ExtrudeBodyPJ._sameDirectionJudeg(t,e,r);if(!n.ignoreOBBJudge){const[a,I]=[t,e].map(c=>{const E=c.polygon.getBBox(),u=getOBBFromBox(E),Q=c.dir.normalized(),p=(c.endHeight-c.startHeight)/2;return{center:c.coordinate.getWorldPtAt(u.center).add(Q.multiplied(c.startHeight+p)),xVt:c.coordinate.getWorldVectorAt(u.xVt),yVt:c.coordinate.getWorldVectorAt(u.yVt),zVt:Q.multiplied(p)}});if(isOBB3Separate(a,I,s.lengthEps))return BrepBodyPositionType.OUTSIDE}const o=ExtrudeBodyPJ._projectionJudge(t,e,r);if(o===BrepBodyPositionType.OUTSIDE)return BrepBodyPositionType.OUTSIDE;if(t.dir.isPerpendicular(e.dir,s.angleEps)||isConvexPolygon(t.polygon)&&isConvexPolygon(e.polygon))return o;const g=[t,e].map(a=>ExtrudeBody.execute(a.coordinate,a.polygon,a.dir,a.startHeight,a.endHeight));return BrepBodyPJ.PJ(g[0],g[1],s.lengthEps)}static _sameDirectionJudeg(t,e,n){const r=new exports.Ln3(t.coordinate.getOrigin(),t.dir,[0,1]).getParamAt(e.coordinate.getOrigin()),i=new Interval(t.startHeight,t.endHeight),o=new Interval(e.startHeight+r,e.endHeight+r),{lengthEps:g}=n.tol;if(i.intersected(o,g).length===0)return BrepBodyPositionType.OUTSIDE;i.equals(o,g);const a=new exports.Polygon(getLoops1InPlane2(t,e).map(c=>new exports.Loop(c))),I=polygonPositionJudge(a,e.polygon,n);return I===BrepBodyPositionType.INTERSECT||I===BrepBodyPositionType.OUTSIDE?I:i.containsInterval(o)&&I===BrepBodyPositionType.CONTAIN?BrepBodyPositionType.CONTAIN:o.containsInterval(i)&&I===BrepBodyPositionType.INSIDE?BrepBodyPositionType.INSIDE:BrepBodyPositionType.INTERSECT}static _projectionJudge(t,e,n){const s=judgeByBody2Dir(t,e,n);if(s===BrepBodyPositionType.OUTSIDE)return BrepBodyPositionType.OUTSIDE;const r=judgeByBody2Dir(e,t,n);if(r===BrepBodyPositionType.OUTSIDE)return BrepBodyPositionType.OUTSIDE;const i=judgeByCrossDir(t,e,n);if(i===BrepBodyPositionType.OUTSIDE)return BrepBodyPositionType.OUTSIDE;const o=[s,r,i];return o.every(g=>g===BrepBodyPositionType.CONTAIN)&&BrepBodyPositionType.CONTAIN,o.every(g=>g===BrepBodyPositionType.INSIDE)&&BrepBodyPositionType.INSIDE,BrepBodyPositionType.INTERSECT}}class BrepPJ{static isPtInFace(t,e,n=Tol.LENGTH){const s=e.getSurface(),r=s.getUVAt(t);if(!s.getPtAt(r).equals(t,n))return!1;const i=e.calcPolygon(),o=i.getBBox(),g=(c,E,u,Q)=>{const p=Q.getLength();return Util.isNearlyBigger(u,Q.max)?[c,c+p]:Util.isNearlySmaller(E,Q.min)?[c,c-p]:[c]},a=s.isUPeriodic()?g(r.x,o.min.x,o.max.x,s.getDomainU()):[r.x],I=s.isVPeriodic()?g(r.y,o.min.y,o.max.y,s.getDomainV()):[r.y];for(const c of a)for(const E of I)if(PtLoopPJType.OUT!==PJ.ptToPolygon(new exports.Vec2(c,E),i,n))return!0;return!1}static isPtAboveFace(t,e){const n=e.getSurface().clone();return e.getSurface().isPlane()?(e.getSameDirWithSurface()||n.reverse(),PJ.isPtAbovePlane(t,n)):(MathError.warn("只支持平面"),!1)}static pointBrepBodyPositionJudge(t,e,n=Tol.DEFAULT.lengthEps,s=!1){return PtBodyPosition.PJ(t,e,n,s)}static BrepBodiesPositionJudge(t,e,n=Tol.DEFAULT.lengthEps,s=!1,r=!1){return BrepBodyPJ.PJ(t,e,n,s,r)}static ExtrudeBodiesPositionJudge(t,e,n){return ExtrudeBodyPJ.PJ(t,e,n)}}class BaseBRepTopoError{constructor(t,e){this._shell=t,this._topoObj=e}getType(){return 0}canFix(){return!0}fix(){}message(){let t=`${this.constructor.name} - `;for(const e of Object.keys(this)){const n=this[e];if(!(n instanceof Shell))if(n instanceof TopoObject){let s="";n instanceof Face?s=n.getSurface().constructor.name:n instanceof Edge?s=n.getCurve().constructor.name:n instanceof Vertex?s=JSON.stringify(n.getPoint().data.map(r=>Math.round(r*100)/100)):n instanceof Coedge3d?s=`F_${n.getFace()?.getDebugTag()} E_${n.getEdge()?.getDebugTag()}`:n instanceof Wire&&(s=`F_${n.getFace()?.getDebugTag()}`),t+=`${n.constructor.name} ${n.getDebugTag()} ${s}; `}else n instanceof GeoElement&&(t+=`${JSON.stringify(n.dump())}; `)}return t}toString(){return this.message()}}class BRepShellEdgeSizeError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 2}canFix(){return!1}}class BRepShellEdgeError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._edge=n}getType(){return 3}canFix(){return!1}}class BRepShellVertexSizeError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 1}canFix(){return!1}}class BRepShellVertexError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._vertex=n}getType(){return 4}canFix(){return!1}}class BRepFaceParentError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 5}fix(){this._topoObj.setParent(this._shell)}}class BRepEmptyFaceError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 6}canFix(){return!1}}class BRepFaceNoSurfaceError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 7}canFix(){return!1}}class BRepWireParentError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._face=n}getType(){return 8}fix(){this._topoObj.setParent(this._face)}}class BRepEmptyWireError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 9}canFix(){return!1}}class BRepCoedgeParentError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._wire=n}getType(){return 10}fix(){this._topoObj.setParent(this._wire)}}class BRepCoedgePCurveError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._pCurve=n}getType(){return 13}canFix(){return!1}}class BRepCoedgeNotConnectedError extends BaseBRepTopoError{constructor(t,e,n,s){super(t,e),this._shell=t,this._topoObj=e,this._curCoedge=n,this._nxtCoedge=s}getType(){return 11}canFix(){return!1}}class BRepCoedgeEdgeError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._edge=n}getType(){return 12}canFix(){return!1}}class BRepEdgeParentError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 14}fix(){this._topoObj.setParent(this._shell)}}class BRepCurveNullError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 15}canFix(){return this._topoObj.getFaces().length===2&&!!this._topoObj.getStartVertex()&&!!this._topoObj.getEndVertex()}fix(){const t=this._topoObj.getFaces().filter(o=>o);if(t.length<2)return;const e=this._topoObj.getStartVertex().getPoint(),n=this._topoObj.getEndVertex().getPoint(),s=X.surfacesNearPoint(t[0].getSurface(),t[1].getSurface(),e,n.subtracted(e));if(!s)return;const r=s.getParamAt(e),i=s.getParamAt(n);r<i?s.setRange(r,i):(s.setRange(i,r),s.reverse()),this._topoObj.setCurve(s)}}class BRepCurveVertexError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._vertex=n}getType(){return 16}canFix(){return!1}}class BRepVertexParentError extends BaseBRepTopoError{constructor(t,e){super(t,e),this._shell=t,this._topoObj=e}getType(){return 17}fix(){this._topoObj.setParent(this._shell)}}class BRepVertexEdgeError extends BaseBRepTopoError{constructor(t,e,n){super(t,e),this._shell=t,this._topoObj=e,this._edge=n}getType(){return 18}canFix(){return!1}}class DiagnoseShell{static execute(t){const e=[],n=new Set,s=new Set;for(const r of t.getFaces())e.push(...this._validateFace(t,r)),r.getEdges().forEach(i=>{n.add(i),s.add(i.getStartVertex()),s.add(i.getEndVertex())});return n.size!==t.getEdges().length&&e.push(new BRepShellEdgeSizeError(t,t)),n.forEach(r=>{t.getEdgeByTag(r.tag)||e.push(new BRepShellEdgeError(t,t,r)),e.push(...this._validateEdge(t,r))}),s.size!==t.getVertexs().length&&e.push(new BRepShellVertexSizeError(t,t)),s.forEach(r=>{t.getVertexByTag(r.tag)||e.push(new BRepShellVertexError(t,t,r)),e.push(...this._validateVertex(t,r))}),e}static validate(t){const e=this.execute(t),n=e.map(s=>s.message());MathError.assert(e.length===0,"拓扑合法性检验失败",MathErrorType.Geometry,...n)}static _validateFace(t,e){const n=[];e.getParent()!==t&&n.push(new BRepFaceParentError(t,e)),e.getSurface()||n.push(new BRepFaceNoSurfaceError(t,e));const s=e.getWires();return s.length||n.push(new BRepEmptyFaceError(t,e)),s.forEach(r=>n.push(...this._validateWire(t,e,r))),n}static _validateWire(t,e,n){const s=[];n.getParent()!==e&&s.push(new BRepWireParentError(t,n,e));const r=n.getCoedge3ds();r.length||s.push(new BRepEmptyWireError(t,n));for(let i=0;i<r.length;i++){const o=(i+1)%r.length,g=r[i],a=r[o];g.getWire()!==n&&s.push(new BRepCoedgeParentError(t,g,n)),g.getEndVertex()!==a.getStartVertex()&&s.push(new BRepCoedgeNotConnectedError(t,n,g,a));const I=g.getEdge();(!I||I.getCoedge3ds().filter(E=>E===g).length!==1)&&s.push(new BRepCoedgeEdgeError(t,g,I));const c=g.getPCurve();if(c){const E=e.getSurface(),u=E.getPtAt(c.getStartPt()),Q=E.getPtAt(c.getEndPt());(!u.equals(g.getStartVertex().getPoint())||!Q.equals(g.getEndVertex().getPoint()))&&s.push(new BRepCoedgePCurveError(t,g,c))}}return s}static _validateEdge(t,e){const n=t.tolerance?t.tolerance+Tol.EDGE_LENGTH_EPS:Tol.EDGE_LENGTH_EPS,s=[];e.getParent()!==t&&s.push(new BRepEdgeParentError(t,e));const r=e.getStartVertex();r.getEdges().filter(g=>g===e).length!==1&&s.push(new BRepVertexEdgeError(t,r,e));const i=e.getEndVertex();i.getEdges().filter(g=>g===e).length!==1&&s.push(new BRepVertexEdgeError(t,i,e));const o=e.getCurve();return o?(o.getStartPt().equals(r.getPoint(),n)||s.push(new BRepCurveVertexError(t,e,r)),o.getEndPt().equals(i.getPoint(),n)||s.push(new BRepCurveVertexError(t,e,i))):s.push(new BRepCurveNullError(t,e)),s}static _validateVertex(t,e){const n=[];return e.getParent()!==t&&n.push(new BRepVertexParentError(t,e)),n}}class ShellModelingBase{constructor(t){this._contextShells=t}getContextShells(){return this._contextShells}execute(){const t=this._executeImpl(),{addShells:e,modifiedShellsMap:n}=t,s=[];if(e&&s.push(...e),n&&s.push(...n.keys()),this._validateResult()){const r=[];if(s.forEach(i=>r.push(...DiagnoseShell.execute(i))),r.length)throw t.topoErrors=r,new Error(`${this.constructor.name}操作后, Brep数据不合法`)}return t}_validateResult(){return!0}}function addShellModifyInfo(l,t,e,n,s){let r=l.get(t);r||(r={addFaces:[],deleteFaces:[],modifiedFaces:[]},l.set(t,r)),e&&r.addFaces.push(...e),n&&r.deleteFaces.push(...n),s&&r.modifiedFaces.push(...s)}function mergeShellModelingResult(l,t){if(!l.errorStr&&t.errorStr&&(l.errorStr=t.errorStr),t.addShells&&(l.addShells?l.addShells.push(...t.addShells):l.addShells=t.addShells),t.deleteShells){l.deleteShells=l.deleteShells||[];for(const e of t.deleteShells){if(l.addShells){const n=l.addShells.indexOf(e);if(n>-1){l.addShells.splice(n,1);continue}}l.deleteShells.push(e),l.modifiedShellsMap&&l.modifiedShellsMap.delete(e)}}if(t.modifiedShellsMap){l.modifiedShellsMap=l.modifiedShellsMap||new Map;for(const[e,n]of t.modifiedShellsMap){if(l.addShells&&l.addShells.indexOf(e)>-1)continue;const s=l.modifiedShellsMap.get(e);if(!s){l.modifiedShellsMap.set(e,n);continue}if(n.addFaces&&(s.addFaces?s.addFaces.push(...n.addFaces):s.addFaces=n.addFaces),n.deleteFaces){s.deleteFaces=s.deleteFaces||[];for(const r of n.deleteFaces){if(s.addFaces){const i=s.addFaces.indexOf(r);if(i>-1){s.addFaces.splice(i,1);continue}}if(s.deleteFaces.push(r),s.modifiedFaces){const i=s.modifiedFaces.indexOf(r);i>-1&&s.modifiedFaces.splice(i,1)}}}if(n.modifiedFaces){s.modifiedFaces=s.modifiedFaces||[];for(const r of n.modifiedFaces){if(s.addFaces){const o=s.addFaces.indexOf(r);if(o>-1){s.addFaces.splice(o,1);continue}}s.modifiedFaces.indexOf(r)<0&&s.modifiedFaces.push(r)}}}}if(t.evolutionMap)if(l.evolutionMap){const e=new Map,n=new Set;for(const[s,r]of l.evolutionMap){const i=new Set;for(const o of r){let g=t.evolutionMap.get(o);g?n.add(o):g=[o],g.forEach(a=>i.add(a))}e.set(s,Array.from(i))}for(const[s,r]of t.evolutionMap)if(!n.has(s)){const i=e.get(s);i?i.push(...r):e.set(s,r)}l.evolutionMap=e}else l.evolutionMap=new Map(t.evolutionMap)}function addEvolutionInfo(l,t,e){const n=t.tag||t;l.evolutionMap=l.evolutionMap||new Map;let s=l.evolutionMap.get(n);s||(s=[],l.evolutionMap.set(n,s)),s.push(e.tag)}function getHalfEdgeVertex(l,t=!0){return l.sameDir===t?l.edge.getEndVertex():l.edge.getStartVertex()}function isRoundTripHEdges(l,t){return!l||!t?!1:getHalfEdgeVertex(t,!1)===getHalfEdgeVertex(l)&&getHalfEdgeVertex(t)===getHalfEdgeVertex(l,!1)&&PJ.curvesOverlap(l.edge.getCurve(),t.edge.getCurve())===CurvesPJType.TOTALLY_OVERLAP}function getTangentOfHalfEdge(l,t,e){let n,s;const r=l.edge.getCurve(),i=r.getRange();if(!e||e<Tol.LENGTH){const o=l.sameDir===t?i.min:i.max;l.sameDir===!0?n=r.getTangentAt(o):n=r.getTangentAt(o).reversed()}else{const o=l.sameDir===t?l.edge.getStartVertex().getPoint():l.edge.getEndVertex().getPoint(),g=l.sameDir===t?i.min+e:i.max-e;s=r.getPtAt(g),t===!0?n=s.subtracted(o):n=o.subtracted(s)}return n}function findMaxTurning(l,t,e,n){if(!t.length)return;const s=getHalfEdgeVertex(l),r=[];for(const c of t)c.getStartVertex()===s&&r.push({edge:c,sameDir:!0}),c.getEndVertex()===s&&r.push({edge:c,sameDir:!1});let i=-10,o;const g=getTangentOfHalfEdge(l,!1,0).reversed(),a=e.getNormAtPoint(s.getPoint()),I=n?1:-1;for(const c of r){let E=I*g.angleTo(getTangentOfHalfEdge(c,!0,0),a);if(Util.isNearly0(E)||Util.isNearlyEqual(E,2*Math.PI)||Util.isNearlyEqual(E,-2*Math.PI))if(c.edge===l.edge)E=n?0:-2*Math.PI;else{const Q=getTangentOfHalfEdge(c,!0,.1);getTangentOfHalfEdge(l,!1,.1).reversed().angleTo(Q,a)>Math.PI?E=2*Math.PI*I:E=0}if(Util.isNearlyBigger(E,i)){o=c,i=E;continue}if(Util.isNearlyEqual(E,i)){const Q=getTangentOfHalfEdge(c,!0,.1),p=getTangentOfHalfEdge(o,!0,.1),w=getTangentOfHalfEdge(l,!1,.1).reversed(),y=w.angleTo(Q,a),M=w.angleTo(p,a);I*y>I*M&&(o=c)}}return o}function detectLoop(l,t,e,n,s){let r={edge:l,sameDir:t};const i=[],o=[];for(;r;){o.push(r),isRoundTripHEdges(i.length?i[i.length-1]:void 0,r)?i.pop():i.push(r);const a=s(getHalfEdgeVertex(r));if(!a||(r=findMaxTurning(r,a,e,n),!r)||o.some(I=>I.edge===r.edge&&I.sameDir===r.sameDir))break}let g=[];for(;i.length>=1;){if(getHalfEdgeVertex(i[0],!1)===getHalfEdgeVertex(i[i.length-1])){for(;i.length>=2&&isRoundTripHEdges(i[0],i[i.length-1]);)i.splice(0,1),i.pop();g=i.slice();break}i.shift()}if(!g.every(a=>a.edge!==l))return g}class VirtualLoop{constructor(){this.edges=[],this.bc3ds=[]}add(t,e){this.edges.push({edge:t,bSameDir:e});const n=t.getCurve().clone();e||n.reverse(),this.bc3ds.push(n)}getArea(t){if(this._area===void 0){this.bc2ds=[];for(const e of this.bc3ds)this.bc2ds.push(t.getCurve2d(e));this._area=LoopArea.areaOfLoop(this.bc2ds)}return this._area}prepareData(t){this.bc2ds=[],this.box=new Box3,this.approxPts=[];for(const e of this.bc3ds)this.bc2ds.push(t.getCurve2d(e)),this.approxPts.push(t.getUVAt(e.getStartPt())),this.approxPts.push(t.getUVAt(e.getEndPt())),this.box.union(e.getBBox())}reverse(){this.edges.forEach(t=>{t.bSameDir=!t.bSameDir}),this.edges.reverse(),this.bc3ds.forEach(t=>{t.reverse()}),this.bc3ds.reverse()}}class VirtualFace{constructor(t,e){this.loops=t,this.plane=e}outerLoop(){return this.loops[0]}addInnerLoop(t){this.loops.push(t)}}function toVirtualLoop(l){const t=new VirtualLoop;for(const e of l)t.add(e.edge,e.sameDir);return t}function detectLoopFromEdges(l,t,e,n,s){const i=detectLoop(l,t,e,n,o=>o.getEdges().filter(g=>s?s.has(g)&&e.containsCurve(g.getCurve()):e.containsCurve(g.getCurve())));if(i&&i.length)return toVirtualLoop(i)}function virtualLoopsToFaces(l,t,e=!1){const n=t,s=[];class r{constructor(E){this.loop=E,this.nesting=[],this.level=0}}function i(c){return c.clone().reverse()}function o(c,E,u){const Q=c.loop.getArea(E)>0,p=Q?E:i(E),w=c.loop,y=new VirtualFace([w],p);s.push(y),u.set(w,!0);let M=-1,N=0;for(const S of c.nesting)S.level>M&&(M=S.level,N++),!u.get(S.loop)&&(N===2?o(S,E,u):N===1&&(S.loop.getArea(E)>0!==Q?(y.addInnerLoop(S.loop),u.set(S.loop,!0)):o(S,E,u)))}function g(c,E){l.forEach(p=>p.prepareData(c));const u=E.map(p=>new r(p));function Q(p,w){for(const y of w.approxPts)if(PJ.ptToLoop(y,new exports.Loop(p.bc2ds)).type!==PtLoopPJType.IN)return!1;return!0}for(let p=0;p<u.length;++p){const w=u[p];for(let y=0;y<u.length;++y){if(p===y)continue;const M=u[y];Q(w.loop,M.loop)&&(w.nesting.push(M),M.level++)}}for(const p of u)p.nesting.sort((w,y)=>w.level-y.level);return u.filter(p=>p.level===0)}let a=g(t,l);if(e){const c=[];a.forEach(E=>{E.loop.getArea(n)>0?c.push(E):E.nesting.forEach(Q=>{Q.level--,c.push(Q)})}),a=c.filter(E=>E.level===0)}const I=new Map;l.forEach(c=>I.set(c,!1));for(const c of a)c.level===0&&o(c,n,I);return s}class ContinuousEdge{constructor(t,e,n){this._edges=t,this._flags=e,this._refCurve=n}getEdges(){return this._edges}getFlags(){return this._flags}getRefCurve(){return this._refCurve}isClose(){const t=this._edges.length;if(t<=1)return!1;const e=this._flags[0]?this._edges[0].getStartVertex().getPoint():this._edges[0].getEndVertex().getPoint(),n=this._flags[t-1]?this._edges[t-1].getEndVertex().getPoint():this._edges[t-1].getStartVertex().getPoint();return e.equals(n)}getBBox(){const t=new Box3;return this._edges.forEach(e=>{t.union(e.getBBox())}),t}getSmoothPoly(){if(!this._edges.length)return;const t=[];t.push(this._flags[0]?this._edges[0].getStartVertex().getPoint():this._edges[0].getEndVertex().getPoint());for(let e=0;e<this._edges.length;e++)t.push(this._flags[e]?this._edges[e].getEndVertex().getPoint():this._edges[e].getStartVertex().getPoint());return new exports.SmoothPoly3(t)}}class ContinuousFace{constructor(t){this._faces=t}getFaces(){return this._faces}isPlane(){if(!this._faces.length)return!1;const t=this._faces.map(e=>e.getSurface());return!!t.every(e=>e.isCoplanar(t[0]))}}const CE_ID="$CE_ID",CE_PREFIX="$CE_";class ContinuousUtil{static getAllInteractiveEdges(t){const n=t.getEdges().filter(o=>!this.isValidSmoothEdge(o)),s=new Set,r=new Set,i=new Set;for(const o of n){if(i.has(o))continue;const g=this._getContinuousEdges(o);g?(r.add(g),g.getEdges().forEach(a=>i.add(a))):s.add(o)}return{edges:s,contEdges:r}}static getSmoothCurvesFromWire(t){const e=new Set;t.getCoedge3ds().forEach(o=>e.add(o.getEdge()));const n={getEdges:()=>Array.from(e)},s=this.getAllInteractiveEdges(n),r=[],i=new Set;for(const o of t.getCoedge3ds()){const g=o.getEdge();if(s.edges.has(g)){r.push(o.getCurve());continue}for(const a of s.contEdges){if(i.has(a))continue;const I=a.getEdges().indexOf(g);if(I>-1){const c=a.getSmoothPoly();c&&r.push(a.getFlags()[I]===o.getSameDirWithEdge()?c:c.reverse()),i.add(a);break}}}return r}static isValidSmoothEdge(t){if(!t.getSmooth())return!1;let e=0;for(const n of t.getCoedge3ds())n.getWire()&&n.getFace()&&(e+=1);return e===2}static getAllInteractiveFaces(t){const n=t.getEdges().filter(g=>this.isValidSmoothEdge(g)),s=new Set;for(const g of n)g.getFaces().filter(a=>a).forEach(a=>s.add(a));const r=new Set,i=new Set,o=new Set;for(const g of s){if(o.has(g))continue;const a=this._getContinuousFaces(g);a&&(i.add(a),a.getFaces().forEach(I=>o.add(I)))}for(const g of t.getFaces())o.has(g)||r.add(g);return{faces:r,contFaces:i}}static addContinuousEdgeInfo(t,e){const n=new Map;for(const s of t){const r=e(s);if(!r)continue;let i=n.get(r);if(!i){const o=s.getParent();if(!o)continue;i=this._addContinuousEdge(o,r),n.set(r,i)}this._setContinuousEdgeId(s,i)}}static cloneContinuousEdgeInfo(t,e,n){const s=this._groupEdgesByContinuousEdgeId(t);for(const[r,i]of s){const o=i[0].getParent(),g=e(i[0])?.getParent();if(!o||!o.getData()||!g)continue;let a=o.getData()[r];if(!a)continue;a=a.clone(),n&&a.transform(n);const I=this._addContinuousEdge(g,a);i.forEach(c=>{const E=e(c);E&&this._setContinuousEdgeId(E,I)})}}static transformContinuousEdgeInfo(t,e){const n=this._groupEdgesByContinuousEdgeId(t);for(const[s,r]of n){const i=r[0].getParent();if(!i||!i.getData())continue;const o=i.getData()[s];o&&(i.getData()[s]=o.clone().transform(e))}}static transferContinuousEdgeInfo(t,e,n,s=!0){if(e===n||!e.getData())return;const r=this._groupEdgesByContinuousEdgeId(t);for(const[i,o]of r){const g=e.getData()[i];if(!g)continue;const a=this._addContinuousEdge(n,g.clone());o.forEach(I=>this._setContinuousEdgeId(I,a)),s&&this._removeContinuousEdgeInfo(e,i)}}static removeContinuousEdgeInfo(t){const e=this._groupEdgesByContinuousEdgeId(t);for(const[n,s]of e){const r=s[0].getParent();!r||!r.getData()||(this._removeContinuousEdgeInfo(r,n),s.forEach(i=>this._removeContinuousEdgeId(i)))}}static removeUnusedContinuousEdgeInfo(t){const e=t.getData();if(!e)return;const n=new Map;for(const r in e)r.startsWith(CE_PREFIX)&&n.set(r,0);if(n.size<=0)return;const s=t.getEdges();for(const r of s){const i=this._getContinuousEdgeId(r);i&&n.set(i,1)}for(const[r,i]of n)i===0&&delete e[r]}static getContinuousEdgeInfo(t){const e=this._getContinuousEdgeId(t),n=t.getParent();if(!(!e||!n||!n.getData()))return n.getData()[e]}static _addContinuousEdge(t,e){const n=this._createContinuousEdgeInfoId(t);let s=t.getData();return s||(s={},t.setData(s)),s[n]=e,n}static _createContinuousEdgeInfoId(t){const e=t.getData();if(!e)return`${CE_PREFIX}0`;let n=-1;for(const s in e){if(!s.startsWith(CE_PREFIX))continue;const r=parseInt(s.slice(CE_PREFIX.length),void 0);!Number.isNaN(r)&&r>n&&(n=r)}return CE_PREFIX+(n+1).toString()}static _removeContinuousEdgeInfo(t,e){const n=t.getData();n&&delete n[e]}static _setContinuousEdgeId(t,e){let n=t.getData();n||(n={},t.setData(n)),n[CE_ID]=e}static _getContinuousEdgeId(t){const e=t.getData();if(e)return e[CE_ID]}static _removeContinuousEdgeId(t){const e=t.getData();e&&e[CE_ID]&&delete e[CE_ID]}static _groupEdgesByContinuousEdgeId(t){const e=new Map;for(const n of t){const s=this._getContinuousEdgeId(n);if(!s)continue;let r=e.get(s);r||(r=[],e.set(s,r)),r.push(n)}return e}static _getNextContinuousEdge(t,e){const n=e?t.getEndVertex():t.getStartVertex();if(!n.getSmooth())return;const s=n.getEdges().filter(r=>r!==t&&!r.getSmooth());if(s.length===1)return s[0]}static _getConnectedContinuousEdges(t,e,n){const s=[],r=[];let i=t,o=e;do{const g=this._getNextContinuousEdge(i,o);if(!g||n.has(g)||g===t)break;n.add(g),o=(o?i.getEndVertex():i.getStartVertex())===g.getStartVertex(),s.push(g),r.push(o),i=g}while(i);return{edges:s,flags:r}}static _getContinuousEdges(t){const e=new Set,n=this._getConnectedContinuousEdges(t,!0,e),s=this._getConnectedContinuousEdges(t,!1,e);if(n.edges.length===0&&s.edges.length===0)return;s.edges.reverse(),s.flags=s.flags.map(o=>!o),s.edges.push(t),s.flags.push(!0);const r=s.edges.concat(n.edges),i=s.flags.concat(n.flags);return new ContinuousEdge(r,i,this.getContinuousEdgeInfo(t))}static _getContinuousFaces(t){if(!this._hasSmoothEdgeInFace(t))return;let e=[t];const n=new Set(e),s=new Set;for(;e.length>0;){const o=[];for(let g=0,a=e.length;g<a;g++){const I=e[g],c=this._getNextContinuousFaces(I,n,s);o.push(...c)}e=o}if(n.size===0)return;const r=Array.from(n);return new ContinuousFace(r)}static _hasSmoothEdgeInFace(t){return t.getEdges().some(e=>this.isValidSmoothEdge(e))}static _getNextContinuousFaces(t,e,n){const s=[],r=t.getEdges();for(let i=0,o=r.length;i<o;i++){const g=r[i];if(n.has(g))continue;n.add(g);const a=this._getNextContinuousFace(t,g);a&&!e.has(a)&&(e.add(a),s.push(a))}return s}static _getNextContinuousFace(t,e){if(!e.getSmooth())return;const n=e.getFaces().filter(s=>s&&s!==t);return n.length===1?n[0]:void 0}}class ShellModelingUtil{static divideFacesIntoCoplanarGroups(t,e=new exports.Vec3){const n=(o,g)=>{if(g.length===0)return!1;const a=o.getSurface();for(const I of g){const c=I[0].getSurface();if(CalcOverlap.isSurfacesCoplaner(a,c,Tol.DEFAULT))return I.push(o),!0}return!1},s=o=>{const g=e.subtracted(o.getOrigin()).dot(o.getNorm());return`${Math.round(Math.abs(g)*1e5)}`},r=[],i=new Map;for(const o of t){let g=r;const a=o.getSurface();if(a.isPlane()){const c=s(a);g=i.get(c),g||(g=[],i.set(c,g))}n(o,g)||g.push([o])}return r.push(...Array.from(i.values()).flat()),r}static divideFacesIntoConnectGroups(t,e=!0){let n;e?n=o=>{const g=new Set;return o.getVertexes().forEach(a=>a.getFaces().forEach(I=>g.add(I))),Array.from(g)}:n=o=>{const g=new Set;for(const a of o.getWires())a.getCoedge3ds().forEach(I=>I.getTwins().forEach(c=>g.add(c.getFace())));return Array.from(g)};const s=new Set(t),r=[],i=new Set;for(const o of t){if(i.has(o))continue;const g=this._getFaceGroup(o,n,s);g.forEach(a=>i.add(a)),r.push(Array.from(g))}return r}static detectFacesFromEdges(t,e){const n=new Set(t),s=[],r=new Map;n.forEach(g=>r.set(g,!0));for(const[g,a]of r)if(a){const I=detectLoopFromEdges(g,!0,e,!0,n);if(I&&I.edges.every(c=>r.get(c.edge))){s.push(I);for(const c of I.edges)r.get(c.edge)&&r.set(c.edge,!1),n.delete(c.edge)}}const i=g=>{const a=g.bc3ds.map(I=>e.getCurve2d(I));return new exports.Loop(a)};return ILoopsToPolygonExes.execute(s,!0,!1,i)}static getCoplanarPlane(t){let e;const n=[];for(const r of t)if(r instanceof exports.Arc3){const i=r;n.push(new exports.Plane(i.getCoord()))}else r instanceof exports.OffsetCurve3&&r.getBaseCurve()instanceof exports.Arc3&&n.push(new exports.Plane(r.getBaseCurve().getCoord()));if(n.length){e=n[0];for(let r=1;r<n.length;r++)if(!n[r].isCoplanar(e))return{plane:void 0,state:-1}}const s=[];for(const r of t){let i=[];r.isNurbsCurve3d()?i=r.getControlPoints().slice():i=r.discrete(),i.forEach(o=>{s.every(g=>!g.equals(o))&&s.push(o)})}return e||(e=exports.Plane.makeByPoints(s)),e?s.every(i=>e.containsPt(i))?{plane:e,state:1}:{plane:void 0,state:-1}:{plane:void 0,state:0}}static _getFaceGroup(t,e,n){const s=[],r=new Set;let i=0;for(s.push(t),r.add(t);i<s.length;){const o=s[i];for(const g of e(o))r.has(g)||!n.has(g)||(s.push(g),r.add(g));i++}return r}}function createShellGroupByFaces(l,t){const e=new Set(l);let n=1;const s=new Map,r=new Map;for(const i of e){const o=new Set([i.getShell()]);i.getVertexes().forEach(a=>{a.getFaces().forEach(c=>o.add(c.getShell()));const I=a.getParent();I&&o.add(I)}),i.getEdges().forEach(a=>{const I=a.getParent();I&&o.add(I)});let g=[];for(const a of o){const I=s.get(a);I&&g.push(I)}if(g=g.filter((a,I)=>g.indexOf(a)===I),g.length>=1){const a=r.get(g[0]);for(let I=1;I<g.length;I++)r.get(g[I]).forEach(c=>a.add(c)),r.delete(g[I]);o.forEach(I=>a.add(I)),a.forEach(I=>s.set(I,g[0]))}else{const a=n++;o.forEach(I=>s.set(I,a)),r.set(a,o)}}return Array.from(r.values())}function mergeShells(l,t,e){const n=createShellGroupByFaces(l),s=[],r=new Map;for(const i of n){if(i.size<=1)continue;let o;if(t){const a=Array.from(i).filter(I=>t.findIndex(c=>c===I)>0);a.length&&(o=a[0])}o||(o=Array.from(i).sort((a,I)=>I.getVertexs().length-a.getVertexs().length)[0]);const g=[];r.set(o,g);for(const a of i){if(a===o)continue;s.push(a),g.push(...a.getFaces());const I=a.getFaces(),c=a.getEdges(),E=a.getVertexs();for(let u=I.length-1;u>=0;u--){const Q=I[u];a.deleteFace(Q),o.addFace(Q)}for(const u of c)a.deleteEdge(u),o.addEdge(u);for(const u of E)a.deleteVertex(u),o.addVertex(u);ContinuousUtil.transferContinuousEdgeInfo(c,a,o)}}return{deleteShell:s,addFaceMap:r}}function disposeFace(l){if(!l||!l.getShell())return;let t=l.getShell();t&&t.deleteFace(l);for(const e of l.getCoedge3ds()){const n=e.getEdge();if(n){const s=n.getStartVertex(),r=n.getEndVertex();n.deleteCoedge3d(e),n.getCoedge3ds().length<=0&&(n.dispose(),t=n.getParent()||t,t?.deleteEdge(n)),s.getEdges().length<=0&&(t=s.getParent()||t,t?.deleteVertex(s)),r.getEdges().length<=0&&(t=r.getParent()||t,t?.deleteVertex(r))}}}function splitEdgeByVertex(l,t){const e=(a,I,c)=>{const E=new Coedge3d(I,a.getSameDirWithEdge()),u=new Coedge3d(c,a.getSameDirWithEdge()),Q=a.getWire(),w=Q.getCoedge3ds().indexOf(a);w!==-1&&(a.getSameDirWithEdge()?Q.replaceCoedge3d(w,[E,u]):Q.replaceCoedge3d(w,[u,E]))};if(l.getStartVertex()===t||l.getEndVertex()===t)return[];const n=l.getCurve(),s=n.split([n.getParamAt(t.getPoint())]);if(s.length!==2)return[];const r=new Edge(s[0],l.getStartVertex(),t),i=new Edge(s[1],t,l.getEndVertex());r.setData(l.getData()),i.setData(l.getData()),r.setFlags(l.getFlags()),i.setFlags(l.getFlags()),l.getCoedge3ds().forEach(a=>e(a,r,i));const g=l.getParent();return g&&(g.deleteEdge(l),g.addEdge(r),g.addEdge(i),g.addVertex(t)),l.dispose(),[r,i]}function splitEdgeByVertices(l,t){const e=l.getCurve();t.sort((s,r)=>{const i=e.getParamAt(s.getPoint()),o=e.getParamAt(r.getPoint());return i-o});const n=[l];for(const s of t){const r=n[n.length-1];if(!r)continue;const i=s.getPoint();if(!i.equals(r.getStartVertex().getPoint())&&!i.equals(r.getEndVertex().getPoint())){const o=splitEdgeByVertex(r,s);o&&o.length>0&&n.splice(n.length-1,1,...o)}}return n.length>1?n:[]}class OctreeNode{constructor(t,e,n=1,s=Tol.LENGTH){this.origin=t,this.halfL=e,this.depth=n,this.objects=[],this.children=[],this._boundCache=[],this._lengthEps=s}getOverlaps(t,e){this._intersect(t)&&(e.push(...this.objects),this.children.forEach(n=>n.getOverlaps(t,e)))}getObjects(){return this.objects}getObjectsRecursive(){const t=this.objects.slice();return this.children.forEach(e=>e.getObjectsRecursive().forEach(n=>t.push(n))),t}add(t,e,n,s){if(this.depth>=n)return this._add(t),[-1];if(this.children.length===0){if(this.objects.length<20)return this._add(t),this._boundCache.push(e),[-1];const o=this.objects.slice(),g=this._boundCache.slice();return this._subdivide(),o.length&&(this.objects=[],this._boundCache=[],o.forEach((a,I)=>{const c=s.get(a);c.pop(),s.delete(a);const E=this.add(a,g[I],n,s);s.set(a,[...c,...E])})),this.add(t,e,n,s)}let r;const i=e.map(o=>this._getQuadrant(o));if(i.length&&i.every(o=>o===i[0])&&(r=i[0]),r!==void 0){const o=this.children[r].add(t,e,n,s);return[r,...o]}return this._add(t),[-1]}remove(t,e){if(!this._intersect(e))return;const n=this.objects.findIndex(s=>s===t);n>-1?this.objects.splice(n,1):this.children.forEach(s=>s.remove(t,e))}_add(t){this.objects.push(t)}_getQuadrant(t){const e=Util.isNearlySmallerOrEqual(t.x-this.origin.x,0,this._lengthEps)?0:1,n=Util.isNearlySmallerOrEqual(t.y-this.origin.y,0,this._lengthEps)?0:1;return(Util.isNearlySmallerOrEqual(t.z-this.origin.z,0,this._lengthEps)?0:1)*4+n*2+e}_containPoint(t){const e=t.x-this.origin.x,n=t.y-this.origin.y,s=t.z-this.origin.z;return Util.isNearlySmallerOrEqual(Math.abs(e),this.halfL,this._lengthEps)&&Util.isNearlySmallerOrEqual(Math.abs(n),this.halfL,this._lengthEps)&&Util.isNearlySmallerOrEqual(Math.abs(s),this.halfL,this._lengthEps)}_intersect(t){if(!t.length)return!1;if(t.length===1)return this._containPoint(t[0]);const e=this.origin.added(new exports.Vec3(this.halfL,this.halfL,this.halfL)),n=this.origin.added(new exports.Vec3(-this.halfL,-this.halfL,-this.halfL));for(let s=0;s<t[0].data.length;s++)if(Util.isNearlySmaller(e.data[s],t[0].data[s],this._lengthEps)||Util.isNearlyBigger(n.data[s],t[t.length-1].data[s],this._lengthEps))return!1;return!0}_subdivide(){const t=this.halfL*.5,e=this.depth+1;for(let n=0;n<8;n++){const s=n&1?1:-1,r=n&2?1:-1,i=n&4?1:-1,o=this.origin.added(new exports.Vec3(s*t,r*t,i*t));this.children.push(new OctreeNode(o,t,e))}}}class Octree{constructor(t,e,n=exports.Vec3.O(),s=5e5,r=10){this._root=new OctreeNode(n,s),this._getBound=e,this._maxDepth=r,this._objectIndexMap=new Map,t.forEach(i=>{const o=this._root.add(i,this._getBound(i),this._maxDepth,this._objectIndexMap);this._objectIndexMap.set(i,o)})}getCandidateOverlaps(t,e){const n=this._objectIndexMap.get(t);if(n){const i=[];let o=this._root;for(const g of n)if(g>-1)o.getObjects().forEach(a=>i.push(a)),o=o.children[g];else{o.getObjectsRecursive().forEach(a=>i.push(a));break}return i}const s=e||this._getBound(t),r=[];return this._root.getOverlaps(s,r),r}remove(t){t.forEach(e=>this._root.remove(e,this._getBound(e)))}add(t,e){const n=e||this._getBound(t),s=this._root.add(t,n,this._maxDepth,this._objectIndexMap);this._objectIndexMap.set(t,s)}}const errorCCCoplanar="输入线条不是共面的.",errorCCValid="输入线条无效.",errorNoValidPlanes="不能找到有效的平面.",angleTol=new Tol(Tol.LENGTH,2*Tol.ANGLE);function addCandPlane(l,t){l.some(e=>e.isCoplanar(t,angleTol))||l.push(t.clone())}function checkConditions(l,t){let e=[];for(const r of l)if(r instanceof exports.Arc3){const i=r;addCandPlane(e,new exports.Plane(i.getCoord())),i.isEqualAB()&&addCandPlane(e,new exports.Cylinder(i.getCoord(),i.getA(),i.getB()))}else r instanceof exports.OffsetCurve3&&r.getBaseCurve()instanceof exports.Arc3&&addCandPlane(e,new exports.Plane(r.getBaseCurve().getCoord()));const n=[];for(const r of l){let i=[];r.isNurbsCurve3d()?i=r.getControlPoints().slice():i=r.discrete(),i.forEach(o=>{n.every(g=>!g.equals(o))&&n.push(o)})}if(e.length)return e=e.filter(r=>n.every(i=>r.containsPt(i))),e.length?{surfs:e,state:!0}:(t.errorStr=errorCCCoplanar,{surfs:[],state:!1});const s=exports.Plane.makeByPoints(n);return s?n.every(i=>s.containsPt(i))?{surfs:[s],state:!0}:(t.errorStr=errorCCCoplanar,{surfs:[],state:!1}):{surfs:[],state:!0}}function addToListInMap(l,t,e){let n=l.get(t);n||(n=[],l.set(t,n)),n.push(e)}function addOverlapInfo$1(l,t,e){let n;for(const s of l)if(s.has(t)||s.has(e)){n=s;break}n||(n=new Set,l.push(n)),n.add(t),n.add(e)}function selfIntersectForCurves(l,t,e,n){const s=new Map,r=new Set,i=l.length;for(let g=0;g<i;g++){const a=l[g];r.add(a);const I=t(a).filter(c=>!r.has(c));for(const c of I){const E=X.curve3ds(a,c);let u=!1;const Q=[];if(E.forEach(p=>{p.isOverlap?(Q.push(a.getPtAt(p.overlap1.min)),Q.push(a.getPtAt(p.overlap1.max)),u=!0):Q.push(p.point)}),!!Q.length){u&&addOverlapInfo$1(e,a,c);for(const p of Q)addToListInMap(s,a,p),addToListInMap(s,c,p)}}}const o=[];for(let g=0;g<i;g++){const a=l[g],I=s.get(a);if(!I||I.length===0){o.push(a);continue}const c=GeomUtil.splitCurveByPoints(a,I);if(!c.length)o.push(a);else{const E=n.get(a);for(const u of c)SmoothUtil.copySmoothInfo(a,u),o.push(u),E&&n.set(u,E);n.delete(a);for(const u of e)if(u.has(a)){u.delete(a),c.forEach(Q=>u.add(Q));break}}}l.splice(0,l.length),l.push(...o)}function removeOverlapCurves(l,t,e){const n=new Set(l);for(const s of t){const r=new Map;for(const i of s){let o=!1;for(const[g,a]of r)if(PJ.curvesOverlap(g,i)===CurvesPJType.TOTALLY_OVERLAP){a.push(i),o=!0;break}o||r.set(i,[i])}for(const i of r.values()){if(i.length<=1)continue;const o=e.get(i[0])||[];for(let g=1;g<i.length;g++)n.delete(i[g]),o.concat(e.get(i[g])||[]),e.delete(i[g]);e.set(i[0],o)}}l.splice(0,l.length),n.forEach(s=>l.push(s))}function pretreatCurves(l,t){const e=l.filter(c=>!Util.isNearly0(c.getLength()));e.forEach(c=>t.set(c,[c]));const n=new Box3,s=new Map;e.forEach(c=>{const E=c.getBBox();s.set(c,E),n.union(E)});const r=n.getCenter().subtracted(new exports.Vec3(0,0,n.getSize().z/2)),i=Math.max(...n.getSize().toArray3()),o=c=>{const E=s.get(c);return[E.min,E.max]},g=new Octree(e,o,r,i+100),a=c=>g.getCandidateOverlaps(c,o(c)).filter(u=>u!==c&&s.get(c).intersectsBox(s.get(u))),I=[];return selfIntersectForCurves(e,a,I,t),removeOverlapCurves(e,I,t),e}function getCandidateSurfs(l,t,e){if(!e.length){const n=new Box3;l.forEach(i=>n.union(i.getBBox()));const s=new Set,r=new Set;for(const i of t)for(const o of i.getFaces()){const g=o.getSurface(),a=o.getBBox();if(!(!a||!a.intersectsBox(n)))if((g.isPlane()||g.isCylinder())&&l.every(I=>g.containsCurve(I,Tol.LENGTH)))addCandPlane(e,g),o.getEdges().forEach(I=>s.add(I));else for(const I of o.getEdges()){const c=I.getBBox();!c||!c.intersectsBox(n)||r.add(I)}}s.forEach(i=>r.delete(i));for(const i of r){const o=i.getCurve();for(const g of l){if(!X.curve3ds(g,o).length)continue;let I;if(o instanceof exports.Ln3)I=exports.Plane.makeByPoints([g.getStartPt(),g.getEndPt(),o.getStartPt(),o.getEndPt()]);else if(o instanceof exports.Arc3){const c=new exports.Plane(o.getCoord());c.containsCurve(g)&&(I=c)}if(I){addCandPlane(e,I);break}}}}}function getCandidateFacesAndEdges(l,t,e,n,s,r){if(!e.length)return;const i=new Box3;if(l.forEach(a=>i.union(a.getBBox())),!i.isValid())return;const o=new Set;for(const a of e){if(!a||a.getFaces().length===0)continue;const I=a.getFaces(),c=I.map(u=>u.getBBox()),E=new Box3;if(c.forEach(u=>E.union(u)),!!E.intersectsBox(i))for(let u=0;u<I.length;u++)c[u].intersectsBox(i)&&o.add(I[u])}const g=new Set;for(const a of o)t.isCoplanar(a.getSurface(),angleTol)?n.add(a):g.add(a);for(const a of n){a.getEdges().forEach(E=>s.add(E));const c=a.getVertexes();for(const E of c){r.add(E);for(const u of E.getEdges()){if(s.has(u))continue;const Q=u.getCurve();Q&&t.containsCurve(Q)&&(s.add(u),r.add(u.getStartVertex()),r.add(u.getEndVertex()))}}}for(const a of g){for(const I of a.getEdges()){if(s.has(I))continue;const E=I.getCurve().getBBox();E&&E.intersectsBox(i)&&(s.add(I),r.add(I.getStartVertex()),r.add(I.getEndVertex()))}for(const I of a.getVertexes())t.containsPt(I.getPoint())&&r.add(I)}}function addToIntersectionMap(l,t,e){let n;e.has(l)?n=e.get(l):(n=new Set,e.set(l,n)),n.add(t)}function intersectCurvesAndEdges(l,t,e,n,s){const r=new Set;for(const o of t)r.add(o.getStartVertex()),r.add(o.getEndVertex());const i=new WeakMap;for(const o of l)for(const g of t){const a=X.curve3ds(o,g.getCurve()),I=[];a.forEach(c=>{c.isOverlap?(I.push(o.getPtAt(c.overlap1.min)),I.push(o.getPtAt(c.overlap1.max))):I.push(c.point)});for(const c of I){let E;for(const u of r)if(u.getPoint().equals(c)){E=u;break}E||(E=g.getParent().createVertex(c),r.add(E)),addToIntersectionMap(o,E,i),addToIntersectionMap(g,E,i)}}e.splice(0,e.length);for(const o of l){if(!i.has(o)){e.push(o);continue}const g=GeomUtil.splitCurveByPoints(o,Array.from(i.get(o)).map(a=>a.getPoint()));if(g.length>0){const a=s.get(o);for(const I of g)SmoothUtil.copySmoothInfo(o,I),e.push(I),a&&s.set(I,a);s.delete(o)}else e.push(o)}n.clear();for(const o of t){if(!i.has(o)){n.add(o);continue}const g=splitEdgeByVertices(o,Array.from(i.get(o)));if(g.length>1)for(const a of g)n.add(a);else n.add(o)}}function createCurveEdges(l,t,e,n,s,r){const i=new Set(e);for(const g of t)i.add(g.getStartVertex()),i.add(g.getEndVertex());const o=new Map;t.forEach(g=>o.set(g,g.getCurve()));for(const g of l){let a;for(const c of t)if(PJ.curvesOverlap(o.get(c),g)===CurvesPJType.TOTALLY_OVERLAP){a=c,s.add(a);break}if(!a){let c,E;for(const Q of i)if(Q.getPoint().equals(g.getStartPt())){c=Q;break}c||(c=new Vertex(g.getStartPt()),i.add(c));for(const Q of i)if(Q.getPoint().equals(g.getEndPt())){E=Q;break}E||(E=new Vertex(g.getEndPt()),i.add(E));const u=g.clone();a=new Edge(u,c,E),n.add(a),SmoothUtil.copySmoothInfo(g,a)}const I=r.get(g);I&&(r.set(a,I),r.delete(g))}}function intersectCurvesWithCandidates(l,t,e,n,s,r,i){for(const g of t){const a=g.getParent();a&&addShellModifyInfo(r,a)}let o=new Set(t);if(o.size){const g=new Set,a=[];intersectCurvesAndEdges(l,o,a,g,i),l.splice(0,l.length),l.push(...a),o=g}createCurveEdges(l,o,e,n,s,i)}function calCurveEdgesPosition(l,t,e,n,s){const r=new Map,i=(o,g)=>{for(const a of o){const I=a.getCurve().getMidPt();let c;for(const E of l){let u=r.get(E);u||(u=E.calcPolygon(),r.set(E,u));const Q=E.getSurface();if(Q.containsPt(I)&&PtLoopPJType.IN===PJ.ptToPolygon(Q.getUVAt(I),u)){c=E;break}}c?addToListInMap(n,c,a):g||s.push(a)}};i(t,!1),i(e,!0)}function calSplitFaceResult(l,t,e){function n(a,I,c){for(const E of a.edges){c.add(E.edge);const u=I.get(E.edge);u&&(E.bSameDir?u.validP=!1:u.validN=!1)}}function s(a,I,c,E){for(const[u,Q]of I){if(Q.validP){const p=detectLoopFromEdges(u,!0,a,!0);p&&(n(p,I,E),c.push(p))}if(Q.validN){const p=detectLoopFromEdges(u,!1,a,!0);p&&(n(p,I,E),c.push(p))}}}const r=new Map;t.forEach(a=>r.set(a,{validP:!0,validN:!0}));const i=l.getSurface(),o=[],g=new Set;if(i.isCylinder()){const a=new Set(t);l.getEdges().forEach(c=>a.add(c));const I=(c,E)=>{const u=new VirtualLoop;u.add(c,E);let Q;const p=E?c.getStartVertex():c.getEndVertex();let w=E?c.getEndVertex():c.getStartVertex();for(;p!==w;){const N=w.getEdges().filter(S=>a.has(S));if(!N.length)break;if(Q){const S=N.filter(R=>t.findIndex(U=>U===R)>-1);if(S.length){Q=void 0;const R=S[0].getStartVertex()===w;u.add(S[0],R),w=R?S[0].getEndVertex():S[0].getStartVertex()}else Q=Q.getNextCoedge(),u.add(Q.getEdge(),Q.getSameDirWithEdge()),w=Q.getEndVertex()}else{const S=N.filter(R=>l.getEdges().findIndex(U=>U===R)>-1);if(S.length){for(const R of S)for(const U of R.getCoedge3ds())U.getWire()?.getFace()===l&&U.getStartVertex()===w&&(Q=U);if(!Q)break;u.add(Q.getEdge(),Q.getSameDirWithEdge()),w=Q.getEndVertex()}else{const R=u.edges[u.edges.length-1].edge;N.sort((b,G)=>(b===R?1:0)-(G===R?1:0));const U=N[0].getStartVertex()===w;u.add(N[0],U),w=U?N[0].getEndVertex():N[0].getStartVertex()}}}n(u,r,new Set);const y=u.edges.some(N=>N.edge.getCurve().isLine3d()),M=u.edges.some(N=>N.edge.getCurve().isArc3d());if(y&&M&&u.edges.length>1&&p===w){const N=new Set;u.edges.forEach(S=>N.add(S)),N.size===u.edges.length&&o.push(u)}};for(const[c,E]of r)E.validP&&I(c,!0),E.validN&&I(c,!1);if(o.length===2){const c=o.map(E=>new VirtualFace([E],i));e.set(l,c)}return}if(s(i,r,o,g),o.length){r.clear();for(const I of l.getWires())if(I.getCoedge3ds().some(c=>g.has(c.getEdge())))for(const c of I.getCoedge3ds())g.has(c.getEdge())||(c.getSameDirWithEdge()?r.set(c.getEdge(),{validP:!0,validN:!1}):r.set(c.getEdge(),{validP:!1,validN:!0}));else{const c=new VirtualLoop;I.getCoedge3ds().forEach(E=>c.add(E.getEdge(),E.getSameDirWithEdge())),o.push(c)}s(i,r,o,g);const a=virtualLoopsToFaces(o,i);e.set(l,a)}}function createOppositeLoop(l){const t=new VirtualLoop;return l.edges.forEach(e=>t.add(e.edge,!e.bSameDir)),t.edges.reverse(),t.bc3ds.reverse(),t}function getEdgeValidInfo(l,t,e){let n=t.get(l);if(!n){n={validP:!0,validN:!0},t.set(l,n);for(const s of l.getCoedge3ds())if(s){const r=s.getWire().getParent().getSurface();r instanceof exports.Plane&&r.getNorm().isParallel(e.getNorm())&&(s.getSameDirWithEdge()===r.getNorm().isSameDirection(e.getNorm())?n.validP=!1:n.validN=!1)}}return n}function checkVirtualLoop(l,t,e){const n=l.getArea(e)>0;for(const s of l.edges){const r=getEdgeValidInfo(s.edge,t,e);if(s.bSameDir===n&&!r.validP||s.bSameDir!==n&&!r.validN)return}return l}function updateEdgeValidInfo(l,t,e,n,s){const r=getEdgeValidInfo(l,e,n);s?t?r.validP=!1:r.validN=!1:t?r.validN=!1:r.validP=!1}function detectNewFacesPure(l,t,e){const n=new Map,s=l.slice();for(const o of s)n.set(o,{validP:!0,validN:!0});const r=[];function i(o,g){let a=!0;for(const I of o.edges){const c=g.get(I.edge);(I.bSameDir&&!c.validP||!I.bSameDir&&!c.validN)&&(a=!1)}a&&(r.push(o),o.edges.forEach(I=>{const c=g.get(I.edge);I.bSameDir?c.validP=!1:c.validN=!1}))}for(const o of s){const g=n.get(o);if(g.validP&&g.validN){const a=detectLoopFromEdges(o,!0,t,!0);if(a&&a.edges.filter(c=>c.edge===o).length>1)continue;const I=detectLoopFromEdges(o,!1,t,!0);if(I&&I.edges.filter(c=>c.edge===o).length>1)continue;a&&i(a,n),I&&i(I,n)}else if(g.validP||g.validN){const a=o,I=!!g.validP,c=detectLoopFromEdges(a,I,t,!0);if(!c||c&&c.edges.filter(E=>E.edge===a).length>1)continue;i(c,n)}}r.length&&e.push(...virtualLoopsToFaces(r,t,!0))}function detectNewFaces(l,t,e,n){const s=new Map,r=l.slice();t.forEach(o=>r.push(o));for(const o of r)t.has(o)?getEdgeValidInfo(o,s,e):s.set(o,{validP:!0,validN:!0});function i(o,g,a,I,c){checkVirtualLoop(a,I,o)&&(c.push(new VirtualFace([g?a:createOppositeLoop(a)],o)),a.edges.forEach(E=>updateEdgeValidInfo(E.edge,E.bSameDir===g,s,o,!0)))}for(const o of r){const g=s.get(o);if(g.validP&&g.validN){const a=detectLoopFromEdges(o,!0,e,!0);if(a&&a.edges.filter(c=>c.edge===o).length>1)continue;const I=detectLoopFromEdges(o,!0,e,!1);if(I&&I.edges.filter(c=>c.edge===o).length>1)continue;if(a&&I){const c=a.getArea(e)>0,E=I.getArea(e)>0;if(c!==E)i(e,c,a,s,n),i(e,E,I,s,n);else{let u,Q;Util.isNearlyBigger(Math.abs(a.getArea(e)),Math.abs(I.getArea(e)))?(u=I,Q=a):(u=a,Q=I),i(e,c,u,s,n),Q.edges.forEach(p=>updateEdgeValidInfo(p.edge,p.bSameDir===c,s,e,!1))}}else if(a||I){const c=a||I,E=c.getArea(e)>0;i(e,E,c,s,n)}}else if(g.validP||g.validN){const a=o,I=!!g.validP,c=detectLoopFromEdges(a,I,e,!0);if(!c||c&&c.edges.filter(u=>u.edge===a).length>1)continue;const E=c.getArea(e)>0;i(e,E,c,s,n)}}}function findBoundaryEdges(l,t){const e=new Set;for(const s of l)s.getEdges().forEach(r=>e.add(r));const n=new Set;for(const s of e){let r=0;const i=s.getCoedge3ds().map(o=>o.getWire().getParent());for(const o of i){const g=o.getSurface();if(g instanceof exports.Plane&&g.isCoplanar(t,angleTol)&&r++,r>1)break}r<=1&&n.add(s)}return n}function patchInnerLoopForNewFaces(l,t,e){function n(r,i){return r.approxPts.every(o=>PJ.ptToLoop(o,new exports.Loop(i.bc2ds)).type===PtLoopPJType.IN)}l.forEach(r=>r.loops.forEach(i=>i.prepareData(e))),t.forEach(r=>r.prepareData(e));const s=t.slice();t=t.filter(r=>{for(const i of s)if(i!==r&&n(r,i))return!1;return!0});for(const r of l){const i=r.outerLoop();for(const o of t)if(o.box.intersectsBox(i.box)&&n(o,i)){const a=i.getArea(e)>0==o.getArea(e)>0?createOppositeLoop(o):o;r.addInnerLoop(a)}}}function calNewFacesResult(l,t,e,n,s){if(!l.length&&!t.size)return;const r=new Set;if(l.forEach(a=>{a.getStartVertex().getEdges().forEach(I=>r.add(I)),a.getEndVertex().getEdges().forEach(I=>r.add(I))}),!t.size&&l.length===r.size?detectNewFacesPure(l,n,s):detectNewFaces(l,t,n,s),!s.length)return;const i=findBoundaryEdges(e,n);if(!i.size)return;s.forEach(a=>a.loops.forEach(I=>I.edges.forEach(c=>i.delete(c.edge))));const o=[],g=new Map;i.forEach(a=>g.set(a,{valid:!0}));for(const[a,I]of g)if(I.valid){const c=detectLoopFromEdges(a,!0,n,!0,i);if(c&&c.edges.every(E=>!g.get(E.edge)||g.get(E.edge)?.valid)){o.push(c);for(const E of c.edges){const u=g.get(E.edge);u&&(u.valid=!1),i.delete(E.edge)}}}o.length&&patchInnerLoopForNewFaces(s,o,n)}function addNewFace(l,t){t.addFace(l),l.getEdges().forEach(e=>t.addEdge(e)),l.getVertexes().forEach(e=>t.addVertex(e))}function getNeighborShell(l){for(const t of l.getVertexes()){const e=t.getParent();if(e)return e}}function generateTopoFaces(l,t,e,n,s,r){for(const[i,o]of l){const g=[];for(const I of o){const c=I.loops.map(E=>{const u=E.edges.map(Q=>new Coedge3d(Q.edge,Q.bSameDir));return new Wire(u)});g.push(new Face(I.plane.clone(),i.getSameDirWithSurface(),c))}const a=i.getShell();g.length&&(g.forEach(I=>addNewFace(I,a)),disposeFace(i),addShellModifyInfo(r.modifiedShellsMap,a,g,[i])),r.faceSplitMap.set(i,g)}for(const i of t){const o=new Face(i.plane.clone(),!0),g=i.loops.map(I=>{const c=I.edges.map(E=>new Coedge3d(E.edge,E.bSameDir));return new Wire(c)});o.setWires(g);let a=getNeighborShell(o);a?r.addShells.indexOf(a)<0&&addShellModifyInfo(r.modifiedShellsMap,a,[o]):(a=new Shell,e.push(a),r.addShells.push(a)),addNewFace(o,a),r.newOuterFaces.push(o)}for(const i of n){if(!i.getCoedge3ds().length){i.dispose();continue}SmoothUtil.hasSmoothInfo(i)&&s.add(i)}}function updateSmoothInfo(l,t){const e=l.newOuterFaces.slice();for(const n of l.faceSplitMap.values())e.push(...n);if(e.forEach(n=>{SmoothUtil.udpateSmoothVertices(new Set(n.getVertexes()))}),!!t.size){ContinuousUtil.addContinuousEdgeInfo(Array.from(t),n=>SmoothUtil.getSmoothInfo(n)?.getCurve());for(const n of t){SmoothUtil.clearSmoothInfo(n);const s=n.getStartVertex(),r=n.getEndVertex();!s.getSmooth()&&s.getEdges().length===2&&s.getEdges().every(i=>t.has(i))&&s.setSmooth(!0),!r.getSmooth()&&r.getEdges().length===2&&r.getEdges().every(i=>t.has(i))&&r.setSmooth(!0)}}}function addEdgesCore(l,t,e,n){n.addShells=[],n.modifiedShellsMap=new Map;let s=SmoothUtil.decomposeSmoothPoly(l.slice()),r=[];if(t)r=[t];else{const c=checkConditions(s,n);if(!c.state)return;r=c.surfs}const i=new Map;if(s=pretreatCurves(s,i),!s.length){n.errorStr=errorCCValid;return}const o=e.slice();if(getCandidateSurfs(s,o,r),!r.length){n.errorStr=errorNoValidPlanes;return}const g=new Set;for(const c of r){const E=new Set,u=new Set,Q=new Set;getCandidateFacesAndEdges(s,c,o,E,u,Q);const p=new Set,w=new Set;intersectCurvesWithCandidates(s,u,Q,w,p,n.modifiedShellsMap,i);const y=new Map,M=[];calCurveEdgesPosition(E,Array.from(w),Array.from(p),y,M);const N=new Map;for(const R of E){const U=y.get(R);if(U)try{calSplitFaceResult(R,U,N)}catch(b){b instanceof Error&&(n.errorStr=b.message)}}const S=[];if(c.isPlane())try{calNewFacesResult(M,p,E,c,S)}catch(R){R instanceof Error&&(n.errorStr=R.message)}generateTopoFaces(N,S,o,w,g,n)}const a=Array.from(n.faceSplitMap.values()).flat();n.newOuterFaces.forEach(c=>a.push(c));const I=mergeShells(a);I.deleteShell.forEach(c=>{n.modifiedShellsMap?.has(c)&&n.modifiedShellsMap.delete(c)});for(const[c,E]of I.addFaceMap)addShellModifyInfo(n.modifiedShellsMap,c,E);n.deleteShells=e.filter(c=>!c.getFaces().length),n.addShells=n.addShells.filter(c=>c.getFaces().length),n.evolutionMap=new Map;for(const[c,E]of n.faceSplitMap)E.forEach(u=>addEvolutionInfo(n,c,u));for(const[c,E]of i)c instanceof Edge&&E.forEach(u=>addEvolutionInfo(n,u,c));updateSmoothInfo(n,g)}class AddEdges extends ShellModelingBase{constructor(t,e,n){super(n),this._curves=t,this._curvePlane=e}_executeImpl(){const t={faceSplitMap:new Map,newOuterFaces:[]};try{addEdgesCore(this._curves,this._curvePlane,this._contextShells,t)}catch(n){return n instanceof Error&&(t.errorStr=n.message),t}return t.faceSplitMap.size>0||t.newOuterFaces.length>0||(t.errorStr="输入的几何元素不支持"),t}}function canMergeConnectedEdge(l,t,e){if(!l||!t)return!1;const n=l.getCoedge3ds(),s=t.getCoedge3ds();if(!n.length||!s.length||n.length!==s.length)return!1;const r=l.getCurve(),i=t.getCurve();if(!CurvesColinear.curve3ds(r,i)||PJ.curvesOverlap(r,i)===CurvesPJType.OVERLAP)return!1;const o=[l.getStartVertex(),l.getEndVertex()],g=[t.getStartVertex(),t.getEndVertex()];if(!(o.some(I=>I===e)&&g.some(I=>I===e)))return!1;const a=e.getEdges().filter(I=>I.getCoedge3ds().length);return!(a.length!==2||a.indexOf(l)<0||a.indexOf(t)<0)}function mergeConnectedEdge(l,t,e){if(!canMergeConnectedEdge(l,t,e))return;const n=e,s=l.getStartVertex()===n?l.getEndVertex():l.getStartVertex(),r=t.getStartVertex()===n?t.getEndVertex():t.getStartVertex(),i=n.getParent();let o;const g=l.getCurve();if(g instanceof exports.Ln3)o=new exports.Ln3(s.getPoint(),r.getPoint());else if(g instanceof exports.Arc3)if(g.isEqualAB()){const u=l.getStartVertex()===n?g.getNormal().reversed():g.getNormal();o=exports.Arc3.makeArcByStartEndPoints(g.getCenter(),g.getRadius(),u,s.getPoint(),r.getPoint(),!0)}else{const u=g.getCenter().added(g.getCoord().getDx().multiplied(g.getA())),Q=l.getStartVertex()===n?-1:1,p=g.getCenter().added(g.getCoord().getDy().multiplied(Q*g.getB()));o=exports.Arc3.makeEllipseByFivePoints(g.getCenter(),u,p,s.getPoint(),r.getPoint())}else if(g instanceof exports.NurbsCurve3)if(l.getStartVertex()===n){const u=g.getRange().max,Q=g.getRange().min-t.getCurve().getRange().getLength();Util.isNearlyBiggerOrEqual(Q,0)&&(o=g.clone(),o.setRange(Q,u),o.reverse())}else{const u=g.getRange().min,Q=g.getRange().max+t.getCurve().getRange().getLength();Util.isNearlySmallerOrEqual(Q,1)&&(o=g.clone(),o.setRange(u,Q))}if(!o)return;const a=new Edge(o,s,r);i.addEdge(a);const I=o.getStartTangent(),c=l.getCoedge3ds().filter(u=>u.getStartVertex()===s),E=t.getCoedge3ds().filter(u=>u.getStartVertex()===r);for(const u of c.concat(E)){const Q=u.getWire(),p=u.getStartVertex()===s&&u.getCurve().getStartTangent().equals(I),w=new Coedge3d(a,p),y=Q.getCoedge3ds(),M=y.indexOf(u),N=y[(M+1)%y.length];Q.insertCoedge3d(M,w),Q.deleteCoedge3d(u),Q.deleteCoedge3d(N)}return l.getFlags()&&t.getFlags()&&a.setFlags(l.getFlags()&t.getFlags()),l.dispose(),t.dispose(),i.deleteEdge(l),i.deleteEdge(t),i.deleteVertex(n),a}function mergeOverlapEdges(l,t){const e=t||Tol.DEFAULT,n=Array.from(new Set(l)),s=new Map;for(const r of n){const i=r.getCurve();let o=!1;for(const[g,a]of s)if(PJ.curvesOverlap(g,i,e.lengthEps,e.angleEps)===CurvesPJType.TOTALLY_OVERLAP){a.push(r),o=!0;break}if(!o){const g=Array.from([r]);s.set(i,g)}}for(const r of s.values()){if(r.length<=1)continue;const i=r[0],o=r.every(g=>g.getSmooth());for(let g=1;g<r.length;g++){const a=r[g],I=a.getCoedge3ds().slice();let c=!1;(a.getStartVertex()!==i.getStartVertex()||!a.getCurve().getStartTangent().equals(i.getCurve().getStartTangent(),e.angleEps))&&(c=!0);for(const u of I)u.setEdge(i),c&&u.reverse();const E=a.getParent();E&&E.deleteEdge(a),a.dispose()}i.setSmooth(o)}}function mergeVertices(l){if(l.length<=1)return;const t=l[0];for(let e=1;e<l.length;e++){const n=l[e],s=n.getParent();s&&s.deleteVertex(n);const r=n.getEdges();for(const i of r)i.getStartVertex()===n&&i.setStartVertex(t),i.getEndVertex()===n&&i.setEndVertex(t)}l.every(e=>e.getSmooth())&&t.setSmooth(!0)}const errorNotSupportBooleanType="暂不支持的布尔类型",errorCylinderFace="输入的圆柱面存在跨周期问题";function addToSetInMap(l,t,e){let n=l.get(t);n||(n=new Set,l.set(t,n)),n.add(e)}function addOverlapInfo(l,t,e){let n;for(const s of l)if(s.has(t)||s.has(e)){n=s;break}n||(n=new Set,l.push(n)),n.add(t),n.add(e)}function intersectEdges(l,t,e){function n(c,E){const u=c.getParent();u&&!E.get(u)&&E.set(u,{addFaces:[],deleteFaces:[],modifiedFaces:[]})}const s=Array.from(l),r=new Set,i=[],o=[];s.forEach(c=>{const E=c.getCurve();i.push(E),o.push(E.getBBox()),r.add(c.getStartVertex()),r.add(c.getEndVertex())});const g=new Map,a=[];for(let c=0;c<s.length;c++)for(let E=c+1;E<s.length;E++){if(!o[c].intersectsBox(o[E]))continue;const u=X.curve3ds(i[c],i[E]),Q=[];let p=!1;if(u.forEach(w=>{w.isOverlap?(Q.push(i[c].getPtAt(w.overlap1.min)),Q.push(i[c].getPtAt(w.overlap1.max)),p=!0):Q.push(w.point)}),!!Q.length){p&&addOverlapInfo(a,c,E),n(s[c],e),n(s[E],e);for(const w of Q){let y;for(const M of r)if(M.getPoint().equals(w)){y=M;break}y||(y=s[c].getParent().createVertex(w),r.add(y)),addToSetInMap(g,s[c],y),addToSetInMap(g,s[E],y)}}}const I=new Map;for(let c=0;c<s.length;c++){const E=g.get(s[c]);if(!E){I.set(c,[s[c]]);continue}const u=splitEdgeByVertices(s[c],Array.from(E));u.length?I.set(c,u):I.set(c,[s[c]])}for(const c of a){const E=new Set;t.push(E),c.forEach(u=>{I.get(u).forEach(p=>E.add(p))})}}function getBoundedCurves2D(l,t,e,n){function s(r,i){const o=[],g=new exports.Vec2(Math.PI*2,0),a=Math.max(i.getA(),i.getB());for(const I of r){let c=I.getStartPt(),E=I.getEndPt();(Util.isNearlySmaller(c.x,0)||Util.isNearlySmaller(E.x,0))&&(c.add(g),E.add(g)),c=new exports.Vec2(c.x*a,c.y),E=new exports.Vec2(E.x*a,E.y),o.push(new exports.Ln2(c,E))}return o}for(const r of l.getWires()){const i=r.getCoedge3ds().map(a=>a.getCurve()),o=t.wireToUV(i);let g=o.loop;t instanceof exports.Cylinder&&(g=s(g,t)),e.push(g),MathAssert.assert(i.length===o.loop.length,"getLoop2d的curve2ds数量与curve3ds不一致!");for(let a=0;a<i.length;a++){let I=o.mapping.get(i[a]);const c=o.loop.indexOf(I);I=g[c];const E=r.getCoedge3ds()[a];n.set(I,E)}}}function getMatchedEdgesFromBCs(l,t,e,n){const s=[];if(!l.length||l.some(r=>!e.get(r)&&!e.get(t.get(r))))return s;for(const r of l){let i,o,g=e.get(r);if(g)i=g.getEdge(),o=g.getSameDirWithEdge();else{const a=t.get(r);g=e.get(a),i=g.getEdge(),o=r.getStartPt().equals(a.getStartPt(),n.lengthEps)&&r.getStartTangent().equals(a.getStartTangent(),n.angleEps)?g.getSameDirWithEdge():!g.getSameDirWithEdge()}s.push({edge:i,flag:o})}return s}function getFaces2D(l,t,e,n,s){for(const r of l){const i=[];getBoundedCurves2D(r,t,i,n);const o={loops:i};e.push(o),s.set(o,r)}}function createNewFaceFromFace2D(l,t,e,n,s,r=!1,i){if(!l.loops.length)return;let o,g,a;const I=l.originFaces;if(I.length){const y=n.get(I[0]);o=y.getShell(),g=y.getSurface(),a=y.getSameDirWithSurface()}if(!o)return;const c=[];let E=[];for(let y=0;y<l.loops.length;y++){const M=getMatchedEdgesFromBCs(l.loops[y],t,e,i);if(M.length)c.push(M.map(N=>N.edge)),E.push(M.map(N=>N.flag));else if(y===0)return}let u=s,Q;r&&g?(u=g,Q=a):(l.bPositive||(c.forEach(y=>y.reverse()),E.forEach(y=>y.reverse()),E=E.map(y=>y.map(M=>!M))),Q=!0);const p=new Face(u,Q),w=[];for(let y=0;y<c.length;y++){const M=[];for(let N=0;N<c[y].length;N++)M.push(new Coedge3d(c[y][N],E[y][N]));w.push(new Wire(M))}return p.setWires(w),o.addFace(p),p}function addToPointListMap(l,t,e){const n=l.keys();let s;for(const r of n)if(r.equals(t)){s=l.get(r);break}s||(s=[],l.set(t,s)),s.push(e)}function allFacesSameDirection(l){if(!l.length)return!1;const t=(e,n)=>{const s=e.getSurface(),r=n.getSurface();return!(s.isPlane()&&r.isPlane()&&!s.getNorm().isSameDirection(r.getNorm())||e.getSameDirWithSurface()!==n.getSameDirWithSurface())};return!!l.every(e=>t(e,l[0]))}function isSuitableCylinder(l,t){for(const e of l.values())for(const n of e){const r=t.getCurve2d(n).getRange();if(Util.isNearlySmaller(r.min,0)&&Util.isNearlyBigger(r.max,0)||Util.isNearlySmaller(r.min,Math.PI*2)&&Util.isNearlyBigger(r.max,Math.PI*2))return!1}return!0}function findSuitableCylinder(l,t){const e=[...l,...t],n=e.map(r=>r.getSurface()),s=new Map;for(const r of e){const o=r.getCoedge3ds().filter(g=>g.getEdge().getCurve()instanceof exports.Arc3).map(g=>g.getCurve());s.set(r,o)}for(const r of n){if(isSuitableCylinder(s,r))return r;const i=r.getCoord(),o=r.getA(),g=r.getB();for(let a=1;a<=3;a++){const I=i.getDx().vecRotate(i.getDz(),Math.PI*a/2),c=i.getDy().vecRotate(i.getDz(),Math.PI*a/2),E=new exports.Coord3(i.getOrigin(),I,c),u=new exports.Cylinder(E,a%2?g:o,a%2?o:g);if(isSuitableCylinder(s,u))return r}}}function facesBooleanCore(l,t,e,n=!0,s,r,i){const o=i||Tol.DEFAULT,g={resultFaces:[],deleteShells:[],modifiedShellsMap:new Map,evolutionMap:new Map},a=l.filter(M=>M&&M.getShell()),I=t.filter(M=>M&&M.getShell()),c=[...a,...I];if(!c.length)return{resultFaces:c};if(e===1||e===3)throw new Error(errorNotSupportBooleanType);let E=c[0].getSurface();if(E instanceof exports.Cylinder&&(E=findSuitableCylinder(a,I),!E))throw new Error(errorCylinderFace);const u=[],Q=[];if(c.length<=1&&e===4)u.push(...c);else{const M=[],N=[],S=new Map,R=new Map;getFaces2D(a,E,M,S,R),getFaces2D(I,E,N,S,R);const U=new Map,b=Bool2d.boolOperateCore(M,N,e,o.lengthEps,o.angleEps,U,s,r),G=e===4||allFacesSameDirection(c);for(const O of b){let H=R.get(O);if(H){u.push(H);continue}if(H=createNewFaceFromFace2D(O,U,S,R,E,G,o),H&&(Q.push(H),addShellModifyInfo(g.modifiedShellsMap,H.getShell(),[H]),O.originFaces)){const z=[];O.originFaces.forEach(nA=>z.push(R.get(nA))),z.forEach(nA=>addEvolutionInfo(g,nA,H))}}}const p=new Set;a.forEach(M=>p.add(M.getShell())),c.filter(M=>u.indexOf(M)===-1).forEach(M=>{addShellModifyInfo(g.modifiedShellsMap,M.getShell(),void 0,[M]),disposeFace(M)}),g.resultFaces=u.concat(Q);const y=mergeShells(g.resultFaces,Array.from(p));y.deleteShell.forEach(M=>{g.modifiedShellsMap?.has(M)&&g.modifiedShellsMap.delete(M)});for(const[M,N]of y.addFaceMap)addShellModifyInfo(g.modifiedShellsMap,M,N);if(g.deleteShells=y.deleteShell,n){const M=new Set;g.resultFaces.forEach(N=>N.getVertexes().forEach(S=>M.add(S))),SmoothUtil.udpateSmoothVertices(M)}return g}function facesBoolean(l,t,e,n=!0){const s={resultFaces:[],deleteShells:[],modifiedShellsMap:new Map},r=l.filter(u=>u&&u.getShell()),i=t.filter(u=>u&&u.getShell()),o=[...r,...i];if(!o.length||o.length===1&&e===4)return{resultFaces:o};const g=[];o.forEach(u=>g.push(...u.getVertexes()));const a=new Map;for(const u of Array.from(new Set(g)))addToPointListMap(a,u.getPoint(),u);for(const u of a.values())mergeVertices(u);const I=new Set,c=[];o.forEach(u=>u.getEdges().forEach(Q=>I.add(Q))),intersectEdges(I,c,s.modifiedShellsMap),c.forEach(u=>mergeOverlapEdges(Array.from(u)));const E=facesBooleanCore(r,i,e,n);return mergeShellModelingResult(s,E),s.resultFaces=E.resultFaces,s}function facesSplit(l,t,e=!0){return facesBoolean(l,t,4,e)}const zero={x:0,y:0};class ContinuousUVComputor{static tessellateFaces(t,e=!0){if(t.length<=0)return;if(t.length===1)return t[0].tessellate().mesh;let n;e&&(n=this._computeFacesUVMapping(t));const s=[];for(const r of t){const i=this._tesslateFace(r);if(i&&(s.push(i),e)){const o=n.faceUVMapping.get(r);if(!o)continue;this._recalculateMeshUV(r,i,o,n.linear)}}return this._mergeMesh(s)}static _ptToKey(t){return t.map(e=>Math.round(e*1e6).toFixed(0)).join("_")}static _tesslateFace(t){const e=t.tessellate().mesh;if(!e)return;const n=new Map;t.getEdges().filter(s=>s.getSmooth()).forEach(s=>{const r=s.getStartVertex().getPoint().toArray3(),i=s.getEndVertex().getPoint().toArray3(),o=s.getFaces();if(o.length!==2)return;const g=o[0].getNormAt(zero),a=o[1].getNormAt(zero),I=g.add(a).normalize().toArray3();n.set(this._ptToKey(r),I),n.set(this._ptToKey(i),I)});for(let s=0;s<e.vertices.length;s++){const r=this._ptToKey(e.vertices[s]),i=n.get(r);i&&(e.normals[s]=i)}return e}static _computeFacesUVMapping(t){const e=new Set;t.slice(0,2).forEach(a=>a.getVertexes().forEach(I=>e.add(I)));let n=t[0].getEdges().filter(a=>a.getSmooth());n.push(...t[1].getEdges().filter(a=>a.getSmooth())),t.length>2&&(n.push(...t[2].getEdges().filter(a=>a.getSmooth())),t[2].getVertexes().forEach(a=>e.add(a))),n=Array.from(new Set(n));let s=!1,r=!1,i=!1;if(Array.from(e).every(a=>a.getEdges().filter(I=>I.getSmooth()).length<=2)){const a=n.map(I=>I.getCurve().getDirection());a.every(I=>I.isParallel(a[0]))?s=!0:r=!0}else i=!0;const g=new Map;return s?this._calCylinderUVRange(t,g):r?this._calConeUVRange(t,g):i&&this._calTorusUVRange(t,g),{faceUVMapping:g,linear:s}}static _calCompressUVRange(t,e,n){let s=e.getCurve().getDirection(),r=!0;const i=t.getSurface(),o=s.dot(i.getCoord().getDx()),g=s.dot(i.getCoord().getDy());Math.abs(o)>Math.abs(g)?o<0&&(s=s.reversed(),r=!1):g<0&&(s=s.reversed(),r=!1);const a=[],I=(G,O,H)=>{let z=O?G.getStartVertex().getEdges():G.getEndVertex().getEdges();return z=z.filter(tA=>tA!==G&&(tA.getStartVertex().getSmooth()||tA.getEndVertex().getSmooth())&&tA.getFaces().indexOf(H)>-1),z.length?z[0]:void 0},c=I(e,r,t),E=I(e,!r,t),u=t.getSurface().getNorm(),Q=s.cross(u),p=t.getVertexes().some(G=>this._onRefSide(G.getPoint(),e.getStartVertex().getPoint(),Q)),w=[];w.push({face:t,refV:s,refN:u,v0:r?e.getStartVertex():e.getEndVertex(),v1:r?e.getEndVertex():e.getStartVertex(),uEdge0:c,uEdge1:E,refVEdge:e,right:p});const y=(G,O,H,z,tA,nA,IA)=>{for(;H&&O&&O.getSmooth();){const iA=z===nA?H.getEndVertex():H.getStartVertex(),W=O.getFaces().filter(oA=>oA&&oA!==G);if(H=void 0,W.length){G=W[0];const oA=iA.getEdges().filter(hA=>hA!==O&&G.getEdges().indexOf(hA)>-1);oA.length&&IA.findIndex(hA=>hA.face===G)<0&&(H=oA[0])}if(H){let oA=H.getCurve().getDirection();z=!0,nA===(H.getEndVertex()===iA)&&(oA=oA.reversed(),z=!1);const hA=I(H,z,G),dA=I(H,!z,G);O=nA?dA:hA;const PA={face:G,refV:oA,refN:G.getSurface().getNorm(),v0:z?H.getStartVertex():H.getEndVertex(),v1:z?H.getEndVertex():H.getStartVertex(),uEdge0:hA,uEdge1:dA,refVEdge:H,right:tA};nA?IA.push(PA):IA.unshift(PA)}}};y(w[0].face,w[0].uEdge1,e,r,w[0].right,!0,w),y(w[0].face,w[0].uEdge0,e,r,w[0].right,!1,w);let M=0,N=w[M].uEdge0?w[M].uEdge0.getCurve().getLength():0;for(let G=1;G<w.length;G++){const O=w[G].uEdge0?w[G].uEdge0.getCurve().getLength():0;O>N&&(M=G,N=O)}const S=w[M].v0.getPoint().distanceTo(w[M].v1.getPoint());if(w[0].v0===w[w.length-1].v1)for(;M;){const G=w.shift();w.push(G),M--}a.push(w);const R=(G,O,H,z,tA,nA)=>{do{const IA=[];let iA=O.getStartVertex().getPoint();const W=nA?H.cross(tA):tA.cross(H),oA=G.getEdges().filter(dA=>dA.getSmooth()&&dA!==O).filter(dA=>this._onRefSide(dA.getStartVertex().getPoint(),iA,W));if(oA.length){O=oA[0],iA=O.getStartVertex().getPoint();const dA=O.getCurve().getDirection();z=!0,dA.dot(H)<0?(H=dA.reversed(),z=!1):H=dA}const hA=O.getFaces().filter(dA=>dA).filter(dA=>dA!==G).filter(dA=>dA.getVertexes().some(yA=>this._onRefSide(yA.getPoint(),iA,W)));if(G=hA.length&&a.findIndex(dA=>dA[M].face===hA[0])<0?hA[0]:void 0,G){tA=G.getSurface().getNorm();const dA=I(O,z,G),PA=I(O,!z,G),yA={face:G,refV:H,refN:tA,v0:z?O.getStartVertex():O.getEndVertex(),v1:z?O.getEndVertex():O.getStartVertex(),uEdge0:dA,uEdge1:PA,refVEdge:O,right:nA};IA.push(yA),y(IA[0].face,IA[0].uEdge1,O,z,IA[0].right,!0,IA),y(IA[0].face,IA[0].uEdge0,O,z,IA[0].right,!1,IA),nA?a.push(IA):a.unshift(IA)}}while(G)},U=w[M].refVEdge.getStartVertex()===w[M].v0;R(w[M].face,w[M].refVEdge,w[M].refV,U,w[M].refN,!0),R(w[M].face,w[M].refVEdge,w[M].refV,U,w[M].refN,!1);let b=0;for(const G of a){let O=0;if(G.length===1){const H=G[0].uEdge1?G[0].uEdge1.getCurve().getLength():0;N=Math.max(N,H)}for(const H of G){let z=H.v0,tA=H.uEdge0?H.uEdge0.getAnotherVertex(z):z,nA=H.v1,IA=H.uEdge1?H.uEdge1.getAnotherVertex(nA):nA;H.right||(tA=H.v0,z=H.uEdge0?H.uEdge0.getAnotherVertex(tA):tA,IA=H.v1,nA=H.uEdge1?H.uEdge1.getAnotherVertex(IA):IA);const iA=b,W=b+N,oA=O,hA=O+S,dA=[z.getPoint(),tA.getPoint(),IA.getPoint(),nA.getPoint()],PA=[[iA,oA],[W,oA],[W,hA],[iA,hA]];n.set(H.face,{pts:dA,uvs:PA}),O=hA}b+=N}}static _calTorusUVRange(t,e){let n;for(const E of t){const u=E.getEdges();if(u.length===4&&u.every(Q=>Q.getSmooth())){n=E;break}}if(!n)return;const s=n.getWires()[0].getCoedge3ds(),r=s[0].getEdge(),i=s[1].getEdge(),o=s[2].getEdge(),g=s[3].getEdge(),a=r.getCurve().getLength()-o.getCurve().getLength(),I=i.getCurve().getLength()-g.getCurve().getLength();let c;Math.abs(I)<Math.abs(a)?c=i:c=r,this._calCompressUVRange(n,c,e)}static _calConeUVRange(t,e){const n=t[0],s=n.getEdges().filter(r=>r.getSmooth())[0];this._calCompressUVRange(n,s,e)}static _calCylinderUVRange(t,e){const n=t[0],s=n.getEdges().filter(S=>S.getSmooth())[0];let r=s.getCurve(),i=r.getDirection();const o=n.getSurface(),g=i.dot(o.getCoord().getDx()),a=i.dot(o.getCoord().getDy());Math.abs(g)>Math.abs(a)?g<0&&(i=i.reversed(),r=r.reversed()):a<0&&(i=i.reversed(),r=r.reversed());const I=new Map;let c,E;const u=S=>{let R=I.get(S);return R||(R=i.dot(S.getPoint()),I.set(S,R)),(E===void 0||R<E)&&(E=R),R},Q=(S,R,U,b)=>{const G=R.getClosestPoint(S.getPoint()),O=S.getPoint().subtracted(G);let H=O.getLength();Util.isNearly0(H)||R.getDirection().cross(U).dot(O)<0&&(H=-H);const z=b+H;return(c===void 0||z<c)&&(c=z),z},p=(S,R,U,b,G,O)=>{do{const H=U.getOrigin(),z=O?i.cross(G):G.cross(i),tA=S.getEdges().filter(iA=>iA.getSmooth()&&iA!==R).filter(iA=>this._onRefSide(iA.getStartVertex().getPoint(),H,z));if(tA.length){R=tA[0];const iA=D.ptToCurve3d(R.getStartVertex().getPoint(),U);O?b+=iA:b-=iA,U=R.getCurve(),U.getDirection().isSameDirection(i)||(U=U.reversed())}const nA=R.getFaces().filter(iA=>iA).filter(iA=>iA!==S).filter(iA=>iA.getVertexes().some(oA=>this._onRefSide(oA.getPoint(),H,z))),IA=S;if(S=nA.length&&!e.get(nA[0])?nA[0]:void 0,S){G=S.getSurface().getNorm();const iA=this._getTriangleVertexFromFace(S);if(iA){const W=iA.map(oA=>{const hA=Q(oA,U,G,b),dA=u(oA);return[hA,dA]});e.set(S,{pts:iA.map(oA=>oA.getPoint()),uvs:W})}}else O||IA.getVertexes().map(iA=>Q(iA,U,G,b))}while(S)},w=0,y=n.getSurface().getNorm(),M=this._getTriangleVertexFromFace(n),N=M.map(S=>{const R=Q(S,r,y,w),U=u(S);return[R,U]});if(e.set(n,{pts:M.map(S=>S.getPoint()),uvs:N}),p(n,s,r,w,y,!0),p(n,s,r,w,y,!1),c!==void 0&&E!==void 0)for(const S of e.values())for(const R of S.uvs)R[0]-=c,R[1]-=E}static _recalculateMeshUV(t,e,n,s){if(s){const r=n.pts,i=n.uvs;if(r.length<3||i.length<3)return!1;const o=r[1].subtracted(r[0]),g=r[2].subtracted(r[0]),a=new exports.Vec2(i[0][0],i[0][1]),I=new exports.Vec2(i[1][0]-i[0][0],i[1][1]-i[0][1]),c=new exports.Vec2(i[2][0]-i[0][0],i[2][1]-i[0][1]),E=o.x*g.y-g.x*o.y,u=o.x*g.z-g.x*o.z,Q=o.y*g.z-g.y*o.z;let p;if(!Util.isNearly0(E))p=1;else if(!Util.isNearly0(u))p=2;else if(!Util.isNearly0(Q))p=3;else return!1;const w=y=>{const M=y.subtracted(r[0]);let N=1,S=1;return p===1?(N=(M.x*g.y-g.x*M.y)/E,S=(o.x*M.y-M.x*o.y)/E):p===2?(N=(M.x*g.z-g.x*M.z)/u,S=(o.x*M.z-M.x*o.z)/u):p===3&&(N=(M.y*g.z-g.y*M.z)/Q,S=(o.y*M.z-M.y*o.z)/Q),a.added(I.multiplied(N).add(c.multiplied(S)))};for(let y=0;y<e.uvs.length;y++){const M=new exports.Vec3(e.vertices[y]);e.uvs[y]=w(M).toArray2()}}else return this._recalculateMeshUVByInvBilinear(t,e,n);return!0}static _recalculateMeshUVByInvBilinear(t,e,n){const s=t.getSurface(),r=n.pts,i=n.uvs;if(r.length!==4||i.length!==4)return!1;const o=s.getUVAt(r[0]),g=s.getUVAt(r[1]),a=s.getUVAt(r[3]),I=s.getUVAt(r[2]),c=new exports.Vec2(o.x,o.y),E=new exports.Vec2(g.x,g.y),u=new exports.Vec2(a.x,a.y),Q=new exports.Vec2(I.x,I.y),p=1e-4,w=new InvBilinear(i[0][0],i[1][0],i[0][1],i[2][1],c,E,u,Q);for(let y=0;y<e.uvs.length;y++){const M=e.uvs[y],N=new exports.Vec2(M[0],M[1]);let S;N.equals(c,p)?S=i[0]:N.equals(E,p)?S=i[1]:N.equals(u,p)?S=i[3]:N.equals(Q,p)?S=i[2]:S=w.solve(N),S&&(e.uvs[y]=S)}return!0}static _mergeMesh(t){if(!t.length)return;const e=t[0];for(let n=1;n<t.length;n++){const s=t[n],r=e.vertices.length;s.vertices.forEach(i=>e.vertices.push(i)),s.normals.forEach(i=>e.normals.push(i)),s.uvs.forEach(i=>e.uvs.push(i)),s.faces.forEach(i=>{e.faces.push([i[0]+r,i[1]+r,i[2]+r])})}return e}static _getTriangleVertexFromFace(t){const e=t.getVertexes();if(e.length<3)return;const n=[];n.push(e[0]);const s=e[1].getPoint().subtracted(e[0].getPoint());Util.isNearly0(s.getLength())||n.push(e[1]);for(let r=2;r<e.length;r++){const i=e[r].getPoint().subtracted(e[0].getPoint());if(!s.isParallel(i)){n.push(e[r]);break}}return n}static _onRefSide(t,e,n){return Util.isNearlyBigger(n.dot(t.subtracted(e)),0)}}const index$2=Object.freeze(Object.defineProperty({__proto__:null,ContinuousEdge,ContinuousFace,ContinuousUVComputor,ContinuousUtil},Symbol.toStringTag,{value:"Module"}));function _calEdgeBox(l){if(l.getCurve()instanceof exports.Ln3){const t=new Box3;return t.expandByPoint(l.getStartVertex().getPoint()),t.expandByPoint(l.getEndVertex().getPoint()),t}return l.getBBox()}function addModifyShell(l,t){const e=l.getParent();e&&!t.get(e)&&t.set(e,{addFaces:[],deleteFaces:[],modifiedFaces:[]})}function edgeIntersection(l,t,e,n,s,r,i){if(!l.size||!t.size&&!e)return;const o=p=>t.has(p)||e&&l.has(p),g=[],a=[],I=new Map,c=new Map,E=p=>{let w=c.get(p);return w||(w=p.getCurve(),c.set(p,w)),w},u=new Set;for(const p of Array.from(l)){const w=n(p),y=s.getCandidateOverlaps(p,[w.min,w.max]).filter(N=>N instanceof Edge&&o(N)&&N!==p&&w.intersectsBox(n(N),i.lengthEps)),M=E(p);for(const N of y){const S=X.curve3ds(M,E(N),i),R=[];let U=!1;if(S.forEach(b=>{b.isOverlap?(R.push(M.getPtAt(b.overlap1.min)),R.push(M.getPtAt(b.overlap1.max)),U=!0):R.push(b.point)}),!!R.length){U&&addOverlapInfo(a,p,N),addModifyShell(p,r.modifiedShellsMap),addModifyShell(N,r.modifiedShellsMap);for(const b of R){let G;const O=s.getCandidateOverlaps(b,[b]).filter(H=>H instanceof Vertex&&H.getPoint().equals(b,i.lengthEps));O.length&&(O.sort((H,z)=>b.sqDistanceTo(H.getPoint())-b.sqDistanceTo(z.getPoint())),G=O[0]),G||(G=p.getParent().createVertex(b),u.add(G),s.add(G)),G!==p.getStartVertex()&&G!==p.getEndVertex()&&addToSetInMap(I,p,G),G!==N.getStartVertex()&&G!==N.getEndVertex()&&addToSetInMap(I,N,G)}}}l.delete(p)}const Q=new Map;for(const[p,w]of I){if(w){const y=splitEdgeByVertices(p,Array.from(w));if(y.length){Q.set(p,y);continue}}Q.set(p,[p])}for(const p of a){const w=new Set;g.push(w),p.forEach(y=>{const M=Q.get(y);M?M.forEach(N=>w.add(N)):w.add(y)})}g.forEach(p=>mergeOverlapEdges(Array.from(p),i)),u.forEach(p=>{p.getEdges().length||p.getParent()?.deleteVertex(p)})}function facesShellsMerge(l,t,e=!1,n=!0,s){const r={deleteShells:[],modifiedShellsMap:new Map};if(!l.length)return r;const i=new Set(l),o=new Set,g=new Map,a=new Map,I=new Box3;for(const O of l)O.getEdges().forEach(z=>{let tA=a.get(z);tA||(tA=_calEdgeBox(z),a.set(z,tA),o.add(z),I.union(tA)),g.set(z.getStartVertex(),!1),g.set(z.getEndVertex(),!1)});const c=new Box3,E=new Set,u=new Set;for(const O of t)for(const H of O.getFaces()){if(i.has(H))continue;const z=new Box3;H.getEdges().forEach(nA=>{let IA=a.get(nA);IA||(IA=_calEdgeBox(nA),a.set(nA,IA),u.add(nA)),z.union(IA),E.add(nA.getStartVertex()),E.add(nA.getEndVertex())}),c.union(z),a.set(H,z)}if(!e&&!c.isValid())return r;const Q=O=>{if(O instanceof Vertex)return[O.getPoint()];const H=a.get(O);return[H.min,H.max]},p=Array.from(g.keys());E.forEach(O=>{g.has(O)||p.push(O)});for(const O of a.keys())p.push(O);const w=I.clone().union(c),y=w.getSize().toArray3().sort((O,H)=>O-H),M=w.getCenter().subtracted(new exports.Vec3(0,0,w.getSize().z/2)),N=new Octree(p,Q,M,y[2]+100,s.lengthEps);E.clear();const S=N.getCandidateOverlaps(void 0,[I.min,I.max]).filter(O=>O instanceof Face&&I.intersectsBox(a.get(O),s.lengthEps));if(!e&&!S.length)return r;const R=(O,H)=>!(!e&&O!==H&&g.has(H));for(const[O,H]of g){if(H)continue;const z=O.getPoint(),tA=N.getCandidateOverlaps(O,[z]).filter(nA=>nA instanceof Vertex&&R(O,nA)&&nA.getPoint().equals(z,s.lengthEps));mergeVertices(tA),tA.forEach(nA=>{g.has(nA)&&g.set(nA,!0)}),tA.shift(),N.remove(tA)}g.clear(),edgeIntersection(o,u,e,O=>a.get(O),N,r,s),o.clear(),u.clear();const b=new Map,G=ShellModelingUtil.divideFacesIntoCoplanarGroups(l,I.getCenter());for(const O of G){const H=S.filter(z=>CalcOverlap.isSurfacesCoplaner(z.getSurface(),O[0].getSurface(),Tol.DEFAULT));b.set(O,H)}for(const[O,H]of b){const z=facesBooleanCore(H,O,4,n,void 0,void 0,s);mergeShellModelingResult(r,z)}return r}class FacesShellsMerge extends ShellModelingBase{constructor(t,e,n=!1,s=!0,r){super(e),this._faces=t,this._checkOverlap=n,this._updateSmooth=s,this._tolerance=r||Tol.DEFAULT}_executeImpl(){return facesShellsMerge(this._faces,this._contextShells,this._checkOverlap,this._updateSmooth,this._tolerance)}}const errorPullingFace="推拉面不合法",errorPullingFaceType="推拉面类型不支持",errorPullingDirection="推拉面方向不垂直",errorPullingDistanceIsSmall="推拉距离为零",errorPullingDistanceExceedMax="推拉距离超过最大值";function checkPullPushCondition(l,t){if(!l||!l.getShell())throw new Error(errorPullingFace);const e=l.getSurface();if(!e.isPlane())throw new Error(errorPullingFaceType);if(!e.getNorm().isParallel(t))throw new Error(errorPullingDirection);const n=t.getLength();if(n<Tol.LENGTH)throw new Error(errorPullingDistanceIsSmall);if(n>CONST.MODEL_MAX_LENGTH)throw new Error(errorPullingDistanceExceedMax)}function copyFaceAtOriginPosition(l,t){function e(i){const o=new Coedge3d(i.getEdge(),i.getSameDirWithEdge());return t.set(o,i),o}function n(i){const o=[];for(const a of i.getCoedge3ds()){const I=e(a);o.push(I)}return new Wire(o)}const s=l.getWires().map(i=>n(i)),r=new Face(l.getSurface().clone(),l.getSameDirWithSurface(),s);return l.getShell().addFace(r),r}function transformEdgeCurve(l,t){const e=exports.Matrix4.makeTranslate(t);return l.clone().transform(e)}function moveFace(l,t){const e=l.getShell(),n=new Map,s=l.getCoedge3ds();for(const i of s){const o=i.getStartVertex();let g;n.has(o)||(g=new Vertex(o.getPoint().added(t)),o.getSmooth()&&g.setSmooth(!0),n.set(o,g),e.addVertex(g))}const r=new Map;for(const i of s){let o=r.get(i.getEdge());if(!o){const g=i.getEdge().getStartVertex(),a=i.getEdge().getEndVertex(),I=n.get(g),c=n.get(a),E=transformEdgeCurve(i.getEdge().getCurve(),t);o=new Edge(E,I,c),e.addEdge(o),r.set(i.getEdge(),o)}i.setEdge(o)}ContinuousUtil.cloneContinuousEdgeInfo(r.keys(),i=>r.get(i),exports.Matrix4.makeTranslate(t)),s.length&&l.getSurface().translate(t)}function isSurfacePerpendicularPlane(l,t){const e=t.getNorm();return l instanceof exports.Plane?l.getNorm().isPerpendicular(e):l instanceof exports.Cylinder?l.getCenterAxis().isParallel(e):l.getNormAt({x:0,y:0}).isPerpendicular(e)}function getNewSideFaceInfoFromWire(l,t,e){for(const n of t.getCoedge3ds()){const r=n.getTwins().filter(a=>a).map(a=>a.getWire().getParent()).filter(a=>a!==l),i=r.every(a=>isSurfacePerpendicularPlane(a.getSurface(),l.getSurface())),g={bNeedCreation:r.length===0||!i};e.has(n)||e.set(n,g)}}function getNewSideFaceInfo(l,t){for(const e of l.getWires())getNewSideFaceInfoFromWire(l,e,t)}function buildNewSideFaces(l,t,e,n,s,r){getNewSideFaceInfo(t,r);const i=t;for(const o of i.getWires()){const g=new Map;for(const a of o.getCoedge3ds()){const I=s.get(a),c=a.getEdge(),E=a.getSameDirWithEdge(),u=a.getEndVertex(),Q=I.getEndVertex();let p=g.get(u);if(!p){const tA=new exports.Ln3(u.getPoint(),Q.getPoint());p=new Edge(tA,u,Q),l.addEdge(p),g.set(u,p)}u.getSmooth()&&p.setSmooth(!0);const w=!0,y=I.getEdge(),M=!I.getSameDirWithEdge(),N=a.getStartVertex(),S=I.getStartVertex();let R=g.get(N);if(!R){const tA=new exports.Ln3(N.getPoint(),S.getPoint());R=new Edge(tA,N,S),l.addEdge(R),g.set(N,R)}N.getSmooth()&&R.setSmooth(!0);const U=!1;let b,G;const O=c.getCurve();if(O.isLine3d())b=exports.Plane.makeByPoints([N.getPoint(),u.getPoint(),Q.getPoint(),S.getPoint()],O.getDirection()),G=!0;else if(O.isArc3d()){const tA=exports.Cylinder.makeCylinderByArc3d(O);G=n.isSameDirection(tA.getCenterAxis())===E,b=tA}else throw new Error("not supported");if(!b)continue;const H=new Wire([new Coedge3d(c,E),new Coedge3d(p,w),new Coedge3d(y,M),new Coedge3d(R,U)]);let z;G?z=new Face(b,!0,[H]):(H.reverse(),z=new Face(b,!1,[H])),t.getSameDirWithSurface()===e&&z.reverse(),r.get(a).newSideFace=z}}for(const o of r.values())o.newSideFace&&l.addFace(o.newSideFace)}function getNoNeedCreateLables(l,t){const e=[];let n=[];for(const s of l.getCoedge3ds()){if(t.get(s).bNeedCreation){n.length&&(e.push({startV:n[0],endV:n[n.length-1]}),n.splice(0,n.length));continue}n.length===0?n=[s.getStartVertex(),s.getEndVertex()]:n[n.length-1]=s.getEndVertex()}return n.length&&e.push({startV:n[0],endV:n[n.length-1]}),e}function findOverlapFacesOnSameSurface(l,t,e){const n=new Set,s=[];if(t.forEach(r=>{let i=e.get(r);i||(i=r.getBBox(),e.set(r,i)),s.push(i)}),!t.length||s.every(r=>!r.isValid()))return n;for(const r of l)if(r)for(const i of r.getFaces()){if(t.indexOf(i)!==-1||!i.getSurface()||!CalcOverlap.isSurfacesCoplaner(i.getSurface(),t[0].getSurface()))continue;let o=e.get(i);o||(o=i.getBBox(),e.set(i,o)),!(!o||!o.isValid()||s.every(g=>!g.intersectsBox(o)))&&n.add(i)}return n}function findHalfEdgesWithStartEndVertex(l,t,e,n=0){let s=[],r=-1,i=-1;for(let o=n;o<l.length;o++)if(l[o].getStartVertex().getPoint().equals(t.getPoint())){r=o;break}if(r!==-1){for(let o=r;o<l.length;o++)if(l[o].getEndVertex().getPoint().equals(e.getPoint())){i=o+1;break}}return i!==-1&&(s=l.slice(r,i)),s}function analysisNoNeedCreateSideFaces(l,t,e,n,s){const r=t.getCoedge3ds();let i=0,o=[];for(const g of e)if(o.length&&(i=r.indexOf(o[o.length-1])+1),o=findHalfEdgesWithStartEndVertex(r,g.startV,g.endV,i),!!o.length)for(const a of o){const I=a.getTwins().filter(c=>c.getWire().getParent()!==l).map(c=>c.getWire().getParent());if(!(I.length<1)){if(I.length===1)s.add(I[0]);else if(I.every(c=>c===I[0]||CalcOverlap.isSurfacesCoplaner(c.getSurface(),I[0].getSurface()))){let c=!1;for(const E of n)if(I.some(u=>E.has(u))){I.forEach(u=>E.add(u)),c=!0;break}c||n.push(new Set(I))}}}n.forEach(g=>g.forEach(a=>s.delete(a)))}function booleanTopFaceWithContext(l,t,e,n){const r=findOverlapFacesOnSameSurface(l,[t],new Map);try{const i=t.getEdges(),o=facesSplit(Array.from(r),[t],!1);if(e&&o.resultFaces&&o.resultFaces.length){let g=[];o.evolutionMap&&(g=Array.from(o.evolutionMap.values()).flat());const a=I=>{const c=I.getTwins().filter(E=>{const u=E.getWire();return u.getFace().getWires().indexOf(u)>0}).map(E=>E.getFace());return Array.from(new Set(c))};for(const I of o.resultFaces){if(g.indexOf(I.tag)<0)continue;const c=I.getEdges();if(c.length!==i.length||i.some(Q=>c.indexOf(Q)<0))continue;const E=I.getWires()[0].getCoedge3ds();if(E[0].getTwins().length<=1)continue;let u=a(E[0]);for(let Q=1;Q<E.length;Q++){const p=a(E[Q]);if(u=u.filter(w=>p.indexOf(w)>-1),!u.length)break}if(u.length===1&&u[0]!==I){const Q=new Map;Q.set(I.getShell(),{deleteFaces:[I]}),mergeShellModelingResult(o,{modifiedShellsMap:Q}),disposeFace(I);break}}}mergeShellModelingResult(n,o)}catch(i){i instanceof Error&&(n.errorStr=i.message)}}function checkOverlap(l){const t=new Set;return Array.from(l.keys()).forEach(e=>t.add(e.getEdge())),t.size!==l.size}function booleanSideFacesWithContext(l,t,e,n,s){const r=t.getWires(),i=r.map(I=>getNoNeedCreateLables(I,e)),o=Array.from(e.values()).map(I=>I.newSideFace).filter(I=>!!I),g=checkOverlap(e),a=new FacesShellsMerge(o,l,g,!1).execute();if(mergeShellModelingResult(s,a),!n)for(let I=0;I<r.length;I++){const c=[],E=new Set;if(analysisNoNeedCreateSideFaces(t,r[I],i[I],c,E),!n)for(const u of c)try{const Q=Array.from(u),p=facesBooleanCore([Q[0]],Q.slice(1,Q.length),0,!1);mergeShellModelingResult(s,p)}catch(Q){Q instanceof Error&&(s.errorStr=Q.message)}E.forEach(u=>{const Q=new Map;Q.set(u.getShell(),{deleteFaces:[u]}),mergeShellModelingResult(s,{modifiedShellsMap:Q}),disposeFace(u)})}}function mergeEdgesAlongPullPushVec(l,t){const e=[];for(const n of l){const s=n.getEdges().filter(a=>a.getCoedge3ds().length);if(s.length!==2)continue;const r=s[0].getCurve(),i=s[1].getCurve();if(!r.isLine3d()||!i.isLine3d())continue;const o=r.getDirection(),g=i.getDirection();!o.isParallel(t)||!g.isParallel(t)||e.push([s[0],s[1],n])}e.forEach(n=>mergeConnectedEdge(n[0],n[1],n[2]))}function pullPushFaceCore(l,t,e,n,s,r,i){checkPullPushCondition(l,t),i.deleteShells=[],i.modifiedShellsMap=new Map,i.evolutionMap=new Map;const o=l.getCenterNorm(),g=o.dot(t)<0,a=l.getShell();addShellModifyInfo(i.modifiedShellsMap,a);const I=new Map,c=copyFaceAtOriginPosition(l,I);addShellModifyInfo(i.modifiedShellsMap,c.getShell(),[c]);const E=n&&g,u=l,Q=c;moveFace(u,t),addShellModifyInfo(i.modifiedShellsMap,c.getShell(),void 0,void 0,[u]);const p=new Map;buildNewSideFaces(a,Q,E,t,I,p);for(const y of p.values())y.newSideFace&&addShellModifyInfo(i.modifiedShellsMap,a,[y.newSideFace]);r&&booleanSideFacesWithContext(e,Q,p,n,i);const w=new Set;if(Q.getCoedge3ds().forEach(y=>w.add(y.getStartVertex())),n)g?u.reverse():Q.reverse();else{const y=new Map;y.set(Q.getShell(),{deleteFaces:[Q]}),mergeShellModelingResult(i,{modifiedShellsMap:y}),disposeFace(Q)}r&&booleanTopFaceWithContext(e,u,s,i),mergeEdgesAlongPullPushVec(w,o);for(const y of i.modifiedShellsMap.values()){const M=new Set;y.addFaces&&y.addFaces.forEach(N=>N.getVertexes().forEach(S=>M.add(S))),y.modifiedFaces&&y.modifiedFaces.forEach(N=>N.getVertexes().forEach(S=>M.add(S))),SmoothUtil.udpateSmoothVertices(M)}for(const y of i.modifiedShellsMap.keys())ContinuousUtil.removeUnusedContinuousEdgeInfo(y)}class PullPushFace extends ShellModelingBase{constructor(t,e,n,s,r=!0,i=!0){super(n),this._face=t,this._pullPushVec=e,this._bExtrudeBehavior=s,this._bTopFaceDeal=r,this._bBoolean=i}_executeImpl(){const t={};try{pullPushFaceCore(this._face,this._pullPushVec,this._contextShells,this._bExtrudeBehavior,this._bTopFaceDeal,this._bBoolean,t)}catch(e){return e instanceof Error&&(t.errorStr=e.message),t}return t}}class IsolateFaces extends ShellModelingBase{constructor(t,e,n=[]){super(n),this._faces=t,this._originShell=e}_executeImpl(){const t=new Map,e=new Map,n=new Shell;for(const i of this._faces){const o=i.getCoedge3ds();for(const g of o){const a=g.getEdge();if(e.has(a))continue;const I=a.getStartVertex();let c=t.get(I);c||(c=new Vertex(I.getPoint()),t.set(I,c),c.setFlags(I.getFlags()),c.setData(BrepUtil.loadMapObj(BrepUtil.dumpMapObj(I.getData()))),n.addVertex(c));const E=a.getEndVertex();let u=t.get(E);u||(u=new Vertex(E.getPoint()),t.set(E,u),u.setFlags(E.getFlags()),u.setData(BrepUtil.loadMapObj(BrepUtil.dumpMapObj(E.getData()))),n.addVertex(u));const Q=new Edge(a.getCurve().clone(),c,u);e.set(a,Q),Q.setFlags(a.getFlags()),Q.setData(BrepUtil.loadMapObj(BrepUtil.dumpMapObj(a.getData()))),n.addEdge(Q)}}ContinuousUtil.cloneContinuousEdgeInfo(e.keys(),i=>e.get(i));for(const i of this._faces){for(const o of i.getCoedge3ds()){const g=o.getEdge(),a=e.get(g);g.deleteCoedge3d(o),o.setEdge(a)}this._originShell.deleteFace(i),n.addFace(i)}const s=[];for(const i of e.keys())i.getCoedge3ds().length<=0&&(i.dispose(),s.push(i.tag),(i.getParent()||this._originShell).deleteEdge(i));for(const i of t.keys())i.getEdges().length<=0&&(i.getParent()||this._originShell).deleteVertex(i);const r={newShell:n,edgesDelete:s};return this._originShell.getFaces().length?(r.modifiedShellsMap=new Map,r.modifiedShellsMap.set(this._originShell,{deleteFaces:Array.from(this._faces)}),ContinuousUtil.removeUnusedContinuousEdgeInfo(this._originShell)):r.deleteShells=[this._originShell],r.addShells=[n],r}}class CopyFaces extends ShellModelingBase{constructor(t,e,n,s=[]){super(s),this._faces=t,this._reuseTag=e,this._matrix=n}_executeImpl(){const t=new Map;for(const n of this._faces){const s=n.getShell();s&&(t.has(s)?t.get(s).push(n):t.set(s,[n]))}const e={addShells:[],evolutionMap:new Map};for(const[n,s]of t){const r=new Map,i=this._cloneFacesByShell(n,s,this._reuseTag,r);this._matrix&&(i.transform(this._matrix),ContinuousUtil.transformContinuousEdgeInfo(i.getEdges(),this._matrix));for(const[o,g]of r)addEvolutionInfo(e,o,g);e.addShells.push(i)}return e}_cloneFacesByShell(t,e,n,s){const r="TOPO_CLONE";function i(w,y){const M=w.getEdge().userData[r],N=new Coedge3d(M,w.getSameDirWithEdge());return N.setPCurve(w.getPCurve()?.clone()),y&&(N.tag=w.tag),N}function o(w,y){const M=w.getCoedge3ds().map(S=>i(S,y)),N=new Wire(M);return y&&(N.tag=w.tag),N}function g(w,y){const M=new Face(w.getSurface().clone(),w.getSameDirWithSurface());M.setData(BrepUtil.loadMapObj(BrepUtil.dumpMapObj(w.getData()))),y&&(M.tag=w.tag);for(const N of w.getWires()){const S=o(N,y);M.addWire(S)}return M}function a(w){const y=[];for(let M=0,N=w.length;M<N;M++){const S=w[M],R=new Vertex(S.getPoint());R.setFlags(S.getFlags()),R.setData(BrepUtil.loadMapObj(BrepUtil.dumpMapObj(S.getData()))),S.userData=S.userData||{},S.userData[r]=R,y.push(R)}return y}function I(w,y){const M=[];for(let N=0,S=w.length;N<S;N++){const R=w[N],U=R.getStartVertex(),b=R.getEndVertex(),G=U.userData[r],O=b.userData[r],H=new Edge(R.getCurve().clone(),G,O);H.setFlags(R.getFlags()),H.setData(BrepUtil.loadMapObj(BrepUtil.dumpMapObj(R.getData()))),R.userData=R.userData||{},R.userData[r]=H,y&&(H.tag=R.tag),M.push(H)}return M}const c=new Shell;if(n&&(c.tag=t.tag),!e.length)return c;const E=new Set,u=new Set;e.forEach(w=>{w.getEdges().forEach(y=>u.add(y)),w.getVertexes().forEach(y=>E.add(y))});const Q=Array.from(E);a(Q).forEach(w=>c.addVertex(w));const p=Array.from(u);I(p,n).forEach(w=>c.addEdge(w)),ContinuousUtil.cloneContinuousEdgeInfo(p,w=>w.userData[r]);for(const w of e){const y=g(w,n);c.addFace(y),s&&s.set(w,y)}for(const w of Q)w.userData[r]=void 0;for(const w of p)w.userData[r]=void 0;return c}}function splitShell(l){const t=ShellModelingUtil.divideFacesIntoConnectGroups(l.getFaces(),!0),e=[l];for(let n=1;n<t.length;n++){const s=new Shell;e.push(s);const r=t[n],i=new Set,o=new Set;r.forEach(g=>{g.getEdges().forEach(a=>i.add(a)),g.getVertexes().forEach(a=>o.add(a))});for(const g of r)l.deleteFace(g),s.addFace(g);for(const g of i)l.deleteEdge(g),s.addEdge(g);for(const g of o)l.deleteVertex(g),s.addVertex(g);ContinuousUtil.transferContinuousEdgeInfo(Array.from(i),l,s)}return e}class MoveEdges extends ShellModelingBase{constructor(t,e,n=[]){super(n),this._overlapInfo=[],this._edges=new Set(t),this._shell=t[0].getShell(),this._transVect=e}preview(){const t={};try{this._previewCore()}catch(e){return e instanceof Error&&(t.errorStr=e.message),t}return t}_executeImpl(){return this._moveEdgesCore()}_moveEdgesCore(){const t={errorStr:"success"};if(this._transVect.getSqLength()<Tol.LENGTH*Tol.LENGTH||this._edges.size<1)return t;const e=this._getAllConnectElems();if(e.shells.size>1)return t.errorStr="edges not in one shell",t;let n;for(const S of e.shells)n=S;if(e.vertices.size===n.getVertexs().length){n.translate(this._transVect);const S=new Map;return addShellModifyInfo(S,n,void 0,void 0,Array.from(e.faces)),t.modifiedShellsMap=S,t}const s=this._getAllAdjacentEdges(e.vertices),r=this._getAllAdjacentFaces(s,e.faces),i=this._canUseTransVect(s,r,e.faces);if(i!=="")return t.errorStr=i,t;if(this._judgeSelfIntersect(this._edges,s,e.vertices,e.faces,r))return t.errorStr="self intersect!",t;this._edges.forEach(S=>{S.getCurve().translate(this._transVect)}),e.vertices.forEach(S=>{S.getPoint().translate(this._transVect)}),e.faces.forEach(S=>{const R=S.getSurface();if(R.getType()===EN_GEO_TYPE.PLANE){const U=R,b=U.getNorm();if(!this._transVect.isPerpendicular(b)){const G=S.getWires()[0],O=G.getCoedge3ds().length;if(O===1||O===2||O>4)U.translate(this._transVect);else if(O===3){const H=G.getCoedge3ds()[0].getStartVertex().getPoint(),z=G.getCoedge3ds()[1].getStartVertex().getPoint(),tA=G.getCoedge3ds()[2].getStartVertex().getPoint(),nA=exports.Plane.makeBy3Pts(H,z,tA);if(!nA)throw new Error("unkonwn error");S.setSurface(nA)}else if(O===4){const H=[];for(const tA of G.getCoedge3ds())H.push(tA.getEdge().getStartVertex().getPoint());const z=exports.Plane.makeByPoints(H);if(!z)throw new Error("unkonwn error");S.setSurface(z)}}}else throw new Error("not support non-plane surface")}),this._dealAdjacentCurves(s,e.vertices),this._dealAdjacentFaces(r,e.vertices);const g=new Set,a=new Set,I=new Set;this._dealDegeneratedCase(g,a);for(const S of e.faces)n.getFaces().findIndex(R=>R===S)<0?a.add(S):g.add(S);for(const S of r)n.getFaces().findIndex(R=>R===S)<0?a.add(S):g.add(S);const c=(S,R)=>{S.deleteWire(R);const U=S.getShell();for(const b of R.getCoedge3ds()){const G=b.getEdge();if(G.deleteCoedge3d(b),G.getCoedge3ds().length<1){const O=G.getStartVertex(),H=G.getEndVertex();U.deleteEdge(G),G.dispose(),O.getEdges().length<1&&U.deleteVertex(O),H.getEdges().length<1&&U.deleteVertex(H)}}};for(const S of g)if(n.getFaces().findIndex(R=>R===S)>=0){const R=S.calcPolygon(),U=R.loops[0];U.isAnticlockwise()||S.getWires()[0].reverse();for(let b=1;b<R.loops.length;b++){const G=S.getWires()[b],O=R.loops[b],H=PJ.loopToLoop(U,O);H===LoopsPJType.OUT?c(S,G):H===LoopsPJType.INTERSECT&&(c(S,G),G.reverse())}}const E=new Map,u=[],Q=[],p=[];g.forEach(S=>u.push(S)),a.forEach(S=>Q.push(S)),I.forEach(S=>p.push(S)),addShellModifyInfo(E,n,p,Q,u),t.modifiedShellsMap=E;const w=[];t.modifiedShellsMap.forEach(S=>{S.modifiedFaces&&w.push(...S.modifiedFaces),S.addFaces&&w.push(...S.addFaces)});const y=[];for(const S of w){const R=S.getSurface();let U=!1;for(const b of y)if(CalcOverlap.isSurfacesCoplaner(R,b.surf)){U=!0,b.faces.push(S);break}U||y.push({surf:R,faces:[S]})}for(const S of y){const R=[];for(const b of n.getFaces())!S.faces.find(G=>G.tag===b.tag)&&CalcOverlap.isSurfacesCoplaner(S.surf,b.getSurface())&&R.push(b);if(R.length<1)continue;const U=facesSplit(S.faces,R);mergeShellModelingResult(t,U)}const M=[],N={addShells:[],modifiedShellsMap:new Map};for(const S of e.shells){const R=splitShell(S);R.map(U=>M.push(...U.getFaces()));for(let U=1;U<R.length;U++)addShellModifyInfo(N.modifiedShellsMap,S,void 0,R[U].getFaces().slice()),N.addShells.push(R[U])}if(mergeShellModelingResult(t,N),this._contextShells.length>0){const S=new FacesShellsMerge(M,this._contextShells,!0).execute();mergeShellModelingResult(t,S)}return t}_previewCore(){return this._moveEdgesCore()}_getAllConnectElems(){const t=new Set,e=new Set,n=new Set;return this._edges.forEach(s=>{s.getParent()&&n.add(s.getParent());for(const r of s.getFaces())e.add(r);t.add(s.getStartVertex()),t.add(s.getEndVertex())}),{vertices:t,faces:e,shells:n}}_getAllAdjacentEdges(t){const e=new Set;return t.forEach(n=>{for(const s of n.getEdges())this._edges.has(s)||e.add(s)}),e}_getAllAdjacentFaces(t,e){const n=new Set;return t.forEach(s=>{s.getFaces().forEach(r=>{e.has(r)||n.add(r)})}),n}_canUseTransVect(t,e,n){for(const s of t){const r=s.getCurve().getType();if(r!==EN_GEO_TYPE.LN_3&&r!==EN_GEO_TYPE.ARC_3)return"adjacent curve is not line or arc"}for(const s of n){const r=s.getSurface();if(r.getType()!==EN_GEO_TYPE.PLANE)return"surface is not plane";const o=r.getNorm();if(!this._transVect.isPerpendicular(o)){if(s.getWires().length>1)return"face has inner wire";const g=s.getWires()[0],a=new Set;for(const E of g.getCoedge3ds())a.add(E.getStartVertex());const I=[];for(const E of g.getCoedge3ds()){const u=E.getEdge();this._edges.has(u)&&I.push(E)}const c=new Set;for(const E of I)c.add(E.getStartVertex()),c.add(E.getEndVertex());if(c.size===a.size)continue;if(c.size>2||a.size>4)return"can't move";if(a.size===4){for(const y of g.getCoedge3ds())if(y.getEdge().getCurve().getType()!==EN_GEO_TYPE.LN_3)return"can't move";const E=I[0],u=E.getIndexInWire(),Q=g.getCoedge3dByIndex((u+2)%4),p=E.getEdge().getCurve(),w=Q.getEdge().getCurve();if(!p.isParallelTo(w))return"can't move"}if(a.size===3){for(const E of g.getCoedge3ds())if(E.getEdge().getCurve().getType()!==EN_GEO_TYPE.LN_3)return"can't move"}}}for(const s of e){const r=s.getSurface();if(r.getType()!==EN_GEO_TYPE.PLANE)return"connect surface is not plane";const o=r.getNorm();if(!this._transVect.isPerpendicular(o)){if(s.getWires().length>1)return"connect face has inner wire";const g=s.getWires()[0];if(g.getCoedge3ds().length>3)return"can't move";for(const I of g.getCoedge3ds())if(I.getEdge().getCurve().getType()!==EN_GEO_TYPE.LN_3)return"can't move"}}return""}_judgeSelfIntersect(t,e,n,s,r){const i=new Map,o=new Map;t.forEach(g=>{const a=g.getCurve().clone();a.translate(this._transVect),i.set(g,a)}),n.forEach(g=>{const a=g.getPoint().clone();a.translate(this._transVect),o.set(g,a)}),e.forEach(g=>{const a=g.getCurve().clone();if(n.has(g.getStartVertex())&&n.has(g.getEndVertex()))a.translate(this._transVect),i.set(g,a);else if(a.getType()===EN_GEO_TYPE.LN_3){let I=o.get(g.getStartVertex());I=I!==void 0?I:g.getStartVertex().getPoint();let c=o.get(g.getEndVertex());c=c!==void 0?c:g.getEndVertex().getPoint();let E;I.equals(c)?E=new exports.Ln3(I,new exports.Vec3(1,0,0),[0,0]):E=new exports.Ln3(I,c),i.set(g,E)}else if(a.getType()===EN_GEO_TYPE.ARC_3){const I=g.getCurve(),c=I.getRange().getLength(),E=Math.sin(c/2),u=I.getNormal();let Q=o.get(g.getStartVertex());Q=Q!==void 0?Q:g.getStartVertex().getPoint();let p=o.get(g.getEndVertex());p=p!==void 0?p:g.getEndVertex().getPoint();const w=Q.midTo(p),y=p.subtracted(Q),M=u.cross(y).normalize();c>CONST.PI&&M.reverse();const N=new exports.Ln3(w,M,Interval.infinitArray()),S=w.distanceTo(Q),R=S/E,U=Math.sqrt(R*R-S*S),b=N.getPtAt(U),G=R*I.getB()/I.getA(),O=y.reversed(),H=c>CONST.PI?M:M.reversed(),z=new exports.Coord3(b,O,H),tA=O.angleTo(Q.subtracted(b),u),nA=new exports.Arc3(z,R,G,[tA,tA+c]);i.set(g,nA)}else throw new Error("not support curve type")});for(const g of s){const a=[],I=g.getWires();for(let c=0;c<I.length;++c){const E=I[c];for(const u of E.getCoedge3ds()){let Q=i.get(u.getEdge());Q||(Q=u.getEdge().getCurve()),a.push([Q,u.getEdge(),c!==0])}}for(let c=0;c<a.length;c++){const E=a[c][0];for(let u=c+1;u<a.length;u++){const Q=a[u][0],p=X.curve3ds(E,Q);for(const w of p){if(w.isOverlap){a[c][1]&&a[u][1]&&this._overlapInfo.push({overlap:w,curve1:a[c][1],curve2:a[u][1],crv1Inner:a[c][2],crv2Inner:a[u][2]});continue}if(!(w.point.equals(Q.getStartPt())||w.point.equals(Q.getEndPt())||w.point.equals(E.getStartPt())||w.point.equals(E.getEndPt())))return!0}}}}for(const g of r){const a=[],I=g.getWires();for(let c=0;c<I.length;++c){const E=I[c];for(const u of E.getCoedge3ds()){let Q=i.get(u.getEdge());Q||(Q=u.getEdge().getCurve()),a.push([Q,u.getEdge(),c!==0])}}for(let c=0;c<a.length;c++){const E=a[c][0];for(let u=c+1;u<a.length;u++){const Q=a[u][0],p=X.curve3ds(E,Q);for(const w of p)if(!(w.point.equals(Q.getStartPt())||w.point.equals(Q.getEndPt())))return!0}}}return!1}_dealAdjacentCurves(t,e){t.forEach(n=>{if(e.has(n.getStartVertex())&&e.has(n.getEndVertex()))n.getCurve().translate(this._transVect);else{const s=n.getCurve();if(s.isLine3d()){const r=n.getStartVertex().getPoint(),i=n.getEndVertex().getPoint();let o;r.equals(i)?o=new exports.Ln3(r,new exports.Vec3(1,0,0),[0,0]):o=new exports.Ln3(r,i),n.setCurve(o)}else if(s.isArc3d()){const r=n.getCurve(),i=r.getRange().getLength(),o=Math.sin(i/2),g=r.getNormal(),a=n.getStartVertex().getPoint(),I=n.getEndVertex().getPoint(),c=a.midTo(I),E=I.subtracted(a),u=g.cross(E).normalize();i>CONST.PI&&u.reverse();const Q=new exports.Ln3(c,u,Interval.infinitArray()),p=c.distanceTo(a),w=p/o,y=Math.sqrt(w*w-p*p),M=Q.getPtAt(y),N=w*r.getB()/r.getA(),S=E.reversed(),R=i>CONST.PI?u:u.reversed(),U=new exports.Coord3(M,S,R),b=S.angleTo(a.subtracted(M),g),G=new exports.Arc3(U,w,N,[b,b+i]);n.setCurve(G)}else throw new Error("not support curve type")}})}_dealAdjacentFaces(t,e){for(const n of t){const s=n.getSurface();if(s.getType()===EN_GEO_TYPE.PLANE){const i=s.getNorm();if(!this._transVect.isPerpendicular(i)){const o=n.getWires()[0];if(o.getCoedge3ds().length===3){const a=o.getCoedge3ds()[0].getStartVertex().getPoint(),I=o.getCoedge3ds()[1].getStartVertex().getPoint(),c=o.getCoedge3ds()[2].getStartVertex().getPoint(),E=exports.Plane.makeBy3Pts(a,I,c);if(!E)throw new Error("unkonwn error");n.setSurface(E)}else throw new Error("unkonwn error")}}else throw new Error("not support non-plane surface")}}_dealDegeneratedCase(t,e){if(this._overlapInfo.length<1)return;MathError.assert(this._edges.size===1,"暂时不支持多条移动边重合情况");let n;this._edges.forEach(Q=>{n=Q});const s=[],r=[];this._overlapInfo.forEach(Q=>{Q.curve1===n?s.push(Q.curve2):s.push(Q.curve1),r.push(Q.curve1.getCurve().getStartPt()),r.push(Q.curve1.getCurve().getEndPt()),r.push(Q.curve2.getCurve().getStartPt()),r.push(Q.curve2.getCurve().getEndPt());const p=Q.overlap.overlap1;r.push(Q.curve1.getCurve().getPtAt(p.min)),r.push(Q.curve1.getCurve().getPtAt(p.max))});const i=n.getCurve().getDirection();function o(Q,p){return Q.subtracted(p).dot(i)>0?1:Q.subtracted(p).dot(i)<0?-1:0}r.sort(o);const g=[];g.push(r[0]);for(let Q=1;Q<r.length;++Q)r[Q-1].equals(r[Q])||g.push(r[Q]);MathError.assert(g.length>1,"重合情况出错");const a=new Set;let I=this._shell.createVertex(g[0]);a.add(I);const c=[];for(let Q=1;Q<g.length;++Q){const p=this._shell.createVertex(g[Q]),w=this._shell.createEdge(new exports.Ln3(g[Q-1],g[Q]),I,p);I=p,a.add(I),c.push(w)}const E=new Map;s.push(n);for(const Q of s){const p=[];for(const w of c)Q.getCurve().containsPt(w.getCurve().getStartPt())&&Q.getCurve().containsPt(w.getCurve().getEndPt())&&p.push(w);E.set(Q,p)}for(const Q of E){const p=Q[0],w=Q[1];if(w.length<1)continue;const y=p.getCurve().getEndTangent().isSameDirection(w[0].getCurve().getEndTangent());p.getFaces().forEach(M=>{M.getWires().forEach(N=>{const S=N.getCoedge3ds();for(let R=0;R<=S.length-1;++R){const U=S[R];if(p===U.getEdge()){const b=[],G=y?U.getSameDirWithEdge():!U.getSameDirWithEdge();w.forEach(O=>{b.push(new Coedge3d(O,G))}),G||b.reverse(),N.replaceCoedge3d(R,b),t.add(M);break}}})})}for(const Q of E){const p=Q[0],w=Q[1];if(w.length<1)continue;const y=p.getCurve().getEndTangent().isSameDirection(w[0].getCurve().getEndTangent()),M=p.getStartVertex(),N=p.getEndVertex(),S=(R,U)=>{R.getEdges().forEach(b=>{R.getPoint().equals(b.getStartVertex().getPoint())&&b.setStartVertex(U),R.getPoint().equals(b.getEndVertex().getPoint())&&b.setEndVertex(U)}),a.has(R)||this._shell.deleteVertex(R)};y?(S(M,w[0].getStartVertex()),S(N,w[w.length-1].getEndVertex())):(S(N,w[0].getStartVertex()),S(M,w[w.length-1].getEndVertex())),p.dispose(),this._shell.deleteEdge(p)}const u=[];for(const Q of this._shell.getEdges()){const p=Q.getCurve();if(Q.getCoedge3ds().length<1){u.push(Q);continue}if(p.getLength()<Tol.LENGTH){const w=Q.getCoedge3ds();for(const y of w)y.getWire().deleteCoedge3d(y);this._shell.deleteEdge(Q),Q.dispose()}}u.forEach(Q=>{Q.dispose(),this._shell.deleteEdge(Q)});for(const Q of t){const p=Q.getWires();for(let M=0;M<p.length;++M)for(let N=M+1;N<p.length;++N){const S=p[M].getCoedge3ds(),R=p[N].getCoedge3ds();if(!(S.length<1||R.length<1))for(let U=0;U<S.length;++U){const b=R.findIndex(G=>S[U].getEdge()===G.getEdge());if(b>-1){const G=R.slice(b+1).concat(R.slice(0,b));S[U].dispose(),p[M].replaceCoedge3d(U,G),p[N].dispose();break}}}Q.setWires(Q.getWires().filter(M=>M.getCoedge3ds().length>0));for(const M of p){const N=M.getCoedge3ds(),S=new Set;for(let R=0;R<N.length;++R)if(!S.has(N[R]))for(let U=R+1;U<N.length;++U)S.has(N[U])||N[R].getEdge()===N[U].getEdge()&&(S.add(N[R]),S.add(N[U]));for(const R of S)M.deleteCoedge3d(R),R.dispose()}const w=Q.getWires(),y=[];for(const M of w){if(M.getCoedge3ds().length<3){M.dispose();break}y.push(M)}Q.setWires(y),Q.getWires().length<1&&(e.add(Q),t.delete(Q),this._shell.deleteFace(Q))}for(const Q of this._shell.getEdges())Q.getCoedge3ds().length<1&&this._shell.deleteEdge(Q);for(const Q of this._shell.getVertexs())Q.getEdges().length<1&&this._shell.deleteVertex(Q)}}class MoveFaces extends ShellModelingBase{constructor(t,e,n=[]){super(n),this._faces=new Set(t),this._transVect=e}_executeImpl(){const t=new Set;for(const n of this._faces)for(const s of n.getCoedge3ds())t.add(s.getEdge());return new MoveEdges(Array.from(t),this._transVect).execute()}}const errorRounding2DNotAdjacent="倒圆角的边不相邻",errorRounding2DNotLine="倒圆角的边不是直线边",errorRounding2DNoFace="倒圆角的边不共面",errorRounding2DNotCoplanar="倒圆角边关联的面不在同一平面上",errorRounding2DColinear="倒圆角的边共线";class Rounding2D extends ShellModelingBase{constructor(t,e,n,s,r){super(s),this._edge1=t,this._edge2=e,this._radius=n,this._useSmooth=r}_executeImpl(){const t=this._canRounding(this._edge1,this._edge2);if(t)return{errorStr:t};const e=this._edge1.getStartVertex()===this._commonV,n=this._edge2.getStartVertex()===this._commonV,s={modifiedShellsMap:new Map},r=this._edge1.getCurve(),i=this._edge2.getCurve();let o=r.getDirection().dot(i.getDirection());if(e!==n&&(o=-o),Util.isNearlyEqual(o,1)||Util.isNearlyEqual(o,-1))return{errorStr:errorRounding2DColinear};const g=Math.sqrt((1-o)/(1+o)),a=this._radius/g,I=this._edge1.getStartVertex().getPoint().distanceTo(this._edge1.getEndVertex().getPoint()),c=this._edge2.getStartVertex().getPoint().distanceTo(this._edge2.getEndVertex().getPoint());let E=a;(Util.isNearlyBiggerOrEqual(a,I)||Util.isNearlyBiggerOrEqual(a,c))&&(E=Math.min(I,c));let u=this._commonV.getPoint();if(!r.containsPt(u)||!i.containsPt(u)){const tA=r.getDirection(),nA=i.getDirection(),IA=i.getOrigin().subtracted(r.getOrigin()),iA=[[tA.dot(tA),-tA.dot(nA)],[nA.dot(tA),-nA.dot(nA)]],W=[tA.dot(IA),nA.dot(IA)],oA=numeric1_2_6Exports.solve(iA,W);u=r.getPtAt(oA[0])}const Q=r.getParamAt(u),p=i.getParamAt(u);let w,y;e?w=Q+E:w=Q-E,n?y=p+E:y=p-E;let M=e?this._edge1.getEndVertex():this._edge1.getStartVertex(),N=this._edge1;if(!r.getRange().containsPtAtStartOrEnd(w)){M=new Vertex(r.getPtAt(w));const tA=splitEdgeByVertex(this._edge1,M);N=e?tA[0]:tA[1]}let S=n?this._edge2.getEndVertex():this._edge2.getStartVertex(),R=this._edge2;if(!i.getRange().containsPtAtStartOrEnd(y)){S=new Vertex(i.getPtAt(y));const tA=splitEdgeByVertex(this._edge2,S);R=n?tA[0]:tA[1]}const U=this._edge1.getParent(),b=this._calRoundingArc3d(r,i,M.getPoint(),S.getPoint()),G=[];if(this._useSmooth){const tA=b.discreteBySpan();tA.pop(),tA.shift();const nA=tA.map(IA=>new Vertex(IA));nA.forEach(IA=>{IA.setSmooth(!0),U.addVertex(IA)}),nA.push(S),nA.unshift(M);for(let IA=0;IA<nA.length-1;IA++){const iA=new Edge(new exports.Ln3(nA[IA].getPoint(),nA[IA+1].getPoint()),nA[IA],nA[IA+1]);G.push(iA),U.addEdge(iA)}ContinuousUtil.addContinuousEdgeInfo(G,()=>b)}else{const tA=new Edge(b,M,S);G.push(tA),U.addEdge(tA)}const O=N.getCoedge3ds(),H=R.getCoedge3ds(),z=[];for(const tA of O){const nA=tA.getNextCoedge();if(H.indexOf(nA)>-1){z.push({c1:tA,c2:nA,sameDir:!0});continue}const IA=tA.getPrevCoedge();if(H.indexOf(IA)>-1){z.push({c1:tA,c2:IA,sameDir:!1});continue}}for(const tA of z)if(tA.sameDir){const nA=tA.c1.getWire();nA.deleteCoedge3d(tA.c2);const IA=G.map(iA=>new Coedge3d(iA,!0));nA.replaceCoedge3d(tA.c1.getIndexInWire(),IA),N.deleteCoedge3d(tA.c1),R.deleteCoedge3d(tA.c2)}else{const nA=tA.c1.getWire();nA.deleteCoedge3d(tA.c1);const IA=G.map(iA=>new Coedge3d(iA,!1)).reverse();nA.replaceCoedge3d(tA.c2.getIndexInWire(),IA),N.deleteCoedge3d(tA.c1),R.deleteCoedge3d(tA.c2)}return N.getCoedge3ds().length||(N.dispose(),U.deleteEdge(N)),R.getCoedge3ds().length||(R.dispose(),U.deleteEdge(R)),this._commonV.getEdges().length||(this._commonV.getParent()||U).deleteVertex(this._commonV),addShellModifyInfo(s.modifiedShellsMap,U,void 0,void 0,this._commonF),s}_canRounding(t,e){if(t.getCurve().getType()!==EN_GEO_TYPE.LN_3||e.getCurve().getType()!==EN_GEO_TYPE.LN_3)return errorRounding2DNotLine;const n=t.getFaces(),s=e.getFaces();if(!n.length||t.getParent()===void 0||!s.length||e.getParent()===void 0||t.getParent()!==e.getParent())return errorRounding2DNoFace;const r=[t.getStartVertex(),t.getEndVertex()],i=[e.getStartVertex(),e.getEndVertex()],o=r.filter(I=>i.findIndex(c=>c===I)>-1),g=n.filter(I=>s.findIndex(c=>c===I)>-1);if(o.length!==1||!g.length)return errorRounding2DNotAdjacent;const a=[...n,...s].map(I=>I.getSurface());if(!a.every(I=>I.isPlane())||!a.every(I=>I.isCoplanar(a[0])))return errorRounding2DNotCoplanar;this._commonV=o[0],this._commonF=g}_calRoundingArc3d(t,e,n,s){const r=t.getDirection(),i=e.getDirection(),o=r.cross(i),g=o.cross(r).normalize(),a=o.cross(i).normalize(),I=new exports.Ln3(n,g,[-1e4,1e4]),E=new exports.Ln3(s,a,[-1e4,1e4]).getOrigin().subtracted(I.getOrigin()),u=[[g.dot(g),-g.dot(a)],[a.dot(g),-a.dot(a)]],Q=[g.dot(E),a.dot(E)],p=numeric1_2_6Exports.solve(u,Q),w=I.getPtAt(p[0]),y=w.distanceTo(n),M=w.subtracted(n).cross(w.subtracted(s));return exports.Arc3.makeArcByStartEndPoints(w,y,M,n,s,!0)}}function mergeConnectedFace(l){if(l.length===1)return l[0];const t=l.map(g=>g.getSurface());if(!t.every(g=>g.isPlane()))return;const e=new Set,n=new Set;for(const g of l)for(const a of g.getEdges())n.has(a)?(n.delete(a),e.add(a)):n.add(a);if(!e.size)return;const s=t.length?t[0]:void 0,r=ShellModelingUtil.detectFacesFromEdges(Array.from(n),s);if(r.length!==1)return;let i;for(const g of r){const a=g.map(I=>{const c=I.edges.map(E=>new Coedge3d(E.edge,E.bSameDir));return new Wire(c)});i=new Face(s.clone(),!0,a)}const o=l[0].getShell();return i&&(o.addFace(i),l.forEach(g=>disposeFace(g))),i}class MergeConnectFaces extends ShellModelingBase{constructor(t,e=[]){super(e),this._faces=t}_executeImpl(){const t={modifiedShellsMap:new Map},e=this._faces.filter(g=>g.getSurface().isPlane()),n=()=>e,s=()=>{const g=new Set;return e.forEach(a=>a.getEdges().forEach(I=>g.add(I))),Array.from(g)},r=ContinuousUtil.getAllInteractiveFaces({getFaces:n,getEdges:s}),i=[];Array.from(r.contFaces).filter(g=>g.isPlane()).forEach(g=>i.push(g.getFaces().slice()));const o=ShellModelingUtil.divideFacesIntoCoplanarGroups(r.faces);for(const g of o)ShellModelingUtil.divideFacesIntoConnectGroups(g,!1).forEach(I=>i.push(I));for(const g of i){const a=mergeConnectedFace(g);if(a){const I={modifiedShellsMap:new Map,evolutionMap:new Map};I.modifiedShellsMap.set(a.getShell(),{addFaces:[a],deleteFaces:g}),g.forEach(c=>addEvolutionInfo(I,c,a)),mergeShellModelingResult(t,I)}}return t}}function newLineEdge(l,t){const e=new exports.Ln3(l.getPoint(),t.getPoint()),n=new Edge(e,l,t);return n.setSmooth(l.getSmooth()),n}function getWireVertexesAndEdge(l){const t=l.getCoedge3ds();return t.map((e,n)=>[e.getStartVertex(),e.getStartVertex().getPoint().clone(),e,t[(n-1+t.length)%t.length]])}class PullPushFacePreviewUtil{constructor(t,e,n){this._face=t,this._pullPushVec=e,this._bClosedBottom=n}execute(){const t={};t.deleteShells=[],t.modifiedShellsMap=new Map;const e=this._face.getShell(),n=[],s=[this._face],r=[],i=this._face.getSurface().getNormAt({x:0,y:0});for(const I of this._face.getWires()){const c=this._dealVertexesAndSideEdges(I,i);this._dealSideFaces(c,i,n,s),r.push(c)}const o=this._face.getSurface(),g=this._face.getSameDirWithSurface(),a=o.clone().translate(this._pullPushVec);if(this._face.setSurface(a),this._regenerateFaceByVertexes(this._face,r),this._bClosedBottom){const I=new Face(o,!g);e.addFace(I),this._regenerateFaceByVertexes(I,r),n.push(I)}return addShellModifyInfo(t.modifiedShellsMap,e,n,void 0,s),t}_dealVertexesAndSideEdges(t,e){const n=this._face.getParent(),s=new Set;for(const a of t.getCoedge3ds())s.add(a.getEdge());const r=[],i=new Set,o=new Set,g=getWireVertexesAndEdge(t);return g.forEach(([a,I,c,E])=>{if(!i.has(a.tag)){if(c.getTwin()&&E.getTwin()){const u=a.getEdges().filter(Q=>!s.has(Q));if(u.length===0){if(c.getTwin()?.getFace()&&this._isSurfacePerpendicularPlane(c.getTwin().getFace().getSurface(),e))return}else{let Q=!0;for(const p of u){const w=p.getCurve();(!(w instanceof exports.Ln3)||!w.getDirection().isParallel(e))&&(Q=!1)}if(Q){u.map(p=>o.add(p.tag));return}}}i.add(a.tag)}}),g.forEach(([a,I,c])=>{const E=I.added(this._pullPushVec);if(i.has(a.tag)){const u=new Vertex(E);n.addVertex(u);const Q=newLineEdge(a,u);n.addEdge(Q),r.push({v:a,v_:u,ce:c,newEdge:Q})}else{a.setPoint(E);const u=a.getEdges().filter(Q=>o.has(Q.tag));for(const Q of u){const p=new exports.Ln3(Q.getStartVertex().getPoint(),Q.getEndVertex().getPoint());Q.setCurve(p)}r.push({v:a,ce:c})}}),r}_dealSideFaces(t,e,n,s){for(let r=0;r<t.length;r++){const i=t[r].ce,o=t[r],g=t[(r+1)%t.length];if(!o.v_&&!g.v_){const I=i.getEdge(),c=I.getCurve().clone().translate(this._pullPushVec);I.setCurve(c);const E=i.getTwins().map(u=>u.getFace()).filter(u=>!!u);E.length&&s.push(...new Set(E));continue}if(o.v_&&g.v_){const{newFace:I,modifiedFace:c}=this._handleNewNew(i,o,g,e);I&&n.push(I),c&&s.push(c);continue}let a;!o.v_&&g.v_?a=this._handleTanslateNew(i,o,g):a=this._handleNewTanslate(i,o,g),a&&s.push(a)}}_newSideSurface(t,e,n,s){const r=n.subtracted(e),i=s.dot(r)>0,o=t.getCurve();if(o instanceof exports.Ln3){const g=o.getDirection();return{surf:new exports.Plane(e,g,r),sameDir:i}}if(o instanceof exports.Arc3){const g=o.getCoord(),a=new exports.Coord3(g.getOrigin(),g.getDx(),r.cross(g.getDx()));return{surf:new exports.Cylinder(a,o.getA(),o.getB()),sameDir:i}}throw new Error("not supported")}_isSurfacePerpendicularPlane(t,e){return t instanceof exports.Plane?t.getNorm().isPerpendicular(e):t instanceof exports.Cylinder?t.getCenterAxis().isParallel(e):!1}_handleNewNew(t,e,n,s){const r=e.ce.getShell(),i=t.getTwins();i.length>1&&console.warn("请处理该情况");const o=t.getEdge(),g=t.getCurve().translate(this._pullPushVec),a=new Edge(g,e.v_,n.v_);if(r.addEdge(a),i.length===1){const u=i[0].getFace().getSurface();if(this._isSurfacePerpendicularPlane(u,s)){const Q=i[0],p=Q.getWire(),w=p.getCoedge3ds().findIndex(M=>M===Q);if(Q.getSameDirWithEdge()===t.getSameDirWithEdge()){const M=new Coedge3d(e.newEdge,!0),N=new Coedge3d(a,!0),S=new Coedge3d(n.newEdge,!1);p.replaceCoedge3d(w,[M,N,S])}else{const M=new Coedge3d(n.newEdge,!0),N=new Coedge3d(a,!1),S=new Coedge3d(e.newEdge,!1);p.replaceCoedge3d(w,[M,N,S])}const y=r.deleteEdge(o);return MathAssert.assert(y,"删除失败"),{modifiedFace:p.getFace()}}}const I=new Wire,c=this._newSideSurface(t,e.v.getPoint(),e.v_.getPoint(),s),E=new Face(c.surf,c.sameDir,[I]);return I.addCoedge3d(new Coedge3d(n.newEdge,!0)),I.addCoedge3d(new Coedge3d(a,!1)),I.addCoedge3d(new Coedge3d(e.newEdge,!1)),t.getSameDirWithEdge()?I.addCoedge3d(new Coedge3d(o,!0)):I.addCoedge3d(new Coedge3d(o,!1)),r.addFace(E),{newFace:E}}_handleTanslateNew(t,{v:e,ce:n},{v_:s,newEdge:r}){const i=n.getTwins();if(i.length===0)return;i.length>1;const o=n.getEdge();o.getCurve().translate(this._pullPushVec),n.getSameDirWithEdge()?o.setEndVertex(s):o.setStartVertex(s);const g=i[0],a=g.getWire(),I=a.getCoedge3ds().findIndex(c=>c===g);if(g.getSameDirWithEdge()===n.getSameDirWithEdge()){const c=new Coedge3d(r,!0);a.insertCoedge3d(I+1,c)}else{const c=new Coedge3d(r,!0);a.insertCoedge3d(I,c)}return a.getFace()}_handleNewTanslate(t,{v:e,v_:n,ce:s,newEdge:r},{v:i}){const o=s.getTwins();if(o.length===0)return;o.length>1&&console.warn("找到多个twin");const g=s.getEdge();g.getCurve().translate(this._pullPushVec),s.getSameDirWithEdge()?g.setStartVertex(n):g.setEndVertex(n);const a=o[0],I=a.getWire(),c=I.getCoedge3ds().findIndex(E=>E===a);if(a.getSameDirWithEdge()===s.getSameDirWithEdge()){const E=new Coedge3d(r,!0);I.insertCoedge3d(c,E)}else{const E=new Coedge3d(r,!0);I.insertCoedge3d(c+1,E)}return I.getFace()}_regenerateFaceByVertexes(t,e){const n=t.getParent();t.deleteAllWires(),e.forEach((s,r)=>{const i=new Wire;t.addWire(i),s.forEach((o,g)=>{const a=o.v_??o.v,I=a.getEdges(),c=s[(g+1)%s.length],E=c.v_??c.v;let u;for(const Q of I)if(Q.getEndVertexTag()===E.tag||Q.getStartVertexTag()===E.tag){if(o.ce.getCurve().getType()!==Q.getCurve().getType())continue;const p=o.ce.getCurve().getStartTangent(),w=o.ce.getCurve().getEndTangent(),y=Q.getCurve().getStartTangent(),M=Q.getCurve().getEndTangent();if(y.isParallel(p)&&M.isParallel(w)||y.isParallel(w)&&M.isParallel(p)){u=Q;break}}if(u||(u=newLineEdge(a,E),n.addEdge(u)),E.tag===a.tag){const Q=t.getSurface().getCurve2d(u.getCurve()),w=new exports.Loop([Q]).calcArea()>0,y=r===0;i.addCoedge3d(new Coedge3d(u,y===w))}else i.addCoedge3d(new Coedge3d(u,u.getStartVertexTag()===a.tag))})})}}function handleNewNew({v:l,v_:t,ce:e,newEdge:n},{v:s,v_:r,newEdge:i}){const o=l.getParent(),g=e.getFace().getCenterNorm(),a=e.getTwins(),I=e.getEdge(),c=newLineEdge(t,r);if(o.addEdge(c),a.length===1){const w=a[0].getFace().getSurface();if(w.isPlane()&&w.getNorm().isPerpendicular(g)){const y=a[0],M=y.getWire(),N=M.getCoedge3ds().findIndex(R=>R===y);if(y.getStartVertex().tag===l.tag){const R=new Coedge3d(n,!0),U=new Coedge3d(c,!0),b=new Coedge3d(i,!1);M.replaceCoedge3d(N,[R,U,b])}else{const R=new Coedge3d(i,!0),U=new Coedge3d(c,!1),b=new Coedge3d(n,!1);M.replaceCoedge3d(N,[b,U,R])}const S=o.deleteEdge(I);return MathAssert.assert(S,"删除失败"),{modifiedFace:M.getFace()}}}const E=new exports.Plane(l.getPoint(),new exports.Vec3(l.getPoint(),s.getPoint()),new exports.Vec3(l.getPoint(),t.getPoint())),u=new Wire,Q=new Face(E,!0,[u]);return u.addCoedge3d(new Coedge3d(i,!0)),u.addCoedge3d(new Coedge3d(c,!1)),u.addCoedge3d(new Coedge3d(n,!1)),I.getStartVertex().tag===l.tag?u.addCoedge3d(new Coedge3d(I,!0)):u.addCoedge3d(new Coedge3d(I,!1)),o.addFace(Q),{newFace:Q}}function handleTanslateNew({v:l,ce:t},{v_:e,newEdge:n}){const s=l.getParent(),r=t.getTwins();if(r.length===0)return;r.length>1;const i=r[0],o=i.getWire(),g=o.getCoedge3ds().findIndex(I=>I===i),a=newLineEdge(e,l);if(s.addEdge(a),i.getStartVertex().tag===l.tag){const I=new Coedge3d(a,!1),c=new Coedge3d(n,!1);o.replaceCoedge3d(g,[I,c])}else{const I=new Coedge3d(n,!0),c=new Coedge3d(a,!0);o.replaceCoedge3d(g,[I,c])}return s.deleteEdgeByTag(t.getEdgeTag()),o.getFace()}function handleNewTanslate({v:l,v_:t,ce:e,newEdge:n},{v:s}){const r=l.getParent(),i=e.getTwins();if(i.length===0)return;i.length>1&&console.warn("找到多个twin");const o=i[0],g=o.getWire(),a=g.getCoedge3ds().findIndex(c=>c===o),I=newLineEdge(t,s);if(r.addEdge(I),o.getStartVertex().tag===l.tag){const c=new Coedge3d(n,!0),E=new Coedge3d(I,!0);g.replaceCoedge3d(a,[c,E])}else{const c=new Coedge3d(I,!1),E=new Coedge3d(n,!1);g.replaceCoedge3d(a,[c,E])}return r.deleteEdgeByTag(e.getEdgeTag()),g.getFace()}function extrudeWire(l,t){const e=l.getFace(),n=e.getParent(),s=getWireVertexesAndEdge(l),r=new Set(e.getEdges()),i=e.getSurface().getNormAt({x:0,y:0}),o=[],g=new Set;s.forEach(([c,E,u,Q])=>{if(!g.has(c.tag)){if(u.getTwin()&&Q.getTwin()){const p=c.getEdges().filter(w=>!r.has(w));if(!p.length&&u.getTwin()?.getFace()?.getSurface().getNormAt({x:0,y:0}).isPerpendicular(i))return;if(p.length===1){const y=p[0].getCurve();if(y.isLine3d()&&y.getDirection().isParallel(i))return}}g.add(c.tag)}}),s.forEach(([c,E,u])=>{const Q=E.added(t);if(g.has(c.tag)){const p=new Vertex(Q);n.addVertex(p);const w=newLineEdge(c,p);n.addEdge(w),o.push({v:c,v_:p,ce:u,newEdge:w})}else c.setPoint(Q),o.push({v:c,ce:u})}),o.forEach(({v:c,v_:E})=>{E||c.getEdges().forEach(u=>{const Q=new exports.Ln3(u.getStartVertex().getPoint(),u.getEndVertex().getPoint());u.setCurve(Q)})});const a=[],I=[];for(let c=0;c<o.length;c++){const E=o[c],u=o[(c+1)%o.length],{newEdge:Q,ce:p}=E,{newEdge:w}=u;if(!Q&&!w){const M=p.getTwins().map(N=>N.getFace()).filter(N=>!!N);M.length&&I.push(...new Set(M));continue}if(Q&&w){const{newFace:M,modifiedFace:N}=handleNewNew(E,u);M&&a.push(M),N&&I.push(N);continue}let y;!Q&&w?y=handleTanslateNew(E,u):y=handleNewTanslate(E,u),y&&I.push(y)}return{newFaces:a,vertexInfos:o,modifiedFaces:I}}function regenerateFaceByVertexes(l,t){const e=l.getParent();l.deleteAllWires(),t.forEach(n=>{const s=new Wire;l.addWire(s),n.forEach((r,i)=>{const o=r.getEdges(),g=n[(i+1)%n.length];let a;for(const I of o)if(I.getEndVertexTag()===g.tag){a=I;break}a||(a=newLineEdge(r,g),e.addEdge(a)),s.addCoedge3d(new Coedge3d(a,a.getStartVertexTag()===r.tag))})})}function pullPushFacePreviewCore(l,t,e){if(checkPullPushCondition(l,t),e){const u=l.getSurface().getCoord().clone(),Q=l.calcPolygon(),p=new exports.Polygon;Q.getLoops().forEach(U=>{const b=new exports.Loop;U.getAllCurves().forEach(G=>{G.isLine2d()||G.isArc2d()?b.addCurve(G):b.addCurve(new exports.SmoothPoly2(G.discrete(DiscreteParam.LOW)))}),p.addLoop(b,!1)});const w=t.normalized();let y=0,M=0;u.getDz().dot(t)>0?M=t.getLength():(y=-t.getLength(),w.reverse());const N=l.getShell(),S=ExtrudeBody.execute(u,p,w,y,M,!1,!1,[]);S.getFaces().forEach(U=>N.addFace(U)),S.getEdges().forEach(U=>N.addEdge(U)),S.getVertexs().forEach(U=>N.addVertex(U));const R={};return R.modifiedShellsMap=new Map,addShellModifyInfo(R.modifiedShellsMap,N,S.getFaces().slice(),void 0,void 0),R}if((u=>{const Q=u.getEdges();for(const p of Q)if(!p.getCurve().isLine3d())return!0;return!1})(l))return new PullPushFacePreviewUtil(l,t,e).execute();const s={};s.deleteShells=[],s.modifiedShellsMap=new Map;const r=[],i=[l],o=[];l.getWires().forEach(u=>{const{newFaces:Q,modifiedFaces:p,vertexInfos:w}=extrudeWire(u,t);r.push(...Q),i.push(...p),o.push(w)});const g=l.getShell(),a=l.getSurface(),I=l.getSameDirWithSurface(),c=a.clone().translate(t);l.setSurface(c);const E=o.map(u=>u.map(({v:Q,v_:p})=>p??Q));if(regenerateFaceByVertexes(l,E),e){const u=new Face(a,!I);g.addFace(u);const Q=o.map(p=>p.map(({v:w})=>w));regenerateFaceByVertexes(u,Q),r.push(u)}return addShellModifyInfo(s.modifiedShellsMap,g,r,void 0,i),s}class PullPushFacePreview extends ShellModelingBase{constructor(t,e,n){super([]),this._face=t,this._pullPushVec=e,this._bExtrudeBehavior=n}_executeImpl(){let t={};try{t=pullPushFacePreviewCore(this._face,this._pullPushVec,this._bExtrudeBehavior)}catch(e){return e instanceof Error&&(t.errorStr=e.message),t}return t}_validateResult(){return!1}}class DeleteEdgeVirtualFace extends VirtualFace{}class DeleteEdges{static execute(t){const e={modifiedShellsMap:new Map,evolutionMap:new Map},n=new Set(t),s=new Set;n.forEach(E=>{E.getFaces().forEach(Q=>s.add(Q))});const r=new Map;s.forEach(E=>E.getEdges().forEach(u=>{let Q=r.get(u);Q||(Q=[],r.set(u,Q)),Q.push(E)}));const i=E=>{let u;if(E.isPlane()){const Q=E;u=Q.getOrigin().dot(Q.getNorm())}if(E.isCylinder()){const Q=E;u=Q.getA()*Q.getCoord().getOrigin().dot(Q.getCoord().getDz())}return`${Math.round(Math.abs(u)*1e5)}`},o=new Map;for(const E of s){const u=E.getSurface();if(!u.isPlane()&&!u.isCylinder())continue;const Q=i(u);let p=o.get(Q);if(p||(p=[],o.set(Q,p)),!this._findFaceGroup(E,p)){const y=[];y.push(E),p.push(y)}}const g=Array.from(o.values()).flat();g.forEach(E=>this._reverseFaces(E));const a=E=>{const u=E.getEdge(),Q=u.getFaces().filter(p=>s.has(p));return n.has(u)&&Q.length===1},I=[],c=[];for(const E of g){const u=E[0].getSurface(),Q=new Map,p=[],w=[];u.isCylinder()&&u.isEqualAB()&&this._processCylinder(E,u,n,c,s);for(const R of E){let U=[],b=[];const G=R.getWires(),O=new Map;for(let H=0;H<G.length;H++){const z=new Map,tA=u.wireToUV(G[H].getCoedge3ds().map(iA=>{const W=iA.getCurve();return z.set(iA,W),W}));G[H].getCoedge3ds().forEach(iA=>{const W=z.get(iA),oA=tA.mapping.get(W);oA&&O.set(iA,oA)});const nA=G[H].getCoedge3ds().filter(iA=>!n.has(iA.getEdge())),IA=G[H].getCoedge3ds().length;if(nA.length===IA)b.push(G[H]);else{const iA=new Set;G[H].getCoedge3ds().forEach(W=>iA.add(W.getEdge())),E.length===1&&iA.size===IA||U.push(...nA)}if(H>0&&G[H].getCoedge3ds().filter(iA=>a(iA)).length){U=[],b=[];break}}b.forEach(H=>{const z=H.getCoedge3ds().map(tA=>{if(O.has(tA)){const IA=O.get(tA);return Q.set(IA,{edge:tA.getEdge(),bSameDir:tA.getSameDirWithEdge()}),IA}const nA=u.getCurve2d(tA.getCurve());return Q.set(nA,{edge:tA.getEdge(),bSameDir:tA.getSameDirWithEdge()}),nA});p.push(new exports.Loop(z))}),U.forEach(H=>{if(O.has(H)){const z=O.get(H);Q.set(z,{edge:H.getEdge(),bSameDir:H.getSameDirWithEdge()}),w.push(z)}else{const z=u.getCurve2d(H.getCurve());Q.set(z,{edge:H.getEdge(),bSameDir:H.getSameDirWithEdge()}),w.push(z)}})}const y=SearchGraph.searchLoop2D(w,!0),M=ILoopsToPolygonExes.getNestedLoops(p.concat(y),R=>R);for(let R=M.length-1;R>=0;R--)if(!M[R].isCCW){const U=M[R].nesting;M.splice(R,1,...U)}const N=[],S=new Map;M.forEach(R=>ILoopsToPolygonExes.createFaces(R,!0,S,N)),N.forEach(R=>{const U=R.map(H=>{const z=H.loop.getAllCurves().map(nA=>Q.get(nA)),tA=new VirtualLoop;return tA.edges.push(...z),tA}),b=this._getSourceFace(U[0],r);let G=b.getSurface();G.isCoplanar(u,Tol.DEFAULT)||(G=u);const O=new DeleteEdgeVirtualFace(U,G.clone());O.sourceFace=b,I.push(O)})}for(const E of I){const u=E.loops.map(w=>{const y=w.edges.map(M=>new Coedge3d(M.edge,M.bSameDir));return new Wire(y)}),Q=new Face(E.plane,!0,u),p=E.sourceFace.getShell();p.addFace(Q),addShellModifyInfo(e.modifiedShellsMap,p,[Q]),addEvolutionInfo(e,E.sourceFace,Q)}return s.forEach(E=>{const u=E.getShell();disposeFace(E),addShellModifyInfo(e.modifiedShellsMap,u,void 0,[E])}),c.forEach(E=>{const u=E.getShell();addShellModifyInfo(e.modifiedShellsMap,u,void 0,void 0,[E])}),e}static _findFaceGroup(t,e){if(e.length===0)return!1;const n=t.getSurface();for(const s of e){const r=s[0].getSurface();if(n.isCoplanar(r,Tol.DEFAULT))return s.push(t),!0}return!1}static _reverseFaces(t){if(t.length){if(t[0].getSurface().isPlane()){const e=t[0].getSurface().getNorm(),n=t.map(r=>r.getSurface().getNorm().isSameDirection(e)?1:0),s=n.filter(r=>!!r).length>=n.length/2?0:1;for(let r=0;r<n.length;r++)n[r]===s&&(t[r].getSurface().reverse(),t[r].getWires().forEach(i=>i.reverse()),t[r].reverse())}else if(t[0].getSurface().isCylinder()){const e=t[0].getSurface().getCenterAxis(),n=t.map(r=>r.getSurface().getCenterAxis().isSameDirection(e)?1:0),s=n.filter(r=>!!r).length>=n.length/2?0:1;for(let r=0;r<n.length;r++)n[r]===s&&(t[r].getSurface().getCoord().reverseZDir(),t[r].getWires().forEach(i=>i.reverse()),t[r].reverse())}}}static _getSourceFace(t,e){const n=new Map;return t.edges.forEach(s=>{const r=e.get(s.edge);r&&r.forEach(i=>{let o=n.get(i)||0;n.set(i,++o)})}),Array.from(n).sort((s,r)=>r[1]-s[1])[0][0]}static _processCylinder(t,e,n,s,r){let i;for(const o of n){const g=e.getCurve2d(o.getCurve());if(Util.isNearlyEqual(g.getStartPt().x,g.getEndPt().x)&&(Util.isNearlyEqual(g.getStartPt().x,0)||Util.isNearlyEqual(g.getStartPt().x,Math.PI*2))){i=o;break}}if(i){let o=i.getFaces()[0],g=0;for(;g<t.length;){g++;const a=o.getWires()[0];let I=!1;for(const c of a.getCoedge3ds()){if(i===c.getEdge())continue;const E=e.getCurve2d(c.getCurve());if(Util.isNearlyEqual(E.getStartPt().x,E.getEndPt().x))if(n.has(c.getEdge())){i=c.getEdge();for(const u of i.getFaces())if(u!==o&&t.findIndex(Q=>Q===u)>-1){o=u,I=!0;break}}else{i.getShell()?.getFaces().forEach(u=>{if(e.isCoplanar(u.getSurface())){const Q=u.getSurface().getCoord(),p=Q.getOrigin(),w=Q.getDz(),y=new exports.Ln3(p,Q.getWorldPtAt(new exports.Vec3(1,0,0)));y.rotate(E.getStartPt().x,p,w);const M=new exports.Ln3(p,Q.getWorldPtAt(new exports.Vec3(0,1,0)));M.rotate(E.getStartPt().x,p,w),Q.setXYDirs(y.getDirection(),M.getDirection()),r.has(u)||s.push(u)}});return}if(I)break}}}}}class DeleteFacesEdges extends ShellModelingBase{constructor(t,e,n=!1,s=[]){super(s),this._faces=new Set(t),this._edges=e,this._mergeEdge=n}_executeImpl(){const t=new Set;this._faces.forEach(a=>t.add(a.getShell())),this._edges.forEach(a=>t.add(a.getShell()));const e=Array.from(t).map(a=>ContinuousUtil.getAllInteractiveFaces(a)),n=new Map;e.forEach(a=>{a.contFaces.forEach(I=>{I.getFaces().forEach(c=>n.set(c,I.getFaces()))})}),this._edges.forEach(a=>{a.getFaces().forEach(I=>{const c=n.get(I);c&&c.forEach(E=>this._faces.add(E))})});const s={addShells:[],deleteShells:[],modifiedShellsMap:new Map};for(const a of this._faces)addShellModifyInfo(s.modifiedShellsMap,a.getShell(),void 0,[a]),disposeFace(a);const r=[];t.forEach(a=>r.push(...a.getEdges()));const i=this._edges.filter(a=>a.getCoedge3ds().length),o=DeleteEdges.execute(i);mergeShellModelingResult(s,o);for(const a of s.modifiedShellsMap.keys())a.getFaces().length||s.deleteShells.push(a);s.deleteShells?.forEach(a=>s.modifiedShellsMap.delete(a));for(const a of s.modifiedShellsMap.keys())ContinuousUtil.removeUnusedContinuousEdgeInfo(a);const g={modifiedShellsMap:new Map};for(const a of s.modifiedShellsMap.keys()){const I=splitShell(a);for(let c=1;c<I.length;c++)addShellModifyInfo(g.modifiedShellsMap,a,void 0,I[c].getFaces().slice()),s.addShells?.push(I[c])}if(mergeShellModelingResult(s,g),this._mergeEdge){const a=r.filter(u=>!u.getCoedge3ds().length),I=new Set;a.forEach(u=>{const Q=u.getStartVertex(),p=u.getEndVertex();Q&&I.add(Q),p&&I.add(p)});const c=new Set(s.modifiedShellsMap.keys());s.addShells&&s.addShells.forEach(u=>c.add(u));const E=new Set;for(const u of c)u.getVertexs().forEach(Q=>{I.has(Q)&&E.add(Q)});for(const u of E){const Q=u.getEdges();Q.length!==2||Q.some(p=>!p)||mergeConnectedEdge(Q[0],Q[1],u)}}return s}}class SplitEdge extends ShellModelingBase{constructor(t,e){super([]),this._edge=t,this._pts=e}_executeImpl(){const t=this._edge.getParent(),e=this._pts.map(n=>t.createVertex(n));return splitEdgeByVertices(this._edge,e),{}}}class MergeEdges extends ShellModelingBase{constructor(t){super([]),this._edges=t}_executeImpl(){const t=new Map;for(const r of this._edges){const i=r.getShell();let o=t.get(i);o||(o=[],t.set(i,o)),o.push(r)}let e;const n=new Map;for(const[r,i]of t){if(i.length<=1)continue;const o=r.getEdges().length,g=new Set(i),a=new Set;for(const I of g){const c=I.getStartVertex(),E=I.getEndVertex();a.has(c)||c.getEdges().filter(Q=>g.has(Q)).length>1&&a.add(c),a.has(E)||E.getEdges().filter(Q=>g.has(Q)).length>1&&a.add(E)}for(const I of a){const c=I.getEdges();if(c.length!==2||c.some(E=>!E)){e="patial fail";continue}mergeConnectedEdge(c[0],c[1],I)}o!==r.getEdges().length&&n.set(r,{})}const s=this._edges.filter(r=>r.getCoedge3ds().length>0);return s.length&&(e=s.length===this._edges.length?"all fail":"patial fail"),{errorStr:e,modifiedShellsMap:n}}}class ShellEdit{static addEdges(t,e=[],n=void 0){return new AddEdges(t,n,e).execute()}static splitEdge(t,e){return new SplitEdge(t,e).execute()}static mergeEdges(t){return new MergeEdges(t).execute()}static moveEdgesPreview(t,e){return new MoveEdges(t,e).preview()}static moveEdges(t,e,n=[]){return new MoveEdges(t,e,n).execute()}static moveFaces(t,e,n=[]){return new MoveFaces(t,e,n).execute()}static facesAndShellsMerge(t,e,n=!1,s,r){const i=new FacesShellsMerge(t,e,n,!0,r).execute();return s?(mergeShellModelingResult(s,i),s):i}static mergeConnectedFaces(t,e){const n=new MergeConnectFaces(t).execute();return e?(mergeShellModelingResult(e,n),e):n}static pullPushFace(t,e,n=[],s=!1,r=!0,i=!0){return new PullPushFace(t,e,n,s,r,i).execute()}static pullPushFacePreview(t,e,n=!1){return new PullPushFacePreview(t,e,n).execute()}static isolateFaces(t,e){return new IsolateFaces(Array.from(e),t).execute()}static copyFaces(t,e,n){return new CopyFaces(t,e,n).execute()}static deleteFacesAndEdges(t,e,n){return new DeleteFacesEdges(t,e,n).execute()}static makeRounding2D(t,e,n,s=[],r=!1){return new Rounding2D(t,e,n,s,r).execute()}static transformShells(t,e){const n={modifiedShellsMap:new Map};return t.forEach(s=>{s.transform(e),n.modifiedShellsMap.set(s,{modifiedFaces:s.getFaces().slice()}),ContinuousUtil.transformContinuousEdgeInfo(s.getEdges(),e)}),n}}const index$1=Object.freeze(Object.defineProperty({__proto__:null,BodyBuilder,BodyUtil,BrepPJ,ShellEdit},Symbol.toStringTag,{value:"Module"})),index=Object.freeze(Object.defineProperty({__proto__:null,get BrepBody(){return BrepBody},BrepUtil,get Coedge3d(){return Coedge3d},Continuous:index$2,get Edge(){return Edge},get Face(){return Face},get Shell(){return Shell},get Vertex(){return Vertex},get Wire(){return Wire},alg:index$1,uuid:uuid.v4},Symbol.toStringTag,{value:"Module"}));var EulerOrder=(l=>(l[l.XYZ=0]="XYZ",l[l.YZX=1]="YZX",l[l.ZXY=2]="ZXY",l[l.XZY=3]="XZY",l[l.YXZ=4]="YXZ",l[l.ZYX=5]="ZYX",l))(EulerOrder||{});class Euler{constructor(t=0,e=0,n=0,s=0){this._x=t,this._y=e,this._z=n,this._order=s,this.isEuler=!0}get x(){return this._x}set x(t){this._x=t}get y(){return this._y}set y(t){this._y=t}get z(){return this._z}set z(t){this._z=t}get order(){return this._order}set order(t){this._order=t}set(t,e,n,s){this._x=t,this._y=e,this._z=n,this._order=s}clone(){return new Euler(this._x,this._y,this._z,this._order)}copyFrom(t){this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order}setFromRotationMatrix(t,e){const n=Util.clamp,s=t.data,r=s[0][0],i=s[1][0],o=s[2][0],g=s[0][1],a=s[1][1],I=s[2][1],c=s[0][2],E=s[1][2],u=s[2][2];e===5?(this._y=Math.asin(n(o,-1,1)),Math.abs(o)<.99999?(this._x=Math.atan2(-I,u),this._z=Math.atan2(-i,r)):(this._x=Math.atan2(E,a),this._z=0)):e===2?(this._x=Math.asin(-n(I,-1,1)),Math.abs(I)<.99999?(this._y=Math.atan2(o,u),this._z=Math.atan2(g,a)):(this._y=Math.atan2(-c,r),this._z=0)):e===4?(this._x=Math.asin(n(E,-1,1)),Math.abs(E)<.99999?(this._y=Math.atan2(-c,u),this._z=Math.atan2(-i,a)):(this._y=0,this._z=Math.atan2(g,r))):e===0?(this._y=Math.asin(-n(c,-1,1)),Math.abs(c)<.99999?(this._x=Math.atan2(E,u),this._z=Math.atan2(g,r)):(this._x=0,this._z=Math.atan2(-i,a))):e===3?(this._z=Math.asin(n(g,-1,1)),Math.abs(g)<.99999?(this._x=Math.atan2(-I,a),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(o,u))):e===1?(this._z=Math.asin(-n(i,-1,1)),Math.abs(i)<.99999?(this._x=Math.atan2(E,a),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-I,u),this._y=0)):console.warn(`THREE.Euler: .setFromRotationMatrix() given unsupported order: ${e}`),this._order=e}setFromVector3(t,e){return this.set(t.x,t.y,t.z,e!==void 0?e:this._order)}isEqual(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this}toArray(){const t=new Array(4);return t[0]=this._x,t[1]=this._y,t[2]=this._z,t[3]=this._order,t}toVector(){return new exports.Vec3(this._x,this._y,this._z)}}class Quaternion{constructor(t,e,n,s){this._x=t||0,this._y=e||0,this._z=n||0,this._w=s!==void 0?s:1}get x(){return this._x}set x(t){this._x=t}get y(){return this._y}set y(t){this._y=t}get z(){return this._z}set z(t){this._z=t}get w(){return this._w}set w(t){this._w=t}set(t,e,n,s){this._x=t,this._y=e,this._z=n,this._w=s}clone(){return new Quaternion(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this}setFromEuler(t){const e=t.x,n=t.y,s=t.z,r=t.order,i=Math.cos,o=Math.sin,g=i(e/2),a=i(n/2),I=i(s/2),c=o(e/2),E=o(n/2),u=o(s/2);return r===EulerOrder.XYZ?(this._x=c*a*I+g*E*u,this._y=g*E*I-c*a*u,this._z=g*a*u+c*E*I,this._w=g*a*I-c*E*u):r===EulerOrder.YXZ?(this._x=c*a*I+g*E*u,this._y=g*E*I-c*a*u,this._z=g*a*u-c*E*I,this._w=g*a*I+c*E*u):r===EulerOrder.ZXY?(this._x=c*a*I-g*E*u,this._y=g*E*I+c*a*u,this._z=g*a*u+c*E*I,this._w=g*a*I-c*E*u):r===EulerOrder.ZYX?(this._x=c*a*I-g*E*u,this._y=g*E*I+c*a*u,this._z=g*a*u-c*E*I,this._w=g*a*I+c*E*u):r===EulerOrder.YZX?(this._x=c*a*I+g*E*u,this._y=g*E*I+c*a*u,this._z=g*a*u-c*E*I,this._w=g*a*I-c*E*u):r===EulerOrder.XZY&&(this._x=c*a*I-g*E*u,this._y=g*E*I-c*a*u,this._z=g*a*u+c*E*I,this._w=g*a*I+c*E*u),this}setFromAxisAngle(t,e){const n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this}setFromRotationMatrix(t){const e=t.data,n=e[0][0],s=e[1][0],r=e[2][0],i=e[0][1],o=e[1][1],g=e[2][1],a=e[0][2],I=e[1][2],c=e[2][2],E=n+o+c;let u;return E>0?(u=.5/Math.sqrt(E+1),this._w=.25/u,this._x=(I-g)*u,this._y=(r-a)*u,this._z=(i-s)*u):n>o&&n>c?(u=2*Math.sqrt(1+n-o-c),this._w=(I-g)/u,this._x=.25*u,this._y=(s+i)/u,this._z=(r+a)/u):o>c?(u=2*Math.sqrt(1+o-n-c),this._w=(r-a)/u,this._x=(s+i)/u,this._y=.25*u,this._z=(g+I)/u):(u=2*Math.sqrt(1+c-n-o),this._w=(i-s)/u,this._x=(r+a)/u,this._y=(g+I)/u,this._z=.25*u),this}setFromUnitVectors(t,e){let s=t.dot(e)+1,r;return s<1e-6?(s=0,Math.abs(t.x)>Math.abs(t.z)?r=new exports.Vec3(-t.y,t.x,0):r=new exports.Vec3(0,-t.z,t.y)):r=t.cross(e),this._x=r.x,this._y=r.y,this._z=r.z,this._w=s,this.normalize(),this}reverse(){return this.conjugate(),this}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x*=t,this._y*=t,this._z*=t,this._w*=t),this}multiply(t){return this.multiplyQuaternions(this,t),this}premultiply(t){return this.multiplyQuaternions(t,this),this}multiplyQuaternions(t,e){const n=t._x,s=t._y,r=t._z,i=t._w,o=e._x,g=e._y,a=e._z,I=e._w;return this._x=n*I+i*o+s*a-r*g,this._y=s*I+i*g+r*o-n*a,this._z=r*I+i*a+n*g-s*o,this._w=i*I-n*o-s*g-r*a,this}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],this._w=t[3],this}toArray(){const t=new Array(4);return t[0]=this._x,t[1]=this._y,t[2]=this._z,t[3]=this._w,t}}class InvBilinear{constructor(t,e,n,s,r,i,o,g){this._u0=t,this._u1=e,this._v0=n,this._v1=s,this._p0=r,this._p1=i,this._p2=o,this._p3=g}solve(t){const e=this._p1.subtracted(this._p0),n=this._p2.subtracted(this._p0),s=this._p3.subtracted(this._p2).added(e.reversed()),r=t.subtracted(this._p0),i=1e-4,o=s.cross(n),g=e.cross(n)+r.cross(s),a=r.cross(e);let I,c,E,u;if(Math.abs(o)<=i)I=-a/g;else{const w=g*g-4*o*a;if(w>=0){const y=Math.sqrt(w);I=.5*(-g+y)/o,c=.5*(-g-y)/o}}if(I!==void 0){const w=e.added(s.multiplied(I));Math.abs(w.x)>Math.abs(w.y)?E=(r.x-n.x*I)/w.x:E=(r.y-n.y*I)/w.y}if(c!==void 0){const w=e.added(s.multiplied(c));Math.abs(w.x)>Math.abs(w.y)?u=(r.x-n.x*c)/w.x:u=(r.y-n.y*c)/w.y}let Q=E,p=I;if(c!==void 0&&!Util.isInRange(E,0,1,i)&&!Util.isInRange(I,0,1,i)&&(Q=u,p=c),Q!==void 0&&p!==void 0)return Q=this._u0+Q*(this._u1-this._u0),p=this._v0+p*(this._v1-this._v0),[Q,p]}}class SVGParser{static stringToPolyCurves(t,e=!0){const n=[],s=SVGParser._SVGStringToCommands(t),r=(I,c)=>I-(c-I),i=I=>e?Math.round(I*100)/100:I;let o=exports.Vec2.O(),g=exports.Vec2.O(),a=[];for(const I of s){const c=I.cmd,E=I.data,u=exports.Vec2.O();let Q;switch(c){case"M":a.length>0&&n.push(new exports.PolyCurve(a)),a=[],u.x=i(E[0]),u.y=i(E[1]);break;case"L":u.x=i(E[0]),u.y=i(E[1]),g.x=u.x,g.y=u.y,u.equals(o)||a.push(new exports.Ln2(o,u));break;case"H":u.x=i(E[0]),g=u.clone(),u.equals(o)||a.push(new exports.Ln2(o,u));break;case"V":u.y=i(E[0]),g=u.clone(),u.equals(o)||a.push(new exports.Ln2(o,u));break;case"C":if(u.x=i(E[4]),u.y=i(E[5]),g.x=i(E[2]),g.y=i(E[3]),Q=this._createBezierCurve([o,new exports.Vec2(i(E[0]),i(E[1])),g,u],o),!Q)continue;a.push(Q);break;case"Q":if(u.x=i(E[2]),u.y=i(E[3]),g.x=i(E[0]),g.y=i(E[1]),Q=this._createBezierCurve([o,g,u],o),!Q)continue;a.push(Q);break;case"S":if(u.x=i(E[2]),u.y=i(E[3]),Q=this._createBezierCurve([o,new exports.Vec2(r(o.x,g.x),r(o.y,g.y)),new exports.Vec2(i(E[0]),i(E[1])),u],o),g.x=i(E[0]),g.y=i(E[1]),!Q)continue;a.push(Q);break;case"T":if(u.x=i(E[0]),u.y=i(E[1]),Q=this._createBezierCurve([o,new exports.Vec2(r(o.x,g.x),r(o.y,g.y)),u],o),g.x=r(o.x,g.x),g.y=r(o.y,g.y),!Q)continue;a.push(Q);break;case"A":if(u.x=E[5],u.y=E[6],Util.isNearlyEqual(E[0],E[1])){const w=this._computeArcInfo(E[0],o,u,!E[3],!!E[4]).center,y=!!E[4],M=exports.Arc2.makeArcByStartEndPoints(w,o,u,y);a.push(M)}else{const p=E[2]*Math.PI/180,w=this._computeEllipseInfo(E[0],E[1],p,o,u,!!E[3],!!E[4]),y=w.center,M=!!E[4],N=new exports.Vec2(1,0).rotate(exports.Vec2.O(),p),S=new exports.Coord2(y,N);let R=[w.startAngle,w.endAngle];M||(R=[-w.startAngle,-w.endAngle]);const U=new exports.Arc2(S,E[0],E[1],M,R);a.push(U)}break;case"Z":a.length&&!a[0].getStartPt().equals(o)&&a.push(new exports.Ln2(o,a[0].getStartPt()));break}o=u}return n.push(new exports.PolyCurve(a)),n}static svgDataToPolyCurves(t,e=!0){const n=[];t.outterFaces.forEach(a=>{const I=SVGParser.stringToPolyCurves(a.path,e);for(const c of I)c.getAllCurves().length!==0&&n.push(c)});const s=new Box2;n[0].getAllCurves().forEach(a=>{s.union(a.getBBox())}),t.innerFaces.forEach(a=>{const I=SVGParser.stringToPolyCurves(a.path,e);for(const c of I)c.getAllCurves().length!==0&&n.push(c)});const r=s.getCenter(),i=s.getSize(),o=exports.Matrix3.makeTranslate(r.multiplied(-1));o.applyScale(exports.Vec2.O(),10);const g=exports.Matrix3.makeTranslate({x:i.x*10/2,y:i.y*10/2});return n.forEach(a=>{a.transform(o).transform(g)}),n}static _SVGStringToCommands(t){const e=/[a-df-z][^a-df-z]*/gi,n=i=>{const o=i.split(/[\s,]+/),g=[];for(let a=0;a<o.length;a++){const I=o[a];if(I.indexOf(".")!==I.lastIndexOf(".")){const c=I.split(".");for(let E=2;E<c.length;E++)o.splice(a+E-1,0,`0.${c[E]}`)}g.push(parseFloat(I))}return g},s=t.match(e),r=[];if(s)for(let i=0;i<s.length;i++){const o=s[i],g=o.charAt(0),a=o.substr(1).trim();r.push({cmd:g,data:n(a)})}return r}static _createBezierCurve(t,e){const s=(r=>{const i=[];for(const o of r)i.every(g=>!g.equals(o))&&i.push(o);return i})(t);if(!(s.length<=1))return s.length===2&&!e.equals(t[t.length-1])?new exports.Ln2(e,t[t.length-1]):exports.NurbsCurve2.makeBezier(s)}static _computeEllipseInfo(t,e,n,s,r,i,o){const g=(s.x-r.x)/2,a=(s.y-r.y)/2,I=Math.cos(n)*g+Math.sin(n)*a,c=-Math.sin(n)*g+Math.cos(n)*a;let E=Math.abs(t),u=Math.abs(e),Q=E*E,p=u*u;const w=I*I,y=c*c,M=w/Q+y/p;if(M>1){const nA=Math.sqrt(M);E*=nA,u*=nA,Q=E*E,p=u*u}const N=Q*y+p*w,S=(Q*p-N)/N;let R=Math.sqrt(Math.max(0,S));i===o&&(R=-R);const U=R*E*c/u,b=-R*u*I/E,G=Math.cos(n)*U-Math.sin(n)*b+(s.x+r.x)/2,O=Math.sin(n)*U+Math.cos(n)*b+(s.y+r.y)/2,H=(nA,IA,iA,W)=>{const oA=nA*iA+IA*W,hA=Math.sqrt(nA*nA+IA*IA)*Math.sqrt(iA*iA+W*W);let dA=Math.acos(Math.max(-1,Math.min(1,oA/hA)));return nA*W-IA*iA<0&&(dA=-dA),dA},z=H(1,0,(I-U)/E,(c-b)/u),tA=H((I-U)/E,(c-b)/u,(-I-U)/E,(-c-b)/u)%(Math.PI*2);return{center:new exports.Vec2(G,O),startAngle:z,endAngle:z+tA}}static _computeArcInfo(t,e,n,s,r){const i=e.midTo(n),o=(n.x-e.x)/2,g=(n.y-e.y)/2,a=new exports.Vec2(-g,o);s!==r&&a.reverse();const I=o*o+g*g,c=Math.sqrt(t*t-I),u=new exports.Ln2(i,a,Interval.infinitArray()).getPtAt(c);let Q=2*Math.asin(Math.sqrt(I)/t);return s||(Q=CONST.PI2-Q),{center:u,angle:Q}}}class ObjParser{static exportMeshes(t){let e="";for(const s of t)for(let r=0;r<s.vertices.length;r+=3)e+=`v ${s.vertices[r]} ${s.vertices[r+1]} ${s.vertices[r+2]}
203
+ `;for(const s of t)for(let r=0;r<s.uvs.length;r+=2)e+=`vt ${s.uvs[r]} ${s.uvs[r+1]}
204
+ `;for(const s of t)for(let r=0;r<s.normals.length;r+=3)e+=`vn ${s.normals[r]} ${s.normals[r+1]} ${s.normals[r+2]}
205
+ `;let n=1;for(const s of t){for(let r=0;r<s.faces.length;r+=3){const i=s.faces[r]+n,o=s.faces[r+1]+n,g=s.faces[r+2]+n;e+=`f ${i}/${i}/${i} ${o}/${o}/${o} ${g}/${g}/${g}
206
+ `}n+=s.vertices.length/3}return e}}class Clipper2Util{static async initialize(t){(!t||typeof t=="function")&&(this.clipper2Z=await t())}}var UnitType=(l=>(l[l.MM=0]="MM",l[l.METER=1]="METER",l[l.INCH=2]="INCH",l))(UnitType||{});class UnitsConversion{static getScale(t=0){return t===1?1024:t===2?32:1}}class NormalUnitsConversion{static getScale(t=0){return t===1?1e3:t===2?25.39999918:1}}class RegionUtil{static traverseRegion(t,e){e(t);for(let n=0;n<t.link.length;++n)t.link[n].depth<=t.depth||RegionUtil.traverseRegion(t.link[n],e)}static traverseCoEdge(t,e){RegionUtil.traverseRegion(t,n=>{for(let s=0;s<n.outer.length;++s)e(n.outer[s]);if(n.holes)for(let s=0;s<n.holes.length;++s)for(let r=0;r<n.holes[s].length;++r)e(n.holes[s][r])})}static getOriginalRegion(t){let e=new Map;return RegionUtil.traverseRegion(t,n=>{if(n.oldId)for(let s=0;s<n.oldId.length;++s){let r=e.get(n.oldId[s]);r||(r=[],e.set(n.oldId[s],r)),r.push(n)}}),e}static getCoEdgeOrderByOriginal(t,e){let n=new Map,s=new Map,r=[],i=[],o=new Map;for(let g=0;g<e.length;++g)s.set(e[g].id,e[g]);RegionUtil.traverseCoEdge(t,g=>{if(!g.oldId)return;let a=g.edge.curve.getMidPt();for(let I=0;I<g.oldId.length;++I){let c=s.get(g.oldId[I]);if(!c)continue;let E=n.get(c);E||(E=[],i.push(c),r.push(E),n.set(c,E)),E.push({e:g.edge,t:c.curve.getParamAt(a)})}});for(let g=0;g<r.length;++g){r[g].sort((I,c)=>I.t-c.t);let a=0;for(let I=0;I<r[g].length;++I)a&&r[g][I].e==r[g][a-1].e||(r[g][a++]=r[g][I]);for(;r[g].length>a;)r[g].pop();o.set(i[g],r[g].map(I=>I.e))}return o}static mergeDualRegion(t,e,n){let s=[t.outer];for(let Q=0;Q<t.holes.length;++Q)s.push(t.holes[Q]);for(let Q=0;Q<s.length;++Q)for(let p=0;p<s[Q].length;++p){let w=s[Q][p].edge;(w.coedges[0].region==t&&w.coedges[1].region==e||w.coedges[0].region==e&&w.coedges[1].region==t)&&n.add(w)}let r=[];const i=Q=>{for(let p=0;p<Q.outer.length;++p)n.has(Q.outer[p].edge)||r.push(Q.outer[p]);for(let p=0;p<Q.holes.length;++p)for(let w=0;w<Q.holes[p].length;++w)n.has(Q.holes[p][w].edge)||r.push(Q.holes[p][w])};i(t),i(e);let o=[],g=new Map;for(let Q=0;Q<r.length;++Q){let p=g.get(r[Q].isRev?r[Q].edge.to:r[Q].edge.from);p?p.push(Q):g.set(r[Q].isRev?r[Q].edge.to:r[Q].edge.from,[Q])}for(let Q=0;Q<r.length;++Q){let p=g.get(r[Q].isRev?r[Q].edge.from:r[Q].edge.to);o.push(p)}let a=Math.min(t.depth,e.depth),I=[],c=[];for(let Q=0;Q<r.length;++Q){let p=Q,w=[],y=1e100;for(;o[p].length>0;){w.push(r[p]);let M=Math.min(r[p].edge.coedges[0].region.depth,r[p].edge.coedges[1].region.depth);M<y&&(y=M),p=o[p].pop()}w.length!=0&&(y<a?I=w:c.push(w))}t.depth=a,t.outer=I,t.holes=c;let E=[],u=new Set;u.add(t);for(let Q=0;Q<r.length;++Q){let p=r[Q].edge.coedges;for(let w=0;w<p.length;++w)p[w].region==e&&(p[w].region=t),!u.has(p[w].region)&&(E.push(p[w].region),u.add(p[w].region))}t.link=E}static adaptiveIdAllocation(t,e,n){const s=o=>{for(let g=0;g<o.length;++g)if(!(!e(o[g])||!n(o[g])||o[g].depth==0))for(let a=0;a<o[g].link.length;++a){if(e(o[g].link[a])||!n(o[g].link[a])||o[g].link[a].depth==0)continue;let I=o[g],c=o[g].link[a];return o[g]=o[o.length-1],o.pop(),[c,I]}};let r=new Set,i;for(;i=s(t);)RegionUtil.mergeDualRegion(i[0],i[1],r)}}class P2D{constructor(t=0,e=0){this.x=t,this.y=e}clone(){return new P2D(this.x,this.y)}dot(t=void 0){return t?this.x*t.x+this.y*t.y:this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.dot())}normalize(){let t=this.length();return this.x/=t,this.y/=t,this}normal(){let t=-this.y;return this.y=this.x,this.x=t,this}}var C2dType=(l=>(l[l.line=0]="line",l[l.arc=1]="arc",l[l.ellipse=2]="ellipse",l[l.bezier2d3=3]="bezier2d3",l[l.hyperbola=4]="hyperbola",l[l.any=5]="any",l))(C2dType||{});class C2d{constructor(t,e,n=-1){this.start=t?new P2D(t.x,t.y):new P2D,this.end=e?new P2D(e.x,e.y):new P2D,this.id=n}_toBuffer(t,e,n,s,r,i){e[i*s]=t,e[i*s+1]=this.id;let o=i*r+1;return n[o++]=this.start.x,n[o++]=this.start.y,n[o++]=this.end.x,n[o++]=this.end.y,o}static{this.curveSizeWasm=0}}class L2D extends C2d{constructor(t,e,n=-1){super(t,e,n)}get type(){return C2dType.line}toRev(){return new L2D(this.end.clone(),this.start.clone(),this.id)}static toMathCurve(t){return new exports.Ln2(t.start,t.end)}toMathCurve(){return new exports.Ln2(this.start,this.end)}rev(){let t=this.end;return this.end=this.start,this.start=t,this}toBuffer(t,e,n,s,r){this._toBuffer(this.type,t,e,n,s,r)}updateBox2d(t){t.min.x>this.start.x&&(t.min.x=this.start.x),t.min.x>this.end.x&&(t.min.x=this.end.x),t.max.x<this.start.x&&(t.max.x=this.start.x),t.max.x<this.end.x&&(t.max.x=this.end.x),t.min.y>this.start.y&&(t.min.y=this.start.y),t.min.y>this.end.y&&(t.min.y=this.end.y),t.max.y<this.start.y&&(t.max.y=this.start.y),t.max.y<this.end.y&&(t.max.y=this.end.y)}}class A2D extends C2d{constructor(t,e,n,s,r,i=-1){super(t,e,i),this.r=n,this.center=new P2D(r.x,r.y),this.beta=s}get type(){return C2dType.arc}static toMathCurve(t){let e=Math.atan2(t.start.y-t.center.y,t.start.x-t.center.x);return exports.Arc2.makeArcByStartEndAngles(t.center,t.r,e,e+t.beta,t.beta>0)}toMathCurve(){let t=Math.atan2(this.start.y-this.center.y,this.start.x-this.center.x);return exports.Arc2.makeArcByStartEndAngles(this.center,this.r,t,t+this.beta,this.beta>0)}rev(){let t=this.end;return this.end=this.start,this.start=t,this.beta=-this.beta,this}toRev(){return new A2D(this.end.clone(),this.start.clone(),this.r,-this.beta,this.center.clone(),this.id)}toBuffer(t,e,n,s,r){let i=this._toBuffer(this.type,t,e,n,s,r);e[i++]=this.r,e[i++]=this.center.x,e[i++]=this.center.y,e[i++]=this.beta}inside(t){let e=this.start.x-this.center.x,n=this.start.y-this.center.y,s=t.x-this.center.x,r=t.y-this.center.y,i=Math.atan2(e*r-s*n,e*s+n*r);return i<0?this.beta<0?i>this.beta:i<this.beta-Math.PI*2:this.beta>0?i<this.beta:i>this.beta+Math.PI*2}updateBox2d(t){let e=[this.start,this.end,{x:this.center.x-this.r,y:this.center.y},{x:this.center.x+this.r,y:this.center.y},{x:this.center.x,y:this.center.y+this.r},{x:this.center.x,y:this.center.y-this.r}];for(let n=0;n<e.length;++n)n>1&&!this.inside(e[n])||(t.min.x=Math.min(e[n].x,t.min.x),t.min.y=Math.min(e[n].y,t.min.y),t.max.x=Math.max(e[n].x,t.max.x),t.max.y=Math.max(e[n].y,t.max.y))}}class Elli extends C2d{constructor(t,e,n,s,r,i,o,g=-1){super(t,e,g),this.a=n,this.b=s,this.center=new P2D(i.x,i.y),this.rotate=r,this.beta=o}get type(){return C2dType.ellipse}rev(){let t=this.end;return this.end=this.start,this.start=t,this.beta=-this.beta,this}toRev(){return new Elli(this.end.clone(),this.start.clone(),this.a,this.b,this.rotate,this.center.clone(),-this.beta,this.id)}static toMathCurve(t){let e=new exports.Coord2(t.center,{x:Math.cos(t.beta),y:Math.sin(t.beta)}),n=Math.atan2(t.start.y-t.center.y,t.end.x-t.center.x);return new exports.Arc2(e,t.a,t.b,t.beta>=0,[n,n+t.beta])}toMathCurve(){let t=new exports.Coord2(this.center,{x:Math.cos(this.beta),y:Math.sin(this.beta)}),e=Math.atan2(this.start.y-this.center.y,this.end.x-this.center.x);return new exports.Arc2(t,this.a,this.b,this.beta>=0,[e,e+this.beta])}toBuffer(t,e,n,s,r){let i=this._toBuffer(this.type,t,e,n,s,r);e[i++]=this.a,e[i++]=this.b,e[i++]=this.rotate,e[i++]=this.center.x,e[i++]=this.center.y,e[i++]=this.beta}updateBox2d(t){}}class Bx2{constructor(){this.min=new P2D(1/0,1/0),this.max=new P2D(-1/0,-1/0)}union(t){this.min.x>t.min.x&&(this.min.x=t.min.x),this.min.y>t.min.y&&(this.min.y=t.min.y),this.max.x<t.max.x&&(this.max.x=t.max.x),this.max.y<t.max.y&&(this.max.y=t.max.y)}update(t){if(!Array.isArray(t))this.min.x>t.x&&(this.min.x=t.x),this.min.y>t.y&&(this.min.y=t.y),this.max.x<t.x&&(this.max.x=t.x),this.max.y<t.y&&(this.max.y=t.y);else for(let e=0;e<t.length;++e)this.min.x>t[e].x&&(this.min.x=t[e].x),this.min.y>t[e].y&&(this.min.y=t[e].y),this.max.x<t[e].x&&(this.max.x=t[e].x),this.max.y<t[e].y&&(this.max.y=t[e].y)}toArray(){return[{x:this.min.x,y:this.min.y},{x:this.max.x,y:this.min.y},{x:this.max.x,y:this.max.y},{x:this.min.x,y:this.max.y}]}}function mathCurveToCurve2d(l,t=-1){switch(l.getType()){case EN_GEO_TYPE.LN_2:{let e=l;return new L2D(e.getStartPt(),e.getEndPt(),t)}case EN_GEO_TYPE.ARC_2:{let e=l,n=e.getCoord(),s=e.getA(),r=e.getB(),i=e.getRange();if(Math.abs(s-r)<1e-10)return new A2D(e.getStartPt(),e.getEndPt(),s,(i.max-i.min)*(e.isCCW()?1:-1),n.getOrigin(),t);{let o=n.getDx();return new Elli(e.getStartPt(),e.getEndPt(),s,r,Math.atan2(o.y,o.x),n.getOrigin(),(i.max-i.min)*(e.isCCW()?1:-1),t)}}default:throw"Unsupported data type "+l.getType()}}class GeomLibWrapper{get instance(){return this._instance}async initialize(){await loadWasmInstanceAsync(),this._instance=getGeomInstance()}helloworld(){this._instance.helloword()}search(t,e=1,n=1e-6){let s=this.getRot(t);const r=exports.Matrix3.makeRotate(exports.Vec2.O(),s),i=exports.Matrix3.makeRotate(exports.Vec2.O(),-s);t.forEach(iA=>{iA.curve=iA.curve.transformed(r)});let o=new Map,g=new Map,a=new Map,I=new Map,c=new Map,E=new Map,u=[],Q=0,p=0,w=0,y=[];(iA=>{for(let W=0;W<iA.length;++W){(iA[W].id===0||iA[W].id)&&!c.has(iA[W].id)&&(g.set(p,iA[W].id),c.set(iA[W].id,p++));let oA=-1,hA=-1;(iA[W].from===0||iA[W].from)&&!E.has(iA[W].from)&&(a.set(w,iA[W].from),E.set(iA[W].from,w),oA=w++),(iA[W].to===0||iA[W].to)&&!E.has(iA[W].to)&&(a.set(w,iA[W].to),E.set(iA[W].to,w),hA=w++),(iA[W].lregion===0||iA[W].lregion)&&!I.has(iA[W].lregion)&&(o.set(Q,iA[W].lregion),I.set(iA[W].lregion,Q++)),(iA[W].rregion===0||iA[W].rregion)&&!I.has(iA[W].rregion)&&(o.set(Q,iA[W].rregion),I.set(iA[W].rregion,Q++));let dA=I.get(iA[W].lregion),PA=I.get(iA[W].rregion);dA===void 0&&(dA=-1),PA===void 0&&(PA=-1);let yA=c.get(iA[W].id);yA==null&&(yA=p++),y.push(mathCurveToCurve2d(iA[W].curve,yA)),u.push(dA,PA,oA,hA)}})(t);let N=this._instance._malloc(Int32Array.BYTES_PER_ELEMENT*u.length),S=new Int32Array(this._instance.HEAPF64.buffer,N);for(let iA=0;iA<u.length;++iA)S[iA]=u[iA];let R=this.curvesToBuffer(y),U=this._instance.search(R.ptr,R.bitsize,N,u.length,n,e);t.forEach(iA=>{iA.curve.transform(i)}),this._instance._free(N),this._instance._free(R.ptr);let b=this._processGrapher2DBuffer(U),G=[],O=new Map;for(let iA=0;iA<b.regions.length;++iA)O.set(b.regions[iA].id,{id:b.regions[iA].id,oldId:[],outer:[],holes:[],link:[],depth:-1});let H=this.getPTS(b,a,i);for(let iA=0;iA<b.allEdge.length;++iA){let W=this.cueveTomathCurve(b.allEdge[iA].c);W.transform(i);let oA=b.allEdge[iA].id,hA=O.get(b.allEdge[iA].l),dA=O.get(b.allEdge[iA].r),PA=[];for(let aA=0;aA<b.allEdge[iA].o.length;++aA){let wA=g.get(b.allEdge[iA].o[aA]);(wA||wA==0)&&PA.push(wA)}let yA={curve:W,coedges:[],from:H[b.allEdge[iA].f],to:H[b.allEdge[iA].t],oldId:PA},_A=W.getStartPt(),LA=W.getEndPt();yA.from.point.x=_A.x,yA.from.point.y=_A.y,yA.to.point.x=LA.x,yA.to.point.y=LA.y;let BA={edge:yA,isRev:!1,id:oA,region:hA,oldId:PA},lA={edge:yA,isRev:!0,id:oA,region:dA,oldId:PA};yA.coedges.push(BA,lA),G.push(yA)}let z={id:-1,oldId:[],outer:[],holes:[],link:[],depth:-1};const tA=iA=>{if(iA.outer.length===2){const W=iA.outer[0].isRev?iA.outer[0].edge.curve.reversed():iA.outer[0].edge.curve,oA=iA.outer[1].isRev?iA.outer[1].edge.curve.reversed():iA.outer[1].edge.curve;if(e&&W instanceof exports.Ln2&&oA instanceof exports.Ln2){const hA=iA.outer[0],dA=iA.outer[1];return hA.id&&dA.id&&hA.id!==dA.id&&(hA.edge.id=dA.edge.id,hA.edge.coedges.forEach(PA=>PA.id=dA.id)),!1}else if((W instanceof exports.Arc2||oA instanceof exports.Arc2)&&(W.getLength()<1e-5||oA.getLength()<1e-5)&&Math.abs(new exports.Loop([W,oA]).calcArea())<1e-10)return!1}return!(iA.outer.length===1&&iA.outer[0].edge.curve instanceof exports.Ln2)};for(let iA=0;iA<b.regions.length;++iA){let W=O.get(b.regions[iA].id);W.id=b.regions[iA].id;let oA=b.regions[iA].outer,hA=new Set;W.link=[];for(let PA=0;PA<oA.length;++PA){let yA=G[oA[PA].ind];W.outer.push(yA.coedges[oA[PA].isrev?1:0]);for(let _A=0;_A<yA.coedges.length;++_A)yA.coedges[_A].region.id!==W.id&&(hA.has(yA.coedges[_A].region)||(hA.add(yA.coedges[_A].region),W.link.push(yA.coedges[_A].region),yA.coedges[_A].region.link.includes(W)||yA.coedges[_A].region.link.push(W)))}let dA=b.regions[iA].holes;for(let PA=0;PA<dA.length;++PA){let yA=[];for(let _A=0;_A<dA[PA].length;++_A){let LA=G[dA[PA][_A].ind];yA.push(LA.coedges[dA[PA][_A].isrev?1:0]);for(let BA=0;BA<LA.coedges.length;++BA)LA.coedges[BA].region.id!==W.id&&(hA.has(LA.coedges[BA].region)||(hA.add(LA.coedges[BA].region),W.link.push(LA.coedges[BA].region),LA.coedges[BA].region.link.includes(W)||LA.coedges[BA].region.link.push(W)))}W.holes.push(yA)}for(let PA=0;PA<b.regions[iA].o.length;++PA)W.oldId?.push(o.get(b.regions[iA].o[PA]));W.id===-1&&(z=W)}const IA=(iA=>{let W=[iA];iA.depth=0;let oA=0;for(;oA<W.length;){let hA=W[oA++];for(let dA=0;dA<hA.link.length;++dA)hA.link[dA].depth>-1||(hA.link[dA].depth=hA.depth+1,W.push(hA.link[dA]))}return W})(z).filter(iA=>tA(iA)).map(iA=>(iA.holes=iA.holes.filter(W=>{if(W.length===2){const oA=W[0].isRev?W[0].edge.curve.reversed():W[0].edge.curve,hA=W[1].isRev?W[1].edge.curve.reversed():W[1].edge.curve;if(e&&oA instanceof exports.Ln2&&hA instanceof exports.Ln2)return!1;if((oA instanceof exports.Arc2||hA instanceof exports.Arc2)&&(oA.getLength()<1e-5||hA.getLength()<1e-5)&&Math.abs(new exports.Loop([oA,hA]).calcArea())<1e-10)return!1}return!0}),iA));return{root:z,list:IA}}union(t,e,n={angleEps:1e-4,lengthEps:1e-6},s=!1){let r=0;for(let i=0;i<t.length;++i)r+=t[i].length;return s?this.cueveLoopsTomathCurveLoops(this._clipperUnion(this.mathCurveToCueves(t,e),n.lengthEps,n.angleEps,-1e100,1e100,!1,r)):this.cueveLoopsTomathCurveLoops(this._clipperUnion(this.mathCurveToCueves(t,e),n.lengthEps,n.angleEps,-1e100,1e100,!0,r))}intersect(t,e,n={angleEps:1e-4,lengthEps:1e-6},s=!0){if(e.length===0||t.length===0)return[];let r=-1e100,i=1e100,o=this.mathCurveToCueves(t),g=this.mathCurveToCueves(e),a=g.length;if(s){let I=new Bx2,c=new Bx2;for(let E=0;E<o.length;++E)o[E].updateBox2d(I);for(let E=0;E<g.length;++E)g[E].updateBox2d(c);if(I.max.x<c.min.x)return[];if(c.max.x<I.min.x)return[];r=Math.max(I.min.x,c.min.x)-.001,i=Math.min(I.max.x,c.max.x)+.001;for(let E=0;E<o.length;++E)g.push(o[E]);return this.cueveLoopsTomathCurveLoops(this._clipperInter(g,n.lengthEps,n.angleEps,r,i,!0,a))}for(let I=0;I<o.length;++I)g.push(o[I]);return this.cueveLoopsTomathCurveLoops(this._clipperInter(g,n.lengthEps,n.angleEps,r,i,!0,a))}different(t,e,n={angleEps:1e-4,lengthEps:1e-6},s=!1){let r=-1e100,i=1e100,o=this.mathCurveToCueves(t),g=o.length;if(s){let I=this.intersect(t,e,n,!0),c=[];for(let Q=0;Q<I.length;++Q)for(let p=0;p<I[Q].length;++p)c.push(I[Q][p]);let E=this.mathCurveToCueves(c);for(let Q=0;Q<E.length;++Q)o.push(E[Q]);return this.cueveLoopsTomathCurveLoops(this._clipperDiff(o,n.lengthEps,n.angleEps,r,i,!0,g))}let a=this.mathCurveToCueves(e);for(let I=0;I<a.length;++I)o.push(a[I]);return this.cueveLoopsTomathCurveLoops(this._clipperDiff(o,n.lengthEps,n.angleEps,r,i,!0,g))}xor(t,e,n={angleEps:1e-4,lengthEps:1e-6},s=!0){if(s){let g=this.intersect(t,e,n,!0),a=[];for(let y=0;y<g.length;++y)for(let M=0;M<g[y].length;++M)a.push(g[y][M]);let I=this.mathCurveToCueves(a),c=this.mathCurveToCueves(t),E=this.mathCurveToCueves(e),u=c.length,Q=E.length;for(let y=0;y<I.length;++y)c.push(I[y]),E.push(I[y]);let p=this.cueveLoopsTomathCurveLoops(this._clipperDiff(c,n.lengthEps,n.angleEps,-1e100,1e100,!1,u)),w=this.cueveLoopsTomathCurveLoops(this._clipperDiff(E,n.lengthEps,n.angleEps,-1e100,1e100,!1,Q));for(let y=0;y<p.length;++y)w.push(p[y]);return w}let r=this.mathCurveToCueves(t),i=r.length,o=this.mathCurveToCueves(e);for(let g=0;g<o.length;++g)r.push(o[g]);return this.cueveLoopsTomathCurveLoops(this._clipperXor(r,n.lengthEps,n.angleEps,-1e100,1e100,!0,i))}simplfy(t,e={angleEps:1e-4,lengthEps:1e-6}){return this.union(t,[],e)}cueveLoopsTomathCurveLoops(t){let e=[];for(let n=0;n<t.length;++n){e.push([]);for(let s=0;s<t[n].length;++s){e[n].push([]);for(let r=0;r<t[n][s].length;++r)e[n][s].push(this.cueveTomathCurve(t[n][s][r]))}}return e}cueveTomathCurve(t){switch(t.type){case C2dType.line:return L2D.toMathCurve(t);case C2dType.arc:return A2D.toMathCurve(t);case C2dType.ellipse:return Elli.toMathCurve(t)}return L2D.toMathCurve(t)}mathCurveToCueves(t,e,n=1e-6){let s=[],r=e?[t,e]:[t];for(let i=0;i<r.length;++i){let o=r[i];for(let g=0;g<o.length;++g){let a=s.length;for(let u=0;u<o[g].length;++u)s.push(mathCurveToCurve2d(o[g][u]));if(!s.length)continue;let I=s[s.length-1].end,c=1/0,E=-1;for(let u=a;u<s.length;++u)s[u].start=I,I=s[u].end,!(c<s[u].start.y)&&(c=s[u].start.y,E=u);for(let u=E,Q=s.length-a;Q--;++u)u===s.length&&(u=a),Math.abs(s[u].start.x-s[u].end.x)<=n&&(s[u].end.x=s[u].start.x)}}return s}_getPathByBufferEx(t,e,n,s,r){let i=[];for(let o=0;o<r;++o){let g=o*n,a=o*s+1;switch(t[g]){case C2dType.line:i.push(new L2D({x:e[a],y:e[a+1]},{x:e[a+2],y:e[a+3]},t[g+1]));break;case C2dType.arc:i.push(new A2D({x:e[a],y:e[a+1]},{x:e[a+2],y:e[a+3]},e[a+4],e[a+7],{x:e[a+5],y:e[a+6]},t[g+1]));break;case C2dType.ellipse:i.push(new Elli({x:e[a],y:e[a+1]},{x:e[a+2],y:e[a+3]},e[a+4],e[a+5],e[a+6],{x:e[a+7],y:e[a+8]},e[a+9],t[g+1]));break}}return i}_processGrapher2DBuffer_Points(t){let e=new Float64Array(this._instance.HEAPF64.buffer,t.data),n=new Int32Array(this._instance.HEAPF64.buffer,t.begin),s=new Int32Array(this._instance.HEAPF64.buffer,t.list),r=t.count,i=[],o=[],g=[0];for(let I=0;I<r;++I)i.push({x:e[I*2],y:e[I*2+1]});let a=0;for(let I=0;I<r;++I){let c=n[I+1];g.push(c),a<c&&(a=c)}for(let I=0;I<a;++I)o.push(s[I]);return{points:i,list:o,begin:g}}_processGrapher2DBuffer_Edge(t){let e=new Int32Array(this._instance.HEAPF64.buffer,t.ptr,t.edgeCount*this._instance.getCurveSize()/Int32Array.BYTES_PER_ELEMENT),n=new Float64Array(this._instance.HEAPF64.buffer,t.ptr,t.edgeCount*this._instance.getCurveSize()/Float64Array.BYTES_PER_ELEMENT),s=this._instance.getCurveSize()/Int32Array.BYTES_PER_ELEMENT,r=this._instance.getCurveSize()/Float64Array.BYTES_PER_ELEMENT,i=this._getPathByBufferEx(e,n,s,r,t.edgeCount),o=[],g=new Int32Array(this._instance.HEAPF64.buffer,t.curveData),a=new Int32Array(this._instance.HEAPF64.buffer,t.idData);for(let I=0,c=0;I<i.length;++I){let E=i[I],u=g[c++],Q=g[c++],p=g[c++],w=g[c++],y=g[c++],M=g[c++],N=g[c++],S=[];for(;M<N;)S.push(a[M++]);o.push({c:E,l:u,r:Q,f:p,t:w,id:y,o:S})}return this._instance._free(t.ptr),this._instance._free(t.idData),this._instance._free(t.curveData),o}_processGrapher2DBuffer_Regions(t){let e=[],n=new Int32Array(this._instance.HEAPF64.buffer,t.loopsPtr),s=new Int32Array(this._instance.HEAPF64.buffer,t.regionOldPtr);for(let r=0;r<t.regions.length;++r){let i=t.regions[r].id,o=[],g=t.regions[r].obegin,a=t.regions[r].oend,I=[];for(;g<a;)I.push(s[g++]);let c=t.regions[r].loopbegin,E=t.regions[r].loopend;for(;c<E;)o.push({ind:n[c],isrev:n[c+1]}),c+=2;let u=[];for(let Q=0;Q<t.regions[r].holes.length;++Q){c=t.regions[r].holes[Q].loopbegin,E=t.regions[r].holes[Q].loopend;let p=[];for(;c<E;)p.push({ind:n[c],isrev:n[c+1]}),c+=2;u.push(p)}e.push({id:i,o:I,outer:o,holes:u})}return e}_processGrapher2DBuffer(t){let e=this._processGrapher2DBuffer_Edge(t.alledge),n=this._processGrapher2DBuffer_Points(t.point),s=this._processGrapher2DBuffer_Regions(t.regions);return{allEdge:e,points:n.points,begin:n.begin,list:n.list,regions:s}}_getPathByBuffer(t,e,n,s,r,i,o){let g=[];do{let a=[];for(let I=e[o],c=e[o+1];I<c;++I){let E=I*r,u=I*i+1;switch(n[E]){case C2dType.line:a.push(new L2D({x:s[u],y:s[u+1]},{x:s[u+2],y:s[u+3]},n[E+1]));break;case C2dType.arc:a.push(new A2D({x:s[u],y:s[u+1]},{x:s[u+2],y:s[u+3]},s[u+4],s[u+7],{x:s[u+5],y:s[u+6]},n[E+1]));break;case C2dType.ellipse:a.push(new Elli({x:s[u],y:s[u+1]},{x:s[u+2],y:s[u+3]},s[u+4],s[u+5],s[u+6],{x:s[u+7],y:s[u+8]},s[u+9],n[E+1]));break}}++o,g.push(a)}while(t[o]==0);return{result:g,index:o}}_paraseBuffer(t){let e=t.isOuter,n=t.polyBegin,s=new Int32Array(this._instance.HEAPF64.buffer,t.edge,t.edgeCount*this._instance.getCurveSize()/Int32Array.BYTES_PER_ELEMENT),r=new Float64Array(this._instance.HEAPF64.buffer,t.edge,t.edgeCount*this._instance.getCurveSize()/Float64Array.BYTES_PER_ELEMENT),i=this._instance.getCurveSize()/Int32Array.BYTES_PER_ELEMENT,o=this._instance.getCurveSize()/Float64Array.BYTES_PER_ELEMENT,g=0,a=t.count,I=[];for(;g<a;){let{result:c,index:E}=this._getPathByBuffer(e,n,s,r,i,o,g);g=E,I.push(c)}return this._instance._free(t.edge),I}_clipperInter(t,e,n,s,r,i,o=0){let{ptr:g,bitsize:a}=this.curvesToBuffer(t),I=this._paraseBuffer(this._instance.clipperInter(g,a,e,n,s,r,i,o));return this._instance._free(g),I}_clipperDiff(t,e,n,s,r,i,o=0){let{ptr:g,bitsize:a}=this.curvesToBuffer(t),I=this._paraseBuffer(this._instance.clipperDiff(g,a,e,n,s,r,i,o));return this._instance._free(g),I}_clipperUnion(t,e,n,s,r,i,o=0){let{ptr:g,bitsize:a}=this.curvesToBuffer(t),I=this._paraseBuffer(this._instance.clipperUnion(g,a,e,n,s,r,i,o));return this._instance._free(g),I}_clipperXor(t,e,n,s,r,i,o=0){let{ptr:g,bitsize:a}=this.curvesToBuffer(t),I=this._instance.clipperXor(g,a,e,n,s,r,i,o);return this._instance._free(g),I}curvesToBuffer(t){let e=t.length*this._instance.getCurveSize(),n=this._instance._malloc(e),s=new Int32Array(this._instance.HEAPF64.buffer,n,e/Int32Array.BYTES_PER_ELEMENT),r=new Float64Array(this._instance.HEAPF64.buffer,n,e/Float64Array.BYTES_PER_ELEMENT),i=this._instance.getCurveSize()/Int32Array.BYTES_PER_ELEMENT,o=this._instance.getCurveSize()/Float64Array.BYTES_PER_ELEMENT;for(let g=0;g<t.length;++g)t[g].toBuffer(s,r,i,o,g);return{ptr:n,bitsize:e}}getRot(t){let e=0;const s=t.map(i=>i.curve instanceof exports.Ln2?i.curve.getDirection().angle({x:1,y:0}):0).map(i=>Math.PI/2-i);e=0;const r=1*Math.PI/180;for(;s.some(i=>Math.abs(i-e)*180/Math.PI<28);)e+=r;return e}getPTS(t,e,n){let s=[],r=t.points,i=t.list,o=t.begin;for(let g=0;g<r.length;++g){let a=[];for(let c=o[g];c<o[g+1];++c)a.push(e.get(i[c]));const I=new exports.Vec2({x:r[g].x,y:r[g].y});I.transform(n),s.push({point:I,id:g,oldId:a})}return s}}const Geom=new GeomLibWrapper;function init(l){var t={};Object.keys(l).forEach(function($){t[$]=l[$]});var t=typeof t<"u"?t:{},e={},n;for(n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);var s=!1,r=!1,i=!1,o=!1;if(s=typeof window=="object",r=typeof importScripts=="function",i=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",o=!s&&!i&&!r,t.ENVIRONMENT)throw new Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)");var g="";function a($){return t.locateFile?t.locateFile($,g):g+$}var I,c,E,u;if(i)r?g=require("path").dirname(g)+"/":g=__dirname+"/",I=function(eA,EA){var NA=Vt(eA);return NA?EA?NA:NA.toString():(E||(E=require("fs")),u||(u=require("path")),eA=u.normalize(eA),E.readFileSync(eA,EA?null:"utf8"))},c=function(eA){var EA=I(eA,!0);return EA.buffer||(EA=new Uint8Array(EA)),G(EA.buffer),EA},process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),typeof module<"u"&&(module.exports=t),process.on("unhandledRejection",AA),t.inspect=function(){return"[Emscripten Module object]"};else if(o)typeof read<"u"&&(I=function(eA){var EA=Vt(eA);return EA?Zt(EA):read(eA)}),c=function(eA){var EA;return EA=Vt(eA),EA||(typeof readbuffer=="function"?new Uint8Array(readbuffer(eA)):(EA=read(eA,"binary"),G(typeof EA=="object"),EA))},typeof scriptArgs<"u"&&scriptArgs,typeof print<"u"&&(typeof console>"u"&&(console={}),console.log=print,console.warn=console.error=typeof printErr<"u"?printErr:print);else if(s||r)r?g=self.location.href:document.currentScript&&(g=document.currentScript.src),g.indexOf("blob:")!==0?g=g.substr(0,g.lastIndexOf("/")+1):g="",I=function(eA){try{var EA=new XMLHttpRequest;return EA.open("GET",eA,!1),EA.send(null),EA.responseText}catch(FA){var NA=Vt(eA);if(NA)return Zt(NA);throw FA}},r&&(c=function(eA){try{var EA=new XMLHttpRequest;return EA.open("GET",eA,!1),EA.responseType="arraybuffer",EA.send(null),new Uint8Array(EA.response)}catch(FA){var NA=Vt(eA);if(NA)return NA;throw FA}});else throw new Error("environment detection error");var Q=t.print||console.log.bind(console),p=t.printErr||console.warn.bind(console);for(n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);e=null,t.arguments&&t.arguments,Object.getOwnPropertyDescriptor(t,"arguments")||Object.defineProperty(t,"arguments",{configurable:!0,get:function(){AA("Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),t.thisProgram&&t.thisProgram,Object.getOwnPropertyDescriptor(t,"thisProgram")||Object.defineProperty(t,"thisProgram",{configurable:!0,get:function(){AA("Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),t.quit&&t.quit,Object.getOwnPropertyDescriptor(t,"quit")||Object.defineProperty(t,"quit",{configurable:!0,get:function(){AA("Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),G(typeof t.memoryInitializerPrefixURL>"u","Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead"),G(typeof t.pthreadMainPrefixURL>"u","Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead"),G(typeof t.cdInitializerPrefixURL>"u","Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead"),G(typeof t.filePackagePrefixURL>"u","Module.filePackagePrefixURL option was removed, use Module.locateFile instead"),G(typeof t.read>"u","Module.read option was removed (modify read_ in JS)"),G(typeof t.readAsync>"u","Module.readAsync option was removed (modify readAsync in JS)"),G(typeof t.readBinary>"u","Module.readBinary option was removed (modify readBinary in JS)"),G(typeof t.setWindowTitle>"u","Module.setWindowTitle option was removed (modify setWindowTitle in JS)"),G(typeof t.TOTAL_MEMORY>"u","Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY"),Object.getOwnPropertyDescriptor(t,"read")||Object.defineProperty(t,"read",{configurable:!0,get:function(){AA("Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),Object.getOwnPropertyDescriptor(t,"readAsync")||Object.defineProperty(t,"readAsync",{configurable:!0,get:function(){AA("Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),Object.getOwnPropertyDescriptor(t,"readBinary")||Object.defineProperty(t,"readBinary",{configurable:!0,get:function(){AA("Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),Object.getOwnPropertyDescriptor(t,"setWindowTitle")||Object.defineProperty(t,"setWindowTitle",{configurable:!0,get:function(){AA("Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}});function w($){w.shown||(w.shown={}),w.shown[$]||(w.shown[$]=1,p($))}var y=0,M=function($){y=$},N=function(){return y},S;t.wasmBinary&&(S=t.wasmBinary),Object.getOwnPropertyDescriptor(t,"wasmBinary")||Object.defineProperty(t,"wasmBinary",{configurable:!0,get:function(){AA("Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),t.noExitRuntime&&t.noExitRuntime,Object.getOwnPropertyDescriptor(t,"noExitRuntime")||Object.defineProperty(t,"noExitRuntime",{configurable:!0,get:function(){AA("Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),typeof WebAssembly!="object"&&AA("no native wasm support detected");var R,U=new WebAssembly.Table({initial:186,maximum:186,element:"anyfunc"}),b=!1;function G($,eA){$||AA("Assertion failed: "+eA)}var O=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function H($,eA,EA){for(var NA=eA+EA,FA=eA;$[FA]&&!(FA>=NA);)++FA;if(FA-eA>16&&$.subarray&&O)return O.decode($.subarray(eA,FA));for(var OA="";eA<FA;){var JA=$[eA++];if(!(JA&128)){OA+=String.fromCharCode(JA);continue}var xA=$[eA++]&63;if((JA&224)==192){OA+=String.fromCharCode((JA&31)<<6|xA);continue}var At=$[eA++]&63;if((JA&240)==224?JA=(JA&15)<<12|xA<<6|At:((JA&248)!=240&&w("Invalid UTF-8 leading byte 0x"+JA.toString(16)+" encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!"),JA=(JA&7)<<18|xA<<12|At<<6|$[eA++]&63),JA<65536)OA+=String.fromCharCode(JA);else{var ft=JA-65536;OA+=String.fromCharCode(55296|ft>>10,56320|ft&1023)}}return OA}function z($,eA){return $?H(aA,$,eA):""}function tA($,eA,EA,NA){if(!(NA>0))return 0;for(var FA=EA,OA=EA+NA-1,JA=0;JA<$.length;++JA){var xA=$.charCodeAt(JA);if(xA>=55296&&xA<=57343){var At=$.charCodeAt(++JA);xA=65536+((xA&1023)<<10)|At&1023}if(xA<=127){if(EA>=OA)break;eA[EA++]=xA}else if(xA<=2047){if(EA+1>=OA)break;eA[EA++]=192|xA>>6,eA[EA++]=128|xA&63}else if(xA<=65535){if(EA+2>=OA)break;eA[EA++]=224|xA>>12,eA[EA++]=128|xA>>6&63,eA[EA++]=128|xA&63}else{if(EA+3>=OA)break;xA>=2097152&&w("Invalid Unicode code point 0x"+xA.toString(16)+" encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF)."),eA[EA++]=240|xA>>18,eA[EA++]=128|xA>>12&63,eA[EA++]=128|xA>>6&63,eA[EA++]=128|xA&63}}return eA[EA]=0,EA-FA}function nA($,eA,EA){return G(typeof EA=="number","stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),tA($,aA,eA,EA)}function IA($){for(var eA=0,EA=0;EA<$.length;++EA){var NA=$.charCodeAt(EA);NA>=55296&&NA<=57343&&(NA=65536+((NA&1023)<<10)|$.charCodeAt(++EA)&1023),NA<=127?++eA:NA<=2047?eA+=2:NA<=65535?eA+=3:eA+=4}return eA}var iA=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function W($,eA){G($%2==0,"Pointer passed to UTF16ToString must be aligned to two bytes!");for(var EA=$,NA=EA>>1,FA=NA+eA/2;!(NA>=FA)&&YA[NA];)++NA;if(EA=NA<<1,EA-$>32&&iA)return iA.decode(aA.subarray($,EA));for(var OA=0,JA="";;){var xA=wA[$+OA*2>>1];if(xA==0||OA==eA/2)return JA;++OA,JA+=String.fromCharCode(xA)}}function oA($,eA,EA){if(G(eA%2==0,"Pointer passed to stringToUTF16 must be aligned to two bytes!"),G(typeof EA=="number","stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),EA===void 0&&(EA=2147483647),EA<2)return 0;EA-=2;for(var NA=eA,FA=EA<$.length*2?EA/2:$.length,OA=0;OA<FA;++OA){var JA=$.charCodeAt(OA);wA[eA>>1]=JA,eA+=2}return wA[eA>>1]=0,eA-NA}function hA($){return $.length*2}function dA($,eA){G($%4==0,"Pointer passed to UTF32ToString must be aligned to four bytes!");for(var EA=0,NA="";!(EA>=eA/4);){var FA=DA[$+EA*4>>2];if(FA==0)break;if(++EA,FA>=65536){var OA=FA-65536;NA+=String.fromCharCode(55296|OA>>10,56320|OA&1023)}else NA+=String.fromCharCode(FA)}return NA}function PA($,eA,EA){if(G(eA%4==0,"Pointer passed to stringToUTF32 must be aligned to four bytes!"),G(typeof EA=="number","stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),EA===void 0&&(EA=2147483647),EA<4)return 0;for(var NA=eA,FA=NA+EA-4,OA=0;OA<$.length;++OA){var JA=$.charCodeAt(OA);if(JA>=55296&&JA<=57343){var xA=$.charCodeAt(++OA);JA=65536+((JA&1023)<<10)|xA&1023}if(DA[eA>>2]=JA,eA+=4,eA+4>FA)break}return DA[eA>>2]=0,eA-NA}function yA($){for(var eA=0,EA=0;EA<$.length;++EA){var NA=$.charCodeAt(EA);NA>=55296&&NA<=57343&&++EA,eA+=4}return eA}var _A=65536;function LA($,eA){return $%eA>0&&($+=eA-$%eA),$}var BA,lA,aA,wA,YA,DA,UA,XA,bA;function nt($){BA=$,t.HEAP8=lA=new Int8Array($),t.HEAP16=wA=new Int16Array($),t.HEAP32=DA=new Int32Array($),t.HEAPU8=aA=new Uint8Array($),t.HEAPU16=YA=new Uint16Array($),t.HEAPU32=UA=new Uint32Array($),t.HEAPF32=XA=new Float32Array($),t.HEAPF64=bA=new Float64Array($)}var It=5264480,St=21600,gt=5264480,it=21424;G(It%16===0,"stack must start aligned"),G(gt%16===0,"heap must start aligned");var Nt=5242880;t.TOTAL_STACK&&G(Nt===t.TOTAL_STACK,"the stack size can no longer be determined at runtime");var Pt=t.INITIAL_MEMORY||16777216;Object.getOwnPropertyDescriptor(t,"INITIAL_MEMORY")||Object.defineProperty(t,"INITIAL_MEMORY",{configurable:!0,get:function(){AA("Module.INITIAL_MEMORY has been replaced with plain INITIAL_INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),G(Pt>=Nt,"INITIAL_MEMORY should be larger than TOTAL_STACK, was "+Pt+"! (TOTAL_STACK="+Nt+")"),G(typeof Int32Array<"u"&&typeof Float64Array<"u"&&Int32Array.prototype.subarray!==void 0&&Int32Array.prototype.set!==void 0,"JS engine does not provide full typed array support"),t.wasmMemory?R=t.wasmMemory:R=new WebAssembly.Memory({initial:Pt/_A,maximum:2147483648/_A}),R&&(BA=R.buffer),Pt=BA.byteLength,G(Pt%_A===0),G(65536%_A===0),nt(BA),DA[it>>2]=gt;function se(){G((St&3)==0),UA[(St>>2)+1]=34821223,UA[(St>>2)+2]=2310721022,DA[0]=1668509029}function Tt(){var $=UA[(St>>2)+1],eA=UA[(St>>2)+2];($!=34821223||eA!=2310721022)&&AA("Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x"+eA.toString(16)+" "+$.toString(16)),DA[0]!==1668509029&&AA("Runtime error: The application has corrupted its heap memory area (address zero)!")}(function(){var $=new Int16Array(1),eA=new Int8Array($.buffer);if($[0]=25459,eA[0]!==115||eA[1]!==99)throw"Runtime error: expected the system to be little-endian!"})();function Ft($){for(;$.length>0;){var eA=$.shift();if(typeof eA=="function"){eA(t);continue}var EA=eA.func;typeof EA=="number"?eA.arg===void 0?t.dynCall_v(EA):t.dynCall_vi(EA,eA.arg):EA(eA.arg===void 0?null:eA.arg)}}var jt=[],re=[],Kt=[],ue=[],ce=!1;function De(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)Lt(t.preRun.shift());Ft(jt)}function le(){Tt(),G(!ce),ce=!0,Ft(re)}function Xt(){Tt(),Ft(Kt)}function we(){if(Tt(),t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;)Jt(t.postRun.shift());Ft(ue)}function Lt($){jt.unshift($)}function Jt($){ue.unshift($)}G(Math.imul,"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),G(Math.fround,"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),G(Math.clz32,"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),G(Math.trunc,"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");var J=0,Z=null,sA=null,CA={};function QA($){J++,t.monitorRunDependencies&&t.monitorRunDependencies(J),G(!CA[$]),CA[$]=1,Z===null&&typeof setInterval<"u"&&(Z=setInterval(function(){if(b){clearInterval(Z),Z=null;return}var eA=!1;for(var EA in CA)eA||(eA=!0,p("still waiting on run dependencies:")),p("dependency: "+EA);eA&&p("(end of list)")},1e4))}function RA($){if(J--,t.monitorRunDependencies&&t.monitorRunDependencies(J),G(CA[$]),delete CA[$],J==0&&(Z!==null&&(clearInterval(Z),Z=null),sA)){var eA=sA;sA=null,eA()}}t.preloadedImages={},t.preloadedAudios={};function AA($){t.onAbort&&t.onAbort($),$+="",p($),b=!0;var eA="abort("+$+") at "+xe();$=eA;var EA=new WebAssembly.RuntimeError($);throw EA}var GA={error:function(){AA("Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -s FORCE_FILESYSTEM=1")},init:function(){GA.error()},createDataFile:function(){GA.error()},createPreloadedFile:function(){GA.error()},createLazyFile:function(){GA.error()},open:function(){GA.error()},mkdev:function(){GA.error()},registerDevice:function(){GA.error()},analyzePath:function(){GA.error()},loadFilesFromDB:function(){GA.error()},ErrnoError:function(){GA.error()}};t.FS_createDataFile=GA.createDataFile,t.FS_createPreloadedFile=GA.createPreloadedFile;function st($,eA){return String.prototype.startsWith?$.startsWith(eA):$.indexOf(eA)===0}var $A="data:application/octet-stream;base64,";function vt($){return st($,$A)}var Dt="file://";function Mt($){return st($,Dt)}function et($,eA){return function(){var EA=$,NA=eA;return NA=t.asm,G(ce,"native function `"+EA+"` called before runtime initialization"),G(!0,"native function `"+EA+"` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)"),NA[$]||G(NA[$],"exported native function `"+EA+"` not found"),NA[$].apply(null,arguments)}}var Ct="data:application/octet-stream;base64,AGFzbQEAAAABvQM7YAF/AGACf38Bf2ABfwF/YAJ/fwBgAABgA39/fwBgA39/fwF/YAR/f3x8AGAFf39/f38AYAABf2AEf39/fwBgBH9/f38Bf2AFf39/f38Bf2ADf3x/AGAGf39/f39/AGADf398AGABfABgCX9/f3x8fHx/fwBgAXwBfGAGf39/f39/AX9gAn98AGAHf39/f398fwBgBn98f39/fwF/YAR/fHx/AXxgB39/f39/fH8Bf2AJf39/fHx8fH9/AX9gA39/fAF/YAJ/fAF/YAJ+fwF/YAN/fn8BfmABfwF8YAN/f3wBfGACfH8BfGACfHwBfGAHf39/f39/fwBgCH9/f39/f3x/AGAKf39/f3x8fHx/fwBgBH9/f3wAYAV/f398fABgBH9/fH8AYAJ8fABgA3x8fwBgBHx8fHwAYAV8fHx8fABgBnx8fHx8fABgCH9/f39/f3x/AX9gBn9/f398fAF/YAp/f39/fHx8fH9/AX9gBH9/f3wBf2AHf398f39/fwF/YAN/fHwBf2ADfn9/AX9gAXwBf2ACfH8Bf2ACfHwBf2ACf38BfGADf39/AXxgBX9/fHx/AXxgA3x8fwF8AooGHgNlbnYYX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uAAIDZW52C19fY3hhX3Rocm93AAUDZW52DV9fYXNzZXJ0X2ZhaWwACgNlbnYRX2VtdmFsX25ld19vYmplY3QACQNlbnYSX2VtdmFsX25ld19jc3RyaW5nAAIDZW52EV9lbXZhbF90YWtlX3ZhbHVlAAEDZW52E19lbXZhbF9zZXRfcHJvcGVydHkABQNlbnYNX2VtdmFsX2RlY3JlZgAAA2VudhBfZW12YWxfbmV3X2FycmF5AAkDZW52GV9lbWJpbmRfcmVnaXN0ZXJfZnVuY3Rpb24ADgNlbnYNX2VtdmFsX2luY3JlZgAAA2VudhVfZW1iaW5kX3JlZ2lzdGVyX3ZvaWQAAwNlbnYVX2VtYmluZF9yZWdpc3Rlcl9ib29sAAgDZW52G19lbWJpbmRfcmVnaXN0ZXJfc3RkX3N0cmluZwADA2VudhxfZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nAAUDZW52Fl9lbWJpbmRfcmVnaXN0ZXJfZW12YWwAAwNlbnYYX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyAAgDZW52Fl9lbWJpbmRfcmVnaXN0ZXJfZmxvYXQABQNlbnYcX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldwAFFndhc2lfc25hcHNob3RfcHJldmlldzEIZmRfd3JpdGUACwNlbnYLZ2V0VGVtcFJldDAACQNlbnYbX19jeGFfZmluZF9tYXRjaGluZ19jYXRjaF8yAAkDZW52EV9fcmVzdW1lRXhjZXB0aW9uAAADZW52Cmludm9rZV9paWkABgNlbnYWZW1zY3JpcHRlbl9yZXNpemVfaGVhcAACA2VudhVlbXNjcmlwdGVuX21lbWNweV9iaWcABgNlbnYXX19oYW5kbGVfc3RhY2tfb3ZlcmZsb3cABANlbnYLc2V0VGVtcFJldDAAAANlbnYGbWVtb3J5AgGAAoCAAgNlbnYFdGFibGUBcAC6AQPzA/EDBAAAABsPAAENAwEFCwEQCQQBBAUMBQYEAAAACBADAxQUBQsBCwEBATceAgIbBgAABAAAAAICCQMCAAEHAgIDDwUAAAQDFw0NHw0AAAQAAAAAAgIJAwIBAgIDDwAyBQUABAAAAAQAAAACAgkDAQICAw8ABAMIGjAAOAABBQAABAcaDwMBAxQDAAAEAAAAAgIDAgECAg8EBAMDAwMDAwMQAwAEBAQAAwUfKQkEBQAABQMBAwABAwADAwUFLgUCCQMJBAwTCwYMCwEMEwsGBgwBDBMLBgwTCwYAAAQAAAACAgkCAwICAgADDwUEAAAABAUKAwUMBgwGBQEFCAAECQAAAAAAAAAEAAQVBQMAAAQAGAIZEREREQMDAwMBBwcHBwQEAAAAAAAAAAAAAAAAAAMQBAMIAzQQKhAoKywQDAAABgUGDAYEBQAFBQUBHgMDAwAEBAQEBQMUNgsDBAICBAQEBAQEBAQEBAQEBAAAAAAAAAQEBAQCCR0BASAKEwUCBTMcHAgWBgECIQs1OhISEhIhEgMFAwsMAwYBAgUDCwwDBgECAAEDBAICAgAABAICAgAAAgABBgYGAQUKCgoKAQYBAQoIDggICA4ODgIAAhIgBgYFAgAGBgQDAAIJAAIGAAEDLSMvJCYFJQonOQsxIg4IDAIGFQN/AUHgqMECC38AQaSnAQt/AUEACwfKBCIRX193YXNtX2NhbGxfY3RvcnMAHAZtYWxsb2MA5QMNX19nZXRUeXBlTmFtZQD3AipfX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXMA+AIQX19lcnJub19sb2NhdGlvbgCQAwRmcmVlAOYDCHNldFRocmV3AKwDCXN0YWNrU2F2ZQD1AwxzdGFja1Jlc3RvcmUA9gMKc3RhY2tBbGxvYwD3AwpfX2RhdGFfZW5kAwELZHluQ2FsbF9paWkA+AMRX19zZXRfc3RhY2tfbGltaXQA+QMKZHluQ2FsbF9paQD6AwpkeW5DYWxsX3ZpAPsDCWR5bkNhbGxfdgCpAhBkeW5DYWxsX2lpaWlpaWRpAPwDEGR5bkNhbGxfdmlpaWlpZGkA/QMJZHluQ2FsbF9pAKsCEmR5bkNhbGxfaWlpaWRkZGRpaQD+AxJkeW5DYWxsX3ZpaWlkZGRkaWkA/wMNZHluQ2FsbF92aWlkZACABAtkeW5DYWxsX3ZpaQCBBAxkeW5DYWxsX3ZpaWQAggQMZHluQ2FsbF92aWlpAIMEDGR5bkNhbGxfdmlkaQCEBA1keW5DYWxsX2RpZGRpAIUEDGR5bkNhbGxfaWlpaQCGBAxkeW5DYWxsX2ppamkAiwQPZHluQ2FsbF9paWRpaWlpAIcED2R5bkNhbGxfdmlpaWlpaQCIBA5keW5DYWxsX3ZpaWlpaQCJBA1keW5DYWxsX3ZpaWlpAIoEEF9fZ3Jvd1dhc21NZW1vcnkAjAQJuAIBAEEBC7kByQMmKS0dNDU2Skt3Zmd9fn+TAZgBmQGjAaQB8wH0AYYChwKIAqkClwKqAqMCqwKYAqwCrQKuAq8CsAK1ApsCnAKfAqECpgKnAr0CvgK/AsACwQLCAsMCxALFAsYCxwLIAtgC2QJXTk9QTVRWWFlVUFFTWltcXV5iY2VhmwFrbG1pcXJzdGptbnB1dnp7aoIBgwGEAYEBcYgBiQGKAWqEAYUBhwGLAYwBeo0BasYDnwGnAagBqQGmAawBrQGuAa8BaqkBqgGrAasBsAF6amr3AfgB+QH2Af4BnwH/AYACgQL5AfoB/QGCAoMChAJ7gQKPA/kBnwORA54DtAO+A70DyAO9A8cDywPMA80DtAO9A2pqzwO9A9ED5APhA9QDvQPjA+AD1QO9A+ID3QPXA70D2QMKr/kQ8QO1AQAQM0Hk4QBCADcCAEHs4QBBADYCAEHw4QBC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NgJcIAEgBikDCDcDECABIAYpAwA3AwggASACKQOIATcDICABIAIpA4ABNwMYIAEgBikDCDcDcCABIAYpAwA3A2ggASAKKQMINwOAASABIAopAwA3A3ggASAHKQMINwOQASABIAcpAwA3A4gBIAEgACgCBDYCBAwBCxBvIQECQEG07AAoAgAiA0G47AAoAgAiBUkEQCADIAE2AgBBtOwAIANBBGo2AgAMAQsgA0Gw7AAoAgAiA2siCUECdSIIQQFqIgRBgICAgARPDQICf0EAIAQgBSADayIFQQF1IgsgCyAESRtB/////wMgBUECdUH/////AUkbIgRFDQAaIARBgICAgARPDQQgBEECdBC8AwsiBSAIQQJ0aiIIIAE2AgAgCUEBTgRAIAUgAyAJEOoDGgtBuOwAIAUgBEECdGo2AgBBtOwAIAhBBGo2AgBBsOwAIAU2AgAgA0UNACADEOYDCyABIAEoAlg2AlwgASAGKQMINwMQIAEgBikDADcDCCABIAcpAwg3AyAgASAHKQMANwMYIAEgBikDCDcDcCABIAYpAwA3A2ggASAKKQMINwOAASABIAopAwA3A3ggASAHKQMINwOQASABIAcpAwA3A4gBIAEgACgCBDYCBAsgAkGQAWoiACMCSQRAEBoLIAAkAEGw7AAPCxDAAwALQdgJECIAC8kEAgh/AX5B2OoAKAIAIgFB1OoAKAIARwRAIAFBfGoiACgCACEBQdjqACAANgIAIAEPCwJAAkACQEHk6gAoAgAiBA0AQeDqAEHg6gAoAgBBAWoiAjYCAEHk6gBBBCACdCIENgIAIAJBzOoAKAIAIgNByOoAKAIAIgVrIgZBAnUiB0kNAEF/QX8gBK1CmAF+IginIgBBCGoiASABIABJGyAIQiCIpxsQvAMiASAENgIEIAFBCGohASACQR1NBEAgASAEQZgBbGohAiABIQADQCAAQgA3AlggAEIANwMIIABCADcDaCAAQbQhNgIAIABBADYCYCAAQgA3AxAgAEIANwMYIABCADcDICAAQgA3A3AgAEIANwN4IABCADcDgAEgAEIANwOIASAAQgA3A5ABIABBmAFqIgAgAkcNAAsLQdDqACgCACIAIANLBEAgAyABNgIAQczqACADQQRqNgIADAELIAdBAWoiA0GAgICABE8NAQJ/QQAgAyAAIAVrIgJBAXUi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IAIpAwA3AzggASABKwM4IAArAwiiIAErA0AgACsDEKKgmjkDSAJAAkACQAJAIAAoAlwiAiAAKAJgIgRJBEAgAiABKQM4NwMAIAIgASkDSDcDECACIAMpAwA3AwggACACQRhqNgJcDAELIAIgACgCWCICayIFQRhtIgZBAWoiA0Gr1arVAE8NAQJ/QQAgAyAEIAJrQRhtIgRBAXQiByAHIANJG0Gq1arVACAEQdWq1SpJGyIERQ0AGiAEQavVqtUATw0DIARBGGwQvAMLIgcgBkEYbGoiAyABKQM4NwMAIAMgASkDSDcDECADIAFBQGspAwA3AwggAyAFQWhtQRhsaiEGIAVBAU4EQCAGIAIgBRDqAxoLIAAgByAEQRhsajYCYCAAIANBGGo2AlwgACAGNgJYIAJFDQAgAhDmAwsgAEHoAGoiAiIFKwMAIAAoAlgiAysDAKIgBSsDCCADKwMIoqAgAysDEKBEAAAAAAAAAABjQQFzRQRAIAAoAlgiAyADKwMAmjkDACADIAMrAwiaOQMIIAMgAysDEJo5AxALIAFCgICAgICAgPg/NwMwIAFCADcDKCABQShqIAArA3gQSBogASsDKCEIIAIrAwAhCSABIAIrAwggASsDMKA5AwggASAJIAigOQMAIAFCADcDGCABQgA3AxAgAisDACEIIAErAwAhCSABIAErAwggAisDCKE5A0AgASAJIAihOQM4IAEgAUE4ahBHIgMpAwg3AxggASADKQMANwMQIAEgASsDECACKwMAoiABKwMYIAIrAwiioJo5AyAgAisDACABKwMQoiACKwMIIAErAxiioCABKwMgoEQAAAAAAAAAAGNBAXNFBEAgASABKwMQmjkDECABIAErAxiaOQMYIAEgASsDIJo5AyALIAEgASkDIDcDSCABQUBrIAEpAxg3AwAgASABKQMQNwM4AkAgACgCXCICIAAoAmAiBEkEQCACIAEpAzg3AwAgAiABKQNINwMQIAIgAUFAaykDADcDCCAAIAJBGGo2AlwMAQsgAiAAKAJYIgJrIgVBGG0iBkEBaiIDQavVqtUATw0BAn9BACADIAQgAmtBGG0iBEEBdCIHIAcgA0kbQarVqtUAIARB1arVKkkbIgRFDQAaIARBq9Wq1QBPDQQgBEEYbBC8AwsiByAGQRhsaiIDIAEpAzg3AwAgAyABKQNI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RiIDOgAMAkAgAw0AA0AgASgCCCIDLQAMDQECQCADIAMoAggiAigCACIERgRAAkAgAigCBCIERQ0AIAQtAAwNAAwCCwJAIAEgAygCAEYEQCADIQEMAQsgAyADKAIEIgEoAgAiADYCBCABIAAEfyAAIAM2AgggAygCCAUgAgs2AgggAygCCCIAIAAoAgAgA0dBAnRqIAE2AgAgASADNgIAIAMgATYCCCABKAIIIQILIAFBAToADCACQQA6AAwgAiACKAIAIgAoAgQiATYCACABBEAgASACNgIICyAAIAIoAgg2AgggAigCCCIBIAEoAgAgAkdBAnRqIAA2AgAgACACNgIEIAIgADYCCA8LAkAgBEUNACAELQAMDQAMAQsCQCABIAMoAgBHBEAgAyEBDAELIAMgASgCBCIANgIAIAEgAAR/IAAgAzYCCCADKAIIBSACCzYCCCADKAIIIgAgACgCACADR0ECdGogATYCACABIAM2AgQgAyABNgIIIAEoAgghAgsgAUEBOgAMIAJBADoADCACIAIoAgQiACgCACIBNgIEIAEEQCABIAI2AggLIAAgAigCCDYCCCACKAIIIgEgASgCACACR0ECdGogADYCACAAIAI2AgAgAiAANgIIDAILIARBDGohASADQQE6AAwgAiAAIAJGOgAMIAFBAToAACACIgEgAEcNAAsLC8AJAQZ/IAEhAwJ/AkACQCABKAIAIgQEQCABKAIEIgJFDQEDQCACIgMoAgAiAg0ACwsgAygCBCIEDQFBACEEQQEMAgsLIAQgAygCCDYCCEEACyEGAkAgAyADKAIIIgUoAgAiAkYEQCAFIAQ2AgAgACADRgRAQQAhAiAEIQAMAgsgBSgCBCECDAELIAUgBDYCBAsgAy0ADCEHIAEgA0cEQCADIAEoAggiBTYCCCAFIAEoAggoAgAgAUdBAnRqIAM2AgAgAyABKAIAIgU2AgAgBSADNgIIIAMgASgCBCIFNgIEIAUEQCAFIAM2AggLIAMgAS0ADDoADCADIAAgACABRhshAAsCQAJAAkACQCAHRQ0AIABFDQAgBgRAA0AgAi0ADCEBAkAgAiACKAIIIgMoAgBHBEACQAJ/IAFFBEAgAkEBOgAMIANBADoADCADIAMoAgQiASgCACIENgIEIAQEQCAEIAM2AggLIAEgAygCCDYCCCADKAIIIgQgBCgCACADR0ECdGogATYCACABIAM2AgAgAyABNgIIIAIgACAAIAIoAgAiAUYbIQAgASgCBCECCyACKAIAIgMLBEAgAy0ADEUNAQsgAigCBCIBBEAgAS0ADEUNBwsgAkEAOgAMAkAgACACKAIIIgJGBEAgACECDAELIAItAAwNAwsgAkEBOgAMDwsgAigCBCIBDQUMBgsCQCABBEAgAiEBDAELIAJBAToADCADQQA6AAwgAyACKAIEIgE2AgAgAQRAIAEgAzYCCAsgAiADKAIINgIIAkAgAyADKAIIIgQoAgBGBEAgBCACNgIAIAMoAgAhAQwBCyAEIAI2AgQLIAIgAzYCBCADIAI2AgggAiAAIAAgA0YbIQALAkACQCABKAIAIgNFDQAgAy0ADA0AIAEhAgwBCwJAIAEoAgQiAgRAIAItAAxFDQELIAFBADoADCAAIAEoAggiAkcEQCACLQAMDQMLIAJBAToADA8LIAMEQCADLQAMRQRAIAEhAgwCCyABKAIEIQILIAJBAToADCABQQA6AAwgASACKAIAIgA2AgQgAARAIAAgATYCCAsgAiABKAIINgIIIAEoAggiACAAKAIAIAFHQQJ0aiACNgIAIAIgATYCACABIAI2AgggASEDCyACIAIoAggiAC0ADDoADCAAQQE6AAwgA0EBOgAMIAAgACgCACIBKAIEIgI2AgAgAgRAIAIgADYCCAsgASAAKAIINgIIIAAoAggiAiACKAIAIABHQQJ0aiABNgIAIAEgADYCBCAAIAE2AggPCyACKAIIIgEgASgCACACRkECdGooAgAhAgwAAAsACyAEQQE6AAwLDwsgAS0ADA0AIAIhAwwBCyADQQE6AAwgAkEAOgAMIAIgAygCBCIANgIAIAAEQCAAIAI2AggLIAMgAigCCDYCCCACKAIIIgAgACgCACACR0ECdGogAzYCACADIAI2AgQgAiADNgIIIAIhAQsgAyADKAIIIgAtAAw6AAwgAEEBOgAMIAFBAToADCAAIAAoAgQiASgCACICNgIEIAIEQCACIAA2AggLIAEgACgCCDYCCCAAKAIIIgIgAigCACAAR0ECdGogATYCACABIAA2AgAgACABNgIIC0oAQeDtACAAOQMAQdjtAEKthvHYrtyNjT83AwBB0O0AIAA5AwBBuO0AQgA3AwBBwO0AIAA5AwBByO0A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ACABQQN0aikDADcDACAHIAAgBUEDdGopAwA3AwALQQAhAQJAIAIoAgQiBSACKAIIIgRHBEADQCABIAVqIANBCGogAWotAAA6AAAgAUEBaiIBQdgARw0ACyACIAVB2ABqNgIEDAELIAUgAigCACIHa0HYAG0iBkEBaiIBQa/0ohdPDQMgBkHYAGwCf0EAIAEgBCAHa0HYAG0iBEEBdCIGIAYgAUkbQa70ohcgBEGXutELSRsiBkUNABogBkGv9KIXTw0FIAZB2ABsELwDCyIQaiIEIANBCGpB2AAQ6gNB2ABqIREgBSAHRwRAA0BBACEBA0AgASAEakGof2ogASAFakGof2otAAA6AAAgAUEBaiIBQdgARw0ACyAEQah/aiEEIAVBqH9qIgUgB0cNAAsgAigCACEFCyACIBAgBkHYAGxqNgIIIAIgETYCBCACIAQ2AgAgBUUNACAFEOYDCyAIQQFqIgggC0cNAAsLIANB4ABqIgAjAkkEQBAaCyAAJAAPCxDAAwALQZwnECIAC8UDACABIANBAnRqIgEgACAAKAAAKAIAEQIANgIAAkACfwJAAkACQAJAIAAgACgAACgCABECAA4EAAEDAgULIAEgACgCBDYCBCACIARBA3RqIgEgACkDCDcDACABIAApAxA3AwggASAAKQMYNwMQIARBA2ohBCAAQSBqDAMLIAEgACgCBDYCBCACIARBA3RqIgEgACkDCDcDACABIAApAxA3AwggASAAKQMYNwMQIAEgACkDIDcDGCABIAApAyg3AyAgASAAKQMwNwMoIAEgACkDODcDMCAEQQdqIQQgAEFAawwCCyABIAAoAgQ2AgQgAiAEQQN0aiIBIAApAwg3AwAgASAAKQMQNwMIIAEgACkDGDcDECABIAApAyA3AxggASAAKQMoNwMgIARBBWohBCAAQTBqDAELIAEgACgCBDYCBCACIARBA3RqIgEgACkDCDcDACABIAApAxA3AwggASAAKQMYNwMQIAEgACkDIDcDGCABIAApA0g3AyAgASAAKQNQNwMoIAEgACkDQDcDMCABIAApAzA3AzggAUFAayAAKQM4NwMAIARBCWohBCAAQShqCyEAIAIgBEEDdGogACkDADcDAAsL/AMBBn8jAEEQayIDIgEjAkkEQBAaCyABJABBjPMAKAIAIgFBiPMAKAIAIgJrQdgA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P4inIQICQCARIBSDQjSIIhFQBEAgEFAEQCABQYGAgIB8NgJQIAFCADcCVCABQgA3AlwgAUIANwJkIAFCADcCbAwCCyABQgA3AmQgAUIANwJcIAEgEEIUiD4CcCABIBCnQQx0NgJsIAFCADcCVCABIAJBgnByNgJQDAELIAFCADcCXCABQgA3AmQgASAQp0ELdDYCbCABIBBCFYinQYCAgIB4cjYCcCABQgA3AlQgASARp0EBdCACckGCcGo2AlALQYDsACkDACIRIBKDIRAgESATg0I/iKchAgJAIBEgFINCNIgiEVAEQCAQUARAIAFBgYCAgHw2AiggAUIANwIsIAFCADcCNCABQgA3AjwgAUIANwJEDAILIAFCADcCPCABQgA3AjQgASAQQhSIPgJIIAEgEKdBDHQ2AkQgAUIANwIsIAEgAkGCcHI2AigMAQsgAUIANwI0IAFCADcCPCABIBCnQQt0NgJEIAEgEEIViKdBgICAgHhyNgJIIAFCADcCLCABIBGnQQF0IAJyQYJwajYCKAsgAUH4AGogAUHQAGogAUEoahDjAkGA7AApAwAiESASgyEQIBEgE4NCP4inIQICQCARIBSDQjSIIhFQBEAgEFAEQCABQYGAgIB8NgIAIAFCADcCBCABQgA3AgwgAUIANwIUIAFCADcCHAwCCyABQgA3AhQgAUIANwIMIAEgEEIUiD4CICABIBCnQQx0NgIcIAFCADcCBCABIAJBgnByNgIADAELIAFCADcCDCABQgA3AhQgASAQp0ELdDYCHCABIBBCFYinQYCAgIB4cjYCICABQgA3AgQgASARp0EBdCACckGCcGo2AgALIAFBoAFqIAFB+ABqIAEQ4wIgASABKALAATYC6AEgASABKQO4ATcD4AEgASABKQOwATcD2AEgASABKQOoATcD0AEgASABKQOgATcDyAECQEH89QAoAgAiAkGA9gAoAgAiA0kEQCACIAEpA8gBNwIAIAIgASgC6AE2AiAgAiABKQPgATcCGCACIAEpA9gBNwIQIAIgASkD0AE3AghB/PUAIAJBJGo2AgAMAQsgAkH49QAoAgAiBGsiBUEkbSIGQQFqIgJByOPxOE8NAwJ/QQAgAiADIARrQSRtIgNBAXQiCCAIIAJJG0HH4/E4IANB4/G4HEkbIgNFDQAaIANByOPxOE8NAyADQSRs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KAIgNgIoIAMgASkCGDcDICADIAEpAhA3AxggAyABKQIINwMQIAMgASkCADcDCCABIAIoAiA2AiAgASACKQIYNwIYIAEgAikCEDcCECABIAIpAgg3AgggASACKQIANwIAIAIgAygCKDYCICACIAMpAyA3AhggAiADKQMYNwIQIAIgAykDEDcCCCACIAMpAwg3AgBBASABIAAQ5QJFDQIaIAMgACgCIDYCKCADIAApAhg3AyAgAyAAKQIQNwMYIAMgACkCCDcDECADIAApAgA3AwggACABKAIgNgIgIAAgASkCGDcCGCAAIAEpAhA3AhAgACABKQIINwIIIAAgASkCADcCACABIAMoAig2AiAgASADKQMgNwIYIAEgAykDGDcCECABIAMpAxA3AgggASADKQMINwIADAELIAQEQCADIAAoAiA2AiggAyAAKQIYNwMgIAMgACkCEDcDGCADIAApAgg3AxAgAyAAKQIANwMIIAAgAigCIDYCICAAIAIpAhg3AhggACACKQIQNwIQIAAgAikCCDcCCCAAIAIpAgA3AgAgAiADKAIoNgIgIAIgAykDIDcCGCACIAMpAxg3AhAgAiADKQMQNwIIIAIgAykDCDcCAEEBDAILIAMgACgCIDYCKCADIAApAhg3AyAgAyAAKQIQNwMYIAMgACkCCDcDECADIAApAgA3AwggACABKAIgNgIgIAAgASkCGDcCGCAAIAEpAhA3AhAgACABKQIINwIIIAAgASkCADcCACABIAMoAig2AiAgASADKQMgNwIYIAEgAykDGDcCECABIAMpAxA3AgggASADKQMINwIAQQEgAiABEOUCRQ0BGiADIAEoAiA2AiggAyABKQIYNwMgIAMgASkCEDcDGCADIAEpAgg3AxAgAyABKQIANwMIIAEgAigCIDYCICABIAIpAhg3AhggASACKQIQNwIQIAEgAikCCDcCCCABIAIpAgA3AgAgAiADKAIoNgIgIAIgAykDIDcCGCACIAMpAxg3AhAgAiADKQMQNwIIIAIgAykDCDcCAAtBAgshACADQTBqIgEjAkkEQBAaCyABJAAgAAvfCQECfyMAQTBrIgUiBiMCSQRAEBoLIAYkACAAIAEgAhDcAiEGAkAgAyACEOUCRQ0AIAUgAigCIDYCKCAFIAIpAhg3AyAgBSACKQIQNwMYIAUgAikCCDcDECAFIAIpAgA3AwggAiADKAIgNgIgIAIgAykCGDcCGCACIAMpAhA3AhAgAiADKQIINwIIIAIgAykCADcCACADIAUoAig2AiAgAyAFKQMgNwIYIAMgBSkDGDcCECADIAUpAxA3AgggAyAFKQMINwIAIAIgARDlAkUEQCAGQQFqIQYMAQsgBSABKAIgNgIoIAUgASkCGDcDICAFIAEpAhA3AxggBSABKQIINwMQIAUgASkCADcDCCABIAIoAiA2AiAgASACKQIYNwIYIAEgAikCEDcCECABIAIpAgg3AgggASACKQIANwIAIAIgBSgCKDYCICACIAUpAyA3AhggAiAFKQMYNwIQIAIgBSkDEDcCCCACIAUpAwg3AgAgASAAEOUCRQRAIAZBAmohBgwBCyAFIAAoAiA2AiggBSAAKQIYNwMgIAUgACkCEDcDGCAFIAApAgg3AxAgBSAAKQIANwMIIAAgASgCIDYCICAAIAEpAhg3AhggACABKQIQNwIQIAAgASkCCDcCCCAAIAEpAgA3AgAgASAFKAIoNgIgIAEgBSkDIDcCGCABIAUpAxg3AhAgASAFKQMQNwIIIAEgBSkDCDcCACAGQQNqIQYLAkAgBCADEOUCRQ0AIAUgAygCIDYCKCAFIAMpAhg3AyAgBSADKQIQNwMYIAUgAykCCDcDECAFIAMpAgA3AwggAyAEKAIgNgIgIAMgBCkCGDcCGCADIAQpAhA3AhAgAyAEKQIINwIIIAMgBCkCADcCACAEIAUoAig2AiAgBCAFKQMgNwIYIAQgBSkDGDcCECAEIAUpAxA3AgggBCAFKQMINwIAIAMgAhDlAkUEQCAGQQFqIQYMAQsgBSACKAIgNgIoIAUgAikCGDcDICAFIAIpAhA3AxggBSACKQIINwMQIAUgAikCADcDCCACIAMoAiA2AiAgAiADKQIYNwIYIAIgAykCEDcCECACIAMpAgg3AgggAiADKQIANwIAIAMgBSgCKDYCICADIAUpAyA3AhggAyAFKQMYNwIQIAMgBSkDEDcCCCADIAUpAwg3AgAgAiABEOUCRQRAIAZBAmohBgwBCyAFIAEoAiA2AiggBSABKQIYNwMgIAUgASkCEDcDGCAFIAEpAgg3AxAgBSABKQIANwMIIAEgAigCIDYCICABIAIpAhg3AhggASACKQIQNwIQIAEgAikCCDcC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agwCCyADIAM1AjAgAzUCAHwiEaciCjYCACADIAM1AgQgAzUCNCARQiCIfHwiEaciAjYCBCADIAM1AgggAzUCOCARQiCIfHwiEaciBDYCCCADIAM1AgwgAzUCPCARQiCIfHwiEaciCTYCDCADIAM1AhAgAzUCQCARQiCIfHwiEaciCzYCECADIAM1AhQgAzUCRCARQiCIfHwiEaciBzYCFCADIAM1AhggAzUCSCARQiCIfHwiEaciCDYCGCADIAM1AhwgAzUCTCARQiCIfHwiEaciDDYCHCADIAMoAiAgAygCUCARQiCIp2pqIgE2AiAgAQ0CIAUgAykDADcCACAFIAMpAwg3AgggBSADKQMYNwIYIAUgAykDEDcCEAwECyADNQI0IREgAyADNQIAIAM1AjBC/////w+FfEIBfCISPgIwIAMgAzUCBCASQiCIfCARQv////8PhXwiET4CNCADIAM1AgggEUIgiHwgAzUCOEL/////D4V8IhE+AjggAyADNQIMIBFCIIh8IAM1AjxC/////w+FfCIRPgI8IAMgAzUCECARQiCIfCADNQJAQv////8PhXwiET4CQCADIAM1AhQgEUIgiHwgAzUCREL/////D4V8IhE+AkQgAzUCGCARQiCIfCERIANBMGohBCADKAJIIQggCyENIAMLIQIgBCARIAhBf3OtfCIRPgIYIAQgAigCHCARQiCIp2ogBCgCHEF/c2o2AhwgBSAEKQIYNwIYIAUgBCkCEDcCECAFIAQpAgg3AgggBSAEKQIANwIAIAAgDUEBcSAGQQF0cjYCACAAEOECDAMLIAMgBEEfdCACQQF2cjYCNCADIAJBH3QgCkEBdnI2AjAgAyABQQF2NgJQIAMgAUEfdCAMQQF2cjYCTCADIAxBH3QgCEEBdnI2AkggAyAIQR90IAdBAXZyNgJEIAMgB0EfdCALQQF2cjYCQCADIAtBH3QgCUEBdnI2AjwgAyAJQR90IARBAXZyNgI4IAUgAykDMDcCACAFIAMpAzg3AgggBSADKQNANwIQIAUgAykDSDcCGCAAIAZBAWoiBjYCAAwBCyAAQYGAgIB8NgIAIAVCADcCGCAFQgA3AhAgBUIANwIIIAVCADcCAAwBCyAAIA1BAXEgBkEBdHI2AgALIANB4ABqIgAjAkkEQBAaCyAAJAALmgQBCX8jAEEgayIC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QQRqIgdCADcCACAAQgA3AgwgAEIANwIUIABCADcCHAJAAkAgAigCIARAIAIoAgAiDkGBgICAfEcNAQsgAEH/////AzYCACAAQYCAgIB4NgIgDAELIANBADYCUCADQgA3A0ggA0FAa0IANwMAIANCADcDOCADQgA3AzAgA0EANgLAASADQQA2ApABIAMgASkCFDcC1AEgAyABKQIcNwLcASADIAEpAgQ3AsQBIAMgASkCDDcCzAEgAyACKQIENwKUASADIAIpAgw3ApwBIAMgAikCFDcCpAEgAyACKQIcNwKsASADIAMoApQBIg9BH3Q2AmAgAyADKAKYAUEfdCAPQQF2cjYCZCADIAMoApwBQR90IAMoApgBIhNBAXZyNgJoIAMgAygCoAFBH3QgAygCnAEiFEEBdnIiFTYCbCADIAMoAqQBQR90IAMoAqABIhZBAXZyIhc2AnAgAyADKAKoAUEfdCADKAKkASIYQQF2ciIZNgJ0IAMgAygCrAFBH3QgAygCqAEiGkEBdnIiGzYCeCADIAMoArABQR90IAMoAqwBIhxBAXZyIh02AnwgAyADKAKwASIeQQF2Ih82AoABIAM1ApABQv////8PhSEjIAM1AmBC/////w+FISQgA0EgaiEJIANBwAFqQQRyIQogAygCaCEgIAMoAmQhIUGfAiEFA0BBCSECAkACfwJAA0AgAkUNASACQX9qIgJBAnQiBCADQcABamooAgAiBiADQZABaiAEaigCACIERg0ACyAGIARLDQAgBUEBSA0CIANBMGogBUF/aiIGQQV1QQJ0aiICIAIoAgBBASAGQR9xdHI2AgAgBUEBRg0CIAM1AsABICR8QgF8ISIgISEIICAhBCAVIQsgFyEMIBkhDSAbIRAgHSERIB8hEkGeAgwBCyADQTBqIAVBBXVBAnRqIgIgAigCAEEBIAVBH3F0cjYCACAFQQFIDQEgAzUCwAEgI3xCAXwhIiAPIQggEyEEIBQhCyAWIQwgGCENIBohECAcIREgHiESIAUhBkGfAgshAiADICI+AsABIAMgCEF/c60gAzUCxAEgIkIgiHx8IiI+AsQBIAMgBEF/c60gAzUCyAEgIkIgiHx8IiI+AsgBIAMgC0F/c60gAzUCzAEgIkIgiHx8IiI+AswBIAMgDEF/c60gAzUC0AEgIkIgiHx8IiI+AtABIAMgDUF/c60gAzUC1AEgIkIgiHx8IiI+AtQBIAMgEEF/c60gAzUC2AEgIkIgiHx8IiI+AtgBIAMgEUF/c60gAzUC3AEgIkIgiHx8IiI+AtwBIAMgAygC4AEgIkIgiKdqIBJBf3NqNgLgASAGIAJBf3NqIQUCQAJAA0AgA0HAAWogAkEDdkH8////AXFqKAIAIAJBH3EiBHZBAXENASAGQX9qIQYgAkEASiEEIAJBf2ohAiAEDQALIAlBADYCACADQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAMAQsCQCACQZ8CTgRAIAkgAygC4AE2AgAgAyADKQPYATcDGCADIAMpA9ABNwMQIAMgAykDyAE3AwggAyADKQPAATcDAAwBCyAJQQA2AgAgA0IANwMYIANCADcDECADQgA3AwggA0IANwMAIAJBAEgNACACQQV2IQIgBEEBaiILQSBGBEAgCSACQQJ0IgJrIANBwAFqIAJBBGoQ6gMaDAELIARBH3MhDEGAgICAeCAEdkF/aiENQQghCANAIAMgCEECdGoCfyACRQRAQX8hBEEADAELIANBwAFqIAJBf2oiBEECdGooAgALIAt2IA1xIANBwAFqIAJBAnRqKAIAIAx0cjYCACAIQX9qIQggAkEASiEFIAQhAiAFDQALCyAGIQULIAMgCSgCADYC4AEgAyADKQMYNwPYASADIAMpAxA3A9ABIAMgAykDCDcDyAEgAyADKQMANwPAASAFQX9KDQELCyAAIAEoAgAiAUF+cUECbSAOQX5xQX5takEBdCIENgIAAkAgAygCUEF/TARAIAcgAykCNDcCACAHIAMpAjw3AgggByADKQJMNwIYIAcgAykCRDcCEAwBCyADQQA2AuABIANCADcD2AEgA0IANwPQASADQgA3A8gBIANCADcDwAFBCCECQQghBgNAIANBwAFqIAZBAnRqIANBMGogAkECdGooAgBBAXQCfyACRQRAQX8hBUEADAELIANBMGogAkF/aiIFQQJ0aigCAAtBH3ZyNgIAIAZBf2ohBiACQQBKIQggBSECIAgNAAsgByAKKQIANwIAIAcgCikCGDcCGCAHIAopAhA3AhAgByAKKQIINwIIIAAgBEF+aiIENgIACyAAIAQgASAOakEBcWo2AgALIANB8AFqIgAjAkkEQBAaCyAAJAALuAEBA38CQCABKAIAIgJBAXEiAyAAKAIAIgRBAXFGBEAgAkF+cUECbSICIARBfnFBAm0iBEcEQCACIARIIAIgBEogAxsPC0EIIQIgAw0BA0AgAkUEQEEADwsgASACQX9qIgJBAnQiA2ooAgQiBCAAIANqKAIEIgNGDQALIAQgA0sPCyADRQ8LA0AgAkUEQEEADwsgASACQX9qIgJBAnQiA2ooAgQiBCAAIANqKAIEIgNGDQALIAQgA00LdAICfwF+AnxEAAAAAAAAAAAgACkCHCIDUA0AGiAAKAIAIgFBfnEiAEECbSECRAAAAAAAAPB/IABB/w9KDQAaRAAAAAAAAAAAIABBg3BIDQAaIAGtQj+GIANCC4iEQoCAgICAgIAIhSACQf8Haq1CNIaEvwsLTgEBfiAAIAEpAgAiAjcCACAAIAEoAiA2AiAgACABKQIYNwIYIAAgASkCEDcCECAAIAEpAgg3AgggACACp0F/QQEgASgCAEEBcRtqNgIAC8UEAgR/AX4jAEHQAWsiAiIDIwJJBEAQGgsgAyQAAnxEAAAAAAAAAAAgASkCHCIGUA0AGiABKAIAIgRBfnEiA0ECbSEFRAAAAAAAAPB/IANB/w9KDQAaRAAAAAAAAAAAIANBg3BIDQAaIAStQj+GIAZCC4iEQoCAgICAgIAIhSAFQf8Haq1CNIaEvwufvSIGQj+IpyEDAkAgBkI0iKdB/w9xIgRFBEAgBkL/////////B4NQBEAgAEGBgICAfDYCACAAQgA3AgQgAEIANwIMIABCADcCFCAAQgA3AhwMAgsgAEIANwIUIABCADcCDCAAQgA3AgQgACAGQhSIPgIgIAAgA0GCcHI2AgAgACAGp0EMdDYCHAwBCyAAQgA3AgQgAEIANwIMIABCADcCFCAAIAanQQt0NgIcIAAgBEEBdCADckGCcGo2AgAgACAGQhWIp0GAgICAeHI2AiALIAJCADcCtAEgAkIANwK8ASACQoCAgICAgICAgH83AsQBIAJCADcCrAEgAkECNgKoAUGsAiEDA0ACQCACQdgAaiAAIAAQ4wIgAkGAAWogAkHYAGogARDiAiACKAKAAUF+cUG6fEwNACACQQhqIAJBqAFqIAAQ4wIgAkEwaiACQYABaiACQQhqEOQCIAJB2ABqIAAgAkEwahDiAiAAIAIoAng2AiAgACACKQNwNwIYIAAgAikDaDcCECAAIAIpA2A3AgggACACKQNYNwIAIANBf2oiAw0BCwsgAkHQAWoiACMCSQRAEBoLIAAkAAs1AQJ/IwBBoAJrIgIiAyMCSQRAEBoLIAMkACAAIAEQ6AIgAkGgAmoiACMCSQRAEBoLIAAkAAvSBAIFfwF+IwBBoAFrIgEiAiMCSQRAEBoLIAIkACAAQQI2AgAgAEIANwIEIABCADcCDCAAQgA3AhQgAEKAgICAgICAgEA3AhwgAUIANwKEASABQgA3AowBIAFCgICAgICAgICgfzcClAEgAUIANwJ8IAFBBjYCeCABQgA3A2ggAUIANwNgIAFCADcDWCABQYCAgIB4NgJwIAFCADcDUCABQQRyIQJBASEDA0AgAUEoaiAAIAFB+ABqEOMCIANB0ClqLAAAQVBqt70iBkI/iKchBAJAIAZCNIinQf8PcSIFRQRAIAZC/////////weDUARAIAFBgYCAgHw2AgAgAkIANwIYIAJCADcCECACQgA3AgggAkIANwIADAILIAJCADcCACACQgA3AhAgAkIANwIIIAEgBqdBDHQ2AhwgASAGQhSIPgIgIAEgBEGCcHI2AgAMAQsgASAFQQF0IARyQYJwajYCACACQgA3AhAgAkIANwIIIAJCADcCACABIAanQQt0NgIcIAEgBkIViKdBgICAgHhyNgIgCyAAIAFBKGogARDgAiABQShqIAFB0ABqIAFB+ABqEOMCIAEgASgCSDYCcCABIAFBQGspAwA3A2ggASABKQM4NwNgIAEgASkDMDcDWCABIAEpAyg3A1AgA0EBaiIDQekARw0ACyABQShqIAAgAUHQAGoQ5AIgACABKAJINgIgIAAgAUFAaykDADcCGCAAIAEpAzg3AhAgACABKQMwNwIIIAAgASkDKDcCACABQaABaiIAIwJJBEAQGgsgACQAC8ELAgp/An4jAEHAAmsiACIBIwJJBEAQGgsgASQAIABCADcDsAIgAEIANwOoAiAAQgA3A6ACIABBgICAgHg2ArgCIABCADcDmAIgAEIANwOIAiAAQgA3A4ACIABCADcD+AEgAEGAgICAeDYCkAIgAEIANwPwASAAQgA3A+ABIABCADcD2AEgAEIANwPQASAAQYCAgIB4NgLoASAAQgA3A8gBIABB+ABqQQRyIQEgAEHQAGpBBHIhAiAAQQRyIQMDQCAGQQF0IghBAXK3vSIKQj+IpyEFIABBKGogAEHIAWogAEGYAmoQ4wIgAEHQAGogAEEoaiAAQZgCahDjAgJAIApCNIinQf8PcSIHRQRAIApC/////////weDUARAIABBgYCAgHw2AgAgA0IANwIYIANCADcCECADQgA3AgggA0IANwIADAILIANCADcCACADQgA3AhAgA0IANwIIIAAgCqdBDHQ2AhwgACAKQhSIPgIgIAAgBUGCcHI2AgAMAQsgACAHQQF0IAVyQYJwajYCACADQgA3AhAgA0IANwIIIANCADcCACAAIAqnQQt0NgIcIAAgCkIViKdBgICAgHhyNgIgCyAAQfgAaiAAQdAAaiAAEOMCIABBoAFqIABB8AFqIABB+ABqEOQCIAZBJGwiBEGQ+QBqIAAoAsABNgIAIARBiPkAaiAAKQO4ATcCACAEQYD5AGogACkDsAE3AgAgBEH4+ABqIAApA6gBNwIAIARB8PgAaiAAKQOgATcCACAGQQFqIga3vSILQj+IpyEEAkAgC0I0iKdB/w9xIglFBEAgC0L/////////B4NQBEAgAEGBgICAfDYCeCABQgA3AhggAUIANwIQIAFCADcCCCABQgA3AgAMAgsgAUIANwIAIAFCADcCECABQgA3AgggACALp0EMdDYClAEgACALQhSIPgKYASAAIARBgnByNgJ4DAELIAAgCUEBdCAEckGCcGo2AnggAUIANwIQIAFCADcCCCABQgA3AgAgACALp0ELdDYClAEgACALQhWIp0GAgICAeHI2ApgBCyAAQaABaiAAQZgCaiAAQfgAahDjAiAAIAAoAsABNgK4AiAAIAApA7gBNwOwAiAAIAApA7ABNwOoAiAAIAApA6gBNwOgAiAAIAApA6ABNwOYAgJAIAdFBEAgCkL/////////B4NQBEAgAEGBgICAfDYCeCABQgA3AhggAUIANwIQIAFCADcCCCABQgA3AgAMAgsgAUIANwIAIAFCADcCECABQgA3AgggACAKp0EMdDYClAEgACAKQhSIPgKYASAAIAVBgnByNgJ4DAELIAAgB0EBdCAFckGCcGo2AnggAUIANwIQIAFCADcCCCABQgA3AgAgACAKp0ELdDYClAEgACAKQhWIp0GAgICAeHI2ApgBCyAIQQJqt70iCkI/iKchBSAAQaABaiAAQfABaiAAQfgAahDjAgJAIApCNIinQf8PcSIERQRAIApC/////////weDUARAIABBgYCAgHw2AlAgAkIANwIYIAJCADcCECACQgA3AgggAkIANwIADAILIAJCADcCACACQgA3AhAgAkIANwIIIAAgCqdBDHQ2AmwgACAKQhSIPgJwIAAgBUGCcHI2AlAMAQsgACAEQQF0IAVyQYJwajYCUCACQgA3AhAgAkIANwIIIAJCADcCACAAIAqnQQt0NgJsIAAgCkIViKdBgICAgHhyNgJwCyAAQfABaiAAQaABaiAAQdAAahDjAiAAQQQ2AnggAUIANwIQIAFCADcCCCABQgA3AgAgAEKAgICAgICAgIB/NwKUASAAQaABaiAAQcgBaiAAQfgAahDjAiAAIAAoAsABNgLoASAAIAApA7gBNwPgASAAIAApA7ABNwPYASAAIAApA6gBNwPQASAAIAApA6ABNwPIASAGQShHDQALIABBwAJqIgAjAkkEQBAaCyAAJAALiAYCB38BfiMAQdABayIAIgIjAkkEQBAaCyACJAAgAEIANwPAASAAQgA3A7gBIABCADcDsAEgAEGAgICAeDYCyAEgAEIANwOoASAAQgA3A5gBIABCADcDkAEgAEIANwOIASAAQYCAgIB4NgKgASAAQgA3A4ABIABBCGpBBHIhAiAAQTBqQQRyIQMDQCAAQdgAaiAAQYABaiAAQagBahDkAiAEQSRsIgFB0I8BaiAAKAJ4NgIAIAFByI8BaiAAKQNwNwIAIAFBwI8BaiAAKQNoNwIAIAFBuI8BaiAAKQNgNwIAIAFBsI8BaiIBIAApA1g3AgAgBEEBcQRAIAFBf0EBIAEoAgAiAUEBcRsgAWo2AgALIARBAXQiBUEBcre9IgdCP4inIQECQCAHQjSIp0H/D3EiBkUEQCAHQv////////8Hg1AEQCAAQYGAgIB8NgIwIANCADcCGCADQgA3AhAgA0IANwIIIANCADcCAAwCCyADQgA3AgAgA0IANwIQIANCADcCCCAAIAenQQx0NgJMIAAgB0IUiD4CUCAAIAFBgnByNgIwDAELIAAgBkEBdCABckGCcGo2AjAgA0IANwIQIANCADcCCCADQgA3AgAgACAHp0ELdDYCTCAAIAdCFYinQYCAgIB4cjYCUAsgBUECare9IgdCP4inIQEgAEHYAGogAEGoAWogAEEwahDjAgJAIAdCNIinQf8PcSIFRQRAIAdC/////////weDUARAIABBgYCAgHw2AgggAkIANwIYIAJCADcCECACQgA3AgggAkIANwIADAILIAJCADcCACACQgA3AhAgAkIANwIIIAAgB6dBDHQ2AiQgACAHQhSIPgIoIAAgAUGCcHI2AggMAQsgACAFQQF0IAFyQYJwajYCCCACQgA3AhAgAkIANwIIIAJCADcCACAAIAenQQt0NgIkIAAgB0IViKdBgICAgHhyNgIoCyAAQagBaiAAQdgAaiAAQQhqEOMCIARBAWoiBEEoRw0ACyAAQdABaiIAIwJJBEAQGgsgACQAC4gGAgd/AX4jAEHQAWsiACICIwJJBEAQGgsgAiQAIABCADcDwAEgAEIANwO4ASAAQgA3A7ABIABBgICAgHg2AsgBIABCADcDqAEgAEIANwOYASAAQgA3A5ABIABCADcDiAEgAEGAgICAeDYCoAEgAEIANwOAASAAQQhqQQRyIQIgAEEwakEEciEDA0AgAEHYAGogAEGAAWogAEGoAWoQ5AIgBEEkbCIBQbCEAWogACgCeDYCACABQaiEAWogACkDcDcCACABQaCEAWogACkDaDcCACABQZiEAWogACkDYDcCACABQZCEAWoiASAAKQNYNwIAIARBAXEEQCABQX9BASABKAIAIgFBAXEbIAFqNgIACyAEQQF0IgVBAmq3vSIHQj+IpyEBAkAgB0I0iKdB/w9xIgZFBEAgB0L/////////B4NQBEAgAEGBgICAfDYCMCADQgA3AhggA0IANwIQIANCADcCCCADQgA3AgAMAgsgA0IANwIAIANCADcCECADQgA3AgggACAHp0EMdDYCTCAAIAdCFIg+AlAgACABQYJwcjYCMAwBCyAAIAZBAXQgAXJBgnBqNgIwIANCADcCECADQgA3AgggA0IANwIAIAAgB6dBC3Q2AkwgACAHQhWIp0GAgICAeHI2AlALIAVBA2q3vSIHQj+IpyEBIABB2ABqIABBqAFqIABBMGoQ4wICQCAHQjSIp0H/D3EiBUUEQCAHQv////////8Hg1AEQCAAQYGAgIB8NgIIIAJCADcCGCACQgA3AhAgAkIANwIIIAJCADcCAAwCCyACQgA3AgAgAkIANwIQIAJCADcCCCAAIAenQQx0NgIkIAAgB0IUiD4C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KwMAIg2ioDkDACAAIAggAkEDQQEgAxsiA0EDdGorAwAiDqJEAAAAAAAAAACgIAkgAisDICIPoqAgCiACIARBAXQiByADakEDdGorAwAiEKKgOQMIIAAgCCACIANBBHRqKwMAIgiiRAAAAAAAAAAAoCAJIAIgBCADQQF0IgNqQQN0aisDACIJoqAgCiACIAMgB2pBA3RqKwMAIgqioDkDECAAIAggAUEBQQMgBhsiAkEDdGorAwAiEaJEAAAAAAAAAACgIAkgASsDICISoqAgCiABIAVBAXQiBCACakEDdGorAwAiE6KgOQMoIAAgESAOokQAAAAAAAAAAKAgEiAPoqAgEyAQoqA5AyAgACARIAuiRAAAAAAAAAAAoCASIAyioCATIA2ioDkDGCAAIAggASACQQR0aisDACIIokQAAAAAAAAAAKAgCSABIAUgAkEBdCICakEDdGorAwAiCaKgIAogASACIARqQQN0aisDACIKoqA5A0AgACAIIA6iRAAAAAAAAAAAoCAJIA+ioCAKIBCioDkDOCAAIAggC6JEAAAAAAAAAACgIAkgDKKgIAogDaKgOQMwC20AIABCADcDKCAAQgA3AxAgAEIANwMIIABCgICAgICAgPg/NwNAIABCgICAgICAgPg/NwMgIABCgICAgICAgPg/NwMAIABCADcDOCAAQgA3AzAgAEIANwMYIAAgASkDADcDECAAIAEpAwg3AygLVgEBfCAAQgA3AxAgAEKAgICAgICA+D83A0AgAEIANwM4IABCADcDMCAAQgA3AyggACABEKYDIgI5AyAgACABEKcDIgE5AxggACACOQMAIAAgAZo5AwgLwAMBB39B+OoAKAIAIgUhCEH86gAoAgAgBSICayIGBEAgBkEDdSEDIAghAgNAIAIgA0EBdiIEQQN0aiIHQQhqIAIgBysDACAAYyIHGyECIAMgBEF/c2ogBCAHGyIDDQALC0F/IQQCQCACKwMAIABiDQAgAiAFayICQQN1IgMhBAJAIAJBAUgNACADIQIDQCAFIAJBf2oiBEEDdGoiBysDACAAoZkgAWNBAXMEQCACIQQMAgsgByAAOQMAIAJBAUohByAEIQIgBw0ACwsCQCADQQFqIgIgBkEDdSIGTw0AIAUgAkEDdGoiAysDACAAoZkgAWNFDQBB/OoAKAIAQfjqACgCACIIa0ED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ICVmXSwgWyVkLCAlZl1dfQoAeyJ0eXBlIjoibG4yIiwgImRhdGEiOltbJWYsICVmXSwgWyVmLCAlZl0sIFslZCwgJWZdXX0KAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaXplX3QgbikgJ24nIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZQB4AGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaXplX3QgbikgJ24nIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZQBhbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNpemVfdCBuKSAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAPHBhdGggZCA9IgBFOlxza1xza19tYXRoXHBhY2thZ2VzXGdlb21cc3JjL2dyYXBoZXIyZC5jcHAAc3RhcnQACi0tLS0tLS1yZWxlYXNlIG5vZGUgbWVtb3J5LS0tLS0tLS0tLQA8c3ZnIHdpZHRoPSIyMDAwMDAiIGhlaWdodCA9ICIyMDAwMDAiID4KAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAcmVzdWx0LmFsbEVkZ2Uuc2l6ZSgpID4gaW5kZXhfY3VycgB5AE0gICVmLCVmIABhbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNpemVfdCBuKSAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplAHJlc3VsdC5hbGxFZGdlLnNpemUoKSA+IGluZGV4X3ByZXYAZW5kAEwgICVmLCVmIABBcmM6IFVuY29ycmVjdGFibGUgZXJyb3IgIFBvaW50KC1JbmZpbml0eSwgLUluZmluaXR5KQoAYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaXplX3QgbikgJ24nIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZQB0eXBlACBaIiBzdHJva2UgPSAiYmxhY2siIGZpbGwgPSAiYmx1ZSIgLz4KAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAYmV0YQAgWiIgIHN0cm9rZSA9ICJibGFjayIgZmlsbCA9ICJub25lIiAvPgoAYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaXplX3QgbikgJ24nIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZQBjZW50ZXIAIFoiIHN0cm9rZSA9ICJncmVlbiIgZmlsbCA9ICJibHVlIiAvPgoAYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaXplX3QgbikgJ24nIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZQByACBaIiAgc3Ryb2tlID0gImdyZWVuIiBmaWxsID0gIm5vbmUiIC8+CgBhbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNpemVfdCBuKSAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAYQAgIiAgc3Ryb2tlID0gImdyZWVuIiBmaWxsID0gIm5vbmUiIC8+CgBjb3VudAA8L3N2Zz4KAGlzT3V0ZXIAJWQAcG9seUJlZ2luACVsZiAlbGYgJWxmICVsZgBlZGdlACVsZiAlbGYgJWxmICVsZiAlbGYgJWxmICVkICVkAGVkZ2VDb3VudAAlbGYgJWxmICVsZiAlbGYgJWxmICVsZgBwdHIAcgBjdXJ2ZURhdGEAJWQgJWQAaWREYXRhACVkCgBkYXRhADAgJWYgJWYKAGxpc3QAMSAlZiAlZiAlZiAlZiAlZgoAYmVnaW4AJS4xNWxmICUuMTVsZiAlLjE1bGYgJS4xNWxmCgBpZAAlLjE1bGYgJS4xNWxmICUuMTVsZiAlLjE1bGYgJS4xNWxmICUuMTVsZiAlZCAlZAoAb2JlZ2luAG4AbG9vcGJlZ2luACAAbG9vcGVuZAAxAGhvbGVzADAAcmVnaW9ucwBhbGxFeGVQdHIgc2l6ZTogJWQgCgBsb29wc1B0cgBmYWNlWzBdOiAlZCwgZmFjZVsxXTogJWQsIGVkZ2UuaWQ6ICVkLCBlZGdlLndpbmQ6ICVkLCBzdGFydD0oJWYsICVmKSwgZW5kPSglZiwgJWYpIAoAcmVnaW9uT2xkUHRyAGZhY2VJZDogJWQsIG9sZEZhY2UgAGFsbGVkZ2UAJWQgAHBvaW50AGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAY2xpcHBlclhvcgBjb3B5IHRoZSBmb2xsb3dpbmcgc3RyIHRvIGluLnR4dCwgcmVwbGFjZSBuIGFzIAAKLS0tLS0tLXJlbGVhc2Ugbm9kZSBtZW1vcnktLS0tLS0tLS0tAAotLS0tLS0tcmVsZWFzZSBub2RlIG1lbW9yeS0tLS0tLS0tLS0ACi0tLS0tLS1yZWxlYXNlIG5vZGUgbWVtb3J5LS0tLS0tLS0tLQBHZW9tZXRyeUJhc2U6IFVuY29ycmVjdGFibGUgZXJyb3IgIFBvaW50KC1JbmZpbml0eSwgLUluZmluaXR5KQAKLS0tLS0tLXJlbGVhc2Ugbm9kZSBtZW1vcnktLS0tLS0tLS0tAAotLS0tLS0tcmVsZWFzZSBub2RlIG1lbW9yeS0tLS0tLS0tLS0AaGVsbG8gd29yZC1iZXRhLjE1AFJlcGFpciBjdXJ2ZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQAAAAAAACqTFjoerb7PwAAAACwDwAAOwAAADwAAAA9AAAAPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAADEyQXJjUGFyYW1ldGVyAACQLQAAoA8AABQSAAAAAAAASBAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAAN0FyY0VkZ2UAOEJhc2VFZGdlADhCYXNlRWRnZQA4QmFzZUVkZ2UAOEJhc2VFZGdlADhCYXNlRWRnZQAAaC0AAO0PAABoLQAA7Q8AAGgtAADtDwAAaC0AAO0PAABoLQAA7Q8AAJAtAADkDwAAIBAAADE5Q3VydmVEaXNwZXJzaW9uQmFzZQAAAGgtAABUEAAAAAAAAKAQAABNAAAATgAAAE8AAABQAAAAMTZEaXNwZXJzaW9uQmV6aWVyAACQLQAAjBAAAGwQAAAAAAAA8BAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAAAxNkJlemllcjNQYXJhbWV0ZXIAAJAtAADcEAAAFBIAAAAAAAA0EQAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAAAxMUJlemllcjNFZGdlAAAAkC0AACQRAAAgEAAAAAAAAIQRAABRAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAMTZFbGxpcHNlUGFyYW1ldGVyAACQLQAAcBEAABQSAAAAAAAAyBEAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAMTFFbGxpcHNlRWRnZQAAAJAtAAC4EQAAIBAAAAAAAAAUEgAAUQAAAHQAAAB0AAAAdAAAAHQAAAB0AAAAdQAAAHQAAAB0AAAAdAAAADEzQmFzZVBhcmFtZXRlcgBoLQAABBIAAAAAAABkEgAAUQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAewAAAHwAAAB9AAAAfgAAADE4SHlwZXJib2xhUGFyYW1ldGVyAAAAAJAtAABMEgAAFBIAAAAAAACoEgAAfwAAAIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAAAxM0h5cGVyYm9sYUVkZ2UAkC0AAJgSAAAgEAAAb3BlcmF0b3IoKQAAAAAAAAATAABRAAAAhwAAAIgAAACJAAAAigAAAIsAAACMAAAAjQAAAI4AAACPAAAAMTNMaW5lUGFyYW1ldGVyAJAtAADwEgAAFBIAAAAAAABAEwAAkAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAAAJcAAAA4TGluZUVkZ2UAAACQLQAANBMAACAQAABvZW5kAGhlbGxvd29yZABzZWFyY2gAZ2V0Q3VydmVTaXplAGNsaXBwZXJEaWZmAGNsaXBwZXJVbmlvbgBjbGlwcGVySW50ZXIAAAAAHC0AAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJaUVFAABoLQAA4BMAAKgsAAB2aQAAQBQAACgtAAAcLQAAKC0AABwtAABYLQAAHC0AAE4xMGVtc2NyaXB0ZW4zdmFsRQAAaC0AACwUAABpaWlpaWlkaQBpaQBB4CgLhA9AFAAAKC0AABwtAABYLQAAWC0AAFgtAABYLQAAwCwAABwtAABpaWlpZGRkZGlpAAogQ2xpcHBlcjogVW5jb3JyZWN0YWJsZSBlcnJvciAAAAAAAAAAAPB/////////DwAAAAAAAAAAgAABAAAAAAAAMzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEwNTgyMDk3NDk0NDU5MjMwNzgxNjQwNjI4NjIwODk5ODYyODAzNDgyNTM0MjExNzA2Nzk4MjE0AHZvaWQAYm9vbABjaGFyAHNpZ25lZCBjaGFyAHVuc2lnbmVkIGNoYXIAc2hvcnQAdW5zaWduZWQgc2hvcnQAaW50AHVuc2lnbmVkIGludABsb25nAHVuc2lnbmVkIGxvbmcAZmxvYXQAZG91YmxlAHN0ZDo6c3RyaW5nAHN0ZDo6YmFzaWNfc3RyaW5nPHVuc2lnbmVkIGNoYXI+AHN0ZDo6d3N0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBlbXNjcmlwdGVuOjp2YWwAZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVkIGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGxvbmc+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIGxvbmc+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDMyX3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxmbG9hdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZG91YmxlPgBOU3QzX18yMTJiYXNpY19zdHJpbmdJY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRQBOU3QzX18yMjFfX2Jhc2ljX3N0cmluZ19jb21tb25JTGIxRUVFAAAAAGgtAACPGAAA7C0AAFAYAAAAAAAAAQAAALgYAAAAAAAATlN0M19fMjEyYmFzaWNfc3RyaW5nSWhOU18xMWNoYXJfdHJhaXRzSWhFRU5TXzlhbGxvY2F0b3JJaEVFRUUAAOwtAADYGAAAAAAAAAEAAAC4GAAAAAAAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVOU185YWxsb2NhdG9ySXdFRUVFAADsLQAAMBkAAAAAAAABAAAAuBgAAAAAAABOU3QzX18yMTJiYXNpY19zdHJpbmdJRHNOU18xMWNoYXJfdHJhaXRzSURzRUVOU185YWxsb2NhdG9ySURzRUVFRQAAAOwtAACIGQAAAAAAAAEAAAC4GAAAAAAAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0lEaU5TXzExY2hhcl90cmFpdHNJRGlFRU5TXzlhbGxvY2F0b3JJRGlFRUVFAAAA7C0AAOQZAAAAAAAAAQAAALgYAAAAAAAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJY0VFAABoLQAAQBoAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWFFRQAAaC0AAGgaAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0loRUUAAGgtAACQGgAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJc0VF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";vt(Ct)||(Ct=a(Ct));function yt(){try{if(S)return new Uint8Array(S);var $=Vt(Ct);if($)return $;if(c)return c(Ct);throw"both async and sync fetching of the wasm failed"}catch(eA){AA(eA)}}function V(){return!S&&(s||r)&&typeof fetch=="function"&&!Mt(Ct)?fetch(Ct,{credentials:"same-origin"}).then(function($){if(!$.ok)throw"failed to load wasm binary file at '"+Ct+"'";return $.arrayBuffer()}).catch(function(){return yt()}):new Promise(function($,eA){$(yt())})}function wt(){var $={env:fe,wasi_snapshot_preview1:fe};function eA(xA,At){var ft=xA.exports;t.asm=ft,RA("wasm-instantiate")}QA("wasm-instantiate");var EA=t;function NA(xA){G(t===EA,"the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?"),EA=null,eA(xA.instance)}function FA(xA){return V().then(function(At){return WebAssembly.instantiate(At,$)}).then(xA,function(At){p("failed to asynchronously prepare wasm: "+At),AA(At)})}function OA(){if(!S&&typeof WebAssembly.instantiateStreaming=="function"&&!vt(Ct)&&!Mt(Ct)&&typeof fetch=="function")fetch(Ct,{credentials:"same-origin"}).then(function(xA){var At=WebAssembly.instantiateStreaming(xA,$);return At.then(NA,function(ft){return p("wasm streaming compile failed: "+ft),p("falling back to ArrayBuffer instantiation"),FA(NA)})});else return FA(NA)}if(t.instantiateWasm)try{var JA=t.instantiateWasm($,eA);return JA}catch(xA){return p("Module.instantiateWasm callback failed with error: "+xA),!1}return OA(),{}}re.push({func:function(){Ne()}});function _e($){return w("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),$}function ie($){var eA=/\b_Z[\w\d_]+/g;return $.replace(eA,function(EA){var NA=_e(EA);return EA===NA?EA:NA+" ["+EA+"]"})}function Ae(){var $=new Error;if(!$.stack){try{throw new Error}catch(eA){$=eA}if(!$.stack)return"(no stack trace available)"}return $.stack.toString()}function xe(){var $=Ae();return t.extraStackTrace&&($+=`
207
+ `+t.extraStackTrace()),ie($)}function mA($,eA,EA,NA){AA("Assertion failed: "+z($)+", at: "+[eA?z(eA):"unknown filename",EA,NA?z(NA):"unknown function"])}var WA={DESTRUCTOR_OFFSET:0,REFCOUNT_OFFSET:4,TYPE_OFFSET:8,CAUGHT_OFFSET:12,RETHROWN_OFFSET:13,SIZE:16};function Et($){return Ie($+WA.SIZE)+WA.SIZE}function dt($,eA){w("atexit() called, but EXIT_RUNTIME is not set, so atexits() will not be called. set EXIT_RUNTIME to 1 (see the FAQ)")}function xt($,eA){return dt()}var Be=0;function zt($){this.excPtr=$,this.ptr=$-WA.SIZE,this.set_type=function(eA){DA[this.ptr+WA.TYPE_OFFSET>>2]=eA},this.get_type=function(){return DA[this.ptr+WA.TYPE_OFFSET>>2]},this.set_destructor=function(eA){DA[this.ptr+WA.DESTRUCTOR_OFFSET>>2]=eA},this.get_destructor=function(){return DA[this.ptr+WA.DESTRUCTOR_OFFSET>>2]},this.set_refcount=function(eA){DA[this.ptr+WA.REFCOUNT_OFFSET>>2]=eA},this.set_caught=function(eA){eA=eA?1:0,lA[this.ptr+WA.CAUGHT_OFFSET>>0]=eA},this.get_caught=function(){return lA[this.ptr+WA.CAUGHT_OFFSET>>0]!=0},this.set_rethrown=function(eA){eA=eA?1:0,lA[this.ptr+WA.RETHROWN_OFFSET>>0]=eA},this.get_rethrown=function(){return lA[this.ptr+WA.RETHROWN_OFFSET>>0]!=0},this.init=function(eA,EA){this.set_type(eA),this.set_destructor(EA),this.set_refcount(0),this.set_caught(!1),this.set_rethrown(!1)},this.add_ref=function(){var eA=DA[this.ptr+WA.REFCOUNT_OFFSET>>2];DA[this.ptr+WA.REFCOUNT_OFFSET>>2]=eA+1},this.release_ref=function(){var eA=DA[this.ptr+WA.REFCOUNT_OFFSET>>2];return DA[this.ptr+WA.REFCOUNT_OFFSET>>2]=eA-1,G(eA>0),eA===1}}function me($){this.free=function(){Ht(this.ptr),this.ptr=0},this.set_base_ptr=function(eA){DA[this.ptr>>2]=eA},this.get_base_ptr=function(){return DA[this.ptr>>2]},this.set_adjusted_ptr=function(eA){var EA=4;DA[this.ptr+EA>>2]=eA},this.get_adjusted_ptr=function(){var eA=4;return DA[this.ptr+eA>>2]},this.get_exception_ptr=function(){var eA=___cxa_is_pointer_type(this.get_exception_info().get_type());if(eA)return DA[this.get_base_ptr()>>2];var EA=this.get_adjusted_ptr();return EA!==0?EA:this.get_base_ptr()},this.get_exception_info=function(){return new zt(this.get_base_ptr())},$===void 0?(this.ptr=Ie(8),this.set_adjusted_ptr(0)):this.ptr=$}function Rt($){var eA=new me($),EA=eA.get_base_ptr();throw Be||(Be=EA),eA.free(),EA}function ye(){var $=Be;if(!$)return M(0),0|0;var eA=new zt($),EA=eA.get_type(),NA=new me;if(NA.set_base_ptr($),!EA)return M(0),NA.ptr|0;var FA=Array.prototype.slice.call(arguments),OA=21584;DA[OA>>2]=$;for(var JA=0;JA<FA.length;JA++){var xA=FA[JA];if(xA===0||xA===EA)break;if(___cxa_can_catch(xA,EA,OA)){var At=DA[OA>>2];return $!==At&&NA.set_adjusted_ptr(At),M(xA),NA.ptr|0}}return M(EA),NA.ptr|0}function Fe($,eA,EA){var NA=new zt($);throw NA.init(eA,EA),Be=$,$}function Le(){AA("stack overflow")}function ve($){switch($){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+$)}}function pt(){for(var $=new Array(256),eA=0;eA<256;++eA)$[eA]=String.fromCharCode(eA);Re=$}var Re=void 0;function qt($){for(var eA="",EA=$;aA[EA];)eA+=Re[aA[EA++]];return eA}var te={},Ee={},Me={},Ue=48,ke=57;function Ge($){if($===void 0)return"_unknown";$=$.replace(/[^a-zA-Z0-9_]/g,"$");var eA=$.charCodeAt(0);return eA>=Ue&&eA<=ke?"_"+$:$}function Te($,eA){return $=Ge($),new Function("body","return function "+$+`() {
208
+ "use strict"; return body.apply(this, arguments);
209
+ };
210
+ `)(eA)}function bt($,eA){var EA=Te(eA,function(NA){this.name=eA,this.message=NA;var FA=new Error(NA).stack;FA!==void 0&&(this.stack=this.toString()+`
211
+ `+FA.replace(/^Error(:[^\n]*)?\n/,""))});return EA.prototype=Object.create($.prototype),EA.prototype.constructor=EA,EA.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},EA}var oe=void 0;function Wt($){throw new oe($)}var Je=void 0;function at($){throw new Je($)}function He($,eA,EA){$.forEach(function(xA){Me[xA]=eA});function NA(xA){var At=EA(xA);At.length!==$.length&&at("Mismatched type converter count");for(var ft=0;ft<$.length;++ft)de($[ft],At[ft])}var FA=new Array(eA.length),OA=[],JA=0;eA.forEach(function(xA,At){Ee.hasOwnProperty(xA)?FA[At]=Ee[xA]:(OA.push(xA),te.hasOwnProperty(xA)||(te[xA]=[]),te[xA].push(function(){FA[At]=Ee[xA],++JA,JA===OA.length&&NA(FA)}))}),OA.length===0&&NA(FA)}function de($,eA,EA){if(EA=EA||{},!("argPackAdvance"in eA))throw new TypeError("registerType registeredInstance requires argPackAdvance");var NA=eA.name;if($||Wt('type "'+NA+'" must have a positive integer typeid pointer'),Ee.hasOwnProperty($)){if(EA.ignoreDuplicateRegistrations)return;Wt("Cannot register type '"+NA+"' twice")}if(Ee[$]=eA,delete Me[$],te.hasOwnProperty($)){var FA=te[$];delete te[$],FA.forEach(function(OA){OA()})}}function qe($,eA,EA,NA,FA){var OA=ve(EA);eA=qt(eA),de($,{name:eA,fromWireType:function(JA){return!!JA},toWireType:function(JA,xA){return xA?NA:FA},argPackAdvance:8,readValueFromPointer:function(JA){var xA;if(EA===1)xA=lA;else if(EA===2)xA=wA;else if(EA===4)xA=DA;else throw new TypeError("Unknown boolean type size: "+eA);return this.fromWireType(xA[JA>>OA])},destructorFunction:null})}var be=[],ee=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function f($){$>4&&--ee[$].refcount===0&&(ee[$]=void 0,be.push($))}function m(){for(var $=0,eA=5;eA<ee.length;++eA)ee[eA]!==void 0&&++$;return $}function P(){for(var $=5;$<ee.length;++$)if(ee[$]!==void 0)return ee[$];return null}function L(){t.count_emval_handles=m,t.get_first_emval=P}function h($){switch($){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:{var eA=be.length?be.pop():ee.length;return ee[eA]={refcount:1,value:$},eA}}}function d($){return this.fromWireType(UA[$>>2])}function v($,eA){eA=qt(eA),de($,{name:eA,fromWireType:function(EA){var NA=ee[EA].value;return f(EA),NA},toWireType:function(EA,NA){return h(NA)},argPackAdvance:8,readValueFromPointer:d,destructorFunction:null})}function x($){if($===null)return"null";var eA=typeof $;return eA==="object"||eA==="array"||eA==="function"?$.toString():""+$}function F($,eA){switch(eA){case 2:return function(EA){return this.fromWireType(XA[EA>>2])};case 3:return function(EA){return this.fromWireType(bA[EA>>3])};default:throw new TypeError("Unknown float type: "+$)}}function Y($,eA,EA){var NA=ve(EA);eA=qt(eA),de($,{name:eA,fromWireType:function(FA){return FA},toWireType:function(FA,OA){if(typeof OA!="number"&&typeof OA!="boolean")throw new TypeError('Cannot convert "'+x(OA)+'" to '+this.name);return OA},argPackAdvance:8,readValueFromPointer:F(eA,NA),destructorFunction:null})}function K($,eA){if(!($ instanceof Function))throw new TypeError("new_ called with constructor type "+typeof $+" which is not a function");var EA=Te($.name||"unknownFunctionName",function(){});EA.prototype=$.prototype;var NA=new EA,FA=$.apply(NA,eA);return FA instanceof Object?FA:NA}function q($){for(;$.length;){var eA=$.pop(),EA=$.pop();EA(eA)}}function j($,eA,EA,NA,FA){var OA=eA.length;OA<2&&Wt("argTypes array size mismatch! Must at least get return value and 'this' types!"),eA[1];for(var JA=!1,xA=1;xA<eA.length;++xA)if(eA[xA]!==null&&eA[xA].destructorFunction===void 0){JA=!0;break}for(var At=eA[0].name!=="void",ft="",Gt="",xA=0;xA<OA-2;++xA)ft+=(xA!==0?", ":"")+"arg"+xA,Gt+=(xA!==0?", ":"")+"arg"+xA+"Wired";var Yt="return function "+Ge($)+"("+ft+`) {
212
+ if (arguments.length !== `+(OA-2)+`) {
213
+ throwBindingError('function `+$+" called with ' + arguments.length + ' arguments, expected "+(OA-2)+` args!');
214
+ }
215
+ `;JA&&(Yt+=`var destructors = [];
216
+ `);for(var he=JA?"destructors":"null",ne=["throwBindingError","invoker","fn","runDestructors","retType","classParam"],Ce=[Wt,NA,FA,q,eA[0],eA[1]],xA=0;xA<OA-2;++xA)Yt+="var arg"+xA+"Wired = argType"+xA+".toWireType("+he+", arg"+xA+"); // "+eA[xA+2].name+`
217
+ `,ne.push("argType"+xA),Ce.push(eA[xA+2]);if(Yt+=(At?"var rv = ":"")+"invoker(fn"+(Gt.length>0?", ":"")+Gt+`);
218
+ `,JA)Yt+=`runDestructors(destructors);
219
+ `;else for(var xA=2;xA<eA.length;++xA){var Ke=xA===1?"thisWired":"arg"+(xA-2)+"Wired";eA[xA].destructorFunction!==null&&(Yt+=Ke+"_dtor("+Ke+"); // "+eA[xA].name+`
220
+ `,ne.push(Ke+"_dtor"),Ce.push(eA[xA].destructorFunction))}At&&(Yt+=`var ret = retType.fromWireType(rv);
221
+ return ret;
222
+ `),Yt+=`}
223
+ `,ne.push(Yt);var je=K(Function,ne).apply(null,Ce);return je}function rA($,eA,EA){if($[eA].overloadTable===void 0){var NA=$[eA];$[eA]=function(){return $[eA].overloadTable.hasOwnProperty(arguments.length)||Wt("Function '"+EA+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+$[eA].overloadTable+")!"),$[eA].overloadTable[arguments.length].apply(this,arguments)},$[eA].overloadTable=[],$[eA].overloadTable[NA.argCount]=NA}}function gA($,eA,EA){t.hasOwnProperty($)?((EA===void 0||t[$].overloadTable!==void 0&&t[$].overloadTable[EA]!==void 0)&&Wt("Cannot register public name '"+$+"' twice"),rA(t,$,$),t.hasOwnProperty(EA)&&Wt("Cannot register multiple overloads of a function with the same number of arguments ("+EA+")!"),t[$].overloadTable[EA]=eA):(t[$]=eA,EA!==void 0&&(t[$].numArguments=EA))}function cA($,eA){for(var EA=[],NA=0;NA<$;NA++)EA.push(DA[(eA>>2)+NA]);return EA}function uA($,eA,EA){t.hasOwnProperty($)||at("Replacing nonexistant public symbol"),t[$].overloadTable!==void 0&&EA!==void 0?t[$].overloadTable[EA]=eA:(t[$]=eA,t[$].argCount=EA)}function fA($,eA){$=qt($);function EA(OA){for(var JA=[],xA=1;xA<$.length;++xA)JA.push("a"+xA);var At="dynCall_"+$+"_"+eA,ft="return function "+At+"("+JA.join(", ")+`) {
224
+ `;return ft+=" return dynCall(rawFunction"+(JA.length?", ":"")+JA.join(", ")+`);
225
+ `,ft+=`};
226
+ `,new Function("dynCall","rawFunction",ft)(OA,eA)}var NA=t["dynCall_"+$],FA=EA(NA);return typeof FA!="function"&&Wt("unknown function pointer with signature "+$+": "+eA),FA}var pA=void 0;function MA($){var eA=pe($),EA=qt(eA);return Ht(eA),EA}function vA($,eA){var EA=[],NA={};function FA(OA){if(!NA[OA]&&!Ee[OA]){if(Me[OA]){Me[OA].forEach(FA);return}EA.push(OA),NA[OA]=!0}}throw eA.forEach(FA),new pA($+": "+EA.map(MA).join([", "]))}function TA($,eA,EA,NA,FA,OA){var JA=cA(eA,EA);$=qt($),FA=fA(NA,FA),gA($,function(){vA("Cannot call "+$+" due to unbound types",JA)},eA-1),He([],JA,function(xA){var At=[xA[0],null].concat(xA.slice(1));return uA($,j($,At,null,FA,OA),eA-1),[]})}function SA($,eA,EA){switch(eA){case 0:return EA?function(FA){return lA[FA]}:function(FA){return aA[FA]};case 1:return EA?function(FA){return wA[FA>>1]}:function(FA){return YA[FA>>1]};case 2:return EA?function(FA){return DA[FA>>2]}:function(FA){return UA[FA>>2]};default:throw new TypeError("Unknown integer type: "+$)}}function kA($,eA,EA,NA,FA){eA=qt(eA),FA===-1&&(FA=4294967295);var OA=ve(EA),JA=function(ft){return ft};if(NA===0){var xA=32-8*EA;JA=function(ft){return ft<<xA>>>xA}}var At=eA.indexOf("unsigned")!=-1;de($,{name:eA,fromWireType:JA,toWireType:function(ft,Gt){if(typeof Gt!="number"&&typeof Gt!="boolean")throw new TypeError('Cannot convert "'+x(Gt)+'" to '+this.name);if(Gt<NA||Gt>FA)throw new TypeError('Passing a number "'+x(Gt)+'" from JS side to C/C++ side to an argument of type "'+eA+'", which is outside the valid range ['+NA+", "+FA+"]!");return At?Gt>>>0:Gt|0},argPackAdvance:8,readValueFromPointer:SA(eA,OA,NA!==0),destructorFunction:null})}function HA($,eA,EA){var NA=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],FA=NA[eA];function OA(JA){JA=JA>>2;var xA=UA,At=xA[JA],ft=xA[JA+1];return new FA(BA,ft,At)}EA=qt(EA),de($,{name:EA,fromWireType:OA,argPackAdvance:8,readValueFromPointer:OA},{ignoreDuplicateRegistrations:!0})}function zA($,eA){eA=qt(eA);var EA=eA==="std::string";de($,{name:eA,fromWireType:function(NA){var FA=UA[NA>>2],OA;if(EA)for(var JA=NA+4,xA=0;xA<=FA;++xA){var At=NA+4+xA;if(xA==FA||aA[At]==0){var ft=At-JA,Gt=z(JA,ft);OA===void 0?OA=Gt:(OA+="\0",OA+=Gt),JA=At+1}}else{for(var Yt=new Array(FA),xA=0;xA<FA;++xA)Yt[xA]=String.fromCharCode(aA[NA+4+xA]);OA=Yt.join("")}return Ht(NA),OA},toWireType:function(NA,FA){FA instanceof ArrayBuffer&&(FA=new Uint8Array(FA));var OA,JA=typeof FA=="string";JA||FA instanceof Uint8Array||FA instanceof Uint8ClampedArray||FA instanceof Int8Array||Wt("Cannot pass non-string to std::string"),EA&&JA?OA=function(){return IA(FA)}:OA=function(){return FA.length};var xA=OA(),At=Ie(4+xA+1);if(UA[At>>2]=xA,EA&&JA)nA(FA,At+4,xA+1);else if(JA)for(var ft=0;ft<xA;++ft){var Gt=FA.charCodeAt(ft);Gt>255&&(Ht(At),Wt("String has UTF-16 code units that do not fit in 8 bits")),aA[At+4+ft]=Gt}else for(var ft=0;ft<xA;++ft)aA[At+4+ft]=FA[ft];return NA!==null&&NA.push(Ht,At),At},argPackAdvance:8,readValueFromPointer:d,destructorFunction:function(NA){Ht(NA)}})}function ZA($,eA,EA){EA=qt(EA);var NA,FA,OA,JA,xA;eA===2?(NA=W,FA=oA,JA=hA,OA=function(){return YA},xA=1):eA===4&&(NA=dA,FA=PA,JA=yA,OA=function(){return UA},xA=2),de($,{name:EA,fromWireType:function(At){for(var ft=UA[At>>2],Gt=OA(),Yt,he=At+4,ne=0;ne<=ft;++ne){var Ce=At+4+ne*eA;if(ne==ft||Gt[Ce>>xA]==0){var Ke=Ce-he,je=NA(he,Ke);Yt===void 0?Yt=je:(Yt+="\0",Yt+=je),he=Ce+eA}}return Ht(At),Yt},toWireType:function(At,ft){typeof ft!="string"&&Wt("Cannot pass non-string to C++ string type "+EA);var Gt=JA(ft),Yt=Ie(4+Gt+eA);return UA[Yt>>2]=Gt>>xA,FA(ft,Yt+4,Gt+eA),At!==null&&At.push(Ht,Yt),Yt},argPackAdvance:8,readValueFromPointer:d,destructorFunction:function(At){Ht(At)}})}function VA($,eA){eA=qt(eA),de($,{isVoid:!0,name:eA,argPackAdvance:0,fromWireType:function(){},toWireType:function(EA,NA){}})}function KA($){$>4&&(ee[$].refcount+=1)}function jA(){return h([])}var tt={};function ot($){var eA=tt[$];return eA===void 0?qt($):eA}function ct($){return h(ot($))}function lt(){return h({})}function ut($){return $||Wt("Cannot use deleted val. handle = "+$),ee[$].value}function Bt($,eA,EA){$=ut($),eA=ut(eA),EA=ut(EA),$[eA]=EA}function rt($,eA){var EA=Ee[$];return EA===void 0&&Wt(eA+" has unknown type "+MA($)),EA}function ht($,eA){$=rt($,"_emval_take_value");var EA=$.readValueFromPointer(eA);return h(EA)}function qA(){return 21424}function Qt($,eA,EA){aA.copyWithin($,eA,eA+EA)}function mt(){return aA.length}function Ut($){try{return R.grow($-BA.byteLength+65535>>>16),nt(R.buffer),1}catch(eA){console.error("emscripten_realloc_buffer: Attempted to grow heap from "+BA.byteLength+" bytes to "+$+" bytes, but got error: "+eA)}}function kt($){$=$>>>0;var eA=mt();G($>eA);var EA=65536,NA=2147483648;if($>NA)return p("Cannot enlarge memory, asked to go up to "+$+" bytes, but the limit is "+NA+" bytes!"),!1;for(var FA=16777216,OA=1;OA<=4;OA*=2){var JA=eA*(1+.2/OA);JA=Math.min(JA,$+100663296);var xA=Math.min(NA,LA(Math.max(FA,$,JA),EA)),At=Ut(xA);if(At)return!0}return p("Failed to grow the heap from "+eA+" bytes to "+xA+" bytes, not enough memory!"),!1}var _t={mappings:{},buffers:[null,[],[]],printChar:function($,eA){var EA=_t.buffers[$];G(EA),eA===0||eA===10?(($===1?Q:p)(H(EA,0)),EA.length=0):EA.push(eA)},varargs:void 0,get:function(){G(_t.varargs!=null),_t.varargs+=4;var $=DA[_t.varargs-4>>2];return $},getStr:function($){var eA=z($);return eA},get64:function($,eA){return $>=0?G(eA===0):G(eA===-1),$}};function Ot($,eA,EA,NA){for(var FA=0,OA=0;OA<EA;OA++){for(var JA=DA[eA+OA*8>>2],xA=DA[eA+(OA*8+4)>>2],At=0;At<xA;At++)_t.printChar($,aA[JA+At]);FA+=xA}return DA[NA>>2]=FA,0}function ge(){return N()|0}function Qe($){M($|0)}pt(),oe=t.BindingError=bt(Error,"BindingError"),Je=t.InternalError=bt(Error,"InternalError"),L(),pA=t.UnboundTypeError=bt(Error,"UnboundTypeError");function Zt($){for(var eA=[],EA=0;EA<$.length;EA++){var NA=$[EA];NA>255&&(G(!1,"Character code "+NA+" ("+String.fromCharCode(NA)+") at offset "+EA+" not in 0x00-0xFF."),NA&=255),eA.push(String.fromCharCode(NA))}return eA.join("")}var $t=typeof atob=="function"?atob:function($){var eA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",EA="",NA,FA,OA,JA,xA,At,ft,Gt=0;$=$.replace(/[^A-Za-z0-9\+\/\=]/g,"");do JA=eA.indexOf($.charAt(Gt++)),xA=eA.indexOf($.charAt(Gt++)),At=eA.indexOf($.charAt(Gt++)),ft=eA.indexOf($.charAt(Gt++)),NA=JA<<2|xA>>4,FA=(xA&15)<<4|At>>2,OA=(At&3)<<6|ft,EA=EA+String.fromCharCode(NA),At!==64&&(EA=EA+String.fromCharCode(FA)),ft!==64&&(EA=EA+String.fromCharCode(OA));while(Gt<$.length);return EA};function ae($){if(typeof i=="boolean"&&i){var eA;try{eA=Buffer.from($,"base64")}catch{eA=new Buffer($,"base64")}return new Uint8Array(eA.buffer,eA.byteOffset,eA.byteLength)}try{for(var EA=$t($),NA=new Uint8Array(EA.length),FA=0;FA<EA.length;++FA)NA[FA]=EA.charCodeAt(FA);return NA}catch{throw new Error("Converting base64 string to bytes failed.")}}function Vt($){if(vt($))return ae($.slice($A.length))}var fe={__assert_fail:mA,__cxa_allocate_exception:Et,__cxa_atexit:xt,__cxa_find_matching_catch_2:ye,__cxa_throw:Fe,__handle_stack_overflow:Le,__resumeException:Rt,_embind_register_bool:qe,_embind_register_emval:v,_embind_register_float:Y,_embind_register_function:TA,_embind_register_integer:kA,_embind_register_memory_view:HA,_embind_register_std_string:zA,_embind_register_std_wstring:ZA,_embind_register_void:VA,_emval_decref:f,_emval_incref:KA,_emval_new_array:jA,_emval_new_cstring:ct,_emval_new_object:lt,_emval_set_property:Bt,_emval_take_value:ht,emscripten_get_sbrk_ptr:qA,emscripten_memcpy_big:Qt,emscripten_resize_heap:kt,fd_write:Ot,getTempRet0:ge,invoke_iii:Xe,memory:R,setTempRet0:Qe,table:U};wt();var Ne=t.___wasm_call_ctors=et("__wasm_call_ctors"),Ie=t._malloc=et("malloc"),pe=t.___getTypeName=et("__getTypeName");t.___embind_register_native_and_builtin_types=et("__embind_register_native_and_builtin_types"),t.___errno_location=et("__errno_location");var Ht=t._free=et("free"),Se=t._setThrew=et("setThrew"),Oe=t.stackSave=et("stackSave"),Ye=t.stackRestore=et("stackRestore");t.stackAlloc=et("stackAlloc");var ze=t.dynCall_iii=et("dynCall_iii");t.___set_stack_limit=et("__set_stack_limit"),t.dynCall_ii=et("dynCall_ii"),t.dynCall_vi=et("dynCall_vi"),t.dynCall_v=et("dynCall_v"),t.dynCall_iiiiiidi=et("dynCall_iiiiiidi"),t.dynCall_viiiiidi=et("dynCall_viiiiidi"),t.dynCall_i=et("dynCall_i"),t.dynCall_iiiiddddii=et("dynCall_iiiiddddii"),t.dynCall_viiiddddii=et("dynCall_viiiddddii"),t.dynCall_viidd=et("dynCall_viidd"),t.dynCall_vii=et("dynCall_vii"),t.dynCall_viid=et("dynCall_viid"),t.dynCall_viii=et("dynCall_viii"),t.dynCall_vidi=et("dynCall_vidi"),t.dynCall_diddi=et("dynCall_diddi"),t.dynCall_iiii=et("dynCall_iiii"),t.dynCall_jiji=et("dynCall_jiji"),t.dynCall_iidiiii=et("dynCall_iidiiii"),t.dynCall_viiiiii=et("dynCall_viiiiii"),t.dynCall_viiiii=et("dynCall_viiiii"),t.dynCall_viiii=et("dynCall_viiii"),t.__growWasmMemory=et("__growWasmMemory");function Xe($,eA,EA){var NA=Oe();try{return ze($,eA,EA)}catch(FA){if(Ye(NA),FA!==FA+0&&FA!=="longjmp")throw FA;Se(1,0)}}Object.getOwnPropertyDescriptor(t,"intArrayFromString")||(t.intArrayFromString=function(){AA("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"intArrayToString")||(t.intArrayToString=function(){AA("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ccall")||(t.ccall=function(){AA("'ccall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"cwrap")||(t.cwrap=function(){AA("'cwrap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"setValue")||(t.setValue=function(){AA("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getValue")||(t.getValue=function(){AA("'getValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"allocate")||(t.allocate=function(){AA("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getMemory")||(t.getMemory=function(){AA("'getMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"UTF8ArrayToString")||(t.UTF8ArrayToString=function(){AA("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"UTF8ToString")||(t.UTF8ToString=function(){AA("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stringToUTF8Array")||(t.stringToUTF8Array=function(){AA("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stringToUTF8")||(t.stringToUTF8=function(){AA("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"lengthBytesUTF8")||(t.lengthBytesUTF8=function(){AA("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stackTrace")||(t.stackTrace=function(){AA("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"addOnPreRun")||(t.addOnPreRun=function(){AA("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"addOnInit")||(t.addOnInit=function(){AA("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"addOnPreMain")||(t.addOnPreMain=function(){AA("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"addOnExit")||(t.addOnExit=function(){AA("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"addOnPostRun")||(t.addOnPostRun=function(){AA("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeStringToMemory")||(t.writeStringToMemory=function(){AA("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeArrayToMemory")||(t.writeArrayToMemory=function(){AA("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeAsciiToMemory")||(t.writeAsciiToMemory=function(){AA("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"addRunDependency")||(t.addRunDependency=function(){AA("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"removeRunDependency")||(t.removeRunDependency=function(){AA("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_createFolder")||(t.FS_createFolder=function(){AA("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_createPath")||(t.FS_createPath=function(){AA("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_createDataFile")||(t.FS_createDataFile=function(){AA("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_createPreloadedFile")||(t.FS_createPreloadedFile=function(){AA("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_createLazyFile")||(t.FS_createLazyFile=function(){AA("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_createLink")||(t.FS_createLink=function(){AA("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_createDevice")||(t.FS_createDevice=function(){AA("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"FS_unlink")||(t.FS_unlink=function(){AA("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(t,"dynamicAlloc")||(t.dynamicAlloc=function(){AA("'dynamicAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"loadDynamicLibrary")||(t.loadDynamicLibrary=function(){AA("'loadDynamicLibrary' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"loadWebAssemblyModule")||(t.loadWebAssemblyModule=function(){AA("'loadWebAssemblyModule' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getLEB")||(t.getLEB=function(){AA("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getFunctionTables")||(t.getFunctionTables=function(){AA("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"alignFunctionTables")||(t.alignFunctionTables=function(){AA("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"registerFunctions")||(t.registerFunctions=function(){AA("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"addFunction")||(t.addFunction=function(){AA("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"removeFunction")||(t.removeFunction=function(){AA("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getFuncWrapper")||(t.getFuncWrapper=function(){AA("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"prettyPrint")||(t.prettyPrint=function(){AA("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"makeBigInt")||(t.makeBigInt=function(){AA("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"dynCall")||(t.dynCall=function(){AA("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getCompilerSetting")||(t.getCompilerSetting=function(){AA("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"print")||(t.print=function(){AA("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"printErr")||(t.printErr=function(){AA("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getTempRet0")||(t.getTempRet0=function(){AA("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"setTempRet0")||(t.setTempRet0=function(){AA("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"callMain")||(t.callMain=function(){AA("'callMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"abort")||(t.abort=function(){AA("'abort' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stringToNewUTF8")||(t.stringToNewUTF8=function(){AA("'stringToNewUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"emscripten_realloc_buffer")||(t.emscripten_realloc_buffer=function(){AA("'emscripten_realloc_buffer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ENV")||(t.ENV=function(){AA("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ERRNO_CODES")||(t.ERRNO_CODES=function(){AA("'ERRNO_CODES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ERRNO_MESSAGES")||(t.ERRNO_MESSAGES=function(){AA("'ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"setErrNo")||(t.setErrNo=function(){AA("'setErrNo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"DNS")||(t.DNS=function(){AA("'DNS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"GAI_ERRNO_MESSAGES")||(t.GAI_ERRNO_MESSAGES=function(){AA("'GAI_ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"Protocols")||(t.Protocols=function(){AA("'Protocols' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"Sockets")||(t.Sockets=function(){AA("'Sockets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"traverseStack")||(t.traverseStack=function(){AA("'traverseStack' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"UNWIND_CACHE")||(t.UNWIND_CACHE=function(){AA("'UNWIND_CACHE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"withBuiltinMalloc")||(t.withBuiltinMalloc=function(){AA("'withBuiltinMalloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"readAsmConstArgsArray")||(t.readAsmConstArgsArray=function(){AA("'readAsmConstArgsArray' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"readAsmConstArgs")||(t.readAsmConstArgs=function(){AA("'readAsmConstArgs' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"jstoi_q")||(t.jstoi_q=function(){AA("'jstoi_q' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"jstoi_s")||(t.jstoi_s=function(){AA("'jstoi_s' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getExecutableName")||(t.getExecutableName=function(){AA("'getExecutableName' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"listenOnce")||(t.listenOnce=function(){AA("'listenOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"autoResumeAudioContext")||(t.autoResumeAudioContext=function(){AA("'autoResumeAudioContext' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"abortStackOverflow")||(t.abortStackOverflow=function(){AA("'abortStackOverflow' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"reallyNegative")||(t.reallyNegative=function(){AA("'reallyNegative' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"formatString")||(t.formatString=function(){AA("'formatString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"PATH")||(t.PATH=function(){AA("'PATH' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"PATH_FS")||(t.PATH_FS=function(){AA("'PATH_FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"SYSCALLS")||(t.SYSCALLS=function(){AA("'SYSCALLS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"syscallMmap2")||(t.syscallMmap2=function(){AA("'syscallMmap2' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"syscallMunmap")||(t.syscallMunmap=function(){AA("'syscallMunmap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"flush_NO_FILESYSTEM")||(t.flush_NO_FILESYSTEM=function(){AA("'flush_NO_FILESYSTEM' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"JSEvents")||(t.JSEvents=function(){AA("'JSEvents' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"specialHTMLTargets")||(t.specialHTMLTargets=function(){AA("'specialHTMLTargets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"maybeCStringToJsString")||(t.maybeCStringToJsString=function(){AA("'maybeCStringToJsString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"findEventTarget")||(t.findEventTarget=function(){AA("'findEventTarget' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"findCanvasEventTarget")||(t.findCanvasEventTarget=function(){AA("'findCanvasEventTarget' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"polyfillSetImmediate")||(t.polyfillSetImmediate=function(){AA("'polyfillSetImmediate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"demangle")||(t.demangle=function(){AA("'demangle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"demangleAll")||(t.demangleAll=function(){AA("'demangleAll' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"jsStackTrace")||(t.jsStackTrace=function(){AA("'jsStackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stackTrace")||(t.stackTrace=function(){AA("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getEnvStrings")||(t.getEnvStrings=function(){AA("'getEnvStrings' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"checkWasiClock")||(t.checkWasiClock=function(){AA("'checkWasiClock' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeI53ToI64")||(t.writeI53ToI64=function(){AA("'writeI53ToI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeI53ToI64Clamped")||(t.writeI53ToI64Clamped=function(){AA("'writeI53ToI64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeI53ToI64Signaling")||(t.writeI53ToI64Signaling=function(){AA("'writeI53ToI64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeI53ToU64Clamped")||(t.writeI53ToU64Clamped=function(){AA("'writeI53ToU64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"writeI53ToU64Signaling")||(t.writeI53ToU64Signaling=function(){AA("'writeI53ToU64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"readI53FromI64")||(t.readI53FromI64=function(){AA("'readI53FromI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"readI53FromU64")||(t.readI53FromU64=function(){AA("'readI53FromU64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"convertI32PairToI53")||(t.convertI32PairToI53=function(){AA("'convertI32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"convertU32PairToI53")||(t.convertU32PairToI53=function(){AA("'convertU32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"exceptionLast")||(t.exceptionLast=function(){AA("'exceptionLast' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"exceptionCaught")||(t.exceptionCaught=function(){AA("'exceptionCaught' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ExceptionInfoAttrs")||(t.ExceptionInfoAttrs=function(){AA("'ExceptionInfoAttrs' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ExceptionInfo")||(t.ExceptionInfo=function(){AA("'ExceptionInfo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"CatchInfo")||(t.CatchInfo=function(){AA("'CatchInfo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"exception_addRef")||(t.exception_addRef=function(){AA("'exception_addRef' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"exception_decRef")||(t.exception_decRef=function(){AA("'exception_decRef' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"Browser")||(t.Browser=function(){AA("'Browser' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"SDL_unicode")||(t.SDL_unicode=function(){AA("'SDL_unicode' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"SDL_ttfContext")||(t.SDL_ttfContext=function(){AA("'SDL_ttfContext' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"SDL_audio")||(t.SDL_audio=function(){AA("'SDL_audio' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"SDL")||(t.SDL=function(){AA("'SDL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"SDL_gfx")||(t.SDL_gfx=function(){AA("'SDL_gfx' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"emval_handle_array")||(t.emval_handle_array=function(){AA("'emval_handle_array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"emval_free_list")||(t.emval_free_list=function(){AA("'emval_free_list' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"emval_symbols")||(t.emval_symbols=function(){AA("'emval_symbols' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"init_emval")||(t.init_emval=function(){AA("'init_emval' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"count_emval_handles")||(t.count_emval_handles=function(){AA("'count_emval_handles' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"get_first_emval")||(t.get_first_emval=function(){AA("'get_first_emval' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getStringOrSymbol")||(t.getStringOrSymbol=function(){AA("'getStringOrSymbol' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"requireHandle")||(t.requireHandle=function(){AA("'requireHandle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"emval_newers")||(t.emval_newers=function(){AA("'emval_newers' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"craftEmvalAllocator")||(t.craftEmvalAllocator=function(){AA("'craftEmvalAllocator' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"emval_get_global")||(t.emval_get_global=function(){AA("'emval_get_global' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"emval_methodCallers")||(t.emval_methodCallers=function(){AA("'emval_methodCallers' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"InternalError")||(t.InternalError=function(){AA("'InternalError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"BindingError")||(t.BindingError=function(){AA("'BindingError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"UnboundTypeError")||(t.UnboundTypeError=function(){AA("'UnboundTypeError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"PureVirtualError")||(t.PureVirtualError=function(){AA("'PureVirtualError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"init_embind")||(t.init_embind=function(){AA("'init_embind' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"throwInternalError")||(t.throwInternalError=function(){AA("'throwInternalError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"throwBindingError")||(t.throwBindingError=function(){AA("'throwBindingError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"throwUnboundTypeError")||(t.throwUnboundTypeError=function(){AA("'throwUnboundTypeError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ensureOverloadTable")||(t.ensureOverloadTable=function(){AA("'ensureOverloadTable' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"exposePublicSymbol")||(t.exposePublicSymbol=function(){AA("'exposePublicSymbol' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"replacePublicSymbol")||(t.replacePublicSymbol=function(){AA("'replacePublicSymbol' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"extendError")||(t.extendError=function(){AA("'extendError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"createNamedFunction")||(t.createNamedFunction=function(){AA("'createNamedFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"registeredInstances")||(t.registeredInstances=function(){AA("'registeredInstances' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getBasestPointer")||(t.getBasestPointer=function(){AA("'getBasestPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"registerInheritedInstance")||(t.registerInheritedInstance=function(){AA("'registerInheritedInstance' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"unregisterInheritedInstance")||(t.unregisterInheritedInstance=function(){AA("'unregisterInheritedInstance' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getInheritedInstance")||(t.getInheritedInstance=function(){AA("'getInheritedInstance' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getInheritedInstanceCount")||(t.getInheritedInstanceCount=function(){AA("'getInheritedInstanceCount' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getLiveInheritedInstances")||(t.getLiveInheritedInstances=function(){AA("'getLiveInheritedInstances' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"registeredTypes")||(t.registeredTypes=function(){AA("'registeredTypes' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"awaitingDependencies")||(t.awaitingDependencies=function(){AA("'awaitingDependencies' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"typeDependencies")||(t.typeDependencies=function(){AA("'typeDependencies' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"registeredPointers")||(t.registeredPointers=function(){AA("'registeredPointers' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"registerType")||(t.registerType=function(){AA("'registerType' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"whenDependentTypesAreResolved")||(t.whenDependentTypesAreResolved=function(){AA("'whenDependentTypesAreResolved' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"embind_charCodes")||(t.embind_charCodes=function(){AA("'embind_charCodes' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"embind_init_charCodes")||(t.embind_init_charCodes=function(){AA("'embind_init_charCodes' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"readLatin1String")||(t.readLatin1String=function(){AA("'readLatin1String' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getTypeName")||(t.getTypeName=function(){AA("'getTypeName' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"heap32VectorToArray")||(t.heap32VectorToArray=function(){AA("'heap32VectorToArray' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"requireRegisteredType")||(t.requireRegisteredType=function(){AA("'requireRegisteredType' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"getShiftFromSize")||(t.getShiftFromSize=function(){AA("'getShiftFromSize' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"integerReadValueFromPointer")||(t.integerReadValueFromPointer=function(){AA("'integerReadValueFromPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"enumReadValueFromPointer")||(t.enumReadValueFromPointer=function(){AA("'enumReadValueFromPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"floatReadValueFromPointer")||(t.floatReadValueFromPointer=function(){AA("'floatReadValueFromPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"simpleReadValueFromPointer")||(t.simpleReadValueFromPointer=function(){AA("'simpleReadValueFromPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"runDestructors")||(t.runDestructors=function(){AA("'runDestructors' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"new_")||(t.new_=function(){AA("'new_' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"craftInvokerFunction")||(t.craftInvokerFunction=function(){AA("'craftInvokerFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"embind__requireFunction")||(t.embind__requireFunction=function(){AA("'embind__requireFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"tupleRegistrations")||(t.tupleRegistrations=function(){AA("'tupleRegistrations' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"structRegistrations")||(t.structRegistrations=function(){AA("'structRegistrations' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"genericPointerToWireType")||(t.genericPointerToWireType=function(){AA("'genericPointerToWireType' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"constNoSmartPtrRawPointerToWireType")||(t.constNoSmartPtrRawPointerToWireType=function(){AA("'constNoSmartPtrRawPointerToWireType' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"nonConstNoSmartPtrRawPointerToWireType")||(t.nonConstNoSmartPtrRawPointerToWireType=function(){AA("'nonConstNoSmartPtrRawPointerToWireType' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"init_RegisteredPointer")||(t.init_RegisteredPointer=function(){AA("'init_RegisteredPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"RegisteredPointer")||(t.RegisteredPointer=function(){AA("'RegisteredPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"RegisteredPointer_getPointee")||(t.RegisteredPointer_getPointee=function(){AA("'RegisteredPointer_getPointee' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"RegisteredPointer_destructor")||(t.RegisteredPointer_destructor=function(){AA("'RegisteredPointer_destructor' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"RegisteredPointer_deleteObject")||(t.RegisteredPointer_deleteObject=function(){AA("'RegisteredPointer_deleteObject' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"RegisteredPointer_fromWireType")||(t.RegisteredPointer_fromWireType=function(){AA("'RegisteredPointer_fromWireType' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"runDestructor")||(t.runDestructor=function(){AA("'runDestructor' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"releaseClassHandle")||(t.releaseClassHandle=function(){AA("'releaseClassHandle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"finalizationGroup")||(t.finalizationGroup=function(){AA("'finalizationGroup' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"detachFinalizer_deps")||(t.detachFinalizer_deps=function(){AA("'detachFinalizer_deps' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"detachFinalizer")||(t.detachFinalizer=function(){AA("'detachFinalizer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"attachFinalizer")||(t.attachFinalizer=function(){AA("'attachFinalizer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"makeClassHandle")||(t.makeClassHandle=function(){AA("'makeClassHandle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"init_ClassHandle")||(t.init_ClassHandle=function(){AA("'init_ClassHandle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ClassHandle")||(t.ClassHandle=function(){AA("'ClassHandle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ClassHandle_isAliasOf")||(t.ClassHandle_isAliasOf=function(){AA("'ClassHandle_isAliasOf' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"throwInstanceAlreadyDeleted")||(t.throwInstanceAlreadyDeleted=function(){AA("'throwInstanceAlreadyDeleted' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ClassHandle_clone")||(t.ClassHandle_clone=function(){AA("'ClassHandle_clone' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ClassHandle_delete")||(t.ClassHandle_delete=function(){AA("'ClassHandle_delete' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"deletionQueue")||(t.deletionQueue=function(){AA("'deletionQueue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ClassHandle_isDeleted")||(t.ClassHandle_isDeleted=function(){AA("'ClassHandle_isDeleted' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ClassHandle_deleteLater")||(t.ClassHandle_deleteLater=function(){AA("'ClassHandle_deleteLater' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"flushPendingDeletes")||(t.flushPendingDeletes=function(){AA("'flushPendingDeletes' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"delayFunction")||(t.delayFunction=function(){AA("'delayFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"setDelayFunction")||(t.setDelayFunction=function(){AA("'setDelayFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"RegisteredClass")||(t.RegisteredClass=function(){AA("'RegisteredClass' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"shallowCopyInternalPointer")||(t.shallowCopyInternalPointer=function(){AA("'shallowCopyInternalPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"downcastPointer")||(t.downcastPointer=function(){AA("'downcastPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"upcastPointer")||(t.upcastPointer=function(){AA("'upcastPointer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"validateThis")||(t.validateThis=function(){AA("'validateThis' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"char_0")||(t.char_0=function(){AA("'char_0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"char_9")||(t.char_9=function(){AA("'char_9' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"makeLegalFunctionName")||(t.makeLegalFunctionName=function(){AA("'makeLegalFunctionName' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"warnOnce")||(t.warnOnce=function(){AA("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stackSave")||(t.stackSave=function(){AA("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stackRestore")||(t.stackRestore=function(){AA("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stackAlloc")||(t.stackAlloc=function(){AA("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"AsciiToString")||(t.AsciiToString=function(){AA("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stringToAscii")||(t.stringToAscii=function(){AA("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"UTF16ToString")||(t.UTF16ToString=function(){AA("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stringToUTF16")||(t.stringToUTF16=function(){AA("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"lengthBytesUTF16")||(t.lengthBytesUTF16=function(){AA("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"UTF32ToString")||(t.UTF32ToString=function(){AA("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"stringToUTF32")||(t.stringToUTF32=function(){AA("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"lengthBytesUTF32")||(t.lengthBytesUTF32=function(){AA("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"allocateUTF8")||(t.allocateUTF8=function(){AA("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"allocateUTF8OnStack")||(t.allocateUTF8OnStack=function(){AA("'allocateUTF8OnStack' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),t.writeStackCookie=se,t.checkStackCookie=Tt,Object.getOwnPropertyDescriptor(t,"intArrayFromBase64")||(t.intArrayFromBase64=function(){AA("'intArrayFromBase64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"tryParseAsDataURI")||(t.tryParseAsDataURI=function(){AA("'tryParseAsDataURI' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(t,"ALLOC_NORMAL")||Object.defineProperty(t,"ALLOC_NORMAL",{configurable:!0,get:function(){AA("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}}),Object.getOwnPropertyDescriptor(t,"ALLOC_STACK")||Object.defineProperty(t,"ALLOC_STACK",{configurable:!0,get:function(){AA("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}}),Object.getOwnPropertyDescriptor(t,"ALLOC_DYNAMIC")||Object.defineProperty(t,"ALLOC_DYNAMIC",{configurable:!0,get:function(){AA("'ALLOC_DYNAMIC' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}}),Object.getOwnPropertyDescriptor(t,"ALLOC_NONE")||Object.defineProperty(t,"ALLOC_NONE",{configurable:!0,get:function(){AA("'ALLOC_NONE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)")}});var Pe;sA=function $(){Pe||Ve(),Pe||(sA=$)};function Ve($){if(J>0||(se(),De(),J>0))return;function eA(){Pe||(Pe=!0,t.calledRun=!0,!b&&(le(),Xt(),t.onRuntimeInitialized&&t.onRuntimeInitialized(),G(!t._main,'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'),we()))}t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),eA()},1)):eA(),Tt()}if(t.run=Ve,t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return Ve(),t}let asyncLoad=async()=>new Promise((l,t)=>{let e;e=init({noExitRuntime:!0,preRun(){l(e)},quit(s){t(s)},onAbort(s){if(s instanceof Error)throw s}})}),package1={name:"geom",version:"0.0.1",description:"C++ verion of the geometry algorithm.",main:"dist/index.js",types:"dist/index.d.ts",scripts:{"install-emcc":"builder/emcc_setup.bat",build:"del /S dist && build.bat && tsc",rebuild:"del /S _output && npm run build","build-dev":"del /S _output && del /S dist && ./build/build-dev.sh && tsc"},author:"zhang.yunjian",license:"ISC",devDependencies:{math:"0.0.1","@types/node":"^14.14.13",lodash:"^4.17.20",typescript:"^3.9.6"}},wasmModule;class GeomError extends Error{constructor(t){super(t),this.message=t,Object.setPrototypeOf(this,GeomError.prototype),this.name=this.constructor.name,this.stack=new Error().stack}}const loadWasmInstanceAsync=async()=>{if(!(wasmModule instanceof Error))if(wasmModule===void 0)try{return globalThis.document||(globalThis.document={}),wasmModule=await asyncLoad(),wasmModule.package=package1,new GeomLibWrapper}catch(l){wasmModule=l,console.log(wasmModule)}else return new GeomLibWrapper;throw new GeomError("could not load native geom lib in the desired format")},getGeomInstance=()=>{if(wasmModule instanceof Error||wasmModule==null)throw"webassembly is not loaded correctly";return wasmModule},VERSION='"@sk-3d/math":"0.1.1"';exports.ArcType=ArcType;exports.Box=Box;exports.Box2=Box2;exports.Box3=Box3;exports.CONST=CONST;exports.Clipper2Util=Clipper2Util;exports.ClipperLib=clipperlib;exports.ClipperUtil=ClipperUtil;exports.Coord=Coord;exports.Curve=Curve;exports.Curve2=Curve2;exports.Curve3=Curve3;exports.CurveUtil=CurveUtil;exports.DiscreteParam=DiscreteParam;exports.EN_GEO_TYPE=EN_GEO_TYPE;exports.Euler=Euler;exports.EvolutionMap=EvolutionMap;exports.GeoElement=GeoElement;exports.Geom=Geom;exports.GeomLibWrapper=GeomLibWrapper;exports.GeomUtil=GeomUtil;exports.IntersectCurve3=IntersectCurve3;exports.Interval=Interval;exports.InvBilinear=InvBilinear;exports.Loader=Loader;exports.Log=Log;exports.MathAssert=MathAssert;exports.MathError=MathError;exports.MathErrorType=MathErrorType;exports.Matrix=Matrix;exports.MatrixUtil=matrix_util;exports.NormalUnitsConversion=NormalUnitsConversion;exports.ObjParser=ObjParser;exports.PeriodInterval=PeriodInterval;exports.Quaternion=Quaternion;exports.RegionUtil=RegionUtil;exports.SVGParser=SVGParser;exports.SolveEquationUtil=SolveEquationUtil;exports.Surface=Surface;exports.SurfaceUtil=SurfaceUtil;exports.Tol=Tol;exports.UnitType=UnitType;exports.UnitsConversion=UnitsConversion;exports.Util=Util;exports.UvUtil=UvUtil;exports.VERSION=VERSION;exports.Vec=Vec;exports.alg=index$3;exports.brep=index;exports.gaussIntegration=gaussIntegration;exports.getGeomInstance=getGeomInstance;exports.loadWasmInstanceAsync=loadWasmInstanceAsync;exports.registerGeo=registerGeo;