
    hB!                    V   S SK Jr  S SKJr  S SKJr  S SKJrJr  S SK	J
r
  S SKrSr/ SQrS	 r\" / S
Q5      rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S  S!\5      r " S" S#\5      r " S$ S%\5      r " S& S'\5      r  " S( S)\5      r! " S* S+\5      r" " S, S-\5      r# " S. S/\5      r$ " S0 S1\5      r% " S2 S3\5      r& " S4 S5\5      r' " S6 S7\5      r( " S8 S9\5      r) " S: S;\5      r* " S< S=\5      r+ " S> S?\5      r, " S@ SA\5      r- " SB SC\5      r. " SD SE\5      r/ " SF SG\5      r0 " SH SI\5      r1 " SJ SK\5      r2 " SL SM\5      r3 " SN SO\5      r4 " SP SQ\5      r5 " SR SS\5      r6 " ST SU\5      r7 " SV SW\5      r8 " SX SY\5      r9 " SZ S[\5      r: " S\ S]\5      r; " S^ S_\5      r< " S` Sa\5      r= " Sb Sc\5      r> " Sd Se\5      r? " Sf Sg\5      r@ " Sh Si\5      rA " Sj Sk\5      rB " Sl Sm\5      rC " Sn So\5      rD " Sp Sq\5      rESr rF " Ss St\5      rG " Su Sv\G5      rH " Sw Sx\G5      rI " Sy Sz\5      rJ " S{ S|\G5      rK " S} S~\5      rL " S S\5      rM " S S\5      rN " S S\5      rO " S S\5      rP " S S\5      rQ " S S\5      rR " S S\5      rS " S S\5      rT " S S\5      rU " S S\5      rV " S S\5      rWg)    )FeatureLibError)FeatureLibLocation)getEncoding)byteordtobytes)OrderedDictNz    )BElementFeatureFileComment	GlyphName
GlyphClassGlyphClassNameMarkClassNameAnonymousBlockBlockFeatureBlockNestedBlockLookupBlockGlyphClassDefinitionGlyphClassDefStatement	MarkClassMarkClassDefinitionAlternateSubstStatementAnchorAnchorDefinitionAttachStatementAxisValueLocationStatementBaseAxisCVParametersNameStatementChainContextPosStatementChainContextSubstStatementCharacterStatementConditionsetStatementCursivePosStatementElidedFallbackNameElidedFallbackNameID
ExpressionFeatureNameStatementFeatureReferenceStatementFontRevisionStatement	HheaFieldIgnorePosStatementIgnoreSubstStatementIncludeStatementLanguageStatementLanguageSystemStatementLigatureCaretByIndexStatementLigatureCaretByPosStatementLigatureSubstStatementLookupFlagStatementLookupReferenceStatementMarkBasePosStatementMarkLigPosStatementMarkMarkPosStatementMultipleSubstStatement
NameRecordOS2FieldPairPosStatement ReverseChainSingleSubstStatementScriptStatementSinglePosStatementSingleSubstStatementSizeParameters	StatementSTATAxisValueStatementSTATDesignAxisStatementSTATNameStatementSubtableStatement
TableBlockValueRecordValueRecordDefinition	VheaFieldc                 @    U c  gSSR                  S U  5       5      -  $ )Nz<device NULL>z<device %s>, c              3   ,   #    U  H
  nS U-  v   M     g7f)z%d %dN ).0ts     F/var/www/html/env/lib/python3.13/site-packages/fontTools/feaLib/ast.py	<genexpr>!deviceToString.<locals>.<genexpr>T   s     (Ef1fs   )join)devices    rQ   deviceToStringrV   P   s$    ~tyy(Ef(EEEE    )4anchor	anchordefanon	anonymousbycontourcursiverU   enum	enumerateexcludedfltexclude_dfltfeaturefromignoreignorebaseglyphsignoreligaturesignoremarksincludeincludedfltinclude_dfltlanguagelanguagesystemlookup
lookupflagmarkmarkattachmenttype	markclassnameidnull
parameterspospositionrequiredrighttoleft
reversesubrsubscriptsub
substitutesubtabletableusemarkfilteringsetuseextensionvaluerecorddefbasegdefheadhheanamevheavmtxc                 
   [        U S5      (       a  U R                  5       $ [        U [        5      (       a/  [	        U 5      S:X  a   [        U S   5      S-   [        U S   5      -   $ U R                  5       [        ;   a  SU -   $ U $ )NasFea   r   z -    \)hasattrr   
isinstancetuplelenlowerfea_keywords)gs    rQ   r   r      sn    q'wwy	Au		#a&A+QqT{U"U1Q4[00	
l	"axrW   c                   8    \ rS rSrSrS	S jrS rS
S jrS rSr	g)r	      z8A base class representing "something" in a feature file.Nc                 X    U(       a  [        U[        5      (       d  [        U6 nXl        g N)r   r   locationselfr   s     rQ   __init__Element.__init__   s!    Jx1CDD)84H rW   c                     g r   rN   r   builders     rQ   buildElement.build   s    rW   c                     [         e)zReturns this element as a string of feature code. For block-type
elements (such as :class:`FeatureBlock`), the `indent` string is
added to the start of each line in the output.)NotImplementedErrorr   indents     rQ   r   Element.asFea   s
     "!rW   c                 "    U R                  5       $ r   r   r   s    rQ   __str__Element.__str__   s    zz|rW   r   r    )
__name__
__module____qualname____firstlineno____doc__r   r   r   r   __static_attributes__rN   rW   rQ   r	   r	      s    B!"rW   r	   c                       \ rS rSrSrg)rB      rN   Nr   r   r   r   r   rN   rW   rQ   rB   rB          rW   rB   c                       \ rS rSrSrg)r'      rN   Nr   rN   rW   rQ   r'   r'      r   rW   r'   c                   :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )r      zA comment in a feature file.c                 8   > [         [        U ]  U5        Xl        g r   )superr   r   text)r   r   r   	__class__s      rQ   r   Comment.__init__   s    gt%h/	rW   c                     U R                   $ r   r   r   s     rQ   r   Comment.asFea   s    yyrW   r   r   r   	r   r   r   r   r   r   r   r   __classcell__r   s   @rQ   r   r      s    &
 rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
	NullGlyph   z5The NULL glyph, used in glyph deletion substitutions.Nc                 .    [         R                  X5        g r   )r'   r   r   s     rQ   r   NullGlyph.__init__   s    D+rW   c                     g)BThe glyphs in this class as a tuple of :class:`GlyphName` objects.rN   rN   r   s    rQ   glyphSetNullGlyph.glyphSet   s    rW   c                     g)NNULLrN   r   s     rQ   r   NullGlyph.asFea   s    rW   rN   r   r   	r   r   r   r   r   r   r   r   r   rN   rW   rQ   r   r      s    ?,rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r      z)A single glyph name, such as ``cedilla``.Nc                 :    [         R                  X5        Xl        g r   )r'   r   glyph)r   r   r   s      rQ   r   GlyphName.__init__   s    D+
rW   c                     U R                   4$ r   r   r   s    rQ   r   GlyphName.glyphSet   s    

}rW   c                 ,    [        U R                  5      $ r   )r   r   r   s     rQ   r   GlyphName.asFea   s    TZZ  rW   r   r   r   r   rN   rW   rQ   r   r      s    3
!rW   r   c                   P    \ rS rSrSrSS jrS rSS jrS rS r	S	 r
S
 rS rSrg)r      z1A glyph class, such as ``[acute cedilla grave]``.Nc                 b    [         R                  X5        Ub  UO/ U l        / U l        SU l        g )Nr   )r'   r   glyphsoriginalcurr)r   r   r   s      rQ   r   GlyphClass.__init__   s,    D+ & 2f	rW   c                 ,    [        U R                  5      $ r   )r   r   r   s    rQ   r   GlyphClass.glyphSet   s    T[[!!rW   c                    [        U R                  5      (       a  U R                  [        U R                  5      :  aL  U R                  R	                  U R                  U R                  S  5        [        U R                  5      U l        SSR                  [        [        U R                  5      5      -   S-   $ SSR                  [        [        U R                  5      5      -   S-   $ )N[ ])r   r   r   r   extendrT   mapr   r   s     rQ   r   GlyphClass.asFea   s    t}}yy3t{{++$$T[[%=>,	#eT]]";<<sBB#eT[["9::S@@rW   c                 :    U R                   R                  U5        g)z6Add a list of :class:`GlyphName` objects to the class.N)r   r   )r   r   s     rQ   r   GlyphClass.extend   s    6"rW   c                 :    U R                   R                  U5        g)z4Add a single :class:`GlyphName` object to the class.N)r   append)r   r   s     rQ   r   GlyphClass.append   s    5!rW   c                 P   U R                   [        U R                  5      :  a2  U R                  R	                  U R                  U R                   S 5        U R                  R                  X45        U R                  R	                  U5        [        U R                  5      U l         g)zAdd a range (e.g. ``A-Z``) to the class. ``start`` and ``end``
are either :class:`GlyphName` objects or strings representing the
start and end glyphs in the class, and ``glyphs`` is the full list of
:class:`GlyphName` objects in the range.N)r   r   r   r   r   r   r   startendr   s       rQ   	add_rangeGlyphClass.add_range  sp    
 99s4;;''MM  TYY[!9:e\*6"$	rW   c                    U R                   [        U R                  5      :  a2  U R                  R	                  U R                  U R                   S 5        U R                  R                  SR                  U5      SR                  U5      45        U R                  R	                  U5        [        U R                  5      U l         g)zAdd a range to the class by glyph ID. ``start`` and ``end`` are the
initial and final IDs, and ``glyphs`` is the full list of
:class:`GlyphName` objects in the range.Nz\{})r   r   r   r   r   r   formatr   s       rQ   add_cid_rangeGlyphClass.add_cid_range  s     99s4;;''MM  TYY[!9:fmmE2FMM#4FGH6"$	rW   c                 j   U R                   [        U R                  5      :  a2  U R                  R	                  U R                  U R                   S 5        U R                  R                  U5        U R                  R	                  UR                  5       5        [        U R                  5      U l         g)zFAdd glyphs from the given :class:`GlyphClassName` object to the
class.N)r   r   r   r   r   r   r   )r   gcs     rQ   	add_classGlyphClass.add_class  st     99s4;;''MM  TYY[!9:R 2;;=)$	rW   )r   r   r   NNr   )r   r   r   r   r   r   r   r   r   r   r   r   r  r   rN   rW   rQ   r   r      s.    ;"A#"	%%%rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i#  zuA glyph class name, such as ``@FRENCH_MARKS``. This must be instantiated
with a :class:`GlyphClassDefinition` object.Nc                 h    [         R                  X5        [        U[        5      (       d   eXl        g r   )r'   r   r   r   
glyphclass)r   r	  r   s      rQ   r   GlyphClassName.__init__'  s)    D+*&:;;;;$rW   c                 H    [        U R                  R                  5       5      $ r   )r   r	  r   r   s    rQ   r   GlyphClassName.glyphSet,  s    T__--/00rW   c                 4    SU R                   R                  -   $ N@)r	  r   r   s     rQ   r   GlyphClassName.asFea0  s    T__))))rW   )r	  r   r   r   rN   rW   rQ   r   r   #  s    4%
1*rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i4  zA mark class name, such as ``@FRENCH_MARKS`` defined with ``markClass``.
This must be instantiated with a :class:`MarkClass` object.Nc                 h    [         R                  X5        [        U[        5      (       d   eXl        g r   )r'   r   r   r   	markClass)r   r  r   s      rQ   r   MarkClassName.__init__8  s(    D+)Y////"rW   c                 6    U R                   R                  5       $ r   )r  r   r   s    rQ   r   MarkClassName.glyphSet=  s    ~~&&((rW   c                 4    SU R                   R                  -   $ r  )r  r   r   s     rQ   r   MarkClassName.asFeaA  s    T^^((((rW   )r  r   r   r   rN   rW   rQ   r   r   4  s    C#
))rW   r   c                   ,    \ rS rSrSrSS jrSS jrSrg)	r   iE  zAn anonymous data block.Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   tagcontent)r   r  r  r   s       rQ   r   AnonymousBlock.__init__H  s    4*rW   c                     SR                  U R                  5      nX R                  -  nUSR                  U R                  5      -  nU$ )Nzanon {} {{
z}} {};

)r   r  r  r   r   ress      rQ   r   AnonymousBlock.asFeaM  s@    ##DHH-|||""488,,
rW   )r  r  r   r   r   r   r   r   r   r   r   r   rN   rW   rQ   r   r   E  s    "
rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   iT  z,A block of statements: feature, lookup, etc.Nc                 <    [         R                  X5        / U l        g r   )rB   r   
statementsr   s     rQ   r   Block.__init__W  s    4*rW   c                 L    U R                    H  nUR                  U5        M     g)zWhen handed a 'builder' object of comparable interface to
:class:`fontTools.feaLib.builder`, walks the statements in this
block, calling the builder callbacks.N)r%  r   )r   r   ss      rQ   r   Block.build[  s     AGGG !rW   c           
          U[         -  nUSU-   R                  U R                   Vs/ s H  o"R                  US9PM     sn5      -   S-   $ s  snf )N
r   )SHIFTrT   r%  r   )r   r   r(  s      rQ   r   Block.asFeab  sR    %f}""DOO#TOqGG6G$:O#TUV	
#Ts   A
)r%  r   r   	r   r   r   r   r   r   r   r   r   rN   rW   rQ   r   r   T  s    6
rW   r   c                   (    \ rS rSrSrS rSS jrSrg)r
   ik  zlThe top-level element of the syntax tree, containing the whole feature
file in its ``statements`` attribute.c                 :    [         R                  U S S9  0 U l        g Nr   )r   r   markClassesr   s    rQ   r   FeatureFile.__init__o  s    td+rW   c                 N   ^ SR                  U4S jU R                   5       5      $ )Nr+  c              3   @   >#    U  H  oR                  TS 9v   M     g7f)r,  Nr   )rO   r(  r   s     rQ   rR   $FeatureFile.asFea.<locals>.<genexpr>t  s     IA/   )rT   r%  r   s    `rQ   r   FeatureFile.asFeas  s    yyIIIIrW   )r3  Nr   r"  rN   rW   rQ   r
   r
   k  s    -JrW   r
   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   iw  zA named feature block.Nc                 J    [         R                  X5        XsU l        U l        g r   r   r   r   use_extensionr   r   r=  r   s       rQ   r   FeatureBlock.__init__z      t&(,%	4%rW   c                 T   UR                  U R                  U R                  5        UR                  n0 Ul        [        R                  X5        UR                  R                  5        H&  u  p4UR                  U/ 5      R                  U5        M(     X!l        UR                  5         g)Call the ``start_feature`` callback on the builder object, visit
all the statements in this feature, and then call ``end_feature``.N)
start_featurer   r   	features_r   r   items
setdefaultr   end_feature)r   r   featureskeyvalues        rQ   r   FeatureBlock.build~  s     	dmmTYY7 $$D"!++113JCR(//6 4$rW   c                     USU R                   R                  5       -  -   nU R                  (       a  US-  nUS-  nU[        R	                  XS9-  nX!SU R                   R                  5       -  -   -  nU$ )Nzfeature %s useExtension {
r,  } %s;
)r   stripr=  r   r   r  s      rQ   r   FeatureBlock.asFea  so    }tyy'888?"Cuu{{4{//	DIIOO$5555
rW   r   r=  FNr   r/  rN   rW   rQ   r   r   w  s     <rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i  zUA block inside another block, for example when found inside a
``cvParameters`` block.Nc                 F    [         R                  X5        Xl        X l        g r   )r   r   r  
block_name)r   r  rV  r   s       rQ   r   NestedBlock.__init__  s    t&$rW   c                     [         R                  X5        U R                  S:X  a  UR                  U R                  5        g g )NParamUILabelNameID)r   r   rV  add_to_cv_num_named_paramsr  r   s     rQ   r   NestedBlock.build  s2    D"??22..txx8 3rW   c                     SR                  XR                  5      nU[        R                  XS9-  nUSR                  U5      -  nU$ )Nz{}{} {{
r,  z{}}};
)r   rV  r   r   r  s      rQ   r   NestedBlock.asFea  sE      9u{{4{//y''
rW   )rV  r  r   r   r/  rN   rW   rQ   r   r     s    %
9
rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i  z*A named lookup, containing ``statements``.Nc                 J    [         R                  X5        XsU l        U l        g r   r<  r>  s       rQ   r   LookupBlock.__init__  r@  rW   c                     UR                  U R                  U R                  5        [        R	                  X5        UR                  5         g r   )start_lookup_blockr   r   r   r   end_lookup_blockr   s     rQ   r   LookupBlock.build  s2    ""4==$))<D"  "rW   c                     SR                  U R                  5      nU R                  (       a  US-  nUS-  nU[        R	                  XS9-  nUSR                  XR                  5      -  nU$ )Nz
lookup {} rM  rN  r,  z	{}}} {};
)r   r   r=  r   r   r  s      rQ   r   LookupBlock.asFea  se    !!$)),?"Cuu{{4{//|""69955
rW   rR  rS  r   r/  rN   rW   rQ   r   r     s    4<#rW   r   c                   :   ^  \ rS rSrSrSS jrSU 4S jjrSrU =r$ )rG   i  zA ``table ... { }`` block.c                 :    [         R                  X5        Xl        g r   )r   r   r   )r   r   r   s      rQ   r   TableBlock.__init__  s    t&	rW   c                    > SR                  U R                  R                  5       5      nU[        [        U ]  US9-  nUSR                  U R                  R                  5       5      -  nU$ )Nztable {} {{
r,  z}} {};
)r   r   rP  r   rG   r   )r   r   r   r   s      rQ   r   TableBlock.asFea  s\    $$TYY__%67uZ,F,;;z  !233
rW   )r   r   r   r   r   s   @rQ   rG   rG     s    $ rW   rG   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i  z!Example: ``@UPPERCASE = [A-Z];``.Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   r   r   )r   r   r   r   s       rQ   r   GlyphClassDefinition.__init__  s    4*	rW   c                 H    [        U R                  R                  5       5      $ r   )r   r   r   r   s    rQ   r   GlyphClassDefinition.glyphSet  s    T[[))+,,rW   c                 b    SU R                   -   S-   U R                  R                  5       -   S-   $ )Nr  z = ;)r   r   r   r   s     rQ   r   GlyphClassDefinition.asFea  s,    TYY&):):)<<sBBrW   )r   r   r   r   r   rN   rW   rQ   r   r     s    +
-CrW   r   c                   4    \ rS rSrSr SS jrS rS	S jrSrg)
r   i  zExample: ``GlyphClassDef @UPPERCASE, [B], [C], [D];``. The parameters
must be either :class:`GlyphClass` or :class:`GlyphClassName` objects, or
``None``.Nc                 b    [         R                  X5        XsU l        U l        X0l        X@l        g r   )rB   r   
baseGlyphs
markGlyphsligatureGlyphscomponentGlyphs)r   rv  rw  rx  ry  r   s         rQ   r   GlyphClassDefStatement.__init__  s,     	4*,6(,.rW   c                    U R                   (       a  U R                   R                  5       O	[        5       nU R                  (       a  U R                  R                  5       O	[        5       nU R                  (       a  U R                  R                  5       O	[        5       nU R
                  (       a  U R
                  R                  5       O	[        5       nUR                  U R                  X#XE5        g)z3Calls the builder's ``add_glyphClassDef`` callback.N)rv  r   r   rx  rw  ry  add_glyphClassDefr   )r   r   r   ligarp   comps         rQ   r   GlyphClassDefStatement.build  s    -1__t'')%'151D1Dt""++-%'-1__t'')%'262F2Ft##,,.EG!!$--THrW   c                    SR                  U R                  (       a  U R                  R                  5       OSU R                  (       a  U R                  R                  5       OSU R                  (       a  U R                  R                  5       OSU R
                  (       a  U R
                  R                  5       5      $ S5      $ )NzGlyphClassDef {}, {}, {}, {};r   )r   rv  r   rx  rw  ry  r   s     rQ   r   GlyphClassDefStatement.asFea  s    .55'+DOO!!#B+/+>+>D%%'B'+DOO!!#B,0,@,@D  &&(	
 	
 GI	
 	
rW   )rv  ry  rx  rw  r   r   r/  rN   rW   rQ   r   r     s    
 QU/I
rW   r   c                   4    \ rS rSrSrS rS rS rS	S jrSr	g)
r   i  a  One `or more` ``markClass`` statements for the same mark class.

While glyph classes can be defined only once, the feature file format
allows expanding mark classes with multiple definitions, each using
different glyphs and anchors. The following are two ``MarkClassDefinitions``
for the same ``MarkClass``::

    markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
    markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

The ``MarkClass`` object is therefore just a container for a list of
:class:`MarkClassDefinition` statements.
c                 <    Xl         / U l        [        5       U l        g r   )r   definitionsr   r   )r   r   s     rQ   r   MarkClass.__init__  s    	!mrW   c                 T   [        U[        5      (       d   eU R                  R                  U5        UR	                  5        Hb  nX R
                  ;   aB  U R
                  U   R                  nUc  SnOSU 3n[        SU< SU< 3UR                  5      eXR
                  U'   Md     g)z@Add a :class:`MarkClassDefinition` statement to this mark class.Nr   z at zGlyph z already defined)r   r   r  r   r   r   r   r   )r   
definitionr   otherLocr   s        rQ   addDefinitionMarkClass.addDefinition  s    *&9::::
+((*E#;;u-66#C 
+C%493?ATAT  ",KK +rW   c                 H    [        U R                  R                  5       5      $ r   )r   r   keysr   s    rQ   r   MarkClass.glyphSet#  s    T[[%%'((rW   c                 J    SR                  S U R                   5       5      nU$ )Nr+  c              3   @   #    U  H  oR                  5       v   M     g 7fr   r   )rO   ds     rQ   rR   "MarkClass.asFea.<locals>.<genexpr>(  s     <+;a		+;   )rT   r  r  s      rQ   r   MarkClass.asFea'  s!    ii<4+;+;<<
rW   )r  r   r   Nr   )
r   r   r   r   r   r   r  r   r   r   rN   rW   rQ   r   r     s    $
, )rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i,  a  A single ``markClass`` statement. The ``markClass`` should be a
:class:`MarkClass` object, the ``anchor`` an :class:`Anchor` object,
and the ``glyphs`` parameter should be a `glyph-containing object`_ .

Example:

    .. code:: python

        mc = MarkClass("FRENCH_ACCENTS")
        mc.addDefinition( MarkClassDefinition(mc, Anchor(350, 800),
            GlyphClass([ GlyphName("acute"), GlyphName("grave") ])
        ) )
        mc.addDefinition( MarkClassDefinition(mc, Anchor(350, -200),
            GlyphClass([ GlyphName("cedilla") ])
        ) )

        mc.asFea()
        # markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
        # markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

Nc                     [         R                  X5        [        U[        5      (       d   e[        U[        5      (       a  [        U[
        5      (       d   eXUsU l        U l        U l        g r   )	rB   r   r   r   r   r'   r  rX   r   )r   r  rX   r   r   s        rQ   r   MarkClassDefinition.__init__C  sV    4*)Y////&&))j.L.LLL3<f0T[rW   c                 6    U R                   R                  5       $ r   )r   r   r   s    rQ   r   MarkClassDefinition.glyphSetI  s    {{##%%rW   c                     SR                  U R                  R                  5       U R                  R                  5       U R                  R
                  5      $ )NzmarkClass {} {} @{};)r   r   r   rX   r  r   r   s     rQ   r   MarkClassDefinition.asFeaM  s@    %,,KK!2!2!4dnn6I6I
 	
rW   )rX   r   r  r   r   r   rN   rW   rQ   r   r   ,  s    ,M&
rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   iS  zA ``sub ... from ...`` statement.

``glyph`` and ``replacement`` should be `glyph-containing objects`_.
``prefix`` and ``suffix`` should be lists of `glyph-containing objects`_.Nc                 d    [         R                  X5        XUsU l        U l        U l        X@l        g r   )rB   r   prefixr   suffixreplacement)r   r  r   r  r  r   s         rQ   r    AlternateSubstStatement.__init__Y  s*    4*06v,TZ&rW   c                    U R                   R                  5       n[        U5      S:X  d   U5       e[        U5      S   nU R                   Vs/ s H  o3R                  5       PM     nnU R
                   Vs/ s H  oUR                  5       PM     nnU R                  R                  5       nUR                  U R                  XBXg5        gs  snf s  snf )z5Calls the builder's ``add_alternate_subst`` callback.r   r   N)	r   r   r   listr  r  r  add_alternate_substr   )r   r   r   pr  r(  r  r  s           rQ   r   AlternateSubstStatement.build^  s    

##%5zQ%%UA(,41**,4(,41**,4&&//1##DMM6&V 54s   C	6Cc                 B   Sn[        U R                  5      (       d  [        U R                  5      (       a  [        U R                  5      (       a/  USR                  [	        [
        U R                  5      5      S-   -  nU[        U R                  5      S-   -  n[        U R                  5      (       a/  USSR                  [	        [
        U R                  5      5      -   -  nOU[        U R                  5      -  nUS-  nU[        U R                  5      -  nUS-  nU$ )Nsub r   'z from rr  )r   r  r  rT   r   r   r   r  r  s      rQ   r   AlternateSubstStatement.asFeah  s    t{{s4;;//4;;sxxE4;; 783>>5$s**C4;;sSXXc%&=>>>5$$CxuT%%&&s

rW   )r   r  r  r  r   r   r/  rN   rW   rQ   r   r   S  s    Q
'
WrW   r   c                   6    \ rS rSrSr     SS jrSS jrSrg)	r   ix  zAn ``Anchor`` element, used inside a ``pos`` rule.

If a ``name`` is given, this will be used in preference to the coordinates.
Other values should be integer.
Nc                     [         R                  X5        X0l        XUsU l        U l        U l        XVsU l        U l        g r   )r'   r   r   xycontourpointxDeviceTableyDeviceTable)r   r  r  r   r  r  r  r   s           rQ   r   Anchor.__init__  s<     	D+	,-,))/;,4,rW   c                    U R                   b  SR                  U R                   5      $ SR                  U R                  U R                  5      nU R                  (       a  USR                  U R                  5      -  nU R
                  (       d  U R                  (       a:  US-  nU[        U R
                  5      -  nUS-  nU[        U R                  5      -  nUS-  nU$ )Nz<anchor {}>z<anchor {} {} contourpoint {}r   >)r   r   r  r  r  r  r  rV   r  s      rQ   r   Anchor.asFea  s    99  ''		22$$TVVTVV4%,,T->->??C 1 13JC>$"3"344C3JC>$"3"344Cs

rW   )r  r   r  r  r  r  )NNNNNr   r"  rN   rW   rQ   r   r   x  s#     JrW   r   c                   ,    \ rS rSrSrSS jrSS jrSrg)	r   i  zCA named anchor definition. (2.e.viii). ``name`` should be a string.Nc                 h    [         R                  X5        XX44u  U l        U l        U l        U l        g r   )rB   r   r   r  r  r  )r   r   r  r  r  r   s         rQ   r   AnchorDefinition.__init__  s,    4*7;7O4	46464#4rW   c                     SR                  U R                  U R                  5      nU R                  (       a  USR                  U R                  5      -  nUSR                  U R                  5      -  nU$ )NzanchorDef {} {}r  z {};)r   r  r  r  r   r  s      rQ   r   AnchorDefinition.asFea  s]    &&tvvtvv6%,,T->->??Cv}}TYY''
rW   )r  r   r  r  r  r   r"  rN   rW   rQ   r   r     s    MPrW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i  z&A ``GDEF`` table ``Attach`` statement.Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   r   contourPoints)r   r   r  r   s       rQ   r   AttachStatement.__init__  s    4**rW   c                     U R                   R                  5       nUR                  U R                  X R                  5        g)z3Calls the builder's ``add_attach_points`` callback.N)r   r   add_attach_pointsr   r  r   r   r   s      rQ   r   AttachStatement.build  s.    %%'!!$--9K9KLrW   c                     SR                  U R                  R                  5       SR                  S U R                   5       5      5      $ )NzAttach {} {};r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   str)rO   cs     rQ   rR   (AttachStatement.asFea.<locals>.<genexpr>  s     )M:LQ#a&&:L   )r   r   r   rT   r  r   s     rQ   r   AttachStatement.asFea  s<    %%KK)M$:L:L)M!M
 	
rW   )r  r   r   r   r/  rN   rW   rQ   r   r     s    0+
M

rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r    i  a  A chained contextual positioning statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_ .

``lookups`` should be a list of elements representing what lookups
to apply at each glyph position. Each element should be a
:class:`LookupBlock` to apply a single chaining lookup at the given
position, a list of :class:`LookupBlock`\ s to apply multiple
lookups, or ``None`` to apply no lookup. The length of the outer
list should equal the length of ``glyphs``; the inner lists can be
of variable length.Nc                    [         R                  X5        XUsU l        U l        U l        [        U5      U l        [        U5       H  u  pgU(       d  M   S U 5         M     g ! [         a    U/U R                  U'    M:  f = f)Nc              3   $   #    U  H  ov   M     g 7fr   rN   rO   _s     rQ   rR   4ChainContextPosStatement.__init__.<locals>.<genexpr>       '1Q   	rB   r   r  r   r  r  lookupsr`   	TypeErrorr   r  r   r  r  r   irn   s           rQ   r   !ChainContextPosStatement.__init__  r    4*06-T[$+G}"7+IAv/'' , ! /'-hDLLO/   	A##B Bc                 f   U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   Vs/ s H  ofR                  5       PM     nnUR	                  U R
                  X5XpR                  5        gs  snf s  snf s  snf )z7Calls the builder's ``add_chain_context_pos`` callback.N)r  r   r   r  add_chain_context_posr   r  r   r   r  r  r   r   r(  r  s           rQ   r   ChainContextPosStatement.build  s~    (,41**,4(,41**,4(,41**,4%%MM66<<	
 544   B$B)!B.c                 t   Sn[        U R                  5      (       dG  [        U R                  5      (       d-  [        U R                   Vs/ s H  o3S LPM     sn5      (       Ga  [        U R                  5      (       a(  USR                  S U R                   5       5      S-   -  n[        U R                  5       Hy  u  pEX%R                  5       S-   -  nU R                  U   (       a(  U R                  U    H  nUSUR                  -   -  nM     U[        U R                  5      S-
  :  d  Mt  US-  nM{     [        U R                  5      (       a/  USSR                  [        [        U R                  5      5      -   -  nO,USR                  [        [        U R                  5      5      -  nUS-  nU$ s  snf )Npos r   c              3   @   #    U  H  oR                  5       v   M     g 7fr   r   rO   r   s     rQ   rR   1ChainContextPosStatement.asFea.<locals>.<genexpr>       ?;a		;r  r   lookup r   rr  r   r  r  anyr  rT   r`   r   r   r   r   r   r   r   r   r  r  r   lus          rQ   r   ChainContextPosStatement.asFea  R   4;;4<<8<aTM<8994;;sxx?4;;??#EE!$++.wwy3&<<?"ll1ozBGG33 .s4;;'!++3JC / 4;;sSXXc%&=>>>388Ctzz233Cs

! 9   
F5r   r  r  r  r   r   r/  rN   rW   rQ   r    r          	/
rW   r    c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r!   i  a  A chained contextual substitution statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_ .

``lookups`` should be a list of elements representing what lookups
to apply at each glyph position. Each element should be a
:class:`LookupBlock` to apply a single chaining lookup at the given
position, a list of :class:`LookupBlock`\ s to apply multiple
lookups, or ``None`` to apply no lookup. The length of the outer
list should equal the length of ``glyphs``; the inner lists can be
of variable length.Nc                    [         R                  X5        XUsU l        U l        U l        [        U5      U l        [        U5       H  u  pgU(       d  M   S U 5         M     g ! [         a    U/U R                  U'    M:  f = f)Nc              3   $   #    U  H  ov   M     g 7fr   rN   r  s     rQ   rR   6ChainContextSubstStatement.__init__.<locals>.<genexpr>  r  r  r  r  s           rQ   r   #ChainContextSubstStatement.__init__  r  r  c                 f   U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   Vs/ s H  ofR                  5       PM     nnUR	                  U R
                  X5XpR                  5        gs  snf s  snf s  snf )z9Calls the builder's ``add_chain_context_subst`` callback.N)r  r   r   r  add_chain_context_substr   r  r  s           rQ   r    ChainContextSubstStatement.build  s~    (,41**,4(,41**,4(,41**,4''MM66<<	
 544r  c                 t   Sn[        U R                  5      (       dG  [        U R                  5      (       d-  [        U R                   Vs/ s H  o3S LPM     sn5      (       Ga  [        U R                  5      (       a(  USR                  S U R                   5       5      S-   -  n[        U R                  5       Hy  u  pEX%R                  5       S-   -  nU R                  U   (       a(  U R                  U    H  nUSUR                  -   -  nM     U[        U R                  5      S-
  :  d  Mt  US-  nM{     [        U R                  5      (       a/  USSR                  [        [        U R                  5      5      -   -  nO,USR                  [        [        U R                  5      5      -  nUS-  nU$ s  snf )Nr  r   c              3   @   #    U  H  oR                  5       v   M     g 7fr   r   r  s     rQ   rR   3ChainContextSubstStatement.asFea.<locals>.<genexpr>#  r  r  r  r  r   rr  r  r  s          rQ   r    ChainContextSubstStatement.asFea  r  r  r  r   r   r/  rN   rW   rQ   r!   r!     r  rW   r!   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r$   i3  zjA cursive positioning statement. Entry and exit anchors can either
be :class:`Anchor` objects or ``None``.Nc                 V    [         R                  X5        Xl        X#sU l        U l        g r   )rB   r   r	  entryAnchor
exitAnchor)r   r	  r  r  r   s        rQ   r   CursivePosStatement.__init__7  s$    4*$,7)$/rW   c                     UR                  U R                  U R                  R                  5       U R                  U R
                  5        g)z8Calls the builder object's ``add_cursive_pos`` callback.N)add_cursive_posr   r	  r   r  r  r   s     rQ   r   CursivePosStatement.build<  s4    MM4??335t7G7G	
rW   c                 
   U R                   (       a  U R                   R                  5       OSnU R                  (       a  U R                  R                  5       OSnSR                  U R                  R                  5       X#5      $ )N<anchor NULL>zpos cursive {} {} {};)r  r   r  r   r	  )r   r   entryexits       rQ   r   CursivePosStatement.asFeaB  sZ    ,0,<,<  &&(/*.//t$$&&--doo.C.C.EuSSrW   )r  r  r	  r   r   r/  rN   rW   rQ   r$   r$   3  s    /D

TrW   r$   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r)   iH  zExample: ``feature salt;``Nc                 J    [         R                  X5        X!sU l        U l        g r   )rB   r   r   featureName)r   r  r   s      rQ   r   "FeatureReferenceStatement.__init__K  s    4*+3't'rW   c                 P    UR                  U R                  U R                  5        g)z>Calls the builder object's ``add_feature_reference`` callback.N)add_feature_referencer   r  r   s     rQ   r   FeatureReferenceStatement.buildO  s    %%dmmT5E5EFrW   c                 8    SR                  U R                  5      $ )Nzfeature {};)r   r  r   s     rQ   r   FeatureReferenceStatement.asFeaS  s    ##D$4$455rW   )r  r   r   r   r/  rN   rW   rQ   r)   r)   H  s    $BG6rW   r)   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r,   iW  zAn ``ignore pos`` statement, containing `one or more` contexts to ignore.

``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
with each of ``prefix``, ``glyphs`` and ``suffix`` being
`glyph-containing objects`_ .Nc                 :    [         R                  X5        Xl        g r   rB   r   chainContextsr   r  r   s      rQ   r   IgnorePosStatement.__init__^      4**rW   c                 D   U R                    H  u  p#nU Vs/ s H  oUR                  5       PM     nnU Vs/ s H  ofR                  5       PM     nnU Vs/ s H  owR                  5       PM     nnUR                  U R                  X#U/ 5        M     gs  snf s  snf s  snf )zSCalls the builder object's ``add_chain_context_pos`` callback on each
rule context.N)r  r   r  r   r   r   r  r   r  r  r   r(  s           rQ   r   IgnorePosStatement.buildb  s     '+&8&8"FF,23FqjjlFF3,23FqjjlFF3,23FqjjlFF3))$--QST	 '9333   BBBc           	         / nU R                    H  u  p4nSn[        U5      (       d  [        U5      (       a  [        U5      (       a%  USR                  [        [        U5      5      S-   -  nUSR                  S U 5       5      -  n[        U5      (       a%  USSR                  [        [        U5      5      -   -  nO"USR                  [        [        U5      5      -  nUR                  U5        M     SSR                  U5      -   S-   $ )Nr   r   c              3   F   #    U  H  oR                  5       S -   v   M     g7fr  Nr   r  s     rQ   rR   +IgnorePosStatement.asFea.<locals>.<genexpr>r  s     @A	C   !zignore pos rL   rr  r  r   rT   r   r   r   r   r   contextsr  r   r  r   s          rQ   r   IgnorePosStatement.asFeak  s    &*&8&8"FFC6{{c&kkv;;388Cv$67#==Csxx@@@@v;;3#eV*<!===CsxxE6 233OOC  '9 tyy22S88rW   r  r   r   r/  rN   rW   rQ   r,   r,   W  s    %+U9rW   r,   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r-   i{  zAn ``ignore sub`` statement, containing `one or more` contexts to ignore.

``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
with each of ``prefix``, ``glyphs`` and ``suffix`` being
`glyph-containing objects`_ .Nc                 :    [         R                  X5        Xl        g r   r  r  s      rQ   r   IgnoreSubstStatement.__init__  r  rW   c                 D   U R                    H  u  p#nU Vs/ s H  oUR                  5       PM     nnU Vs/ s H  ofR                  5       PM     nnU Vs/ s H  owR                  5       PM     nnUR                  U R                  X#U/ 5        M     gs  snf s  snf s  snf )zUCalls the builder object's ``add_chain_context_subst`` callback on
each rule context.N)r  r   r  r   r  s           rQ   r   IgnoreSubstStatement.build  s     '+&8&8"FF,23FqjjlFF3,23FqjjlFF3,23FqjjlFF3++DMM66SUV	 '9333r  c           	         / nU R                    H  u  p4nSn[        U5      (       a%  USR                  [        [        U5      5      S-   -  nUSR                  S U 5       5      -  n[        U5      (       a%  USSR                  [        [        U5      5      -   -  nUR                  U5        M     SSR                  U5      -   S-   $ )Nr   r   c              3   F   #    U  H  oR                  5       S -   v   M     g7fr  r   r  s     rQ   rR   -IgnoreSubstStatement.asFea.<locals>.<genexpr>  s     <VGGIOVr!  zignore sub rL   rr  r"  r#  s          rQ   r   IgnoreSubstStatement.asFea  s    &*&8&8"FFC6{{sxxE6 23c99388<V<<<C6{{sSXXc%&8999OOC  '9 tyy22S88rW   r&  r   r   r/  rN   rW   rQ   r-   r-   {  s    %+W
9rW   r-   c                   @   ^  \ rS rSrSrSU 4S jjrS rSS jrSrU =r	$ )	r.   i  zAn ``include()`` statement.c                 8   > [         [        U ]  U5        Xl        g r   )r   r.   r   filename)r   r2  r   r   s      rQ   r   IncludeStatement.__init__  s    .x8 rW   c                 .    [        SU R                  5      e)NzqBuilding an include statement is not implemented yet. Instead, use Parser(..., followIncludes=True) for building.)r   r   r   s    rQ   r   IncludeStatement.build  s    JMM
 	
rW   c                 &    USU R                   -  -   $ )Nzinclude(%s);r2  r   s     rQ   r   IncludeStatement.asFea  s    666rW   r7  r   r   )
r   r   r   r   r   r   r   r   r   r   r   s   @rQ   r.   r.     s    %!
7 7rW   r.   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r/   i  z*A ``language`` statement within a feature.Nc                 t    [         R                  X5        [        U5      S:X  d   eXl        X l        X0l        g )N   )rB   r   r   rl   include_defaultrx   )r   rl   r<  rx   r   s        rQ   r   LanguageStatement.__init__  s2    4*8}!!! . rW   c                 x    UR                  U R                  U R                  U R                  U R                  S9  g)z4Call the builder object's ``set_language`` callback.)r   rl   r<  rx   N)set_languager   rl   r<  rx   r   s     rQ   r   LanguageStatement.build  s3    ]]]] 00]]	 	 	
rW   c                     SR                  U R                  R                  5       5      nU R                  (       d  US-  nU R                  (       a  US-  nUS-  nU$ )Nzlanguage {}z exclude_dfltz	 requiredrr  )r   rl   rP  r<  rx   r  s      rQ   r   LanguageStatement.asFea  sQ    ""4==#6#6#89##?"C==;Cs

rW   )r<  rl   rx   )TFNr   r/  rN   rW   rQ   r/   r/     s    4!
rW   r/   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r0   i  z)A top-level ``languagesystem`` statement.Nc                 J    [         R                  X5        XsU l        U l        g r   )rB   r   r|   rl   )r   r|   rl   r   s       rQ   r    LanguageSystemStatement.__init__  s    4*&,"T]rW   c                 f    UR                  U R                  U R                  U R                  5        g)z<Calls the builder object's ``add_language_system`` callback.N)add_language_systemr   r|   rl   r   s     rQ   r   LanguageSystemStatement.build  s     ##DMM4;;NrW   c                 j    SR                  U R                  U R                  R                  5       5      $ )Nzlanguagesystem {} {};)r   r|   rl   rP  r   s     rQ   r   LanguageSystemStatement.asFea  s&    &--dkk4==;N;N;PQQrW   )rl   r|   r   r   r/  rN   rW   rQ   r0   r0     s    38ORrW   r0   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r*   i  zA ``head`` table ``FontRevision`` statement. ``revision`` should be a
number, and will be formatted to three significant decimal places.Nc                 :    [         R                  X5        Xl        g r   )rB   r   revision)r   rM  r   s      rQ   r   FontRevisionStatement.__init__  s    4* rW   c                 P    UR                  U R                  U R                  5        g r   )set_font_revisionr   rM  r   s     rQ   r   FontRevisionStatement.build  s    !!$--?rW   c                 8    SR                  U R                  5      $ )NzFontRevision {:.3f};)r   rM  r   s     rQ   r   FontRevisionStatement.asFea  s    %,,T]];;rW   )rM  r   r   r/  rN   rW   rQ   r*   r*     s    J!@<rW   r*   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r1   i  zA ``GDEF`` table ``LigatureCaretByIndex`` statement. ``glyphs`` should be
a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 J    [         R                  X5        XsU l        U l        g r   rB   r   r   caretsr   r   rW  r   s       rQ   r   &LigatureCaretByIndexStatement.__init__      4*$* T[rW   c                     U R                   R                  5       nUR                  U R                  U[	        U R
                  5      5        g)zBCalls the builder object's ``add_ligatureCaretByIndex_`` callback.N)r   r   add_ligatureCaretByIndex_r   setrW  r  s      rQ   r   #LigatureCaretByIndexStatement.build  s3    %%'))$--T[[AQRrW   c                     SR                  U R                  R                  5       SR                  S U R                   5       5      5      $ )NzLigatureCaretByIndex {} {};r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r  rO   r  s     rQ   rR   6LigatureCaretByIndexStatement.asFea.<locals>.<genexpr>       )F+Q#a&&+r  r   r   r   rT   rW  r   s     rQ   r   #LigatureCaretByIndexStatement.asFea  s:    ,33KK)F$++)F!F
 	
rW   rW  r   r   r   r/  rN   rW   rQ   r1   r1     s    R4S

rW   r1   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r2   i  zA ``GDEF`` table ``LigatureCaretByPos`` statement. ``glyphs`` should be
a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 J    [         R                  X5        XsU l        U l        g r   rV  rX  s       rQ   r   $LigatureCaretByPosStatement.__init__  rZ  rW   c                     U R                   R                  5       nUR                  U R                  U[	        U R
                  5      5        g)z@Calls the builder object's ``add_ligatureCaretByPos_`` callback.N)r   r   add_ligatureCaretByPos_r   r]  rW  r  s      rQ   r   !LigatureCaretByPosStatement.build  s3    %%'''vs4;;?OPrW   c                     SR                  U R                  R                  5       SR                  S U R                   5       5      5      $ )NzLigatureCaretByPos {} {};r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r  ra  s     rQ   rR   4LigatureCaretByPosStatement.asFea.<locals>.<genexpr>  rc  r  rd  r   s     rQ   r   !LigatureCaretByPosStatement.asFea
  s:    *11KK)F$++)F!F
 	
rW   rf  r   r   r/  rN   rW   rQ   r2   r2     s    R4Q

rW   r2   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r3   i  a?  A chained contextual substitution statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_; ``replacement`` should be a single
`glyph-containing object`_.

If ``forceChain`` is True, this is expressed as a chaining rule
(e.g. ``sub f' i' by f_i``) even when no context is given.Nc                 t    [         R                  X5        XUsU l        U l        U l        XEsU l        U l        g r   )rB   r   r  r   r  r  
forceChain)r   r  r   r  r  rs  r   s          rQ   r   LigatureSubstStatement.__init__  s3    4*17-T[$+,7)$/rW   c                 |   U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   Vs/ s H  ofR                  5       PM     nnUR	                  U R
                  X5XpR                  U R                  5        g s  snf s  snf s  snf r   )r  r   r   r  add_ligature_substr   r  rs  r  s           rQ   r   LigatureSubstStatement.build  s    (,41**,4(,41**,4(,41**,4""MM663C3CT__	
 544s   B/B4!B9c                 v   Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       a  [        U R                  5      (       a(  USR	                  S U R                   5       5      S-   -  nUSR	                  S U R
                   5       5      -  n[        U R                  5      (       a(  USSR	                  S U R                   5       5      -   -  nO%USR	                  S U R
                   5       5      -  nUS-  nU[        U R                  5      -  nUS-  nU$ )	Nr  r   c              3   @   #    U  H  oR                  5       v   M     g 7fr   r   r  s     rQ   rR   /LigatureSubstStatement.asFea.<locals>.<genexpr>+  r  r  c              3   F   #    U  H  oR                  5       S -   v   M     g7fr  r   r  s     rQ   rR   rz  ,  s     A[GGIO[r!  c              3   @   #    U  H  oR                  5       v   M     g 7fr   r   r  s     rQ   rR   rz  .  s     %EAggiir  c              3   @   #    U  H  oR                  5       v   M     g 7fr   r   r  s     rQ   rR   rz  0  s     ;{!GGII{r   by rr  )r   r  r  rs  rT   r   r   r  r  s      rQ   r   LigatureSubstStatement.asFea'  s    t{{s4;;//4??4;;sxx?4;;??#EE388AT[[AAAC4;;sSXX%E%EEEE388;t{{;;;CvuT%%&&s

rW   )rs  r   r  r  r  r   r   r/  rN   rW   rQ   r3   r3     s    BD

rW   r3   c                   4    \ rS rSrSr SS jrS rS	S jrSrg)
r4   i7  zA ``lookupflag`` statement. The ``value`` should be an integer value
representing the flags in use, but not including the ``markAttachment``
class and ``markFilteringSet`` values, which must be specified as
glyph-containing objects.Nc                 R    [         R                  X5        Xl        X l        X0l        g r   )rB   r   rJ  markAttachmentmarkFilteringSet)r   rJ  r  r  r   s        rQ   r   LookupFlagStatement.__init__=  s#     	4*
, 0rW   c                     SnU R                   b  U R                   R                  5       nSnU R                  b  U R                  R                  5       nUR                  U R                  U R
                  X#5        g)z8Calls the builder object's ``set_lookup_flag`` callback.N)r  r   r  set_lookup_flagr   rJ  )r   r   
markAttach
markFilters       rQ   r   LookupFlagStatement.buildE  sf    
*,,557J
  ,..779Jtzz:RrW   c                    / n/ SQnSn[        [        U5      5       H.  nU R                  U-  S:w  a  UR                  X5   5        US-  nM0     U R                  b8  UR                  SR                  U R                  R                  5       5      5        U R                  b8  UR                  SR                  U R                  R                  5       5      5        U(       d  S/nSR                  SR                  U5      5      $ )	N)RightToLeftIgnoreBaseGlyphsIgnoreLigaturesIgnoreMarksr   r   zMarkAttachmentType {}zUseMarkFilteringSet {}0zlookupflag {};r   )	ranger   rJ  r   r  r   r   r  rT   )r   r   r   flagsr   r  s         rQ   r   LookupFlagStatement.asFeaO  s    Us5z"AzzD A%

58$19D # *JJ.55d6I6I6O6O6QRS  ,JJ/66t7L7L7R7R7TUV%C&&sxx}55rW   )r  r  rJ  )r   NNNr   r/  rN   rW   rQ   r4   r4   7  s    ! MQ1S6rW   r4   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r5   i`  zRepresents a ``lookup ...;`` statement to include a lookup in a feature.

The ``lookup`` should be a :class:`LookupBlock` object.Nc                 J    [         R                  X5        X!sU l        U l        g r   )rB   r   r   rn   )r   rn   r   s      rQ   r   !LookupReferenceStatement.__init__e  s    4*&."t{rW   c                 N    UR                  U R                  R                  5        g)z8Calls the builder object's ``add_lookup_call`` callback.N)add_lookup_callrn   r   r   s     rQ   r   LookupReferenceStatement.buildi  s     0 01rW   c                 L    SR                  U R                  R                  5      $ )Nz
lookup {};)r   rn   r   r   s     rQ   r   LookupReferenceStatement.asFeam  s    ""4;;#3#344rW   )r   rn   r   r   r/  rN   rW   rQ   r5   r5   `  s    ?825rW   r5   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r6   iq  zA mark-to-base positioning rule. The ``base`` should be a
`glyph-containing object`_. The ``marks`` should be a list of
(:class:`Anchor`, :class:`MarkClass`) tuples.Nc                 J    [         R                  X5        XsU l        U l        g r   )rB   r   r   marks)r   r   r  r   s       rQ   r   MarkBasePosStatement.__init__v  s    4* $	4:rW   c                     UR                  U R                  U R                  R                  5       U R                  5        g)z:Calls the builder object's ``add_mark_base_pos`` callback.N)add_mark_base_posr   r   r   r  r   s     rQ   r   MarkBasePosStatement.buildz  s)    !!$--1C1C1EtzzRrW   c                     SR                  U R                  R                  5       5      nU R                   H?  u  p4USU-   [        -   SR                  UR                  5       UR
                  5      -   -  nMA     US-  nU$ )Nzpos base {}r+  {} mark @{}rr  )r   r   r   r  r-  r   r   r   r   ams        rQ   r   MarkBasePosStatement.asFea~  sj    ""499??#45JJDA4&=5(=+?+?	166+RRRC s

rW   )r   r  r   r   r/  rN   rW   rQ   r6   r6   q  s    5,SrW   r6   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r7   i  a  A mark-to-ligature positioning rule. The ``ligatures`` must be a
`glyph-containing object`_. The ``marks`` should be a list of lists: each
element in the top-level list represents a component glyph, and is made
up of a list of (:class:`Anchor`, :class:`MarkClass`) tuples representing
mark attachment points for that position.

Example::

    m1 = MarkClass("TOP_MARKS")
    m2 = MarkClass("BOTTOM_MARKS")
    # ... add definitions to mark classes...

    glyph = GlyphName("lam_meem_jeem")
    marks = [
        [ (Anchor(625,1800), m1) ], # Attachments on 1st component (lam)
        [ (Anchor(376,-378), m2) ], # Attachments on 2nd component (meem)
        [ ]                         # No attachments on the jeem
    ]
    mlp = MarkLigPosStatement(glyph, marks)

    mlp.asFea()
    # pos ligature lam_meem_jeem <anchor 625 1800> mark @TOP_MARKS
    # ligComponent <anchor 376 -378> mark @BOTTOM_MARKS;

Nc                 J    [         R                  X5        XsU l        U l        g r   )rB   r   	ligaturesr  )r   r  r  r   s       rQ   r   MarkLigPosStatement.__init__      4*%."
rW   c                     UR                  U R                  U R                  R                  5       U R                  5        g)z9Calls the builder object's ``add_mark_lig_pos`` callback.N)add_mark_lig_posr   r  r   r  r   s     rQ   r   MarkLigPosStatement.build  s)      0G0G0I4::VrW   c                    SR                  U R                  R                  5       5      n/ nU R                   H  nSnUb  [	        U5      (       d  SU-   [
        S-  -   S-   nOHU HB  u  pgUSU-   [
        S-  -   SR                  UR                  5       UR                  5      -   -  nMD     UR                  U5        M     USU-   [
        -   S-   R                  U5      -  nUS-  nU$ )	Nzpos ligature {}r   r+  r   r  r  ligComponentrr  )	r   r  r   r  r   r-  r   r   rT   )r   r   r   ligsltempr  r  s           rQ   r   MarkLigPosStatement.asFea  s    &&t~~';';'=>ADyAf}uqy0?BDA !!)$ (..qwwy!&&ABD  KK  	v%6<<TBBs

rW   )r  r  r   r   r/  rN   rW   rQ   r7   r7     s    46WrW   r7   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r8   i  zA mark-to-mark positioning rule. The ``baseMarks`` must be a
`glyph-containing object`_. The ``marks`` should be a list of
(:class:`Anchor`, :class:`MarkClass`) tuples.Nc                 J    [         R                  X5        XsU l        U l        g r   )rB   r   	baseMarksr  )r   r  r  r   s       rQ   r   MarkMarkPosStatement.__init__  r  rW   c                     UR                  U R                  U R                  R                  5       U R                  5        g)z:Calls the builder object's ``add_mark_mark_pos`` callback.N)add_mark_mark_posr   r  r   r  r   s     rQ   r   MarkMarkPosStatement.build  s)    !!$--1H1H1JDJJWrW   c                     SR                  U R                  R                  5       5      nU R                   H?  u  p4USU-   [        -   SR                  UR                  5       UR
                  5      -   -  nMA     US-  nU$ )Nzpos mark {}r+  r  rr  )r   r  r   r  r-  r   r  s        rQ   r   MarkMarkPosStatement.asFea  sl    ""4>>#7#7#9:JJDA4&=5(=+?+?	166+RRRC s

rW   )r  r  r   r   r/  rN   rW   rQ   r8   r8     s    56XrW   r8   c                   4    \ rS rSrSr SS jrS rS	S jrSrg)
r9   i  ay  A multiple substitution statement.

Args:
    prefix: a list of `glyph-containing objects`_.
    glyph: a single glyph-containing object.
    suffix: a list of glyph-containing objects.
    replacement: a list of glyph-containing objects.
    forceChain: If true, the statement is expressed as a chaining rule
        (e.g. ``sub f' i' by f_i``) even when no context is given.
Nc                 p    [         R                  X5        XUsU l        U l        U l        X@l        XPl        g r   )rB   r   r  r   r  r  rs  )r   r  r   r  r  rs  r   s          rQ   r   MultipleSubstStatement.__init__  s1     	4*/5f,TZ&$rW   c           	      <   U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nn[        U R                  S5      (       a  U R                  R                  5       nOU R                  /n[        U5      n/ nU R                   H[  n	[        U	S5      (       a  U	R                  5       n
OU	/n
[        U
5      S:X  a  [        U
5      U:w  a  X-  n
UR                  U
5        M]     [        [        U6 5      n[        5       n[        U5       H[  u  pX;  d  M  UR                  U5        UR                  U R                  UUUU=(       a    X   =(       d    SU R                  5        M]     gs  snf s  snf )z;Calls the builder object's ``add_multiple_subst`` callback.r   r   rN   N)r  r   r  r   r   r   r  r   r  zipr]  r`   addadd_multiple_substr   rs  )r   r   r  r  r(  r  	originalscountreplacesrreplaceseen_originalsr  r   s                 rQ   r   MultipleSubstStatement.build  sG   (,41**,4(,41**,44::z**

++-III!!Aq*%%**,#7|q S\U%:!/OOG$ " X'$Y/KA-""8,**MM,2OO 0' 54s
   FFc                    Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       a  [        U R                  5      (       a/  USR	                  [        [        U R                  5      5      S-   -  nU[        U R                  5      S-   -  n[        U R                  5      (       a/  USSR	                  [        [        U R                  5      5      -   -  nOU[        U R                  5      -  nU R                  =(       d    [        5       /nUS-  nUSR	                  [        [        U5      5      -  nUS-  nU$ )Nr  r   r  r~  rr  )
r   r  r  rs  rT   r   r   r   r  r   )r   r   r   r  s       rQ   r   MultipleSubstStatement.asFea  s    t{{s4;;//4??4;;sxxE4;; 783>>5$s**C4;;sSXXc%&=>>>5$$C&&79;-vsxxE;/00s

rW   )rs  r   r  r  r  rS  r   r/  rN   rW   rQ   r9   r9     s    	 NR%BrW   r9   c                   6    \ rS rSrSr  SS jrS rS	S jrSrg)
r<   i  a  A pair positioning statement.

``glyphs1`` and ``glyphs2`` should be `glyph-containing objects`_.
``valuerecord1`` should be a :class:`ValueRecord` object;
``valuerecord2`` should be either a :class:`ValueRecord` object or ``None``.
If ``enumerated`` is true, then this is expressed as an
`enumerated pair <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#6.b.ii>`_.
Nc                 r    [         R                  X5        XPl        XsU l        U l        X4sU l        U l        g r   )rB   r   
enumeratedglyphs1valuerecord1glyphs2valuerecord2)r   r  r  r  r  r  r   s          rQ   r   PairPosStatement.__init__#  s5     	4*$*1'd'*1'd'rW   c                 n   U R                   (       a  U R                  R                  5       U R                  R                  5       /nSn[        R
                  " U6  H8  u  pESnUR                  U R                  X@R                  XPR                  5        M:     U(       d  [        SU R                  5      eg[        U R                  [        5      =(       a    [        U R                  [        5      nU(       a\  UR                  U R                  U R                  R                  U R                  U R                  R                  U R                  5        gUR                  U R                  U R                  R                  5       U R                  U R                  R                  5       U R                  5        g)a  Calls a callback on the builder object:

* If the rule is enumerated, calls ``add_specific_pair_pos`` on each
  combination of first and second glyphs.
* If the glyphs are both single :class:`GlyphName` objects, calls
  ``add_specific_pair_pos``.
* Else, calls ``add_class_pair_pos``.
FTz%Empty glyph class in positioning ruleN)r  r  r   r  	itertoolsproductadd_specific_pair_posr   r  r  r   r   r   r   add_class_pair_pos)r   r   r   	seen_pairglyph1glyph2is_specifics          rQ   r   PairPosStatement.build1  sI    ??&&($,,*?*?*ABAI"+"3"3Q"7 	--MM6+<+<fFWFW #8
 %;T]]   y9 
jLL)?
 ))""!!""!! &&%%'!!%%'!!rW   c                     U R                   (       a  SOSnU R                  (       ay  USR                  U R                  R	                  5       U R
                  R	                  5       U R                  R	                  5       U R                  R	                  5       5      -  nU$ USR                  U R                  R	                  5       U R                  R	                  5       U R
                  R	                  5       5      -  nU$ )Nzenum r   zpos {} {} {} {};zpos {} {} {};)r  r  r   r  r   r  r  r  s      rQ   r   PairPosStatement.asFea\  s    gb%,,""$!!'')""$!!'')	 C 
 ?))""$dll&8&8&:D<M<M<S<S<U C 
rW   )r  r  r  r  r  rS  r   r/  rN   rW   rQ   r<   r<     s      @)VrW   r<   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r=   il  a<  A reverse chaining substitution statement. You don't see those every day.

Note the unusual argument order: ``suffix`` comes `before` ``glyphs``.
``old_prefix``, ``old_suffix``, ``glyphs`` and ``replacements`` should be
lists of `glyph-containing objects`_. ``glyphs`` and ``replacements`` should
be one-item lists.
Nc                 b    [         R                  X5        XsU l        U l        X0l        X@l        g r   )rB   r   
old_prefix
old_suffixr   replacements)r   r  r  r   r  r   s         rQ   r   )ReverseChainSingleSubstStatement.__init__u  s)    4*+5((rW   c                    U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                  S   R                  5       nU R                  S   R                  5       n[        U5      S:X  a  U[        U5      -  nUR                  U R                  X5[        [        Xg5      5      5        g s  snf s  snf )Nr   r   )
r  r   r  r   r  r   add_reverse_chain_single_substr   dictr  r   r   r  r  r(  r  r  r  s           rQ   r   &ReverseChainSingleSubstStatement.build{  s    (,81**,8(,81**,8KKN++-	$$Q'002x=A#i.0H..MM64I0H+I	
 98s
   CCc                    Sn[        U R                  5      (       d  [        U R                  5      (       a  [        U R                  5      (       a(  USR                  S U R                   5       5      S-   -  nUSR                  S U R                   5       5      -  n[        U R                  5      (       a(  USSR                  S U R                   5       5      -   -  nO,USR                  [        [        U R                  5      5      -  nUSR                  SR                  S U R                   5       5      5      -  nU$ )Nzrsub r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r  s     rQ   rR   9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>  s     B/Qa/r  c              3   >   #    U  H  n[        U5      S -   v   M     g7fr  r   r  s     rQ   rR   r         @KqE!HsNK   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r  s     rQ   rR   r    s     %H1eAhhr   by {};c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r  s     rQ   rR   r         (M;Laq;Lr  )	r   r  r  rT   r   r   r   r   r  r  s      rQ   r   &ReverseChainSingleSubstStatement.asFea  s    t3t#7#74??##sxxB$//BBSHH388@DKK@@@C4??##sSXX%H%HHHH388Ct{{344Cy(M4;L;L(M MNN
rW   )r   r  r  r  r   r   r/  rN   rW   rQ   r=   r=   l  s    )	
rW   r=   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r@   i  a  A single substitution statement.

Note the unusual argument order: ``prefix`` and suffix come `after`
the replacement ``glyphs``. ``prefix``, ``suffix``, ``glyphs`` and
``replace`` should be lists of `glyph-containing objects`_. ``glyphs`` and
``replace`` should be one-item lists.
Nc                 n    [         R                  X5        X4sU l        U l        XPl        Xl        X l        g r   )rB   r   r  r  rs  r   r  )r   r   r  r  r  rs  r   s          rQ   r   SingleSubstStatement.__init__  s.    4*#) T[$#rW   c                    U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                  S   R                  5       nU R                  S   R                  5       n[        U5      S:X  a  U[        U5      -  nUR                  U R                  UU[        [        Xg5      5      U R                  5        gs  snf s  snf )z9Calls the builder object's ``add_single_subst`` callback.r   r   N)r  r   r  r   r  r   add_single_substr   r   r  rs  r  s           rQ   r   SingleSubstStatement.build  s    (,41**,4(,41**,4KKN++-	$$Q'002x=A#i.0H  MMI01OO	
 54s
   C&C+c                    Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       a  [        U R                  5      (       a(  USR	                  S U R                   5       5      S-   -  nUSR	                  S U R
                   5       5      -  n[        U R                  5      (       a(  USSR	                  S U R                   5       5      -   -  nO%USR	                  S U R
                   5       5      -  nUSR                  SR	                  S U R                   5       5      5      -  nU$ )	Nr  r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r  s     rQ   rR   -SingleSubstStatement.asFea.<locals>.<genexpr>  s     >+Qa+r  c              3   >   #    U  H  n[        U5      S -   v   M     g7fr  r   r  s     rQ   rR   r    r  r  c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r  s     rQ   rR   r    s     %D1eAhhr  c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r  s     rQ   rR   r    s     :kE!HHkr  r  c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r  s     rQ   rR   r    r  r  )r   r  r  rs  rT   r   r   r  r  s      rQ   r   SingleSubstStatement.asFea  s    t{{s4;;//4??4;;sxx>$++>>DD388@DKK@@@C4;;sSXX%D%DDDD388:dkk:::Cy(M4;L;L(M MNN
rW   )rs  r   r  r  r  r   r   r/  rN   rW   rQ   r@   r@     s    $
 rW   r@   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r>   i  zA ``script`` statement.Nc                 :    [         R                  X5        Xl        g r   )rB   r   r|   )r   r|   r   s      rQ   r   ScriptStatement.__init__  s    4*rW   c                 P    UR                  U R                  U R                  5        g)z,Calls the builder's ``set_script`` callback.N)
set_scriptr   r|   r   s     rQ   r   ScriptStatement.build  s    4==$++6rW   c                 T    SR                  U R                  R                  5       5      $ )Nz
script {};)r   r|   rP  r   s     rQ   r   ScriptStatement.asFea  s     ""4;;#4#4#677rW   )r|   r   r   r/  rN   rW   rQ   r>   r>     s    !78rW   r>   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r?   i  zA single position statement. ``prefix`` and ``suffix`` should be
lists of `glyph-containing objects`_.

``pos`` should be a one-element list containing a (`glyph-containing object`_,
:class:`ValueRecord`) tuple.Nc                 d    [         R                  X5        XUsU l        U l        U l        X@l        g r   )rB   r   rv   r  r  rs  )r   rv   r  r  rs  r   s         rQ   r   SinglePosStatement.__init__  s)    4*-0&*$+t{$rW   c                 v   U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   VVs/ s H  u  pgUR                  5       U4PM     nnnUR	                  U R
                  X5XR                  5        gs  snf s  snf s  snnf )z7Calls the builder object's ``add_single_pos`` callback.N)r  r   r  rv   add_single_posr   rs  )	r   r   r  r  r(  r  r   rJ  rv   s	            rQ   r   SinglePosStatement.build  s    (,41**,4(,41**,459XX>X

e$X>t}}fc??S 54>s   B+B0"B5c           
      V   Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       a  [        U R                  5      (       a/  USR	                  [        [        U R                  5      5      S-   -  nUSR	                  U R                   Vs/ s H7  n[        US   5      S-   US   (       a  SUS   R                  5       -   OS-   PM9     sn5      -  n[        U R                  5      (       a/  USSR	                  [        [        U R                  5      5      -   -  nO^USR	                  U R                   Vs/ s H4  n[        US   5      S-   US   (       a  US   R                  5       OS-   PM6     sn5      -  nUS-  nU$ s  snf s  snf )Nr  r   r   r  r   r   rr  )r   r  r  rs  rT   r   r   rv   )r   r   r   r  s       rQ   r   SinglePosStatement.asFea  sZ   t{{s4;;//4??4;;sxxE4;; 783>>388 "XX% !A$K#%1#!

*<2N% C 4;;sSXXc%&=>>>388MQXXVXqts"adadjjlCXV C 	s

 Ws   +>F!
;F&
)rs  rv   r  r  r   r   r/  rN   rW   rQ   r?   r?     s    $%
TrW   r?   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
rF   i  zRepresents a subtable break.Nc                 .    [         R                  X5        g r   )rB   r   r   s     rQ   r   SubtableStatement.__init__  s    4*rW   c                 :    UR                  U R                  5        g)z<Calls the builder objects's ``add_subtable_break`` callback.N)add_subtable_breakr   r   s     rQ   r   SubtableStatement.build  s    ""4==1rW   c                     g)Nz	subtable;rN   r   s     rQ   r   SubtableStatement.asFea  s    rW   rN   r   r   r/  rN   rW   rQ   rF   rF     s    &+2rW   rF   c                   \    \ rS rSrSr          SS jrS rS rS rSS jr	S	 r
\
rS
rg)rH   i  zRepresents a value record.Nc                     [         R                  X
5        XsU l        U l        X4sU l        U l        XVsU l        U l        XxsU l        U l	        Xl
        g r   )r'   r   
xPlacement
yPlacementxAdvanceyAdvance
xPlaDevice
yPlaDevice
xAdvDevice
yAdvDevicevertical)r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r   s              rQ   r   ValueRecord.__init__
  sO     	D+,6((0$t},6(,6( rW   c                 t   U R                   UR                   :H  =(       a    U R                  UR                  :H  =(       ay    U R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r   )r!  r"  r#  r$  r%  r'  r   others     rQ   __eq__ValueRecord.__eq__  s    OOu/// 45#3#334/4 /4 5#3#33	4
 5#3#33	
rW   c                 .    U R                  U5      (       + $ r   )r.  r,  s     rQ   __ne__ValueRecord.__ne__(  s    ;;u%%%rW   c                 `   [        U R                  5      [        U R                  5      -  [        U R                  5      -  [        U R                  5      -  [        U R
                  5      -  [        U R                  5      -  [        U R                  5      -  [        U R                  5      -  $ r   )	hashr!  r"  r#  r$  r%  r&  r'  r(  r   s    rQ   __hash__ValueRecord.__hash__+  s    !4??#$4==!" 4==!" 4??#	$
 4??#$ 4??#$ 4??#$		
rW   c                 f   U (       d  gU R                   U R                  p2U R                  U R                  pTU R                  U R
                  pvU R                  U R                  pU R                  n
Uc-  Uc*  Uc  U
(       a  [        U5      $ Uc  U
(       d  [        U5      $ U=(       d    SnU=(       d    SnU=(       d    SnU=(       d    SnUc  Uc  Uc  U	c  SU< SU< SU< SU< S3	$ SU< SU< SU< SU< S[        U5      < S[        U5      < S[        U5      < S[        U	5      < S3$ )Nz<NULL>r   <r   r  )r!  r"  r#  r$  r%  r&  r'  r(  r)  r  rV   )r   r   r  r  r#  r$  r%  r&  r'  r(  r)  s              rQ   r   ValueRecord.asFea7  s   1!]]DMM(!%$//J!%$//J== 9H8}$!(8}$ FF=q=q """&'Hh?? :&:&:&:&	
 		
rW   c                 .   ^  [        U 4S jS 5       5      $ )Nc              3   @   >#    U  H  n[        TU5      S Lv   M     g 7fr   )getattr)rO   vr   s     rQ   rR   'ValueRecord.__bool__.<locals>.<genexpr>d  s(      
	 D!D(	r8  )r!  r"  r#  r$  r%  r&  r'  r(  )r  r   s   `rQ   __bool__ValueRecord.__bool__c  s     
	
 
 	
rW   )	r)  r'  r#  r%  r!  r(  r$  r&  r"  )
NNNNNNNNFNr   )r   r   r   r   r   r   r.  r1  r5  r   r?  __nonzero__r   rN   rW   rQ   rH   rH     sK    $ !(
&

*
X
 KrW   rH   c                   ,    \ rS rSrSrSS jrSS jrSrg)	rI   iu  z+Represents a named value record definition.Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   r   rJ  )r   r   rJ  r   s       rQ   r   ValueRecordDefinition.__init__x  s    4*	
rW   c                 j    SR                  U R                  R                  5       U R                  5      $ )NzvalueRecordDef {} {};)r   rJ  r   r   r   s     rQ   r   ValueRecordDefinition.asFea}  s&    &--djj.>.>.@$))LLrW   )r   rJ  r   r   r"  rN   rW   rQ   rI   rI   u  s    5
MrW   rI   c                 r    U S:X  a  US:X  a  US:X  a  gU S:X  a  US:X  a  US:X  a  gSR                  XU5      $ )N   r   i	  r   r   1{} {} {}r   )pideidlids      rQ   simplify_name_attributesrO    sA    
axC1H	cQh3!8  3//rW   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r:   i  zRepresents a name record. (`Section 9.e. <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_)Nc                 j    [         R                  X5        Xl        X l        X0l        X@l        XPl        g r   )rB   r   nameID
platformID	platEncIDlangIDstring)r   rR  rS  rT  rU  rV  r   s          rQ   r   NameRecord.__init__  s)    4*$"rW   c                     UR                  U R                  U R                  U R                  U R                  U R
                  U R                  5        g)z8Calls the builder object's ``add_name_record`` callback.N)add_name_recordr   rR  rS  rT  rU  rV  r   s     rQ   r   NameRecord.build  s:    MMKKOONNKKKK	
rW   c                    S n[        U R                  U R                  U R                  5      nUc  [	        SU R
                  5      e[        U R                  US9nUS:X  a]  SR                  [        S[        U5      S5       Vs/ s H+  nU" [        XE   5      S-  [        XES	-      5      -   S
5      PM-     sn5      nO1SR                  U Vs/ s H  or" [        U5      S5      PM     sn5      n[        U R                  U R                  U R                  5      nUS:w  a  US-  nSR                  U R                  X5      $ s  snf s  snf )Nc                 D    U S:  a  U S::  a  U S;  a  [        U 5      $ X-  $ )N    ~   )"   \   )chr)r  escape_patterns     rQ   escape NameRecord.asFea.<locals>.escape  s(    DyQ$Y1L+@1v%))rW   zUnsupported encoding)encoding	utf_16_ber   r   r      r   z\%04xz\%02xr   znameid {} {}"{}";)r   rS  rT  rU  r   r   r   rV  rT   r  r   r   rO  r   rR  )	r   r   rc  re  r(  r  escaped_stringbplats	            rQ   r   NameRecord.asFea  s#   	* tL!"8$--HHDKK(3{"WW #1c!fa00 714=3.q51BBHM0N  WWA%NAqfWQZ&BA%NON'U2:CKD"))$++tLL &Os   2EE)rU  rR  rT  rS  rV  r   r   r/  rN   rW   rQ   r:   r:     s     K	
MrW   r:   c                   (    \ rS rSrSrS rSS jrSrg)r(   i  z4Represents a ``sizemenuname`` or ``name`` statement.c                 d    [         R                  X5        UR                  U R                  5        g)z8Calls the builder object's ``add_featureName`` callback.N)r:   r   add_featureNamerR  r   s     rQ   r   FeatureNameStatement.build  s"    ',rW   c                     U R                   S:X  a  SnOSn[        U R                  U R                  U R                  5      nUS:w  a  US-  nSR                  X#U R                  5      $ )Nsizesizemenunamer   r   r   z
{} {}"{}";)rR  rO  rS  rT  rU  r   rV  )r   r   r  rj  s       rQ   r   FeatureNameStatement.asFea  sY    ;;&  CC'U2:CKD""3dkk::rW   rN   Nr   )r   r   r   r   r   r   r   r   rN   rW   rQ   r(   r(     s    >-
;rW   r(   c                   "    \ rS rSrSrSS jrSrg)rE   i  z+Represents a STAT table ``name`` statement.c                     [        U R                  U R                  U R                  5      nUS:w  a  US-  nSR	                  X R
                  5      $ Nr   r   zname {}"{}";rO  rS  rT  rU  r   rV  r   r   rj  s      rQ   r   STATNameStatement.asFea  A    'U2:CKD$$T;;77rW   rN   Nr   )r   r   r   r   r   r   r   rN   rW   rQ   rE   rE     s
    58rW   rE   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
rA   i  zA ``parameters`` statement.Nc                 ^    [         R                  X5        Xl        X l        X0l        X@l        g r   )rB   r   
DesignSizeSubfamilyID
RangeStartRangeEnd)r   r}  r~  r  r  r   s         rQ   r   SizeParameters.__init__  s%    4*$&$ rW   c                     UR                  U R                  U R                  U R                  U R                  U R
                  5        g)z<Calls the builder object's ``set_size_parameters`` callback.N)set_size_parametersr   r}  r~  r  r  r   s     rQ   r   SizeParameters.build  s5    ##MMOOOOMM	
rW   c                    SR                  U R                  U R                  5      nU R                  S:w  d  U R                  S:w  aA  USR                  [        U R                  S-  5      [        U R                  S-  5      5      -  nUS-   $ )Nzparameters {:.1f} {}r   z {} {}
   rr  )r   r}  r~  r  r  intr  s      rQ   r   SizeParameters.asFea  sq    $++DOOT=M=MN??a4==A#58??3t';#<c$--RTBT>UVVCSyrW   )r}  r  r  r~  r   r   r/  rN   rW   rQ   rA   rA     s    %!
rW   rA   c                   4    \ rS rSrSr SS jrS rS	S jrSrg)
r   i  z;Represent a name statement inside a ``cvParameters`` block.Nc           
      <    [         R                  XX#XEUS9  X`l        g r2  )r:   r   rV  )r   rR  rS  rT  rU  rV  rV  r   s           rQ   r   "CVParametersNameStatement.__init__  s'     	*( 	 	
 %rW   c                 2   SnU R                   S:X  a5  SR                  UR                  R                  U R                  S5      5      nUR                  U R                  5        U R                  U R                   U-   4U l        [        R                  X5        g)z9Calls the builder object's ``add_cv_parameter`` callback.r   rY  z_{}r   N)rV  r   cv_num_named_params_getrR  add_cv_parameterr:   r   )r   r   items      rQ   r   CVParametersNameStatement.build  sr    ??22<< < < @ @a PQD  -{{DOOd$:;'rW   c                     [        U R                  U R                  U R                  5      nUS:w  a  US-  nSR	                  X R
                  5      $ rv  rw  rx  s      rQ   r   CVParametersNameStatement.asFea  rz  rW   )rV  rR  r   r   r/  rN   rW   rQ   r   r     s    E SW%(8rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r"   i  a  
Statement used in cvParameters blocks of Character Variant features (cvXX).
The Unicode value may be written with either decimal or hexadecimal
notation. The value must be preceded by '0x' if it is a hexadecimal value.
The largest Unicode value allowed is 0xFFFFFF.
Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   	characterr  )r   r  r  r   s       rQ   r   CharacterStatement.__init__  s    4*"rW   c                 P    UR                  U R                  U R                  5        g)z9Calls the builder object's ``add_cv_character`` callback.N)add_cv_characterr  r  r   s     rQ   r   CharacterStatement.build  s      :rW   c                 8    SR                  U R                  5      $ )NzCharacter {:#x};)r   r  r   s     rQ   r   CharacterStatement.asFea  s    !((88rW   )r  r  r   r   r/  rN   rW   rQ   r"   r"     s    
;9rW   r"   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r   i#  zAn axis definition, being either a ``VertAxis.BaseTagList/BaseScriptList``
pair or a ``HorizAxis.BaseTagList/BaseScriptList`` pair.Nc                 `    [         R                  X5        Xl        X l        X0l        / U l        g r   )rB   r   basesscriptsr)  minmax)r   r  r  r)  r  r   s         rQ   r   BaseAxis.__init__'  s&    4*
 rW   c                 |    UR                  U R                  U R                  U R                  U R                  5        g)z6Calls the builder object's ``set_base_axis`` callback.N)set_base_axisr  r  r)  r  r   s     rQ   r   BaseAxis.build.  s&    djj$,,t{{SrW   c                    U R                   (       a  SOSnU R                   Vs/ s H<  nSR                  US   US   SR                  [	        [
        US   5      5      5      PM>     nnU R                   Vs/ s H#  nSR                  X#S   US   US   US	   5      PM%     nnS
R                  USR                  U R                  5      XSR                  U5      5      SR                  U5      -   $ s  snf s  snf )NVertHorizrJ  r   r   r   r   z
{}Axis.MinMax {} {} {}, {};rH  z2{}Axis.BaseTagList {};
{}{}Axis.BaseScriptList {};rL   r+  )r)  r  r   rT   r   r  r  r  )r   r   	directionr  r  minmaxess         rQ   r   BaseAxis.asFea2  s    "mmF	 \\
! adAaD#((3sAaD>*BC! 	 
 [[
  ,229dAaD!A$PQRSPTU  	 
 EKKsxx

+V		'@R
IIh  	 

s   AC17*C6)r  r  r  r)  r  r   r/  rN   rW   rQ   r   r   #  s    @T rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r;   iA  zAn entry in the ``OS/2`` table. Most ``values`` should be numbers or
strings, apart from when the key is ``UnicodeRange``, ``CodePageRange``
or ``Panose``, in which case it should be an array of integers.Nc                 F    [         R                  X5        Xl        X l        g r   rB   r   rI  rJ  r   rI  rJ  r   s       rQ   r   OS2Field.__init__F      4*
rW   c                 P    UR                  U R                  U R                  5        g)z6Calls the builder object's ``add_os2_field`` callback.N)add_os2_fieldrI  rJ  r   s     rQ   r   OS2Field.buildK  s    dhh

3rW   c                    S nSnSn[        U Vs/ s H  oUR                  5       U[        /4PM     sn5      nUR                  U Vs/ s H  oUR                  5       XR/4PM     sn5        SU/US'   SS /US'   U R                  U;   a@  S	R                  X`R                     S
   X`R                     S   " U R                  5      5      $ gs  snf s  snf )Nc                 @    SR                  [        [        U 5      5      $ )Nr   )rT   r   r  )r  s    rQ   
intarr2str"OS2Field.asFea.<locals>.intarr2strP  s    88CQK((rW   )FSTypeTypoAscenderTypoDescenderTypoLineGap	winAscent
winDescentXHeight	CapHeightWeightClass
WidthClassLowerOpSizeUpperOpSize)UnicodeRangeCodePageRangePanosepanoseVendorc                 $    SR                  U 5      $ )Nz"{}"rK  )r  s    rQ   <lambda> OS2Field.asFea.<locals>.<lambda>e  s    &--2BrW   vendor{} {};r   r   r   )r  r   r  updaterI  r   rJ  )r   r   r  numbersrangesr  keywordss          rQ   r   OS2Field.asFeaO  s    	)
 3@1'')aX.@AvFv!'')a_5vFG&
3&(BC88x??"1%x'9!'<TZZ'H   AFs   !CCrI  rJ  r   r   r/  rN   rW   rQ   r;   r;   A  s    G
4rW   r;   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r+   im  zAn entry in the ``hhea`` table.Nc                 F    [         R                  X5        Xl        X l        g r   r  r  s       rQ   r   HheaField.__init__p  r  rW   c                 P    UR                  U R                  U R                  5        g)z7Calls the builder object's ``add_hhea_field`` callback.N)add_hhea_fieldrI  rJ  r   s     rQ   r   HheaField.buildu      txx4rW   c                     Sn[        U Vs/ s H  o3R                  5       U4PM     sn5      nSR                  X@R                     U R                  5      $ s  snf )N)CaretOffsetAscender	DescenderLineGapr  r  r   r   rI  rJ  r   r   fieldsr  r  s        rQ   r   HheaField.asFeay  sI    D8A'')Q89x14::>> 9   Ar  r   r   r/  rN   rW   rQ   r+   r+   m      )
5?rW   r+   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
rJ   i  zAn entry in the ``vhea`` table.Nc                 F    [         R                  X5        Xl        X l        g r   r  r  s       rQ   r   VheaField.__init__  r  rW   c                 P    UR                  U R                  U R                  5        g)z7Calls the builder object's ``add_vhea_field`` callback.N)add_vhea_fieldrI  rJ  r   s     rQ   r   VheaField.build  r  rW   c                     Sn[        U Vs/ s H  o3R                  5       U4PM     sn5      nSR                  X@R                     U R                  5      $ s  snf )N)VertTypoAscenderVertTypoDescenderVertTypoLineGapr  r  r  s        rQ   r   VheaField.asFea  sI    M8A'')Q89x14::>> 9r  r  r   r   r/  rN   rW   rQ   rJ   rJ     r  rW   rJ   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
rD   i  zA STAT table Design Axis

Args:
    tag (str): a 4 letter axis tag
    axisOrder (int): an int
    names (list): a list of :class:`STATNameStatement` objects
Nc                 ^    [         R                  X5        Xl        X l        X0l        X@l        g r   )rB   r   r  	axisOrdernamesr   )r   r  r  r  r   s        rQ   r    STATDesignAxisStatement.__init__  s$    4*"
 rW   c                 :    UR                  X R                  5        g r   )addDesignAxisr   r   s     rQ   r   STATDesignAxisStatement.build  s    dMM2rW   c           
          U[         -  nSU R                   SU R                   S3nUSU-   R                  U R                   Vs/ s H  o3R                  US9PM     sn5      S-   -  nUS-  nU$ s  snf )NzDesignAxis r   z { 
r+  r,  };)r-  r  r  rT   r  r   r   r   r   r(  s       rQ   r   STATDesignAxisStatement.asFea  sw    %DHH:Qt~~&6f=v##TZZ$PZWWFW%;Z$PQTXXXt
 %Qs   A/
)r  r   r  r  r   r   r/  rN   rW   rQ   rD   rD     s    !3rW   rD   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r%   i  z]STAT table ElidedFallbackName

Args:
    names: a list of :class:`STATNameStatement` objects
Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   r  r   )r   r  r   s      rQ   r   ElidedFallbackName.__init__      4*
 rW   c                 P    UR                  U R                  U R                  5        g r   )setElidedFallbackNamer  r   r   s     rQ   r   ElidedFallbackName.build      %%djj$--@rW   c           
          U[         -  nSnUSU-   R                  U R                   Vs/ s H  o3R                  US9PM     sn5      S-   -  nUS-  nU$ s  snf )NzElidedFallbackName { 
r+  r,  r  )r-  rT   r  r   r  s       rQ   r   ElidedFallbackName.asFea  s_    %'v##TZZ$PZWWFW%;Z$PQTXXXt
 %Qs   A
)r   r  r   r   r/  rN   rW   rQ   r%   r%     s    !
ArW   r%   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r&   i  zdSTAT table ElidedFallbackNameID

Args:
    value: an int pointing to an existing name table name ID
Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   rJ  r   )r   rJ  r   s      rQ   r   ElidedFallbackNameID.__init__  r  rW   c                 P    UR                  U R                  U R                  5        g r   )r  rJ  r   r   s     rQ   r   ElidedFallbackNameID.build  r  rW   c                 "    SU R                    S3$ )NzElidedFallbackNameID rr  )rJ  r   s     rQ   r   ElidedFallbackNameID.asFea  s    &tzzl!44rW   )r   rJ  r   r   r/  rN   rW   rQ   r&   r&     s    !
A5rW   r&   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
rC   i  zA STAT table Axis Value Record

Args:
    names (list): a list of :class:`STATNameStatement` objects
    locations (list): a list of :class:`AxisValueLocationStatement` objects
    flags (int): an int
Nc                 R    [         R                  X5        Xl        X l        X0l        g r   )rB   r   r  	locationsr  )r   r  r  r  r   s        rQ   r   STATAxisValueStatement.__init__  s    4*
"
rW   c                 :    UR                  X R                  5        g r   )addAxisValueRecordr   r   s     rQ   r   STATAxisValueStatement.build  s    ""47rW   c                    SnU R                    H  nX#R                  5       -  nM     U R                   H  nX$R                  5       -  nUS-  nM     U R                  (       af  SS/n/ nSn[	        [        U5      5       H.  nU R                  U-  S:w  a  UR                  XX   5        US-  nM0     USSR                  U5       S	3-  nUS
-  nU$ )NzAxisValue {
r+  OlderSiblingFontAttributeElidableAxisValueNamer   r   zflag r   ;
r  )r  r   r  r  r  r   r   rT   )	r   r   r   r   
nameRecordr  flagStringsr   r  s	            rQ   r   STATAxisValueStatement.asFea  s    H>>##C ' **J##%%C4KC % ::02IJEKD3u:&::$)&&ux0qy ' U388K0155Ct
rW   )r  r  r  r   r   r/  rN   rW   rQ   rC   rC     s    8rW   rC   c                   ,    \ rS rSrSrSS jrSS jrSrg)	r   i  z|
A STAT table Axis Value Location

Args:
    tag (str): a 4 letter axis tag
    values (list): a list of ints and/or floats
Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   r  values)r   r  r  r   s       rQ   r   #AxisValueLocationStatement.__init__  s    4*rW   c                 |    USU R                    S3-  nUSR                  S U R                   5       5       S3-  nU$ )Nz	location r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r  )rO   r  s     rQ   rR   3AxisValueLocationStatement.asFea.<locals>.<genexpr>  s     7;a3q66;r  r  )r  rT   r  )r   r   s     rQ   r    AxisValueLocationStatement.asFea  sC    488*A&&#((74;;778<<
rW   )r  r  r   r   r"  rN   rW   rQ   r   r     s    
rW   r   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
r#   i  z
A variable layout conditionset

Args:
    name (str): the name of this conditionset
    conditions (dict): a dictionary mapping axis tags to a
        tuple of (min,max) userspace coordinates.
Nc                 F    [         R                  X5        Xl        X l        g r   )rB   r   r   
conditions)r   r   r'  r   s       rQ   r   ConditionsetStatement.__init__  s    4*	$rW   c                 f    UR                  U R                  U R                  U R                  5        g r   )add_conditionsetr   r   r'  r   s     rQ   r   ConditionsetStatement.build!  s       		4??KrW   c           	          XSU R                    S3-   S-   -  nU R                  R                  5        H  u  nu  pEX[        -   U SU SU S3-   -  nM!     XS-   SU R                    S3-   -  nU$ )Nzconditionset r   rN  r  })r   r'  rE  r-  )r   r   r   r  minvaluemaxvalues         rQ   r   ConditionsetStatement.asFea$  s    -		{!44u<<)-)>)>)@%C%(E>se1XJaz$EEEC *A|$))C000
rW   )r'  r   r   )r   r   r/  rN   rW   rQ   r#   r#     s    %
LrW   r#   c                   2    \ rS rSrSrSS jrS rS	S jrSrg)
VariationBlocki,  zCA variation feature block, applicable in a given set of conditions.Nc                 Z    [         R                  X5        UUUsU l        U l        U l        g r   )r   r   r   conditionsetr=  )r   r   r4  r=  r   s        rQ   r   VariationBlock.__init__/  s*    t& 	9	4$d&8rW   c                 P   UR                  U R                  U R                  5        U R                  S:w  a=  U R                  UR                  ;  a#  [        SU R                   3U R                  5      eUR                  n0 Ul        [        R                  X5        UR                  R                  5        HW  u  p4UR                  R                  U0 5      R                  U R                  / 5      nUR                  U5        X2;  d  MS  / X#'   MY     X!l        UR                  5         g)rB  r   z,variation block used undefined conditionset N)rC  r   r   r4  conditionsets_r   rD  r   r   rE  feature_variations_rF  r   rG  )r   r   rH  rI  rJ  rE  s         rQ   r   VariationBlock.build7  s     	dmmTYY7'!!)?)??!>t?P?P>QR  $$D"!++113JC//::3CNN!!2E LL" " 4 %rW   c                    USU R                   R                  5       -  -   nX R                  S-   -  nU R                  (       a  US-  nUS-  nU[        R                  XS9-  nX!SU R                   R                  5       -  -   -  nU$ )Nzvariation %s r   rM  rN  r,  rO  )r   rP  r4  r=  r   r   r  s      rQ   r   VariationBlock.asFeaS  s    ):::  3&&?"Cuu{{4{//	DIIOO$5555
rW   )r4  r   r=  rS  r   r/  rN   rW   rQ   r2  r2  ,  s    M
8rW   r2  )XfontTools.feaLib.errorr   fontTools.feaLib.locationr   fontTools.misc.encodingToolsr   fontTools.misc.textToolsr   r   collectionsr   r  r-  __all__rV   r]  r   r   objectr	   rB   r'   r   r   r   r   r   r   r   r   r
   r   r   r   rG   r   r   r   r   r   r   r   r   r    r!   r$   r)   r,   r-   r.   r/   r0   r*   r1   r2   r3   r4   r5   r6   r7   r8   r9   r<   r=   r@   r>   r?   rF   rH   rI   rO  r:   r(   rE   rA   r   r"   r   r;   r+   rJ   rD   r%   r&   rC   r   r#   r2  rN   rW   rQ   <module>rC     s   2 8 4 5 # CLF 57tf ,	 		 		g 	
 !
 ! ;% ;%|*Z *")J )"Y 
I 
.	J% 	J5 @% *% . C9 C 
Y 
<* *Z$
) $
N"i "J"Z "Jy 
i 
&7y 7t7 7tT) T*6	 6!9 !9H99 9B7y 7&	 :Ri R<I <
I 
&
) 
&$Y $N&6) &6R5y 5"9 *5) 5p9 *CY CLPy Pf%y %P+9 +\8i 8% %P	 k* k\	MI 	M0.M .Mb;: ;&8
 8Y 68
 869 9* y  <)y )X?	 ?$?	 ?$i 6 .59 5&%Y %P (I 4/U /rW   