
    h                       S SK Jr  S SKJrJrJrJr  S SKJr  S SK	J
r
JrJr  S SKJr  S SKJr  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Jr  S SKJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  S SK.J/r/  S SK0J1r1  S SK2J3r3  S SK4J5r5  S SK6J7r7J8r8  S SK9J:r:  S SK;r;S SK<r<S SK=J>r>  S SK?r?S SK@r@S SKArA\?R                  " \C5      rDSS jrE SS jrF " S S\G5      rHg)    )sstruct)Tagtostr
binary2numsafeEval)FeatureLibError)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYLOOKUP_DEBUG_ENV_VAR)Parser)FeatureFile)VariableScalar)builder)
maxCtxFont)newTablegetTableModule)otBaseotTables)AlternateSubstBuilderChainContextPosBuilderChainContextSubstBuilderLigatureSubstBuilderMultipleSubstBuilderCursivePosBuilderMarkBasePosBuilderMarkLigPosBuilderMarkMarkPosBuilderReverseChainSingleSubstBuilderSingleSubstBuilderClassPairPosSubtableBuilderPairPosBuilderSinglePosBuilderChainContextualRule)OpenTypeLibError)OnlineVarStoreBuilder)buildVarDevTable)addFeatureVariationsRaw)normalizeValuepiecewiseLinearMap)defaultdictN)StringIOc                 8    [        X5      nUR                  X#S9  g)a  Add features from a file to a font. Note that this replaces any features
currently present.

Args:
    font (feaLib.ttLib.TTFont): The font object.
    featurefile: Either a path or file object (in which case we
        parse it into an AST), or a pre-parsed AST instance.
    tables: If passed, restrict the set of affected tables to those in the
        list.
    debug: Whether to add source debugging information to the font in the
        ``Debg`` table

tablesdebugN)Builderbuild)fontfeaturefiler.   r/   r   s        J/var/www/html/env/lib/python3.13/site-packages/fontTools/feaLib/builder.pyaddOpenTypeFeaturesr5   2   s     d(GMMM-    c                 Z    [        [        U5      5      nU(       a  X%l        [        XX4S9  g)a5  Add features from a string to a font. Note that this replaces any
features currently present.

Args:
    font (feaLib.ttLib.TTFont): The font object.
    features: A string containing feature code.
    filename: The directory containing ``filename`` is used as the root of
        relative ``include()`` paths; if ``None`` is provided, the current
        directory is assumed.
    tables: If passed, restrict the set of affected tables to those in the
        list.
    debug: Whether to add source debugging information to the font in the
        ``Debg`` table

r-   N)r+   r   namer5   )r2   featuresfilenamer.   r/   r3   s         r4   addOpenTypeFeaturesFromStringr;   D   s%    & 5?+K#&Fr6   c            
       
   \ rS rSr\" S S 5       5      rS rS`S jrS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S  r!S! r"S" r#S# r$S$ r%S% r&S& r'S' r(S( r)S) r*S* r+S+ r,S, r-S- r.S. r/S/ r0S0 r1S1 r2S2 r3S3 r4S4 r5S5 r6S6 r7S7 r8/ 4S8 jr9S9 r:S: r; SaS; jr<S< r=S= r>S> r?S? r@S@ rASA rBSB rCSC rDSD rESE rFSF rGSG rHSH rISI rJSJ rKSK rLSL rMSM rNSN rOSO rPSP rQSQ rRSR rSSS rTST rUSU rVSV rWSW rXSX rYSY rZSZ r[\\R                   V VVVs0 s H9  u  pp1UR                  S[5      (       a  M  US\   R                  5       US]S -   X#4_M;     snnnn r`S^ raS_rbgs  snnnn f )br0   ]   c              #   8   #    U  H  n[        U5      v   M     g 7fN)r   ).0tags     r4   	<genexpr>Builder.<genexpr>^   s!       
C 	C
   )
BASEGDEFGPOSGSUBOS/2headhhear8   vheaSTATc                    Xl         [        U[        5      (       a  US sU l        U l        OS UsU l        U l        UR                  5       U l        S U l        SU;   aH  US   R                  U l        [        U R                   Vs/ s H  o3R                  PM     sn5      U l        [        5       U l        S U l        SU l        S U l        [        5       U l        SU l        0 U l        S U l        S U l        S U l        / U l        0 0 S.U l        0 U l        0 U l        0 U l        / U l        S U l        0 U l        [        5       U l        0 U l        [        5       U l         0 U l!        0 U l"        [G        [H        5      U l%        S U l&        S U l'        / U l(        S U l)        S U l*        0 U l+        0 U l,        0 U l-        0 U l.        0 U l/        0 U l0        0 U l1        0 U l2        0 U l3        0 U l4        0 U l5        0 U l6        0 U l7        g s  snf )Nfvarr   F)rH   rG   )8r2   
isinstancer   	parseTreefilegetReverseGlyphMapglyphMapvarstorebuilderaxesr%   axisTagsetdefault_language_systems_script_lookupflag_lookupflag_markFilterSet_language_systemsseen_non_DFLT_script_named_lookups_cur_lookup_cur_lookup_name_cur_feature_name_lookups_lookup_locations	features_required_features_feature_variations_aalt_features_aalt_location_aalt_alternates_featureNames_featureNames_ids_cv_parameters_cv_parameters_ids_cv_num_named_params_r*   listcv_characters_size_parameters_fontRevision_names_base_horiz_axis_base_vert_axis_attachPoints_ligCaretCoords_ligCaretPoints_glyphClassDefs_markAttach_markAttachClassID_markFilterSets_os2_hhea_vhea_stat_conditionsets_model_cache)selfr2   r3   axs       r4   __init__Builder.__init__n   s   	 k;//(3T%DNDI(,k%DNDI//1#T>V))DI#8&*ii0ii0$D  *-&)-& #%*"  $!%)+R 8"$#%  " " U!#!e"$$&!)$/ $! $#!!!"$!	


  w 1s   G<Nc                   ^  T R                   c3  [        T R                  T R                  5      R	                  5       T l         T R                   R                  T 5        Uc  T R                  nOJ[        U5      nUT R                  -
  nU(       a)  SR                  [        U5      5      n[        SU S35      eSU;   a  T R                  5         SU;   a  T R                  5         SU;   a  T R                  5         SU;   a  T R                  5         SU;   a  T R                  5         S	U;   a  T R!                  5         S
U;   a  T R#                  5         S H  nXQ;  a  M
  T R%                  U5      nT R&                  (       a  T R)                  Xe5        UR*                  R,                  S:  d4  UR.                  R0                  S:  d  UR2                  R4                  S:  a"  [7        U5      =nT R8                  U'   Xgl        M  UT R8                  ;   d  M  T R8                  U	 M     [=        U 4S jS 5       5      (       a7  S	T R8                  ;   a'  [?        T R8                  5      T R8                  S	   l         SU;   aD  T RC                  5       nU(       a  UT R8                  S'   OST R8                  ;   a  T R8                  S	 SU;   aD  T RE                  5       n	U	(       a  U	T R8                  S'   OST R8                  ;   a  T R8                  S	 U(       d(  [F        RH                  RK                  [L        5      (       a  T RO                  5         g g )Nz, z9The following tables were requested but are unsupported: .rH   rJ   rK   rL   r8   rI   rM   rG   rH   r   c              3   @   >#    U  H  oTR                   ;   v   M     g 7fr?   )r2   )r@   rA   r   s     r4   rB    Builder.build.<locals>.<genexpr>   s     <+;Cdii+;   rF   rE   )(rQ   r   rR   rT   parser1   supportedTables	frozensetjoinsortedNotImplementedErrorbuild_feature_aalt_
build_head
build_hhea
build_vhea
build_name
build_OS_2
build_STAT	makeTablerg   makeFeatureVariations
ScriptListScriptCountFeatureListFeatureCount
LookupListLookupCountr   r2   tableanyr   usMaxContext	buildGDEF	buildBASEosenvirongetr   	buildDebg)
r   r.   r/   unsupportedunsupported_stringrA   r   	fontTablegdefbases
   `         r4   r1   Builder.build   s   >>!#DIIt}}=CCEDNT">))Fv&F 4#7#77K%)YYvk/B%C")O)*!-  V$$&VOOVOOVOOVOOVOOVOO#C NN3'E''**56  ,,q0$$11A5##//!3-5c]:	DIIcN"'		!IIcN $ <+;<<<499AT-7		-BDIIf*V>>#D$(		&!499$IIf%V>>#D$(		&!499$IIf%BJJNN#788NN 9r6   c                     U" U R                   U5      nU R                  Ul        U R                  Ul        U R
                  R                  U5        U$ r?   )r2   r[   
lookupflagr\   markFilterSetrc   append)r   locationbuilder_classresults       r4   get_chained_lookup_Builder.get_chained_lookup_   sE    tyy(3 ,,#==V$r6   c                     U R                    H4  u  p4X4U4nU R                  R                  U/ 5      R                  U5        M6     g r?   )r]   re   
setdefaultr   )r   lookupfeature_namescriptlangkeys         r4   add_lookup_to_feature_Builder.add_lookup_to_feature_   s=     11LF.CNN%%c2.55f= 2r6   c                 .   U R                   (       am  [        U R                   5      U:X  aT  U R                   R                  U R                  :X  a0  U R                   R                  U R
                  :X  a  U R                   $ U R                  (       a  U R                   (       a  [        SU5      eU" U R                  U5      U l         U R                  U R                   l        U R
                  U R                   l        U R                  R                  U R                   5        U R                  (       a#  U R                   U R                  U R                  '   U R                  (       a&  U R                  U R                   U R                  5        U R                   $ )NzOWithin a named lookup block, all rules must be of the same lookup type and flag)r`   typer   r[   r   r\   ra   r   r2   rc   r   r_   rb   r   )r   r   r   s      r4   get_lookup_Builder.get_lookup_  s1   T%%&-7  ++t/?/??  ..$2P2PP###  T%5%5!0 
 )H=&*&6&6#)-)G)G&T--.  9=9I9ID 5 56!! ''(8(8$:P:PQr6   c                   ^ U R                   (       d  U R                  (       d  g U R                  R                  5        VVs0 s H  u  pU[        U5      _M     nnnU R                   S/-    H  u  pEU R                  R                  5        VVVV	s/ s H  u  u  pgpX:X  d  M  XgX4PM     sn	nnnnU(       d&  US:w  a   [
        R                  " U< SU< S35        Mq  U H  u  pgpU	 Hx  n
[        U
[        5      (       d  U
/n
U
 HW  nUR                  5       R                  5        H2  u  pUR                  U/ 5      mTR                  U4S jU 5       5        M4     MY     Mz     M     M     UR                  5        VVs0 s H  u  p[        U5      S:X  d  M  XS   _M     nnnUR                  5        VVs0 s H  u  p[        U5      S:  d  M  X_M     nnnU(       d  U(       d  g U R                  R                  5        VVVV	s0 s H  u  u  pgpUS:w  d  M  XgU4U	_M     sn	nnnU l        U R                  n/ U l        U R                  U R                  S5        U(       a  U R                  W[         5      nUUl        U(       a  U R                  W[$        5      nUUl        U R)                  5         U R                  R                  U5        g s  snnf s  sn	nnnf s  snnf s  snnf s  sn	nnnf )N)Naaltr   z
: Feature z has not been definedc              3   6   >#    U  H  oT;  d  M
  Uv   M     g 7fr?    )r@   galts_for_glyphs     r4   rB   .Builder.build_feature_aalt_.<locals>.<genexpr>6  s      2+/aN3J4   		   r   )rh   rj   itemsrp   re   warningswarnrP   getAlternateGlyphsr   extendlenrc   start_featureri   r   r   mappingr   
alternatesend_feature)r   r   ar   r   r8   r   r   featurelookups
lookuplistr   glyphaltsreplsinglemultiold_lookupssingle_lookupmulti_lookupr   s                       @r4   r   Builder.build_feature_aalt_  s   ""4+@+@
 .2-B-B-H-H-JK-JTQaaj-J
K"11^4DDNH 9=8L8L8N8N4+V7? 1w08NG tv~xQUVW29.g")J%j$77&0\
",+1+D+D+F+L+L+NKE-7-B-B5"-MN*11 2+/2  ,O #- #* 3: E* /9.>.>.@
.@{uCIQRNNE7N.@ 	 
 1;0@0@0BT0Bc$iRSm0BTe 59NN4H4H4J
4J0'w&  -V7#W,4J

 mm4..7 ,,X7IJM$*M!++H6KLL&+L#[)U L&
 U
s6   KK#K?K	K7K%K%K+
	K+
c                 0   U R                   (       d  g U R                  R                  S5      nU(       dQ  [        S5      =oR                  S'   UR	                  SU R                  5        SUl        SUl        S=Ul        Ul        U R                   Ul	        g )NrJ   s6                                                         g      ?i<_l   e )
rs   r2   r   r   	decompiletableVersionmagicNumbercreatedmodifiedfontRevisionr   r   s     r4   r   Builder.build_headP  sw    !!		f%(0(88EIIf%OOJ		2!$E *E-77EMEN!//r6   c                    U R                   (       d  g U R                  R                  S5      nU(       d<  [        S5      =oR                  S'   UR	                  SU R                  5        SUl        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul	        g g )NrK   $                                          caretoffsetascender	descenderlinegap)
r   r2   r   r   r   r   caretOffsetascentdescentlineGapr   s     r4   r   Builder.build_hhea\  s    zz		f%(0(88EIIf%OOJ		2!+EDJJ& $

= 9E#::j1EL$**$ JJ{3EM

" JJy1EM #r6   c                    U R                   (       d  g U R                  R                  S5      nU(       d<  [        S5      =oR                  S'   UR	                  SU R                  5        SUl        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul        g g )NrL   r   i  verttypoascenderverttypodescenderverttypolinegap)	r   r2   r   r   r   r   r   r   r   r   s     r4   r   Builder.build_vheam  s    zz		f%(0(88EIIf%OOJ		2!+E+::&89EL$**, JJ':;EM

* JJ'89EM +r6   c                     UR                    Vs/ s H  o"R                  PM     nn[        SS5       H  nXC;  d  M
  Us  $    g s  snf )N   i  )namesnameIDrange)r   r   r8   nameIDsuser_name_ids        r4   get_user_name_idBuilder.get_user_name_id|  s>    +0;;7;4;;;7!#u-L*## . 8s   Ac                    S nUS:X  ai  [         R                  " 5       nU R                  u  Ul        Ul        Ul        Ul        XR                  ;   a  U R                  U   Ul        U$ SUl         U$ XR                  ;   aX  U R                  (       d   U$ XR                  ;   d   e[         R                  " 5       nSUl        U R                  U   Ul         U$ XR                  ;   a  [         R                  " 5       nSUl        U R                   R#                  US4S5      Ul        U R                   R#                  US4S5      Ul        U R                   R#                  US4S5      Ul        U R*                  R#                  US5      Ul        U R                   R#                  US4S5      Ul        [1        U R2                  U   5      Ul        U R2                  U   Ul        U$ )Nsizer   FeatUILabelNameIDFeatUITooltipTextNameIDSampleTextNameIDParamUILabelNameID_0)r   FeatureParamsSizerr   
DesignSizeSubfamilyID
RangeStartRangeEndrl   SubfamilyNameIDrk   FeatureParamsStylisticSetVersionUINameIDrm   FeatureParamsCharacterVariantsFormatrn   r   r  r  r  ro   NumNamedParametersFirstParamUILabelNameIDr   rq   	CharCount	Character)r   rA   paramss      r4   buildFeatureParamsBuilder.buildFeatureParams  s   &=//1F %%!"!,,,)-)?)?)D&< 9 *+&8 7 &&&))0 - 44444!;;=!""&"8"8"=& % '''<<>FFM'+'>'>'B'B)*A(F$ .2-D-D-H-H/0!.F* '+&=&=&A&A()1'F# )-(A(A(E(Ec1(MF%-1-D-D-H-H,-q.F*  #4#6#6s#;<F#2237Fr6   c                    U R                   (       d  g U R                  R                  S5      nU(       d   [        S5      =oR                  S'   / Ul        U R                    H  nUu  p4pVn[        U[        5      (       d  UnXR                  ;   aO  XR                  ;  a0  U R                  U5      U R                  U'   U R                  U   c   eU R                  U   nOaUS   U R                  ;   aN  XR                  ;  a0  U R                  U5      U R                  U'   U R                  U   c   eU R                  U   nUR                  XsXEU5        M     UR                  R                  5         g )Nr8   r   )rt   r2   r   r   r  rP   intrk   rl   r	  rm   rn   setNamesort)	r   r   r8   r  
platformID	platEncIDlangIDstringrA   s	            r4   r   Builder.build_name  sH   {{		f%(0(88EIIf%EKKKD<@9F	6 fc**,,,"8"886:6K6KE6R..s3#55c:FFF!33C8FVt222"9"997;7L7LU7S//4#66s;GGG!44S9FMM&*H!  " 	r6   c                 l   U R                   (       d  g U R                  R                  S5      nU(       d`  [        S5      =oR                  S'   S[        R
                  " [        S5      R                  5      -  nUR                  X R                  5        SnSU R                   ;   a  U R                   S   Ul	        SU R                   ;   ak  [        S5      R                  5       nU R                   S   u
  Ul        Ul        Ul        Ul        Ul        Ul        Ul        Ul        Ul        Ul        XAl        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul        S	U R                   ;   a  U R                   S	   Ul        S
U R                   ;   a  U R                   S
   Ul        SU R                   ;   a#  [7        SU R                   S   -   S-   5      Ul        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  U R                   S   Ul        SU R                   ;   a  UR?                  U R                   S   5        SU R                   ;   a/  U RA                  U R                   S   5      nUu  Ul!        Ul"        SnSU R                   ;   a  U R                   S   Ul#        SnSU R                   ;   a  U R                   S   Ul$        SnSU R                   ;   a  U R                   S   Ul%        SnSU R                   ;   a  U R                   S   Ul&        SnS n[O        X1RP                  5      Ul(        US:  a	  U" US5        US:  a	  U" US5        US:  a
  U" US5        g g )NrI       r   fstypepanosetypoascendertypodescendertypolinegap	winascent
windescentvendorz'''weightclass
widthclassunicoderangecodepageranger   xheight   	capheightloweropsize   upperopsizec                 R    U H!  n[        X5      (       a  M  [        XS5        M#     g Nr   )hasattrsetattr)r   attrsattrs      r4   	checkattr%Builder.build_OS_2.<locals>.checkattr  s!    u++E+ r6   )ulCodePageRange1ulCodePageRange2)sxHeight
sCapHeightusDefaultCharusBreakCharr   )usLowerOpticalPointSizeusUpperOpticalPointSize))r~   r2   r   r   r   calcsizer   OS2_format_0r   fsTypePanosebFamilyTypebSerifStylebWeightbProportion	bContrastbStrokeVariation	bArmStylebLetterFormbMidlinebXHeightr/  sTypoAscendersTypoDescendersTypoLineGapusWinAscentusWinDescentr   	achVendIDusWeightClassusWidthClasssetUnicodeRangesbuild_codepages_rH  rI  rJ  rK  rN  rO  maxversion)r   r   datari  r/  pagesrF  s          r4   r   Builder.build_OS_2  s+   yy		f%(0(88EIIf%7++N6,B,O,OPPDOOD)),tyy 99X.ELtyy #F+224F 		(#""" ' "!LTYY&"&))N";Edii'#'99_#=E DII%!%=!9E$))# $		+ 6E499$!%<!8Etyy &utyy/B'BU'JKEODII%"&))M":E499$!%<!8ETYY&""499^#<=dii'))$))O*DEE=B:E"E$:G		!!YYy1ENG$))##yy5EGDII%,0IIm,DE)GDII%,0IIm,DE)G	,
 G]]3a<eEFa<	 a<eST r6   c                     S H!  nX0R                   ;   d  M  [        U S3U5      e   [        U[        5      (       a  XR                   S'   g [        U[        5      (       a  XR                   S'   g [        U5      e)N)ElidedFallbackNameElidedFallbackNameIDz is already set.ro  rn  )r   r   rP   r$  rp   AssertionError)r   valuer   tokens       r4   setElidedFallbackNameBuilder.setElidedFallbackName  sv     DE

"%g-.  D eS!!16JJ-.t$$/4JJ+, ''r6   c                 v   SU R                   ;  a  / U R                   S'   UR                  S U R                   S    5       ;   a  [        SUR                   S3U5      eUR                  S U R                   S    5       ;   a  [        SUR                   S3U5      eU R                   S   R	                  U5        g )N
DesignAxesc              3   8   #    U  H  oR                   v   M     g 7fr?   )rA   r@   rs     r4   rB   (Builder.addDesignAxis.<locals>.<genexpr>/  s     F-Eee-ErD   z$DesignAxis already defined for tag "z".c              3   8   #    U  H  oR                   v   M     g 7fr?   )	axisOrderrx  s     r4   rB   rz  4  s     #R9QAKK9QrD   z+DesignAxis already defined for axis number r   )r   rA   r   r|  r   )r   
designAxisr   s      r4   addDesignAxisBuilder.addDesignAxis,  s    tzz)')DJJ|$>>FTZZ-EFF!6z~~6FbI  #RL9Q#RR!=j>R>R=SSTU  	

< ''
3r6   c                 ~   SU R                   ;  a  / U R                   S'   U R                   S    H  nUR                   Vs1 s H  oDR                  5       iM     snUR                   Vs1 s H  oDR                  5       iM     sn:X  d  M[  UR                   Vs1 s H  oDR                  5       iM     snUR                   Vs1 s H  oDR                  5       iM     sn:X  d  M  UR                  UR                  :X  d  M  [        SU5      e   U R                   S   R                  U5        g s  snf s  snf s  snf s  snf )NAxisValueRecordsz8An AxisValueRecord with these values is already defined.)r   r  asFea	locationsflagsr   r   )r   axisValueRecordr   record_ns        r4   addAxisValueRecordBuilder.addAxisValueRecord;  s    TZZ/-/DJJ)*zz"45G$+MM2MqM2'6'<'<='<!GGI'<=>(/(9(9:(91WWY(9:'6'@'@A'@!GGI'@ABMM_%:%::%N  6 	

%&--o> 3=:As    D+)D0D5D:c           	         U R                   (       d  g U R                   R                  S5      nU(       d  [        SS 5      eU R                   R                  S5      n0 n/ nU H  n/ X5R                  '   M     UGby  U GHr  n0 nUR                  S:  a  UR                  US'   [        UR                  5      S:X  a  UR                  S   nUR                  n	[        U	5      S:X  a!  UR                  U	S   UR                  S.5        [        U	5      S:X  a%  UR                  U	S   U	S   UR                  S	.5        [        U	5      S
:X  a%  U	u  pnUR                  U
UUUR                  S.5        X8R                     R                  U5        GM  UR                  UR                   Vs0 s H  oR                  UR                  S   _M     snUR                  S.5        UR                  U5        GMu     U Vs/ s H4  nUR                  UR                  UR                  X>R                     S.PM6     nnU R                  R                  S5      nU(       d!  [        S5      =nU R                  S'   / Ul	        SU R                   ;   a8  U R                   S   nUR                  U5      nU(       d  [        SU S3S 5      eOSU R                   ;   a  U R                   S   n[        R                   " U R                  UUWS9  g s  snf s  snf )Nrv  zDesignAxes not definedr  r   r  r   )rq  r8   r;  )rq  linkedValuer8      )nominalValuerangeMinValuerangeMaxValuer8   )r   r8   )orderingrA   r8   valuesr8   ro  zElidedFallbackNameID z; points to a nameID that does not exist in the "name" tablern  )r  elidedFallbackName)r   r   r   rA   r  r   r  r  updater  r   r|  r2   r   getDebugNameotlbuildStatTable)r   rV   axisValueRecords
axisValuesformat4_locationsrA   avr
valuesDictr   r  nominalminValmaxValir   
designAxes	nameTabler  r8   s                      r4   r   Builder.build_STATM  s   zzzz~~l+!":DAA::>>*<=
C"$Jww ''
99q=*-))Jw's}}%*"}}Q/H%__F6{a'"))F1Isyy*QR6{a'")))//5ay(+		 6{a'28/"))071717(+			 ||,33J?%%EH]](S]);](S$'II &,,Z8G (X 
  KKuu$UU+	  	 
 IIMM&)	,4V,<<I		&) IO!TZZ/ZZ 67F))&1D%+F8 4# # 	   "TZZ/ZZ 45FII'%		
E )T
s   '#L
8;Lc                    0 SS_SS_SS_SS_S	S
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS _S!S"_S#S$S%S&S'S(S)S*S+S,S-S.S/S0S1.EnU Vs/ s H  o3U;   d  M
  X#   PM     nn/ n[        S5       HO  nUR                  S25        [        US3-  US-   S3-  5       H"  nXd;   a  X==   S4-  ss'   M  X==   S5-  ss'   M$     MQ     U Vs/ s H  n[        US S S62   5      PM     sn$ s  snf s  snf )7Ni  r   i  r   i  r;  i  r  i     i  r>  i     i     i     ij     i     i     i     i     iQ     ie  0   ib  1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   )ia  i`  i_  i^  i]  i\  iY  iW  iT  i  i  i  iR  i       10)r  r   r   )r   rk  
pages2bitspbitsr  js          r4   rg  Builder.build_codepages_  s    
! 
! 
 ! 
 !	 

 ! 
 ! 
 ! 
 ! 
 ! 
  
  
  
  
  
 " 
  ! 
" # 
$ ? 

B (-@u!Z
u@qALL1r6AER<09HOHHOH	 1  .33U
1TrT7#U33 A 4s   	C$C$C)c                 &   U R                   (       d  U R                  (       d  g [        R                  " 5       nSUl        U R                  U R                   5      Ul        U R                  U R                  5      Ul        [        S5      nXl	        U$ )Nr   rE   )
ru   rv   r   rE   r  buildBASEAxis	HorizAxisVertAxisr   r   )r   r   r   s      r4   r   Builder.buildBASE  sl    $$T-A-A}}!++D,A,AB**4+?+?@&!r6   c                 J    [         R                  " 5       nSUl        Xl        U$ Nr   )r   	BaseCoordr  
Coordinate)r   ccoords      r4   buildBASECoordBuilder.buildBASECoord  s"    ""$r6   c                 *   U(       d  g Uu  p#n[         R                  " 5       n[         R                  " 5       Ul        X!R                  l        [	        U5      UR                  l        [         R                  " 5       Ul        / UR                  l        [	        U5      UR                  l        [        U5       GHR  nU Vs/ s H  ofS   US   :X  d  M  USS  PM     nn[         R                  " 5       nUS   Ul
        [         R                  " 5       Ul        [         R                  " 5       UR                  l        UR                  US   5      UR                  R                  l        / UR                  R                  l        [	        US   5      UR                  R                  l        / UR                  l        US    HA  nUR                  R                  R                  R%                  U R'                  U5      5        MC     U H  u  pn[         R(                  " 5       nU R'                  U
5      Ul        U R'                  U5      Ul        SUl        U	S:X  a  XR                  l        Mf  [         R"                  " 5       nXl        Xl        UR                  R"                  R%                  U5        M     [	        UR                  R"                  5      UR                  l        UR                  R                  R%                  U5        GMU     U$ s  snf )Nr   r   r;  dflt)r   AxisBaseTagListBaselineTagr   BaseTagCountBaseScriptListBaseScriptRecordBaseScriptCountr   BaseScriptTag
BaseScript
BaseValuesindexDefaultIndexr  BaseCoordCountBaseLangSysRecordr   r  MinMaxMinCoordMaxCoordFeatMinMaxCountDefaultMinMaxBaseLangSysTagBaseLangSysCount)r   axisbasesscriptsminmaxr   recordminmax_for_scriptr  language	min_coord	max_coordminmax_recordlang_records                 r4   r  Builder.buildBASEAxis  sw   !%}}#//1',$(+E
%&557/1,.1'l+WoF)/!)/v!9q	3I
qr
  ! ..0F#)!9F  ( 3 3 5F+3+>+>+@F(8=F1I8NF((557F((2:=fQi.F((724F/AY!!,,66==d>Q>QRS>TU 2C.Y ( 1)-)<)<Y)G&)-)<)<Y)G&01-v%6C%%3"*"<"<">K19.)6&%%77>>{K 3D 25!!332F. 0077?= &> =!s   ?L	Lc                    [         R                  " 5       nU R                  5       Ul        [        R
                  " U R                  U R                  5      Ul        [        R                  " U R                  U R                  U R                  5      Ul        U R                  5       Ul        U R                  5       Ul        UR                   (       a  SOSUl        U R$                  (       a  U R$                  R'                  5       nU(       af  SUl        X!l        UR+                  5       nUR-                  U5        SU R.                  ;   a(  U R.                  S   R0                  R-                  U5        U R2                  R5                  5         [7        UR                  UR                  UR                  UR                  UR                   45      (       d  [9        US5      (       a  [;        S5      nXl        U$ g )Ni  r   i  rG   VarStorerF   )r   rF   buildGDEFGlyphClassDef_GlyphClassDefr  buildAttachListrw   rT   
AttachListbuildLigCaretListrx   ry   LigCaretListbuildGDEFMarkAttachClassDef_MarkAttachClassDefbuildGDEFMarkGlyphSetsDef_MarkGlyphSetsDefr  rU   finishr  optimizeremap_device_varidxesr2   r   r   clearr   rB  r   )r   r   store
varidx_mapr   s        r4   r   Builder.buildGDEF  s   }}!99;--d.@.@$--P11  $"6"6
 #'"C"C"E $ ? ? A%)%:%:z
((//1E) %"^^-
**:6TYY&IIf%++AA*M""$""!!''%%
 
 T:&&f%FLMr6   c                    U R                   (       a4  U R                   R                  5        VVVs0 s H
  u  nu  p#X_M     nnnnO0 nU R                   H"  nUR                  UR	                  5       5        M$     U R
                  R                  R                  5        H1  nUR                   H  nUR                  5        H  nSXH'   M	     M      M3     U(       a  [        R                  " 5       n	XIl        U	$ g s  snnnf )Nr  )rz   r   rc   r  inferGlyphClassesrQ   markClassesr  definitionsglyphSetr   r  	classDefs)
r   r   r  _classesr   	markClassmarkClassDefr   r   s
             r4   r  Builder.buildGDEFGlyphClassDef_1  s    /3/C/C/I/I/KL/KFQqt/KGLGG--v779: (!^^77>>@	$-$9$9L!-!6!6!8)* "9 %: A ++-F&M Ms   C8c                     U R                   R                  5        VVVs0 s H
  u  nu  p#X_M     nnnnU(       d  g [        R                  " 5       nXEl        U$ s  snnnf r?   )r{   r   r   r  r  )r   r   r  r  r  r   s         r4   r   $Builder.buildGDEFMarkAttachClassDef_C  sT    +/+;+;+A+A+CD+Cia!QT+C	D,,.$ Es   Ac                     / n[        U R                  R                  5       S S9 H  u  p#UR                  U5        M     [        R
                  " XR                  5      $ )Nc                     U S   $ r  r   )items    r4   <lambda>4Builder.buildGDEFMarkGlyphSetsDef_.<locals>.<lambda>N  s    47r6   r   )r   r}   r   r   r  buildMarkGlyphSetsDefrT   )r   setsglyphsid_s       r4   r  "Builder.buildGDEFMarkGlyphSetsDef_K  sR    !  &&(.B
KF KK
 ((}}==r6   c                     SU R                   ;  a,  [        S5      U R                   S'   0 U R                   S   l        U R                  U R                   S   R                  [        '   g )NDebg)r2   r   rj  rd   r
   r   s    r4   r   Builder.buildDebgS  sR    " ( 0DIIf%'DIIf"8<8M8M		&45r6   c                    US;   d   U5       eU R                    H
  nS Ul        M     / nU R                    H  nUR                  U:w  a  M  [        U5      Ul        [	        [        UR                  5      U R                  U5      S S9U R                  U   [        UR                  5      '   UR                  U5        M     / nU H#  n UR                  UR                  5       5        M%     U$ ! [         a%  n[        [        U5      UR                  5      UeS nAf[         aJ  nU R                  U   [        UR                  5         R                  n[        [        U5      U5      UeS nAff = f)Nr   )r   r8   r   )rc   lookup_indexr   r   r	   strr   get_lookup_name_rd   r   r1   r$   r   	Exception)r   rA   r   r   	otLookupsler   s           r4   buildLookups_Builder.buildLookups_Y  sG   &&++&mmF"&F $mmF||s""%g,FCRV__-**62DD!!#&s6+>+>'?@
 NN6" $ 	A?  +   $ A%c!fajj9q@ ?005c!..6IJSS%c!fh7Q>?s%   C--
E.7 DE.$AE))E.c                 T   [        [        US 5      " 5       nSUl        [        R                  " 5       Ul        / UR                  l        [        R
                  " 5       Ul        / UR
                  l        [        R                  " 5       Ul        U R                  U5      UR                  l	        0 n0 n0 nS n[        U R                  R                  5       US9 GH   u  pxUu  pn[        [        R                  S U 5       5      5      nUS:H  =(       a    US:H  nU R!                  X5      n[#        U5      S:X  a  U(       d	  U(       d  Mq  U HE  n U R$                  U   ['        U5         R)                  US9U R$                  U   ['        U5      '   MG     X4nUR1                  U5      nUc  [#        UR
                  R                  5      n[        R                  " 5       nUUl        [        R4                  " 5       Ul        U R7                  U5      UR4                  l        [;        U5      UR4                  l        [#        U5      UR4                  l        UR
                  R                  RA                  U5        UUU'   URC                  U	0 5      RC                  U
/ 5      RA                  U5        U RD                  R1                  X45      U:X  d  GM  UXIU
4'   GM     [        UR                  5       5       GH  u  n	n[        R                  " 5       nU	Ul#        [        RH                  " 5       Ul$        S URH                  l%        / URH                  l&        [        UR                  5       5       GH%  u  p[        RL                  " 5       n[        RN                  " 5       Ul'        S URN                  l(        UR1                  X45      nUc  S
URN                  l)        OUURN                  l)        U Vs/ s H  nUU:w  d  M  UPM     snURN                  l*        [#        URN                  RT                  5      URN                  l+        U
S:X  a  URN                  URH                  l%        M  U
Ul,        URH                  RL                  RA                  U5        GM(     [#        URH                  RL                  5      URH                  l-        UR                  R                  RA                  U5        GM     [#        UR                  R                  5      UR                  l.        [#        UR
                  R                  5      UR
                  l+        [#        UR                  R                  5      UR                  l        U$ ! [*         a    [,        R.                  " S	5         GMU  f = fs  snf )Nr   c                 8    U S   S   U S   S   U S   S   U S   4$ )Nr   r;  r   r   )fs    r4   r  #Builder.makeTable.<locals>.<lambda>  s)    AaDGQqT!Wad1gqt#Dr6   r  c              3   V   #    U  H  oR                   c  M  UR                   v   M!     g 7fr?   )r(  )r@   r-  s     r4   rB   $Builder.makeTable.<locals>.<genexpr>  s      ,3q~~NANNGs   ))rG   r  r   )r   zWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.i  r  )/getattrr   r  r   ScriptRecordr   FeatureRecordr   r/  Lookupr   re   r   tupledictfromkeysany_feature_variationsr   rd   r)  _replaceKeyErrorr   r   r   
FeatureTagFeaturer!  FeatureParamsrp   LookupListIndexr   r   r   rf   	ScriptTagScriptDefaultLangSysLangSysRecordLangSysLookupOrderReqFeatureIndexFeatureIndexr   
LangSysTagLangSysCountr   )r   rA   r   feature_indicesrequired_feature_indicesr  sortFeatureTagr   r   r   r   feature_taglookup_indicessize_featureforce_featureixfeature_keyfeature_indexfreclang_featuressreclangrecreq_feature_indexr  s                           r4   r   Builder.makeTables  s   #t,."#..0(*%$002*,'#..0"&"4"4S"9 #%  E"4>>#7#7#9~NLC(+%F+ # ,3 N &=B[F-BL 77IM>"a']$:>:O:OPS:TB;hsh+ ))#.s2w7 % '7K+//<M$ #E$5$5$C$C D--/"-'//1-1-D-D[-Q*/3N/C,+.~+>(!!//66t</<,vr*55dB?FF}U&&**F>:kI;H($8Y O^ &,GMMO%<!FM((*D#DN"//+DK)-DKK&(*DKK%)/0C0C0E)F%"002"*"2"2"4.2+$<$@$@&$P!$,6<GOO36GGOO3  /0.!!7H2HA0, 037??3O3O/P,6>18DKK.)-G&KK--44W=) *G* (+4;;+D+D'EDKK$))0069 &=< (+5+;+;+H+H'I$),U->->-L-L)M&'*5+;+;+B+B'C$q   MMG P0s   AU=1
V%?V%= V"!V"c                    0 nSnU R                   R                  5        H  u  u    pVn/ X6'   UR                  5        Hq  u  pU R                  U   n
/ nU	 HA  nUR                  U:w  a  M  UR                  c   eUR                  UR                  5        SnMC     X6   R                  X45        Ms     M     U(       a1  UR                  5        H  u  pm[        U R                  XU5        M     g g )NFT)rg   r   r   r   r(  r   r'   r2   )r   r   	table_tagfeature_varshas_any_variationsr  rR  
variationsconditionsetbuildersraw_conditionsetindicesbconditions_and_lookupss                 r4   r   Builder.makeFeatureVariations  s    "/3/G/G/M/M/O+Q(*L%*4*:*:*<&#'#6#6|#D !Aww)+ >>555NN1>>2)-& " )002B1LM += 0P 7C7I7I7K3'IIuk 8L r6   c                    ^ U R                   R                  5        HF  u  u    p4nXA:w  a  M  UR                  5        H"  u  pg[        U4S jU 5       5      (       d  M!      g   MH     g)Nc              3   @   >#    U  H  oR                   T:H  v   M     g 7fr?   )r   )r@   rh  r`  s     r4   rB   1Builder.any_feature_variations.<locals>.<genexpr>  s     >Xww)+Xr   TF)rg   r   r   )r   rR  r`  r  r   rc  rd  re  s     `     r4   r>  Builder.any_feature_variations  s^    +/+C+C+I+I+K'OQZ%*4*:*:*<&>X>>> += ,L r6   c                 ~    U R                   R                  5        VVs0 s H  u  p#X2_M	     nnnX;   a  XA   $ g s  snnf r?   )r_   r   )r   r   kvrevs        r4   r*  Builder.get_lookup_name_  s@     $ 3 3 9 9 ;< ;qt ;<=; =s   9c                 h   US:X  a#  US:X  a  U R                   (       a  [        SU5      eUS:X  a  U R                  (       a  [        SU5      eOSU l        X#4U R                   ;   a1  [        SUR                  5       < SUR                  5       < S3U5      eU R                   R	                  X#45        g )	NDFLTr  z_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz"languagesystem  z" has already been specified)rY   r   r^   stripadd)r   r   r   r  s       r4   add_language_systemBuilder.add_language_system  s    VF 2t7U7U!= 
 V))%8  * *.D&!?!??!<<>8>>#35 
 	&&**F+=>r6   c                 f    U R                   (       a  [        U R                   5      $ [        S15      $ )N)ru  r  )rY   r   r%  s    r4   get_default_language_systems_%Builder.get_default_language_systems_  s-     ))T;;<<./00r6   c                     U R                  5       U l        SU l        S U l        X l        SU l        S U l        US:X  a  Xl        g g )Nru  r   r   )r|  r]   rZ   r`   rb   r[   r\   ri   r   r   r8   s      r4   r   Builder.start_feature!  sJ     $ B B D!%)-&6>"* r6   c                 h    U R                   c   eS U l         S U l        S U l        SU l        S U l        g rA  )rb   r]   r`   r[   r\   r%  s    r4   r   Builder.end_feature+  s<    %%111!% $)-&r6   c                     X R                   ;   a  [        SU-  U5      eU R                  S:X  a  [        SU5      eX l        S U R                   U'   S U l        U R                  c  SU l        S U l        g g )Nz$Lookup "%s" has already been definedr   zpLookup blocks cannot be placed inside 'aalt' features; move it out, and then refer to it with a lookup statementr   )r_   r   rb   ra   r`   r[   r\   r  s      r4   start_lookup_blockBuilder.start_lookup_block3  s    &&&!6=x  !!V+!L 
 !%$(D!!!) D-1D* *r6   c                 v    U R                   c   eS U l         S U l        U R                  c  SU l        S U l        g g rA  )ra   r`   rb   r[   r\   r%  s    r4   end_lookup_blockBuilder.end_lookup_blockE  sE    $$000 $!!) D-1D* *r6   c                     XR                   ;   d   U5       eS U l        U R                   U   nUb  U R                  X R                  5        g g r?   )r_   r`   r   rb   )r   lookup_namer   s      r4   add_lookup_callBuilder.add_lookup_callM  sP    111>;>1$$[1''0F0FG r6   c                     X l         g r?   )rs   )r   r   revisions      r4   set_font_revisionBuilder.set_font_revisionT  s    %r6   c           	      x   [        U5      S:X  d   eU R                  S;   a  [        SU R                  -  U5      eU R                  c  [        SU5      eS U l        U R                  X R                  4nU R
                  R                  US   SUS   45      nUS:X  d  U(       a  U(       a  US S  U R
                  U'   OCU R
                  R                  U/ 5      nU Vs/ s H  oU;  d  M
  UPM     snU R
                  U'   [        U R                  U4/5      U l        U(       a  U R                  U4nXPR                  ;   aZ  [        SUR                  5       < S	U R                  R                  5       < S
U R                  U   R                  5       < S3U5      eU R                  U R                  U'   g g s  snf )Nr  r   r  z7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksr   r  r;  z	Language z	 (script z ) has already specified feature z as its required feature)r   rb   r   r`   rZ   re   r   r   r]   rf   rw  )	r   r   r  include_defaultrequiredr   r   cur_lookupsxs	            r4   set_languageBuilder.set_languageW  s   8}!!!!!%55!&(,(>(>? 
 !!)!2 
  ||X'='=>..$$c!ffc!f%=>/w")!*DNN3 ..,,S"5K.9"Nkg=M1k"NDNN3 )DLL(+C*D E<<*C---% !(**,//4::< 	 	 ,0+A+AD##C(  #Os   	F7+F7c                 B   [        U5      nU R                  R                  U5      nUb  U$ [        U R                  5      S-   nX0R                  U'   U HG  nX@R                  ;   a%  U R                  U   u  pV[        SU< SU< 3U5      eX14U R                  U'   MI     U$ )Nr   Glyph z3 already has been assigned a MarkAttachmentType at )r   r|   r   r   r{   r   )r   r   r   r!  r   r  locs          r4   getMarkAttachClass_Builder.getMarkAttachClass_  s    6"%%))&1?J$))*Q.*-'E((())%0%493@ 
 (+oDU#  
r6   c                     [        U5      nU R                  R                  U5      nUb  U$ [        U R                  5      nX0R                  U'   U$ r?   )r   r}   r   r   )r   r   r   r!  s       r4   getMarkFilterSet_Builder.getMarkFilterSet_  sO    6"""&&v.?J$&&''*V$
r6   c                     US-  nU(       a  U R                  X5      nX%S-  -  nU(       a  U R                  X5      nUS-  nX`l        OS U l        X l        g )N   r  r  )r  r  r\   r[   )r   r   rq  
markAttach
markFiltermarkAttachClassr   s          r4   set_lookup_flagBuilder.set_lookup_flag  s[    "66xLO12E 228HMDLE-:*-1D* r6   c                 
   U R                   S;   a  [        SU R                   -  U5      eU R                   c  [        SU5      eU R                  US41:X  a  g S U l        X l        SU l        S U l        U R                  USSSS9  g )	Nr  z5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksr  r   TF)r  r  )rb   r   r]   r`   rZ   r[   r\   r  )r   r   r   s      r4   
set_scriptBuilder.set_script  s    !!%55!&(,(>(>? 
 !!)!V    ff%5$66)-&(FD5Qr6   c           	          / nU H]  nUbF  UR                  U Vs/ s H'  o@R                  R                  UR                  5      PM)     sn5        ML  UR                  S5        M_     U$ s  snf )zHelper for building chain contextual substitutions

Given a list of lookup names, finds the LookupBuilder for each name.
If an input name is None, it gets mapped to a None LookupBuilder.
N)r   r_   r   r8   )r   r   lookup_buildersr   r-  s        r4   find_lookup_builders_Builder.find_lookup_builders_  sj     !J%&&>HIj((,,QVV4jI  &&t, " 	 Js   .A(
c                 |    U H6  nU R                   R                  U[        5       5      R                  U5        M8     g r?   )rw   r   rX   r  )r   r   r   contourPointsr   s        r4   add_attach_pointsBuilder.add_attach_points  s/    E))%7>>}M r6   c                 t    U R                   S:w  a  [        SU5      eU R                  R                  X45        g )Nr   z9Feature references are only allowed inside "feature aalt")rb   r   rh   r   )r   r   featureNames      r4   add_feature_referenceBuilder.add_feature_reference  s;    !!V+!KX  	""H#:;r6   c                 :    U R                   R                  U5        g r?   )rk   rx  r   rA   s     r4   add_featureNameBuilder.add_featureName  s    s#r6   c                 :    U R                   R                  U5        g r?   )rm   rx  r  s     r4   add_cv_parameterBuilder.add_cv_parameter  s    $r6   c                 p    XR                   ;   a  U R                   U==   S-  ss'   gSU R                   U'   g)zZAdds new items to ``self.cv_num_named_params_``
or increments the count of existing items.r   N)ro   r  s     r4   add_to_cv_num_named_params"Builder.add_to_cv_num_named_params  s6     +++%%c*a/*-.D%%c*r6   c                 @    U R                   U   R                  U5        g r?   )rq   r   )r   	characterrA   s      r4   add_cv_characterBuilder.add_cv_character  s    C ''	2r6   c                 8    U(       a
  XU4U l         g XU4U l        g r?   )rv   ru   )r   r  r  verticalr  s        r4   set_base_axisBuilder.set_base_axis  s    $)F#;D %*V$<D!r6   c                     U R                   S:w  a  [        SU R                   -  U5      eX#XE/U l        U R                   H/  u  pgXgU R                   4nU R                  R                  U/ 5        M1     g )Nr  z9Parameters statements are not allowed within "feature %s")rb   r   rr   r]   re   r   )	r   r   r  r  r  r  r   r   r   s	            r4   set_size_parametersBuilder.set_size_parameters  sz     !!V+!&(,(>(>? 
 ",* O 11LF!7!78CNN%%c2. 2r6   c                 B   U R                   S:X  aN  UR                  5        H9  u  pgU R                  R                  U/ 5      nXx;  d  M(  UR	                  U5        M;     g U(       d  U(       d  U(       a  U R                  XX45        g U R                  U[        5      n	UR                  5        Ho  u  pgXiR                  ;   aM  XyR                  U   :X  a  [        R                  SUUU5        O"[        SU< SU	R                  U   < S3U5      eXyR                  U'   Mq     g )Nr   zDRemoving duplicate single substitution from glyph "%s" to "%s" at %sz*Already defined rule for replacing glyph "z" by "")rb   r   rj   r   r   add_single_subst_chained_r   r   r   loginfor   )
r   r   prefixsuffixr   
forceChain
from_glyphto_glyphr   r   s
             r4   add_single_substBuilder.add_single_subst  s    !!V+(/$
,,77
BG'KK) )8 Vz**8VM!!(,>?$+MMO J^^+~~j99HH."   *%v~~j'AC  
 *2NN:&! %4r6   c                 H   U(       d  U(       d  U(       a  U R                  XX4U5        g U R                  U[        5      nX7R                  ;   aF  XWR                  U   :X  a%  [        R                  SUUU(       a  SU 3OS5        O[        SU-  U5      eXWR                  U'   g )Nz@Removing duplicate multiple substitution from glyph "%s" to %s%sz at r  z+Already defined substitution for glyph "%s")add_multi_subst_chained_r   r   r   r  r  r   )r   r   r  r   r  replacementsr  r   s           r4   add_multiple_substBuilder.add_multiple_subst"  s     Vz))(E<X!!(,@ANN"~~e44$ )1d8*%r &AEI8  !-ur6   c                   ^ U R                   S:X  a8  U R                  R                  U/ 5      mTR                  U4S jU 5       5        g U(       d  U(       aU  U R	                  U[
        5      nU R                  U[        5      nUR                  R                  [        X#1/XG/5      5        OU R	                  U[        5      nX7R                  ;   a  [        SU-  U5      eXWR                  U'   g )Nr   c              3   6   >#    U  H  oT;  d  M
  Uv   M     g 7fr?   r   )r@   r   r   s     r4   rB   .Builder.add_alternate_subst.<locals>.<genexpr><  s     @;a4-;r   z)Already defined alternates for glyph "%s")rb   rj   r   r   r   r   r   r   rulesr   r#   r   r   )	r   r   r  r   r  replacementchainr   r   s	           @r4   add_alternate_substBuilder.add_alternate_subst9  s    !!V+((33E2>DKK@;@@V$$X/GHE--h8MNFKK26G9fhWX%%h0EFF%%%!;eCX  $/% r6   c                 
   U(       d  U(       d  U(       a  U R                  XX4U5        g U R                  U[        5      n[        U5      (       d  [	        SU5      e[
        R                  " U6  H  nXWR                  U'   M     g Nz!Empty glyph class in substitution)add_ligature_subst_chained_r   r   allr   	itertoolsproduct	ligatures)	r   r   r  r   r  r  r  r   r   s	            r4   add_ligature_substBuilder.add_ligature_substL  st     Vz,,&+ %%h0DEF6{{!"ExPP ""F+A"-Q ,r6   c           
         [        U5      (       a   [        U5      (       a  [        U5      (       d  [        SU5      eU R                  U[        5      nUR                  R                  [        X#X@R                  U5      5      5        g Nz,Empty glyph class in contextual substitution)r  r   r   r   r  r   r#   r  r   r   r  r   r  r   r   s          r4   add_chain_context_substBuilder.add_chain_context_substc  sl    6{{#f++S[[!>  !!(,DE(B(B7(K	
r6   c           	         U(       a   [        U5      (       a  [        U5      (       d  [        SU5      eU R                  U[        5      nUR	                  U[
        5      nUc  U R                  U[
        5      nUR                  R                  U5        UR                  R                  [        U[        UR                  5       5      /X6/5      5        g r  )r  r   r   r   find_chainable_substr   r   r   r  r  r   r#   rp   keys)r   r   r  r  r   r  subs          r4   r  !Builder.add_single_subst_chained_o  s    c&kkV!> 
   +CD((2DE;**85GHC7#glln)=(>N	
r6   c                 T   [        U5      (       a  [        U5      (       d  [        SU5      eU R                  U[        5      nUR	                  X50[
        5      nUc  U R                  U[
        5      nXWR                  U'   UR                  R                  [        X#1/XG/5      5        g r  )r  r   r   r   r  r   r   r   r  r   r#   )r   r   r  r   r  r  r  r  s           r4   r   Builder.add_multi_subst_chained_  s    6{{#f++!>    +CD((%)>@TU;**85IJC)E.vy&%PQr6   c                 x   [        U5      (       a  [        U5      (       d  [        SU5      eU R                  U[        5      nUR	                  X55      nUc  U R                  U[        5      n[        R                  " U6  H  nXWR                  U'   M     UR                  R                  [        X#XG/5      5        g r  )r  r   r   r   find_chainable_ligature_substr   r   r  r  r  r  r   r#   )	r   r   r  r   r  r  r  r  r   s	            r4   r  #Builder.add_ligature_subst_chained_  s     6{{#f++!>    +CD11&F;**85IJC""F+A*MM! , 	.vvuMNr6   c                     U(       d  [        SU5      eU R                  U[        5      nUR                  R	                  X#U45        g r  )r   r   r   r  r   )r   r   
old_prefix
old_suffixr   r   s         r4   add_reverse_chain_single_subst&Builder.add_reverse_chain_single_subst  s=    !"ExPP!!(,JKZW=>r6   c                 x   U(       d  U(       d  U(       a  U R                  XX45        g U R                  U[        5      nU HD  u  pxU(       d  [        SU5      eU R	                  XSS9n	U H  n
 UR                  XU	5        M     MF     g ! [         a%  n[        [        U5      UR                  5      UeS nAff = f)N%Empty glyph class in positioning ruleFpairPosContext)	add_single_pos_chained_r   r"   r   makeOpenTypeValueRecordadd_posr$   r)  r   )r   r   r  r  posr  r   r   rq  otValueRecordr   r.  s               r4   add_single_posBuilder.add_single_pos  s    Vz((6G%%h0@AF!$)?  !% < <E != ! $EIxF $ "% , I-c!fajjAqHIs   /B


B9 B44B9c                     U(       a  U(       d  [        SU5      eU R                  U[        5      nU R                  XSS9nU R                  XSS9nUR	                  XXtU5        g Nr  Tr  )r   r   r!   r  addClassPair)	r   r   glyphclass1value1glyphclass2value2r   v1v2s	            r4   add_class_pair_posBuilder.add_class_pair_pos  sc    +!"I8TT!!(N;))(4)P))(4)PH2BGr6   c                     U(       a  U(       d  [        SU5      eU R                  U[        5      nU R                  XSS9nU R                  XSS9nUR	                  XXtU5        g r  )r   r   r!   r  addGlyphPair)	r   r   glyph1r  glyph2r  r   r  r  s	            r4   add_specific_pair_posBuilder.add_specific_pair_pos  sc    V!"I8TT!!(N;))(4)P))(4)PHb"=r6   c           	          U(       d  [        SU5      eU R                  U[        5      nUR                  UUU R	                  X5      U R	                  X5      5        g Nr  )r   r   r   add_attachmentmakeOpenTypeAnchor)r   r   
glyphclassentryAnchor
exitAnchorr   s         r4   add_cursive_posBuilder.add_cursive_pos  sV    !"I8TT!!(,=>##H:##H9		
r6   c                    U R                  U[        5      nU R                  XU5        U(       d  [        SU5      eU HG  u  pVU R	                  X5      nU H+  nXtR
                  R                  U0 5      UR                  '   M-     MI     g r  )r   r   
add_marks_r   r!  r  r   r8   )	r   r   r  marksr   
baseAnchorr  otBaseAnchorr   s	            r4   add_mark_base_posBuilder.add_mark_base_pos  sx    ""8-?@51!"I8TT%*!J228HLEQ((r29>>B  &+r6   c                 4   U R                  U[        5      n/ nU(       d  [        SU5      eU HP  n0 nU R                  XU5        U H"  u  pU R	                  X5      XyR
                  '   M$     UR                  U5        MR     U H  n
XTR                  U
'   M     g r  )r   r   r   r(  r!  r8   r   r  )r   r   r  
componentsr   componentAnchorsr)  anchors	ligAnchorr  r   s              r4   add_mark_lig_posBuilder.add_mark_lig_pos  s    ""8->?!"I8TTEGOOHu5(-$	*.*A*A(*V' ).##G,   E'7e$ r6   c                    U R                  U[        5      nU R                  XU5        U(       d  [        SU5      eU HH  u  pVU R	                  X5      nU H,  nUUR
                  R                  U0 5      UR                  '   M.     MJ     g r  )r   r   r(  r   r!  	baseMarksr   r8   )	r   r   r6  r)  r   r*  r  r+  baseMarks	            r4   add_mark_mark_posBuilder.add_mark_mark_pos  s    ""8-?@51!"I8TT%*!J228HL% ! !!,,Xr:NN & &+r6   c           
         [        U5      (       a   [        U5      (       a  [        U5      (       d  [        SU5      eU R                  U[        5      nUR                  R                  [        X#X@R                  U5      5      5        g )N0Empty glyph class in contextual positioning rule)r  r   r   r   r  r   r#   r  r  s          r4   add_chain_context_posBuilder.add_chain_context_pos   sl    6{{#f++S[[!BH  !!(,BC(B(B7(K	
r6   c                    U(       a   [        U5      (       a  [        U5      (       d  [        SU5      eU R                  U[        5      n/ nUR                   H  u      pxUR                  U5        M     / n	U H  u  pUc  U	R                  S 5        M  U R                  XSS9nUR                  XjU5      nUc'  U R                  U[        5      nUR                  U5        U
 H  nUR                  XU5        M     U	R                  U5        M     [        U5      [        U	5      :X  d   XI45       eUR                  R                  [        X$ VVs/ s H  u  nnUPM
     snnX95      5        g s  snnf )Nr;  Fr  )r  r   r   r   r  r   r   r  find_chainable_single_posr   r"   r  r   r#   )r   r   r  r  r	  r  targetsr  r   subsr   rq  otValuer  r   r   rq  s                    r4   r  Builder.add_single_pos_chained_  sP   #f++S[[!BH    +AB %Aq!NN7# !, MF}D!22 3 G 11'7KC{..x9IJs#HW5  KK ! 3x3t9$1sk1$s(;stq!s(;VJ	
(;s   E+c                    U H  u  pEUR                    H  nUR                  R                  5        H  nXrR                  ;  aM  U R	                  U[
        R                  " UR                  5      5      nUR                  U4UR                  U'   M_  UR                  U   S   n	UR                  U	:w  d  M  [        SU< SU	< SUR                  < 3U5      e   M     M     g)z)Helper for add_mark_{base,liga,mark}_pos.r   r  z cannot be in both @z and @N)
r  r   r  r)  r!  copydeepcopyanchorr8   r   )
r   r   lookupBuilderr)  r  r  r  markotMarkAnchorexistingMarkClasss
             r4   r(  Builder.add_marks_*  s    !LA ) 5 5(//88:D#6#66'+'>'>$dmmL4G4G&H( 6?^^\4R++D1,9,?,?,Ea,H)$>>->>"1#'):INN!L (#  ; !6 "r6   c                 :    U R                   R                  U5        g r?   )r`   add_subtable_break)r   r   s     r4   rN  Builder.add_subtable_break=  s    ++H5r6   c                     U R                   R                  US5      u  pEU(       a  XC:w  a  [        SU< SU< 3U5      eX14U R                   U'   g )NNNr  z& was assigned to a different class at )rz   r   r   )r   r   r   
glyphClassoldClassoldLocations         r4   setGlyphClass_Builder.setGlyphClass_@  sT     $ 4 4 8 8 M.!+' 
 (2&<U#r6   c                     U H  nU R                  XS5        M     U H  nU R                  XS5        M     U H  nU R                  XS5        M     U H  nU R                  XS5        M     g )Nr   r;  r  r  )rU  )r   r   
baseGlyphsligatureGlyphs
markGlyphscomponentGlyphsr   s          r4   add_glyphClassDefBuilder.add_glyphClassDefJ  sl      E3  #E3 $E3  $E3 %r6   c                 T    U H"  nX@R                   ;  d  M  X0R                   U'   M$     g r?   )ry   )r   r   r   caretsr   s        r4   add_ligatureCaretByIndex_!Builder.add_ligatureCaretByIndex_V  s&    E000.4$$U+ r6   c                 f    [        U[        5      (       d  U$ U R                  X5      u  p4Ub  X44$ U$ r?   )rP   r   makeVariablePos)r   r   caretdefaultdevices        r4   makeLigCaretBuilder.makeLigCaret[  s:    %00L..x?$$r6   c                     U Vs/ s H  o@R                  X5      PM     nnU H"  nXPR                  ;  d  M  X0R                  U'   M$     g s  snf r?   )rg  rx   )r   r   r   r_  rd  r   s         r4   add_ligatureCaretByPos_Builder.add_ligatureCaretByPos_c  sI    BHI&##H4&IE000.4$$U+  Js   A
c                 @    U R                   R                  X#XEU/5        g r?   )rt   r   )r   r   r  r'  r(  r)  r*  s          r4   add_name_recordBuilder.add_name_recordi  s    F	6JKr6   c                      X R                   U'   g r?   )r~   r   r   rq  s      r4   add_os2_fieldBuilder.add_os2_fieldl  s    		#r6   c                      X R                   U'   g r?   )r   rp  s      r4   add_hhea_fieldBuilder.add_hhea_fieldo      

3r6   c                      X R                   U'   g r?   )r   rp  s      r4   add_vhea_fieldBuilder.add_vhea_fieldr  rv  r6   c                 `  ^^
 SU R                   ;  a  [        SU5      eU R                   Vs0 s H1  nUR                  UR                  UR
                  UR                  4_M3     nnUR                  5        VVVs0 s H%  u  nu  pxU[        XuU   5      [        XU   5      4_M'     nnnnSU R                   ;   aT  U R                   S   R                  m
UR                  5        V^V	s0 s H  u  mn	T[        UU
4S jU	 5       5      _M     nnn	X0R                  U'   g s  snf s  snnnf s  sn	nf )NrO   z?Cannot add feature variations to a font without an 'fvar' tableavarc              3   R   >#    U  H  nTT;   a  [        UTT   5      OUv   M     g 7fr?   )r)   )r@   rq  r  r   s     r4   rB   +Builder.add_conditionset.<locals>.<genexpr>  s1      , =AGO&q'$-8QRR,s   $')r2   r   rV   rW   minValuedefaultValuemaxValuer   r(   segmentsr;  r   )r   r   r   rq  r  axisMaprA   bottomtopcondition_ranger   s       `     @r4   add_conditionsetBuilder.add_conditionsetu  sF   "!Q  		
! LL4==$*;*;T]]KK! 	 
 ',kkm

 '4"]f	 vs|4sCL1  '4 	 
 TYYii'00G .3[[]
 .;)D/	 e ,   .;   $)C 5


s   8D;,D#($D*c                 R   U R                   (       d  [        SU5      eU R                  Ul        UR                  (       d  UR                  S 4$ UR                  U R                   U R                  U R                  R                  S5      5      u  p4S nUb  US:w  a  [        U5      nX54$ )Nz5Can't define a variable scalar in a non-variable fontr{  l    )
rU   r   rV   	does_varyre  add_to_variation_storer   r2   r   r&   )r   r   	varscalarre  r  rf  s         r4   rc  Builder.makeVariablePos  s    ##!G  	""$$d**"99  $"2"2DIIMM&4I
 *!4%e,Fr6   c                     S n[        U[        5      (       d%  Ub  [        R                  " [	        U5      5      nX4$ U R                  X15      u  pTUb  Ub  [        SU5      eXT4$ )N4Can't define a device coordinate and variable scalar)rP   r   r  buildDevicer<  rc  r   )r   r  deviceTabler   rf  re  s         r4   makeAnchorPosBuilder.makeAnchorPos  so    )^44&k):;$$..xC+"9!F  r6   c                    Uc  gSu  p4UR                   b)  [        R                  " [        UR                   5      5      nUR                  b)  [        R                  " [        UR                  5      5      nU R                  UR                  UR                   U5      u  pSU R                  UR                  UR                  U5      u  pd[        R                  " XVUR                  X45      nU$ )zast.Anchor --> otTables.AnchorNrQ  )
xDeviceTabler  r  r<  yDeviceTabler  r  ybuildAnchorcontourpoint)r   r   rG  deviceXdeviceYr  r  	otlanchors           r4   r!  Builder.makeOpenTypeAnchor  s    >%*ood6+>+>&?@G*ood6+>+>&?@G''&2E2ExP
''&2E2ExP
OOA&*=*=wP	r6   Reservedr   r   c                 L   U(       d  g0 nU R                   R                  5        H  u  nu  pg[        X%S5      nU(       d  M  U(       a#  [        R                  " [        U5      5      XF'   MG  [        U[        5      (       a^  USS S-   n	U	S   R                  5       U	SS -   n
[        X*5      (       a  [        SU5      eU R                  X5      u  XF'   nUb  XU	'   M  M  XU'   M     U(       a   U(       d  UR                  (       a  SS0OSS0n[        R                  " U5      nU$ )	z&ast.ValueRecord --> otBase.ValueRecordNr   r  Devicer   r  YAdvanceXAdvance)_VALUEREC_ATTRSr   r7  r  r  r<  rP   r   lowerr   rc  r  
buildValue)r   r   rq  r  vrastNameotNameisDevicevalotDeviceNamefeaDeviceNamerf  valRecs                r4   r  Builder.makeOpenTypeValueRecord  s   +/+?+?+E+E+G'G'f!d+C __T#Y7
C00%a{X5 ,Q 5 5 7,qr:J J1,,)NPX  &*%9%9(%H"
F%'-|$ & !6
# ,H& "$%JJ*aZOB#r6   )0rj   rh   ri   rw   rV   ru   rv   r   rb   r`   ra   rq   ro   rm   rn   rY   rk   rl   rg   re   rR   r2   rs   rz   rT   r   r]   rx   ry   rd   r[   r\   rc   r|   r{   r}   r   r_   rt   r~   rQ   rf   rZ   r^   rr   r   rU   r   NF)F)c__name__
__module____qualname____firstlineno__r   r   r   r1   r   r   r   r   r   r   r   r	  r!  r   r   rs  r~  r  r   rg  r   r  r  r   r  r   r  r   r/  r   r   r>  r*  ry  r|  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r%  r,  r3  r8  r<  r  r(  rN  rU  r\  r`  rg  rj  rm  rq  rt  rx  r  rc  r  r!  r   valueRecordFormat
startswithr  r  r  __static_attributes__)r@   r  r8   r  s   0000r4   r0   r0   ]   sQ     
  O HT<|>
 61*f
02":$)V4RUh( 4?$S
j+4Z
*X"H$>N4bH.?2	1+.2$2H&+BZ$!R* N<$%/3 >@ =/"2> IN-./&..


 RO&?I(H>	
R8
!


<&6=
45
5L  ")H(  %+$<$<$< AXz* 	5Q$qr("T$44$<Os   1E=
E=
r0   r  )NNF)IfontTools.miscr   fontTools.misc.textToolsr   r   r   r   fontTools.feaLib.errorr    fontTools.feaLib.lookupDebugInfor	   r
   r   fontTools.feaLib.parserr   fontTools.feaLib.astr   fontTools.feaLib.variableScalarr   fontTools.otlLibr   r  fontTools.otlLib.maxContextCalcr   fontTools.ttLibr   r   fontTools.ttLib.tablesr   r   fontTools.otlLib.builderr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   fontTools.otlLib.errorr$   fontTools.varLib.varStorer%   fontTools.varLib.builderr&   fontTools.varLib.featureVarsr'   fontTools.varLib.modelsr(   r)   collectionsr*   rE  r  ior+   loggingr   r   	getLoggerr  r  r5   r;   objectr0   r   r6   r4   <module>r     s    " E E 2 
 + , : + 6 4 3    " 4 ; 5 @ F #      	 !.& 7<G2Mf Mr6   