
    ]Mhn                    2   d Z ddlmZ ddlmZ ddlmZ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 ddlmZ dd	lmZ dd
lmZ ddlZddlZddlZej        dz
  Z ej        e          ZdZdZ  G d de!          Z" G d de!          Z#d Z$ G d de!          Z% G d de%          Z& G d de%          Z' G d de%          Z( G d de%          Z) G d de)          Z* G d  d!e)          Z+ G d" d#e!          Z, G d$ d%e,          Z- G d& d'e-          Z. G d( d)e,          Z/ G d* d+e,          Z0 G d, d-e!          Z1 G d. d/e!          Z2 G d0 d1e!          Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZA G d@ dAe!          ZB G dB dCeB          ZC G dD dEeB          ZDdF ZEdG ZF G dH dIeB          ZG G dJ dKeB          ZH G dL dMeB          ZI G dN dOeI          ZJ G dP dQeI          ZK G dR dSeI          ZL G dT dUeB          ZM G dV dWe!          ZNdX ZOdY ZPdZ ZQd[ ZRd\ ZSd] ZTd^ ZU G d_ d`e!          ZV G da dbeB          ZWdc ZXdd ZYde ZZdf Z[dg Z\dh Z] G di djeI          Z^ G dk dleB          Z_ G dm dneB          Z`do Zadp Zbdq Zc G dr dse!          Zd G dt due!          Ze G dv dweB          Zfg dxdydzd{d ef            fd|d}dd~dd eD            fdddd eD            fdddd eD            fdddd eD            fdddd eD            fddddddddddg ddfddddg ddfddddddddddddd eM            fddddd eW            fdddd eJ            fdd/dd e_            fdddd e^            fdd1dd eL            fdddd e`            fZgdxdddg ddfdd/dd e_            fdddd e^            fdd1dd eL            fdddd e`            fgZhdZidZjdejeidddfddddddddddddddddddddddd eK            fgZkdejeidddfddddddddddddddddd eK            fgZldȄ Zm emek            emeg            G dɄ dejn                  Zo G d˄ dejn                  Zp G d̈́ de!          Zqdτ Zr G dЄ deq          Zs G d҄ deq          Zt G dԄ deq          Zu G dք de!          Zv G d؄ dev          Zw G dڄ dev          Zx G d܄ dev          Zy G dބ de!          Zzg dZ{dZ| e}e{          e|k    sJ i Z~ ee|          D ]Zee~e{e         <   g dZdZ e}e          ek    sJ g dZdZ e}e          ek    sJ g dZdZ e}e          ek    sJ dS )a+  cffLib: read/write Adobe CFF fonts

OpenType fonts with PostScript outlines embed a completely independent
font file in Adobe's *Compact Font Format*. So dealing with OpenType fonts
requires also dealing with CFF. This module allows you to read and write
fonts written in the CFF format.

In 2016, OpenType 1.8 introduced the `CFF2 <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2>`_
format which, along with other changes, extended the CFF format to deal with
the demands of variable fonts. This module parses both original CFF and CFF2.

    )sstruct)psCharStrings)	unionRectintRect)bytechrbyteord	bytesjointobytestostrsafeEval)TTFont)OTTableWriter)OTTableReader)otTables)BytesION   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                   f    e Zd ZdZddZd Zd Zd Zd ZddZ	d	 Z
dd
Zd Zd Zd Zd Zd ZdS )
CFFFontSetan  A CFF font "file" can contain more than one font, although this is
    extremely rare (and not allowed within OpenType fonts).

    This class is the entry point for parsing a CFF table. To actually
    manipulate the data inside the CFF font, you will want to access the
    ``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet``
    object can either be treated as a dictionary (with appropriate
    ``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict`
    objects, or as a list.

    .. code:: python

            from fontTools import ttLib
            tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf")
            tt["CFF "].cff
            # <fontTools.cffLib.CFFFontSet object at 0x101e24c90>
            tt["CFF "].cff[0] # Here's your actual font data
            # <fontTools.cffLib.TopDict object at 0x1020f1fd0>

    Nc                    || _         t          j        t          |                    d          |            |+|rdnd}| j        |k    rt          d|| j        fz            n| j        dv s
J d            | j        dk    }|st          j        d|                    d                    d	         | _        |	                    | j
                   t          d
 t          ||          D                       | _        t          ||          | _        t!          |          | _        nt          j        d|                    d                    d	         | _        |	                    | j
                   dg| _        |j        }t          ||| j        |          | _        d| _        t)          ||          | _        | j        | j        _        | j        | j        _        dS )a  Parse a binary CFF file into an internal representation. ``file``
        should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
           N   r   2Invalid CFF 'major' version: expected %d, found %dr   r   Unknown CFF formatBr   c              3   4   K   | ]}t          |          V  d S Nr   .0ss     Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/cffLib/__init__.py	<genexpr>z'CFFFontSet.decompile.<locals>.<genexpr>b   s(      !O!Oq%((!O!O!O!O!O!O    isCFF2>HCFF2Font)otFontr   unpackcffHeaderFormatreadmajor
ValueErrorstructoffSizeseekhdrSizelistIndex	fontNamesTopDictIndextopDictIndexIndexedStringsstringstopDictSizegetGlyphOrderGlobalSubrsIndexGlobalSubrs)selffiler)   r&   expected_majorcff2GetGlyphOrders         r"   	decompilezCFFFontSet.decompileF   s    		!d;;; #)/QQaNz^++ H%tz23   , :''')='''Z1_F 	 !=diill;;A>DLIIdl###!!O!OE$v4N4N4N!O!O!OOODN ,T& A A AD)$//DLL%}T499Q<<@@CDIIdl###(\DN & 4 ,')9&! ! !D  DL+D@@@$(L!(,(8%%%r$   c                 *    t          | j                  S r   )lenr5   r>   s    r"   __len__zCFFFontSet.__len__s   s    4>"""r$   c                 *    t          | j                  S r   )r3   r5   rE   s    r"   keyszCFFFontSet.keysv   s    DN###r$   c                     | j         S r   )r7   rE   s    r"   valueszCFFFontSet.valuesy   s      r$   c                 $   t          |d          r|                                }n_t          |t                    r;|}	 | j                            |          }n,# t          $ r t          |          w xY wt          |          | j	        |         S )z{Return TopDict instance identified by name (str) or index (int
        or any object that implements `__index__`).
        	__index__)
hasattrrL   
isinstancestrr5   indexr.   KeyError	TypeErrorr7   )r>   nameOrIndexrP   names       r"   __getitem__zCFFFontSet.__getitem__|   s     ;,, 		)))++EES)) 	)D,,,T22 , , ,{+++, K((( ''s   A A3c                    || _         |+|rdnd}| j        |k    rt          d|| j        fz            n| j        dv s
J d            | j        dk    }|j        r |s| j        D ]}|                                 |st                      }nd}t          |          }| j                            || |          }|r{d| _	        |
                    t          j        t          |                      |                                | _        |
                    t!          j        d	| j                             nhd
| _	        d
| _        |
                    t          j        t          |                      |
                    t!          j        d| j                             |sXt%                      }	| j        D ]}
|	                    |
           |
                    |	                    || |                     |
                    |           |s'|
                    |                                           |
                    | j                            || |                     | j        D ]4}t-          |d          r|j        |                                }||_        5|                    |          }|D ]}|
                    |           |                    |           dS )a  Write the object back into binary representation onto the given file.
        ``file`` should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
        Nr   r   r   r   r   r%      r'      r   charset)r)   r-   r.   recalcBBoxesr7   recalcFontBBoxr8   	CFFWritergetCompilerr2   addr   packr+   getDataLengthr:   r/   r0   r4   r5   appendr=   rM   rY   r;   getChildrentoFile)r>   r?   r)   r&   r@   topDictr9   writertopCompilerr5   rT   rY   childrenchilds                 r"   compilezCFFFontSet.compile   s    "(/QQaNz^++ H%tz23   , :''')='''Z1_F 	)v 	), ) )&&(((( 	$&&GGG6""'33GT&3QQ 
	7DLJJw|OT::;;;*88::DJJv{4)9::;;;;DLDLJJw|OT::;;;JJv{355666 	LI ' '  &&&&JJy,,Wd6,JJKKK

; 	.JJw**,,---

4#//f/MMNNN( 	* 	*G7I.. *'/2I ..00")**733 	 	EJJudr$   c                    |                     d| j                   |                                 |                     d| j                   |                                 | j        D ]}|                    dt          |                     |                                 | |         }|                    |           |                    d           |                                 |                                 |                    d           |                                 | j	                            |           |                    d           |                                 dS )zWrite the object into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff.toXML(writer)

        r-   valueminorCFFFontrT   r=   N)
	simpletagr-   newlinerm   r5   begintagr   toXMLendtagr=   )r>   	xmlWriterfontNamefonts       r"   rs   zCFFFontSet.toXML   s_    	G4:666G4:666 	  	 HyuX???>DJJy!!!Y'''=)))y)))'''r$   c                 ,   || _         t          | d          sd| _        t          | d          sd| _        |dk    r | j        dk    rt          | d          sd| _        t          | d          sd| _        t          | d	          st                      | _        t          | d
          sg | _        t                      | _
        |d         }| j                            |           t          | j                  }d|_        n| j        dk    rt          | d          sd| _        t          | d	          st                      | _        t          | d
          sdg| _        | j         j        }t          | j        |          }t          d|          | _
        | j
                            |           |D ]5}t          |t                     r|\  }}}|                    |||           6t          |d          r?|j        d         j        /|j        }	|	D ]'}
t          |
d          r|j        |
j        _        $dS dS dS |d	k    rt,          j        }t          | d	          st                      | _        |D ]Y}t          |t                     r|\  }}} |            }|                    |||           | j                            |           ZdS |dk    rt1          |d                   | _        dS |dk    rt1          |d                   | _        dS dS )z?Reads data from the XML element into the ``CFFFontSet`` object.r-   r   rm   r   rn   r0   rX   r2   r=   r5   rT   )r=   Nr   rW   r(   )r=   rA   VarStorePrivaterl   )r)   rM   r-   rm   r0   r2   r<   r=   r5   r6   r7   ra   TopDictrY   r;   rN   rO   fromXMLFDArrayvstorery   rz   r   T2CharStringint)r>   rT   attrscontentr)   rv   rd   rA   elementfdArrayfontDictsubrCharStringClasssubrs                r"   r|   zCFFFontSet.fromXML   sr    tW%% 	DJtW%% 	DJ9zQtY// %#$DLtY// %#$DLt]33 :'7'9'9D$t[11 7%'DN(4D% =%%h///!d.>???"&qtY// %#$DLt]33 :'7'9'9D$t[11 2&0\DN$(K$=!! $ 0DU   %17H$I$I!$$W---" 6 6gs++ '.$eWeW5555w
++ C0B0I0Q!/ ' C CHx33 C292B(/	C C0Q0QC C ]"""/"<4// 6#3#5#5 " . .gs++ '.$eW**,,T5'222 ''----. . W__U7^,,DJJJW__U7^,,DJJJ _r$   c                 *    ddl m}  || |           d S )Nr   )_convertCFFToCFF2)	CFFToCFF2r   )r>   r)   r   s      r"   convertCFFToCFF2zCFFFontSet.convertCFFToCFF2-  -    000000$'''''r$   c                 *    ddl m}  || |           d S )Nr   )_convertCFF2ToCFF)	CFF2ToCFFr   )r>   r)   r   s      r"   convertCFF2ToCFFzCFFFontSet.convertCFF2ToCFF2  r   r$   c                 (    ddl m}  ||            d S )Nr   )desubroutinize)
transformsr   )r>   r   s     r"   r   zCFFFontSet.desubroutinize7  s*    ......tr$   c                 (    ddl m}  ||            d S )Nr   )remove_hints)r   r   )r>   r   s     r"   r   zCFFFontSet.remove_hints<  s*    ,,,,,,Tr$   c                 (    ddl m}  ||            d S )Nr   )remove_unused_subroutines)r   r   )r>   r   s     r"   r   z$CFFFontSet.remove_unused_subroutinesA  s+    999999!!$'''''r$   r   )__name__
__module____qualname____doc__rB   rF   rH   rJ   rU   ri   rs   r|   r   r   r   r   r    r$   r"   r   r   0   s         *+9 +9 +9 +9Z# # #$ $ $! ! !( ( ( > > > >@  :B- B- B- B-H( ( (
( ( (
  
  
( ( ( ( (r$   r   c                   $    e Zd ZdZd Zd Zd ZdS )r\   zXHelper class for serializing CFF data to binary. Used by
    :meth:`CFFFontSet.compile`.c                 "    g | _         || _        d S r   )datar&   r>   r&   s     r"   __init__zCFFWriter.__init__K  s    	r$   c                 :    | j                             |           d S r   )r   ra   )r>   tables     r"   r^   zCFFWriter.addO  s    	r$   c                    d }d}	 t                                t          d|           |dz   }d}|g}| j        D ]}t          |d          rM||                                z   }t          |t                    r |j        r|                                | _        n|t          |          z   }t          |d          r|
                    ||           |}|                    |           ||k    rn|}t                                t          d           |                                }| j        r#t          j        d| j                  | j        d<   n<t          |d	                   | _        t          j        d
| j                  | j        d<   dg}| j        D ]g}t          |d          r|                    |           n|                    |           |                    |                                |z
             h||k    sJ d S )Nr   Tz CFFWriter.toFile() iteration: %dr   r`   setPosz#CFFWriter.toFile() writing to file.r'   r   rc   )logDEBUGr   rM   r`   rN   TopDictIndexCompilerr&   r:   rD   r   ra   tellr/   r_   calcOffSizer0   rc   write)	r>   r?   lastPosListcountposposListitemendPosbegins	            r"   rc   zCFFWriter.toFileR  s   	"GGE=uEEEAIECeG	 
$ 
$411 - 4#5#5#7#77F!$(<== @$+ @+/+=+=+?+?( 3t99_F4** -KKV,,,s####+%%!K%	"& 	<===		; 	:!;tT-=>>DIaLL&{277DL!;sDL99DIaL#I 	0 	0DtX&& !D!!!!

4   NN499;;.////+%%%%%%r$   N)r   r   r   r   r   r^   rc   r   r$   r"   r\   r\   G  sK        # #       $& $& $& $& $&r$   r\   c                 @    | dk     rd}n| dk     rd}n| dk     rd}nd}|S )N   r   i   r   i   r   rX   r   )largestOffsetr0   s     r"   r   r   y  sB    u		 	 		"	"Nr$   c                   2    e Zd ZdZddZd Zd Zd Zd ZdS )	IndexCompilerzBase class for writing CFF `INDEX data <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#5-index-data>`_
    to binary.Nc                     |t          |d          r|j        }|J || _        |                     ||          | _        || _        d S Nr&   )rM   r&   getItemsitemsparent)r>   r   r9   r   r&   s        r"   r   zIndexCompiler.__init__  sO    >gfh77>]F%%%]]5'22
r$   c                     |S r   r   r>   r   r9   s      r"   r   zIndexCompiler.getItems      r$   c                     | j         r_d}|g}| j         D ]Q}t          |d          r||                                z   }n|t          |          z   }|                    |           Rng }|S )Nr   r`   )r   rM   r`   rD   ra   )r>   r   offsetsr   s       r"   
getOffsetszIndexCompiler.getOffsets  s    : 
	CeG
 $ $411 * 2 2 4 44CCD		/Cs####$ Gr$   c                     | j         rd}nd}| j        rP|                                 d         }t          |          }|dz   t	          | j                  dz   |z  z   |z   dz
  }n|}|S )NrX   r   r   r   )r&   r   r   r   rD   )r>   	countSize
lastOffsetr0   
dataLengths        r"   r`   zIndexCompiler.getDataLength  s    ; 	III: 	#**2.J!*--Gtz??Q&'12  	 J #Jr$   c                 t   |                                  }| j        r#t          |t          | j                             n"t          |t          | j                             | j        rt          |d                   }t          ||           | }t          j	        }|D ]A} |d|          |d          }t          |          | k    sJ |
                    |           B| j        D ]P}t          |d          r|                    |           (t          |d          }|
                    |           Od S d S )Nr   >lrc   latin1encoding)r   r&   writeCard32rD   r   writeCard16r   
writeCard8r/   r_   r   rM   rc   r
   )	r>   r?   r   r0   r_   offset	binOffsetr   r   s	            r"   rc   zIndexCompiler.toFile  sQ   //##; 	/c$*oo....c$*oo...: 	%!'"+..GtW%%%hG;D! & & Dv..wxx8	9~~'1111

9%%%%
 % %4** %KK%%%%"4(;;;DJJt$$$$	% 	%% %r$   r   )	r   r   r   r   r   r   r   r`   rc   r   r$   r"   r   r     sn                  ,% % % % %r$   r   c                       e Zd Zd ZdS )IndexedStringsCompilerc                     |j         S r   r9   r   s      r"   r   zIndexedStringsCompiler.getItems  s
    }r$   N)r   r   r   r   r   r$   r"   r   r     s#            r$   r   c                   B     e Zd ZdZd Zd Z fdZ fdZ fdZ xZ	S )r   z/Helper class for writing the TopDict to binary.c                 f    g }|D ]+}|                     |                    ||                      ,|S r   ra   r]   r>   r   r9   outr   s        r"   r   zTopDictIndexCompiler.getItems  @     	8 	8DJJt''667777
r$   c                 n    g }| j         D ]*}|                    |                    |                     +|S r   r   extendrb   )r>   r9   rg   rd   s       r"   rb   z TopDictIndexCompiler.getChildren  s@    z 	: 	:GOOG//889999r$   c                     | j         r#d| j        d                                         g}|S t          t          |                                           S Nr   )r&   r   r`   superr   r   )r>   r   	__class__s     r"   r   zTopDictIndexCompiler.getOffsets  sL    ; 	B$*Q-55778GN-t44??AAAr$   c                     | j         r!| j        d                                         }|S t          t          |                                           S r   )r&   r   r`   r   r   )r>   r   r   s     r"   r`   z"TopDictIndexCompiler.getDataLength  sH    ; 	EA4466J-t44BBDDDr$   c                     | j         r"| j        d                             |           d S t          t          |                               |           d S r   )r&   r   rc   r   r   )r>   r?   r   s     r"   rc   zTopDictIndexCompiler.toFile  sR    ; 	;JqM  &&&&&&--44T:::::r$   )
r   r   r   r   r   rb   r   r`   rc   __classcell__r   s   @r"   r   r     s        99    B B B B BE E E E E; ; ; ; ; ; ; ; ;r$   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )FDArrayIndexCompilerzHelper class for writing the
    `Font DICT INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#10-font-dict-index-font-dicts-and-fdselect>`_
    to binary.c                 f    g }|D ]+}|                     |                    ||                      ,|S r   r   r   s        r"   r   zFDArrayIndexCompiler.getItems  r   r$   c                 n    g }| j         D ]*}|                    |                    |                     +|S r   r   )r>   r9   rg   r   s       r"   rb   z FDArrayIndexCompiler.getChildren  s@    
 	; 	;HOOH0099::::r$   c                 @   |                                  }| j        r#t          |t          | j                             n"t          |t          | j                             t          |d                   }t          ||           | }t          j	        }|D ]A} |d|          |d          }t          |          | k    sJ |
                    |           B| j        D ]=}t          |d          r|                    |           (|
                    |           >d S )Nr   r   rc   )r   r&   r   rD   r   r   r   r   r/   r_   r   rM   rc   )r>   r?   r   r0   r_   r   r   r   s           r"   rc   zFDArrayIndexCompiler.toFile  s+   //##; 	/c$*oo....c$*oo...gbk**4!!!({ 	" 	"FT6**7884Iy>>gX----JJy!!!!J 	! 	!DtX&& !D!!!!

4    		! 	!r$   c                 $    || j         j        d<   d S )Nr}   r   rawDictr>   r   r   s      r"   r   zFDArrayIndexCompiler.setPos      ),I&&&r$   N)r   r   r   r   r   rb   rc   r   r   r$   r"   r   r     sZ             ! ! !(- - - - -r$   r   c                       e Zd ZdZd ZdS )GlobalSubrsCompilerzHelper class for writing the `global subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 |    g }|D ]6}|                     | j                   |                    |j                   7|S r   ri   r&   ra   bytecoder>   r   r9   r   css        r"   r   zGlobalSubrsCompiler.getItems'  F     	$ 	$BJJt{###JJr{####
r$   N)r   r   r   r   r   r   r$   r"   r   r   #  s-             r$   r   c                       e Zd ZdZd ZdS )SubrsCompilerzHelper class for writing the `local subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 B    || j         j        z
  }|| j         j        d<   d S NSubrs)r   r   r   )r>   r   r   r   s       r"   r   zSubrsCompiler.setPos3  s%    t{&'-G$$$r$   N)r   r   r   r   r   r   r$   r"   r   r   /  s-         . . . . .r$   r   c                       e Zd ZdZd Zd ZdS )CharStringsCompilerzHelper class for writing the `CharStrings INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 |    g }|D ]6}|                     | j                   |                    |j                   7|S r   r   r   s        r"   r   zCharStringsCompiler.getItems<  r   r$   c                 $    || j         j        d<   d S NCharStringsr   r   s      r"   r   zCharStringsCompiler.setPosC  s    -0M***r$   N)r   r   r   r   r   r   r   r$   r"   r   r   8  s<           1 1 1 1 1r$   r   c                   J    e Zd ZdZeZddZd Zd Zd Z	d Z
d Zdd	Zd
 ZdS )r4   zThis class represents what the CFF spec calls an INDEX (an array of
    variable-sized objects). `Index` items can be addressed and set using
    Python list indexing.Nc                    g | _         g x| _        }| j        j        }|d S || _        t
                              t          d||                                           || _        |rt          |          }nt          |          }|dk    rd S d g|z  | _         t          |          }t
                              t          d||           |dk    sJ d|z              dd|z
  z  }t          |dz             D ]U}|                    |          }	||	z   }	t          j        d|	          \  }
|                    t#          |
                     V|                                dz
  | _        |                    | j        |d	         z              t
                              t          d
||                                           d S )Nloading %s at %sr   z    index count: %s offSize: %srX   zoffSize too large: %s    r   >Lr       end of %s at %s)r   r   r   r   _isCFF2r   r   r   r?   
readCard32
readCard16	readCard8ranger,   r/   r*   ra   r   
offsetBaser1   )r>   r?   r&   r   rT   r   r0   padrP   chunkr   s              r"   r   zIndex.__init__N  s   
!##w~&<F)4===	 	%t$$EEt$$EA::FVe^
D//8%III!|||4w>|||q7{#519%% 	( 	(EIIg&&E%KEdE22IVNN3v;;''''))++/		$/GBK/000,dDIIKK@@@@@r$   c                 *    t          | j                  S r   )rD   r   rE   s    r"   rF   zIndex.__len__k  s    4:r$   c                 ^   | j         |         }||S | j        |         | j        z   }| j        |dz            | j        |         z
  }| j        }|                    |           |                    |          }t          |          |k    sJ |                     ||||          }|| j         |<   |S Nr   )r   r   r  r?   r1   r,   rD   produceItem)r>   rP   r   r   sizer?   r   s          r"   rU   zIndex.__getitem__n  s    z% Ke$t6|EAI&e)<<y		&yy4yyD    tT6:: 
5r$   c                     || j         |<   d S r   r   )r>   rP   r   s      r"   __setitem__zIndex.__setitem__|  s     
5r$   c                     |S r   r   )r>   rP   r   r?   r   s        r"   r  zIndex.produceItem  s    r$   c                 :    | j                             |           dS )zAdd an item to an INDEX.N)r   ra   )r>   r   s     r"   ra   zIndex.append  s    
$r$   c                 4    |                      | |||          S Nr%   compilerClassr>   r9   r   r&   s       r"   r]   zIndex.getCompiler      !!$!GGGr$   c                     | j         dd= dS )zEmpty the INDEX.Nr  rE   s    r"   clearzIndex.clear  s    JqqqMMMr$   NNr   )r   r   r   r   r   r  r   rF   rU   r  r  ra   r]   r#  r   r$   r"   r4   r4   G  s          "MA A A A:    ! ! !       H H H H    r$   r4   c                   h     e Zd ZdZeZej        Zej        Z		 	 	 	 	 	 d fd	Z
d Zd Zd Zd Z xZS )	r<   ay  This index contains all the global subroutines in the font. A global
    subroutine is a set of ``CharString`` data which is accessible to any
    glyph in the font, and are used to store repeated instructions - for
    example, components may be encoded as global subroutines, but so could
    hinting instructions.

    Remember that when interpreting a ``callgsubr`` instruction (or indeed
    a ``callsubr`` instruction) that you will need to add the "subroutine
    number bias" to number given:

    .. code:: python

            tt = ttLib.TTFont("Almendra-Bold.otf")
            u = tt["CFF "].cff[0].CharStrings["udieresis"]
            u.decompile()

            u.toXML(XMLWriter(sys.stdout))
            # <some stuff>
            # -64 callgsubr <-- Subroutine which implements the dieresis mark
            # <other stuff>

            tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG
            # <T2CharString (bytecode) at 103451d10>

            tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT
            # <T2CharString (source) at 103451390>

    ("The bias applied depends on the number of subrs (gsubrs). If the number of
    subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less
    than 33900, it is 1131; otherwise it is 32768.",
    `Subroutine Operators <https://docs.microsoft.com/en-us/typography/opentype/otspec180/cff2charstr#section4.4>`)
    Nc                     t          t          |                               ||           || _        || _        |r|| _        |r	|| _        d S d S r  )r   r<   r   globalSubrsprivatefdSelectr   )r>   r?   r'  r(  r)  r   r&   r   s          r"   r   zGlobalSubrsIndex.__init__  sd     	%%..tF.CCC& 	%$DM 	#"DLLL	# 	#r$   c                     | j         | j         }nSt          | d          rA| j        :t          | d          r| j        | j        |         }nd}| j        |         j        }nd }|                     ||| j                  S )Nr   r)  r   r(  r'  )r(  rM   r   r)  rz   	subrClassr'  )r>   rP   r   r?   r   r(  fdIndexs          r"   r  zGlobalSubrsIndex.produceItem  s    <#lGGT9%% 	$,*BtZ(( T]-F-.l7+3GGG~~dGAQ~RRRr$   c                    |                     d           |                                 t          t          |                     D ]}| |         }|                                r|                    d|d           n|                    d|           |                                 |                    |           |                    d           |                                 dS )a  Write the subroutines index into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff[0].GlobalSubrs.toXML(writer)

        zDThe 'index' attribute is only for humans; it is ignored when parsed.
CharStringr   )rP   rawrP   N)commentrq   r  rD   needsDecompilationrr   rs   rt   )r>   ru   ir   s       r"   rs   zGlobalSubrsIndex.toXML  s     	U	
 	
 	
 	s4yy!! 		  		 A7D&&(( :""<qa"@@@@""<q"999JJy!!!\***		  		 r$   c                     |dk    rd S |                                  }|                    |||           |                     |           d S )Nr/  )r,  r|   ra   )r>   rT   r   r   r   s        r"   r|   zGlobalSubrsIndex.fromXML  sO    <F~~T5'***Dr$   c                 T    d }t          | d          r| j        |         }| |         |fS )Nr)  )rM   r)  )r>   rP   sels      r"   getItemAndSelectorz#GlobalSubrsIndex.getItemAndSelector  s4    4$$ 	'-&CE{Cr$   NNNNNN)r   r   r   r   r   r  r   r   r,  charStringClassr   r  rs   r|   r8  r   r   s   @r"   r<   r<     s         B (M*I#0O # # # # # #"S S S     2               r$   r<   c                       e Zd ZdZeZdS )
SubrsIndexzThis index contains a glyph's local subroutines. A local subroutine is a
    private set of ``CharString`` data which is accessible only to the glyph to
    which the index is attached.N)r   r   r   r   r   r  r   r$   r"   r<  r<    s        $ $ "MMMr$   r<  c                   4     e Zd ZdZeZd fd	Zd Zd Z xZ	S )r6   a  This index represents the array of ``TopDict`` structures in the font
    (again, usually only one entry is present). Hence the following calls are
    equivalent:

    .. code:: python

            tt["CFF "].cff[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>
            tt["CFF "].cff.topDictIndex[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>

    Nr   c                     || _         ||r|| _        g | _        | j        j        }t
                              t          d||                                           || _        d}d g|z  | _        d|g| _	        |                                | _
        |                    | j
        |z              t
                              t          d||                                           d S t          t          |                               ||           d S )Nr  r   r   r	  r%   )rA   r
  r   r   r   r   r   r   r?   r   r  r1   r   r6   r   )r>   r?   rA   topSizer&   rT   r   r   s          r"   r   zTopDictIndex.__init__  s    !2!DLDJ>*DGGE-tTYY[[AAADIE%DJw<DL"iikkDOIIdo/000GGE0$		DDDDD,%%..tF.CCCCCr$   c                     t          | j        ||| j        | j        | j                  }|                    |           |S r  )r{   r9   r=   rA   r
  rB   )r>   rP   r   r?   r   tops         r"   r  zTopDictIndex.produceItem#  sK    L"<
 
 
 	d
r$   c                 "   t          t          |                     D ]q}|                    d|           |                                 | |                             |           |                    d           |                                 rd S NFontDictr1  r  rD   rr   rq   rs   rt   r>   ru   r4  s      r"   rs   zTopDictIndex.toXML/      s4yy!! 	  	 Az333GMM)$$$Z(((	  	 r$   )NNr   N)
r   r   r   r   r   r  r   r  rs   r   r   s   @r"   r6   r6     sr          )MD D D D D D$
 
 
             r$   r6   c                   $    e Zd ZeZd Zd Zd ZdS )FDArrayIndexc                 "   t          t          |                     D ]q}|                    d|           |                                 | |                             |           |                    d           |                                 rd S rC  rE  rF  s      r"   rs   zFDArrayIndex.toXML;  rG  r$   c                     t          | j        ||| j        | j        | j                  }|                    |           |S N)r&   r~   )rD  r9   r=   r
  r~   rB   )r>   rP   r   r?   r   r   s         r"   r  zFDArrayIndex.produceItemC  sL    L<;
 
 
 	4   r$   c                     |dk    rd S t                      }|D ]5}t          |t                    r|\  }}}|                    |||           6|                     |           d S )NrD  )rD  rN   rO   r|   ra   )r>   rT   r   r   r   r   s         r"   r|   zFDArrayIndex.fromXMLO  s~    :F:: 	3 	3G'3'' #* D%T5'2222Hr$   N)r   r   r   r   r  rs   r  r|   r   r$   r"   rI  rI  8  sF        (M     
 
 
	 	 	 	 	r$   rI  c                   :    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	dS )
VarStoreDataNc                 V    || _         d | _        || _        t                      | _        d S r   )r?   r   
otVarStorer   rw   )r>   r?   rQ  s      r"   r   zVarStoreData.__init__\  s&    		$HH			r$   c                 p   | j         rt          | j                   }|dk    r| j                                         | _        n| j                             |          | _        i }t	          | j        |          }t          j                    | _        | j                            || j	                   d | _        | S Ni  )
r?   r  r,   r   r   otry   rQ  rB   rw   )r>   lengthglobalStatereaders       r"   rB   zVarStoreData.decompileb  s    9 		**F INN,,		 INN622	K"49k::F kmmDOO%%fdi888DIr$   c                     t                      }| j                            || j                   |                                | _        d S r   )r   rQ  ri   rw   
getAllDatar   )r>   re   s     r"   ri   zVarStoreData.compiler  s>    	222 %%''			r$   c                 F    | j                             || j                   d S r   )rQ  rs   rw   )r>   ru   rT   s      r"   writeXMLzVarStoreData.writeXMLy  s"    i33333r$   c                     t          j                    | _        |D ]@}t          |t                    r)|\  }}}| j                            |||| j                   @Ad S r   )rT  ry   rQ  rN   tupler|   rw   )r>   rT   r   r   r   r   s         r"   xmlReadzVarStoreData.xmlRead|  se    +-- 	 	G'5)) '.$eW''eWdiHHHHtr$   c                 *    t          | j                  S r   rD   r   rE   s    r"   rF   zVarStoreData.__len__      49~~r$   c                 @    |d}| j         j        |         }|j        }|S r   )rQ  VarDataVarRegionCount)r>   vsIndexvarData
numRegionss       r"   getNumRegionszVarStoreData.getNumRegions  s)    ?G/)'2+
r$   r$  )
r   r   r   r   rB   ri   r[  r^  rF   rh  r   r$   r"   rO  rO  [  s              ( ( (4 4 4        r$   rO  c                   .    e Zd ZddZd Zd Zd Zd ZdS )FDSelectNc                    |rt          |          | _        | j        dk    r>ddlm}  |d|                    |                                                    | _        d S | j        dk    rd g|z  }t          |          }d }d }t          |          D ]<}	t          |          }
|t          ||
          D ]}|||<   |
}t          |          }=|'t          |          }
t          ||
          D ]}|||<   || _        d S | j        dk    rd g|z  }t          |          }d }d }t          |          D ]<}	t          |          }
|t          ||
          D ]}|||<   |
}t          |          }=|'t          |          }
t          ||
          D ]}|||<   || _        d S J d|z              || _        g | _        d S )Nr   )arrayr   r   rX   Fzunsupported FDSelect format: %s)	r  formatrl  r,   tolistgidArrayr  r  r  )r>   r?   	numGlyphsrm  rl  ro  nRangesfdprevr4  firstglyphIDs               r"   r   zFDSelect.__init__  s7    /	#D//DK{a'''''' %c499Y+?+? @ @ G G I I!! 6I-$T**w ) )A&t,,E'',T5'9'9 3 3G02HW-- D"4BB#&t,,E#(u#5#5 / /,.)) (!! 6I-$T**w * *A&t,,E'',T5'9'9 3 3G02HW-- D#D))BB#&t,,E#(u#5#5 / /,.)) (H?&HHHH !DKDMMMr$   c                 *    t          | j                  S r   )rD   ro  rE   s    r"   rF   zFDSelect.__len__  s    4=!!!r$   c                     | j         |         S r   ro  r>   rP   s     r"   rU   zFDSelect.__getitem__  s    }U##r$   c                     || j         |<   d S r   rx  )r>   rP   fdSelectValues      r"   r  zFDSelect.__setitem__  s    ,er$   c                 :    | j                             |           d S r   )ro  ra   )r>   r{  s     r"   ra   zFDSelect.append  s    ]+++++r$   )NNN)r   r   r   r   rF   rU   r  ra   r   r$   r"   rj  rj    se        0 0 0 0d" " "$ $ $- - -, , , , ,r$   rj  c                   X    e Zd ZdZ	 	 ddZd Zd Zd ZeZd Z	d Z
d	 Zd
 Zd Zd ZdS )r  a  The ``CharStrings`` in the font represent the instructions for drawing
    each glyph. This object presents a dictionary interface to the font's
    CharStrings, indexed by glyph name:

    .. code:: python

            tt["CFF "].cff[0].CharStrings["a"]
            # <T2CharString (bytecode) at 103451e90>

    See :class:`fontTools.misc.psCharStrings.T1CharString` and
    :class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile,
    compile and interpret the glyph drawing instructions in the returned objects.

    Nc	                 $   || _         || _        |Vt          ||||||          | _        i x| _        }	t          t          |                    D ]}
|
|	||
         <   d| _        d S i | _        d| _        || _        ||| _	        |	|| _
        d S d S )Nr%   r   r   )r'  varStorer<  charStringsIndexcharStringsr  rD   charStringsAreIndexedr(  r)  r   )r>   r?   rY   r'  r(  r)  r   r&   r  r  r4  s              r"   r   zCharStrings.__init__  s     ' $.k7Hgf% % %D! .0/D{3w<<(( , ,*+GAJ'' *+D&&&!D)*D&"DL# ("& #"r$   c                 N    t          | j                                                  S r   )r3   r  rH   rE   s    r"   rH   zCharStrings.keys  s    D$))++,,,r$   c                 j    | j         r| j        S t          | j                                                  S r   )r  r  r3   r  rJ   rE   s    r"   rJ   zCharStrings.values  s3    % 	3(((//11222r$   c                     || j         v S r   )r  )r>   rT   s     r"   has_keyzCharStrings.has_key  s    t'''r$   c                 *    t          | j                  S r   )rD   r  rE   s    r"   rF   zCharStrings.__len__  s    4#$$$r$   c                 H    | j         |         }| j        r| j        |         }|S r   )r  r  r  )r>   rT   
charStrings      r"   rU   zCharStrings.__getitem__  s-    %d+
% 	;.z:Jr$   c                 Z    | j         r| j        |         }|| j        |<   d S || j        |<   d S r   )r  r  r  )r>   rT   r  rP   s       r"   r  zCharStrings.__setitem__  s@    % 	0$T*E+5D!%(((%/DT"""r$   c                     | j         r'| j        |         }| j                            |          S t	          | d          r&t	          | d          r| j        |         j        }nd}nd }| j        |         |fS )Nr   r)  r   )r  r  r  r8  rM   fdSelectIndex)r>   rT   rP   r7  s       r"   r8  zCharStrings.getItemAndSelector   s    % 	/$T*E(;;EBBBtY'' 4,, *40>CCCC#D)3..r$   c                    t          |                                           }|D ]}|                     |          \  }}|                                rdg}ng }||                    dd|fg|z              n|                    dd|fd|fg|z              |                                 |                    |           |                    d           |                                 d S )N)r0  r   r/  rT   r  )sortedrH   r8  r3  rr   rq   rs   rt   )r>   ru   namesrT   charStrr  r0  s          r"   rs   zCharStrings.toXML.  s   tyy{{## 	  	 D%)%<%<T%B%B"G]))++ !l$""<64.1AC1GHHHH"" d^o}%EFL   MM)$$$\***!	  	 r$   c                    |D ]}t          |t                    r|\  }}}|dk    r%d}t          | d          r<	 t          |d                   }n# t          $ r d}Y nw xY w| j        |         j        }n| j        }|d         }t          j	        } ||| j
                  }	|	                    |||           |dk    r||	_        |	| |<   d S )Nr/  r   r   r  r   rT   r+  )rN   rO   rM   r   rQ   r   rz   r(  r   r   r'  r|   r  )
r>   rT   r   r   r   fdIDr(  	glyphNamer:  r  s
             r"   r|   zCharStrings.fromXMLB  s    	) 	)G'3'' #* D%|##DtY'' '#E/$:;;DD   DDD,t,4,fI+8O(dFVWWWJtUG444qyy+/
((DOO-	) 	)s   AA A r$  )r   r   r   r   r   rH   rJ   r  __contains__rF   rU   r  r8  rs   r|   r   r$   r"   r  r    s         . ' ' ' 'B- - -3 3 3( ( ( L% % %  0 0 0/ / /     () ) ) ) )r$   r  c                 F    t          |                     d                    S r  )r   r,   )r?   s    r"   r  r  \  s    499Q<<   r$   c                 Z    t          j        d|                     d                    \  }|S )Nr'   r   r/   r*   r,   r?   rl   s     r"   r  r  `  $    }T499Q<<00HULr$   c                 Z    t          j        d|                     d                    \  }|S )Nr  rX   r  r  s     r"   r  r  e  r  r$   c                 J    |                      t          |                     d S r   )r   r   r  s     r"   r   r   j  s     JJwu~~r$   c                 V    |                      t          j        d|                     d S Nr'   r   r/   r_   r  s     r"   r   r   n  &    JJv{4''(((((r$   c                 V    |                      t          j        d|                     d S Nr  r  r  s     r"   r   r   r  r  r$   c                      t          |           S r   )r   rk   s    r"   	packCard8r  v  s    5>>r$   c                 ,    t          j        d|           S r  r/   r_   rk   s    r"   
packCard16r  z      ;tU###r$   c                 ,    t          j        d|           S r  r  rk   s    r"   
packCard32r  ~  r  r$   c                 .    i }| D ]\  }}}}}||f||<   |S r   r   r   doprT   argdefaultconvs          r"   buildOperatorDictr    s5    
A(-  $D#ws"Hr$   c                     i }| D ]_\  }}}}}t          |t                    r,t          |d                   t          |d                   z   }nt          |          }||f||<   `|S Nr   r   )rN   r]  r   r  s          r"   buildOpcodeDictr    sr    
A(-  $D#wb%   	A'"Q%..0BBBs)$Hr$   c                 J    g }| D ]\  }}}}}|                     |           |S r   )ra   )r   lr  rT   r  r  r  s          r"   
buildOrderr    s7    
A(-  $D#w	Hr$   c                 .    i }| D ]\  }}}}}||||<   |S r   r   r  s          r"   buildDefaultsr    s6    
A(-  $D#wAdGHr$   c                 *    i }| D ]\  }}}}}|||<   |S r   r   r  s          r"   buildConvertersr    s1    
A(-  $D#w$Hr$   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )SimpleConverterc                    t          |d          s|                     ||          S |j        }|                                }	 |                     ||          |                    |           S # |                    |           w xY w)Nr?   )rM   _readr?   r   r1   )r>   r   rl   r?   r   s        r"   r,   zSimpleConverter.read  sw    vv&& 	-::fe,,,{iikk	::fe,,IIcNNNNDIIcNNNNs   A. .Bc                     |S r   r   r>   r   rl   s      r"   r  zSimpleConverter._read  r   r$   c                     |S r   r   r  s      r"   r   zSimpleConverter.write  r   r$   c                 \    |                     ||           |                                 d S )Nrk   )rp   rq   r>   ru   rT   rl   s       r"   xmlWritezSimpleConverter.xmlWrite  s3    D...r$   c                     |d         S Nrl   r   r>   rT   r   r   r   s        r"   r^  zSimpleConverter.xmlRead  s    W~r$   N)r   r   r   r,   r  r   r  r^  r   r$   r"   r  r    s_                    r$   r  c                   &    e Zd Zd Zd Zd Zd ZdS )ASCIIConverterc                 $    t          |d          S Nasciir   r   r  s      r"   r  zASCIIConverter._read  s    UW----r$   c                 $    t          |d          S r  r
   r  s      r"   r   zASCIIConverter.write  s    uw////r$   c                 z    |                     |t          |d                     |                                 d S )Nr  r   rk   rp   r   rq   r  s       r"   r  zASCIIConverter.xmlWrite  s@    Deg(F(F(FGGGr$   c                 0    t          |d         d          S )Nrl   r  r   r  r  s        r"   r^  zASCIIConverter.xmlRead  s    uW~::::r$   Nr   r   r   r  r   r  r^  r   r$   r"   r  r    sP        . . .0 0 0  ; ; ; ; ;r$   r  c                   &    e Zd Zd Zd Zd Zd ZdS )Latin1Converterc                 $    t          |d          S Nr   r   r   r  s      r"   r  zLatin1Converter._read  s    UX....r$   c                 $    t          |d          S r  r  r  s      r"   r   zLatin1Converter.write  s    ux0000r$   c                     t          |d          }|dv rt          j        dd|          }|                    ||           |                                 d S )Nr   r   )Notice	Copyrightz	[\r\n]\s+ rk   )r   resubrp   rq   r  s       r"   r  zLatin1Converter.xmlWrite  sd    eh///***F<e44ED...r$   c                 0    t          |d         d          S )Nrl   r   r   r  r  s        r"   r^  zLatin1Converter.xmlRead  s    uW~;;;;r$   Nr  r   r$   r"   r  r    sP        / / /1 1 1  < < < < <r$   r  c                 T    	 t          |           }n#  t          |           }Y nxY w|S r   )r   float)r!   rl   s     r"   parseNumr    s1    AaLs    %c                     g }| D ]Y}t          |t                    r|\  }}}|d                                         }d |D             }|                    |           Zt	          |          dk    r|d         }|S )Nrl   c                 ,    g | ]}t          |          S r   )evalr    vals     r"   
<listcomp>z"parseBlendList.<locals>.<listcomp>  s    4443T#YY444r$   r   r   )rN   rO   splitra   rD   )r!   	valueListr   rT   r   r   	blendLists          r"   parseBlendListr    s    I $ $gs## 	&eW'N((**	44)444	####
9~~aL	r$   c                       e Zd Zd Zd ZdS )NumberConverterc                    t          |t                    r|                    |           |                                 |                                 d                    d |D                       }|                    t          |           |                                 |                                 |	                    |           |                                 d S |                    ||           |                                 d S )Nr  c                 ,    g | ]}t          |          S r   rO   r  s     r"   r  z,NumberConverter.xmlWrite.<locals>.<listcomp>   s    "="="=3s88"="="=r$   rk   
rN   r3   rr   rq   indentjoinrp   kBlendDictOpNamededentrt   )r>   ru   rT   rl   
blendValues        r"   r  zNumberConverter.xmlWrite  s   eT"" 	 t$$$"="=u"="="=>>J 0
CCCT"""E222r$   c                     |                     dd           }|t          |          }nt          |d                   }|S r  )getr  r  )r>   rT   r   r   r   valueStringrl   s          r"   r^  zNumberConverter.xmlRead
  s@    ii.."7++EEU7^,,Er$   Nr   r   r   r  r^  r   r$   r"   r  r    s2                 r$   r  c                       e Zd Zd Zd ZdS )ArrayConverterc                 t   |rt          |d         t                    r|                    |           |                                 |                                 |D ]Q}d                    d |D                       }|                    t          |           |                                 R|                                 |	                    |           |                                 d S d                    d |D                       }|                    ||           |                                 d S )Nr   r  c                 ,    g | ]}t          |          S r   r  r  s     r"   r  z+ArrayConverter.xmlWrite.<locals>.<listcomp>  s    &E&E&ECs3xx&E&E&Er$   rk   c                 ,    g | ]}t          |          S r   r  r  s     r"   r  z+ArrayConverter.xmlWrite.<locals>.<listcomp>!  s    8883c#hh888r$   r  )r>   ru   rT   rl   r  r  s         r"   r  zArrayConverter.xmlWrite  sD    	 Za$// 	 t$$$" $ $	 XX&E&E9&E&E&EFF
##$4J#GGG!!####T"""HH88%88899EE222r$   c                     |                     dd           }|t          |          }n |                                }d |D             }|S )Nrl   c                 ,    g | ]}t          |          S r   )r  )r    rl   s     r"   r  z*ArrayConverter.xmlRead.<locals>.<listcomp>+  s    ===U%===r$   )r  r  r  )r>   rT   r   r   r   r  r  rJ   s           r"   r^  zArrayConverter.xmlRead%  sT    ii..&w//II &&((F==f===Ir$   Nr  r   r$   r"   r  r    s2             "    r$   r  c                       e Zd Zd Zd ZdS )TableConverterc                     |                     |           |                                 |                    |           |                    |           |                                 d S r   )rr   rq   rs   rt   r  s       r"   r  zTableConverter.xmlWrite0  sf    4   Ir$   c                      |                                              }|D ]5}t          |t                    r|\  }}}|                    |||           6|S r   )getClassrN   rO   r|   )r>   rT   r   r   r   obr   s          r"   r^  zTableConverter.xmlRead7  se    T]]__ 	- 	-G'3'' #* D%JJtUG,,,,	r$   Nr  r   r$   r"   r  r  /  s2              r$   r  c                        e Zd Zd Zd Zd ZdS )PrivateDictConverterc                     t           S r   )PrivateDictrE   s    r"   r  zPrivateDictConverter.getClassB  s    r$   c                 <   |\  }}|j         }|j        }	 |j        }n# t          $ r d }Y nw xY wt	          |j        ||||          }|                    |           |                    |          }	t          |	          |k    sJ |	                    |	           |S rL  )
r?   r
  r~   AttributeErrorr  r9   r1   r,   rD   rB   )
r>   r   rl   r  r   r?   r&   r~   privr   s
             r"   r  zPrivateDictConverter._readE  s    f{	]FF 	 	 	FFF	6>4vVVV		&yy4yyD    ts    ,,c                     dS )N)r   r   r   r  s      r"   r   zPrivateDictConverter.writeT  s    vr$   Nr   r   r   r  r  r   r   r$   r"   r
  r
  A  sA                r$   r
  c                        e Zd Zd Zd Zd ZdS )SubrsConverterc                     t           S r   )r<  rE   s    r"   r  zSubrsConverter.getClassY  s    r$   c                 z    |j         }|j        }|                    |j        |z              t	          ||          S r  )r?   r
  r1   r   r<  )r>   r   rl   r?   r&   s        r"   r  zSubrsConverter._read\  s<    {		&-%'((($v....r$   c                     dS r   r   r  s      r"   r   zSubrsConverter.writeb      qr$   Nr  r   r$   r"   r  r  X  sA          / / /    r$   r  c                        e Zd Zd Zd Zd ZdS )CharStringsConverterc           
      8   |j         }|j        }|j        }t          |dd           }|j        }t          |d          r$|j        }t          |d          r|j        }	nd }	d }
nd\  }	}|j        }
|	                    |           t          ||||
|	|||          }|S )Nry   r}   rj  r$  )r&   r  )r?   r
  rY   getattrr=   rM   r}   rj  rz   r1   r  )r>   r   rl   r?   r&   rY   r  r'  r   r)  r(  r  s               r"   r  zCharStringsConverter._readg  s    {.6:t44(69%% 		%nGvz**  !?GG *HgnG		%!	
 	
 	
 r$   c                     dS r   r   r  s      r"   r   zCharStringsConverter.write  r  r$   c                    t          |d          r$|j        }t          |d          r|j        }nd }d }n|j        d d }}}t	          d d |j        |||t          |dd                     }|                    |||           |S )Nr}   rj  ry   )r  )rM   r}   rj  rz   r  r=   r  r|   )	r>   rT   r   r   r   r   r)  r(  r  s	            r"   r^  zCharStringsConverter.xmlRead  s    69%% 	D nGvz**  !?GG
 *0twXG!VZ66
 
 
 	D%111r$   Nr   r   r   r  r   r^  r   r$   r"   r  r  f  sA          :      r$   r  c                   &    e Zd Zd Zd Zd Zd ZdS )CharsetConverterc                    t          |d          }|dk    r|j        }|j        }|                    |           t                              t
          d|           t          |          }|dk    rt          |||j        |          }n,|dk    s|dk    rt          |||j        ||          }nt          t          |          |k    sJ t                              t
          d|                                           i }g }	|D ]}
|
|v rw||
         }t          |          t          |          z  }|
dz   t          |          z   |v r|dz  }|
dz   t          |          z   |v |dz   ||
<   |
dz   t          |          z   }
d||
<   |	                    |
           |	}n?|s	d|j        vr|dk    sJ d }n)|dk    rt"          }n|dk    rt$          }n|dk    rt&          }|r't          |          |j        k    r|d |j                 }|S )	NROSr   zloading charset at %sr   r   z    charset end at %s.r  )rM   rp  r?   r1   r   r   r  parseCharset0r9   parseCharsetNotImplementedErrorrD   r   setrO   ra   r   cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r>   r   rl   isCIDrp  r?   rm  rY   allNames
newCharsetr  nr  s                r"   r  zCharsetConverter._read  s;   &&199(I;DIIeGGE2E:::t__F{{'	4OO1!&y$vVV))w<<9,,,,GGE2DIIKK@@@HJ$ 
- 
-	(( +AMMCLL8E$s?SVV3==Q %s?SVV3==*+a%HY' )C#a&& 8I&'#!!),,,, GG 
1V^;; zzzz!,!+!0 	2G(8880 001Gr$   c                     dS r   r   r  s      r"   r   zCharsetConverter.write  r  r$   c                 X    |                     d           |                                 d S )Nz8charset is dumped separately as the 'GlyphOrder' element)r2  rq   r  s       r"   r  zCharsetConverter.xmlWrite  s1     	TUUUr$   c                     d S r   r   r  s        r"   r^  zCharsetConverter.xmlRead      r$   Nr  r   r$   r"   r   r     sQ        - - -^        r$   r   c                   &    e Zd Zd Zd Zd Zd ZdS )CharsetCompilerc                     |d         dk    sJ t          |j        d          }t          |||          }t          |||          }t	          |          t	          |          k     r|| _        n|| _        || _        d S )Nr   .notdefr"  )rM   dictObjpackCharset0packCharsetrD   r   r   )r>   r9   rY   r   r+  data0r   s          r"   r   zCharsetCompiler.__init__  s|    qzY&&&&..WeW557E733t99s5zz!!DIIDIr$   c                 $    || j         j        d<   d S )NrY   r   r   s      r"   r   zCharsetCompiler.setPos  r   r$   c                 *    t          | j                  S r   r`  rE   s    r"   r`   zCharsetCompiler.getDataLength  ra  r$   c                 :    |                     | j                   d S r   r   r   r>   r?   s     r"   rc   zCharsetCompiler.toFile      

49r$   Nr   r   r   r   r   r`   rc   r   r$   r"   r4  r4    sP        	 	 	- - -      r$   r4  c                     d }t           t          dft          t          dft          t
          dfg}t          |           }|D ];\  }}}| n2||k    r|}t          |          D ]}| |         ||         k    rd } n<|S )Nr   r   r   )cffISOAdobeStringCountr(  cffExpertStringCountr)  cffExpertSubsetStringCountr*  rD   r  )rY   predefinedCharSetValpredefinedCharSetslcscntpcscsvr4  s           r"   getStdCharSetrL    s    	!3Q7	0!4	#%;Q?
 g,,C+ 	 	S#+E99"s 	 	AqzSV##'+$ $  r$   c                 0    t          | dd                    S )Nr   )r   rT   r9   s     r"   getCIDfromNamerO    s    tABBx==r$   c                 ,    |                     |           S r   )getSIDrN  s     r"   getSIDfromNamerR    s    >>$r$   c           	          d}t          |          g}|rt          }nt          }| dd          D ].}|                    t	           |||                               /t          |          S r  )r  rO  rR  ra   r  r	   )rY   r+  r9   fmtr   	getNameIDrT   s          r"   r8  r8    su    
CcNND #"		"	 : :Jyyw77889999T??r$   c                    d}g }d }d}|rt           }nt          }| dd          D ]D} |||          }	||	}n/|dz   |	k    r&||z
  }
|
dk    rd}|                    ||
f           |	}|	}E|r$||z
  }
|
dk    rd}|                    ||
f           t          |          g}|dk    rt          }nt          }|D ]3\  }}
|                    t	          |           ||
          z              4t          |          S )Nr   r      r   )rO  rR  ra   r  r  r	   )rY   r+  r9   rT  rangesrt  endrU  rT   SIDnLeftr   	nLeftFuncs                r"   r9  r9  "  sG   
CFE
C #"		"	 
 
ig&&=EE1W^^%KEs{{MM5%.)))E
 &e3;;Cuen%%%cNND
axx			 : :uJu%%		%(8(889999T??r$   c                 H   dg}|r]t          | dz
            D ]I}t          |          }|                    dt          |                              d          z              Jn?t          | dz
            D ],}t          |          }|                    ||                    -|S Nr6  r   cidrW   )r  r  ra   rO   zfill)rp  r?   r9   r+  rY   r4  CIDrZ  s           r"   r$  r$  G  s    kG )y1}%% 	6 	6AT""CNN53s88>>!#4#445555	6 y1}%% 	) 	)AT""CNN73<((((Nr$   c                    dg}d}|dk    rt           }nt          }|| k     rt          |          } ||          }	|rRt          |||	z   dz             D ]:}
|                    dt	          |
                              d          z              ;n4t          |||	z   dz             D ]}|                    ||                    ||	z   dz   }|| k     |S r^  )r  r  r  ra   rO   r`  )rp  r?   r9   r+  rT  rY   r   r\  rt  r[  ra  rZ  s               r"   r%  r%  T  s   kGE
axx			
)

4  	$ 	-UEEMA$566 : :us3xx~~a'8'889999: UEEMA$566 - -ws|,,,,! )

 Nr$   c                   &    e Zd Zd Zd Zd Zd ZdS )EncodingCompilerc                     t          |t                    rJ t          |j        j        ||j                  }t          |j        j        ||j                  }t          |          t          |          k     r|| _        n|| _        || _	        d S r   )
rN   rO   packEncoding0r7  rY   r9   packEncoding1rD   r   r   )r>   r9   r   r   r:  data1s         r"   r   zEncodingCompiler.__init__i  sz    h,,,,,fn4hOOfn4hOOu::E

""DIIDIr$   c                 $    || j         j        d<   d S )NEncodingr   r   s      r"   r   zEncodingCompiler.setPoss      *-J'''r$   c                 *    t          | j                  S r   r`  rE   s    r"   r`   zEncodingCompiler.getDataLengthv  ra  r$   c                 :    |                     | j                   d S r   r>  r?  s     r"   rc   zEncodingCompiler.toFiley  r@  r$   NrA  r   r$   r"   rd  rd  h  sP          . . .      r$   rd  c                   &    e Zd Zd Zd Zd Zd ZdS )EncodingConverterc                    |dk    rdS |dk    rdS |dk    sJ |j         }|                    |           t                              t          d|           t	          |          }t          |dz            }|dz  }|dk    rt          |j        |          }n.|dk    rt          |j        |          }nt          d|           |rt          |||j                   |S )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s      zUnknown Encoding format: )r?   r1   r   r   r  boolparseEncoding0rY   parseEncoding1r.   parseEncodingSupplementr9   )r>   r   rl   r?   rT  haveSupplementr   s          r"   r  zEncodingConverter._read~  s    A::%%aZZ##qyyyy{		%/777oocDj))Dj!88%fnd;;HHAXX%fnd;;HH>>>??? 	D#D(FNCCCr$   c                 &    |dk    rdS |dk    rdS dS )Nrq  r   rr  r   r   r  s      r"   r   zEncodingConverter.write  s)    &&&1&&&1qr$   c                    |dv r-|                     ||           |                                 d S |                    |           |                                 t          t	          |                    D ]I}||         }|dk    r9|                     dt          |          |           |                                 J|                    |           |                                 d S )N)rq  rr  ro   r6  map)coderT   )rp   rq   rr   r  rD   hexrt   )r>   ru   rT   rl   r}  r  s         r"   r  zEncodingConverter.xmlWrite  s    :::5111F4   #e**%% 	$ 	$DdII%%##ED			#JJJ!!###r$   c                     d|v r|d         S dgdz  }|D ]@}t          |t                    r|\  }}}t          |d                   }|d         }|||<   A|S )NrT   r6  r   r}  )rN   rO   r   )	r>   rT   r   r   r   r   r   r}  r  s	            r"   r^  zEncodingConverter.xmlRead  s{    U??= ;$ 	' 	'G'3'' #* D%E&M**DfI&HTNNr$   Nr  r   r$   r"   ro  ro  }  sP          4        r$   ro  c                     |                      d          }t          |          dk    rt          d          t          j        d|          d         S )u3   Read a String ID (SID) — 2-byte unsigned integer.r   z(Unexpected end of file while reading SIDr'   r   )r,   rD   EOFErrorr/   r*   )r?   r   s     r"   readSIDr    sF    99Q<<D
4yyA~~ABBB=t$$Q''r$   c                     t          |           }t          |          D ]-}t          |           }t          |           }||         }|||<   .dS )z
    Parse the CFF Encoding supplement data:
      - nSups: number of supplementary mappings
      - each mapping: (code, SID) pair
    and apply them to the `encoding` list in place.
    N)r  r  r  )r?   r   r9   nSups_r}  sidrT   s           r"   rx  rx    sX     dOOE5\\  dmms|	 r$   c                     t          |          }dgdz  }t          d|dz             D ]"}t          |          }|dk    r| |         ||<   #|S )zl
    Format 0: simple list of codes.
    After reading the base table, optionally parse the supplement.
    r6  r   r   r   r  r  )rY   r?   nCodesr   ru  r}  s         r"   rv  rv    s`    
 t__F{S HFQJ'' . .199$W-HTNOr$   c                     t          |          }dgdz  }d}t          |          D ]J}t          |          }t          |          }t          |dz             D ]}| |         ||<   |dz  }|dz  }K|S )un   
    Format 1: range-based encoding.
    After reading the base ranges, optionally parse the supplement.
    r6  r   r   r  )rY   r?   rq  r   ru  r  r}  r[  s           r"   rw  rw    s    
 ooG{S HG7^^  $uqy!! 	 	A$W-HTNAIDqLGG	
 Or$   c                    d}i }t          t          |                    D ]}||         }|dk    r|||<   g }| dd          D ],}|                    |          }|                    |           -|r&|d         |                                 |r|d         t          |          t          t          |                    g}|D ](}|d}|                    t          |                     )t          |          S )Nr   r6  r   r   r  rD   r  ra   popr  r	   )	rY   r   r9   rT  mr}  rT   codesr   s	            r"   rf  rf    s   
C
Ac(mm$$  ~9AdGE  uuT{{T
 E"I%		  E"I% cNNIc%jj112D % %<DIdOO$$$$T??r$   c                    d}i }t          t          |                    D ]}||         }|dk    r|||<   g }d }d}	| dd          D ]F}|                    |d          }||}n'|	dz   |k    r|	|z
  }
|                    ||
f           |}|}	G|	|z
  }
|                    ||
f           |r:|d         d         dk    r(|                                 |r|d         d         dk    (t          |          t          t          |                    g}|D ]?\  }}
|dk    rd}|                    t          |          t          |
          z              @t          |          S )Nr   r6  r   r   r  )rY   r   r9   rT  r  r}  rT   rX  rt  rY  r[  r   s               r"   rg  rg    s   
C
Ac(mm$$  ~9AdGFE
C  uuT2=EE1W__%KEMM5%.)))E%KE
MM5%.!!!  VBZ]b((

  VBZ]b(( cNNIc&kk223D 9 9uB;;EIe$$y'7'778888T??r$   c                        e Zd Zd Zd Zd ZdS )FDArrayConverterc                     	 |j         }n# t          $ r d }Y nw xY w|j        }|j        }|                    |           t          ||          }||_        |j        |_        |j        |_        |S r  )	ry   r  r?   r
  r1   rI  r~   r9   r=   )r>   r   rl   r~   r?   r&   r   s          r"   r  zFDArrayConverter._read/  s    	_FF 	 	 	FFF	{		%tF333 .$0s   
 c                     dS r   r   r  s      r"   r   zFDArrayConverter.write=  r  r$   c                     t                      }|D ]5}t          |t                    r|\  }}}|                    |||           6|S r   )rI  rN   rO   r|   )r>   rT   r   r   r   r   r   s          r"   r^  zFDArrayConverter.xmlRead@  sY    .. 	2 	2G'3'' #* D%OOD%1111r$   Nr  r   r$   r"   r  r  .  sA                r$   r  c                   &    e Zd Zd Zd Zd Zd ZdS )FDSelectConverterc                 h    |j         }|                    |           t          ||j                  }|S r   )r?   r1   rj  rp  )r>   r   rl   r?   r)  s        r"   r  zFDSelectConverter._readK  s2    {		%D&"233r$   c                     dS r   r   r  s      r"   r   zFDSelectConverter.writeQ  r  r$   c                 j    |                     |d|j        fg           |                                 d S Nrm  )rp   rm  rq   r  s       r"   r  zFDSelectConverter.xmlWriteV  s:    DHel#;"<===r$   c                 Z    t          |d                   }d }d }t          |||          }|S r  )r   rj  )	r>   rT   r   r   r   rT  r?   rp  r)  s	            r"   r^  zFDSelectConverter.xmlReadZ  s3    uX''	D)S11r$   Nr  r   r$   r"   r  r  J  sP            
      r$   r  c                   &    e Zd Zd Zd Zd Zd ZdS )VarStoreConverterc                     |j         }|                    |           t          |          }|                                 |S r   )r?   r1   rO  rB   )r>   r   rl   r?   r  s        r"   r  zVarStoreConverter._readc  s?    {		%%%r$   c                     dS r   r   r  s      r"   r   zVarStoreConverter.writej  r  r$   c                 2    |                     ||           d S r   )r[  r  s       r"   r  zVarStoreConverter.xmlWritem  s    y$'''''r$   c                 R    t                      }|                    ||||           |S r   )rO  r^  )r>   rT   r   r   r   r  s         r"   r^  zVarStoreConverter.xmlReadp  s*    >>ugv666r$   Nr  r   r$   r"   r  r  b  sP            ( ( (    r$   r  c                     d}t          |          g}| D ]$}|                    t          |                     %t          |          S r   )r  ra   r	   )fdSelectArrayrT  r   rP   s       r"   packFDSelect0r  v  sM    
CcNND & &Ie$$%%%%T??r$   c                 2   d}g }t          |           }d}t          |          D ])}| |         }||k    r|                    ||g           |}*|dz   }t          |          g}|                    t	          t          |                               |D ]R}	|                    t	          |	d                              |                    t          |	d                              S|                    t	          |                     t          |          S )Nr   r   r   r   )rD   r  ra   r  r  r	   
r  rT  fdRangeslenArraylastFDIndexr4  r-  sentinelGIDr   fdRanges
             r"   packFDSelect3r  ~  s   
CH=!!HK8__ " ""'!!OOQL)))!Ka%KcNNDKK
3x==))*** + +Jwqz**+++Igaj))****KK
;''(((T??r$   c                 2   d}g }t          |           }d}t          |          D ])}| |         }||k    r|                    ||g           |}*|dz   }t          |          g}|                    t	          t          |                               |D ]R}	|                    t	          |	d                              |                    t          |	d                              S|                    t	          |                     t          |          S )NrX   r   r   r   )rD   r  ra   r  r  r  r	   r  s
             r"   packFDSelect4r    s   
CH=!!HK8__ " ""'!!OOQL)))!Ka%KcNNDKK
3x==))*** , ,Jwqz**+++Jwqz**++++KK
;''(((T??r$   c                   &    e Zd Zd Zd Zd Zd ZdS )FDSelectCompilerc                    |j         }|j        }|dk    rt          |          | _        n|dk    rt	          |          | _        nv|dk    rt          |          | _        n[t          |          }t	          |          }t          |          t          |          k     r|| _        d|_         n|| _        d|_         || _        d S )Nr   r   rX   )rm  ro  r  r   r  r  rD   r   )r>   r)  r   rT  r  r:  data3s          r"   r   zFDSelectCompiler.__init__  s    o )!88%m44DIIAXX%m44DIIAXX%m44DII "-00E!-00E5zzCJJ&&!	"#!	"#r$   c                 $    || j         j        d<   d S )Nrj  r   r   s      r"   r   zFDSelectCompiler.setPos  rk  r$   c                 *    t          | j                  S r   r`  rE   s    r"   r`   zFDSelectCompiler.getDataLength  ra  r$   c                 :    |                     | j                   d S r   r>  r?  s     r"   rc   zFDSelectCompiler.toFile  r@  r$   NrA  r   r$   r"   r  r    sP          ,. . .      r$   r  c                   &    e Zd Zd Zd Zd Zd ZdS )VarStoreCompilerc                     || _         |j        s|                                 t          dt	          |j                            }t          |          |j        g}t          |          | _        d S rS  )r   r   ri   minrD   r  r	   )r>   varStoreDatar   varStoreDataLenr   s        r"   r   zVarStoreCompiler.__init__  sf      	#  """fc,*;&<&<==?++\->?dOO			r$   c                 $    || j         j        d<   d S )Nry   r   r   s      r"   r   zVarStoreCompiler.setPos  rk  r$   c                 *    t          | j                  S r   r`  rE   s    r"   r`   zVarStoreCompiler.getDataLength  ra  r$   c                 :    |                     | j                   d S r   r>  r?  s     r"   rc   zVarStoreCompiler.toFile  r@  r$   NrA  r   r$   r"   r  r    sP        $ $ $. . .      r$   r  c                       e Zd Zd Zd ZdS )ROSConverterc                     |\  }}}|                     |dt          |          fdt          |          fd|fg           |                                 d S NRegistryOrder
Supplementr  )r>   ru   rT   rl   registryorder
supplements          r"   r  zROSConverter.xmlWrite  sl    &+#%U8__-%,,'z*	
 	
 	
 	r$   c                 J    |d         |d         t          |d                   fS r  )r   r  s        r"   r^  zROSConverter.xmlRead  s%    j!5>8E,<O3P3PQQr$   Nr  r   r$   r"   r  r    s7        
 
 
R R R R Rr$   r  )   maxstacknumberNN)      r"  )rZ  rZ  r  ))r     SyntheticBaser  NN)r   versionrZ  NNr  rZ  )r  r   r  r   FullName)r  &   FontNamer   
FamilyName)rX   WeightrZ  NN))r  r   isFixedPitchr  r   N))r  r   ItalicAngler  r   N))r  r   UnderlinePositionr  iN))r  rX   UnderlineThicknessr  2   N))r  rW   	PaintTyper  r   N))r     CharstringTyper  r   N)r     
FontMatrixrl  )MbP?r   r   r  r   r   )   UniqueIDr  NNrW   FontBBox)r   r   r   r   ))r     StrokeWidthr  r   N)   XUIDrl  NN))r     
PostScriptrZ  NN))r     BaseFontNamerZ  NN))r     BaseFontBlenddeltaNN))r     CIDFontVersionr  r   N))r      CIDFontRevisionr  r   N))r  !   CIDFontTyper  r   N))r  "   CIDCountr  i"  N   rY   r  ))r  #   UIDBaser  NN   rj     rz   )r  r  )r  %   )r  $   r}         ry   blendr  )r  vsindexr  NNr  )r  
BlueValuesr  NN)r  
OtherBluesr  NN)r  FamilyBluesr  NN)	   FamilyOtherBluesr  NN))r  r  	BlueScaler  g}?5^I?N))r  
   	BlueShiftr  r  N))r     BlueFuzzr  r   N)r
  StdHWr  NN)r  StdVWr  NN))r  r  	StemSnapHr  NN))r  r  	StemSnapVr  NN))r  r  	ForceBoldr  r   N))r  r  ForceBoldThresholdr  NN))r  r  lenIVr  NN))r  r   LanguageGroupr  r   N))r  r  ExpansionFactorr  gQ?N))r     initialRandomSeedr  r   N)r  defaultWidthXr  r   N)r  nominalWidthXr  r   Nr  r   c                 
   t          t          |                     D ]e}| |         \  }}}}}||dv rt                      }n5|dk    rt                      }n |dk    rt	                      }n|dk    rd }nJ |||||f| |<   fd S )N)r  rl  r  rZ  r  )r  rD   r  r  r  )r   r4  r  rT   r  r  r  s          r"   addConvertersr  `  s    3u:: 0 0',Qx$D#w$$$!##DDH__"$$DDE\\!##DDKDDLtS'4/a0 0r$   c                   $    e Zd Z ee          ZdS )TopDictDecompilerN)r   r   r   r  topDictOperators	operatorsr   r$   r"   r  r  v  s        !!"233IIIr$   r  c                   $    e Zd Z ee          ZdS )PrivateDictDecompilerN)r   r   r   r  privateDictOperatorsr   r   r$   r"   r"  r"  z  s        !!"677IIIr$   r"  c                   P    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd ZdS )DictCompilerr   Nc                    |rt          |t                    sJ |t          |d          r|j        }|J || _        || _        || _        || _        i }|j        D ]]}t          ||d           }||j	        |         }|
                    ||          }||j                            |          k    rX|||<   ^|| _        d S r   )rN   r8   rM   r&   r7  r9   r   r  r  
convertersr   defaultsr  r   )	r>   r7  r9   r   r&   r   rT   rl   r  s	            r"   r   zDictCompiler.__init__  s     	7g~66666>gfh77>]F%%%M 	" 	"DGT400E}%d+DJJw..E(,,T2222!GDMMr$   c                     d S r   r   r   s      r"   r   zDictCompiler.setPos  r2  r$   c                 F    t          |                     d                    S )Nr`   )rD   ri   rE   s    r"   r`   zDictCompiler.getDataLength  s    4<<00111r$   c                    t                                t          d| j        j        |           | j        }g }| j        j        D ]}|                    |          }|| j        |         \  }}t          |t                    rt          |          }t          |          |k    s
J d            t          |          D ]C}	||	         }
||	         }t          | d|
z             }|                     ||                     Dn1t          | d|z             }|                     ||                     |                    |           t          |          }|S )Nz-- compiling %s for %szvalue doesn't match arg typearg_)r   r   r   r   r   r7  r  r  opcodesrN   r]  rD   r  r  ra   r	   )r>   reasonr   r   rT   rl   r  argTyper  r4  r  v
arghandlers                r"   ri   zDictCompiler.compile  sO   /1H&QQQ,L& 	 	DKK%%E},t,KB'5)) 
/LL5zzQ(Fq / /A!!*CaA!(v|!<!<JKK

1....	/ %T6G+;<<
JJu--...KKOOOOr$   c                 Z    |                      d          }|                    |           d S )Nrc   )ri   r   )r>   r?   r   s      r"   rc   zDictCompiler.toFile  s+    ||H%%

4r$   c                    t          |t                    red |D             }|                    t          d                     |                    t	          t
                               t          |          }nt          |          }|S )Nc                 ,    g | ]}t          |          S r   encodeNumberr  s     r"   r  z+DictCompiler.arg_number.<locals>.<listcomp>  s     555#L%%555r$   r   )rN   r3   ra   r6  r   blendOpr	   )r>   numr   datums       r"   
arg_numberzDictCompiler.arg_number  sx    c4   	&55555DKKQ(((KK(()))dOOEE %%Er$   c                 Z    t          j        | j                            |                    S r   )r   encodeIntCFFr9   rQ  )r>   r!   s     r"   arg_SIDzDictCompiler.arg_SID  s#    )$,*=*=a*@*@AAAr$   c                 ~    g }|D ]*}|                     |                     |                     +t          |          S r   )ra   r:  r	   )r>   rl   r   r8  s       r"   	arg_arrayzDictCompiler.arg_array  sC     	. 	.CKK,,----r$   c                 &   |sdS |d         }t          |t                    r|                     |          }nLg }d}|D ]}|                    ||z
             |}g }|D ]$}|                    t	          |                     %t          |          S )Nr$   r   )rN   r3   arg_delta_blendra   r6  r	   )r>   rl   val0r   r   lastr0  r8  s           r"   	arg_deltazDictCompiler.arg_delta  s     	3QxdD!! 
	/''..DDCD  

1t8$$$D / /L--....r$   c                    t          |d                   }t          |          }||z  dz   }|| j        k    rt          | j        dz
  |z            }g }	 t          t          |          |          }|dk    rn?|d|         }|                     |          }	|                    |	           ||d         }cndg|z  }
dg|z  }d}d}||k     r6||         d         }||z
  |
|<   |}||         dd         ||<   |dz  }||k     6|
}|D ]}|                    |           d |D             }|                    t          |                     |                    t          t                               |S )aM  A delta list with blend lists has to be *all* blend lists.

        The value is a list is arranged as follows::

                [
                        [V0, d0..dn]
                        [V1, d0..dn]
                        ...
                        [Vm, d0..dn]
                ]

        ``V`` is the absolute coordinate value from the default font, and ``d0-dn``
        are the delta values from the *n* regions. Each ``V`` is an absolute
        coordinate from the default font.

        We want to return a list::

                [
                        [v0, v1..vm]
                        [d0..dn]
                        ...
                        [d0..dn]
                        numBlends
                        blendOp
                ]

        where each ``v`` is relative to the previous default font value.
        r   r   TNc                 ,    g | ]}t          |          S r   r5  r  s     r"   r  z0DictCompiler.arg_delta_blend.<locals>.<listcomp>	  s     ===<$$===r$   )
rD   maxBlendStackr   r  rA  r   ra   r6  r   r7  )r>   rl   
numMasters	numBlendsnumStacknumBlendValuesr   numValvalListout1	firstList	deltaListr4  prevValdefaultValuerelValueListr  s                    r"   rA  zDictCompiler.arg_delta_blend  s   : q]]
JJ	
*a/d((( !$"4q"8J!FGGNC'SZZ88Q;;&/++G44

4   fgg'  iI*IAGi--
  %Qx{+g5	!&$Qx|	!Q i-- %L& / /	##I....=====CJJ|I..///JJww''(((
r$   r   )r   r   r   rG  r   r   r`   ri   rc   r:  r=  r?  rD  rA  r   r$   r"   r%  r%  ~  s        M   ,  2 2 2  0    B B B    "D D D D Dr$   r%  c                 |    t          | t                    rt          j        |           S t          j        |           S r   )rN   r  r   encodeFloatr<  )r8  s    r"   r6  r6  $	  s6    #u /(---)#...r$   c                   *    e Zd Z ee          Zd ZdS )TopDictCompilerc                 ~   | j         }g }| j        j        t          | j        d          rx| j        j        rlt          | j        d          rd }nt          | j        j                  }|/|                    t          || j        j        |                      n
|| j        d<   t          | j        d          rQ| j        j	        rE| j        j	        }t          |t                    s$|                    t          |||                      nFt          | j        d          r1| j        j        }t          ||           }|                    |           t          | j        d          r| j        j        }t!          |          dk    r;| j        j        }	| j        j        D ]"}
|                    |	|
         j                   #t'          ||           }|                    |           t          | j        d          r`g }| j        j        }	| j        j        D ]}
|                    |	|
                    t)          ||| |          }|                    |           t          | j        d	          r]| j        j                            ||           }|                    |           |                    |                    |                     t          | j        d
          r]| j        j                            ||           }|                    |           |                    |                    |                     |S )NrY   r"  rj  ry   rj  r   r  r%   r}   rz   )r&   r7  rA   rM   rY   rL  ra   r4  r   rj  rN   rO   rd  ry   r  rj  rD   r  r  r  r   r}   r]   r   rb   rz   )r>   r9   r&   rg   charsetCoder   r  varStoreCompr)  r  rT   fdSelectCompr   charStringsCompfdArrayIndexCompprivComps                   r"   rb   zTopDictCompiler.getChildren.	  s   <)1t|Y// 
:DL4H 
:4<// F"&KK"/0D"E"EK&OO'1EtLL    /:DL+t|Z00 OT\5J O<0!(C00 OOO$4Wh$M$MNNNt|Z00 .#|4/dCC---4<,, 	*
 |,H8}}!!"l6 L0 E EDOOK$5$CDDDD+Hd;;LOOL)))4<// 	-E,2K, 0 0[.////1%$vVVVOOOO,,,4<++ 	C  $|3??NNOO,---OO,88AABBB4<++ 	;|+77FFHOOH%%%OOH0099:::r$   N)r   r   r   r  r  r-  rb   r   r$   r"   rW  rW  +	  s3        o.//G7 7 7 7 7r$   rW  c                   <     e Zd Z ee          Zd fd	Zd Z xZS )FontDictCompilerNc                 v   t          t          |                               ||||           g }| j        }t	          t          |j                  t          |j                  z
            D ]}||j        v r|	                    |           !|j
                            |          }|#|j        |         }|                    ||          }t          ||d           |k    r|	                    |           |r?t                              dd                    t	          |                    z              d S d S )Nr%   z:Some CFF FDArray/FontDict keys were ignored upon compile: r  )r   r`  r   r7  r  r'  r'  r  r   ra   r(  r  r,   r  r   warningr  )
r>   r7  r9   r   r&   ignoredNamesrT   r  r  r   s
            r"   r   zFontDictCompiler.__init__k	  sL   %%..wPV.WWW ,3w122S5G5GGHH 	. 	.Dw&&
 ##D)))) "*..t44&"-d3D"ii99G7D$//7:: ''--- 	KKL((6,//001    	 	r$   c                     g }t          | j        d          r]| j        j                            ||           }|                    |           |                    |                    |                     |S Nrz   )rM   r7  rz   r]   ra   r   rb   )r>   r9   rg   r^  s       r"   rb   zFontDictCompiler.getChildren	  sl    4<++ 	;|+77FFHOOH%%%OOH0099:::r$   r   )	r   r   r   r  r  r-  r   rb   r   r   s   @r"   r`  r`  h	  s]        o.//G     B      r$   r`  c                   4    e Zd ZeZ ee          Zd Zd Z	dS )PrivateDictCompilerc                 @    ||z
  }||f| j         j        d<   || _        d S re  )r   r   r   )r>   r   r   r  s       r"   r   zPrivateDictCompiler.setPos	  s)    |)-sI&r$   c                     g }t          | j        d          r3|                    | j        j                            ||                      |S r   )rM   r7  ra   r   r]   )r>   r9   rg   s      r"   rb   zPrivateDictCompiler.getChildren	  sH    4<)) 	KOODL.::7DIIJJJr$   N)
r   r   r   maxStackLimitrG  r  r#  r-  r   rb   r   r$   r"   rg  rg  	  sG        !Mo233G  
    r$   rg  c                   <    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	dS )BaseDictNc                     |d u |d u k    sJ i | _         g | _        || _        |d S || _        || _        |5t
                              t          d| j        j        |           || _	        d S d S )Nr  )
r   	skipNamesr9   r
  r?   r   r   r   r   r   )r>   r9   r?   r   r&   s        r"   r   zBaseDict.__init__	  s    $DDL1111<F	GGE-t~/FOOO DKKK r$   c                 2   t                                t          d| j        j        t	          |                     |                     | j        |           }|                    |           |                                | _	        | 
                                 d S )Nz    length %s is %d)r   r   r   r   rD   decompilerClassr9   rB   getDictr   postDecompile)r>   r   decs      r"   rB   zBaseDict.decompile	  sv    ,dn.Es4yyQQQ""4<66d{{}}r$   c                     d S r   r   rE   s    r"   rr  zBaseDict.postDecompile	  r2  r$   c                 4    |                      | |||          S r  r  r   s       r"   r]   zBaseDict.getCompiler	  r!  r$   c                 \   |d d         |dd          cxk    rdk    rn nt          |          | j                            |d           }|| j                            |          }|t          |          | j        |         }|                    | |          }t          | ||           |S )Nr   __)r  r   r  r(  r'  r,   setattr)r>   rT   rl   r  s       r"   __getattr__zBaseDict.__getattr__	  s    8tBCCy((((D(((((
 !&&&  t,,=M%%d++E= &&&t$		$&&dE"""r$   c                    | j         D ]J}|| j        v rt          | |d           }||dk    r&| j        |         }|                    |||           Kt          | j                  t          | j                   z
  }|rN|                    dd                    t          |                    z             |
                                 d S d S )NrY   zsome keys were ignored: %sr  )r  rn  r  r'  r  r'  r   r2  r  r  rq   )r>   ru   rT   rl   r  rc  s         r"   rs   zBaseDict.toXML	  s    J 	2 	2Dt~%%D$--E }!2!2?4(DMM)T511114<((3tz??: 	 ,sxx|8L8L/M/MM   		  	 r$   c                 r    | j         |         }|                    ||||           }t          | ||           d S r   )r'  r^  ry  )r>   rT   r   r   r  rl   s         r"   r|   zBaseDict.fromXML	  s=    t$T5'488dE"""""r$   )NNNNr   )
r   r   r   r   rB   rr  r]   rz  rs   r|   r   r$   r"   rl  rl  	  s        ! ! ! !    H H H H  "     2# # # # #r$   rl  c                        e Zd ZdZ ee          Z ee          Ze	Z
 ee          ZeZ	 	 	 	 	 	 d	 fd	Zd Zd Zd Zd Zd Z xZS )
r{   ad  The ``TopDict`` represents the top-level dictionary holding font
    information. CFF2 tables contain a restricted set of top-level entries
    as described `here <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#7-top-dict-data>`_,
    but CFF tables may contain a wider range of information. This information
    can be accessed through attributes or through the dictionary returned
    through the ``rawDict`` property:

    .. code:: python

            font = tt["CFF "].cff[0]
            font.FamilyName
            # 'Linux Libertine O'
            font.rawDict["FamilyName"]
            # 'Linux Libertine O'

    More information is available in the CFF file's private dictionary, accessed
    via the ``Private`` property:

    .. code:: python

            tt["CFF "].cff[0].Private.BlueValues
            # [-15, 0, 515, 515, 666, 666]

    Nc                 j   t          t          |                               ||||           || _        || _        |rCt          t                    | _         |            | _        t          t                    | _
        d S t          t                    | _        t          t                    | _
        d S r  )r   r{   r   rA   r=   r  topDictOperators2r(  rY   r  r  r  )r>   r9   r?   r   r=   rA   r&   r   s          r"   r   zTopDict.__init__
  s     	gt%%gtVF%KKK!2& 	6)*;<<DM,,..DL#$566DJJJ)*:;;DM#$455DJJJr$   c                     | j         S )z.Returns a list of glyph names in the CFF font.)rY   rE   s    r"   r;   zTopDict.getGlyphOrder$
  
    |r$   c                     | j                             d          }|d S | j                            |           | j        rt          | j                  | _        d S t          | j                  | _        d S r  )r   r  r?   r1   r
  r  rp  r  )r>   r   s     r"   rr  zTopDict.postDecompile(
  si    !!-00>F	v< 	3'	22DNNN'	22DNNNr$   c                    t          | d          r|                                  t          | d          rdg| _        t          | d          rt          | d          s	g d| _        t                              | |           d S )Nr  r"  rj  )r  r  r  r  )rM   decompileAllCharStringsrn  rl  rs   )r>   ru   s     r"   rs   zTopDict.toXML3
  s    4'' 	+((***4 	*(\DNtU## 	74+G+G 	  DN 	tY'''''r$   c                     t          | j                                                  D ];\  }}	 |                                 #  t                              d|            xY wd S )NzError in charstring %s)	enumerater  rJ   rB   r   error)r>   r4  r  s      r"   r  zTopDict.decompileAllCharStringsC
  sq    &t'7'>'>'@'@AA 	 	MAz$$&&&&		2A666	 	s   AA c                 "   d }| j                                         D ]3}|                    | j                   }||t          ||          }1|}4|| j        d         d d          | _        d S t          t          |                    | _        d S )Nr  )r  rJ   
calcBoundsr   r(  r  r3   r   )r>   fontBBoxr  boundss       r"   r[   zTopDict.recalcFontBBoxL
  s    *1133 	& 	&J**4+;<<F!'(6::HH%H M*5aaa8DMMM !2!233DMMMr$   r9  )r   r   r   r   r  r  r(  r  r'  rW  r  r  r  r  rp  r   r;   rr  rs   r  r[   r   r   s   @r"   r{   r{   	  s         2 }-..H !122J#MJ'((E'O 6 6 6 6 6 6(  	3 	3 	3( ( (   4 4 4 4 4 4 4r$   r{   c                   b     e Zd Zi Z ee          ZeZg dZ	dgZ
eZ	 	 	 	 	 	 d fd	Zd Z xZS )rD  )r  r  r  rz   rz   Nc                     t          t          |                               ||||           || _        |                     |           d S r  )r   rD  r   r~   setCFF2)r>   r9   r?   r   r=   r&   r~   r   s          r"   r   zFontDict.__init__
  sK     	h&&wfV&LLLVr$   c                 Z    |r| j         | _        d| _        d S | j        | _        d| _        d S )NTF)	orderCFF2r  r
  orderCFFr   s     r"   r  zFontDict.setCFF2
  s2     	!DJDLLLDJ DLLLr$   r9  )r   r   r   r(  r  r  r'  r`  r  r  r  r  rp  r   r  r   r   s   @r"   rD  rD  \
  s        8 H !122J$M>>>HI'O      ! ! ! ! ! ! !r$   rD  c                        e Zd Z ee          Z ee          Z ee          Z	e
ZeZd fd	Zed             ZddZ xZS )r  Nc                 v   t          t          |                               ||||           || _        |rIt	          t
                    | _        t          t
                    | _        d x| _	        | _
        d| _        d S t	          t                    | _        t          t                    | _        d| _        d S )Nr%   TF)r   r  r   r~   r  privateDictOperators2r(  r  r  r  r  r
  r#  )r>   r9   r?   r   r&   r~   r   s         r"   r   zPrivateDict.__init__
  s    k4  ))'4)OOO 
	!)*?@@DM#$9::DJ 7;:D!3DLLL)*>??DM#$899DJ DLLLr$   c                     | j         S r   )r
  rE   s    r"   in_cff2zPrivateDict.in_cff2
  r  r$   c                 r    |t          | d          r| j        }nd}| j                            |          }|S )Nr  r   )rM   r  r~   rh  )r>   virg  s      r"   rh  zPrivateDict.getNumRegions
  sB    :tY'' \[..r22
r$   )NNNNNr   )r   r   r   r  r#  r(  r  r'  r  r  r"  rp  rg  r  r   propertyr  rh  r   r   s   @r"   r  r  
  s        }122H !566JJ+,,E+O'M! ! ! ! ! !   X       r$   r  c                   >    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
dS )r8   zSID -> string mapping.Nc                 T    |g }nd t          |d          D             }|| _        d S )Nc                 0    g | ]}t          |d           S )r   r   r   r   s     r"   r  z+IndexedStrings.__init__.<locals>.<listcomp>
  s%    VVVquQ222VVVr$   Fr%   )r4   r9   )r>   r?   r9   s      r"   r   zIndexedStrings.__init__
  s9    <GGVVE$u<U<U<UVVVGr$   c                 (    t          | d | d          S )NFr%   )r   rE   s    r"   r]   zIndexedStrings.getCompiler
  s    %dD$uEEEEr$   c                 *    t          | j                  S r   )rD   r9   rE   s    r"   rF   zIndexedStrings.__len__
  s    4<   r$   c                 \    |t           k     rt          |         S | j        |t           z
           S r   )cffStandardStringCountcffStandardStringsr9   )r>   rZ  s     r"   rU   zIndexedStrings.__getitem__
  s,    '''%c**<&< <==r$   c                 L   t          | d          s|                                  t          |d          }|t          v rt          |         }nW|| j        v r| j        |         }n@t          | j                  t          z   }| j                            |           || j        |<   |S )NstringMappingr   r   )	rM   buildStringMappingr   cffStandardStringMappingr  rD   r9   r  ra   )r>   r!   rZ  s      r"   rQ  zIndexedStrings.getSID
  s    t_-- 	&##%%%!h'''(((*1-CC$$$$$Q'CCdl##&<<CL"""$'Dq!
r$   c                     | j         S r   r   rE   s    r"   
getStringszIndexedStrings.getStrings
  s
    |r$   c                     i | _         t          t          | j                            D ]}|t          z   | j         | j        |         <    d S r   )r  r  rD   r9   r  ry  s     r"   r  z!IndexedStrings.buildStringMapping
  sV    3t|,,-- 	U 	UE6;>T6TDt|E233	U 	Ur$   r   )r   r   r   r   r   r]   rF   rU   rQ  r  r  r   r$   r"   r8   r8   
  s             F F F! ! !> > >    U U U U Ur$   r8   (  r6  spaceexclamquotedbl
numbersigndollarpercent	ampersand
quoteright	parenleft
parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon	semicolonlessequalgreaterquestionatAr   CDEFGHIJKLMNOPQRSTUVWXYZbracketleft	backslashbracketrightasciicircum
underscore	quoteleftabcr  efghr4  jkr  r  r.  opqrr!   tur0  wxyz	braceleftbar
braceright
asciitilde
exclamdowncentsterlingfractionyenflorinsectioncurrencyquotesinglequotedblleftguillemotleftguilsinglleftguilsinglrightfiflendashdagger	daggerdblperiodcentered	paragraphbulletquotesinglbasequotedblbasequotedblrightguillemotrightellipsisperthousandquestiondowngraveacute
circumflextildemacronbreve	dotaccentdieresisringcedillahungarumlautogonekcaronemdashAEordfeminineLslashOslashOEordmasculineaedotlessilslashoslashoe
germandblsonesuperior
logicalnotmu	trademarkEthonehalf	plusminusThorn
onequarterdivide	brokenbardegreethornthreequarterstwosuperior
registeredminusethmultiplythreesuperior	copyrightAacuteAcircumflex	AdieresisAgraveAringAtildeCcedillaEacuteEcircumflex	EdieresisEgraveIacuteIcircumflex	IdieresisIgraveNtildeOacuteOcircumflex	OdieresisOgraveOtildeScaronUacuteUcircumflex	UdieresisUgraveYacute	YdieresisZcaronaacuteacircumflex	adieresisagravearingatildeccedillaeacuteecircumflex	edieresisegraveiacuteicircumflex	idieresisigraventildeoacuteocircumflex	odieresisograveotildescaronuacuteucircumflex	udieresisugraveyacute	ydieresiszcaronexclamsmallHungarumlautsmalldollaroldstyledollarsuperiorampersandsmall
Acutesmallparenleftsuperiorparenrightsuperiortwodotenleaderonedotenleaderzerooldstyleoneoldstyletwooldstylethreeoldstylefouroldstylefiveoldstylesixoldstylesevenoldstyleeightoldstylenineoldstylecommasuperiorthreequartersemdashperiodsuperiorquestionsmall	asuperior	bsuperiorcentsuperior	dsuperior	esuperior	isuperior	lsuperior	msuperior	nsuperior	osuperior	rsuperior	ssuperior	tsuperiorffffifflparenleftinferiorparenrightinferiorCircumflexsmallhyphensuperior
GravesmallAsmallBsmallCsmallDsmallEsmallFsmallGsmallHsmallIsmallJsmallKsmallLsmallMsmallNsmallOsmallPsmallQsmallRsmallSsmallTsmallUsmallVsmallWsmallXsmallYsmallZsmallcolonmonetary	onefittedrupiah
TildesmallexclamdownsmallcentoldstyleLslashsmallScaronsmallZcaronsmallDieresissmall
Brevesmall
CaronsmallDotaccentsmallMacronsmall
figuredashhypheninferiorOgoneksmall	RingsmallCedillasmallquestiondownsmall	oneeighththreeeighthsfiveeighthsseveneighthsonethird	twothirdszerosuperiorfoursuperiorfivesuperiorsixsuperiorsevensuperioreightsuperiorninesuperiorzeroinferioroneinferiortwoinferiorthreeinferiorfourinferiorfiveinferiorsixinferiorseveninferioreightinferiornineinferiorcentinferiordollarinferiorperiodinferiorcommainferiorAgravesmallAacutesmallAcircumflexsmallAtildesmallAdieresissmall
AringsmallAEsmallCcedillasmallEgravesmallEacutesmallEcircumflexsmallEdieresissmallIgravesmallIacutesmallIcircumflexsmallIdieresissmallEthsmallNtildesmallOgravesmallOacutesmallOcircumflexsmallOtildesmallOdieresissmallOEsmallOslashsmallUgravesmallUacutesmallUcircumflexsmallUdieresissmallYacutesmall
ThornsmallYdieresissmallz001.000z001.001z001.002z001.003BlackBoldBookLightMediumRegularRomanSemiboldi  )r6  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r4  r  r  r  r  r.  r  r  r  r  r!   r  r  r0  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r     )r6  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>  r;  rC  r  r  r  r  r  r  r  r  r6  rD  rI  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r     )Wr6  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>  r;  rC  r  r  r  r  r  r  r  r6  rD  rI  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  W   )r   fontTools.miscr   r   fontTools.misc.arrayToolsr   r   fontTools.misc.textToolsr   r   r	   r
   r   r   fontTools.ttLibr   fontTools.ttLib.tables.otBaser   r   fontTools.ttLib.tablesr   rT  ior   r/   loggingr  r   	getLoggerr   r   r+   rj  objectr   r\   r   r   r   r   r   r   r   r   r4   r<   r<  r6   rI  rO  rj  r  r  r  r  r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r   r4  rL  rO  rR  r8  r9  r$  r%  rd  ro  r  rx  rv  rw  rf  rg  r  r  r  r  r  r  r  r  r  r  r  r  r7  r#  r  r  DictDecompilerr  r"  r%  r6  rW  r`  rg  rl  r{   rD  r  r8   r  r  rD   r  r  _ir(  rC  r)  rD  r*  rE  r   r$   r"   <module>r2     s    # " " " " " ( ( ( ( ( ( 8 8 8 8 8 8 8 8                # " " " " " 7 7 7 7 7 7 7 7 7 7 7 7 1 1 1 1 1 1         				 	g!! T( T( T( T( T( T( T( T(n/& /& /& /& /& /& /& /&d	 	 	I% I% I% I% I%F I% I% I%X    ]   
!; !; !; !; !;= !; !; !;H&- &- &- &- &-= &- &- &-R	 	 	 	 	- 	 	 	. . . . .' . . .1 1 1 1 1- 1 1 1D D D D DF D D DNh  h  h  h  h u h  h  h V" " " " "! " " "4  4  4  4  4 5 4  4  4 n         5      F3 3 3 3 36 3 3 3l=, =, =, =, =,v =, =, =,@H) H) H) H) H)& H) H) H)V! ! !  
  
  ) ) )) ) )  $ $ $$ $ $              f   2; ; ; ; ;_ ; ; ;< < < < <o < < <$        o   2    _   8    _   $    >   .    ^   : : : : :> : : :z; ; ; ; ; ; ; ;|    f   ,     ,       
 
 
" " "J
 
 
  (    v   *< < < < < < < <~( ( (      &  .  D    ~   8       0       (    *  *    v   B    v   &R R R R R? R R R"&*& u.llnnE& 6	&
 && %001& k5$(9(9:& 
E4!2!23& z5$(9(9:& eT??#4#45& %& 1& 0& 9& 8&  .!&" 3#&$ lG%?%?%?F%&& +'&( 
G\\\40)&* 0+&, &-&. 0/&0 21&2 53&4 45&6 57&8 19&: 1;&< Hd$4$4$6$67=&> 0?&@ Xq"3"3"5"56A&B ($0D0D0F0FGC&D z8T+<+<+>+>?E&F y(D*:*:*<*<=G&H $(<(<(>(>?I&J Xt%6%6%8%89K& T +lG%?%?%?Fz8T+<+<+>+>?y(D*:*:*<*<=$(<(<(>(>?Xt%6%6%8%89   
 * +*+04.-''00.:-276,,(D.."2"23; D * +*+04.-''0027(D.."2"23/ 60 0 0$ " # # #    4 4 4 4 44 4 4 48 8 8 8 8M8 8 8 8c c c c c6 c c cL/ / /: : : : :l : : :z* * * * *| * * *Z    ,    H# H# H# H# H#v H# H# H#Vi4 i4 i4 i4 i4h i4 i4 i4X7! 7! 7! 7! 7!x 7! 7! 7!t" " " " "( " " "J*U *U *U *U *UV *U *U *U`H H H T  
s"88888 
%&
'
' : :B79/344f f f P  
s"88888g g g R  
s!55555X X X t   
s!""&@@@@@@@r$   