
    <`j                        d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ d dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. d dl/m0Z0 d dl1Z1d dl2m3Z3 d dl4Z4d dl5Z5d dl6Z6 e4j7        e8          Z9ddZ:	 ddZ; G d de<          Z=d Z>d ej?        D             Z@d ZAdS )    )Tagtostr)sstruct)
binary2numsafeEval)FeatureLibError)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYLOOKUP_DEBUG_ENV_VAR)Parser)FeatureFile)builder)
maxCtxFont)newTablegetTableModule)otBaseotTables)AlternateSubstBuilderChainContextPosBuilderChainContextSubstBuilderLigatureSubstBuilderMultipleSubstBuilderCursivePosBuilderMarkBasePosBuilderMarkLigPosBuilderMarkMarkPosBuilderReverseChainSingleSubstBuilderSingleSubstBuilderClassPairPosSubtableBuilderPairPosBuilderSinglePosBuilderChainContextualRule)OpenTypeLibError)defaultdictN)StringIOFc                 T    t          | |          }|                    ||           dS )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        8lib/python3.11/site-packages/fontTools/feaLib/builder.pyaddOpenTypeFeaturesr/   -   s/     dK((GMMuM-----    c                 v    t          t          |                    }|r||_        t          | |||           dS )ae  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   namer/   )r,   featuresfilenamer(   r)   r-   s         r.   addOpenTypeFeaturesFromStringr5   ?   sD    & 5??++K $#k&FFFFFFr0   c                      e Zd Z ed dD                       Zd ZdQdZd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d) Z)d* Z*d+ Z+d, Z,d- Z-d. Z.d/ Z/d0 Z0d1 Z1d2 Z2d3 Z3d4 Z4d5 Z5d6 Z6d7 Z7d8 Z8d9 Z9d: Z:	 dRd;Z;d< Z<d= Z=d> Z>d? Z?d@ Z@dA ZAdB ZBdC ZCdD ZDdE ZEdF ZFdG ZGdH ZHdI ZIdJ ZJdK ZKdL ZLdM ZMdN ZNdO ZOdP ZPdS )Sr*   c              #   4   K   | ]}t          |          V  d S N)r   ).0tags     r.   	<genexpr>zBuilder.<genexpr>Z   s<           	C           r0   )
BASEGDEFGPOSGSUBOS/2headhhear2   vheaSTATc                 Z   || _         t          |t                    r|d c| _        | _        nd |c| _        | _        |                                | _        t                      | _        d | _	        d| _
        d | _        t                      | _        d| _        i | _        d | _        d | _        d | _        g | _        i i d| _        i | _        i | _        g | _        d | _        i | _        t                      | _        i | _        t                      | _        i | _        i | _        t=          t>                    | _         d | _!        d | _"        g | _#        d | _$        d | _%        i | _&        i | _'        i | _(        i | _)        i | _*        i | _+        i | _,        i | _-        i | _.        i | _/        i | _0        d S )Nr   F)r?   r>   )1r,   
isinstancer   	parseTreefilegetReverseGlyphMapglyphMap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_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_)selfr,   r-   s      r.   __init__zBuilder.__init__j   s   	 k;// 	:(3T%DNDII(,k%DNDI//11),&)-& #%*"  $!%)+R 8 8"$ " " UU!#!ee"$$&!)$// $! $#!!!"$!	




r0   NFc                      j         1t           j         j                                                   _          j                                         | j        }nPt          |          }| j        z
  }|r5d                    t          |                    }t          d| d          d|v r                                  d|v r                                  d|v r                                  d|v r                                  d|v r                                  d	|v r                                  d
|v r                                  dD ]~}||vr                     |          }|j        j        dk    s |j        j        dk    s|j        j        dk    r!t3          |          x} j        |<   ||_        m| j        v r j        |= t9           fddD                       r-d	 j        v r$t;           j                   j        d	         _        d|v r2                                 }|r| j        d<   nd j        v r j        d= d|v r2                                  }	|	r|	 j        d<   nd j        v r j        d= |s$tB          j"        #                    tH                    r %                                 d S d S )Nz, z9The following tables were requested but are unsupported: .r?   rA   rB   rC   r2   r@   rD   r>   r?   r   c              3   *   K   | ]}|j         v V  d S r8   )r,   )r9   r:   rt   s     r.   r;   z Builder.build.<locals>.<genexpr>   s*      <<Csdi<<<<<<r0   r=   r<   )&rG   r   rH   rJ   parser+   supportedTables	frozensetjoinsortedNotImplementedErrorbuild_feature_aalt_
build_head
build_hhea
build_vhea
build_name
build_OS_2
build_STAT	makeTable
ScriptListScriptCountFeatureListFeatureCount
LookupListLookupCountr   r,   tableanyr   usMaxContext	buildGDEF	buildBASEosenvirongetr   	buildDebg)
rt   r(   r)   unsupportedunsupported_stringr:   r   	fontTablegdefbases
   `         r.   r+   zBuilder.build   s(   >!#DIt}==CCEEDNT""">)FFv&&F 4#77K %)YYvk/B/B%C%C")-)- - -   V$$&&&VOOVOOVOOVOOVOOVOO# 	# 	#C&  NN3''E ,q00$1A55#/!33-5c]]:	DIcN"'		!!IcN<<<<+;<<<<< 	C49ATAT-7	-B-BDIf*V>>##D &$(	&!!49$$If%V>>##D &$(	&!!49$$If% 	BJNN#788 	NN	 	r0   c                      || j         |          }| j        |_        | j        |_        | j                            |           |S r8   )r,   rN   
lookupflagrO   markFilterSetrV   append)rt   locationbuilder_classresults       r.   get_chained_lookup_zBuilder.get_chained_lookup_   sF    ty(33 ,#=V$$$r0   c                     | j         D ]8\  }}|||f}| j                            |g                               |           9d S r8   )rP   rX   
setdefaultr   )rt   lookupfeature_namescriptlangkeys         r.   add_lookup_to_feature_zBuilder.add_lookup_to_feature_   sW     1 	> 	>LFD4.CN%%c2..55f====	> 	>r0   c                    | j         rIt          | j                   |k    r1| j         j        | j        k    r| j         j        | j        k    r| j         S | j        r| j         rt          d|           || j        |          | _         | j        | j         _        | j        | j         _        | j	        
                    | j                    | j        r| j         | j        | j        <   | j        r |                     | j         | j                   | j         S )NzOWithin a named lookup block, all rules must be of the same lookup type and flag)rS   typer   rN   r   rO   rT   r   r,   rV   r   rR   rU   r   )rt   r   r   s      r.   get_lookup_zBuilder.get_lookup_   s"   	$T%&&-77 +t/??? .$2PPP##  	T%5 	!0  
 )=H==&*&6#)-)G&T-...  	J9=9ID 56! 	R ''(8$:PQQQr0   c           
      B     j         s	 j        sd S d  j                                        D             } j         dgz   D ]\  }fd j                                        D             }|sdk    rt	          dz  |          |D ]\  }}}}|D ]}t          |t                    s|g}|D ]c}|                                                                D ]:\  }	}
|                    |	t                                
                    |
           ;dd |                                D             } fd|                                D             }|s|sd S d  j                                        D              _         j        }g  _                              j        d           |r"                     |t                    }||_        |r"                     |t"                    }||_                                           j                            |           d S )	Nc                 4    i | ]\  }}|t          |          S  )rK   )r9   gas      r.   
<dictcomp>z/Builder.build_feature_aalt_.<locals>.<dictcomp>  s$    JJJDAqaQJJJr0   )Naaltc                 6    g | ]\  \  }}}}|k    ||||fS r   r   )r9   r   r   featurelookupsr2   s        r.   
<listcomp>z/Builder.build_feature_aalt_.<locals>.<listcomp>  s>       4+VT7Wd?? w0"??r0   r   zFeature %s has not been definedc                 f    i | ].\  }}t          |          d k    |t          |          d         /S )   r   )lenrb   )r9   glyphrepls      r.   r   z/Builder.build_feature_aalt_.<locals>.<dictcomp>   s;     
 
 
%0UD#d))WX..E4::a=...r0   c                 t    i | ]4\  }}t          |          d k    |t          |j        j                  5S )r   r   )r   r~   r,   
getGlyphID)r9   r   r   rt   s      r.   r   z/Builder.build_feature_aalt_.<locals>.<dictcomp>%  sH     
 
 
t4yy1}} 6$DI$8999}}r0   c                 4    i | ]\  \  }}}}|d k    |||f|S )r   r   )r9   r   r   r   r   s        r.   r   z/Builder.build_feature_aalt_.<locals>.<dictcomp>,  sA     
 
 
0'w&   T7#W   r0   )rZ   r\   itemsrX   r   rF   rb   getAlternateGlyphsr   rK   updaterV   start_featurer[   r   r   mappingr   
alternatesend_featureextend)rt   r   r   r   r   r   r   
lookuplistr   r   altssinglemultiold_lookupssingle_lookupmulti_lookupr2   s   `               @r.   r   zBuilder.build_feature_aalt_
  s   " 	4+@ 	FJJD,A,G,G,I,IJJJ
"1^4DD 	M 	MNHd   8<8L8L8N8N  G  tv~~%5<h   3: M M.gw") M MJ%j$77 2&0\
", M M+1+D+D+F+F+L+L+N+N M MKE4&11%??FFtLLLLMMMM
 
4>4D4D4F4F
 
 


 
 
 
)//11
 
 

  	e 	F
 
48N4H4H4J4J
 
 

 m4.777 	+ ,,X7IJJM$*M! 	,++H6KLLL&+L#[)))))r0   c                     | j         sd S | j                            d          }|sIt          d          x}| j        d<   |                    d| j                   d|_        dx|_        |_        | j         |_        d S )NrA   s6                                                         g      ?l   e )	re   r,   r   r   	decompiletableVersioncreatedmodifiedfontRevisionrt   r   s     r.   r   zBuilder.build_head=  s    ! 	F	f%% 	8(0(8(88EDIf%OOJ	222!$E-77EMEN!/r0   c                    | j         sd S | j                            d          }|s;t          d          x}| j        d<   |                    d| j                   d|_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_	        d S d S )NrB   $                                          caretoffsetascender	descenderlinegap)
rq   r,   r   r   r   r   caretOffsetascentdescentlineGapr   s     r.   r   zBuilder.build_hheaH  s    z 	F	f%% 	,(0(8(88EDIf%OOJ	222!+EDJ&& $
= 9E##:j1EL$*$$ J{3EM
"" Jy1EMMM #"r0   c                 l   | j         sd S | j                            d          }|s;t          d          x}| j        d<   |                    d| j                   d|_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d S d S )NrC   r   i  verttypoascenderverttypodescenderverttypolinegap)	rr   r,   r   r   r   r   r   r   r   r   s     r.   r   zBuilder.build_vheaY  s    z 	F	f%% 	,(0(8(88EDIf%OOJ	222!+E++:&89EL$*,, J':;EM
** J'89EMMM +*r0   c                 ^    d |j         D             }t          dd          D ]
}||vr|c S d S )Nc                     g | ]	}|j         
S r   )nameID)r9   r2   s     r.   r   z,Builder.get_user_name_id.<locals>.<listcomp>j  s    77744;777r0      i  )namesrange)rt   r   nameIDsuser_name_ids       r.   get_user_name_idzBuilder.get_user_name_idh  sV    775;777!#u-- 	$ 	$L7**#### +	$ 	$r0   c                 T   d }|dk    rYt          j                    }| j        \  |_        |_        |_        |_        || j        v r| j        |         |_        nOd|_        nF|| j	        v rA| j        sn4|| j        v sJ t          j
                    }d|_        | j        |         |_        n|| j        v rt          j                    }d|_        | j                            |dfd          |_        | j                            |dfd          |_        | j                            |dfd          |_        | j                            |d          |_        | j                            |dfd          |_        t1          | j        |                   |_        | j        |         |_        |S )Nsizer   FeatUILabelNameIDFeatUITooltipTextNameIDSampleTextNameIDParamUILabelNameID_0)r   FeatureParamsSizerd   
DesignSizeSubfamilyID
RangeStartRangeEndr^   SubfamilyNameIDr]   FeatureParamsStylisticSetVersionUINameIDr_   FeatureParamsCharacterVariantsFormatr`   r   r   r   r   ra   NumNamedParametersFirstParamUILabelNameIDr   rc   	CharCount	Character)rt   r:   paramss      r.   buildFeatureParamszBuilder.buildFeatureParamso  s   &==/11F %!"!d,,,)-)?)D&&)*&&D&&&) >d44444!;==!""&"8"=D'''<>>FFM'+'>'B'B)*A( (F$ .2-D-H-H/0!. .F* '+&=&A&A()1' 'F# )-(A(E(Ec1(M(MF%-1-D-H-H,-q. .F*  #4#6s#;<<F#237Fr0   c                 N   | j         sd S | j                            d          }|s t          d          x}| j        d<   g |_        | j         D ]}|\  }}}}}t          |t                    s|}|| j        v rC|| j        vr,| 	                    |          | j        |<   | j        |         J | j        |         }nQ|d         | j
        v rB|| j        vr,| 	                    |          | j        |<   | j        |         J | j        |         }|                    |||||           d S )Nr2   r   )rf   r,   r   r   r   rF   intr]   r^   r   r_   r`   setName)	rt   r   r2   r   
platformID	platEncIDlangIDstringr:   s	            r.   r   zBuilder.build_name  sg   { 	F	f%% 	(0(8(88EDIf%EKK 	I 	ID<@9FJ	66 fc** :$,,,$"8886:6K6KE6R6R.s3#5c:FFF!3C8FFVt222$"9997;7L7LU7S7S/4#6s;GGG!4S9FMM&&*iHHHH!	I 	Ir0   c                 h   | j         sd S | j                            d          }|s]t          d          x}| j        d<   dt	          j        t          d          j                  z  }|                    || j                   d}d| j         v r| j         d         |_	        d| j         v rrt          d          
                                }| j         d         \
  |_        |_        |_        |_        |_        |_        |_        |_        |_        |_        ||_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d	| j         v r| j         d	         |_        d
| j         v r| j         d
         |_        d| j         v r%t7          d| j         d         z   dz             |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r |                    | j         d                    d| j         v r1|                      | j         d                   }|\  |_!        |_"        d}d| j         v r| j         d         |_#        d}d| j         v r| j         d         |_$        d}d| j         v r| j         d         |_%        d}d| j         v r| j         d         |_&        d}d }tO          ||j(                  |_(        |dk    r ||d           |dk    r ||d           |dk    r ||d           d S d S )Nr@       r   fstypepanosetypoascendertypodescendertypolinegap	winascent
windescentvendorz'''weightclass
widthclassunicoderangecodepageranger   xheight   	capheightloweropsize   upperopsizec                 R    |D ]#}t          | |          st          | |d           $d S Nr   )hasattrsetattr)r   attrsattrs      r.   	checkattrz%Builder.build_OS_2.<locals>.checkattr  s@     , ,ud++ ,E4+++, ,r0   )ulCodePageRange1ulCodePageRange2)sxHeight
sCapHeightusDefaultCharusBreakCharr   )usLowerOpticalPointSizeusUpperOpticalPointSize))rp   r,   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_r*  r+  r,  r-  r0  r1  maxversion)rt   r   datarK  r  pagesr)  s          r.   r   zBuilder.build_OS_2  sz   y 	F	f%% 	-(0(8(88EDIf%7+N6,B,B,OPPPDOOD$),,,ty  9X.ELty  #F++2244F 	(#""" ' "!ELTY&&"&)N";Edi''#'9_#=E DI%%!%=!9E$)## $	+ 6E49$$!%<!8Ety  &uty/B'BU'JKKEODI%%"&)M":E49$$!%<!8ETY&&""49^#<===di''))$)O*DEEE=B:E"E$:G	!!!Yy1ENG$)###y5EGDI%%,0Im,DE)GDI%%,0Im,DE)G	, 	, 	,
 GU]33a<<IeEFFFa<<I	 	 	 a<<IeSTTTTT <r0   c                     dD ]}|| j         v rt          | d|          t          |t                    r|| j         d<   d S t          |t                    r|| j         d<   d S t          |          )N)ElidedFallbackNameElidedFallbackNameIDz is already set.rP  rO  )rs   r   rF   r	  rb   AssertionError)rt   valuer   tokens       r.   setElidedFallbackNamezBuilder.setElidedFallbackName  s     D 	 	E
""%...   #
 eS!! 	(16DJ-...t$$ 	(/4DJ+,,, '''r0   c                 H   d| j         vr
g | j         d<   |j        d | j         d         D             v rt          d|j         d|          |j        d | j         d         D             v rt          d|j         d|          | j         d                             |           d S )N
DesignAxesc              3   $   K   | ]}|j         V  d S r8   )r:   r9   rs     r.   r;   z(Builder.addDesignAxis.<locals>.<genexpr>  s$      FFaeFFFFFFr0   z$DesignAxis already defined for tag "z".c              3   $   K   | ]}|j         V  d S r8   )	axisOrderrX  s     r.   r;   z(Builder.addDesignAxis.<locals>.<genexpr>  s$      #R#RAAK#R#R#R#R#R#Rr0   z+DesignAxis already defined for axis number rw   )rs   r:   r   r[  r   )rt   
designAxisr   s      r.   addDesignAxiszBuilder.addDesignAxis  s    tz))')DJ|$>FFTZ-EFFFFF!Iz~III   #R#RL9Q#R#R#RRR!Uj>RUUU   	
< ''
33333r0   c                 \   d| j         vr
g | j         d<   | j         d         D ]j}d |j        D             d |j        D             k    rDd |j        D             d |j        D             k    r |j        |j        k    rt	          d|          k| j         d                             |           d S )NAxisValueRecordsc                 6    h | ]}|                                 S r   asFear9   ns     r.   	<setcomp>z-Builder.addAxisValueRecord.<locals>.<setcomp>,  s     222q222r0   c                 6    h | ]}|                                 S r   ra  rc  s     r.   re  z-Builder.addAxisValueRecord.<locals>.<setcomp>-  s     ===!AGGII===r0   c                 6    h | ]}|                                 S r   ra  rc  s     r.   re  z-Builder.addAxisValueRecord.<locals>.<setcomp>.  s     :::1QWWYY:::r0   c                 6    h | ]}|                                 S r   ra  rc  s     r.   re  z-Builder.addAxisValueRecord.<locals>.<setcomp>/  s     AAA!AGGIIAAAr0   z8An AxisValueRecord with these values is already defined.)rs   r   	locationsflagsr   r   )rt   axisValueRecordr   record_s       r.   addAxisValueRecordzBuilder.addAxisValueRecord&  s    TZ//-/DJ)*z"45 	 	G22GM222=='<===> >::(9:::AA'@AAAB BM_%:::%N   	
%&--o>>>>>r0   c                     | j         sd S | j                             d          }|st          dd           | j                             d          }i g }|D ]}g |j        <   |X|D ]T}i }|j        dk    r
|j        |d<   t          |j                  dk    r|j        d         }|j        }t          |          dk    r#|                    |d         |j	        d           t          |          dk    r*|                    |d         |d         |j	        d	           t          |          d
k    r%|\  }	}
}|                    |	|
||j	        d           |j                 
                    |           |                    d |j        D             |j	        d           |
                    |           Vfd|D             }| j                            d          }|s t          d          x}| j        d<   g |_	        d| j         v r9| j         d         }|                    |          }|st          d| dd           nd| j         v r| j         d         }t          j        | j        |||           d S )NrV  zDesignAxes not definedr_  r   rj  r   )rR  r2   r  )rR  linkedValuer2      )nominalValuerangeMinValuerangeMaxValuer2   c                 4    i | ]}|j         |j        d          S )r   )r:   values)r9   is     r.   r   z&Builder.build_STAT.<locals>.<dictcomp>d  s"    (S(S(S(S(S(Sr0   )r   r2   c                 R    g | ]#}|j         |j        |j        |j                 d $S ))orderingr:   r2   ru  )r[  r:   r   )r9   r   
axisValuess     r.   r   z&Builder.build_STAT.<locals>.<listcomp>j  sK     
 
 
  Ku$QU+	 
 
 
r0   r2   rP  zElidedFallbackNameID z; points to a nameID that does not exist in the "name" tablerO  )ri  elidedFallbackName)rs   r   r   r:   rj  r   ri  ru  r   r   r   r,   r   getDebugNameotlbuildStatTable)rt   axesaxisValueRecordsformat4_locationsr:   avr
valuesDictr   ru  nominalminValmaxVal
designAxes	nameTabler   r2   ry  s                   @r.   r   zBuilder.build_STAT8  s-   z 	Fz~~l++ 	B!":DAAA:>>*<==
 	% 	%C"$Jsw'' #9 #9
9q==*-)Jw's}%%**"}Q/H%_F6{{a''"))F1Isy*Q*QRRR6{{a''")))//5ay(+	    6{{a''28/"))071717(+		    x|,33J????%%(S(SS](S(S(S$'I    &,,Z8888
 
 
 
 
 
 

 IMM&))	 	!,4V,<,<<I	&) IO!TZ//Z 67F))&11D %#F # # # 	   "TZ//Z 45FI'%		
 	
 	
 	
 	
 	
r0   c                    i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1fd2|D             }g }t          d          D ]X}|                    d3           t          |d4z  |dz   d4z            D ]'}||v r||xx         d5z  cc<   ||xx         d6z  cc<   (Yd7 |D             S )8Ni  r   i  r   i  r  i  rp  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  c                 (    g | ]}|v |         S r   r   )r9   p
pages2bitss     r.   r   z,Builder.build_codepages_.<locals>.<listcomp>  s"    @@@!Z
1r0        10c                 >    g | ]}t          |d d d                   S )N)r   )r9   r  s     r.   r   z,Builder.build_codepages_.<locals>.<listcomp>  s*    333
1TTrT7##333r0   )r   r   )rt   rM  bitsrv  jr  s        @r.   rI  zBuilder.build_codepages_  s    
! 
! 
 ! 
 !	 

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

B A@@@u@@@q 	$ 	$ALL1r6AER<00 $ $99!HHHOHHHH!HHHOHHHH	$
 43U3333r0   c                    | j         s	| j        sd S t          j                    }d|_        |                     | j                   |_        |                     | j                  |_        t          d          }||_	        |S )Nr   r<   )
rg   rh   r   r<   r   buildBASEAxis	HorizAxisVertAxisr   r   )rt   r   r   s      r.   r   zBuilder.buildBASE  sw    $ 	T-A 	4}!++D,ABB**4+?@@&!!r0   c                    |sd S |\  }}t          j                    }t          j                    |_        ||j        _        t	          |          |j        _        t          j                    |_        g |j        _        t	          |          |j        _        t          |          D ]2}t          j                    }|d         |_
        t          j                    |_        d|j        _        t          j                    |j        _        |                    |d                   |j        j        _        g |j        j        _        t	          |d                   |j        j        _        |d         D ]G}t          j                    }d|_        ||_        |j        j        j                            |           H|j        j                            |           4|S )Nr   r   r  )r   AxisBaseTagListBaselineTagr   BaseTagCountBaseScriptListBaseScriptRecordBaseScriptCountr~   BaseScriptTag
BaseScriptBaseLangSysCount
BaseValuesindexDefaultIndex	BaseCoordBaseCoordCountr  
Coordinater   )rt   axisbasesscriptsr   recordccoords           r.   r  zBuilder.buildBASEAxis  s    	Fw}#/11',$(+E

%&577/1,.1'll+Woo 	@ 	@F.00F#)!9F  ( 3 5 5F12F.+3+>+@+@F(8=F1I8N8NF(557F(2:=fQi..F(7AY E E *,, #$ !,6==eDDDD077????r0   c                    t          j                    }|                                 |_        t	          j        | j        | j                  |_        t	          j	        | j
        | j        | j                  |_        |                                 |_        |                                 |_        |j        rdnd|_        t%          |j        |j        |j        |j        |j        f          rt'          d          }||_        |S d S )Ni  r   r=   )r   r=   buildGDEFGlyphClassDef_GlyphClassDefr|  buildAttachListri   rJ   
AttachListbuildLigCaretListrj   rk   LigCaretListbuildGDEFMarkAttachClassDef_MarkAttachClassDefbuildGDEFMarkGlyphSetsDef_MarkGlyphSetsDefr   r   r   r   )rt   r   r   s      r.   r   zBuilder.buildGDEF  s    }!99;;-d.@$-PP1 $"6
 
 #'"C"C"E"E $ ? ? A A%)%:Jzz
"!'%
 
 	 f%%FFLM4r0   c                    | j         r$d | j                                         D             }nzi }| j        D ])}|                    |                                           *| j        j                                        D ](}|j        D ]}|	                                D ]}d||<   )|rt          j                    }||_        |S d S )Nc                      i | ]\  }\  }}||S r   r   r9   r   r  _s       r.   r   z3Builder.buildGDEFGlyphClassDef_.<locals>.<dictcomp>  s"    LLLFQq!LLLr0   rp  )rl   r   rV   r   inferGlyphClassesrG   markClassesru  definitionsglyphSetr   r  	classDefs)rt   classesr   	markClassmarkClassDefr   r   s          r.   r  zBuilder.buildGDEFGlyphClassDef_  s     		+LLt/C/I/I/K/KLLLGGG- ; ;v7799::::!^7>>@@ + +	$-$9 + +L!-!6!6!8!8 + +)*++  	+--F&FM4r0   c                     d | j                                         D             }|sd S t          j                    }||_        |S )Nc                      i | ]\  }\  }}||S r   r   r  s       r.   r   z8Builder.buildGDEFMarkAttachClassDef_.<locals>.<dictcomp>  s"    DDDia!QQDDDr0   )rm   r   r   r  r  )rt   r  r   s      r.   r  z$Builder.buildGDEFMarkAttachClassDef_  sL    DD4+;+A+A+C+CDDD	 	4,..$r0   c                     g }t          | j                                        d           D ]\  }}|                    |           t	          j        || j                  S )Nc                     | d         S )Nr   r   )items    r.   <lambda>z4Builder.buildGDEFMarkGlyphSetsDef_.<locals>.<lambda>  s
    47 r0   r   )r~   ro   r   r   r|  buildMarkGlyphSetsDefrJ   )rt   setsglyphsid_s       r.   r  z"Builder.buildGDEFMarkGlyphSetsDef_  sm    ! &&((.B.B
 
 
 	  	 KFC KK(t}===r0   c                     d| j         vr)t          d          | j         d<   i | j         d         _        | j        | j         d         j        t          <   d S )NDebg)r,   r   rL  rW   r
   rt   s    r.   r   zBuilder.buildDebg  sP    "" ( 0 0DIf%'DIf"8<8M	&4555r0   c                    |dv s
J |            | j         D ]	}d |_        
g }| j         D ]}|j        |k    rt          |          |_        t	          t          |j                  |                     |          d           | j        |         t          |j                  <   |	                    |           	 d |D             }n5# t          $ r(}t          t          |          |j                  |d }~ww xY w|S )Nrx   )r   r2   r   c                 6    g | ]}|                                 S r   )r+   r9   ls     r.   r   z)Builder.buildLookups_.<locals>.<listcomp>3  s     444q444r0   )rV   lookup_indexr   r   r	   strr   get_lookup_name_rW   r   r#   r   )rt   r:   r   r   	otLookupses         r.   buildLookups_zBuilder.buildLookups_#  s,   &&&&&&&m 	' 	'F"&Fm 		# 		#F|s"""%g,,FCRV_--**622D D DD!#&s6+>'?'?@
 NN6""""	=44G444II 	= 	= 	=!#a&&!*551<	=s   9C 
C8#C33C8c                 
    t          t          |d                       }d|_        t          j                    |_        g |j        _        t          j                    |_        g |j        _        t          j                    |_        |                     |          |j        _	        i }i }i }d }t          | j                                        |          D ]\  }}|\  }	}
}t          d |D                       }|dk    o|dk    }t          |          dk    r|sG|D ]v}	 | j        |         t!          |                                       |          | j        |         t!          |          <   S# t$          $ r t'          j        d	           Y sw xY w||f}|                    |          }|t          |j        j                  }t          j                    }||_        t          j                    |_        |                     |          |j        _        t5          |          |j        _        t          |          |j        _        |j        j                            |           |||<   |                    |	i                               |
g                               |           | j                            |	|
f          |k    r|||	|
f<   t          |                                          D ]\  }	}t          j                    }|	|_         t          j!                    |_!        d |j!        _"        g |j!        _#        t          |                                          D ]\  }
}t          j#                    }t          j$                    |_$        d |j$        _%        |                    |	|
f          d
|j$        _&        n|j$        _&        fd|D             |j$        _'        t          |j$        j'                  |j$        _(        |
dk    r|j$        |j!        _"        |
|_)        |j!        j#                            |           t          |j!        j#                  |j!        _*        |j        j                            |           t          |j        j                  |j        _+        t          |j        j                  |j        _(        t          |j        j	                  |j        _        |S )Nr   c                 b    | d         d         | d         d         | d         d         | d         fS )Nr   r  r   r   )fs    r.   r  z#Builder.makeTable.<locals>.<lambda>I  s+    AaDGQqT!Wad1gqt#D r0   r   c                 *    g | ]}|j         	|j         S r8   )r  r  s     r.   r   z%Builder.makeTable.<locals>.<listcomp>P  s!    OOOAAN4N4N4N4Nr0   r>   r   r   )r   zWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.i  c                      g | ]
}|k    |S r   r   )r9   rv  req_feature_indexs     r.   r   z%Builder.makeTable.<locals>.<listcomp>  s+     0 0 0!7H2H2HA2H2H2Hr0   dflt),getattrr   r   r   ScriptRecordr   FeatureRecordr   r  Lookupr~   rX   r   tupler   rW   r  _replaceKeyErrorwarningswarnr   
FeatureTagFeaturer  FeatureParamsrb   LookupListIndexr   r   r   rY   	ScriptTagScriptDefaultLangSysLangSysRecordLangSysLookupOrderReqFeatureIndexFeatureIndexr   
LangSysTagLangSysCountr   )rt   r:   r   feature_indicesrequired_feature_indicesr  sortFeatureTagr   r   r   r   feature_taglookup_indicessize_featureixfeature_keyfeature_indexfreclang_featuressreclangrecr  s                        @r.   r   zBuilder.makeTable8  s   ,#t,,.."#.00(*%$022*,'#.00"&"4"4S"9"9 #%  ED"4>#7#7#9#9~NNN &	I &	ILC(+%FD+ #OOOOO N &=B[F-BL>""a'''$ 	 	:>:OPS:TB;hsh++ )#.s2ww77     MG     '7K+//<<M$ #E$5$C D D-//"-'/11-1-D-D[-Q-Q*/3N/C/C,+.~+>+>(!/66t<<</<,vr**55dB??FF}UUU&**FD>::kII;H(&$8 &,GMMOO%<%< 	7 	7!FM(**D#DN"/++DK)-DK&(*DK%)/0C0C0E0E)F)F > >%o"022"*"2"4"4.2+$<$@$@&$$P$P!$,6<GO336GGO30 0 0 0.0 0 0, 037?3O/P/P,6>>18DK..)-G&K-44W===='*4;+D'E'EDK$)006666'*5+;+H'I'I$),U->-L)M)M&'*5+;+B'C'C$s   #AE33FFc                 d    d | j                                         D             }||v r||         S d S )Nc                     i | ]\  }}||	S r   r   )r9   kvs      r.   r   z,Builder.get_lookup_name_.<locals>.<dictcomp>  s    <<<1q!<<<r0   )rR   r   )rt   r   revs      r.   r  zBuilder.get_lookup_name_  s<    << 3 9 9 ; ;<<<S==v;tr0   c                 Z   |dk    r|dk    r| j         rt          d|          |dk    r| j        rt          d|          nd| _        ||f| j         v r;t          d|                                d|                                d|          | j                             ||f           d S )	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)rL   r   rQ   stripadd)rt   r   r   languages       r.   add_language_systemzBuilder.add_language_system  s    VF 2 2t7U 2!=  
 V) %8   *.D&H!???!/<<>>>>8>>#3#3#3#35  
 	&**FH+=>>>>>r0   c                 X    | j         rt          | j                   S t          dh          S )N)r(  r  )rL   r|   r  s    r.   get_default_language_systems_z%Builder.get_default_language_systems_  s2     ) 	1T;<<<./000r0   c                     |                                  | _        d| _        d | _        || _        d| _        d | _        |dk    r	|| _        d S d S )Nr(  r   r   )r/  rP   rM   rS   rU   rN   rO   r[   rt   r   r2   s      r.   r   zBuilder.start_feature  s[     $ B B D D!%)-&6>>"*D >r0   c                 ^    | j         J d | _         d | _        d | _        d| _        d | _        d S r$  )rU   rP   rS   rN   rO   r  s    r.   r   zBuilder.end_feature  s?    %111!% $)-&&&r0   c                     || j         v rt          d|z  |          | j        dk    rt          d|          || _        d | j         |<   d | _        | j        d| _        d | _        d S d S )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   )rR   r   rU   rT   rS   rN   rO   r1  s      r.   start_lookup_blockzBuilder.start_lookup_block  s    4&&&!6=x   !V++!L  
 !%$(D!!) D-1D*** *)r0   c                 b    | j         J d | _         d | _        | j        d| _        d | _        d S d S r$  )rT   rS   rU   rN   rO   r  s    r.   end_lookup_blockzBuilder.end_lookup_block  sH    $000 $!) D-1D*** *)r0   c                     || j         v s
J |            d | _        | j         |         }||                     || j                   d S d S r8   )rR   rS   r   rU   )rt   lookup_namer   s      r.   add_lookup_callzBuilder.add_lookup_call  s`    d1111;111$[1''0FGGGGG r0   c                     || _         d S r8   )re   )rt   r   revisions      r.   set_font_revisionzBuilder.set_font_revision  s    %r0   c           	         t          |          dk    sJ | j        dv rt          d| j        z  |          | j        t          d|          d | _        | j        || j        f}| j                            |d         d|d         f          }|dk    s|r|r|d d          | j        |<   n
g | j        |<   t          | j        |fg          | _        |r| j        |f}|| j	        v r`t          d|
                                d	| j        
                                d
| j	        |         
                                d|          | j        | j	        |<   d S d S )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   rU   r   rS   rM   rX   r   r|   rP   rY   r*  )rt   r   r,  include_defaultrequiredr   r   s          r.   set_languagezBuilder.set_language  s   8}}!!!!!%555!&(,(>?  
 !)!2  
  |Xt'=>.$$c!ffc!f%=>>/w")!!!*DN3"$DN3 )DL(+C*D E E 	B<*Cd---%o !((((**,,,,/4::<<<< 	 	 	 ,0+AD#C(((	B 	Br0   c                 "   t          |          }| j                            |          }||S t          | j                  dz   }|| j        |<   |D ]=}|| j        v r&| j        |         \  }}t          d|d||          ||f| j        |<   >|S )Nr   Glyph z3 already has been assigned a MarkAttachmentType at )r|   rn   r   r   rm   r   )rt   r   r  r  r   r  locs          r.   getMarkAttachClass_zBuilder.getMarkAttachClass_  s    6""%))&11?J$)**Q.*-' 	6 	6E((()%03%o49EE33@  
 (+HoDU##
r0   c                     t          |          }| j                            |          }||S t          | j                  }|| j        |<   |S r8   )r|   ro   r   r   )rt   r   r  r  s       r.   getMarkFilterSet_zBuilder.getMarkFilterSet_/  sQ    6"""&&v..?J$&'''*V$
r0   c                     |dz  }|r|                      ||          }||dz  z  }|r#|                     ||          }|dz  }|| _        nd | _        || _        d S )N   r  r  )rE  rG  rO   rN   )rt   r   rR  
markAttach
markFiltermarkAttachClassr   s          r.   set_lookup_flagzBuilder.set_lookup_flag8  s~     	3"66xLLO_12E 	2 228ZHHMDLE-:D**-1D* r0   c                     | j         dv rt          d| j         z  |          | j         t          d|          | j        |dfhk    rd S d | _        || _        d| _        d | _        |                     |ddd           d S )	Nr>  z5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksr  r   TF)r?  r@  )rU   r   rP   rS   rM   rN   rO   rA  )rt   r   r   s      r.   
set_scriptzBuilder.set_scriptE  s    !%555!&(,(>?  
 !)!V    ff%5$666F)-&(FD5QQQQQr0   c                      g }|D ];}|"|                      fd|D                        &|                     d           <|S )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.
        Nc                 N    g | ]!}j                             |j                  "S r   )rR   r   r2   )r9   r  rt   s     r.   r   z1Builder.find_lookup_builders_.<locals>.<listcomp>d  s,    IIIT(,,QV44IIIr0   )r   )rt   r   lookup_buildersr   s   `   r.   find_lookup_builders_zBuilder.find_lookup_builders_Z  sr     ! 	- 	-J%&&IIIIjIII     &&t,,,,r0   c                     |D ]<}| j                             |t                                                    |           =d S r8   )ri   r   rK   r   )rt   r   r  contourPointsr   s        r.   add_attach_pointszBuilder.add_attach_pointsj  sM     	N 	NE))%77>>}MMMM	N 	Nr0   c           
          |                      |t                    }|j                            t	          ||||                     |                               d S r8   )r   r   rulesr   r"   rS  rt   r   prefixr  suffixr   r   s          r.   add_chain_context_poszBuilder.add_chain_context_posn  s`    !!(,BCC(B(B7(K(K 	
 	
 	
 	
 	
r0   c           
          |                      |t                    }|j                            t	          ||||                     |                               d S r8   )r   r   rX  r   r"   rS  rY  s          r.   add_chain_context_substzBuilder.add_chain_context_substv  s`    !!(,DEE(B(B7(K(K 	
 	
 	
 	
 	
r0   c                    | j         dk    r>| j                            |t                                }|                    |           d S |s|rd|                     |t                    }|                     |t                    }|j	        
                    t          ||hg||g                     n|                     |t                    }||j        v rt          d|z  |          ||j        |<   d S )Nr   z)Already defined alternates for glyph "%s")rU   r\   r   rK   r   r   r   r   r   rX  r   r"   r   r   )	rt   r   rZ  r   r[  replacementr   chainr   s	            r.   add_alternate_substzBuilder.add_alternate_subst~  s   !V++(33E355AADKK$$$F 	GV 	G$$X/GHHE--h8MNNFK26UG9fvhWWXXXX%%h0EFFFF%%%!;eCX   $/%   r0   c                 t    | j         dk    rt          d|          | j                            ||f           d S )Nr   z9Feature references are only allowed inside "feature aalt")rU   r   rZ   r   )rt   r   featureNames      r.   add_feature_referencezBuilder.add_feature_reference  sK    !V++!KX   	""Hk#:;;;;;r0   c                 :    | j                             |           d S r8   )r]   r+  rt   r:   s     r.   add_featureNamezBuilder.add_featureName  s    s#####r0   c                 :    | j                             |           d S r8   )r_   r+  rg  s     r.   add_cv_parameterzBuilder.add_cv_parameter  s    $$$$$r0   c                 Z    || j         v r| j         |xx         dz  cc<   dS d| j         |<   dS )zbAdds new items to ``self.cv_num_named_params_``
        or increments the count of existing items.r   N)ra   rg  s     r.   add_to_cv_num_named_paramsz"Builder.add_to_cv_num_named_params  sJ     $+++%c***a/*****-.D%c***r0   c                 F    | j         |                             |           d S r8   )rc   r   )rt   	characterr:   s      r.   add_cv_characterzBuilder.add_cv_character  s$    C ''	22222r0   c                 2    |r||f| _         d S ||f| _        d S r8   )rh   rg   )rt   r  r  verticals       r.   set_base_axiszBuilder.set_base_axis  s0     	5$)7#3D   %*G$4D!!!r0   c                     | j         dk    rt          d| j         z  |          ||||g| _        | j        D ]*\  }}||| j         f}| j                            |g            +d S )Nr   z9Parameters statements are not allowed within "feature %s")rU   r   rd   rP   rX   r   )	rt   r   r   r   r   r   r   r   r   s	            r.   set_size_parameterszBuilder.set_size_parameters  s     !V++!&(,(>?  
 ",[*h O 1 	/ 	/LFD4!78CN%%c2....	/ 	/r0   c                 \   |s|s|rb|                      |t                    }|                     |t                    }|j                            t          ||||g                     n|                      |t                    }t          t          j	        |           D ]}	||j
        |	<   d S r8   )r   r   r   r   rX  r   r"   r~   	itertoolsproduct	ligatures)
rt   r   rZ  r  r[  r`  
forceChainra  r   r   s
             r.   add_ligature_substzBuilder.add_ligature_subst  s      	FV 	Fz 	F$$X/GHHE--h8LMMFK2666F8TTUUUU%%h0DEEF 	)6233 	. 	.A"-FQ	. 	.r0   c                    |s|s|ro|                      |t                    }|                     |t                    }||j        |<   |j                            t          ||hg||g                     d S |                      |t                    }	||	j        v rI||	j        |         k    r%t          	                    d|||rd| nd           nt          d|z  |          ||	j        |<   d S )Nz@Removing duplicate multiple substitution from glyph "%s" to %s%sz at r  z+Already defined substitution for glyph "%s")r   r   r   r   r   rX  r   r"   loginfor   )
rt   r   rZ  r   r[  replacementsry  ra  subr   s
             r.   add_multiple_substzBuilder.add_multiple_subst  s%     	V 	z 	$$X/GHHE**85IJJC!-CKK26UG9fseTTUUUF!!(,@AAFN""v~e444$ )19%8%%%r    &AEI8   !-ur0   c                 v    |                      |t                    }|j                            |||f           d S r8   )r   r   rX  r   )rt   r   
old_prefix
old_suffixr   r   s         r.   add_reverse_chain_single_substz&Builder.add_reverse_chain_single_subst  s;    !!(,JKKZW=>>>>>r0   c                 >   | j         dk    rX|                                D ]A\  }}| j                            |t	                                }|                    |           Bd S |s|s|r|                     ||||           d S |                     |t                    }	|                                D ]i\  }}||	j	        v rQ||	j	        |         k    rt                              d|||           n"t          d|d|	j	        |         d|          ||	j	        |<   jd S )Nr   zDRemoving duplicate single substitution from glyph "%s" to "%s" at %sz*Already defined rule for replacing glyph "z" by "")rU   r   r\   r   rK   r+  add_single_subst_chained_r   r   r   r|  r}  r   )
rt   r   rZ  r[  r   ry  
from_glyphto_glyphr   r   s
             r.   add_single_substzBuilder.add_single_subst  sa   !V++*1--// # #&X,77
CEEJJ""""F 	V 	z 	**8VVWMMMF!!(,>??&-mmoo 	2 	2"ZV^++v~j999HH."      */%::v~j'A'A'AC   
 *2FN:&&!	2 	2r0   c           	         |                      |t                    }|                    t          |                                                    }||                     |t                    }|j                            |           |j	        
                    t          |t          |                                          g||g                     d S r8   )r   r   find_chainable_single_substrK   keysr   r   r   r   rX  r   r"   rb   )rt   r   rZ  r[  r   ra  r  s          r.   r  z!Builder.add_single_subst_chained_  s      +CDD//GLLNN0C0CDD;**85GHHC7###gllnn)=)=(>NN	
 	
 	
 	
 	
r0   c                     |                      |t                    }|                    ||t          |          t          |                     d S r8   )r   r   add_attachmentmakeOpenTypeAnchor)rt   r   
glyphclassentryAnchor
exitAnchorr   s         r.   add_cursive_poszBuilder.add_cursive_pos  sV    !!(,=>>{++z**		
 	
 	
 	
 	
r0   c                 8   |D ]\  }}|j         D ]}|j                                        D ]m}||j        vr&t	          |j                  }|j        |f|j        |<   1|j        |         d         }	|j        |	k    rt          d|d|	d|j        |          ndS )z)Helper for add_mark_{base,liga,mark}_pos.r   rC  z cannot be in both @z and @N)r  r  r  marksr  anchorr2   r   )
rt   r   lookupBuilderr  r  r  r  markotMarkAnchorexistingMarkClasss
             r.   
add_marks_zBuilder.add_marks_  s    ! 	 	LAy ) 5  (/88::  D=#666'9,:M'N'N5>^\4R+D11,9,?,Ea,H)$>->>>"1/#'44):):):INN!L (# #  ?	 	r0   c                     |                      |t                    }|                     |||           |D ]<\  }}t          |          }|D ]%}||j                            |i           |j        <   &=d S r8   )r   r   r  r  r  r   r2   )	rt   r   r  r  r   
baseAnchorr  otBaseAnchorr   s	            r.   add_mark_base_poszBuilder.add_mark_base_pos+  s    ""8-?@@'5111%* 	R 	R!J	-j99L R REQ((r229>BBR	R 	Rr0   c                    |                      |t                    }g }|D ]O}i }|                     |||           |D ]\  }}	t          |          ||	j        <   |                    |           P|D ]}
||j        |
<   d S r8   )r   r   r  r  r2   r   rx  )rt   r   rx  
componentsr   componentAnchorsr  anchors	ligAnchorr  r   s              r.   add_mark_lig_poszBuilder.add_mark_lig_pos3  s    ""8->?? 	- 	-EGOOHgu555(- H H$	9*<Y*G*G	''##G,,,, 	8 	8E'7Ge$$	8 	8r0   c                     |                      |t                    }|                     |||           |D ]<\  }}t          |          }|D ]%}||j                            |i           |j        <   &=d S r8   )r   r   r  r  	baseMarksr   r2   )	rt   r   r  r  r   r  r  r  baseMarks	            r.   add_mark_mark_poszBuilder.add_mark_mark_pos?  s    ""8-?@@'5111%* 	! 	!!J	-j99L% ! ! ! !,,Xr::N !	! 	!r0   c                     |                      |t                    }t          |d          }t          |d          }|                    |||||           d S NTpairPosContext)r   r    makeOpenTypeValueRecordaddClassPair)	rt   r   glyphclass1value1glyphclass2value2r   v1v2s	            r.   add_class_pair_poszBuilder.add_class_pair_posI  s]    !!(N;;$VDAAA$VDAAAHk2{BGGGGGr0   c                 :    | j                             |           d S r8   )rS   add_subtable_break)rt   r   s     r.   r  zBuilder.add_subtable_breakO  s    ++H55555r0   c                     |                      |t                    }t          |d          }t          |d          }|                    |||||           d S r  )r   r    r  addGlyphPair)	rt   r   glyph1r  glyph2r  r   r  r  s	            r.   add_specific_pair_poszBuilder.add_specific_pair_posR  s]    !!(N;;$VDAAA$VDAAAHfb&"=====r0   c                 R   |s|s|r|                      ||||           d S |                     |t                    }|D ]h\  }}t          |d          }	|D ]O}
	 |                    ||
|	           # t
          $ r(}t          t          |          |j                  |d }~ww xY wid S )NFr  )	add_single_pos_chained_r   r!   r  add_posr#   r   r  r   )rt   r   rZ  r[  posry  r   r  rR  otValueRecordr   r  s               r.   add_single_poszBuilder.add_single_posX  s     
	IV 
	Iz 
	I((663GGGGG%%h0@AAF!$ I I 7e T T T# I IEIxFFFF+ I I I-c!ffajAAqHIII Is   A11
B#;#BB#c                    |                      |t                    }g }|j        D ]\  }}}}|                    |           g }	|D ]\  }
}||	                    d            t          |d          }|                    ||
|          }|0|                     |t                    }|                    |           |
D ]}|	                    |||           |	                    |           t          |          t          |	          k    sJ ||	f            |j                            t          |d |D             ||	                     d S )NFr  c                     g | ]\  }}|S r   r   )r9   r   r%  s      r.   r   z3Builder.add_single_pos_chained_.<locals>.<listcomp>z  s    (;(;(;tq!(;(;(;r0   )r   r   rX  r   r   r  find_chainable_single_posr   r!   r  r   r"   )rt   r   rZ  r[  r  ra  targetsr  r   subsr  rR  otValuer  r   s                  r.   r  zBuilder.add_single_pos_chained_e  s~     +ABB % 	$ 	$Aq!WNN7####  	 	MFE}D!!!-eEJJJG11'67KKC{..x9IJJs### 6 6HeW5555KK3xx3t99$$$sDk$$$(;(;s(;(;(;VTJJ	
 	
 	
 	
 	
r0   c                     | j                             |d          \  }}|r||k    rt          d|d||          ||f| j         |<   d S )NNNrC  z& was assigned to a different class at )rl   r   r   )rt   r   r   
glyphClassoldClassoldLocations         r.   setGlyphClass_zBuilder.setGlyphClass_}  sr     $ 4 8 8 M M+ 	J..!/55++'  
 (28&<U###r0   c                     |D ]}|                      ||d           |D ]}|                      ||d           |D ]}|                      ||d           |D ]}|                      ||d           d S )Nr   r  rp  r  )r  )rt   r   
baseGlyphsligatureGlyphs
markGlyphscomponentGlyphsr   s          r.   add_glyphClassDefzBuilder.add_glyphClassDef  s       	4 	4E%3333# 	4 	4E%3333 	4 	4E%3333$ 	4 	4E%3333	4 	4r0   c                 6    |D ]}|| j         vr
|| j         |<   d S r8   )rk   rt   r   r  caretsr   s        r.   add_ligatureCaretByIndex_z!Builder.add_ligatureCaretByIndex_  7     	5 	5ED000.4$U+	5 	5r0   c                 6    |D ]}|| j         vr
|| j         |<   d S r8   )rj   r  s        r.   add_ligatureCaretByPos_zBuilder.add_ligatureCaretByPos_  r  r0   c                 D    | j                             |||||g           d S r8   )rf   r   )rt   r   r   r  r  r  r  s          r.   add_name_recordzBuilder.add_name_record  s)    FJ	66JKKKKKr0   c                     || j         |<   d S r8   )rp   rt   r   rR  s      r.   add_os2_fieldzBuilder.add_os2_field  s    	#r0   c                     || j         |<   d S r8   )rq   r  s      r.   add_hhea_fieldzBuilder.add_hhea_field      
3r0   c                     || j         |<   d S r8   )rr   r  s      r.   add_vhea_fieldzBuilder.add_vhea_field  r  r0   NF)F)Q__name__
__module____qualname__r|   r{   ru   r+   r   r   r   r   r   r   r   r   r  r   r   rT  r]  rm  r   rI  r   r  r   r  r  r  r   r  r   r  r-  r/  r   r   r4  r6  r9  r<  rA  rE  rG  rM  rO  rS  rV  r\  r^  rb  re  rh  rj  rl  ro  rr  rt  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r0   r.   r*   r*   X   s       i    
       O ; ; ;z: : : :x  > > >
     61* 1* 1*f	0 	0 	02 2 2": : :$ $ $) ) )VI I I2RU RU RUh( ( ( 4 4 4? ? ?$S
 S
 S
j+4 +4 +4Z
 
 
  8  2  $  > > >N N N  *\ \ \|  ? ? ?2	1 	1 	1+ + +. . .2 2 2$2 2 2H H H& & &%B %B %BN  $  ! ! !R R R*   N N N
 
 

 
 
/ / /"< < <$ $ $% % %/ / /3 3 35 5 5/ / /. . .& IN- - - -2? ? ?2 2 28	
 	
 	

 
 
  "R R R
8 
8 
8! ! !H H H6 6 6> > >I I I
 
 
0= = =
4 
4 
45 5 5
5 5 5
L L L                r0   r*   c                    | dS d\  }}| j         &t          j        t          | j                             }| j        &t          j        t          | j                            }t          j        | j        | j        | j        ||          S )zast.Anchor --> otTables.AnchorNr  )	xDeviceTabler|  buildDevicedictyDeviceTablebuildAnchorxycontourpoint)r  deviceXdeviceYs      r.   r  r    s{    ~t!GW&/$v':";";<<&/$v':";";<<?68VXv/BGWUUUr0   c                     i | ]D\  }}}}|                     d           |d                                         |dd         z   ||fES )Reservedr   r   N)
startswithlower)r9   r  r2   isDevices       r.   r   r     sb       41??:&&GMMOOd122hx 0  r0   c                    | sdS i }t                                           D ]C\  }\  }}t          | |d          }|r(|r!t          j        t          |                    n|||<   D|r|s| j        rddinddi}t          j        |          }|S )z&ast.ValueRecord --> otBase.ValueRecordNYAdvancer   XAdvance)_VALUEREC_ATTRSr   r  r|  r  r  rq  
buildValue)r%  r  vrastNameotNamer  valvalRecs           r.   r  r    s     t	B'6'<'<'>'> I I##&(a$'' 	I7?Hc333SBvJ @b @ !
?j!__Q^BFMr0   r  )NNF)BfontTools.misc.py23r   r   fontTools.miscr   fontTools.misc.textToolsr   r   fontTools.feaLib.errorr    fontTools.feaLib.lookupDebugInfor	   r
   r   fontTools.feaLib.parserr   fontTools.feaLib.astr   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#   collectionsr$   rv  ior%   loggingr  r   	getLoggerr  r|  r/   r5   objectr*   r  valueRecordFormatr  r  r   r0   r.   <module>r     s   * * * * * * * * " " " " " " 9 9 9 9 9 9 9 9 2 2 2 2 2 2         
 + * * * * * , , , , , , + + + + + + 6 6 6 6 6 6 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3                                 " 4 3 3 3 3 3 # # # # # #             				 g!!. . . .& 7<G G G G2O  O  O  O  O f O  O  O d*	V 	V 	V  & 8      r0   