
     i              	       h   d dl mZ d dlmZmZ ddlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZ  ej        e          Zd	Z	 d dlZd
Zn# e$ r Y nw xY wee d         Z G d de          Z G d de          Z G d de          Z G d de          Z  e! e
j"        dd                     dk    sJ  e	j	        d          j#        dk    s
J d             G d de          Z$ G d de          Z% G d de          Z& G d de          Z'd Z(d  Z)d! Z*d" Z+ G d# d$e          Z, G d% d&e,          Z- G d' d(e-          Z.e-e.d)Z/d* Z0 e            d5d+e,d,ee1         d-ee2         fd.            Z3g d/Z4d0 Z5 e5            Z6 G d1 d2e          Z7 G d3 d4e          Z8dS )6    )OPTIONS)Tag	bytesjoin   )DefaultTable)IntEnumN)	lru_cache)Iterator
NamedTupleOptionalTupleFTz:USE_HARFBUZZ_REPACKERc                       e Zd Zd Zd ZdS )OverflowErrorRecordc                     |d         | _         |d         | _        |d         | _        |d         | _        |d         | _        d S )Nr   r            )	tableTypeLookupListIndexSubTableIndexitemName	itemIndex)selfoverflowTuples     g/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/fontTools/ttLib/tables/otBase.py__init__zOverflowErrorRecord.__init__   sD    &q),Q/*1-%a(&q)    c                 d    t          | j        d| j        d| j        d| j        d| j        f	          S )NzLookupIndex:zSubTableIndex:z	ItemName:z
ItemIndex:)strr   r   r   r   r   r   s    r   __repr__zOverflowErrorRecord.__repr__!   s@    $ "

 
 	
r   N)__name__
__module____qualname__r   r!    r   r   r   r      s2        * * *
 
 
 
 
r   r   c                       e Zd Zd Zd ZdS )OTLOffsetOverflowErrorc                     || _         d S Nvalue)r   overflowErrorRecords     r   r   zOTLOffsetOverflowError.__init__2   s    (


r   c                 *    t          | j                  S r)   )reprr+   r    s    r   __str__zOTLOffsetOverflowError.__str__5   s    DJr   N)r"   r#   r$   r   r/   r%   r   r   r'   r'   1   s2        ) ) )         r   r'   c                       e Zd ZdZdZdZdS )RepackerStater   r   r   N)r"   r#   r$   PURE_FTHB_FTFT_FALLBACKr%   r   r   r1   r1   9   s#         G E KKKr   r1   c                   D    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
dd
ZdS )BaseTTXConverterzGeneric base class for TTX table converters. It functions as an
    adapter between the TTX (ttLib actually) table model and the model
    we use for OpenType tables, which is necessarily subtly different.
    c                     ddl m} t          || j                  }t	          || j                  } |            | _        | j                            ||           dS )zFCreate an object from the binary data. Called automatically on access.r   otTablestableTagN) r9   OTTableReaderr;   getattrtable	decompile)r   datafontr9   reader
tableClasss         r   r@   zBaseTTXConverter.decompileT   sd    tdm<<<Xt}55
Z\\

VT*****r   c                    d}|j         t                   }| j        dv rc|du r!t                              d| j                   n>t
          s7|du rt          d          |J t                              d| j                   |dv rt
          r| j        dv rt          j        }nt          j	        }d}d}	 	 t          | j        	          }| j                            ||           |t          j        k    r|                     ||          S |t          j	        k    r|                     |          S |t          j        k    r;|                     |           t                              d
           t          j        }nt# t           $ rg}d}|                     |||          }	|j        }|	rY d}~|t          j        u r't                              d           t          j        }n Y d}~nd}~ww xY w>)z=Compiles the table into binary. Called automatically on save.N)GSUBGPOSFz>hb.repack disabled, compiling '%s' with pure-python serializerTzNo module named 'uharfbuzz'z?uharfbuzz not found, compiling '%s' with pure-python serializer)NTr:   zXRe-enabling sharing between extensions and switching back to harfbuzz+fontTools packing.zrHarfbuzz packing out of resolutions, disabling sharing between extensions and switching to fontTools only packing.)cfgUSE_HARFBUZZ_REPACKERr;   logdebughave_uharfbuzzImportErrorr1   r3   r2   OTTableWriterr?   compiletryPackingHarfbuzztryPackingFontToolsr4   r'   tryResolveOverflowr+   )
r   rB   overflowRecorduse_hb_repackstatehb_first_error_loggedlastOverflowRecordwritereoks
             r   rO   zBaseTTXConverter.compile]   sJ   .  !67=,,,%%		TM    $  D((%&CDDD(000IIY   \)) *!111!'EE!)E %!"	!&>>>
""64000M///226;PQQQm33333F;;;m777 ,,V444II6   */E)   (,%,,T16HII%&W" HHHHM///II?   *5EE EEEE'"	s,   4AE; 
$E; /AE; ;
G,"G',6G''G,c                    	 t                               d| j                   |                    | j                  S # t          t
          t          j        f$ ru}|sSt          |          j	         }t          |          dk    r|d| z  }t                               d| j        |           d}|                    d          cY d }~S d }~ww xY w)Nzserializing '%s' with hb.repackr<   z: z`hb.repack failed to serialize '%s', attempting fonttools resolutions ; the error message was: %sTF)remove_duplicate)rJ   rK   r;   getAllDataUsingHarfbuzz
ValueErrorMemoryErrorhbRepackerErrortyper"   r   warning
getAllData)r   rX   rV   rY   	error_msgs        r   rP   z#BaseTTXConverter.tryPackingHarfbuzz   s    	=II7GGG11$-@@@K)9: 	= 	= 	=
 ) 
-#Aww/1	q66R<<a)I2M	   )-%$$e$<<<<<<<<!	=s   9< CA*CCCc                 *    |                                 S r)   )rd   r   rX   s     r   rQ   z$BaseTTXConverter.tryPackingFontTools   s      """r   c                     d}||j         k    r|S |j         }t                              d|           |j        ddlm}  |||          }nddlm}  |||          }|r|S ddlm}  |||          S )Nr   z+Attempting to fix OTLOffsetOverflowError %sr   )fixLookupOverFlows)fixSubTableOverFlows)r+   rJ   infor   r9   ri   rj   )r   rB   rY   rW   rZ   rS   ri   rj   s           r   rR   z#BaseTTXConverter.tryResolveOverflow   s    ((I>BBB"*444444##D.99BB666666%%dN;;B 	I
 	100000!!$777r   c                 <    | j                             ||           d S r)   )r?   toXML2)r   rX   rB   s      r   toXMLzBaseTTXConverter.toXML   s     
&$'''''r   c                     ddl m} t          | d          s$t          || j                  } |            | _        | j                            ||||           | j                                         d S )Nr   r8   r?   )r<   r9   hasattrr>   r;   r?   fromXMLpopulateDefaults)r   nameattrscontentrB   r9   rD   s          r   rq   zBaseTTXConverter.fromXML   sz    tW%% 	& 4=99J#DJ
4666
##%%%%%r   Tc                 <    | j                             |           d S )N)recurse)r?   ensureDecompiled)r   rw   s     r   rx   z!BaseTTXConverter.ensureDecompiled   s!    
##G#44444r   NT)r"   r#   r$   __doc__r@   rO   rP   rQ   rR   rn   rq   rx   r%   r   r   r6   r6   N   s         
+ + +Y Y Yv= = =,# # #8 8 88( ( (& & &5 5 5 5 5 5r   r6   ir   z#Oops, file a bug against fonttools.c                       e Zd ZdZdZddZd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS ) r=   z5Helper class to retrieve data from an OpenType table.rA   offsetpos
localStater;   Nr   c                 L    || _         || _        || _        || _        || _        d S r)   r}   )r   rA   r   r~   r;   s        r   r   zOTTableReader.__init__  s)    	$ r   c                 &    | xj         |z  c_         d S r)   r   r   counts     r   advancezOTTableReader.advance  s    Er   c                     || _         d S r)   r   )r   r   s     r   seekzOTTableReader.seek  s    r   c                 v    |                      | j        | j        | j        | j                  }| j        |_        |S r)   )	__class__rA   r   r~   r;   r   r   others     r   copyzOTTableReader.copy  s/    ty$/4;VVH	r   c                 d    | j         |z   }|                     | j        | j        || j                  S r)   )r~   r   rA   r   r;   )r   r~   s     r   getSubReaderzOTTableReader.getSubReader  s,    v%~~di&$-PPPr   c                 z    | j         }||z   }t          j        d| | j        ||                   \  }|| _         |S N>r   structunpackrA   )r   typecode
staticSizer   newposr+   s         r   	readValuezOTTableReader.readValue  sC    hz!=X3v:1FGGr   c                     | j         }|||z  z   }t          j        || j        ||                   }t          j        dk    r|                                 || _         |                                S Nbig)r   arrayrA   sys	byteorderbyteswaptolist)r   r   r   r   r   r   r+   s          r   	readArrayzOTTableReader.readArray$  sf    huz))HdiF
&;<<=E!!NN||~~r   c                 0    |                      dd          S )Nbr   r   r   r    s    r   readInt8zOTTableReader.readInt8-      ~~ca~000r   c                 2    |                      dd|          S )Nr   r   r   r   r   r   s     r   readInt8ArrayzOTTableReader.readInt8Array0      ~~cau~===r   c                 0    |                      dd          S )Nhr   r   r   r    s    r   	readShortzOTTableReader.readShort3  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readShortArrayzOTTableReader.readShortArray6  r   r   c                 0    |                      dd          S )Nr{   r   r   r   r    s    r   readLongzOTTableReader.readLong9  r   r   c                 2    |                      dd|          S )Nr{   r   r   r   r   s     r   readLongArrayzOTTableReader.readLongArray<  r   r   c                 0    |                      dd          S )NBr   r   r   r    s    r   	readUInt8zOTTableReader.readUInt8?  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readUInt8ArrayzOTTableReader.readUInt8ArrayB  r   r   c                 0    |                      dd          S )NHr   r   r   r    s    r   
readUShortzOTTableReader.readUShortE  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readUShortArrayzOTTableReader.readUShortArrayH  r   r   c                 0    |                      dd          S )NIr   r   r   r    s    r   	readULongzOTTableReader.readULongK  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readULongArrayzOTTableReader.readULongArrayN  r   r   c                 z    | j         }|dz   }t          j        dd| j        ||         z             \  }|| _         |S )Nr   z>l    r   r   r   r   r+   s       r   
readUInt24zOTTableReader.readUInt24Q  sA    hq=utyV/D'DEEr   c                 :      fdt          |          D             S )Nc                 8    g | ]}                                 S r%   )r   ).0_r   s     r   
<listcomp>z1OTTableReader.readUInt24Array.<locals>.<listcomp>Y  s#    888a!!888r   )ranger   s   ` r   readUInt24ArrayzOTTableReader.readUInt24ArrayX  s#    88885<<8888r   c                     | j         }|dz   }t          | j        ||                   }t          |          dk    s
J |            || _         |S Nr   )r   r   rA   lenr   s       r   readTagzOTTableReader.readTag[  sO    hqDIc&j)**5zzQr   c                 J    | j         }||z   }| j        ||         }|| _         |S r)   )r   rA   )r   r   r   r   r+   s        r   readDatazOTTableReader.readDatac  s.    hu	#f*%r   c                 z    | j         r| j                                         nt                      }|||<   || _         d S r)   r   r   dictr   rs   r+   rU   s       r   __setitem__zOTTableReader.__setitem__j  9    *./E$$&&&tvvdr   c                 *    | j         o| j         |         S r)   r   r   rs   s     r   __getitem__zOTTableReader.__getitem__o  s    84?4#88r   c                 "    | j         o|| j         v S r)   r   r   s     r   __contains__zOTTableReader.__contains__r  s    :44?#::r   )Nr   N)r"   r#   r$   rz   	__slots__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r   r   r=   r=     s       ??CI! ! ! !      
Q Q Q    1 1 1> > >1 1 1> > >1 1 1> > >1 1 1> > >1 1 1> > >1 1 1> > >  9 9 9         
9 9 9; ; ; ; ;r   r=   c                        e Zd Zd Zd Zd ZdS )OffsetToWriterc                 "    || _         || _        d S r)   )	subWriter
offsetSizer   r   r   s      r   r   zOffsetToWriter.__init__w  s    "$r   c                     t          |           t          |          k    rt          S | j        |j        k    o| j        |j        k    S r)   )rb   NotImplementedr   r   r   s     r   __eq__zOffsetToWriter.__eq__{  s=    ::e$$!!~0XT_HX5XXr   c                 8    t          | j        | j        f          S r)   )hashr   r   r    s    r   __hash__zOffsetToWriter.__hash__  s    T^T_5666r   N)r"   r#   r$   r   r   r   r%   r   r   r   r   v  sD        % % %Y Y Y
7 7 7 7 7r   r   c                       e Zd ZdZd,dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd-dZd Zd Zd Zd.dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! Z d" Z!d# Z"d$ Z#d% Z$d& Z%d/d(Z&d) Z'd* Z(d+ Z)dS )0rN   z=Helper class to gather and assemble data for OpenType tables.Nc                 Z    g | _         d | _        || _        || _        d | _        d| _        d S )N<none>)itemsr   r   r;   parentrs   )r   r   r;   s      r   r   zOTTableWriter.__init__  s0    
$ 			r   c                 z    | j         r| j                                         nt                      }|||<   || _         d S r)   r   r   s       r   r   zOTTableWriter.__setitem__  r   r   c                     | j         |         S r)   r   r   s     r   r   zOTTableWriter.__getitem__  s    t$$r   c                     | j         |= d S r)   r   r   s     r   __delitem__zOTTableWriter.__delitem__  s    OD!!!r   c                     d}| j         D ]J}t          |d          r||j        z  }t          |d          r||j        z  }8|t	          |          z   }K|S )z<Return the length of this table in bytes, without subtables.r   getCountDatar   )r   rp   sizer   r   )r   litems      r   getDataLengthzOTTableWriter.getDataLength  sm    J 	" 	"Dt^,, "TY{++ "T_$D		Mr   c                 l   t          | j                  }| j        }t          |          }t	          |          D ]}||         }t          |d          r|j        dk    r t          |j        j        |z
            ||<   E|j        dk    r]	 t          |j        j        |z
            ||<   q# t          j        $ r* |                     |j                  }t          |          w xY w|j        dk    r t          |j        j        |z
            ||<   t          |j                  t!          |          S )z;Assemble the data for this writer/table, without subtables.r   r   r   r   )listr   r   r   r   rp   r   	packULongr   
packUShortr   errorgetOverflowErrorRecordr'   
packUInt24r^   r   )r   r   r   numItemsr{   r   r,   s          r   getDatazOTTableWriter.getData  sK   TZ  hu::x 	6 	6A8Dt[)) 6?a''();c)ABBE!HH_))J#-dn.@3.F#G#Ga!< J J J.2.I.I N/ /+ 55HIIIJ _)))$.*<s*BCCE!HH$T_555!6$ s   B++9C$c                 *   t          | j                  }t          t          t          d}t          |          D ]L\  }}t          |d          r7|j        |v r ||j                 d          ||<   8t          |j                  Mt          |          S )zFAssemble the data for this writer/table with all offset field set to 0)r   r   r   r   r   )
r   r   r  r  r  	enumeraterp   r   r^   r   )r   r   	packFuncsr{   r   s        r   getDataForHarfbuzzz OTTableWriter.getDataForHarfbuzz  s    TZ  "zi@@	 '' 	6 	6GAtt[)) 6?i//9y9!<<E!HH$T_5556 r   c                 *    t          | j                  S r)   )r   r   r    s    r   r   zOTTableWriter.__hash__  s    DJr   c                 H    |                      |          }|t          u r|n| S r)   r   r   r   r   results      r   __ne__zOTTableWriter.__ne__  )    U##>11vv6zAr   c                 p    t          |           t          |          k    rt          S | j        |j        k    S r)   )rb   r   r   r   s     r   r   zOTTableWriter.__eq__  s.    ::e$$!!zU[((r   Fc                    t          | d          }t          | d          }|r|si }| j        }t          |          D ]\  }}t          |d          r|                                ||<   -t          |d          rI|j                            ||           |s+|                    |j        |j                  ||         _        t          |          | _        d S )N	Extension	DontSharer   r   shareExtension)rp   r   r	  r   r   _doneWriting
setdefaulttuple)r   internedTablesr  isExtension	dontSharer   r{   r   s           r   r  zOTTableWriter._doneWriting  s     dK00 D+..	 	 ~ 	 N
 '' 	 	GAtt^,, ,,..a{++ ++"> ,    ! )7)B)B* *E!H& 5\\


r   c                 @   d|t          |           <   t          | j                  }t          t	          |                    }|                                 t          | d          }|}|r|
J d            |d i }}}d}t          | d          rt	          |          D ]=}	| j        |	         }
t          |
d          rt          |
j        dd           dk    rd} n>t          |
j                  |vr|
j        	                    |||           n	 |D ]v}	| j        |	         }
t          |
d          s |r!|	d	k    rt          |
j        dd           dk    rCt          |
j                  |vr|
j        	                    |||           vw|
                    |            d S )
NTr  zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastr   rs   Coverager   )idr   r   r   r   reverserp   r>   r   _gatherTablesappend)r   tables	extTablesdoner  iRanger  
selfTablesr   r{   r   s              r   r$  zOTTableWriter._gatherTables  s    RXXtz??eHoo&&dK00
 	:%%f &%%&/rtIF !4+,, 	8__  z!}D+..==KK'+$E$.!!--,,VYEEEE  	 	A:a=D4--  !!VVDNFD99ZGG $.!!--,,VYEEEE $r   c                    g }g }|}|D ]}	|                     dd|	f           d}
d}t          | d          rt          | j                  D ]u\  }}t	          |dd           dk    r[d}
t          |          |vr|                    |||||          x}}n|t          |                   }|                     |            nvd}d}t          | j                  D ]\  }}t          |d          r|}n.t          |d          r||j        z  }3|t          |          z   }Ft          |j	                  |vr!|j	                            |||||          x}}n|t          |j	                           }||j
        |f}|                     |           ||j
        z  }|                     |            |                     ||f           |d	z  }||t          |           <   |
r|                                 |S )
Nr   Fr   rs   r!  Tr   r   r   )r%  rp   r	  r   r>   r"  _gatherGraphForHarfbuzzr   r   r   r   pop)r   r&  obj_listr(  objidxvirtual_edges
real_linksvirtual_linksitem_idxidxr   coverage_idxr{   r   	child_idx
offset_posr   	real_edges                     r   r,  z%OTTableWriter._gatherGraphForHarfbuzzG  s\   
 ! 	. 	.C  !Q---- 4+,, 	$TZ00 
 
44..*<<'+$$xxt++262N2N"HdHm3 3 xx (,BtHH~!((666E = 	
 ,, 	* 	*GAtt[))  ~.. di'
'#d))3
$.!!--'+~'M'MHdHm( ( 	HH !DN!3!34	doy9Ii((($/)JJd]3444A!RXX 	 r   c                 j   i }|                      |d           g }g }i }d}g }|                     |||||           d}|D ] }	||	_        ||	                                z   }!g }
|D ]+}	|	                                }|
                    |           ,t          j        t          |          |
|          S )a  The Whole table is represented as a Graph.
        Assemble graph data and call Harfbuzz repacker to pack the table.
        Harfbuzz repacker is faster and retain as much sub-table sharing as possible, see also:
        https://github.com/harfbuzz/harfbuzz/blob/main/docs/repacker.md
        The input format for hb.repack() method is explained here:
        https://github.com/harfbuzz/uharfbuzz/blob/main/src/uharfbuzz/_harfbuzz.pyx#L1149
        Tr  r   )	r  r,  r   r   r  r%  r`   serialize_with_tagr   )r   r;   r  r&  r.  r(  r/  r0  r   r?   rA   	tableDatas               r   r]   z%OTTableWriter.getAllDataUsingHarfbuzz  s     .>>>$$VXtV]SSS  	. 	.EEI++---CC 	# 	#E0022IKK	""""$S]]D(CCCr   Tc                 (   |ri }|                      |           g }g }i }|                     |||           |                                 |                                 d}|D ] }||_        ||                                z   }!|D ] }||_        ||                                z   }!g }|D ]+}|                                }	|                    |	           ,|D ]+}|                                }	|                    |	           ,t          |          S )z+Assemble all data, including all subtables.r   )r  r$  r#  r   r   r  r%  r   )
r   r\   r  r&  r'  r(  r   r?   rA   r;  s
             r   rd   zOTTableWriter.getAllData  sB    	.Nn---	69d333  	. 	.EEI++---CC 	. 	.EEI++---CC 	# 	#EIKK	"""" 	# 	#EIKK	""""r   c                 T    |                      | j        | j                  }| |_        |S r)   )r   r   r;   r   )r   	subwriters     r   getSubWriterzOTTableWriter.getSubWriter  s,    NN4?DMBB	 	 r   c                 f    | j                             t          j        d| |                     d S r   r   r%  r   pack)r   r   r+   s      r   
writeValuezOTTableWriter.writeValue  s0    
&+n(nne<<=====r   c                     t          j         ||          }t          j        dk    r|                                 | j                            |                                           d S r   )r   r   r   r   r   r%  tobytes)r   r   valuesas       r   
writeArrayzOTTableWriter.writeArray  sQ    K&))=E!!JJLLL
!))++&&&&&r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Ni   z>brA  r   r+   s     r   	writeInt8zOTTableWriter.writeInt8  sW    u""""s"""""E"""
&+dE2233333r   c                 2    |                      d|           d S )Nr   rH  r   rF  s     r   writeInt8ArrayzOTTableWriter.writeInt8Array      V$$$$$r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Ni    z>hrA  rK  s     r   
writeShortzOTTableWriter.writeShort  sW    &&&&&&&&&&&&
&+dE2233333r   c                 2    |                      d|           d S )Nr   rN  rO  s     r   writeShortArrayzOTTableWriter.writeShortArray  rQ  r   c                 `    | j                             t          j        d|                     d S )Nz>irA  rK  s     r   	writeLongzOTTableWriter.writeLong  *    
&+dE2233333r   c                 2    |                      d|           d S )Nr{   rN  rO  s     r   writeLongArrayzOTTableWriter.writeLongArray  rQ  r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Nr      >BrA  rK  s     r   
writeUInt8zOTTableWriter.writeUInt8  sW    EC
&+dE2233333r   c                 2    |                      d|           d S )Nr   rN  rO  s     r   writeUInt8ArrayzOTTableWriter.writeUInt8Array  rQ  r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Nr   i   >HrA  rK  s     r   writeUShortzOTTableWriter.writeUShort  sW    E####G#####U###
&+dE2233333r   c                 2    |                      d|           d S )Nr   rN  rO  s     r   writeUShortArrayzOTTableWriter.writeUShortArray  rQ  r   c                 `    | j                             t          j        d|                     d S )N>IrA  rK  s     r   
writeULongzOTTableWriter.writeULong  rY  r   c                 2    |                      d|           d S )Nr   rN  rO  s     r   writeULongArrayzOTTableWriter.writeULongArray  rQ  r   c                     d|cxk    rdk     sn J |            t          j        d|          }| j                            |dd                     d S )Nr      z>Lr   r   rB  r   r%  )r   r+   r   s      r   writeUInt24zOTTableWriter.writeUInt24  sd    E%%%%I%%%%%u%%%Ke$$
!ABB%     r   c                 :    |D ]}|                      |           d S r)   )ro  )r   rF  r+   s      r   writeUInt24ArrayzOTTableWriter.writeUInt24Array  s2     	$ 	$EU####	$ 	$r   c                     t          |                                          }t          |          dk    s
J |            | j                            |           d S r   )r   rE  r   r   r%  )r   tags     r   writeTagzOTTableWriter.writeTag  sN    #hh  3xx1}}}c}}}
#r   c                 V    | j                             t          ||                     d S r)   )r   r%  r   r   s      r   writeSubTablezOTTableWriter.writeSubTable
  s(    
.J??@@@@@r   r   c                 `    t          ||||          }| j                            |           |S )N)r   r+   )CountReferencer   r%  )r   r?   rs   r   r+   refs         r   writeCountReferencez!OTTableWriter.writeCountReference  s3    UDt5AAA
#
r   c                 ^    t          j        |f|z    }| j                            |           d S r)   rn  )r   formatrF  rA   s       r   writeStructzOTTableWriter.writeStruct  s1    {VI./
$r   c                 :    | j                             |           d S r)   )r   r%  )r   rA   s     r   	writeDatazOTTableWriter.writeData  s    
$r   c                    d x}x}x}}| j         dk    r	|j        }n%| j         dk    r| j        }|j        }n
t          |dd          }t          |d          r|j        }| j         dk    r| j        j        }| j        }n| j         dk    r| j        j        j        }| j        j        }nd                    | j         |g          }| j        }|r7|j         d	vr.d                    |j         |g          }|j        }|r	|j         d	v.|r<|j         dk    r|j        j        j        }|j        j        }n|j        j        }|j        }t          | j        ||||f          S )
N
LookupListLookuprs   r   repeatIndexSubTableExtSubTable.)r  r  )rs   r  r>   rp   r   joinr   r;   )r   r   r   r   r   r   p1s          r   r  z$OTTableWriter.getOverflowErrorRecord  s   AEEE-E(Y9$$".OOY(""".O ,MMtVX66Ht]++ - ,	yJ&&"&+"9 $ 0m++"&+"4"@ $ 788TY$9::[ #RW,GGG"xx((;<<HB  #RW,GGG  7w-//*,)*:*F(*	(=*,)*?(*"]O]HiP
 
 	
r   NNFry   )r   N)*r"   r#   r$   rz   r   r   r   r   r   r  r  r   r  r   r  r$  r,  r]   rd   r?  rC  rH  rL  rP  rT  rV  rX  r[  r_  ra  rd  rf  ri  rk  ro  rq  rt  rv  rz  r}  r  r  r%   r   r   rN   rN     su       GG        
% % %" " "

 
 
     8          B B B) ) )
%" %" %" %"N>  >  > @7 7 7rD D D<   F  > > >' ' '4 4 4% % %4 4 4% % %4 4 4% % %4 4 4% % %4 4 4% % %4 4 4% % %! ! !
$ $ $  
A A A   
          !
 !
 !
 !
 !
r   rN   c                   ,    e Zd ZdZddZd Zd Zd ZdS )rx  z8A reference to a Count value, not a count of references.Nc                 b    || _         || _        || _        ||                     |           d S d S r)   )r?   rs   r   setValue)r   r?   rs   r   r+   s        r   r   zCountReference.__init__@  s=    
		MM%      r   c                 ~    | j         }| j        }||         |||<   d S ||         |k    sJ |||         |f            d S r)   r?   rs   )r   r+   r?   rs   s       r   r  zCountReference.setValueG  sU    
y;E$KKK;%'''$dU)C'''''r   c                 &    | j         | j                 S r)   r  r    s    r   getValuezCountReference.getValueO  s    z$)$$r   c                 ~    | j         | j                 }|d}t          t          t          d| j                 |          S )Nr   )r   r   r   )r?   rs   	packUInt8r  r  r   )r   vs     r   r   zCountReference.getCountDataR  s9    Jty!9A	::49EaHHHr   r  )r"   r#   r$   rz   r   r  r  r   r%   r   r   rx  rx  =  sc        BB! ! ! !D D D% % %I I I I Ir   rx  c                 ,    t          j        d|           S )Nr^  r   rB  r*   s    r   r  r  Y      ;tU###r   c                 ,    t          j        d|           S )Nrc  r  r*   s    r   r  r  ]  r  r   c                 ^    d| cxk    rdk     sn J |             t          j        d|           S )Nr   l        rh  r  r*   s    r   r  r  a  sA    #########U###;tU###r   c                 n    d| cxk    rdk     sn J |             t          j        d|           dd          S )Nr   rm  rh  r   r  r*   s    r   r  r  f  sJ    !!!!	!!!!!5!!!;tU##ABB''r   c                       e Zd ZdZd ZddZd Zed             Zd Z	d Z
dd
Zd Zd Zd Zd ZddZd Zd Zd Zd Z G d de          Zdee         fdZd Zd	S )	BaseTablez0Generic base class for all OpenType (sub)tables.c                     | j                             d          }|r1| `| j        }| `|                     ||           t          | |          S t          |          NrC   )__dict__getrC   rB   r@   r>   AttributeError)r   attrrC   rB   s       r   __getattr__zBaseTable.__getattr__n  sb    ""8,, 	'9D	NN64(((4&&&T"""r   Fc                     | j                             d          }|r!| `| j        }| `|                     ||           |r1|                                 D ]}|j                            |           d S d S r  )r  r  rC   rB   r@   iterSubTablesr+   rx   )r   rw   rC   rB   subtables        r   rx   zBaseTable.ensureDecompiledy  s    ""8,, 	)9D	NN64((( 	9 ..00 9 9//8888	9 	99 9r   c                     d| j         v r=| j                                         }| j         d                                         |d<   |S | j         S r  )r  r   )r   rU   s     r   __getstate__zBaseTable.__getstate__  sM     t}$$M&&((E"mH5::<<E(OL}r   c                     d}| j         D ]b}|                    |          }|t          u r	t          c S d}|j        r(|j        |v r||j                 |j        z   }n	t          c S |||z  z  }c|S )Nr   r   )
convertersgetRecordSizer   repeataux)clsrC   	totalSizeconvr   
countValues         r   r  zBaseTable.getRecordSize  s    	N 
	+ 
	+D%%f--D~%%%%%%J{ *;&((!'!4tx!?JJ))))
**IIr   c                     | j         S r)   )r  r    s    r   getConverterszBaseTable.getConverters  s
    r   c                     | j         |         S r)   )convertersByNamer   s     r   getConverterByNamezBaseTable.getConverterByName  s    $T**r   Nc                    |                                  D ]W}|j        rt          | |j                  st	          | |j        g            t          t          | |j                            |j        z
  }	 |                     |j                  }t	          | |j        |           # t          $ r. |r)|j        |v r ||j                 
                    |           Y w xY w|j        rt          |j        d | j                  st          | |j                  rt          |d          rt	          | |j        d            t          |d          rt	          | |j        |j                   Yd S )NwriteNullOffsetDEFAULT)r  r  rp   rs   setattrr   r>   r  r  KeyErrorr  evalr  r  )r   
propagatorr  r  
count_convs        r   rr   zBaseTable.populateDefaults  s   &&(( 	; 	;D{ ;tTY// 1D$)R000 ty!9!9::TXE
E!%!8!8!E!EJD$+z:::: E E E! EdkZ&?&?"4;/88DDDE
 8 D4$G$G 4++ 4!233 3D$)T222 4++ ;D$)T\:::1	; 	;s   50B&&5CCc                 H   |                      |           i }|| _        |                                 D ]}|j        dk    r!|                    |j        |d                   }|j        dk    r!|                    |j        |d                   }|j        dk    r|                    |d                   }|j        dk    r!|                    |j        |d                   }	 |j        rqt          |j        t                    r|j        }n$|j        |v r||j                 }n||j                 }||j	        z  }|
                    ||||          ||j        <   nZ|j	        rt          |j	        d |          sE|                    |||          ||j        <   |j        r||j                 ||j        <   # t          $ r}|j        }|j        |fz   |_         d }~ww xY wt!          | d	          r|                     ||           n| j                            |           | `d S )
Nr  
LookupTyper  ExtensionLookupTypeFeatureParams
FeatureTag	SubStruct	MorphTypepostRead)
readFormat_BaseTable__rawTabler  rs   getConverterr;   r  
isinstanceintr  r   r  readisPropagated	Exceptionargsrp   r  r  update)r   rC   rB   r?   r  r  rY   rs   s           r   r@   zBaseTable.decompile  s>   &&(( 	 	DyJ&&((%:MNNyM))((%@U:VWWyO++(()=>>yK''((%:LMM; =!$+s33 9%)[

--%*4;%7

 &,DK%8
$(*J'+~~fdE:'V'VE$)$$x !TXtU(C(C ! '+yyu'E'EE$)$( =,1$),<ty)   y4')
 4$$ 	(MM%&&&&M  '''OOOs   !BF58;F55
G?GGc                    |                                   t          | d          r9t          | d           }|                     |          }|ot          | d          }nd}| j                                        }|                                 D ]I}|j        r@|j        r9|                    |j	                  }t          |t                    r
|||j	        <   Jt          | d          rd|_        t          | d          rd|_        t          | j        d          r%|d                             | j        j                   |                     |           |                                 D ]}|                    |j	                  }|j        r|g }t'          |          |j        z
  }t          |j        t*                    r:t'          |          |j        k    s!J d	|j        t'          |          fz              nA|j        |v rt          ||j        |
           n ||j                                     |           	 |                    ||||           # t.          $ r}|j        |j	        dz   fz   |_         d }~ww xY w|j        rt          |t                    r@|}	|j        |	_        |                    |	           |	                                ||j	        <   n+|                    ||j	        |j                  }	d ||j	        <   |j        r
|	||j	        <   |j        rG|j	        |vr
d ||j	        <   |                    ||j	        |j        ||j	                           }	|	|d<   |j        rt?          |j        d |          s 	 |                     ||||           n8# t.          $ r+}||j        j!        n|j	        }
|j        |
fz   |_         d }~ww xY w|j        r
|||j	        <   |r| `"d S d S )NpreWriteFormatFr   r   r  Tr  zexpected %d values, got %dr*   z[])#rx   rp   r  r  r   r  isCountr  r  rs   r  rx  r   r  r   r  r  writeFormatr  r   r  r  rH  r  r  r   r   r  r  rz  isLookupTyper  writer"   r  )r   rX   rB   deleteFormatr?   r  r+   r  rY   ry  rs   s              r   rO   zBaseTable.compile  sZ    4$$ 	)&tX666LMM$''E'CGD(,C,CLL LM&&((E &&(( 	. 	.D| . 1 .		$),,e^44 .(-F49%4+,, 	(&'F#4%% 	$#F4><00 	E< ))$.*CDDD   &&(( ?	. ?	.DII	 E { ;.=E ZZ$(2
dk3// 	=u::4446RE

V 74444 [E))"5$+ZHHHHH 4;'00<<<OOFD%????    Vty4'7&99AF  (. e^44 ,C#CH$$S)))'*||~~E$)$$ 44UDItWWC'+E$)$$ ,(+F49%" . 9E))'+E$)$0049douTY7G  (+|$$8 D4$?$? JJvtUE::::    7<7H5?33diDVtg-AF $ .(-F49% 		 	s0   =I
I> I99I>	N""
O,&OOc                     d S r)   r%   r   rC   s     r   r  zBaseTable.readFormatM      r   c                     d S r)   r%   rg   s     r   r  zBaseTable.writeFormatP  r  r   c                 :   |r|n| j         j        }|g }t          | d          r|d| j        fgz   }|                    ||           |                                 |                     ||           |                    |           |                                 d S )Nr  )r   r"   rp   r  begintagnewlinerm   endtag)r   	xmlWriterrB   rt   rs   	tableNames         r   rn   zBaseTable.toXMLS  s     =DDdn&=	=E4"" 	6h455E9e,,,It$$$###r   c           
         |                                  D ]}|j        rMt          | |j        g           }t	          |          D ]&\  }}|                    ||||j        d|fg           'V|j        r$t          |j        d t          |                     st          | |j        d           }|                    ||||j        g            d S )Nindex)	r  r  r>   rs   r	  xmlWriter  r  vars)r   r  rB   r  r+   r{   r   s          r   rm   zBaseTable.toXML2_  s     &&(( 	E 	ED{ 
Edi44(// T TGAtMM)T4gq\NSSSST 8 D4d$D$D $)T  iudiDDDD	E 	Er   c                 H   	 |                      |          }n# t          $ r  w xY w|                    |||          }|j        Gt	          | |j        d           }|g }t          | |j        |           |                    |           d S t          | |j        |           d S r)   )r  r  xmlReadr  r>   rs   r  r%  )r   rs   rt   ru   rB   r  r+   seqs           r   rq   zBaseTable.fromXMLp  s    	**400DD 	 	 		UGT22 ;"$	400C{di---JJuD$)U+++++s    $c                 H    |                      |          }|t          u r|n| S r)   r  r  s      r   r  zBaseTable.__ne__  r  r   c                     t          |           t          |          k    rt          S |                                  |                                 | j        |j        k    S r)   )rb   r   rx   r  r   s     r   r   zBaseTable.__eq__  sR    ::e$$!!   }..r   c                   B    e Zd ZU dZeed<   ded<   dZee         ed<   dS )BaseTable.SubTableEntryzSee BaseTable.iterSubTables()rs   r  r+   Nr  )	r"   r#   r$   rz   r   __annotations__r  r   r  r%   r   r   SubTableEntryr    sA         ++			#x}#####r   r  returnc              #   <   K                                     D ]}|j        t           d          }|t          |t                    r                     |          V  Kt          |t                    r" fdt          |          D             E d{V  dS )a7  Yield (name, value, index) namedtuples for all subtables of current table.

        A sub-table is an instance of BaseTable (or subclass thereof) that is a child
        of self, the current parent table.
        The tuples also contain the attribute name (str) of the of parent table to get
        a subtable, and optionally, for lists of subtables (i.e. attributes associated
        with a converter that has a 'repeat'), an index into the list containing the
        given subtable value.
        This method can be useful to traverse trees of otTables.
        Nc              3   x   K   | ]4\  }}t          |t                                        ||           V  5dS ))r  N)r  r  r  )r   r{   r  rs   r   s      r   	<genexpr>z*BaseTable.iterSubTables.<locals>.<genexpr>  s`        1!!Y//&&tQa&88     r   )r  rs   r>   r  r  r  r   r	  )r   r  r+   rs   s   `  @r   r  zBaseTable.iterSubTables  s       &&(( 	 	D9DD$--E}%++ ((u555555E4((      )% 0 0         	 	r   c                 *    t          | j                  S r)   )getVariableAttrsr   r    s    r   r  zBaseTable.getVariableAttrs  s    ///r   r  r)   r  )r"   r#   r$   rz   r  rx   r  classmethodr  r  r  rr   r@   rO   r  r  rn   rm   rq   r  r   r   r  r
   r  r  r%   r   r   r  r  k  s       ::	# 	# 	#	9 	9 	9 	9     [  + + +; ; ; ;6( ( (Tc c cJ    
 
 
 
E E E", , ,$B B B/ / /$ $ $ $ $
 $ $ $x6    40 0 0 0 0r   r  c                   N    e Zd ZdZed             Zd Zd Zd Zd Z	d
dZ
d	 ZdS )FormatSwitchingBaseTablezvMinor specialization of BaseTable, for tables that have multiple
    formats, eg. CoverageFormat1 vs. CoverageFormat2.c                     t           S r)   )r   )r  rC   s     r   r  z&FormatSwitchingBaseTable.getRecordSize  s    r   c                 x    	 | j         }n# t          $ r g cY S w xY w| j                            | j         g           S r)   )r  r  r  r  )r   fmts     r   r  z&FormatSwitchingBaseTable.getConverters  sR    	+CC 	 	 	 III	 ""4;333s   
 c                 2    | j         | j                 |         S r)   )r  r  r   s     r   r  z+FormatSwitchingBaseTable.getConverterByName  s    $T[1$77r   c                 8    |                                 | _        d S r)   )r   r  r  s     r   r  z#FormatSwitchingBaseTable.readFormat  s    ''))r   c                 :    |                     | j                   d S r)   )rd  r  rg   s     r   r  z$FormatSwitchingBaseTable.writeFormat  s    4;'''''r   Nc                 B    t                               | ||||           d S r)   )r  rn   )r   r  rB   rt   rs   s        r   rn   zFormatSwitchingBaseTable.toXML  s"    iud;;;;;r   c                 6    t          | j        | j                  S r)   )r  r   r  r    s    r   r  z)FormatSwitchingBaseTable.getVariableAttrs  s    <<<r   r  )r"   r#   r$   rz   r  r  r  r  r  r  rn   r  r%   r   r   r  r    s        9 9   [
4 
4 
48 8 8* * *( ( (< < < <= = = = =r   r  c                       e Zd Zd Zd ZdS )UInt8FormatSwitchingBaseTablec                 8    |                                 | _        d S r)   )r   r  r  s     r   r  z(UInt8FormatSwitchingBaseTable.readFormat  s    &&((r   c                 :    |                     | j                   d S r)   )r_  r  rg   s     r   r  z)UInt8FormatSwitchingBaseTable.writeFormat  s    $+&&&&&r   N)r"   r#   r$   r  r  r%   r   r   r  r    s2        ) ) )' ' ' ' 'r   r  )uint16uint8c                 ^    	 t           |          S # t          $ r t          d|           w xY w)NzUnsupported format type: )formatSwitchingBaseTablesr  	TypeError)
formatTypes    r    getFormatSwitchingBaseTableClassr    sI    D(44 D D DBJBBCCCDs    ,r  r  r  c                    t          | t                    st          |           t          | t                    r'|t          d| j                   | j        |         }n| j        }d|vrdS i }|                                D ] \  }}|                                }||||<   !t          t          ||j
                            S )zReturn sequence of variable table field names (can be empty).

    Attributes are deemed "variable" when their otData.py's description contain
    'VarIndexBase + {offset}', e.g. COLRv1 PaintVar* tables.
    Nz''fmt' is required for format-switching VarIndexBaser%   )key)
issubclassr  r	  r  r"   r  r   getVarIndexOffsetr  sortedr   )r  r  r  varAttrsrs   r  r~   s          r   r  r    s     c9%% nn#/00 *;TclTTUUU)#.

)
Z''rH &&(( $ $
d''))#HTNh&:;;;<<<r   ))r   
XPlacementr   r   )r   
YPlacementr   r   )r   XAdvancer   r   )   YAdvancer   r   )   
XPlaDevicer   r   )    
YPlaDevicer   r   )@   
XAdvDevicer   r   )rJ  
YAdvDevicer   r   )r]  	Reserved1r   r   )i   	Reserved2r   r   )i   	Reserved3r   r   )i   	Reserved4r   r   )i   	Reserved5r   r   )i    	Reserved6r   r   )i @  	Reserved7r   r   )rS  	Reserved8r   r   c                  8    i } t           D ]\  }}}}|||f| |<   | S r)   )valueRecordFormat)dmaskrs   isDevicesigneds        r   
_buildDictr-  &  s6    
A(9 ) )$dHf&($Hr   c                   *    e Zd ZdZd Zd Zd Zd ZdS )ValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 p    g }t           D ]$\  }}}}||z  r|                    |||f           %|| _        d S r)   )r(  r%  r|  )r   valueFormatr|  r*  rs   r+  r,  s          r   r   zValueRecordFactory.__init__3  sQ    ,= 	8 	8(D$&T! 8tXv6777r   c                 *    t          | j                  S r)   )r   r|  r    s    r   __len__zValueRecordFactory.__len__:  s    4;r   c                 b   | j         }|sd S t                      }|D ]\  }}}|r|                                }n|                                }|rN|rJddlm}	 |                    |          }
 t          |	|                      }|                    |
|           nd }t          |||           |S Nr   r8   )
r|  ValueRecordr   r   r<   r9   r   r>   r@   r  )r   rC   rB   r|  valueRecordrs   r+  r,  r+   r9   	subReaders              r   readValueRecordz"ValueRecordFactory.readValueRecord=  s     	4!mm&, 	. 	."D(F ,((**))++ ! !****** & 3 3E : :I3GHd3355EOOIt4444 EKu----r   c                 V   | j         D ]\  }}}t          ||d          }|rZ|rB|                                }|                    |d           |                    ||           ]|                    d           s|r|                    |           |                    |           d S )Nr   r   )r   )r|  r>   r?  rv  rO   rd  rT  )	r   rX   rB   r7  rs   r+  r,  r+   r   s	            r   writeValueRecordz#ValueRecordFactory.writeValueRecordS  s    &*k 	* 	*"D(FKq11E 
* * & 3 3 5 5I((q(AAAMM)T2222&&q)))) *!!%((((""5))))	* 	*r   N)r"   r#   r$   rz   r   r3  r9  r;  r%   r   r   r/  r/  0  sV        @@         ,* * * * *r   r/  c                   <    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	dS )r6  Nc                 .   |pt           D ]!\  }}}}||z  rt          | ||rd nd           "|A|j                                        D ])\  }}t	          | |          st          | ||           (d S d S | |j                                        | _        d S d S Nr   )r(  r  r  r   rp   r   )	r   r1  srcr*  rs   r+  r,  r  vals	            r   r   zValueRecord.__init__f  s    "0A A A,dHf% AD$(?a@@@ # 2 2 4 4 , ,HC"4-- ! D#s++++	 , , _L--//DMMM _r   c                 n    d}| j                                         D ]}|t          |         d         z  }|S r>  )r  keysvalueRecordFormatDict)r   r|  rs   s      r   	getFormatzValueRecord.getFormats  s@    M&&(( 	= 	=D3D9!<<FFr   c                 x    d}| j                                         D ]\  }}|r|t          |         d         z  }|S r>  )r  r   rC  )r   r|  rs   r+   s       r   getEffectiveFormatzValueRecord.getEffectiveFormaty  sN    =..00 	A 	AKD% A"7"=a"@@r   c                    |g }nt          |          }t          d d         D ]<\  }}}}	t          | |          r%|                    |t	          | |          f           =g }
t          dd         D ]@\  }}}}	t          | |          r)t	          | |          }||
                    ||f           A|
rw|                    ||           |                                 |
D ]\  }}||                    |||            |                    |           |                                 d S |	                    ||           |                                 d S )Nr   r  )rs   )
r   r(  rp   r%  r>   r  r  rn   r  	simpletag)r   r  rB   	valueNamert   simpleItemsr*  rs   r+  r|  deviceItemsdevicedeviceRecords                r   rn   zValueRecord.toXML  s   =KKu++K,=bqb,A 	@ 	@(D$&tT"" @""D'$*=*=#>???,=ac,B 	7 	7(D$&tT"" 7 t,,%&&f~666 
	 y+666&1 C C"l+ &&y$T&BBBY'''	;777r   c                    ddl m} |                                D ]#\  }}t          | |t	          |                     $|D ]}t          |t                    s|\  }}} t          ||                      }	|D ]6}
t          |
t                    s|
\  }}}|	                    ||||           7t          | ||	           d S r5  )	r<   r9   r   r  r  r  r  r>   rq   )r   rs   rt   ru   rB   r9   kr  elementr+   elem2name2attrs2content2s                 r   rq   zValueRecord.fromXML  s    KKMM 	% 	%DAqD!SVV$$$$ 
	' 
	'Ggu-- #* D%+GHd++--E  = =!%// */'vxeVXt<<<<D$&&&&
	' 
	'r   c                 H    |                      |          }|t          u r|n| S r)   r  r  s      r   r  zValueRecord.__ne__  r  r   c                 p    t          |           t          |          k    rt          S | j        |j        k    S r)   )rb   r   r  r   s     r   r   zValueRecord.__eq__  s.    ::e$$!!}..r   r  r)   )
r"   r#   r$   r   rD  rF  rn   rq   r  r   r%   r   r   r6  r6  c  s        0 0 0 0           4' ' '"B B B/ / / / /r   r6  r)   )9fontTools.configr   fontTools.misc.textToolsr   r   r   enumr   r   r   r   logging	functoolsr	   typingr
   r   r   r   	getLoggerr"   rJ   rL   	uharfbuzzr`   rM   rI   objectr   r  r'   r1   r6   r   rB  itemsizer=   r   rN   rx  r  r  r  r  r  r  r  r  r  r  r   r  r(  r-  rC  r/  r6  r%   r   r   <module>ra     s   $ $ $ $ $ $ 3 3 3 3 3 3 3 3 & & & & & &       



          8 8 8 8 8 8 8 8 8 8 8 8g!!	NN 	 	 	D	  8 C C CD 
 
 
 
 
& 
 
 
0         Y          G   *l5 l5 l5 l5 l5| l5 l5 l5` s;6;sA1$$$$u{3 A%%%'L%%%q; q; q; q; q;F q; q; q;h7 7 7 7 7V 7 7 7u
 u
 u
 u
 u
F u
 u
 u
pI I I I IV I I I8$ $ $$ $ $$ $ $
( ( (
F0 F0 F0 F0 F0 F0 F0 F0R
!= != != != !=y != != !=H' ' ' ' '$< ' ' ' '*  D D D = =) =(3- =5: = = = =B   ,   #
 0* 0* 0* 0* 0* 0* 0* 0*fO/ O/ O/ O/ O/& O/ O/ O/ O/ O/s   A AA