
    <`_                    
   d Z ddl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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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-          Z0 G d+ d,e-          Z1 G d- d.e"          Z2 G d/ d0e"          Z3 G d1 d2e"          Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZAd@ ZB G dA dBe"          ZC G dC dDeC          ZD G dE dFeC          ZEdG ZFdH ZG G dI dJeC          ZH G dK dLeC          ZI G dM dNeC          ZJ G dO dPeJ          ZK G dQ dReJ          ZL G dS dTeJ          ZM G dU dVeC          ZN G dW dXe"          ZOdY ZPdZ ZQd[ ZRd\ ZSd] ZTd^ ZUd_ ZV G d` dae"          ZW G db dceC          ZXdd ZYde ZZdf Z[dg Z\ G dh dieJ          Z] G dj dkeC          Z^ G dl dmeC          Z_dn Z`do Zadp Zb G dq dre"          Zc G ds dte"          Zd G du dveC          Zeg dwdxdydzd ee            fd{d|dd}d~d eE            fddd~d eE            fddd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 eN            fddddd eX            fdddd eK            fdd0dd e^            fdddd e]            fdd2dd eM            fdddd e_            fZfdwdddg ddfdd0dd e^            fdddd e]            fdd2dd eM            fdddd e_            fgZgdZhdZideiehdddfddddddddddddddddddddddd eL            fgZjdeiehdddfddddddddddddddddd eL            fgZkdĄ Zl elej            elef            G dń de	jm                  Zn G dǄ de	jm                  Zo G dɄ de"          Zpd˄ Zq G d̄ dep          Zr G d΄ dep          Zs G dЄ dep          Zt G d҄ de"          Zu G dԄ deu          Zv G dք deu          Zw G d؄ deu          Zx G dڄ de"          Zyg dܢZzdZ{ e|ez          e{k    sJ i Z} e~e{          D ]Zee}eze         <   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 contain a completely independent
font file, 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.

    )bytechrbyteord	bytesjointobytestostr)sstruct)psCharStrings)	unionRectintRectsafeEval)TTFont)OTTableWriter)OTTableReader)otTables)BytesION   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                   N    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S )
CFFFontSeta  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 )ag  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     9lib/python3.11/site-packages/fontTools/cffLib/__init__.py	<genexpr>z'CFFFontSet.decompile.<locals>.<genexpr>[   s(      FFaqFFFFFF    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.decompile@   s    $+	.$))A,,555 !'QQa>
jN""
9dj!"# # # # *


 4


J!O6	 -TYYq\\22154<99T\FF5f+E+E+EFFFFF4>#D8884 &&4<<mD$))A,,77:499T\L4>+#
T-f> > >44<%d6:::$"l$"&"2$r%   c                 *    t          | j                  S r   )lenr6   r?   s    r#   __len__zCFFFontSet.__len__k   s    	T^		r%   c                 *    t          | j                  S r   )r4   r6   rF   s    r#   keyszCFFFontSet.keysn   s    	dn		r%   c                     | j         S r   )r8   rF   s    r#   valueszCFFFontSet.valuesq   s    		r%   c                 $   t          |d          r|                                }n_t          |t                    r;|}	 | j                            |          }n,# t          $ r t          |          w xY wt          |          | j	        |         S )zp Return TopDict instance identified by name (str) or index (int
		or any object that implements `__index__`).
			__index__)
hasattrrM   
isinstancestrr6   indexr/   KeyError	TypeErrorr8   )r?   nameOrIndexrQ   names       r#   __getitem__zCFFFontSet.__getitem__t   s     [+&& 	   ""55+s##  
4 N  &&EE
      
;

  
;				5	!!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 )at  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/   recalcBBoxesr8   recalcFontBBoxr9   	CFFWritergetCompilerr3   addr   packr,   getDataLengthr;   r0   r1   r5   r6   appendr>   rN   rZ   r<   getChildrentoFile)r?   r@   r*   r'   rA   topDictr:   writertopCompilerr6   rU   rZ   childrenchilds                 r#   compilezCFFFontSet.compile   s    $+ 'QQa>
jN""
9dj!"# # # # *


 4


J!O6  #  w	 777V&!--gtF-KK+ 
.4<	::gl?D11222!//114	::fk$ 01122224<4<	::gl?D11222	::fk#t|,,---	 Cww9~  tT	::i##GT&#AABBB**[	 %	::g!!##$$$**T))'4)GGHHH"  g
'9
%
% )@""$$GGO$$W--(  e	::e--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rU   r>   N)
	simpletagr.   newlinern   r6   begintagr   toXMLendtagr>   )r?   	xmlWriterfontNamefonts       r#   rt   zCFFFontSet.toXML   s_    gTZ000gTZ000.  hieHoo666
x.4::iI]######=!!!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|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   rn   r   ro   r1   rY   r3   r>   r6   rU   )r>   Nr   rX   r)   )r>   rB   VarStorePrivaterm   )r*   rN   r.   rn   r1   r3   r=   r>   r6   r7   r8   rb   TopDictrZ   r<   rO   rP   fromXMLFDArrayvstorerz   r{   r	   T2CharStringint)r?   rU   attrscontentr*   rw   re   rB   elementfdArrayfontDictsubrCharStringClasssubrs                r#   r}   zCFFFontSet.fromXML   sl   $+ 
w		 4:	w		 4:	Y
jAoo4## T\4## T\4'' +(**T4%% (T^%TV}HN(###$"2333GGOO
a4## T\4'' +(**T4%% #!lT^1!(* * *G %T+<dCCDG$$$ * *w'3 "D%OOD%))))gz"" 1wq'9'@'HoG 1 1)$$ 1 ' 0h	1 1'H'H1 1 }&3
$
&
& *'))D " "w'3 "D%  DLLug&&&D!!!!" " wE'N##4:::wE'N##4::: r%   c                    d| _         | j        j        }t          d|d          }| j        j        |_        || _        |d         }t          |d          r|j        }nd}t          t                    }||_
        ||_        t          D ]?}|d         }||vr1||j        v r|j        |= t          ||          rt          ||           @t          |d          st                      x}	|_        d|	_        |j        |	_        |	|j        _        |j        }
|
j        r|	|
j        _        n|	|
_        t/                      }|                    d           |	                    |           ||_        t          t4                    }t6          D ]?}|d         }||vr1||j        v r|j        |= t          ||          rt          ||           @n|j        }	t          t4                    }|	D ]}|                    d           |j                                        D ]3}||j
        vr(|j        |= t          ||          rt          ||           4|j        }t6          D ]?}|d         }||vr1||j        v r|j        |= t          ||          rt          ||           @t;                      }|                     ||d           |                    d           |                      ||d           dS )	zConverts this object from CFF format to CFF2 format. This conversion
		is done 'in-place'. The conversion cannot be reversed.

		This assumes a decompiled CFF table. (i.e. that the object has been
		filled via :meth:`decompile`.)r   Nr   r{   r   r~   Tr&   )!r.   r*   r<   r7   r8   itemsrN   r{   
buildOrdertopDictOperators2orderrB   topDictOperatorsrawDictdelattrFDArrayIndexr~   r:   r>   r   CharStringscharStringsAreIndexedcharStringsIndexFontDictsetCFF2rb   privateDictOperators2privateDictOperatorsrI   r   rj   r2   rC   )r?   r*   rB   topDictDatare   privateDictopOrderentrykeyr   charStringsr   privateOpOrderr@   s                 r#   convertCFFToCFF2zCFFFontSet.convertCFFToCFF2$  sA    $*k/T#4d;;+'-+!$N'Wi   ;;;())''-/'  e	q3	
go		w Wc	)	$	$ ,!+~~-7W_7? ,7!(7$;' "+2K ((!Kjj8D
>>(!8455>$    u
(C
.  {"""

c
"S!!  k3  _7455> ! !xT$$&&  8>!!

3
	3		 x"K% ! !8S>!!	#	#	#s#	c	"	" !{C   ! 
$,,tVD,)))))A,,,..vd.+++++r%   r   )__name__
__module____qualname____doc__rC   rG   rI   rK   rV   rj   rt   r}   r    r%   r#   r   r   *   s         *)3 )3 )3 )3V      " " " = = = =~  :B$ B$ B$ B$HN, N, N, N, N,r%   r   c                   $    e Zd ZdZd Zd Zd ZdS )r]   zUHelper 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__x  s    $)$+++r%   c                 :    | j                             |           d S r   )r   rb   )r?   tables     r#   r_   zCFFWriter.add|  s    )5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   ra   setPosz#CFFWriter.toFile() writing to file.r(   r   rd   )logDEBUGr   rN   ra   rO   TopDictIndexCompilerr'   r;   rE   r   rb   tellr0   r`   calcOffSizer1   rd   write)	r?   r@   lastPosListcountposposListitemendPosbegins	            r#   rd   zCFFWriter.toFile  s   +
%7754e<<<195	
3U7y 
 
tt_%% D&&(((V4-.. .4; .++--dCIIoVtX 	[[f
CNN3	;%& ''%6777
))++%	[ 1+dD$45549Q<<k"o..4<+c4<0049Q<C'i ' 'ddH KKJJt
>>$))++%&&&&	K						r%   N)r   r   r   r   r   r_   rd   r   r%   r#   r]   r]   u  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   rY   r   )largestOffsetr1   s     r#   r   r     sB    E''g''i'''r%   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'   )rN   r'   getItemsr   parent)r?   r   r:   r   r'   s        r#   r   zIndexCompiler.__init__  sO    ^11^M6



$+}}UG,,$*$+++r%   c                     |S r   r   r?   r   r:   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   ra   )r   rN   ra   rE   rb   )r?   r   offsetsr   s       r#   
getOffsetszIndexCompiler.getOffsets  s    	Z 
	
3U7z  tt_%% ##%%%SST?SNN3 7	.r%   c                     | j         rd}nd}| j        rP|                                 d         }t          |          }|dz   t	          | j                  dz   |z  z   |z   dz
  }n|}|S )NrY   r   r   r   )r'   r   r   r   rE   )r?   	countSize
lastOffsetr1   
dataLengths        r#   ra   zIndexCompiler.getDataLength  s    	[ 999	Z !!"%:$$7__qG#$   : :	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   >lrd   latin1encoding)r   r'   writeCard32rE   r   writeCard16r   
writeCard8r0   r`   r   rN   rd   r   )	r?   r@   r   r1   r`   offset	binOffsetr   r   s	            r#   rd   zIndexCompiler.toFile  sQ   OO'	[ &tS__%%%%tS__%%%	Z %%7dGX7
+4  vT6""788,Iy>>gX%%%%JJyz  ttX 	[[D8,,,T	ZZ  r%   r   )	r   r   r   r   r   r   r   ra   rd   r   r%   r#   r   r     sn                  *    r%   r   c                       e Zd Zd ZdS )IndexedStringsCompilerc                     |j         S r   r:   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   rb   r^   r?   r   r:   outr   s        r#   r   zTopDictIndexCompiler.getItems  @    
# / /d::dw--....	*r%   c                 n    g }| j         D ]*}|                    |                    |                     +|S r   r   extendrc   )r?   r:   rh   re   s       r#   rc   z TopDictIndexCompiler.getChildren  s@    ( 1 1g??7&&w//0000	/r%   c                     | j         r#d| j        d                                         g}|S t          t          |                                           S Nr   )r'   r   ra   superr   r   )r?   r   	__class__s     r#   r   zTopDictIndexCompiler.getOffsets  sK    	[ 9A,,../7
>
$d
+
+
6
6
8
88r%   c                     | j         r!| j        d                                         }|S t          t          |                                           S r   )r'   r   ra   r   r   )r?   r   r   s     r#   ra   z"TopDictIndexCompiler.getDataLength  sG    	[ <
1++--:

$d
+
+
9
9
;
;;r%   c                     | j         r"| j        d                             |           d S t          t          |                               |           d S r   )r'   r   rd   r   r   )r?   r@   r   s     r#   rd   zTopDictIndexCompiler.toFile   sR    	[ 2:a=	t$$++D11111r%   )
r   r   r   r   r   rc   r   ra   rd   __classcell__r   s   @r#   r   r     s        66    9 9 9 9 9< < < < <2 2 2 2 2 2 2 2 2r%   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?   r:   rh   r   s       r#   rc   z FDArrayIndexCompiler.getChildren2  s@    (* 2 2h??8''001111	/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   rd   )r   r'   r   rE   r   r   r   r   r0   r`   r   rN   rd   )r?   r@   r   r1   r`   r   r   r   s           r#   rd   zFDArrayIndexCompiler.toFile8  s+   OO'	[ &tS__%%%%tS__%%%$$'T7H'	$  ftD&!!'((+9
i..WH
$
$
$
$::ij  ddH KKJJt	 r%   c                 $    || j         j        d<   d S )Nr~   r   r   r?   r   r   s      r#   r   zFDArrayIndexCompiler.setPosL      #&$+i   r%   N)r   r   r   r   r   rc   rd   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   rj   r'   rb   bytecoder?   r   r:   r   css        r#   r   zGlobalSubrsCompiler.getItemsT  F    
#  b::dk::bk	*r%   N)r   r   r   r   r   r   r%   r#   r   r   P  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.setPos`  s%     &!'$+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.getItemsh  r   r%   c                 $    || j         j        d<   d S Nr   r   r   s      r#   r   zCharStringsCompiler.setPoso  s    '*$+m$$$r%   N)r   r   r   r   r   r   r   r%   r#   r  r  e  s<           + + + + +r%   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 )r5   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                    |d u |d u k    sJ g | _         | 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              g x| _        }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: %srY   zoffSize too large: %s    r   >Lr       end of %s at %s)r   r   r   _isCFF2r   r   r   r@   
readCard32
readCard16	readCard8r   ranger-   r0   r+   rb   r   
offsetBaser2   )r?   r@   r'   rU   r   r1   r   padrQ   chunkr   s              r#   r   zIndex.__init__z  s   
D.ddl	+	+	+	+$*		 $	\	6$,''%#T499;;777$) d55d5
aZZ	6v~$*dOO'''%2E7CCC	A.8$,W#UQY  e99W5;5]4''76
>>#f++IIKK!O$/))DOgbk)***''%&diikk:::::r%   c                 *    t          | j                  S r   )rE   r   rF   s    r#   rG   zIndex.__len__  s    	TZr%   c                 ^   | j         |         }||S | j        |         | j        z   }| j        |dz            | j        |         z
  }| j        }|                    |           |                    |          }t          |          |k    sJ |                     ||||          }|| j         |<   |S Nr   )r   r   r  r@   r2   r-   rE   produceItem)r?   rQ   r   r   sizer@   r   s          r#   rV   zIndex.__getitem__  s    	E	$	
;<0&	eai	 4<#6	6$	$))F	4$	Td							%tV	4	4$$*U	+r%   c                     || j         |<   d S r   r   )r?   rQ   r   s      r#   __setitem__zIndex.__setitem__  s    $*Ur%   c                     |S r   r   )r?   rQ   r   r@   r   s        r#   r  zIndex.produceItem  s    	+r%   c                 :    | j                             |           dS )zAdd an item to an INDEX.N)r   rb   )r?   r   s     r#   rb   zIndex.append  s    *Dr%   c                 4    |                      | |||          S Nr&   compilerClassr?   r:   r   r'   s       r#   r^   zIndex.getCompiler      			D'6&		A	AAr%   c                     | j         dd= dS )zEmpty the INDEX.Nr  rF   s    r#   clearzIndex.clear  s    
jmmmr%   NNr   )r   r   r   r   r   r%  r   rG   rV   r  r  rb   r^   r)  r   r%   r#   r5   r5   s  s          ; ; ; ;<          B B B B    r%   r5   c                   `     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=   a  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__  sb    $((f(=== $$, 4= 4<<< 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.  rN   r   r/  r{   	subrClassr-  )r?   rQ   r   r@   r   r.  fdIndexs          r#   r  zGlobalSubrsIndex.produceItem  s    	\\77tY DL$<dJ DM$=mE"GGG\'"*777	g4;K	L	LLr%   c                    |                     d           |                                 t          t          |                     D ]}| |         }|                                r|                    d|d           n|                    d|           |                                 |                    |           |                    d           |                                 dS )zWrite 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   )rQ   rawrQ   N)commentrr   r  rE   needsDecompilationrs   rt   ru   )r?   rv   ir   s       r#   rt   zGlobalSubrsIndex.toXML  s      ! ! ! T 	 	a
q'4
 .|1!4444|1---::iL!!!	 	r%   c                     |dk    rd S |                                  }|                    |||           |                     |           d S )Nr5  )r2  r}   rb   )r?   rU   r   r   r   s        r#   r}   zGlobalSubrsIndex.fromXML  sO    	\	6			$,,tUG$$$++dr%   c                 T    d }t          | d          r| j        |         }| |         |fS )Nr/  )rN   r/  )r?   rQ   sels      r#   getItemAndSelectorz#GlobalSubrsIndex.getItemAndSelector  s4    #T: 	u	3	ec	r%   NNNNNN)r   r   r   r   r   r%  r	   r   r2  charStringClassr   r  rt   r}   r>  r   r   s   @r#   r=   r=     s         B %' -9='+     M M M  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#   rB  rB    s        ! ! r%   rB  c                   8     e Zd ZdZeZ	 	 d fd	Zd Zd Z xZ	S )r7   aS  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                 8   |d u |d u k    sJ || _         ||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&   )rB   r  r   r   r   r   r   r   r@   r   r  r2   r   r7   r   )r?   r@   rB   topSizer'   rU   r   r   s          r#   r   zTopDictIndex.__init__7  s   
D.ddl	+	+	+	+,$	&4<4:
.
!4775$dDIIKK8884954:g,4<YY[[4?99T_w&'''775'tyy{{;;;;;t%%d6%:::::r%   c                     t          | j        ||| j        | j        | j                  }|                    |           |S r#  )r|   r:   r>   rB   r  rC   )r?   rQ   r   r@   r   tops         r#   r  zTopDictIndex.produceItemK  sG    <vt/$,	0 	0 	0# --	*r%   c                 "   t          t          |                     D ]q}|                    d|           |                                 | |                             |           |                    d           |                                 rd S Nr   r7  r  rE   rs   rr   rt   ru   r?   rv   r:  s      r#   rt   zTopDictIndex.toXMLR      T  aj***7==J r%   )NNr   N)
r   r   r   r   r   r%  r   r  rt   r   r   s   @r#   r7   r7   '  sr          &?@
; ; ; ; ; ;(        r%   r7   c                   $    e Zd ZeZd Zd Zd ZdS )r   c                 "   t          t          |                     D ]q}|                    d|           |                                 | |                             |           |                    d           |                                 rd S rI  rJ  rK  s      r#   rt   zFDArrayIndex.toXML_  rL  r%   c                     t          | j        ||| j        | j        | j                  }|                    |           |S N)r'   r   )r   r:   r>   r  r   rC   )r?   rQ   r   r@   r   r   s         r#   r  zFDArrayIndex.produceItemg  sH    <vt/
+  ( T	/r%   c                     |dk    rd S t                      }|D ]5}t          |t                    r|\  }}}|                    |||           6|                     |           d S )Nr   )r   rO   rP   r}   rb   )r?   rU   r   r   r   r   s         r#   r}   zFDArrayIndex.fromXMLn  s~    	Z	6ZZ( * *g# !4D%))))++hr%   N)r   r   r   r   r%  rt   r  r}   r   r%   r#   r   r   [  sF        %    	 	 	 	 	r%   r   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   rx   )r?   r@   rU  s      r#   r   zVarStoreData.__init__|  s&    $)$)$/hh$)))r%   c                 X   | j         r G d dt                    } |di           }t          | j                   }| j                             |          | _        i }t          | j        |          }t          j                    | _        | j        	                    || j
                   | S )Nc                       e Zd Zd ZdS )+VarStoreData.decompile.<locals>.GlobalStatec                 "    || _         || _        d S r   	tableTypecachingStats)r?   r[  r\  s      r#   r   z4VarStoreData.decompile.<locals>.GlobalState.__init__  s    T^%Tr%   N)r   r   r   r   r   r%   r#   GlobalStaterX    s#        & & & & &r%   r]  rz   rZ  )r@   objectr  r-   r   r   otrz   rU  rC   rx   )r?   r]  globalStatelengthreaders        r#   rC   zVarStoreData.decompile  s    	Y 0& & & & &V & & & zCCC;ty!!6y~~f%%49;$)[116[]]4??VTY///	+r%   c                     t                      }| j                            || j                   |                                | _        d S r   )r   rU  rj   rx   
getAllDatar   )r?   rf   s     r#   rj   zVarStoreData.compile  s>    ??&/&$),,, !!$)))r%   c                 F    | j                             || j                   d S r   )rU  rt   rx   )r?   rv   rU   s      r#   writeXMLzVarStoreData.writeXML  s"    /	49-----r%   c                     t          j                    | _        |D ]@}t          |t                    r)|\  }}}| j                            |||| j                   @Ad S r   )r_  rz   rU  rO   tupler}   rx   )r?   rU   r   r   r   r   s         r#   xmlReadzVarStoreData.xmlRead  se    KMM$/ 	 	g%   	"D%OD%$)<<<<	r%   c                 *    t          | j                  S r   rE   r   rF   s    r#   rG   zVarStoreData.__len__      	TYr%   c                 8    | j         j        |         }|j        }|S r   )rU  VarDataVarRegionCount)r?   vsIndexvarData
numRegionss       r#   getNumRegionszVarStoreData.getNumRegions  s    O#G,'%*	r%   r*  )
r   r   r   r   rC   rj   rf  ri  rG   rs  r   r%   r#   rS  rS  z  s              " " ". . .        r%   rS  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   rY   Fzunsupported FDSelect format: %s)	r  formatrw  r-   tolistgidArrayr  r  r  )r?   r@   	numGlyphsrx  rw  rz  nRangesfdprevr:  firstglyphIDs               r#   r   zFDSelect.__init__  s7   	 .44;
kQE#tyy3344;;==DMMMqv	!HG	BD7^^  U4''  'xT
D//RRU$&&  hwDMMMqv	!HG	BD7^^  U4''  'xT
T

RRU$&&  hwDMMM<3f<<<< 4;4===r%   c                 *    t          | j                  S r   )rE   rz  rF   s    r#   rG   zFDSelect.__len__  s    	T]		r%   c                     | j         |         S r   rz  r?   rQ   s     r#   rV   zFDSelect.__getitem__  s    	u	r%   c                     || j         |<   d S r   r  )r?   rQ   fdSelectValues      r#   r  zFDSelect.__setitem__  s    &$-r%   c                 :    | j                             |           d S r   )rz  rb   )r?   r  s     r#   rb   zFDSelect.append  s    -}%%%%%r%   )NNN)r   r   r   r   rG   rV   r  rb   r   r%   r#   ru  ru    se        / / / /b    ' ' '& & & & &r%   ru  c                   V    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-  rB  r   r   r  rE   r   r.  r/  r   )
r?   r@   rZ   r-  r.  r/  r   r'   r   r:  s
             r#   r   zCharStrings.__init__  s     $	%+w'&B B B4$&&4k#g,,    qK
 !"44 !44<DMDLLL r%   c                 N    t          | j                                                  S r   )r4   r   rI   rF   s    r#   rI   zCharStrings.keys  s    	d##%%	&	&&r%   c                 j    | j         r| j        S t          | j                                                  S r   )r   r   r4   r   rK   rF   s    r#   rK   zCharStrings.values  s3    	 *


t&&((
)
))r%   c                     || j         v S r   )r   )r?   rU   s     r#   has_keyzCharStrings.has_key  s    	!	!!r%   c                 *    t          | j                  S r   )rE   r   rF   s    r#   rG   zCharStrings.__len__#  s    	T		r%   c                 H    | j         |         }| j        r| j        |         }|S r   )r   r   r   )r?   rU   
charStrings      r#   rV   zCharStrings.__getitem__&  s-    %*	 2%j1:	r%   c                 Z    | j         r| j        |         }|| j        |<   d S || j        |<   d S r   )r   r   r   )r?   rU   r  rQ   s       r#   r  zCharStrings.__setitem__,  s@    	 'D!5",4&4D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   r>  rN   fdSelectIndex)r?   rU   rQ   r=  s       r#   r>  zCharStrings.getItemAndSelector3  s    	 &D!5


2
25
9
99dI tZ   D!/SSSS
C

4
 #
%%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)r6  r   r5  rU   r  )sortedrI   r>  r9  rs   rr   rt   ru   )r?   rv   namesrU   charStrr  r6  s          r#   rt   zCharStrings.toXMLA  s   


%  d 33D997M  "" ,CC
C|vtn%5%;<<<<tn67#=? ? ? 
==L!!! 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 )Nr5  r   r   r  r   rU   r1  )rO   rP   rN   r   rR   r   r{   r.  r	   r   r-  r}   r  )
r?   rU   r   r   r   fdIDr.  	glyphNamer@  r  s
             r#   r}   zCharStrings.fromXMLT  s       g# !4
l
4dI U?+,,TT   TTTl4 (GGlGV}9"/?!# # #: dE7+++
aii#J4	??1   s   AA A r   )r   r   r   r   r   rI   rK   r  __contains__rG   rV   r  r>  rt   r}   r   r%   r#   r   r     s              ,' ' '* * *" " "     ' ' '& & &  &         r%   r   c                 F    t          |                     d                    S r  )r   r-   )r@   s    r#   r  r  p  s    		!r%   c                 Z    t          j        d|                     d                    \  }|S )Nr(   r   r0   r+   r-   r@   rm   s     r#   r  r  t  $    
-diill
+
+r%   c                 Z    t          j        d|                     d                    \  }|S )Nr  rY   r  r  s     r#   r  r  y  r  r%   c                 J    |                      t          |                     d S r   )r   r   r  s     r#   r   r   ~  s     GENNr%   c                 V    |                      t          j        d|                     d S Nr(   r   r0   r`   r  s     r#   r   r     &    FKe$$%%%%%r%   c                 V    |                      t          j        d|                     d S Nr  r  r  s     r#   r   r     r  r%   c                      t          |           S r   )r   rl   s    r#   	packCard8r    s    r%   c                 ,    t          j        d|           S r  r0   r`   rl   s    r#   
packCard16r        D%   r%   c                 ,    t          j        d|           S r  r  rl   s    r#   
packCard32r    r  r%   c                 .    i }| D ]\  }}}}}||f||<   |S r   r   r   doprU   argdefaultconvs          r#   buildOperatorDictr    s5    %*  !RsGT+!B%%	r%   c                     i }| D ]_\  }}}}}t          |t                    r,t          |d                   t          |d                   z   }nt          |          }||f||<   `|S Nr   r   )rO   rh  r   r  s          r#   buildOpcodeDictr    sr    %*  !RsGTE 1A'222I!D''	r%   c                 J    g }| D ]\  }}}}}|                     |           |S r   )rb   )r   lr  rU   r  r  r  s          r#   r   r     s7    %*  !RsGT((4....	r%   c                 .    i }| D ]\  }}}}}||||<   |S r   r   r  s          r#   buildDefaultsr    s6    %*  !RsGT1T7	r%   c                 *    i }| D ]\  }}}}}|||<   |S r   r   r  s          r#   buildConvertersr    s1    %*  !RsGT!D''	r%   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@   )rN   _readr@   r   r2   )r?   r   rm   r@   r   s        r#   r-   zSimpleConverter.read  sw    		 	  $
**VU
#
##	$		#
**VU
#
#99S>>>>499S>>>>s   A. .Bc                     |S r   r   r?   r   rm   s      r#   r  zSimpleConverter._read  r   r%   c                     |S r   r   r  s      r#   r   zSimpleConverter.write  r   r%   c                 \    |                     ||           |                                 d S )Nrl   )rq   rr   r?   rv   rU   rm   s       r#   xmlWritezSimpleConverter.xmlWrite  s3    d%(((r%   c                     |d         S Nrm   r   r?   rU   r   r   r   s        r#   ri  zSimpleConverter.xmlRead  s    	wr%   N)r   r   r   r-   r  r   r  ri  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    		)	)	))r%   c                 z    |                     |t          |d                     |                                 d S )Nr  r   rl   rq   r   rr   r  s       r#   r  zASCIIConverter.xmlWrite  s@    d%"@"@"@AAAr%   c                 0    t          |d         d          S )Nrm   r  r   r  r  s        r#   ri  zASCIIConverter.xmlRead  s    	w7	4	4	44r%   Nr   r   r   r  r   r  ri  r   r%   r#   r  r    sP        ( ( (* * *  5 5 5 5 5r%   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    		*	*	**r%   c                     t          |d          }|dv rt          j        dd|          }|                    ||           |                                 d S )Nr   r   )Notice	Copyrightz	[\r\n]\s+ rl   )r   resubrq   rr   r  s       r#   r  zLatin1Converter.xmlWrite  sd    

)
)
)%	$$$6,U++5d%(((r%   c                 0    t          |d         d          S )Nrm   r   r   r  r  s        r#   ri  zLatin1Converter.xmlRead  s    	w8	5	5	55r%   Nr  r   r%   r#   r  r    sP        ) ) )+ + +  6 6 6 6 6r%   r  c                 T    	 t          |           }n#  t          |           }Y nxY w|S r   )r   float)r"   rm   s     r#   parseNumr    s1    
a&&%%
((%%%s    %c                     g }| D ]Y}t          |t                    r|\  }}}|d                                         }d |D             }|                    |           Zt	          |          dk    r|d         }|S )Nrm   c                 ,    g | ]}t          |          S r   )evalr!   vals     r#   
<listcomp>z"parseBlendList.<locals>.<listcomp>
  s    ...StCyy...r%   r   r   )rO   rP   splitrb   rE   )r"   	valueListr   rU   r   r   	blendLists          r#   parseBlendListr    s      W  $wGn""$$)..I...)9	NNal)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   rP   r  s     r#   r  z,NumberConverter.xmlWrite.<locals>.<listcomp>  s    444s#c((444r%   rl   
rO   r4   rs   rr   indentjoinrq   kBlendDictOpNamededentru   )r?   rv   rU   rm   
blendValues        r#   r  zNumberConverter.xmlWrite  s   t d44e44455:'z:::Dt5)))r%   c                     |                     dd           }|t          |          }nt          |d                   }|S r  )getr  r  )r?   rU   r   r   r   valueStringrm   s          r#   ri  zNumberConverter.xmlRead!  s@    		'4((+'""55E'N##5	,r%   Nr   r   r   r  ri  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>1  s    9993s88999r%   rl   c                 ,    g | ]}t          |          S r   r  r  s     r#   r  z+ArrayConverter.xmlWrite.<locals>.<listcomp>8  s    ///#SXX///r%   r  )r?   rv   rU   rm   r  r  s         r#   r  zArrayConverter.xmlWrite+  sD   
 z%(D)) d  y99y999::J(
;;;D88/////005t5)))r%   c                     |                     dd           }|t          |          }n |                                }d |D             }|S )Nrm   c                 ,    g | ]}t          |          S r   )r  )r!   rm   s     r#   r  z*ArrayConverter.xmlRead.<locals>.<listcomp>B  s    444E444r%   )r  r  r  )r?   rU   r   r   r   r   r  rK   s           r#   ri  zArrayConverter.xmlRead<  sT    		'4((+g&&99644V4449	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   )rs   rr   rt   ru   r  s       r#   r  zTableConverter.xmlWriteH  sf    T++i4r%   c                      |                                              }|D ]5}t          |t                    r|\  }}}|                    |||           6|S r   )getClassrO   rP   r}   )r?   rU   r   r   r   obr   s          r#   ri  zTableConverter.xmlReadO  se    t}}" $ $g# !4::dE7####	)r%   Nr  r   r%   r#   r
  r
  F  s2              r%   r
  c                        e Zd Zd Zd Zd ZdS )PrivateDictConverterc                     t           S r   )PrivateDictrF   s    r#   r  zPrivateDictConverter.getClass[  s    	r%   c                 <   |\  }}|j         }|j        }	 |j        }n# t          $ r d }Y nw xY wt	          |j        ||||          }|                    |           |                    |          }	t          |	          |k    sJ |	                    |	           |S rP  )
r@   r  r   AttributeErrorr  r:   r2   r-   rE   rC   )
r?   r   rm   r  r   r@   r'   r   privr   s
             r#   r  zPrivateDictConverter._read^  s    ,$	$>&M66	   666		>4v
? 
? 
?$))F	4$	Td				..	+s    ,,c                     dS )N)r   r   r   r  s      r#   r   zPrivateDictConverter.writen  s    	r%   Nr   r   r   r  r  r   r   r%   r#   r  r  Y  sA                 r%   r  c                        e Zd Zd Zd Zd ZdS )SubrsConverterc                     t           S r   )rB  rF   s    r#   r  zSubrsConverter.getClasst  s    	r%   c                 z    |j         }|j        }|                    |j        |z              t	          ||          S r#  )r@   r  r2   r   rB  )r?   r   rm   r@   r'   s        r#   r  zSubrsConverter._readw  s<    	$>&))FME!"""	D	(	(	((r%   c                     dS r   r   r  s      r#   r   zSubrsConverter.write}      	
r%   Nr  r   r%   r#   r  r  r  sA          ) ) )    r%   r  c                        e Zd Zd Zd Zd ZdS )CharStringsConverterc           	         |j         }|j        }|j        }|j        }t	          |d          r$|j        }t	          |d          r|j        }nd }d }	nd\  }}|j        }	|                    |           t          ||||	|||          }
|
S )Nr~   ru  r*  r&   )
r@   r  rZ   r>   rN   r~   ru  r{   r2   r   )r?   r   rm   r@   r'   rZ   r-  r   r/  r.  r   s              r#   r  zCharStringsConverter._read  s    	$>&N'"+VY 	^7fj!! HHH77!8W^7))E+w'&J J J+	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        |||          }|                    |||           |S )Nr~   ru  )rN   r~   ru  r{   r   r>   r}   )	r?   rU   r   r   r   r   r/  r.  r   s	            r#   ri  zCharStringsConverter.xmlRead  s    VY ; ^7fj!! HHH77
 !'dgH7v!7Hg? ?+dE7+++	r%   Nr   r   r   r  r   ri  r   r%   r#   r  r    sA          (      r%   r  c                   &    e Zd Zd Zd Zd Zd ZdS )CharsetConverterc                    t          |d          }|dk    rg|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 ]x}
|
|v rX||
         }|
dz   t          |          z   |v r|dz  }|
dz   t          |          z   |v |dz   ||
<   |
dz   t          |          z   }
d||
<   |	                    |
           y|	}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   )rN   r{  r@   r2   r   r   r  parseCharset0r:   parseCharsetNotImplementedErrorrE   r   rP   rb   r   cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r?   r   rm   isCIDr{  r@   rx  rZ   allNames
newCharsetr  ns               r#   r  zCharsetConverter._read  s%   
&%
 
 %
QYY9
+499U775)5111dOO6kkItV^UCCGG!v{{9dFNE6JJGG

g,,)
#
#
#
#775)499;;7778: 	! 	!yH	)	QOc!ff$111fa Oc!ff$11q5XiS3q66)YHYi    77 
%}FN22 A::::GG

 GG

GG

$G (#g,,&"222&f&&'7	.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)r8  rr   r  s       r#   r  zCharsetConverter.xmlWrite  s1     NOOOr%   c                     d S r   r   r  s        r#   ri  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'  )rN   dictObjpackCharset0packCharsetrE   r   r   )r?   r:   rZ   r   r/  data0r   s          r#   r   zCharsetCompiler.__init__  s|    	y	 	 	 	 
&.%
(
(%
ww
/
/%	WeW	-	-$YYU49949$+++r%   c                 $    || j         j        d<   d S )NrZ   r   r   s      r#   r   zCharsetCompiler.setPos  r   r%   c                 *    t          | j                  S r   rk  rF   s    r#   ra   zCharsetCompiler.getDataLength  rl  r%   c                 :    |                     | j                   d S r   r   r   r?   r@   s     r#   rd   zCharsetCompiler.toFile      **TYr%   Nr   r   r   r   r   ra   rd   r   r%   r#   r8  r8    sP        	 	 	' ' '      r%   r8  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.  rE   r  )rZ   predefinedCharSetValpredefinedCharSetslcscntpcscsvr:  s           r#   getStdCharSetrP    s    -q1*A.5q9; 7||( 	
 	
]S#s%53YY:: 
 
aajCF	E  	r%   c                 0    t          | dd                    S )Nr   )r   rU   r:   s     r#   getCIDfromNamerS    s    DHr%   c                 ,    |                     |           S r   )getSIDrR  s     r#   getSIDfromNamerV    s    tr%   c           	          d}t          |          g}|rt          }nt          }| dd          D ].}|                    t	           |||                               /t          |          S r  )r  rS  rV  rb   r  r   )rZ   r/  r:   fmtr   	getNameIDrU   s          r#   r<  r<     su    	3	 )))QRR[ 4 4T++j411223333$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   )rS  rV  rb   r  r  r   )rZ   r/  r:   rX  rangesr  endrY  rU   SIDnLeftr   	nLeftFuncs                r#   r=  r=  -  sG   
		 )))QRR[ 
 
T	$  #
]55
Qw#~~;5ckk
C	==%   5##  
+%
S[[	
3--	31HH))) 4 4\UE++j))E"2"223333$r%   c                 H   dg}|r]t          | dz
            D ]I}t          |          }|                    dt          |                              d          z              Jn?t          | dz
            D ],}t          |          }|                    ||                    -|S Nr:  r   cidrX   )r  r  rb   rP   zfill)r{  r@   r:   r/  rZ   r:  CIDr^  s           r#   r)  r)  R  s    ;	  Q - -a	D		3
>>%#c((..+++,,,,- Q    a	D		3
>>'#,r%   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 rb  )r  r  r  rb   rP   rd  )r{  r@   r:   r/  rX  rZ   r   r`  r  r_  re  r^  s               r#   r*  r*  _  s   ;	
1HH)))y
T

%
)D//%
 !E55=1,-- . .sNN53s88>>!,,,----. E55=1,-- ! !sNN73<    
%-!
% y 	r%   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   )
rO   rP   packEncoding0r;  rZ   r:   packEncoding1rE   r   r   )r?   r:   r   r   r>  data1s         r#   r   zEncodingCompiler.__init__u  sz    #&&&&&
.&.
I
I%
.&.
I
I%ZZ#e**49949$+++r%   c                 $    || j         j        d<   d S )NEncodingr   r   s      r#   r   zEncodingCompiler.setPos      $'$+j!!!r%   c                 *    t          | j                  S r   rk  rF   s    r#   ra   zEncodingCompiler.getDataLength  rl  r%   c                 :    |                     | j                   d S r   rB  rC  s     r#   rd   zEncodingCompiler.toFile  rD  r%   NrE  r   r%   r#   rh  rh  s  sP          ( ( (      r%   rh  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	          |          }|dz  }|rt          d          |dz  }|dk    rt          |j        |||j                  }n"|dk    rt          |j        |||j                  }|S )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s   z*Encoding supplements are not yet supported   )
r@   r2   r   r   r  r+  parseEncoding0rZ   r:   parseEncoding1)r?   r   rm   r@   rX  haveSupplementr   s          r#   r  zEncodingConverter._read  s    
aZZ

zz


!))))
+499U775*E222	43$J> L
J
K
KK	t3	QhhfndNn HHqfndNn H
?r%   c                 &    |dk    rdS |dk    rdS dS )Nru  r   rv  r   r   r  s      r#   r   zEncodingConverter.write  s)    
   
!   
!	
r%   c                    |dv r-|                     ||           |                                 d S |                    |           |                                 t          t	          |                    D ]I}||         }|dk    r9|                     dt          |          |           |                                 J|                    |           |                                 d S )N)ru  rv  rp   r:  map)coderU   )rq   rr   rs   r  rE   hexru   )r?   rv   rU   rm   r  r  s         r#   r  zEncodingConverter.xmlWrite  s    
444t%(((	6TCJJ  dT{99CIII>>>4r%   c                     d|v r|d         S dgdz  }|D ]@}t          |t                    r|\  }}}t          |d                   }|d         }|||<   A|S )NrU   r:  r   r  )rO   rP   r   )	r?   rU   r   r   r   r   r   r  r  s	            r#   ri  zEncodingConverter.xmlRead  s{    u__
-[3(  g# !4
5=
!
!4V}98D>>	/r%   Nr  r   r%   r#   rs  rs    sP          .        r%   rs  c                     t          |          }dgdz  }t          d|dz             D ]"}t          |          }|dk    r| |         ||<   #|S )Nr:  r   r   r   r  r  )rZ   r@   r{  r:   nCodesr   r  r  s           r#   ry  ry    s^    
D//K#a!$$ % %W	4$	QYYG$8D>r%   c                     t          |          }dgdz  }d}t          |          D ]N}t          |          }t          |          }	t          |||	z   dz             D ]}| |         ||<   |dz   }|dz   }O|S )Nr:  r   r   r  )
rZ   r@   r{  r:   r|  r   r  r:  r  r_  s
             r#   rz  rz    s    T??K#
..  Q	4$
D//%w%! 344  gG$8D>
(44aK''r%   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   r:  r   r   r  rE   r  rb   popr  r   )	rZ   r   r:   rX  mr  rU   codesr   s	            r#   rj  rj    s   3x==!!  T	$$	Y1T7	QRR[  T	
t$,,t r"))+++  r" 
33u::../  T	\
4++ioo$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   r:  r   r   r  )rZ   r   r:   rX  r  r  rU   r\  r  r]  r_  r   s               r#   rk  rk    s   3x==!!  T	$$	Y1T7
	QRR[  T	
tR$
]55
Qw$;5	==%   5##	uu~  &*Q-2%%**,,,  &*Q-2%% 
33v;;//0 3 3\UE
b[[5++i5!1!112222$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#  )	rz   r  r@   r  r2   r   r   r:   r>   )r?   r   rm   r   r@   r'   r   s          r#   r  zFDArrayConverter._read  s    O66	   666	$>&))Ef---''.N'/*'	.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   )r   rO   rP   r}   )r?   rU   r   r   r   r   r   s          r#   ri  zFDArrayConverter.xmlRead*  sY    NN' ) )g# !4
??4((((	.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@   r2   ru  r{  )r?   r   rm   r@   r/  s        r#   r  zFDSelectConverter._read6  s2    	$))EdF,--(	/r%   c                     dS r   r   r  s      r#   r   zFDSelectConverter.write<  r  r%   c                 j    |                     |d|j        fg           |                                 d S Nrx  )rq   rx  rr   r  s       r#   r  zFDSelectConverter.xmlWriteA  s:    dh56777r%   c                 Z    t          |d                   }d }d }t          |||          }|S r  )r   ru  )	r?   rU   r   r   r   rX  r@   r{  r/  s	            r#   ri  zFDSelectConverter.xmlReadE  s3    x!!#	$)dIs++(	/r%   Nr  r   r%   r#   r  r  4  sP            
      r%   r  c                   &    e Zd Zd Zd Zd Zd ZdS )VarStoreConverterc                     |j         }|                    |           t          |          }|                                 |S r   )r@   r2   rS  rC   )r?   r   rm   r@   varStores        r#   r  zVarStoreConverter._readO  s?    	$))E$(
	/r%   c                     dS r   r   r  s      r#   r   zVarStoreConverter.writeV  r  r%   c                 2    |                     ||           d S r   )rf  r  s       r#   r  zVarStoreConverter.xmlWriteY  s    ..D!!!!!r%   c                 R    t                      }|                    ||||           |S r   )rS  ri  )r?   rU   r   r   r   r  s         r#   ri  zVarStoreConverter.xmlRead\  s*    ^^(
4000	/r%   Nr  r   r%   r#   r  r  M  sP            " " "    r%   r  c                     d}t          |          g}| D ]$}|                    t          |                     %t          |          S r   )r  rb   r   )fdSelectArrayrX  r   rQ   s       r#   packFDSelect0r  b  sM    	3    U++i$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   )rE   r  rb   r  r  r   
r  rX  fdRangeslenArraylastFDIndexr:  r3  sentinelGIDr   fdRanges
             r#   packFDSelect3r  j  s   
//  Q!'G??Aw<   ;1u	3ZH&&''' % %W++j$$%%%++i
##$$$$Z$$%%%$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 )NrY   r   r   r   )rE   r  rb   r  r  r  r   r  s
             r#   packFDSelect4r    s   
//  Q!'G??Aw<   ;1u	3ZH&&''' & &W++j$$%%%++j$$%%%%Z$$%%%$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   rY   )rx  rz  r  r   r  r  rE   r   )r?   r/  r   rX  r  r>  data3s          r#   r   zFDSelectCompiler.__init__  s    ##-AXX]++499
axx]++499
axx]++499 ''5''5	%jj3u::DIHOODIHO$+++r%   c                 $    || j         j        d<   d S )Nru  r   r   s      r#   r   zFDSelectCompiler.setPos  ro  r%   c                 *    t          | j                  S r   rk  rF   s    r#   ra   zFDSelectCompiler.getDataLength  rl  r%   c                 :    |                     | j                   d S r   rB  rC  s     r#   rd   zFDSelectCompiler.toFile  rD  r%   NrE  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          t	          |j                            |j        g}t          |          | _        d S r   )r   r   rj   r  rE   r   )r?   varStoreDatar   r   s       r#   r   zVarStoreCompiler.__init__  s\    $+		 c,#$$%%
$ oo$)))r%   c                 $    || j         j        d<   d S )Nrz   r   r   s      r#   r   zVarStoreCompiler.setPos  ro  r%   c                 *    t          | j                  S r   rk  rF   s    r#   ra   zVarStoreCompiler.getDataLength  rl  r%   c                 :    |                     | j                   d S r   rB  rC  s     r#   rd   zVarStoreCompiler.toFile  rD  r%   NrE  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?   rv   rU   rm   registryr   
supplements          r#   r  zROSConverter.xmlWrite  sl     %(E:x!eEll:   r%   c                 J    |d         |d         t          |d                   fS r  r   r  s        r#   ri  zROSConverter.xmlRead  s%    


U7^XeL6I-J-J	KKr%   Nr  r   r%   r#   r  r    s7        	 	 	L L L L Lr%   r  )   maxstacknumberNN)      r'  )r^  r^  r  ))r     SyntheticBaser  NN)r   versionr^  NNr  r^  )r  r   r  )r   FullNamer^  NN))r  &   FontNamer^  NN)r   
FamilyNamer^  NN)rY   Weightr^  NN))r  r   isFixedPitchr  r   N))r  r   ItalicAngler  r   N))r  r   UnderlinePositionr  iN))r  rY   UnderlineThicknessr  2   N))r  rX   	PaintTyper  r   N))r     CharstringTyper  r   N)r     
FontMatrixrw  )MbP?r   r   r  r   r   )   UniqueIDr  NNrX   FontBBox)r   r   r   r   ))r     StrokeWidthr  r   N)   XUIDrw  NN))r     
PostScriptr^  NN))r     BaseFontNamer^  NN))r     BaseFontBlenddeltaNN))r     CIDFontVersionr  r   N))r      CIDFontRevisionr  r   N))r  !   CIDFontTyper  r   N))r  "   CIDCountr  i"  N   rZ   r  ))r  #   UIDBaser  NN   rn     r{   )r  r  )r  %   )r  $   r~         rz   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  rw  r  r^  r  )r  rE   r  r  r  )r   r:  r  rU   r  r  r  s          r#   addConvertersr  C  s    
E



 * *Q!&q"dC$	


44
h


44
e||


44
k
44<sGT)%((* *r%   c                   $    e Zd Z ee          ZdS )TopDictDecompilerN)r   r   r   r  r   	operatorsr   r%   r#   r  r  Y  s        /00r%   r  c                   $    e Zd Z ee          ZdS )PrivateDictDecompilerN)r   r   r   r  r   r  r   r%   r#   r  r  ]  s        344r%   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   )rO   r9   rN   r'   r;  r:   r   r   getattr
convertersr   defaultsr  r   )	r?   r;  r:   r   r'   r   rU   rm   r  s	            r#   r   zDictCompiler.__init__d  s     .
Wn
-
----^11^M6



$+$,$,$+'m  d7D$''5m

T
"4::gu%%5w##D))))74==$,,,r%   c                     d S r   r   r   s      r#   r   zDictCompiler.setPosz  r6  r%   c                 F    t          |                     d                    S )Nra   )rE   rj   rF   s    r#   ra   zDictCompiler.getDataLength}  s    	T\\/**	+	++r%   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   r;  r   r  opcodesrO   rh  rE   r  r  rb   r   )r?   reasonr   r   rU   rm   r  argTyper  r:  r  v
arghandlers                r#   rj   zDictCompiler.compile  sO   ''%)4>+BFKKKL'	$l   d;;t5md#;2w%   
#GAu::???:???1XX    1:S	qQ$--Z	[[A	  v/00JKK

5!!""";;r????	4$	+r%   c                 Z    |                      d          }|                    |           d S )Nrd   )rj   r   )r?   r@   r   s      r#   rd   zDictCompiler.toFile  s+    	h		$**T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     
,
,
,<
,
,
,r%   r   )rO   r4   rb   r.  r   blendOpr   )r?   numr   datums       r#   
arg_numberzDictCompiler.arg_number  sx    T 
,
,
,
,
,4;;|A;;ww   T??555	,r%   c                 Z    t          j        | j                            |                    S r   )r	   encodeIntCFFr:   rU  )r?   r"   s     r#   arg_SIDzDictCompiler.arg_SID  s#    		#DL$7$7$:$:	;	;;r%   c                 ~    g }|D ]*}|                     |                     |                     +t          |          S r   )rb   r2  r   )r?   rm   r   r0  s       r#   	arg_arrayzDictCompiler.arg_array  sC    	$ % %c;;ts##$$$$	4r%   c                 &   |sdS |d         }t          |t                    r|                     |          }nLg }d}|D ]}|                    ||z
             |}g }|D ]$}|                    t	          |                     %t          |          S )Nr%   r   )rO   r4   arg_delta_blendrb   r.  r   )r?   rm   val0r   r   lastr(  r0  s           r#   	arg_deltazDictCompiler.arg_delta  s    	 
#	q$d 
#


u
%
%44	3
4  qJJq4xDD
4 # #sKKS!!""""	4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 )a'  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   r-  r  s     r#   r  z0DictCompiler.arg_delta_blend.<locals>.<listcomp>	  s     	4	4	4,s

	4	4	4r%   )
rE   maxBlendStackr   minr9  r   rb   r.  r   r/  )r?   rm   
numMasters	numBlendsnumStacknumBlendValuesr   numValvalListout1	firstList	deltaListr:  prevValdefaultValuerelValueListr  s                    r#   r9  zDictCompiler.arg_delta_blend  s   : 58}}*%jj)*$)(""" +a/:=>>>	3U^,,F{{
AfHoG((DJJt&''NE  sY9v	!917	
Y
 8A;L')IaLG8ABB<IaLFA 
Y < # #y	""""	4	4|	4	4	43::l9%%&&&::gg	*r%   r   )r   r   r   r?  r   r   ra   rj   rd   r2  r5  r7  r<  r9  r   r%   r#   r  r  a  s           ,  , , ,  0    < < <    $D D D D Dr%   r  c                 |    t          | t                    rt          j        |           S t          j        |           S r   )rO   r  r	   encodeFloatr4  )r0  s    r#   r.  r.  	  s6    sE )		"3	'	''		#C	(	((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 )NrZ   r'  rn  rz   ru  r   r   r&   r~   r{   )r'   r;  rB   rN   rZ   rP  rb   r8  r   rn  rO   rP   rh  rz   r  ru  rE   r   r  r  r  r~   r^   r   rc   r{   )r?   r:   r'   rh   charsetCoder   r  varStoreCompr/  r   rU   fdSelectCompr   charStringsCompfdArrayIndexCompprivComps                   r#   rc   zTopDictCompiler.getChildren	  s   ;&(	\#+dlI&& +4<+? +t|U## 7[[ !566[___Wdl.BDIIJJJJ*T\)dlJ'' @DL,A @|$Hh$$ @__%gx>>???dlJ'' "<(L#L$77LOOL!!!T\:&& !
 l#8	(mmq,*K$ 6 6__[&45555"8T22<??<   T\=)) $5);|# $ $t	LLT"####(	7D) ) )????###T\9%% : l*66wEE??#$$$??#//88999T\9%% 2l"..w==8??8??8''00111	/r%   N)r   r   r   r  r   r%  rc   r   r%   r#   rP  rP  	  s3        ?+,,6 6 6 6 6r%   rP  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   rY  r   r;  r  setr  r   r   rb   r   r  r-   r  r   warningr  )
r?   r;  r:   r   r'   ignoredNamesrU   r  r  r   s
            r#   r   zFontDictCompiler.__init__O	  sK   $(('6&(QQQ ,L'S+,,s7=/A/AABB  d
go
  ""4((Gt$Tyy'**Wwd##w.. $;;@HHVL!!""#$ $ $ $ $$ $r%   c                     g }t          | j        d          r]| j        j                            ||           }|                    |           |                    |                    |                     |S Nr{   )rN   r;  r{   r^   rb   r   rc   )r?   r:   rh   rW  s       r#   rc   zFontDictCompiler.getChildreno	  sl    (T\9%% 2l"..w==8??8??8''00111	/r%   r   )	r   r   r   r  r   r%  r   rc   r   r   s   @r#   rY  rY  L	  s]        ?+,,$ $ $ $ $ $@      r%   rY  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 r_  )r   r   r   )r?   r   r   r  s       r#   r   zPrivateDictCompiler.setPos}	  s)    	#$#'9$+i $(((r%   c                     g }t          | j        d          r3|                    | j        j                            ||                      |S r  )rN   r;  rb   r  r^   )r?   r:   rh   s      r#   rc   zPrivateDictCompiler.getChildren	  sH    (T\7## B??4<%11'4@@AAA	/r%   N)
r   r   r   maxStackLimitr?  r  r   r%  r   rc   r   r%   r#   ra  ra  x	  sG        ?/00  
    r%   ra  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   	skipNamesr:   r  r@   r   r   r   r   r   )r?   r:   r@   r   r'   s        r#   r   zBaseDict.__init__	  s    
D.ddl	+	+	+	+$,$.$,	\	6$,$)775$dn&=vFFF4;;; r%   c                 2   t                                t          d| j        j        t	          |                     |                     | j        |           }|                    |           |                                | _	        | 
                                 d S )Nz    length %s is %d)r   r   r   r   rE   decompilerClassr:   rC   getDictr   postDecompile)r?   r   decs      r#   rC   zBaseDict.decompile	  sv    ''%&(?TKKKT\400#--$,r%   c                     d S r   r   rF   s    r#   rl  zBaseDict.postDecompile	  r6  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?   rU   rm   r  s       r#   __getattr__zBaseDict.__getattr__	  s    	"1"Xbcc""""d"""""
 
		
,

4
&
&%
]=T""5
]					$
))D%
 
 %	$e	,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 )NrZ   zsome keys were ignored: %sr  )r   rh  r  r  r  r[  r   r8  r  r  rr   )r?   rv   rU   rm   r  r]  s         r#   rt   zBaseDict.toXML	  s    j ) )d
dn4t$$5 m	))
/$
4==D%((((T\""S__4,  388F<,@,@#A#AAC C C r%   c                 r    | j         |         }|                    ||||           }t          | ||           d S r   )r  ri  rs  )r?   rU   r   r   r  rm   s         r#   r}   zBaseDict.fromXML	  s=    		$
,,tUGT
2
2%	$er%   )NNNNr   )
r   r   r   r   rC   rl  r^   rt  rt   r}   r   r%   r#   rf  rf  	  s               B B B B  "  0    r%   rf  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|   a  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   rB   r>   r  r   r   rZ   r   r   r   )r?   r:   r@   r   r>   rB   r'   r   s          r#   r   zTopDict.__init__	  s    vfEEE,$ $ - !2334=##%%4<,--4::: !1224=+,,4:::r%   c                     | j         S )z.Returns a list of glyph names in the CFF font.)rZ   rF   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@   r2   r  r  r{  r  )r?   r   s     r#   rl  zTopDict.postDecompile
  si    <M**&^	6)..	\ *ty))4>>>ty))4>>>r%   c                    t          | d          r|                                  t          | d          rdg| _        t          | d          rt          | d          s	g d| _        t                              | |           d S )Nr   r'  rn  )r  r  r  r  )rN   decompileAllCharStringsrh  rf  rt   )r?   rv   s     r#   rt   zTopDict.toXML
  s    T=!! "!!!T5 !L4>	u		 DWT=%A%A DD D D4>
..y!!!!!r%   c                     t          | j                                                  D ];\  }}	 |                                 #  t                              d|            xY wd S )NzError in charstring %s)	enumerater   rK   rC   r   error)r?   r:  r  s      r#   r}  zTopDict.decompileAllCharStrings
  sq     !1!8!8!:!:;; 
 
ma

II&***	
 
s   AA c                 "   d }| j                                         D ]3}|                    | j                   }||t          ||          }1|}4|| j        d         d d          | _        d S t          t          |                    | _        d S )Nr  )r   rK   
calcBoundsr
   r   r  r4   r   )r?   fontBBoxr  boundss       r#   r\   zTopDict.recalcFontBBox%
  s    ($++--  j!!$"2336(F++XXX=,QQQ/4===))**4===r%   r?  )r   r   r   r   r  r   r   r  r  rP  r%  r   r   r  rj  r   r<   rl  rt   r}  r\   r   r   s   @r#   r|   r|   	  s         2 M*++o.// 	$	%	%$4848- - - - - -  	* 	* 	*
" 
" 
"
 
 
+ + + + + + +r%   r|   c                   Z     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 )r   )r  r  r  r{   r{   Nc                     t          t          |                               ||||           || _        |                     |           d S r#  )r   r   r   r   r   )r?   r:   r@   r   r>   r'   r   r   s          r#   r   zFontDict.__init__X
  sI    $  $v FFF$+,,vr%   c                 Z    |r| j         | _        d| _        d S | j        | _        d| _        d S )NTF)	orderCFF2r   r  orderCFFr   s     r#   r   zFontDict.setCFF2^
  s2     4:4<<<4:4<<<r%   r?  )r   r   r   r   r  r   r  rY  r%  r  r  r  rj  r   r   r   r   s   @r#   r   r   5
  s        8 o.//!;;;[$48)-           r%   r   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                 Z   t          t          |                               ||||           || _        |rBt	          t
                    | _        t          t
                    | _        d x| _	        | _
        d S t	          t                    | _        t          t                    | _        d S r#  )r   r  r   r   r  r   r   r   r   r  r  r   )r?   r:   r@   r   r'   r   r   s         r#   r   zPrivateDict.__init__o
  s    T##GT6&#III$+ 1 !6774=0114: .214*** !5664=/004:::r%   c                     | j         S r   )r  rF   s    r#   in_cff2zPrivateDict.in_cff2}
  rz  r%   c                 r    |t          | d          r| j        }nd}| j                            |          }|S )Nr  r   )rN   r  r   rs  )r?   virr  s      r#   rs  zPrivateDict.getNumRegions
  sB    ZdI 	BB	
B{((,,*	r%   )NNNNNr   )r   r   r   r  r   r   r  r  r   r   r  rj  ra  r%  r   propertyr  rs  r   r   s   @r#   r  r  h
  s        M.//o233	(	)	)($AE
1 1 1 1 1 1   (       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 )r9   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>
  s5       	 
!h  r%   Fr&   )r5   r:   )r?   r@   r:   s      r#   r   zIndexedStrings.__init__
  sF    	\77 4&&&  7 $,,,r%   c                 (    t          | d | d          S )NFr&   )r   rF   s    r#   r^   zIndexedStrings.getCompiler
  s    	dD	?	?	??r%   c                 *    t          | j                  S r   )rE   r:   rF   s    r#   rG   zIndexedStrings.__len__
  s    	T\		r%   c                 \    |t           k     rt          |         S | j        |t           z
           S r   )cffStandardStringCountcffStandardStringsr:   )r?   r^  s     r#   rV   zIndexedStrings.__getitem__
  s,    !!!
S
!!
,s33
44r%   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   )	rN   buildStringMappingr   cffStandardStringMappingr  rE   r:   r  rb   )r?   r"   r^  s      r#   rU  zIndexedStrings.getSID
  s    		'	' A!!!!
"""	!!	$33D		A	33	T\		3	33<q4a	*r%   c                     | j         S r   r   rF   s    r#   
getStringszIndexedStrings.getStrings
  s
    	r%   c                     i | _         t          t          | j                            D ]}|t          z   | j         | j        |         <    d S r   )r  r  rE   r:   r  r  s     r#   r  z!IndexedStrings.buildStringMapping
  sV    $S&&'' L Le-25K-K4dl5)**L Lr%   r   )r   r   r   r   r   r^   rG   rV   rU  r  r  r   r%   r#   r9   r9   
  s           @ @ @  5 5 5    L L L L Lr%   r9   (  r:  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hr:  jkr  r  r2  opqrr"   tur(  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  )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  r2  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/  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  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  r5  r2  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     )Wr:  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  r5  r2  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  W   )r   fontTools.misc.py23r   r   r   r   r   fontTools.miscr   r	   fontTools.misc.arrayToolsr
   r   fontTools.misc.textToolsr   fontTools.ttLibr   fontTools.ttLib.tables.otBaser   r   fontTools.ttLib.tablesr   r_  ior   r0   loggingr  r   	getLoggerr   r   r,   rd  r^  r   r]   r   r   r   r   r   r   r  r  r5   r=   rB  r7   r   rS  ru  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%  r8  rP  rS  rV  r<  r=  r)  r*  rh  rs  ry  rz  rj  rk  r  r  r  r  r  r  r  r  r  r   r   r  r/  r   r   r  DictDecompilerr  r  r  r.  rP  rY  ra  rf  r|   r   r  r9   r  r  rE   r  r  _ir,  rG  r-  rH  r.  rI  r   r%   r#   <module>r)     s<    L K K K K K K K K K K K K K " " " " " " ( ( ( ( ( ( 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!! H, H, H, H, H, H, H, H,V
.  .  .  .  .  .  .  . b	 	 	H H H H HF H H HV    ]   !2 !2 !2 !2 !2= !2 !2 !2H&' &' &' &' &'= &' &' &'R	 	 	 	 	- 	 	 	( ( ( ( (' ( ( (+ + + + +- + + +E E E E EF E E EPa a a a au a a aH    !   1 1 1 1 15 1 1 1h    5   >2 2 2 2 26 2 2 2j=& =& =& =& =&v =& =& =&@~  ~  ~  ~  ~ & ~  ~  ~ B    
  
  & & && & &  ! ! !! ! !
 
 

 
 

 
 

 
 

 
 
    f   45 5 5 5 5_ 5 5 5 6 6 6 6 6o 6 6 6&        o   2    _   8    _   &    >   2    ^   + + + + +> + + +\: : : : : : : :z    f   .  *    
 
 
" " "J
 
 
  (    v   ,: : : : : : : :z      .  D    ~   :       2       *    *  *    v   D    v   ,L L L L L? L L L &)& E+T<<>>B& 3	&
 && h001& 
;'8'89& '& -& )& %& /& .& 6& 5&  ,!&" 0#&$ 
<'#=#=#=tD%&& *'&( j7LLL$/)&* .+&, &-&. //&0 11&2 23&4 15&6 27&8 /9&: /;&< y8T#3#3#5#56=&> .?&@ zHa!2!2!4!45A&B y&.B.B.D.DEC&D J4):):)<)<=E&F I$(8(8(:(:;G&H }x';';'='=>I&J zHd$5$5$7$78K& T *	<'#=#=#=tD
J4):):)<)<=
I$(8(8(:(:;}x';';'='=>zHd$5$5$7$78   
 (	k46))*.2,+&&..,7+/43**w4!1!12/ 8 (	k46))*.2,+&&../4w4!1!12# ** * *$ " # # #    1 1 1 1 14 1 1 15 5 5 5 5M8 5 5 5d d d d d6 d d dN) ) ): : : : :l : : :z) ) ) ) )| ) ) )X    ,   "H H H H Hv H H HV^+ ^+ ^+ ^+ ^+h ^+ ^+ ^+B0 0 0 0 0x 0 0 0f! ! ! ! !( ! ! !H.L .L .L .L .LV .L .L .Lh? ? ? B  
s"88888 
%&
'
' 7 7B46,R011
 
 
 @  
s"88888      D  
s!55555# # # &   
s!""&@@@@@@@r%   