§
    ¥”jG ã                   óx  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZmZ ddlmZ ddlmZmZmZmZmZmZ 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%m&Z& ddl'm(Z( dd	l)m*Z*m+Z+ dd
l,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 	 ddl3m4Z4 n# e5$ r	 ddlm4Z4 Y nw xY wddl6Z6ddl7Z7ddl8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z? ddl:m@ZA ddl:mBZC ddlDmEZEmFZFmGZG dej        dej        fd„ZH	 	 	 	 dNdeIdeeI         deIdeIdeeI         deeeI         eJf         fd„ZB	 dOdeIdeIdeIdeeIeJf         fd„Z@dZK eL¦   «         ZM ejN        eO¦  «        ZP ed g d!¢¦  «        ZQ ejR        d"¦  «        jS        ZT G d#„ d$e!¦  «        ZU G d%„ d&e!¦  «        ZV G d'„ d(e6jW        ¦  «        ZX G d)„ d*¦  «        ZY G d+„ d,eY¦  «        ZZ G d-„ d.e6j[        ¦  «        Z\ G d/„ d0e]¦  «        Z^ G d1„ d2¦  «        Z_ G d3„ d4¦  «        Z` G d5„ d6¦  «        Za G d7„ d8ea¦  «        Zb	 dPd:eeIejc        eI         f         d;eJd<edee         fd=„Zdd>eee         ddfd?„Zf	 dPd:eeIejc        eI         f         d;eJdee         fd@„ZgdAedeeI         fdB„ZhdQdAedCeJdDeidefdE„Zj	 	 dRdFeeI         dCeJdGeJdHeJdeeI         f
dI„ZkdJedKeddfdL„ZldSdM„Zm em¦   «          dS )Tap  A library for reading and converting SVG files.

This module provides a converter from SVG to ReportLab Graphics (RLG) drawings.
It handles basic shapes, paths, and simple text elements.

The intended usage is either as a module within other projects or from the
command-line for converting SVG files to PDF. It also supports gzip-compressed
SVG files with the .svgz extension.

Example:
    To convert an SVG file to a ReportLab Drawing object::

        from svglib.svglib import svg2rlg
        drawing = svg2rlg("foo.svg")

    To convert an SVG file to a PDF from the command-line::

        $ python -m svglib foo.svg
é    N)ÚdefaultdictÚ
namedtuple)ÚBytesIO)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚImage)Ú
_CLOSEPATHÚCircleÚDrawingÚEllipseÚGroupr   ÚLineÚPathÚPolygonÚPolyLineÚRectÚ
SolidShapeÚString)Úcolors)ÚpicaÚtoLength)ÚstringWidth)ÚFILL_EVEN_ODDÚFILL_NON_ZERO)ÚPDFImage)Úmmult)Úetreeé   )ÚDEFAULT_FONT_NAMEÚDEFAULT_FONT_SIZEÚDEFAULT_FONT_STYLEÚDEFAULT_FONT_WEIGHTÚget_global_font_map)Ú	find_font)Úregister_font)Úbezier_arc_from_end_pointsÚconvert_quadratic_to_cubic_pathÚnormalise_svg_pathÚimageÚreturnc                 óX   — | j         dk    rd| j        v r|                      d¦  «        S | S )a¼  Convert a palette-based image with transparency to RGBA format.

    This function checks if a PIL Image is in palette mode ('P') and has
    transparency information. If so, it converts the image to RGBA to prevent
    potential warnings or errors during processing.

    Args:
        image: The input PIL Image object.

    Returns:
        The converted RGBA PIL Image object if changes were made, otherwise
        the original image.
    ÚPÚtransparencyÚRGBA)ÚmodeÚinfoÚconvert)r-   s    ú\/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/svglib/svglib.pyÚ_convert_palette_to_rgbar7   Z   s4   € ð „z�SÒÐ˜^¨u¬zÐ9Ð9à�}Š}˜VÑ$Ô$Ð$Ø€Ló    ÚnormalÚ	font_nameÚ	font_pathÚweightÚstyleÚrlgFontNamec                 ó(   — t          | ||||¦  «        S )ao  Register a font for use in SVG processing.

    This function serves as a backward-compatible wrapper for the font
    registration logic defined in the `svglib.fonts` module.

    Args:
        font_name: The name of the font to register.
        font_path: The file path to the font file (optional).
        weight: The font weight (e.g., 'normal', 'bold').
        style: The font style (e.g., 'normal', 'italic').
        rlgFontName: The ReportLab-specific font name (optional).

    Returns:
        A tuple containing the registered font name and a boolean indicating
        if the registration was successful.
    )Ú_fonts_register_font)r:   r;   r<   r=   r>   s        r6   r)   r)   n   s   € õ.   	¨9°f¸eÀ[ÑQÔQÐQr8   c                 ó$   — t          | ||¦  «        S )a¹  Find a registered font by its properties.

    This function serves as a backward-compatible wrapper for the font
    finding logic defined in the `svglib.fonts` module.

    Args:
        font_name: The name of the font to find.
        weight: The font weight to match.
        style: The font style to match.

    Returns:
        A tuple containing the matched font name and a boolean indicating
        if an exact match was found.
    )Ú_fonts_find_font)r:   r<   r=   s      r6   r(   r(   ˆ   s   € õ" ˜I v¨uÑ5Ô5Ð5r8   z$http://www.w3.org/XML/1998/namespaceÚBox)ÚxÚyÚwidthÚheightz[^ \t\r\n\f]+c                   óX   ‡ — e Zd ZdZdededdfˆ fd„Zdededeeef         fˆ fd„Zˆ xZ	S )ÚNoStrokePathzÃA Path object that never has a stroke width.

    This class is used to create filled shapes from unclosed paths, where
    only the fill should be rendered and the stroke should be ignored.
    ÚargsÚkwargsr.   Nc                 óÐ   •— |                      dd ¦  «        } t          ¦   «         j        |i |¤Ž |r3| j                             t          j        |j        ¦  «        ¦  «         d S d S )NÚ	copy_from)ÚpopÚsuperÚ__init__Ú__dict__ÚupdateÚcopyÚdeepcopy)ÚselfrJ   rK   rM   Ú	__class__s       €r6   rP   zNoStrokePath.__init__¯   sp   ø€ Ø—J’J˜{¨DÑ1Ô1ˆ	Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Øð 	DØŒM× Ò ¥¤¨yÔ/AÑ!BÔ!BÑCÔCÐCÐCÐCð	Dð 	Dr8   c                 ó^   •—  t          ¦   «         j        |i |¤Ž}d|v rd|d<   d|v rd|d<   |S )zAReturn the properties of the path, ensuring no stroke is applied.ÚstrokeWidthr   ÚstrokeColorN)rO   ÚgetProperties)rU   rJ   rK   ÚpropsrV   s       €r6   rZ   zNoStrokePath.getPropertiesµ   sM   ø€ à%•‘”Ô% tÐ6¨vÐ6Ð6ˆØ˜EÐ!Ð!Ø#$ˆE�-Ñ Ø˜EÐ!Ð!Ø#'ˆE�-Ñ Øˆr8   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rP   r   ÚstrrZ   Ú__classcell__©rV   s   @r6   rI   rI   ¨   s    ø€ € € € € ðð ðD˜cð D¨Sð D°Tð Dð Dð Dð Dð Dð Dð 3ð °#ð ¸$¸sÀC¸x¼.ð ð ð ð ð ð ð ð ð ð r8   rI   c                   óJ   — e Zd ZdZdededdfd„Zdededeeef         fd„ZdS )ÚClippingPathz«A Path object used for defining a clipping region.

    This path will not be rendered with a fill or stroke but will be used
    as a clipping mask for other shapes.
    rJ   rK   r.   Nc                 óÐ   — |                      dd ¦  «        }t          j        | g|¢R i |¤Ž |r1| j                             t          j        |j        ¦  «        ¦  «         d| _        d S )NrM   r"   )rN   r   rP   rQ   rR   rS   rT   Ú
isClipPath)rU   rJ   rK   rM   s       r6   rP   zClippingPath.__init__Æ   sl   € Ø—J’J˜{¨DÑ1Ô1ˆ	ÝŒ�dÐ,˜TÐ,Ð,Ð, VÐ,Ð,Ð,Øð 	DØŒM× Ò ¥¤¨yÔ/AÑ!BÔ!BÑCÔCÐCØˆŒˆˆr8   c                 óT   — t          j        | g|¢R i |¤Ž}d|v rd|d<   d|v rd|d<   |S )z>Return the properties of the path, ensuring no fill or stroke.Ú	fillColorNrY   )r   rZ   )rU   rJ   rK   r[   s       r6   rZ   zClippingPath.getPropertiesÍ   sQ   € åÔ" 4Ð9¨$Ð9Ð9Ð9°&Ð9Ð9ˆØ˜%ÐÐØ!%ˆE�+ÑØ˜EÐ!Ð!Ø#'ˆE�-Ñ Øˆr8   )	r\   r]   r^   r_   r   rP   r   r`   rZ   © r8   r6   rd   rd   ¿   sx   € € € € € ðð ð˜cð ¨Sð °Tð ð ð ð ð 3ð °#ð ¸$¸sÀC¸x¼.ð ð ð ð ð ð r8   rd   c                   ó"   — e Zd ZdZdeddfd„ZdS )Ú
CSSMatcherz?A CSS matcher to handle styles defined in SVG <style> elements.Ústyle_contentr.   Nc                 ór  — t          j        |dd¬¦  «        }|D ]œ}|j        r|j        dk    rŒt	          j        |j        ¦  «        }t          j        |j        ¦  «        }d„ t          j        |j        ¦  «                             d¦  «        D ¦   «         }||f}|D ]}|  	                    ||¦  «         ŒŒ�dS )zŠParse a string of CSS rules and add them to the matcher.

        Args:
            style_content: A string containing CSS rules.
        T)Úskip_commentsÚskip_whitespacezat-rulec                 óÈ   — i | ]_}d |v ¯|                      d ¦  «        d                              ¦   «         |                      d ¦  «        d                              ¦   «         “Œ`S )ú:r   r"   )ÚsplitÚstrip)Ú.0Úattrs     r6   ú
<dictcomp>z)CSSMatcher.add_styles.<locals>.<dictcomp>é   sa   € ð ð ð àØ˜$�;�;ð —
’
˜3‘” Ô"×(Ò(Ñ*Ô*¨D¯JªJ°s©O¬O¸AÔ,>×,DÒ,DÑ,FÔ,Fà�;�;r8   ú;N)
Útinycss2Úparse_stylesheetÚpreludeÚtypeÚ
cssselect2Úcompile_selector_listÚ	serializeÚcontentrr   Úadd_selector)	rU   rl   ÚrulesÚruleÚ	selectorsÚselector_stringÚcontent_dictÚpayloadÚselectors	            r6   Ú
add_styleszCSSMatcher.add_stylesÚ   sì   € õ Ô)Ø¨¸tð
ñ 
ô 
ˆð ð 	5ð 	5ˆDØ”<ð  4¤9°	Ò#9Ð#9ØÝ"Ô8¸¼ÑFÔFˆIÝ&Ô0°´Ñ>Ô>ˆOðð å$Ô.¨t¬|Ñ<Ô<×BÒBÀ3ÑGÔGðñ ô ˆLð
 '¨Ð5ˆGØ%ð 5ð 5�Ø×!Ò! (¨GÑ4Ô4Ð4Ð4ð5ð	5ð 	5r8   )r\   r]   r^   r_   r`   rˆ   ri   r8   r6   rk   rk   ×   s<   € € € € € ØIÐIð5¨ð 5°ð 5ð 5ð 5ð 5ð 5ð 5r8   rk   c                   óæ   — e Zd ZdZdd„Zdee         ddfd„Zdede	eef         fd„Z
d	ed
edefd„Zd	ede	eef         fd„Zdedefd„Zdedeeeeeeedf         f         f                  fd„ZdS )ÚAttributeConverterzHAn abstract class for converting SVG attributes to ReportLab properties.r.   Nc                 ó"   — d | _         d | _        d S ©N)Ú	css_rulesÚmain_box©rU   s    r6   rP   zAttributeConverter.__init__ù   s   € Ø/3ˆŒØ'+ˆŒˆˆr8   rŽ   c                 ó   — || _         dS )z“Set the main viewbox for resolving percentage-based units.

        Args:
            main_box: A Box tuple representing the main viewbox.
        N)rŽ   )rU   rŽ   s     r6   Úset_boxzAttributeConverter.set_boxý   s   € ð !ˆŒˆˆr8   Úlinec                 óÊ   — |                      d¦  «        }d„ |D ¦   «         }d„ |D ¦   «         }i }|D ]0}|                      d¦  «        \  }}d„ ||fD ¦   «         \  }}|||<   Œ1|S )zÙParse a compound attribute string into a dictionary.

        Args:
            line: A string of semicolon-separated style attributes.

        Returns:
            A dictionary of attribute key-value pairs.
        rw   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS ri   ©rs   ©rt   Úas     r6   ú
<listcomp>z;AttributeConverter.parseMultiAttributes.<locals>.<listcomp>  s    € Ð*Ð*Ð*˜q�—’‘”Ð*Ð*Ð*r8   c                 ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS ©r   )Úlenr–   s     r6   r˜   z;AttributeConverter.parseMultiAttributes.<locals>.<listcomp>  s#   € Ð0Ð0Ð0�q¥S¨¡V¤V¨a¢Z Z� Z Z Zr8   rq   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S rŒ   r•   )rt   Úss     r6   ú	<genexpr>z:AttributeConverter.parseMultiAttributes.<locals>.<genexpr>  s*   è è € Ð.Ð. !�A—G’G‘I”IÐ.Ð.Ð.Ð.Ð.Ð.r8   )rr   )rU   r’   ÚattrsÚ	new_attrsr—   ÚkÚvs          r6   ÚparseMultiAttributesz'AttributeConverter.parseMultiAttributes  sŒ   € ð —
’
˜3‘”ˆØ*Ð* EÐ*Ñ*Ô*ˆØ0Ð0˜EÐ0Ñ0Ô0ˆàˆ	Øð 	ð 	ˆAØ—7’7˜3‘<”<‰DˆAˆqØ.Ð.¨¨1 vÐ.Ñ.Ô.‰DˆAˆqØˆI�a‰LˆLàÐr8   ÚsvgNodeÚnamec                 óD  — |j                              dd¦  «        s«| j        �|                     | j        ¦  «         |j                              d¦  «        rp|                      |j                              d¦  «        ¦  «        }|                     ¦   «         D ]$\  }}|                     d¦  «        s
||j         |<   Œ%d|j         d<   |j                              |d¦  «                             ¦   «         }|r|dk    r|S |j        �|  	                    |j        |¦  «        S dS )	a´  Find an attribute value, searching the node and its ancestors.

        The search order is:
        1. The node's own attributes.
        2. The node's 'style' attribute.
        3. The node's parent, recursively.

        Args:
            svgNode: The lxml node to start the search from.
            name: The name of the attribute to find.

        Returns:
            The attribute value, or an empty string if not found.
        Ú__rules_appliedFNr=   ú-Ú1Ú Úinherit)
ÚattribÚgetr�   Úapply_rulesr£   ÚitemsÚ
startswithrs   ÚparentÚfindAttr)rU   r¤   r¥   rŸ   ÚkeyÚvalÚ
attr_values          r6   r²   zAttributeConverter.findAttr  s  € ð Œ~×!Ò!Ð"3°UÑ;Ô;ð 	8àŒ~Ð)Ø×#Ò# D¤NÑ3Ô3Ð3àŒ~×!Ò! 'Ñ*Ô*ð 8Ø×1Ò1°'´.×2DÒ2DÀWÑ2MÔ2MÑNÔN�Ø %§¢¡¤ð 2ð 2‘H�C˜àŸ>š>¨#Ñ.Ô.ð 2Ø.1˜œ sÑ+øØ47�”Ð0Ñ1à”^×'Ò'¨¨bÑ1Ô1×7Ò7Ñ9Ô9ˆ
àð 	˜*¨	Ò1Ð1ØÐØŒ>Ð%Ø—=’= ¤°Ñ6Ô6Ð6Øˆrr8   c                 ó¨  — i }t          |                     ¦   «         ¦  «        dk    r:|                     |                      |                     ¦   «         ¦  «        ¦  «         |j                             d¦  «        }|r*|                      |¦  «        }|                     |¦  «         |j                             ¦   «         D ]\  }}|dk    r|||<   Œ|S )zÞReturn a dictionary of all attributes of a node and its ancestors.

        Args:
            svgNode: The lxml node to get attributes from.

        Returns:
            A dictionary of all applicable attributes.
        Úgr=   )Ú	node_nameÚ	getparentrR   ÚgetAllAttributesr¬   r­   r£   r¯   )rU   r¤   Údictr=   Údr³   Úvalues          r6   rº   z#AttributeConverter.getAllAttributes>  sÌ   € ð ˆå�W×&Ò&Ñ(Ô(Ñ)Ô)¨SÒ0Ð0Ø�KŠK˜×-Ò-¨g×.?Ò.?Ñ.AÔ.AÑBÔBÑCÔCÐCà”×"Ò" 7Ñ+Ô+ˆØð 	Ø×)Ò)¨%Ñ0Ô0ˆAØ�KŠK˜‰NŒNˆNà!œ.×.Ò.Ñ0Ô0ð 	"ð 	"‰JˆC�Ø�gŠ~ˆ~Ø!��S‘	øàˆr8   ÚsvgAttrc                 ó   — |S )z!Return the attribute value as is.ri   ©rU   r¾   s     r6   ÚidzAttributeConverter.idW  s   € àˆr8   .c           	      ó  — |                      ¦   «         }|dd…         }g }g }t          |¦  «        D ]\  }}|dv r|                     |¦  «         Œt          dt	          |¦  «        d¦  «        D ]þ}||         ||dz            }	}||dz   |	…         }
|
                      ¦   «         }
|
                     dd¦  «        }
t          j        dd|
¦  «        }
	 d|
v r@|                     t          d	„ |
 	                    d¦  «        D ¦   «         ¦  «        ¦  «         n"|                     t          |
¦  «        ¦  «         n# t          $ r Y ŒÖw xY w|d|…         d|	|z
  dz   z  z   ||	dz   d…         z   }Œÿ|                     dd¦  «         	                    ¦   «         }t	          |¦  «        t	          |¦  «        k    rt                               d
|¦  «         g S g }t          |¦  «        D ]"\  }}|                     |||         f¦  «         Œ#|S )aÔ  Parse a transform attribute string into a list of operations.

        Args:
            svgAttr: The SVG transform attribute string.

        Returns:
            A list of tuples, where each tuple contains the transform
            operation and its arguments.

        Example:
            >>> converter = AttributeConverter()
            >>> converter.convertTransform("scale(2) translate(10,20)")
            [('scale', 2.0), ('translate', (10.0, 20.0))]
        Nz()r   é   r"   ú,ú z[ ]+c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rŒ   ©Úfloat)rt   Únums     r6   rž   z6AttributeConverter.convertTransform.<locals>.<genexpr>}  s(   è è € Ð(RÐ(R¸­¨s©¬Ð(RÐ(RÐ(RÐ(RÐ(RÐ(Rr8   z'Unable to parse transform expression %r)rs   Ú	enumerateÚappendÚranger›   ÚreplaceÚreÚsubÚtuplerr   rÈ   Ú
ValueErrorÚloggerÚwarning)rU   r¾   r’   ÚopsÚbracketsÚindicesÚiÚlinÚbiÚbjÚsublineÚops_listÚresultÚops                 r6   ÚconvertTransformz#AttributeConverter.convertTransform[  s  € ð$ �}Š}‰Œˆà˜˜˜”7ˆØ ˆØ9;ˆÝ ‘o”oð 	#ð 	#‰FˆAˆsØ�dˆ{ˆ{Ø—’ Ñ"Ô"Ð"øÝ�q�#˜h™-œ-¨Ñ+Ô+ð 	Að 	AˆAØ˜a”[ (¨1¨q©5¤/�ˆBØ˜2 ™6 B˜;Ô'ˆGØ—m’m‘o”oˆGØ—o’o c¨3Ñ/Ô/ˆGÝ”f˜V S¨'Ñ2Ô2ˆGðØ˜'�>�>Ø—N’N¥5Ð(RÐ(R¸w¿}º}ÈSÑ?QÔ?QÐ(RÑ(RÔ(RÑ#RÔ#RÑSÔSÐSÐSà—N’N¥5¨¡>¤>Ñ2Ô2Ð2øøÝð ð ð Ø�ðøøøà�c�r�c”(˜S B¨¡G¨a¡KÑ0Ñ0°3°r¸A±v°x°x´=Ñ@ˆCˆCØ!Ÿkšk¨#¨sÑ3Ô3×9Ò9Ñ;Ô;ˆåˆx‰=Œ=�C ™LœLÒ(Ð(Ý�NŠNÐDÀgÑNÔNÐNØˆIàˆÝ˜xÑ(Ô(ð 	,ð 	,‰EˆAˆrØ�MŠM˜2˜w qœzÐ*Ñ+Ô+Ð+Ð+àˆs   ÃA&D9Ä9
EÅE©r.   N)r\   r]   r^   r_   rP   r	   rC   r‘   r`   r   r£   r   r²   rº   rÁ   r   r
   r   rÈ   rß   ri   r8   r6   rŠ   rŠ   ö   s<  € € € € € ØRÐRð,ð ,ð ,ð ,ð! ¨¤ð !°$ð !ð !ð !ð !ð¨ð °°c¸3°h´ð ð ð ð ð*" ð "¨3ð "°3ð "ð "ð "ð "ðH¨ð °°S¸#°X´ð ð ð ð ð2˜#ð  #ð ð ð ð ð2àð2ð 
ˆe�C˜˜u e¨E°3¨JÔ&7Ð7Ô8Ð8Ô9Ô	:ð2ð 2ð 2ð 2ð 2ð 2r8   rŠ   c                   ó  ‡ — e Zd ZdZ	 	 ddee         dee         ddfˆ fd„Zededefd„¦   «         Zed	e	de
e	         fd
„¦   «         Zeddfde	dedee	         dedeee
e         f         f
d„Zde	de
eee
e         f                  fd„Zde	defd„Zde	deee	f         fd„Zde	defd„Zde	defd„Zde	defd„Zde	de
eee
e         f                  fd„Zde	deee
e         f         fd„Z	 	 ddee	         de	de	de	fd„Zˆ xZS ) ÚSvg2RlgAttributeConverterz=A concrete attribute converter for SVG to ReportLab Graphics.NÚcolor_converterÚfont_mapr.   c                 óŽ   •— t          ¦   «                              ¦   «          |p| j        | _        |pt	          ¦   «         | _        d S rŒ   )rO   rP   Úidentity_color_converterrã   r'   Ú	_font_map)rU   rã   rä   rV   s      €r6   rP   z"Svg2RlgAttributeConverter.__init__“  sB   ø€ õ
 	‰Œ×ÒÑÔÐØ.ÐO°$Ô2OˆÔØ!Ð:Õ%8Ñ%:Ô%:ˆŒˆˆr8   Úcc                 ó   — | S )z7A default color converter that returns the color as is.ri   )rè   s    r6   ræ   z2Svg2RlgAttributeConverter.identity_color_converterœ  s	   € ð ˆr8   ru   c                 óv   — t          j        |                      ¦   «                              dd¦  «        ¦  «        S )z)Split a string of attributes into a list.rÄ   rÅ   )Úshlexrr   rs   rÍ   )ru   s    r6   Úsplit_attr_listz)Svg2RlgAttributeConverter.split_attr_list¡  s,   € õ Œ{˜4Ÿ:š:™<œ<×/Ò/°°SÑ9Ô9Ñ:Ô:Ð:r8   ç        r¾   Úem_baseÚ	attr_nameÚdefaultc                 ó´  ‡ ‡‡‡— |                      dd¦  «                             ¦   «         }|s‰S d|v rmˆˆˆˆ fd„‰                      |¦  «        D ¦   «         }g }|D ]B}t          |t          ¦  «        r|                     |¦  «         Œ-|                     |¦  «         ŒC|S |                     d¦  «        rÜ‰ j        €1t           
                    d¦  «         t          |dd…         ¦  «        S ‰€1t           
                    d¦  «         t          |dd…         ¦  «        S ‰d	v r‰ j        j        }	nC‰d
v r‰ j        j        }	n2t           
                    d‰¦  «         t          |dd…         ¦  «        S t          |dd…         ¦  «        dz  |	z  S |                     d¦  «        rt          |dd…         ¦  «        t          z  S |                     d¦  «        rt          |dd…         ¦  «        S |                     d¦  «        rt          |dd…         ¦  «        ‰z  S |                     d¦  «        rt          |dd…         ¦  «        dz  S |                     d¦  «        rt          |dd…         ¦  «        ‰z  dz  S |                     d¦  «        rt          |dd…         ¦  «        ‰z  dz  S |                     ¦   «         }t          |¦  «        }
|
S )a¿  Convert an SVG length string to points.

        Args:
            svgAttr: The SVG length string (e.g., "10px", "5em").
            em_base: The base font size for 'em' units.
            attr_name: The name of the attribute being converted.
            default: The default value to return if the string is empty.

        Returns:
            The length in points as a float, or a list of floats for
            space-separated values.
        rÄ   rÅ   c                 óB   •— g | ]}‰                      |‰‰‰¬ ¦  «        ‘ŒS ))rî   rï   rð   ©ÚconvertLength)rt   r´   rï   rð   rî   rU   s     €€€€r6   r˜   z;Svg2RlgAttributeConverter.convertLength.<locals>.<listcomp>¾  sI   ø€ ð ð ð ð ð ×"Ò"Ø °IÀwð #ñ ô ðð ð r8   ú%Nz4Unable to resolve percentage unit without a main boxéÿÿÿÿz?Unable to resolve percentage unit without knowing the node name)rD   ÚcxÚx1Úx2rF   )rE   ÚcyÚy1Úy2rG   z.Unable to detect if node %r is width or heightéd   ÚpcéþÿÿÿÚptÚemÚpxg      è?ÚexrÃ   Úch)rÍ   rs   rì   Ú
isinstanceÚlistÚextendrË   ÚendswithrŽ   rÒ   ÚerrorrÈ   rF   rG   r   r   )rU   r¾   rî   rï   rð   Útextr¯   rÝ   ÚitemÚfullÚlengths   ` ```      r6   rô   z'Svg2RlgAttributeConverter.convertLength¦  s  øøøø€ ð& �Š˜s CÑ(Ô(×.Ò.Ñ0Ô0ˆØð 	ØˆNØ�$ˆ;ˆ;ðð ð ð ð ð ð ð  ×/Ò/°Ñ5Ô5ð	ñ ô ˆEð #%ˆFØð (ð (�Ý˜d¥DÑ)Ô)ð (Ø—M’M $Ñ'Ô'Ð'Ð'à—M’M $Ñ'Ô'Ð'Ð'ØˆMà�=Š=˜ÑÔð "	2ØŒ}Ð$Ý—’ÐSÑTÔTÐTÝ˜T # 2 #œYÑ'Ô'Ð'ØÐ Ý—’ØUñô ð õ ˜T # 2 #œYÑ'Ô'Ð'ØÐ<Ð<Ð<Ø”}Ô*��ØÐ?Ð?Ð?Ø”}Ô+��å—’ØDÀiñô ð õ ˜T # 2 #œYÑ'Ô'Ð'Ý˜˜c˜r˜cœÑ#Ô# cÑ)¨DÑ0Ð0Ø�]Š]˜4Ñ Ô ð 	2Ý˜˜c˜r˜cœÑ#Ô#¥dÑ*Ð*Ø�]Š]˜4Ñ Ô ð 	2Ý˜˜c˜r˜cœÑ#Ô#Ð#Ø�]Š]˜4Ñ Ô ð 	2Ý˜˜c˜r˜cœÑ#Ô# gÑ-Ð-Ø�]Š]˜4Ñ Ô ð 		2Ý˜˜c˜r˜cœÑ#Ô# dÑ*Ð*Ø�]Š]˜4Ñ Ô ð 	2õ ˜˜c˜r˜cœÑ#Ô# gÑ-°Ñ1Ð1Ø�]Š]˜4Ñ Ô ð 	2õ ˜˜c˜r˜cœÑ#Ô# gÑ-°Ñ1Ð1à�zŠz‰|Œ|ˆÝ˜$‘”ˆàˆr8   c                 óF   ‡ — ˆ fd„‰                       |¦  «        D ¦   «         S )z@Convert a space-separated list of lengths into a list of floats.c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS ri   ró   )rt   r—   rU   s     €r6   r˜   z?Svg2RlgAttributeConverter.convertLengthList.<locals>.<listcomp>÷  s'   ø€ ÐMÐMÐM¨!�×"Ò" 1Ñ%Ô%ÐMÐMÐMr8   )rì   rÀ   s   ` r6   ÚconvertLengthListz+Svg2RlgAttributeConverter.convertLengthListõ  s+   ø€ àMÐMÐMÐM¨t×/CÒ/CÀGÑ/LÔ/LÐMÑMÔMÐMr8   c                 ó    — t          |¦  «        S )z%Convert an opacity string to a float.rÇ   rÀ   s     r6   ÚconvertOpacityz(Svg2RlgAttributeConverter.convertOpacityù  s   € å�W‰~Œ~Ðr8   c                 óH   — t           t          dœ                     |d¦  «        S )z9Convert an SVG fill-rule string to a ReportLab fill rule.)ÚnonzeroÚevenoddrª   )r   r   r­   rÀ   s     r6   ÚconvertFillRulez)Svg2RlgAttributeConverter.convertFillRuleý  s*   € õ %Ý$ð
ð 
÷ Š#ˆg�rÑ
Ô
ð	r8   c                 ó:  — |}|r|dk    rdS |dk    rdS t          |¦  «        dv r5|d         dk    r)t          j        |t          |¦  «        dk    ¬¦  «        }�nt          |¦  «        d	k    rE|d         dk    r9t          j        dd
|d         z  z   d
|d
         z  z   d
|d         z  z   ¦  «        }nµt          |¦  «        dk    rS|d         dk    rGt          j        dd
|d         z  z   d
|d
         z  z   d
|d         z  z   d
|d	         z  z   d¬¦  «        }nOt          j        |¦  «        }|€9	 t	          t          |¦  «                             ¦   «         }n# t          $ r Y nw xY w|€t                               d|¦  «         n|  	                    |¦  «        S dS )zîConvert an SVG color string to a ReportLab color object.

        Args:
            svgAttr: The SVG color string (e.g., "#FF0000", "blue").

        Returns:
            A ReportLab color object, or None if the color is invalid.
        ÚnoneNÚcurrentColor)é   é	   r   ú#r  )ÚhasAlphaé   rÃ   r"   é   é   TzCan't handle color: %s)
r›   r   ÚHexColorÚcssParseÚgetattrÚcloneÚAttributeErrorrÒ   rÓ   rã   )rU   r¾   r
  Úcolors       r6   ÚconvertColorz&Svg2RlgAttributeConverter.convertColor  s¹  € ð ˆØð 	�t˜v’~�~Ø�4à�>Ò!Ð!Ø!�>Ýˆt‰9Œ9˜ÐÐ 4¨¤7¨c¢> >Ý”O Dµ3°t±9´9À²>ÐBÑBÔBˆE‰EÝ�‰YŒY˜!Š^ˆ^  Q¤¨3¢ Ý”O C¨!¨d°1¬g©+Ñ$5¸¸DÀ¼G¹Ñ$CÀaÈ$ÈqÌ'ÁkÑ$QÑRÔRˆEˆEÝ�‰YŒY˜!Š^ˆ^  Q¤¨3¢ Ý”OØ�a˜$˜qœ'‘kÑ! A¨¨Q¬¡KÑ/°!°d¸1´g±+Ñ=ÀÀDÈÄGÁÑKØðñ ô ˆEˆEõ ”O DÑ)Ô)ˆEØˆ}ðÝ#¥F¨DÑ1Ô1×7Ò7Ñ9Ô9�E�EøÝ%ð ð ð Ø�Dðøøøàˆ=Ý�NŠNÐ3°TÑ:Ô:Ð:Ð:à×'Ò'¨Ñ.Ô.Ð.Øˆts   Ä0'E Å
E%Å$E%c                 ó   — ddddœ|         S )z?Convert an SVG stroke-linejoin string to a ReportLab line join.r   r"   rÃ   )ÚmiterÚroundÚbevelri   rÀ   s     r6   ÚconvertLineJoinz)Svg2RlgAttributeConverter.convertLineJoin+  s   € à Q°Ð3Ð3°GÔ<Ð<r8   c                 ó   — ddddœ|         S )z=Convert an SVG stroke-linecap string to a ReportLab line cap.r   r"   rÃ   )Úbuttr*  Úsquareri   rÀ   s     r6   ÚconvertLineCapz(Svg2RlgAttributeConverter.convertLineCap/  s   € à A°Ð3Ð3°GÔ<Ð<r8   c                 ó0   — |                       |¦  «        }|S )z<Convert an SVG stroke-dasharray string to a list of lengths.)r  )rU   r¾   ÚstrokeDashArrays      r6   ÚconvertDashArrayz*Svg2RlgAttributeConverter.convertDashArray3  s   € à×0Ò0°Ñ9Ô9ˆØÐr8   c                 ó0   — |                       |¦  «        }|S )z4Convert an SVG stroke-dashoffset string to a length.ró   )rU   r¾   ÚstrokeDashOffsets      r6   ÚconvertDashOffsetz+Svg2RlgAttributeConverter.convertDashOffset8  s   € à×-Ò-¨gÑ6Ô6ÐØÐr8   r9   ÚfontAttrÚ
weightAttrÚ	styleAttrc                 ó"  — |sdS |                       |¦  «        }g }|D ]>}| j                             |||¦  «        \  }}|r|c S |r|                     |¦  «         Œ?|r|d         S t                               d|› d|› d|› �¦  «         t          S )aG  Convert an SVG font-family string to a registered font name.

        Args:
            fontAttr: The SVG font-family attribute string.
            weightAttr: The font-weight attribute string.
            styleAttr: The font-style attribute string.

        Returns:
            The best-matched registered font name.
        rª   r   z0Unable to find a suitable font for 'font-family:z
', weight:z, style:)rì   rç   r(   rË   rÒ   rÓ   r#   )rU   r7  r8  r9  Ú
font_namesÚnon_exact_matchesr:   Úexacts           r6   ÚconvertFontFamilyz+Svg2RlgAttributeConverter.convertFontFamily=  së   € ð  ð 	Ø�2à×)Ò)¨(Ñ3Ô3ˆ
àÐØ#ð 	4ð 	4ˆIØ#œ~×7Ò7Ø˜: yñ ô  ÑˆI�uð ð 4Ø Ð Ð Ð Øð 4Ø!×(Ò(¨Ñ3Ô3Ð3øØð 	%Ø$ QÔ'Ð'å�NŠNð:À8ð :ð :Ø$ð:ð :Ø.7ð:ð :ñô ð õ %Ð$r8   ©NN©r9   r9   )r\   r]   r^   r_   r	   r   rP   Ústaticmethodræ   r`   r   rì   r$   rÈ   r   rô   r  r  Úintr  r'  r,  r0  r3  r6  r>  ra   rb   s   @r6   râ   râ   �  sã  ø€ € € € € ØGÐGð *.Ø"&ð;ð ;à! #œð;ð ˜3”-ð;ð 
ð	;ð ;ð ;ð ;ð ;ð ;ð ð Cð ¨Cð ð ð ñ „\ðð ð;˜cð ; d¨3¤ið ;ð ;ð ;ñ „\ð;ð +Ø#'ØðMð MàðMð ðMð ˜C”=ð	Mð
 ðMð 
ˆu�d˜5”kÐ!Ô	"ðMð Mð Mð Mð^N¨ð N°°e¸EÀ4ÈÄ;Ð<NÔ6OÔ1Pð Nð Nð Nð Nð cð ¨eð ð ð ð ð sð ¨u°S¸#°X¬ð ð ð ð ð% Cð %¨Cð %ð %ð %ð %ðN= sð =¨sð =ð =ð =ð =ð= cð =¨cð =ð =ð =ð =ð¨ð °°U¸5À$ÀuÄ+Ð;MÔ5NÔ0Oð ð ð ð ð
 ¨ð  °°u¸dÀ5¼kÐ7IÔ1Jð  ð  ð  ð  ð #Ø!ð	%%ð %%à˜3”-ð%%ð ð%%ð ð	%%ð
 
ð%%ð %%ð %%ð %%ð %%ð %%ð %%ð %%r8   râ   c                   ól   ‡ — e Zd ZdZdededdfˆ fd„Zdefd„Zdedefd	„Zdedefd
„Z	deddfd„Z
ˆ xZS )ÚNodeTrackerzÊA wrapper for lxml nodes to track attribute usage.

    This class wraps an lxml node and keeps a record of which attributes
    have been accessed, which is useful for debugging unused attributes.
    rJ   rK   r.   Nc                 óH   •—  t          ¦   «         j        |i |¤Ž g | _        d S rŒ   )rO   rP   Ú	usedAttrs)rU   rJ   rK   rV   s      €r6   rP   zNodeTracker.__init__l  s*   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ø$&ˆŒˆˆr8   c                 ó   — d| j         › d�S )Nz<NodeTracker for node ú>)Úetree_elementr�   s    r6   Ú__repr__zNodeTracker.__repr__p  s   € Ø=¨Ô(:Ð=Ð=Ð=Ð=r8   r¥   c                 óˆ   — || j         vr| j                              |¦  «         | j        j                             |d¦  «        S )z8Get an attribute value and record that it has been used.rª   )rF  rË   rI  r¬   r­   ©rU   r¥   s     r6   ÚgetAttributezNodeTracker.getAttributes  sA   € à�t”~Ð%Ð%ØŒN×!Ò! $Ñ'Ô'Ð'ØÔ!Ô(×,Ò,¨T°2Ñ6Ô6Ð6r8   c                 ó,   — t          | j        |¦  «        S )z2Forward attribute access to the wrapped lxml node.)r#  rI  rL  s     r6   Ú__getattr__zNodeTracker.__getattr__y  s   € å�tÔ)¨4Ñ0Ô0Ð0r8   r�   c                 ó   — |                      | ¦  «        }|D ]J}|d         d         }|                     ¦   «         D ]%\  }}	 || j        j        |<   Œ# t          $ r Y Œ"w xY wŒK| j                             dd¦  «         dS )zƒApply CSS rules to the wrapped node.

        Args:
            rules: A CSSMatcher object containing the styles to apply.
        r  r"   r§   r©   N)Úmatchr¯   rI  r¬   rÑ   Úset)rU   r�   ÚmatchesrQ  Ú	attr_dictru   r´   s          r6   r®   zNodeTracker.apply_rules}  s­   € ð —+’+˜dÑ#Ô#ˆØð 	ð 	ˆEØ˜aœ œˆIØ&Ÿ_š_Ñ.Ô.ð ð ‘	��cðØ69�DÔ&Ô-¨dÑ3Ð3øÝ!ð ð ð Ø�Dðøøøðð 	Ô×ÒÐ0°#Ñ6Ô6Ð6Ð6Ð6s   ÁAÁ
AÁA)r\   r]   r^   r_   r   rP   r`   rJ  rM  rO  r®   ra   rb   s   @r6   rD  rD  e  sÝ   ø€ € € € € ðð ð'˜cð '¨Sð '°Tð 'ð 'ð 'ð 'ð 'ð 'ð>˜#ð >ð >ð >ð >ð7 ð 7¨ð 7ð 7ð 7ð 7ð1 ð 1¨ð 1ð 1ð 1ð 1ð7 ð 7¨ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7r8   rD  c                   ó   — e Zd ZdZdS )ÚCircularRefErrorz6Exception raised for circular references in SVG files.N)r\   r]   r^   r_   ri   r8   r6   rV  rV  �  s   € € € € € Ø@Ð@à€Dr8   rV  c                   ó\   — e Zd ZdZdeeej        e         f         ddddfd„Zdede	fd	„Z
dS )
ÚExternalSVGz?A class to handle external SVG files referenced via xlink:href.ÚpathÚrendererÚSvgRendererr.   Nc                 óž   — t          |¦  «        | _        t          ||j        t	          |j        ¦  «        gz   ¬¦  «        | _        d| _        d S )N)Úparent_svgsF)Úload_svg_fileÚ	root_noder[  Ú_parent_chainr`   Úsource_pathrZ  Úrendered)rU   rY  rZ  s      r6   rP   zExternalSVG.__init__˜  sQ   € õ
 ' tÑ,Ô,ˆŒÝ#Ø˜hÔ4½¸HÔ<PÑ8QÔ8QÐ7RÑRð
ñ 
ô 
ˆŒð ˆŒˆˆr8   Úfragmentc                 óš   — | j         s&| j                             | j        ¦  «         d| _         | j        j                             |¦  «        S )zÏGet a defined fragment from the external SVG file.

        Args:
            fragment: The ID of the fragment to retrieve.

        Returns:
            The rendered fragment, or None if not found.
        T)rb  rZ  Úrenderr_  Údefinitionsr­   )rU   rc  s     r6   Úget_fragmentzExternalSVG.get_fragment£  sF   € ð Œ}ð 	!ØŒM× Ò  ¤Ñ0Ô0Ð0Ø ˆDŒMØŒ}Ô(×,Ò,¨XÑ6Ô6Ð6r8   )r\   r]   r^   r_   r   r`   ÚosÚPathLikerP   r   rg  ri   r8   r6   rX  rX  •  s}   € € € € € ØIÐIð	à�C˜œ SÔ)Ð)Ô*ð	ð  ð	ð 
ð		ð 	ð 	ð 	ð7 Sð 7¨Sð 7ð 7ð 7ð 7ð 7ð 7r8   rX  c                   óô  — e Zd ZdZ	 	 	 d deeej        e         f         dee	         dee
e                  dee	         ddf
d„Zd	e	defd
„Zd!dedee	         ddfd„Zdedee	         fd„Zdeddfd„Zdede	ddfd„Zd!dedee	         de	fd„Zdeddfd„Zdeddfd„Zd"d	ededefd„Zd"dedede	fd„Zd!dedee	         de	fd„Zdeddfd„Zdede	fd„Zdede	fd„Z	 	 d#dedee	         dee	         de	fd„ZdS )$r[  z±A class to render an SVG file into a ReportLab Drawing.

    This class walks the SVG DOM and converts SVG elements into their
    corresponding ReportLab Graphics objects.
    NrY  rã   r]  rä   r.   c                 ó@  — || _         |pg | _        t          ||¬¦  «        | _        t	          || j        ¦  «        | _        | j                             ¦   «         | _        i | _        t          t          ¦  «        | _        i | _        t          ¦   «         | j        _        d S )N)rã   rä   )ra  r`  râ   ÚattrConverterÚSvg2RlgShapeConverterÚshape_converterÚget_handled_shapesÚhandled_shapesrf  r   r  Úwaiting_use_nodesÚ_external_svgsrk   r�   )rU   rY  rã   r]  rä   s        r6   rP   zSvgRenderer.__init__¼  s�   € ð :>ˆÔØ(3Ð(9°rˆÔÝ6Ø+°hð
ñ 
ô 
ˆÔõ  5°T¸4Ô;MÑNÔNˆÔØ"Ô2×EÒEÑGÔGˆÔØ+-ˆÔå�ÑÔð 	Ôð 79ˆÔÝ'1¡|¤|ˆÔÔ$Ð$Ð$r8   Úsvg_nodec                 ó4  — t                                |¦  «        }|                      |d¬¦  «        }| j                             |¦  «         |                      |d¬¦  «        }| j                             ¦   «         D ]}t           	                    d|¦  «         Œ| 
                    d|j        z
  |j         |j        z
  ¦  «         | j                             |dd|j        |j        f¬¦  «        \  }}t#          ||¦  «        }|                     |¦  «         |S )	zÑRender an SVG node into a ReportLab Drawing.

        Args:
            svg_node: The root lxml node of the SVG document.

        Returns:
            A ReportLab Drawing object representing the SVG.
        T©Údefault_box)Ú	outermostz(Ignoring unavailable object width ID %r.r   rF   rG   ©Údefaults)rD  Úfrom_xml_rootÚget_boxrl  r‘   Ú	renderSvgrq  ÚkeysrÒ   ÚdebugÚ	translaterD   rG   rE   rn  Úconvert_length_attrsrF   r   Úadd)	rU   rs  ÚnodeÚview_boxÚ
main_groupÚxlinkrF   rG   Údrawings	            r6   re  zSvgRenderer.renderÑ  s  € õ ×(Ò(¨Ñ2Ô2ˆØ—<’< °$�<Ñ7Ô7ˆàÔ×"Ò" 8Ñ,Ô,Ð,à—^’^ D°D�^Ñ9Ô9ˆ
ØÔ+×0Ò0Ñ2Ô2ð 	Lð 	LˆEÝ�LŠLÐCÀUÑKÔKÐKÐKà×Ò˜Q ¤™^¨h¬oÐ-=ÀÄ
Ñ-JÑKÔKÐKàÔ,×AÒAØ�g˜x°8´>À8Ä?Ð2Sð Bñ 
ô 
‰ˆˆvõ ˜% Ñ(Ô(ˆØ�Š�JÑÔÐØˆr8   r‚  r±   c                 óz  — |€dS |                      d¦  «        }d}d}t          |¦  «        }|                      |¦  «        }|dk    r,|                      |¦  «        }|                     |¦  «         �nd|dk    rd}�nZ|dk    r,|                      |¦  «        }|                     |¦  «         �n(|dk    rI|                      d	¦  «        }|                      ||¬
¦  «        }|dk    r|                     |¦  «         �nÙ|dk    r|                      |¦  «         �n¼|dk    r^|                      |¦  «        }|j	         
                    d¦  «        r|                     |¦  «         �np|                     dd¦  «         �nX|dk    r.|                      ||¬
¦  «        }|                     |¦  «         �n$|dk    r|                      |¦  «        }�n|| j        v rá|dk    rŒ|                      |¦  «        }	|	€dS t          |	t           ¦  «        rWt#          ¦   «         }
|	\  }}|                     ||
¬¦  «         |                      ||
¦  «         |                     |
¦  «         dS |	|_        | j                             |||¦  «        }|                      d	¦  «        }|r|dk    r|                     |¦  «         nd}t.                               d|¦  «         |sá|rt|rr|| j        |<   |                     d|i¦  «         d„ |j	                             ¦   «         D ¦   «         }t9          |¦  «        dk    r|\  }|                     d|i¦  «         || j                             ¦   «         v r9| j                             |¦  «        }|D ]\  }}|                      ||¬¦  «         Œ|                       |¦  «         dS dS )z×Render a single SVG node and add it to a parent group.

        Args:
            node: The NodeTracker object for the SVG node.
            parent: The parent ReportLab Group to add the rendered object to.
        NrÁ   FÚsvgÚdefsTr—   r·   Údisplay)Úclippingr  r=   ÚsymbolÚ	_renderedr©   ÚuseÚclipPathr-   ©r±   zIgnoring node: %sÚsvgidc                 ó    — g | ]\  }}d |v ¯	|‘ŒS )Úlabelri   )rt   r¡   r¢   s      r6   r˜   z*SvgRenderer.renderNode.<locals>.<listcomp>;  s!   € ÐQÐQÐQ¡T Q¨ÀGÈqÀLÀL˜qÀLÀLÀLr8   r"   r“  ©Úgroup)!rM  r¸   Úget_clippathr|  r�  ÚrenderAÚrenderGÚrenderStyleÚrenderSymbolr¬   r­   rR  Ú	renderUserp  Úxlink_href_targetr  rÐ   r   Ú
renderNodeÚapply_node_attr_to_groupÚ_resolved_targetrn  ÚconvertShaperÒ   r~  rf  ÚsetPropertiesr¯   r›   rq  r}  rN   Úprint_unused_attributes)rU   r‚  r±   ÚnidÚignoredr  r¥   r‹  rŠ  ÚtargetÚgrrZ  Úimg_nodeÚlabel_attrsr“  Ú	to_renderÚuse_noder•  s                     r6   r�  zSvgRenderer.renderNodeì  s  € ð ˆ>ØˆFØ×Ò Ñ%Ô%ˆØˆØˆÝ˜‰Œˆà×$Ò$ TÑ*Ô*ˆØ�5Š=ˆ=Ø—>’> $Ñ'Ô'ˆDØ�JŠJ�tÑÔÐÑØ�VŠ^ˆ^ØˆG‰GØ�SŠ[ˆ[Ø—<’< Ñ%Ô%ˆDØ�JŠJ�tÑÔÐÑØ�SŠ[ˆ[Ø×'Ò'¨	Ñ2Ô2ˆGØ—<’< ¨x�<Ñ8Ô8ˆDØ˜&Ò Ð Ø—
’
˜4Ñ Ô Ð ùØ�WŠ_ˆ_Ø×Ò˜TÑ"Ô"Ð"Ñ"Ø�XÒÐØ×$Ò$ TÑ*Ô*ˆDð Œ{�Š˜{Ñ+Ô+ð +Ø—
’
˜4Ñ Ô Ð Ñ à—’˜ cÑ*Ô*Ð*Ñ*Ø�UŠ]ˆ]Ø—>’> $°�>Ñ:Ô:ˆDØ�JŠJ�tÑÔÐÑØ�ZÒÐØ—<’< Ñ%Ô%ˆD‰DØ�TÔ(Ð(Ð(Ø�wŠˆð ×/Ò/°Ñ5Ô5�Ø�>Ø�FÝ ­Ñ.Ô.ð 
3å™œ�BØ)/Ñ&�H˜hØ×'Ò'¨¸Ð'Ñ<Ô<Ð<Ø×1Ò1°$¸Ñ;Ô;Ð;Ø—J’J˜r‘N”N�NØ�Fð -3�DÔ)àÔ'×4Ò4°T¸4ÀÑJÔJˆDØ×'Ò'¨	Ñ2Ô2ˆGØð !˜ 6Ò)Ð)Ø—
’
˜4Ñ Ô Ð øàˆGÝ�LŠLÐ,¨dÑ3Ô3Ð3àð 	/Øð 9�tð 9Ø(,�Ô  Ñ%ð ×"Ò" G¨S >Ñ2Ô2Ð2ð RÐQ¨T¬[×->Ò->Ñ-@Ô-@ÐQÑQÔQ�Ý�{Ñ#Ô# qÒ(Ð(Ø*‘H�UØ×&Ò&¨°Ð'7Ñ8Ô8Ð8Ø�dÔ,×1Ò1Ñ3Ô3Ð3Ð3Ø Ô2×6Ò6°sÑ;Ô;�	Ø'0ð :ð :‘O�H˜eØ—N’N 8°5�NÑ9Ô9Ð9Ð9Ø×(Ò(¨Ñ.Ô.Ð.Ð.Ð.ð#	/ð 	/r8   c                 ó¨  ‡ ‡‡— dt           dt          t                    fˆfd„Šdt           dt          t                    fˆˆˆ fd„Š|                     d¦  «        }|sdS t          j        d|¦  «        }|sdS |                     ¦   «         d	         }|‰ j        vrt                               d
|¦  «         dS  ‰‰ j        |         ¦  «        }t          |t          ¦  «        r¥|                     ¦   «         \  }}}}	t          ¦   «         }
|
                     ||¦  «         |
                     ||¦  «         |
                     ||	¦  «         |
                     ||	¦  «         |
                     ¦   «          t!          ||
¦  «         |
S t          |t"          ¦  «        rt          |¬¦  «        S |r%t                               d|j        j        ¦  «         dS )zþGet the clipping path object referenced by a node's 'clip-path' attribute.

        Args:
            node: The NodeTracker object for the SVG node.

        Returns:
            A ClippingPath object, or None if no valid clipping path is found.
        r•  r.   c                 ó’   •— | j         D ]=}t          |t          ¦  «        r ‰|¦  «        c S t          |t          ¦  «        r|c S Œ>d S rŒ   )Úcontentsr  r   r   )r•  ÚelemÚget_shape_from_groups     €r6   r¯  z6SvgRenderer.get_clippath.<locals>.get_shape_from_groupO  sb   ø€ Øœð  ð  �Ý˜d¥EÑ*Ô*ð  Ø/Ð/°Ñ5Ô5Ð5Ð5Ð5Ý ¥jÑ1Ô1ð  Ø�K�K�Kð à�4r8   r‚  c                 ó�  •— |                       ¦   «         D ]¯}t          |¦  «        dk    r*‰j                             d|¦  «        }|j        d         c S t          |¦  «        dk    r"‰                     |¦  «        } ‰|¦  «        c S t          |¦  «        dk    r‰j                             |¦  «        c S  ‰|¦  «        c S d S )NrY  rö   rŽ  Úrect)Úiter_childrenr¸   rn  r   r­  r›  ÚconvertRect)r‚  Úchildr•  Úgrpr¯  Úget_shape_from_noderU   s       €€€r6   r¶  z5SvgRenderer.get_clippath.<locals>.get_shape_from_nodeW  sã   ø€ Ø×+Ò+Ñ-Ô-ð 
6ð 
6�Ý˜UÑ#Ô# vÒ-Ð-Ø Ô0×=Ò=¸fÀeÑLÔL�EØ œ>¨"Ô-Ð-Ð-Ð-Ý˜uÑ%Ô%¨Ò.Ð.ØŸ.š.¨Ñ/Ô/�CØ/Ð/°Ñ4Ô4Ð4Ð4Ð4Ý˜uÑ%Ô%¨Ò/Ð/ØÔ/×;Ò;¸EÑBÔBÐBÐBÐBà.Ð.¨uÑ5Ô5Ð5Ð5Ð5Ø�4r8   z	clip-pathNzurl\(#([^)]*)\)r   z)Unable to find a clipping path with id %s©rM   z&Unsupported shape type %s for clipping)r   r	   rM  rÎ   rQ  Úgroupsrf  rÒ   rÓ   r  r   Ú	getBoundsrd   ÚmoveToÚlineToÚ	closePathÚcopy_shape_propertiesr   r	  rV   r\   )rU   r‚  Ú	clip_pathÚmÚrefÚshaperø   rû   rù   rü   Úcpr¯  r¶  s   `          @@r6   r–  zSvgRenderer.get_clippathE  sù  øøø€ ð	­ð 	µ½´ð 	ð 	ð 	ð 	ð 	ð 	ð	¥cð 	­hµs¬mð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ×%Ò% kÑ2Ô2ˆ	Øð 	Ø�4ÝŒHÐ'¨Ñ3Ô3ˆØð 	Ø�4Ø�hŠh‰jŒj˜ŒmˆØ�dÔ&Ð&Ð&Ý�NŠNÐFÈÑLÔLÐLØ�4à#Ð# DÔ$4°SÔ$9Ñ:Ô:ˆÝ�e�TÑ"Ô"ð 	ð #Ÿ_š_Ñ.Ô.‰NˆB��B˜Ý‘”ˆBØ�IŠI�b˜"ÑÔÐØ�IŠI�b˜"ÑÔÐØ�IŠI�b˜"ÑÔÐØ�IŠI�b˜"ÑÔÐØ�LŠL‰NŒNˆNå! %¨Ñ,Ô,Ð,ØˆIÝ˜�tÑ$Ô$ð 	Ý¨%Ð0Ñ0Ô0Ð0Øð 	Ý�LŠLØ8¸%¼/Ô:Rñô ð ð ˆtr8   c                 ó  ‡— t           j        t          j        k    rdS | j                             ‰j        ¦  «                             ¦   «         }ˆfd„|D ¦   «         }|r+t                                dt          ‰¦  «        |¦  «         dS dS )zØPrint any attributes that were not used during rendering.

        This is a debugging helper to identify unsupported SVG attributes.

        Args:
            node: The NodeTracker object for the SVG node.
        Nc                 ó&   •— g | ]}|‰j         v¯|‘ŒS ri   )rF  )rt   ru   r‚  s     €r6   r˜   z7SvgRenderer.print_unused_attributes.<locals>.<listcomp>‘  s%   ø€ ÐQÐQÐQ °dÀ$Ä.Ð6PÐ6P˜Ð6PÐ6PÐ6Pr8   zUnused attrs: %s %s)
rÒ   ÚlevelÚloggingÚDEBUGrl  rº   rI  r}  r~  r¸   )rU   r‚  Ú	all_attrsÚunused_attrss    `  r6   r¢  z#SvgRenderer.print_unused_attributes†  s�   ø€ õ Œ<�'œ-Ò'Ð'ØˆFØÔ&×7Ò7¸Ô8JÑKÔK×PÒPÑRÔRˆ	ØQÐQÐQÐQ¨ÐQÑQÔQˆØð 	OÝ�LŠLÐ.µ	¸$±´ÀÑNÔNÐNÐNÐNð	Oð 	Or8   r•  c                 ó¢   — |j         }t          |d¦  «        \  }}}|s|r|d|pd› d|pd› d�z  }|r| j                             ||¦  «         dS dS )z×Apply common attributes (transform, x, y) from a node to a group.

        Args:
            node: The NodeTracker object for the SVG node.
            group: The ReportLab Group to apply the attributes to.
        )Ú	transformrD   rE   z translate(r   z, ú)N)rM  Úmaprn  ÚapplyTransformOnGroup)rU   r‚  r•  ÚgetAttrrË  rD   rE   s          r6   rž  z$SvgRenderer.apply_node_attr_to_group•  s‹   € ð Ô#ˆÝ˜gÐ'>Ñ?Ô?‰ˆ	�1�aØð 	;�ð 	;ØÐ: q v¨AÐ:Ð:°°°aÐ:Ð:Ð:Ñ:ˆIØð 	IØÔ ×6Ò6°yÀ%ÑHÔHÐHÐHÐHð	Ið 	Ir8   c                 ó  — |j                              d¦  «        p|j                              d¦  «        }|sdS t          j        d|¦  «        }|r{t	          j        ||                     d¦  «        d         dz   d…                              d¦  «        ¦  «        }t          |¦  «        }t          t          j        |¦  «        ¦  «        S d|v r|                     dd¦  «        \  }}n|d}}|rÄt          | j        t          ¦  «        st                                d	|¦  «         dS t$          j                             t$          j                             t$          j                             | j        ¦  «        |¦  «        ¦  «        }	t%          j        |	t$          j        ¦  «        sdS |	| j        k    rd}|�r|	                     d
¦  «        r²|	| j        v r(t                                d¦  «         t7          ¦   «         ‚|	| j        vrt;          |	| ¦  «        | j        |	<   | j        |	         }
|
j        �J|r"|
                     |¦  «        }|�	|
j         |fS dS |
j         tB           "                    |
j        ¦  «        fS dS 	 tG          |	dd¦  «         n,# tH          $ r t                                d|	¦  «         Y dS w xY w|	S |rA|| j%        v r| | j%        |         fS | j&        |          '                    ||f¦  «         tP          S dS )aò  Resolve an xlink:href attribute to its target.

        The target can be an internal fragment, an external SVG file, or a
        raster image.

        Args:
            node: The NodeTracker object for the SVG node with the href attribute.
            group: The parent group, used for delayed rendering.

        Returns:
            - A tuple (renderer, node) for vector targets.
            - A PIL Image object for raster images.
            - None if the target cannot be resolved.
        z"{http://www.w3.org/1999/xlink}hrefÚhrefNz^data:image/(jpe?g|png);base64r   r"   Úasciir  zLUnable to resolve image path %r as the SVG source is not a file system path.z.svgz$Circular reference detected in file.z(Unable to read the image %s. Skipping...))r¬   r­   rÎ   rQ  Úbase64ÚdecodebytesÚspanÚencoder   r7   ÚPILImageÚopenrr   r  ra  r`   rÒ   r	  rh  rY  ÚnormpathÚjoinÚdirnameÚaccessÚR_OKr  r`  rV  rr  rX  r_  rg  rZ  rD  rz  r   ÚOSErrorrf  rq  rË   ÚDELAYED)rU   r‚  r•  Ú
xlink_hrefrQ  Ú
image_dataÚbytes_streamÚirirc  rY  Úext_svgÚext_frags               r6   rœ  zSvgRenderer.xlink_href_target£  sG  € ð  ”[—_’_Ø0ñ
ô 
ð %àŒ[�_Š_˜VÑ$Ô$ð 	ð ð 	Ø�4õ ”Ð:¸JÑGÔGˆØð 	IÝÔ+Ø˜EŸJšJ q™MœM¨!Ô,¨qÑ0Ð3Ð3Ô4×;Ò;¸GÑDÔDñô ˆJõ # :Ñ.Ô.ˆLå+­H¬M¸,Ñ,GÔ,GÑHÔHÐHð �*ÐÐØ&×,Ò,¨S°!Ñ4Ô4‰MˆC��à&¨�ˆCàð 	å˜dÔ.µÑ4Ô4ð Ý—’ð*àñô ð ð
 �tÝ”7×#Ò#Ý”—’�RœWŸ_š_¨TÔ-=Ñ>Ô>ÀÑDÔDñô ˆDõ ”9˜T¥2¤7Ñ+Ô+ð Ø�tØ�tÔ'Ò'Ð'à�àñ #	Ø�}Š}˜VÑ$Ô$ð Ø˜4Ô-Ð-Ð-Ý—L’LÐ!GÑHÔHÐHÝ*Ñ,Ô,Ð,Ø˜tÔ2Ð2Ð2Ý0;¸DÀ$Ñ0GÔ0G�DÔ'¨Ñ-ØÔ-¨dÔ3�ØÔ$Ð0Øð Ø#*×#7Ò#7¸Ñ#AÔ#A˜Ø#Ð/Ø#*Ô#3°XÐ#=Ð=ð 0Ð/ð  'Ô/µ×1JÒ1JØ#Ô-ñ2ô 2ð  ð ð 1Ð0ð å˜T 1 aÑ(Ô(Ð(Ð(øÝð  ð  ð  Ý—L’LÐ!KÈTÑRÔRÐRØ˜4˜4ð øøøð �àð 	à˜4Ô+Ð+Ð+Ø˜TÔ-¨hÔ7Ð7Ð7ð Ô& xÔ0×7Ò7¸¸u¸ÑFÔFÐFÝ�ð	ð 	s   É>J Ê%J9Ê8J9c                 ó   — dS )z/Handle the <title> element (currently a no-op).Nri   ©rU   r‚  s     r6   ÚrenderTitle_zSvgRenderer.renderTitle_   ó   € àˆr8   c                 ó   — dS )z.Handle the <desc> element (currently a no-op).Nri   rç  s     r6   ÚrenderDesc_zSvgRenderer.renderDesc_  ré  r8   Frv  c                 ó0  — |                      d¦  «        }|r#| j                             |¦  «        }t          |Ž S |rIt	          |j         d¦  «        \  }}t	          | j        j        ||f¦  «        \  }}t          dd||¦  «        S t          dddd¦  «        S )a  Get the viewBox or dimensions of an SVG node.

        Args:
            svg_node: The NodeTracker for the SVG node.
            default_box: If True, use width/height as a fallback.

        Returns:
            A Box tuple representing the dimensions.
        ÚviewBox)rF   rG   r   )rM  rl  r  rC   rÍ  rô   )rU   rs  rv  rƒ  rF   rG   s         r6   r{  zSvgRenderer.get_box  s¡   € ð ×(Ò(¨Ñ3Ô3ˆØð 	"ØÔ)×;Ò;¸HÑEÔEˆHÝ˜�>Ð!Øð 	,Ý Ô 5Ð7JÑKÔK‰MˆE�6Ý Ô 2Ô @À5È&À/ÑRÔR‰MˆE�6Ý�q˜!˜U FÑ+Ô+Ð+Ý�1�a˜˜A‰ŒÐr8   rw  c                 ó  — | j         j        }|                     dt          › d�¦  «        dk    | j         _        |                      |d¬¦  «        }| j        j        }|r| j                             |¦  «         |j         	                    d¦  «        }| 
                    ¦   «         D ]*}|j        |rd|› d�ndk    r|                      |¦  «         Œ+t          ¦   «         }|                     ¦   «         D ]}	|                      |	|¦  «         Œ|| j         _        | j                             |¦  «         |s=| j                              |d	d
¦  «        \  }
}|
s|r|                     |
pd|pd¦  «         |s|r|                     dd¦  «         ns|rqd\  }}| j                              |ddd¬¦  «        \  }}|�|j        |k    r
||j        z  }|�|j        |k    r
||j        z  }|                     |||rdndz  ¦  «         |S )a  Render an <svg> element into a ReportLab Group.

        Args:
            node: The NodeTracker for the <svg> element.
            outermost: True if this is the root <svg> element.

        Returns:
            A ReportLab Group containing the rendered content.
        Ú{ú}spaceÚpreserveTru  Nz}defsr‰  rD   rE   r   r"   rö   )r"   r"   rF   rG   r?  rx  )rn  Úpreserve_spacerM  ÚXML_NSr{  rl  rŽ   r‘   Únsmapr­   Úiter_subtreeÚtagr˜  r   r²  r�  r€  r  ÚscalerG   rF   )rU   r‚  rw  Ú_saved_preserve_spacerƒ  Ú
_saved_boxÚsvg_nsÚdef_noder•  r´  rD   rE   Úx_scaleÚy_scalerF   rG   s                   r6   r|  zSvgRenderer.renderSvg  sa  € ð !%Ô 4Ô CÐà×ÒÐ2¥6Ð2Ð2Ð2Ñ3Ô3°zÒAð 	ÔÔ+ð —<’< °$�<Ñ7Ô7ˆØÔ'Ô0ˆ
Øð 	1ØÔ×&Ò& xÑ0Ô0Ð0ð ”—’ Ñ%Ô%ˆØ×)Ò)Ñ+Ô+ð 	'ð 	'ˆHØŒ|°vÐ IÐ 3 VÐ 3Ð 3Ð 3Ð 3À6ÒJÐJØ—’˜XÑ&Ô&Ð&øå‘”ˆØ×'Ò'Ñ)Ô)ð 	*ð 	*ˆEØ�OŠO˜E 5Ñ)Ô)Ð)Ð)Ø.CˆÔÔ+ØÔ×"Ò" :Ñ.Ô.Ð.ð ð 	0ØÔ'×<Ò<¸TÀ3ÈÑLÔL‰DˆAˆqØð 0�Að 0Ø—’   Q¨¨¨QÑ/Ô/Ð/ð ð 	E˜Ið 	Eà�KŠK˜˜2ÑÔÐÐØð 		EØ#ÑˆG�WØ Ô0×EÒEØ�g˜x°+ð Fñ ô ‰MˆE�6ð Ð! h¤o¸Ò&?Ð&?Ø  8¤?Ñ2�ØÐ  X¤^°uÒ%<Ð%<Ø (¤.Ñ0�Ø�KŠK˜ °)Ð,B¨B¨BÀÑ!CÑDÔDÐDàˆr8   r‹  c                 ó  — |j         }t          |d¦  «        \  }}t          ¦   «         }|r|                     |¦  «         |                     ¦   «         D ]}|                      ||¬¦  «         Œ|r| j                             ||¦  «         |S )a  Render a <g> element into a ReportLab Group.

        Args:
            node: The NodeTracker for the <g> element.
            clipping: An optional clipping path to apply.

        Returns:
            A ReportLab Group containing the rendered content.
        )rÁ   rË  r�  )rM  rÍ  r   r�  r²  r�  rn  rÎ  )rU   r‚  r‹  rÏ  rÁ   rË  r¦  r´  s           r6   r˜  zSvgRenderer.renderGR  sž   € ð Ô#ˆÝ˜GÐ%8Ñ9Ô9‰ˆˆIÝ‰WŒWˆØð 	Ø�FŠF�8ÑÔÐØ×'Ò'Ñ)Ô)ð 	.ð 	.ˆEØ�OŠO˜E¨"ˆOÑ-Ô-Ð-Ð-àð 	FØÔ ×6Ò6°yÀ"ÑEÔEÐEàˆ	r8   c                 ón   — | j         j        �(| j         j                             |j        pd¦  «         dS dS )zBRender a <style> element by adding its content to the CSS matcher.Nrª   )rl  r�   rˆ   r
  rç  s     r6   r™  zSvgRenderer.renderStylei  s<   € àÔÔ'Ð3ØÔÔ(×3Ò3°D´I°OÀÑDÔDÐDÐDÐDð 4Ð3r8   c                 ó,   — |                       |¦  «        S )z/Render a <symbol> element as a ReportLab Group.©r˜  rç  s     r6   rš  zSvgRenderer.renderSymboln  ó   € à�|Š|˜DÑ!Ô!Ð!r8   c                 ó,   — |                       |¦  «        S )z@Render an <a> element as a ReportLab Group (no linking support).r  rç  s     r6   r—  zSvgRenderer.renderAr  r  r8   c                 ó¾  — |€t          ¦   «         }	 |                      ||¬¦  «        }n6# t          $ r) |j        j                             |j        ¦  «         |cY S w xY w|€dS t          |t          ¦  «        rt           	                    d¦  «         dS |t          u r|S |d         }|r|                     |¦  «         t          |                     ¦   «         ¦  «        dk    r'|                     t          j        |¦  «        ¦  «         |                      t%          |                     ¦   «         ¦  «        d         |¬¦  «         |                      ||¦  «         |S )aD  Render a <use> element by cloning a defined element.

        Args:
            node: The NodeTracker for the <use> element.
            group: The parent group to render into.
            clipping: An optional clipping path to apply.

        Returns:
            A ReportLab Group containing the rendered content.
        Nr”  z/<use> nodes cannot reference bitmap image filesr"   r   rö   r�  )r   rœ  rV  r±   rI  Úremover  r`   rÒ   r	  rß  r�  r›   ÚgetchildrenrË   rS   rT   r�  r  r²  rž  )rU   r‚  r•  r‹  r  s        r6   r›  zSvgRenderer.renderUsev  s_  € ð  ˆ=Ý‘G”GˆEð	Ø×)Ò)¨$°eÐ)Ñ<Ô<ˆDˆDøÝð 	ð 	ð 	ØŒKÔ%×,Ò,¨TÔ-?Ñ@Ô@Ð@ØˆLˆLˆLð	øøøð ˆ<ØˆFÝ˜�cÑ"Ô"ð 	Ý�LŠLÐJÑKÔKÐKØˆFØ•Wˆ_ˆ_ØˆLà˜”7ˆDàð 	 Ø�IŠI�hÑÔÐÝˆt×ÒÑ!Ô!Ñ"Ô" aÒ'Ð'ð �KŠK�œ dÑ+Ô+Ñ,Ô,Ð,Ø�Š�˜T×/Ò/Ñ1Ô1Ñ2Ô2°2Ô6¸uˆÑEÔEÐEØ×%Ò% d¨EÑ2Ô2Ð2Øˆs   ’* ª0AÁA)NNNrŒ   ©Fr?  )r\   r]   r^   r_   r   r`   rh  ri  r	   r   r   rP   r   re  rD  r�  r–  r¢  rž  rœ  rè  rë  ÚboolrC   r{  r|  r˜  r™  rš  r—  r›  ri   r8   r6   r[  r[  µ  s:  € € € € € ðð ð *.Ø+/Ø"&ð4ð 4à�C˜œ SÔ)Ð)Ô*ð4ð " #œð4ð ˜d 3œiÔ(ð	4ð
 ˜3”-ð4ð 
ð4ð 4ð 4ð 4ð*˜sð  wð ð ð ð ð6W/ð W/˜{ð W/°H¸S´Mð W/ÈTð W/ð W/ð W/ð W/ðr? ð ?°¸#´ð ?ð ?ð ?ð ?ðBO¨Kð O¸Dð Oð Oð Oð OðI¨[ð IÀð IÈð Ið Ið Ið Ið[ð [ kð [¸(À3¼-ð [ÐSVð [ð [ð [ð [ðz ð °ð ð ð ð ð ð °ð ð ð ð ðð  ð ¸$ð È3ð ð ð ð ð(4ð 4˜kð 4°dð 4Àsð 4ð 4ð 4ð 4ðlð ˜Kð °8¸C´=ð ÈCð ð ð ð ð.E ð E°ð Eð Eð Eð Eð
" ð "°ð "ð "ð "ð "ð"˜Kð "¨Cð "ð "ð "ð "ð  $Ø"&ð	+ð +àð+ð ˜Œ}ð+ð ˜3”-ð	+ð
 
ð+ð +ð +ð +ð +ð +r8   r[  c                   ó„   — e Zd ZdZ	 ddeeej        e         f         dee	         ddfd„Z
edee         fd„¦   «         ZdS )	ÚSvgShapeConverterzºAn abstract class for converting SVG shapes to another format.

    Subclasses should implement `convertX` methods for each SVG shape `X`
    (e.g., `convertRect`, `convertCircle`).
    NrY  rl  r.   c                 óL   — |pt          ¦   «         | _        || _        d| _        d S )NF)râ   rl  Úsvg_source_filerò  )rU   rY  rl  s      r6   rP   zSvgShapeConverter.__init__«  s.   € ð
 +ÐIÕ.GÑ.IÔ.IˆÔØ#ˆÔØ#ˆÔÐÐr8   c                 ó4   — d„ t          | ¦  «        D ¦   «         S )z@Return a list of SVG shape names that this converter can handle.c                 óp   — g | ]3}|                      d ¦  «        ¯|dd…                              ¦   «         ‘Œ4S )r5   r  N)r°   Úlower)rt   r³   s     r6   r˜   z8SvgShapeConverter.get_handled_shapes.<locals>.<listcomp>·  s9   € ÐQÐQÐQ C°s·~²~ÀiÑ7PÔ7PÐQ��A�B�B”—’‘”ÐQÐQÐQr8   )Údir)Úclss    r6   ro  z$SvgShapeConverter.get_handled_shapes´  s   € ð RÐQ­3¨s©8¬8ÐQÑQÔQÐQr8   rŒ   )r\   r]   r^   r_   r   r`   rh  ri  r	   râ   rP   Úclassmethodr   ro  ri   r8   r6   r
  r
  ¤  s¢   € € € € € ðð ð >Bð$ð $à�C˜œ SÔ)Ð)Ô*ð$ð  Ð 9Ô:ð$ð 
ð	$ð $ð $ð $ð ðR 4¨¤9ð Rð Rð Rñ „[ðRð Rð Rr8   r
  c                   óV  — e Zd ZdZddededee         defd„Zedœded	ed
e	dede
e	         f
d„Zdedefd„Zdedee         fd„Zdedefd„Zdedefd„Zdedee         fd„Zdedee         fd„Zdedefd„Zdedee         fd„Zdedefd„Zdededdfd„Z	 ddedededdfd„ZdS )rm  z?A class for converting SVG shapes to ReportLab Graphics shapes.Nr¥   r‚  r‹  r.   c                 ó|  — d|                      ¦   «         › �} t          | |¦  «        |¦  «        }|sdS |dvr|                      ||¦  «         |                     d¦  «        }|s|s|S t	          ¦   «         }|r|                      ||¦  «         |r|                     |¦  «         |                     |¦  «         |S )a  Convert an SVG shape by calling the appropriate `convertX` method.

        Args:
            name: The name of the SVG shape (e.g., "rect", "circle").
            node: The lxml node for the shape.
            clipping: An optional clipping path to apply.

        Returns:
            A ReportLab shape object, or a Group if transforms or clipping
            are applied.
        r5   N)rY  Úpolyliner
  rË  )Ú
capitalizer#  ÚapplyStyleOnShaperM  r   rÎ  r�  )rU   r¥   r‚  r‹  Úmethod_namerÁ  rË  r•  s           r6   r   z"Svg2RlgShapeConverter.convertShape½  sâ   € ð 4 §¢Ñ 1Ô 1Ð3Ð3ˆØ*•˜˜kÑ*Ô*¨4Ñ0Ô0ˆØð 	ØˆFØÐ3Ð3Ð3à×"Ò" 5¨$Ñ/Ô/Ð/Ø×%Ò% kÑ2Ô2ˆ	Øð 		˜Xð 		ØˆLå‘G”GˆEØð =Ø×*Ò*¨9°eÑ<Ô<Ð<Øð $Ø—	’	˜(Ñ#Ô#Ð#Ø�IŠI�eÑÔÐØˆLr8   ©rî   rŸ   rî   rK   c                óâ   ‡‡‡‡— t          ‰d¦  «        r‰j        nˆfd„Š| j        j        Š|                     ddt          |¦  «        z  ¦  «        }ˆˆˆfd„t          ||¦  «        D ¦   «         S )ad  Convert a list of length attributes from a node.

        Args:
            node: The lxml node.
            *attrs: The names of the attributes to convert.
            em_base: The base font size for 'em' units.
            **kwargs: Can include 'defaults' for fallback values.

        Returns:
            A list of converted lengths in points.
        rM  c                 ó:   •— ‰j                              | d¦  «        S ©Nrª   )r¬   r­   )ru   r‚  s    €r6   ú<lambda>z<Svg2RlgShapeConverter.convert_length_attrs.<locals>.<lambda>ñ  s   ø€ ˜dœkŸošo¨d°BÑ7Ô7€ r8   ry  )rí   c                 óF   •— g | ]\  }} ‰ ‰|¦  «        |‰|¬ ¦  «        ‘ŒS ))rï   rî   rð   ri   )rt   ru   rð   Ú
convLengthrî   rÏ  s      €€€r6   r˜   z>Svg2RlgShapeConverter.convert_length_attrs.<locals>.<listcomp>õ  sH   ø€ ð 
ð 
ð 
á��gð ˆJ�w�w˜t‘}”}°¸gÈwÐWÑWÔWð
ð 
ð 
r8   )ÚhasattrrM  rl  rô   r­   r›   Úzip)rU   r‚  rî   rŸ   rK   ry  r  rÏ  s    ``   @@r6   r€  z*Svg2RlgShapeConverter.convert_length_attrsÜ  s�   øøøø€ õ( �t˜^Ñ,Ô,ð8ˆDÔÐà7Ð7Ð7Ð7ð 	ð
 Ô'Ô5ˆ
Ø—:’:˜j¨&µ3°u±:´:Ñ*=Ñ>Ô>ˆð
ð 
ð 
ð 
ð 
ð 
å!$ U¨HÑ!5Ô!5ð
ñ 
ô 
ð 	
r8   c                 ód   — |                       |dddd¦  «        }t          |¦  «         t          |Ž S )z2Convert an SVG <line> element to a ReportLab Line.rø   rû   rù   rü   )r€  Únudge_pointsr   )rU   r‚  Úpointss      r6   ÚconvertLinez!Svg2RlgShapeConverter.convertLineú  s5   € à×*Ò*¨4°°t¸TÀ4ÑHÔHˆÝ�VÑÔÐÝ�Vˆ}Ðr8   c           	      óÂ   — |                       |dddddd¦  «        \  }}}}}}||dz  k    r|dz  }||dz  k    r|dz  }|r|s|}n|r|s|}t          ||||||¬¦  «        S )	z2Convert an SVG <rect> element to a ReportLab Rect.rD   rE   rF   rG   ÚrxÚryrÃ   )r'  r(  )r€  r   )rU   r‚  rD   rE   rF   rG   r'  r(  s           r6   r³  z!Svg2RlgShapeConverter.convertRect   sª   € à&*×&?Ò&?Ø�#�s˜G X¨t°Tñ'
ô '
Ñ#ˆˆ1ˆe�V˜R ð �˜‘ÒÐØ˜‘ˆBØ�˜!‘ÒÐØ˜!‘ˆBØð 	�bð 	ØˆBˆBØð 	˜ð 	ØˆBÝ�A�q˜% ¨B°2Ð6Ñ6Ô6Ð6r8   c                 ó\   — |                       |ddd¦  «        \  }}}t          |||¦  «        S )z6Convert an SVG <circle> element to a ReportLab Circle.r÷   rú   Úr)r€  r   )rU   r‚  r÷   rú   r*  s        r6   ÚconvertCirclez#Svg2RlgShapeConverter.convertCircle  s3   € à×-Ò-¨d°D¸$ÀÑDÔD‰	ˆˆB�Ý�b˜"˜aÑ Ô Ð r8   c                 ój   — |                       |dddd¦  «        \  }}}}||}}t          ||||¦  «        S )z8Convert an SVG <ellipse> element to a ReportLab Ellipse.r÷   rú   r'  r(  )r€  r   )rU   r‚  r÷   rú   r'  r(  rF   rG   s           r6   ÚconvertEllipsez$Svg2RlgShapeConverter.convertEllipse  sB   € à×2Ò2°4¸¸tÀTÈ4ÑPÔP‰ˆˆB��BØ˜BˆvˆÝ�r˜2˜u fÑ-Ô-Ð-r8   c                 óš  — |                      d¦  «        }|                     dd¦  «        }|                     ¦   «         }t          t	          | j        j        |¦  «        ¦  «        }t          |¦  «        dz  dk    st          |¦  «        dk    rdS t          |¦  «         t          |¦  «        }|  
                    ||¦  «         | j                             |d¦  «        dv}|rft          ¦   «         }t          |¦  «        }|  
                    ||¦  «         d|_        |                     |¦  «         |                     |¦  «         |S |S )	z:Convert an SVG <polyline> element to a ReportLab PolyLine.r$  rÄ   rÅ   rÃ   r   NÚfill)rª   r  )rM  rÍ   rr   r  rÍ  rl  rô   r›   r#  r   r  r²   r   r   rY   r�  )rU   r‚  r$  r  Úhas_fillr•  Úpolygons          r6   ÚconvertPolylinez%Svg2RlgShapeConverter.convertPolyline  s4  € à×"Ò" 8Ñ,Ô,ˆØ—’  SÑ)Ô)ˆØ—’‘”ˆÝ•c˜$Ô,Ô:¸FÑCÔCÑDÔDˆÝˆv‰;Œ;˜‰?˜aÒÐ¥3 v¡;¤;°!Ò#3Ð#3à�4å�VÑÔÐÝ˜FÑ#Ô#ˆØ×Ò˜x¨Ñ.Ô.Ð.ØÔ%×.Ò.¨t°VÑ<Ô<ÀLÐPˆàð 		õ ‘G”GˆEÝ˜f‘o”oˆGØ×"Ò" 7¨DÑ1Ô1Ð1Ø"&ˆGÔØ�IŠI�gÑÔÐØ�IŠI�hÑÔÐØˆLàˆr8   c                 ód  — |                      d¦  «        }|                     dd¦  «        }|                     ¦   «         }t          t	          | j        j        |¦  «        ¦  «        }t          |¦  «        dz  dk    st          |¦  «        dk    rdS t          |¦  «         t          |¦  «        }|S )z8Convert an SVG <polygon> element to a ReportLab Polygon.r$  rÄ   rÅ   rÃ   r   N)
rM  rÍ   rr   r  rÍ  rl  rô   r›   r#  r   )rU   r‚  r$  rÁ  s       r6   ÚconvertPolygonz$Svg2RlgShapeConverter.convertPolygon6  sš   € à×"Ò" 8Ñ,Ô,ˆØ—’  SÑ)Ô)ˆØ—’‘”ˆÝ•c˜$Ô,Ô:¸FÑCÔCÑDÔDˆÝˆv‰;Œ;˜‰?˜aÒÐ¥3 v¡;¤;°!Ò#3Ð#3à�4Ý�VÑÔÐÝ˜‘”ˆàˆr8   c           	      ó
	  — | j         }|                     dt          › d�¦  «        }|r|dk    }n| j        }t	          ¦   «         }g }d}d}d}	d}
|                     |d¦  «        pt          }|                     |d¦  «        pt          }|                     |d¦  «        pt          }| 	                    |||¦  «        }|                     |d¦  «        pt          t          ¦  «        }|                     |¦  «        }|                      |d	d
|¬¦  «        \  }}t          ||¦  «        D �]D\  }}}|sŒ
d\  }}d}d}d}|s¢|                      |d	d
dd|¬¦  «        \  }	}
}}|j                             d	d¦  «        dk    |j                             d
d¦  «        dk    }}|t#          |t$          ¦  «        r|d         n|z   }|t#          |t$          ¦  «        r|d         n|z   }|j                             dd¦  «        }|dv r| dz  |dz  ddœ|         }n|                     ||¬¦  «        }|                     t)          |||¦  «        ¦  «         t+          d„ |	|
||fD ¦   «         ¦  «        �rf|rt#          |	t$          ¦  «        r|	n|	g}n||z   t-          |dd…         ¦  «        z   g}|rt#          |
t$          ¦  «        r|
n|
g}n||z   g}t#          |t$          ¦  «        r|n|g}t#          |t$          ¦  «        r|n|g}|d         |d         d}}}t/          j        |||||¦  «        D ]§\  } }!}"}#}$|$€ nœ|"€d}"|#€d}#|"| €|t)          |||¦  «        z   n| z   }%|#|!€|n|!z   }&t3          |%|&|z
   |$¦  «        }'|                      |'|¦  «         t7          |¦  «        dk    r|                      |'|¦  «         |                     |'¦  «         |%}|&}|$}Œ¨�Œ«|r|	|z   n||z   t-          |dd…         ¦  «        z   }%|r|
|z   n||z   }&t3          |%|&|z
   |¦  «        }'|                      |'|¦  «         t7          |¦  «        dk    r|                      |'|¦  «         |                     |'¦  «         �ŒF|                     dd¦  «         |S )z>Convert an SVG <text> element to a ReportLab Group of Strings.rï  rð  rñ  r   úfont-familyúfont-weightú
font-styleú	font-sizerD   rE   r  ©FFÚdxÚdyrª   zbaseline-shiftÚ0)rÏ   rO   ÚbaselinerÃ   c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S rŒ   )r  r  )rt   r´   s     r6   rž   z4Svg2RlgShapeConverter.convertText.<locals>.<genexpr>€  s,   è è € ÐEÐE¨S•:˜c¥4Ñ(Ô(ÐEÐEÐEÐEÐEÐEr8   Nrö   Útspanr"   )rl  rM  ró  rò  r   r²   r#   r&   r%   r>  r`   r$   rô   r€  Úiter_text_noder¬   r­   r  r  rË   r   ÚanyÚsumÚ	itertoolsÚzip_longestr   r  r¸   r�  r÷  )(rU   r‚  ÚattrConvÚ	xml_spacerò  r¦  Úfrag_lengthsÚdx0Údy0rø   rû   ÚffÚfwÚfstyleÚfsrD   rE   Úsubnoder
  Úis_tailÚhas_xÚhas_yr;  r<  ÚbaseLineShiftÚxlistÚylistÚdxlistÚdylistÚlast_xÚlast_yÚ	last_charÚchar_xÚchar_yÚchar_dxÚchar_dyÚcharÚnew_xÚnew_yrÁ  s(                                           r6   ÚconvertTextz!Svg2RlgShapeConverter.convertTextD  s^  € àÔ%ˆØ×%Ò%Ð&:­6Ð&:Ð&:Ð&:Ñ;Ô;ˆ	Øð 	1Ø&¨*Ò4ˆNˆNà!Ô0ˆNå‰WŒWˆà$&ˆàˆØˆØ()ˆØ()ˆØ×Ò˜t ]Ñ3Ô3ÐHÕ7HˆØ×Ò˜t ]Ñ3Ô3ÐJÕ7JˆØ×"Ò" 4¨Ñ6Ô6ÐLÕ:LˆØ×'Ò'¨¨B°Ñ7Ô7ˆØ×Ò˜t [Ñ1Ô1ÐKµSÕ9JÑ5KÔ5KˆØ×#Ò# BÑ'Ô'ˆð ×(Ò(¨¨s°CÀÐ(ÑDÔD‰ˆˆ1Ý&4°T¸>Ñ&JÔ&Jð L	ñ L	Ñ"ˆG�T˜7Øð ØØ'‰LˆE�5Ø,-ˆBØ,-ˆBØ/0ˆMØð DØ!%×!:Ò!:ØØØØØØð ";ñ "ô "‘��B˜˜Bð ”N×&Ò& s¨BÑ/Ô/°2Ò5Ø”N×&Ò& s¨BÑ/Ô/°2Ò5ð �ð ¥j°µTÑ&:Ô&:ÐB˜R œU˜UÀÑC�Ø¥j°µTÑ&:Ô&:ÐB˜R œU˜UÀÑC�Ø#œN×.Ò.Ð/?ÀÑEÔEˆMØÐ <Ð<Ð<Ø)+¨¨a©¸"¸q¹&ÈaÐ PÐ PØ!ô!��ð !)× 6Ò 6°}ÈbÐ 6Ñ QÔ Q�à×Ò¥¨D°"°bÑ 9Ô 9Ñ:Ô:Ð:õ ÐEÐE°R¸¸RÀÐ4DÐEÑEÔEÑEÔEñ *Øð ?Ý",¨RµÑ"6Ô"6Ð@˜B˜B¸R¸D�E�Eà ™W¥s¨<¸¸¸Ô+<Ñ'=Ô'=Ñ=Ð>�EØð &Ý",¨RµÑ"6Ô"6Ð@˜B˜B¸R¸D�E�Eà ™W˜I�EÝ)¨"­dÑ3Ô3Ð=˜˜¸"¸�Ý)¨"­dÑ3Ô3Ð=˜˜¸"¸�Ø,1°!¬H°e¸A´hÀ 	˜�Ý>GÔ>SØ˜5 &¨&°$ñ?ô ?ð %ð %Ñ:�F˜F G¨W°dð �|Ø˜Ø�Ø"#˜Ø�Ø"#˜Ø#à!˜>ð ¥¨Y¸¸BÑ!?Ô!?Ñ?Ð?à#ñ�Eð
 $°° v vÀVÑL�EÝ" 5¨E°MÑ,AÐ*BÀDÑIÔI�EØ×*Ò*¨5°$Ñ7Ô7Ð7Ý  Ñ)Ô)¨WÒ4Ð4Ø×.Ò.¨u°gÑ>Ô>Ð>Ø—F’F˜5‘M”M�MØ"�FØ"�FØ $�I�Iùà%*ÐR˜˜b™˜°°S±½3¸|ÈCÈRÈCÔ?PÑ;QÔ;QÑ1Q�Ø%*Ð9˜˜b™˜°°S±�Ý˜u¨°Ñ(=Ð&>ÀÑEÔE�Ø×&Ò& u¨dÑ3Ô3Ð3Ý˜WÑ%Ô%¨Ò0Ð0Ø×*Ò*¨5°'Ñ:Ô:Ð:Ø—’�u‘”�‘à
�Š��B‰Œˆàˆ	r8   c                 óð  — |                      d¦  «        }|sdS t          |¦  «        }t          ¦   «         }|j        }g }g }d}d}	t	          dt          |¦  «        d¦  «        D �]3}
||
|
dz   …         \  }}|dv rC|
dk    r=|j        d         t          k    r'|                     t          |j        ¦  «        ¦  «         |dk    r |j	        |Ž  |d	d…         }�nµ|d
k    r |j
        |Ž  �n£|dk    rst          |¦  «        dk    rJ|dv r|}n
|d	d…         }|d         |d         z   |d         |d         z   }}| 	                    ||¦  «         n
 |j	        |Ž  |d	d…         }�n*|dk    r:|d	         |d         z   |d         |d         z   }}| 
                    ||¦  «         �nê|dk    r$| 
                    |d         |d         ¦  «         �nÀ|dk    r$| 
                    |d	         |d         ¦  «         �n–|dk    r-| 
                    |d	         |d         z   |d         ¦  «         �nc|dk    r-| 
                    |d	         |d         |d         z   ¦  «         �n0|dk    r |j        |Ž  �n|dk    rl|\  }}}}t          |¦  «        dk     s|dvr|d	d…         dz  \  }}}}n|dd…         \  }}}}|||z
  z   |||z
  z   }}|                     ||||||¦  «         �n¬|dk    rD|d	d…         \  }}|\  }}}}}}|                     ||z   ||z   ||z   ||z   ||z   ||z   ¦  «         �nb|dk    rx|\  }}}}t          |¦  «        dk     s|dvr|d	d…         dz  \  }}}}n|dd…         \  }}}}|||z
  z   |||z
  z   }}|                     ||||z   ||z   ||z   ||z   ¦  «         �nä|dk    r\|d	d…         \  }}|\  }}}}||f}	t          ||f||f||f¦  «        \  \  }}\  }}\  }}\  }}|                     ||||||¦  «         �n‚|dk    r|	�|	\  }}n|d	d…         \  }}|d	d…         \  }}|||z
  z   |||z
  z   }}||f}	|\  }}t          ||f||f||f¦  «        \  \  }}\  }}\  }}\  }}|                     ||||||¦  «         �ný|dk    rs|d	d…         \  }}|\  }}}}||z   ||z   ||z   ||z   f\  }}}}||f}	t          ||f||f||f¦  «        \  \  }}\  }}\  }}\  }}|                     ||||||¦  «         �n„|dk    rˆ|	�|	\  }}n|d	d…         \  }}|d	d…         \  }}|\  }}||z   ||z   }}|||z
  z   |||z
  z   }}||f}	t          ||f||f||f¦  «        \  \  }}\  }}\  }}\  }}|                     ||||||¦  «         nö|dv r¾|\  }}}}}}}|d	d…         \  }}|dk    r
||z  }||z  }t          |¦  «        d k    st          |¦  «        d k    r| 
                    ||¦  «         nŽt          |||||t          |¦  «        t          |¦  «        ||¦	  «	        } | D ]%\  }}}}}}}}|                     ||||||¦  «         Œ&n4|dv r|                     ¦   «          nt"                               d!|¦  «         |d"vrd}	|}�Œ5t'          ¦   «         }!|                      ||¦  «         |j        d         t          k    r'|                     t          |j        ¦  «        ¦  «         |re|j        �^t-          |¬#¦  «        }"t/          |¦  «        D ]"}#|"j                             |#t          ¦  «         Œ#|!                     |"¦  «         d|_        |!                     |¦  «         |!S )$z2Convert an SVG <path> element to a ReportLab Path.r¼   Nrª   r   rÃ   )r¿  ÚMrö   rd  rÿ   ÚLr¿  )ÚZÚzr"   ÚlÚHÚVÚhr¢   ÚCÚSr  >   rl  rm  rè   r�   éüÿÿÿrè   r�   ÚQÚTÚqÚt)ÚAr—   r—   g»½×Ùß|Û=zSuspicious path operator: %s)ro  rq  rp  rr  r·  )r­   r,   r   r$  rÌ   r›   Ú	operatorsr   rË   rº  r»  ÚcurveTor+   Úabsr*   rB  r¼  rÒ   r~  r   r  rh   rI   ÚreversedÚinsertr�  )$rU   r‚  r¼   ÚnormPathrY  r$  Úunclosed_subpath_pointersÚsubpath_startÚlastopÚlast_quadratic_cpr×   rÞ   ÚnumsÚstarting_pointÚxnÚynrù   rü   ÚxpÚypÚx0Úy0ÚxiÚyirø   rû   Ú_r'  r(  ÚphiÚfAÚfSÚbpr¦  Úclosed_pathÚpointers$                                       r6   ÚconvertPathz!Svg2RlgShapeConverter.convertPath°  s^	  € à�HŠH�S‰MŒMˆØð 	Ø�4Ý% aÑ(Ô(ˆÝ‰vŒvˆØ”ˆà/1Ð!Ø%'ˆØˆØ;?Ðå�q�#˜h™-œ-¨Ñ+Ô+ð V	ñ V	ˆAð    A¨¡E 	Ô*‰HˆB�à�ZÐÐ A¨¢E E¨d¬n¸RÔ.@ÅJÒ.NÐ.NØ)×0Ò0µ°T´^Ñ1DÔ1DÑEÔEÐEð �SŠyˆyØ�”˜TÐ"Ð"Ø & r s s¤�‘à�s’�Ø�”˜TÐ"Ð"Ñ"ð �s’�Ý�v‘;”; !Ò#Ð#Ø Ð+Ð+Ø)6˜˜à)/°°°¬˜Ø+¨AÔ.°°a´Ñ8¸.ÈÔ:KÈdÐSTÌgÑ:U˜�BØ—K’K  BÑ'Ô'Ð'Ð'à�D”K Ð&Ð&Ø & r s s¤�‘à�s’�Ø œ d¨1¤gÑ-¨v°b¬z¸DÀ¼GÑ/C�B�Ø—’˜B Ñ#Ô#Ð#Ñ#ð �s’�Ø—’˜D œG V¨B¤ZÑ0Ô0Ð0Ñ0Ø�s’�Ø—’˜F 2œJ¨¨Q¬Ñ0Ô0Ð0Ñ0ð �s’�Ø—’˜F 2œJ¨¨a¬Ñ0°&¸´*Ñ=Ô=Ð=Ñ=Ø�s’�Ø—’˜F 2œJ¨¨r¬
°T¸!´WÑ(<Ñ=Ô=Ð=Ñ=ð �s’�Ø�”˜dÐ#Ð#Ñ#Ø�s’�Ø!%‘��B˜˜BÝ�v‘;”; ’?�? fÐ4HÐ&HÐ&HØ%+¨B¨C¨C¤[°1¡_‘N�B˜˜B  à%+¨B¨C¨C¤[‘N�B˜˜B Ø˜r B™w™¨¨r°B©w©�B�Ø—’˜R  R¨¨R°Ñ4Ô4Ð4Ñ4ð �s’�Ø   œ‘��BØ)-Ñ&��B˜˜B  BØ—’˜R "™W b¨2¡g¨r°B©w¸¸R¹ÀÀbÁÈ"ÈrÉ'ÑRÔRÐRÑRØ�s’�Ø!%‘��B˜˜BÝ�v‘;”; ’?�? fÐ4HÐ&HÐ&HØ%+¨B¨C¨C¤[°1¡_‘N�B˜˜B  à%+¨B¨C¨C¤[‘N�B˜˜B Ø˜r B™w™¨¨r°B©w©�B�Ø—’˜R  R¨"¡W¨b°2©g°r¸B±wÀÀRÁÑHÔHÐHÑHð �s’�Ø   œ‘��BØ!%‘��B˜˜BØ%'¨ HÐ!Ý5TØ˜�H˜r 2˜h¨¨R¨ñ6ô 6Ñ2‘��A™˜˜R¡( 2 r©F¨Q°ð —’˜R  R¨¨R°Ñ4Ô4Ð4Ñ4Ø�s’�Ø$Ð0Ø.‘F�B˜˜à# B C Cœ[‘F�B˜Ø   œ‘��BØ˜r B™w™¨¨r°B©w©�B�Ø%'¨ HÐ!Ø‘��Bõ 4°R¸°H¸rÀ2¸hÈÈRÈÑQÔQñÙ�Q˜Ù�R˜Ù�R˜Ù�Q˜à—’˜R  R¨¨R°Ñ4Ô4Ð4Ñ4ð �s’�Ø   œ‘��BØ!%‘��B˜˜BØ!# b¡¨"¨r©'°2¸±7¸BÀ¹GÐ!C‘��B˜˜BØ%'¨ HÐ!Ý5TØ˜�H˜r 2˜h¨¨R¨ñ6ô 6Ñ2‘��A™˜˜R¡( 2 r©F¨Q°ð —’˜R  R¨¨R°Ñ4Ô4Ð4Ñ4Ø�s’�Ø$Ð0Ø.‘F�B˜˜à# B C Cœ[‘F�B˜Ø   œ‘��BØ‘��BØ˜b™ " r¡'�B�Ø˜r B™w™¨¨r°B©w©�B�Ø%'¨ HÐ!õ 4°R¸°H¸rÀ2¸hÈÈRÈÑQÔQñÙ�Q˜Ù�R˜Ù�R˜Ù�Q˜à—’˜R  R¨¨R°Ñ4Ô4Ð4Ð4ð �zÐ!Ð!Ø.2Ñ+��B˜˜R  R¨Ø   œ‘��BØ˜’9�9Ø˜"‘H�BØ˜"‘H�BÝ�r‘7”7˜eÒ#Ð#¥s¨2¡w¤w°%Ò'7Ð'7Ø—K’K  BÑ'Ô'Ð'Ð'å3Ø˜B  B¨­S°©W¬Wµc¸"±g´g¸rÀ2ñô �Bð 9;ð =ð =Ñ4˜˜1˜b " b¨"¨b°"ØŸš R¨¨R°°R¸Ñ<Ô<Ð<Ð<ð=ð �zÐ!Ð!Ø—’Ñ Ô Ð Ð õ —’Ð;¸RÑ@Ô@Ð@àÐ-Ð-Ð-Ø$(Ð!ØˆF‰Få‰WŒWˆØ×Ò˜t TÑ*Ô*Ð*àŒ>˜"Ô¥Ò+Ð+Ø%×,Ò,­S°´Ñ-@Ô-@ÑAÔAÐAà$ð 	"¨¬Ð)Cõ '°Ð6Ñ6Ô6ˆKÝ#Ð$=Ñ>Ô>ð Bð B�ØÔ%×,Ò,¨WµjÑAÔAÐAÐAØ�FŠF�;ÑÔÐØ!ˆDŒNà
�Šˆt‰ŒˆØˆ	r8   c                 óf  — |                       |dddd¦  «        \  }}}}|j        }t          t          |¦  «        t          ||z   ¦  «        t          |¦  «        t          |¦  «        |¦  «        }t	          |¦  «        }|                     d||z   dz  ¦  «         |                     dd¦  «         |S )	z4Convert an SVG <image> element to a ReportLab Image.rD   rE   rF   rG   r   rÃ   r"   rö   )r€  rŸ  r   rB  r   r  r÷  )rU   r‚  rD   rE   rF   rG   r-   r•  s           r6   ÚconvertImagez"Svg2RlgShapeConverter.convertImagei  s§   € à"×7Ò7Ø�#�s˜G Xñ
ô 
Ñˆˆ1ˆe�Vð Ô%ˆÝ•c˜!‘f”f�c ! f¡*™oœo­s°5©z¬z½3¸v¹;¼;ÈÑNÔNˆå�e‘”ˆØ�Š˜˜A ™J¨!Ñ+Ñ,Ô,Ð,Ø�Š�A�rÑÔÐØˆr8   rË  r•  c                 ób  — | j                              |¦  «        }|D �]�\  }}|dk    r$t          |t          ¦  «        s||f} |j        |Ž  Œ0|dk    r+t          |t
          t          f¦  «        r|df} |j        |Ž  Œa|dk    rœt          |t          ¦  «        rt          |¦  «        dk    r| 	                    |¦  «         Œ¥t          |¦  «        dk    rI|\  }}}|                     ||¦  «         | 	                    |¦  «         |                     | | ¦  «         �Œ|dk    r| 
                    |d¦  «         �Œ!|dk    r| 
                    d|¦  «         �Œ?|d	k    r/t          |¦  «        d
k    rt          |j        |¦  «        |_        �Œtt                               d||¦  «         �Œ’dS )zÆApply an SVG transformation to a ReportLab Group.

        Args:
            transform: The SVG transform attribute string.
            group: The ReportLab Group to apply the transform to.
        r÷  r  r   Úrotater"   r  ÚskewXÚskewYÚmatrixé   zIgnoring transform: %s %sN)rl  rß   r  rÐ   r÷  rB  rÈ   r  r›   r“  Úskewr    rË  rÒ   r~  )	rU   rË  r•  ÚtrrÞ   ÚvaluesÚangler÷   rú   s	            r6   rÎ  z+Svg2RlgShapeConverter.applyTransformOnGroupv  sÓ  € ð Ô×0Ò0°Ñ;Ô;ˆØð 	Fñ 	F‰JˆB�Ø�WŠ}ˆ}Ý! &­%Ñ0Ô0ð .Ø$ fÐ-�FØ�”˜VÐ$Ð$Ð$Ø�{Ò"Ð"Ý˜f¥s­E lÑ3Ô3ð 'ð $ Q˜Y�FØ�” Ð(Ð(Ð(Ø�x’�Ý! &­%Ñ0Ô0ð .µC¸±K´KÀ1Ò4DÐ4DØ—L’L Ñ(Ô(Ð(Ð(Ý˜‘[”[ AÒ%Ð%Ø$*‘M�E˜2˜rØ—O’O B¨Ñ+Ô+Ð+Ø—L’L Ñ'Ô'Ð'Ø—O’O R C¨"¨Ñ-Ô-Ð-ùØ�w’�Ø—
’
˜6 1Ñ%Ô%Ð%Ñ%Ø�w’�Ø—
’
˜1˜fÑ%Ô%Ð%Ñ%Ø�x’�¥C¨¡K¤K°1Ò$4Ð$4Ý"'¨¬¸Ñ"@Ô"@�”‘å—’Ð8¸"¸fÑEÔEÐEÑEð5	Fð 	Fr8   FrÁ  Úonly_explicitc                 ó„  — 	 dgdddgfdgdddgfd	gd
ddgfdgdddgfdgdddgfdgdddgfdgdddgfdgdddgfdgdddgff	}g d ¢d!d"t           t          t          gfd#gd$dt          t          ¦  «        gfd%gd&d'd(gff}|j        t          k    r$|j        D ]}|                      |||¬)¦  «         Œd*S | j	        }||fD �]º}|j        t          k    r||k    rŒ|D �]œ\  }	}
}}g }t          |	¦  «        D �]$\  }}|                     ||¦  «        }|d+k    r‡|rŒ%|dk    r8t          |dd*¦  «        �'t          |j        d,d¦  «        dk    r|j        j        }nF|dk    r8t          |dd*¦  «        �'t          |j        d,d¦  «        dk    r|j        j        }n||         }|d-k    r#|                     |j        d.¦  «        p||         }t%          |t          ¦  «        r(|                     d/d+¦  «                             ¦   «         }|                     |¦  «         �Œ&	 t          ||¦  «        }t-          ||
 ||Ž ¦  «         �Œf# t.          t0          t2          f$ r t4                               d0¦  «         Y �Œšw xY w�Œ¼t          |dd*¦  «        �|j        r|j        |j        _        t          |dd*¦  «        d1k    r	d*|_        d*S d*S )2a  Apply styles from an SVG node to a ReportLab shape.

        Args:
            shape: The ReportLab shape to apply styles to.
            node: The lxml node to get style attributes from.
            only_explicit: If True, only apply explicitly defined attributes.
        r/  rh   r'  Úblackzfill-opacityÚfillOpacityr  r"   z	fill-ruleÚ	_fillRuler  r  ÚstrokerY   r  zstroke-widthrX   rô   r©   zstroke-opacityÚstrokeOpacityzstroke-linejoinÚstrokeLineJoinr,  r=  zstroke-linecapÚstrokeLineCapr0  zstroke-dasharrayr2  r3  )r6  r7  r8  ÚfontNamer>  r9  ÚfontSizeztext-anchorÚ
textAnchorrÁ   Ústart)rœ  Nrª   Úalphar  r&  z
!importantz"Exception during applyStyleOnShaper   )r#   r&   r%   r`   r$   rV   r   r­  r  rl  r   rÊ   r²   r#  rh   r©  rY   r±   r  rÍ   rs   rË   Úsetattrr%  ÚKeyErrorrÑ   rÒ   r~  rŸ  )rU   rÁ  r‚  rœ  ÚmappingNÚmappingFÚsubshapeÚacÚmappingÚsvgAttrNamesÚrlgAttrÚfuncry  ÚsvgAttrValuesÚindexÚsvgAttrNameÚsvgAttrValueÚmeths                     r6   r  z'Svg2RlgShapeConverter.applyStyleOnShapeš  s¼  € ð 	Lð ˆX�{ N°W°IÐ>ØÐ˜}Ð.>ÀÀÐDØˆ]˜KÐ):¸Y¸KÐHØˆZ˜¨¸¸ÐAØÐ˜}¨oÀ¸uÐEØÐ Ð2BÀQÀCÐHØÐ Ð"2Ð4EÈÀuÐMØÐ Ð2BÀSÀEÐJØ Ð!Ð#4Ð6HÈ6È(ÐSð

ˆð =Ð<Ð<ØØ#Ý"Õ$7Õ9KÐLð	ð ˆ]˜J¨½#Õ>OÑ:PÔ:PÐ9QÐRØˆ_˜l¨D°7°)Ð<ð	
ˆð Œ?�eÒ#Ð#à!œNð Tð T�Ø×&Ò& x°À]Ð&ÑSÔSÐSÐSØˆFàÔˆØ  (Ð+ð #	Gñ #	GˆGØŒ¥&Ò(Ð(¨W¸Ò-@Ð-@ØØ9@ð  Gñ  GÑ5�˜g t¨XØ "�Ý*3°LÑ*AÔ*Að 7ñ 7Ñ&�E˜;Ø#%§;¢;¨t°[Ñ#AÔ#A�LØ# rÒ)Ð)Ø(ð %Ø$à'¨>Ò9Ð9Ý '¨¨{¸DÑ AÔ AÐ MÝ '¨¬¸À!Ñ DÔ DÈÒ IÐ Ià+0¬?Ô+@˜L˜Là'Ð+;Ò;Ð;Ý '¨¨}¸dÑ CÔ CÐ OÝ '¨Ô(9¸7ÀAÑ FÔ FÈ!Ò KÐ Kà+0Ô+<Ô+B˜L˜Là+3°E¬?˜LØ# ~Ò5Ð5àŸKšK¨¬°WÑ=Ô=ÐPÀÈ%Äð %õ " ,µÑ4Ô4ð VØ'3×';Ò';¸LÈ"Ñ'MÔ'M×'SÒ'SÑ'UÔ'U˜Ø!×(Ò(¨Ñ6Ô6Ð6Ñ6ðGÝ" 2 tÑ,Ô,�DÝ˜E 7¨D¨D°-Ð,@ÑAÔAÐAÑAøÝ&­µ*Ð=ð Gð Gð GÝ—L’LÐ!EÑFÔFÐFÐFÑFðGøøøñ? GõB �5˜-¨Ñ.Ô.Ð:¸u¼Ð:Ø$)Ô$5ˆEŒOÔ!Ý�5˜-¨Ñ.Ô.°!Ò3Ð3ð !%ˆEÔÐÐð 4Ð3s   È$H?È?1I4É3I4rŒ   r  )r\   r]   r^   r_   r`   r   r	   r   r$   rÈ   r   r€  r   r%  r   r³  r   r+  r   r-  r2  r   r4  rb  r�  r‘  rÎ  r  r  ri   r8   r6   rm  rm  º  s}  € € € € € ØIÐIðð  ð ¨Cð ¸8ÀC¼=ð ÐTWð ð ð ð ðF +ð	
ð 
ð 
àð
ð ð
ð ð	
ð
 ð
ð 
ˆeŒð
ð 
ð 
ð 
ð< ð ¨ð ð ð ð ð7 ð 7¨°¬ð 7ð 7ð 7ð 7ð! #ð !¨&ð !ð !ð !ð !ð
. 3ð .¨7ð .ð .ð .ð .ð Cð ¨H°S¬Mð ð ð ð ð8 3ð ¨8°GÔ+<ð ð ð ð ðj ð j¨ð jð jð jð jðXw ð w¨°¬ð wð wð wð wðr ð ¨ð ð ð ð ð"F¨sð "F¸3ð "FÀ4ð "Fð "Fð "Fð "FðP $ð	[%ð [%àð[%ð ð[%ð ð	[%ð
 
ð[%ð [%ð [%ð [%ð [%ð [%r8   rm  FrY  Úresolve_entitiesrK   c                 ó’  — t          | t          j        ¦  «        rt          | ¦  «        } d}t          | t          ¦  «        r¹t          j                             | ¦  «        d                              ¦   «         dk    r~t          j	        | d¦  «        5 }t          | dd…         d¦  «        5 }t          j        ||¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   | dd…         } d}t          | |¬	¦  «        }|€dS t          | fi |¤Ž}|                     |¦  «        }|rt	          j        | ¦  «         |S )
az  Convert an SVG file to a ReportLab Drawing object.

    Args:
        path: A file path, file-like object, or pathlib.Path to the SVG file.
        resolve_entities: Whether to resolve XML entities (default False).
        **kwargs: Additional keyword arguments for the SvgRenderer.

    Returns:
        A ReportLab Drawing object, or None if the file cannot be processed.
    Fr"   z.svgzÚrbNrö   ÚwbT)r¹  )r  Úpathlibr   r`   rh  rY  Úsplitextr  ÚgziprØ  ÚshutilÚcopyfileobjr^  r[  re  r  )	rY  r¹  rK   ÚunzippedÚf_inÚf_outÚsvg_rootÚsvgRendererr†  s	            r6   Úsvg2rlgrÇ  ø  s½  € õ �$�œÑ%Ô%ð Ý�4‰yŒyˆð €HÝ�$�ÑÔð ¥¤×!1Ò!1°$Ñ!7Ô!7¸Ô!:×!@Ò!@Ñ!BÔ!BÀgÒ!MÐ!MÝŒY�t˜TÑ"Ô"ð 	, d­D°°c°r°c´¸DÑ,AÔ,Að 	,ÀUÝÔ˜t UÑ+Ô+Ð+ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,à�C�R�CŒyˆØˆå˜TÐ4DÐEÑEÔE€HØÐØˆtõ ˜dÐ-Ð- fÐ-Ð-€KØ× Ò  Ñ*Ô*€Gð ð Ý
Œ	�$‰Œˆà€Ns6   ÂC#Â*CÃ C#ÃC	ÃC#ÃC	ÃC#Ã#C'Ã*C'r$  c                 óü   — | sdS t          | ¦  «        dk     rdS | d         }| d         }t          dt          | ¦  «        dz
  d¦  «        D ] }|| |         k    s|| |dz            k    r dS Œ!| dxx         dz  cc<   dS )a  Nudge the first coordinate if all coordinate pairs are identical.

    This is a workaround for a ReportLab issue where shapes of size zero
    are not rendered, even if they have a visible stroke.

    Args:
        points: A list of coordinates [x1, y1, x2, y2, ...].
    Nr  r   r"   rÃ   g›ò×  ð?)r›   rÌ   )r$  rD   rE   r×   s       r6   r#  r#    s£   € ð ð ØˆÝ
ˆ6�{„{�Q‚€ØˆØˆqŒ	€AØˆqŒ	€AÝ�1•c˜&‘k”k A‘o qÑ)Ô)ð ð ˆØ��q”	Š>ˆ>˜Q &¨¨Q©¤-Ò/Ð/ØˆEˆEð 0ð 	ˆqˆ	ˆ	Œ	�YÑˆ	ˆ	‰	ˆ	ˆ	r8   c                 óð   — t          j        dd|¬¦  «        }	 t          j        | |¬¦  «        }|                     ¦   «         }|S # t          $ r&}t
                               d|¦  «         Y d}~dS d}~ww xY w)a  Load an SVG file and return the root lxml node.

    Args:
        path: A file path or file-like object for the SVG file.
        resolve_entities: Whether to resolve XML entities.

    Returns:
        The root lxml node of the SVG document, or None on failure.
    T)Úremove_commentsÚrecoverr¹  )ÚparserzFailed to load input file! (%s)N)r!   Ú	XMLParserÚparseÚgetrootÚ	ExceptionrÒ   r	  )rY  r¹  rÌ  ÚdocrÅ  Úexcs         r6   r^  r^  6  s’   € õ Œ_Ø dÐ=Mðñ ô €FðÝŒk˜$ vÐ.Ñ.Ô.ˆØ—;’;‘=”=ˆð
 ˆøõ	 ð ð ð Ý�ŠÐ6¸Ñ<Ô<Ð<Øˆtˆtˆtˆtˆtøøøøðøøøs   ™*A Á
A5ÁA0Á0A5r‚  c                 óf   — 	 | j                              d¦  «        d         S # t          $ r Y dS w xY w)z»Return the name of an lxml node without the namespace prefix.

    Args:
        node: The lxml node.

    Returns:
        The node name as a string, or None if the node is invalid.
    Ú}rö   N)rö  rr   r%  )r‚  s    r6   r¸   r¸   O  sB   € ðØŒx�~Š~˜cÑ"Ô" 2Ô&Ð&øÝð ð ð Øˆtˆtðøøøs   ‚" ¢
0¯0rò  rÅ  c           	   #   óÀ  K  — |dk    }| j         r=t          | j         |||o$t          |                      ¦   «         ¦  «        dk    ¬¦  «        nd}| |dfV — |                      ¦   «         D ]}t          |||dz   ¬¦  «        E d{V —† Œ|dk    rN|dk    o|                      ¦   «         du }| j        rt          | j        ||¬¦  «        nd}|dvr| j        |d	fV — dS dS dS )
a›  Recursively iterate through a text node and its children.

    This generator yields the node, its text, and its tail text, handling
    whitespace according to the 'xml:space' attribute.

    Args:
        node: The lxml node to start iteration from.
        preserve_space: Whether to preserve whitespace.
        level: The current recursion level.

    Yields:
        A tuple of (node, text, is_tail).
    r   )Ústrip_startÚ	strip_endNFr"   )rÅ  )r×  r  T)	r
  Ú
clean_textr›   r  r²  rA  ÚgetnextÚtailr±   )r‚  rò  rÅ  Úlevel0r
  r´  r×  rÚ  s           r6   rA  rA  ^  sN  è è € ð �aŠZ€Fð Œ9ð	�
ØŒIØØØÐ>¥# d×&6Ò&6Ñ&8Ô&8Ñ"9Ô"9¸QÒ">ð		
ñ 	
ô 	
ð 	
ð ð 	ð ��eÐ
ÐÐÐà×#Ò#Ñ%Ô%ð Jð JˆÝ! %¨¸uÀq¹yÐIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIàˆq‚y€yØ˜Q’JÐ9 4§<¢<¡>¤>°TÐ#9ˆ	ð Œyð�J�t”y .¸IÐFÑFÔFÐFàð 	ð
 �zÐ!Ð!Ø”+˜t TÐ)Ð)Ð)Ð)Ð)Ð)ð €yð "Ð!r8   r
  rÖ  r×  c                 ó"  — | €dS |                       dd¦  «                              dd¦  «                              dd¦  «        } |sJ|r|                      ¦   «         } |r|                      ¦   «         } d| v r|                       dd¦  «        } d| v °| S )ai  Clean text content according to SVG whitespace handling rules.

    Args:
        text: The text content to clean.
        preserve_space: Whether to preserve whitespace.
        strip_start: Whether to strip leading whitespace.
        strip_end: Whether to strip trailing whitespace.

    Returns:
        The cleaned text, or None if the input was None.
    Nz
rÅ   ú
ú	z  )rÍ   ÚlstripÚrstrip)r
  rò  rÖ  r×  s       r6   rØ  rØ  ˆ  sŸ   € ð" €|ØˆtØ�<Š<˜ Ñ$Ô$×,Ò,¨T°3Ñ7Ô7×?Ò?ÀÀcÑJÔJ€DØð +Øð 	!Ø—;’;‘=”=ˆDØð 	!Ø—;’;‘=”=ˆDØ�dˆlˆlØ—<’<  cÑ*Ô*ˆDð �dˆlˆlà€Kr8   Úsource_shapeÚ
dest_shapec                 ó¢   — |                       ¦   «                              ¦   «         D ]'\  }}	 t          |||¦  «         Œ# t          $ r Y Œ$w xY wdS )z²Copy properties from one ReportLab shape to another.

    Args:
        source_shape: The shape to copy properties from.
        dest_shape: The shape to copy properties to.
    N)rZ   r¯   rª  r%  )rá  râ  Úpropr´   s       r6   r½  r½  ¦  ss   € ð "×/Ò/Ñ1Ô1×7Ò7Ñ9Ô9ð ð ‰	ˆˆcð	Ý�J  cÑ*Ô*Ð*Ð*øÝð 	ð 	ð 	ØˆDð	øøøðð s   ­?¿
AÁAc                  óâ   ‡‡— ddl m}  ddlm} | j        Šdt
          dt
          dt
          dt
          fˆfd„}|| _        |j        Šd	t
          dt
          dt
          dt
          fˆfd
„}||_        dS )zÌApply a patch to ReportLab to handle path fill rules correctly.

    This patch addresses an issue where ReportLab does not honor the
    'fill-rule' attribute of SVG paths, defaulting to 'even-odd'.
    r   )Úshapes)ÚCanvasrY  Ú	drawFuncsrK   r.   c                 ój   •— 	 | j         |d         j        _        n# t          $ r Y nw xY w ‰| |fi |¤ŽS )Nr   )r   Ú__self__ÚfillModer%  )rY  rè  rK   Úoriginal_renderPaths      €r6   ÚpatchedRenderPathz0monkeypatch_reportlab.<locals>.patchedRenderPath¿  sW   ø€ ð	Ø-1¬^ˆI�aŒLÔ!Ô*Ð*øÝð 	ð 	ð 	ØˆDð	øøøà"Ð" 4¨Ð=Ð=°fÐ=Ð=Ð=s   ƒ ›
(§(rU   c                 óŠ   •— | j         }t          |d¦  «        r|j        | _         nt          | _          ‰| |fi |¤Ž || _         d S )Nrë  )Ú	_fillModer   rë  r   )rU   rY  rK   ÚcurrentÚoriginal_drawPaths       €r6   ÚpatchedDrawPathz.monkeypatch_reportlab.<locals>.patchedDrawPathÌ  sT   ø€ Ø”.ˆÝ�4˜Ñ$Ô$ð 	+Ø!œ]ˆDŒNˆNå*ˆDŒNØÐ˜$ Ð/Ð/¨Ð/Ð/Ð/Ø ˆŒˆˆr8   N)Úreportlab.graphicsræ  Úreportlab.pdfgen.canvasrç  Ú_renderPathr   ÚdrawPath)ræ  rç  rí  rò  rñ  rì  s       @@r6   Úmonkeypatch_reportlabr÷  ´  sÆ   øø€ ð *Ð)Ð)Ð)Ð)Ð)Ø.Ð.Ð.Ð.Ð.Ð.à Ô,Ðð>¥ð >µð >½sð >Åsð >ð >ð >ð >ð >ð >ð +€FÔàœÐð!�cð !­ð !½ð !Åð !ð !ð !ð !ð !ð !ð &€F„O€O€Or8   )Nr9   r9   Nr@  r  rš   r:  rà   )nr_   rÓ  rS   r¿  rD  rÆ  rh  r½  rÎ   rë   rÀ  Úcollectionsr   r   Úior   Útypingr   r   r   r	   r
   r   ÚPILr   r×  Úreportlab.graphics.shapesr   r   r   r   r   r   r   r   r   r   r   r   Úreportlab.libr   Úreportlab.lib.unitsr   r   Úreportlab.pdfbase.pdfmetricsr   rô  r   r   Úreportlab.pdfgen.pdfimagesr   Úreportlab.graphics.transformr    ÚImportErrorr|   rx   Úlxmlr!   Úfontsr#   r$   r%   r&   r'   r(   rB   r)   r@   Úutilsr*   r+   r,   r7   r`   r  ró  Úobjectrß  Ú	getLoggerr\   rÒ   rC   ÚcompileÚfindallÚsplit_whitespacerI   rd   ÚMatcherrk   rŠ   râ   ÚElementWrapperrD  rÐ  rV  rX  r[  r
  rm  ri  rÇ  rÈ   r#  r^  r¸   rB  rA  rØ  r½  r÷  ri   r8   r6   ú<module>r     s  ððð ð( €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø Ð Ð Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :à !Ð !Ð !Ð !Ð !Ð !ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð !Ð  Ð  Ð  Ð  Ð  Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø /Ð /Ð /Ð /Ð /Ð /ð0Ø2Ð2Ð2Ð2Ð2Ð2Ð2øØð 0ð 0ð 0à/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð0øøøð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð H¤Nð °x´~ð ð ð ð ð,  $ØØØ!%ðRð RØðRà˜Œ}ðRð ðRð ð	Rð
 ˜#”ðRð ˆ8�CŒ=˜$ÐÔðRð Rð Rð Rð6 :Bð6ð 6Øð6Øð6Ø36ð6à
ˆ3�ˆ9Ôð6ð 6ð 6ð 6ð( 
0€ð ˆ&‰(Œ(€à	ˆÔ	˜8Ñ	$Ô	$€à€j�Ð5Ð5Ð5Ñ6Ô6€à�2”:Ð.Ñ/Ô/Ô7Ð ðð ð ð ð �4ñ ô ð ð.ð ð ð ð �4ñ ô ð ð05ð 5ð 5ð 5ð 5�Ô#ñ 5ô 5ð 5ð>Wð Wð Wð Wð Wñ Wô Wð WðtR%ð R%ð R%ð R%ð R%Ð 2ñ R%ô R%ð R%ðj'7ð '7ð '7ð '7ð '7�*Ô+ñ '7ô '7ð '7ðT	ð 	ð 	ð 	ð 	�yñ 	ô 	ð 	ð7ð 7ð 7ð 7ð 7ñ 7ô 7ð 7ð@lð lð lð lð lñ lô lð lð^Rð Rð Rð Rð Rñ Rô Rð Rð,{%ð {%ð {%ð {%ð {%Ð-ñ {%ô {%ð {%ð~ BGð$ð $Ø
��R”[ Ô%Ð%Ô
&ð$Ø:>ð$ØRUð$àˆgÔð$ð $ð $ð $ðN˜˜eœð ¨ð ð ð ð ð0 BGðð Ø
��R”[ Ô%Ð%Ô
&ðØ:>ðàˆc„]ðð ð ð ð2�Cð ˜H SœMð ð ð ð ð'*ð '*˜ð '*¨dð '*¸3ð '*Àsð '*ð '*ð '*ð '*ðZ Øð	ð Ø
�3Œ-ðàðð ðð ð	ð
 ˆc„]ðð ð ð ð<¨ð ¸ð Àð ð ð ð ð!&ð !&ð !&ð !&ðH Ð Ñ Ô Ð Ð Ð s   ÂB ÂB%Â$B%