ó
    oñ:i¸°  ã                   ó
  • S r SSKJrJrJr  SSKJr  SSKrSSKJ	r	   SSK
r
\
R                  rSr\	" S/ S	Q5      r/ S
QrSUS jrS r\
R*                  " \
R,                  5      \
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  S9\
R.                  " \
R,                  \
R,                  \
R,                  S9S 5       5       5       r\
R*                  " \
R,                  5      \
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  S9\
R.                  " \
R,                  \
R,                  S9SUS j5       5       5       rSrSr\
R:                  \
R<                  \
R*                  " \
R,                  5      \
R.                  " \
R0                  \
R0                  S9S 5       5       5       5       r\
R:                  \
R<                  \
R*                  " \
R,                  5      \
R.                  " \
R,                  S9S 5       5       5       5       r S r!\
R*                  " \
R,                  5      \
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  S9\
R.                  " \
R,                  \
R,                  \
R,                  \
R,                  \
R,                  \
R,                  \
R,                  S9S 5       5       5       r"S r#\
R*                  " \
R,                  5      \
R.                  " \
R0                  \
R0                  \
R0                  S9\
R.                  " \
R,                  \
R,                  \
R,                  S9S  5       5       5       r$S! r%S" r&\
R*                  " \
R,                  5      \
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  S9\
R.                  " \
R,                  \
R,                  \
R,                  \
R,                  \
R,                  S#9S$ 5       5       5       r'S% r(S& r)S' r*S( r+S) r,S* r-\
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  S+9S, 5       r.\
R*                  " \
R0                  5      \
R.                  " \
R,                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  S-9\
R.                  " \
R,                  \
R,                  \
R,                  \
R,                  S.9S/ 5       5       5       r/S0 r0S1 r1\
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  \
R,                  \
R,                  \
R,                  \
R,                  \
R,                  \
R0                  \
R0                  \
R0                  \
R0                  S29S3 5       r2SS4KJ3r3J4r4J5r5J6r6  \34S5 jr7S6 r8S7 r9S8 r:\
R:                  \
R<                  \
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  S99S: 5       5       5       r;S; r<S< r=\
R:                  \
R<                  \
R.                  " \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  \
R0                  S=9S> 5       5       5       r>S? r?S@ r@SA rA\
R*                  " \
R0                  5      \
R.                  " \
R,                  \
R0                  \
R0                  \
R0                  \
R0                  SB9\
R.                  " \
R,                  \
R,                  \
R,                  SC9SD 5       5       5       rBSE rCSF rDSG rESH rFSI rGSJ rHSK rISL rJSM rK SVSN jrLSO rMSP rNSQ rOSR rPSS rQ\RST:X  a4  SSKSrSSSKTrT\SRª                  " \TR¬                  " 5       R®                  5        gg! \\4 a
    SSKJ
r
   GN_f = f)WzNfontTools.misc.bezierTools.py -- tools for working with Bezier path segments.
é    )Ú
calcBoundsÚsectRectÚrectArea)ÚIdentityN)Ú
namedtuple)Úcythong•Ö&è.>ÚIntersection©ÚptÚt1Út2)ÚapproximateCubicArcLengthÚapproximateCubicArcLengthCÚapproximateQuadraticArcLengthÚapproximateQuadraticArcLengthCÚcalcCubicArcLengthÚcalcCubicArcLengthCÚcalcQuadraticArcLengthÚcalcQuadraticArcLengthCÚcalcCubicBoundsÚcalcQuadraticBoundsÚ	splitLineÚsplitQuadraticÚ
splitCubicÚsplitQuadraticAtTÚsplitCubicAtTÚsplitCubicAtTCÚsplitCubicIntoTwoAtTCÚsolveQuadraticÚ
solveCubicÚquadraticPointAtTÚcubicPointAtTÚcubicPointAtTCÚlinePointAtTÚsegmentPointAtTÚlineLineIntersectionsÚcurveLineIntersectionsÚcurveCurveIntersectionsÚsegmentSegmentIntersectionsc                 óP   • [        [        U 6 [        U6 [        U6 [        U6 U5      $ )a   Calculates the arc length for a cubic Bezier segment.

Whereas :func:`approximateCubicArcLength` approximates the length, this
function calculates it by "measuring", recursively dividing the curve
until the divided segments are shorter than ``tolerance``.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as 2D tuples.
    tolerance: Controls the precision of the calcuation.

Returns:
    Arc length value.
)r   Úcomplex)Úpt1Úpt2Úpt3Úpt4Ú	tolerances        Ú]/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/fontTools/misc/bezierTools.pyr   r   8   s,   € ô Ü�ˆ”w �}¤g¨s m´W¸c°]ÀIóð ó    c                 óp   • U SX-   -  -   U-   S-  nX2-   U-
  U -
  S-  nX U-   S-  XE-
  U4XDU-   X#-   S-  U44$ )Né   g      À?ç      à?© )Úp0Úp1Úp2Úp3ÚmidÚderiv3s         r1   Ú_split_cubic_into_twor=   K   sc   € Ø��R‘W‘Ñ Ñ" eÑ
+€CØ‰g˜‰l˜RÑ 5Ñ(€Fà	�2‰g˜‰_˜c™l¨CÐ0Ø	�F‰l˜R™W¨™O¨RÐ0ðð r2   )r7   r8   r9   r:   )ÚmultÚarchÚboxc                 óè   • [        X-
  5      n[        X-
  5      [        X#-
  5      -   [        X4-
  5      -   nXP-  [        -   U:¼  a  XV-   S-  $ [        XX45      u  px[        U /UQ76 [        U /UQ76 -   $ ©Nr5   )ÚabsÚEPSILONr=   Ú_calcCubicArcLengthCRecurse)	r>   r7   r8   r9   r:   r?   r@   ÚoneÚtwos	            r1   rE   rE   T   s„   € ô ˆr‰w‹<€DÜ
ˆb‰g‹,œ˜R™W›Ñ
%¬¨B©G«Ñ
4€CØ�{”WÑ Ó#Ø‘
˜cÑ!Ð!ä(¨°Ó8‰ˆÜ*¨4Ð6°#Ò6Ô9TØð:
Øò:
ñ 
ð 	
r2   ©r,   r-   r.   r/   )r0   r>   c                 ó,   • SSU-  -   n[        XPXU5      $ )zÜCalculates the arc length for a cubic Bezier segment.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as complex numbers.
    tolerance: Controls the precision of the calcuation.

Returns:
    Arc length value.
ç      ð?g      ø?)rE   )r,   r-   r.   r/   r0   r>   s         r1   r   r   h   s!   € ð* ��y‘Ñ €DÜ& t°#¸CÓ@Ð@r2   é   g»½×Ùß|Û=©Úv1Úv2c                 ó:   • XR                  5       -  R                  $ ©N)Ú	conjugateÚrealrL   s     r1   Ú_dotrS   …   s   € ð
 —‘“Ñ×%Ñ%Ð%r2   ©Úxc                 óz   • U [         R                  " U S-  S-   5      -  S-  [         R                  " U 5      S-  -   $ )Né   é   )ÚmathÚsqrtÚasinhrT   s    r1   Ú_intSecAtanr\   �   s7   € ð Œt�yŠy˜˜A™ ™Ó"Ñ" QÑ&¬¯ª°A«¸Ñ):Ñ:Ð:r2   c                 ó@   • [        [        U 6 [        U6 [        U6 5      $ )a6  Calculates the arc length for a quadratic Bezier segment.

Args:
    pt1: Start point of the Bezier as 2D tuple.
    pt2: Handle point of the Bezier as 2D tuple.
    pt3: End point of the Bezier as 2D tuple.

Returns:
    Arc length value.

Example::

    >>> calcQuadraticArcLength((0, 0), (0, 0), (0, 0)) # empty segment
    0.0
    >>> calcQuadraticArcLength((0, 0), (50, 0), (80, 0)) # collinear points
    80.0
    >>> calcQuadraticArcLength((0, 0), (0, 50), (0, 80)) # collinear points vertical
    80.0
    >>> calcQuadraticArcLength((0, 0), (50, 20), (100, 40)) # collinear points
    107.70329614269008
    >>> calcQuadraticArcLength((0, 0), (0, 100), (100, 0))
    154.02976155645263
    >>> calcQuadraticArcLength((0, 0), (0, 50), (100, 0))
    120.21581243984076
    >>> calcQuadraticArcLength((0, 0), (50, -10), (80, 50))
    102.53273816445825
    >>> calcQuadraticArcLength((0, 0), (40, 0), (-40, 0)) # collinear points, control point outside
    66.66666666666667
    >>> calcQuadraticArcLength((0, 0), (40, 0), (0, 0)) # collinear points, looping back
    40.0
)r   r+   ©r,   r-   r.   s      r1   r   r   —   s    € ô@ #¤7¨C =´'¸3°-ÄÈ#ÀÓOÐOr2   )r,   r-   r.   Úd0Úd1ÚdÚn)ÚscaleÚorigDistÚaÚbÚx0Úx1ÚLenc                 ó²  • X-
  nX!-
  nXC-
  nUS-  n[        U5      nUS:X  a  [        X -
  5      $ [        Xc5      n[        U5      [        :  a?  [        X45      S:¼  a  [        X -
  5      $ [        U5      [        U5      p©X™-  Xª-  -   Xš-   -  $ [        XS5      U-  n[        XT5      U-  n[        S[        U5      [        U5      -
  -  U-  X|U-
  -  -  5      nU$ )a  Calculates the arc length for a quadratic Bezier segment.

Args:
    pt1: Start point of the Bezier as a complex number.
    pt2: Handle point of the Bezier as a complex number.
    pt3: End point of the Bezier as a complex number.

Returns:
    Arc length value.
y              ð?ç        r   rW   )rC   rS   Úepsilonr\   )r,   r-   r.   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   s                 r1   r   r   º   sß   € ð@ 
‰€BØ	‰€BØ
‰€AØ	ˆB‰€AÜ�‹F€EØ�ƒ|Ü�3‘9‹~ÐÜ�A‹{€HÜ
ˆ8ƒ}”wÓÜ�‹<˜1ÓÜ�s‘y“>Ð!Ü�2‹wœ˜B›ˆ1Ø‘˜™‘ !¡%Ñ(Ð(Ü	ˆa‹�xÑ	€BÜ	ˆa‹�xÑ	€BÜ
ˆa”;˜r“?¤[°£_Ñ4Ñ5¸Ñ@ÀEÐRTÉWÑDUÑVÓ
W€CØ€Jr2   c                 ó@   • [        [        U 6 [        U6 [        U6 5      $ )a‡  Calculates the arc length for a quadratic Bezier segment.

Uses Gauss-Legendre quadrature for a branch-free approximation.
See :func:`calcQuadraticArcLength` for a slower but more accurate result.

Args:
    pt1: Start point of the Bezier as 2D tuple.
    pt2: Handle point of the Bezier as 2D tuple.
    pt3: End point of the Bezier as 2D tuple.

Returns:
    Approximate arc length value.
)r   r+   r^   s      r1   r   r   í   s    € ô *¬'°3¨-¼À#¸ÌÐQTÈÓVÐVr2   r^   )Úv0rM   rN   c                 ó˜   • [        SU -  SU-  -   SU-  -   5      n[        X -
  5      S-  n[        SU -  SU-  -
  SU-  -   5      nX4-   U-   $ )aŸ  Calculates the arc length for a quadratic Bezier segment.

Uses Gauss-Legendre quadrature for a branch-free approximation.
See :func:`calcQuadraticArcLength` for a slower but more accurate result.

Args:
    pt1: Start point of the Bezier as a complex number.
    pt2: Handle point of the Bezier as a complex number.
    pt3: End point of the Bezier as a complex number.

Returns:
    Approximate arc length value.
gÌ”xùbŒß¿g¾ðb�ŠÛ?gF�V¨W°?gÇqÇqÜ?gF�V¨W°¿gÌ”xùbŒß?©rC   )r,   r-   r.   rn   rM   rN   s         r1   r   r   þ   sx   € ôB 
Ø˜SÑ Ð#4°sÑ#:Ñ:Ð=OÐRUÑ=UÑUó
€Bô 
ˆS‰Y‹Ð,Ñ	,€BÜ	Ø˜cÑ!Ð$5¸Ñ$;Ñ;Ð>OÐRUÑ>UÑUó
€Bð ‰7�R‰<Ðr2   c                 ó^  • [        XU5      u  u  p4u  pVu  pxUS-  n	US-  n
/ nU	S:w  a  UR                  U* U	-  5        U
S:w  a  UR                  U* U
-  5        U Vs/ s H4  nSUs=::  a  S:  d  M  O  M  X<-  U-  X\-  -   U-   XL-  U-  Xl-  -   U-   4PM6     snX/-   n[        U5      $ s  snf )aî  Calculates the bounding rectangle for a quadratic Bezier segment.

Args:
    pt1: Start point of the Bezier as a 2D tuple.
    pt2: Handle point of the Bezier as a 2D tuple.
    pt3: End point of the Bezier as a 2D tuple.

Returns:
    A four-item tuple representing the bounding rectangle ``(xMin, yMin, xMax, yMax)``.

Example::

    >>> calcQuadraticBounds((0, 0), (50, 100), (100, 0))
    (0, 0, 100, 50.0)
    >>> calcQuadraticBounds((0, 0), (100, 0), (100, 100))
    (0.0, 0.0, 100, 100)
ç       @r   rX   )ÚcalcQuadraticParametersÚappendr   )r,   r-   r.   ÚaxÚayÚbxÚbyÚcxÚcyÚax2Úay2ÚrootsÚtÚpointss                 r1   r   r   *  sá   € ô$ $;¸3ÀSÓ#IÑ �H€R‰hˆr™˜Ø
ˆs‰(€CØ
ˆs‰(€CØ€EØ
ˆaƒxØ�‰�b�S˜3‘YÔØ
ˆaƒxØ�‰�b�S˜3‘YÔñ óâˆAØ��:�A‰:ó 	=áñ 	=ˆ‰�!‰�b‘fÑ	˜rÑ	! 2¡6¨A¡:°±Ñ#6¸Ñ#;Ó<Ùñð 
ˆ
ñ	€Fô
 �fÓÐùòs   ÁB*Á2B*Á6"B*c                 óN   • [        [        U 6 [        U6 [        U6 [        U6 5      $ )af  Approximates the arc length for a cubic Bezier segment.

Uses Gauss-Lobatto quadrature with n=5 points to approximate arc length.
See :func:`calcCubicArcLength` for a slower but more accurate result.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as 2D tuples.

Returns:
    Arc length value.

Example::

    >>> approximateCubicArcLength((0, 0), (25, 100), (75, 100), (100, 0))
    190.04332968932817
    >>> approximateCubicArcLength((0, 0), (50, 0), (100, 50), (100, 100))
    154.8852074945903
    >>> approximateCubicArcLength((0, 0), (50, 0), (100, 0), (150, 0)) # line; exact result should be 150.
    149.99999999999991
    >>> approximateCubicArcLength((0, 0), (50, 0), (100, 0), (-50, 0)) # cusp; exact result should be 150.
    136.9267662156362
    >>> approximateCubicArcLength((0, 0), (50, 0), (100, -50), (-50, 0)) # cusp
    154.80848416537057
)r   r+   rH   s       r1   r   r   L  s*   € ô2 &Ü�ˆ”w �}¤g¨s m´W¸c°]óð r2   )rn   rM   rN   Úv3Úv4c                 ó  • [        X-
  5      S-  n[        SU -  SU-  -   SU-  -   SU-  -   5      n[        X0-
  U-   U-
  5      S-  n[        SU -  SU-  -
  SU-  -
  SU-  -   5      n[        X2-
  5      S-  nXE-   U-   U-   U-   $ )	z¥Approximates the arc length for a cubic Bezier segment.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as complex numbers.

Returns:
    Arc length value.
g333333Ã?g�c’‰1ãá¿g8Ø5$t×Ô?guÁ|Yù¿Ê?gæâ#$ï˜?gÑ?gæâ#$ï˜¿g�c’‰1ãá?rp   )	r,   r-   r.   r/   rn   rM   rN   r�   r‚   s	            r1   r   r   j  sÏ   € ô> 
ˆS‰Y‹˜$Ñ	€BÜ	Ø˜SÑ Ø
˜cÑ
!ñ	"à
˜cÑ
!ñ	"ð ˜cÑ
!ñ	"ó
€Bô 
ˆS‰Y˜‰_˜sÑ"Ó	#Ð&9Ñ	9€BÜ	Ø˜SÑ Ø
˜cÑ
!ñ	"à
˜cÑ
!ñ	"ð ˜cÑ
!ñ	"ó
€Bô 
ˆS‰Y‹˜$Ñ	€Bà‰7�R‰<˜"Ñ˜rÑ!Ð!r2   c                 óô  • [        XX#5      u  u  pEu  pgu  p‰u  p«US-  nUS-  nUS-  nUS-  n[        XÎU5       Vs/ s H  nSUs=::  a  S:  d  M  O  M  UPM     nn[        XßU	5       Vs/ s H  nSUs=::  a  S:  d  M  O  M  UPM     nnUU-   nU Vs/ s H=  nUU-  U-  U-  UU-  U-  -   UU-  -   U
-   UU-  U-  U-  UU-  U-  -   U	U-  -   U-   4PM?     snX/-   n[        U5      $ s  snf s  snf s  snf )a(  Calculates the bounding rectangle for a quadratic Bezier segment.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as 2D tuples.

Returns:
    A four-item tuple representing the bounding rectangle ``(xMin, yMin, xMax, yMax)``.

Example::

    >>> calcCubicBounds((0, 0), (25, 100), (75, 100), (100, 0))
    (0, 0, 100, 75.0)
    >>> calcCubicBounds((0, 0), (50, 0), (100, 50), (100, 100))
    (0.0, 0.0, 100, 100)
    >>> print("%f %f %f %f" % calcCubicBounds((50, 0), (0, 100), (100, 100), (50, 0)))
    35.566243 0.000000 64.433757 75.000000
ç      @rr   r   rX   )ÚcalcCubicParametersr   r   )r,   r-   r.   r/   ru   rv   rw   rx   ry   rz   ÚdxÚdyÚax3Úay3Úbx2Úby2r~   ÚxRootsÚyRootsr}   r   s                        r1   r   r   œ  sE  € ô$ .AÀÈ3Ó-TÑ*�H€R‰hˆr™˜¡( 2à
ˆs‰(€CØ
ˆs‰(€CØ
ˆs‰(€CØ
ˆs‰(€CÜ'¨°"Ô5ÓDÒ5�A¸¸a½À!¹‹a¹�aÑ5€FÐDÜ'¨°"Ô5ÓDÒ5�A¸¸a½À!¹‹a¹�aÑ5€FÐDØ�V‰O€Eñ óò
 ˆAð �‰F�Q‰J˜‰N˜R !™V a™ZÑ'¨"¨q©&Ñ0°2Ñ5Ø�‰F�Q‰J˜‰N˜R !™V a™ZÑ'¨"¨q©&Ñ0°2Ñ5ó	
ñ ñð 
ˆ
ñ€Fô �fÓÐùò EùÚDùòs*   ¼C+ÁC+ÁC+Á+C0Â C0ÂC0ÂAC5c                 ó²   • U u  pEUu  pgXd-
  nXu-
  n	Un
UnX‰4U   nUS:X  a  X4/$ X*U4U   -
  U-  nSUs=::  a  S:  a  O  OX�-  U
-   X�-  U-   4nX4Xá4/$ X4/$ )a•  Split a line at a given coordinate.

Args:
    pt1: Start point of line as 2D tuple.
    pt2: End point of line as 2D tuple.
    where: Position at which to split the line.
    isHorizontal: Direction of the ray splitting the line. If true,
        ``where`` is interpreted as a Y coordinate; if false, then
        ``where`` is interpreted as an X coordinate.

Returns:
    A list of two line segments (each line segment being two 2D tuples)
    if the line was successfully split, or a list containing the original
    line.

Example::

    >>> printSegments(splitLine((0, 0), (100, 100), 50, True))
    ((0, 0), (50, 50))
    ((50, 50), (100, 100))
    >>> printSegments(splitLine((0, 0), (100, 100), 100, True))
    ((0, 0), (100, 100))
    >>> printSegments(splitLine((0, 0), (100, 100), 0, True))
    ((0, 0), (0, 0))
    ((0, 0), (100, 100))
    >>> printSegments(splitLine((0, 0), (100, 100), 0, False))
    ((0, 0), (0, 0))
    ((0, 0), (100, 100))
    >>> printSegments(splitLine((100, 0), (0, 0), 50, False))
    ((100, 0), (50, 0))
    ((50, 0), (0, 0))
    >>> printSegments(splitLine((0, 100), (0, 0), 50, True))
    ((0, 100), (0, 50))
    ((0, 50), (0, 0))
r   rX   r6   )r,   r-   ÚwhereÚisHorizontalÚpt1xÚpt1yÚpt2xÚpt2yru   rv   rw   rx   re   r~   ÚmidPts                  r1   r   r   Â  s˜   € ðH �J€DØ�J€Dà	‰€BØ	‰€Bà	€BØ	€Bà	ˆ�Ñ€AàˆAƒvØ�
ˆ|ÐØ	�b�˜,Ñ'Ñ	'¨1Ñ,€AØˆA…z�†zØ‘˜‘˜R™V b™[Ð(ˆØ�˜u˜lÐ+Ð+à�
ˆ|Ðr2   c                 ó¢   • [        XU5      u  pVn[        XT   Xd   Xt   U-
  5      n[        S U 5       5      nU(       d  XU4/$ [        XVU/UQ76 $ )a¡  Split a quadratic Bezier curve at a given coordinate.

Args:
    pt1,pt2,pt3: Control points of the Bezier as 2D tuples.
    where: Position at which to split the curve.
    isHorizontal: Direction of the ray splitting the curve. If true,
        ``where`` is interpreted as a Y coordinate; if false, then
        ``where`` is interpreted as an X coordinate.

Returns:
    A list of two curve segments (each curve segment being three 2D tuples)
    if the curve was successfully split, or a list containing the original
    curve.

Example::

    >>> printSegments(splitQuadratic((0, 0), (50, 100), (100, 0), 150, False))
    ((0, 0), (50, 100), (100, 0))
    >>> printSegments(splitQuadratic((0, 0), (50, 100), (100, 0), 50, False))
    ((0, 0), (25, 50), (50, 50))
    ((50, 50), (75, 50), (100, 0))
    >>> printSegments(splitQuadratic((0, 0), (50, 100), (100, 0), 25, False))
    ((0, 0), (12.5, 25), (25, 37.5))
    ((25, 37.5), (62.5, 75), (100, 0))
    >>> printSegments(splitQuadratic((0, 0), (50, 100), (100, 0), 25, True))
    ((0, 0), (7.32233, 14.6447), (14.6447, 25))
    ((14.6447, 25), (50, 75), (85.3553, 25))
    ((85.3553, 25), (92.6777, 14.6447), (100, -7.10543e-15))
    >>> # XXX I'm not at all sure if the following behavior is desirable:
    >>> printSegments(splitQuadratic((0, 0), (50, 100), (100, 0), 50, True))
    ((0, 0), (25, 50), (50, 50))
    ((50, 50), (50, 50), (50, 50))
    ((50, 50), (75, 50), (100, 0))
c              3   óL   #   • U  H  nS Us=::  a  S:  d  M  O  M  Uv •  M     g7f©r   rX   Nr6   ©Ú.0r~   s     r1   Ú	<genexpr>Ú!splitQuadratic.<locals>.<genexpr>"  ó   é € Ð:¢)˜Q¨q°A­z¸©z“q©z—q¢)ùó   ‚$—$›	$)rs   r   ÚsortedÚ_splitQuadraticAtT)	r,   r-   r.   r�   r‘   re   rf   ÚcÚ	solutionss	            r1   r   r   û  se   € ôF & c°Ó4�G€Aˆ!ÜØ	‰˜™¨!©/¸EÑ*Aó€Iô Ñ:¡)Ó:Ó:€IÞØ˜3�Ð Ð Ü˜a AÐ2¨	Ò2Ð2r2   c                 ó¨   • [        XX#5      u  pgp‰[        Xe   Xu   X…   X•   U-
  5      n
[        S U
 5       5      n
U
(       d  XX#4/$ [        XgX‰/U
Q76 $ )aŠ  Split a cubic Bezier curve at a given coordinate.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as 2D tuples.
    where: Position at which to split the curve.
    isHorizontal: Direction of the ray splitting the curve. If true,
        ``where`` is interpreted as a Y coordinate; if false, then
        ``where`` is interpreted as an X coordinate.

Returns:
    A list of two curve segments (each curve segment being four 2D tuples)
    if the curve was successfully split, or a list containing the original
    curve.

Example::

    >>> printSegments(splitCubic((0, 0), (25, 100), (75, 100), (100, 0), 150, False))
    ((0, 0), (25, 100), (75, 100), (100, 0))
    >>> printSegments(splitCubic((0, 0), (25, 100), (75, 100), (100, 0), 50, False))
    ((0, 0), (12.5, 50), (31.25, 75), (50, 75))
    ((50, 75), (68.75, 75), (87.5, 50), (100, 0))
    >>> printSegments(splitCubic((0, 0), (25, 100), (75, 100), (100, 0), 25, True))
    ((0, 0), (2.29379, 9.17517), (4.79804, 17.5085), (7.47414, 25))
    ((7.47414, 25), (31.2886, 91.6667), (68.7114, 91.6667), (92.5259, 25))
    ((92.5259, 25), (95.202, 17.5085), (97.7062, 9.17517), (100, 1.77636e-15))
c              3   óL   #   • U  H  nS Us=::  a  S:  d  M  O  M  Uv •  M     g7fr™   r6   rš   s     r1   rœ   ÚsplitCubic.<locals>.<genexpr>G  rž   rŸ   )r†   r    r    Ú_splitCubicAtT)r,   r-   r.   r/   r�   r‘   re   rf   r¢   ra   r£   s              r1   r   r   (  si   € ô6 % S¨sÓ8�J€Aˆ!ÜØ	‰˜™¨!©/¸1¹?ÈUÑ;Ró€Iô Ñ:¡)Ó:Ó:€IÞØ˜3Ð$Ð%Ð%Ü˜! Ð1 yÒ1Ð1r2   c                 ó:   • [        XU5      u  pEn[        XEU/UQ76 $ )a]  Split a quadratic Bezier curve at one or more values of t.

Args:
    pt1,pt2,pt3: Control points of the Bezier as 2D tuples.
    *ts: Positions at which to split the curve.

Returns:
    A list of curve segments (each curve segment being three 2D tuples).

Examples::

    >>> printSegments(splitQuadraticAtT((0, 0), (50, 100), (100, 0), 0.5))
    ((0, 0), (25, 50), (50, 50))
    ((50, 50), (75, 50), (100, 0))
    >>> printSegments(splitQuadraticAtT((0, 0), (50, 100), (100, 0), 0.5, 0.75))
    ((0, 0), (25, 50), (50, 50))
    ((50, 50), (62.5, 50), (75, 37.5))
    ((75, 37.5), (87.5, 25), (100, 0))
)rs   r¡   )r,   r-   r.   Útsre   rf   r¢   s          r1   r   r   M  s&   € ô( & c°Ó4�G€Aˆ!Ü˜a AÐ+¨Ò+Ð+r2   c                 ó|   • [        XX#5      u  pVpx[        XVXx/UQ76 n	U /U	S   SS Q7U	S'   / U	S   SS QUP7U	S'   U	$ )aÈ  Split a cubic Bezier curve at one or more values of t.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as 2D tuples.
    *ts: Positions at which to split the curve.

Returns:
    A list of curve segments (each curve segment being four 2D tuples).

Examples::

    >>> printSegments(splitCubicAtT((0, 0), (25, 100), (75, 100), (100, 0), 0.5))
    ((0, 0), (12.5, 50), (31.25, 75), (50, 75))
    ((50, 75), (68.75, 75), (87.5, 50), (100, 0))
    >>> printSegments(splitCubicAtT((0, 0), (25, 100), (75, 100), (100, 0), 0.5, 0.75))
    ((0, 0), (12.5, 50), (31.25, 75), (50, 75))
    ((50, 75), (59.375, 75), (68.75, 68.75), (77.3438, 56.25))
    ((77.3438, 56.25), (85.9375, 43.75), (93.75, 25), (100, 0))
r   rX   Néÿÿÿÿ)r†   r§   )
r,   r-   r.   r/   r©   re   rf   r¢   ra   Úsplits
             r1   r   r   e  sd   € ô( % S¨sÓ8�J€Aˆ!Ü˜1 Ð+¨Ò+€Eð
 Ð#�e˜A‘h˜q˜r�lÑ#€Eˆ!�HØ&�%˜‘)˜C˜R�.Ð& #Ñ&€Eˆ"�IØ€Lr2   )r,   r-   r.   r/   re   rf   r¢   ra   c              '   óX   #   • [        XX#5      u  pVpx[        XVXx/UQ76  Sh  v•N   g N7f)a  Split a cubic Bezier curve at one or more values of t.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as complex numbers..
    *ts: Positions at which to split the curve.

Yields:
    Curve segments (each curve segment being four complex numbers).
N)ÚcalcCubicParametersCÚ_splitCubicAtTC)	r,   r-   r.   r/   r©   re   rf   r¢   ra   s	            r1   r   r   „  s,   é € ô( & c°Ó9�J€Aˆ!Ü˜q QÐ/¨BÒ/×/Ó/ùs   ‚ *¢(£*)r~   r,   r-   r.   r/   ÚpointAtTÚoff1Úoff2)r   Ú_1_tÚ_1_t_2Ú_2_t_1_tc                 óà   • XD-  nSU-
  nXf-  nSU-  U-  nXv-  U -  SXt-  U-  Xe-  U-  -   -  -   XT-  U-  -   n	Xp-  X�-  -   XR-  -   n
Xq-  X‚-  -   XS-  -   nXU -
  U-  -   nX2U-
  U-  -   nXX©4X›X#44$ )zøSplit a cubic Bezier curve at t.

Args:
    pt1,pt2,pt3,pt4: Control points of the Bezier as complex numbers.
    t: Position at which to split the curve.

Returns:
    A tuple of two curve segments (each curve segment being four complex numbers).
rX   rW   r4   r6   )r,   r-   r.   r/   r~   r   r³   r´   rµ   r°   r±   r²   s               r1   r   r   œ  sÁ   € ð0 
‰€BØˆq‰5€DØ‰[€FØ�1‰u�t‰|€Hà‰˜Ñ˜a 6¡:°Ñ#3°d±iÀ#±oÑ#EÑFÑFÈÉÐRUÉÑUð ð ‰<˜(™.Ñ(¨2©8Ñ3€DØ‰<˜(™.Ñ(¨2©8Ñ3€Dà
�s‘˜a‘Ñ
€CØ
�s‘˜dÑ"Ñ
"€Cà�tÐ&¨¸Ð(BÐCÐCr2   c                 óº  • [        U5      n/ nUR                  SS5        UR                  S5        U u  pVUu  pxUu  pš[        [	        U5      S-
  5       Hƒ  nX;   nX;S-      nXÜ-
  nXî-  nX_-  nXo-  nSU-  U-  U-   U-  nSU-  U-  U-   U-  nXÌ-  nUU-  X|-  -   U	-   nUU-  XŒ-  -   U
-   n[        UU4UU4UU45      u  nnnUR                  UUU45        M…     U$ )Nr   rk   rJ   rX   rW   )ÚlistÚinsertrt   ÚrangeÚlenÚcalcQuadraticPoints)re   rf   r¢   r©   Úsegmentsru   rv   rw   rx   ry   rz   Úir   r   ÚdeltaÚdelta_2Úa1xÚa1yÚb1xÚb1yÚt1_2Úc1xÚc1yr,   r-   r.   s                             r1   r¡   r¡   Ä  s  € Ü	ˆb‹€BØ€HØ‡I�Iˆa�ÔØ‡I�Iˆc„NØ�F€BØ�F€BØ�F€BÜ”3�r“7˜Q‘;ÖˆØ‰UˆØ�A‘‰YˆØ‘ˆà‘-ˆØ‰lˆØ‰lˆØ�2‰v˜‰{˜RÑ 5Ñ(ˆØ�2‰v˜‰{˜RÑ 5Ñ(ˆØ‰wˆØ�4‰i˜"™'Ñ! BÑ&ˆØ�4‰i˜"™'Ñ! BÑ&ˆä+¨S°#¨J¸¸c¸
ÀSÈ#ÀJÓO‰ˆˆS�#Ø�‰˜˜c 3˜Ö(ñ  ð  €Or2   c                 ó\  • [        U5      nUR                  SS5        UR                  S5        / nU u  pgUu  p‰Uu  p«Uu  pÍ[        [	        U5      S-
  5       HÐ  nXN   nXNS-      nUU-
  nUU-  nUU-  nXÿ-  nUU-  nUU-  nUU-  nSU-  U-  U-   U-  nSU-  U-  U	-   U-  nSU-  U-  U
-   SU-  U-  -   U-  nSU	-  U-  U-   SU-  U-  -   U-  nUU-  UU-  -   X¯-  -   U-   nUU-  U	U-  -   X¿-  -   U-   n[        UU4UU4UU4UU45      u  nnn n!UR                  UUU U!45        MÒ     U$ ©Nr   rk   rJ   rX   r4   rW   )r¸   r¹   rt   rº   r»   ÚcalcCubicPoints)"re   rf   r¢   ra   r©   r½   ru   rv   rw   rx   ry   rz   r‡   rˆ   r¾   r   r   r¿   rÀ   Údelta_3rÅ   Út1_3rÁ   rÂ   rÃ   rÄ   rÆ   rÇ   Úd1xÚd1yr,   r-   r.   r/   s"                                     r1   r§   r§   ß  s©  € Ü	ˆb‹€BØ‡I�Iˆa�ÔØ‡I�Iˆc„NØ€HØ�F€BØ�F€BØ�F€BØ�F€BÜ”3�r“7˜Q‘;ÖˆØ‰UˆØ�A‘‰YˆØ�R‘ˆà˜%‘-ˆØ˜'‘/ˆØ‰wˆØ�D‰yˆð �7‰lˆØ�7‰lˆØ�2‰v˜‰{˜RÑ 7Ñ*ˆØ�2‰v˜‰{˜RÑ 7Ñ*ˆØ�2‰v˜‰{˜RÑ ! b¡&¨4¡-Ñ/°5Ñ8ˆØ�2‰v˜‰{˜RÑ ! b¡&¨4¡-Ñ/°5Ñ8ˆØ�4‰i˜"˜t™)Ñ# b¡gÑ-°Ñ2ˆØ�4‰i˜"˜t™)Ñ# b¡gÑ-°Ñ2ˆÜ,Ø�#ˆJ˜˜c˜
 S¨# J°°c°
ó
ÑˆˆS�#�sð 	�‰˜˜c 3¨Ð,Ö-ñ-  ð. €Or2   )re   rf   r¢   ra   r   r   r¿   rÀ   rË   Úa1Úb1Úc1r`   c              '   óŠ  #   • [        U5      nUR                  SS5        UR                  S5        [        [	        U5      S-
  5       Hv  nXE   nXES-      nXv-
  nXˆ-  n	X‰-  n
Xf-  nXk-  nX
-  nSU -  U-  U-   U	-  nSU-  U-  U-   SU -  U-  -   U-  nX-  X-  -   X&-  -   U-   n[        XÞUU5      u  nnnnUUUU4v •  Mx     g 7frÉ   )r¸   r¹   rt   rº   r»   ÚcalcCubicPointsC)re   rf   r¢   ra   r©   r¾   r   r   r¿   rÀ   rË   rÅ   rÌ   rÏ   rÐ   rÑ   r`   r,   r-   r.   r/   s                        r1   r¯   r¯     s÷   é € ô  
ˆb‹€BØ‡I�Iˆa�ÔØ‡I�Iˆc„NÜ”3�r“7˜Q‘;ÖˆØ‰UˆØ�A‘‰YˆØ‘ˆà‘-ˆØ‘/ˆØ‰wˆØ‰yˆð ‰[ˆØ�!‰e�b‰j˜1‰n Ñ'ˆØ�!‰e�b‰j˜1‰n˜q 1™u t™|Ñ+¨uÑ4ˆØ‰X˜™Ñ  1¡6Ñ)¨AÑ-ˆÜ-¨b°b¸"Ó=ÑˆˆS�#�sØ�C˜˜cÐ"Ô"ò!  ùs   ‚CC)rZ   ÚacosÚcosÚpic                 óÜ   • [        U 5      [        :  a!  [        U5      [        :  a  / nU$ U* U-  /n U$ X-  SU -  U-  -
  nUS:¼  a"  U" U5      nU* U-   S-  U -  U* U-
  S-  U -  /nU$ / nU$ )u'  Solve a quadratic equation.

Solves *a*x*x + b*x + c = 0* where a, b and c are real.

Args:
    a: coefficient of *xÂ²*
    b: coefficient of *x*
    c: constant term

Returns:
    A list of roots. Note that the returned list is neither guaranteed to
    be sorted nor to contain unique values!
ç      @rk   rr   ©rC   rl   )re   rf   r¢   rZ   r}   ÚDDÚrDDs          r1   r   r   /  s¡   € ô ˆ1ƒv”ÓÜˆq‹6”GÓàˆEð €Lð �R˜!‘V�H‰Eð €Lð ‰U�S˜1‘W˜q‘[Ñ ˆØ�‹9Ù�r“(ˆCØ�b˜3‘h #Ñ%¨Ñ)¨Q¨B°©H¸Ñ+;¸aÑ+?Ð@ˆEð €Lð ˆEØ€Lr2   c           
      ó  • [        U 5      [        :  a  [        XU5      $ [        U 5      n X-  nX -  nX0-  nXD-  SU-  -
  S-  nSU-  U-  U-  SU-  U-  -
  SU-  -   S-  nXˆ-  n	Xw-  U-  n
U	[        :  a  SOU	n	[        U
5      [        :  a  SOU
n
Xš-
  nU	S:X  a  U
S:X  a  [	        U* S-  [
        5      nXÌU/$ U[        S-  ::  Gay  [        [        [        U[        U
5      -  S	5      S
5      5      nS[        U5      -  nUS-  nU[        US-  5      -  U-
  nU[        US[        -  -   S-  5      -  U-
  nU[        US[        -  -   S-  5      -  U-
  n[        UUU/5      u  nnnUU-
  [        :  a+  UU-
  [        :  a  [	        UU-   U-   S-  [
        5      =n=nnOœUU-
  [        :  a)  [	        UU-   S-  [
        5      =nn[	        U[
        5      nOfUU-
  [        :  a)  [	        U[
        5      n[	        UU-   S-  [
        5      =nnO0[	        U[
        5      n[	        U[
        5      n[	        U[
        5      nUUU/$ [        [        U5      [        U5      -   S5      nXÇU-  -   nUS:¼  a  U* n[	        XÄS-  -
  [
        5      nU/$ )u  Solve a cubic equation.

Solves *a*x*x*x + b*x*x + c*x + d = 0* where a, b, c and d are real.

Args:
    a: coefficient of *xÂ³*
    b: coefficient of *xÂ²*
    c: coefficient of *x*
    d: constant term

Returns:
    A list of roots. Note that the returned list is neither guaranteed to
    be sorted nor to contain unique values!

Examples::

    >>> solveCubic(1, 1, -6, 0)
    [-3.0, -0.0, 2.0]
    >>> solveCubic(-10.0, -9.0, 48.0, -29.0)
    [-2.9, 1.0, 1.0]
    >>> solveCubic(-9.875, -9.0, 47.625, -28.75)
    [-2.911392, 1.0, 1.0]
    >>> solveCubic(1.0, -4.5, 6.75, -3.375)
    [1.5, 1.5, 1.5]
    >>> solveCubic(-12.0, 18.0, -9.0, 1.50023651123)
    [0.5, 0.5, 0.5]
    >>> solveCubic(
    ...     9.0, 0.0, 0.0, -7.62939453125e-05
    ... ) == [-0.0, -0.0, -0.0]
    True
r…   g      "@rr   g      ;@g      K@r   rk   r5   rJ   g      ð¿g       ÀrØ   çUUUUUUÕ?)rC   rl   r   ÚfloatÚroundÚepsilonDigitsrÔ   ÚmaxÚminrZ   rÕ   rÖ   r    Úpow)re   rf   r¢   ra   rÏ   Úa2Úa3ÚQÚRÚR2ÚQ3ÚR2_Q3rU   ÚthetaÚrQ2Úa1_3rg   rh   Úx2s                      r1   r    r    P  s¬  € ôL ˆ1ƒv”Óô ˜a AÓ&Ð&Üˆa‹€AØ	
‰€BØ	
‰€BØ	
‰€Bà	‰�3˜‘8Ñ	˜sÑ"€AØ	ˆr‰�B‰˜Ñ	˜c B™h¨™mÑ	+¨d°R©iÑ	7¸4Ñ?€Aà	
‰€BØ	
‰�‰€BØ”7‹l‰ €BÜ�"‹gœÓ‰ R€Bà‰G€Eà	ˆSƒy�R˜3“YÜ�2�#˜‘)œ]Ó+ˆØ�aˆyÐØ	”'˜C‘-Ô	ä”Sœ˜Q¤ b£™\¨3Ó/°Ó6Ó7ˆØ”T˜!“W‰nˆØ�C‰xˆØ”3�u˜s‘{Ó#Ñ# dÑ*ˆØ”3˜ ¤b¡Ñ(¨CÑ/Ó0Ñ0°4Ñ7ˆØ”3˜ ¤b¡Ñ(¨CÑ/Ó0Ñ0°4Ñ7ˆÜ˜R  R˜LÓ)‰
ˆˆB�à�‰7”WÓ  b¡¬7Ó!2Ü  " r¡'¨B¡,°#Ñ!5´}ÓEÐEˆBÐE�‘bØ�"‰W”wÓÜ˜R "™W¨™O¬]Ó;Ð;ˆB�Ü�rœ=Ó)‰BØ�"‰W”wÓÜ�rœ=Ó)ˆBÜ˜R "™W¨™O¬]Ó;Ð;ˆB‘ä�rœ=Ó)ˆBÜ�rœ=Ó)ˆBÜ�rœ=Ó)ˆBØ�B˜ˆ|Ðä”�U“œc !›fÑ$ gÓ.ˆØ�A‘‰IˆØ�‹8Ø�ˆAÜ�!˜3‘h‘,¤Ó.ˆØˆsˆ
r2   c                 ób   • Uu  p4Uu  pVU u  pxX7-
  S-  n	XH-
  S-  n
XW-
  U	-
  nXh-
  U
-
  nX¼4Xš4Xx44$ )Nrr   r6   )r,   r-   r.   rî   Úy2Úx3Úy3ry   rz   rw   rx   ru   rv   s                r1   rs   rs   ±  sV   € Ø�F€BØ�F€BØ�F€BØ
‰'�S‰€BØ
‰'�S‰€BØ	‰�2‰€BØ	‰�2‰€BØˆ8�b�X ˜xÐ'Ð'r2   c                 ó¤   • Uu  pEUu  pgUu  p‰U u  p«XJ-
  S-  nX[-
  S-  nXd-
  S-  U-
  nXu-
  S-  U-
  nXŠ-
  U-
  U-
  nX›-
  U-
  U-
  nUU4Xï4XÍ4X«44$ ©Nr…   r6   )r,   r-   r.   r/   rî   rð   rñ   rò   Úx4Úy4r‡   rˆ   ry   rz   rw   rx   ru   rv   s                     r1   r†   r†   ¼  s�   € Ø�F€BØ�F€BØ�F€BØ�F€BØ
‰'�S‰€BØ
‰'�S‰€BØ
‰'�S‰˜2Ñ	€BØ
‰'�S‰˜2Ñ	€BØ	‰�2‰˜Ñ	€BØ	‰�2‰˜Ñ	€BØ�ˆ8�b�X ˜x¨"¨Ð1Ð1r2   )r,   r-   r.   r/   re   rf   r¢   c                 ó@   • X-
  S-  nX!-
  S-  U-
  nX0-
  U-
  U-
  nXeX@4$ rô   r6   )r,   r-   r.   r/   r¢   rf   re   s          r1   r®   r®   Ê  s;   € ð 
‰�cÑ€AØ	‰�cÑ˜AÑ€AØ‰	�A‰˜Ñ€AØ�!ˆ>Ðr2   c                 ón   • U u  p4Uu  pVUu  pxUn	Un
US-  U-   nUS-  U-   nX5-   U-   nXF-   U-   nXš4X¼4XÞ44$ rB   r6   )re   rf   r¢   ru   rv   rw   rx   ry   rz   rh   Úy1rî   rð   rñ   rò   s                  r1   r¼   r¼   Ü  sd   € Ø�F€BØ�F€BØ�F€BØ	€BØ	€BØ
ˆs‰(�b‰€BØ
ˆs‰(�b‰€BØ	‰�2‰€BØ	‰�2‰€BØˆ8�b�X ˜xÐ'Ð'r2   c                 ó²   • U u  pEUu  pgUu  p‰Uu  p«U
nUnUS-  U
-   nU	S-  U-   nXh-   S-  U-   nXy-   S-  U-   nXJ-   U-   U-   nX[-   U	-   U-   nXÍ4Xï4UU4UU44$ rô   r6   )re   rf   r¢   ra   ru   rv   rw   rx   ry   rz   r‡   rˆ   rh   rù   rî   rð   rñ   rò   rõ   rö   s                       r1   rÊ   rÊ   é  s�   € Ø�F€BØ�F€BØ�F€BØ�F€BØ	€BØ	€BØ
ˆs‰(�b‰€BØ
ˆs‰(�b‰€BØ
‰'�S‰˜2Ñ	€BØ
‰'�S‰˜2Ñ	€BØ	‰�2‰˜Ñ	€BØ	‰�2‰˜Ñ	€BØˆ8�b�X  B˜x¨"¨b¨Ð1Ð1r2   ©re   rf   r¢   ra   r9   r:   Úp4c                 óB   • US-  U-   nX-   S-  U-   nX-   U-   U-   nX4XV4$ )NrÝ   r6   rû   s          r1   rÓ   rÓ   ù  s;   € ð 
ˆe‰�q‰€BØ
‰%�EÑ	˜RÑ	€BØ	
‰�‰�Q‰€BØ�2ˆ?Ðr2   c                 óR   • U S   SU-
  -  US   U-  -   U S   SU-
  -  US   U-  -   4$ )z¾Finds the point at time `t` on a line.

Args:
    pt1, pt2: Coordinates of the line as 2D tuples.
    t: The time along the line.

Returns:
    A 2D tuple with the coordinates of the point.
r   rX   r6   )r,   r-   r~   s      r1   r$   r$     sC   € ð �‰V�q˜1‘uÑ  A¡¨¡
Ñ*¨c°!©f¸¸A¹Ñ.>ÀÀQÁÈ!ÁÑ.KÐMÐMr2   c                 óÀ   • SU-
  SU-
  -  U S   -  SSU-
  -  U-  US   -  -   X3-  US   -  -   nSU-
  SU-
  -  U S   -  SSU-
  -  U-  US   -  -   X3-  US   -  -   nXE4$ )zÐFinds the point at time `t` on a quadratic curve.

Args:
    pt1, pt2, pt3: Coordinates of the curve as 2D tuples.
    t: The time along the curve.

Returns:
    A 2D tuple with the coordinates of the point.
rX   r   rW   r6   )r,   r-   r.   r~   rU   Úys         r1   r!   r!     s“   € ð 
ˆQ‰�1�q‘5Ñ˜C ™FÑ" Q¨!¨a©%¡[°1¡_°s¸1±vÑ%=Ñ=ÀÁÈÈAÉÁÑN€AØ	
ˆQ‰�1�q‘5Ñ˜C ™FÑ" Q¨!¨a©%¡[°1¡_°s¸1±vÑ%=Ñ=ÀÁÈÈAÉÁÑN€AØˆ6€Mr2   c                 óÚ   • XD-  nSU-
  nXf-  nXv-  U S   -  SXt-  US   -  Xe-  US   -  -   -  -   XT-  US   -  -   nXv-  U S   -  SXt-  US   -  Xe-  US   -  -   -  -   XT-  US   -  -   n	X‰4$ )zÑFinds the point at time `t` on a cubic curve.

Args:
    pt1, pt2, pt3, pt4: Coordinates of the curve as 2D tuples.
    t: The time along the curve.

Returns:
    A 2D tuple with the coordinates of the point.
rX   r   r4   r6   )
r,   r-   r.   r/   r~   r   r³   r´   rU   r   s
             r1   r"   r"   ,  sÀ   € ð 
‰€BØˆq‰5€DØ‰[€Fà‰˜˜A™ÑØ
ˆv‰z˜C ™FÑ" T¡Y°°Q±Ñ%7Ñ7Ñ
8ñ	9à
‰&�3�q‘6‰/ñ	ð ð 	‰˜˜A™ÑØ
ˆv‰z˜C ™FÑ" T¡Y°°Q±Ñ%7Ñ7Ñ
8ñ	9à
‰&�3�q‘6‰/ñ	ð ð
 ˆ6€Mr2   )r~   r,   r-   r.   r/   )r   r³   r´   c                 ó`   • XD-  nSU-
  nXf-  nXv-  U -  SXt-  U-  Xe-  U-  -   -  -   XT-  U-  -   $ )zÝFinds the point at time `t` on a cubic curve.

Args:
    pt1, pt2, pt3, pt4: Coordinates of the curve as complex numbers.
    t: The time along the curve.

Returns:
    A complex number with the coordinates of the point.
rX   r4   r6   )r,   r-   r.   r/   r~   r   r³   r´   s           r1   r#   r#   F  sP   € ð& 
‰€BØˆq‰5€DØ‰[€FØ‰=˜3Ñ  f¡j°3Ñ&6¸¹ÀS¹Ñ&HÑ!IÑIÈBÉFÐUXÉLÑXÐXr2   c                 óÀ   • [        U 5      S:X  a  [        / U QUP76 $ [        U 5      S:X  a  [        / U QUP76 $ [        U 5      S:X  a  [        / U QUP76 $ [	        S5      e©NrW   r4   é   úUnknown curve degree)r»   r$   r!   r"   Ú
ValueError)Úsegr~   s     r1   r%   r%   _  sh   € Ü
ˆ3ƒx�1ƒ}ÜÐ$˜SÐ$ !Ò$Ð$Ü	ˆS‹�Q‹Ü Ð) #Ð) qÒ)Ð)Ü	ˆS‹�Q‹ÜÐ%˜cÐ% 1Ò%Ð%Ü
Ð+Ó
,Ð,r2   c                 óÌ   • U u  p4Uu  pVUu  px[        X5-
  5      [        :  a  [        XF-
  5      [        :  a  g[        X5-
  5      [        XF-
  5      :”  a	  Xs-
  XS-
  -  $ X„-
  Xd-
  -  $ )Nr«   rÙ   )	ÚsÚer   ÚsxÚsyÚexÚeyÚpxÚpys	            r1   Ú_line_t_of_ptr  n  sg   € Ø�F€BØ�F€BØ�F€BÜ
ˆ2‰7ƒ|”gÓ¤# b¡g£,´Ó"8àä
ˆ2‰7ƒ|”c˜"™'“lÓ"Ø‘˜B™GÑ$Ð$à‘˜B™GÑ$Ð$r2   c                 óŠ   • U S   US   -
  US   US   -
  -  nU S   US   -
  US   US   -
  -  nUS:*  =(       a    US:*  (       + $ )Nr   rX   rk   r6   )re   rf   ÚoriginÚxDiffÚyDiffs        r1   Ú'_both_points_are_on_same_side_of_originr  |  s`   € Øˆq‰T�F˜1‘IÑ ! A¡$¨°©Ñ"2Ñ3€EØˆq‰T�F˜1‘IÑ ! A¡$¨°©Ñ"2Ñ3€EØ˜‘×- ¨#¡Ô.Ð.r2   c           	      óÈ  • U u  pEUu  pgUu  p‰Uu  p«[         R                  " XŠ5      (       a8  [         R                  " XF5      (       a  [         R                  " XH5      (       d  / $ [         R                  " X›5      (       a8  [         R                  " XW5      (       a  [         R                  " XY5      (       d  / $ [         R                  " XŠ5      (       a  [         R                  " X›5      (       a  / $ [         R                  " XF5      (       a  [         R                  " XW5      (       a  / $ [         R                  " Xd5      (       a8  UnX¹-
  X¨-
  -  nXÜU-
  -  U	-   nXÎ4n[        U[        XU5      [        X#U5      S9/$ [         R                  " XŠ5      (       a8  UnXu-
  Xd-
  -  nUXÄ-
  -  U-   nXÎ4n[        U[        XU5      [        X#U5      S9/$ Xu-
  Xd-
  -  nX¹-
  X¨-
  -  n[         R                  " UU5      (       a  / $ UU-  U-
  XØ-  -
  U	-   UU-
  -  nUXÄ-
  -  U-   nXÎ4n[	        XñU 5      (       a1  [	        XòU5      (       a   [        U[        XU5      [        X#U5      S9/$ / $ )a©  Finds intersections between two line segments.

Args:
    s1, e1: Coordinates of the first line as 2D tuples.
    s2, e2: Coordinates of the second line as 2D tuples.

Returns:
    A list of ``Intersection`` objects, each object having ``pt``, ``t1``
    and ``t2`` attributes containing the intersection point, time on first
    segment and time on second segment respectively.

Examples::

    >>> a = lineLineIntersections( (310,389), (453, 222), (289, 251), (447, 367))
    >>> len(a)
    1
    >>> intersection = a[0]
    >>> intersection.pt
    (374.44882952482897, 313.73458370177315)
    >>> (intersection.t1, intersection.t2)
    (0.45069111555824465, 0.5408153767394238)
r
   )rY   Úiscloser	   r  r  )Ús1Úe1Ús2Úe2Ús1xÚs1yÚe1xÚe1yÚs2xÚs2yÚe2xÚe2yrU   Úslope34r   r   Úslope12s                    r1   r&   r&   ‚  sE  € ð. �H€CØ�H€CØ�H€CØ�H€Cä�Š�S×Ñ¤4§<¢<°×#9Ñ#9Ä$Ç,Â,Ès×BXÑBXàˆ	ä�Š�S×Ñ¤4§<¢<°×#9Ñ#9Ä$Ç,Â,Ès×BXÑBXàˆ	Ü‡|‚|�C×Ñ¤$§,¢,¨s×"8Ñ"8Øˆ	Ü‡|‚|�C×Ñ¤$§,¢,¨s×"8Ñ"8Øˆ	Ü‡|‚|�C×ÑØˆØ‘9 ¡Ñ+ˆØ˜3‘wÑ #Ñ%ˆØˆVˆäØœ-¨°Ó3¼ÀbÈbÓ8Qñð
ð 	
ô
 ‡|‚|�C×ÑØˆØ‘9 ¡Ñ+ˆØ�q‘wÑ #Ñ%ˆØˆVˆäØœ-¨°Ó3¼ÀbÈbÓ8Qñð
ð 	
ð ‰y˜S™YÑ'€GØ‰y˜S™YÑ'€GÜ‡|‚|�G˜W×%Ñ%Øˆ	Ø	�3‰˜Ñ	˜w™}Ñ	,¨sÑ	2°wÀÑ7HÑI€AØ�1‘7Ñ˜cÑ!€AØ
ˆ€BÜ.Ø
�÷ñ ä
1°"¸"×
=Ñ
=äØœ-¨°Ó3¼ÀbÈbÓ8Qñð
ð 	
ð
 €Ir2   c                 óÆ   • U S   nU S   n[         R                  " US   US   -
  US   US   -
  5      n[        R                  " U* 5      R	                  US   * US   * 5      $ )Nr   r«   rX   )rY   Úatan2r   ÚrotateÚ	translate)ÚsegmentÚstartÚendÚangles       r1   Ú_alignment_transformationr0  Ð  sj   € ð �A‰J€EØ
�"‰+€CÜ�JŠJ�s˜1‘v  a¡Ñ(¨#¨a©&°5¸±8Ñ*;Ó<€EÜ�?Š?˜E˜6Ó"×,Ñ,¨e°A©h¨Y¸¸q¹¸	ÓBÐBr2   c                 ó<  • [        U5      R                  U 5      n[        U 5      S:X  a"  [        U6 u  p4n[	        US   US   US   5      nO@[        U 5      S:X  a&  [        U6 u  p4pW[        US   US   US   US   5      nO[        S5      e[        S U 5       5      $ )Nr4   rX   r  r  c              3   óL   #   • U  H  nS Us=::  a  S::  d  M  O  M  Uv •  M     g7f)rk   rX   Nr6   )r›   r¾   s     r1   rœ   Ú._curve_line_intersections_t.<locals>.<genexpr>ä  s   é € Ð<š]˜¨c°Q­m¸!©m“!©m—!š]ùrŸ   )	r0  ÚtransformPointsr»   rs   r   r†   r    r  r    )ÚcurveÚlineÚaligned_curvere   rf   r¢   Úintersectionsra   s           r1   Ú_curve_line_intersections_tr9  Ú  s    € Ü-¨dÓ3×CÑCÀEÓJ€MÜ
ˆ5ƒz�QƒÜ)¨=Ð9‰ˆˆaÜ& q¨¡t¨Q¨q©T°1°Q±4Ó8‰Ü	ˆU‹�q‹Ü(¨-Ð8‰
ˆˆaÜ" 1 Q¡4¨¨1©¨q°©t°Q°q±TÓ:‰äÐ/Ó0Ð0ÜÑ<™]Ó<Ó<Ð<r2   c           	      ó  • [        U 5      S:X  a  [        nO![        U 5      S:X  a  [        nO[        S5      e/ n[	        X5       H@  nU" / U QUP76 n[        / UQUP76 n[        / UQUP76 nUR                  [        XTUS95        MB     U$ )a¦  Finds intersections between a curve and a line.

Args:
    curve: List of coordinates of the curve segment as 2D tuples.
    line: List of coordinates of the line segment as 2D tuples.

Returns:
    A list of ``Intersection`` objects, each object having ``pt``, ``t1``
    and ``t2`` attributes containing the intersection point, time on first
    segment and time on second segment respectively.

Examples::
    >>> curve = [ (100, 240), (30, 60), (210, 230), (160, 30) ]
    >>> line  = [ (25, 260), (230, 20) ]
    >>> intersections = curveLineIntersections(curve, line)
    >>> len(intersections)
    3
    >>> intersections[0].pt
    (84.9000930760723, 189.87306176459828)
r4   r  r  r
   )	r»   r!   r"   r  r9  r  r$   rt   r	   )r5  r6  ÚpointFinderr8  r~   r   Úline_ts          r1   r'   r'   ç  s™   € ô* ˆ5ƒz�QƒÜ'‰Ü	ˆU‹�q‹Ü#‰äÐ/Ó0Ð0Ø€MÜ(¨Ö5ˆÙÐ#˜%Ð# Ò#ˆô Ð) Ð) bÒ)ˆÜÐ(˜4Ð( Ò(ˆØ×Ñœ\¨R¸&ÑAÖBñ 6ð Ðr2   c                 ót   • [        U 5      S:X  a  [        U 6 $ [        U 5      S:X  a  [        U 6 $ [        S5      e)Nr4   r  r  )r»   r   r   r  )r¢   s    r1   Ú_curve_boundsr>    s:   € Ü
ˆ1ƒv�ƒ{Ü" AÐ&Ð&Ü	ˆQ‹�1‹Ü Ð"Ð"Ü
Ð+Ó
,Ð,r2   c                 óÒ   • [        U 5      S:X  a  U u  p#[        X#U5      nX$4XC4/$ [        U 5      S:X  a  [        / U QUP76 $ [        U 5      S:X  a  [        / U QUP76 $ [	        S5      er  )r»   r$   r   r   r  )r¢   r~   r
  r  Úmidpoints        r1   Ú_split_segment_at_trA    sw   € Ü
ˆ1ƒv�ƒ{Ø‰ˆÜ  aÓ(ˆØ� ˜}Ð-Ð-Ü
ˆ1ƒv�ƒ{Ü Ð' !Ð' QÒ'Ð'Ü	ˆQ‹�1‹ÜÐ#˜aÐ# Ò#Ð#Ü
Ð+Ó
,Ð,r2   c           
      óþ  ^• [        U 5      n[        U5      nU(       d  SnU(       d  Sn[        XV5      u  pxU(       d  / $ S n	[        U5      T:  a   [        U5      T:  a  U	" U5      U	" U5      4/$ [        U S5      u  p«US   U	" U5      4nU	" U5      US   4n[        US5      u  pïUS   U	" U5      4nU	" U5      US   4n/ nUR	                  [        X®TUUS95        UR	                  [        X¾TUUS95        UR	                  [        X¯TUUS95        UR	                  [        X¿TUUS95        U4S jn[        5       n/ nU H5  nU" U5      nUU;   a  M  UR                  U5        UR                  U5        M7     U$ )N)rk   rJ   c                 ó   • SU S   U S   -   -  $ )Nr5   r   rX   r6   )Úrs    r1   r@  Ú._curve_curve_intersections_t.<locals>.midpoint1  s   € Ø�a˜‘d˜Q˜q™T‘kÑ"Ð"r2   r5   r   rX   )Úrange1Úrange2c                 óH   >• [        U S   T-  5      [        U S   T-  5      4$ )Nr   rX   )Úint)r©   Ú	precisions    €r1   Ú<lambda>Ú._curve_curve_intersections_t.<locals>.<lambda>V  s&   ø€ œS  A¡¨Ñ!2Ó3´S¸¸A¹ÀÑ9JÓ5KÑLr2   )	r>  r   r   rA  ÚextendÚ_curve_curve_intersections_tÚsetÚaddrt   )Úcurve1Úcurve2rJ  rF  rG  Úbounds1Úbounds2Ú
intersectsÚ_r@  Úc11Úc12Ú	c11_rangeÚ	c12_rangeÚc21Úc22Ú	c21_rangeÚ	c22_rangeÚfoundÚ
unique_keyÚseenÚunique_valuesr©   Úkeys     `                     r1   rN  rN  !  s°  ø€ ô ˜FÓ#€GÜ˜FÓ#€GæØˆÞØˆô ˜WÓ.�M€JÞØˆ	ò#ô �Ó˜9Ó$¬°'Ó):¸YÓ)FÙ˜&Ó!¡8¨FÓ#3Ð4Ð5Ð5ä" 6¨3Ó/�H€CØ˜‘™H VÓ,Ð-€IÙ˜&Ó! 6¨!¡9Ð-€Iä" 6¨3Ó/�H€CØ˜‘™H VÓ,Ð-€IÙ˜&Ó! 6¨!¡9Ð-€Ià€EØ	‡L�LÜ$Ø�i¨	¸)ñ	
ôð
 
‡L�LÜ$Ø�i¨	¸)ñ	
ôð
 
‡L�LÜ$Ø�i¨	¸)ñ	
ôð
 
‡L�LÜ$Ø�i¨	¸)ñ	
ôô M€JÜ‹5€DØ€MãˆÙ˜‹nˆØ�$‹;ÙØ�‰�ŒØ×Ñ˜RÖ ñ ð Ðr2   c                 óZ   • [        U 5      R                  U 5      n[        S U 5       5      $ )Nc              3   óV   #   • U  H  n[         R                  " US    S5      v •  M!     g7f)rX   rk   N)rY   r  )r›   Úps     r1   rœ   Ú_is_linelike.<locals>.<genexpr>f  s"   é € Ð:²	¨1Œt�|Š|˜A˜a™D #×&Ð&²	ùs   ‚'))r0  r4  Úall)r,  Ú	maybelines     r1   Ú_is_linelikerj  d  s(   € Ü)¨'Ó2×BÑBÀ7ÓK€IÜÑ:±	Ó:Ó:Ð:r2   c           
      óÞ  • [        U 5      (       av  U S   U S   4n[        U5      (       a  US   US   4n[        / UQUQ76 $ [        X5      nU Vs/ s H,  n[        UR                  UR
                  UR                  S9PM.     sn$ [        U5      (       a  US   US   4n[        X5      $ [        X5      nU Vs/ s H   n[        [        XS   5      US   US   S9PM"     sn$ s  snf s  snf )aË  Finds intersections between a curve and a curve.

Args:
    curve1: List of coordinates of the first curve segment as 2D tuples.
    curve2: List of coordinates of the second curve segment as 2D tuples.

Returns:
    A list of ``Intersection`` objects, each object having ``pt``, ``t1``
    and ``t2`` attributes containing the intersection point, time on first
    segment and time on second segment respectively.

Examples::
    >>> curve1 = [ (10,100), (90,30), (40,140), (220,220) ]
    >>> curve2 = [ (5,150), (180,20), (80,250), (210,190) ]
    >>> intersections = curveCurveIntersections(curve1, curve2)
    >>> len(intersections)
    3
    >>> intersections[0].pt
    (81.7831487395506, 109.88904552375288)
r   r«   r
   rX   )	rj  r&   r'   r	   r   r   r   rN  r%   )rQ  rR  Úline1Úline2ÚhitsrU   Úintersection_tsr©   s           r1   r(   r(   i  s  € ô* �F×ÑØ�q‘	˜6 "™:Ð%ˆÜ˜×ÑØ˜1‘I˜v b™zÐ)ˆEÜ(Ð8¨%Ð8°%Ò8Ð8ä)¨&Ó8ˆDñ FJÓJÂTÀ”L A§D¡D¨Q¯T©T°a·d±dÔ;ÁTÑJÐJÜ	�f×	Ñ	Ø�q‘	˜6 "™:Ð%ˆÜ% fÓ4Ð4ä2°6ÓB€Oñ "óâ!ˆBô 	œ¨°1±Ó6¸2¸a¹5ÀRÈÁUÔKÙ!ñð ùò Kùòs   Á3C%Â;'C*c           	      ó¨  • Sn[        U5      [        U 5      :”  a  XpSn[        U 5      S:”  a'  [        U5      S:”  a  [        X5      nOC[        X5      nO7[        U 5      S:X  a  [        U5      S:X  a  [        / U QUQ76 nO[	        S5      eU(       d  U$ U Vs/ s H,  n[        UR                  UR                  UR                  S9PM.     sn$ s  snf )aÍ  Finds intersections between two segments.

Args:
    seg1: List of coordinates of the first segment as 2D tuples.
    seg2: List of coordinates of the second segment as 2D tuples.

Returns:
    A list of ``Intersection`` objects, each object having ``pt``, ``t1``
    and ``t2`` attributes containing the intersection point, time on first
    segment and time on second segment respectively.

Examples::
    >>> curve1 = [ (10,100), (90,30), (40,140), (220,220) ]
    >>> curve2 = [ (5,150), (180,20), (80,250), (210,190) ]
    >>> intersections = segmentSegmentIntersections(curve1, curve2)
    >>> len(intersections)
    3
    >>> intersections[0].pt
    (81.7831487395506, 109.88904552375288)
    >>> curve3 = [ (100, 240), (30, 60), (210, 230), (160, 30) ]
    >>> line  = [ (25, 260), (230, 20) ]
    >>> intersections = segmentSegmentIntersections(curve3, line)
    >>> len(intersections)
    3
    >>> intersections[0].pt
    (84.9000930760723, 189.87306176459828)

FTrW   z4Couldn't work out which intersection function to user
   )	r»   r(   r'   r&   r  r	   r   r   r   )Úseg1Úseg2Úswappedr8  r¾   s        r1   r)   r)   “  s¶   € ð< €GÜ
ˆ4ƒy”3�t“9ÓØˆdØˆÜ
ˆ4ƒy�1ƒ}Üˆt‹9�q‹=Ü3°DÓ?‰Mä2°4Ó>‰MÜ	ˆT‹�a‹œC ›I¨›NÜ-Ð;¨tÐ;°dÒ;‰äÐOÓPÐPÞØÐÙ=JÓKº]¸ŒL˜AŸD™D Q§T¡T¨a¯d©dÔ3¹]ÑKÐKùÒKs   Â3Cc                 óz   •  [        U 5      nSSR                  S U 5       5      -  $ ! [         a    SU -  s $ f = f)zk
>>> _segmentrepr([1, [2, 3], [], [[2, [3, 4], [0.1, 2.2]]]])
'(1, (2, 3), (), ((2, (3, 4), (0.1, 2.2))))'
z(%s)z, c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frP   )Ú_segmentrepr)r›   rU   s     r1   rœ   Ú_segmentrepr.<locals>.<genexpr>Í  s   é € Ð!>º2°a¤,¨q§/ /º2ùs   ‚z%g)ÚiterÚjoinÚ	TypeError)ÚobjÚits     r1   rv  rv  Ã  sG   € ð
?Ü�#‹Yˆð ˜Ÿ	™	Ñ!>¹2Ó!>Ó>Ñ>Ð>øô ó Ø�c‰zÒðús   ‚( ¨:¹:c                 ó>   • U  H  n[        [        U5      5        M     g)zdHelper for the doctests, displaying each segment in a list of
segments on a single line as a tuple.
N)Úprintrv  )r½   r,  s     r1   ÚprintSegmentsr  Ð  s   € ó ˆÜŒl˜7Ó#Ö$ò r2   Ú__main__)g{®Gázt?)gü©ñÒMbP?NN)XÚ__doc__ÚfontTools.misc.arrayToolsr   r   r   ÚfontTools.misc.transformr   rY   Úcollectionsr   r   ÚAttributeErrorÚImportErrorÚfontTools.miscÚcompiledÚCOMPILEDrD   r	   Ú__all__r   r=   ÚreturnsÚdoubleÚlocalsr+   rE   r   rà   rl   ÚcfuncÚinlinerS   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r¡   r§   r¯   rZ   rÔ   rÕ   rÖ   r   r    rs   r†   r®   r¼   rÊ   rÓ   r$   r!   r"   r#   r%   r  r  r&   r0  r9  r'   r>  rA  rN  rj  r(   r)   rv  r  Ú__name__ÚsysÚdoctestÚexitÚtestmodÚfailedr6   r2   r1   Ú<module>r–     sX  ðñ÷ EÑ DÝ -Û Ý "ð&Ûð �?‰?€ð €ñ ˜.Ò*<Ó=€ò€ô@ò&ð ‡‚�—‘ÓØ‡‚Ø‡~�~Ø‡~�~Ø‡~�~Ø‡~�~ñ	ð ‡‚�F—M‘M¨¯©¸6¿=¹=ÑIñ	
ó Jóó ð	
ð ‡‚�—‘ÓØ‡‚Ø�‰Ø�‰Ø�‰Ø�‰ñ	ð ‡‚Ø�m‰mØ	�‰ñóAó	óó ðAð €Ø
€ð ‡�Ø‡�Ø‡‚�—‘ÓØ‡‚�&—.‘. V§^¡^Ñ4ñ&ó 5ó ó ó ð&ð ‡�Ø‡�Ø‡‚�—‘ÓØ‡‚�—‘Ññ;ó  ó ó ó ð;ò PðF ‡‚�—‘ÓØ‡‚Ø�‰Ø�‰Ø�‰Ø‡~�~Ø‡~�~Ø‡n�nØ‡n�nñð ‡‚Ø
�-‰-Ø�]‰]Ø‡m�mØ‡m�mØ‡}�}Ø‡}�}Ø�‰ññóóó ð&ò@Wð" ‡‚�—‘ÓØ‡‚Ø�‰Ø�‰Ø�‰ñð
 ‡‚Ø‡}�}Ø‡}�}Ø‡}�}ññ
óóó ðòBòDð< ‡‚�—‘ÓØ‡‚Ø�‰Ø�‰Ø�‰Ø�‰ñ	ð ‡‚Ø‡}�}Ø‡}�}Ø‡}�}Ø‡}�}Ø‡}�}ññ!"óóó ð!"òH#òL6òr*3òZ"2òJ,ò0ð> ‡‚Ø�‰Ø�‰Ø�‰Ø�‰Ø‡n�nØ‡n�nØ‡n�nØ‡n�nñ	ñ0ó	ð0ð ‡‚�—‘ÓØ‡‚Ø‡m�mØ�‰Ø�‰Ø�‰Ø�‰Ø�^‰^Ø	�‰Ø	�‰ñ	ð ‡‚Ø‡}�}˜6Ÿ=™=°·±ÈÏÉññDóó	ó  ðDò4ò6 ðF ‡‚Ø‡n�nØ‡n�nØ‡n�nØ‡n�nØ‡}�}Ø‡}�}Ø
�-‰-Ø�M‰MØ�M‰MØ‡~�~Ø‡~�~Ø‡~�~Ø‡~�~ññ#óð#÷6 %Ó $ð "&ô òBYòB(ò2ð ‡�Ø‡�Ø‡‚Ø�‰Ø�‰Ø�‰Ø�‰Ø‡n�nØ‡n�nØ‡n�nññóó ó ðò
(ò2ð  ‡�Ø‡�Ø‡‚Ø‡n�nØ‡n�nØ‡n�nØ‡n�nØ‡~�~Ø‡~�~Ø‡~�~ññóó ó ðò
Nòòð4 ‡‚�—‘ÓØ‡‚Ø‡m�mØ�‰Ø�‰Ø�‰Ø�‰ñð ‡‚�&—-‘- f§m¡m¸F¿M¹MÑJñYó Kóó  ðYò -ò%ò/òKò\Cò
=ò#òL-ò	-ð 9=ô@òF;ò
'òT-Lò`
?ò%ð ˆzÓÛÛà‡H‚HˆW�_Š_Ó×%Ñ%Õ&ð	 øðY. 	˜Ð$ó &ç%Ð%ð&ús   ža0 á0bâb