L in dZddlmZddlmZddlmZmZddlmZm Z m Z m Z m Z m Z ddlmZddlmZddlmZdd lmZdd lmZdd lZdd lZdd lZej6d z Zej8eZd ZdZ Gdde!Z"Gdde!Z#dZ$Gdde!Z%Gdde%Z&Gdde%Z'Gdde%Z(Gdde%Z)Gdde)Z*Gd d!e)Z+Gd"d#e!Z,Gd$d%e,Z-Gd&d'e-Z.Gd(d)e,Z/Gd*d+e,Z0Gd,d-e!Z1Gd.d/e!Z2Gd0d1e!Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Zd=Z?d>Z@d?ZAGd@dAe!ZBGdBdCeBZCGdDdEeBZDdFZEdGZFGdHdIeBZGGdJdKeBZHGdLdMeBZIGdNdOeIZJGdPdQeIZKGdRdSeIZLGdTdUeBZMGdVdWe!ZNdXZOdYZPdZZQd[ZRd\ZSd]ZTd^ZUGd_d`e!ZVGdadbeBZWdcZXddZYdeZZdfZ[dgZ\dhZ]GdidjeIZ^GdkdleBZ_GdmdneBZ`doZadpZbdqZcGdrdse!ZdGdtdue!ZeGdvdweBZfgdxdydzd{d effd|d}d d~dd eDfdddd eDfdddd eDfdddd eDfdddd eDfddddddddddgdd fddddgdd fddddddddddddd eMfdddddeWfdddd eJfdd/dd e_fdddd e^fdd1dd eLfdddd e`fZgdxdddgdd fdd/dd e_fdddd e^fdd1dd eLfdddd e`fgZhdZidZjdejeidd d fddddddddddddddddddddddd eKfgZkdejeidd d fddddddddddddddddd eKfgZldȄZmemekemegGdɄdejZoGd˄dejZpGd̈́de!ZqdτZrGdЄdeqZsGd҄deqZtGdԄdeqZuGdքde!ZvGd؄devZwGdڄdevZxGd܄devZyGdބde!ZzgdZ{dZ|e}e{e|k(sJiZ~ee|D] Zee~e{e< gdZdZe}eek(sJgdZdZe}eek(sJgdZdZe}eek(sJy )a+cffLib: read/write Adobe CFF fonts OpenType fonts with PostScript outlines embed a completely independent font file in Adobe's *Compact Font Format*. So dealing with OpenType fonts requires also dealing with CFF. This module allows you to read and write fonts written in the CFF format. In 2016, OpenType 1.8 introduced the `CFF2 `_ format which, along with other changes, extended the CFF format to deal with the demands of variable fonts. This module parses both original CFF and CFF2. )sstruct) psCharStrings) unionRectintRect)bytechrbyteord bytesjointobytestostrsafeEval)TTFont) OTTableWriter) OTTableReader)otTables)BytesIONz% major: B minor: B hdrSize: B icdeZdZdZddZdZdZdZdZddZ d Z dd Z d Z d Z d ZdZdZy) CFFFontSetanA 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 # tt["CFF "].cff[0] # Here's your actual font data # Nc||_tjt|j d||/|rdnd}|j |k7r>t d||j fz|j dvsJd|j dk(}|stjd|j dd |_|j|jtd t|| D|_ t|| |_t!||_ntjd |j dd |_|j|jd g|_ |j&}t|||j$| |_d|_t)|| |_|j"|j_|j*|j_y)aParse 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. Nr2Invalid CFF 'major' version: expected %d, found %drrUnknown CFF formatBrc32K|]}t|ywNr ).0ss _/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/cffLib/__init__.py z'CFFFontSet.decompile..bs!Oq%(!OsisCFF2>HCFF2Font)otFontrunpackcffHeaderFormatreadmajor ValueErrorstructoffSizeseekhdrSizelistIndex fontNames TopDictIndex topDictIndexIndexedStringsstrings topDictSize getGlyphOrderGlobalSubrsIndex GlobalSubrs)selffiler'r$expected_majorcff2GetGlyphOrders r! decompilezCFFFontSet.decompileFs  ! d;  #)QaNzz^+ H%tzz23 ::' =)= ='ZZ1_F!==diil;A>DL IIdll #!!OE$v4N!OODN ,T& AD )$/DL%}}T499Q<@CD  IIdll #(\DN & 4 4  ,')9)9&!D  DL+D@$(LL!(,(8(8%c,t|jSr)lenr3r<s r!__len__zCFFFontSet.__len__ss4>>""rAc,t|jSr)r1r3rDs r!keyszCFFFontSet.keysvsDNN##rAc|jSr)r5rDs r!valueszCFFFontSet.valuesys   rAct|dr|j}n:t|tr|} |jj |}n t||j|S#t $r t|wxYw)z{Return TopDict instance identified by name (str) or index (int or any object that implements `__index__`). __index__) hasattrrK isinstancestrr3indexr,KeyError TypeErrorr5)r< nameOrIndexrOnames r! __getitem__zCFFFontSet.__getitem__|s~ ; ,))+E  S )D ,,,T2K( (  ''  ,{++ ,s A''A<c||_|/|rdnd}|j|k7r>td||jfz|jdvsJd|jdk(}|jr#|s!|jD]}|j |s t }nd}t|}|jj|||}|rud|_ |jtjt||j|_|jt!jd |jnfd |_ d |_|jtjt||jt!jd |j"|sOt%} |j&D]} | j)| |j| j||||j||s|j|j|j|j*j||||jD]2}t-|d r |j.|j1} | |_4|j3|} | D]} |j| |j5|y) aWrite 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. Nrrrrrr#r%rcharset)r'r+r, recalcBBoxesr5recalcFontBBoxr6 CFFWriter getCompilerr0addrpackr) getDataLengthr8r-r.r2r3appendr;rLrXr9 getChildrentoFile)r<r=r'r$r>topDictr7writer topCompilerr3rSrXchildrenchilds r!compilezCFFFontSet.compilesk  "(QaNzz^+ H%tzz23 ::' =)= ='ZZ1_F   v,, )&&( )$&GG6"''33GT&3Q DL JJw||OT: ;*88:D  JJv{{4)9)9: ;DLDL JJw||OT: ; JJv{{3 5 6I '  & ' JJy,,Wd6,J K ; JJw**, - 4##//f/MN(( *G7I.'//2I ..0") ***73 E JJu    drAcz|jd|j|j|jd|j|j|jD]e}|j dt ||j||}|j||jd|jg|j|j d|j|jj||jd|jy)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+valueminorCFFFontrSr;N) simpletagr+newlinerlr3begintagr toXMLendtagr;)r< xmlWriterfontNamefonts r!rrzCFFFontSet.toXMLs G4::6G4::6 H   yuX  ?    >D JJy !   Y '       =) y)'rAc||_t|dsd|_t|dsd|_|dk(r|jdk(rt|dsd|_t|dsd|_t|d st |_t|d sg|_t|_ |d }|jj|t|j }d |_ n|jdk(rt|dsd|_t|d st |_t|d sdg|_|jj}t|j|}td ||_ |jj|D],}t|t r|\}}}|j#|||.t|drV|j$dj&<|j$} | D]*} t| ds|j(| j*_,y y y |d k(rt,j.} t|d st |_|D]N}t|t r|\}}}| } | j#||||jj| Py |dk(rt1|d|_y |dk(rt1|d|_y y )z?Reads data from the XML element into the ``CFFFontSet`` object.r+rrlrrmr.rWr0r;r3rS)r;NrrVr&)r;r?VarStorePrivaterk)r'rLr+rlr.r0r:r;r3r4r5r`TopDictrXr9rMrNfromXMLFDArrayvstorerxryr T2CharStringint) r<rSattrscontentr'rurcr?elementfdArrayfontDictsubrCharStringClasssubrs r!r{zCFFFontSet.fromXMLs tW%DJtW%DJ 9 zzQtY/#$DLtY/#$DLt]3'7'9D$t[1%'DN(4D% =%%h/!d.>.>?"&qtY/#$DLt]3'7'9D$t[1&0\DN$(KK$=$=!! $ 0 0DU%17H$I!    $ $W -" 6gs+'.$eWeW5  6 w +0B0I0I0Q!// 'CHx3292B2B((/C1R+ ] ""/"<"< 4/#3#5 " .gs+'.$eW*, T5'2  ''-  .W_U7^,DJ W_U7^,DJrAc"ddlm}|||y)Nr)_convertCFFToCFF2) CFFToCFF2r)r<r'rs r!convertCFFToCFF2zCFFFontSet.convertCFFToCFF2-0$'rAc"ddlm}|||y)Nr)_convertCFF2ToCFF) CFF2ToCFFr)r<r'rs r!convertCFF2ToCFFzCFFFontSet.convertCFF2ToCFF2rrAc ddlm}||y)Nr)desubroutinize) transformsr)r<rs r!rzCFFFontSet.desubroutinize7s .trAc ddlm}||y)Nr) remove_hints)rr)r<rs r!rzCFFFontSet.remove_hints<s ,TrAc ddlm}||y)Nr)remove_unused_subroutines)rr)r<rs r!rz$CFFFontSet.remove_unused_subroutinesAs 9!$'rAr)__name__ __module__ __qualname____doc__r@rErGrIrTrhrrr{rrrrrrAr!rr0sL*+9Z#$!( >@:B-H( (   (rArc"eZdZdZdZdZdZy)r[zXHelper class for serializing CFF data to binary. Used by :meth:`CFFFontSet.compile`.c g|_||_yr)datar$r<r$s r!__init__zCFFWriter.__init__Ks  rAc:|jj|yr)rr`)r<tables r!r]z CFFWriter.addOs rAcd}d} tjtd||dz}d}|g}|jD]}t|drE||j z}t |t r0|jr$|j |_n|t|z}t|dr|j|||}|j|||k(rn|}tjtd|j}|jr.tjd|j|jd<n@t|d|_tjd |j |jd<dg}|jD]S}t|d r|j#|n|j%||j|j|z U||k(sJy) Nrz CFFWriter.toFile() iteration: %drr_setPosz#CFFWriter.toFile() writing to file.r%rrb)logDEBUGrrLr_rMTopDictIndexCompilerr$r8rCrr`tellr-r^ calcOffSizer.rbwrite) r<r= lastPosListcountposposListitemendPosbegins r!rbzCFFWriter.toFileRs  GGE=u EAIECeG $41 4#5#5#77F!$(<=$+++/+=+=+?( 3t9_F4*KKV,s# $+%!K%& <=  ;;!;;tT-=-=>DIIaL&{27DL!;;sDLL9DIIaL#II 0DtX& D! 4 NN499;. /  0 +%%%rAN)rrrrrr]rbrrAr!r[r[Gs# $&rAr[c@|dkrd}|S|dkrd}|S|dkrd}|Sd}|S)NririrrWr) largestOffsetr.s r!rrysNu N   N  " N NrAc0eZdZdZddZdZdZdZdZy) IndexCompilerzBase class for writing CFF `INDEX data `_ to binary.Nc|t|dr|j}|J||_|j|||_||_yNr$)rLr$getItemsitemsparent)r<rr7rr$s r!rzIndexCompiler.__init__sE >gfh7]]F% %% ]]5'2  rAc|Srrr<rr7s r!rzIndexCompiler.getItems rAc|jrWd}|g}|jD]A}t|dr||jz}n|t|z}|j |C|Sg}|S)Nrr_)rrLr_rCr`)r<roffsetsrs r! getOffsetszIndexCompiler.getOffsetssq ::CeG  $41 2 2 44CD /Cs#  $GrAc|jrd}nd}|jrG|jd}t|}|dzt |jdz|zz|zdz }|S|}|S)NrWrrr)r$rrrrC)r< countSize lastOffsetr. dataLengths r!r_zIndexCompiler.getDataLengths ;;II ::*2.J!*-Gtzz?Q&'12  #JrAc2|j}|jr t|t|jnt |t|j|jrt |d}t||| }tj}|D]0}|d||d}t|| k(sJ|j|2|jD]>}t|dr|j|!t|d}|j|@yy)Nr>lrblatin1encoding)rr$ writeCard32rCr writeCard16r writeCard8r-r^rrLrbr ) r<r=rr.r^offset binOffsetrrs r!rbzIndexCompiler.toFiles//# ;; c$**o . c$**o . ::!'"+.G tW %hG;;D! & v.wx8 9~'111 9% &  %4*KK%"4(;DJJt$  % rAr) rrrrrrrr_rbrrAr!rrs  ,%rArceZdZdZy)IndexedStringsCompilerc|jSrr7rs r!rzIndexedStringsCompiler.getItemss }}rAN)rrrrrrAr!rrsrArcBeZdZdZdZdZfdZfdZfdZxZ S)rz/Helper class for writing the TopDict to binary.cZg}|D]#}|j|j||%|Srr`r\r<rr7outrs r!rzTopDictIndexCompiler.getItems4 8D JJt''6 7 8 rAclg}|jD]"}|j|j|$|Srrextendra)r<r7rfrcs r!raz TopDictIndexCompiler.getChildrens6zz :G OOG//8 9 :rAc|jr!d|jdjg}|Stt|SNr)r$rr_superrr)r<r __class__s r!rzTopDictIndexCompiler.getOffsetss; ;;$**Q-5578GN-t?A ArAc~|jr|jdj}|Stt| Sr)r$rr_rr)r<rrs r!r_z"TopDictIndexCompiler.getDataLengths7 ;;A446J -tBD DrAc|jr|jdj|ytt| |yr)r$rrbrr)r<r=rs r!rbzTopDictIndexCompiler.toFiles0 ;; JJqM  & & 4T :rA) rrrrrrarr_rb __classcell__rs@r!rrs&9  BE;;rArc(eZdZdZdZdZdZdZy)FDArrayIndexCompilerzHelper class for writing the `Font DICT INDEX `_ to binary.cZg}|D]#}|j|j||%|Srrrs r!rzFDArrayIndexCompiler.getItemsrrAclg}|jD]"}|j|j|$|Srr)r<r7rfrs r!raz FDArrayIndexCompiler.getChildrens6  ;H OOH009 : ;rAc|j}|jr t|t|jnt |t|jt |d}t||| }tj}|D]0}|d||d}t|| k(sJ|j|2|jD]1}t|dr|j|!|j|3y)Nrrrb) rr$rrCrrrrr-r^rrLrb)r<r=rr.r^rrrs r!rbzFDArrayIndexCompiler.toFile s//# ;; c$**o . c$**o .gbk*4!({{ "FT6*784Iy>gX- -- JJy ! "JJ !DtX& D! 4  !rAc6||jjd<y)Nr|rrawDictr<rrs r!rzFDArrayIndexCompiler.setPos), I&rAN)rrrrrrarbrrrAr!rrs  !(-rArceZdZdZdZy)GlobalSubrsCompilerzHelper class for writing the `global subroutine INDEX `_ to binary.cg}|D]8}|j|j|j|j:|Srrhr$r`bytecoder<rr7rcss r!rzGlobalSubrsCompiler.getItems'= $B JJt{{ # JJr{{ # $ rAN)rrrrrrrAr!rr#s rArceZdZdZdZy) SubrsCompilerzHelper class for writing the `local subroutine INDEX `_ to binary.ch||jjz }||jjd<yNSubrs)rrr)r<rrrs r!rzSubrsCompiler.setPos3s(t{{&'- G$rAN)rrrrrrrAr!rr/s .rArceZdZdZdZdZy)CharStringsCompilerzHelper class for writing the `CharStrings INDEX `_ to binary.cg}|D]8}|j|j|j|j:|Srrrs r!rzCharStringsCompiler.getItems<rrAc6||jjd<yN CharStringsrrs r!rzCharStringsCompiler.setPosCs-0 M*rAN)rrrrrrrrAr!rr8s1rArcHeZdZdZeZd dZdZdZdZ dZ dZ d d Z d Z y) r2zThis 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.Ncg|_gx|_}|jj}|y||_t j t d||j||_|r t|}n t|}|dk(rydg|z|_t|}t j t d|||dks Jd|zdd|z z}t|dzD]J}|j|} || z} tjd| \} |j!t#| L|jdz |_|j'|j$|d zt j t d ||jy) Nloading %s at %srz index count: %s offSize: %srWzoffSize too large: %sr>Lr end of %s at %s)rrrr_isCFF2rrrr= readCard32 readCard16 readCard8ranger*r-r(r`r offsetBaser/) r<r=r$rrSrr.padrOchunkrs r!rzIndex.__init__NsX !## w~~&& <   )4= t$Et$E A: Ve^ D/ 8%I!|>4w>>|q7{#519% (EIIg&E%KE dE2IV NN3v; '  ( ))+/ $//GBK/0 ,dDIIK@rAc,t|jSr)rCrrDs r!rEz Index.__len__ks4::rAcj|j|}||S|j||jz}|j|dz|j|z }|j}|j ||j |}t ||k(sJ|j||||}||j|<|SNr)rrrr=r/r*rC produceItem)r<rOrrsizer=rs r!rTzIndex.__getitem__nszz%   Ke$t6||EAI&e)<<yy &yy4yD   tT6:  5 rAc"||j|<yrr)r<rOrs r! __setitem__zIndex.__setitem__|s  5rAc|Srr)r<rOrr=rs r!rzIndex.produceItems rAc:|jj|y)zAdd an item to an INDEX.N)rr`)r<rs r!r`z Index.appends $rAc,|j||||SNr# compilerClassr<r7rr$s r!r\zIndex.getCompiler!!$!GGrAc"|jdd=y)zEmpty the INDEX.NrrDs r!clearz Index.clears JJqMrANNr)rrrrrrrrErTrrr`r\r"rrAr!r2r2Gs8"MA: ! HrAr2c|eZdZdZeZejZejZ dfd Z dZ dZ dZ dZxZS)r:ayThis 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)) # # -64 callgsubr <-- Subroutine which implements the dieresis mark # tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG # tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT # ("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 `) crtt| ||||_||_|r||_|r||_yyr)rr:r globalSubrsprivatefdSelectr)r<r=r&r'r(rr$rs r!rzGlobalSubrsIndex.__init__sB .tF.C& $DM "DL rAc,|j |j}n^t|drP|jDt|dr|j|j|}nd}|j|j}nd}|j |||j S)Nrr(rr'r&)r'rLrr(ry subrClassr&)r<rOrr=rr'fdIndexs r!rzGlobalSubrsIndex.produceItems << #llG T9 %$,,*BtZ(T]]-F--.ll7+33GG~~dGAQAQ~RRrAcv|jd|jtt|D]}||}|j r|j d|dn|j d||j|j ||jd|jy)aWrite 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)rOrawrON)commentrpr rCneedsDecompilationrqrrrs)r<rtirs r!rrzGlobalSubrsIndex.toXMLs  U  s4y! A7D&&("" tt["CFF "].cff.topDictIndex[0] # c||_||r||_g|_|jj}t j t d||j||_d}dg|z|_d|g|_ |j|_ |j|j|zt j t d||jytt|;||y)Nrrrrr#)r?r rrrrrrr=rrr/rr4r)r<r=r?topSizer$rSrrs r!rzTopDictIndex.__init__s!2  !DLDJ>>**D GGE-tTYY[ ADIE%DJw 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 ||_||_|Ht|||||||_ix|_} t t |D] } | | || < d|_yi|_d|_||_|||_ |||_ yy)Nr#rr) r&varStorer;charStringsIndex charStringsr rCcharStringsAreIndexedr'r(r) r<r=rXr&r'r(rr$r~rr3s r!rzCharStrings.__init__s'   $.k7Hgf%D !.0 /D {3w<( ,*+ GAJ' ,*+D &!D )*D &"DL# ( "& #rAcHt|jjSr)r1rrGrDs r!rGzCharStrings.keyssD$$))+,,rAcx|jr |jSt|jj Sr)rrr1rrIrDs r!rIzCharStrings.valuess1  % %(( (((//12 2rAc||jvSr)r)r<rSs r!has_keyzCharStrings.has_key st''''rAc,t|jSr)rCrrDs r!rEzCharStrings.__len__s4##$$rAcZ|j|}|jr|j|}|Sr)rrr)r<rS charStrings r!rTzCharStrings.__getitem__s1%%d+  % %..z:JrAcx|jr|j|}||j|<y||j|<yr)rrr)r<rSrrOs r!rzCharStrings.__setitem__s;  % %$$T*E+5D ! !% (%/D  T "rAc|jr*|j|}|jj|St |dr)t |dr|j|j }nd}nd}|j||fS)Nrr(r)rrrr7rL fdSelectIndex)r<rSrOr6s r!r7zCharStrings.getItemAndSelector s|  % %$$T*E((;;EB BtY'4,**40>>CC##D)3. .rAct|j}|D]}|j|\}}|jrdg}ng}||j dd|fg|zn|j dd|fd|fg|z|j |j ||jd|j y)N)r/rr.rSr)sortedrGr7r2rqrprrrs)r<rtnamesrScharStrrr/s r!rrzCharStrings.toXML.styy{# D%)%<%rAc.tjd|Srr-r^rjs r! packCard16rz ;;tU ##rAc.tjd|Srrrjs r! packCard32r~rrAc2i}|D]\}}}}}||f||<|SrrrdoprSargdefaultconvs r!buildOperatorDictrs3 A(-$D#ws " HrAci}|D]H\}}}}}t|trt|dt|dz}n t|}||f||<J|SNrr)rMr\rrs r!buildOpcodeDictrsb A(-$D#w b% A'"Q%.0BBs)$  HrAcFg}|D]\}}}}}|j||Sr)r`)rlrrSrrrs r! buildOrderrs1 A(-$D#w  HrAc4i}|D]\}}}}}| |||<|Srrrs r! buildDefaultsrs7 A(-$D#w  AdG HrAc.i}|D] \}}}}}|||<|Srrrs r!buildConvertersrs/ A(-$D#w$ HrAc*eZdZdZdZdZdZdZy)SimpleConverterct|ds|j||S|j}|j} |j|||j |S#|j |wxYw)Nr=)rL_readr=rr/)r<rrkr=rs r!r*zSimpleConverter.reads[vv&::fe, ,{{iik ::fe, IIcNDIIcNs AA2c|Srrr<rrks r!rzSimpleConverter._readrrAc|Srrrs r!rzSimpleConverter.writerrAcJ|j|||jy)Nrj)rorpr<rtrSrks r!xmlWritezSimpleConverter.xmlWrites!D.rAc |dSNrkrr<rSrrrs r!r]zSimpleConverter.xmlReads W~rAN)rrrr*rrrr]rrAr!rrsrArc$eZdZdZdZdZdZy)ASCIIConverterct|dSNasciirrrs r!rzASCIIConverter._readsUW--rAct|dSrr rs r!rzASCIIConverter.writesuw//rAc`|j|t|d|jy)Nrrrjror rprs r!rzASCIIConverter.xmlWrites(Deg(FGrAc"t|ddS)Nrkrrrrs r!r]zASCIIConverter.xmlReadsuW~::rANrrrrrrr]rrAr!rrs.0;rArc$eZdZdZdZdZdZy)Latin1Converterct|dSNrrrrs r!rzLatin1Converter._readsUX..rAct|dSrrrs r!rzLatin1Converter.writesux00rAct|d}|dvrtjdd|}|j|||j y)Nrr)Notice Copyrightz [\r\n]\s+ rj)r resubrorprs r!rzLatin1Converter.xmlWritesHeh/ * *FF<e4ED.rAc"t|ddS)Nrkrrrrs r!r]zLatin1Converter.xmlReadsuW~;;rANrrrAr!rrs/1J    0  C           T "       E  2    #>sC'cd|jdd}| t|}|St|d}|Sr)getrr)r<rSrrr valueStringrks r!r]zNumberConverter.xmlRead s>ii.  "7+E U7^,E rANrrrrr]rrAr!rrs   rArceZdZdZdZy)ArrayConverterc J|rt|dtr|j||j|j |D]Q}dj |Dcgc] }t |c}}|jt||jS|j|j||jydj |Dcgc] }t |c}}|j|||jycc}wcc}w)Nrrrjr)r<rtrSrkrrrs r!rzArrayConverter.xmlWrites Za$/   t $        " $  XX9&ECs3x&EF ##$4J#G!!# $       T "    HH%83c#h89E   E  2    'F9s D D c|jdd}| t|}|S|j}|Dcgc] }t|}}|Scc}wr)rrrr) r<rSrrrrrrIrks r!r]zArrayConverter.xmlRead%s\ii.  &w/I!&&(F6<=U%=I=>sA NrrrAr!rrs  "rArceZdZdZdZy)TableConverterc|j||j|j||j||jyr)rqrprrrsrs r!rzTableConverter.xmlWrite0sB4  IrAc|j}|D],}t|tr|\}}}|j|||.|Sr)getClassrMrNr{)r<rSrrrobrs r!r]zTableConverter.xmlRead7sQ T]]_  -G'3'#* D% JJtUG ,  -  rANrrrAr!rr/s rArceZdZdZdZdZy)PrivateDictConverterctSr) PrivateDictrDs r!rzPrivateDictConverter.getClassBsrAc6|\}}|j}|j} |j}t |j ||||}|j ||j|} t| |k(sJ|j| |S#t$rd}YlwxYwrK) r=r r}AttributeErrorrr7r/r*rCr@) r<rrkrrr=r$r}privrs r!rzPrivateDictConverter._readEs f{{ ]]F6>>4vV &yy4yD    t  F s B BBcy)N)rrrrs r!rzPrivateDictConverter.writeTsrANrrrrrrrrAr!rrAs rArceZdZdZdZdZy)SubrsConverterctSr)r;rDs r!rzSubrsConverter.getClassYsrAc|j}|j}|j|j|zt ||Sr)r=r r/rr;)r<rrkr=r$s r!rzSubrsConverter._read\s6{{ &--%'($v..rAcyrrrs r!rzSubrsConverter.writebrANrrrAr!r r Xs/ rAr ceZdZdZdZdZy)CharStringsConverterc V|j}|j}|j}t|dd}|j}t |dr*|j }t |dr |j} nd} d} nd\} }|j} |j|t|||| | |||} | S)Nrxr|rir#)r$r~) r=r rXgetattrr;rLr|riryr/r) r<rrkr=r$rXr~r&rr(r'rs r!rzCharStringsConverter._readgs{{..6:t4(( 69 %nnGvz*!??G * HgnnG %!        rAcyrrrs r!rzCharStringsConverter.writerrAc t|dr*|j}t|dr |j}nd}d}n|jdd}}}t dd|j |||t |dd}|j||||S)Nr|rirx)r~)rLr|riryrr;rr{) r<rSrrrrr(r'rs r!r]zCharStringsConverter.xmlReads 69 %nnGvz*!??G *0twXG!        VZ6  D%1rANrrrrrr]rrAr!rrfs:rArc$eZdZdZdZdZdZy)CharsetConverterct|d}|dkDrY|j}|j}|j|tj t d|t |}|dk(rt|||j|}n*|dk(s|dk(rt|||j||}ntt||k(sJtj t d|ji}g} |D]}} | |vra|| } t|t|z} | dzt| z| vr| dz } | dzt| z| vr| dz|| <| dzt| z} d|| <| j| | }n=|sd|j vr |dk(sJd}n#|dk(rt"}n|dk(rt$}n |dk(rt&}r't||jk7r|d|j}|S) NROSrzloading charset at %srrz charset end at %s.r)rLror=r/rrr  parseCharset0r7 parseCharsetNotImplementedErrorrCrsetrNr`rcffISOAdobeStringscffIExpertStringscffExpertSubsetStrings) r<rrkisCIDror=rlrXallNames newCharsetrnrs r!rzCharsetConverter._reads& 19((I;;D IIe  GGE2E :t_F{' 4O1! &y$vV))w<9, ,, GGE2DIIK @HJ$ - ( +AMCL8E$s?SV3=Q%s?SV3=*+a%HY' )C#a& 8I&'#!!), -!G V^^;z!z!,!+!0 G (8(880 0 01GrAcyrrrs r!rzCharsetConverter.writerrAcF|jd|jy)Nz8charset is dumped separately as the 'GlyphOrder' element)r1rprs r!rzCharsetConverter.xmlWrites TUrAcyrrrs r!r]zCharsetConverter.xmlRead rANrrrAr!rrs-^ rArc$eZdZdZdZdZdZy)CharsetCompilerc|ddk(sJt|jd}t|||}t|||}t |t |kr||_||_y||_||_y)Nr.notdefr)rLdictObj packCharset0 packCharsetrCrr)r<r7rXrr"data0rs r!rzCharsetCompiler.__init__spqzY&&&.WeW57E73 t9s5z !DI DI rAc6||jjd<y)NrXrrs r!rzCharsetCompiler.setPosrrAc,t|jSrr_rDs r!r_zCharsetCompiler.getDataLengthr`rAc:|j|jyrrrr<r=s r!rbzCharsetCompiler.toFile 499rANrrrrrr_rbrrAr!r+r+s -rAr+cd}ttdfttdftt dfg}t |}|D]2\}}}||S||kDr|}t|D]}||||k7sd}24|S)Nrrr)cffISOAdobeStringCountrcffExpertStringCountr cffExpertSubsetStringCountr!rCr )rXpredefinedCharSetValpredefinedCharSetslcscntpcscsvr3s r! getStdCharSetrCs !3Q7 0!4 #%;Q? g,C+  S#  +   9 "s AqzSV#'+$   rAct|ddS)Nr)rrSr7s r!getCIDfromNamerF s tABx=rAc$|j|Sr)getSIDrEs r!getSIDfromNamerIs >>$ rAc d}t|g}|rt}nt}|ddD]#}|jt |||%t |Sr)rrFrIr`rr )rXr"r7fmtr getNameIDrSs r!r/r/sW C cN D " "  : Jyw789: T?rAcd}g}d}d}|rt}nt}|ddD];}|||} || }n)|dz| k7r!||z } | dkDrd}|j|| f| }| }=|r||z } | dkDrd}|j|| ft|g} |dk(rt} nt} |D](\}} | jt || | z*t | S)Nrrr)rFrIr`rrr ) rXr"r7rKrangesrsendrLrSSIDnLeftr nLeftFuncs r!r0r0"s C F E C " "  g& =E 1W^%KEs{ MM5%. )E  e  3;C uen% cN D ax  : u Ju% %(889: T?rAc dg}|rLt|dz D]9}t|}|jdt|j dz;|St|dz D]!}t|}|j||#|SNr-rcidrV)r r r`rNzfill)ror=r7r"rXr3CIDrQs r!rrGskG y1}% 6AT"C NN53s8>>!#44 5 6 Ny1}% )AT"C NN73< ( ) NrAcbdg}d}|dk(rt}nt}||krt|}||} |rDt||| zdzD].} |jdt | j dz0n+t||| zdzD]} |j|| || zdz}||kr|SrU)r r r r`rNrW) ror=r7r"rKrXrrSrsrRrXrQs r!rrTskG E ax  ) 4 $ UEEMA$56 :us3x~~a'889 :UEEMA$56 -ws|, - ! )  NrAc$eZdZdZdZdZdZy)EncodingCompilerc<t|trJt|jj||j }t |jj||j }t|t|kr||_||_ y||_||_ yr) rMrN packEncoding0r.rXr7 packEncoding1rCrr)r<r7rrr1data1s r!rzEncodingCompiler.__init__iszh,,,fnn44hOfnn44hO u:E "DI DI rAc6||jjd<y)NEncodingrrs r!rzEncodingCompiler.setPoss*- J'rAc,t|jSrr_rDs r!r_zEncodingCompiler.getDataLengthvr`rAc:|j|jyrr5r6s r!rbzEncodingCompiler.toFileyr7rANr8rrAr!r[r[hs.rAr[c$eZdZdZdZdZdZy)EncodingConverterc|dk(ry|dk(ry|dkDsJ|j}|j|tjtd|t |}t |dz}|dz}|dk(rt |j|}n*|dk(rt|j|}ntd||rt|||j|S) NrStandardEncodingrExpertEncodingzloading Encoding at %szUnknown Encoding format: ) r=r/rrr boolparseEncoding0rXparseEncoding1r,parseEncodingSupplementr7)r<rrkr=rKhaveSupplementrs r!rzEncodingConverter._read~s A:% aZ#qyy{{ % /7ocDj)Dj !8%fnnd;H AX%fnnd;H8>? ?  #D(FNN CrAc|dk(ry|dk(ryy)Nrhrrirrrs r!rzEncodingConverter.writes & & & &rAcz|dvr$|j|||jy|j||jtt |D]:}||}|dk7s|jdt |||j<|j ||jy)N)rhrirnr-map)coderS)rorprqr rChexrs)r<rtrSrkrtrs r!rzEncodingConverter.xmlWrites : :   5  1     4 #e*% $Dd II%##ED #J!!#  $ rAcd|vr|dSdgdz}|D]1}t|tr|\}}}t|d}|d}|||<3|S)NrSr-rrt)rMrNr ) r<rSrrrrrrtrs r!r]zEncodingConverter.xmlReadsn U?= ;$ 'G'3'#* D%E&M*Df I&HTN  'rANrrrAr!rfrf}s4  rArfc|jd}t|dk7r tdtjd|dS)u3Read a String ID (SID) — 2-byte unsigned integer.rz(Unexpected end of file while reading SIDr%r)r*rCEOFErrorr-r()r=rs r!readSIDrys< 99Qugv6rANrrrAr!rrbs(rArcvd}t|g}|D]}|jt|t|Sr)rr`r ) fdSelectArrayrKrrOs r! packFDSelect0rvs= C cN D& Ie$%& T?rAcd}g}t|}d}t|D]"}||}||k7s|j||g|}$dz}t|g}|jt t||D]<} |jt | d|jt| d>|jt |t |S)Nrrrr)rCr r`rrr rrKfdRangeslenArray lastFDIndexr3r, sentinelGIDrfdRanges r! packFDSelect3r~s CH=!HK 8_"" ' ! OOQL )!K " a%K cN DKK 3x=)*+ Jwqz*+ Igaj)*+ KK ;'( T?rAcd}g}t|}d}t|D]"}||}||k7s|j||g|}$dz}t|g}|jt t||D]<} |jt | d|jt | d>|jt |t |S)NrWrrr)rCr r`rrrr rs r! packFDSelect4rs CH=!HK 8_"" ' ! OOQL )!K " a%K cN DKK 3x=)*, Jwqz*+ Jwqz*+, KK ;'( T?rAc$eZdZdZdZdZdZy)FDSelectCompilerc|j}|j}|dk(rt||_||_y|dk(rt ||_||_y|dk(rt ||_||_yt|}t |}t |t |kr||_d|_||_y||_d|_||_y)NrrrW)rlrnrrrrrCr)r<r(rrKrr1data3s r!rzFDSelectCompiler.__init__soo )) !8%m4DI  AX%m4DI AX%m4DI "-0E!-0E5zCJ&! "#  " "# rAc6||jjd<y)Nrirrs r!rzFDSelectCompiler.setPosrbrAc,t|jSrr_rDs r!r_zFDSelectCompiler.getDataLengthr`rAc:|j|jyrr5r6s r!rbzFDSelectCompiler.toFiler7rANr8rrAr!rrs,.rArc$eZdZdZdZdZdZy)VarStoreCompilerc||_|js|jtdt |j}t ||jg}t ||_yrR)rrrhminrCrr )r< varStoreDatarvarStoreDataLenrs r!rzVarStoreCompiler.__init__sU    "fc,*;*;&<=?+\->->?dO rAc6||jjd<y)Nrxrrs r!rzVarStoreCompiler.setPosrbrAc,t|jSrr_rDs r!r_zVarStoreCompiler.getDataLengthr`rAc:|j|jyrr5r6s r!rbzVarStoreCompiler.toFiler7rANr8rrAr!rrs$.rArceZdZdZdZy) ROSConverterc|\}}}|j|dt|fdt|fd|fg|jyNRegistryOrder Supplementr)r<rtrSrkregistryorder supplements r!rzROSConverter.xmlWritesR&+#% U8_-%,'z*   rAc0|d|dt|dfSr)r rs r!r]zROSConverter.xmlReads"j!5>8E,gfh7]]F% %%    MM "DGT40E}%%d+DJJw.E((,,T22!GDM " rAcyrrrs r!rzDictCompiler.setPosr)rAc6t|jdS)Nr_)rCrhrDs r!r_zDictCompiler.getDataLengths4<<011rAcjtjtd|jj||j}g}|j j D]}|j|}||j|\}}t|trat|}t||k(sJdt|D]2} || } || } t|d| z} |j| | 4n&t|d|z} |j| ||j|t|}|S)Nz-- compiling %s for %szvalue doesn't match arg typearg_)rrrrrr.rropcodesrMr\rCr rr`r ) r<reasonrrrSrkrargTyperr3rv arghandlers r!rhzDictCompiler.compiles /1H1H&Q,,LL&& DKK%E},,t,KB'5)L5zQF(FFq/A!!*CaA!(v|!s4Er)rrrr;rrr_rhrbr/r2r4r9r6rrAr!rr~s;M, 20B "DrArcvt|trtj|Stj|Sr)rMrr encodeFloatr1)r-s r!r+r+$ s.#u((--))#..rAc"eZdZeeZdZy)TopDictCompilerc|j}g}|jjt|jdr|jjrzt|jdrd}nt |jj}|1|j t||jj|n||jd<t|jdr|jjr|jj}t|tsf|j t|||nIt|jdr3|jj}t||}|j |t|jdr|jj}t!|dk(rO|jj"} |jjD] } |j | | j$"t'||} |j | t|jdrgg} |jj"} |jjD]} | j | | t)| |||} |j | t|jd rW|jj*j-||}|j ||j/|j1|t|jd rW|jj2j-||}|j ||j/|j1||S) NrXrrarxrirrr#r|ry)r$r.r?rLrXrCr`r+rrarMrNr[rxrrirCrrrrr|r\rrary)r<r7r$rf charsetCoderr varStoreCompr(rrS fdSelectComprcharStringsCompfdArrayIndexCompprivComps r!razTopDictCompiler.getChildren. s << ) ) 1t||Y/DLL4H4H4<</"&K"/ 0D0D"EK&OO'1E1EtL/:DLL+t||Z0T\\5J5J<<00!(C0OO$4Wh$MNt||Z0#||44 / dC  - 4<< , ||,,H8}!"ll66  LL00EDOOK$5$C$CDE+Hd;L OOL ) 4<< /E,,22K ,, 0 [./ 01%$vVO OOO , 4<< + $||33??N  OO, - OO,88A B 4<< +||++77FH OOH % OOH009 :rAN)rrrrrr$rarrAr!rKrK+ s./G7rArKc6eZdZeeZdfd ZdZxZS)FontDictCompilerc(tt| ||||g}|j}t t |j t |jz D]}||jvr|j|#|jj|}|!|j |}|j||}t||d|k7sr|j||r1tjddj!t |zyy)Nr#z:Some CFF FDArray/FontDict keys were ignored upon compile: r)rrTrr.rrrrrr`rrr*rrwarningr) r<r.r7rr$ ignoredNamesrSrrrs r!rzFontDictCompiler.__init__k s .wPV.W  ,,3w112S5GGH .Dw& ##D) "**..t4&"--d3D"ii9G7D$/7: ''-# .$  KKL((6,/01  rAcg}t|jdrW|jjj||}|j ||j |j ||SNry)rLr.ryr\r`rra)r<r7rfrRs r!razFontDictCompiler.getChildren sY 4<< +||++77FH OOH % OOH009 :rAr) rrrrrr$rrarrs@r!rTrTh s./GBrArTc,eZdZeZeeZdZdZ y)PrivateDictCompilercR||z }||f|jjd<||_yrY)rrr)r<rrrs r!rzPrivateDictCompiler.setPos s*|)-s I&rAcg}t|jdr5|j|jjj |||Sr)rLr.r`rr\)r<r7rfs r!razPrivateDictCompiler.getChildren s= 4<< ) OODLL..::7DI JrAN) rrr maxStackLimitr;rrr$rrarrAr!r[r[ s!M23G rAr[c:eZdZd dZdZdZd dZdZdZdZ y) BaseDictNc|du|duk(sJi|_g|_||_|y||_||_|8t j t d|jj|||_ yy)Nr) r skipNamesr7r r=rrrrr)r<r7r=rr$s r!rzBaseDict.__init__ sr$DDL111  <     GGE-t~~/F/F O DK rActjtd|jjt ||j |j |}|j||j|_ |jy)Nz length %s is %d) rrrrrCdecompilerClassr7r@getDictr postDecompile)r<rdecs r!r@zBaseDict.decompile s^ ,dnn.E.Es4yQ""4<<6 d{{}  rAcyrrrDs r!rfzBaseDict.postDecompile r)rAc,|j||||Srrrs r!r\zBaseDict.getCompiler r rAc(|dd|ddcxk(rdk(r t||jj|d}||jj|}| t||j|}|j ||}t ||||S)Nr__)rrrrrr*setattr)r<rSrkrs r! __getattr__zBaseDict.__getattr__ s 8tBCy (D ( !& & )    t, =MM%%d+E = & &t$ $&dE" rAc|jD]H}||jvrt||d}||dk7r'|j|}|j |||Jt |j t |jz }|r=|jddjt|z|jyy)NrXzsome keys were ignored: %sr) rrbrrrrrr1rrrp)r<rtrSrkrrWs r!rrzBaseDict.toXML sJJ 2Dt~~%D$-E}!2??4(D MM)T5 1! 2"4<<(3tzz?:    ,sxx|8L/MM      rAcd|j|}|j||||}t|||yr)rr]rm)r<rSrrrrks r!r{zBaseDict.fromXML s0t$ T5'48dE"rA)NNNNr) rrrrr@rfr\rnrrr{rrAr!r`r` s& ! H" 2#rAr`ceZdZdZeeZeeZe Z e eZ e Z dfd ZdZdZdZdZdZxZS) rzadThe ``TopDict`` represents the top-level dictionary holding font information. CFF2 tables contain a restricted set of top-level entries as described `here `_, 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] ctt| ||||||_||_|r5t t |_||_tt |_ yt t|_tt|_ yr) rrzrr?r;rtopDictOperators2rrXrrr)r<r7r=rr;r?r$rs r!rzTopDict.__init__ sn gt%gtVF%K!2& )*;  v <<' 2DN' 2DNrAct|dr|jt|drdg|_t|dr t|ds gd|_tj ||y)Nrrra)rrrr)rLdecompileAllCharStringsrbr`rr)r<rts r!rrz TopDict.toXML3 sW 4 '  ( ( * 4 (\DNtU#74+GDN tY'rAct|jjD]\}} |jy#tj d|xYw)NzError in charstring %s) enumeraterrIr@rerror)r<r3rs r!rxzTopDict.decompileAllCharStringsC sS&t'7'7'>'>'@A MAz $$&   2A6s >Ac d}|jjD]1}|j|j}|!| t||}0|}3||jddd|_yt t||_y)Nr)rrI calcBoundsrrrr1r)r<fontBBoxrboundss r!rZzTopDict.recalcFontBBoxL s**113 &J**4+;+;H I'O  !rArCcpeZdZeeZeeZeeZ e Z e Z dfd ZedZddZxZS)rc tt| ||||||_|r>t t |_tt |_dx|_ |_ d|_ yt t|_tt|_d|_ y)Nr#TF) rrrr}rprivateDictOperators2rrrrrr r)r<r7r=rr$r}rs r!rzPrivateDict.__init__ sy k4)'4)O )*?@DM#$9:DJ7; :D !3DL)*>?DM#$89DJ DLrAc|jSr)r rDs r!in_cff2zPrivateDict.in_cff2 rurAcv|t|dr |j}nd}|jj|}|S)Nrr)rLrr}rg)r<virfs r!rgzPrivateDict.getNumRegions s9 :tY'\\[[..r2 rA)NNNNNr)rrrrrrrrrrrrdr[rrpropertyrrgrrs@r!rr sL12H !56J + ,E+O'M !rArc<eZdZdZd dZdZdZdZdZdZ d Z y) r6zSID -> string mapping.Nc~| g}||_yt|dDcgc]}t|d}}||_ycc}w)NFr#rr)r2r r7)r<r=r7r s r!rzIndexedStrings.__init__ sF <G =B$uT6TD  t||E2 3 UrAr) rrrrrr\rErTrHrrrrAr!r6r6 s* F!> UrAr6(r-spaceexclamquotedbl numbersigndollarpercent ampersand quoteright parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatArCDEFGHIJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscore quoteleftabcrefghr3jkrrr%opqrr tur'wxyz braceleftbar braceright asciitilde exclamdowncentsterlingfractionyenflorinsectioncurrency quotesingle quotedblleft guillemotleft guilsinglleftguilsinglrightfiflendashdagger daggerdblperiodcentered paragraphbulletquotesinglbase quotedblbase quotedblrightguillemotrightellipsis perthousand questiondowngraveacute circumflextildemacronbreve dotaccentdieresisringcedilla hungarumlautogonekcaronemdashAE ordfeminineLslashOslashOE ordmasculineaedotlessilslashoslashoe germandbls onesuperior logicalnotmu trademarkEthonehalf plusminusThorn onequarterdivide brokenbardegreethorn threequarters twosuperior registeredminusethmultiply threesuperior copyrightAacute Acircumflex AdieresisAgraveAringAtildeCcedillaEacute Ecircumflex EdieresisEgraveIacute Icircumflex IdieresisIgraveNtildeOacute Ocircumflex OdieresisOgraveOtildeScaronUacute Ucircumflex UdieresisUgraveYacute YdieresisZcaronaacute acircumflex adieresisagravearingatildeccedillaeacute ecircumflex edieresisegraveiacute icircumflex idieresisigraventildeoacute ocircumflex odieresisograveotildescaronuacute ucircumflex udieresisugraveyacute ydieresiszcaron exclamsmallHungarumlautsmalldollaroldstyledollarsuperiorampersandsmall Acutesmallparenleftsuperiorparenrightsuperiortwodotenleaderonedotenleader zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyle commasuperiorthreequartersemdashperiodsuperior questionsmall asuperior bsuperior centsuperior dsuperior esuperior isuperior lsuperior msuperior nsuperior osuperior rsuperior ssuperior tsuperiorffffifflparenleftinferiorparenrightinferiorCircumflexsmallhyphensuperior GravesmallAsmallBsmallCsmallDsmallEsmallFsmallGsmallHsmallIsmallJsmallKsmallLsmallMsmallNsmallOsmallPsmallQsmallRsmallSsmallTsmallUsmallVsmallWsmallXsmallYsmallZsmall colonmonetary onefittedrupiah Tildesmallexclamdownsmall centoldstyle Lslashsmall Scaronsmall Zcaronsmall Dieresissmall Brevesmall CaronsmallDotaccentsmall Macronsmall figuredashhypheninferior Ogoneksmall Ringsmall Cedillasmallquestiondownsmall oneeighth threeeighths fiveeighths seveneighthsonethird twothirds zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior centinferiordollarinferiorperiodinferior commainferior Agravesmall AacutesmallAcircumflexsmall AtildesmallAdieresissmall AringsmallAEsmall Ccedillasmall Egravesmall EacutesmallEcircumflexsmallEdieresissmall Igravesmall IacutesmallIcircumflexsmallIdieresissmallEthsmall Ntildesmall Ogravesmall OacutesmallOcircumflexsmall OtildesmallOdieresissmallOEsmall Oslashsmall Ugravesmall UacutesmallUcircumflexsmallUdieresissmall Yacutesmall ThornsmallYdieresissmallz001.000z001.001z001.002z001.003BlackBoldBookLightMediumRegularRomanSemiboldi)r-rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3rrrrr%rrrrr rrr'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r r rrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrw)r-rrxryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1r.r6rrrrrrrrr)r7r<rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r r )Wr-rrzr{r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1r.r6rrrrrrrr)r7r<rrrrrrrrrrrrrrrrrrrrW)rfontTools.miscrrfontTools.misc.arrayToolsrrfontTools.misc.textToolsrrr r r r fontTools.ttLibr fontTools.ttLib.tables.otBaserrfontTools.ttLib.tablesrrSiorr-loggingrr getLoggerrrr)r^objectrr[rrrrrrrrr2r:r;r4rHrNrirr r r rrrrrrrrrrrrrrrrrrrrr rrr+rCrFrIr/r0rrr[rfryrormrnr]r^rrrrrrrrrrrsrr,rrrDictDecompilerrrrr+rKrTr[r`rzrCrr6rrrCrr _irr:r r;r!r<rrAr!r%s #(8#771    g!  T(T(n/&/&d I%FI%X] !;=!;H&-=&-R - .'. 1- 1DFDNh uh V"!"4 54 n 5 F363l=,v=,@H)&H)V!  ))$$     f2 ;_ ;. ^ :>:z; ; |f, ,  "J (v*<<~(  &.D~80(**vBv&R?R"&*&u.lnE&6 & & & %01 & k5$(9:& E4!23&z5$(9:& eT?#45&%&1&0&9&8& .!&"3#&$ lG%?F%&&+'&( G\40)&*0+&,&-&.0/&021&253&445&657&819&:1;&<Hd$4$67=&>0?&@Xq"3"56A&B($0D0FGC&Dz8T+<+>?E&Fy(D*:*<=G&H$(<(>?I&JXt%6%89K&T+ lG%?F z8T+<+>? y(D*:*<=$(<(>?Xt%6%89 *  +*+04.-''00.:-276,,(D."23;D*  +*+04.-''0027(D."23/60$"# 4 4448M888c6cL/:l:z*|*Z ,  H#vH#Vi4hi4X7!x7!t"("J*UV*U`HT  "8888 & ':B79/34:fP "8888gR !5555Xt  !"&@@@@rA