Ë
    œ{§j'-  ã                  óî   — d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlZdd„Zdd„Zd	„ Zdd
„Zd„ Zdd„Zdd„Zd„ Zdd„Zdd„Zdd„Zdd„Zddd„Zdd„Zedk(  r e«        yy) a  Sample trimmed STEP faces in UV and construct topology-derived face adjacency.

This is intentionally a B-Rep representation, not a tessellated bounding-box UV
patch: every UV sample is accepted only when OpenCascade's face classifier says
it lies in the trimmed face domain.
é    )ÚannotationsN)Úislice)Údefaultdict)ÚPathc                 óV   — t        t        «      j                  «       j                  d   S )Né   )r   Ú__file__ÚresolveÚparents© ó    õ   ì „ì²˜ë¦¬/brep.pyÚ_rootr      s   € œD¤›N×2Ñ2Ó4×<Ñ<¸QÑ?Ð?r   c                 ó¶   — t        j                  t         j                  «      j                  } t	        | t        j                  «       dk(  rdz  «      S dz  «      S )NÚDarwini   i   )ÚresourceÚ	getrusageÚRUSAGE_SELFÚ	ru_maxrssÚfloatÚplatformÚsystem)Úrsss    r   Ú_peak_memory_mbr      sG   € Ü
×
Ñ
œX×1Ñ1Ó
2×
<Ñ
<€CÜ�¤x§¡Ó'8¸HÒ'D˜ÑOÓPÐPÈ$ÑOÓPÐPr   c                 ó  — 	 ddl m}  ddlm} ddlm}m}m}m} ddl	m
}m} ddlm} ddlm}	 ddlm}
 dd	lm} dd
lm} ddlm} ddlm} ddlm} ddlm}m} tC        «       S # t>        $ r}tA        d«      |‚d}~ww xY w)zNDelayed imports give a useful CLI error while the optional OCP wheel installs.r   )ÚSTEPControl_Reader)ÚIFSelect_RetDone)ÚTopAbs_FACEÚTopAbs_EDGEÚ	TopAbs_INÚ	TopAbs_ON)ÚTopExpÚTopExp_Explorer)ÚTopoDS)Ú	BRepTools)ÚBRepAdaptor_Surface)ÚBRepLProp_SLProps)ÚBRepClass_FaceClassifier)Úgp_Pnt2d)ÚGProp_GProps)Ú	BRepGProp)ÚEIndexedDataMap_TopoDS_Shape_List_TopoDS_Shape_TopTools_ShapeMapHasherÚ/IndexedMap_TopoDS_Shape_TopTools_ShapeMapHasherzKOCP/cadquery-ocp is required for STEP preprocessing. Use the project .venv.N)"ÚOCP.STEPControlr   ÚOCP.IFSelectr   Ú
OCP.TopAbsr   r   r    r!   Ú
OCP.TopExpr"   r#   Ú
OCP.TopoDSr$   ÚOCP.BRepToolsr%   ÚOCP.BRepAdaptorr&   ÚOCP.BRepLPropr'   ÚOCP.BRepClassr(   ÚOCP.gpr)   Ú	OCP.GPropr*   ÚOCP.BRepGPropr+   ÚOCP.collectionsr,   r-   ÚImportErrorÚRuntimeErrorÚlocals)r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Úexcs                      r   Ú_ocpr?      sa   € ðsÝ6Ý1ßMÓMß6Ý%Ý+Ý7Ý3Ý:Ý#Ý*Ý+÷ 	[ô ‹8€Oøô ò sÜÐhÓiÐorÐrûðsús   ‚AA$ Á$	A>Á-A9Á9A>c                óF   — t        t        | j                  «       «      «      S ©N)ÚintÚhashÚTShape)Úshapes    r   Ú_shape_hashrF   3   s   € ô Œt�E—L‘L“NÓ#Ó$Ð$r   c                ó¤   — t        d„ | j                  |«      D «       «      S # t        $ r$ t        d„ | j                  |«      D «       «      cY S w xY w)Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrA   ©r   ©Ú.0Úxs     r   Ú	<genexpr>z_uv_bounds.<locals>.<genexpr>=   s   è ø€ ÐCÑ(B 1”e˜A—hÑ(Bùó   ‚c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrA   rI   rJ   s     r   rM   z_uv_bounds.<locals>.<genexpr>>   s   è ø€ Ð'SÑ:R°Q¬¨a¯Ñ:RùrN   )ÚtupleÚ
UVBounds_sÚAttributeErrorÚUVBounds)r%   Úfaces     r   Ú
_uv_boundsrU   <   sD   € ÜÑC¨	×(<Ñ(<¸TÔ(BÓCÓCÐ	CøÜÒS¤%Ñ'S¸)×:LÑ:LÈTÔ:RÓ'SÓ"SÒSÐSús   � " ¢*AÁAc                ó¨   —  |«       }| j                  ||«       t        |j	                  «       «      S # t        $ r | j                  ||«       Y Œ6w xY wrA   )ÚSurfaceProperties_srR   ÚSurfacePropertiesr   ÚMass)r+   r*   rT   Úpropss       r   Ú_surface_arear[   A   sF   € Ù‹N€EØ	×	&Ñ	& t¨UÔ	3ä�—‘“ÓÐøô ÒC˜9×6Ñ6°t¸UÖCÐCúó   ˆ3 ³AÁAc                ó¨   —  |«       }| j                  ||«       t        |j	                  «       «      S # t        $ r | j                  ||«       Y Œ6w xY wrA   )ÚLinearProperties_srR   ÚLinearPropertiesr   rY   )r+   r*   ÚedgerZ   s       r   Ú_edge_lengthra   H   sF   € Ù‹N€EØ	×	%Ñ	% d¨EÔ	2ä�—‘“ÓÐøô ÒB˜9×5Ñ5°d¸EÖBÐBúr\   c                óì   — g } |d   | |d   «      }|j                  «       rR|j                  |d   j                  |j                  «       «      «       |j	                  «        |j                  «       rŒR|S )Nr#   r   r$   )ÚMoreÚappendÚFaceÚCurrentÚNext)rE   ÚOÚoutÚexs       r   Ú_facesrk   O   sb   € Ø
€CÐ'�1Ð&Ñ'¨¨q°Ñ/?Ó@ˆbØ
�'‰'Œ)Ø�
‰
�1�X‘;×#Ñ# B§J¡J£LÓ1Ô2°B·G±G´Ið �'‰'�)à€Jr   c           
     ór  —  |d   «       }|d   j                  | |d   |d   |«        |d   «       }|d   j                  | |d   |«       g }d}d}t        d|j                  «       dz   «      D �]  }|d   j	                  |j                  |«      «      }	|j                  |«      }
t        t        |
|
j                  «       «      D �ch c]4  }d|j                  |«      cxk  r|k  sŒn n|j                  |«      dz
  ’Œ6 c}«      }t        |«      dk(  r|dz  }Œ­t        |«      d	k  rŒ¼t        |«      d	kD  r|dz  }t        |d
   |d   |	«      }t        |«      D ]+  \  }}||dz   d D ]  }|j                  |||f|||ff«       Œ Œ- �Œ |r%t        j                   |t        j"                  ¬«      n$t        j$                  dt        j"                  ¬«      }|dd…dd	…f   j&                  j)                  t        j*                  «      |dd…d	d…f   j)                  t        j,                  «      ||fS c c}w )uH   Kernel indexed edgeâ†’face map: O(E+F), no geometric or O(FÂ²) matching.r,   r"   r   r   r-   r   r   r$   é   r+   r*   N©Údtype)r   é   rp   )ÚMapShapesAndAncestors_sÚMapShapes_sÚrangeÚExtentÚEdgeÚFindKeyÚFindFromIndexÚsortedr   ÚLengthÚ	FindIndexÚlenra   Ú	enumerateÚextendÚnpÚasarrayÚfloat64ÚemptyÚTÚastypeÚint32Úfloat32)rE   Ú
face_countrh   Úedge_mapÚface_mapÚpairsÚboundaryÚnonmanifoldÚir`   Ú	ancestorsrT   ÚownersÚlengthÚoiÚaÚbÚarrs                     r   Ú_face_adjacencyr”   V   s=  € àYˆqÐXÑYÓ[€HØ€h�K×'Ñ'¨¨q°Ñ/?ÀÀ=ÑAQÐS[Ô\ØCˆqÐBÑCÓE€HØ€h�K×Ñ˜E 1 ]Ñ#3°XÔ>Ø*,€E¸¨hÈ!¸KÜ�1�h—o‘oÓ'¨Ñ)×*ˆØ�‰{×Ñ × 0Ñ 0°Ó 3Ó4ˆØ×*Ñ*¨1Ó-ˆ	ô ÄÀyÐR[×RbÑRbÓRdÔ@eó  UÑ@e¸ÐijÐmu×mÑmð  AEó  nFô  jTð  JTö  jT˜×+Ñ+¨DÓ1°!Ó3Ð@eñ  Uó  Vˆô ˆv‹;˜!Ò˜X¨™]˜X¨HÜˆv‹;˜Š?˜HÜˆv‹;˜Š?˜K¨1Ñ,˜KÜ˜a ™n¨a°Ñ.?ÀÓFˆô ˜vÖ&‰EˆB�Ø˜B˜q™D˜E“]� E§L¡L°1°a¸°.À1ÀaÈÀ.Ð1QÕ$R‘]ò 'ð +ñ  27Œ"�*‰*�U¤"§*¡*Õ
-¼B¿H¹HÀVÔSU×S]ÑS]Ô<^€CØ’�2�A�2�‰J�L‰L×Ñ¤§¡Ó)¨3ªq°!°A°#¨v©;×+=Ñ+=¼b¿j¹jÓ+IÈ8ÐU`ÐaÐaùò Us   ÃH4
Ã'H4
c                ór   — t        | j                  «       «      j                  dd«      S # t        $ r Y yw xY w)NÚGeomAbs_Ú Úunknown)ÚstrÚGetTypeÚreplaceÚ	Exception)Úsurfaces    r   Ú_kindrž   q   s.   € Ü�G—O‘OÓ%Ó&×.Ñ.¨z¸2Ó>Ð	>øÜÒ&™YÐ&ús   �(* ª	6µ6c                óP  — t        |d   | «      \  }}}}t        j                  |||«      t        j                  |||«      }}t        j                  ||dft        j                  «      }	t        j
                  |	«      }
t        j                  ||dft        j                  «      }t        j                  ||ft        «      }t        j                  ||ft        «      }t        j                  ||ft        «      } |d   | d«      }t        |«      D �]l  \  }}t        |«      D �]W  \  }} |d   |  |d   t        |«      t        |«      «      d«      }|j                  «       |d   |d	   fvrŒK	  |d
   |t        |«      t        |«      dd«      }|j                  «       }t        j                  |j                  «       |j                  «       |j                  «       gt        j                  ¬«      }t        j                   |«      j#                  «       sŒó||	||f<   d|||f<   |j%                  «       rº|j'                  «       }t        j                  |j                  «       |j                  «       |j                  «       gt        j                  ¬«      }t        j(                  j+                  |«      }|dkD  r4t        j                   |«      j#                  «       r||z  |
||f<   d|||f<   |j-                  «       r}t        |j/                  «       «      t        |j1                  «       «      }}t        j                   ||g«      j#                  «       r&t3        |«      t3        |«      ||z  f|||f<   d|||f<   �ŒZ �Œo |	|
||||||||ft7        |«      fS # t4        $ r Y �Œ�w xY w)Nr%   rp   r&   Tr(   r)   gH¯¼šò×z>r    r!   r'   rm   g:Œ0âŽyE>rn   gê-�™—q=)rU   r~   ÚlinspaceÚzerosr…   Ú
zeros_likeÚboolr|   r   ÚStateÚValueÚarrayÚXÚYÚZr€   ÚisfiniteÚallÚIsNormalDefinedÚNormalÚlinalgÚnormÚIsCurvatureDefinedÚMaxCurvatureÚMinCurvatureÚabsrœ   rž   )rT   Úgridrh   ÚU0ÚU1ÚV0ÚV1ÚusÚvsÚposÚnormalÚcurvÚvalidÚnormal_validÚcurvature_validr�   ÚuiÚuÚviÚvÚ
classifierrZ   ÚpÚxyzÚqÚnnÚlnÚkmaxÚkmins                                r   Ú_sample_facerÍ   v   sJ  € Ü  +¡°Ó5�N€BˆˆB�Ü�[‰[˜˜R Ó&¬¯©°B¸¸DÓ(Aˆ€BÜ
�(‰(�D˜$ �?¤B§J¡JÓ
/€C¼"¿-¹-ÈÓ:L°Ü�8‰8�T˜4 �O¤R§Z¡ZÓ0€DÜ�H‰H�d˜D�\¤4Ó(€E¼¿¹À4ÈÀ,ÔPTÓ9U¨,Ôik×iqÑiqÐswÐy}Ðr~ô  AEó  jFÐWfØ&ˆaÐ%Ñ& t¨TÓ2€GÜ˜2—‰ˆˆAÜ˜r—]‰EˆB�à6˜Ð5Ñ6°t¸]¸Q¸z¹]Ì5ÐQRË8ÔUZÐ[\ÓU]Ó=^Ð`dÓeˆJØ×ÑÓ!¨!¨K©.¸!¸K¹.Ð)IÑIÈ8ðØ.˜Ð-Ñ.¨w¼¸a»Ä%ÈÃ(ÈAÈtÓT�Ø—K‘K“M�¬¯©°1·3±3³5¸!¿#¹#»%ÀÇÁÃÐ2GÌrÏzÉzÔ)Z 3Ü—{‘{ 3Ó'×+Ñ+Ô-¨xØ!��B˜�F‘°4 5¨¨R¨¡=Ø×(Ñ(Ô*ØŸ™›�A¬R¯X©X°q·s±s³u¸a¿c¹c»eÀQÇSÁSÃUÐ6KÔSU×S]ÑS]Ô-^¨Ôeg×enÑen×esÑesÐtvÓewÐ`bØ˜E’z¤b§k¡k°"£o×&9Ñ&9Ô&;ÈbÐSUÉg¸VÀBÈÀF¹^ÐnrÐWcÐdfÐhjÐdjÑWkØ×+Ñ+Ô-Ü!& u×'9Ñ'9Ó';Ó!<¼eÀE×DVÑDVÓDXÓ>Y˜$�DÜ—{‘{ D¨$ <Ó0×4Ñ4Ô6ÌÈDË	ÔSVÐW[ÓS\Ð^bÐcgÑ^gÐGh¸¸RÀ¸V¹ð  EIÐjyÐz|ð  Að  {Añ  kBùò #ð ð& �˜˜e \°?ÀRÈÈRÐQSÐDTÔV[Ð\cÓVdÐdÐdøô ò âðús   Å/B&NÈE%NÎ	N%Î$N%c                óF  — dd l }|j                  d«       dd lm} |j	                  ddd¬«      \  }}|d   j                  | j                  d¬«      ddd¬	«       |d   j                  d
«       |d   j                  d«       |d   j                  d«       t        j                  |d¬«      \  }}	|d   j                  ||	«       |d   j                  d«       |d   j                  d«       |j                  «        |j                  |d¬«       |j                  |«       y )Nr   ÚAggr   rm   )é
   é   )Úfigsize)ÚaxisÚviridis)ÚvminÚvmaxÚcmapz(trim-valid fraction at each UV grid cellzv indexzu indexT)Úreturn_countszsurface kindsÚfacesé    )Údpi)Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotÚsubplotsÚimshowÚmeanÚ	set_titleÚ
set_xlabelÚ
set_ylabelr~   ÚuniqueÚbarhÚtight_layoutÚsavefigÚclose)
r¾   ÚkindsÚareasÚpathrÜ   ÚpltÚfigÚaxÚnamesÚcounts
             r   Ú_previewró   “   sM  € ÛØ‡N�N�5ÔÝ#Ø�l‰l˜1˜a¨ˆlÓ1�G€CˆØ€q�E‡L�L�—‘ �Ó#¨!°!¸)€LÔDÀbÈÁeÇoÁoð  WAô  GBð  DFð  GHñ  DI÷  DTñ  DTð  U^ô  D_ð  acð  deñ  af÷  aqñ  aqð  r{ô  a|Ü—9‘9˜U°$Ô7�L€Eˆ5¸¸A¹¿¹ÀEÈ5Ô9QÐSUÐVWÑSX×SbÑSbÐcrÔSsÐuwÐxyÑuz÷  vFñ  vFð  GNô  vOØ×ÑÔ˜Ÿ™ D¨c˜Ô2°C·I±I¸cµNr   c                ó>  — t        «       }t        j                  «       }|j                  dd¬«        |d   «       }|j	                  t        | «      «      |d   k7  rt        d| › �«      ‚|j                  «        |j                  «       }t        ||«      }	|�|	d | }	t        |	«      }
t        j                  |
||dft        j                  «      }t        j                  |«      }t        j                  |
||dft        j                  «      }t        j                  |
||ft        «      }|j!                  «       }|j!                  «       }t        j                  |
dft        j"                  «      }t        j                  |
t        j"                  «      }g }t%        |	«      D ]h  \  }}t'        |||«      \  }}}}}}}}|||||||f\  ||<   ||<   ||<   ||<   ||<   ||<   ||<   t)        |d   |d	   |«      ||<   |j+                  |«       Œj t-        ||
|«      \  }}} }!t        j.                  g d
¢d¬«      }"t        j0                  |dz  ||||||||j3                  t        j                  «      t        j.                  |d¬«      |"||t        j.                  dgd¬«      t        j                  |
t        ¬«      ¬«       t        | «      |
||gt5        |j7                  «       «      t5        |j7                  «       «      t5        |j7                  «       «      t9        |j:                  d   «      | |!t=        t?        |«      «      D �#ci c]  }#|#t9        |jA                  |#«      «      “Œ c}#t        j                  «       |z
  tC        «       ddddœ}$|dz  jE                  tG        jH                  |$d¬«      d¬«       |xs tK        «       dz  }|j                  dd¬«       |dz  jE                  tG        jH                  |$d¬«      d¬«       tM        ||||dz  «       |$S c c}#w )NT)r   Úexist_okr   r   zFailed to read STEP: rp   rÑ   r+   r*   )Úkmax_abs_1_per_mmÚkmin_abs_1_per_mmÚgaussian_signed_1_per_mm2z<U36rn   zfaces_uv.npzz<U32Úshared_edge_length_mm)Úpos_mmr¼   Ú	curvatureÚ
trim_validr¿   rÀ   Ú	uv_boundsÚface_area_mm2Úsurface_kindÚcurvature_feature_namesÚ
edge_indexÚ	edge_attrÚedge_feature_namesÚtraining_validr   zzOpenCascade STEP B-Rep; UV bounds followed by BRepClass_FaceClassifier trim test. Normals follow face/surface orientation.z›Principal curvature signs are stored as magnitudes because face orientation can flip sign; signed Gaussian curvature is retained and orientation invariant.z+all false: no physical labels were supplied)Úsourcer†   r´   Útrim_valid_fractionÚnormal_valid_fractionÚcurvature_valid_fractionÚface_adjacency_directed_edgesÚboundary_topological_edgesÚnonmanifold_topological_edgesÚsurface_kind_countsÚ	elapsed_sÚpeak_process_memory_mbÚ
provenanceÚcurvature_caveatr  zmetadata.jsonrm   ©ÚindentÚutf8)Úencodingúresults/brepz
index.jsonzpreview.png)'r?   ÚtimeÚperf_counterÚmkdirÚReadFiler™   Ú
ValueErrorÚTransferRootsÚOneShaperk   r{   r~   r¡   r…   r¢   r£   Úcopyr€   r|   rÍ   r[   rd   r”   r   Úsavez_compressedrƒ   r   râ   rB   rE   rx   Úsetrò   r   Ú
write_textÚjsonÚdumpsr   ró   )%Ú	step_pathÚout_dirr´   Ú	max_facesÚresults_dirrh   ÚstartedÚreaderrE   rÙ   ÚFr»   r¼   rû   r¾   r¿   rÀ   rý   rì   rë   rŒ   rT   ÚpprÉ   ÚccÚvvÚnvÚcvÚboundsÚkindr  r  rŠ   r‹   rñ   ÚkÚmetas%                                        r   Úpreparer3  �   sî  € Ü‹€Aœ$×+Ñ+Ó-�¨w¯}©}ÀTÐTX¨}Ô/YØ$ˆQÐ#Ñ$Ó&€FØ‡�”s˜9“~Ó&¨!Ð,>Ñ*?Ò?ÄzÐTiÐjsÐitÐRuÓGvÐAvØ
×ÑÔ F§O¡OÓ$5˜E¼vÀeÈQÓ?O°uØÐ e¨J¨YÐ&7˜eÜˆE‹
€AÜ
�(‰(�A�t˜T 1Ð%¤r§z¡zÓ
2€C¼R¿]¹]È3Ó=O°FÔ]_×]eÑ]eÐghÐjnÐptÐvwÐfxÔz|÷  {Eñ  {Eó  ^FÐQZÜ�H‰H�a˜˜t�_¤dÓ+€E¸E¿J¹J»L¨\Ð\a×\fÑ\fÓ\hÈ/Ôvx×v~Ñv~ð  ABð  DEð  @Fô  HJ÷  HRñ  HRó  wSÐjsô  ]_÷  ]eñ  ]eð  fgô  ik÷  isñ  isó  ]tð  UZð  IKð  v{Ü˜UÖ#‰ˆˆ4Ü/;¸DÀ$ÈÓ/JÑ,ˆˆB��B˜˜B ¨ØgiÐkmÐoqÐsuÐwyÐ{}ð  @Fð  hFÑdˆˆA‰��q‘	˜9 Q™<¨¨q©°<À±?ÀOÐTUÑDVÐXaÐbcÑXdÜ   ;¡°°>Ñ1BÀDÓIˆˆa‰È5Ï<É<ÐX\ÕK]ð $ô 4CÀ5È!ÈQÓ3OÑ0€J�	˜8 [Ü�J‰JÒ\ÐdjÔk€EÜ×Ñ˜ Ñ.°sÀ6ÐU^Ðkpð  @Lð  ^mØ"+¸5¿<¹<ÌÏ
É
Ó;SÔbd×blÑblÐmrð  {Aô  cBð  \aØ#-¸ÔWY×WaÑWaÐczÐb{ð  DJô  XKÜ')§x¡x°¼Ô'>õ@ô ˜)“n°AÀÀd¸|ÔdiÐjo×jtÑjtÓjvÓdwô  SXð  Ye÷  Yjñ  Yjó  Yló  SmÜ(-¨o×.BÑ.BÓ.DÓ(EÔhkÐlv×l|Ñl|Ð}~Ñló  iAð  aiØ-8ÔqwÔx{ð  }Bó  yCô  rDó  REñ  rDÐlmÐRSÔTWÐX]×XcÑXcÐdeÓXfÓTgÑRgð  rDñ  REô  TX÷  Teñ  Teó  Tgð  hoñ  Toô  KZó  K\ð Wð !~ØKñM€Dð ˆ_Ñ×(Ñ(¬¯©°DÀÔ)CÈfÐ(ÔUØÒ7¤£¨Ñ!7€K¸×9JÑ9JÐSWÐbfÐ9JÔ9gØ�Ñ×)Ñ)¬$¯*©*°TÀ!Ô*DÈvÐ)ÔVÔX`ÐafÐhmÐotð  wBð  CPñ  wPô  YQð  Z^ð  S^ùò REs   Í"Pc                 óŠ  — t        j                  t        ¬«      } | j                  dt        t        «       dz  ¬«       | j                  dt        t        «       dz  ¬«       | j                  dt        t        «       dz  ¬«       | j                  d	t        d
¬«       | j                  dt        d d¬«       | j                  «       }|j                  dk  r| j                  d«       t        t        j                  t        |j                  |j                  |j                  |j                   |j"                  «      d¬«      «       y )N)Údescriptionz--stepzdatas_2/AC28_DT RR UPR STD.stp)ÚtypeÚdefaultz--outzdata_processed/brepz	--resultsr  z--gridé   z--max-facesz(debug only; default processes every face)r6  r7  Úhelprm   z--grid must be at least 2r  )ÚargparseÚArgumentParserÚ__doc__Úadd_argumentr   r   rB   Ú
parse_argsr´   ÚerrorÚprintr!  r"  r3  Ústepri   r%  Úresults)rÆ   r‘   s     r   ÚmainrC  »   s¡  € Ü×Ñ¬GÔ4€A°a·n±nÀXÔTXÔbgÓbið  kKñ  cK°nô  7Lð  NO÷  N\ñ  N\ð  ]dô  koô  y~ó  y@ð  AVñ  yVð  N\ô  NWð  YZ÷  Ygñ  Ygð  hsô  z~ô  HMó  HOð  P^ñ  H^ð  Ygô  Y_ð  ab÷  aoñ  aoð  pxô  Bð  LMð  aoô  aNð  PQ÷  P^ñ  P^ð  _lô  svð  @Dð  Kuð  P^ô  PvØ‡l�lƒn€AØ‡v�v�‚z�1—7‘7Ð6Ô7Ü	Œ$�*‰*”W˜QŸV™V Q§U¡U¨A¯F©F°A·K±KÀÇÁÓKÐTUÔ
VÕWr   Ú__main__)Úreturnr   )rE  r   )rE  rB   )r†   rB   )rE  r™   )r´   rB   )
r¾   ú
np.ndarrayrë   z	list[str]rì   rF  rí   r   rE  ÚNone)r8  NN)r#  r   r$  r   r´   rB   r%  z
int | Noner&  zPath | NonerE  Údict)rE  rG  )r<  Ú
__future__r   r:  r!  r   r   r  Ú	itertoolsr   Úcollectionsr   Úpathlibr   Únumpyr~   r   r   r?   rF   rU   r[   ra   rk   r”   rž   rÍ   ró   r3  rC  Ú__name__r   r   r   Ú<module>rO     s‰   ðñõ #ã Û Û Û Û Ý Ý #Ý ã ó @óQò
ó*%òTó
óòóbó6'ó
eó:Cô^ó<Xð ˆzÒ™4�6Ðr   