
    h!                    H   S SK JrJrJrJrJ	r
Jr  S SKJr  S SKJrJr  S SKJrJrJrJrJr  S SKJr  S SKJrJr  SSKJrJrJ r J!r!J"r"  SS	K#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r.J/r0J1r1  S S
K2J3r3J4r4  S SK5J6r6  S SK7J8r8  S SK9r9S SK:r:S SK;J<r<  S SK=r=\=R|                  " \?5      r@S rAS rB " S S\C5      rD " S S\D5      rE " S S\E5      rF " S S\E5      rG " S S\G5      rH " S S\G5      rI " S S\I5      rJ " S S \F\I5      rK " S! S"\G5      rL " S# S$\G5      rM " S% S&\G5      rN " S' S(\G5      rO " S) S*\G5      rP " S+ S,\G5      rQ " S- S.\Q\O5      rR " S/ S0\Q\M5      rS " S1 S2\Q\I5      rT " S3 S4\E5      rU " S5 S6\E5      rV " S7 S8\V5      rW " S9 S:\M5      rX " S; S<\M5      rY " S= S>\E5      rZ " S? S@\Z5      r[ " SA SB\Z5      r\ " SC SD\\5      r] " SE SF\\5      r^ " SG SH\^5      r_ " SI SJ\_5      r` " SK SL\E5      ra " SM SN\E5      rb " SO SP\D5      rc " SQ SR\c5      rd " SS ST\c5      re " SU SV\e5      rf " SW SX\e5      rg " SY SZ\c5      rh " S[ S\\e5      ri " S] S^\f\i5      rj " S_ S`\e5      rk " Sa Sb\G5      rl " Sc Sd\l5      rm " Se Sf\D5      rn " Sg Sh\D5      ro " Si Sj\D5      rp " Sk Sl\D5      rq " Sm Sn\D5      rr " So Sp\D5      rs " Sq Sr\D5      rt " Ss St\D5      ru " Su Sv\D5      rv " Sw Sx5      rw " Sy Sz\D5      rx " S{ S|\M5      ry " S} S~\O5      rz " S S\z5      r- " S S\z5      r/0 S\N_S\L_S\H_S\O_S\M_S\P_S\I_S\b_S\J_S \K_SL\a_S4\U_S6\V_S8\W_S:\X_S@\[_SD\]_0 SF\^_SH\__SJ\`_S\c_S\e_S\f_S\g_Sd\m_Sr\t_St\u_Sv\v_S|\y_S\-_S\/_S<\Y_S\6" \x\wS9_S\6" \x\%S9_E\r\s\d\d\d\pS S S S S S S.Er{g)    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)OPTIMIZE_FONT_SPEEDgetSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optionalc                 "    [        U [        5      $ N)
isinstancetuple)ts    U/var/www/html/env/lib/python3.13/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>r1   -   s    Jq%(    c           	      &   / n0 nU  GH  u  pEpgnUn	UR                  S5      (       a  US:X  d   e[        n
OUR                  S5      (       d  US;   a  [        [        [
        S.U   n
OjUS:X  a  [        n
O]US:X  a  [        n
OPUS:X  a  [        n
OCUS	:X  a  [        n
O6US
;   a  [        n
O)U[        ;  a  SU;  a	  Un	[        n
O[        XA[        5      n
U
" XVXxS9nUR                  (       a  UR                  nO)US;   a  UR                  U5      nOUR                  U	5      nUR                  (       d  Xl        US;   aZ  US   Ul        UR                   R#                  5        H2  nUR#                  5        H  n[%        XVX~5      X>R&                  '   M     M4     US	:X  aM  US   Ul        US	   Ul        UR(                  R#                  5        H  n[%        XVX~5      X>R&                  '   M     UR-                  U5        XS;  d   U5       eXU'   GM     X#4$ )zGiven a table spec from otData.py, build a converter object for each
field of the table. This is called for each table in otData.py, and
the results are assigned to the corresponding class in otTables.py.ValueFormatuint16Count)StructLength	MorphType)uint8r5   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r;   r<   r=   r   featureParamTypes)
startswithr4   endswithComputedUInt8ComputedUShortComputedULongr;   r<   r=   r>   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__rG   defaultFeatureParamsappend)	tableSpectableNamespace
convertersconvertersByNametpnamerepeatauxdescr	tableNameconverterClassconvrQ   r/   clss                  r0   buildConvertersre   0   s
    J(1$&u	??=))>!>(N]]7##t/L'L&(' 	N
 Z%N]"(N[ &N_$*N;;-N))cm	!'!%b:J!KdCC??J=='++B/J'++I6J(O;;-m<D%%,,.88:C5:45R$\\2 & / ?"%34G%HD"(6(GD%--44616tS1N . 7$+1T1+!%m )2n ''r2   c                       \ rS rSrSrSSS.S jjrS rS rS	 rS
 r	SS jr
S rS r\R                  " S5      rS\\   4S jrSrg)BaseConverterp   zXBase class for converter objects. Apart from the constructor, this
is an abstract class.N rB   c                X   Xl         X l        X0l        U R                  (       a-  U R                  (       d  [        U R                  SS5      U l        X@l        UR                  S5      =(       d    US;   U l        UR                  S5      =(       d    US:H  U l        US;   U l        XPl	        g )Nz<string>rP   r6   )DesignAxisRecordSizeValueRecordSize
LookupTyper8   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountrk   AxisValueCountrl   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList)
r]   r^   r_   compilerQ   rI   isCountisLookupTypeisPropagatedrC   selfr]   r^   r_   rQ   rC   s         r0   __init__BaseConverter.__init__t   s    	88DKKtxxV<DH$}}W- 
 :
 2
 !MM,7N4;;N  %
 
" 'r2   c                   ^ ^^^	^
 TR                   =(       a    US:  nU(       a  T R                  T5      m
T
[        L a  SnU(       d8  / n[        U5       H%  nUR	                  T R                  TTU5      5        M'     U$ UUU
U 4S jnU" 5       m	[        U	4S j[        U5       5       5      nTR                  UT
-  5        U$ )z(Read an array of values from the reader.   Fc                  X   >^^ TR                  5       mTR                  mUUUUU4S jn U $ )Nc                 X   > TR                  TU T-  -   5        TR                  TT0 5      $ r,   )seekread)ifontposreader_copy
recordSizer   s    r0   	read_itemABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item   s-    $$S1z>%9:99[$;;r2   copyr   )r   r   r   r   readerr   r   s    @@r0   get_read_item.BaseConverter.readArray.<locals>.get_read_item   s)    $kkmjj< < ! r2   c              3   (   >#    U  H  nTv   M	     g 7fr,    ).0r   r   s     r0   	<genexpr>*BaseConverter.readArray.<locals>.<genexpr>   s     9LqLs   )lazygetRecordSizeNotImplementedrangerW   r   r   advance)r   r   r   	tableDictcountr   lr   r   r   r   s   ```      @@r0   	readArrayBaseConverter.readArray   s    yy&UQY++F3J^+A5\64;< "H! ! &I9E%L99ANN5:-.Hr2   c                 H    [        U S5      (       a  U R                  $ [        $ )N
staticSize)hasattrr   r   r   r   s     r0   r   BaseConverter.getRecordSize   s    4&&??"r2   c                     [        U 5      e)zRead a value from the reader.NotImplementedErrorr   r   r   r   s       r0   r   BaseConverter.read       !$''r2   c                      [        U5       H  u  pVU R                  XX6U5        M     g ! [         a  nUR                  W4-   Ul        e S nAff = fr,   )	enumeratewrite	Exceptionargs)r   writerr   r   rS   r   valuees           r0   
writeArrayBaseConverter.writeArray   sL    	%f-

61= . 	VVqd]AF	s   '* 
AA

Ac                     [        U 5      e)zWrite a value to the writer.r   r   r   r   r   r   repeatIndexs         r0   r   BaseConverter.write   r   r2   c                     [        U 5      e)zRead a value from XML.r   r   attrscontentr   s       r0   xmlReadBaseConverter.xmlRead   r   r2   c                     [        U 5      e)zWrite a value to XML.r   r   	xmlWriterr   r   r]   r   s         r0   xmlWriteBaseConverter.xmlWrite   r   r2   zVarIndexBase\s*\+\s*(\d+)returnc                     U R                   R                  U R                  5      nU(       d  g[        UR	                  S5      5      $ )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrC   intgroup)r   ms     r0   getVarIndexOffsetBaseConverter.getVarIndexOffset   s6    ))001A1AB1771:r2   )r_   rC   r|   r}   r~   r]   r^   rQ   r,   )rU   
__module____qualname____firstlineno____doc__r   r   r   r   r   r   r   r   rer{   r   r*   r   r   __static_attributes__r   r2   r0   rg   rg   p   sX    '" '><
((((  "zz*FG8C= r2   rg   c                   @    \ rS rSr\S 5       r\S 5       rS rS rSr	g)SimpleValue   c                     U $ r,   r   r   s    r0   toStringSimpleValue.toString       r2   c                     U $ r,   r   r   s    r0   
fromStringSimpleValue.fromString   r   r2   c                 p    UR                  XESU R                  U5      4/-   5        UR                  5         g Nr   )	simpletagr   newliner   s         r0   r   SimpleValue.xmlWrite   s2    DGT]]55I+J*K"KLr2   c                 *    U R                  US   5      $ r   )r   r   s       r0   r   SimpleValue.xmlRead   s    uW~..r2   r   N)
rU   r   r   r   staticmethodr   r   r   r   r   r   r2   r0   r   r      s2       /r2   r   c                   $    \ rS rSrSrS rS rSrg)OptionalValue   Nc                     X0R                   :w  a"  UR                  SU R                  U5      45        UR                  XE5        UR	                  5         g r   )DEFAULTrW   r   r   r   r   s         r0   r   OptionalValue.xmlWrite   s@    LL LL'4==#789D(r2   c                 N    SU;   a  U R                  US   5      $ U R                  $ r   )r   r   r   s       r0   r   OptionalValue.xmlRead   s'    e??5>22||r2   r   )rU   r   r   r   r   r   r   r   r   r2   r0   r   r      s    Gr2   r   c                   $    \ rS rSr\S 5       rSrg)IntValue   c                     [        U S5      $ Nr   )r   r   s    r0   r   IntValue.fromString   s    5!}r2   r   NrU   r   r   r   r   r   r   r   r2   r0   r   r      s     r2   r   c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
Long      c                 "    UR                  5       $ r,   readLongr   s       r0   r   	Long.read        r2   c                 $    UR                  U5      $ r,   )readLongArrayr   r   r   r   r   s        r0   r   Long.readArray      ##E**r2   Nc                 &    UR                  U5        g r,   )	writeLongr   s         r0   r   
Long.write      r2   c                 &    UR                  U5        g r,   )writeLongArrayr   r   r   r   rS   s        r0   r   Long.writeArray
      f%r2   r   r,   
rU   r   r   r   r   r   r   r   r   r   r   r2   r0   r   r          J!+ &r2   r   c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
ULongi  r   c                 "    UR                  5       $ r,   	readULongr   s       r0   r   
ULong.read      !!r2   c                 $    UR                  U5      $ r,   )readULongArrayr  s        r0   r   ULong.readArray      $$U++r2   Nc                 &    UR                  U5        g r,   
writeULongr   s         r0   r   ULong.write      % r2   c                 &    UR                  U5        g r,   )writeULongArrayr  s        r0   r   ULong.writeArray      v&r2   r   r,   r  r   r2   r0   r  r        J",!'r2   r  c                   $    \ rS rSr\S 5       rSrg)Flags32i  c                     SU -  $ )Nz0x%08Xr   r   s    r0   r   Flags32.toString      %r2   r   N)rU   r   r   r   r   r   r   r   r2   r0   r(  r(    s       r2   r(  c                       \ rS rSr\rSrg)VarIndexi$  r   N)rU   r   r   r   r%   r   r   r   r2   r0   r-  r-  $  s     Gr2   r-  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
Shorti(     c                 "    UR                  5       $ r,   )	readShortr   s       r0   r   
Short.read+  r  r2   c                 $    UR                  U5      $ r,   )readShortArrayr  s        r0   r   Short.readArray.  r  r2   Nc                 &    UR                  U5        g r,   )
writeShortr   s         r0   r   Short.write1  r!  r2   c                 &    UR                  U5        g r,   )writeShortArrayr  s        r0   r   Short.writeArray4  r%  r2   r   r,   r  r   r2   r0   r/  r/  (  r&  r2   r/  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
UShorti8  r0  c                 "    UR                  5       $ r,   
readUShortr   s       r0   r   UShort.read;        ""r2   c                 $    UR                  U5      $ r,   )readUShortArrayr  s        r0   r   UShort.readArray>  s    %%e,,r2   Nc                 &    UR                  U5        g r,   writeUShortr   s         r0   r   UShort.writeA      5!r2   c                 &    UR                  U5        g r,   )writeUShortArrayr  s        r0   r   UShort.writeArrayD  s    'r2   r   r,   r  r   r2   r0   r>  r>  8  s    J#-"(r2   r>  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
Int8iH  r   c                 "    UR                  5       $ r,   )readInt8r   s       r0   r   	Int8.readK  r  r2   c                 $    UR                  U5      $ r,   )readInt8Arrayr  s        r0   r   Int8.readArrayN  r  r2   Nc                 &    UR                  U5        g r,   )	writeInt8r   s         r0   r   
Int8.writeQ  r
  r2   c                 &    UR                  U5        g r,   )writeInt8Arrayr  s        r0   r   Int8.writeArrayT  r  r2   r   r,   r  r   r2   r0   rP  rP  H  r  r2   rP  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
UInt8iX  r   c                 "    UR                  5       $ r,   )	readUInt8r   s       r0   r   
UInt8.read[  r  r2   c                 $    UR                  U5      $ r,   )readUInt8Arrayr  s        r0   r   UInt8.readArray^  r  r2   Nc                 &    UR                  U5        g r,   )
writeUInt8r   s         r0   r   UInt8.writea  r!  r2   c                 &    UR                  U5        g r,   )writeUInt8Arrayr  s        r0   r   UInt8.writeArrayd  r%  r2   r   r,   r  r   r2   r0   r^  r^  X  r&  r2   r^  c                   (    \ rS rSrSrS rSS jrSrg)UInt24ih     c                 "    UR                  5       $ r,   
readUInt24r   s       r0   r   UInt24.readk  rC  r2   Nc                 &    UR                  U5        g r,   writeUInt24r   s         r0   r   UInt24.writen  rK  r2   r   r,   rU   r   r   r   r   r   r   r   r   r2   r0   rl  rl  h  s    J#"r2   rl  c                       \ rS rSrS rSrg)ComputedIntir  c                 \    Ub)  UR                  U< SU< 35        UR                  5         g g )N=)commentr   r   s         r0   r   ComputedInt.xmlWrites  s,    u56 r2   r   NrU   r   r   r   r   r   r   r2   r0   rx  rx  r  s     r2   rx  c                       \ rS rSrSrg)rJ   iy  r   NrU   r   r   r   r   r   r2   r0   rJ   rJ   y      r2   rJ   c                       \ rS rSrSrg)rK   i}  r   Nr  r   r2   r0   rK   rK   }  r  r2   rK   c                       \ rS rSrSrg)rL   i  r   Nr  r   r2   r0   rL   rL     r  r2   rL   c                   (    \ rS rSrSrS rSS jrSrg)Tagi  r   c                 "    UR                  5       $ r,   )readTagr   s       r0   r   Tag.read  s    ~~r2   Nc                 &    UR                  U5        g r,   )writeTagr   s         r0   r   	Tag.write  s    r2   r   r,   rv  r   r2   r0   r  r    s    J r2   r  c                   8    \ rS rSrSrSrS rS rS rS
S jr	S	r
g)GlyphIDi  r0  Hc                 n    UR                  UR                  U R                  U R                  U5      5      $ r,   )getGlyphNameManyr   typecoder   r  s        r0   r   GlyphID.readArray  s/    $$T]]DOOUC
 	
r2   c                 l    UR                  UR                  U R                  U R                  5      5      $ r,   )getGlyphName	readValuer  r   r   s       r0   r   GlyphID.read  s(      !1!1$--!QRRr2   c                 Z    UR                  U R                  UR                  U5      5        g r,   )r   r  getGlyphIDManyr  s        r0   r   GlyphID.writeArray  s!    $--)<)<V)DEr2   Nc                 Z    UR                  U R                  UR                  U5      5        g r,   )
writeValuer  
getGlyphIDr   s         r0   r   GlyphID.write  s    $--)?@r2   r   r,   )rU   r   r   r   r   r  r   r   r   r   r   r   r2   r0   r  r    s#    JH

SFAr2   r  c                       \ rS rSrSrSrSrg)	GlyphID32i  r   Lr   N)rU   r   r   r   r   r  r   r   r2   r0   r  r    s    JHr2   r  c                       \ rS rSrS rSrg)NameIDi  c                 f   UR                  XESU4/-   5        U(       a  U(       a|  UR                  S5      nU(       ad  UR                  U5      nUR                  S5        U(       a  UR	                  U5        O)UR	                  S5        [
        R                  SU-  5        UR                  5         g )Nr   r]     zmissing from name tablez"name id %d missing from name table)r   rR   getDebugNamer   r{  logwarningr   )r   r   r   r   r]   r   	nameTables          r0   r   NameID.xmlWrite  s    DGU+;*<"<=E(I --e4%%%d+%%&?@KK Du LMr2   r   Nr}  r   r2   r0   r  r    s    r2   r  c                       \ rS rSrS rSrg)	STATFlagsi  c                 2   UR                  XESU4/-   5        / nUS-  (       a  UR                  S5        US-  (       a  UR                  S5        U(       a1  UR                  S5        UR                  SR	                  U5      5        UR                  5         g )Nr   r   OlderSiblingFontAttributer0  ElidableAxisValueNamer   )r   rW   r   r{  joinr   r   r   r   r   r]   r   flagss          r0   r   STATFlags.xmlWrite  s{    DGU+;*<"<=4<LL454<LL01OOD!chhuo.r2   r   Nr}  r   r2   r0   r  r    s    
r2   r  c                   $    \ rS rSr\S 5       rSrg)
FloatValuei  c                     [        U 5      $ r,   )floatr   s    r0   r   FloatValue.fromString      U|r2   r   Nr   r   r2   r0   r  r    s     r2   r  c                   (    \ rS rSrSrS rSS jrSrg)
DeciPointsi  r0  c                 (    UR                  5       S-  $ N
   r@  r   s       r0   r   DeciPoints.read  s      "R''r2   Nc                 >    UR                  [        US-  5      5        g r  )rI  roundr   s         r0   r   DeciPoints.write  s    5,-r2   r   r,   rv  r   r2   r0   r  r    s    J(.r2   r  c                   t    \ rS rSr\r\r\r\rS r	S
S jr
\S 5       r\S 5       r\S 5       r\S 5       rS	rg)BaseFixedValuei  c                 T    U R                  [        XR                  5      " 5       5      $ r,   )fromIntgetattrreaderMethodr   s       r0   r   BaseFixedValue.read  s    ||GF,=,=>@AAr2   Nc                 X    [        XR                  5      " U R                  U5      5        g r,   )r  writerMethodtoIntr   s         r0   r   BaseFixedValue.write  s    ))*4::e+<=r2   c                 ,    [        XR                  5      $ r,   )fi2flprecisionBitsrd   r   s     r0   r  BaseFixedValue.fromInt      U--..r2   c                 ,    [        XR                  5      $ r,   )fl2fir  r  s     r0   r  BaseFixedValue.toInt  r  r2   c                 ,    [        XR                  5      $ r,   )str2flr  r  s     r0   r   BaseFixedValue.fromString      e..//r2   c                 ,    [        XR                  5      $ r,   )fl2strr  r  s     r0   r   BaseFixedValue.toString  r  r2   r   r,   )rU   r   r   r   r   r   r  r  r  r   r   classmethodr  r  r   r   r   r   r2   r0   r  r    sq    J"M!L!LB> / / / / 0 0 0 0r2   r  c                   $    \ rS rSrSrSrSrSrSrg)Fixedi  r      r   r  r   N	rU   r   r   r   r   r  r  r  r   r   r2   r0   r  r    s    JMLLr2   r  c                   $    \ rS rSrSrSrSrSrSrg)F2Dot14i  r0     r2  r8  r   Nr  r   r2   r0   r  r    s    JMLLr2   r  c                   p   ^  \ rS rSrSrSr\U 4S j5       r\U 4S j5       r\S 5       r	\S 5       r
SrU =r$ )	Anglei   g        g     ?c                 B   > [         TU ]  U5      U R                  -   S-  $ N   )superr  biasrd   r   	__class__s     r0   r  Angle.fromInt  s     &1S88r2   c                 B   > [         TU ]  US-  U R                  -
  5      $ r  )r  r  r  r  s     r0   r  Angle.toInt
  s    w}eckSXX566r2   c                 ^    [        [        U5      U R                  -  5      U R                  -  $ r,   )r   r  factorr  s     r0   r   Angle.fromString  s%     uU|cjj01CJJ>>r2   c                 ,    [        XR                  5      $ r,   )r
   r  r  s     r0   r   Angle.toString  s    *5**==r2   r   )rU   r   r   r   r  r  r  r  r  r   r   r   __classcell__r  s   @r0   r  r     s]     D"F9 9 7 7 ? ? > >r2   r  c                       \ rS rSrSrSrg)BiasedAnglei  g      ?r   N)rU   r   r   r   r  r   r   r2   r0   r  r    s	     Dr2   r  c                   X    \ rS rSrSrS rS
S jr\S 5       r\S 5       r	\S 5       r
S	rg)Versioni  r   c                 &    UR                  5       nU$ r,   r   )r   r   r   r   r   s        r0   r   Version.read!  s    !r2   Nc                 <    [        U5      nUR                  U5        g r,   )fi2ver  r   s         r0   r   Version.write%  s    er2   c                     [        U 5      $ r,   )ve2fir   s    r0   r   Version.fromString)  r  r2   c                     SU -  $ )N0x%08xr   r   s    r0   r   Version.toString-  r+  r2   c                     [        U S5      $ )Nr  )r  )vs    r0   	fromFloatVersion.fromFloat1  s    Q|r2   r   r,   )rU   r   r   r   r   r   r   r   r   r   r	  r   r   r2   r0   r  r    sM    J         r2   r  c                   ,    \ rS rSrSrSrS rSS jrSrg)	Char64i6  zAn ASCII string with up to 64 characters.

Unused character positions are filled with 0x00 bytes.
Used in Apple AAT fonts in the `gcid` table.
@   c                     UR                  U R                  5      nUR                  S5      nUS:  a  US U n[        USSS9nU[        USSS9:w  a  [        R                  SU-  5        U$ )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   r  r  )r   r   r   r   datazeroPosss          r0   r   Char64.read?  sj    t/))E"a<>D$;dWX>>KK?!CDr2   Nc                 @   [        USSS9nU[        USSS9:w  a  [        R                  SU-  5        [        U5      U R                  :  a#  [        R                  SX@R                  4-  5        USU R                  -  -   S U R                   nUR                  U5        g )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   r  r  lenr   	writeData)r   r   r   r   r   r   r  s          r0   r   Char64.writeI  s    uwyA7578DDKK@5HIt9t&KK6%9QQ ut..0A$//Br2   r   r,   )	rU   r   r   r   r   r   r   r   r   r   r2   r0   r  r  6  s     J	r2   r  c                   <    \ rS rSrS rS rS
S jrS rS rS r	S	r
g)rO   iU  c                 ^    U R                   =(       a    U R                   R                  U5      $ r,   )rQ   r   r   s     r0   r   Struct.getRecordSizeV  s     H4??#@#@#HHr2   c                 H    U R                  5       nUR                  X5        U$ r,   )rQ   	decompile)r   r   r   r   tables        r0   r   Struct.readY  s    !%r2   Nc                 &    UR                  X5        g r,   )r{   r   s         r0   r   Struct.write^  s    f#r2   c                     Uc.  U(       a&  UR                  XES/-   5        UR                  5         g g UR                  XXTS9  g )N)emptyr   )r]   )r   r   toXMLr   s         r0   r   Struct.xmlWritea  s@    = ##D<.*@A!!#KK	K:r2   c                    SU;   a  [        US   5      (       a  g U R                  5       nUR                  S5      nUb  [        U5      Ul        [        US5      (       + nU(       a  SnUR                  5        H  nUR                  (       d  M  Sn[        US5      (       d  0 Ul        UR                  n	UR                  U	;  d   UR                  U	45       e[        XHR                  S 5        [        UR                  UR                  5      XR                  '   M     U H1  n
[        U
[        5      (       a  U
u  pnUR                  XX#5        M1  M3     UR!                  [#        USS 5      S9  U(       aT  W(       aM  UR                  5        H9  nUR                  (       d  M  UR                  n	XR                  	 U	(       a  M7  U?M;     U$ )Nr*  FormatpostReadFT_propagator)
propagator)r   rQ   rR   r   r.  r   getConvertersr~   r0  r]   setattrr   __dict__r-   r.   fromXMLpopulateDefaultsr  )r   r   r   r   r%  r.  
noPostReadcleanPropagationrc   r1  elementr]   s               r0   r   Struct.xmlReadn  s   ew 8 8!8$v;EL 
33
$++-$$$'+$"477+-(!%!1!1J99J6OJ8OO6E99d3,:5>>499,UJyy) . G'5))'.$Wd79  	'$t*LM!//1D(((%)%5%5
&yy1)z $ 0 2 r2   c                 2    S[        U R                  5      -   $ )Nz
Struct of )reprrQ   )r   s    r0   __repr__Struct.__repr__  s    d4??333r2   r   r,   )rU   r   r   r   r   r   r   r   r   r=  r   r   r2   r0   rO   rO   U  s"    I
$;(T4r2   rO   c                   $    \ rS rSrS rSS jrSrg)rM   i  c                     UR                   nU R                  5       nUR                  X5        UR                  XER                  -   5        U$ r,   )r   rQ   r$  r   r7   )r   r   r   r   r   r%  s         r0   r   StructWithLength.read  s=    jj!%C,,,-r2   Nc                 ,   [        UR                  5       5       H  u  pgUR                  S:X  d  M    O   [        UR                  5      W-   n[        U[        5      (       a  US-  nSSSS.WR                     n	UR                  5       n
Xl	        UR                  X5        UR                  5       U
-
  nUR                  5       nUR                  XX;5        UR                  U   SS UR                   :X  d   eUR                  5       UR                  U'   g )Nr7   r      i     >[= )r   r0  r      ޭ)r   r2  r]   r  itemsr-   r   r   getDataLengthr7   r{   getSubWriterr   
getAllData)r   r   r   r   r   r   	convIndexrc   lengthIndexdeadbeefbeforelengthlengthWriters                r0   r   StructWithLength.write  s    ()<)<)>?OIyyN*  @ &,,')3e5661K:6tG%%'%f#%%'&0**,

<y9||K(,?@Q$//,RRRR$0$;$;$=[!r2   r   r,   rU   r   r   r   r   r   r   r   r2   r0   rM   rM     s    >r2   rM   c                   4    \ rS rSrSrS rS rS rS	S jrSr	g)
rT   i  r0  c                 "    UR                  5       $ r,   r@  r   s     r0   
readOffsetTable.readOffset  rC  r2   c                 &    UR                  S5        g r   rH  r   r   s     r0   writeNullOffsetTable.writeNullOffset      1r2   c                     U R                  U5      nUS:X  a  g U R                  5       nUR                  U5      nUR                  (       a  Xl        X%l        U$ UR                  X5        U$ r   )rT  rQ   getSubReaderr   r   r   r$  )r   r   r   r   offsetr%  s         r0   r   
Table.read  sa    (Q;!$$V,99!LJ  OOF)r2   Nc                     Uc  U R                  U5        g UR                  5       nU R                  Ul        Ub  XVl        UR	                  X`R
                  S9  UR                  Xb5        g )N
offsetSize)rX  rH  r]   r   writeSubTabler   r{   )r   r   r   r   r   r   	subWriters          r0   r   Table.write  s[    =  (++-I!YYIN&(3%   GMM)*r2   r   r,   )
rU   r   r   r   r   rT  rX  r   r   r   r   r2   r0   rT   rT     s    J#	+r2   rT   c                   $    \ rS rSrSrS rS rSrg)LTablei  r   c                 "    UR                  5       $ r,   r  r   s     r0   rT  LTable.readOffset  r  r2   c                 &    UR                  S5        g r   r  rW  s     r0   rX  LTable.writeNullOffset  s    !r2   r   NrU   r   r   r   r   rT  rX  r   r   r2   r0   rf  rf    s    J"r2   rf  c                   $    \ rS rSrSrS rS rSrg)Table24i  rm  c                 "    UR                  5       $ r,   ro  r   s     r0   rT  Table24.readOffset  rC  r2   c                 &    UR                  S5        g r   rs  rW  s     r0   rX  Table24.writeNullOffset  rZ  r2   r   Nrk  r   r2   r0   rm  rm    s    J#r2   rm  c                   .   ^  \ rS rSrS rU 4S jrSrU =r$ )r=   i  c                     U R                   U   U   nU R                  U R                  U R                  U R                  U5      $ r,   r   r  r]   r^   r_   r   	tableType
lookupTyperQ   s       r0   getConverterSubStruct.getConverter  8    %%i0<
~~diidhh
KKr2   c                 2   > [         [        U ]  XUS U5        g r,   )r  r=   r   r   r   r   r   r]   r   r  s         r0   r   SubStruct.xmlWrite  s    i'	eLr2   r   rU   r   r   r   rx  r   r   r  r  s   @r0   r=   r=     s    LM Mr2   r=   c                   .   ^  \ rS rSrS rU 4S jrSrU =r$ )r;   i  c                     U R                   U   U   nU R                  U R                  U R                  U R                  U5      $ r,   rt  ru  s       r0   rx  SubTable.getConverter  rz  r2   c                 2   > [         [        U ]  XUS U5        g r,   )r  r;   r   r|  s         r0   r   SubTable.xmlWrite  s    h&ytUKr2   r   r~  r  s   @r0   r;   r;     s    LL Lr2   r;   c                       \ rS rSrSS jrSrg)r<   i  Nc                 @    SUl         [        R                  XX#XE5        g )NT)	ExtensionrT   r   r   s         r0   r   ExtSubTable.write  s    D$5Fr2   r   r,   )rU   r   r   r   r   r   r   r2   r0   r<   r<     s    Gr2   r<   c                       \ rS rSrS rSrg)r>   i	  c                     U R                   R                  XR                  5      nU R                  U R                  U R
                  U R                  U5      $ r,   )rG   rR   rV   r  r]   r^   r_   )r   
featureTagrQ   s      r0   rx  FeatureParams.getConverter
  s?    ++//
<U<UV
~~diidhh
KKr2   r   N)rU   r   r   r   rx  r   r   r2   r0   r>   r>   	  s    Lr2   r>   c                   :    \ rS rSrSrS
SS.S jjrS rS
S jrS	rg)r4   i  r0  Nri   rB   c          	      X    [         R                  XX#XES9  SUS   S:X  a  SOS-   U l        g )NrB   r4   21)rg   r   whichr   s         r0   r   ValueFormat.__init__  s6    Z 	 	
 #T"X_c#F
r2   c                 T    UR                  5       n[        U5      XR                  '   U$ r,   )rA  r   r  r   r   r   r   formats        r0   r   ValueFormat.read  s&    ""$/7zzr2   c                 T    UR                  U5        [        U5      XR                  '   g r,   )rI  r   r  )r   r   r   r   r  r   s         r0   r   ValueFormat.write  s!    6"/7zzr2   )r  r,   )	rU   r   r   r   r   r   r   r   r   r   r2   r0   r4   r4     s    JG" G
8r2   r4   c                   6    \ rS rSrS rS rS	S jrS rS rSr	g)
ValueRecordi"  c                 6    S[        XR                     5      -  $ Nr0  )r  r  r   s     r0   r   ValueRecord.getRecordSize#  s    3vjj)***r2   c                 <    XR                      R                  X5      $ r,   )r  readValueRecordr   s       r0   r   ValueRecord.read&  s    jj!11&??r2   Nc                 @    XR                      R                  XU5        g r,   )r  writeValueRecordr   s         r0   r   ValueRecord.write)  s    zz++F%@r2   c                 F    Uc  g UR                  XU R                  U5        g r,   )r+  r]   r   s         r0   r   ValueRecord.xmlWrite,  s    =KK	E:r2   c                 F    SSK Jn  U" 5       nUR                  S XU5        U$ )Nr   )r  )otBaser  r5  )r   r   r   r   r  r   s         r0   r   ValueRecord.xmlRead2  s!    'dED1r2   r   r,   )
rU   r   r   r   r   r   r   r   r   r   r   r2   r0   r  r  "  s    +@A;r2   r  c                       \ rS rSrSrSS.S jrS rSS jr\S	 5       r	S
 r
S rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)	AATLookupi:  r  ri   rB   c          	          [         R                  XX#XES9  [        U R                  [        5      (       a  U R                  SS S S9U l        g [        SS S U R                  S9U l        g )NrB   Value)r]   r^   r_   )r]   r^   r_   rQ   )rg   r   
issubclassrQ   r   	converterrT   r   s         r0   r   AATLookup.__init__=  s^    Z 	 	
 doo{33!__'$D_QDN"TtDNr2   c                    UR                  5       nUS:X  a  U R                  X5      $ US:X  a  U R                  X5      $ US:X  a  U R                  X5      $ US:X  a  U R	                  X5      $ US:X  a  U R                  X5      $  SU-  5       e)Nr   r0  r      r   zunsupported lookup format: %d)rA  readFormat0readFormat2readFormat4readFormat6readFormat8r  s        r0   r   AATLookup.readH  s    ""$Q;##F11q[##F11q[##F11q[##F11q[##F11B9FBB5r2   Nc                    [        [        UR                  5        VVs/ s H  u  pgUR                  U5      U4PM     snn5      5      n[        [        [	        S U R                  XU5      U R                  XU5      U R                  XU5      U R                  XU5      /5      5      5      n	U	S   u  pnUR                  5       nU" 5         UR                  5       U-
  nX:X  d   SUU
U4-  5       eg s  snnf )Nr   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
listsortedrF  r  filterbuildFormat0buildFormat2buildFormat6buildFormat8rG  )r   r   r   r   r   r   glyphvalrS   formatsdataSizelookupFormatwriteMethodr   
actualSizes                  r0   r   AATLookup.writeW  s   EKKMRMjeT__U+S1MRS
 ))&?))&?))&?))&?	

 /6aj+""$))+c1
"	
HL
 
	
"/ Ss   C0c                     U R                  U5        U R                  U5        [        XS9u  p4nU R                  U5        U R                  U5        U R                  U5        g )N)nitemSize)rI  r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShifts         r0   writeBinSearchHeaderAATLookup.writeBinSearchHeaderw  s\    8$8$1?2
.J 	;'=):&r2   c                    ^ ^^^ [        TR                  5       5      n[        T5      U:w  a  g T R                  R                  nSXE-  -   SUU UU4S j4$ )Nr0  r   c                  *   > TR                  TT T5      $ r,   )writeFormat0r   r   rS   r   s   r0   r1   (AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF;r2   )r  getGlyphOrderr  r   )r   r   r   rS   	numGlyphs	valueSizes   ````  r0   r  AATLookup.buildFormat0  sO    **,-	v;)#NN--		%%;
 	
r2   c           	      t    UR                  S5        U H!  u  pEU R                  R                  XS US S9  M#     g )Nr   r   r   r   )rI  r  r   )r   r   r   rS   glyphID_r   s         r0   r  AATLookup.writeFormat0  s<    1%OHNN  Et !   &r2   c                 @  ^ ^^^ US   u  pEUn/ mUSS   H.  u  pxXvS-   :w  d  X:w  a  TR                  XFU45        U=pFUnM,  UnM0     TR                  XFU45        T R                  R                  n	[        T5      S-   U	S-   pST R                  -   X-  -   SUUU U4S j4$ )Nr   r   r   r0  c                  *   > TR                  TT T5      $ r,   )writeFormat2)r   segmentsr   r   s   r0   r1   (AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH=r2   )rW   r  r   r  BIN_SEARCH_HEADER_SIZE)r   r   r   rS   segStartsegValuesegEndglyphIDcurValuer  r  r  r  s   ```         @r0   r  AATLookup.buildFormat2  s    #AY!'G1*$(<8 <=$++#  ", 	845NN--	 ]Q.	A(+++h.AA=
 	
r2   c           	         UR                  S5        U R                  R                  n[        U5      US-   peU R	                  XU5        U HD  u  pxn	UR                  U5        UR                  U5        U R                  R                  XS U	S S9  MF     UR                  S5        UR                  S5        UR                  SU-  5        g )Nr0  r   r    r  rI  r  r   r  r  r   r  )
r   r   r   r  r  r  r  
firstGlyph	lastGlyphr   s
             r0   r  AATLookup.writeFormat2  s    1NN--	 ]IM(!!&H=,4(J5y)z*NN  Et !  -5 	6"6"9,-r2   c                    ^ ^^^ T R                   R                  n[        T5      US-   peST R                  -   US-   U-  -   SUU UU4S j4$ )Nr0  r   r  c                  *   > TR                  TT T5      $ r,   )writeFormat6r  s   r0   r1   (AATLookup.buildFormat6.<locals>.<lambda>  r  r2   )r  r   r  r  )r   r   r   rS   r  r  r  s   ````   r0   r  AATLookup.buildFormat6  sM    NN--	 [)a-(+++x!|x.GG;
 	
r2   c           	      N   UR                  S5        U R                  R                  n[        U5      US-   peU R	                  XU5        U H2  u  pxUR                  U5        U R                  R                  XS US S9  M4     UR                  S5        UR                  SU-  5        g )Nr  r0  r  r  r  r  )	r   r   r   rS   r  r  r  r  r   s	            r0   r  AATLookup.writeFormat6  s    1NN--	 [)a-(!!&H=$NGw'NN  Et !  %
 	6"9,-r2   c                    ^ ^^^ TS   S   TS   S   pT[        T5      XT-
  S-   :w  a  g T R                  R                  nS[        T5      U-  -   SUU UU4S j4$ )Nr   r  r   r  r   c                  *   > TR                  TT T5      $ r,   )writeFormat8r  s   r0   r1   (AATLookup.buildFormat8.<locals>.<lambda>  r  r2   )r  r  r   )r   r   r   rS   
minGlyphID
maxGlyphIDr  s   ````   r0   r  AATLookup.buildFormat8  sa    !'1vbz!}Jv;*1A55NN--	Fi'';
 	
r2   c           	          US   S   nUR                  S5        UR                  U5        UR                  [        U5      5        U H!  u  pVU R                  R                  XS US S9  M#     g )Nr   r   r  )rI  r  r  r   )r   r   r   rS   firstGlyphID_r   s          r0   r  AATLookup.writeFormat8  si    ay|1<(3v;'HANN  Et !  r2   c                     [        UR                  5       5      nU R                  R                  XS US9n[	        U5       VVs0 s H  u  pVUR                  U5      U_M     snn$ s  snnf Nr   r   )r  r  r  r   r   r  )r   r   r   r  r  kr   s          r0   r  AATLookup.readFormat0  s^    **,-	~~''I'V<EdOLO!!!$e+OLLLs   A%c                    0 nUR                   S-
  nUR                  5       UR                  5       peUSU R                  R                  -   :  d   U5       e[	        U5       H  nUR                  XGU-  -   S-   5        UR                  5       nUR                  5       n	U R                  R                  XS S9n
US:w  d  M^  [	        XS-   5       H  nXUR                  U5      '   M     M     U$ )Nr0  r      r   r  r   r   rA  r  r   r   r   r   r  )r   r   r   mappingr   r  r  r   lastfirstr   r  s               r0   r  AATLookup.readFormat2  s    jj1n#..0&2C2C2E(1t~~8888B(B8xAKK(l*R/0$$&D%%'ENN'''EEv~uQh/A49D--a01 0 ! r2   c                    0 nUR                   S-
  nUR                  5       nUS:  d   U5       e[        UR                  5       5       H  nUR                  XFU-  -   S-   5        UR                  5       nUR                  5       nUR                  5       n	US:w  d  MT  UR	                  S5      n
U
R                  XI-   5        U R
                  R                  XS Xx-
  S-   S9n[        U5       H  u  pXUR                  X-   5      '   M     M     U$ )Nr0  r  r
  r  r   r   r  )	r   rA  r   r   r\  r  r   r   r  )r   r   r   r  r   r  r   r  r  r]  
dataReaderr  r  r  s                 r0   r  AATLookup.readFormat4  s   jj1n$$&1}&h&}v((*+AKK(l*R/0$$&D%%'E&&(Fv~#003
-~~//DL1<L 0  &dODA<=D--ei89 , , r2   c                    0 nUR                   S-
  nUR                  5       nUSU R                  R                  -   :  d   U5       e[	        UR                  5       5       Ha  nUR                  XFU-  -   S-   5        UR                  5       nU R                  R                  XS S9nUS:w  d  MN  XUR                  U5      '   Mc     U$ )Nr0  r
  r  r  r  )	r   r   r   r  r   r  r   r  r   s	            r0   r  AATLookup.readFormat6
  s    jj1n$$&1t~~8888B(B8v((*+AKK(l*R/0'')GNN'''EE& 6;))'23 , r2   c                     UR                  5       nUR                  5       nU R                  R                  XS US9n[        U5       VVs0 s H  u  pgUR	                  X6-   5      U_M     snn$ s  snnf r  )rA  r  r   r   r  )r   r   r   r  r   r  r  r   s           r0   r  AATLookup.readFormat8  sj    !!#!!#~~''E'RFOPToVo
!!%),e3oVVVs   
 A.c                     0 nU HH  n[        U[        5      (       d  M  Uu  pgnUS:X  d  M'  U R                  R                  XxU5      XGS   '   MJ     U$ )NLookupr  )r-   r.   r  r   )	r   r   r   r   r   r9  r]   a
eltContents	            r0   r   AATLookup.xmlRead  sT    G'5))&-#8#(,(>(>qd(SEG*%	 
 r2   c           	      
   UR                  XE5        UR                  5         [        UR                  5       5       H$  u  pcU R                  R                  XUSSU4/S9  M&     UR                  U5        UR                  5         g )Nr  r  )r   r]   r   )begintagr   r  rF  r  r   endtag)r   r   r   r   r]   r   r  s          r0   r   AATLookup.xmlWrite&  sw    4'"5;;=1LENN##u8WeDTCU $  2 	r2   )r  r,   )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   r2   r0   r  r  :  s}    EG 	C
@ ' '	

(.
.	
M
(Wr2   r  c                   0    \ rS rSrS rSS jrS rS rSrg)	AATLookupWithDataOffseti8  c                 V   UR                  5       nUR                  5       nUR                  U5      n[        SS S [        5      nUR	                  XbU5      n0 n	UR                  5        H=  u  pUR                  X-   5      nU R                  5       nUR                  X5        XU
'   M?     U	$ NDataOffsets)r  r\  r  r>  r   rF  rQ   r$  )r   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultr  r]  r  items                 r0   r   AATLookupWithDataOffset.read9  s    '')%%'
**<8=$f=++l)<$]]_ME,,V-@AJ??$DNN:, 5M	 -
 r2   Nc                     0 0 Spn/ n	[        XBR                  S9 Hq  n
[        5       nXJ   R                  X5        UR	                  5       nUR                  US 5      nUS :X  a%  UnU[        U5      -   nXU'   U	R                  U5        XU
'   Ms     UR                  5       n[        SS S [        5      nUR                  XX6S 5        UR                  5       nUR                  USS9  UR                  USS9  U	 H  nUR                  U5        M     g )Nr   )keyr%  r   r`  )r  r  r   r{   rI  rR   r  rW   rH  r  r>  r   rb  r  )r   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatar  rc  r  r]  lookupWriterr)  
dataWriterds                     r0   r   AATLookupWithDataOffset.writeG  s    022qWE7E%IL  1'')D!%%dD1F~ !CI-%+T"##D)#)%  8 **,=$f=\4H((*
\a8ZA6A  # r2   c                 V    [        SS S U R                  5      nUR                  XU5      $ r$  )r  rQ   r   )r   r   r   r   r)  s        r0   r   AATLookupWithDataOffset.xmlReadj  s'    =$dooF~~ed33r2   c                 Z    [        SS S U R                  5      nUR                  XX4U5        g r$  )r  rQ   r   )r   r   r   r   r]   r   r)  s          r0   r    AATLookupWithDataOffset.xmlWriten  s&    =$dooF	e<r2   r   r,   	rU   r   r   r   r   r   r   r   r   r   r2   r0   r"  r"  8  s    !$F4=r2   r"  c                       \ rS rSrSSSSS.r\R                  5        V VVs0 s H  u  pX!_M	     snnn rSSS	.S
 jjrS rS r	S r
S rSS jrSrgs  snnn f )MorxSubtableConverteris  LayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTNri   rB   c          	      .    [         R                  XX#XES9  g NrB   )rg   r   r   s         r0   r   MorxSubtableConverter.__init__~  s    Z 	 	
r2   c                 V    US-  S:w  a  SUl         g US-  S:w  a  SUl         g SUl         g )N    r   Any   Vertical
Horizontal)TextDirection)r   r  subtables      r0   "_setTextDirectionFromCoverageFlags8MorxSubtableConverter._setTextDirectionFromCoverageFlags  s2    DLQ%*H"dlq %/H"%1H"r2   c                 z   UR                   n[        5       nUR                  5       Ul        UR	                  5       nUS-  S:g  US-  S:g  4nU R
                  U   Ul        U R                  Xe5        UR                  5       Ul	        U=R                  US-  S-  -  sl	        UR	                  5       Ul
        UR                  5       Ul        [        S   R                  UR                  5      nUc   SUR                  -  5       eUR                   U-
  n	UR                  UR                   UR                   UR                  -   U	-
   n
[        U
5      UR                  U	-
  :X  d   e[!        XR"                  S9nU" 5       Ul        UR$                  R'                  X5        UR)                  XER                  -   5        U$ )Nr  r   r     morxz!unsupported 'morx' lookup type %s)r  tableTag)r   r"   r  r7   r`  _PROCESSING_ORDERSProcessingOrderrO  rA  Reservedr8   SubFeatureFlagsr   rR   r  r  r   rT  r=   r$  r   )r   r   r   r   r   r   r  orderKeyrQ   headerLengthr  	subReaders               r0   r   MorxSubtableConverter.read  sz   jjN))+  "T\a'%$,1)<= 33H=//9&&(
	

us{r))
&&(",,. (,,Q[[9
K=KK5 zzC'{{6::

Q^^(Cl(RS4yANN\9999!tooF	 l	i.C..()r2   c                    UR                  XE5        UR                  5         UR                  SUR                  -  5        UR                  5         UR	                  SUR
                  S9  UR                  5         UR	                  SUR                  S9  UR                  5         UR                  S:w  a-  UR	                  SSUR                  -  S9  UR                  5         UR                  SUR                  -  5        UR                  5         UR	                  S	S
UR                  -  S9  UR                  5         UR                  R                  X5        UR                  U5        UR                  5         g )NzStructLength=%drM  r   rV  r   rW  z0x%04xzMorphType=%drX  r  )r  r   r{  r7   r   rM  rV  rW  r8   rX  r=   r+  r  r   s         r0   r   MorxSubtableConverter.xmlWrite  s;   4'+e.@.@@AO53F3FG-U5J5JK>>Q
(U^^2KL.5??:;-X@U@U5UVi.r2   c                    [        5       nSnSUl        [        [        U5       GH-  u  pgnUS:X  aE  [	        US   5      nUS-  S:g  US-  S:g  4n	U R
                  U	   Ul        U R                  XT5        MR  US:X  a:  US   Ul        UR                  U R                  ;   d   SUR                  -  5       eM  US:X  a0  US   Ul	        UR                  S	;   d   S
UR                  -  5       eM  US:X  a  [	        US   5      Ul        M  US:X  a  [	        US   5      Ul
        M  UR                  S5      (       a  UR                  XgX5        GM)   U5       e   US-  S-  UR                  -  Ul        U$ )Nr   CoverageFlagsr   r  r  rV  zunknown ProcessingOrder: %srM  >   rI  rK  rL  zunknown TextDirection %srW  rX  MorphrR  )r"   rW  r  istupler   rU  rV  rO  _PROCESSING_ORDERS_REVERSEDrM  rX  rI   r5  )
r   r   r   r   r   covFlagseltNameeltAttrsr  rY  s
             r0   r   MorxSubtableConverter.xmlRead  s   N
-3GW-E)Gz/)#HW$56%_2X_4JK$($;$;H$E!77D--$,W$5!((D,L,LL 1A4E4EEL O+"*7"3*KK .@K J&%hw&78
--$,Xg->$?!!!'**		'Z>%g%u1 .F2 n+ajj8
r2   c                 T   UR                   S-  S-	  nU R                  UR                     u  pxXdR                  S:X  a  SOS-  nXg(       a  SOS-  nXdR                  S:X  a  SOS-  nXh(       a  SOS-  nXdl        [        UR                  5      n	UR                  5       n
S	Ul        UR                   nUR                   S
-  Ul         UR                  X5        Xl         UR                  U	   S:X  d   eUR                  5       U
-
  n[        R                  " SU5      UR                  U	'   g )Ni   r  rK  rJ  r   r  rI  rH  rD  r  rE  z>L)rW  rc  rV  rM  r`  r  rF  rG  r7   r{   structpack)r   r   r   r   r   r   rd  reverseOrderlogicalOrderrK  rM  origReservedrN  s                r0   r   MorxSubtableConverter.write  s   NNZ/B6%)%E%E!!&
" 	//:=D1DLDa///58Da?LDa/&&,,'%%'' ~~&0f#%||K(,????%%'&0$*KKf$=[!r2   r   r,   )rU   r   r   r   rU  rF  rc  r   rO  r   r   r   r   r   )r   r/  r  s   000r0   r>  r>  s  sl     &,%, =O<T<T<V"W<V38<V"W
" 

26(@>} #Xs   Ar>  c                       \ rS rSrSS.S jrS rS rS rS rS	 r	SS jr
S rS rS rS rS rS rS rS rS rS rSrg
)	STXHeaderi  ri   rB   c          	         [         R                  XX#XES9  [        U R                  [        5      (       d   e[        SS S [        5      U l        [        U R                  [        5      (       a  [        SS S [        5      U l
        g S U l
        g )NrB   GlyphClassesPerGlyphLookup)rg   r   r  rQ   r   r  r>  classLookupr   r  perGlyphLookupr   s         r0   r   STXHeader.__init__  sv    Z 	 	
 $//95555$^T4Hdoo'<=="+,<dD'"RD"&Dr2   c                    [        5       nUR                  nUR                  S5      nUR                  S5      nUR                  S5      nS n	S n
UR                  5       Ul        UR                  XQR                  5       -   5        UR                  XQR                  5       -   5        UR                  XQR                  5       -   5        U R                  b2  UR                  S5      nUR                  XQR                  5       -   5        [        U R                  [        5      (       a  UR                  S5      n	U	R                  XQR                  5       -   5        UR                  S5      nUR                  XQR                  5       -   5        UR                  S5      n
U
R                  XQR                  5       -   5        U
R                  UR                  -
  S-  nUS:  d   eUR                  U5      Ul        U R                  X5      Ul        OQ[        U R                  [        5      (       a2  UR                  S5      n	U	R                  XQR                  5       -   5        U R                  R!                  XbU5      Ul        [%        UR                  UR                  -
  UR                  S-  -  5      n['        U5       Ht  n[)        5       nUR*                  R-                  U5        ['        UR                  5       H3  nUR/                  5       nU R1                  UUX)5      UR2                  U'   M5     Mv     U R                  b  U R5                  UWU5      Ul        U$ )Nr   r0  )r   r   r\  r  GlyphClassCountr   ru  r  rQ   r    rE  LigComponents_readLigatures	Ligaturesr!   rt  r   rr  r   r   r   StatesrW   rA  _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r   r   r   r   r%  r   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexs                      r0   r   STXHeader.read   s   jj!..q1!..q1!..q1 & 0 0 2c$4$4$667c$4$4$667c$4$4$667*"("5"5a"8$$S+;+;+=%=>doo':;;!..q1Lc$4$4$667!'!4!4Q!7##C*:*:*<$<=$11!4O  '7'7'9!9: / 3 36H6L6L LQRR#q((("4"D"DEU"VE"11/HEO)=>>!..q1Lc$4$4$667!--223C9U!!$4$8$88U=R=RUV=VW
	  	*JJELL&#E$9$9:
-88:
040D0D$j$1!!*- ; + *$($=$=*D%E! r2   c                     U R                  5       nUR                  UR                  X%R                  -  -   5      nUR	                  XcU5        U$ r,   )rQ   r\  r   r   r$  )r   r   r  r   r  
transitionentryReaders          r0   r}  STXHeader._readTransition/  sK    __&
))JJ&;&;;;
 	[=r2   c                     [        UR                  5      nX1R                  -
  S-  nUR                  UR	                  U5      5      $ r  )r  r  r   r  rE  )r   r   r   limitnumLigatureGlyphss        r0   rz  STXHeader._readLigatures7  s?    FKK "ZZ/A5$$V%;%;<M%NOOr2   c                 D   SnUR                    H  nUR                  R                  5        Hl  n[        U[        5      (       d  M  UR
                  S:w  a  [        X$R
                  S-   5      nUR                  S:w  d  MT  [        X$R                  S-   5      nMn     M     U$ )Nr   r  r   )r|  r~  rS   r-   r   	MarkIndexmaxCurrentIndex)r   r%  
numLookupsr  r/   s        r0   _countPerGlyphLookupsSTXHeader._countPerGlyphLookups<  s    
 
\\E&&--/a!677{{f,%([[1_%E
~~/%(^^a5G%H
 0 " r2   c                    UR                   n/ n[        U R                  U5      5       H`  nUR                  S5      nUR	                  XBR                  5       -   5        UR                  U R                  R                  Xs0 5      5        Mb     U$ r   )	r   r   r  r\  r   r  rW   ru  r   )r   r%  r   r   r   lookupsr  r(  s           r0   r  STXHeader._readPerGlyphLookupsK  sz    jjt11%89A!..q1Lc$4$4$667NN4..33LKL : r2   Nc                 \   [        5       nU R                  R                  XbX4R                  S S9  [	        UR                  5       S5      n[        UR                  R                  5       5      S-   nSn	U R                  b  U	S-  n	XR                  R                  -  n	U R                  R                  X$R                  5      u  pU R                  X$R                  X5      u  pU	[        U5      -   nU[        U5      -   nU[        U5      -   n[	        U R                  XB5      S5      nU
b  U[        U5      -   nOS nSu  nnU R!                  XB5      nU R#                  XB5      nUb-  [        U5      S:X  d   eU[        U
5      -   nU[        U5      -   nUR%                  U5        UR%                  U	5        UR%                  U5        UR%                  U5        U R                  b  UR%                  U5        Ub  UR%                  U5        Ub"  UR%                  U5        UR%                  U5        UR'                  U5        UR'                  U5        UR'                  U5        UR'                  U5        U
b  UR'                  U
5        Ub  UR'                  U5        Ub  UR'                  U5        g g )N)r   r0  r   r  r   )NNr   )r   rt  r   rr  r   rI  r  rS   ru  rQ   actionHeaderSizecompileActionsr|  _compileStatesr  _compilePerGlyphLookups_compileLigComponents_compileLigaturesr  r  )r   r   r   r   r   r   glyphClassWriterglyphClassDataglyphClassCountglyphClassTableOffset
actionDataactionIndexstateArrayDataentryTableDatastateArrayOffsetentryTableOffsetperGlyphOffsetperGlyphDataactionOffsetligaturesOffsetligComponentsOffsetligComponentsDataligaturesDatas                          r0   r   STXHeader.writeT  s   (?I/A/At 	 	
 -88:A>e00779:Q> "*!Q&!!A!AA"&//"@"@||"T
)-)<)<,,*
& 13~3FF+c..AA)C,??477DaH!+c..AALL/9,, 66uC..u;(|$)))".Z"@1C8I4JJO/*/0*+*+*n-#l+*12o.(((&!Z((./$]+ %r2   c           	      :   [        5       n/ 0 pvU H  n[        U5       H  n	UR                  U	   n
[        5       nU
R                  XU5        UR	                  5       n[        U5      U
R                  :X  d)   S[        U
5      U
R                  [        U5      4-  5       eUR                  U5      nUc   [        U5      nXU'   UR                  U5        UR                  U5        M     M     [        UR	                  5       S5      n[        [        U5      S5      nX4$ )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r~  r{   rI  r  r   r<  rR   rW   rI  r   r   )r   r   statesr  r  stateArrayWriterentriesentryIDsr  r  r  entryWriter	entryDatar  r  r  s                   r0   r  STXHeader._compileStates  s   (?E#O4
"..z:
+o"";kB'224		Nj&;&;;I$))	NM ; &\\)4
%!$WJ*4Y'NN9- ,,Z8# 5 & -88:A>Yw/3--r2   c                    U R                   c  gU R                  U5      n[        UR                  5      U:X  d   S[        UR                  5      U4-  5       e[	        5       nUR                   HA  nUR                  5       nU R                   R                  Xb0 US 5        UR                  USS9  MC     UR                  5       $ )Nr2   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   r`  )	ru  r  r  r  r   rH  r   rb  rI  )r   r%  r   r  r   r)  r4  s          r0   r  !STXHeader._compilePerGlyphLookups  s    &//6
5(()Z7 	
;5(():67	
7
 ++F!..0L%%l"fdK  ! < ,   ""r2   c                     [        US5      (       d  g [        5       nUR                   H  nUR                  U5        M     UR	                  5       $ )Nry  )r   r   ry  rI  rI  )r   r%  r   r   	components        r0   r  STXHeader._compileLigComponents  sF    uo..,,Iy) -  ""r2   c                     [        US5      (       d  g [        5       nUR                   H#  nUR                  UR	                  U5      5        M%     UR                  5       $ )Nr{  )r   r   r{  rI  r  rI  )r   r%  r   r   	glyphNames        r0   r  STXHeader._compileLigatures  sM    uk**Ity9: )  ""r2   c           	      D   UR                  XE5        UR                  5         UR                  SUR                  -  5        UR                  5         [	        UR
                  R                  5       5       H%  u  pgUR                  SXgS9  UR                  5         M'     [        UR                  5       H  u  pUR                  SUS9  UR                  5         [	        U	R                  R                  5       5       H  u  pUR                  UUSU
0SS9  M     UR                  S5        UR                  5         M     [        UR                  5       H  u  pUR                  S	US9  UR                  5         [	        UR                  5       5       H%  u  pUR                  S
XS9  UR                  5         M'     UR                  S	5        UR                  5         M     [        US5      (       a  UR                  S5        UR                  5         [        [        US5      5       H%  u  pUR                  SXS9  UR                  5         M'     UR                  S5        UR                  5         U R!                  XX4U5        UR                  U5        UR                  5         g )NzGlyphClassCount=%s
GlyphClassr  r   State)indexonGlyphClass
Transition)r   r   r]   rs  r  ry  LigComponent)r  r   )r  r   r{  rx  r  rr  rF  r   r   r|  r~  r+  r  r  r   r  _xmlWriteLigatures)r   r   r   r   r]   r   gklassr  r  r  transr   r)  r  r  s                   r0   r   STXHeader.xmlWrite  sM   4'.1F1FFGu11779:HAAC ; "+5<<!8Jwj9%+E,=,=,C,C,E%F!
):6%	   &G W% "9 #5#8#89IA/q9$V\\^4
##HE#E!!# 5 -. : 5/**/#GE?$CD##N!#G!!# E _-	eDr2   c                 (   [        US5      (       d  g UR                  S5        UR                  5         [        [	        US5      5       H%  u  pgUR                  SXgS9  UR                  5         M'     UR                  S5        UR                  5         g )Nr{  Ligature)r  r  )r   r  r   r   r  r   r  )r   r   r   r   r]   r   r   r  s           r0   r  STXHeader._xmlWriteLigatures  s    uk**;'ge[9:DA
!= ; 	%r2   c                 \   [        5       n[        [        U5       H  u  pVnUS:X  a$  US   nUS   n	[        U	5      UR                  U'   M0  US:X  a/  U R                  XgU5      n
UR                  R                  U
5        Me  US:X  a9  U R                  R                  XgU5      nUR                  R                  U5        M  US:X  a  U R                  XgU5      Ul        M  US:X  d  M  U R                  XgU5      Ul        M     [        UR                  R!                  5       5      S-   Ul        U$ )	Nr  r  r   r  rs  ry  r{  r   )r   r  rb  r   rr  _xmlReadStater|  rW   ru  r   r  _xmlReadLigComponentsry  _xmlReadLigaturesr{  r  rS   rx  )r   r   r   r   r%  re  rf  r  r  r   r  r)  s               r0   r   STXHeader.xmlRead  s   -3GW-E)Gz,& ) ),4UO""5)G#**8F##E*,,,,44X4P%%,,V4O+&*&@&@$'# K'"&"8"8t"T! .F" !$E$6$6$=$=$? @1 Dr2   c                     [        5       n[        [        U5       HL  u  pVnUS:X  d  M  [        US   5      nU R	                  5       n	U	R                  XVXs5        XR                  U'   MN     U$ )Nr  r  )r   r  rb  r   rQ   r5  r~  )
r   r   r   r   r  re  rf  r  r  r  s
             r0   r  STXHeader._xmlReadState  sh    
-3GW-E)Gz,&%h~&>?
!__.
""7jG0:!!*- .F r2   c                     / n[        [        U5       H+  u  pVnUS:X  d  M  UR                  [        US   5      5        M-     U$ )Nr  r   )r  rb  rW   r   )r   r   r   r   ligComponentsre  rf  _eltContents           r0   r  STXHeader._xmlReadLigComponents  sF    .4Wg.F*G{.($$Xhw.?%@A /G r2   c                 v    / n[        [        U5       H"  u  pVnUS:X  d  M  UR                  US   5        M$     U$ )Nr  r  )r  rb  rW   )r   r   r   r   ligsre  rf  r  s           r0   r  STXHeader._xmlReadLigatures  s>    .4Wg.F*G{*$HW-. /G r2   )rt  ru  r,   )rU   r   r   r   r   r   r}  rz  r  r  r   r  r  r  r  r   r  r   r  r  r  r   r   r2   r0   rp  rp    s^    EG 	'-^P
5,n.4# ##&P	,r2   rp  c                   0    \ rS rSrS rSS jrS rS rSrg)	CIDGlyphMapi'  c                     UR                  5       n0 n[        UR                  U5      5       H   u  pgUS:w  d  M  UR                  U5      XV'   M"     U$ )Nr  )rA  r   rE  r  )r   r   r   r   numCIDsr+  cidr  s           r0   r   CIDGlyphMap.read(  sS    ##%%f&<&<W&EFLC& "//8 G r2   Nc                 ,   UR                  5        VVs0 s H  u  pgXbR                  U5      _M     nnnU(       a  [        U5      S-   OSn	UR                  U	5        [	        U	5       H$  nUR                  UR                  US5      5        M&     g s  snnf )Nr   r   r  rF  r  r  rI  r   rR   )
r   r   r   r   r   r   r  r  rF  r   s
             r0   r   CIDGlyphMap.write0  sv    ?D{{}M}ooe,,}M"'E
QQ5!<Cuyyf56   Ns   Bc                     0 n[        [        U5       H0  u  pVnUS:X  d  M  US   R                  5       U[        US   5      '   M2     U$ )NCIDr  r  )r  rb  stripr   r   r   r   r   r+  eNameeAttrs	_eContents           r0   r   CIDGlyphMap.xmlRead7  sL    (.w(@$E9~28/2G2G2Ixu./ )A r2   c                 &   UR                  XE5        UR                  5         [        UR                  5       5       H2  u  pgUc  M
  US:w  d  M  UR	                  SXgS9  UR                  5         M4     UR                  U5        UR                  5         g )Nr  r  )r  r  r  r   r  rF  r   r  )r   r   r   r   r]   r   r  r  s           r0   r   CIDGlyphMap.xmlWrite>  sz    4' /JC Uf_##Es#@!!# 0 	r2   r   r,   r<  r   r2   r0   r  r  '  s    7r2   r  c                   0    \ rS rSrS rSS jrS rS rSrg)	GlyphCIDMapiI  c                 P   UR                  5       nUR                  5       nUR                  U5      nU[        U5      :  a#  [        R                  SU[        U5      4-  5        0 n[        [        [        U5      [        U5      5      5       H  nXh   n	U	S:w  d  M  XXH   '   M     U$ )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr  )r  rA  rE  r  r  r  r   min)
r   r   r   r   
glyphOrderr   cidsr+  r  r  s
             r0   r   GlyphCIDMap.readJ  s    '')
!!#%%e,3z?"KK$',c*o&>?
 STC
O<=G-Cf}.1z*+ > r2   Nc                 H   UR                  5        VVs0 s H$  u  pgUc  M
  US:w  d  M  UR                  U5      U_M&     nnnU(       a  [        U5      S-   OSn	UR                  U	5        [	        U	5       H$  n
UR                  UR                  U
S5      5        M&     g s  snnf )Nr  r   r   r  )r   r   r   r   r   r   r  r  rF  r   r  s              r0   r   GlyphCIDMap.write[  s      ++-
' $#&&= $DOOA#' 	 

 #(E
QQ5!U|Guyy&9: $
s   	BBBc                 t    0 n[        [        U5       H!  u  pVnUS:X  d  M  [        US   5      XFS   '   M#     U$ )Nr  r   r  )r  rb  r   r  s           r0   r   GlyphCIDMap.xmlReadf  sA    (.w(@$E9~*26'?*Cg' )A r2   c                 &   UR                  XE5        UR                  5         [        UR                  5       5       H2  u  pgUc  M
  US:w  d  M  UR	                  SXgS9  UR                  5         M4     UR                  U5        UR                  5         g )Nr  r  r  r  )r   r   r   r   r]   r   r  r  s           r0   r   GlyphCIDMap.xmlWritem  sy    4' /JE3&=##E#B!!# 0 	r2   r   r,   r<  r   r2   r0   r  r  I  s    "	;r2   r  c                   0    \ rS rSrS rSS jrS rS rSrg)	
DeltaValueix  c                 4   US   nUS   nUS   nUS;   d   S5       eXT-
  S-   nSU-  nSU-  n	SU-  S-
  n
SUS-
  -  n/ nSu  p[        U5       HE  nUS:X  a  UR                  5       S	pX-
  nX-	  U
-  nUU-  (       a  UU	-
  nUR                  U5        MG     U$ )
N	StartSizeEndSizeDeltaFormatr   r0  rm  illegal DeltaFormatr   )r   r   r   r  )r   rA  rW   )r   r   r   r   r  r  r  nItemsnBitsminusOffsetmasksignMaskr
  tmpshiftr   r   s                    r0   r   DeltaValue.ready  s    k*	I&.i'>)>>'$q([ 5jU
a#

vAz#..0"UME\T)Ex+e$  r2   Nc                 *   US   nUS   nUS   nUn	US;   d   S5       eXv-
  S-   n
SU-  n[        U	5      U
:X  d   eSU-  S-
  nSu  pU	 H.  nX-
  nXU-  U-  -  nUS:X  d  M  UR                  U5        Su  pM0     US	:w  a  UR                  U5        g g )
Nr  r  r  r  r  r   )r   r  r   r  )r  rI  )r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r  s                  r0   r   DeltaValue.write  s    k*	I&.
i'>)>>'$q([ :&(((U
a
EME$,501Cz""3'"
U   B;s# r2   c                 R    UR                  XESU4/-   5        UR                  5         g r   r   r   r   s         r0   r   DeltaValue.xmlWrite  )    DGU+;*<"<=r2   c                     [        US   5      $ r   r   r   s       r0   r   DeltaValue.xmlRead      g''r2   r   r,   	rU   r   r   r   r   r   r   r   r   r   r2   r0   r
  r
  x  s    .$*(r2   r
  c                   $    \ rS rSrS rSS jrSrg)VarIdxMapValuei  c                    US   nUS   nSUS-  -   nSU-  S-
  nSU-
  nSU-
  n	SUS-  S-	  -   n
UR                   UR                  UR                  UR                  S	.U
   nU" U5       Vs/ s H  nX-  U	-  X-  -  PM     sn$ s  snf )
NEntryFormatrs   r   rR  l    r  0   r   r   r0  rm  r   rc  rE  readUInt24Arrayr  )r   r   r   r   fmtr  	innerBits	innerMask	outerMask
outerShift	entrySizer   raws                r0   r   VarIdxMapValue.read  s    &>*v&	)^q(	*	)^
#,1,-	$$%%%%$$	

 	 !(
( :-#/B(
 	
 
s   ,BNc                 B   US   nUnUS   R                  [        U5      5        SUS-  -   nSU-  S-
  n	SU-
  n
SUS-  S-	  -   nUR                  UR                  UR                  UR
                  S.U   nU" U Vs/ s H  nUS	-  U
-	  X-  -  PM     sn5        g s  snf )
Nr'  rs   r   rR  r  r(  r   r)  l      )setValuer  ri  rM  writeUInt24Arrayr#  )r   r   r   r   r   r   r,  r  r-  r.  r0  r1  r   idxs                 r0   r   VarIdxMapValue.write  s    &~''G5v&	)^q(	)^
#,1,-	%%&&&&%%	

 
 	 #"C #
2sG"	
s   =Br   r,   rQ  r   r2   r0   r%  r%    s    
,
r2   r%  c                   0    \ rS rSrS rSS jrS rS rSrg)	VarDataValuei  c                 L   / nUS   nUS   n[        US-  5      nUS-  nU(       a  UR                  UR                  pOUR                  UR                  p[	        XV5      [        XV5      pUR                  U" U
5      5        UR                  U	" X-
  5      5        X:  a  XES 2	 U$ )Nrr   	NumShorts     )boolr  r5  rU  r  r  extend)r   r   r   r   rS   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r0   r   VarDataValue.read  s     01k*	 V+,	&	+1+?+?AVAV.+1+@+@&BVBV.[,c+.IBl2&'nRW-.|$r2   Nc                 8   US   nUS   n[        US-  5      nUS-  nUR                  UR                  4UR                  UR                  4S.U   u  p[	        Xg5      [        Xg5      pU	" US U 5        U
" XKU 5        X:  a  UR                  S/X-
  -  5        g g )Nrr   r<  r=  r>  rC  r   )r?  r;  r[  r  r  r  writeSmallArray)r   r   r   r   rS   r   rA  rB  rC  writeBigArrayrJ  rF  rG  s                r0   r   VarDataValue.write  s     01k*	 V+,	&	 **F,A,AB((&*@*@A,
 ,(
 [,c+.IBfSbk"+./""A3"*:#;< r2   c                 R    UR                  XESU4/-   5        UR                  5         g r   r  r   s         r0   r   VarDataValue.xmlWrite  r  r2   c                     [        US   5      $ r   r   r   s       r0   r   VarDataValue.xmlRead  r"  r2   r   r,   r#  r   r2   r0   r:  r:    s    .=&(r2   r:  c                   0    \ rS rSrS rSS jrS rS rSrg)	TupleValuesi  c                 6    [         R                  " S U5      S   $ r   )r	   decompileDeltas_)r   r  r   s      r0   r   TupleValues.read  s    ..tT:1==r2   Nc                 l    UR                   [           n[        [        R                  " XF(       + S95      $ )N)optimizeSize)cfgr   bytesr	   compileDeltaValues_)r   r   r   r   rS   r   optimizeSpeeds          r0   r   TupleValues.write  s/    !45..vDUV
 	
r2   c                     [        US   5      $ r   r   r   s       r0   r   TupleValues.xmlRead  r"  r2   c                 R    UR                  XESU4/-   5        UR                  5         g r   r  r   s         r0   r   TupleValues.xmlWrite  r  r2   r   r,   r<  r   r2   r0   rR  rR    s    >
(r2   rR  c                   H    \ rS rSr SSSSS.S jjrS rSS jrS rS	 rS
r	g)	CFF2Indexi"  Nri   )	itemClassitemConverterClassrC   c          	      h    [         R                  XX#XGS9  XPl        Ub  U" 5       U l        g S U l        g rE  )rg   r   
_itemClass
_converter)r   r]   r^   r_   rQ   rc  rd  rC   s           r0   r   CFF2Index.__init__#  sB     	Z 	 	
 $$6$B  	HL 	r2   c                   ^ ^^^^^ TR                  5       mTS:X  a  / $ TR                  5       mS mT" TT5      nTR                  SL=(       a    TS:  nU(       d  U" TS-   5      n/ nUR                  S5      nTR	                  US-
  5        U H  n	X::  d   eTR	                  X-
  5      n
T R
                  b0  T R                  5       nUR                  U
TTR                  5        Un
O)T R                  b  T R                  R                  U
T5      n
UR                  U
5        U	nM     U$ UUUUUU 4S jnU" 5       n[        U/T-  5      nU$ )Nr   c                 f    U R                   U R                  U R                  U R                  S.U   $ )Nr)  r*  )r   offSizes     r0   getReadArray$CFF2Index.read.<locals>.getReadArray<  s:    (())))((	
  r2   Fr   r   c                     >^^^^ T	R                  5       mT	R                  mTTS-   T-  -   S-
  mT" TT5      mUUUUUUU
4S jn U $ )Nr   c                 v  > T	R                  TU T-  -   5        T" S5      nT	R                  TUS   -   5        T	R                  US   US   -
  5      nT
R                  b1  T
R                  5       nUR                  UTT	R                  5        UnU$ T
R
                  b  T
R
                  R                  UT5      nU$ )Nr0  r   r   )r   r  rf  r$  
localStaterg  r   )r   r*  r,  objdata_posr   rk  
offset_posr   r   r   s       r0   r   8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemc  s    $$Z!g+%=>'lG$$X
%:;&//
WQZ0GHD2"oo/dD+2H2HI"  K 4#33D$?Kr2   r   )r   rr  rs  r   r   r   r   rl  rk  r   r   s    @@@@r0   r   %CFF2Index.read.<locals>.get_read_item]  sM    $kkm#ZZ
%g(==A(g>	    ! r2   )r  r`  r   popr  rf  r$  rp  rg  r   rW   r   )r   r   r   r   r   r   r*  rF  
lastOffsetr]  r,  rq  r   r   r   r   rl  rk  s   ```            @@@r0   r   CFF2Index.read6  sC     "A:I""$	 !1	yy%3%!)	*GE QJOOJN+!!+++v':;??.//+CMM$f.?.?@D__0??//d;DT"#
 " L! !, &I)u,-A Hr2   c                    UnUR                  [        U5      5        [        U5      (       d  g U R                  b!  U Vs/ s H  owR                  U5      PM     nnOGU R                  b:  [        U5       VVs/ s H"  u  pU R                  R                  XX7U5      PM$     nnnU Vs/ s H  n[        U5      PM     n	n[        [        U	SS95      n	U	S   n
U
S:  a  SOU
S:  a  SO	U
S:  a  SOS	nUR                  U5        UR                  UR                  UR                  UR                  S
.U   nU" U	5        U H  nUR                  U5        M     g s  snf s  snnf s  snf )Nr   )initialr     i   r0  i   rm  r   r)  )r  r  rf  r{   rg  r   r   r  r'   rf  ri  rM  r6  r#  r  )r   r   r   r   rS   r   rF  r,  r   r*  rw  rk  r   s                r0   r   CFF2Index.writez  sh   #e*%5zz??&49:ED\\$'EE:E__(  )//GA %%fIQG/  
 *//3t9/z'156R[
 E!  7*Z)5KQR 	
 	'" %%&&&&%%	

 
 	7DT" 5 ;
 0s   E7)E'E!c                     U R                   b%  U R                  5       nUR                  S XU5        U$ U R                  b  U R                  R                  XU5      $ [	        5       er,   )rf  r5  rg  r   r   )r   r   r   r   rq  s        r0   r   CFF2Index.xmlRead  sW    ??&//#CKKed3J__(??**54@@%''r2   c           
         U R                   b+  [        U5       H  u  pgUR                  XSU4/U5        M     g U R                  b8  [        U5       H(  u  pgU R                  R	                  XXtUSU4/-   5        M*     g [        5       e)Nr  )rf  r   r+  rg  r   r   )r   r   r   r   r]   r   r   r,  s           r0   r   CFF2Index.xmlWrite  s}    ??&$U+

9gq\NDA ,__($U+((T7A,1G ,
 &''r2   )rg  rf  r,   )
rU   r   r   r   r   r   r   r   r   r   r   r2   r0   rb  rb  "  s3     
 
&BH##J(
(r2   rb  c                       \ rS rSrS rSrg)
LookupFlagi  c                    UR                  XESU4/-   5        / nUS-  (       a  UR                  S5        US-  (       a  UR                  S5        US-  (       a  UR                  S5        US-  (       a  UR                  S	5        US
-  (       a  UR                  S5        US-  (       a  UR                  SUS-	  -  5        U(       a   UR                  SR                  U5      5        UR	                  5         g )Nr   r   rightToLeftr0  ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksr  useMarkFilteringSeti   zmarkAttachmentType[%i]r  )r   rW   r{  r  r   r  s          r0   r   LookupFlag.xmlWrite  s    DGU+;*<"<=4<LL'4<LL+,4<LL*+4<LL'4<LL./6>LL1UaZ@Achhuo.r2   r   Nr}  r   r2   r0   r  r    s    r2   r  c                   L   ^  \ rS rSr\rU 4S jr\S 5       r\S 5       r	Sr
U =r$ )
_UInt8Enumi  c                 B   > U R                  [        TU ]	  XU5      5      $ r,   )	enumClassr  r   )r   r   r   r   r  s       r0   r   _UInt8Enum.read  s    ~~egl6CDDr2   c                 J    [        U R                  UR                  5       5      $ r,   )r  r  upperr  s     r0   r   _UInt8Enum.fromString  s    s}}ekkm44r2   c                 T    U R                  U5      R                  R                  5       $ r,   )r  r]   lowerr  s     r0   r   _UInt8Enum.toString  s     }}U#((..00r2   r   )rU   r   r   r   r   r  r   r  r   r   r   r  r  s   @r0   r  r    s6    IE 5 5 1 1r2   r  c                       \ rS rSr\rSrg)r#   i  r   N)rU   r   r   r   _ExtendModer  r   r   r2   r0   r#   r#     s    Ir2   r#   c                       \ rS rSr\rSrg)r$   i  r   N)rU   r   r   r   _CompositeModer  r   r   r2   r0   r$   r$     s    Ir2   r$   int8int16int32r9   r5   uint24r:   char64ri  OffsetLOffsetOffset24	TupleList)rd  VarCompositeGlyphList)rc  c                     [        [        U S9$ N)rQ   )r(   r  Cs    r0   r1   r1         79;r2   c                     [        [        U S9$ r  )r(   r"  r  s    r0   r1   r1     s    1HUV)Wr2   c                     [        [        U S9$ r  )r(   rp  r  s    r0   r1   r1     r  r2   c                     [        [        U S9$ r  )r(   rT   r  s    r0   r1   r1     s    '%A6r2   c                     [        [        U S9$ r  )r(   rf  r  s    r0   r1   r1     s    76a8r2   c                     [        [        U S9$ r  )r(   rm  r  s    r0   r1   r1     s    WW;r2   )r  r  rD   rE   rF   r"   r  r"  rp  OffsetTo	LOffsetToLOffset24To)|fontTools.misc.fixedToolsr   r  r   r  r   r  r   r  r   r  r   r  %fontTools.ttLib.tables.TupleVariationr	   fontTools.misc.roundToolsr
   r   fontTools.misc.textToolsr   r   r   r   r   fontTools.misc.lazyToolsr   fontTools.ttLibr   r   r  r   r   r   r   r   otTablesr   r   r   r   r   r   r    r!   r"   r#   r  r$   r  r%   	itertoolsr&   r'   	functoolsr(   typesr)   r   ri  typingr*   logging	getLoggerrU   r  rb  re   objectrg   r   r   r   r   r  r(  r-  r/  r>  rP  r^  rl  rx  rJ   rK   rL   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rO   rM   rT   rf  rm  r=   r;   r<   r>   r4   r  r  r"  r>  rp  r  r  r
  r%  r:  rR  rb  r  r  rN   r   r2   r0   <module>r     s/    A J M M - ?     .  ! 	    !
(=(@eF eP/- /"K { &8 & 'H '  e  !}e !'H ' (X ( &8 & 'H ' "X " (  	K 		[& 		K 	+ Ak A& 
V    . .0Z 0:N  n  >G >0% k 0[ >D4] D4N>v >6+F +DU e M MLu LG&( GLE L8( 8&+ 0t t|8=m 8=v|>M |>Bp pf	- D,- ,^2( 2(j-
] -
`0(= 0(f $Q( Q(h *1 1 J 2
D2 U2 T	2
 U2 f2 f2 e2 f2 w2 2 w2 
32 w2 2  f!2" *#2$ U%2& w'2( U)2* ;+2, f-2. e/20 v122 324 ;526 *728 n92: L;2< *=2> *?2@ ]A2B C2D {CE2F WY:KLG2J !$!);W;68;c2 r2   