
    ]jQ:                    X   d dl Z 	 d dlmZ n# e$ r	 d dlmZ Y nw xY wd dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZ 	 d dlmZ n# e$ r d dlmZ edz  ZY nw xY w	 d	Zd
ZdZd ZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.d Z/d!Z0d"Z1d#Z2d$Z3d%Z4d&Z5d'Z6d(Z7d)Z8d*Z9d+Z:d,Z;d-Z<d.Z=d/Z>d0Z?d1Z@d2ZAd3ZBd4ZCd5ZDd6ZEd7ZFd8ZGd9ZHd*ZId:ZJd;ZKd<ZLd=ZMd>ZNd?ZOd@ZPdAZQdBZRdCZSdDZTdEZUdFZVdGZWdHZXdIZYdJZZdKZ[dLZ\dMZ]dNZ^dOZ_dPZ`dQZadRZbdSZcdTZddUZedVZfdWZgdXZhdYZidZZjd[Zkd\Zld]Zmd^Znd_Zod`ZpdaZqdbZrdcZsddZtdeZudfZvdgZwdhZxdiZydjZzdkZ{dlZ|dmZ}dnZ~doZdpZdqZdrZdsZdtZduZdvZdwZdxZdyZerdzz   esz   dzz   eyz   dzz   ezz   dzz   etz   dzz   e{z   dzz   e|z   dzz   euz   dzz   exz   dzz   evz   dzz   ewz   Zedzz   ez   dzz   ez   Z e j        d{          Z e j        d|          Z e j        e          Z e j        d}ed~ed}ed~          Z e j        ded~ed          Z e j        d}ed~ed}ed          Z e j        d          Z e j        dedededed	          Z e j        dedededed	          Z e j        dedededed	          Z e j        dez            Z e j        de j                  Z e j        d          Z e j        d          Z e j        d          ZddefgZ e j        dz                    d eD                                 ZdefddefgZ e j        dz                    d eD                                 ZddefgZ e j        dz                    d eD                                 Z G d d          Z G d de          Z G d de          Z G d d          Z G d de          Z G d d          Z G d d          Z G d de          Z G d d          Z G d d          Z G d deee          Z G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d dee          Z G d de          Z G dÄ de          Z G dń de          Z G dǄ de          Z G dɄ de          Z G d˄ de          Z G d̈́ de          Z G dτ de          Z G dф dҦ          Z G dӄ deeeĦ          Z G dՄ deeeĦ          Z G dׄ deeĦ          Z G dل deeĦ          Z G dۄ deee          ZeZ G d݄ deee          ZeZ G d߄ de          ZeZ G d de          Z G d deŦ          Zd ZddZddZddZdS )    N)MutableSequencecopy)acosatanatan2ceilcosdegreeshypotlogradianssinsqrttan)	iterparsetau)pi   z1.9.6   -q=g      X@svgversionz1.1xmlnszhttp://www.w3.org/2000/svgzxmlns:xlinkzhttp://www.w3.org/1999/xlinkzxmlns:evz!http://www.w3.org/2001/xml-eventsz"{http://www.w3.org/1999/xlink}hrefhrefwidthheightviewBoxviewbox_transformpathgrectcircleellipselinepolylinepolygontexttspanimagedesctitlemetadatastyledefsuseclipPathpattern
attributesidddisplaycolorfillzfill-opacitystrokezstroke-opacityzstroke-width	transformclassz	clip-pathz	clip-ruleclipPathUnitscxcyrxryrpointspreserveAspectRatioxyx0y0x1y1x2y2dxdytagfontzfont-familyz
font-stylezfont-variantzfont-weightzfont-stretchz	font-sizeztext-anchorzalignment-baselinezdominant-baselinepatternContentUnitspatternTransformpatternUnitszvector-effectuserSpaceOnUseobjectBoundingBoxnonzeroevenoddmatrix	translatescalerotateskewxskewyskew
translatex
translateyscalexscaleynonecurrentColorznon-scaling-strokez	[\s\t\n]*z(?:\s*,\s*|\s+|(?=-))z[ ,\t\n\x09\x0A\x0C\x0D]+z([-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?z0cm|mm|Q|in|pt|pc|px|em|cx|ch|rem|vw|vh|vmin|vmaxzdeg|grad|rad|turnzs|mszHz|kHzzdpi|dpcm|dppx%|zurl\(#?(.*)\)z^data:([^,]*),()z(?u)(z\(([^)]+)\)z)?z^#?([0-9A-Fa-f]{3,8})$zrgba?\(\s*(z	)\s*,\s*(z)\s*(?:,\s*(z)\s*)?\)z
)%\s*,\s*(z)%\s*(?:,\s*(zhsla?\(\s*(z(%s)([A-Za-z%%]*)z\/\*[\s\S]*?\*\/|\/\/.*$z([^{]+)\s*\{\s*([^}]+)\s*\}a  ^(?:(?:(normal|italic|oblique)\s)?(?:(normal|small-caps)\s)?(?:(normal|bold|bolder|lighter|[0-9]{3})\s)?(?:(normal|(?:ultra-|extra-|semi-)?condensed|(?:semi-|extra-)?expanded)\s)?){0,4}(?:((?:x-|xx-)?small|medium|(?:x-|xx-)?large|larger|smaller|[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?(?:em|pt|pc|px|%)?)(?:/((?:x-|xx-)?small|medium|(?:x-|xx-)?large|larger|smaller|[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?(?:em|pt|pc|px|%)?))?\s)?([^;]*);?$zV(?:([^\s"';,]+|"[^";,]+"|'[^';,]+'|serif|sans-serif|cursive|fantasy|monospace)),?\s*;?)COMMANDz[MmZzLlHhVvCcSsQqTtAa]SKIPc              #       K   | ]	}d |z  V  
dS z
(?P<%s>%s)N .0pairs     R/home/agentuser/manim-venv/lib/python3.11/site-packages/svgelements/svgelements.py	<genexpr>rr      '      GGT\D0GGGGGG    FLOAT)CLOSEz[Zz]c              #       K   | ]	}d |z  V  
dS rl   rm   rn   s     rq   rr   rr      rs   rt   )FLAGz[01]c              #       K   | ]	}d |z  V  
dS rl   rm   rn   s     rq   rr   rr     s'      IIdlT1IIIIIIrt   c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
SVGLexicalParserc                 L    d | _         d | _        d| _        d| _        d | _        d S Nr   )parserpathdposlimitinline_closeselfs    rq   __init__zSVGLexicalParser.__init__  s,    

 rt   c                     | j         | j        k     rdt                              | j        | j                   }|d S |                                | _         |j        }|dk    r`|                                S d S Nrj   )r   r   svg_rematchr   end	lastgroupgroupr   r   kinds      rq   _commandzSVGLexicalParser._command  sg    h##LLTX66E}tyy{{DH?Dv~~;;== trt   c                    | j         | j        k     rst                              | j        | j                   }|dS |j        }|dk    r|                                | _        dS |dk    r|                                | _         dS d S )NFrv   rj   T)	r   r   num_rer   r   r   r   r   r   r   s      rq   _morezSVGLexicalParser._more  s|    h##LLTX66E}u?Dw$)KKMM!uv~~ 99;;4trt   c                 H   | j         | j        k     rt                              | j        | j                   }|ni|j        }|dk    r|                                | _        d S |                                | _         |dk    rt          |                                          S d S )Nrv   rj   )
r   r   r   r   r   r   r   r   r   floatr   s      rq   _numberzSVGLexicalParser._number(  s    h##LLTX66E}?Dw$)KKMM!tyy{{DHv~~'''trt   c                     | j         | j        k     r}t                              | j        | j                   }|nU|                                | _         |j        }|dk    r_t          t          |	                                                    S d S r   )
r   r   flag_rer   r   r   r   boolintr   r   s      rq   _flagzSVGLexicalParser._flag8  su    h##MM$*dh77E}yy{{DH?Dv~~EKKMM**+++trt   c                 t    |                                  }|d S |                                  }|t          ||fS N)r   
ValueError)r   rE   rF   s      rq   _coordzSVGLexicalParser._coordD  s:    LLNN94LLNN9!trt   c                     |                                  }|d S | j        j        }||S |d         |j        z   |d         |j        z   fS Nr      )r   r~   current_pointrE   rF   )r   positioncurrent_poss      rq   _rcoordzSVGLexicalParser._rcoordM  sP    ;;==4k/O{[]*HQK+-,GGGrt   c           	      B   || _         | j                                          || _        d| _        t	          |          | _        	 |                                 }|d S |dk    s|dk    rP|                                 rt          | j         	                    |
                                           d | _        u|dk    r|                                 st          |                                 }| j                             |d           |                                 rD|                                 }| j                             |d           |                                 Dn|dk    r|                                 st          |                                 }| j                             |d           |                                 rD|                                 }| j                             |d           |                                 Dn|d	k    r[	 |                                 }|| j        }|t          | j                             |d           |                                 snXn|d
k    r[	 |                                 }|| j        }|t          | j                             |d           |                                 snXnO|dk    r[	 |                                 }|| j        }|t          | j                             |d           |                                 snXn|dk    r[	 |                                 }|| j        }|t          | j                             |d           |                                 snXn|dk    rI	 |                                 }| j                             |d           |                                 snFn>|dk    rI	 |                                 }| j                             |d           |                                 snFn|dk    rI	 |                                 }| j                             |d           |                                 snFn|dk    rZ|                                 rD|                                 }| j                             |d           |                                 Dn@|dk    r	 |                                 |                                 |                                 }}}|| j        }|t          || j        }|t          || j        }|t          | j                             |||d           |                                 snn|dk    r	 |                                 |                                 |                                 }}}|| j        }|t          || j        }|t          || j        }|t          | j                             |||d           |                                 snn|dk    r	 |                                 |                                 }}|| j        }|t          || j        }|t          | j                             ||d           |                                 snnZ|dk    r	 |                                 |                                 }}|| j        }|t          || j        }|t          | j                             ||d           |                                 snn|dk    r	 |                                 |                                 }}|| j        }|t          || j        }|t          | j                             ||d           |                                 snnJ|dk    r	 |                                 |                                 }}|| j        }|t          || j        }|t          | j                             ||d           |                                 snn|dk    r|                                 r|                                 |                                 |                                 |                                 |                                 |                                 f\  }	}
}}}}|t          || j        }|t          | j                             |	|
||||d           |                                 n|dk    r|                                 r|                                 |                                 |                                 |                                 |                                 |                                 f\  }	}
}}}}|| j        }|t          | j                             |	|
||||d           |                                 	)Nr   TzZrelativemMFlLtThHvVcCqQsSaA)r~   startr   r   lenr   r   r   r   closedislowerr   r   mover&   r   smooth_quadr   
horizontalverticalcubicquadsmooth_cubicr   arcr   )r   r~   r   cmdcoordvaluecoord1coord2coord3r@   rA   rotationr   sweeps                 rq   parsezSVGLexicalParser.parseV  s
   
ZZ
W	Y--//C{sczz::<< %$$""CKKMM":::$(!zz|| %$$   666jjll ; LLNNEK$$UT$::: jjll ; zz|| %$$   777jjll < KKMMEK$$UU$;;; jjll <  LLNNE} $ 1 =",,K$$UT$:::::<<   KKMME} $ 1 =",,K$$UU$;;;::<<   LLNNE} $ 1 =",,K++ED+AAA::<<   KKMME} $ 1 =",,K++EE+BBB::<<   LLNNEK**54*@@@::<< 	  LLNNEK**55*AAA::<< 	  LLNNEK(((>>>::<< 	 jjll @ LLNNEK(((??? jjll @  %+FF
 ~!%!2!>",,~!%!2!>",,~!%!2!>",,K%%ffft%LLL::<< )( -1[[]]DKKMM4;;==FFF~!%!2!>",,~!%!2!>",,~!%!2!>",,K%%fffu%MMM::<< !  %)\\^^T\\^^FF~!%!2!>",,~!%!2!>",,K$$VVd$CCC::<<  %)[[]]DKKMMFF~!%!2!>",,~!%!2!>",,K$$VVe$DDD::<<  %)\\^^T\\^^FF~!%!2!>",,~!%!2!>",,K,,VVd,KKK::<<  %)[[]]DKKMMFF~!%!2!>",,~!%!2!>",,K,,VVe,LLL::<<  jjll X



;7BHc5% }((} $ 1 =",,KOOBHc5%RVOWWW jjll X  jjll Y



;7BHc5% } $ 1 =",,KOOBHc5%RWOXXX jjll YUW	Yrt   N)__name__
__module____qualname__r   r   r   r   r   r   r   r   rm   rt   rq   r{   r{     s        ! ! !
 
 
      
 
 
  H H H^ ^ ^ ^ ^rt   r{   c                   &   e Zd ZdZd Zd Zd Zd Zd Zd Z	e	Z
e	Zd Zd	 Zd
 Zd Zd Zd ZeZd Zd Zd Zd Zd Zd Zd ZeZd Zd Zd Zed             Zd Z d Z!e"ddddfdZ#e"ddddfdZ$e"ddddfdZ%	 	 	 	 	 d!dZ&e'd              Z(dS )"LengthaN  
    SVGLength as used in SVG

    Length class is lazy when solving values. Several conversion values are unknown by default and length simply
    stores that ambiguity. So we can have a length of 50% and without calling .value(relative_length=3000) it will
    simply store as 50%. Likewise, you can have absolute values like 30cm or 20in which are not knowable in pixels
    unless a PPI value is supplied. We can say .value(relative_length=30cm, PPI=96) and solve this for a value like
    12%. We can also convert values between knowable lengths. So 30cm is 300mm regardless whether we know how to
    convert this to pixels. 0% is 0 in any units or relative values. We can convert pixels to pc and pt without issue.
    We can convert vh, vw, vmax, vmin values if we know viewbox values. We can convert em values if we know the
    font_size. We can add values together if they are convertible units e.g. Length("20in") + Length("3cm").

    If .value() cannot solve for the value with the given information then it will return a Length value. If it can
    be solved it will return a float.
    c                    t          |          dk    rp|d         }|d | _        d | _        d S t          |          }t                              |          D ]+}t          |d                   | _        |d         | _         d S n/t          |          dk    r|d         | _        |d         | _        d S d| _        d| _        d S )Nr   r   r            )r   amountunitsstrREGEX_LENGTHfindallr   )r   argskwargsr   r   r   s         rq   r   zLength.__init__H  s    t99>>GE}"!
E

A!))!,,  #AaDkkqT
 YY!^^q'DKaDJF


rt   c                 |    | j         d S | j        dk    r| j         dz  dz  S | j        dk    r
| j         dz  S | j         S )Npt      @      @pc      0@)r   r   r   s    rq   	__float__zLength.__float__[  sP    ;4:;$s**Z4;%%{rt   c                    t          |t          t          f          r| xj        |z  c_        | S | j        dk    rdS t          |t                    rt          |          }t          |t
                    r|j        dk    r	d| _        | S | j        |j        k    r| xj        |j        z  c_        | S | j        dk    r%|j        | _        | j        |j        z  dz  | _        | S |j        dk    r| j        |j        z  dz  | _        | S t          )Nr   re         Y@)
isinstancer   r   r   r   r   r   r   r   others     rq   __imul__zLength.__imul__d  s
   ec5\** 	KK5 KKK;#3eS!! 	"5MMEeV$$ 	|s""!zU[((u|+zS  "[
"kEL85@##"kEL85@rt   c                     t          |t                    st          |          }| j        |j        k    r| xj        |j        z  c_        | S | j        dk    r|j        | _        |j        | _        | S |j        dk    r| S | j        dk    s| j        dk    r|j        dk    s|j        dk    r| xj        |j        z  c_        nR|j        dk    r| xj        |j        dz  dz  z  c_        n+|j        dk    r| xj        |j        dz  z  c_        nt          | S | j        dk    r_|j        dk    s|j        dk    r| xj        |j        dz  dz  z  c_        n+|j        dk    r| xj        |j        d	z  z  c_        nt          | S | j        dk    r\|j        dk    s|j        dk    r| xj        |j        dz  z  c_        n+|j        dk    r| xj        |j        d	z  z  c_        nt          | S | j        d
k    rQ|j        dk    r| xj        |j        dz  z  c_        n+|j        dk    r| xj        |j        dz  z  c_        nt          | S | j        dk    rQ|j        d
k    r| xj        |j        dz  z  c_        n+|j        dk    r| xj        |j        dz  z  c_        nt          | S | j        dk    rQ|j        d
k    r| xj        |j        dz  z  c_        n+|j        dk    r| xj        |j        dz  z  c_        nt          | S t	          d| j        z            )Nr   pxr   r   r   r   r   r         (@cmmm      $@in٭e2?ehWQ(?z%s units were not determined.)r   r   r   r   r   r   s     rq   __iadd__zLength.__iadd__|  sD   %(( 	"5MME:$$KK5<'KKK;!,DKDJK<1K:r!1!1{d""ekR&7&7u|+$$u|c1C77$$u|d22  K:{d""ekR&7&7u|c1C77$$u|d22  KZ4{d""ekR&7&7u|d22$$u|d22  KZ4{d""u|d22$$u|h66  KZ4{d""u|d22$$u|i77  KZ4{d""u|h66$$u|i77  K84:EFFFrt   c                 `    |                                  }t          |j                  |_        |S r   )__copy__absr   )r   r   s     rq   __abs__zLength.__abs__  s#    MMOOqx==rt   c                    t          |t          t          f          r&|                                 }|xj        |z  c_        |S | j        dk    rdS t          |t
                    rt          |          }t          |t                    r!| j        |j        k    r| j        |j        z  }|S | j        dk    s| j        dk    ri|j        dk    s|j        dk    r| j        |j        z  S |j        dk    r| j        |j        dz  dz  z  S |j        dk    r| j        |j        dz  z  S t          | j        dk    rO|j        dk    s|j        dk    r| j        |j        dz  dz  z  S |j        dk    r| j        |j        d	z  z  S t          | j        dk    rL|j        dk    s|j        dk    r| j        |j        dz  z  S |j        dk    r| j        |j        d	z  z  S t          | j        d
k    rA|j        dk    r| j        |j        dz  z  S |j        dk    r| j        |j        dz  z  S t          | j        dk    rA|j        d
k    r| j        |j        dz  z  S |j        dk    r| j        |j        dz  z  S t          | j        dk    rA|j        d
k    r| j        |j        dz  z  S |j        dk    r| j        |j        dz  z  S t          t          )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   r   s       rq   __truediv__zLength.__truediv__  s   ec5\** 	AHHHHH;#3eS!! 	"5MMEeV$$ 	zU[((K%,.:r!1!1{d""ekR&7&7{U\11$${elS&83&>??$${elT&9::  :{d""ekR&7&7{elS&83&>??$${elT&9::  :{d""ekR&7&7{elT&9::$${elT&9::  :{d""{elT&9::$${elX&=>>  :{d""{elT&9::$${elY&>??  :{d""{elX&=>>$${elY&>??  rt   c                     | |z
  j         dk     S Nr   r   r   s     rq   __lt__zLength.__lt__      u$s**rt   c                     | |z
  j         dk    S r   r   r   s     rq   __le__zLength.__le__      u$++rt   c                     | |z
  j         dk    S r   r   r   s     rq   __gt__zLength.__gt__  r  rt   c                     | |z
  j         dk    S r   r   r   s     rq   __ge__zLength.__ge__  r  rt   c                 .    |                      |           S r   __eq__r   s     rq   __ne__zLength.__ne__      ;;u%%%%rt   c                     t          |t          t          t          f          rt	          |          }|                                 }||z  }|S r   )r   r   r   r   r   r   r   r   r   s      rq   __add__zLength.__add__  sA    ec5#.// 	"5MMEMMOO	U
rt   c                 .    t          |           }||z  }|S r   r   r  s      rq   __mul__zLength.__mul__  s    JJ	U
rt   c                 >    t          |           }|d|j        z  z  }|S N      ?)r   r   r  s      rq   __rdiv__zLength.__rdiv__  s#    JJ	S5<rt   c                 H    |                                  }|j         |_        |S r   )r   r   r   r   s     rq   __neg__zLength.__neg__!  s    MMOOH9rt   c                 t    t          |t          t          t          f          rt	          |          }| | z  } | S r   r   r   r   r   r   r   s     rq   __isub__zLength.__isub__&  s6    ec5#.// 	"5MMErt   c                 8    |                                  }||z  }|S r   )r   )r   r   r   s      rq   __sub__zLength.__sub__,  s    MMOO	U
rt   c                 p    t          |t          t          t          f          rt	          |          }|  |z   S r   r  r   s     rq   __rsub__zLength.__rsub__1  s2    ec5#.// 	"5MMErt   c                 6    t          | j        | j                  S r   )r   r   r   r   s    rq   r   zLength.__copy__6  s    dk4:...rt   c                 &    dt          |           z  S )NzLength('%s')r   r   s    rq   __repr__zLength.__repr__;  s    T++rt   c                 n    | j         t          S t                              | j                   | j        S r   )r   SVG_VALUE_NONEr   r   r   r   s    rq   __str__zLength.__str__>  s0    ;!!DK000$**==rt   c                 R   |dS |                                  }t          |t          t          f          r.|t	          ||z
            t
          k    S |dk    o
| j        dk    S t          |t                    rt          |          }| j        |j        k    r| j	        |j	        k    rdS |3|                                 }|t	          ||z
            t
          k    rdS | 
                                }|3|
                                }|t	          ||z
            t
          k    rdS dS )NFr   T)	in_pixelsr   r   r   r   ERRORr   r   r   r   	in_inchesr   r   r   os       rq   r  zLength.__eq__C  s   =5NNeeS\** 	7}1u9~~..z6dkQ&66eS!! 	"5MME;%,&&4:+D+D4=!!A}q1u::&&4NN=!!A}q1u::&&4urt   c                     | j         S r   r   r   s    rq   value_in_unitszLength.value_in_units]  s
    {rt   c                     | j         dk    s| j         dk    r| j        S | j         dk    r| j        dz  dz  S | j         dk    r
| j        dz  S d S )Nr   r   r   r   r   r   r   r   r   r   s    rq   r*  zLength.in_pixelsa  sa    :r!1!1;:;$s**:;%%trt   c                 ~    | j         dk    r
| j        dz  S | j         dk    r
| j        dz  S | j         dk    r| j        S d S )Nr   r   r   r   r   r2  r   s    rq   r,  zLength.in_inchesj  sP    :;**:;)):;trt   Nc                     |                      |||||          }||dz  z  }t          dt                              |          z            S )Nppirelative_length	font_sizefont_heightviewboxr   z%smmr   r   r   r   r6  r7  r8  r9  r:  r   r   s           rq   to_mmzLength.to_mms  sX     

+#  
 
 S9_%f

1.///rt   c                     |                      |||||          }||dz  z  }t          dt                              |          z            S )Nr5  r   z%scmr;  r<  s           rq   to_cmzLength.to_cm  sX     

+#  
 
 S8^$f

1.///rt   c                     |                      |||||          }||z  }t          dt                              |          z            S )Nr5  z%sinr;  r<  s           rq   to_inchzLength.to_inch  sS     

+#  
 
 CKf

1.///rt   c                    | j         d S | j        dk    r|| S | j         dz  }t          |t          t          f          r||z  S t          |t
          t          f          r5|| z  }t          |t                    r|                    ||||          S |S | S | j        dk    r|| S | j         |z  dz  S | j        dk    r|| S | j         |z  dz  S | j        dk    r|| S | j         |z  S | j        d	k    s| j        d
k    r| j         S | j        dk    r| j         dz  dz  S | j        dk    r
| j         dz  S | j        dk    r|| S | j         t          |          z  S | j        dk    r|| S | j         t          |          z  S | j        dk    r%|| S t          |          }	| j         |	j	        z  dz  S | j        dk    r%|| S t          |          }	| j         |	j
        z  dz  S | j        dk    r:|| S t          |          }	t          |	j
        |	j
                  }
| j         |
z  dz  S | j        dk    r:|| S t          |          }	t          |	j
        |	j
                  }
| j         |
z  dz  S 	 t          |           S # t          $ r | cY S w xY w)Nre   r   )r6  r8  r9  r:  r   r   r   r   r   r   r   r   r   r   r   r   emexvwvhvminvmax)r   r   r   r   r   r   r   r   Viewboxr   r   minmaxr   )r   r6  r7  r8  r9  r:  r   fractionlengthr   r   s              rq   r   zLength.value  s    ;4:&{U*H/E3<88 /11Oc6];; 	(4/ff-- !<<"+$/ '	 (    K:{;$y00:{;$x//:{;$$:r!1!1;:;$s**:;%%: ;y!1!111:";{!3!333:  A;(500:  A;)E11:  AAHah''A;?U**:  AAHah''A;?U**	;; 	 	 	KKK	s   )I8 8JJc                    | dS t          | t                    rV| j        dk    r| j        } nCd| j        z  }d|v r(|                    d                              d          }d|| j        dS 	 d| z  } n# t
          $ r t          |           cY S w xY wd| v r(|                     d                              d          } | S )Nzn/ar   z%.12f.0')r   r   r   r   rstrip	TypeErrorr   )r   r   s     rq   r   z
Length.str  s    95a   	/w"}}Hah&!88,,S11A#$1aggg..	!AA 	 	 	q66MMM	!88$$S))As   1A7 7BB)NNNNN))r   r   r   __doc__r   r   r   r   r   r   __floordiv____div__r  r  r  r	  r  r  __radd__r  r  r  r  r  r!  r   __rmul__r%  r(  r  propertyr0  r*  r,  DEFAULT_PPIr=  r?  rA  r   staticmethodr   rm   rt   rq   r   r   7  st           &    0>G >G >G@  
9 9 9v LG+ + +, , ,+ + +, , ,& & &   H  
  
  
    
  
/ / / H, , ,> > >
  4   X     0 0 0 0( 0 0 0 0( 0 0 0 0( O O O Ob   \  rt   r   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ed<d
            Zed<d            Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zej        d             Zed             Zej        d             Zed             Zej        d             Zed             Zej        d             Zed             Zej        d             Zed             Zej        d             Zed             Zej        d              Zed!             Zej        d"             Zed#             Z e j        d$             Z ed%             Z!ed&             Z"ed'             Z#ed(             Z$e$j        d)             Z$ed*             Z%e%j        d+             Z%ed,             Z&e&j        d-             Z&ed.             Z'ed/             Z(ed0             Z)ed1             Z*ed2             Z+ed3             Z,ed4             Z-ed5             Z.ed6             Z/ed7             Z0e0j        d8             Z0d9 Z1d=d;Z2d:S )>Colorz
    SVG Color Parsing
    Parses different forms of defining colors.

    Including keyword: https://www.w3.org/TR/SVG11/types.html#ColorKeywords
    c                    d| _         t          |          }|dk    rj|d         }t          |t                    r|j         | _         nQt          |t                    r	|| _        n3t                              |          | _         n|dk    r|d         }t          |t                    r|j         | _         n<t          |t                    r|| _        nt                              |          | _         t          |d                   | _        n|dk    r:|d         }|d         }|d         }t          	                    |||          | _         nK|dk    rE|d         }|d         }|d         }|d         dz  }t          	                    ||||          | _         d|v r|d         | _
        d|v r|d         | _        d	|v r|d	         | _        d
|v r|d
         | _        d|v r|d         | _        d|v r|d         | _
        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d|v r|d         | _        d S d S )Nr   r   r              o@redgreenbluealphaopacityrB   r"   brgbbgrargbrgbar   r   r   hue
saturation	lightness)r   r   r   r]  r   rh  r   r   rf  
rgb_to_intrb  rc  rd  re  ri  rj  rk  rl  rm  rn  )	r   r   r   arglenr   rB   r"   rg  rf  s	            rq   r   zColor.__init__  s   
TQ;;QA!U## ,W

As## ,"[[^^

q[[QA!U## ,W

As## ,"[[^^
 a>>DLLq[[QAQAQA))!Q22DJJq[[QAQAQA1goG))!Q7;;DJF??e}DHfDJVvDIfDJ!),DL&==c{DH&==DJ&==sDIF??e}DHF??e}DHVvDIVvDI&==c{DH&==$SkDO&==#C[DNF??e}DH6!!$\2DO&  #K0DNNN ! rt   c                     | j         S r   r   r   s    rq   __int__zColor.__int__\  s
    zrt   c                 F    | j         t          | j                   S | j        S r   )r   r   hexr   s    rq   r(  zColor.__str___  s    :tz??"xrt   c                 &    dt          |           z  S )NzColor('%s')r$  r   s    rq   r%  zColor.__repr__d  s    s4yy((rt   c                     | |u rdS | j         }|}t          |t                    rt          |          }t          |t                    r|j         }||d u S ||d u S |dz  |dz  k    S )NTl    )r   r   r   r]  r   r   firstseconds       rq   r  zColor.__eq__g  s    5==4
fc"" 	#6]]Ffe$$ 	"\F=T>!>D= z!Vj%888rt   c                     | |k     S r   rm   r   s     rq   r  zColor.__ne__v      5=  rt   c                 x    | j         t          | j                   S t          | j        | j        | j                  S r   )r   r]  rb  rc  rd  r   s    rq   r   zColor.__abs__y  s2    :$$$TXtz49555rt   r  c                 h   |dk    rd}|dk     rd}t                               |           } t                               |          }t                               |          }t          t          |dz                      }t                               |          }| dz  } |dz  }|dz  }| |z  |z  |z  }|S )Nr   r  r   ra           )r]  crimpr   round)rB   r"   rg  rf  r   r   s         rq   ro  zColor.rgb_to_int  s    Q;;GQ;;GKKNNKKNNKKNNgo&&''KKNN	b	b	aEAIMrt   c                 $   d }|dk    rd|z  }d|z  }d|z  }nX|dk     r	|d|z   z  }n||z   ||z  z
  }d|z  |z
  }	d ||	|| dz             z  }d ||	||           z  }d ||	|| dz
            z  }t                               ||||          }
|
S )	Nc                     |dk     r|dz  }|dk    r|dz  }d|z  dk     r| || z
  dz  |z  z   S d|z  dk     r|S d|z  dk     r| || z
  d|z
  z  dz  z   S | S )Nr   r         @r         @r_  UUUUUU?rm   )v1v2rF  s      rq   	hue_2_rgbz#Color.hsl_to_int.<locals>.hue_2_rgb  s    AvvaAvvaRx#~~R"WOb000Rx!||	2v||R"W)r)9:S@@@Irt   r   ra        ?r  r   UUUUUU?)rf  )r]  ro  )r   r   r   rf  r  rB   r"   rg  r  r  r   s              rq   
hsl_to_intzColor.hsl_to_int  s    	 	 	 88	A	A	AA3ww#']!eA&QB		"b!y/:::A		"b!,,,A		"b!y/:::A  Aq' ::rt   c                 p   | | t           k    rdS t                              |           }|rt                              |           S t
                              |           }|r,t                              |                                          S t                              |           }|r,t          	                    |                                          S t                              |           }|r,t                              |                                          S t                              |           S )z)Parse SVG color, will return a set value.N)r'  REGEX_COLOR_HEXr   r]  parse_color_hexREGEX_COLOR_RGBparse_color_rgbgroupsREGEX_COLOR_RGB_PERCENTparse_color_rgbpREGEX_COLOR_HSLparse_color_hslparse_color_lookup)color_stringr   s     rq   r   zColor.parse  s    <>#A#A4%%l33 	7((666%%l33 	9((888'--l;; 	:))%,,..999%%l33 	9((888''555rt   c                 (   t          | t                    st                              ddd          S |                     dd                                          } | dk    rt                              dddd          S | dk    rt                              ddd	          S | dk    rt                              d
dd	          S | dk    rt                              ddd          S | dk    rt                              dd	d	          S | dk    rt                              dd	d          S | dk    rt                              d
d	d	          S | dk    rt                              ddd          S | dk    rt                              d	dd          S | dk    rt                              ddd          S | dk    rt                              d	dd          S | dk    rt                              ddd	          S | dk    rt                              ddd           S | d!k    rt                              d"d#d#          S | d$k    rt                              d%d&d'          S | d(k    rt                              d)d*d+          S | d,k    rt                              dd	d          S | d-k    rt                              d.d/d0          S | d1k    rt                              d	dd2          S | d3k    rt                              d4d5d6          S | d7k    rt                              d	dd          S | d8k    rt                              dd9d:          S | d;k    rt                              dd	d	          S | d<k    rt                              ddd=          S | d>k    rt                              dd=d=          S | d?k    rt                              d&d@dA          S | dBk    rt                              dCdCdC          S | dDk    rt                              dd4d          S | dEk    rt                              dCdCdC          S | dFk    rt                              dGdHdI          S | dJk    rt                              d=dd=          S | dKk    rt                              dLdIdM          S | dNk    rt                              d	dOd          S | dPk    rt                              dQdRdS          S | dTk    rt                              d=dd          S | dUk    rt                              dVdWdX          S | dYk    rt                              dZd[dZ          S | d\k    rt                              d]d^d=          S | d_k    rt                              dMd`d`          S | dak    rt                              dMd`d`          S | dbk    rt                              ddcdd          S | dek    rt                              dfddg          S | dhk    rt                              d	d9di          S | djk    rt                              ddkd	          S | dlk    rt                              d/d/d/          S | dmk    rt                              d/d/d/          S | dnk    rt                              d0dod	          S | dpk    rt                              dqdrdr          S | dsk    rt                              d	dd
          S | dtk    rt                              drd=dr          S | duk    rt                              d	dd	          S | dvk    rt                              ddd          S | dwk    rt                              ddd	          S | dxk    rt                              d	dd          S | dyk    rt                              dzd"d{          S | d|k    rt                              d}d}d}          S | d~k    rt                              d}d}d}          S | dk    rt                              dd}d          S | dk    rt                              dd	dM          S | dk    rt                              d
d	d
          S | dk    rt                              d	d/d          S | dk    rt                              ddd          S | dk    rt                              ddd          S | dk    rt                              d	d	d
          S | dk    rt                              d
ddO          S | dk    rt                              ddd          S | dk    rt                              d	d
d          S | dk    rt                              ddd          S | dk    rt                              d	dd          S | dk    rt                              ddd          S | dk    rt                              d
d}d}          S | dk    rt                              dd	d	          S | dk    rt                              ddd.          S | dk    rt                              dgdgdg          S | dk    rt                              doddo          S | dk    rt                              dgdgdg          S | dk    rt                              d	dd          S | dk    rt                              d	d+dX          S | dk    rt                              d{dqd          S | dk    rt                              d'dcd          S | dk    rt                              dddQ          S | dk    rt                              dddQ          S | dk    rt                              ddd%          S | dk    rt                              d	d	d          S | dk    rt                              dd	d          S | dk    rt                              dRddR          S | dk    rt                              dd
d          S | dk    rt                              d	dd	          S | dk    rt                              d}dd          S | dk    rt                              ddd          S | dk    rt                              ddd          S | dk    rt                              ddLdg          S | dk    rt                              didd          S | dk    rt                              d:dd          S | dk    rt                              ddd          S | dk    rt                              ddd          S | dk    rt                              d]dddS          S | dk    rt                              dddĦ          S | dk    rt                              ddd          S | dk    rt                              dd	d          S | dk    rt                              d	ddɦ          S | dk    rt                              d	dd˦          S | dk    rt                              d	d%d          S | dk    rt                              ddd}          S | dk    rt                              ddd          S | dk    rt                              d}d}d          S | dk    rt                              dIddӦ          S | dk    rt                              d	d"d          S | dk    rt                              d	dd          S | dk    rt                              dzddئ          S | dk    rt                              ddd          S | dk    rt                              dddܦ          S | dk    rt                              ddd          S | dk    rt                              dddi          S | dk    rt                              d	dd          S | dk    rt                              d	dzd          S | dk    rt                              ddd          S | dk    rt                              d	dd          S | dk    rt                              dd+d          S | dk    rt                              ddd          S | dk    rt                              d}dd}          S | dk    rt                              d	dd          S | dk    rt                              d[dZdZ          S | dk    rt                              dd/dɦ          S | dk    rt                              d=dd          S | dk    rt                              dd}d          S | dk    rt                              ddd          S | dk    rt                              dd=d          S | dk    rt                              d	dd          S | dk    rt                              d+d d          S | dk    rt                              ddd          S | dk    rt                              d'dcd          S | dk    rt                              ddd          S | dk    rt                              dd}do          S | dk    rt                              dd}do          S | d	k    rt                              d	dd          S | d
k    rt                              dd	d          S | dk    rt                              ddd          S | dk    rt                              d.ddO          S | dk    rt                              dd}d}          S | dk    rt                              ddkd          S | dk    rt                              d	dd          S | dk    rt                              ddd          S | dk    rt                              ddd          S | dk    rt                              dd%d          S | dk    rt                              d	d	d	          S | dk    rt                              ddd          S | dk    rt                              d	d	d          S | dk    rt                              dddR          S 	 t          |           S # t          $ r t                              ddd          cY S w xY w(  z/Parse SVG Color by Keyword on dictionary lookupr    r   transparentr   	aliceblue            antiquewhite      aqua
aquamarine      azurebeige      bisque      blackblanchedalmond   rd  
blueviolet   +      brown   *   	burlywood         	cadetblue_         
chartreuse	chocolate   i      coralP   cornflowerblued         cornsilkcrimson   <   cyandarkblue   darkcyandarkgoldenrod      darkgray   	darkgreendarkgrey	darkkhaki      k   darkmagentadarkolivegreenU   /   
darkorange   
darkorchid   2      darkred
darksalmon      z   darkseagreen      darkslateblueH   =   darkslategrayO   darkslategreydarkturquoise      
darkviolet      deeppink   deepskyblue   dimgraydimgrey
dodgerblue   	firebrick   "   floralwhiteforestgreenfuchsia	gainsboro
ghostwhitegold	goldenrod       gray   greyrc  greenyellow   honeydewhotpink   	indianred\   indigoK      ivorykhaki   lavenderlavenderblush	lawngreen|      lemonchiffon	lightblue   
lightcoral	lightcyan   lightgoldenrodyellow	lightgray
lightgreen   	lightgrey	lightpink      lightsalmonlightseagreen   lightskybluelightslategrayw      lightslategreylightsteelblue   lightyellowlime	limegreenlinenmagentamaroonmediumaquamarinef   
mediumbluemediumorchid   mediumpurplep      mediumseagreen   q   mediumslateblue{   h   mediumspringgreen   mediumturquoisemediumvioletred         midnightblue   	mintcream	mistyrose   moccasin   navajowhitenavyoldlace   olive	olivedrab   #   orange	orangeredE   orchid   palegoldenrod   	palegreen      paleturquoise   palevioletred
papayawhip      	peachpuff   peru?   pink      plum   
powderbluepurplerb  	rosybrown	royalblueA   saddlebrown   salmonr   
sandybrown      `   seagreen.   W   seashellsiennaR   -   silverskyblue	slatebluej   Z   	slategray	slategreysnowspringgreen	steelblueF   r   tealthistletomatoc   G   	turquoise@      violetwheatwhite
whitesmokeyellowyellowgreen)r   r   r]  ro  replacelowerr   r   r   s    rq   r  zColor.parse_color_lookup  s    !S!! 	+##Aq!,,,		#r""((**A##Aq!S111##Cc222##Cc222##Cc222;;##AsC000##Cc222<<##Cc222<<##Cc222==##Cc222<<##Aq!,,,   ##Cc222;;##Aq#...##CS111<<##CR000##Cc222##BS111##Ca000##Cb111<<##Cb111   ##Cc222
??##Cc222	>>##CR000;;##AsC000
??##Aq#...
??##AsC000##Cb111
??##Cc222##AsA...
??##Cc222##Cc222##CC000   ##BR000##Ca000##CS111	>>##CA...##Cc222##Cc222##BC000##BB///##BB///##AsC000##CC000
??##CS111##AsC000	>>##Cc222	>>##Cc222##BS111##CR000##Cc222##BR000	>>##CC000##Cc222##Cc222;;##Ca000##Cb111;;##Cc222;;##Cc222<<##AsA...##Cb111
??##Cc222	>>##Cc222##CR000==##B3///<<##Cc222<<##Cc222
??##Cc222##Cc222##Ca000##Cc222##Cc222##Cc222##Cc222&&&##Cc222##Cc222##Cc222##Cc222##Cc222##Cc222##BS111##Cc222   ##Cc222   ##Cc222   ##Cc222##Cc222;;##AsA...##BR000<<##Cc222	>>##CC000==##CA..."""##Cc222##Aq#...##CS111##Cc222   ##BS111!!!##Cc222#####AsC000!!!##BS111!!!##CS111##BC000##Cc222##Cc222
??##Cc222##Cc222;;##Aq#...	>>##Cc222<<##Ca000##Cb111==##Ca000##CQ///==##Cc222##Cc222##Cc222##Cc222##Cc222##Cc222##Cc222;;##Cb111;;##Cc222;;##Cc222##Cc222==##CC000::##CA...##Cc222##BS111##CR000==##Cc222##Cb111
??##BR000
??##Cc222==##CR000==##Cc222	>>##Cc222##CS111##Cc222##Cc222;;##Cc222##AsC000##BS111::##Cc222;;##AsC000	>>##Cc222==##CR000##BS111==##Cc222<<##Cc222<<##Cc222##Cc222==##Ca000##Cb111	-q66M 	- 	- 	-##Aq!,,,,,	-s   QAQ Q&AQ:Q9AQ:c                 d   |                      d          }t          |          }|dk    rt          |dd         d          S |dk    r/d                    |dd                   }t          |d          }|S |dk    rW|d         |d         z   |d	         z   |d	         z   |d
         z   |d
         z   |d         z   |d         z   }t          |d          S |dk    r;d                    |d         |d	         |d
                   }t          |d          }|S t                              ddd          S )zParse SVG Color by Hex String#r  Nr     z{0}FFr`  r   r   r   r_  z{0}{0}{1}{1}{2}{2}FF)lstripr   r   formatr]  ro  )
hex_stringr   sizer   r   s        rq   r  zColor.parse_color_hex  s)    c""1vv199q!ub>>!QYYq!u%%AAr

AHQYY!qtad"QqT)AaD01Q47!A$>1EAq"::QYY&--adAaD!A$??AAr

AH1a(((rt   c                     t          | d                   }t          | d                   }t          | d                   }| d         t          | d                   }nd}t                              ||||          S )z'Parse SVG Color, RGB value declarationsr   r   r   r_  )r   r   r]  ro  )valuesrB   r"   rg  rf  s        rq   r  zColor.parse_color_rgb  sm     q	NNq	NNq	NN!9 F1I&&GGG1a111rt   c                 ^   d}t          t          | d                   |z            }t          t          | d                   |z            }t          t          | d                   |z            }| d         t          | d                   }nd}t                              ||||          S )z/Parse SVG color, RGB percent value declarationsgffffff@r   r   r   r_  )r  r   r]  ro  )r  ratiorB   r"   rg  rf  s         rq   r  zColor.parse_color_rgbp  s     %q	""U*++%q	""U*++%q	""U*++!9 F1I&&GGG1a111rt   c                 j   t                               | d                   }|j        }t          | d                   dz  }|dk    rd}|dk     rd}t          | d                   dz  }|dk    rd}|dk     rd}| d         t          | d                   }nd}t                              ||||          S )z'Parse SVG color, HSL value declarationsr   r   r   r  r   r   r_  )Angler   as_turnsr   r]  r  )r  r   r   r   rf  s        rq   r  zColor.parse_color_hsl%  s     KKq	""J&)u$q55Aq55A&)u$q55Aq55A!9 F1I&&GGG1a111rt   c                     dt           fd}dt           fd} ||          }t           ||d                    ||d                    ||d                             S )zN
        Produces a deterministic distinct color for the given index.
        r3   c                    t          | dz            }| ||z  |z  z  } |gdz  }| dk    r|S | dz  } t          | dz            }t          | dz            } | |k     r
| |z  ||<   |S | |z  } | |z  ||<   |dz  }| |z  ||dz  <   |S )Nr  r_  r   r   r   )r3   npr   s       rq   _patternz Color.distinct.<locals>._pattern@  s    G	*++Aq1uqy GaA!||qLGGaK  A'Q,''G{{{!qLGa<AaDFA{Aa!eHHrt   rB   c                 n    | dz
  }d}t          dd          D ]}||dz  z  }|dz  }|dz  }|dz  }|dz  S )Nr   r   r  r  )range)rB   r   r   is       rq   _8bit_reversez%Color.distinct.<locals>._8bit_reverseT  sZ    EEA1a[[  Oa!!GAt8Ort   r   r   r   )r   r]  )clsindexr  r  r  s        rq   distinctzColor.distinct:  s    	c 	 	 	 	(	S 	 	 	 	 HUOOM!A$M!A$M!A$
 
 	
rt   c                 (    | j         d S | j         dz	  S )Nr  rr  r   s    rq   rh  z	Color.rgbe  s    :4zQrt   c                 (    |dz  }|dz  }|| _         d S Nr  r  rr  )r   rh  s     rq   rh  z	Color.rgbk  s    	t


rt   c                 N    | j         d S | j        dz  | j        dz  z  | j        z  S )Nr  r  )r   rd  rc  rb  r   s    rq   ri  z	Color.bgrq  s-    :4yBq048;;rt   c                 j    d| _         d| _        |dz  | _        |dz	  dz  | _        |dz	  dz  | _        d S )Nr   r  r  r  )r   re  rb  rc  rd  )r   ri  s     rq   ri  z	Color.bgrw  s?    

:Qh$&
BY$&			rt   c                     | j         S r   rr  r   s    rq   rk  z
Color.rgba  s
    zrt   c                     || _         d S r   rr  )r   rk  s     rq   rk  z
Color.rgba  s    


rt   c                 D    | j         d S | j         dz	  dz  | j        dz  z  S )Nr  i r  r   re  r   s    rq   rj  z
Color.argb  s,    :4qH,r1ABBrt   c                 2    |dz  dz  |dz	  dz  z  | _         d S )Nr  l     r  r  rr  )r   rj  s     rq   rj  z
Color.argb  s$    qyJ.42:3DE


rt   c                 (    | j         
| j        dz  nd S Nra  r  r   s    rq   rf  zColor.opacity  s    %)Z%;tzE!!Ert   c                     | j         t          t          t          |dz                      }t                              |          }|| _        d S r  )r   r   r   r  r]  r  re  )r   rf  r   s      rq   rf  zColor.opacity  sC    :go&&''KKNN


rt   c                 (    | j         
| j         dz  nd S Nr  rr  r   s    rq   re  zColor.alpha  s    $(J$:tzD  Drt   c                     | j         t          t                              |          }| xj         dz  c_         | xj         |z  c_         d S )Ni r   r   r]  r  )r   r   s     rq   re  zColor.alpha  sB    :KKNN

e



a



rt   c                 .    | j         | j         dz	  dz  nd S )Nr  r  rr  r   s    rq   rb  z	Color.red       ,0J,B
b D((Lrt   c                     | j         t          t                              |          }| xj         dz  c_         | xj         |dz  z  c_         d S )Nl  ~ r  r  )r   rB   s     rq   rb  z	Color.red  sG    :KKNN

k!



a2g



rt   c                 .    | j         | j         dz	  dz  nd S )Nr  r  rr  r   s    rq   rc  zColor.green  r  rt   c                     | j         t          t                              |          }| xj         dz  c_         | xj         |dz  z  c_         d S )Ni r  r  )r   r"   s     rq   rc  zColor.green  sG    :KKNN

i



a2g



rt   c                 .    | j         | j         dz	  dz  nd S r  rr  r   s    rq   rd  z
Color.blue  s    +/:+A
a4''tKrt   c                     | j         t          t                              |          }| xj         dz  c_         | xj         |dz  z  c_         d S )Ni r  r  )r   rg  s     rq   rd  z
Color.blue  sG    :KKNN

g



a1f



rt   c                 N    | j         d S d| j        | j        | j        | j        fz  S )Nz#%02x%02x%02x%02x)r   rb  rc  rd  re  r   s    rq   hexaz
Color.hexa  s+    :4"dh
DItz%RRRrt   c                 B    | j         d S d| j        | j        | j        fz  S )Nz#%02x%02x%02xr   rb  rc  rd  r   s    rq   hexrgbzColor.hexrgb  s'    :4$(DJ	!BBBrt   c                 F    | j         d S | j        dk    r| j        S | j        S r  )r   re  r  r  r   s    rq   ru  z	Color.hex  s,    :4:;9rt   c                    | j         d S | j        dz  }| j        dz  }| j        dz  }t	          |||          }t          |||          }||z
  }|dk    rdS ||z
  dz  |dz  z   |z  }||z
  dz  |dz  z   |z  }||z
  dz  |dz  z   |z  }	||k    r|	|z
  }
n||k    r	d|z   |	z
  }
nd|z   |z
  }
|
dk     r|
dz  }
|
dk    r|
dz  }
t                              |
          j        S )Nra  r   r  r  r  r  r   )	r   rb  rc  rd  rJ  rK  r  turns
as_degrees)r   rB   r"   rg  var_minvar_max	delta_maxdrdgdbr   s              rq   rl  z	Color.hue  s1   :4HuJIaA,,aA,,g%	>>1!s"i#o5B!s"i#o5B!s"i#o5B<<RAA'\\b 2%AAb 2%Aq55FAq55FA{{1~~((rt   c                 L    | j         t          | j        \  }}}|||f| _        d S r   r   r   hslr   r   r   r   r   s        rq   rl  z	Color.hue  .    :(1aa7rt   c                     | j         d S | j        dz  }| j        dz  }| j        dz  }t	          |||          }t          |||          }||z
  }||k    rdS ||z   dk     r|||z   z  S |d|z
  |z
  z  S )Nra  r   r   r  r   rb  rc  rd  rJ  rK  )r   rB   r"   rg  min_vmax_vdeltas          rq   rm  zColor.saturation  s    :4HuJIAq!Aq!E>>3EMQEEM**C%K%/00rt   c                 L    | j         t          | j        \  }}}|||f| _        d S r   r  r  s        rq   rm  zColor.saturation  r  rt   c                     | j         d S | j        dz  }| j        dz  }| j        dz  }t	          |||          }t          |||          }||z   dz  S )Nra  r  r  )r   rB   r"   rg  r  r  s         rq   rn  zColor.lightness  s`    :4HuJIAq!Aq!$$rt   c                 L    | j         t          | j        \  }}}|||f| _        d S r   r  r  s        rq   rn  zColor.lightness'  r  rt   c                 T    | j         d S | j        }| j        }| j        }||z   |z   dz  S )Ng      @r  r   rB   r"   rg  s       rq   	intensityzColor.intensity.  s7    :4HJIA	U""rt   c                 j    | j         d S | j        }| j        }| j        }t	          |||          }|dz  S r  )r   rb  rc  rd  rK  )r   rB   r"   rg  cmaxs        rq   
brightnesszColor.brightness7  s=    :4HJI1a||e|rt   c                 (    | j         d S d| j        z
  S r  )r   r  r   s    rq   	blacknesszColor.blacknessA  s    :4T_$$rt   c                 r    | j         d S | j        dz  }| j        dz  }| j        dz  }|dz  |dz  z   |dz  z   S )Nra  g333333?gzG?g)\(?r  r  s       rq   	luminancezColor.luminanceG  sO    :4HuJI3wT!AH,,rt   c                 r    | j         d S | j        dz  }| j        dz  }| j        dz  }|dz  |dz  z   |dz  z   S )Nra  gz6?g,C?g]m{?r  r  s       rq   lumaz
Color.lumaP  sO    :4HuJI6zAJ&V33rt   c                    t          | t                    rt                              |           } n$t          | t                    rt          |           } t          |t                    rt                              |          }n$t          |t                    rt          |          }| j        }| j        }| j        }| j        }|dk    r| j	        S |dk    r|j	        S |j        }|j        }|j        }|j        }	d|z
  }
||z  dz  ||	z  |
z  z   }||z  dz  ||	z  |
z  z   }||z  dz  ||	z  |
z  z   }|dz  |	|
z  z   }||z  }||z  }||z  }|dz  }t          
                    ||||          S )z
        Porter Duff Alpha compositing operation over.
        Returns c1 over c2. This is the standard painter algorithm.
        r  r   ra  g     @)r   r   r]  r   r   rb  rc  rd  re  r   ro  )c1c2r1g1b1a1r2g2b2a2r   srsgsbsas                  rq   overz
Color.overY  s    b# 	RBBC   	rBb# 	RBBC   	rBVXWX998O778OVXWXBJ"Wu_rBw{*"Wu_rBw{*"Wu_rBw{*%Z"q& 
b
b
b
mBB///rt   c                 R    t          t                              | |                    S r   )r   r]  distance_sq)r  r  s     rq   distancezColor.distance  s     E%%b"--...rt   c                 
   t          | t                    rt          |           } n$t          | t                    rt          |           } t          |t                    rt          |          }n$t          |t                    rt          |          }t          | j        |j        z   dz            }| j        |j        z
  }| j        |j        z
  }| j        |j        z
  }d|z   |z  |z  dz	  d|z  |z  z   d|z
  |z  |z  dz	  z   S )a  
        Function returns the square of colordistance. The square of the color distance will always be closer than the
        square of another color distance.

        Rather than naive Euclidean distance we use Compuphase's Redmean color distance.
        https://www.compuphase.com/cmetric.htm

        It's computationally simple, and empirical tests finds it to be on par with LabDE2000.

        :param c1: first color
        :param c2: second color
        :return: square of color distance
        r  i   r  r`  i  )r   r   r]  r   rb  rc  rd  )r  r  red_meanrB   r"   rg  s         rq   r  zColor.distance_sq  s    b# 	rBBC   	rBb# 	rBBC   	rB3.//FRVOHrxGbgX~"Q&1,1uqyx1$q(Q.0	
rt   c                 @    | dk    rdS | dk     rdS t          |           S )Nr  r   r  r  s    rq   r  zColor.crimp  s)    s773q5511vvrt   c                 <    | j         d S | j        | j        | j        fS r   )r   rl  rm  rn  r   s    rq   r  z	Color.hsl  s"    :4x$.88rt   c                     t          |t          t          f          sd S |d         }|d         }|d         }t                              |||d          | _        d S )Nr   r   r   r  )r   tuplelistr]  r  r   )r   r   r   r   r   s        rq   r  z	Color.hsl  sW    %%// 	F!H!H!H%%aAs33


rt   c                 8    t                               | |          S r   )r]  r   r   s     rq   distance_tozColor.distance_to  s    ~~dE***rt   Nc                     |"t                               ||           | _        dS t          |          }||_        t                               ||           | _        dS )z@
        Blends the given color with the current color.
        N)r]  r  r   rf  )r   r   rf  r8   s       rq   blendzColor.blend  sM     ?E400DJJJ%LLE#EME400DJJJrt   r  r   )3r   r   r   rT  r   rs  r(  r%  r  r  r   r[  ro  r  r   r  r  r  r  r  classmethodr  rY  rh  setterri  rk  rj  rf  re  rb  rc  rd  r  r  ru  rl  rm  rn  r  r  r	  r  r  r  r   r  r  r  r)  r+  rm   rt   rq   r]  r]    s        C1 C1 C1J    
) ) )9 9 9! ! !6 6 6    \     \< 6 6 \6$ s- s- \s-j	 ) ) \)& 	2 	2 \	2 
2 
2 \
2 2 2 \2( (
 (
 [(
T   X
 	Z  Z
 < < X<
 	Z' ' Z'   X 
[  [ C C XC
 
[F F [F F F XF ^  ^ E E XE \  \ M M XM 	Z  Z M M XM \  \ L L XL 
[  [ S S XS
 C C XC
   X ) ) X)4 	Z  Z 1 1 X1     % % X%    # # X#   X % % X%
 - - X- 4 4 X4 $0 $0 \$0L / / \/ 
 
 \
@   \ 9 9 X9
 	Z4 4 Z4+ + +	1 	1 	1 	1 	1 	1rt   r]  c                   |   e Zd ZdZd)dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd ZeZd Zd ZeZd Zd Zd Zd Zd Zd Zd Zd Zed             Zed             Zd Z d*dZ!d Z"d  Z#d! Z$d" Z%e&d#             Z'e&d$             Z(e&d%             Z)e&d&             Z*e&d'             Z+e&d(             Z,dS )+Pointa  Point is a general subscriptable point class with .x and .y as well as [0] and [1]

    For compatibility with regebro svg.path we accept complex numbers as points x + yj,
    and provide .real and .imag as properties. As well as float and integer values as (v,0) elements.

    With regard to SVG 7.15.1 defining SVGPoint this class provides for matrix transformations.

    Points are only positions in real Euclidean space. This class is not intended to interact with
    the Length class.
    Nc                    ||t          |t                    rMt                              |          d         \  }}t	          |          | _        t	          |          | _        d S 	 |j        | _        |j        | _        d S # t          $ r Y nw xY w	 |d         | _        |d         | _        d S # t          t          f$ r Y nw xY w	 |j
        | _        |j        | _        d S # t          $ r t          w xY w|| _        || _        d S r   )r   r   REGEX_COORD_PAIRr   r   rE   rF   AttributeErrorrS  
IndexErrorimagreal)r   rE   rF   string_xstring_ys        rq   r   zPoint.__init__  s*   =QY!S!! %5%=%=a%@%@%C"(xx!   11z*    !        s0   (B 
BBB/ /CCC! !C3c                     | j         | j        fS r   rE   rF   r   s    rq   __keyzPoint.__key  s    vtv~rt   c                 D    t          |                                           S r   )hash_Point__keyr   s    rq   __hash__zPoint.__hash__  s    DJJLL!!!rt   c                 (   |dS 	 t          |t                    st          |          }n# t          $ r
 t          cY S w xY wt          | j        t
                    sNt          | j        t
                    s4t          |j        t
                    st          |j        t
                    r | j        |j        k    o| j        |j        k    S t          | j        |j        z
            t          k    o$t          | j        |j        z
            t          k    S NF)	r   r0  	ExceptionNotImplementedrE   r   rF   r   r+  r   s     rq   r  zPoint.__eq__  s   =5	"eU++ %e 	" 	" 	"!!!!	" tvv&&	;$&&))	; %'6**	; %'6**		; 6UW$:57)::46EG#$$-P#dfuw6F2G2G52PPs   $+ ??c                     | |k     S r   rm   r   s     rq   r  zPoint.__ne__  r|  rt   c                     dS Nr   rm   r   s    rq   __len__zPoint.__len__      qrt   c                 D    |dk    r| j         S |dk    r| j        S t          r   rE   rF   r4  r   items     rq   __getitem__zPoint.__getitem__  s(    1996MQYY6Mrt   c                 L    |dk    r	|| _         d S |dk    r	|| _        d S t          r   rJ  r   keyr   s      rq   __setitem__zPoint.__setitem__  s0    !88DFFFAXXDFFFrt   c                     t                               | j                  }t                               | j                  }d|d|dS )NzPoint(,rh   )r   r   rE   rF   r   x_stry_strs      rq   r%  zPoint.__repr__!  s=    

46""

46""!&..rt   c                 6    t          | j        | j                  S r   )r0  rE   rF   r   s    rq   r   zPoint.__copy__&      TVTV$$$rt   c                 4   	 d| j         z  }n$# t          $ r |                                 cY S w xY wd|v r(|                    d                              d          }d| j        z  }d|v r(|                    d                              d          }|d|S )Nz%.12GrO  rP  rS  )rE   rS  r%  rR  rF   rT  s      rq   r(  zPoint.__str__)  s    	#df$EE 	# 	# 	#==??"""	#%<<LL%%,,S11E$& %<<LL%%,,S11E%%''s   
 ..c                 V   t          |t                    rt          |          }t          |t                    r/|                    |           }|j        | _        |j        | _        | S 	 t          |           t          |j        |j                  z  }|j        | _        |j        | _        | S # t          $ r Y nw xY w	 t          |           t          |d         |d                   z  }|j        | _        |j        | _        | S # t          t          f$ r Y nw xY w	 t          |           t          |j        |j                  z  }|j        | _        |j        | _        | S # t          $ r Y nw xY w	 | xj        |z  c_        | xj        |z  c_        | S # t          $ r
 t          cY S w xY wr   )r   r   Matrixpoint_in_matrix_spacerE   rF   complexr6  r5  r3  rS  r4  rB  rC  )r   r   r   r   s       rq   r   zPoint.__imul__5  s   eS!! 	"5MMEeV$$ 	++D11ASDFSDFK	 9 99AVDFVDFK 	 	 	D		a%( ; ;;AVDFVDFK:& 	 	 	D		
EJ ? ??AVDFVDFK 	 	 	D		"FFeOFFFFeOFFK 	" 	" 	"!!!!	"sK   *AB. .
B;:B;?AD DDAE! !
E.-E.2!F F('F(c                    t          |t                    rt          |          }t          |t                    r|                    |           S 	 t	          t          |           t          |j        |j                  z            S # t          $ r Y nw xY w	 t	          t          |           t          |d         |d                   z            S # t          t          f$ r Y nw xY w	 t	          t          |           t          |j        |j                  z            S # t          $ r Y nw xY w	 t	          | j        |z  | j        |z            S # t          $ r
 t          cY S w xY wr   )r   r   r[  r\  r0  r]  rE   rF   r3  rS  r4  r6  r5  rB  rC  r   s     rq   r  zPoint.__mul__Y  sz   eS!! 	"5MMEeV$$ 	5..t444	%')B)BBCCC 	 	 	D		q58)D)DDEEE:& 	 	 	D		UZ)H)HHIII 	 	 	D		"%%888 	" 	" 	"!!!!	"sH   6B 
BB8C C%$C%)6D   
D-,D-1E E%$E%c                    	 | xj         |j         z  c_         | xj        |j        z  c_        | S # t          $ r Y nw xY w	 | xj        |d         z  c_        | xj         |d         z  c_         | S # t          t          f$ r Y nw xY w	 | xj         |j        z  c_         | xj        |j        z  c_        | S # t          $ r Y nw xY w	 | xj         |z  c_         | S # t          $ r
 t          cY S w xY wNr   r   	rE   rF   r3  rS  r4  r6  r5  rB  rC  r   s     rq   r   zPoint.__iadd__q  5   	FFegFFFFegFFK 	 	 	D		FFeAhFFFFeAhFFK:& 	 	 	D		FFej FFFFej FFK 	 	 	D		"FFeOFFK 	" 	" 	"!!!!	"A   +. 
;;-A- -B B+B1 1
B>=B>C C('C(c                    	 | j         |j         z   }| j        |j        z   }t          ||          S # t          $ r Y nw xY w	 | j        |d         z   }| j         |d         z   }t          ||          S # t          t
          f$ r Y nw xY w	 | j         |j        z   }| j        |j        z   }t          ||          S # t          $ r Y nw xY wt          |t          t          f          r| j         |z   }t          || j                  S t          S r`  rE   rF   r0  r3  rS  r4  r6  r5  r   r   r   rC  r   r   rE   rF   s       rq   r  zPoint.__add__  1   	 A AA;; 	 	 	D		q!Aq!AA;;:& 	 	 	D		#A#AA;; 	 	 	D	eeS\** 	$ADF###0   -0 
==/A1 1BB	-B7 7
CCc                    	 | xj         |j         z  c_         | xj        |j        z  c_        | S # t          $ r Y nw xY w	 | xj        |d         z  c_        | xj         |d         z  c_         | S # t          t          f$ r Y nw xY w	 | xj         |j        z  c_         | xj        |j        z  c_        | S # t          $ r Y nw xY w	 | xj         |z  c_         | S # t          $ r
 t          cY S w xY wr`  ra  r   s     rq   r  zPoint.__isub__  rb  rc  c                    	 | j         |j         z
  }| j        |j        z
  }t          ||          S # t          $ r Y nw xY w	 | j        |d         z
  }| j         |d         z
  }t          ||          S # t          t
          f$ r Y nw xY w	 | j         |j        z
  }| j        |j        z
  }t          ||          S # t          $ r Y nw xY wt          |t          t          f          r| j         |z
  }t          || j                  S t          S r`  re  rf  s       rq   r  zPoint.__sub__  rg  rh  c                    	 |j         | j         z
  }|j        | j        z
  }t          ||          S # t          $ r Y nw xY w	 |d         | j        z
  }|d         | j         z
  }t          ||          S # t          t
          f$ r Y nw xY w	 |j        | j         z
  }|j        | j        z
  }t          ||          S # t          $ r Y nw xY wt          |t          t          f          r|| j         z
  }t          || j                  S t          S r`  re  rf  s       rq   r!  zPoint.__rsub__  s1   	$& A$& AA;; 	 	 	D		a46!Aa46!AA;;:& 	 	 	D		
TV#A
TV#AA;; 	 	 	D	eeS\** 	$ADF###rh  c                 &    | j         | j        dz  z   S )N              ?r:  r   s    rq   __complex__zPoint.__complex__  s    v##rt   c                 6    t          | j        | j                  S r   )r   rE   rF   r   s    rq   r   zPoint.__abs__  rX  rt   c                     t          |           |z  }|                                 |z  }t          |t          |          z            }t          |t	          |          z            }|                     ||          S r   )r   argzr  r
   r   	__class__)r   r   r_raisedargz_multiplied	real_part	imag_parts         rq   __pow__zPoint.__pow__  sl    t99%))++-(S%9%99::	(S%9%99::	~~i333rt   c                 D    |                      | j        | j                   S r   )rr  r6  r5  r   s    rq   	conjugatezPoint.conjugate  s    ~~di$)444rt   c                 :    t          | j        | j        z            S r   )r   r5  r6  r   s    rq   rq  z
Point.argz  s    DI	)***rt   c                     | j         S z'Emulate svg.path use of complex numbersrE   r   s    rq   r6  z
Point.real	       vrt   c                     | j         S r|  rF   r   s    rq   r5  z
Point.imag	  r~  rt   c                     | |z  } | S r   rm   )r   rX   s     rq   matrix_transformzPoint.matrix_transform	  s    rt   r   c                 d    t          |t                    st          |          }| ||| z
  z  z  } d S r   r   r0  )r   p2r   s      rq   move_towardszPoint.move_towards	  s6    "e$$ 	rB"t)$$rt   c                 &    t          | |z
            S r   r   )r   r  s     rq   r)  zPoint.distance_to	  s    4"9~~rt   c                 p    || z
  }t                               t          |j        |j                            S r   )r  r   r   rF   rE   )r   r  r  s      rq   angle_tozPoint.angle_to	  s)    I}}U13__---rt   c                 n    t                               | ||          }|j        | _        |j        | _        | S r   )r0  polarrE   rF   )r   angler   r   s       rq   polar_tozPoint.polar_to	  s.    KKeX..rt   c                     ||| z
  z   S r   rm   r   r  s     rq   reflected_acrosszPoint.reflected_across!	  s    AH~rt   c                     |d         | d         z
  |d         |d         z
  z  |d         | d         z
  |d         |d         z
  z  z
  }|dk    rdS |dk    rdS dS )zTDetermine the clockwise, linear, or counterclockwise orientation of the given pointsr   r   r   rm   )r  r   rB   vals       rq   orientationzPoint.orientation$	  si     tad{qtad{+qtad{qtad{.KK!8811WW11rt   c              #      K   t          |           dk    rd S t          t          |           d           }|d         }|}	 |V  |}|D ](}||u s t                              |||          dk    r|})|}||u rd S :)Nr   c                     | d         S r}   rm   )r  s    rq   <lambda>z#Point.convex_hull.<locals>.<lambda>3	  s
    ! rt   )rP  Tr   )r   sortedsetr0  r  )ptsrC   first_point_on_hullpoint_on_hullendpointr   s         rq   convex_hullzPoint.convex_hull/	  s      s88q==FCnn555$Qi+	$H ! !!X--((8DDII H$M"m33	rt   c                 ~    | d         |d         z
  }| d         |d         z
  }||z  }||z  }t          ||z             S r   )r   )p1r  rM   rN   s       rq   r   zPoint.distanceC	  sF    URU]URU]
b
bBG}}rt   c                     t          |          |z  }t          |          |z  }t          | d         |z   | d         |z             S r   )r
   r   r0  )r  r  rB   rM   rN   s        rq   r  zPoint.polarK	  s@    ZZ!^ZZ!^RURZA,,,rt   c                     t                               t          |d         | d         z
  |d         | d         z
                      S r`  )r  r   r   )r  r  s     rq   r  zPoint.angleQ	  s6    }}U2a52a5="Q%"Q%-@@AAArt   c                     ||d         | d         z
  z  | d         z   }||d         | d         z
  z  | d         z   }t          ||          S r   r0  )r  r  r   txtys        rq   towardszPoint.towardsU	  sN    r!ur!u}%1-r!ur!u}%1-R}}rt   r   )r   )-r   r   r   rT  r   r>  r?  r  r  rG  rM  rQ  r%  r   r(  r   r  rX  r   r  rW  r  r  r!  rn  r   rw  ry  rq  rY  r6  r5  r  r  r)  r  r  r  r[  r  r  r   r  r  r  rm   rt   rq   r0  r0    s       	 	   :  " " "Q Q Q"! ! !      / / /
% % %
( 
( 
("" "" ""H" " ", H" " "2  0 H" " "2  0  0$ $ $% % %4 4 45 5 5+ + +   X   X  % % % %
  . . .       \   \&   \ - - \-
 B B \B   \  rt   r0  c                      e Zd ZdZd Zd Zd Zd Zed             Z	ed             Z
ed             Zed	             Zed
             Zed             Zed             Zed             Zed             Zed             Zd ZdS )r  z$CSS Angle defines as used in SVG/CSSc                     d| z  S )NzAngle(%.12f)rm   r   s    rq   r%  zAngle.__repr___	  s    $$rt   c                      t          |           S r   )r  r   s    rq   r   zAngle.__copy__b	      T{{rt   c                 R    t          | t          z  |t          z  z
            dk    }|S )Ngdy=)r   r   )r   r   r  s      rq   r  zAngle.__eq__e	  s&    $*-..%7	rt   c                 0    t          | t          z            S r   )r  r   r   s    rq   
normalizedzAngle.normalizedj	  s    TCZ   rt   c                 T   t          |t                    sd S |                                }|                    d          r/t                              t          |d d                             S |                    d          r/t                              t          |d d                             S |                    d          r/t                              t          |d d                             S |                    d          r/t          	                    t          |d d                             S |                    d          r2t          	                    t          |d d                   d	z            S t                              t          |                    S )
Ndeggradradturnre   r   )
r   r   r  endswithr  r   r   gradiansr   r  )r  angle_strings     rq   r   zAngle.parsem	  sn   ,,, 	F#))++  '' 	;==|CRC'8!9!9:::  (( 	<>>%SbS(9":":;;;  
 
 	; ==|CRC'8!9!9:::  (( 	9;;u\#2#%677888  %% 	A;;u\#2#%677%?@@@}}U<00111rt   c                      | |          S r   rm   )r  r   s     rq   r   zAngle.radians	  s    s7||rt   c                 .     | t           |z  dz            S N     v@r   )r  r   s     rq   r   zAngle.degrees	  s    s3=5()))rt   c                 .     | t           |z  dz            S Ng      y@r   )r  r  s     rq   r  zAngle.gradians	  s    s3>E)***rt   c                 (     | t           |z            S r   r   )r  r  s     rq   r  zAngle.turns	  s    s3;rt   c                      t          |           S r   )r   r   s    rq   
as_radianszAngle.as_radians	  s    T{{rt   c                     | dz  t           z  S r  r   r   s    rq   r  zAngle.as_degrees	      e|c!!rt   c                 6    | j         }|dk     r|dz  }|dk     |S )Nr   r  )r  )r   r   s     rq   as_positive_degreeszAngle.as_positive_degrees	  s+    O!eeJA !eert   c                     | dz  t           z  S r  r   r   s    rq   as_gradianszAngle.as_gradians	  r  rt   c                     | t           z  S r   r   r   s    rq   r  zAngle.as_turns	  s    czrt   c                 $    | t           dz  z  dk    S )Nr   r   r   r   s    rq   is_orthogonalzAngle.is_orthogonal	  s    c	"q((rt   N)r   r   r   rT  r%  r   r  r  r-  r   r   r   r  r  rY  r  r  r  r  r  r  rm   rt   rq   r  r  \	  ss       ..% % %    
! ! ! 2 2 [2$   [ * * [* + + [+     [    X " " X"   X " " X"   X) ) ) ) )rt   r  c                   (   e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Ze	Ze
ZeZd
 Zd Zd Zd Zd Zed             Zd Z	 	 	 	 	 	 	 dJdZed             Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#dKd!Z$dLd"Z%dLd#Z&dMd$Z'dNd%Z(dNd&Z)dMd'Z*dOd(Z+dPd)Z,dPd*Z-d+ Z.dKd,Z/dLd-Z0dLd.Z1dMd/Z2dNd0Z3dNd1Z4dMd2Z5dOd3Z6dPd4Z7dPd5Z8d6 Z9d7 Z:d8 Z;d9 Z<e=d:             Z>e=d;             Z?e=d<             Z@e=d=             ZAe=dQd>            ZBe=dRd?            ZCe=dRd@            ZDe=dMdA            ZEe=dNdB            ZFe=dNdC            ZGe=dNdD            ZHe=dMdE            ZIe=dNdF            ZJe=dNdG            ZKe=dH             ZLeMdI             ZNdS )Sr[  aF  
    Provides svg matrix interfacing.

    SVG 7.15.3 defines the matrix form as:
    [a c  e]
    [b d  f]

    While e and f are defined as floats, they can be for limited periods defined as a Length.
    With regard to CSS, it's reasonable to perform operations like 'transform(20cm, 20cm)' and
    expect these to be treated consistently. Performing other matrix operations in a consistent
    way. However, render must be called to change these parameters into float locations prior to
    any operation which might be used to transform a point or polyline or path object.
    c                 t   d| _         d| _        d| _        d| _        d| _        d| _        t          |          }|dk    rd S |dk    r|d         }t          |t                    r(|sd S | 	                    |            | j
        d	i | d S |d         | _         |d         | _        |d         | _        |d         | _        |d         | _        |d         | _        d S |d         | _         |d         | _        |d         | _        |d         | _        |d         | _        |d         | _         | j
        d	i | d S )
Nr  r   r   r   r   r_  r`  r   rm   )r   rg  r   r6   efr   r   r   r   render)r   
componentsr   len_argsr   s        rq   r   zMatrix.__init__	  sI   z??q==D]]1A!S!!  F

1%%f%%%%%111111]DF]DF]DF]DF]DF]DFDK!!&!!!!!rt   c                 .    |                      |           S r   r  r   s     rq   r  zMatrix.__ne__	  r  rt   c                 \   |dS t          |t                    rt          |          }t          |t                    sdS t          | j        |j        z
            dk    rdS t          | j        |j        z
            dk    rdS t          | j        |j        z
            dk    rdS t          | j        |j        z
            dk    rdS | j        |j        k    r"t          | j        |j        z
            dk    rdS | j	        |j	        k    r"t          | j	        |j	        z
            dk    rdS dS )NFr   T)
r   r   r[  r   r   rg  r   r6   r  r  r   s     rq   r  zMatrix.__eq__	  s'   =5eS!! 	"5MME%(( 	5tv  5((5tv  5((5tv  5((5tv  5((56UWTVeg%5!6!6!>!>56UWTVeg%5!6!6!>!>5trt   c                     dS )Nr  rm   r   s    rq   rG  zMatrix.__len__	  rH  rt   c                 R    |                                  }|                                S r   )r   inverser   r   s     rq   
__invert__zMatrix.__invert__	  s    MMOOyy{{rt   c                 N    t          |           }|                    |           |S r   r   __imatmul__r   r   r   s      rq   
__matmul__zMatrix.__matmul__	  $    JJ	ert   c                 N    t          |          }|                    |            |S r   r  r  s      rq   __rmatmul__zMatrix.__rmatmul__	  $    KK	drt   c                     t          |t                    rt          |          }t                              | |          \  | _        | _        | _        | _        | _        | _	        | S r   )
r   r   r[  matrix_multiplyr   rg  r   r6   r  r  r   s     rq   r  zMatrix.__imatmul__
  sY    eS!! 	"5MME9?9O9O%:
 :
6 rt   c                 
   |dk    rt          | j                  S |dk    rt          | j                  S |dk    rt          | j                  S |dk    rt          | j                  S |dk    r| j        S |dk    r| j        S d S Nr   r   r   r_  r`  r   )r   r   rg  r   r6   r  r  rK  s     rq   rM  zMatrix.__getitem__
  s    199== QYY== QYY== QYY== QYY6MQYY6M Yrt   c                     |dk    r	|| _         d S |dk    r	|| _        d S |dk    r	|| _        d S |dk    r	|| _        d S |dk    r	|| _        d S |dk    r	|| _        d S d S r  r   rg  r   r6   r  r  rO  s      rq   rQ  zMatrix.__setitem__
  s    !88DFFFAXXDFFFAXXDFFFAXXDFFFAXXDFFFAXXDFFF Xrt   c                    dt                               | j                  dt                               | j                  dt                               | j                  dt                               | j                  dt                               | j                  dt                               | j                  dS )NzMatrix(, rh   )r   r   r   rg  r   r6   r  r  r   s    rq   r%  zMatrix.__repr__,
  s     JJtvJJtvJJtvJJtvJJtvJJtv
 	
rt   c                 f    t          | j        | j        | j        | j        | j        | j                  S r   )r[  r   rg  r   r6   r  r  r   s    rq   r   zMatrix.__copy__6
  s&    dfdfdfdfdfdfEEErt   c                 T    d| j         | j        | j        | j        | j        | j        fz  S )zs
        Many of SVG's graphics operations utilize 2x3:

        :returns string representation of matrix.
        z[%3f, %3f,
 %3f, %3f,   %s, %s])r   r   rg  r6   r  r  r   s    rq   r(  zMatrix.__str__9
  s4     2FFFFFF5
 
 	
rt   c                     t          dd          }|| z  }t          dd          }|| z  }|                    |          S r`  )r0  r  r   prxorigins      rq   r   zMatrix.rotationH
  s@    Aqkktq!$s###rt   c                    |sdS t          |t                    st          d          t                              |                                          D ]}|d         }t          t                              |d                             }d |D             }t          |k    r t          t          |          } | j        |  ot          |k    r	 t          |d                                                   }n# t          $ r Y w xY w	 t          |d                                                   }|                     ||           # t          $ r |                     |           Y w xY wt"          |k    r=|                     t          |d                                                   d           `t$          |k    r=|                     dt          |d                                                              t&          |k    r!t          t          |          } | j        |  t*          |k    r+|                     t          |d                   d           
t,          |k    r+|                     dt          |d                              @t.          |k    rt0                              |d                   }	 t          |d                                                   }n&# t          $ r |                     |           Y w xY w	 t          |d                                                   }|                     |||           # t          $ r |                     ||           Y w xY wt6          |k    rt0                              |d                   }	 t0                              |d                   }	n# t          $ r Y }w xY w	 t          |d                                                   }n'# t          $ r |                     ||	           Y w xY w	 t          |d                                                   }|                     ||	||           # t          $ r |                     ||	|           Y 7w xY wt:          |k    rt0                              |d                   }	 t          |d                                                   }n&# t          $ r |                     |           Y w xY w	 t          |d                                                   }|                     |||           # t          $ r |                     ||           Y w xY wt>          |k    rt0                              |d                   }		 t          |d                                                   }n&# t          $ r |                      |	           Y w xY w	 t          |d                                                   }|                      |	||           # t          $ r |                      |	|           Y w xY w| S )a  Parses the svg transform string.

        Transforms from SVG 1.1 have a smaller complete set of operations. Whereas in SVG 2.0 they gain
        the CSS transforms and the additional functions and parsing that go with that. This parse is
        compatible with SVG 1.1 and the SVG 2.0 which includes the CSS 2d superset.

        CSS transforms have scalex() scaley() translatex(), translatey(), and skew() (deprecated).
        2D CSS angles haves units: "deg" tau / 360, "rad" tau/tau, "grad" tau/400, "turn" tau.
        2D CSS distances have length/percentages: "px", "cm", "mm", "in", "pt", etc. (+|-)?d+%

        In the case of percentages there must be a known height and width to properly create a matrix out of that.

        NzMust provide a string to parser   r   c                     g | ]
\  }}||z   S rm   rm   )ro   magr   s      rq   
<listcomp>z Matrix.parse.<locals>.<listcomp>f
  s     ;;;jc5cEk;;;rt   r   r_  )!r   r   rS  REGEX_TRANSFORM_TEMPLATEr   r  r&  REGEX_TRANSFORM_PARAMETERSVG_TRANSFORM_MATRIXmapr   pre_catSVG_TRANSFORM_TRANSLATEr   r   r4  pre_translateSVG_TRANSFORM_TRANSLATE_XSVG_TRANSFORM_TRANSLATE_YSVG_TRANSFORM_SCALE	pre_scaleSVG_TRANSFORM_SCALE_XSVG_TRANSFORM_SCALE_YSVG_TRANSFORM_ROTATEr  r   
pre_rotateSVG_TRANSFORM_SKEWpre_skewSVG_TRANSFORM_SKEW_X
pre_skew_xSVG_TRANSFORM_SKEW_Y
pre_skew_y)
r   transform_strsub_elementnameparamsx_paramy_paramr  angle_aangle_bs
             rq   r   zMatrix.parseP
  sj     	F--- 	><===3;;M<O<O<Q<QRR O	6 O	6Kq>D4<<[^LLMMF;;F;;;F#t++UF++f%%%(D00$VAY//5577GG!   H0$VAY//5577G&&w8888! 0 0 0&&w/////0*d22""6&)#4#4#:#:#<#<a@@@@*d22""1fVAY&7&7&=&=&?&?@@@@$,,UF++'''&$..uVAY//3333&$..q%q	"2"23333%--F1I..$VAY//5577GG!   OOE***H4$VAY//5577GOOE7G<<<<! 4 4 4OOE7333334#t++++fQi00#kk&)44GG!   H$VAY//5577GG!   MM'7333H=$VAY//5577GMM'7GWEEEE! = = =MM'7G<<<<<=%--++fQi00$VAY//5577GG!   OOG,,,H6$VAY//5577GOOGWg>>>>! 6 6 6OOGW555556%--++fQi00$VAY//5577GG!   OOG,,,H6$VAY//5577GOOGWg>>>>! 6 6 6OOGW555556 . s   'C88
DD	=EE*)E*'K))LL>M M43M4$ O
OO'O?? P#"P#'?Q((!RR<'S$$TT>U U/.U/'WW)(W)->X-- YYNc                    t          | j        t                    r*|||}| j                            |||||          | _        t          | j        t                    r*|||}| j                            |||||          | _        | S )z
        Provides values to turn trans_x and trans_y values into user units floats rather
        than Lengths by giving the required information to perform the conversions.
        Nr5  )r   r  r   r   r  )	r   r6  r7  r   r   r8  r9  r:  r   s	            rq   r  zMatrix.render
  s     dff%% 		}!<'V\\ %#' "  DF dff%% 		~/"=(V\\ &#' "  DF rt   c                 @    | j         | j        z  | j        | j        z  z
  S r   )r   r6   r   rg  r   s    rq   determinantzMatrix.determinant
  s    v$&00rt   c                     | j         S r   )r  r   s    rq   value_trans_xzMatrix.value_trans_x
  	    vrt   c                     | j         S r   )r  r   s    rq   value_trans_yzMatrix.value_trans_y
  r  rt   c                 *    t          | j                  S r   )r   r   r   s    rq   value_scale_xzMatrix.value_scale_x
      TV}}rt   c                 *    t          | j                  S r   )r   r6   r   s    rq   value_scale_yzMatrix.value_scale_y
  r  rt   c                 *    t          | j                  S r   )r   rg  r   s    rq   value_skew_xzMatrix.value_skew_x
  r  rt   c                 *    t          | j                  S r   )r   r   r   s    rq   value_skew_yzMatrix.value_skew_y
  r  rt   c                 Z    d| _         d| _        d| _        d| _        d| _        d| _        dS )zResets matrix to identity.r  r   Nr  r   s    rq   resetzMatrix.reset
  s0    rt   c                    | j         }| j        }| j        }| j        }| j        }| j        }||z  ||z  z
  }d|z  }||z  | _         | |z  | _        | |z  | _        ||z  | _        ||z  ||z  z
  |z  | _        ||z  ||z  z
  |z  | _        | S )z=
        SVG Matrix:
        [a c e]
        [b d f]
        r  r   r   r  rg  r6   r  )	r   m00m01m02m10m11m12r  inverse_determinants	            rq   r  zMatrix.inverse
  s     ffffffCi#)+!K/**++++**)cCi'+>>)cCi'+>>rt   c                 R    t          | j        | j        | j        | j        dd          S )a3  
        provide the matrix suitable for multiplying vectors. This will be the matrix with the same rotation and scale
        aspects but with no translation. This matrix is for multiplying vector elements where the position doesn't
        matter but the scaling and rotation do.
        :return:
        r   )r[  r   rg  r   r6   r   s    rq   vectorzMatrix.vector  s$     dfdfdfdfc3???rt   c                     | j         dk    o6| j        dk    o+| j        dk    o | j        dk    o| j        dk    o
| j        dk    S r`  r  r   s    rq   is_identityzMatrix.is_identity  s\    FaK !! ! !	
 !	
rt   c                 B    t          | }|                     |           d S r   )r[  r  r   r  mxs      rq   post_catzMatrix.post_cat%  s&    Z rt   r  r   c                    ||}|d}|d}|dk    r6|dk    r0|                      t                              ||                     d S |                     | |            |                     ||           |                     ||           d S Nr   r   )r5  r[  rZ   post_translate
post_scaler   sxsyrE   rF   s        rq   r9  zMatrix.post_scale)  s    :B9A9A66a1ffMM&,,r2../////QB'''OOB###1%%%%%rt   c                 6    |                      |d||           d S Nr   r9  r   r;  rE   rF   s       rq   post_scale_xzMatrix.post_scale_x7  s     Aq!$$$$$rt   c                 6    |                      d|||           d S r>  r?  r   r<  rE   rF   s       rq   post_scale_yzMatrix.post_scale_y:  s     2q!$$$$$rt   c                 b    |                      t                              ||                     d S r   )r5  r[  rY   r   r  r  s      rq   r8  zMatrix.post_translate=  s*    f&&r2../////rt   c                 2    |                      |d           d S r   r8  r   r  s     rq   post_translate_xzMatrix.post_translate_x@  s    B$$$$$rt   c                 2    |                      d|           d S r   rH  r   r  s     rq   post_translate_yzMatrix.post_translate_yC  s    C$$$$$rt   c                    |d}|d}|dk    r5|dk    r/|                      t                              |                     d S t                      }|                    | |            |                     t                              |                     |                    ||           |                      |           d S r7  )r5  r[  r[   r8  )r   r  rE   rF   rX   s        rq   post_rotatezMatrix.post_rotateF  s    9A9A66a1ffMM&--../////XXF!!1"qb)))OOFMM%00111!!!Q'''MM&!!!!!rt   c                    |d}|d}|dk    r6|dk    r0|                      t                              ||                     d S |                     | |            |                     ||           |                     ||           d S r}   )r5  r[  r^   r8  	post_skewr   r  r  rE   rF   s        rq   rQ  zMatrix.post_skewT  s    9A9A66a1ffMM&++gw7788888QB'''NN7G,,,1%%%%%rt   c                 6    |                      |d||           d S r   rQ  r   r  rE   rF   s       rq   post_skew_xzMatrix.post_skew_x`  s     wQ*****rt   c                 6    |                      d|||           d S r   rT  r   r  rE   rF   s       rq   post_skew_yzMatrix.post_skew_yc  s     sGQ*****rt   c                     t          | }t                               ||           \  | _        | _        | _        | _        | _        | _        d S r   )r[  r  r   rg  r   r6   r  r  r3  s      rq   r  zMatrix.pre_catf  sC    Z 9?9O9O:
 :
6rt   c                    ||}|d}|d}|dk    r6|dk    r0|                      t                              ||                     d S |                     ||           |                     ||           |                     | |            d S r7  )r  r[  rZ   r  r  r:  s        rq   r  zMatrix.pre_scalel  s    :B9A9A66a1ffLLb"--.....q!$$$NN2r"""rA2&&&&&rt   c                 6    |                      |d||           d S r>  r  r@  s       rq   pre_scale_xzMatrix.pre_scale_xz  s     r1a#####rt   c                 6    |                      d|||           d S r>  r]  rC  s       rq   pre_scale_yzMatrix.pre_scale_y}  s     q"a#####rt   c                 b    |                      t                              ||                     d S r   )r  r[  rY   rF  s      rq   r  zMatrix.pre_translate  s*    V%%b"--.....rt   c                 2    |                      |d           d S r   r  rI  s     rq   pre_translate_xzMatrix.pre_translate_x  s    2s#####rt   c                 2    |                      d|           d S r   rc  rL  s     rq   pre_translate_yzMatrix.pre_translate_y  s    3#####rt   c                    |d}|d}|dk    r5|dk    r/|                      t                              |                     d S |                     ||           |                     |           |                     | |            d S r}   )r  r[  r[   r  r  )r   r  rE   rF   s       rq   r  zMatrix.pre_rotate  s    9A9A66a1ffLLu--.....q!$$$OOE"""rA2&&&&&rt   c                    |d}|d}|dk    r6|dk    r0|                      t                              ||                     d S |                     ||           |                     ||           |                     | |            d S r}   )r  r[  r^   r  r  rR  s        rq   r  zMatrix.pre_skew  s    9A9A66a1ffLLWg6677777q!$$$MM'7+++rA2&&&&&rt   c                 6    |                      |d||           d S r}   r  rU  s       rq   r  zMatrix.pre_skew_x  s     gq!Q'''''rt   c                 6    |                      d|||           d S r   rj  rX  s       rq   r	  zMatrix.pre_skew_y  s     c7Aq)))))rt   c                 r    t          |           }|                                 |                    |          S r   )r[  r  r\  )r   v0r  s      rq   point_in_inverse_spacezMatrix.point_in_inverse_space  s1    ,,,,R000rt   c                     t          |d         | j        z  |d         | j        z  z   d| j        z  z   |d         | j        z  |d         | j        z  z   d| j        z  z             S r   )r0  r   r   r  rg  r6   r  )r   rm  s     rq   r\  zMatrix.point_in_matrix_space  sb    qEDFNRUTV^+a$&j8qEDFNRUTV^+a$&j8
 
 	
rt   c                     |d         | j         z  |d         | j        z  z   d| j        z  z   }|d         | j        z  |d         | j        z  z   d| j        z  z   }||d<   ||d<   |S r   r&  r   r   nxnys       rq   transform_pointzMatrix.transform_point  sk    qTDF]QqTDF]*QZ7qTDF]QqTDF]*QZ7!!rt   c                     |d         | j         z  |d         | j        z  z   }|d         | j        z  |d         | j        z  z   }||d<   ||d<   |S )zE
        Applies the transformation without the translation.
        r   r   )r   r   rg  r6   rq  s       rq   transform_vectorzMatrix.transform_vector  sW     qTDF]QqTDF]*qTDF]QqTDF]*!!rt   c                 p    |\  }}|\  }}|\  }}	||z
  }
||z
  }|}|	|z
  }||z
  }|} | |
|||||          S )z
        Create a matrix which transforms these three ordered points to the clockwise points of the unit-square.

        @param p1:
        @param p2:
        @param p4:
        @return:
        rm   )r  r  r  p4rI   rJ   rK   rL   x4y4r   rg  r   r6   r  r  s                   rq   affinezMatrix.affine  sg     BBBGGGGs1aAq!$$$rt   c                    |\  }}|\  }}|\  }	}
|\  }}d}	 ||z
  |
z   |z
  ||
z
  z  }||z
  |	z   |z
  ||	z
  z  }||
z
  ||
z
  z  }||	z
  ||	z
  z  }||||z  z
  z  d||z  z
  z  }||||z  z
  z  d||z  z
  z  }n# t           $ r d}d}Y nw xY w||z  }||z  }|||z   z  ||z  z
  }|||z   z  ||z  z
  }|||z   z  ||z  z
  }|||z   z  ||z  z
  } | ||||||          S )a  
        Create a matrix which transforms these four ordered points to the clockwise points of the unit-square.

        If G and H are very close to 0, this is an affine transformation. If they are not, then the perspective
        transform requires g and h, but we do not support non-affine transformations.

        @param p1:
        @param p2:
        @param p3:
        @param p4:
        @return:
        r   r   )ZeroDivisionError)r  r  r  p3rx  rI   rJ   rK   rL   x3y3ry  rz  r  jkr   r  r   r"   r   r  r   rg  r6   r  s                             rq   perspectivezMatrix.perspective  sy    BBBB
	b2"rBw/Ab2"rBw/AbR"W%AbR"W%AQQY1q1u9-AQQY1q1u9-AA  	 	 	AAAA	 FF!a%L26!!a%L26!!a%L26!!a%L26!s1aAq!$$$s   A A9 9B
	B
c	                     t                               ||||          }	t                               ||||          }
 | |	 |
z            S )a  
        Create a matrix which transforms these four ordered points to equivalent points for the other 4 ordered points.

        If G and H are very close to 0, this is an affine transformation. If they are not, then the perspective
        transform requires g and h, but we do not support non-affine transformations.

        @param p1:
        @param p2:
        @param p3:
        @param p4:
        @return:
        )r[  r  )r  r  r  r~  rx  p5p6p7p8m1m2s              rq   r  z
Matrix.map  sJ     BB//BB//sB38}}rt   c                     t                               |||          }t                               |||          } | | |z            S )a3  
        Create a matrix which transforms these three ordered points to map to 3 other ordered points. This does not
        include p3 or p7 for the ordered squares.

        @param p1:
        @param p2:
        @param p4:
        @param p5:
        @param p6:
        @param p8:
        @return:
        )r[  r{  )	r  r  r  rx  r  r  r  r  r  s	            rq   map3zMatrix.map3  sB     ]]2r2&&]]2r2&&sB38}}rt   c                 *    ||} | |dd|dd          S r}   rm   )r  r;  r<  s      rq   rZ   zMatrix.scale&  s&    :Bs2q!RA&&&rt   c                 .    |                      |d          S r  rZ   )r  r;  s     rq   scale_xzMatrix.scale_x,  s    yyS!!!rt   c                 .    |                      d|          S r  r  )r  r<  s     rq   scale_yzMatrix.scale_y0  s    yyb!!!rt   c                 "     | dddd||          S )z4SVG Matrix:
        [a c e]
        [b d f]
        r  r   rm   )r  r  r  s      rq   rY   zMatrix.translate4  s     s3S#r2...rt   c                 .    |                      |d          S r}   rY   )r  r  s     rq   translate_xzMatrix.translate_x<  s    }}R###rt   c                 .    |                      d|          S r   r  )r  r  s     rq   translate_yzMatrix.translate_y@  s    }}S"%%%rt   c                 `    t          |          }t          |          } | ||| |dd          S r   )r
   r   )r  r  ctsts       rq   r[   zMatrix.rotateD  s4    ZZZZs2rB3C---rt   c                 ^    t          |          }t          |          } | d||ddd          S )Nr  r   )r   )r  r  r  aabbs        rq   r^   zMatrix.skewJ  s2    \\\\s3BS#...rt   c                 .    |                      |d          S r   r^   r  r  s     rq   skew_xzMatrix.skew_xP  s    xxs###rt   c                 .    |                      d|          S r   r  r  s     rq   skew_yzMatrix.skew_yT  s    xxU###rt   c                      |             S )z+
        1, 0, 0,
        0, 1, 0,
        rm   )r  s    rq   identityzMatrix.identityX  s     suurt   c                    |j         | j         z  |j        | j        z  z   |j        dz  z   |j         | j        z  |j        | j        z  z   |j        dz  z   |j         | j        z  |j        | j        z  z   |j        dz  z   f}|j        | j         z  |j        | j        z  z   |j        dz  z   |j        | j        z  |j        | j        z  z   |j        dz  z   |j        | j        z  |j        | j        z  z   |j        dz  z   f}t          |d                   t          |d                   t          |d                   t          |d                   |d         |d         fS )z
        [a c e]      [a c e]   [a b 0]
        [b d f]   %  [b d f] = [c d 0]
        [0 0 1]      [0 0 1]   [e f 1]

        :param m: matrix operand
        :param s: matrix operand
        :return: multiplied matrix.
        r   r   r   )r   r   rg  r  r6   r  r   )r   r   r0r  s       rq   r  zMatrix.matrix_multiply`  s,    C!#Iac	!AC!G+C!#Iac	!AC!G+C!#Iac	!AC!G+
 C!#Iac	!AC!G+C!#Iac	!AC!G+C!#Iac	!AC!G+

 RU||U2a5\\5A<<r!ur!ubQReSSrt   )NNNNNNN)r  Nr   r   )r  r   r   )r   r   )r   )r   r   r   r   )r   r   r   )r  Nr,  )Or   r   r   rT  r   r  r  rG  r  r  r  r  r  rX  r   rM  rQ  r%  r   r(  rY  r   r   r  r  r  r  r  r  r   r"  r$  r  r/  r1  r5  r9  rA  rD  r8  rJ  rM  rO  rQ  rV  rY  r  r  r^  r`  r  rd  rf  r  r  r  r	  rn  r\  rt  rv  r-  r{  r  r  r  rZ   r  r  rY   r  r  r[   r^   r  r  r  r[  r  rm   rt   rq   r[  r[  	  s        " " "B& & &  *      
  
   GHH    
 
 
F F F
 
 
 $ $ X$c c cN $ $ $ $L 1 1 X1                .@ @ @
 
 
  & & & &% % % %% % % %0 0 0 0% % % %% % % %" " " "
& 
& 
& 
&+ + + ++ + + +
 
 
' ' ' '$ $ $ $$ $ $ $/ / / /$ $ $ $$ $ $ $
' 
' 
' 
'
' 
' 
' 
'( ( ( (* * * *1 1 1

 
 
     % % [%* &% &% [&%P   ["   [" ' ' ' ['
 " " " [" " " " [" / / / [/ $ $ $ [$ & & & [& . . . [.
 / / / [/
 $ $ $ [$ $ $ $ [$   [ T T \T T Trt   r[  c                   T    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	             Zd
S )rI  c                    d| _         d| _        d| _        d| _        d| _        |rt          |          dk    r|d         }t          |t                    r|                     |           n@t          |t                    r| 
                    |           n|                     |           t          |          dk    r|d         | _        n{t          |          dk    rht          |d                   | _         t          |d                   | _        t          |d                   | _        t          |d                   | _        |r$|                     t          |                     dS dS )a  
        Viewbox controls the scaling between the drawing size view that is observing that drawing.

        :param viewbox: either values or viewbox attribute or a Viewbox object
        :param preserveAspectRatio or preserve_aspect_ratio: preserveAspectRatio
        Nr   r   r   r`  r_  )rE   rF   r   r   preserve_aspect_ratior   r   dictproperty_by_valuesrI  property_by_objectset_viewboxr   )r   r   r   r:  s       rq   r   zViewbox.__init__z  sN    
%)" 	)CIINN1gG'4(( *''0000GW-- *''0000  )))4yyA~~-1!W*YY!^^47^^DF47^^DFtAwDJQ..DK 	2##DLL11111	2 	2rt   c                     t          |t                    sdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    S rA  )r   rI  rE   rF   r   r   r  r   s     rq   r  zViewbox.__eq__  sz    %)) 	56UW56UW5:$$5;%,&&5)U-HHHrt   c           	         t                               | j                  dt                               | j                  dt                               | j                  dt                               | j                  S )Nr  )r   r   rE   rF   r   r   r   s    rq   r(  zViewbox.__str__  se    JJtvJJtvJJtz""""JJt{###	
 	
rt   c                    g }| j         <|                    t          dt                              | j                              | j        <|                    t          dt                              | j                             | j        <|                    t          dt                              | j                             | j	        <|                    t          dt                              | j	                             | j        %|                    t          d| j        d           d                    |          }d|z  S )N=='rQ  r  zViewbox(%s))rE   append
SVG_ATTR_Xr   r   rF   
SVG_ATTR_Yr   SVG_ATTR_WIDTHr   SVG_ATTR_HEIGHTr  SVG_ATTR_PRESERVEASPECTRATIOjoinr   r  r  s      rq   r%  zViewbox.__repr__  s+   6MMZZZDF1C1C1CDEEE6MMZZZDF1C1C1CDEEE:!MM^^^VZZ
5K5K5KLMMM;"MM___fjj6M6M6MNOOO%1MM9994;U;U;UV   6""v%%rt   c                 ~    |j         | _         |j        | _        |j        | _        |j        | _        |j        | _        d S r   )rE   rF   r   r   r  r   objs     rq   r  zViewbox.property_by_object  s7    Y
j%(%>"""rt   c                    t           |v r |                     |t                               t          |v r|t                   | _        t          |v r|t                   | _        t          |v r|t                   | _        t          |v r|t                   | _	        d|v r|d         | _
        t          |v r|t                   | _
        d S d S )Nr  )SVG_ATTR_VIEWBOXr  r  rE   r  rF   r  r   r  r   r  r  r   r  s     rq   r  zViewbox.property_by_values  s    v%%V$45666J'DFJ'DFV##/DJf$$ 1DK"f,,)/0G)HD&'611)/0L)MD&&& 21rt   c                 P   |t          t                              |                    }	 t          |d                   | _        t          |d                   | _        t          |d                   | _        t          |d                   | _        d S # t          $ r Y d S w xY wd S Nr   r   r   r_  )	r'  REGEX_FLOATr   r   rE   rF   r   r   r4  )r   r:  dimss      rq   r  zViewbox.set_viewbox  s    ++G4455DtAwtAw"47^^
#DGnn    s   A(B 
B#"B#c                     t                               |j        |j        |j        |j        | j        | j        | j        | j        | j        	  	        S r   )rI  r    rE   rF   r   r   r  )r   elements     rq   r;   zViewbox.transform  sH    ((IIMNFFJK&

 

 
	
rt   c	           
         | ||
|||||dS |M|                     d          }		 |	d         }
n# t          $ r d}
Y nw xY w	 |	d         }n# t          $ r d}Y nw xY wd}
d}||z  }||z  }|
t          k    r|dk    rt          ||          x}}n#|
t          k    r|dk    rt	          ||          x}}| ||z  z
  }|||z  z
  }|
                                }
d	|
v r||||z  z
  d
z  z  }d|
v r||||z  z
  z  }d|
v r||||z  z
  d
z  z  }d|
v r||||z  z
  z  }t          |t                    st          |t                    rt          |dk    rM|dk    rG|dk    r|dk    rdS dt          	                    |          dt          	                    |          dS |dk    r?|dk    r9dt          	                    |          dt          	                    |          dS dt          	                    |          dt          	                    |          dt          	                    |          dt          	                    |          d	S )a  
        SVG 1.1 7.2, SVG 2.0 8.2 equivalent transform of an SVG viewport.
        With regards to https://github.com/w3c/svgwg/issues/215 use 8.2 version.

        It creates transform commands equal to that viewport expected.

        Let e-x, e-y, e-width, e-height be the position and size of the element respectively.
        Let vb-x, vb-y, vb-width, vb-height be the min-x, min-y, width and height values of the viewBox attribute
        respectively.

        Let align be the align value of preserveAspectRatio, or 'xMidYMid' if preserveAspectRatio is not defined.
        Let meetOrSlice be the meetOrSlice value of preserveAspectRatio, or 'meet' if preserveAspectRatio is not defined
        or if meetOrSlice is missing from this value.

        :param e_x: element_x value
        :param e_y: element_y value
        :param e_width: element_width value
        :param e_height: element_height value
        :param vb_x: viewbox_x value
        :param vb_y: viewbox_y value
        :param vb_width: viewbox_width value
        :param vb_height: viewbox_height value
        :param aspect: preserve aspect ratio value
        :return: string of the SVG transform commands to account for the viewbox.
        Nr   r  r   xMidyMidr   meetslicexmidr  xmaxymidymaxzscale(r  rh   
translate(z) scale()
splitr4  r'  rJ  rK  r  r   r   r   r   )e_xe_ye_widthe_heightvb_xvb_yvb_width	vb_heightaspectaspect_slicealignmeet_or_slicer  r  r  r  s                   rq   r    zViewbox.viewbox_transform  s   < K{|| 2!<<,,L#$Q # # #"#' ,Q ' ' ' &' E"MH$Y& N""}'>'> #GW 5 55Gggn$$')A)A #GW 5 55GgTG^,TG^,U??Gh&88C??KU??7X%777KU??Hy7'::cAAKU??8i'&999K gv&& 	*Wf*E*E 	!q 0 0!||1r*0**W*=*=*=*=vzz'?R?R?R?RSS!||1JJ{++++JJ{++++  JJ{++++JJ{++++JJw''''JJw''''	 s!   4 AAA AAN)r   r   r   r   r  r(  r%  r  r  r  r;   r[  r    rm   rt   rq   rI  rI  y  s        2 2 2<I I I
 
 
& & &"? ? ?N N N 	 	 	
 
 
 e e \e e ert   rI  c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )
SVGElementaJ  
    Any element within the SVG namespace.

    if args[0] is a dict or SVGElement class the value is used to seed the values.
    Else, the values consist of the kwargs used. The priority is such that kwargs
    will overwrite any previously set value.

    If additional args exist these will be passed to property_by_args

    c                    d | _         d | _        t          |          dk    r|d         }t          |t                    r9|dd          }t	          |          | _        | j                            |           n@t          |t                    r+|dd          }|                     |            | j        |  d S | j        t	          |          | _        | 	                    | j                   t          |          dk    r | j        |  d S d S r`  )
r5   r  r   r   r  updater  r  property_by_argsr  r   r   r   r   s       rq   r   zSVGElement.__init__b  s   t99>>QA!T"" ABBx"1gg""6****Az** ABBx''***%%t,,;v,,DK,,,t99>>!D!4(((( >rt   c                     d S r   rm   r   r   s     rq   r  zSVGElement.property_by_argsv      rt   c                 P    |j         | _         t          |j                  | _        d S r   )r5   r  r  r  s     rq   r  zSVGElement.property_by_objecty  s     &3:&&rt   c                 D    |                     t                    | _        d S r   )getSVG_ATTR_IDr5   r  s     rq   r  zSVGElement.property_by_values}  s    **[))rt   c                     dS )z
        Render changes any length/percent values or attributes into real usable limits if
        given the information required to change such parameters.

        :param kwargs: various other properties to be rendered with.
        :return:
        Nrm   r   r   s     rq   r  zSVGElement.render  s	     	rt   c                     || j         |<   | S r   )r  rO  s      rq   r  zSVGElement.set  s     Crt   c                 "    t          | |fi | d S r   )write)r   r  r   s      rq   	write_xmlzSVGElement.write_xml  s     dA       rt   c                      t          |           S r   tostringr   s    rq   
string_xmlzSVGElement.string_xml      ~~rt   N)r   r   r   rT  r   r  r  r  r  r  r  r  rm   rt   rq   r  r  V  s        	 	) ) )(  ' ' '* * *    ! ! !    rt   r  c                   d    e Zd ZdZd Zd Zd Zd ZeZd Z	d Z
d Zd	 ZddZed             ZdS )Transformablez?Any element that is transformable and has a transform property.c                 >    d | _         d | _        d | _        d | _        d S r   )_length_lengthsr;   applyr   r   r   s      rq   r   zTransformable.__init__  s"    


rt   c                 P    t          |j                  | _        |j        | _        d S r   )r[  r;   r  r  s     rq   r  z Transformable.property_by_object  s     ,,W


rt   c                     t          |                    t          d                    | _        t	          |                    dd                    | _        d S )Nr   r  T)r[  r  SVG_ATTR_TRANSFORMr;   r   r  r  s     rq   r  z Transformable.property_by_values  sA    

+=r B BCC&**Wd3344


rt   c                 t    t          |t          t          f          rt          |           }||z  }|S t          S r   r   r[  r   r   rC  r   r   r  s      rq   r  zTransformable.__mul__  7    efc]++ 	T

AJAHrt   c                     t          |t                    rt          |          }t          |t                    r| xj        |z  c_        | S r   r   r   r[  r;   r   s     rq   r   zTransformable.__imul__  sF    eS!! 	"5MMEeV$$ 	$NNe#NNrt   c                 L    t          |           }|                                 |S )z
        The absolute value is taken to be the actual shape transformed.
        :return: transformed version of the given shape.
        )r   reifyr  s     rq   r   zTransformable.__abs__  s!    
 JJ				rt   c                 "    d| _         d| _        dS )a'  
        Realizes the transform to the attributes. Such that the attributes become actualized and the transform
        simplifies towards the identity matrix. In many cases it will become the identity matrix. In other cases the
        transformed shape cannot be represented through the properties alone. And shall keep those parts of the
        transform required preserve equivalency.

        The default method will be called by submethods but will only scale properties like stroke_width which should
        scale with the transform.
        N)r  r  r   s    rq   r  zTransformable.reify  s     rt   c                 8    | j          | j         j        di | | S )z
        Renders the transformable by performing any required length conversion operations into pixels. The element
        will be the pixel-length form.
        Nrm   )r;   r  r  s     rq   r  zTransformable.render  s,    
 >%!DN!++F+++rt   TFc                     t           )a  
        Returns the bounding box of the given object.

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        NotImplementedErrorr   transformedwith_strokes      rq   bboxzTransformable.bbox  s
     "!rt   c                     | j         st                              d          S t          dd          }|| j        z  }t          dd          }|| j        z  }|                    |          S r   )r  r  r   r0  r;   r  r  s      rq   r   zTransformable.rotation  sb    z 	$==###Aqkkt~q!$. s###rt   NTF)r   r   r   rT  r   r  r  r  rX  r   r   r  r  r  rY  r   rm   rt   rq   r  r    s        II    5 5 5   H        " " " " $ $ X$ $ $rt   r  c                   L    e Zd ZdZd Zd Zd Zd Zd Ze	d             Z
d Zd	S )
GraphicObjectzAny drawn element.c                 0    d | _         d | _        d | _        d S r   )r:   r9   stroke_widthr  s      rq   r   zGraphicObject.__init__  s    	 rt   c                     |j         t          |j                   nd | _         |j        t          |j                  nd | _        |j        &t	          |j                                                  nd | _        d S r   )r9   r]  r:   r  r   r   r  s     rq   r  z GraphicObject.property_by_object  si    %&V%7E!&MMMT	)*)=eAHooo4./n.HF1>""((***d 	rt   c                    |                     t                    }|t          |          nd | _        |                     d          }|                     t          |          }|>| j        7| j        j        +	 t          |          | j        _        n# t          $ r Y nw xY w|                     t                    }|t          |          nd | _
        |                     d          }|                     t          |          }|>| j
        7| j
        j        +	 t          |          | j
        _        n# t          $ r Y nw xY wt          |                     dd                                                    | _        t          |                     t          | j                                                            | _        d S )Nstroke_opacityfill_opacityr  r  )r  SVG_ATTR_STROKEr]  r:   SVG_ATTR_STROKE_OPACITYr   r   rf  r   SVG_ATTR_FILLr9   SVG_ATTR_FILL_OPACITYr   r  SVG_ATTR_STROKE_WIDTH)r   r  r:   r  r9   r  s         rq   r  z GraphicObject.property_by_values  s   O,,'-'9eFmmmt$455$;^LL&'!-&+N&;&;##   zz-((#'#3E$KKK	zz.11zz"7FF$	%	+$),$7$7	!!   "6::nc#B#BCCIIKK"JJ,d.?@@
 

%'' 	s$   9B 
B B D5 5
EEc           	      j   t          | j        t                    r|                    d|                    d                    }|                    d|                    d                    }	 |d= n# t          $ r Y nw xY w | j        j        ddt          ||z  ||z  z             i|| _        d S d S Nr   r7  r   rm   )r   r  r   r  KeyErrorr   r   r   r   r   r   s       rq   r  zGraphicObject.render  s    d'00 		JJw

3D(E(EFFEZZ&**5F*G*GHHF,--    7 1 7 ! ! $UU]Vf_%D E E!IO! !D		 		s   .A2 2
A?>A?c                     | j         | _        | S )a  
        Realizes the transform to the attributes. Such that the attributes become actualized and the transform
        simplifies towards the identity matrix. In many cases it will become the identity matrix. In other cases the
        transformed shape cannot be represented through the properties alone. And shall keep those parts of the
        transform required preserve equivalency.
        )implicit_stroke_widthr  r   s    rq   r  zGraphicObject.reify&  s     !6rt   c                    	 | j         s| j        S | j        | j        }t          | d          rOt          | j        v rAt          | j        t                   v r(t          | j                            dd                    }| j        }|j	        }|t          t          |                    z  S d S # t          $ r
 | j        cY S w xY w)Nr  viewport_transformr   )r  r  r;   hasattrSVG_ATTR_VECTOR_EFFECTr  SVG_VALUE_NON_SCALING_STROKEr[  r  r  r   r   r3  )r   r;   r   dets       rq   r&  z#GraphicObject.implicit_stroke_width0  s    	%: )(( , N	D(++R.$+==4{#9:; ; !'t{7KR'P'P Q QI)+tCHH~~-- -,  	% 	% 	%$$$$	%s   B, BB, ,C ?C c                     dS rA  rm   r   s    rq   is_degeneratezGraphicObject.is_degenerateE  s    urt   N)r   r   r   rT  r   r  r  r  r  rY  r&  r.  rm   rt   rq   r  r    s        ! ! !

 
 
  @
 
 
   % % X%(    rt   r  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
e
Zd	 Zd
 Zd ZeedfdZefdZefdZeefdZddZddZddZd Zd Zd Zd ZdS )Shapea  
    SVG Shapes are several SVG items defined in SVG 1.1 9.1
    https://www.w3.org/TR/SVG11/shapes.html

    These shapes are circle, ellipse, line, polyline, polygon, and path.

    All shapes have methods:
    d(relative, transform): provides path_d string for the shape.
    reify(): Applies transform of the shape to modify the shape attributes.
    render(): Ensure that the shape properties have real space values.
    bbox(transformed): Provides the bounding box for the given shape.

    All shapes must implement:
    __repr__(), with a call to _repr_shape()
    __copy__()

    All shapes have attributes:
    id: SVG ID attributes. (SVGElement)
    transform: SVG Matrix to apply to this shape. (Transformable)
    apply: Determine whether transform should be applied. (Transformable)
    fill: SVG color of the shape fill. (GraphicObject)
    stroke: SVG color of the shape stroke. (GraphicObject)
    stroke_width: Stroke width of the stroke. (GraphicObject)
    c                     d| _         t          j        | g|R i | t          j        | g|R i | t	          j        | g|R i | d S )NT)_strictr  r   r  r  r  s      rq   r   zShape.__init__c  s    t5d555f555t5d555f555	
	
 	
 	
!	
 	
 	
 	
 	
rt   c                     t                               | |           t                              | |           t                              | |           d S r   )r  r  r  r  r  s     rq   r  zShape.property_by_objectk  sJ    %%dA...((q111((q11111rt   c                     t                               | |           t                              | |           t                              | |           d S r   )r  r  r  r  r  s     rq   r  zShape.property_by_valuesp  sJ    %%dF333((v666((v66666rt   c                 r    t          j        | fi | t          j        | fi | t          j        | fi | d S r   )r  r  r  r  r  s     rq   r  zShape.renderu  sS    $))&)))T,,V,,,T,,V,,,,,rt   c                 "   t          |t                    st          S | j        |j        k    s| j        |j        k    rdS | }t          |t
                    st          |          }|}t          |t
                    st          |          }||k    S rA  )r   r0  rC  r9   r:   Pathrx  s       rq   r  zShape.__eq__z  s    %'' 	"!!9
""dkU\&A&A5%&& 	 KKE&$'' 	"&\\Frt   c                 H    t          |t                    st          S | |k     S r   )r   r0  rC  r   s     rq   r  zShape.__ne__  '    %'' 	"!!5=  rt   c                 x    t          |t                    rt          |           t          |          z   S t          S r   )r   r0  r7  rC  r   s     rq   r   zShape.__iadd__  s1    eU## 	,::U++rt   c                 N    t          |           }|                    |           |S r   r  r  s      rq   r  zShape.__matmul__  r  rt   c                 N    t          |          }|                    |            |S r   r  r  s      rq   r  zShape.__rmatmul__  r  rt   c                     t          |t                    rt          |          }t          |t                    r| xj        |z  c_        |                                  | S )z~
        The % operation with a matrix works much like multiplication except that it automatically reifies the shape.
        )r   r   r[  r;   r  r   s     rq   r  zShape.__imatmul__  sU     eS!! 	"5MMEeV$$ 	$NNe#NN

rt   Nc                      |                      d          } j        dS fd|D             }t          |           _         j        dk    r	| _        dS  fd|D              _        dS )a  
        Calculate the length values for the segments of the Shape.

        :param error: error permitted for length calculations.
        :param min_depth: minimum depth for the length calculation.
        :param segments: optional segments to use.
        :return:
        NFc                 >    g | ]}|                                S )error	min_depth)rM  )ro   eachrA  rB  s     rq   r  z'Shape._calc_lengths.<locals>.<listcomp>  s)    VVVT4;;Ui;@@VVVrt   r   c                 $    g | ]}|j         z  S rm   )r  )ro   rC  r   s     rq   r  z'Shape._calc_lengths.<locals>.<listcomp>  s     EEETTDL0EEErt   )segmentsr  sumr  )r   rA  rB  rE  lengthss   ```  rq   _calc_lengthszShape._calc_lengths  s     }}U++H<#FVVVVVXVVV7||<1#DMMMEEEEWEEEDMMMrt   c                     	 ddl }n# t          $ r  fd|D             cY S w xY w                     d          }t          |          dk    rdS  j                             ||           |                    t          |          dft                    } j        dk    r|                    t          |          dft                    }t          |          D ]\  }}|	                    d          ||<   |
                    |t          |          dz
  z                                t                    }	||	         |dd<   |S d}
t          |          D ]v\  }}|
 j        |         z   }|
|k    ||k     z  }||         }t          |          s|}
<||
z
  }|dk    rd	}n||
z
  |z  }|                    |          }|dd         ||<   |}
w|                    t!          |d
         j                            ||dk    <   |S )z|
        Find a points between 0 and 1 within the shape. Numpy acceleration allows points to be an array of floats.
        r   Nc                 :    g | ]}                     |          S rm   pointro   r   r   s     rq   r  z Shape.npoint.<locals>.<listcomp>  s#    999DJJsOO999rt   FrA  rE  r   dtyper   r   r  )numpyImportErrorrE  r   r  rH  emptyr   	enumeraterL  r  astyper   r  npointarrayr'  r   )r   	positionsrA  nprE  xy
seg_pointsr  segindexessegment_startr  segmentsegment_endposition_subsetrm  r6   segment_posr   s   `                  rq   rV  zShape.npoint  sI   	: 	: 	: 	:9999y999999	: ==''x==A4<UX>>>XXs9~~q)X77<13x==!"4EBBJ#H-- - -3 #		!
1hhyCMMA,=>??FFsKKGw'BqqqEI '11 	( 	(NE7'$-*>>K,	9i+>UVO?+Br77  +m+AAvv!!M1Q6{++A"#AAA$B'MM  XXd8B<+;&<&<==9>	s    ##c                    |                      d          }t          |          dk    rdS 	 |dk    r|d                             |          S |dk    r|d                             |          S n.# t          $ r! |                     |g|          d         cY S w xY w| j        |                     ||           | j        dk    rJt          t          |t          |          d	z
  z                      }||                             d          S d}d}|d         }t          |          D ]*\  }}|| j
        |         z   }	|	|k    r||z
  |	|z
  z  } n|	}+|                    |          S )
a  
        Find a point between 0 and 1 within the Shape, going through the shape with regard to position.

        :param position: value between 0 and 1 within the shape.
        :param error: Length error permitted.
        :return: Point at the given location.
        Fr   Nr   r  r  rA  rN  r   )rE  r   rL  r   rV  r  rH  r   r  rT  r  )
r   r   rA  rE  r  r^  rb  r_  r  r`  s
             rq   rL  zShape.point  s    ==''x==A4	;3{((2223|))(333  	; 	; 	;;;z;77::::	; <UX>>><1E(c(mma&7899::AA;$$S)))1+'11 	( 	(NE7'$-*>>Kh&&'-7K-<WX'MM}}[)))s    A/  A/ /(BBc                 <    |                      ||           | j        S r   )rH  r  r   rA  rB  s      rq   rM  zShape.length  s     5),,,|rt   Tc                     t           )z}
        Returns PathSegments which correctly produce this shape.

        This should be implemented by subclasses.
        r  r   r  s     rq   rE  zShape.segments  s
     "!rt   Fc                 p    t          |                     |                                        |          S )z
        Returns the path_d string of the shape.

        :param relative: Returns path_d in relative form.
        :param transformed: Return path_d, with applied transform.
        :return: path_d string
        r  r   )r7  rE  r6   )r   r   r  s      rq   r6   zShape.d  s1     DMMkM::;;==x=PPPrt   c                    d |                      |          D             }	 t          t          |           \  }}}}n# t          $ r Y dS w xY w|rL| j        E| j        >| j        j        2|rt          | j                  dz  }nt          | j                  dz  }nd}t          |          |z
  t          |          |z
  t          |          |z   t          |          |z   fS )a  
        Get the bounding box for the given shape.

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        c                 j    g | ]0}t          t          t                    |                                1S rm   r   CloseMover  ro   r\  s     rq   r  zShape.bbox.<locals>.<listcomp>0  s@     
 
 
eT**
HHJJ
 
 
rt   rj  Nr  r   )rE  r'  zipr   r  r:   r   r   r&  rJ  rK  )	r   r  r  bbsxminsyminsxmaxsymaxsr  s	            rq   r  z
Shape.bbox(  s   
 
}}}==
 
 
	)-c3i&E5% 	 	 	44	 
	!-[(DK,=,E 7d899C?d/0036E JJJJJJJJ	
 	
s   > 
AAc                 l   t          |          }|dk    r"|d         t          |d                   | _        |dk    r"|d         t          |d                   | _        |dk    r"|d         t          |d                   | _        |dk    r$|d         t          |d                   | _        dS dS dS )aB  
        Generic SVG parsing of args. In those cases where the shape accepts finite elements we can process the last
        four elements of the shape with this code. This will happen in simpleline, roundshape, and rect. It will not
        happen in polyshape or paths since these can accept infinite arguments.
        r   r   Nr   r_  r`  )r   r[  r;   r]  r:   r9   r   r  r   r   
arg_lengths      rq   _init_shapezShape._init_shapeN  s     YY
??Aw"!'Q??Aw"#DGnn??Aw"!$q'NN	??Aw"!$q']]


 ?""rt   c                    | j         w| j         j        k|                    t          d| j         j        d           | j         j        dk    r1|                    ddt          | j         j                             | j        w| j        j        k|                    t          d| j        j        d           | j        j        dk    r1|                    ddt          | j        j                             | j	        5| j	        dk    r*|                    dt          | j	                  z             | j
                                        s1|                    t          dt          | j
                             | j        $| j        s|                    d	| j        z             | j        '|                    t           d| j        d           dS dS )
z/
        Generic pieces of repr shape.
        Nr  rQ  r  r  r  r  stroke_width=%sapply=%s)r:   rh  r  r  r  rf  r   r9   r  r  r;   r1  r   reprr  r5   r  r  s     rq   _repr_shapezShape._repr_shaped  s   
 ;"t{'BMM8J8J8JKLLL{"c)))9)9)93t{?R;S;S;STUUU9 TY]%>MM}}}di6F6F6FGHHHy C''TY=N9O9O9OPQQQ(T->#-E-EMM+c$2C.D.DDEEE~))++ 	PMM%7%7%7dn9M9M9MNOOO:!$*!MM*tz12227MM{{{DGGG<===== rt   c                    | j         || j         j        p|                    t          d| j         j        d           | j         j        dk    r6|                    t          dt          | j         j                             | j        || j        j        p|                    t          d| j        j        d           | j        j        dk    r6|                    t          dt          | j        j                             | j        <| j        dk    r1|                    t          dt          | j                             | j                                        s1|                    t          dt!          | j                             | j        $| j        s|                    d| j        z             | j        '|                    t&          d| j        d           dS dS )z.
        Generic pieces of str shape.
        Nr  rQ  r  r  r}  )r:   rh  r  r  r  rf  r  r   r9   r  r  r  r   r;   r1  r   r~  r  r5   r  r  s     rq   
_str_shapezShape._str_shapez  s    ;"t{'BMM8J8J8JKLLL{"c))666DK<O8P8P8PQ   9 TY]%>MM}}}di6F6F6FGHHHy C'')>)>)>DIDU@V@V@VWXXX(T->#-E-EMM%:%:%:C@Q<R<R<RSTTT~))++ 	PMM%7%7%7dn9M9M9MNOOO:!$*!MM*tz12227MM{{{DGGG<===== rt   c                     | j         j        S r   rr  r   r   s    rq   _namezShape._name      ~&&rt   T)FTr  )r   r   r   rT  r   r  r  r  r  r  r   r  r  r  r  r+  	MIN_DEPTHrH  rV  rL  rM  rE  r6   r  rz  r  r  r  rm   rt   rq   r0  r0  I  s        2
 
 
2 2 2
7 7 7
- - -
  ! ! !
  
 G  
  
	 	 	 #(9t F F F F( ', - - - -^ %* %* %* %* %*N !I    " " " "Q Q Q Q$
 $
 $
 $
L+ + +,> > >,> > >.' ' ' ' 'rt   r0  c                       e Zd ZdZd Zd Zd ZeZd ZeZ	d Z
d Zd ZeZed	d
ddeedfd            Zd	d
eefdZd Zd Zd Zd ZeefdZddZd Ze	 	 	 	 	 	 dd            ZdS )PathSegmentuL  
    Path Segments are the base class for all the segment within a Path.
    These are defined in SVG 1.1 8.3 and SVG 2.0 9.3
    https://www.w3.org/TR/SVG11/paths.html#PathData
    https://www.w3.org/TR/SVG2/paths.html#PathElement

    These segments define a 1:1 relationship with the path_d or path data attribute, denoted in
    SVG by the 'd' attribute. These are moveto, closepath, lineto, and the curves which are cubic
    Bézier curves, quadratic Bézier curves, and elliptical arc. These are classed as Move, Close,
    Line, CubicBezier, QuadraticBezier, and Arc. And in path_d are denoted as M, Z, L, C, Q, A.

    There are lowercase versions of these commands. And for C, and Q there are S and T which are
    smooth versions. For lines there are also V and H commands which denote vertical and horizontal
    versions of the line command.

    The major difference between paths in 1.1 and 2.0 is the use of Z to truncate a command to close.
    "M0,0C 0,100 100,0 z" is valid in 2.0 since the last z replaces the 0,0. These are read by
    svg.elements but they are not written.
    c                 
   	 t          |d                   | _        n# t          t          f$ r
 d| _        Y nw xY w	 t          |d                   | _        n# t          t          f$ r
 d| _        Y nw xY wd | _        d | _        d S )Nr   FsmoothT)r   r   r#  r   r  r   r   r  s     rq   r   zPathSegment.__init__  s    	" 
!344DMM*% 	" 	" 	"!DMMM	"	vh/00DKK*% 	 	 	DKKK	
s    88A A21A2c                    g }| j         }|%|                    dt          |          z             | j        }|%|                    dt          |          z             | j        j        dd                    |          dS )Nzstart=%szend=%srg   r  rh   )r   r  r~  r   rr  r   r  )r   r  r   r  s       rq   r%  zPathSegment.__repr__  s    J=MM*tAww.///H=MM(T!WW,--->222DIIf4E4E4E4EFFrt   c                 t    t          |t          t          f          rt          |           }||z  }|S t          S r   r  r  s      rq   r  zPathSegment.__mul__  r  rt   c                     t          |t                    rt          | |          }|S t          |t                    rt          |           |z   }|S t          S r   )r   r  r7  r   rC  r   r   r!   s      rq   r   zPathSegment.__iadd__  sU    e[)) 	e$$DKs## 	::%DKrt   c                 ~    |                                  }| j        !| j        rd| j        d|S d| j        d|S |S )z
        This defines an individual path segment string. Since this isn't part of a Path it appends a pseudo-Move
        command to correctly provide the starting position.
        :return: string representation of the object.
        Nzm r  zM )r6   r   r   )r   r6   s     rq   r(  zPathSegment.__str__  sZ     FFHH:!} 3 3$(JJJ223 %)JJJ22rt   c                     d| _         | S )Nr  )r  r   s    rq   __iter__zPathSegment.__iter__  s    rt   c                     | xj         dz  c_         	 | | j                  }|| xj         dz  c_         | | j                  }|S # t          $ r t          w xY wr>  )r  r4  StopIteration)r   r  s     rq   __next__zPathSegment.__next__  sf    !	 tv,C{!46lJ 	  	  	 	 s   -A   Ar   r  Nr   c                    ||                      |          }||                      |          }||z   dz  }|                      |          }	t          ||z
            }
t          |	|z
            }t          ||	z
            }||z   }||
z
  |k    s||k     rH|dz  }t                              | ||||	|||          t                              | |||	||||          z   S |S )z5Recursively approximates the length by straight linesNr  r   )rL  r   r  segment_length)curver   r   start_point	end_pointrA  rB  depthmid	mid_pointrM  
first_halfsecond_halflength2s                 rq   r  zPathSegment.segment_length  s    ++e,,KC((Is{c!KK$$	Y,--[011
)i/00{*fu$$%)*;*;QJE--uc;	5)U **sCIui   rt   c                 @    t                               | ||||          S )Nr@  )r  r  )r   r   r   rA  rB  s        rq   _line_lengthzPathSegment._line_length  s*    ))%EY * 
 
 	
rt   c                     d | D             }d | D             }t          |          }t          |          }t          |          }t          |          }||||fS )zQreturns the bounding box for the segment.
        xmin, ymin, xmax, ymax
        c                      g | ]}||j         S r   r}  ro   r  s     rq   r  z$PathSegment.bbox.<locals>.<listcomp>      111a1=ac===rt   c                      g | ]}||j         S r   r  r  s     rq   r  z$PathSegment.bbox.<locals>.<listcomp>  r  rt   )rJ  rK  )r   xsysxminr  yminr  s          rq   r  zPathSegment.bbox  se     2141111141112ww2ww2ww2wwT4%%rt   c                 :    | j         }| j        | _         || _        dS )z4
        Reverses the current path segment.
        N)r   r   )r   r   s     rq   reversezPathSegment.reverse&  s     h:


rt   c                 T    t          |                     |g          d                   S )z
        Returns the point at a given amount through the path segment.
        :param position:  t value between 0 and 1
        :return: Point instance
        r   )r0  rV  )r   r   s     rq   rL  zPathSegment.point.  s%     T[[(,,Q/000rt   c                 2    | j         gt          |          z  S )z
        Returns the points at given positions along the path segment
        :param positions: N-sized sequence of t value between 0 and 1
        :return: N-sized sequence of 2-sized sequence of float
        )r   r   )r   rX  s     rq   rV  zPathSegment.npoint6  s     zC	NN**rt   c                     dS )z|
        Returns the length of this path segment.

        :param error:
        :param min_depth:
        :return:
        r   rm   rf  s      rq   rM  zPathSegment.length>  s	     qrt   c                     t           )zReturns the fragment path_d value for the current path segment.

        For a relative segment the current_point must be provided. If it is omitted then only an absolute segment
        can be returned.r  r   r   r   r  s       rq   r6   zPathSegment.dH  s
    
 "!rt   c                 R    t          t                              | |                    S r   )r'  r  find_intersections)r   r_  s     rq   	intersectzPathSegment.intersectO  s     K224AABBBrt   r  r   r  Nr   c              #     K   |dk    sJ ddl }|                    |d         |d         |          }	|                    |d         |d         |          }
|	d         |	d         z
  }|
d         |
d         z
  }|                     |	          }|                    |
          }|dddf         |dddf         dz  z   }|dddf         |dddf         dz  z   }|                    |                    |dd                   |                    |dd                             \  }}|                    |                    |dd                   |                    |dd                             \  }}|                    |                    |dd                   |                    |dd                             \  }}|                    |                    |dd                   |                    |dd                             \  }}||z
  ||z
  z  ||z
  ||z
  z  z
  }||z
  ||z
  z  ||z
  ||z
  z  z
  }||z
  ||z
  z  ||z
  ||z
  z  z
  }|                    |dk    |                    |          |                    |          k    |                    |          |                    |          k    t          |          t          |          k    t          |          t          |          k    f          	                    d          }|
                    |          }t          |          dk    r*|d	k     r$|d         |d         |d         |d         fV  dS ||         ||         z  }||         ||         z  }t          |          D ]\  }}|d         t          |d                   |z  z   } |d         t          |d                   |z  z   }!||         |z  }"||         |z  }#||k    r| |"z   |!|#z   fV  pt                              | || | |z   | |"z   f|!|!|z   |!|#z   f||dz   ||
          E d{V  dS )ah  
        Calculate intersections by linearized polyline intersections with enhancements.
        We calculate probable intersections by linearizing our segment into `sample` polylines
        we then find those intersecting segments and the range of t where those intersections
        could have occurred and then subdivide those segments in a series of enhancements to
        find their intersections with increased precision.

        This code is fast, but it could fail by both finding a rare phantom intersection (if there
        is a low or no enhancements) or by failing to find a real intersection. Because the polylines
        approximation did not intersect in the base case.

        At a resolution of about 1e-15 the intersection calculations become unstable and intersection
        candidates can duplicate or become lost. We terminate at that point and give the last best
        guess.

        :param segment1:
        :param segment2:
        :param samples:
        :param ta:
        :param tb:
        :param depth:
        :param enhancements:
        :param enhance_samples:
        :return:
        r   r   Nr   )numrm  r  )axis绽|=)tatbsamplesr  enhancementsenhance_samples)rQ  linspacerV  meshgridr6  r5  dstacksignr   allargwherer   rT  r   r  r  )$segment1segment2r  r  r  r  r  r  rY  r   rg  step_astep_br  r  ax1bx1ax2bx2ay1by1ay2by2denomqaqbhits	where_hitta_hittb_hitr  hitatbta_fractionalb_fractionals$                                       rq   r  zPathSegment.find_intersectionsR  s     H !||||KK1r!u'K22KK1r!u'K221!1!OOAOOAaaadGa1gl"aaadGa1gl";;rwwq"v#2#@@S;;rwwqu~~rwwqu~~>>S;;rwwq"v#2#@@S;;rwwqu~~rwwqu~~>>SssSy)S3Y39,EECiC#I&#)c	)BBCiC#I&#)c	)BByy
"''"++-"''"++-E

c"gg%E

c"gg%
 
 #1#++ 	 KK%%	y>>Q6E>>!u RU%6eRUl"""F DE$K'DE$K'	** 	 	FAsAs1v//BAs1v//Bq	F"  "!9v-L$$<'l)::::::&99BKl):;BKl):;+!)!-$3 : 	 	 	 	 	 	 	 	 	 		 	rt   NNN)r  r  r  r   r   r  )r   r   r   rT  r   r%  r  rX  r   r  r(  r  r  nextr[  r+  r  r  r  r  r  rL  rV  rM  r6   r  r  rm   rt   rq   r  r    s        (
 
 
G G G   H   G    	  	  	  D    \B "%#Ui 
 
 
 


& 
& 
&  1 1 1+ + + !I    " " " "C C C  b b b \b b brt   r  c                   J    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZddZd
S )ro  zRepresents move commands. Moves to a new location without any path distance.
    Paths that consist of only move commands, are valid.

    Move serve to make discontinuous paths into continuous linked paths segments
    with non-drawn sections.
    c                 t   t          j        | fi | d| _        d| _        t	          |          dk    r#d|v r|d         | _        d|v r|d         | _        nt	          |          dk    r_t	          |          dk    r|d         | _        nkd|v r|d         | _        |d         | _        nLd|v r|d         | _        |d         | _        n-t	          |          dk    r|d         | _        |d         | _        | j        t          | j                  | _        | j        t          | j                  | _        dS dS )a  
        Move commands most importantly go to a place. So if one location is given, that's the end point.
        If two locations are given then first is the start location.

        For many Move commands it is not necessary to have an original start location. The start point provides a
        linked locations for some elements that may require it. If known it can be provided.

        Move(p) where p is the End point.
        Move(s,e) where s is the Start point, e is the End point.
        Move(p, start=s) where p is End point, s is the Start point.
        Move(p, end=e) where p is the Start point, e is the End point.
        Move(start=s, end=e) where s is the Start point, e is the End point.
        Nr   r   r   r   r   )r  r   r   r   r   r0  r  s      rq   r   zMove.__init__  s6    	T,,V,,,
t99>>!%=&  #G_
YY!^^6{{a7F??!%aDJ%e}DHH&&!'DJ#AwDHYY!^^aDJAwDH:!tz**DJ8TXDHHH  rt   c                     t          |t                    rt          |          }t          |t                    r.| j        | xj        |z  c_        | j        | xj        |z  c_        | S r   r   r   r[  r   r   r   s     rq   r   zMove.__imul__  f    eS!! 	"5MMEeV$$ 	"z%

e#

x#E!rt   c                 D    t          | j        | j        | j                  S Nr   )ro  r   r   r   r   s    rq   r   zMove.__copy__  s    DJ4=AAAArt   c                 z    t          |t                    st          S | j        |j        k    o| j        |j        k    S r   )r   ro  rC  r   r   r   s     rq   r  zMove.__eq__  s7    %&& 	"!!zU[(BTX-BBrt   c                 H    t          |t                    st          S | |k     S r   )r   ro  rC  r   s     rq   r  zMove.__ne__  '    %&& 	"!!5=  rt   c                     dS rF  rm   r   s    rq   rG  zMove.__len__  rH  rt   c                 D    |dk    r| j         S |dk    r| j        S t          r   r   r   r4  rK  s     rq   rM  zMove.__getitem__  )    199:QYY8Ort   c                 ^    | j         j        | j         j        | j         j        | j         j        fS )z:Return the bounding box for a Move which is the end point.)r   rE   rF   r   s    rq   r  z	Move.bbox
  s!    xz48:txz48:==rt   Nc                 N    ||| j         s||s
d| j        z  S d| j        |z
  z  S )NzM %szm %sr   r   r  s       rq   r6   zMove.d  s?    ! T] $X$DH$$M122rt   r  )r   r   r   rT  r   r   r   r  r  rG  rM  r  r6   rm   rt   rq   ro  ro    s         &' &' &'P  B B BC C C
! ! !
    > > >3 3 3 3 3 3rt   ro  c                   (    e Zd ZdZddZeddfdZdS )CurvezRepresents curve commandsNc                     t          j        | fi | |t          |          nd | _        |t          |          nd | _        d S r   r  r   r0  r   r   r   r   r   r   s       rq   r   zCurve.__init__  J    T,,V,,,%*%6U5\\\D
!$5:::drt   r   r  c              #     K   d||z
  z  |z   }|                      |          }|                      |          }|                      |          }|                      d||z
  z  |z             }|                      d||z
  z  |z             }	t          |||          }
t                              ||
j                  }t                              ||
j                  }t                              |	|
j                  }t          ||z
            t          ||z
            z   |z  }||k     r|
V  d S |                     |||          E d {V  |                     |||          E d {V  d S )Nr  g      ?g      ?)r   r   control)rA  r   r   )rL  Arcr0  r   centerr   as_circular_arcs)r   rA  r   r   r  r  r  r  sample_point0sample_point1r   radiusr  r  current_errors                  rq   r  zCurve.as_circular_arcs   sx     S5[!E)jj''JJsOO	JJsOO	

43;#7%#?@@

43;#7%#?@@IFFFSZ88^^M3:66^^M3:66R&[))CV,<,<<F5  IIIII,,53,OOOOOOOOO,,5,MMMMMMMMMMMrt   NN)r   r   r   rT  r   r+  r  rm   rt   rq   r  r    sQ        ##; ; ; ;
 &+#3 N N N N N Nrt   r  c                   \    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 ZddZddZddZdS )LinearRepresents line commands.Nc                     t          j        | fi | |t          |          nd | _        |t          |          nd | _        d S r   r  r  s       rq   r   zLinear.__init__6  r  rt   c                 P    |                      | j        | j        | j                  S r  )rr  r   r   r   r   s    rq   r   zLinear.__copy__;  s     ~~dj$(T]~KKKrt   c                 z    t          || j                  st          S | j        |j        k    o| j        |j        k    S r   )r   rr  rC  r   r   r   s     rq   r  zLinear.__eq__>  s9    %00 	"!!zU[(BTX-BBrt   c                 H    t          || j                  st          S | |k     S r   )r   rr  rC  r   s     rq   r  zLinear.__ne__C  s)    %00 	"!!5=  rt   c                     t          |t                    rt          |          }t          |t                    r.| j        | xj        |z  c_        | j        | xj        |z  c_        | S r   r  r   s     rq   r   zLinear.__imul__H  r  rt   c                     dS rF  rm   r   s    rq   rG  zLinear.__len__R  rH  rt   c                 D    |dk    r| j         S |dk    r| j        S t          r   r  rK  s     rq   rM  zLinear.__getitem__U  r  rt   c                 |    	 dd l }|                    t          |          dft                    }|                    |ddg j        j         j        j        g          |d d df<   |                    |ddg j        j         j        j        g          |d d df<   |S # t          $ r  fd|D             cY S w xY w)Nr   r   )shaperP  r   c                 \    g | ](}t                               j        j        |          )S rm   )r0  r  r   r   rM  s     rq   r  z!Linear.npoint.<locals>.<listcomp>f  s-    RRREMM$*dh<<RRRrt   )
rQ  rS  r   r   interpr   rE   r   rF   rR  )r   rX  rY  rZ  s   `   rq   rV  zLinear.npoint]  s    	SY 35AAByyQFTZ\48:4NOOBqqq!tHyyQFTZ\48:4NOOBqqq!tHI 	S 	S 	SRRRR	RRRRRR	Ss   BB   B;:B;c                 l    | j         ,| j        %t                              | j        | j                   S dS r}   )r   r   r0  r   rf  s      rq   rM  zLinear.lengthh  s.    :!dh&:>>$(DJ7771rt   Tc                 H   | j         }| j        }|d         |j        z
  }|d         |j        z
  }|j        |j        z
  }|j        |j        z
  }||z  ||z  z   }	||z  ||z  z   }
|	dk    rdS |
t	          |	          z  }|r|dk    rd}|dk     rd}|                     |          S )z7Gives the point on the line closest to the given point.r   r   )r   r   rE   rF   r   rL  )r   r  respect_boundsr   rg  v_ap_xv_ap_yv_ab_xv_ab_ysq_distance_abab_ap_productr   s               rq   closest_segment_pointzLinear.closest_segment_pointn  s    JH11qsqs&6F?:&6/9Q1~!6!66 	zzzzzz&!!!rt   c                     t           r   r  r  s       rq   r6   zLinear.d  s    !!rt   r   r  r  )r   r   r   rT  r   r   r  r  r   rG  rM  rV  rM  r  r6   rm   rt   rq   r  r  3  s        ##; ; ; ;
L L LC C C
! ! !
      	S 	S 	S   " " " "(" " " " " "rt   r  c                       e Zd ZdZddZdS )rn  zRepresents close commands. If this exists at the end of the shape then the shape is closed.
    the methodology of a single flag close fails in a couple ways. You can have multipart shapes
    which can close or not close several times.
    Nc                 (    ||| j         s||sdS dS )Nr   r   r   r  s       rq   r6   zClose.d  s*    ! T] $X$33rt   r  r   r   r   rT  r6   rm   rt   rq   rn  rn    s2         
     rt   rn  c                       e Zd ZdZddZdS )Liner  Nc                 N    ||| j         s||s
d| j        z  S d| j        |z
  z  S )NzL %szl %sr  r  s       rq   r6   zLine.d  s?    ! T] $X$DH$$TX566rt   r  r  rm   rt   rq   r  r    s.        ##7 7 7 7 7 7rt   r  c                   d    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZd ZddZdS )QuadraticBezieru&   Represents Quadratic Bézier commands.c                 ^    t          j        | ||fi | |t          |          nd | _        d S r   )r  r   r0  r  )r   r   r  r   r   s        rq   r   zQuadraticBezier.__init__  s8    tUC226222)0)<uW~~~$rt   c                     dt          | j                  dt          | j                  dt          | j                  dS )NzQuadraticBezier(start=z
, control=, end=rh   )r~  r   r  r   r   s    rq   r%  zQuadraticBezier.__repr__  sC     NNNN
 	
rt   c                 \    t          | j        | j        | j        | j        | j                  S Nr   r  )r!  r   r  r   r   r  r   s    rq   r   zQuadraticBezier.__copy__  s2    JLH];
 
 
 	
rt   c                     t          |t                    st          S | j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r   r!  rC  r   r   r  r   s     rq   r  zQuadraticBezier.__eq__  sM    %11 	"!!J%+% .EI%.-	
rt   c                 H    t          |t                    st          S | |k     S r   )r   r!  rC  r   s     rq   r  zQuadraticBezier.__ne__  s'    %11 	"!!5=  rt   c                    t          |t                    rt          |          }t          |t                    rE| j        | xj        |z  c_        | j        | xj        |z  c_        | j        | xj        |z  c_        | S r   )r   r   r[  r   r  r   r   s     rq   r   zQuadraticBezier.__imul__  s~    eS!! 	"5MMEeV$$ 	"z%

e#

|'%x#E!rt   c                     dS )Nr_  rm   r   s    rq   rG  zQuadraticBezier.__len__  rH  rt   c                 ^    |dk    r| j         S |dk    r| j        S |dk    r| j        S t          )Nr   r   r   )r   r  r   r4  rK  s     rq   rM  zQuadraticBezier.__getitem__  s:    199:QYY<QYY8Ort   c                 R  	
 | j         \  | j        \  	| j        \  
	
fd	 ddl}|                    t          |          df          } |                    |                    \  |dddf<   |dddf<   |S # t          $ r fd|D             cY S w xY w)lCalculate the x,y position at a certain position of the path. `pos` may be a
        float or a NumPy array.c                 |    d| z
  }| | z  }||z  }|| z  }|z  d|z  z  z   |z  z   |z  d|z  	z  z   |
z  z   fS )Nr   r   rm   )r   n_pospos_2n_pos_2	n_pos_posrG   rI   rK   rH   rJ   rL   s        rq   _compute_pointz.QuadraticBezier.npoint.<locals>._compute_point  sq    LEx'EemG(I "q9}r11EBJ>"q9}r11EBJ> rt   r   Nr   r  r   c                 4    g | ]}t           |           S rm   r  ro   r   r4  s     rq   r  z*QuadraticBezier.npoint.<locals>.<listcomp>  (    OOOE>>(334OOOrt   )r   r  r   rQ  rS  r   rW  rR  )r   rX  rY  rZ  r4  rG   rI   rK   rH   rJ   rL   s       @@@@@@@rq   rV  zQuadraticBezier.npoint  s
    BBB
	 
	 
	 
	 
	 
	 
	 
	 
	 
		PY 344B!/0C0C!D!DBqqq!tHbAhI 	P 	P 	POOOOYOOOOOO	Ps   AB B&%B&c                 R   | j         j        | j        j        z
  }| j         j        d| j        j        z  z
  | j        j        z   }|dk    r|t	          |          z  }nd}d|cxk     rdk     r5n n2| j         j        | j        j        |                     |          j        g}n| j         j        | j        j        g}| j         j        | j        j        z
  }| j         j        d| j        j        z  z
  | j        j        z   }|dk    r|t	          |          z  }nd}d|cxk     rdk     r5n n2| j         j        | j        j        |                     |          j        g}n| j         j        | j        j        g}t          |          t          |          t          |          t          |          fS )uK   
        Returns the bounding box for the quadratic Bézier curve.
        r   r   r  r   )	r   rE   r  r   r   rL  rF   rJ  rK  )r   r  r6   r   x_valuesy_valuess         rq   r  zQuadraticBezier.bbox  sg    JL4<>)JL1t|~--
:66E!HHAAAq9999199999
dhj$**Q--/BHH
dhj1HJL4<>)JL1t|~--
:66E!HHAAAq9999199999
dhj$**Q--/BHH
dhj1H8}}c(mmS]]CMMIIrt   Nc                 x   | j         d| j        z  z
  | j        z   }d| j        | j         z
  z  }	 d|j        |j        z  |j        |j        z  z   z  }d|j        |j        z  |j        |j        z  z   z  }|j        |j        z  |j        |j        z  z   }dt          ||z   |z             z  }t          |          }	d|z  |	z  }
dt          |          z  }||	z  }|
|z  |	|z  ||z
  z  z   d|z  |z  ||z  z
  t          d|	z  |z   |z   ||z   z            z  z   d|
z  z  }n# t          t          f$ r t          |          dk     rt          |          }nct          |          t          |          z  }|dk    r t          |          t          |          z
  }nt          |          ||z  dz  |z
  dz   z  }Y nw xY w|S )9Calculate the length of the path up to a certain positionr   r`  r  r   )
r   r  r   r6  r5  r   r   r}  r   r   )r   rA  rB  r   rg  r   Br   SabcA2A32C2BAr   r  s                  rq   rM  zQuadraticBezier.length  s   JT\))DH4
*+	5 QVaf_qv67AQVaf_qv67A!&16/1AtAEAI&DaBa%"*CT!WWBRB d
q&D2I&'q519q1u$QVb[4-?BG,L(M(MMN S	AA
 ":. 		5 		5 		51vv~~FFFFSVVO66AQAAA!a%!)a-!"34A		5 s   C.D BF76F7c                     t          |t                    r0| j        |j        k    o| j        | j        z
  |j        |j        z
  k    S | j        | j        k    S zGChecks if this segment would be a smooth segment following the previous)r   r!  r   r   r  r   previouss     rq   is_smooth_fromzQuadraticBezier.is_smooth_from:  sX    h00 	.:- 4<$*3Lx//3  <4:--rt   c                     || j         s|(|r&||| j        s||s
d| j        z  S d| j        |z
  z  S ||| j        s||sd| j        d| j        S d| j        |z
  d| j        |z
  S )NzT %szt %szQ r  zq )r  r   r   r  r  s       rq   r6   zQuadraticBezier.dC  s    Nt{N0Bv0B%$$((((M!9:: %$$(($(LLL$((;; L=000H},, rt   r   r  )r   r   r   rT  r   r%  r   r  r  r   rG  rM  rV  r  rM  rH  r6   rm   rt   rq   r!  r!    s        00G G G
 
 

 
 

 
 
! ! !

 
 
    P P P8J J J4       D. . .     rt   r!  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZefdZeefdZeefdZd ZddZdS )CubicBezieru"   Represents Cubic Bézier commands.c                     t          j        | ||fi | |t          |          nd | _        |t          |          nd | _        d S r   )r  r   r0  control1control2)r   r   rM  rN  r   r   s         rq   r   zCubicBezier.__init__^  sN    tUC226222+3+?hT+3+?hTrt   c           
          dt          | j                  dt          | j                  dt          | j                  dt          | j                  d	S )NzCubicBezier(start=z, control1=z, control2=r$  rh   )r~  r   rM  rN  r   r   s    rq   r%  zCubicBezier.__repr__c  sV     NNNN	
 	
rt   c                 h    t          | j        | j        | j        | j        | j        | j                  S r&  )rK  r   rM  rN  r   r   r  r   s    rq   r   zCubicBezier.__copy__k  s7    JMMH];
 
 
 	
rt   c                     t          |t                    st          S | j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r   rK  rC  r   r   rM  rN  r   s     rq   r  zCubicBezier.__eq__u  s`    %-- 	"!!J%+% 0EI%0/0 /		
rt   c                 H    t          |t                    st          S | |k     S r   )r   rK  rC  r   s     rq   r  zCubicBezier.__ne__  s'    %-- 	"!!5=  rt   c                 0   t          |t                    rt          |          }t          |t                    r\| j        | xj        |z  c_        | j        | xj        |z  c_        | j        | xj        |z  c_        | j        | xj        |z  c_        | S r   )r   r   r[  r   rM  rN  r   r   s     rq   r   zCubicBezier.__imul__  s    eS!! 	"5MMEeV$$ 	"z%

e#

}(&}(&x#E!rt   c                     dS )Nr`  rm   r   s    rq   rG  zCubicBezier.__len__  rH  rt   c                 x    |dk    r| j         S |dk    r| j        S |dk    r| j        S |dk    r| j        S t          r  )r   rM  rN  r   r4  rK  s     rq   rM  zCubicBezier.__getitem__  sK    199:QYY= QYY= QYY8Ort   c                 n    t                               |            | j        }| j        | _        || _        d S r   )r  r  rN  rM  )r   r  s     rq   r  zCubicBezier.reverse  s1    D!!!]rt   c                 n  	
 | j         \  	| j        \  
| j        \  | j        \  	
fd	 ddl}|                    t          |          df          } |                    |                    \  |dddf<   |dddf<   |S # t          $ r fd|D             cY S w xY w)r.  c                     | | z  | z  }d| z
  }||z  |z  }| | z  |z  }||z  | z  }|z  d|z  |z  z   z  z   |	z  z   |
z  d|z  |z  z   z  z   |z  z   fS )Nr   r_  rm   )r   pos_3r0  n_pos_3pos_2_n_posn_pos_2_posrG   rI   rK   r  rH   rJ   rL   r  s         rq   r4  z*CubicBezier.npoint.<locals>._compute_point  s    x'(2ELEeme+G"X-5K%-(2K"qK"$4{R7G$GHH5SU:U"qK"$4{R7G$GHH5SU:U rt   r   Nr   r5  r   c                 4    g | ]}t           |           S rm   r  r7  s     rq   r  z&CubicBezier.npoint.<locals>.<listcomp>  r8  rt   )	r   rM  rN  r   rQ  rS  r   rW  rR  )r   rX  rY  rZ  r4  rG   rI   rK   r  rH   rJ   rL   r  s       @@@@@@@@@rq   rV  zCubicBezier.npoint  s!    BBBB
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
		PY 344B!/0C0C!D!DBqqq!tHbAhI 	P 	P 	POOOOYOOOOOO	Ps   AB B43B4c                 n    |                      d          \  }}|                      d          \  }}||||fS )u   returns the tight-fitting bounding box of the Bézier curve.
        Code by:
        https://github.com/mathandy/svgpathtools
        r   r   )_real_minmax)r   r  r  r  r  s        rq   r  zCubicBezier.bbox  sA    
 &&q))
d&&q))
dT4%%rt   c                     ddg}fd D             }|d         d|d         z  z
  d|d         z  z   |d         z
  }t          |          dk    r|d         |d         z  |d         |d         z   |d         z  z
  |d         |d         z  z   |d         |d         z
  |d         z  z   }|dk    rt          |          }|d         d|d         z  z
  |d         z   }||z   |z  }||z
  |z  }	d|cxk     rdk     rn n|                    |           d|	cxk     rdk     rn nx|                    |	           nb|d         |d         z
  }
d|d         d|d         z  z
  |d         z   z  }|dk    r+|
 |z  }d|cxk     rdk     rn n|                    |            fd|D             }t          |          t	          |          fS )zreturns the minimum and maximum for a real cubic bezier, with a non-zero denom
        Code by:
        https://github.com/mathandy/svgpathtools
        r   r   c                      g | ]
}|         S rm   rm   )ro   r   r   s     rq   r  z,CubicBezier._real_minmax.<locals>.<listcomp>  s       aQqT   rt   r_  r   g:0yE>c                 F    g | ]}                     |                   S rm   rK  )ro   r   r   r   s     rq   r  z,CubicBezier._real_minmax.<locals>.<listcomp>  s(    EEEaAq)EEErt   )r   r   r  rJ  rK  )r   r   local_extremizersr   r  r  sqdeltar   r  r  r   rg  r  local_extremas   ``            rq   r_  zCubicBezier._real_minmax  s   
 F    4   !q1Q4x!ad(*QqT1u::!qtqtad{ad22QqTAaD[@AaD1Q4KSTUVSWCWW  zzu++dQ1Xo!,Gmu,Gmu,r::::A:::::%,,R000r::::A:::::%,,R000!qtAQqTA!H_qt+,AAvvR!Vr::::A:::::%,,R000EEEEE3DEEE=!!3}#5#555rt   c                     ddl m} t          | j         t          | j         t          | j         t          | j         fd} ||dd|d          d         S )Nr   )r   c                     t          dz
  z  d| z
  dz  z  dz
  z  d| z
  z  | z  z   dz
  z  | dz  z  z             S )Nr_  r   r   r  r  )r   p0r  r  r~  s    rq   _abs_derivativez2CubicBezier._length_scipy.<locals>._abs_derivative  sd    R"WQ1,rBw-1q5)A-.rBw-!Q$&'  rt   r   r    )epsabsr   )scipy.integrater   r]  r   rM  rN  r   )r   rA  r   ri  rh  r  r  r~  s       @@@@rq   _length_scipyzCubicBezier._length_scipy  s    ((((((dj!dm$dm$dh	 	 	 	 	 	 	 	 tOS#e4HHHKKrt   c                 2    |                      dd||          S r   )r  rf  s      rq   _length_defaultzCubicBezier._length_default  s      Aui888rt   c                 h    	 |                      |          S #  |                     ||          cY S xY w)r=  )rm  ro  rf  s      rq   rM  zCubicBezier.length   s@    	:%%e,,,	:''y99999s    1c                     t          |t                    r0| j        |j        k    o| j        | j        z
  |j        |j        z
  k    S | j        | j        k    S rE  )r   rK  r   r   rM  rN  rF  s     rq   rH  zCubicBezier.is_smooth_from  sX    h,, 	/:- 4=4:3Mx003  =DJ..rt   Nc                 &   || j         s|;|r9||| j        s||sd| j        d| j        S d| j        |z
  d| j        |z
  S ||| j        s||sd| j        d| j        d| j        S d| j        |z
  d| j        |z
  d| j        |z
  S )NzS r  zs zC zc )r  r   rN  r   rM  r  s       rq   r6   zCubicBezier.d  s    Nt{N0Bv0B%$$(($(MMM488<< MM111H},,  %$$(('+}}}dmmmTXXNN MM111MM111H},, rt   r  )r   r   r   rT  r   r%  r   r  r  r   rG  rM  r  rV  r  r_  r+  rm  r  ro  rM  rH  r6   rm   rt   rq   rK  rK  [  sJ       ,,J J J

 
 

 
 

 
 
! ! !
    
 
 
  P P P:& & &6 6 6> #( L L L L" %*Y 9 9 9 9 !I : : : :/ / /     rt   rK  c                   B   e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	             Zed
             Zd Zd Zd Zd Zd ZeefdZd Zd Zd&dZd&dZd Zed             Zed             Zed             Zd Zd Zd Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d'd%Z)dS )(r  c           
      d   t          j        | fi | d| _        d| _        d| _        d| _        t          |          dk    r't          |d         t                    r | j	        |  dS t          |          dk    rd|v r | j	        d$i | dS t          |          dk    rG| 
                    |d         |d         |d         |d         |d	         |d
         |d                    dS d|v rd|v rd|v rd|v r|d         }|d         }|d         }|d         }t          ||z   dz  ||z   dz            | _        ||z
  dz  }||z
  dz  }t          | j        j        |z   | j        j                  | _        t          | j        j        | j        j        |z             | _        t          |          }	|	dk    r"|d         t          |d                   | _        |	dk    r"|d         t          |d                   | _        |	dk    r"|d         t          |d                   | _        |	dk    r"|d         t          |d                   | _        |	d	k    r"|d	         t          |d	                   | _        |	d
k    r|d
         | _        dS d|v rt          |d                   | _        d|v rt          |d                   | _        d|v rt          |d                   | _        d|v rt          |d                   | _        d|v rt          |d                   | _        d|v r|d         | _        d}
| j        | j        | j        d}d}d|v r;t!          |d                   }|| j                            | j                  z  dz  }nd|v rt!          |d                   }|ft                              | j        | j        d          }| j                            | j                  }|                    |t*          dz  z
  |          }d|v rt          |d                   }||| j        z
  }| j        |z
  }t                              | j        |d          }t                              || j        d          }| j        | j        k    r|j        }|j        }t*          | _        nt-          |j                  dk    r|j        |j        z  }nt!          d          }t-          |j                  dk    r|j        |j        z  }nt!          d          }t-          |j                  dk     rc|j        }t-          |j                  dk     r	|j        }net-          |          dk    r|j        |j        |z
  |z  z   }n;t!          d          }n*t-          |j                  dk     r=|j        }t-          |j                  dk     r|j        }n|j        |j        |z
  |z  z   }nt-          |j                  dk     r|j        }||j        |z
  z  |j        z   }nt-          |j                  dk     r|j        }||j        |z
  z  |j        z   }nkt-          ||z
            dk     r|j        }|j        }nF||z  |j        |j        z
  z  ||j        z  z
  ||j        z  z   ||z
  z  }|j        ||j        z
  |z  z
  }t          ||          | _        t/          t                              | j        || j                  dk              }
nd|v r|d         }t          | j        j        | j        j        z   dz  | j        j        | j        j        z   dz            }t                              | j        | j                  }|dz  }||k     r|x|d<   }t          |j        t5          ||z  ||z  z
            | j        j        | j        j        z
  z  |z  z   |j        t5          ||z  ||z  z
            | j        j        | j        j        z
  z  |z  z             | _        t/          t                              | j        | j        | j                  dk              }
d|v r
|d         r|
s|
st          |j        t5          ||z  ||z  z
            | j        j        | j        j        z
  z  |z  z
  |j        t5          ||z  ||z  z
            | j        j        | j        j        z
  z  |z  z
            | _        nd |v rd!|v rt*          dz  | _        t          | j        j        | j        j                  | _        t/          t                              | j        | j        | j                  dk              }
d"|v r|d"         r| j         | _        |
 }
d|v r
|d         r|
s|
s)t          | j        j        | j        j                  | _        | j        t7          d#          d|v rn|d         }| j        ,t          | j        j        |z   | j        j                  | _        | j        ,t          | j        j        | j        j        |z             | _        d |v rn|d          }| j        _d|v r/|d         }t                              | j        ||          | _        n,t          | j        j        |z   | j        j                  | _        d!|v r{|d!         }| j        ld|v r<|d         }|t*          dz  z  }t                              | j        ||          | _        n,t          | j        j        | j        j        |z             | _        | j        | j        | j        }t                              | j        | j                  }t          | j        j        |z   | j        j                  | _        t          | j        j        | j        j        |z             | _        | j        | j        | j        }t                              | j        | j                  }t          | j        j        |z   | j        j                  | _        t          | j        j        | j        j        |z             | _        | j        | j        | j        |                                 }|                                 }||z
  | _        d|v rt/          |d                    }
|
r | j        dk     r| xj        t*          z  c_        |
s | j        dk    r| xj        t*          z  c_        | j        F| j        ?| j        8|                                 }|| j        z   }|                     |          | _        | j        H| j        C| j        >|                                 }|| j        z
  }|                     |          | _        dS dS dS dS )%a	  
        Represents Arc commands.

        Arc objects can take different parameters to create arcs.
        Since we expect taking in SVG parameters. We accept SVG parameterization which is:
        start, rx, ry, rotation, arc_flag, sweep_flag, end.

        To do matrix transitions, the native parameterization is start, end, center, prx, pry, sweep

        'start, end, center, prx, pry' are points and sweep amount is a t value in tau radians.
        If points are modified by an affine transformation, the arc is transformed.
        There is a special case for when the scale factor inverts, it inverts the sweep.

        Note: t-values are not angles from center in elliptical arcs. These are the same thing in
        circular arcs. But, here t is a parameterization around the ellipse, as if it were a circle.
        The position on the arc is (a * cos(t), b * sin(t)). If r-major was 0 for example. The
        positions would all fall on the x-axis. And the angle from center would all be either 0 or
        tau/2. However, since t is the parameterization we can conceptualize it as a position on a
        circle which is then scaled and rotated by a matrix.

        prx is the point at t 0 in the ellipse.
        pry is the point at t tau/4 in the ellipse.
        prx -> center -> pry should form a right triangle.

        The rotation can be defined as the angle from center to prx. Since prx is located at
        t(0) its deviation can only be the result of a rotation.

        Sweep is a value in t.
        The sweep angle can be a value greater than tau and less than -tau.
        However, if this is the case, conversion back to Path.d() is expected to fail.
        We can denote these arc events but not as a single command.

        start_t + sweep = end_t
        Nr  r   r      r   r   r_  r`  r   leftrighttopbottomr  r   r   r  r  pryr   Tbulgesagittar  r   r  r   infrB   ccwr@   rA   scoopedz&Not enough values to solve for center.rm   ) r  r   r  r  rz  r   r   r   r]  _svg_complex_parameterize_svg_parameterizer0  rE   rF   r   r   r   r)  r  r  r  r   r   r   r  r   r   r   r  get_start_t	get_end_t
point_at_t) r   r   r   rv  rw  rx  ry  r@   rA   r  cwr  r|  r{  r  delta_adelta_bab_midbc_midr>   r?   slope_aslope_brB   r  r   hqthetaradius_sradius_estart_tend_ts                                    rq   r   zArc.__init__-  s   F 	t&&v&&&
t99>>ja'::>*D*D11F[[A*"6"6*D*44V444FYY!^^ ""Qa$q'47DGT!Wd1g   Ff6!!F""&>D7OE-CH%F 4sV|s6JKKDK$,#%B3,#%BT[]R/??DHT[]DKMB,>??DHt99a<<Aw""47^^
a<<Aw" a>>a<<Aw"#DGnna<<Aw" a>>a<<Aw" a>>a<<aDJFfvg//DJF??VE]++DHvx 011DKF??VE]++DHF??VE]++DHfDJ:!dh&:t{?R GG&  fWo..$*"8"8"B"BBSHf$$y 122"--
DHcBB
++DH55!**539+<gFFF""y 122"!DJ.(W,tz7C@@w#>>:))BB!$DJJ79~~--"))gi"7"',,79~~--"))gi"7"',,79~~--#Xwy>>E11!'BB"7||e33%+XB'0I%I%*5\\WY%//#Xwy>>E11!'BB!'VX]g,E!EBBWY%//#X$26AWY%//#X$26AWw.//%77#X#X $g-FH1DE%01%01 %w.	0
 $Xfh'(AA#Bmm%++DJJJaOPP3KZ\DHJ.#5
txz8QUX7X  NN4:tx88Wr66&((F3K!#EDQb11TZ\DHJ5NORSSSEDQb11TXZ$*,5NORSSS  %++DJTXNNRSSTTF??ve}??2?"'QUR"W_ 5 5
9R SVW WWQUR"W_ 5 5djl9R SVW WW# #DK DFNN
 !3Y
#DJL$(*==%++DJTXNNRSSTT&&6)+<&"&*DJBVOOuO"ORO"'
DJL"A"ADK;EFFF&==sAx !2DKMBBx 0ABB6>>Bx''":.E${{4;rBBDHH$T[]R%7GGDH6>>Bx''":.ES3Y&E${{4;rBBDHH$T[]DKMB4FGGDH:!tx'748;K~~dk4:>>HT[]X5t{}EEDHT[]DKMH,DEEDH8TX%59I~~dk48<<HT[]X5t{}EEDHT[]DKMH,DEEDH:$*"8TX=Q&&((GNN$$EDJfUm,,, "dj1nn

c!

 "$*q..

c!

:!dj&<AQ&&((Gdj(Eu--DH:!dj&8TX=QNN$$Edj(Gw//DHHH "!&8&8=Q=Qrt   c                     dt          | j                  dt          | j                  dt          | j                  dt          | j                  dt          | j                  d| j        dS )Nz
Arc(start=r$  z	, center=z, prx=z, pry=z, sweep=rh   )r~  r   r   r  r  rz  r   r   s    rq   r%  zArc.__repr__*  sj     NNNNNNNNNNNNJJJ
 	
rt   c           	      t    t          | j        | j        | j        | j        | j        | j        | j                  S r  )r  r   r   r  r  rz  r   r   r   s    rq   r   zArc.__copy__4  s<    JHKHHJ]
 
 
 	
rt   c                     t          |t                    st          S | j        |j        k    oO| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r   )	r   r  rC  r   r   r  rz  r  r   r   s     rq   r  z
Arc.__eq__?  s    %%% 	"!!J%+% *EI%*EI%* EI%* u|+	*
 
ek)	
rt   c                 H    t          |t                    st          S | |k     S r   )r   r  rC  r   s     rq   r  z
Arc.__ne__K  s'    %%% 	"!!5=  rt   c                    t          |t                    rt          |          }t          |t                    r| j        | xj        |z  c_        | j        | xj        |z  c_        | j        | xj        |z  c_        | j        | xj        |z  c_        | j        | xj        |z  c_        |j        dk     r| j	         | _	        | S r}   )
r   r   r[  r   r  r   r  rz  r  r   r   s     rq   r   zArc.__imul__P  s    eS!! 	"5MMEeV$$ 	)z%

e#

{&u$x#E!x#E!x#E! 1$$"j[
rt   c                     dS )Nr   rm   r   s    rq   rG  zArc.__len__b  rH  rt   c                     |dk    r| j         S |dk    r| j        S |dk    r| j        S |dk    r| j        S |dk    r| j        S t
          )Nr   r   r   r_  r`  )r   r   r  r  rz  r4  rK  s     rq   rM  zArc.__getitem__e  sZ    199:QYY8OQYY;QYY8OQYY8Ort   c                 d    t                               |                                           j        S zlegacy property)r  r   r  r  r   s    rq   r  z	Arc.thetar  s%     }}T--//00DDrt   c                 J    t                               | j                  j        S r  )r  r   r   r  r   s    rq   r  z	Arc.deltaw  s     }}TZ((33rt   c                 T    t                               |            | j         | _        d S r   )r  r  r   r   s    rq   r  zArc.reverse|  s%    D!!!j[


rt   c                 0    	 dd l }                     |                    |                    S # t          $ r[  j         j        k    r% j        dk    r j        gt          |          z  cY S                                   fd|D             cY S w xY w)Nr   c                     g | ]<}|d k    rj         n,|dk    rj        n                    j        |z  z             =S )r   r   )r   r   r  r   )ro   r   r   r  s     rq   r  zArc.npoint.<locals>.<listcomp>  si        	 !88 

 !88 XX__WtzC/?%?@@  rt   )	rQ  _points_numpyrW  rR  r   r   r   r   r  )r   rX  rY  r  s   `  @rq   rV  z
Arc.npoint  s    	%%bhhy&9&9::: 	 	 	zTX%%$*//
|c)nn4444&&((G     %     	s   +0 =B/#BBc                    ddl }|                    t          |          dft                    }| j        | j        k    r%| j        dk    r| j        \  |dddf<   |dddf<   n|                                 | j        |z  z   }|                                 }| j	        }| j
        }| j        j        }| j        j        }	t          |          }
t          |          }|                    |          }|                    |          }|||z  |
z  z   ||z  |z  z
  |dddf<   |	||z  |z  z   ||z  |
z  z   |dddf<   t!          | j                  ||dk    ddf<   t!          | j                  ||dk    ddf<   |S )zVectorized version of `point()`.

        :param positions: 1D numpy array of float in [0, 1]
        :return: 1D numpy array of complex
        r   Nr   rO  r   )rQ  rS  r   r   r   r   r   r  get_rotationr@   rA   r  rE   rF   r
   r   r'  )r   rX  rY  rZ  r   r   r   rg  r>   r?   cos_rotsin_rotcos_tsin_ts                 rq   r  zArc._points_numpy  s    	XXs9~~q)X77:!!djAoo!%Bqqq!tHbAhh  ""TZ)%;;A((**HAABB(mmG(mmGFF1IIEFF1IIEAI//!e)g2EEBqqq!tHAI//!e)g2EEBqqq!tH %)$4$4ByA~qqq !$(NNByA~qqq !	rt   c                 v    dd}|                                  }|| j        z   } |||| j        | j                  S )N順 c           	          fdt          | |          t          | |z
            |z  t          fdt          d|dz             D                       z  S )Nc                 j    t          |           }t          ddz  z  z  z
  |z  |z  z
            S r>  )r   r   )r   sintr   rg  s     rq   r  z>Arc._integral_length.<locals>.ellipse_part_integral.<locals>.f  s=    1vvAa!eA%6!6$ > EEFFFrt   c              3   @   K   | ]} |z  z             z  V  d S r   rm   )ro   r  r  seg_lenr   s     rq   rr   zFArc._integral_length.<locals>.ellipse_part_integral.<locals>.<genexpr>  s;      UU11UWq[011G;UUUUUUrt   r   )rJ  r   rF  r  )t1t2r   rg  r  r  r  r   s     `` @@@rq   ellipse_part_integralz3Arc._integral_length.<locals>.ellipse_part_integral  s    G G G G G G BKKE"r'llQ&GsUUUUUUU1aRSe__UUUUUUUrt   )r  )r  r   r@   rA   )r   r  start_angle	end_angles       rq   _integral_lengthzArc._integral_length  sT    	V 	V 	V 	V &&(($*,	$$[)TWdgNNNrt   c                     ddl m} | j        }| j        }||z  }d||z  z
  }|                                 } |||          }|| j        z   } |||          }|t          ||z
            z  S )zscipy is not a dependency. However, if scipy exists this function will find the
        exact arc length. .length() delegates to here and on failure uses the
        fallback method.r   )	ellipeincr   )scipy.specialr  r@   rA   r  r   r   )	r   r  r   rg  adbr   phid1d2s	            rq   _exact_lengthzArc._exact_length  s     	,+++++GG!ec	M  YsADJYsA3rBw<<rt   c                 J   | j         dk    rdS | j        | j        k    r| j         dk    rdS | j        }| j        }t          ||z
            }|t          k     rt          | j        | j         z            S 	 |                                 S #  |                     ||          cY S xY w)u   The length of an elliptical arc segment requires numerical
        integration, and in that case it's simpler to just do a geometric
        approximation, as for cubic Bézier curves.
        r   r@  )	r   r   r   r@   rA   r   r+  r  r  )r   rA  rB  r   rg  r6   s         rq   rM  z
Arc.length  s    
 :??1:!!djAoo1GGAJJu99tw+,,,	G%%'''	G$$5I$FFFFFs   3B B"c                     |                      t          |          |j        |j        |||t          |                     dS )zAParameterization with complex radius and having rotation factors.N)r  r0  r6  r5  )r   r   r  r   arc_flag
sweep_flagr   s          rq   r  zArc._svg_complex_parameterize  sK     	%LLKK#JJ	
 	
 	
 	
 	
rt   c                 b   t          |          }t          |          }t          |          }|| _        t          |          }|| _        ||k    s|dk    s|dk    rEd| _        t          |          | _        t          |          | _        t          |          | _        dS t          t          |                    }t          t          |                    }	|j        |j        z
  dz  }
|j        |j        z
  dz  }||
z  |	|z  z   }||z  }|	 |
z  ||z  z   }||z  }||z  }||z  }||z  ||z  z   }|dk    r.|t          |          z  }|t          |          z  }||z  }||z  }||z  }||z  }t          t          ||z  |z
  |z
  ||z   z                      }||k    r| }||z  |z  |z  }| |z  |z  |z  }t          ||z  |	|z  z
  |j        |j        z   dz  z   |	|z  ||z  z   |j        |j        z   dz  z             }||z
  |z  }||z
  |z  }| |z
  |z  }| |z
  |z  }t          ||z  ||z  z             }|}t          ||z  ||z  z   ||z  ||z  z   z            }||z  ||z  z   }||z  }|dk    rd}n|dk     rd}t          t!          |                    } ||z  ||z  z
  dk     r|  } | dz  } |s| dz  } t#                      }!|!                    t&                              |          j        |j        |j                   || _        t          |j        |z   |j                  | _        t          |j        |j        |z             | _        | j                            |!           | j                            |!           t&                              |           j        | _        dS )zConversion from svg parameterization, our chosen native native form.
        http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotesr   Nr   r   r  g      h  )r   r0  r   r   r   r  rz  r  r
   r   r   r6  r5  r   r   r   r   r[  rO  r  r  rE   rF   r  )"r   r   r@   rA   r   large_arc_flagr  r   cosrsinrrM   rN   x1prim	x1prim_sqy1prim	y1prim_sqrx_sqry_sqradius_checkr  r  r   cxprimcyprimr  uxuyvxvyr  r  r6   r  rotate_matrixs"                                     rq   r  zArc._svg_parameterize  s!    n--*%%
e
CjjC<<277bAgg DJU||DHU||DH,,DKF78$$%%78$$%%j38#q(j38#q(TBY&VO	dRi'VO	RR "E)i%.?@!$|$$$B$|$$$BGEGEYYeemb(2-"r':;;<<Z''AR&2%b6!B&F]TF]*
SX0E/JKF]TF]*
SX0E/JK
 

 vo#vo#g"$g"$b27"## "r'BG#R"r'(9:;;Gb2gE s77AAXXAQ  Gb2g""FE 	SLE !!MM(##.&(	
 	
 	
 B1168b=11!!-000!!-000]]5))4


rt   Nc              #   &  K   |;t           dz  }t          t          t          | j                  |z                      }|dk    rd S | j        t          |          z  }|                                 }| j        }|                                 }t          |          }t          |          }| j        }	| j        }
| j        j        }| j        j        }t!          d|          D ]}||z   }||z   dz  }|                     |          }||dz
  k    r| j        }t          |          }t          |          }dt          |          z
  dz  }|||	|z  |z  |
|z  |z  z
  z  z   }|||	|z  |z  |
|z  |z  z   z  z   }t'          |||f|          V  |}|}d S )Nr   r   r   r   r   r   )r   r   r	   r   r   r   r  r   r  r
   r   r@   rA   r  rE   rF   r  r  r   r!  )r   arc_requiredsweep_limitt_slice	current_tp_startr  	cos_theta	sin_thetar   rg  r>   r?   r  next_tmid_tp_end	cos_mid_t	sin_mid_tre  r   pys                         rq   as_quad_curveszArc.as_quad_curvesV  s     *KtC
OOk$ABBCCL1F*u\222$$&&	*!!##JJ	JJ	GG[][]q,'' 	 	A(Fi'1,EOOF++EL1$$$E

IE

I3w<<'3.Eeq9}y81y=9;TTUUBeq9}y81y=9;TTUUB!'B8U;;;;;GII	 	rt   c              #     K   |;t           dz  }t          t          t          | j                  |z                      }|dk    rd S | j        t          |          z  }|                                 }| j        }| j        }| j	        }| 
                                }| j        j        }	| j        j        }
t          |          }t          |          }t!          d|          D ]n}||z   }t          |          t#          ddt%          t'          |dz            d          z  z             dz
  z  dz  }t          |          }t          |          }| |z  |z  ||z  |z  z
  }| |z  |z  ||z  |z  z   }t          |          }t          |          }|	||z  |z  z   ||z  |z  z
  }|
||z  |z  z   ||z  |z  z   }||f}||dz
  k    r| j        }| |z  |z  ||z  |z  z
  }| |z  |z  ||z  |z  z   }|d         ||z  z   |d         ||z  z   f}|d         ||z  z
  |d         ||z  z
  f}t+          ||||          V  t-          |          }|}pd S )	Nr   r   r`  r_  r  r   r   r   )r   r   r	   r   r   r   r  r@   rA   r   r  r  rE   rF   r
   r   r  r   powr   r   rK  r0  )r   r  r  r  r  r@   rA   r  r  rG   rH   r  r  r  r  re  cos_start_tsin_start_t	ePrimen1x	ePrimen1y	cos_end_t	sin_end_tp2En2xp2En2yr  	ePrimen2x	ePrimen2yp_c1p_c2s                                rq   as_cubic_curveszArc.as_cubic_curvesy  s     *KtC
OOk$ABBCCL1F*u\222!!##WW*$$&&	[][]JJ	JJ	q,'' 	 	A(FLLDQS35G5G1K1K-K)K$L$Lq$PQTWWEi..Ki..Ki+5Y8TTIi+5Y8TTIFIFI"y.944rI~	7QQF"y.944rI~	7QQFV$EL1$$$i)3b9ny6PPIi)3b9ny6PPIAJ!22GAJAR4RSD!Huy00%(UY=N2NODgtT599999EllGII9	 	rt   c                 *    | j         }| j        }||k    S r   )r@   rA   )r   r   rg  s      rq   is_circularzArc.is_circular  s    GGAvrt   c                 6    t          | j        | j                  S )zcLegacy complex radius property

        Point will work like a complex for legacy reasons.
        )r0  r@   rA   r   s    rq   r  z
Arc.radius  s     TWdg&&&rt   c                 L    t                               | j        | j                  S r   )r0  r   r  r  r   s    rq   r@   zArc.rx      ~~dk48444rt   c                 L    t                               | j        | j                  S r   )r0  r   r  rz  r   s    rq   rA   zArc.ry  r  rt   c                 L    t                               | j        | j                  S r   )r0  r  r  r  r   s    rq   r  zArc.get_rotation  s    {{4;111rt   c                 6    |                      | j                  S )zF
        :return: Angle from the center point to start point.
        )angle_at_pointr   r   s    rq   get_start_anglezArc.get_start_angle  s     ""4:...rt   c                 6    |                      | j                  S )zD
        :return: Angle from the center point to end point.
        )r  r   r   s    rq   get_end_anglezArc.get_end_angle  s     ""48,,,rt   c                 v    |                      |                     |                                                     S )z]
        start t value in the ellipse.

        :return: t parameter of start point.
        )
t_at_pointpoint_at_angler  r   s    rq   r  zArc.get_start_t  s0     t2243G3G3I3IJJKKKrt   c                 v    |                      |                     |                                                     S )z[
        end t value in the ellipse.

        :return: t parameter of start point.
        )r  r  r  r   s    rq   r  zArc.get_end_t  s0     t2243E3E3G3GHHIIIrt   c                 n   ||                                  z  }| j        }| j        }||k    r|                     |          S t	          |t          |          z  |          }t          dz  }d|z  }|t          |          t          z  cxk    r|k    rn n|t          dz  z  }|                     |          S z
        find the point on the ellipse from the center at the given angle.
        Note: For non-circular arcs this is different from point(t).

        :param angle: angle from center to find point
        :return: point found
        r   r_  r  )r  r@   rA   r  r   r   r   r   r   r  r   rg  r   tau_1_4tau_3_4s          rq   r  zArc.point_at_angle  s     	""$$$GG66??5)))!c%jj.!$$)g+c%jj3&000000000sNAq!!!rt   c                 6    | j                             |          S zn
        find the angle to the point.

        :param p: point
        :return: angle to given point.
        )r  r  r  s     rq   r  zArc.angle_at_point  s     {##A&&&rt   c                 <   |                      |          }||                                 z  }| j        }| j        }t	          |t          |          z  |          }t          dz  }d|z  }|t          |          t          z  cxk    r|k    rn n|t          dz  z  }|S z
        find the t parameter to at the point.

        :param p: point
        :return: t parameter to the given point.
        r   r_  r  )r  r  r@   rA   r   r   r   r   r   r  r  r   rg  r   r  r  s           rq   r  zArc.t_at_point  s     ##A&&""$$$GG!c%jj.!$$)g+c%jj3&000000000sNArt   c                 ^   |                                  }| j        }| j        }| j        j        }| j        j        }t          |          }t          |          }t          |          }	t          |          }
|||	z  |z  z   ||
z  |z  z
  }|||	z  |z  z   ||
z  |z  z   }t          ||          S z
        find the point that corresponds to given value t.
        Where t=0 is the first point and t=tau is the final point.

        In the case of a circle: t = angle.

        :param t:
        :return:
        )	r  r@   rA   r  rE   rF   r
   r   r0  )r   r   r   r   rg  r>   r?   r  r  r  r  r   r  s                rq   r  zArc.point_at_t  s     $$&&GG[][]h--h--AA!e)g%%E	G(;;!e)g%%E	G(;;R}}rt   c                 h    t          | j        | j        | j        |                                           S r   )Ellipser  r@   rA   r  r   s    rq   get_ellipsezArc.get_ellipse#  s(    t{DGTWd6G6G6I6IJJJrt   c                      j         dk    r. j        j         j        j         j        j         j        j        fS                                  j        }t          |          dk    rt          dz  }d}nst          |          dk    rd}t          dz  }nS j
         j        }}t          ||z   t          |          z            }t          ||z  t          |          z            } fd} j        j         j        j        g} j        j         j        j        g}t          dd          D ]}	 |||	          }
 |||	          }d|
cxk    rdk    r0n n-|                                         |
          j                   d|cxk    rdk    r0n g|                                         |          j                   t#          |          t#          |          t%          |          t%          |          fS )zeFind the bounding box of an arc.
        Code from: https://github.com/mathandy/svgpathtools
        r   r   c                 Z    | t           dz  |z  z   dt           z  z  j        z
  j        z  S )Nr  r  )r   r  r  )angr  r   s     rq   	angle_invzArc.bbox.<locals>.angle_inv8  s-    C#I?*sSy9DJF$*TTrt   r  r   r   )r   r   rE   rF   r   r  r  r
   r   r   r@   rA   r   r   r  r  rL  rJ  rK  )r   r  atan_xatan_yr@   rA   r  xtremaytremar  r  r  s   `           rq   r  zArc.bbox&  s    :??:<txz48:EE!!,s88q==3YFFFXX]]F3YFFWdgBBG*s3xx/00F27c#hh.//F	U 	U 	U 	U 	U *,
+*,
+r1 	0 	0A61%%B61%%BB||||!|||||djjnn.///B||||!|||||djjnn.///6{{CKKVc&kkAArt   c           	         ||| j         s|t|srd| j        | j        |                                 j        t          t          | j                  t          dz  k              t          | j        dk              | j	        fz  S d| j        | j        |                                 j        t          t          | j                  t          dz  k              t          | j        dk              | j	        |z
  fz  S )NzA %G,%G %G %d,%d %sr  r   za %G,%G %G %d,%d %s)
r   r@   rA   r  r  r   r   r   r   r   r  s       rq   r6   zArc.dH  s    ! T] $X$(!!##.C
OOsSy122DJ!O$$,   )!!##.C
OOsSy122DJ!O$$=(,  rt   r   r  )*r   r   r   r   r%  r   r  r  r   rG  rM  rY  r  r  r  rV  r  r  r  r+  r  rM  r  r  r  r  r  r  r@   rA   r  r  r  r  r  r  r  r  r  r  r  r6   rm   rt   rq   r  r  ,  s       {0 {0 {0z
 
 
	
 	
 	


 

 

! ! !
  $     E E XE 4 4 X4! ! !  (  BO O O       !I G G G G*
 
 
]5 ]5 ]5~! ! ! !F. . . .`  
 ' ' X' 5 5 X5 5 5 X52 2 2/ / /- - -L L LJ J J" " "(' ' '  $  .K K K B  B  BD     rt   r  c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d<d	Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed             Zed             Zed             Zed             Zd Zd ZdddZdddZ ddd Z!ddd!Z"ddd"Z#ddd#Z$ddd$Z%ddd%Z&ddd&Z'd<d'Z(d( Z)d) Z*d* Z+d+ Z,d, Z-d- Z.d. Z/d/ Z0d0 Z1d1 Z2e3d=d3            Z4d>d5Z5d?d6Z6d@d8Z7d@d9Z8dAd;Z9d2S )Br7  a  
    A Path is a Mutable sequence of path segments

    It is a generalized shape which can map out all the other shapes.

    Each PathSegment object maps a particular command. Each one exists only once in each path and every point contained
    within the object is also unique. We attempt to internally maintain some validity. Each end point should link
    to the following segments start point. And each close point should connect from the preceding segments endpoint to
    the last Move command.

    These are soft checks made only at the time of addition and some manipulations. Modifying the points of the segments
    can and will cause path invalidity. Some SVG invalid operations are permitted such as arcs longer than tau radians
    or beginning sequences without a move. The expectation is that these will eventually be used as part of a valid path
    so these fragment paths are permitted. In some cases these invalid paths will still have consistent path_d values,
    in other cases, there will be no valid methods to reproduce these.

    Instantiation formats:

    Path("d-string", keywords)
    Path(pathsegment1,...)
    Path(d="d-string", other keywords)
    c                 @   t          j        | g|R i | d | _        d | _        t	                      | _        t          |          dk    rR|D ]3}t          |t                    st          d|j
        j        z            4| j                            |           n|d         }t          |t                    rP| j                            |                    d                     t                               | |j                   n9t          |t                     r/| j                            |                    d                     nt          |t                     r)t	                      | _        |                     |           nt          |t$                    r/| j                            |           |                                  nst          |t                    r/| j                            |           |                                  n/t          |t                    r| j                            |           t*          | j        v rL| j                            dd          s3|                     | j        t*                              d| j        d<   d S d S d S )Nr   z4Object not PathSegment when instantiating a Path: %sr   Frj  pathd_loadedT)r0  r   r  r  r'  	_segmentsr   r   r  r   rr  r   extendSubpathrE  _pathr   r   r&  validate_connectionsr  SVG_ATTR_DATAr  r  )r   r   r   r_  r   s        rq   r   zPath.__init__y  ss   t-d---f---t99>>  !';77 $N!+45  
 N!!$''''QA!W%% )%%ajjUj&C&CDDDtQW----Au%% )%%ajjUj&C&CDDDDAs## )!%

1Au%% 	)%%a((())++++At$$ )%%a((())++++A{++ )%%a(((DK'' ;??>599 3

4;}5666.2N+++ ('3 3rt   c                     t          |           }|j        }t          dt          |                    D ]}t	          ||                   ||<   |S r}   )r7  r  r  r   r   )r   r!   segsr  s       rq   r   zPath.__copy__  sM    Dzz~q#d))$$ 	$ 	$A47mmDGGrt   c                     | j         |         S r   )r  r   r  s     rq   rM  zPath.__getitem__  s    ~e$$rt   c                 *   |dk     s|dz   t          | j                  k    rdS t          |t          | j                            D ]}| j        |         }t          |t                    r dS t          |t
                    rt          |dd          D ]L}| j        |         }t          |t                    r(t          |j                  | j        |         _          dS Mt          | j        d         j                  | j        |         _         dS dS )z2ensure the subpath containing this index is valid.r   r   Nr  )r   r  r  r   ro  rn  r0  r   )r   r  r  close_searchr  move_searchs         rq   _validate_subpathzPath._validate_subpath  s   199	S%8%888Fuc$.1122 	 	A>!,L,-- ,.. ub"--  A"&."3K!+t44 05ko0F0Fq)- ).dnQ.?.C(D(Dq!%		 	rt   c                    t          |dz   t          | j                            D ]c}| j        |         }t          |t                    r dS t          |t
                    r't          | j        |         j                  |_         dS ddS )zHensure the next closed point from this index points to a valid location.r   N)r  r   r  r   ro  rn  r0  r   r   r  r  r_  s       rq   _validate_movezPath._validate_move  s    uqy#dn"5"566 	 	AnQ'G'4(( '5)) #DN5$9$=>>		 	rt   c                 F   t          |dd          D ]K}| j        |         }t          |t                    r't	          |j                  | j        |         _         dS L| j        d         j        t	          | j        d         j                  nd| j        |         _        dS )zNensure the close element at this position correctly links to the previous mover  Nr   )r  r  r   ro  r0  r   r*  s       rq   _validate_closezPath._validate_close  s    ub"%% 	 	AnQ'G'4(( ,1'+,>,>u%) -1N1,=,A,ME$.#'(((SW 	u!!!rt   Fc                    |dk     s|dz   t          | j                  k    rdS | j        |         }| j        |dz            }|j        "|j        t	          |j                  |_        dS |j        "|j        t	          |j                  |_        dS |j        |j        k    r8|rt	          |j                  |_        dS t	          |j                  |_        dS dS )a0  
        Validates the connection at the index.
        Connection 0 is the connection between getitem(0) and getitem(1)

        prefer_second is for those cases where failing the connection requires replacing
        an existing value. It will prefer the authority of right side, second value.
        r   r   N)r   r  r   r   r0  )r   r  prefer_secondry  rz  s        rq   _validate_connectionzPath._validate_connection  s     199	S%8%888Fu%	*9 V\%9 ++FLLLY6<#;fl++EIIIY&,&& 0!&,//			$UY// '&rt   c                    t          |t                    rot          |          }t          |          dk    rd S |                                }t          |t
                    r"t          |          dk    rt          |d         }|| j        |<   d | _        d | _	        t          |t                    r|                                  d S |                     |dz
             |                     |           t          |t                    r|                     |           t          |t                    r|                     |           d S d S r   )r   r   r7  r   rE  r   r   r  r  r  r  r  r0  ro  r+  rn  r-  )r   r  new_elements      rq   rQ  zPath.__setitem__  sJ   k3'' 	-{++K;1$$%..00K%%% -{##a''$$)!n +ueU## 	,%%'''''%%eai000%%e,,,+t,, +##E***+u-- ,$$U+++++, ,rt   c                 *   | j         |         }| j         |= d | _        t          |t                    r|                                  d S |                     |dz
             t          |t          t          f          r|                     |           d S d S r>  )	r  r  r   r  r  r0  rn  ro  r(  )r   r  original_elements      rq   __delitem__zPath.__delitem__   s    >%0N5!eU## 	.%%'''''%%eai000*UDM:: .&&u-----. .rt   c                    t          |t                    r|                     |           nt          |t          t          f          r6|                     t          t          t          |                               not          |t                    r(|                     |
                                           n2t          |t                    r|                     |           nt          S | S r   )r   r   r   r7  r  r  r  r   r'  r0  r6   r  r  rC  r   s     rq   r   zPath.__iadd__  s    eS!! 		"JJug// 	"KKD$u++..////u%% 	"JJuwwyy!!!!{++ 	"KK!!rt   c                     t          |t          t          t          t          t
          f          rt          |           }||z  }|S t          S r   )r   r   r7  r  r0  r  r   rC  r  s      rq   r  zPath.__add__  s>    ec4%EFF 	T

AJAHrt   c                 .   t          |t                    r>t          |          }|                    t	          t
          | j                             |S t          |t                    r't          |           }|                    d|           |S t          S r}   )
r   r   r7  r  r  r   r  r  insertrC  r  s      rq   rW  zPath.__radd__  s~    eS!! 		";;DKKD$.11222K{++ 	"::DKK5!!!K!!rt   c                 *    t          | j                  S r   )r   r  r   s    rq   rG  zPath.__len__+  s    4>"""rt   c                 *    |                                  S r   r6   r   s    rq   r(  zPath.__str__.      vvxxrt   c                    g }t          |           dk    r7|                    d                    d | j        D                                  |                     |           d                    |          }| j        j        d|dS )Nr   r  c              3   4   K   | ]}t          |          V  d S r   r~  ro   rE   s     rq   rr   z Path.__repr__.<locals>.<genexpr>4  s(      #D#DDGG#D#D#D#D#D#Drt   rg   rh   )r   r  r  r  r  rr  r   r  s      rq   r%  zPath.__repr__1  s    t99q==MM$))#D#DT^#D#D#DDDEEE   6"">222FFF;;rt   c                    t          |t                    r"|                     t          |                    S t          |t                    st          S t          |           t          |          k    rdS t          |           }t          |          }t          |j        |j                  D ]\  }}||k    s dS |j	        |j	        k    rdS dS NFT)
r   r   r  r7  rC  r   r   rq  r  r  )r   r   r  r   r   r.  s         rq   r  zPath.__eq__9  s    eS!! 	,;;tE{{+++%&& 	"!!t99E

""5IIJJQ[11 	 	DAq66uu >Q^++5trt   c                 V    t          |t          t          f          st          S | |k     S r   )r   r7  r   rC  r   s     rq   r  zPath.__ne__I  s+    %$-- 	"!!5=  rt   c                 N    t                      }|                    | |           dS )zParses the SVG path.N)r{   r   )r   pathdeftokenss      rq   r   z
Path.parseN  s'    !##T7#####rt   c                    d}d}| j         D ]}|t          |t                    r|j        }|y|j        !|j        t          |j                  |_        nQ|j        !|j        t          |j                  |_        n)|j        |j        k    rt          |j                  |_        t          |t                    r!||j        |k    rt          |          |_        |}dS )a  
        Force validate all connections.

        This will scan path connections and link any adjacent elements together by replacing any None points or causing
        the start position of the next element to equal the end position of the previous. This should only be needed
        when combining paths and elements together. Close elements are always connected to the last Move element or to
        the end position of the first element in the list. The start element of the first segment may or may not be
        None.
        N)r  r   ro  r   r   r0  rn  r   zpointlast_segmentr_  s       rq   r  zPath.validate_connectionsS  s     ~ 	# 	#G~GT!:!:~ '=(\-=-I$),*:$;$;GMM!%-'-2K',W]';';L$$!%66$),*:$;$;GM7E**,&K6))#Fmm"LL!	# 	#rt   c                     d}d}| j         D ]p}|t          |t                    r|j        }|'|j         dS |j         dS |j        |j        k    r dS t          |t
                    r||j        |k    r dS |}qdS )aa  
        Checks validation of all connections.

        Paths are valid if all end points match the start of the next point and all close
        commands return to the last valid move command.

        This does not check for incongruent path validity. Path fragments without initial moves
        double closed paths, may all pass this check.
        NFT)r  r   ro  r   r   rn  rI  s       rq   	_is_validzPath._is_validq  s     ~ 	# 	#G~GT!:!:~ '=( 55!%- 55!%66 557E**&K6))uu"LLtrt   c                     t          | j                  dk    rdS | j        d         j        t          | j        d         j                  S | j        d         j        t          | j        d         j                  ndS )zFirst point along the Path. This is the start point of the first segment unless it starts
        with a Move command with a None start in which case first point is that Move's destination.r   N)r   r  r   r0  r   r   s    rq   first_pointzPath.first_point  su     t~!##4>!".*0111,0N1,=,A,ME$.#'(((SW	
rt   c                     t          | j                  dk    rd S | j        d         j        t          | j        d         j                  nd S )Nr   r  )r   r  r   r0  r   s    rq   r   zPath.current_point  sP    t~!##4 ~b!%1 $.$()))	
rt   c                     d}t          | j                  D ] }t          |t                    r	|j        } n!|$	 | j        d         j        }n# t
          $ r Y nw xY w|S )z
        Z is the destination of the last Move. It can mean, but doesn't necessarily mean the first_point in the path.
        This behavior of Z is defined in svg spec:
        http://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand
        Nr   )reversedr  r   ro  r   r4  )r   end_posr_  s      rq   z_pointzPath.z_point  s     // 	 	G'4(( !+ ?.+/   s   A 
AAc                 &   t          | j                  dk    rdS | j        }| j        d         }t          |t                    r|j        }|                    |          S t          |t                    r|j        }|                    |          S |S )a  Returns the smoothing control point for the smooth commands.
        In regard to the SVG standard if the last command was a curve the smooth
        control point is the reflection of the previous control point.

        If the last command was not a curve, the smooth_point is coincident with the current.
        https://www.w3.org/TR/SVG/paths.html#PathDataCubicBezierCommands
        r   Nr  )	r   r  r   r   r!  r  r  rK  rN  )r   	start_posrK  previous_controls       rq   smooth_pointzPath.smooth_point  s     t~!##4&	~b)lO44 	@+3#44Y???k22 	@+4#44Y???rt   c                     d S r   rm   r   s    rq   r   z
Path.start  r  rt   c                     d S r   rm   r   s    rq   r   zPath.end  r  rt   r   c                    | j         }|d         }|dv r| j        }|                     t          |||                     t	          |          dk    r | j        |dd          d|i | S )Nr   r   r   r   r   r   )r   rT  r  ro  r   r&   )r   r   rC   r   rV  rS  s         rq   r   z	Path.move  sy    &	)j  lGDGh???@@@v;;??DIvabbz5H555rt   c                    t          t          |                    D ]A}| j        }||         }|dv r| j        }|                     t          |||                     B| S )Nr\  r   )r  r   r   rT  r  r  )r   r   rC   r   r  rV  rS  s          rq   r&   z	Path.line  sm    3v;;'' 	E 	EE*IUmG*$$,KKY(CCCDDDDrt   c                `   t          t          |                    D ]}| j        }|rG|                     t	          |t          |j        |j        ||         z             |                     R|                     t	          |t          |j        ||                   |                     | S r  r  r   r   r  r  r0  rE   rF   )r   r   y_pointsr   r  rV  s         rq   r   zPath.vertical  s    3x==)) 	 	E*I !ik9;%+HII!)      !ik8E?;;!)      rt   c                `   t          t          |                    D ]}| j        }|rG|                     t	          |t          |j        ||         z   |j                  |                     R|                     t	          |t          ||         |j                  |                     | S r  r_  )r   r   x_pointsr   r  rV  s         rq   r   zPath.horizontal  s    3x==)) 	 	E*I !ikHUO;Y[II!)      !huoy{;;!)      rt   c          
          t          t          |                    D ]J}| j        }| j        }||         }|dv r| j        }|                     t          ||||d                     K| S )oSmooth curve. First control point is the "reflection" of
        the second control point in the previous path.r\  Tr'  )r  r   r   rX  rT  r  r!  )r   r   rC   r   r  rV  rM  rS  s           rq   r   zPath.smooth_quad  s     3v;;'' 
	 
	E*I(HUmG*$$,KKx8D     
 rt   c          
      L   t          dt          |          d          D ]}| j        }||         }|dv r2| j        }|                     t          ||||d                     | c S ||dz            }|dv r| j        }|                     t          ||||d                     | S )Nr   r   r\  Fr'  r   )r  r   r   rT  r  r!  )r   r   rC   r   r  rV  r  rS  s           rq   r   z	Path.quad"  s    1c&kk1-- 	 	E*IUmG*$$,#!7Ghu    
 UQY'G*$$,KKw(5     
 rt   c                ^   t          dt          |          d          D ]}| j        }| j        }||         }|dv r3| j        }|                     t          |||||d                     | c S ||dz            }|dv r| j        }|                     t          |||||d                     | S )rd  r   r   r\  Tr'  r   )r  r   r   rX  rT  r  rK  	r   r   rC   r   r  rV  rM  rN  rS  s	            rq   r   zPath.smooth_cubic8  s     1c&kk1-- 	 	E*I(He}H:%%<!   !)#  	 	 	 UQY'G*$$,KK%  	 	 	 	 rt   c                   t          dt          |          d          D ]}| j        }||         }|dv r3| j        }|                     t          |||||d                     | c S ||dz            }|dv r3| j        }|                     t          |||||d                     | c S ||dz            }|dv r| j        }|                     t          |||||d                     | S )	Nr   r_  r\  Tr'  r   r   F)r  r   r   rT  r  rK  rg  s	            rq   r   z
Path.cubic\  sV   1c&kk1-- *	 *	E*Ie}H:%%<!   !)#  	 	 	 eai(H:%%<!   !)#  	 	 	 UQY'G*$$,KK%   	 	 	 	 rt   c                   t          dt          |          d          D ]}| j        }||         }||dz            }|dk     rt          |          }|dk     rt          |          }||dz            }||dz            }	||dz            }
||dz            }|dv r| j        }|                     t          |||||	|
||	                     | S )
Nr   r  r   r   r_  r`  r   r\  r   )r  r   r   r   rT  r  r  )r   r   arc_argsr   r  rV  r@   rA   r   r   r   rS  s               rq   r   zPath.arc  s    1c(mmQ// 	 	E*I%B%!)$BAvvWWAvvWW	*H519%CUQY'Euqy)G*$$,KKIr2xeWxXXX    rt   c                 z    | j         }| j        }t          ||          }||_        |                     |           | S r   )r   rT  rn  r   r  )r   r   rV  rS  r_  s        rq   r   zPath.closed  s?    &	,	7++#Grt   c                    t          |t                    rVt          |          }t          |          dk    rd S t          |          dk    r|                     |           d S |d         }d | _        t          | j                  dz
  }| j                            |           |                     |           t          |t                    r| 
                    |dz              d S d S r   )r   r   r7  r   r  r  r  r  r0  rn  r-  )r   r   r  s      rq   r  zPath.append  s    eS!! 	KKE5zzQ5zzA~~E"""!HEDN##a'e$$$!!%(((eU## 	,  +++++	, 	,rt   c                    t          |t                    r,t          |          }t          |          dk    rd S |d         }d | _        | j                            ||           |                     |dz
             |                     |           t          |t                    r| 	                    |           t          |t                    r|                     |           d S d S r   )r   r   r7  r   r  r  r9  r0  ro  r+  rn  r-  r   r  r   s      rq   r9  zPath.insert  s    eS!! 	KKE5zzQ!HEeU+++!!%!),,,!!%(((eT"" 	'&&&eU## 	(  '''''	( 	(rt   c                    t          |t                    rt          |          }d | _        t	          | j                  dz
  }| j                            |           |                     |           |                     |           d S r>  )	r   r   r7  r  r   r  r  r0  r(  )r   iterabler  s      rq   r  zPath.extend  s~    h$$ 	&H~~HDN##a'h'''!!%(((u%%%%%rt   c                    t          | j                  dk    rdS t          t          | j                  dz
  dd          D ]}| j        |         }t          |t                    ra|                                dk    rIt          |j        |j                  }t          |j                  |_        | 
                    ||           | S )a  Forces close operations to be zero length by introducing a direct
        line to operation just before any non-zero length close.

        This is helpful because for some operations like reverse() because the
        close must be located at the very end of the path sequence. But, if it's
        in effect a line-to and close, the line-to would need to start the sequence.

        But, for some operations this won't matter since it will still result in
        a closed shape with reversed ordering. But, if the final point in the
        sequence must exactly switch with the first point in the sequence. The
        close segments must be direct and zero length.
        r   Nr   r  )r   r  r  r   rn  rM  r  r   r   r0  r9  )r   r  r_  r&   s       rq   direct_closezPath.direct_close  s     t~!##Fs4>**Q.B77 	) 	)AnQ'G'5)) )>>##q((w{;;D$)'+$6$6GMKK4(((rt   c                 |   t          | j                  dk    rd S | j        d         j        }d | j        d         _        t                      }t	          |                                           }|D ]}|                                 t          |          D ]}||z  }|j        | _        || j        d         _        | S r}   )r   r  r   r7  r'  as_subpathsr  rR  )r   prepointr  subpathssubpaths        rq   r  zPath.reverse  s    t~!##F>!$*"&qFF((**++ 	 	GOO)) 	 	GLAA"*qrt   c                 T    t          |                                           }||         S r   )r'  rt  )r   r  rv  s      rq   rw  zPath.subpath  s%    ((**++rt   c                 b    t          |                                           }t          |          S r   )r'  rt  r   )r   rv  s     rq   count_subpathszPath.count_subpaths  s'    ((**++8}}rt   c              #   h  K   d}t          |           D ]e\  }}t          |t                    r||k    rt          | ||dz
            V  |}t          |t                    rt          | ||          V  |dz   }f|t          |           k    r%t          | |t          |           dz
            V  d S d S r   )rT  r   ro  r  rn  r   )r   r   currentr\  s       rq   rt  zPath.as_subpaths  s      %dOO 	$ 	$LGS#t$$ $e##!$w{;;;;;#E#u%% $dE733333!CII$s4yy1}5555555 rt   c              #   t   K   | D ]2}|D ]-}t          |t                    st          |          V  )|V  .3dS )z/Returns the list of defining points within pathNr  )r   r\  r  s      rq   	as_pointszPath.as_points
  sa       	 	C  !!U++ ((NNNNGGGG		 	rt   c                     t                               |            t                              |            t          | j        t
                    r| j        D ]}|| j        z  }| j                                         | S )zh
        Realizes the transform to the shape properties.

        Path objects reify perfectly.
        )r  r  r  r   r;   r[  r  r$  )r   r  s     rq   r  z
Path.reify  sx     	D!!!D!!!dnf-- 	$^ $ $T^#rt   Nc           
         t          |           dk    rdS g }d }t          d          }|d}d}nd}t          |          }|| D ]}t          |t          t
          t          t          f          r+|                    |	                    ||                     nt          |t          t          f          rw|r|s	|sF|j        r?|                    |	                    |||                    |                               n+|                    |	                    ||d                     |}|j        }n| D ]}t          |t          t
          t          t          f          r0|                    |	                    ||j                             nt          |t          t          f          r|r|s	|sK|j        rD|                    |	                    ||j        |                    |                               n0|                    |	                    ||j        d                     |}|j        }d                    |          S )Nr   r   FTr   r'  r  )r   r0  r   r   ro  r  r  rn  r  r6   rK  r!  r  rH  r   r   r  )	rE  r   r  partsprevious_segmentr  override_smoothsmooth_set_valuer_  s	            rq   svg_dz
Path.svg_d!  s   x==A2!HH>#O#"O#F||# ) )gdC'?@@ TLL1x!@!@AAAA+)GHH T' T,< T+T07T #II !)1'.'='=>N'O'O &      WYYq8EY%R%RSSS#* $(#)& $ ) )gdC'?@@ LL1w7G!H!HIIII+)GHH ' ,< +07 #II !)0)9'.'='=>N'O'O &      #IIa'2B5IQQ   $+ $(xxrt   Tc                 l    | }|rt          |          }t                              |j        ||          S r&  )r   r7  r  r  )r   r   r  r  r!   s        rq   r6   zPath.dX  s4     	t99Dzz$.8FzKKKrt   c                 n     |r, j                                         s fd j        D             S  j        S )Nc                 $    g | ]}|j         z  S rm   r;   ro   r   r   s     rq   r  z!Path.segments.<locals>.<listcomp>`  s     ???1A&???rt   )r;   r1  r  rh  s   ` rq   rE  zPath.segments^  sF     	@t~99;; 	@????????~rt   皙?c                 R   t           |z  }t          t          |           dz
  dd          D ]z}| |         }t          |t                    r[t          t          t          |j                  |z                      }t          |
                    |                    | ||dz   <   {dS )u]   
        Iterates through this path and replaces any Arcs with cubic Bézier curves.
        r   r  N)r   r  r   r   r  r   r	   r   r   r'  r  r   rA  r  r   r_  r  s         rq   approximate_arcs_with_cubicsz!Path.approximate_arcs_with_cubicsc  s     Eks4yy1}b"-- 	N 	NA1gG'3'' N"4GM(:(:[(H#I#IJJ"&w'>'>|'L'L"M"MQQY		N 	Nrt   c                 R   t           |z  }t          t          |           dz
  dd          D ]z}| |         }t          |t                    r[t          t          t          |j                  |z                      }t          |
                    |                    | ||dz   <   {dS )ua   
        Iterates through this path and replaces any Arcs with quadratic Bézier curves.
        r   r  N)r   r  r   r   r  r   r	   r   r   r'  r  r  s         rq   approximate_arcs_with_quadsz Path.approximate_arcs_with_quadsn  s     Eks4yy1}b"-- 	M 	MA1gG'3'' M"4GM(:(:[(H#I#IJJ"&w'='=l'K'K"L"LQQY		M 	Mrt   {Gz?c                     t          t          |           dz
  dd          D ]Q}| |         }t          |t          t          f          r+t          |                    |                    | ||dz   <   RdS )u`   
        Iterates through this path and replaces any Bézier curves with circular arcs.
        r   r  rd  N)r  r   r   r!  rK  r'  r  )r   rA  r   r_  s       rq   %approximate_bezier_with_circular_arcsz*Path.approximate_bezier_with_circular_arcsy  s     s4yy1}b"-- 	N 	NA1gG'O[#ABB N"&w'?'?e'?'L'L"M"MQQY	N 	Nrt   )Fr   )NTNr  )r  )r  ):r   r   r   rT  r   r   rM  r(  r+  r-  r0  rQ  r5  r   r  rW  rG  r(  r%  r  r  r   r  rM  rY  rO  r   rT  rX  r   r   r   r&   r   r   r   r   r   r   r   r   r  r9  r  rr  r  rw  rz  rt  r~  r  r[  r  r6   rE  r  r  r  rm   rt   rq   r7  r7  a  s+        .&3 &3 &3P  % % %  "  	
 	
 	
0 0 0 0., , ,.	. 	. 	.    
" 
" 
"# # #  < < <   ! ! !
$ $ $
# # #<  > 	
 	
 X	
 
 
 X
   X$   X*     &+      &+      ,1     * .3     * -2       &+     , .3 " " " " "H ', , , , , ,\ ',     (   , , , ( ( (& & &  0      6 6 6     4 4 4 \4lL L L L   
	N 	N 	N 	N	M 	M 	M 	MN N N N N Nrt   r7  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zed             Zed             Zed             Zed             Zed             Zed             Zed             ZddZd Zd Zd ZdS )Recta  
    SVG Rect shapes are defined in SVG2 10.2
    https://www.w3.org/TR/SVG2/shapes.html#RectElement

    These have geometric properties x, y, width, height, rx, ry
    Geometric properties can be Length values.

    Rect(x, y, width, height)
    Rect(x, y, width, height, rx, ry)
    Rect(x, y, width, height, rx, ry, matrix)
    Rect(x, y, width, height, rx, ry, matrix, stroke, fill)

    Rect(dict): dictionary values read from svg.

    c                     d | _         d | _        d | _        d | _        d | _        d | _        t          j        | g|R i | |                                  d S r   )	rE   rF   r   r   r@   rA   r0  r   _validate_rectr  s      rq   r   zRect.__init__  sd    
t-d---f---rt   c                     t                               | |           |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |                                  d S r   )	r0  r  rE   rF   r   r   r@   rA   r  r  s     rq   r  zRect.property_by_object  sf      q)))W
h$$rt   c                 0   t                               | |           t          |                    t          d                                                    | _        t          |                    t          d                                                    | _        t          |                    t          d                                                    | _
        t          |                    t          d                                                    | _        t          |                    t          d                                                     | _        t          |                    t          d                                                     | _        d S r   )r0  r  r   r  r  r   rE   r  rF   r  r   r  r   SVG_ATTR_RADIUS_Xr@   SVG_ATTR_RADIUS_YrA   r  s     rq   r  zRect.property_by_values  s     v...

:q112288::

:q112288::FJJ~q99::@@BB
VZZ;;<<BBDD$5t<<==CCEE$5t<<==CCEErt   c                    t          |          }|dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    r | j	        |dd            d S d S )	Nr   r   r   r_  r`  r   r  ru  )
r   r   r   rE   rF   r   r   r@   rA   rz  rx  s      rq   r  zRect.property_by_args  s   YY
??DG__**,,DF??DG__**,,DF??Q..00DJ?? a////11DK??T!Woo++--DG??T!Woo++--DG??Dd122h'''' ?rt   c                 X   | j         }| j        }||dx}}|-|+t          |                              | j                  }|}n|-|+t          |                              | j                  }|}nT|R|Pt          |                              | j                  }t          |                              | j                  }|dk    s|dk    rdx}}nB	 t          || j        dz            }t          || j        dz            }n# t          $ r Y nw xY w|| _         || _        dS )zNone is 'auto' for values.Nr   r7  r  )r@   rA   r   r   r   r   rJ  r   r   r@   rA   s      rq   r  zRect._validate_rect  sD   WW:"*KB>bj!!$*!==BBB^
!!$+!>>BBB^!!$*!==B!!$+!>>B77bAggKBTZ#-..T[3.//   s   0D 
DDc                 ^   | j         dk    r<|                    t          dt                              | j                              | j        dk    r<|                    t          dt                              | j                             | j        dk    r<|                    t          dt                              | j                             | j	        dk    r<|                    t          dt                              | j	                             | j        dk    r<|                    t          dt                              | j                             | j        dk    r>|                    t          dt                              | j                             d S d S )Nr   r  )rE   r  r  r   r   rF   r  r   r  r   r  r@   r  rA   r  r  s     rq   _attrszRect._attrs  sa   6Q;;MMZZZDF1C1C1CDEEE6Q;;MMZZZDF1C1C1CDEEE:??MM^^^VZZ
5K5K5KLMMM;!MM___fjj6M6M6MNOOO7a<<MM%6%6%6

478K8K8KLMMM7a<<MM%6%6%6

478K8K8KLMMMMM <rt   c                     g }|                      |           |                     |           d                    |          }d|z  S Nr  zRect(%s)r  r  r  r  s      rq   r%  zRect.__repr__  sI    F   6""F""rt   c                     g }|                      |           |                     |           d                    |          }d|z  S r  r  r  r  r  s      rq   r(  zRect.__str__  sG    F6""F""rt   c                      t          |           S r   )r  r   s    rq   r   zRect.__copy__      Dzzrt   c                     | j         st          | j        | j                  S t          | j        | j                  }|| j        z  }|S r   r  r0  rE   rF   r;   r   rL  s     rq   implicit_positionzRect.implicit_position  D    z 	)(((dfdf%%rt   c                 8    | j         s| j        S | j        d         S r}   r  rE   r  r   s    rq   
implicit_xzRect.implicit_x  !    z 	6M%a((rt   c                 8    | j         s| j        S | j        d         S r>  r  rF   r  r   s    rq   
implicit_yzRect.implicit_y	  r  rt   c                     | j         s| j        S t          | j        d          }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  r   r0  r;   r)  r   r  r  s      rq   implicit_widthzRect.implicit_width  ^    z 	:$*a  	T^q!$. !!!$$$rt   c                     | j         s| j        S t          d| j                  }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  r   r0  r;   r)  r  s      rq   implicit_heightzRect.implicit_height  ^    z 	;!T[!!	T^q!$. !!!$$$rt   c                     | j         s| j        S t          | j        d          }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  r@   r0  r;   r)  r  s      rq   implicit_rxzRect.implicit_rx#  s]    z 	7N$'1	T^q!$. !!!$$$rt   c                     | j         s| j        S t          d| j                  }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  rA   r0  r;   r)  r  s      rq   implicit_ryzRect.implicit_ry-  s]    z 	7N!TW	T^q!$. !!!$$$rt   Tc                 2    d} j         } j        } j        } j        }                                 rdS  j        } j        } j        s@|dcxk     r|k     r3n n0|dcxk     r|k     r#n n d}t          |          }t          |          }|dcxk     r|k     sn |dcxk     r|k     rn nd}d}||cxk    rdk    r|n nyt          d||f          t          ||f||z   |f          t          ||z   |f||z   ||z   f          t          ||z   ||z   f|||z   f          t          |||z   f||f          f}	n7t          d||z   |f          t          ||z   |f||z   |z
  |f          t          ||z   |z
  |f||z   ||z   f|||          t          ||z   ||z   f||z   ||z   |z
  f          t          ||z   ||z   |z
  f||z   |z
  ||z   f|||          t          ||z   |z
  ||z   f||z   ||z   f          t          ||z   ||z   f|||z   |z
  f|||          t          |||z   |z
  f|||z   f          t          |||z   f||z   |f|||          t          ||z   |f||z   |f          f
}	|r j                                        r|	S  fd|	D             S )aU  
        Rect decomposition is given in SVG 2.0 10.2

        Rect:
        * perform an absolute moveto operation to location (x,y);
        * perform an absolute horizontal lineto with parameter x+width;
        * perform an absolute vertical lineto parameter y+height;
        * perform an absolute horizontal lineto parameter x;
        * ( close the path)

        Rounded Rect:
        rx and ry are used as the equivalent parameters to the elliptical arc command,
        the x-axis-rotation and large-arc-flag are set to zero, the sweep-flag is set to one

        * perform an absolute moveto operation to location (x+rx,y);
        * perform an absolute horizontal lineto with parameter x+width-rx;
        * perform an absolute elliptical arc operation to coordinate (x+width,y+ry)
        * perform an absolute vertical lineto parameter y+height-ry;
        * perform an absolute elliptical arc operation to coordinate (x+width-rx,y+height)
        * perform an absolute horizontal lineto parameter x+rx;
        * perform an absolute elliptical arc operation to coordinate (x,y+height-ry)
        * perform an absolute vertical lineto parameter y+ry
        * perform an absolute elliptical arc operation with a segment-completing close path operation

        :param transformed: provide the reified version.
        :return: path_d of shape.
        Frm   r   TN)r@   rA   r  c                 $    g | ]}|j         z  S rm   r  r  s     rq   r  z!Rect.segments.<locals>.<listcomp>  s     9991A&999rt   )rE   rF   r   r   r.  r@   rA   r2  r   ro  r  rn  r  r;   r1  )
r   r  r  rE   rF   r   r   r@   rA   rE  s
   `         rq   rE  zRect.segments7  s}   8 FF
 	2WW| 	A~~~~~~~~~"q////6/////WWWW>>>>E>>>>R!____f_____BB====q=====TAq6""aVa%i^,,a%i^a%iV%<==a%iV,q!f*o>>q!f*o1v..HH TAFA;''a"fa[1u9r>1"566Y^Q'YB'#   a%iR(1u9a&j2o*FGGYF
R0Y^QZ0#   a%i"na&j1AFAJ3GHHVQZ(F
R(#   aVb)Aq2v;77QBK!b&!GLLLq2vqkAFA;//9H<  	:dn88:: 	:O99999999rt   c                    | j                                         }| j                                         }||z  dk     r| S | j                                         }| j                                         }| j                                         dk    r6| j                                         dk    r|dk    r|dk    r
t                              |            t                              |            | xj
        |z  c_
        | xj        |z  c_        | xj
        |z  c_
        | xj        |z  c_        | xj         t                              | |           z  c_         || j        z  | _        || j        z  | _        || j        z  | _        || j        z  | _        | xj         t                              d|z  d|z            z  c_         | S )a/  
        Realizes the transform to the shape properties.

        If the realized shape can be properly represented as a rectangle with an identity matrix
        it will be, otherwise the properties will approximate the implied values.

        Skewed and Rotated rectangles cannot be reified.
        r   r  )r;   r  r  r  r  r   r"  r  r  r  rE   rF   r[  rY   r@   rA   r   r   rZ   r   r  r  r  r  s        rq   r  z
Rect.reify  s    ...00...00Wq  Kn2244n2244N''))Q..++--2211%%%%%%FFgFFFFgFFFFk!FFFFk!FFNNf..|k\JJJNN'DG'DG 4:-DJ!DK/DKNNfll3=#-HHHNNrt   c                 \   t          j        | fi | |                    d|                    d                    }|                    d|                    d                    }	 |d= n# t          $ r Y nw xY wt	          | j        t                    r | j        j        dd|i|| _        t	          | j        t                    r | j        j        dd|i|| _        t	          | j	        t                    r | j	        j        dd|i|| _	        t	          | j
        t                    r | j
        j        dd|i|| _
        t	          | j        t                    r | j        j        dd|i|| _        t	          | j        t                    r | j        j        dd|i|| _        | S r"  )r0  r  r  r#  r   rE   r   r   rF   r   r   r@   rA   r$  s       rq   r  zRect.render  s   T$$V$$$

7FJJ/@$A$ABBHfjj1B&C&CDD	()) 	 	 	D	dff%% 	C!TV\BB%B6BBDFdff%% 	D!TV\CC&CFCCDFdj&)) 	K))JJ%J6JJDJdk6** 	N+$++MMFMfMMDKdgv&& 	E#dgmDDEDVDDDGdgv&& 	F#dgmEEFEfEEDG   &A* *
A76A7c                 R    | j         dk    p| j        dk    p| j         d u p| j        d u S r}   r   r   r   s    rq   r.  zRect.is_degenerate  s?    J!O #{a#zT!# {d"		
rt   Nr  )r   r   r   rT  r   r  r  r  r  r  r%  r(  r   rY  r  r  r  r  r  r  r  rE  r  r  r.  rm   rt   rq   r  r    s             F F F( ( ("  4N N N# # ## # #     X ) ) X)
 ) ) X)
 % % X% % % X% % % X% % % X%W: W: W: W:r! ! !F  ,
 
 
 
 
rt   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	e
d             Ze
d	             ZeZe
d
             ZddZd Zd Zd Zd Zd ZddZd Zd Zd Zd ZefdZd ZdS )_RoundShapec                 h    d | _         d | _        d | _        d | _        t	          j        | g|R i | d S r   )r>   r?   r@   rA   r0  r   r  s      rq   r   z_RoundShape.__init__  D    t-d---f-----rt   c                     t                               | |           |j        | _        |j        | _        |j        | _        |j        | _        d S r   )r0  r  r>   r?   r@   rA   r  s     rq   r  z_RoundShape.property_by_object  @      q)))$$$$rt   c                    t                               | |           t          |                    t                                                              | _        t          |                    t                                                              | _        t          |                    t                                                              | _
        t          |                    t                                                              | _        t          |                    t          d                                                     }||| _
        || _        n| j
        d| _
        | j        d| _        |                    dd           }|t          |          \  | _        | _        | j        d| _        | j        	d| _        d S d S )Nr   r  r   )r0  r  r   r  SVG_ATTR_CENTER_Xr   r>   SVG_ATTR_CENTER_Yr?   r  r@   r  rA   SVG_ATTR_RADIUSr0  )r   r  rB   r  s       rq   r  z_RoundShape.property_by_values  sd     v...$56677==??$56677==??$56677==??$56677==??6::ot4455;;===DGDGGwwHd++$V}}DGTW7?DG7?DGGG ?rt   c                    t          |          }|dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    rkt          |d                                                   | _        |dk    r-t          |d                                                   | _        n| j        | _        |dk    r | j        |dd            d S d S )Nr   r   r   r_  r`  r   )r   r   r   r>   r?   r@   rA   rz  rx  s      rq   r  z_RoundShape.property_by_args  s    YY
??T!Woo++--DG??T!Woo++--DG??T!Woo++--DGQ a////11'??Dd122h'''' ?rt   c                    | j         <|                    t          dt                              | j                              | j        <|                    t          dt                              | j                             | j        | j        k    s| j        >|                    t          dt                              | j                             d S |                    t          dt                              | j                             |                    t          dt                              | j                             d S Nr  )r>   r  r  r   r   r?   r  r@   rA   r  r  r  r  s     rq   r  z_RoundShape._attrs  s   7MM%6%6%6

478K8K8KLMMM7MM%6%6%6

478K8K8KLMMM7dgMM___fjj6I6I6IJKKKKKMM%6%6%6

478K8K8KLMMMMM%6%6%6

478K8K8KLMMMMMrt   c                     g }|                      |           |                     |           d                    |          }| j        j        d|dS Nr  rg   rh   )r  r  r  rr  r   r  s      rq   r%  z_RoundShape.__repr__  sX    F   6"">222FFF;;rt   c                     g }|                      |           |                     |           d                    |          }| j        j        d|dS r  )r  r  r  rr  r   r  s      rq   r(  z_RoundShape.__str__  sV    F6"">222FFF;;rt   c                     | j         s| j        S t          | j        d          }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  r  s      rq   r  z_RoundShape.implicit_rx!  s]    z 	7NDGQt~q!$. !!#&&&rt   c                     | j         s| j        S t          d| j                  }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  )r   rz  r  s      rq   r  z_RoundShape.implicit_ry+  s]    z 	7NAtwt~q!$. !!#&&&rt   c                 `    t          | j        | j                  }| j        s|S || j        z  }|S r   )r0  r>   r?   r  r;   )r   r  s     rq   implicit_centerz_RoundShape.implicit_center7  s5    tw((z 	M$. rt   Tc                    | j         }|| _         t                      }d}t          |z  }|r:| j                                        | j                                        z  dk     r| }d}|}| j        }| j        }	|                                 rdS | j	        }
|
                    |                     d                     t          |          D ]M}|t          |                     |          |                     |          |
||	| j        |          z  }|}||z  }N|                                 || _         |                    |          S )ag  
        SVG path decomposition is given in SVG 2.0 10.3, 10.4.

        A move-to command to the point cx+rx,cy;
        arc to cx,cy+ry;
        arc to cx-rx,cy;
        arc to cx,cy-ry;
        arc with a segment-completing close path operation.

        Converts the parameters from an ellipse or a circle to a string for a
        Path object d-attributer`  r   rm   r@   rA   r   r   )r  r7  r   r;   r  r  r  r  r.  r  r   r  r  r  r   r   rE  )r   r  originalr!   steps	step_sizet_startt_endr@   rA   r  r  s               rq   rE  z_RoundShape.segments?  sV    : 
vv%K		#,,..1M1M1O1OORSSS"
I 	2%		4??1%%'''u 	 	AC((&&   D GYEE
}}[)))rt   c                 J   | j                                         }| j                                         }||z  dk     r| S | j                                         }| j                                         }| j                                         dk    r| j                                         dk    r|dk    r|dk    rt                              |            t                              |            | xj
        |z  c_
        | xj        |z  c_        | xj
        |z  c_
        | xj        |z  c_        | xj         t                              | |           z  c_         || j        z  | _        || j        z  | _        | xj         t                              d|z  d|z            z  c_         | S )z|
        Realizes the transform to the shape properties.

        Skewed and Rotated roundshapes cannot be reified.
        r   r  )r;   r  r  r  r  r   r"  r  r  r  r>   r?   r[  rY   r@   rA   rZ   r  s        rq   r  z_RoundShape.reifyn  s|    ...00...00Wq  Kn2244n2244N''))Q..++--2211%%%%%%GGwGGGGwGGGG{"GGGG{"GGNNf..|k\JJJNN'DG'DGNNfll3=#-HHHNNrt   c                    t          j        | fi | |                    d|                    d                    }|                    d|                    d                    }	 |d= n# t          $ r Y nw xY wt	          | j        t                    r | j        j        dd|i|| _        t	          | j        t                    r | j        j        dd|i|| _        t	          | j	        t                    r | j	        j        dd|i|| _	        t	          | j
        t                    r | j
        j        dd|i|| _
        | S r"  )r0  r  r  r#  r   r>   r   r   r?   r@   rA   r$  s       rq   r  z_RoundShape.render  d   T$$V$$$

7FJJ/@$A$ABBHfjj1B&C&CDD	()) 	 	 	D	dgv&& 	E#dgmDDEDVDDDGdgv&& 	F#dgmEEFEfEEDGdgv&& 	E#dgmDDEDVDDDGdgv&& 	F#dgmEEFEfEEDGr  c                 6    | j         }| j        }|dk    p|dk    S r}   )r  r  r  s      rq   r.  z_RoundShape.is_degenerate  s%    Qw!"'!rt   c                     t                      }|                    | j        | j                   |                    | j                   | j        }|                    |j        |j	                   |S )a  
        return the unit matrix which would transform the unit circle into this ellipse.

        One of the valid parameterizations for ellipses is that they are all affine transforms of the unit circle.
        This provides exactly such a matrix.

        :return: matrix
        )
r[  r9  r  r  rO  r   r  r8  rE   rF   )r   r   r  s      rq   unit_matrixz_RoundShape.unit_matrix  sb     HH	T%t'7888	dm$$$%	68,,,rt   c           
          t          |                     |          |                     |          | j        | j        | j        | j        ||z
            S )z
        return the arc found between the given values of t on the ellipse.

        :param t0: t start
        :param t1: t end
        :return: arc
        r  )r  r  r  r  r  r   )r   t0r  s      rq   arc_tz_RoundShape.arc_t  sW     OOBOOB ]r'
 
 
 	
rt   Nc           	          |||k    }t          |                     |          |                     |          | j        | j        | j        | j        |          S )a  
        return the arc found between the given angles on the ellipse.

        :param a0: start angle
        :param a1: end angle
        :param ccw: optional flag to force clockwise or counter-clockwise arc-angles, default is smaller angle
        :return: arc
        N)r@   rA   r   r~  )r  r  r  r  r  r   )r   a0r  r~  s       rq   	arc_anglez_RoundShape.arc_angle  se     ;r'C#### ]
 
 
 	
rt   c                 T   | j         }| j        }||k    r|                     |          S || j        z  }t	          |t          |          z  |          }t          dz  }d|z  }|t          |          t          z  cxk    r|k    rn n|t          dz  z  }|                     |          S r  )r  r  r  r   r   r   r   r   r  s          rq   r  z_RoundShape.point_at_angle  s     66??5)))!c%jj.!$$)g+c%jj3&000000000sNAq!!!rt   c                     | j         r3| j                                        s| j                            |          S t          | j        | j                  }|                    |          S r  )r  r;   r1  r  r  r0  r>   r?   )r   r  r  s      rq   r  z_RoundShape.angle_at_point  s_     : 	&dn88:: 	&'0033347DG,,F??1%%%rt   c                 "   |                      |          }|| j        z  }| j        }| j        }t	          |t          |          z  |          }t          dz  }d|z  }|t          |          t          z  cxk    r|k    rn n|t          dz  z  }|S r  )r  r   r  r  r   r   r   r   r	  s           rq   r  z_RoundShape.t_at_point  s     ##A&&!c%jj.!$$)g+c%jj3&000000000sNArt   c                 >   | j         }| j        }| j        }| j        }|j        }|j        }t          |          }t          |          }	t          |          }
t          |          }|||
z  |z  z   ||z  |	z  z
  }|||
z  |	z  z   ||z  |z  z   }t          ||          S r  )	r   r  r  r  rE   rF   r
   r   r0  )r   r   r   r   rg  r  r>   r?   r  r  r  r  r   r  s                 rq   r  z_RoundShape.point_at_t  s     =%XXMM	MM	AA!e)i''!e)i*??!e)i''!e)i*??R}}rt   c                 <    |                      t          |z            S )ab  
        find the point that corresponds to given value [0,1].
        Where t=0 is the first point and t=1 is the final point.

        :param position: position value between 0,1 where value equals the amount through the shape
        :param error: error permitted in determining point value (unused for this shape)
        :return: point at t
        )r  r   )r   r   rA  s      rq   rL  z_RoundShape.point%  s     sX~...rt   c           	          | j         }| j        }||k    r||}}||z
  ||z
  z  ||z   ||z   z  z  }t          dz  ||z   z  dd|z  dt          dd|z  z
            z   z  z   z  S )Nr   r   r_  
   r`  )r  r  r   r   )r   r   rg  r   s       rq   _ramanujan_lengthz_RoundShape._ramanujan_length0  s    q55aqA!eAAEa!e#45Qw!a% AQ"tAAI2F)G$HIIrt   r  r   )r   r   r   r   r  r  r  r  r%  r(  rY  r  r  
implicit_rr  rE  r  r  r.  r  r  r  r  r  r  r  r+  rL  r  rm   rt   rq   r  r    s       . . .    0( ( (	N 	N 	N< < << < < ' ' X' ' ' X' J  X-* -* -* -*^  <  $" " "
   
 
 
$
 
 
 
*" " "(& & &  $  0 %* 	/ 	/ 	/ 	/J J J J Jrt   r  c                   $    e Zd ZdZd Zd Zd ZdS )r  z
    SVG Ellipse shapes are defined in SVG2 10.4
    https://www.w3.org/TR/SVG2/shapes.html#EllipseElement

    These have geometric properties cx, cy, rx, ry
    c                 0    t          j        | g|R i | d S r   r  r   r  s      rq   r   zEllipse.__init__A  )    T3D333F33333rt   c                      t          |           S r   )r  r   s    rq   r   zEllipse.__copy__D      t}}rt   c                     | j         j        S r   r  r   s    rq   r  zEllipse._nameG  r  rt   Nr   r   r   rT  r   r   r  rm   rt   rq   r  r  9  sK         4 4 4  ' ' ' ' 'rt   r  c                   $    e Zd ZdZd Zd Zd ZdS )Circlez
    SVG Circle shapes are defined in SVG2 10.3
    https://www.w3.org/TR/SVG2/shapes.html#CircleElement

    These have geometric properties cx, cy, r
    c                 0    t          j        | g|R i | d S r   r  r  s      rq   r   zCircle.__init__S  r  rt   c                      t          |           S r   )r  r   s    rq   r   zCircle.__copy__V  s    d||rt   c                     | j         j        S r   r  r   s    rq   r  zCircle._nameY  r  rt   Nr  rm   rt   rq   r  r  K  sK         4 4 4  ' ' ' ' 'rt   r  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zed
             Zed             Zed             Zed             ZddZd Zd ZdS )
SimpleLinez
    SVG Line shapes are defined in SVG2 10.5
    https://www.w3.org/TR/SVG2/shapes.html#LineElement

    These have geometric properties x1, y1, x2, y2

    These are called Line in SVG but that name is already used for Line(PathSegment)
    c                 h    d | _         d | _        d | _        d | _        t	          j        | g|R i | d S r   )rI   rJ   rK   rL   r0  r   r  s      rq   r   zSimpleLine.__init__g  r  rt   c                     t                               | |           |j        | _        |j        | _        |j        | _        |j        | _        d S r   )r0  r  rI   rJ   rK   rL   r  s     rq   r  zSimpleLine.property_by_objectn  r  rt   c                 4   t                               | |           t          |                    t          d                                                    | _        t          |                    t          d                                                    | _        t          |                    t          d                                                    | _
        t          |                    t          d                                                    | _        d S r}   )r0  r  r   r  SVG_ATTR_X1r   rI   SVG_ATTR_Y1rJ   SVG_ATTR_X2rK   SVG_ATTR_Y2rL   r  s     rq   r  zSimpleLine.property_by_valuesu  s      v...K3344::<<K3344::<<K3344::<<K3344::<<rt   c                    t          |          }|dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _        |dk    r,t          |d                                                   | _         | j        |dd            d S )Nr   r   r   r_  r`  )r   r   r   rI   rJ   rK   rL   rz  rx  s      rq   r  zSimpleLine.property_by_args|  s    YY
??T!Woo++--DG??T!Woo++--DG??T!Woo++--DG??T!Woo++--DG$qrr(####rt   c                    | j         1|                    t          dt          | j                              | j        1|                    t
          dt          | j                             | j        1|                    t          dt          | j                             | j        3|                    t          dt          | j                             d S d S r  )
rI   r  r  r   rJ   r  rK   r  rL   r  r  s     rq   r  zSimpleLine._attrs  s    7MM[[[#dg,,,?@@@7MM[[[#dg,,,?@@@7MM[[[#dg,,,?@@@7MM[[[#dg,,,?@@@@@ rt   c                     g }|                      |           |                     |           d                    |          }d|z  S Nr  zSimpleLine(%s)r  r  s      rq   r%  zSimpleLine.__repr__  sI    F   6""&((rt   c                     g }|                      |           |                     |           d                    |          }d|z  S r  r  r  s      rq   r(  zSimpleLine.__str__  sG    F6""&((rt   c                      t          |           S r   )r
  r   s    rq   r   zSimpleLine.__copy__  s    $rt   c                 X    t          | j        | j                  }|| j        z  }|j        S r   )r0  rI   rJ   r;   rE   r  s     rq   implicit_x1zSimpleLine.implicit_x1  (    dgtw''wrt   c                 X    t          | j        | j                  }|| j        z  }|j        S r   )r0  rI   rJ   r;   rF   r  s     rq   implicit_y1zSimpleLine.implicit_y1  r  rt   c                 X    t          | j        | j                  }|| j        z  }|j        S r   )r0  rK   rL   r;   rE   r  s     rq   implicit_x2zSimpleLine.implicit_x2  r  rt   c                 X    t          | j        | j                  }|| j        z  }|j        S r   )r0  rK   rL   r;   rF   r  s     rq   implicit_y2zSimpleLine.implicit_y2  r  rt   Tc                     t          | j        | j                  }t          | j        | j                  }|r|| j        z  }|| j        z  }t          d|          t          ||          fS )z
        SVG path decomposition is given in SVG 2.0 10.5.

        perform an absolute moveto operation to absolute location (x1,y1)
        perform an absolute lineto operation to absolute location (x2,y2)

        :returns Path_d path for line.
        N)r0  rI   rJ   rK   rL   r;   ro  r  )r   r  r   r   s       rq   rE  zSimpleLine.segments  si     dgtw''DGTW%% 	"T^#E4>!CD%  $uc"2"222rt   c                    t                               |            t                              |            | j        }t	          | j        | j                  }||z  }|j        | _        |j        | _        t	          | j	        | j
                  }||z  }|j        | _	        |j        | _
        |                                 | S )zm
        Realizes the transform to the shape properties.

        SimpleLines are perfectly reified.
        )r  r  r  r;   r0  rI   rJ   rE   rF   rK   rL   r$  r   rX   r  s      rq   r  zSimpleLine.reify  s     	D!!!D!!!$'47##	V##$'47##	V##rt   c                    t          j        | fi | |                    d|                    d                    }|                    d|                    d                    }	 |d= n# t          $ r Y nw xY wt	          | j        t                    r | j        j        dd|i|| _        t	          | j        t                    r | j        j        dd|i|| _        t	          | j	        t                    r | j	        j        dd|i|| _	        t	          | j
        t                    r | j
        j        dd|i|| _
        | S r"  )r0  r  r  r#  r   rI   r   r   rJ   rK   rL   r$  s       rq   r  zSimpleLine.render  r  r  Nr  )r   r   r   rT  r   r  r  r  r  r%  r(  r   rY  r  r  r  r   rE  r  r  rm   rt   rq   r
  r
  ]  s7        . . .  = = =
$ 
$ 
$A A A) ) )) ) )        X
   X
   X
   X
3 3 3 3"  ,    rt   r
  c                   \    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZddZd Zd ZdS )
_PolyshapezHBase form of Polygon and Polyline since the objects are nearly the same.c                 V    t                      | _        t          j        | g|R i | d S r   )r'  rC   r0  r   r  s      rq   r   z_Polyshape.__init__  s3    fft-d---f-----rt   c                 p    t                               | |           |                     |j                   d S r   )r0  r  _init_pointsrC   r  s     rq   r  z_Polyshape.property_by_object  s4      q)))!(#####rt   c                 f    t                               | |           |                     |           d S r   )r0  r  r)  r  s     rq   r  z_Polyshape.property_by_values   s2      v...&!!!!!rt   c                 0    |                      |           d S r   )r)  r  s     rq   r  z_Polyshape.property_by_args  s    $rt   c           
      B   t          | j                  dk    rd S |t                      | _        d S t          |t                    r,t
          |v r|t
                   }nt                      | _        d S 	 t          |          dk    r0t          |d         t          t          t          f          r|d         }n# t          $ r Y nw xY wt          |t                    r-t          
                    |          }d |D             | _        d S t          |t          t          f          rt          |          dk    rt                      | _        d S |d         }t          |t          t          f          rAt          t          t          t          t!          |          gdz                       | _        d S t          |t          t          t"          t          t          f          r)t          t          t          |                    | _        d S d S t                      | _        d S )Nr   r   c                 h    g | ]/\  }}t          t          |          t          |                    0S rm   )r0  r   )ro   r  r  s      rq   r  z+_Polyshape._init_points.<locals>.<listcomp>  s2    IIIA5q58844IIIrt   r   )r   rC   r'  r   r  SVG_ATTR_POINTSr&  r   rS  r2  r   r   r   r  r0  rq  iterr]  )r   rC   r   rO  s       rq   r)  z_Polyshape._init_points  s   t{q  F>&&DKFfd## 	&((0"ff	6{{aJvay4:L$M$M 	 	 	D	fc"" 	!&..v66GIIIIIDKKKu.. 
	!6{{a"ff$QikE3<88 ;"&s5#V~7I2J'K'K"L"LDKKKdE7C-OPP ;"&s5&'9'9":":DKKK; ; &&DKKKs   4AB8 8
CCc                 &   g }| j         Md                    t          t          | j                             }|                    t
          d|d           |                     |           d                    |          }| j        j        d|dS Nr  r  rQ  r  rg   rh   )	rC   r  r  r   r  r.  r  rr  r   r   r  r   r  s       rq   r%  z_Polyshape.__repr__'  s    ;"S$+..//AMM:;;;   6"">222FFF;;rt   c                 &   g }| j         Md                    t          t          | j                             }|                    t
          d|d           |                     |           d                    |          }| j        j        d|dS r1  )	rC   r  r  r   r  r.  r  rr  r   r2  s       rq   r(  z_Polyshape.__str__0  s    ;"S$+..//AMM:;;;6"">222FFF;;rt   c                 *    t          | j                  S r   r   rC   r   s    rq   rG  z_Polyshape.__len__9  s    4;rt   c                     | j         |         S r   )rC   rK  s     rq   rM  z_Polyshape.__getitem__<  s    {4  rt   Tc                 $   | j                                         s|s| j        }n,t          t	          | j         j        | j                            }|                                 rg S t          d|d                   g}|d         }t          dt          |                    D ]/}||         }|
                    t          ||                     |}0t          | t                    r)|
                    t          ||d                              |S )a  
        Polyline and Polygon decomposition is given in SVG2. 10.6 and 10.7

        * perform an absolute moveto operation to the first coordinate pair in the list of points
        * for each subsequent coordinate pair, perform an absolute lineto operation to that coordinate pair.
        * (Polygon-only) perform a closepath command

        Note:  For a polygon/polyline made from n points, the resulting path will
        be composed of n lines (even if some of these lines have length zero).
        Nr   r   )r;   r1  rC   r'  r  r\  r.  ro  r  r   r  r  r   Polygonrn  )r   r  rC   rE  lastr  r|  s          rq   rE  z_Polyshape.segments?  s    >%%'' 	R{ 	R[FF#dnBDKPPQQF 	Ivay))*ayq#f++&& 	 	AQiGOODw//000DDdG$$ 	4OOE$q	22333rt   c                     t                               |            t                              |            | j        }| D ]}||z  }|                                 | S )zl
        Realizes the transform to the shape properties.

        Polyshapes are perfectly reified.
        )r  r  r  r;   r$  r#  s      rq   r  z_Polyshape.reifyZ  s_     	D!!!D!!! 	 	AKAArt   c                 2    t          | j                  dk    S r}   r5  r   s    rq   r.  z_Polyshape.is_degenerateh  s    4;1$$rt   Nr  )r   r   r   rT  r   r  r  r  r)  r%  r(  rG  rM  rE  r  r.  rm   rt   rq   r&  r&    s        RR. . .$ $ $" " "     ! ! !@< < << < <     ! ! !   6  % % % % %rt   r&  c                   $    e Zd ZdZd Zd Zd ZdS )Polylinez
    SVG Polyline shapes are defined in SVG2 10.6
    https://www.w3.org/TR/SVG2/shapes.html#PolylineElement

    These have geometric properties points
    c                 0    t          j        | g|R i | d S r   r&  r   r  s      rq   r   zPolyline.__init__t  )    D24222622222rt   c                      t          |           S r   )r=  r   s    rq   r   zPolyline.__copy__w  r  rt   c                     | j         j        S r   r  r   s    rq   r  zPolyline._namez  r  rt   Nr  rm   rt   rq   r=  r=  l  sK         3 3 3  ' ' ' ' 'rt   r=  c                   $    e Zd ZdZd Zd Zd ZdS )r8  z
    SVG Polygon shapes are defined in SVG2 10.7
    https://www.w3.org/TR/SVG2/shapes.html#PolygonElement

    These have geometric properties points
    c                 0    t          j        | g|R i | d S r   r?  r  s      rq   r   zPolygon.__init__  r@  rt   c                      t          |           S r   )r8  r   s    rq   r   zPolygon.__copy__  r  rt   c                     | j         j        S r   r  r   s    rq   r  zPolygon._name  r  rt   Nr  rm   rt   rq   r8  r8  ~  sK         3 3 3  ' ' ' ' 'rt   r8  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZeZd Zd Zd Zd Zd Zd ZddZd Zd ZddZddZd Zd ZdS )r  a?  
    Subpath is a Path-backed window implementation. It does not store a list of segments but rather
    stores a Path, start position, end position. When a function is called on a subpath, the result of
    those events is performed on the backing Path. When the backing Path is modified the behavior is
    undefined.c                 0    || _         || _        || _        d S r   )r  _start_end)r   r!   r   r   s       rq   r   zSubpath.__init__  s    
			rt   c                 \    t          t          | j                  | j        | j                  S r   )r  r7  r  rI  rJ  r   s    rq   r   zSubpath.__copy__  s"    tDJ''di@@@rt   c                 B    | j         |                     |                   S r   r  index_to_path_indexr$  s     rq   rM  zSubpath.__getitem__  s    z$22599::rt   c                 @    || j         |                     |          <   d S r   rM  rn  s      rq   rQ  zSubpath.__setitem__  s"    6;
4++E22333rt   c                 \    | j         |                     |          = | xj        dz  c_        d S r>  )r  rN  rJ  r$  s     rq   r5  zSubpath.__delitem__  s-    Jt//667		Q				rt   c                 l   t          |t                    r&t          |          }|| j        | j        | j        <   nxt          |t                    r&t          |          }|| j        | j        | j        <   n=t          |t                    r!| j                            | j        |           nt          S | S r   )	r   r   r7  r  rJ  r   r  r9  rC  )r   r   r  s      rq   r   zSubpath.__iadd__  s    eS!! 		"UA01DJty49,--t$$ 	"UA01DJty49,--{++ 	"Jdi////!!rt   c                     t          |t          t          t          f          rt	          |           }||z  }|S t
          S r   )r   r   r7  r  r   rC  r  s      rq   r  zSubpath.__add__  s:    ec4566 	T

AJAHrt   c                 .   t          |t                    r>t          |          }|                    t	          t
          | j                             |S t          |t                    r't          |           }|                    d|           |S t          S r}   )
r   r   r7  r  r  r   r  r  r9  rC  r  s      rq   rW  zSubpath.__radd__  s~    eS!! 		";;DKKD$*--...K{++ 	"::DKK5!!!K!!rt   c                     t          |t                    rt          |          }t          |t                    r
| D ]}||z  }| S r   )r   r   r[  r   r   r  s      rq   r   zSubpath.__imul__  sP    eS!! 	"5MMEeV$$ 	  U
rt   c                 t    t          |t          t          f          rt          |           }||z  }|S t          S r   r  r  s      rq   r  zSubpath.__mul__  r  rt   c                 2     G d d          } ||           S )Nc                       e Zd Zd Zd ZeZdS )"Subpath.__iter__.<locals>.Iteratorc                 2    |j         dz
  | _        || _        d S r>  )rI  r  rw  )r   rw  s     rq   r   z+Subpath.__iter__.<locals>.Iterator.__init__  s     !+&rt   c                     | xj         dz  c_         	 | j         | j        j        k    rt          | j        j        | j                  S # t
          $ r t          w xY wr>  )r  rw  rJ  r  r  r4  r   s    rq   r  z+Subpath.__iter__.<locals>.Iterator.__next__  sa    !(v 111++<-df55! ( ( (''(s   2A AN)r   r   r   r   r  r  rm   rt   rq   IteratorrY    s3        ' ' '( ( ( DDDrt   r\  rm   )r   r\  s     rq   r  zSubpath.__iter__  s:    	 	 	 	 	 	 	 	  x~~rt   c                 &    | j         | j        z
  dz   S r>  rJ  rI  r   s    rq   rG  zSubpath.__len__  s    y4;&**rt   c                 *    |                                  S r   r<  r   s    rq   r(  zSubpath.__str__  r=  rt   c                 F    dd                     d | D                       z  S )NzPath(%s)r  c              3   4   K   | ]}t          |          V  d S r   r@  rA  s     rq   rr   z#Subpath.__repr__.<locals>.<genexpr>  s(      &=&=1tAww&=&=&=&=&=&=rt   r  r   s    rq   r%  zSubpath.__repr__  s(    TYY&=&=&=&=&===>>rt   c                 <   t          |t                    r"|                     t          |                    S t          |t          t          f          st
          S t          |           t          |          k    rdS t          | |          D ]\  }}||k    s dS dS rC  )r   r   r  r7  r  rC  r   rq  r-  s       rq   r  zSubpath.__eq__  s    eS!! 	,;;tE{{+++%$11 	"!!t99E

""5e$$ 	 	DAq66uu trt   c                 b    t          |t          t          t          f          st          S | |k     S r   )r   r7  r  r   rC  r   s     rq   r  zSubpath.__ne__  s.    %$!566 	"!!5=  rt   Tc                     | j         |r(fdj        | j        | j        dz            D             S j        | j        | j        dz            S )Nc                 $    g | ]}|j         z  S rm   r  )ro   r   r!   s     rq   r  z$Subpath.segments.<locals>.<listcomp>
  s-       '(DN"  rt   r   )r  r  rI  rJ  )r   r  r!   s     @rq   rE  zSubpath.segments  sn    z 	   ,0N4;UV;V,W    ~dkDIM9::rt   c                 <    |dk     r| j         |z   dz   S | j        |z   S r   r^  r$  s     rq   _numeric_indexzSubpath._numeric_index  s*    1999u$q((;&&rt   c                     t          |t                    re|j        }|j        }|j        }|d}|                     |          }|t          |           }|                     |          }t          |||          S |                     |          S r}   )r   r  r   stopsteprh  r   )r   r  r   rj  rk  s        rq   rN  zSubpath.index_to_path_index  s    eU## 
	,KE:D:D}''..E|4yy&&t,,Dd+++""5)))rt   Fc                 $   |r$t          |                               ||          S | j        j        | j        | j        dz            }d |D             }	 t          t          |           \  }}}}n# t          $ r Y dS w xY w|rF| j        j	        :| j        j
        .| j        j
        j        t          | j        j	                  dz  }	nd}	t          |          |	z
  t          |          |	z
  t          |          |	z   t          |          |	z   fS )z&returns a bounding box for the subpathr  r  r   c                 j    g | ]0}t          t          t                    |                                1S rm   rm  rp  s     rq   r  z Subpath.bbox.<locals>.<listcomp>)  s/    MMMcZt5L5LMsxxzzMMMrt   Nr  r   )r7  r  r  r  rI  rJ  r'  rq  r   r  r:   r   r   rJ  rK  )
r   r  r  rE  rr  rs  rt  ru  rv  r  s
             rq   r  zSubpath.bbox#  s&    	U::??{?TTT:'di!m(CDMMXMMM	)-c3i&E5% 	 	 	44	 	
'3Z&.$*2C2I2Q$*122S8EEE JJJJJJJJ	
 	
s   A1 1
A?>A?Nc                 ~    | j         j        | j        | j        dz            }t                              |||          S )Nr   r'  )r  r  rI  rJ  r7  r  )r   r   r  rE  s       rq   r6   z	Subpath.d?  s6    :'di!m(CDzz(XfzEEErt   c                    | j         j        }|                     |          }|                     |          }||k    rV||         }||         }|                                 ||ur|                                 |||<   |||<   |dz  }|dz  }||k    V|                     |          }|                     |          }| j                             |dz
  d           | j                             |           dS )zAReverses segments between the given indexes in the subpath space.r   T)r/  N)r  r  rN  r  r0  )r   r   r   rE  r   r  start_segmentend_segments           rq   _reverse_segmentszSubpath._reverse_segmentsC  s   :'$$U++$$S))1ff$QKM"1+K!!###K//##%%%)+FAFA 1ff ((//&&s++
''	'FFF
'',,,,,rt   c                    t          |           }|dk    rd S d}|dz
  }t          | d         t                    r|dz  }t          | d         t                    r|dz  }|                     ||           |dk    r@t          | d         t                    r%t          | d         j                  | d         _        | d         }t          |t                    r~|                                 |j        | d         j        k    rt          | d         j                  |_        |j        | d         j        k    rt          | d         j                  |_        | S )Nr   r   r  )	r   r   rn  ro  rs  r0  r   r   r  )r   r  r   r   r9  s        rq   r  zSubpath.reverseW  s9   4yy199FQhd2h&& 	1HCGT
 
 	 QJEuc***!88$q'4(( 3#DGM22QBxdE"" 	.LLNNNzT"X\))"48<00
x47;&& a--rt   r  r  r   )r   r   r   rT  r   r   rM  rQ  r5  r   r  rW  r   r  rX  r  rG  r(  r%  r  r  rE  rh  rN  r  r6   rs  r  rm   rt   rq   r  r    s          
A A A; ; ;< < <      
" 
" 
"     H  &+ + +  ? ? ?
 
 
! ! !
; ; ; ;' ' '* * *
 
 
 
8F F F F- - -(    rt   r  c                   d    e Zd ZdZd Zd Zd Zd Zd Zd Z	dd	Z
d
 Zedd            ZddZdS )Groupzu
    Group Container element can have children.
    SVG 2.0 <g> are defined in:
    5.2. Grouping: the g element
    c                 X   t          j        | g|R i | t                              |            t          |          dk    rR|d         }t	          |t
                    r5|                     t          t          t          |                               t          j        | g|R i | d S r`  )
r  r   r'  r   r   rw  r  r  r   r  r  s       rq   r   zGroup.__init__x  s    t5d555f555dt99>>QA!U## 0DT1..///D24222622222rt   c                     t          |t                    rt          |          }t          |t                    r| xj        |z  c_        | D ]}||z  }| S r   r  rU  s      rq   r   zGroup.__imul__  s`    eS!! 	"5MMEeV$$ 	NNe#NN  U
rt   c                 *    t          j        | fi | d S r   )r  r  r  s     rq   r  zGroup.render  s!    T,,V,,,,,rt   c                      t          |           S r   )rw  r   s    rq   r   zGroup.__copy__  r  rt   c                 r    t                               | |           t                              | |           d S r   )r  r  r  r  s     rq   r  zGroup.property_by_object  s4    ((q111%%dA.....rt   c                 r    t                               | |           t                              | |           d S r   )r  r  r  r  s     rq   r  zGroup.property_by_values  s4    ((v666%%dF33333rt   Nc              #   ,  K   |C| D ]>}|V  t          |t          t          f          r|                    |          D ]}|V  ?dS | D ]I} ||          r|V  t          |t          t          f          r|                    |          D ]}|V  JdS z
        Finds all flattened subobjects of this group for which the conditional returns
        true.

        :param conditional: function taking element and returns True to include or False if exclude
        Nr   rw  Useselectr   conditionalsubitemr   s       rq   r  zGroup.select             gs|44  $^^K88    	         ;w'' "!MMMgs|44  $^^K88       rt   c                 :    t                               |            d S r   )r  r  r   s    rq   r  zGroup.reify  s    D!!!!!rt   TFc                    g }| D ]^}t          |d          rt          |t          t          f          r/|                    ||          }|I|                    |           _t          |          dk    rdS t          | \  }}}}	t          |          t          |          t          |          t          |	          fS ad  
        Returns the union of the bounding boxes for the elements within the iterator.

        :param transformed: Should the children of this object be properly transformed.
        :param with_stroke: should the stroke-width be included in the bounds of the elements
        :return: union of all bounding boxes of elements within the iterable.
        r  rm  Nr   
r)  r   rw  r  r  r  r   rq  rJ  rK  
elementsr  r  boxesr  boxrs  rt  ru  rv  s
             rq   
union_bboxzGroup.union_bbox        	 	A1f%% As|)D)D &&[k&JJC{LLu::??4'*E{$ue5zz3u::s5zz3u::==rt   c                 `    t                               |                                 ||          S a  
        Returns the bounding box of the given object.

        In the case of groups this is the union of all the bounding boxes of all bound children.

        Setting transformed to false, may yield unexpected results if subitems are transformed in non-uniform
        ways.

        :param transformed: bounding box of the properly transformed children.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        rm  )rw  r  r  r  s      rq   r  z
Group.bbox  s2     KKMM##   
 
 	
rt   r   r  )r   r   r   rT  r   r   r  r   r  r  r  r  r[  r  r  rm   rt   rq   rw  rw  q  s         3 3 3  - - -  / / /4 4 4       *" " " > > > \>*
 
 
 
 
 
rt   rw  c                   R    e Zd ZdZd Zd Zd Zd ZddZe	dd
            Z
ddZdS )r  z
    Use elements are defined in svg 5.6
    https://www.w3.org/TR/SVG11/struct.html#UseElement

    Use is a generic container object group-like that use reference objects,
    c                     t                               |            d | _        d | _        d | _        d | _        t          j        | g|R i | t          j        | g|R i | d S r   )r'  r   rE   rF   r   r   r  r  r  s      rq   r   zUse.__init__  s    d
t5d555f555	
	
 	
 	
!	
 	
 	
 	
 	
rt   c                     t                               | |           t                              | |           |j        | _        |j        | _        |j        | _        |j        | _        d S r   )r  r  r  rE   rF   r   r   r  s     rq   r  zUse.property_by_object  sV    %%dA...((q111W
hrt   c                 @   t          |                    t          d                                                    | _        t          |                    t
          d                                                    | _        t          |                    t          d                                                    | _        t          |                    t          d                                                    | _
        | j        dk    s| j        dk    rU	 |t                   d| j        d| j        d|t          <   n+# t          $ r d| j        d| j        d|t          <   Y nw xY wt                              | |           t                              | |           d S )Nr   r   z translate(r  rh   r  )r   r  r  r   rE   r  rF   r  r   r  r   r   r#  r  r  r  r  s     rq   r  zUse.property_by_values  sl   

:q112288::

:q112288::FJJ~q99::@@BB
VZZ;;<<BBDD6Q;;$&A++
-...FFFFFF.)**
     FFFFFF.)***
 	%%dF333((v66666s   (D= =%E%$E%c                 N    t          j        | fi | t          j        | fi | d S r   )r  r  r  r  s     rq   r  z
Use.render
  s:    $))&)))T,,V,,,,,rt   Nc              #   ,  K   |C| D ]>}|V  t          |t          t          f          r|                    |          D ]}|V  ?dS | D ]I} ||          r|V  t          |t          t          f          r|                    |          D ]}|V  JdS r  r  r  s       rq   r  z
Use.select  r  rt   TFc                    g }| D ]^}t          |d          rt          |t          t          f          r/|                    ||          }|I|                    |           _t          |          dk    rdS t          | \  }}}}	t          |          t          |          t          |          t          |	          fS r  r  r  s
             rq   r  zUse.union_bbox#  r  rt   c                 `    t                               |                                 ||          S r  )r  r  r  r  s      rq   r  zUse.bbox9  s0     ~~KKMM##  
 
 	
rt   r   r  )r   r   r   rT  r   r  r  r  r  r[  r  r  rm   rt   rq   r  r    s         	
 	
 	
  7 7 7*- - -       * > > > \>*
 
 
 
 
 
rt   r  c                   $    e Zd ZdZd Zd Zd ZdS )ClipPatha,  
    clipPath elements are defined in svg 14.3.5
    https://www.w3.org/TR/SVG11/masking.html#ClipPathElement

    Clip paths conceptually define a 1 bit mask for images these are usually defined within
    def blocks and do not render themselves but rather are attached by IRI references to the
    c                 |    t                               |            t          | _        t	          j        | g|R i | d S r   )r'  r   SVG_UNIT_TYPE_USERSPACEONUSE	unit_typer  r  s      rq   r   zClipPath.__init__V  sB    d5D24222622222rt   c                 T    t                               | |           |j        | _        d S r   )r  r  r  r  s     rq   r  zClipPath.property_by_object[  s%    %%dA...rt   c                     t                               | |           | j                            t          t
                    | _        d S r   )r  r  r  r  SVG_ATTR_CLIP_UNIT_TYPEr  r  r  s     rq   r  zClipPath.property_by_values_  s9    %%dF333#%A
 
rt   N)r   r   r   rT  r   r  r  rm   rt   rq   r  r  M  sK         3 3 3
% % %
 
 
 
 
rt   r  c                   B    e Zd Zd Zd Zed             Zd Zd Zd Z	dS )Patternc                     d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        t          j        | g|R i | d S r   )r:  r  rE   rF   r   r   r   pattern_content_unitspattern_transformpattern_unitsr  r   r  s      rq   r   zPattern.__init__g  ss    %)"
	%)"!%!D24222622222rt   c                     dS r}   rm   r   s    rq   rs  zPattern.__int__t  rH  rt   c                 H    | j         dS | j                             |           S Nr   r:  r;   r   s    rq   r    zPattern.viewbox_transformw  %    <2|%%d+++rt   c                 X   t                               | |           |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j	        | _
        |j        t          |j                  nd | _        |j        | _        d S r   )r  r  r:  r  rE   rF   r   r   r   pattern_contents_unitsr  r  r[  r  r  s     rq   r  zPattern.property_by_object}  s    %%dA...y%&%<"W
hF	%&%="+,+>+JF1&'''PT 	 _rt   c                    t                               | |           t          |v r|t                   | _        nt          |v r|t                   | _        |                    t                    }|t          |          | _        t          |v r|t                   | _
        t          |                    t          d                                                    | _        t          |                    t          d                                                    | _        t          |                    t"          d                                                    | _        t          |                    t&          d                                                    | _        t*          |v r|t*                   | _        t.          |v rt1          |t.                             | _        t4          |v r|t4                   | _        d S d S Nr   100%)r  r  
XLINK_HREFr   SVG_HREFr  r  rI  r:  r  r  r   r  r   rE   r  rF   r  r   r  r   SVG_ATTR_PATTERN_CONTENT_UNITSr  SVG_ATTR_PATTERN_TRANSFORMr[  r  SVG_ATTR_PATTERN_UNITSr  r   r  r:  s      rq   r  zPattern.property_by_values  s   %%dF333z*DIIx(DI**-.."7++DL'611)/0L)MD&

:q112288::

:q112288::FJJ~v>>??EEGG
VZZ@@AAGGII)V33)/0N)OD&%//%+F3M,N%O%OD"!V++!'(>!?D ,+rt   c                    | j          | j         j        di | |                    d|                    d                    }|                    d|                    d                    }	 |d= n# t          $ r Y nw xY wt	          | j        t                    r | j        j        dd|i|| _        t	          | j        t                    r | j        j        dd|i|| _        t	          | j	        t                    r | j	        j        dd|i|| _	        t	          | j
        t                    r | j
        j        dd|i|| _
        | S r"  )r  r  r  r#  r   rE   r   r   rF   r   r   r$  s       rq   r  zPattern.render  ss   !-)D")33F333

7FJJ/@$A$ABBHfjj1B&C&CDD	()) 	 	 	D	dff%% 	C!TV\BB%B6BBDFdff%% 	D!TV\CC&CFCCDFdj&)) 	K))JJ%J6JJDJdk6** 	N+$++MMFMfMMDKs   -A1 1
A>=A>N)
r   r   r   r   rs  rY  r    r  r  r  rm   rt   rq   r  r  f  s}        3 3 3   , , X,
- - - @ @ @,    rt   r  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ed	             Zed
             Zed             Zd Zd Zd Zd ZddZdS )Texta/  
    SVG Text are defined in SVG 2.0 Chapter 11

    No methods are implemented to perform a text to path conversion.

    However, if such a method exists the assumption is that the results will be
    placed in the .path attribute, and functions like bbox() will check if such
    a value exists.
    c                    t          |          dk    r|d         | _        nd| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d | _        t#          j        | g|R i | t'          j        | g|R i | t)          j        | g|R i | d S )	Nr   r   r   r   normal  r   z
sans-serif)r   r)   r   r   rE   rF   rM   rN   anchor
font_stylefont_variantfont_weightfont_stretchr8  line_heightfont_familyr!   r  r   r  r  r  s      rq   r   zText.__init__  s    t99>>QDIIDI
"$$'	t5d555f555t5d555f555D24222622222rt   c                 @   t                      }|                    d| j        z             |                    t          d| j        d           |                    t
          d| j        d           |                    t          d| j        d           |                    t          dt          | j                  d           |                    t          d| j        d           |                    dt          | j        fz             |                    t           d| j        d           | j        dk    s| j        dk    rH|                    t(          d| j                   |                    t*          d| j                   | j        dk    s| j        dk    rH|                    t0          d| j                   |                    t2          d| j                   | j        %|                    t6          d| j        d           | j        %|                    t:          d| j        d           | j        <| j        dk    r1|                    t>          dt          | j                             | j         !                                s1|                    tD          dtG          | j                              | j$        %|                    tJ          d| j$        d           dd	&                    |          z  S )
N'%s'r  rQ  z%s=%dr   r  r  Text(%s)r  )'r'  r  r)   SVG_ATTR_FONT_FAMILYr  SVG_ATTR_FONT_STYLEr  SVG_ATTR_FONT_VARIANTr  SVG_ATTR_FONT_WEIGHTr   r  SVG_ATTR_FONT_STRETCHr  SVG_ATTR_FONT_SIZEr8  SVG_ATTR_TEXT_ANCHORr  rE   rF   r  r  rM   rN   SVG_ATTR_DXSVG_ATTR_DYr:   r  r9   r  r  r   r;   r1  r   r~  r5   r  r  r  s     rq   r(  zText.__str__  s   fty()))#7#7#79I9I9IJKKK#6#6#6HIII#8#8#8$:K:K:KLMMM#7#7#7T=M9N9N9N9NOPPP#8#8#8$:K:K:KLMMMg!3T^ DDEEE#7#7#7EFFF6Q;;$&A++MMZZZ8999MMZZZ89997a<<47a<<MM[[[$'':;;;MM[[[$'':;;;;"MMDEEE9 MM}}}diii@AAA(T->#-E-EMM%:%:%:C@Q<R<R<RSTTT~))++ 	PMM%7%7%7dn9M9M9MNOOO7MM{{{DGGG<===TYYv..//rt   c                    t                      }|                    d| j        z             |                    d| j        z             | j        dk    r|                    d| j        z             | j        dk    r|                    d| j        z             |                    dt          | j                  z             | j        dk    r|                    d| j        z             |                    d| j	        z             |                    d	| j
        z             | j        d
k    s| j        d
k    rH|                    t          d| j                   |                    t          d| j                   | j        d
k    s| j        d
k    rH|                    t"          d| j                   |                    t$          d| j                   | j        %|                    t(          d| j        d           | j        %|                    t,          d| j        d           | j        5| j        dk    r*|                    dt          | j                  z             | j                                        s1|                    t4          dt7          | j                             | j        %|                    t:          d| j        d           dd                    |          z  S )Nr  zfont_family='%s'r  zfont_style='%s'zfont_variant='%s'zfont_weight='%s'zfont_stretch='%s'zfont_size=%dztext_anchor='%s'r   r  r  rQ  r  r|  r  r  )r'  r  r)   r  r  r  r   r  r  r8  r  rE   rF   r  r  rM   rN   r  r  r:   r  r9   r  r  r;   r1  r   r~  r5   r  r  r  s     rq   r%  zText.__repr__  s   fty()))(4+;;<<<?h&&MM+do=>>>((MM-0AABBB(3t/?+@+@@AAA((MM-0AABBBnt~5666(4;67776Q;;$&A++MMZZZ8999MMZZZ89997a<<47a<<MM[[[$'':;;;MM[[[$'':;;;;"MMDEEE9 MM}}}diii@AAA(T->#-E-EMM!C(9$:$::   ~))++ 	PMM%7%7%7dn9M9M9MNOOO7MM{{{DGGG<===TYYv..//rt   c                 ~   t          |t                    st          S | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j	        |j	        k    rdS | j
        |j
        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS dS rC  )r   r  rC  r)   r   r   rE   rF   rM   rN   r  r  r  r  r  r8  r  r  r   s     rq   r  zText.__eq__   sj   %&& 	"!!9
""5:$$5;%,&&56UW56UW57eh57eh5;%,&&5?e...5 2225u0005 2225>U_,,5u0005u0005>U_,,5trt   c                 H    t          |t                    st          S | |k     S r   )r   r  rC  r   s     rq   r  zText.__ne__>   r  rt   c                    t                               | |           t                              | |           t                              | |           |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        d S r   )r  r  r  r  r)   rE   rF   r   r   rM   rN   r  r  r  r  r  r  r8  r  r  s     rq   r  zText.property_by_objectC   s    ((q111((q111%%dA...F	W
h$$h=,N=N=rt   c                 X   t                               |          }|sdS |                    d          | _        | j        d| _        |                    d          | _        | j        d| _        |                    d          | _        | j        d| _        |                    d          | _        | j        d| _        |                    d          | _        | j        d| _        | j        rv| j        }t          | j                  | _        	 t          | j                  	                                | _        | j        d	k    r|| _        n# t          $ r
 || _        Y nw xY w|                    d
          | _        | j        d| _        | j        r}| j        }t          | j                  | _        	 t          | j        | j                  	                                | _        | j        d	k    r|| _        n# t          $ r
 || _        Y nw xY w|                    d          | _        dS )aI  
        CSS Fonts 3 has a shorthand font property which serves to provide a single location to define:
        `font-style`, `font-variant`, `font-weight`, `font-stretch`, `font-size`, `line-height`, and `font-family`

        font-style: normal | italic | oblique
        font-variant: normal | small-caps
        font-weight: normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
        font-stretch: normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded
        font-size: <absolute-size> | <relative-size> | <length-percentage>
        line-height: '/' <`line-height`>
        font-family: [ <family-name> | <generic-family> ] #
        generic-family:  `serif`, `sans-serif`, `cursive`, `fantasy`, and `monospace`
        Nr   r  r   r_  r`  r   12ptr   r  r  ru  )REGEX_CSS_FONTr   r   r  r  r  r  r8  r   r   r   r  r  )r   rP   r   r  r   s        rq   
parse_fontzText.parse_fontW   s%    $$T** 	F++a..?"&DO!KKNN$ (D ;;q>>#'D!KKNN$ (DQ>!#DN> 	&>D#DN33DN&!'!7!7!=!=!?!?>Q&&%)DN & & &!%& !;;q>>#%D 
	*%F%d&677D*#)$dn$ $ $%''   #q(('-D$ * * *#)   * !;;q>>s%   =E E! E!4AG9 9HHc                 T    d t                               | j                  D             S )Nc                 z    g | ]8}|                     d           s|                     d          r
|dd         n|9S )"rQ  r   r  )
startswith)ro   familys     rq   r  z"Text.font_list.<locals>.<listcomp>   s[     
 
 
 #--c22Xf6G6G6L6LXF1R4LLRX
 
 
rt   )REGEX_CSS_FONT_FAMILYr   r  r   s    rq   	font_listzText.font_list   s4    
 
/778HII
 
 
 	
rt   c                     | j         dk    rdS | j         dk    rdS 	 t          | j                   S # t          $ r Y dS w xY w)z
        This does not correctly parse weights for bolder or lighter. Those are relative to the previous set
        font-weight and that is generally unknown in this context.
        boldi  r  r  )r  r   r   r   s    rq   weightzText.weight   sb     v%%3x''3	t'((( 	 	 	33	s   0 
>>c                     dS )z&
        Deprecated Fontface.
        r   rm   r   s    rq   	font_facezText.font_face   s	    
 rrt   c                    t                               | |           t                              | |           t                              | |           |                    d| j                  | _        |                    t          | j                  | _        |                    d| j                  | _        |                    t          | j                  | _        |                    d| j	                  | _	        |                    t          | j	                  | _	        |                    d| j                  | _        |                    t          | j                  | _        	 t          | j                  | _        n# t          $ r Y nw xY w|                    d| j                  | _        |                    t           | j                  | _        t#          |                    d| j                                                            | _        t#          |                    t(          | j                                                            | _        |                    d| j                  | _        |                    t,          | j                  | _        |                    t.          d           }||                     |           |                    t2          | j                  | _        t#          |                    t6          | j                                                            | _        t#          |                    t:          | j                                                            | _        t#          |                    t>          | j                                                             | _         t#          |                    tB          | j"                                                            | _"        d S )Nr  r  r  r  r  r8  text_anchor)#r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r   r8  r   r  r  r  SVG_ATTR_FONTr  SVG_TAG_TEXTr)   r  rE   r  rF   r  rM   r  rN   )r   r  rP   s      rq   r  zText.property_by_values   s   ((v666((v666%%dF333!::mT5EFF!::&:D<LMM **\4?CC **%8$:JKK"JJ~t7HII"JJ'<d>OPP!::mT5EFF!::&:D<LMM	"4#344D 	 	 	D	 #JJ~t7HII"JJ'<d>OPP

; G GHHNNPP

+=t~ N NOOUUWWjj<<jj!5t{CCzz-..OOD!!!JJ|TY77	

:tv6677==??

:tv6677==??K99::@@BBK99::@@BBs   'F 
FFc                 n    t                               |            t                              |            d S r   )r  r  r  r   s    rq   r  z
Text.reify   s0    D!!!D!!!!!rt   c                    t          j        | fi | t          j        | fi | |                    d|                    d                    }|                    d|                    d                    }	 |d= n# t          $ r Y nw xY wt          | j        t                    r | j        j        dd|i|| _        t          | j	        t                    r | j	        j        dd|i|| _	        t          | j
        t                    r | j
        j        dd|i|| _
        t          | j        t                    r | j        j        dd|i|| _        | S r"  )r  r  r  r  r#  r   rE   r   r   rF   rM   rN   r$  s       rq   r  zText.render   s~   T,,V,,,T,,V,,,

7FJJ/@$A$ABBHfjj1B&C&CDD	()) 	 	 	D	dff%% 	C!TV\BB%B6BBDFdff%% 	D!TV\CC&CFCCDFdgv&& 	E#dgmDDEDVDDDGdgv&& 	F#dgmEEFEfEEDGs   8A< <
B	B	c                      t          |           S r   )r  r   s    rq   r   zText.__copy__   r  rt   TFc                 L   | j         $| j         | j        z                      d|          S | j        }| j        }| j        }| j        |z
  }| j        |z   }| j        }t          | d          r| j        dk    rn1| j        dk    r||dz  z  }||dz  z  }n| j        dk    r
||z  }||z  }|r| j        	                    ||g          }	| j        	                    ||g          }
| j        	                    ||g          }| j        	                    ||g          }t          |	d	         |
d	         |d	         |d	                   }t          |	d
         |
d
         |d
         |d
                   }t          |	d	         |
d	         |d	         |d	                   }t          |	d
         |
d
         |d
         |d
                   }|rL| j        E| j        >| j        j        2|rt          | j                  dz  }nt          | j                  dz  }nd}||z
  ||z
  ||z   ||z   fS )a  
        Get the bounding box for the given text object.

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        NTrm  r  r   middler   r   r   r   r  r   )r!   r;   r  r   r   rE   rF   r)  r  rt  rJ  rK  r  r:   r   r   r&  )r   r  r  r   r   r  r  r  r  rh  r  r  r~  r  s                 rq   r  z	Text.bbox   sW    9 I.44 ' 5   
 
vvv~vtX&& 	$+*@*@[H$$EAIDEAIDD[E!!EMDEMD 	3//t==B//t==B//t==B//t==Br!ubeRUBqE22Dr!ubeRUBqE22Dr!ubeRUBqE22Dr!ubeRUBqE22D 
	!-[(DK,=,E 7d899C?d/0036E 5L5L5L5L	
 	
rt   Nr  )r   r   r   rT  r   r(  r%  r  r  r  r  rY  r  r  r  r  r  r  r   r  rm   rt   rq   r  r    s/        3 3 320 0 08 0  0  0D# # #J! ! !
) ) )(?* ?* ?*B 
 
 X
   X   X&C &C &CP" " "  &  8
 8
 8
 8
 8
 8
rt   r  c                   z    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zed
             ZddZd Zd Zd ZddZdS )Imagez
    SVG Images are defined in SVG 2.0 12.3

    This class is called SVG Image rather than image as a guard against many Image objects
    which are quite useful and would be ideal for reading the linked or contained data.
    c                    d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        t          j        | g|R i | t          j        | g|R i | t          j        | g|R i | | j         t                               | j                   }|r|                    d                              d          | _        | j         |                    d          dz   d          | _        d| j        v rddlm}  || j                  | _        d S ddlm}  || j                  | _        d S d S d S )Nr   ;base64r   )	b64decode)unquote_to_bytes)urldata
media_typer:  r  rE   rF   r   r   r+   image_widthimage_heightr  r   r  r  REGEX_DATA_URLr   r   r  r   r  r  urllib.parser  )r   r   r   r   r  r  s         rq   r   zImage.__init__=!  s   	%)"

 t5d555f555t5d555f555	
	
 	
 	
!	
 	
 	
 8"((22E <"'++a.."6"6s";"; HUYYq\\A%5%7%78	t..000000 )	$) 4 4DIII====== 0 0 ; ;DIII  < <rt   c                    g }| j         dk    r<|                    t          dt                              | j                              | j        dk    r<|                    t          dt                              | j                             | j        dk    r<|                    t          dt                              | j                             | j	        dk    r<|                    t          dt                              | j	                             | j        $|                    t          d| j                   | j        2|                    t          dt	          | j                  d           | j        %|                    t           d| j        d           | j                                        s*|                    dt'          | j                  z             d                    |          }d|z  S )	Nr   r  r  r  rQ  ztransform=%sr  z	Image(%s))rE   r  r  r   r   rF   r  r   r  r   r  r  r  r:  r  r  r  r;   r1  r~  r  r  s      rq   r%  zImage.__repr__`!  s   6Q;;MMZZZDF1C1C1CDEEE6Q;;MMZZZDF1C1C1CDEEE:MM^^^VZZ
5K5K5KLMMM;&  MM___fjj6M6M6MNOOO%1MM7779S9ST   <#MM'7'7'7T\9J9J9J9JKLLL8MMxxx:;;;~))++ 	AMM.4+?+??@@@6""V##rt   c                 z   t          |t                    st          S | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j	        |j	        k    rdS | j
        |j
        k    rdS | j        |j        k    S rA  )r   r  rC  r  r  r   r   rE   rF   r+   r:  r  r   s     rq   r  zImage.__eq__w!  s    %'' 	"!!8uy  59
""5:$$5;%,&&56UW56UW5:$$5<5=((5)U-HHHrt   c                 H    t          |t                    st          S | |k     S r   )r   r  rC  r   s     rq   r  zImage.__ne__!  r9  rt   c                    t                               | |           t                              | |           t                              | |           |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        |j        | _        |j        | _        |j        | _        d S r   )r  r  r  r  r  r  r:  r  rE   rF   r   r   r+   r  r  r  s     rq   r  zImage.property_by_object!  s    %%dA...((q111((q1115F	y%&%<"W
hW
=Nrt   c                    t                               | |           t                              | |           t                              | |           t          |v r|t                   | _        nt          |v r|t                   | _        |                    t                    }|t          |          | _
        t          |v r|t                   | _        t          |                    t          d                                                    | _        t          |                    t"          d                                                    | _        t          |                    t&          d                                                    | _        t          |                    t*          d                                                    | _        d|v r(|d         | _        | j        j        \  | _        | _        d S d S )Nr   r  r+   )r  r  r  r  r  r  r  r  r  rI  r:  r  r  r   r  r   rE   r  rF   r  r   r  r   r+   r  r  r  r  s      rq   r  zImage.property_by_values!  s   %%dF333((v666((v666j)DHHh'DH**-.."7++DL'611)/0L)MD&

:q112288::

:q112288::FJJ~v>>??EEGG
VZZ@@AAGGIIfDJ26*//Dd/// rt   c                    t          j        | fi | t          j        | fi | t          j        | fi | |                    d|                    d                    }|                    d|                    d                    }	 |d= n# t
          $ r Y nw xY wt          | j        t                    r | j        j	        dd|i|| _        t          | j
        t                    r | j
        j	        dd|i|| _
        t          | j        t                    r | j        j	        dd|i|| _        t          | j        t                    r | j        j	        dd|i|| _        | S r"  )r  r  r  r  r  r#  r   rE   r   r   rF   r   r   r$  s       rq   r  zImage.render!  s   T,,V,,,T,,V,,,$))&)))

7FJJ/@$A$ABBHfjj1B&C&CDD	()) 	 	 	D	dff%% 	C!TV\BB%B6BBDFdff%% 	D!TV\CC&CFCCDFdj&)) 	K))JJ%J6JJDJdk6** 	N+$++MMFMfMMDKs   
B 
BBc                      t          |           S )a  
        Copy of Image. This will not copy the .image subobject in a deep manner
        since it's optional that that object will exist or not. As such if using PIL it would
        be required to either say self.image = self.image.copy() or call .load() again.
        r  r   s    rq   r   zImage.__copy__!  s     T{{rt   c                 H    | j         dS | j                             |           S r  r  r   s    rq   r    zImage.viewbox_transform!  r  rt   Nc                     	 ddl m} | j        |                                  n| j        |                     |           |                                  d S # t          $ r Y d S w xY w)Nr   r	  )PILr  r  	load_datar  	load_fileset_values_by_imagerR  )r   	directoryPILImages      rq   loadz
Image.load!  s    		------y$    %y)))$$&&&&& 	 	 	DD	s   AA 
A$#A$c                     	 ddl m} | j        0ddlm} |                     || j                            | _        d S d S # t          $ r Y d S w xY w)Nr   r	  BytesIO)r	  r  r  ior	  openr+   rR  )r   r	  r	  s      rq   r	  zImage.load_data!  s}    	------y$&&&&&&%]]7749+=+=>>


 	 	 	DD	s   ;A 
AAc                 8   	 ddl m} | j        z	 |                    | j                  | _        d S # t
          $ rK 	 |1ddlm}  ||| j                  }|                    |          | _        n# t
          $ r Y Y d S w xY wY d S w xY wd S # t          $ r Y d S w xY w)Nr   r	  rb  )	r	  r  r  r	  r+   IOErroros.pathr  rR  )r   r	  r	  r  relpaths        rq   r		  zImage.load_file!  s    	------x#
!)tx!8!8DJJJ   $0444444&*d9dh&?&?G)1w)?)?DJ"       $#  	 	 	DD	sU   B 1 
B3A0/B0
A?:B;B >A??BB BB 
BBc                 2   | j         d S | j         j        | _        | j         j        | _        t          d| j        | j        fz  | j                  | _        |                     | j        | j                   t          | j
                  | j        z  | _        d S )Nz	0 0 %d %dr  )r+   r   r  r   r  rI  r  r:  r  r[  r    r;   r   s    rq   r
	  zImage.set_values_by_image
"  s    :F:+ J-4+T->??&
 
 	$*43DEEE 677$.Hrt   TFc                    | j         | j        4t          dd          }|| j        z  }|j        |j        |j        |j        fS | j         }| j        }|r_t          dd          | j        z  t          |d          | j        z  t          ||          | j        z  t          d|          | j        z  f}n>t          dd          t          |d          t          ||          t          d|          f}t          d |D                       }t          d |D                       }t          |          }t          |          }	t          |          }
t          |          }||	|
|fS )a  
        Get the bounding box for the given image object

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: There is no stroke for an image so with_stroke is ignored
        :return: bounding box of the given element
        Nr   c              3   $   K   | ]}|j         V  d S r   r}  ro   r   s     rq   rr   zImage.bbox.<locals>.<genexpr>."  $      %%aac%%%%%%rt   c              3   $   K   | ]}|j         V  d S r   r  r	  s     rq   rr   zImage.bbox.<locals>.<genexpr>/"  r	  rt   )	r  r  r0  r;   rE   rF   r'  rJ  rK  )r   r  r  r  r   r   x_valsy_valsmin_xmin_ymax_xmax_ys               rq   r  z
Image.bbox"  sZ    #t'8'@aAA3QS!#%% " 	Wadn,eQ$.0eV$$t~5a  4>1	AA q!eE1oouUF/C/CU1fEUEUVA%%1%%%%%%%1%%%%%FFFFeUE))rt   r   r  )r   r   r   rT  r   r%  r  r  r  r  r  r   rY  r    r	  r	  r		  r
	  r  rm   rt   rq   r  r  5!  s        !< !< !<F$ $ $.I I I*! ! !
+ + +$B B B*  (   , , X,

 
 
 
    *
I 
I 
I* * * * * *rt   r  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )Descc                 ^    d | _         |t                      }t          j        | g|R i | d S r   )r,   r  r  r   r   r   r  s      rq   r   zDesc.__init__;"  s>    	>VVFD24222622222rt   c                 P    t          |t                    sdS | j        |j        k    S rA  )r   r$	  r,   r   s     rq   r  zDesc.__eq__A"  s(    %&& 	5yEJ&&rt   c                 0    | j         j        d| j        dS Nz('z'))rr  r   r,   r   s    rq   r%  zDesc.__repr__F"  s    !^444diii@@rt   c                 J    t          |          dk    r|d         | _        d S d S r`  )r   r,   r  s     rq   r  zDesc.property_by_argsI"  s'    t99>>QDIII >rt   c                 T    t                               | |           |j        | _        d S r   )r  r  r,   r  s     rq   r  zDesc.property_by_objectM"  s%    %%dC000H			rt   c                 v    t                               | |           t          |v r|t                   | _        d S d S r   )r  r  SVG_TAG_DESCr,   r  s     rq   r  zDesc.property_by_valuesQ"  s;    %%dF3336!!|,DIII "!rt   N	r   r   r   r   r  r%  r  r  r  rm   rt   rq   r$	  r$	  :"  sq        3 3 3' ' '
A A A       - - - - -rt   r$	  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )Titlec                 ^    d | _         |t                      }t          j        | g|R i | d S r   )r-   r  r  r   r&	  s      rq   r   zTitle.__init__["  s>    
>VVFD24222622222rt   c                 P    t          |t                    sdS | j        |j        k    S rA  )r   r0	  r-   r   s     rq   r  zTitle.__eq__a"  s(    %'' 	5zU[((rt   c                 0    | j         j        d| j        dS r)	  )rr  r   r-   r   s    rq   r%  zTitle.__repr__f"  s    !^444djjjAArt   c                 J    t          |          dk    r|d         | _        d S d S r`  )r   r-   r  s     rq   r  zTitle.property_by_argsi"  s'    t99>>aDJJJ >rt   c                 T    t                               | |           |j        | _        d S r   )r  r  r-   r  s     rq   r  zTitle.property_by_objectm"  s%    %%dC000Y


rt   c                 v    t                               | |           t          |v r|t                   | _        d S d S r   )r  r  SVG_TAG_TITLEr-   r  s     rq   r  zTitle.property_by_valuesq"  s;    %%dF333F"".DJJJ #"rt   Nr.	  rm   rt   rq   r0	  r0	  Z"  sq        3 3 3) ) )
B B B! ! !  / / / / /rt   r0	  c            
          e Zd ZdZd Zed             Zed             Zed             Zed             Z	ed             Z
d Zd	 Zd
 Zd Zd ZddZed             Zed             Zededddddddf	d            ZdS )SVGz
    SVG Document and Parsing.

    SVG is the SVG main object and also the embedded SVGs within it. It's a subtype of Group. The SVG has a viewbox,
    and parsing methods which can be used if given a stream, path, or svg string.
    c                     i | _         d | _        d | _        d | _        d | _        d | _        t          j        | g|R i | d S r   )objectsrE   rF   r   r   r:  rw  r   r  s      rq   r   zSVG.__init__"  sR    
t-d---f-----rt   c                     | j         st          | j        | j                  S t          | j        | j                  }|| j        z  }|S r   r  r  s     rq   r  zSVG.implicit_position"  r  rt   c                 8    | j         s| j        S | j        d         S r}   r  r   s    rq   r  zSVG.implicit_x"  r  rt   c                 8    | j         s| j        S | j        d         S r>  r  r   s    rq   r  zSVG.implicit_y"  r  rt   c                     | j         s| j        S t          | j        d          }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  r  s      rq   r  zSVG.implicit_width"  r  rt   c                     | j         s| j        S t          d| j                  }|| j        z  }t          dd          }|| j        z  }|                    |          S r}   r  r  s      rq   r  zSVG.implicit_height"  r  rt   c                     t                               | |           |j        | _        |j        | _        |j        | _        |j        | _        |j        t          |j                  nd | _        d S r   )rw  r  rE   rF   r   r   r:  rI  r  s     rq   r  zSVG.property_by_object"  s]      q)))W
h-.Y-Bwqy)))rt   c                    t                               | |           t          |                    t          d                                                    | _        t          |                    t          d                                                    | _        t          |                    t          d                                                    | _
        t          |                    t          d                                                    | _        |                    t                    }|                    t                    }|t          ||          nd | _        d S r  )rw  r  r   r  r  r   rE   r  rF   r  r   r  r   r  r  rI  r:  )r   r  r:  pars       rq   r  zSVG.property_by_values"  s      v...

:q112288::

:q112288::FJJ~v>>??EEGG
VZZ@@AAGGII**-..jj566070Cww,,,rt   c                 6    | j                             |          S r   )r;	  r  )r   r5   s     rq   get_element_by_idzSVG.get_element_by_id"  s    |###rt   c                 l    t                               |          D ]}|                     |          c S d S r   )	REGEX_IRIr   rE	  )r   r  _ids      rq   get_element_by_urlzSVG.get_element_by_url"  sC    $$S)) 	/ 	/C))#.....	/ 	/rt   c                 (   t          j        | fi | |                    d|                    d                    }|                    d|                    d                    }	 |d= n# t          $ r Y nw xY w t	          | j                  j        dd|i|| _         t	          | j                  j        dd|i|| _         t	          | j                  j        dd|i|| _         t	          | j	                  j        dd|i|| _	        d S r"  )
rw  r  r  r#  r   r   r   r   rE   rF   r$  s       rq   r  z
SVG.render"  s/   T$$V$$$

7FJJ/@$A$ABBHfjj1B&C&CDD	()) 	 	 	D	-VDJ''-NNeNvNN
/fT[))/QQQ&QQ%%FFeFvFF%%GGfGGGr  Nc              #   d   K   | ||           r| V  |                      |          D ]}|V  d S r   )r  )r   r  r   s      rq   r  zSVG.elements"  sT      ++d"3"3JJJ[)) 	 	AGGGG	 	rt   c                 H    | j         dS | j                             |           S r  r  r   s    rq   r    zSVG.viewbox_transform"  r  rt   c              #     	
K   i 	d}t                      }t          | d          D ]|\  }}|dk    rN|}||f}t                      }||f}|                    |           |j        }t          |v r|	|t                   <   Y|dk    r|\  }}e|                    |df           }|}	
fd
 
|          E d{V  dS )a  
        SVG structure pass: parses the svg file such that it creates the structure implied by reused objects in a
        generalized context. Objects ids are read and put into an unparsed shadow tree. <use> objects seamlessly contain
        their definitions.
        N)r   r   start-ns)eventsr   r   c              3     K   | D ]\  }}|d d|fV  |j         }|                    d          r
|dd          }|d|fV   |          E d {V  t          |k    rid }|j        }t          |v r|t                   }t
          |v r|t
                   }|2	  |dd                   g          E d {V  n# t          $ r Y nw xY w|d|fV  d S )NrN	  z{http://www.w3.org/2000/svg   r   r   r   )rO   r  SVG_TAG_USEattribr  r  r#  )nodeselemchildrenrO   r  semiattr
event_defs	semiparses         rq   rY	  z+SVG._use_structure_parse.<locals>.semiparse#  sT     "' ' 'h#
D0000h>>"?@@ #bcc(C7D(((($9X.........#%%C#{H!X--&z28++&x0!'0y*SW2E1F'G'GGGGGGGGG' ! ! ! D!5$&&&&&+' 's    B77
CC)r'  r   r  rS	  r  )sourceparentrV	  eventrU	  siblingsnoder4   rT	  rX	  rY	  s            @@rq   _use_structure_parsezSVG._use_structure_parse"  s&      
66 %V4PQQQ 	. 	.KE4# (+66h'%%%![
*,,  ";/ %#) t----	' 	' 	' 	' 	' 	'0 9U###########rt   Tr  Fignorec
           
         d}
d}|}i }g }t           |t          dt          di}|
||t          <   t                              |           D ];\  }}}	 |dk    	r|                    ||f           |s2t          |v r)|t                                                   t          k    rZ|}i }|
                    |           t          |v r|t          = t          |v r|t          = t          |v r|t          = t          |v r|t          = t          |v r|t          = t!          |j                  }||t$          <   d}d|v r||d         z  }||v r|||         z  }t          |v r9|t                   }d|z  }||v r#t'          |          dk    r|d	z  }|||         z  }t          |v r}|t                                       d
          D ]\}d|z  }||v r#t'          |          dk    r|d	z  }|||         z  }|d|}||v r#t'          |          dk    r|d	z  }|||         z  }]t*          |v r(t'          |          dk    r|d	z  }||t*                   z  }|                    d	          D ]}}|                    d          }t'          |          dk    rSt-          |d                                                   }t-          |d                                                   }|||<   ~t          |v rJ|t                   t0          k    r4t           |v r|t                    |t          <   n|t                    |t          <   t          |v rJ|t                   t0          k    r4t           |v r|t                    |t          <   n|t                    |t          <   t          |v rEt          |v r'|t                   d
z   |t                   z   |t          <   n|t                   |t          <   |
                    |           ||t2          <   |s3t          |v r*|t                                                   t          k    rt4          |k    rt	          |          }||j        |j        j        nd}||j        |j        j        nd}|                    ||||j                   |j        |j        }}|j        	 |j        dk    s|j        dk    r|c S |j        }n# t@          $ r |cY c S w xY wt          |v r|t          xx         d
|z   z  cc<   n
||t          <   |t                   |d<   |j        j        |j        j        }}|||f|d<   ||                    |           |}ntB          |k    rBtE          |          }||                    |           |}|                    |||           ntF          |k    r+tE          |          }|}|                    |||           nPtH          |k    r0tK          |          }|}|                    |||           |dz  }ntL          |k    rtO          |          }t          |j(        v r|j(        t                   |t          <   tR          |v r|tR          = tT          |v r|tT          = tV          |v r|tV          = tX          |v r|tX          = ||                    |           |}|
dz  }
t          |v r||
dk    r||j-        |t                   <   nIt\          |k    r+t_          |          }|}|                    |||           n|t`          tb          td          tf          th          tj          tl          tn          fv rd}d}	 t`          |k    r?tq          |d          }|9                    |:                    tv                               ntb          |k    rty          |          }ntd          |k    rt{          |          }n{tf          |k    rt}          |          }n`th          |k    rt          |          }nEtj          |k    rt          |          }n*tl          |k    rt          |          }nt          |          }n!# t          $ r} | }|Y d} ~ Y d} ~ nd} ~ ww xY w|                    |||           |r|D                                 |E                                r`||                    |           |r|	dk    r|	dk    r||c S nJ|t          t          t          t          t          fv rt          |          }||                    |           ||}t          |t                    r	 |j(        :                    t          d          }!|!|M                    |!          }"|"|_N        n# t          $ r Y nw xY w|dk    r@	 |j(        :                    t          t                    }#|#|#|_R        n# t          $ r Y nw xY wt          |v r|
dk    r||j-        |t                   <   	|dk    r_t          |v rA|t                                                   t          k    r|S                                \  }}	d}|t          t          t          t          t          fv r-|j        }t          |v r||
dk    r||j-        |t                   <   |t          t          fv r]t          ||jU                  }|                    |||           |r|D                                 ||                    |           nt          |k    r/t          ||jU                  }||                    |           nht          |k    r/t          ||jU                  }||                    |           n.t          |k    r|jU        }$|$d}$t          jY        t          d|$          }$t          t          j\        t          |$                                                    }%|%D ]\  }}|                                }|                                }|                    d          D ][}&|&                                }'|'|vr|||'<    ||'         ^                    d	          s||'xx         d	z  cc<   ||'xx         |z  cc<   \n!tH          |k    r|dz  }ntL          |k    r|
dz  }
|||}	 |j(        :                    t          d          }!|!|M                    |!          }"|"|_N        n# t          $ r Y nw xY w|dk    r@	 |j(        :                    t          t                    }#|#|#|_R        n# t          $ r Y nw xY w|S                                \  }}|dk    r"|d         tv          k    r|d         ||d         <   =|S )a  
        Parses the SVG file. All attributes are things which the SVG document itself could not be aware of, such as
        the real size of pixels and the size of the viewport (as opposed to the viewbox).

        :param source: Source svg file or stream.
        :param reify: Should the Geometry sized or have lazy matrices.
        :param ppi: How many physical pixels per inch are there in this view.
        :param width: The physical width of the viewport
        :param height: The physical height of the viewport
        :param color: the `currentColor` value from outside the current scope.
        :param transform: Any required transformations to be pre-applied to this document
        :param context: Any existing document context.
        :param parse_display_none: Parse display_none values anyway.
        :param on_error: Error mode, "ignore", "raise", "stop"
        :return:
        r   r  rc   Nr   r   *z#%sr  r  z.%srO  :r   r   rj  )r6  r   r   r:  r(  r  )r6  r   r   T)r  r`	  raiser   )r)   )r,   )r-   rS  rN	  )_SVG_ATTR_COLORr  r  r   r9	  r_	  r  SVG_ATTR_DISPLAYr  r'  r  r  r  r  SVG_ATTR_CLASSSVG_ATTR_CLIP_PATHr  rS	  SVG_ATTR_TAGr   r  SVG_ATTR_STYLEr   stripSVG_VALUE_CURRENT_COLORSVG_STRUCT_ATTRIBSVG_NAME_TAGr:  r   r   r  r    r}  SVG_TAG_GROUPrw  SVG_TAG_DEFSSVG_TAG_CLIPPATHr  rR	  r  r  r  r  r  r  r;	  SVG_TAG_PATTERNr  SVG_TAG_PATHSVG_TAG_CIRCLESVG_TAG_ELLIPSESVG_TAG_LINESVG_TAG_POLYLINESVG_TAG_POLYGONSVG_TAG_RECTSVG_TAG_IMAGEr7  r   r  r   r  r  r
  r=  r8  r  r  r   r  r.  SVG_TAG_STYLEr  r-	  r7	  SVG_TAG_TSPANr  r   rI	  	clip_pathr3  SVG_ATTR_CLIP_RULESVG_RULE_NONZERO	clip_rulepopr  r)   r$	  r0	  resubREGEX_CSS_COMMENTr'  r   REGEX_CSS_STYLEr  )(rZ	  r  r6  r   r   r8   r;   contextparse_display_noneon_errorr1   cliprootstylesstackr  rO   r\	  rU	  current_valuesr4   r/   svg_idcss_tag	svg_classequate
equal_itemrP  r   r   r(  parse_errorr  clip_path_urlr}	  r	  	textstyleassignmentsselectorsels(                                           rq   r   z	SVG.parse#  s   :  E7V
  )2F%& # 8 8 @ @ b	. b	.C gv.///*(F22/06688NJJ!'n--- 0699;<#v--/0&(({+!V++~.%//12!$+..
+.
<( &==VC[(E&==VC[(E*,,'4F#fnG&((u::??!SLE0!Z//%/%?%E%Ec%J%J 5 5	"')"3"f,,"5zzQ %!VG_4ECC%I# #f,,"5zzQ %!VG_4E!Z//5zzQZ77E $kk#.. 0 0F!'c!2!2J:!++!*Q-006688 #JqM 2 2 8 8 : :*/
3!Z//"=15LLL%334>~4N
=114:>4J
=1 $z11"?37NNN%336@6P
?336<^6L
?3%33)V33"#56!"();<= ##566 :DDV9W
#56 j))),6()*(F22/06688NJJ3&& FA} 01y/DAIOO$  ~56Y5J!1!1PTHHE&!)HTTT$%GQXEFy,% x1}}1'(121D..0 % % % $%HHHHH	% .77"#5666#@R:RR66669KF#567=>P7Q34()	9Iv%,f$5b	*q)))GG"c))fA*q)))GHHE&HAAAA!S((fAGHHE&HAAAA%,, ((AGHHE&HAAAAIDD C''FA)QX5556X>P5Q12!V++":.!V++":.%//">2&&00"?3*q)))G1HC"j00T5E#QR((@AZ%<=$++AGHHE&HAAAA "# $# !	 	 	 #'KA%'3.. $V$ ? ? ?AGGFJJ}$=$=>>>>+s22 &vAA,33 'AA)S00 *6 2 2AA-44 ( 0 0AA,33 'AA)S00 $VAA %fA% % % %&'9$HHHH %9999%
 HHE&HAAA "			(( ! *q)))" (#x//$%00"--#'KKK( !  !!   "6**A*q)))<DdC(( B()5G(N(N(4(,(?(?(N(NI*3AK)   qyy!() 24D) )I  )4.7- ! ! ! D!"j00SAXX@AZ%<=% %../06688NJJ ',iikkOGV ! !!   "&J"j00T5E#QR((@AZ%<=<777V$)444AHHE&HAAA "			*q)))!S((V$)444A*q)))"c))fDI666A*q)))"c)) $	I ($&	 "'8"i H HI"&rz/9??CTCT'U'U"V"VK&1 
5 
5
U!iikk %(+		# 5 5H"*.."2"2C"&00.3s'-c{';';C'@'@ !7$*3KKK3$6KKK &su 45
5 &,,AIDD C''1HC=| ()5G(N(N(4(,(?(?(N(NI*3AK)   qyy!() 24D) )I  )4.7- ! ! ! D! #())++*$$7m++&*1gF47Osy   S9SSSC;a
a!aa!:>e99
ff.f??
gg->s,,
s98s9.t22
t?>t?r   )r   r   r   rT  r   rY  r  r  r  r  r  r  r  rE	  rI	  r  r  r    r[  r_	  rZ  r   rm   rt   rq   r9	  r9	  w"  s        . . .   X ) ) X)
 ) ) X)
 % % X% % % X%M M MN N N$ $ $/ / /H H H    , , X,
 9$ 9$ \9$v   N N N \N N Nrt   r9	  c                 B    ddl m}  |t          |           d          S )Nr   r  unicode)encoding)xml.etree.ElementTreer  _write_node)r^	  r  s     rq   r  r  $  s1    ......8K%%	::::rt   Tc                 *   ddl m} t          |           }|rt          |            ||          }	 |                                                    d          rddl}|                    |d          }n# t          $ r Y nw xY w |j	        |fi | dS )z
    Gets the write node and writes to the ElementTree.write() function, all options in Element.write() are passed
    along via this method. encoding, xml_declaration, short_empty_elements, etc.
    r   )ElementTreesvgzNwb)
r	  r	  r	  _pretty_printr  r  gzipr	  r3  r  )r^	  r  prettyr   r	  r	  treer	  s           rq   r  r  $  s    
 211111tD d;tD7799f%% 	#KKK		!T""A    DJqFs   AA5 5
BBc           
         t          | d          r(| j        | j                            t                    nd fd}t	          | t
                    r| ||t                    }|                    t          t                     |                    t          t                     |                    t          t                     |                    t          t                     n ||t                    }| j        r-|                    t"          t%          | j                             | j        r-|                    t(          t%          | j                             | j        r-|                    t,          t%          | j                             | j        r-|                    t0          t%          | j                             | j        r-|                    t4          t%          | j                             d }	 | j        }|r%t9          |          }|                                 |}n# t<          $ r Y nw xY w| D ]}t?          |||           
nt	          | t@                    r ||tB                    }| j"        r-|                    tF          t%          | j"                             | j$        r-|                    tJ          t%          | j$                             | j&        r-|                    tN          t%          | j&                             | j(        r-|                    tR          t%          | j(                             	nt	          | tT                    r ||tV                    }| j"        r-|                    tF          t%          | j"                             | j$        r-|                    tJ          t%          | j$                             | j&        r-|                    tX          t%          | j&                             nt	          | tZ                    rc ||t\                    }ddl/m0} ddl1m2} | j3        m |            }	| j3        4                    |	d           |                    dd	 ||	5                                          6                    d
                      | j        r-|                    t"          t%          | j                             | j        r-|                    t(          t%          | j                             | j        r-|                    t,          t%          | j                             | j        r-|                    t0          t%          | j                             njt	          | tn                    r ||tp                    }| j9        r-|                    tt          t%          | j9                             | j;        r-|                    tx          t%          | j;                             | j=        r-|                    t|          t%          | j=                             | j?        r-|                    t          t%          | j?                             nrt	          | t                    rB ||t                    }|                    t          | D                    d                     nt	          | t                    rP ||t                    }|                    t          dH                    d | jI        D                                  nt	          | t                    rP ||t                    }|                    t          dH                    d | jI        D                                  nQt	          | t                    rK ||t                    }| j        r-|                    t"          t%          | j                             | j        r-|                    t(          t%          | j                             | j&        r-|                    tN          t%          | j&                             | j(        r-|                    tR          t%          | j(                             | j        r-|                    t,          t%          | j                             | j        r-|                    t0          t%          | j                             nt	          | t                    rl ||t                    }| jP        |_P        | jQ        r-|                    t          t%          | jQ                             | jS        r-|                    t          t%          | jS                             | jU        r-|                    t          t%          | jU                             | jW        r |                    t          | jW                   | jY        r-|                    t          t%          | jY                             | j[        r(|                    dt%          | j[                             | j\        r |                    t          | j\                   nnt	          | t                    rG ||t                    }| j`        r-|                    t          t%          | j`                             nt	          | t                    rG ||t                    }| jc        r-|                    t          t%          | jc                             nt	          | t                    r ||t                    }| jf        r-|                    t          t%          | jf                             | jh        r-|                    t          t%          | jh                             | jj        r-|                    t          t%          | jj                             | jl        r-|                    t          t%          | jl                             nt	          | t                    r( ||t                    }| D ]}t?          |||           nt	          | t                    r( ||t                    }| D ]}t?          |||           nEt	          | t                    r0t          v r% ||                    t                              }nd S t          | d          ryt	          | t                    sd| js        }
|r|
|z  }
|
t                                sB|                    t          d|
jv        |
jw        |
jx        |
jD        |
jy        |
jz        fz             t          | d          r| j{        }||j|        }|#|j}        t%          t          |                    nt          }|                    t           t%          |                     |dk    r+|)|                    t          t%          |                     	 t%          | j                  }|                    t          t%          |                     n# t          $ r Y nw xY wt          | d          r| j        }||j|        }|#|j}        t%          t          |                    nt          }|                    t          t%          |                     |dk    r+|)|                    t          t%          |                     t          | d          r5| j        .|                    t          t%          | j                             |S )Nr  c                    ddl m}m} |  ||          } n || |          }                                 D ]L\  }}|dt          t
          t          t          t          fv r)| 	                    |t          |                     M| S )Nr   )Element
SubElementrO   )r	  r	  r	  itemsrm	  r   r  r  r{	  r  r   )xml_treerO   r	  r	  rP  r   r  s         rq   subxmlz_write_node.<locals>.subxml$  s    ========ws||HH!z(C00H ,,.. 
	* 
	*JC!"   LLc%jj))))rt   r   )	b64encoder	  PNG)r  z
xlink:hrefzdata:image/png;base64,utf8Frj  r  c                 4    g | ]}|d           d|d          S r   r  r   rm   ro   r  s     rq   r  z_write_node.<locals>.<listcomp><%  .    <<<11&&!&&<<<rt   c                 4    g | ]}|d           d|d          S r	  rm   r	  s     rq   r  z_write_node.<locals>.<listcomp>B%  r	  rt   r  r;   zmatrix(%f, %f, %f, %f, %f, %f)r:   r  r9   r5   )r)  r  r  rm	  r   r9	  rn	  r  SVG_ATTR_VERSIONSVG_VALUE_VERSIONSVG_ATTR_XMLNSSVG_VALUE_XMLNSSVG_ATTR_XMLNS_LINKSVG_VALUE_XLINKSVG_ATTR_XMLNS_EVSVG_VALUE_XMLNS_EVrE   r  r   rF   r  r   r  r   r  r:  r  r    r[  r  r   r	  r  ru	  r>   r  r?   r  r@   r  rA   r  r  rt	  r  r  rz	  r  r	  r	  r	  r+   savegetvaluedecoder
  rv	  rI   r  rJ   r  rK   r  rL   r  r7  rs	  r   r6   r=  rw	  r.  r  rC   r8  rx	  r  ry	  r  r  r)   r  r  r  r  r  r  r  r  r8  r  r  r  r  r$	  r-	  r,   r0	  r7	  r-   r  rr	  r  r  r  r  r  r  r  r  r  ro	  rw  r  ri	  r;   r1  r   r   rg  r   r  r  r:   rf  r   r   r'  r  r  r  r   r3  r9   r  r  r5   r  )r^	  r	  r(  r	  vtr   childr	  r	  streamr   r:   r  r  r9   r  r  s                   @rq   r	  r	  $  s   tX !2F;;    ( $ _vh55HLL)+<===LL999LL,o>>>LL*,>????vh55H6 	2LLS[[1116 	2LLS[[111: 	:LLTZ999; 	<LL#dk*:*:;;;< 	>LL)3t|+<+<===	'B 2JJ		 	 	 	D	 	- 	-Ex,,,,	-	D'	"	" A6(O447 	:LL*CLL9997 	:LL*CLL9997 	:LL*CLL9997 	:LL*CLL999	D&	!	! w6(N337 	:LL*CLL9997 	:LL*CLL9997 	8LL#dg,,777	D%	 	  o6(M22$$$$$$:!WYYFJOOF5O111LLV6??3D3D)E)E)L)LV)T)TVV   6 	2LLS[[1116 	2LLS[[111: 	:LLTZ999; 	<LL#dk*:*:;;;	D*	%	% [6(L117 	4LLc$'ll3337 	4LLc$'ll3337 	4LLc$'ll3337 	4LLc$'ll333	D$		 Q6(L11]DFFuF$=$=>>>>	D(	#	# N6($455HH<<<<<==	
 	
 	
 	
 
D'	"	" H6(O44HH<<<<<==	
 	
 	
 	
 
D$		 B6(L116 	2LLS[[1116 	2LLS[[1117 	:LL*CLL9997 	:LL*CLL999: 	:LLTZ999; 	<LL#dk*:*:;;;	D$		 46(L11	 	FLL-s43C/D/DEEE? 	DLL,c$/.B.BCCC 	HLL.D4E0F0FGGG 	CLL.0ABBB> 	BLL+S-@-@AAA 	?LLD,<(=(=>>>; 	<LL-t{;;;	D$		 #6(L119 	7LLs49~~666	D%	 	  6(M22: 	9LLDJ888	D'	"	" 6(O44! 	RLL3S9O5P5PQQQ% 	LL.D4N0O0O    	JLL/T5G1H1HIII% 	XLL5s4;U7V7VWWW	D#		 6(M22 	= 	=Ex);<<<<	=	D%	 	  
6(M22 	= 	=Ex);<<<<	=	D*	%	% 6!!vh

<(@(@AAHH Ft[!! *T5*A*A N 	'&&A}} 	LL"0ACac13QS3QQ   tX #^N %&,*B CKK   # 
 LL#f++666$$)C4c.6I6IJJJ"4#4552C4E4EFFFF!    tV Gy<L #
(> CII# 
 LLD		222s""|'?2C4E4EFFF tT 47LLc$'ll333Os$   .H2 2
H?>H?)=y' 'y54y5r  c                    t          |           D ]\  }}t          || ||dz              |R|dk    rdd|z  z   |_        ndd|z  z   ||dz
           _        |t	          |          dz
  k    rdd|dz
  z  z   | _        d S d S d S )Nr   r   
	)rT  r	  r)   tailr   )r|  r[	  r  r  r  r^	  s         rq   r	  r	  %  s    W%% 3 34dGQ	2222A::$,/FKK%)TE\%:F519"CKK!O##4519#56GLLL 
 $#rt   r  r   )Nr  r   )r	  collections.abcr   rR  collectionsr   mathr   r   r   r	   r
   r   r   r   r   r   r   r   r	  r   r   r   SVGELEMENTS_VERSIONr  r+  	max_depthrZ  rn	  r	  r	  r	  r	  r	  r	  r	  r	  r  r  r  r  r  SVG_VIEWBOX_TRANSFORMrs	  ro	  ry	  rt	  ru	  rv	  rw	  rx	  r  r|	  rz	  r-	  r7	  SVG_TAG_METADATAr{	  rp	  rR	  rq	  rr	  rm	  r  r   rf	  re	  r  r  r  r  r   r   rj	  rg	  rh	  r~	  r  r  r  r  r  r  r.  r  r  r  SVG_ATTR_X0SVG_ATTR_Y0r  r  r  r  r  r  ri	  r  r  r  r  r  r  r  r   SVG_ATTR_TEXT_ALIGNMENT_BASELINESVG_ATTR_TEXT_DOMINANT_BASELINEr  r  r  r*  r  SVG_UNIT_TYPE_OBJECTBOUNDINGBOXr	  SVG_RULE_EVENODDr  r  r  r  r  r  r  r  r  r   r  r'  rl	  r+  
PATTERN_WSPATTERN_COMMAPATTERN_COMMAWSPPATTERN_FLOATPATTERN_LENGTH_UNITSPATTERN_ANGLE_UNITSPATTERN_TIME_UNITSPATTERN_FREQUENCY_UNITSPATTERN_RESOLUTION_UNITSPATTERN_PERCENTPATTERN_TRANSFORMPATTERN_TRANSFORM_UNITScompilerG	  r  r  r2  r  r  r  r  r  r  r   	MULTILINEr	  r	  r  r  	svg_parser  r   	num_parser   
flag_parser   r{   objectr   r]  r0  r   r  r[  rI  r  r  r  r0  r  ro  r  r  rn  r  r!  rK  r  r7  r  r  r  r  r
  r&  r=  r8  r  r'  rw  r  r  r  r  SVGTextr  SVGImager$	  SVGDescr0	  r9	  r  r  r	  r	  rm   rt   rq   <module>r	     su   
			,/////// , , ,++++++++,                                  , + + + + +   
q&CCC

  		   .# 0 8 1
 +       & * &       )     4 

$ " & $ &   $ #7  "5 !6 / ' ( / "5    %      ( (     ( 3 
(/ ;I )  " * 	
 

  	 
 

    

  
	
 
 

  

  

  !" 
#
$ %& 
'
( ) 0 3!44s:_L  BJ'((	-..bj''2::!MM===---@   &2:: 1 1 1:::>   'BJJ"]]JJJ0G0G0GH   "*677"**}}mmm]]]MMMC  %"**}}mmm]]]MMMC   "**}}mmm]]]MMMC  rz.>??BJ:BLII "*;<<	 & #
a   4f>N5OP		CHHGGYGGGGG	H	H}%'9FDT;UV		CHHGGYGGGGG	H	H&*:!;<

"*SXXIIjIIIII
J
Jp p p p p p p pf	U U U U UV U U Upy1 y1 y1 y1 y1F y1 y1 y1xN N N N N N N NbL) L) L) L) L)E L) L) L)^KT KT KT KT KT KT KT KT\Z Z Z Z Z Z Z Zz< < < < < < < <~R$ R$ R$ R$ R$ R$ R$ R$j\ \ \ \ \ \ \ \~I' I' I' I' I'J} I' I' I'X
` ` ` ` ` ` ` `F	]3 ]3 ]3 ]3 ]3; ]3 ]3 ]3@N N N N NK N N N6P" P" P" P" P"[ P" P" P"f    F   "7 7 7 7 76 7 7 7s s s s se s s slN N N N N% N N Nbr r r r r% r r rj_N _N _N _N _N5/ _N _N _NDL
 L
 L
 L
 L
5 L
 L
 L
^
dJ dJ dJ dJ dJ% dJ dJ dJN' ' ' ' 'k ' ' '$' ' ' ' '[ ' ' '$U U U U U U U Upt% t% t% t% t% t% t% t%n' ' ' ' 'z ' ' '$' ' ' ' 'j ' ' '$^ ^ ^ ^ ^ ^ ^ ^Bf
 f
 f
 f
 f
Jt f
 f
 f
Rp
 p
 p
 p
 p
*mT p
 p
 p
f
 
 
 
 
z4 
 
 
2N N N N Nj$ N N Nbx
 x
 x
 x
 x
:}m x
 x
 x
v * * * * *J} * * *D - - - - -: - - -: / / / / /J / / /:v v v v v% v v vr; ; ;   ,m m m m`	7 	7 	7 	7 	7 	7s    A A! A!