Ë
    :vžj(g  ã                   óf  — d dl Z d dlZd dlmZmZ d dlmZ d dlZddl	m
Z
mZmZmZ ddlmZmZ ddlmZmZ ddlmZmZmZmZ dd	lmZ d
dlmZmZ d
dlmZmZm Z  dZ!dZ"de"› d�Z# ejH                  d«      Z%de%jL                  d<   d'd„Z'dede(fd„Z)d(d„Z*de+deejX                     fd„Z-d)dedefd„Z.d'd„Z/d*d„Z0d„ Z1d „ Z2d!„ Z3d"„ Z4d#e'iZ5	 d d$l6m7Z7 	 d d%l;m<Z< dd&l=m>Z> y# e8$ r!Z9 e
jt                  e9«      Z7e7e5d#<   Y dZ9[9Œ/dZ9[9ww xY w# e8$ r!Z9 e
jt                  e9«      Z<e<e5d#<   Y dZ9[9ydZ9[9ww xY w)+é    N)ÚdefaultdictÚdeque)Údeepcopyé   )Ú
exceptionsÚgroupingÚ	resourcesÚutil)ÚlogÚtol)Úplanar_matrixÚtransform_points)ÚIterableÚMappingÚNDArrayÚNumber)Újsonifyé   )Ú
arc_centerÚto_threepoint)ÚArcÚBezierÚLineÚtrimeshz!https://github.com/mikedh/trimeshÚ{Ú}FÚ	WRITEABLEc                 ó(  — d}d}g }g }| �êt        j                  | j                  «       t        j                  di t        ¤Ž¬«      }|j                  d«      D ](  }|j                  |j                  t        |«      f«       Œ* |j                  d«      D ]F  }|j                  |j                  j                  dd«      d   |j                  t        |«      f«       ŒH 	 |j                  t        dz      }n'|�|j                  d	|it        f«       nt        d
«      ‚t        |||¬«      }		 |�"t!        |j                  t        dz      «      |	d<   d|	v rN	 t!        |j                  t        dz      «      }
|
j)                  «       D ]  \  }}||	d   v sŒ||	d   |   d<   Œ 	 |	S |	S # t        $ r Y Œ’w xY w# t"        $ r Y Œnt        $ r t%        j&                  dd¬«       Y Œ�w xY w# t"        $ r Y |	S t        $ r t%        j&                  dd¬«       Y |	S w xY w)ad  
    Load an SVG file into a Path2D object.

    Parameters
    -----------
    file_obj : open file object
      Contains SVG data
    file_type: None
      Not used
    path_string : None or str
      If passed, parse a single path string and ignore `file_obj`.

    Returns
    -----------
    loaded : dict
      With kwargs for Path2D constructor
    N)Úparserz{*}path)z	{*}circlez{*}rectz{*}linez{*}polylinez
{*}polygonr   é   éÿÿÿÿÚclassÚdz#`file_obj` or `pathstring` required)ÚpathsÚshapesÚforceÚmetadatazfailed metadataT©Úexc_infoÚgeometryÚmetadata_geometry© )ÚetreeÚ
fromstringÚreadÚ	XMLParserÚXML_PARSER_OPTIONSÚiterÚappendÚattribÚelement_transformÚtagÚrsplitÚ_nsÚBaseExceptionÚ	_IDENTITYÚ
ValueErrorÚ_svg_path_convertÚ_decodeÚKeyErrorr   ÚdebugÚitems)Úfile_objÚ	file_typeÚpath_stringr&   Útreer$   r%   ÚelementÚshapeÚresultÚbagÚnameÚmetas                úm/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/path/exchange/svg_io.pyÚsvg_to_pathrL      s  € ð& €EØ€DØ€EØ€FØÐä×ÑØ�M‰M‹O¤E§O¡OÑ$IÔ6HÑ$Iô
ˆð
 —y‘y Ö+ˆGà�L‰L˜'Ÿ.™.Ô*;¸GÓ*DÐEÕFð ,ð
 —Y‘YØLö
ˆEð �M‰MØ—‘×!Ñ! # qÓ)¨"Ñ-¨u¯|©|Ô=NÈuÓ=UÐVõð
ð	à—K‘K¤ g¡Ñ.‰Eð 
Ð	 à�‰�s˜KÐ(¬)Ð4Õ5äÐ>Ó?Ð?ä U°6ÀÔG€Fð	4ØÐä!(¨¯©´S¸:Ñ5EÑ)FÓ!GˆF�:Ñð �VÑð	8ä˜$Ÿ+™+¤cÐ,?Ñ&?Ñ@ÓAˆCØ!Ÿi™ižk‘
��dØ˜6 *Ñ-Ò-à;?�F˜:Ñ& tÑ,¨ZÒ8ñ *ð €Mˆ6€MøôM ò 	Ùð	ûô ò áÜò 4ä�	‰	Ð#¨d×3ð4ûô ò 	àð
 €Mô	 ò 	8ä�I‰IÐ'°$Ö7à€Mð		8úsH   ÃF# Ä+$F2 Å<G" ÆG" Æ#	F/Æ.F/Æ2	GÆ=GÇGÇ"	HÇ.HÈHr4   Úreturnc                 óâ   — 	 | j                  «       D ��ci c]<  \  }}|dd  j                  t        «      r|j                  t        «      t        |«      “Œ> c}}S c c}}w # t        $ r i cY S w xY w)Nr    )r@   Ú
startswithÚ_ns_urlÚlstripr8   r=   r9   )r4   ÚkÚvs      rK   Ú_attrib_metadatarT   o   ss   € ðð Ÿ™œô
á&‘��1Ø��ˆu×Ñ¤Ô(ð �H‰H”S‹Mœ7 1›:Ñ%Ø&ò
ð 	
ùó 
øô
 ò ØŠ	ðús#   ‚A  •AAÁA  ÁA  Á A.Á-A.c                 óP  — t        «       }| }t        |«      D ]Q  }d|j                  v r-|j                  t	        |j                  d   «      ddd…   «       |j                  «       }|�ŒQ n t        |«      dk(  rt        S t        |«      dk(  r|d   S t        j                  |«      S )zà
    Find a transformation matrix for an XML element.

    Parameters
    --------------
    e : lxml.etree.Element
      Element to search upwards from.
    max_depth : int
      Maximum depth to search for transforms.
    Ú	transformNr!   r   r    )
r   Úranger4   Ú
extendleftÚtransform_to_matricesÚ	getparentÚlenr:   r
   Ú	multi_dot)rE   Ú	max_depthÚmatricesÚcurrentÚ_s        rK   r5   r5   {   s¥   € ô ‹w€Hà€GÜ�9Öˆà˜'Ÿ.™.Ñ(Ø×ÑÔ 5°g·n±nÀ[Ñ6QÓ RÑSWÐUWÐSWÑ XÔYØ×#Ñ#Ó%ˆØ‰?Ùð ô ˆ8ƒ}˜ÒäÐÜ	ˆX‹˜!Ò	Ø˜‰{Ðô �~‰~˜hÓ'Ð'ó    rV   c           
      óÀ  — | j                  «       j                  d«      D ��cg c]Z  }t        |«      dkD  rJ|j                  «       j                  d«      D �cg c]!  }t        |«      dkD  sŒ|j                  «       ‘Œ# c}‘Œ\ }}}g }|D �]ž  }t        |«      dk(  rŒt        |«      dk7  rt	        d«      ‚|\  }}t        j                  |j                  dd«      j                  «       D �cg c]  }t        |«      ‘Œ c}«      }|dk(  r0|j                  t        j                  «       «       ||d	   d
d…df<   Œ°|dk(  rB|j                  t        j                  |j                  d«      j                  g d¢f«      «       Œ÷|dk(  rLt        j                  |d   «      }	t        |«      dk(  r|dd
 }
nd
}
|j                  t!        |	|
¬«      «       �ŒH|dk(  r:t        j                  «       }|d
d…d
d…fxx   |z  cc<   |j                  |«       �Œ‡t#        j$                  d|› �«       �Œ¡ t        j                  |t
        j&                  ¬«      S c c}w c c}}w c c}w )a“  
    Convert an SVG transform string to an array of matrices.

    i.e. "rotate(-10 50 100)
          translate(-36 45.5)
          skewX(40)
          scale(1 0.5)"

    Parameters
    -----------
    transform : str
      Contains transformation information in SVG form

    Returns
    -----------
    matrices : (n, 3, 3) float
      Multiple transformation matrices from input transform string
    Ú)r   Ú(r   z"should always have two components!Ú,Ú Ú	translater!   NÚmatrix)r   r   )r   r   r    Úrotater   r    )ÚthetaÚpointÚscalezunknown SVG transform: ©Údtype)ÚlowerÚsplitr[   Ústripr;   ÚnpÚarrayÚreplaceÚfloatr3   r:   ÚcopyÚvstackÚreshapeÚTÚdegreesr   r   r?   Úfloat64)rV   ÚiÚjÚ
componentsr^   ÚlineÚkeyÚargsÚvaluesÚanglerk   Úmats               rK   rY   rY   ›   s  € ð. —‘Ó"×(Ñ(¨Ô-ôá-ˆAÜˆq‹6�AŠ:ð ŸG™G›IŸO™O¨CÔ0Ó?Ñ0�q´C¸³F¸Q³Jˆ�‰�Ð0Ó?Ø-ð ñ ð €HÜˆÜˆt‹9˜Š>ØÜ�‹Y˜!Š^ÜÐAÓBÐBØ‰	ˆˆTô —‘¨T¯\©\¸#¸sÓ-C×-IÑ-IÔ-KÓLÑ-K¨œ5 �8Ð-KÑLÓMˆØ�+Òà�O‰OœIŸN™NÓ,Ô-Ø"(ˆH�R‰L˜˜!˜˜Q˜ÒØ�HŠ_ð
 �O‰OœBŸI™I v§~¡~°fÓ'=×'?Ñ'?ÂÐ&KÓLÕMØ�HŠ_ä—J‘J˜v a™yÓ)ˆEä�6‹{˜aÒØ˜q˜r˜
‘à�Ø�O‰OœM°¸UÔCÖDØ�GŠ^ä—.‘.Ó"ˆCØ����B�Q�B�‹K˜6Ñ!‹KØ�O‰O˜CÖ ä�I‰IÐ/°¨uÐ5Ö6ðE ôH �8‰8�H¤B§J¡JÔ/Ð/ùòU 	@ùóùò Ms#   £4IÁIÁ+IÁ=IÃ+I
ÉIr$   r%   c                 ó  ‡(‡+‡,— d„ Š+ˆ,ˆ(fd„}ˆ+ˆ,ˆ(fd„}ˆ+ˆ,ˆ(fd„}ˆ+ˆ,ˆ(fd„} G d„ d«      }||||dœ}t        t        «      }	t        t        «      }
t        d	„ «      Š,| D �]ï  \  }}|j                  d
d«      }t        |«      dk(  rt	        j
                  d«       Œ=t        |j                  t        dz   «      «      Š(t        j                  t        t        |«      «      «      }t        |«      dk(  rŒ”ddddœ}t        j                  |D �cg c]'  }|j                  t        |«      j                  d«      ‘Œ) c}t        ¬«      }t        j                  |dd¬«      }t         j"                  rGt%        j&                  t        j(                  |«      t        j*                  t        |«      «      «      sJ ‚g }|D �]õ  }||   }t        ||d      «      j                  }|dv r|j-                   ||«      «       Œ@t        |«      dkD  �r–|dk(  �r�t        j                  |D �cg c]·  }|j.                  j0                  |j.                  j2                  |j4                  j0                  |j4                  j2                  |j6                  j0                  |j6                  j2                  |j8                  j0                  |j8                  j2                  |j:                  g	‘Œ¹ c}t        j<                  ¬«      }d}t        j>                  |dd…dd…f   d¬«      jA                  «       dk  rB|dd…dd…f   |dd…dd…f   }}t%        j&                  |t        jB                  |dd¬«      «      }|r d|d   _"        |j-                  |d   «       �ŒÒ|jG                  |«       �Œå|jG                  |«       �Œø tI        |¬«      }|D ]�  }t        |«      j                  }||v sŒ ||   |«      \  }} |jJ                  jM                  |«       |	‰(   j-                  |«       |
‰(   j-                  tO        | |«      «       ‰,‰(xx   t        | «      z  cc<   Œ� �Œò |D �]�  \  }!}}t        |j                  t        dz   «      «      Š(|!dk(  rZtQ        tS        |d   «      tS        |d   «      gtS        |d    «      «      }"tU        t        j*                  d!«      ‰,‰(   z   d¬"«      }#�n¾|!d#k(  rÆt        j                  |d$   |d%   gt        j<                  ¬«      }$t        j                  |d&   |d'   gt        j<                  ¬«      \  }%}&t        j                  |$|$|%dfz   |$|%|&fz   |$d|&fz   |$gt        j<                  ¬«      }"tW        t        j*                  t        |"«      «      ‰,‰(   z   ¬(«      }#�nó|!d)k(  r†t        jX                  |d*   j[                  «       j]                  d+d,«      d,t        j<                  ¬-«      j_                  d.«      }"tW        t        j*                  t        |"«      «      ‰,‰(   z   ¬(«      }#�nh|!d/k(  rÐt        jX                  |d*   j[                  «       j]                  d+d,«      d,t        j<                  ¬-«      j_                  d.«      }"|"d   |"d0   k(  ja                  «       r%t        j*                  t        |"«      «      ‰,‰(   z   }'n/t        j*                  t        |"«      dz   «      ‰,‰(   z   }'|'d   |'d0<   tW        |'¬(«      }#n“|!d1k(  rst        j                  |d2   |d3   |d4   |d5   gt        j<                  ¬«      j_                  d6«      }"tW        t        j*                  t        |"«      «      ‰,‰(   z   ¬(«      }#nt	        j
                  d7|!› d8�«       �ŒF|	‰(   j-                  |#«       |
‰(   j-                  tO        |"|«      «       ‰,‰(xx   t        |"«      z  cc<   �Œ� t        |
«      dk(  rg g d9œS |
jc                  «       D �(� ci c]!  \  }(} |(t        jd                  | «      |	|(   d9œ“Œ# })}(} t        |)«      dkD  s|d:k(  rd;|)i}*|*S tg        ti        |)jk                  «       «      «      }*|*S c c}w c c}w c c} }(w )<a  
    Convert an SVG path string into a Path2D object

    Parameters
    -------------
    paths: list of tuples
      Containing (path string, (3, 3) matrix, metadata)

    Returns
    -------------
    drawing : dict
      Kwargs for Path2D constructor
    c                 óž   — t        j                  | D �cg c]  }|j                  |j                  g‘Œ c}t         j                  ¬«      S c c}w )Nrm   )rr   rs   ÚrealÚimagr{   )r‚   r|   s     rK   Úcomplex_to_floatz+_svg_path_convert.<locals>.complex_to_floatí   s6   € Ü�x‰x±6Ó:±6¨a˜!Ÿ&™& !§&¡&Ò)°6Ñ:Ä"Ç*Á*ÔMÐMùÒ:s   ”A
c                 ó–   •— ‰‰   }|t        | j                  «      z   }t        t        j                  ||«      ¬«      | j                  fS )N©Úpoints)r[   rŒ   r   rr   Úarange)ÚmultiÚstartÚendÚcountsrI   s      €€rK   Ú
load_multiz%_svg_path_convert.<locals>.load_multið   s@   ø€ ð �t‘ˆà”c˜%Ÿ,™,Ó'Ñ'ˆäœBŸI™I e¨SÓ1Ô2°E·L±LÐAÐAra   c                 óÊ   •—  ‰| j                   | j                  d«      | j                  g«      }t        t	        j
                  d«      ‰‰   z   t        | dd«      ¬«      }||fS )Ng      à?r   ÚclosedF©rŒ   r”   )r�   rk   r�   r   rr   r�   Úgetattr)Úsvg_arcrŒ   Úarcr‰   r‘   rI   s      €€€rK   Úload_arcz#_svg_path_convert.<locals>.load_arcù   s]   ø€ á! 7§=¡=°'·-±-ÀÓ2DÀgÇkÁkÐ"RÓSˆäÜ—9‘9˜Q“< &¨¡,Ñ.ô ˜7 H¨eÓ4ô	
ˆð �Fˆ{Ðra   c                 ó¤   •—  ‰| j                   | j                  | j                  g«      }t        t	        j
                  d«      ‰‰   z   ¬«      |fS )Nr   r‹   )r�   Úcontrolr�   r   rr   r�   )Úsvg_quadraticrŒ   r‰   r‘   rI   s     €€€rK   Úload_quadraticz)_svg_path_convert.<locals>.load_quadratic  sL   ø€ á!Ø× Ñ  -×"7Ñ"7¸×9JÑ9JÐKó
ˆô œRŸY™Y q›\¨F°4©LÑ8Ô9¸6ÐAÐAra   c                 ó¸   •—  ‰| j                   | j                  | j                  | j                  g«      }t	        t        j                  d«      ‰‰   z   «      |fS )Né   )r�   Úcontrol1Úcontrol2r�   r   rr   r�   )Ú	svg_cubicrŒ   r‰   r‘   rI   s     €€€rK   Ú
load_cubicz%_svg_path_convert.<locals>.load_cubic  sP   ø€ á!Ø�_‰_˜i×0Ñ0°)×2DÑ2DÀiÇmÁmÐTó
ˆô ”b—i‘i “l V¨D¡\Ñ1Ó2°FÐ:Ð:ra   c                   ó   — e Zd Zd„ Zy)ú$_svg_path_convert.<locals>.MultiLinec                 ój  — t         j                  rt        d„ |D «       «      sJ ‚|D �cg c]  }|j                  ‘Œ }}|j	                  |d   j
                  «       t        j                  |D �cg c]  }|j                  |j                  g‘Œ c}t        j                  ¬«      | _        y c c}w c c}w )Nc              3   óJ   K  — | ]  }t        |«      j                  d v –— Œ y­w)©r   ÚCloseN)ÚtypeÚ__name__)Ú.0ÚLs     rK   Ú	<genexpr>z@_svg_path_convert.<locals>.MultiLine.__init__.<locals>.<genexpr>  s!   è ø€ ÐPÉ%ÀQœ4 ›7×+Ñ+Ð/@Ô@É%ùs   ‚!#r!   rm   )r   ÚstrictÚallr�   r3   r�   rr   rs   r‡   rˆ   r{   rŒ   )ÚselfÚlinesr­   rŒ   r|   s        rK   Ú__init__z-_svg_path_convert.<locals>.MultiLine.__init__  s†   € Ü�zŠzäÑPÉ%ÓPÔPÐPÐPá',Ó-¡u !�a—g“g uˆFÐ-à�M‰M˜% ™)Ÿ-™-Ô(äŸ(™(¹fÓ#E¹f¸ Q§V¡V¨Q¯V©VÒ$4¸fÑ#EÌRÏZÉZÔXˆD�Kùò	 .ùò $Fs   ©B+Á/B0N)r«   Ú
__module__Ú__qualname__r³   r,   ra   rK   Ú	MultiLiner¥     s   „ ó		Yra   r¶   )r   r¶   ÚCubicBezierÚQuadraticBezierc                   ó   — y)Nr   r,   r,   ra   rK   Ú<lambda>z#_svg_path_convert.<locals>.<lambda>*  s   €  ra   r#   Ú r   zempty path string!rI   r    r   )r   r©   r   rm   F)Úmin_lenÚonly_nonzeror¨   r   NrŸ   )Úaxisgü©ñÒMbP?T)r4   ÚcircleÚcxÚcyÚrr   r•   ÚrectÚxÚyÚwidthÚheightr‹   ÚpolylinerŒ   re   rf   )Úseprn   )r!   r   Úpolygonr!   r   Úx1Úy1Úx2Úy2)r   r   zunsupported SVG shape: `Ú`)ÚverticesÚentitiesÚScener*   )6r   ÚlistÚgetr[   r   r?   r=   r8   rr   rs   Ú
parse_pathrª   r«   Úintr   Úblocksr   r¯   r
   ÚallcloseÚhstackr�   r3   r�   r‡   rˆ   r�   ÚcenterÚradiusÚrotationr{   ÚptpÚmeanÚrollr”   ÚextendrT   r'   Úupdater   r   ru   r   r   r.   rq   rt   rx   r°   r@   rw   Únextr2   r‚   )-r$   r%   r&   r’   r™   r�   r£   r¶   ÚloadersrÑ   rÐ   r4   rh   rC   ÚrawÚkinds_lookupr|   Úkindsr×   ÚparsedÚbÚchunkr_   ÚaÚvertsr”   r�   r�   Úentity_metaÚ
svg_entityÚ	type_nameÚerS   ÚkindrŒ   ÚentityÚoriginÚwÚhÚindexrI   ÚgeomsÚkwargsr‰   r‘   s-                                           `  @@rK   r<   r<   Þ   sY  ú€ òNõBö
öBö;÷Yñ Yð ØØ!Ø)ñ	€Gô œ4Ó €HÜœ4Ó €HÜ™Ó#€Fä‰ˆ�à—j‘j  bÓ)ˆÜˆ{Ó˜qÒ Ü�I‰IÐ*Ô+Øô �v—z‘z¤#¨¡,Ó/Ó0ˆä�h‰h”tœJ {Ó3Ó4Ó5ˆô ˆs‹8�qŠ=Øð !"¨A°aÑ8ˆä—‘ÉÓMÉÀA˜,×*Ñ*¬4°«7×+;Ñ+;¸QÕ?ÈÑMÔUXÔYˆô —‘ °ÀÔFˆä�:Š:ä—=‘=¤§¡¨6Ó!2´B·I±I¼cÀ#»hÓ4GÔHÐHÐHð ˆÜˆAØ˜‘FˆEÜ˜3˜q ™t™9“o×.Ñ.ˆGØÐ+Ñ+à—‘™i¨Ó.Õ/Ü�Q“˜!“ ¨5Ó 0ô Ÿ™ñ "'óñ "'˜Að ŸG™GŸL™LØŸG™GŸL™LØŸE™EŸJ™JØŸE™EŸJ™JØŸH™HŸM™MØŸH™HŸM™MØŸH™HŸM™MØŸH™HŸM™MØŸJ™Jò
ð "'ñô Ÿ*™*ô�ð$ �Ü—6‘6˜%¢ 1¡2 ™,¨QÔ/×4Ñ4Ó6¸Ò=Ø!&¢q¨"¨1¨" u¡¨u²Q¸¸!¸°V©}˜3�Eô "Ÿ]™]¨5´"·'±'¸#¸qÀqÔ2IÓJ�FÙà&*�E˜!‘H”Oà—M‘M %¨¡(Ö+ð —M‘M %Ö(ð —‘˜eÖ$ð] ô` '¨fÔ5ˆó !ˆJä˜ZÓ(×1Ñ1ˆIØ˜GÒ#à)�w˜yÑ)¨*Ó5‘��1Ø—
‘
×!Ñ! +Ô.à˜‘×%Ñ% aÔ(à˜‘×%Ñ%Ô&6°q¸&Ó&AÔBØ�t“¤ A£Ñ&”ò !ðg  ôB !'Ñˆˆf�fä�v—z‘z¤#¨¡,Ó/Ó0ˆà�8ÒÜ"Ü�v˜d‘|Ó$¤e¨F°4©LÓ&9Ð:¼EÀ&ÈÁ+Ó<NóˆFô ¤§	¡	¨!£¨v°d©|Ñ ;ÀDÔIŠFà�VŠ^ä—X‘X˜v c™{¨F°3©KÐ8ÄÇ
Á
ÔKˆFÜ—8‘8˜V G™_¨f°XÑ.>Ð?ÄrÇzÁzÔR‰DˆAˆqä—X‘XØ˜ 1 a &™¨&°A°q°6©/¸6ÀQÈÀF¹?ÈFÐSÜ—j‘jôˆFô ¤§¡¬3¨v«;Ó!7¸&À¹,Ñ!FÔGŠFà�ZÒÜ—]‘]Ø�xÑ ×&Ñ&Ó(×0Ñ0°°cÓ:ÀÌ2Ï:É:ôç‰g�gÓð ô ¤§¡¬3¨v«;Ó!7¸&À¹,Ñ!FÔGŠFà�YÒÜ—]‘]Ø�xÑ ×&Ñ&Ó(×0Ñ0°°cÓ:ÀÌ2Ï:É:ôç‰g�gÓð ð �q‘	˜V B™ZÑ'×,Ñ,Ô.ÜŸ	™	¤# f£+Ó.°¸±Ñ=‘äŸ	™	¤# f£+°¡/Ó2°V¸D±\ÑA�Ø! !™H��b‘	ä Ô'‰Fà�VŠ^Ü—X‘XØ˜‘˜v d™|¨V°D©\¸6À$¹<ÐHÔPR×PZÑPZôç‰g�f‹oð ô ¤§¡¬3¨v«;Ó!7¸&À¹,Ñ!FÔG‰Fä�I‰IÐ0°°°aÐ8Ô9Ùà�‰×Ñ˜fÔ%Ø�‰×ÑÔ.¨v°vÓ>Ô?Øˆt‹œ˜F›Ñ#�ðk !'ôn ˆ8ƒ}˜ÒØ¨BÑ/Ð/ð  —~‘~Ô'ôá'‰GˆD�!ð 	œ2Ÿ9™9 Q›<°X¸d±^ÑDÑDØ'ð 
ñ ô ˆ5ƒz�A‚~˜ 'Ò)Ø˜eÐ$ˆð
 €Mô ”d˜5Ÿ<™<›>Ó*Ó+ˆà€Mùòc Nùò.ùó`s   Ä,a1
È B<a6à&a;c                 ó  ‡‡‡‡‡‡— |€d}|j                  «       Šdt        |«      › d�}dj                  d|«      Šdj                  d|«      Šdj                  d|«      Šdj                  d|«      Šd	t        d
t        dt        fd„Šˆˆˆˆfd„}ˆˆˆfd„}g }| D ]l  }	|�|	j
                  |vrŒ|	j                  j                  dk(  r	 ||	«      }
n ||	«      }
t        |	j                  «      }|�||d<   |j                  ||
f«       Œn |S )a„  
    Convert the entities of a path to path strings.

    Parameters
    ------------
    entities : (n,) list
      Entity objects
    vertices : (m, 2) float
      Vertices entities reference
    name : any
      Trimesh namespace name to assign to entity
    digits : int
      Number of digits to format exports into
    only_layers : set
      Only export these layers if passed
    é   z0.ÚfzKM {x:DI},{y:DI}a{r:DI},{r:DI},0,1,0,{d:DI},0a{r:DI},{r:DI},0,1,0,-{d:DI},0ZÚDIzM{:DI},{:DI}zL{:DI},{:DI}z6M{SX:DI} {SY:DI}A{R},{R} 0 {L:d},{S:d} {EX:DI},{EY:DI}rê   rè   rM   c                 ó0   — | d   |d   z  | d   |d   z  z
  S )zD
        Numpy 2.0 depreciated cross products of 2D arrays.
        r   r    r,   )rê   rè   s     rK   Ú	_cross_2dz#_entities_to_str.<locals>._cross_2dù  s'   € ð �‰t�a˜‘d‰{˜Q˜q™T A a¡D™[Ñ(Ð(ra   c           	      ó¢  •— ‰| j                      }t        |dd¬«      }|j                  |j                  |j                  }}}| j
                  r!‰j                  |d   |z
  |d   |d|z  ¬«      S |\  }}}t        |t        j                  kD  «      }	t         ‰||z
  ||z
  «      dkD  «      }
‰j                  |d   |d   |	|
|d   |d   |¬	«      S )
z¬
        arc string: (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
        large-arc-flag: greater than 180 degrees
        sweep flag: direction (cw/ccw)
        FT)Úreturn_normalÚreturn_angler   r    g       @)rÄ   rÅ   rÂ   r#   g        )ÚSXÚSYr­   ÚSÚEXÚEYÚR)
rŒ   r   rÚ   rÛ   Úspanr”   ÚformatrÖ   rr   Úpi)r˜   rÐ   ÚinfoÚCr  rƒ   Úvertex_startÚ
vertex_midÚ
vertex_endÚ
large_flagÚ
sweep_flagrý   rŒ   Útemp_arcÚtemp_circles              €€€€rK   r—   z!_entities_to_str.<locals>.svg_arcÿ  sé   ø€ ð ˜#Ÿ*™*Ñ%ˆÜ˜(°%ÀdÔKˆØ—k‘k 4§;¡;°·	±	ˆeˆ1ˆØ�:Š:Ø×%Ñ%¨¨!©¨q©°A°a±D¸AÀÀqÁÐ%ÓIÐIà/7Ñ,ˆ�j *Ü˜¤§¡™Ó'ˆ
ÜÙ�j <Ñ/°¸lÑ1JÓKÈcÑQó
ˆ
ð �‰Ø˜A‰Ø˜A‰ØØØ˜!‰}Ø˜!‰}Øð ó 
ð 	
ra   c                 ó¤   •— | j                  ‰«      }t        |«      dk(  ry ‰‰t        |«      dz
  z  z   j                  |j                  d«      Ž S )za
        Use an entities discrete representation to export a
        curve as a polyline
        r   r»   r    r!   )Údiscreter[   r  rx   )rñ   r  rŒ   Ú	temp_lineÚ	temp_moves     €€€rK   Úsvg_discretez&_entities_to_str.<locals>.svg_discrete  sX   ø€ ð
 —?‘? 6Ó*ˆäˆx‹=˜AÒØàE�	˜Y¬#¨h«-¸!Ñ*;Ñ<Ñ=×EÑEØ×Ñ˜bÓ!ð
ð 	
ra   r   rI   )rv   rÖ   rt   r   r   ÚlayerÚ	__class__r«   r   r'   r3   )rÑ   rÐ   rI   ÚdigitsÚonly_layersÚtemp_digitsr—   r  Úpairsrñ   rC   rJ   rý   rŒ   r  r  r  r  s               @@@@@@rK   Ú_entities_to_strr  Ô  s'  ý€ ð" €~Øˆà�]‰]‹_€Fð ”s˜6“{�m 1Ð%€Kð 	[ß�gˆd�KÓ ð ð ×&Ñ& t¨[Ó9€Ià×&Ñ& t¨[Ó9€IàG×OÑOØˆkó€Hð)”Wð )¤ð )¬Vó )÷
ö6
ð €EãˆØÐ" v§|¡|¸;Ñ'FØà×Ñ×$Ñ$¨Ò-á! &›/‰Kñ ' vÓ.ˆKÜ˜Ÿ™Ó(ˆØÐØˆD�‰LØ�‰�d˜KÐ(Õ)ð ð €Lra   c           
      ó�  — dt        | «      j                  i}t        j                  | d«      rœg }i }| j                  j                  «       D ]^  \  }}	t        j                  |	d«      sŒ|	j                  ||<   |j                  t        |	j                  |	j                  |||¬«      «       Œ` t        |«      dkD  rTt        |«      |d<   nEt        j                  | d«      r$t        | j                  | j                  ||¬«      }nt        d«      ‚|rd	j                  d
„ |D «       «      S t        j                   d«      }
g }|D ]&  \  }}|j#                  d|› dt%        |«      › d�«       Œ( d|v rt'        |d   «      }n| j(                  j+                  «       dz  }	 t        | j                  «      |d<   dj                  |«      | j2                  d   d   | j2                  d   d   | j(                  d   | j(                  d   |t%        |«      dœ} |
j4                  di |¤ŽS # t,        $ r t/        j0                  dd¬«       Y Œ�w xY w)a»  
    Export a Path2D object into an SVG file.

    Parameters
    -----------
    drawing : Path2D
     Source geometry
    return_path : bool
      If True return only path string not wrapped in XML
    only_layers : None or set
      If passed only export the specified layers
    digits : None or int
      Number of digits for floating point values

    Returns
    -----------
    as_svg : str
      XML formatted SVG, or path string
    r"   rÒ   ÚPath2D)rÑ   rÐ   rI   r  r  r   r+   )rÑ   rÐ   r  r  z'drawing must be Scene or Path2D object!rf   c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r    Nr,   )r¬   rS   s     rK   r®   zexport_svg.<locals>.<genexpr>u  s   è ø€ Ð,¡e ˜˜!�¡eùs   ‚ztemplates/base.svgz	<path d="z" z/>Ústroke_widthg      ‰@r'   zfailed to encodeTr(   Ú
r    )ÚelementsÚmin_xÚmin_yrÆ   rÇ   r"  Úattribsr,   )rª   r«   r
   Úis_instance_namedr*   r@   r'   rà   r  rÑ   rÐ   r[   Ú_encoder;   Újoinr	   Ú
get_stringr3   Ú_format_attribru   ÚextentsÚmaxr9   r   r?   Úboundsr  )ÚdrawingÚreturn_pathr  r  r÷   r'  r  Ú	geom_metarI   ÚgeomÚtemplate_svgr$  rJ   rC   r"  Úsubss                   rK   Ú
export_svgr6  <  s:  € ð* œ˜W›×.Ñ.Ð/€Gä×Ñ˜g wÔ/ØˆØˆ	Ø!×*Ñ*×0Ñ0Ö2‰JˆD�$Ü×)Ñ)¨$°Ô9ØØ"Ÿm™mˆI�d‰Oà�L‰LÜ Ø!Ÿ]™]Ø!Ÿ]™]ØØ!Ø +ôõð 3ô ˆy‹>˜AÒô ,3°9Ó+=ˆGÐ'Ò(Ü	×	Ñ	 ¨Ô	2Ü Ø×%Ñ%Ø×%Ñ%ØØ#ô	
‰ô ÐBÓCÐCñ Ø�x‰xÑ,¡eÓ,Ó,Ð,ô ×'Ñ'Ð(<Ó=€Là€HÛ"Ñˆˆkà�‰˜) K =°´>À$Ó3GÐ2HÈÐKÕLð #ð
 ˜ÑÜ˜V NÑ3Ó4‰ð —‘×*Ñ*Ó,¨uÑ4ˆð5ä% g×&6Ñ&6Ó7ˆ�
Ñð —I‘I˜hÓ'Ø—‘ Ñ" 1Ñ%Ø—‘ Ñ" 1Ñ%Ø—‘ Ñ#Ø—/‘/ !Ñ$Ø$Ü! 'Ó*ñ€Dð ˆ<×ÑÑ& Ñ&Ð&øô ò 5ä�	‰	Ð$¨t×4ð5ús   ÆH" È" IÉIc                 ó²   — | j                  «       D ��ci c]  \  }}|t        |«      “Œ }}}dj                  d„ |j                  «       D «       «      S c c}}w )z„
    Format attribs into the trimesh namespace.

    Parameters
    -----------
    attrib : dict
      Bag of keys and values.
    r#  c              3   ó|   K  — | ]4  \  }}t        |«      d kD  r!|�t        |«      d kD  rt        › d|› d|› d�–— Œ6 y­w)r   NÚ:z="Ú")r[   Ú_ns_name)r¬   rR   rS   s      rK   r®   z!_format_attrib.<locals>.<genexpr>¢  sH   è ø€ ð á‰DˆAˆqÜˆq‹6�AŠ:˜!˜-¬C°«F°QªJô ˆ*�A�a�S˜˜1˜#˜QÔÙùs   ‚:<)r@   r)  r*  )r4   rR   rS   rH   s       rK   r,  r,  ˜  sS   € ð &,§\¡\¤^Ô
4¡^™T˜Q ˆ1Œg�a‹j‰= ^€CÑ
4Ø�9‰9ñ à—I‘I”Kóó ð ùó 5s   ”Ac                 ó~  — t        | t        «      rd| vr| S t        j                  t	        | j                  «       D ��ci c]  \  }}|j                  d«      rŒ||“Œ c}}d¬«      j                  d«      «      }dt        j                  |«      z   }t        j                  rt        | t        |«      «       |S c c}}w )zÈ
    Wangle things into a string.

    Parameters
    -----------
    stuff : dict, str
      Thing to pack

    Returns
    ------------
    encoded : str
      Packaged into url-safe b64 string
    r:  r`   )re   r9  )Ú
separatorsúutf-8úbase64,)Ú
isinstanceÚstrÚbase64Úurlsafe_b64encoder   r@   rO   Úencoder
   Údecode_textr   r¯   Ú
_deep_samer=   )ÚstuffrR   rS   ÚpackrG   s        rK   r)  r)  ©  s¢   € ô �%œÔ #¨UÑ"2ØˆÜ×#Ñ#ÜØ#Ÿk™kœmÔE™m‘d�a˜°1·<±<ÀÕ3DˆQ�‰T˜mÒEØ!ô	
÷ ‰&�‹/ó	€Dð œ×)Ñ)¨$Ó/Ñ/€FÜ
‡z‚zä�5œ' &›/Ô*à€Mùó Fs   ¾B9ÁB9c                 ó  — t        | t        j                  «      r"t        |t        t        j                  f«      s;J ‚t        | t        «      rt        |t        «      sJ ‚t        | t        |«      «      sJ ‚t        | t        t        f«      r| |k(  sJ ‚yt        | t        t        t        j                  f«      rt        j                  | |«      sJ ‚yt        | t        «      r:t        | «      t        |«      k(  sJ ‚t        | |«      D ]  \  }}t        ||«       Œ yt        | t        «      sJ ‚t        | j                  «       «      t        |j                  «       «      k(  sJ ‚| j                  «       D ]  }t        | |   ||   «       Œ y)aR  
    Do a recursive comparison of two items to check
    our encoding scheme in unit tests.

    Parameters
    -----------
    original : str, bytes, list, dict
      Original item
    other : str, bytes, list, dict
      Item that should be identical

    Raises
    ------------
    AssertionError
      If items are not the same.
    N)r@  rr   ÚndarrayrÓ   rA  rª   Úbytesru   rÖ   rØ   r[   ÚziprF  ÚdictÚsetÚkeys)ÚoriginalÚotherrê   rè   rR   s        rK   rF  rF  Ç  sD  € ô& �(œBŸJ™JÔ'Ü˜%¤$¬¯
©
Ð!3Ô4Ð4Ð4Ü	�HœcÔ	"Ü˜%¤Ô%Ð%Ð%ô ˜(¤D¨£KÔ0Ð0Ð0ä�(œS¤%˜LÔ)à˜5Ò Ð Ð ØÜ	�Hœu¤c¬2¯:©:Ð6Ô	7ô �{‰{˜8 UÔ+Ð+Ð+ØÜ	�HœdÔ	#ä�8‹}¤ E£
Ò*Ð*Ð*ä˜ %Ö(‰DˆAˆqÜ�q˜!Õð )àô �h¤Ô%Ð%Ð%ô ˆx�}‰}‹Ó¤3 u§z¡z£|Ó#4Ò4Ð4Ð4à�]‰]Ž_ˆÜ�8˜A‘;  a¡Õ)ñ ra   c                 óê   — | €yt        j                  | «      }|j                  d«      rIt        j                  t        j                  |dd j                  d«      «      j                  d«      «      S |S )z½
    Decode a base64 bag of stuff.

    Parameters
    ------------
    bag : str
      Starts with `base64,`

    Returns
    -------------
    loaded : dict
      Loaded bag of stuff
    Nr?  é   r>  )	r
   rE  rO   ÚjsonÚloadsrB  Úurlsafe_b64decoderD  Údecode)rH   Útexts     rK   r=   r=   ý  sh   € ð €{ØÜ×Ñ˜CÓ €DØ‡��yÔ!Ü�z‰zÜ×$Ñ$ T¨!¨" X§_¡_°WÓ%=Ó>×EÑEÀgÓNó
ð 	
ð €Kra   Úsvg)rÕ   )r-   )r1   )NNN)é
   )N)FNN)?rB  rT  Úcollectionsr   r   rv   r   Únumpyrr   r»   r   r   r	   r
   Ú	constantsr   r   Útransformationsr   r   Útypedr   r   r   r   r   r˜   r   r   rÑ   r   r   r   r;  rP   r8   Úeyer:   ÚflagsrL   rM  rT   r5   rA  r{   rY   r<   r  r6  r,  r)  rF  r=   Ú_svg_loadersÚsvg.pathrÕ   r9   ÚEÚExceptionWrapperÚlxmlr-   Úexchange.commonr1   r,   ra   rK   Ú<module>rh     sa  ðÛ Û ß *Ý ã ç 5Ó 5ß !ß >ß 7Ó 7Ý ß +ß (Ñ (ð €Ø
-€Ø
ˆ7ˆ)�2Ð€àˆB�F‰F�1‹I€	Ø$€	‡��Ñ óSðl	˜Wð 	¨ó 	ó(ð@@0 Sð @0¨W°R·Z±ZÑ-@ó @0ñFs˜Xð s¨xó sóleóPY'òxò"ò<3*òlð0 �{Ð#€ð%å#ð Ýæ5øð ò %ð -�×,Ñ,¨QÓ/€JØ$€L�Öûð	%ûð ò  ð (ˆJ×'Ñ'¨Ó*€EØ€L�Öûð	 ús0   ÃC! ÃD
 Ã!DÃ&DÄDÄ
D0ÄD+Ä+D0