
    ]Mh              	          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 e eed
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/          Z0e/e0d)Z1d* Z2 e            d5d+e.d,ee3         d-ee4         fd.            Z5g d/Z6d0 Z7 e7            Z8 G d1 d2e          Z9 G d3 d4e          Z:dS )6    )OPTIONS)Tag	bytesjoin   )DefaultTable)IntEnumN)	lru_cache)Iterator
NamedTupleOptionalTupleFrepackz: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     ]/var/www/html/test/jupyter/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__5   s    (


r   c                 *    t          | j                  S r*   )reprr,   r!   s    r   __str__zOTLOffsetOverflowError.__str__8   s    DJr   N)r#   r$   r%   r   r0   r&   r   r   r(   r(   4   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   r2   r2   <   s#         G E KKKr   r2   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) r:   OTTableReaderr<   getattrtable	decompile)r   datafontr:   reader
tableClasss         r   rA   zBaseTTXConverter.decompileW   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ImportErrorr2   r4   r3   OTTableWriterr@   compiletryPackingHarfbuzztryPackingFontToolsr5   r(   tryResolveOverflowr,   )
r   rC   overflowRecorduse_hb_repackstatehb_first_error_loggedlastOverflowRecordwritereoks
             r   rP   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)rK   rL   r<   getAllDataUsingHarfbuzz
ValueErrorMemoryErrorhbRepackerErrortyper#   r    warning
getAllData)r   rY   rW   rZ   	error_msgs        r   rQ   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*   )re   r   rY   s     r   rR   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,   rK   infor   r:   rj   rk   )r   rC   rZ   rX   r[   rT   rj   rk   s           r   rS   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   rY   rC   s      r   toXMLzBaseTTXConverter.toXML   s     
&$'''''r   c                     ddl m} t          | d          s$t          || j                  } |            | _        | j                            ||||           | j                                         d S )Nr   r9   r@   )r=   r:   hasattrr?   r<   r@   fromXMLpopulateDefaults)r   nameattrscontentrC   r:   rE   s          r   rr   zBaseTTXConverter.fromXML   sz    tW%% 	& 4=99J#DJ
4666
##%%%%%r   Tc                 <    | j                             |           d S )N)recurse)r@   ensureDecompiled)r   rx   s     r   ry   z!BaseTTXConverter.ensureDecompiled   s!    
##G#44444r   NT)r#   r$   r%   __doc__rA   rP   rQ   rR   rS   ro   rr   ry   r&   r   r   r7   r7   Q   s         
+ + +Y Y Yv= = =,# # #8 8 88( ( (& & &5 5 5 5 5 5r   r7   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.rB   offsetpos
localStater<   Nr   c                 L    || _         || _        || _        || _        || _        d S r*   r~   )r   rB   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__rB   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   rB   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unpackrB   )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   arrayrB   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.readInt80      ~~ca~000r   c                 2    |                      dd|          S )Nr   r   r   r   r   r   s     r   readInt8ArrayzOTTableReader.readInt8Array3      ~~cau~===r   c                 0    |                      dd          S )Nhr   r   r   r!   s    r   	readShortzOTTableReader.readShort6  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readShortArrayzOTTableReader.readShortArray9  r   r   c                 0    |                      dd          S )Nr|   r   r   r   r!   s    r   readLongzOTTableReader.readLong<  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.readUInt8B  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readUInt8ArrayzOTTableReader.readUInt8ArrayE  r   r   c                 0    |                      dd          S )NHr   r   r   r!   s    r   
readUShortzOTTableReader.readUShortH  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readUShortArrayzOTTableReader.readUShortArrayK  r   r   c                 0    |                      dd          S )NIr   r   r   r!   s    r   	readULongzOTTableReader.readULongN  r   r   c                 2    |                      dd|          S )Nr   r   r   r   r   s     r   readULongArrayzOTTableReader.readULongArrayQ  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.readUInt24T  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>\  s#    888a!!888r   )ranger   s   ` r   readUInt24ArrayzOTTableReader.readUInt24Array[  s#    88885<<8888r   c                     | j         }|dz   }t          | j        ||                   }t          |          dk    s
J |            || _         |S Nr   )r   r   rB   lenr   s       r   readTagzOTTableReader.readTag^  sO    hqDIc&j)**5zzQr   c                 J    | j         }||z   }| j        ||         }|| _         |S r*   )r   rB   )r   r   r   r   r,   s        r   readDatazOTTableReader.readDataf  s.    hu	#f*%r   c                 z    | j         r| j                                         nt                      }|||<   || _         d S r*   r   r   dictr   rt   r,   rV   s       r   __setitem__zOTTableReader.__setitem__m  9    *./E$$&&&tvvdr   c                 *    | j         o| j         |         S r*   r   r   rt   s     r   __getitem__zOTTableReader.__getitem__r  s    84?4#88r   c                 "    | j         o|| j         v S r*   r   r   s     r   __contains__zOTTableReader.__contains__u  s    :44?#::r   )Nr   N)r#   r$   r%   r{   	__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__z  s    "$r   c                     t          |           t          |          k    rt          S | j        |j        k    o| j        |j        k    S r*   )rc   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   y  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 )0rO   z=Helper class to gather and assemble data for OpenType tables.Nc                 Z    g | _         d | _        || _        || _        d | _        d| _        d S )N<none>)itemsr   r   r<   parentrt   )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   rq   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   rq   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  	enumeraterq   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*   )rc   r   r   r   s     r   r   zOTTableWriter.__eq__  s.    ::e$$!!zU[((r   Fc                    t          | d          }t          | d          }|r|si }| j        }t          t          |                    D ]}||         }t          |d          r|                                ||<   2t          |d          rI|j                            ||           |s+|                    |j        |j                  ||         _        t          |          | _        d S )N	Extension	DontSharer   r   shareExtension)	rq   r   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
s5zz"" 	 	A8D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   rt   Coverager   )idr   r   r  r   reverserq   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!  rt   r"  Tr   r   r   )r&  rq   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._gatherGraphForHarfbuzzK  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                    i }|                      |d           g }g }i }d}g }|                     |||||           d}|D ] }	||	_        ||	                                z   }!g }
|D ]+}	|	                                }|
                    |           ,t          t          d          r#t          j        t          |          |
|          S t          j
        |
|          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   repack_with_tag)r  r-  r   r   r  r&  rq   ra   r;  r    r   )r   r<   r  r'  r/  r)  r0  r1  r   r@   rB   	tableDatas               r   r^   z%OTTableWriter.getAllDataUsingHarfbuzz  s    .>>>$$VXtV]SSS  	. 	.EEI++---CC 	# 	#E0022IKK	""""2()) 	-%c(mmT8DDD9T8,,,r   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@   rB   r<  s
             r   re   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>brB  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   rI  r   rG  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>hrB  rL  s     r   
writeShortzOTTableWriter.writeShort  sW    &&&&&&&&&&&&
&+dE2233333r   c                 2    |                      d|           d S )Nr   rO  rP  s     r   writeShortArrayzOTTableWriter.writeShortArray  rR  r   c                 `    | j                             t          j        d|                     d S )Nz>irB  rL  s     r   	writeLongzOTTableWriter.writeLong  *    
&+dE2233333r   c                 2    |                      d|           d S )Nr|   rO  rP  s     r   writeLongArrayzOTTableWriter.writeLongArray  rR  r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Nr      >BrB  rL  s     r   
writeUInt8zOTTableWriter.writeUInt8  sW    EC
&+dE2233333r   c                 2    |                      d|           d S )Nr   rO  rP  s     r   writeUInt8ArrayzOTTableWriter.writeUInt8Array  rR  r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Nr   i   >HrB  rL  s     r   writeUShortzOTTableWriter.writeUShort  sW    E####G#####U###
&+dE2233333r   c                 2    |                      d|           d S )Nr   rO  rP  s     r   writeUShortArrayzOTTableWriter.writeUShortArray  rR  r   c                 `    | j                             t          j        d|                     d S )N>IrB  rL  s     r   
writeULongzOTTableWriter.writeULong  rZ  r   c                 2    |                      d|           d S )Nr   rO  rP  s     r   writeULongArrayzOTTableWriter.writeULongArray   rR  r   c                     d|cxk    rdk     sn J |            t          j        d|          }| j                            |dd                     d S )Nr      z>Lr   r   rC  r   r&  )r   r,   r   s      r   writeUInt24zOTTableWriter.writeUInt24  sd    E%%%%I%%%%%u%%%Ke$$
!ABB%     r   c                 :    |D ]}|                      |           d S r*   )rp  )r   rG  r,   s      r   writeUInt24ArrayzOTTableWriter.writeUInt24Array  s2     	$ 	$EU####	$ 	$r   c                     t          |                                          }t          |          dk    s
J |            | j                            |           d S r   )r   rF  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@   rt   r   r,   refs         r   writeCountReferencez!OTTableWriter.writeCountReference  s3    UDt5AAA
#
r   c                 ^    t          j        |f|z    }| j                            |           d S r*   ro  )r   formatrG  rB   s       r   writeStructzOTTableWriter.writeStruct  s1    {VI./
$r   c                 :    | j                             |           d S r*   )r   r&  )r   rB   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Lookuprt   r   repeatIndexSubTableExtSubTable.)r  r  )rt   r  r?   rq   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Frz   )r   N)*r#   r$   r%   r{   r   r   r   r   r   r  r  r   r  r   r  r%  r-  r^   re   r@  rD  rI  rM  rQ  rU  rW  rY  r\  r`  rb  re  rg  rj  rl  rp  rr  ru  rw  r{  r~  r  r  r&   r   r   rO   rO     ss       GG        
% % %" " "

 
 
     8          B B B) ) )
&" &" &" &"P>  >  > @7 7 7r- - -B   F  > > >' ' '4 4 4% % %4 4 4% % %4 4 4% % %4 4 4% % %4 4 4% % %4 4 4% % %! ! !
$ $ $  
A A A   
          !
 !
 !
 !
 !
r   rO   c                   ,    e Zd ZdZddZd Zd Zd ZdS )ry  z8A reference to a Count value, not a count of references.Nc                 b    || _         || _        || _        ||                     |           d S d S r*   )r@   rt   r   setValue)r   r@   rt   r   r,   s        r   r   zCountReference.__init__G  s=    
		MM%      r   c                 ~    | j         }| j        }||         |||<   d S ||         |k    sJ |||         |f            d S r*   r@   rt   )r   r,   r@   rt   s       r   r  zCountReference.setValueN  sU    
y;E$KKK;%'''$dU)C'''''r   c                 &    | j         | j                 S r*   r  r!   s    r   getValuezCountReference.getValueV  s    z$)$$r   c                 ~    | j         | j                 }|d}t          t          t          d| j                 |          S )Nr   )r   r   r   )r@   rt   	packUInt8r  r  r   )r   vs     r   r   zCountReference.getCountDataY  s9    Jty!9A	::49EaHHHr   r  )r#   r$   r%   r{   r   r  r  r   r&   r   r   ry  ry  D  sc        BB! ! ! !D D D% % %I I I I Ir   ry  c                 ,    t          j        d|           S )Nr_  r   rC  r+   s    r   r  r  `      ;tU###r   c                 ,    t          j        d|           S )Nrd  r  r+   s    r   r  r  d  r  r   c                 ^    d| cxk    rdk     sn J |             t          j        d|           S )Nr   l        ri  r  r+   s    r   r  r  h  sA    #########U###;tU###r   c                 n    d| cxk    rdk     sn J |             t          j        d|           dd          S )Nr   rn  ri  r   r  r+   s    r   r  r  m  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          |          NrD   )__dict__getrD   rC   rA   r?   AttributeError)r   attrrD   rC   s       r   __getattr__zBaseTable.__getattr__u  sb    ""8,, 	'9D	NN64(((4&&&T"""r   Fc                     | j                             d          }|r!| `| j        }| `|                     ||           |r1|                                 D ]}|j                            |           d S d S r  )r  r  rD   rC   rA   iterSubTablesr,   ry   )r   rx   rD   rC   subtables        r   ry   zBaseTable.ensureDecompiled  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   rV   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)clsrD   	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  rq   rt   setattrr   r?   r  r  KeyErrorr  evalr  r  )r   
propagatorr  r  
count_convs        r   rs   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  rt   getConverterr<   r  
isinstanceintr  r   r  readisPropagated	Exceptionargsrq   r  r  update)r   rD   rC   r@   r  r  rZ   rt   s           r   rA   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[])#ry   rq   r  r  r   r  isCountr  r  rt   r  ry  r!  r  r   r  r  writeFormatr  r   r  r  rI  r  r  r   r   r  r  r{  isLookupTyper  writer#   r  )r   rY   rC   deleteFormatr@   r  r,   r  rZ   rz  rt   s              r   rP   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   rD   s     r   r  zBaseTable.readFormatT      r   c                     d S r*   r&   rh   s     r   r  zBaseTable.writeFormatW  r  r   c                 :   |r|n| j         j        }|g }t          | d          r|d| j        fgz   }|                    ||           |                                 |                     ||           |                    |           |                                 d S )Nr  )r   r#   rq   r  begintagnewlinern   endtag)r   	xmlWriterrC   ru   rt   	tableNames         r   ro   zBaseTable.toXMLZ  s     =DDdn&=	=E4"" 	6h455E9e,,,It$$$###r   c           
         |                                  D ]}|j        r_t          | |j        g           }t	          t          |                    D ]+}||         }|                    ||||j        d|fg           ,h|j        r$t          |j        d t          |                     st          | |j        d           }|                    ||||j        g            d S )Nindex)
r  r  r?   rt   r   r   xmlWriter  r  vars)r   r  rC   r  r,   r|   r   s          r   rn   zBaseTable.toXML2f  s    &&(( 	E 	ED{ Edi44s5zz** T TA 8D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?   rt   r  r&  )r   rt   ru   rv   rC   r  r,   seqs           r   rr   zBaseTable.fromXMLx  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*   )rc   r   ry   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()rt   r  r,   Nr  )	r#   r$   r%   r{   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  rt   r   s      r   	<genexpr>z*BaseTable.iterSubTables.<locals>.<genexpr>  s`        1!!Y//&&tQa&88     r   )r  rt   r?   r  r  r  r  r
  )r   r  r,   rt   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%   r{   r  ry   r  classmethodr  r  r  rs   rA   rP   r  r  ro   rn   rr   r  r   r   r  r
   r  r  r&   r   r   r  r  r  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  rD   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*   )re  r  rh   s     r   r  z$FormatSwitchingBaseTable.writeFormat  s    4;'''''r   Nc                 B    t                               | ||||           d S r*   )r  ro   )r   r  rC   ru   rt   s        r   ro   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%   r{   r  r  r  r  r  r  ro   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  rh   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  varAttrsrt   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   )rK  
YAdvDevicer   r   )r^  	Reserved1r   r   )i   	Reserved2r   r   )i   	Reserved3r   r   )i   	Reserved4r   r   )i   	Reserved5r   r   )i    	Reserved6r   r   )i @  	Reserved7r   r   )rT  	Reserved8r   r   c                  8    i } t           D ]\  }}}}|||f| |<   | S r*   )valueRecordFormat)dmaskrt   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+  rt   r,  r-  s          r   r   zValueRecordFactory.__init__;  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__B  s    4;r   c                 b   | j         }|sd S t                      }|D ]\  }}}|r|                                }n|                                }|rN|rJddlm}	 |                    |          }
 t          |	|                      }|                    |
|           nd }t          |||           |S Nr   r9   )
r}  ValueRecordr   r   r=   r:   r   r?   rA   r  )r   rD   rC   r}  valueRecordrt   r,  r-  r,   r:   	subReaders              r   readValueRecordz"ValueRecordFactory.readValueRecordE  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@  rw  rP   re  rU  )	r   rY   rC   r8  rt   r,  r-  r,   r   s	            r   writeValueRecordz#ValueRecordFactory.writeValueRecord[  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%   r{   r   r4  r:  r<  r&   r   r   r0  r0  8  sV        @@         ,* * * * *r   r0  c                   <    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	dS )r7  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   rq   r   )	r   r2  srcr+  rt   r,  r-  r  vals	            r   r   zValueRecord.__init__n  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}  rt   s      r   	getFormatzValueRecord.getFormat{  s@    M&&(( 	= 	=D3D9!<<FFr   c                 x    d}| j                                         D ]\  }}|r|t          |         d         z  }|S r?  )r  r   rD  )r   r}  rt   r,   s       r   getEffectiveFormatzValueRecord.getEffectiveFormat  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  )rt   )
r  r)  rq   r&  r?   r  r  ro   r  	simpletag)r   r  rC   	valueNameru   simpleItemsr+  rt   r,  r}  deviceItemsdevicedeviceRecords                r   ro   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 r6  )	r=   r:   r   r  r  r  r  r?   rr   )r   rt   ru   rv   rC   r:   kr  elementr,   elem2name2attrs2content2s                 r   rr   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*   )rc   r   r  r   s     r   r   zValueRecord.__eq__  s.    ::e$$!!}..r   r  r*   )
r#   r$   r%   r   rE  rG  ro   rr   r  r   r&   r   r   r7  r7  k  s        0 0 0 0           4' ' '"B B B/ / / / /r   r7  r*   );fontTools.configr   fontTools.misc.textToolsr   r   r   enumr   r   r   r   logging	functoolsr	   typingr
   r   r   r   	getLoggerr#   rK   rM   	uharfbuzzra   callabler?   rN   rJ   objectr   r  r(   r2   r7   r   rC  itemsizer>   r   rO   ry  r  r  r  r  r  r  r  r	  r  r  r    r  r)  r.  rD  r0  r7  r&   r   r   <module>rc     s   $ $ $ $ $ $ 3 3 3 3 3 3 3 3 & & & & & &       



          8 8 8 8 8 8 8 8 8 8 8 8g!!	
 Xggb(D99::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y
 y
 y
 y
 y
F y
 y
 y
xI I I I IV I I I8$ $ $$ $ $$ $ $
( ( (
G0 G0 G0 G0 G0 G0 G0 G0T
!= != != != !=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+ +A32A3