
    <`                        d dl mZ d dlmZmZ d dl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Zd dlZd dlZd dlZ ej        d	          Z e ej        ed
z             ej                  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% ee	d          d             Z&e'eee(eeed ej)        d          _*        deeeeed eeed  d!Z+i d"ed#e'd$e'd%d& d'ed( e%e+          d)ed*ed+ed,e,d-e,d.e'd/e'd0ed1e'd2d3 d4ed5ei ej)        d6          _*        eee'e'e,e'e'e,e,e'eeeed7 ej)        d8          _*        eee'e'e,e'e'e,e,e'eeeed9 ej)        d:          _*        dd; eeeeed<Z-d= Z.i d>ed"ed?e'd@e dAe.dBedCedDedEedFedGe,dHe'dIe'dJe,dKe'dLe'dMe' e!e           e!e           e!e'           e!e'           e!e           e!e           e!e'           e!e,           e!e'          dN	 ej)        dO          _*         e ej)        dO                    dP             Z&eee'e,e'dQ e'dR  e!e#          dS dT
 ej)        dU          _*        ee#dVx ej)        dW          _*         ej)        dX          _*        eedY ej)        dZ          _*        eed[ ej)        d\          _*        ee#e"d] ej)        d^          _*         e ej)        d^                    d_             Z&d`  ej)        da          _*        db  ej)        dc          _*        dd  ej)        de          _*        df  ej)        dg          _*        dh Z/ G di dj          Z0 e ej)        dk                    dl             Z&dm Z1dn Z2do Z3dp Z4dq Z5dr Z6ds e6dtej7        _*        du dv dwej8        _*        e(dx dyej9        _*        e(e"dzej:        _*        e,e"d{ej;        _*        e,e#d|ej<        _*        e$e(e"d}ej=        _*        e$e(e"d~ej>        _*        ee(e"dej?        _*        d>e$iej@        _*        e(e"dejA        _*        e$e'dxejB        _*        xejC        _*        xejD        _*        xejE        _*        xejF        _*        ejG        _*         e!e          e$dx ej)        d          _*        x ej)        d          _*        x ej)        d          _*        x ej)        d          _*        x ej)        d          _*         ej)        d          _*         e ej)        d                    d             Z& eejH        ejI        ejJ        ejK        ejL        ejM        ejN        ejO        ejP        ejQ        ejR                  d             ZS eejT        ejU        ejV        ejW                  d             ZX eejT        ejU        ejV        ejW                  d             ZS eejY        ejZ                  d             ZS eej[                  d             ZS eej:                  d             ZS eej\                  d             ZS eej9                  d             ZS eej]        ej^                  d             Z_ eej`                  d             Z_ eej7                  d             Z_ G d dea          Zb G d dea          Zc G d dea          Zd G d dea          Ze G d dea          Zfg dZg ed          dd            Zhedk    r eji         eh                       dS dS )    timestampNow)ttLibcffLib)otTables_h_e_a_d)DefaultTable)Timer)DecomposingRecordingPen)reduceNzfontTools.mergez.timer)loggerlevelc                  B     |                     dd           fd}|S )zLReturns a decorator function that adds a new method to one or
	more classes.allowDefaultTableFc                     g }D ]r}||v r|                     |           s|t          k    s
J d            | j        |j        vsJ d|j        d| j        d            t	          || j        |            sd S )NzOops, table class not found.zOops, class 'z' has method 'z'.)appendr	   __name____dict__setattr)methoddoneclazzallowDefaultclazzess      /lib/python3.11/site-packages/fontTools/merge.pywrapperz_add_method.<locals>.wrapper   s    	$ + +etmmX;;u
O%<///1O///
/
/
/
/
/+0>>>6???K 0
/
/
5&/6****	    )get)r   kwargsr   r   s   `  @r   _add_methodr       s?     

.66	 	 	 	 	 	 	r   c                     t          |           } t          |           }t          |          t          fd|D                       sJ d| z              S )Nc              3   $   K   | ]
}|k    V  d S N ).0itemfirsts     r   	<genexpr>zequal.<locals>.<genexpr>,   s'      ((dDEM((((((r   z"Expected all items to be equal: %s)listiternextall)lsttr'   s     @r   equalr/   (   sa    Cyy	#YY	a((((a(((((TT*NQT*TTTTr   c                 :    t          t          |                     S r#   )r+   r*   r-   s    r   r'   r'   /   s    T#YYr   c                     t           S r#   NotImplementedr1   s    r   recalculater5   2   s    r   c                     t                      S r#   r   r1   s    r   current_timer7   5   s    r   c                 6    t          t          j        |           S r#   )r   operatorand_r1   s    r   bitwise_andr;   8   s    x}c"""r   c                 6    t          t          j        |           S r#   )r   r9   or_r1   s    r   
bitwise_orr>   ;   s    x|S!!!r   c                 ^    t          |           } t          |           t          |           z  S r#   )r)   sumlenr1   s    r   avg_intrB   >   s$    CyyCCHHr   c                       fd}|S )zReturns a filter func that when called with a list,
	only calls func on the non-NotImplemented items of the list,
	and only so if there's at least one item remaining.
	Otherwise returns NotImplemented.c                 D    d | D             }|r |          nt           S )Nc                 $    g | ]}|t           u|S r$   r3   r%   r&   s     r   
<listcomp>z1onlyExisting.<locals>.wrapper.<locals>.<listcomp>I   s"    
>
>
>D4~#=#=4#=#=#=r   r3   )r-   itemsfuncs     r   r   zonlyExisting.<locals>.wrapperH   s-    
>
>C
>
>
>%	1e>1r   r$   )rI   r   s   ` r   onlyExistingrJ   B   s#    2 2 2 2 2 	r   c                 >    g }| D ]}|                     |           |S r#   )extend)r-   lr&   s      r   sumListsrN   N   ,      T((4....	r   c                 >    i }| D ]}|                     |           |S r#   )update)r-   dr&   s      r   sumDictsrS   T   rO   r   c           	      <   d | D             } | st           S d | D             } | sd S | d         j        t          fd| D                       s
J |             j        }             }i }t	          j        t	                      gd | D             R  }|D ]}	 |         }nB# t          $ r5 	 |d         }n(# t          $ r t          ddj                  w xY wY nw xY w|t           u rX |fd	| D                       }|t           ur||<   ~||_	        |S )
Nc                 $    g | ]}|t           u|S r$   r3   rF   s     r   rG   z mergeObjects.<locals>.<listcomp>[   s"    ;;;N : : : : :r   c                     g | ]}||S r#   r$   rF   s     r   rG   z mergeObjects.<locals>.<listcomp>^   s    111 0 0 0 0r   r   c              3   >   K   | ]}t          |          k    V  d S r#   )type)r%   r&   r   s     r   r(   zmergeObjects.<locals>.<genexpr>c   s.      00DDJJ%000000r   c              3   X   K   | ]%}t          |                                          V  &d S r#   )varskeysr%   tables     r   r(   zmergeObjects.<locals>.<genexpr>i   s4      BBUd5kk..00BBBBBBr   *Don't know how to merge key 
 of class c              3   D   K   | ]}t          |t                    V  d S r#   getattrr4   r%   r]   keys     r   r(   zmergeObjects.<locals>.<genexpr>u   s/      JJUWUC88JJJJJJr   )
r4   	__class__r,   mergeMapsetunionKeyError	Exceptionr   r   )	r-   logicreturnTable
returnDictallKeys
mergeLogicvaluer   re   s	          @@r   mergeObjectsrr   Z   s   ;;;;; 	11111 		Q	0000C0000055#555	uww9SUUCBBcBBBCCC  Sc
::	   sJJ
   
)
ssENN    J >!!
*JJJJcJJJ
J
J%
.  :c?"s*   B##
C".B76C"7%CC"!C"c                       fd}|S )Nc                 ,   t          |           } d}t          d                   D ]j}	 |         }n:# t          $ r- 	 d         }n # t          $ r t          d|z            w xY wY nw xY wd|z   |fd| D                       }|||z  z  }k|S )Nr   sizer^   zDon't know how to merge bit %s   c              3   <   K   | ]}t          |z            V  d S r#   )bool)r%   r&   
shiftedBits     r   r(   z-mergeBits.<locals>.wrapper.<locals>.<genexpr>   s0      DDD
!233DDDDDDr   )r)   rangerj   rk   )r-   returnValue	bitNumberrp   mergedValuery   bitmaps        @r   r   zmergeBits.<locals>.wrapper   s    S		#+(( 
+ 
+iC	"JJ
 C C CC+ZZ C C C5	ABBBC ZC
 Y:DDDDDDDDD;+**;;	s'   5
A, A	A,	A&&A,+A,r$   )r~   r   s   ` r   	mergeBitsr   }   s#          	r   T)r   c                     t          | d          s't                              d| j                   t          S | j        }t          |t                    r|                    | | j        |          S  ||          S )Nrg   zDon't know how to merge '%s'.)	hasattrloginfotableTagr4   rg   
isinstancedictrr   )selfmtablesrl   s       r   merger      sp    j!! ((*DM:::		ud 	
dmV	4	44	vr   )r^   r   tableVersion	numGlyphs
maxStoragemaxFunctionDefsmaxInstructionDefsmaxp   c                     dS Nr   r$   bits    r   <lambda>r      s     r   c                     dS r   r$   r   s    r   r   r      s     r   )ru   r^   rv                           r   r   fontRevisioncheckSumAdjustmentc                     dS r   r$   r1   s    r   r   r      s    1 r   magicNumberflags
unitsPerEmcreatedmodifiedxMinyMinxMaxyMaxmacStylelowestRecPPEMfontDirectionHintc                     dS )Nr   r$   r1   s    r   r   r      s    ! r   indexToLocFormatglyphDataFormathead)r^   r   r   ascentdescentlineGapadvanceWidthMaxminLeftSideBearingminRightSideBearing
xMaxExtentcaretSlopeRisecaretSlopeRuncaretOffsetnumberOfHMetricshhea)r^   r   r   r   r   r   advanceHeightMaxminTopSideBearingminBottomSideBearing
yMaxExtentr   r   r   numberOfVMetricsvheac                     dS r   r$   r   s    r   r   r      s    ! r   )ru   r^   rv   r   r      	   c                 x   t          |           } t          d | D                       rdS t          t          |                     D ]K}| |         dz  r| |xx         dz  cc<   | |         dz  r| |xx         dz  cc<   :| |         dk    rd| |<   L t	          t
                    |           }|dz  r|dz  }|S )	Nc              3   "   K   | ]
}|d k    V  dS )r   Nr$   rF   s     r   r(   z!mergeOs2FsType.<locals>.<genexpr>   s&      ""d	""""""r   r      r      r   i)r)   r,   rz   rA   r   os2FsTypeMergeBitMap)r-   ifsTypes      r   mergeOs2FsTyper      s    Cyy""c""""" 	
 C// 	 	QVf_ q666W6666
1v q666V6666
1v{{3q6
))(
)
)#
.
.
VO G&r   r^   versionxAvgCharWidthr   panoseulUnicodeRange1ulUnicodeRange2ulUnicodeRange3ulUnicodeRange4fsFirstCharIndexfsLastCharIndexsTypoAscendersTypoDescendersTypoLineGapusWinAscentusWinDescent)	ulCodePageRange1ulCodePageRange2sxHeight
sCapHeightusDefaultCharusBreakCharusMaxContextusLowerOpticalPointSizeusUpperOpticalPointSizezOS/2c                     t          j        | ||           | j        dk     r| xj        dz  c_        | j        dk    r| j        dz  r| xj        dz  c_        | S )Nr   ir   r   )r	   r   r   r   )r   r   r   s      r   r   r   3  sg    D!V$$$L1++++LA 
[6 ;;';;r   c                     dS r   r$   r1   s    r   r   r   G  s    Q r   c                     dS r   r$   r1   s    r   r   r   I  s    A r   c                     g S r#   r$   r1   s    r   r   r   K  s    2 r   )
r^   r   
formatTypeisFixedPitchminMemType42maxMemType42minMemType1maxMemType1mapping
extraNamespost)r   metricsvmtxhmtx)r   namesname)r^   r   loca)r   glyphs
glyphOrderglyfc                    t          |          D ]`\  }}|j                                        D ]A}|r|                                 |                                r|                    |           Bat          j        | ||          S r#   )	enumerater   valuesremoveHintingisCompositeexpandr	   r   )r   r   r   r   r]   gs         r   r   r   c  s    &!! 	 	WQu<    a  OO mmoo HHUOOO 	4F+++r   c                      t          |          S r#   r'   r   r-   s     r   r   r   q      s r   prepc                      t          |          S r#   r  r  s     r   r   r   r  r	  r   fpgmc                      t          |          S r#   r  r  s     r   r   r   s  r	  r   zcvt c                      t          |          S r#   r  r  s     r   r   r   t  r	  r   gaspc                 4   t          |           }t          |          }| |         }||         }|                    |           |                    |           |j        |j        k    o0|j        |j        k    o t	          |d           p|j        |j        k    S )Nheight)r   drawrq   widthr   r  )	glyphSet1	glyphSet2glyph1glyph2pen1pen2g1g2s           r   _glyphsAreSamer  v  s    	**	**	tz	! 
8(bh
8r86	RY 69r   c                       e Zd Zh dZh dZdS )CmapUnicodePlatEncodings>   r   r   r   r   r   r   r   r   r   r   r   rv   >   r   r   r   r   r   r   r   r   
   N)r   
__module____qualname__BMPFullRepertoirer$   r   r   r  r    s$        333777r   r  cmapc           	         g }t          |          D ]\  }}d }d }|j        D ]e}|j        |j        |j        f}	|	t
          j        v r|}'|	t
          j        v r|}8t          	                    d||j        |j        |j                   f||
                    ||f           ||
                    ||f           i }
i }t          |d          rd |j        D             nd }|D ]\  }}|j                                        D ]\  }}|
                    |d           }|||
|<   |||<   (||k    r|j        |                             |          k|X||         }||fD ],}||         "|j        |                                         ||<   -t%          ||         ||         ||          r||j        |         |<   |j        |         |         |k    rt          	                    d||           d |
                                D             }g | _        t'          j        d          }t+          |          t+          |
          k    rL |j        d         d          }d|_        d	|_        d
|_        |
|_        | j        
                    |            |j        d         d          }d|_        d|_        d
|_        ||_        | j                            d
|           d
| _        t+          | j                  | _        | S )NzODropped cmap subtable from font [%s]:	format %2s, platformID %2s, platEncID %2sfontsc                     g | ]}d S r#   r$   )r%   fs     r   rG   zmerge.<locals>.<listcomp>  s    $$$qd$$$r   z4Dropped mapping from codepoint %#06X to glyphId '%s'c                 &    i | ]\  }}|d k    ||S )  r$   )r%   unigids      r   
<dictcomp>zmerge.<locals>.<dictcomp>  s#    FFFWSvSr   r+  r   r   r&  r   r   rv   )r   r   format
platformID	platEncIDr  r)  r*  r   warningr   r   r-  r+  rH   r   duplicateGlyphsPerFontgetGlyphSetr  r   getTableModulerA   cmap_classeslanguageinsertr   numSubTables)r   r   r   
cmapTablesfontIdxr]   format4format12subtable
propertiesr+  fontIndexForGlyph	glyphSetsr2  r3  oldgid
oldFontIdxidxcmapBmpOnlymodule	cmapTables                        r   r   r     sz   
 '' ) )]WU'(,  h("5x7IJ:,000GG.===HHKK1hox2H4F   
 h())))gw'((( 	(/7(;(;E$$AG$$$$  S S]U7!!## S Sgc#HHS$6nDI$c# 	(,,V44<$V,j:& 4 4#
C.
 1133	#		*-y/A63	O	O 14Qg&v..	
	!'	*6	2c	9	9 	[[GcRRR+S. GF

FFF

v
&
&D		!!%f!"%b))))))).+Y#V #A&&Ay!!!%%r   c                      t          |           S r#   )rN   r1   s    r   mergeLookupListsrO    s    r   c                     | sJ t          j                    }d |_        t          d | D                       |_        t          |j                  |_        |S )Nc                 *    g | ]}|j         	|j         S r$   LookupListIndexr%   rM   s     r   rG   z!mergeFeatures.<locals>.<listcomp>  s#    )^)^)^AL])^!*;)^)^)^r   )r   FeatureFeatureParamsrO  rS  rA   LookupCountr-   r   s     r   mergeFeaturesrY    sX    ()^)^S)^)^)^__,--r   c                 \   i }| D ]7}|D ]2}|j         }||vrg ||<   ||                             |j                   38g }t          |                                          D ]K}t          j                    }||_         t          ||                   |_        |                    |           L|S r#   )
FeatureTagr   rU  sortedr[   r   FeatureRecordrY  )r-   rR   rM   r/  tagretrecs          r   mergeFeatureListsra    s    
  Q  a	
3	llAcFS6==	
 
16688  S  ##.af%%#+**S////r   c                     | sJ t          d | D                       sJ t          j                    }d |_        d|_        t          d | D                       |_        t          |j                  |_        |S )Nc              3   ,   K   | ]}|j         d k    V  dS )r1  N)ReqFeatureIndexrT  s     r   r(   z!mergeLangSyses.<locals>.<genexpr>  s*      55AA'555555r   r1  c                 *    g | ]}|j         	|j         S r$   )FeatureIndexrT  s     r   rG   z"mergeLangSyses.<locals>.<listcomp>  s!    'V'V'V1q~'V'V'V'Vr   )	r,   r   LangSysLookupOrderrd  ra  rf  rA   FeatureCountrX  s     r   mergeLangSysesrj    s     	5555555555&'V'V'V'V'VWW*++r   c                 ^   | sJ t          |           dk    r| d         S i }| D ]D}|j        D ]:}|j        |vr
g ||j        <   ||j                                     |j                   ;Eg }t          |                                          D ]H\  }}t          j                    }t          |          |_        ||_        |                    |           It          j	                    }||_        t          |          |_
        d | D             }|rt          |          |_        nd |_        |S )Nrv   r   c                 *    g | ]}|j         	|j         S r$   )DefaultLangSys)r%   ss     r   rG   z mergeScripts.<locals>.<listcomp>  s#    DDDq13CD!"DDDr   )rA   LangSysRecord
LangSysTagr   rg  r\  rH   r   rj  ScriptLangSysCountrm  )	r-   	langSysessrlsr	lsrecordsr^  langSys_listr   dfltLangSysess	            r   mergeScriptsry    sM   HHMM	Q- 1 1R 1 1c	nI%% "IcnS^##CK00001  !2!233  S,  #|,,#+#.3^^DDCDDD &}55$$r   c                 \   i }| D ]7}|D ]2}|j         }||vrg ||<   ||                             |j                   38g }t          |                                          D ]K}t          j                    }||_         t          ||                   |_        |                    |           L|S r#   )	ScriptTagr   rq  r\  r[   r   ScriptRecordry  )r-   rR   rM   rn  r^  r_  r`  s          r   mergeScriptRecordsr}    s    
  Q  a	
3	llAcFS6==	
 
16688  S##-AcF###***S////r   c                     d S r#   r$   r1   s    r   r   r   .  s    D r   )ScriptCountr|  c                     d S r#   r$   r1   s    r   r   r   2  s     r   c                 @    t          t          |           d           S )Nc                     | j         S r#   )BaseScriptTagrn  s    r   r   z<lambda>.<locals>.<lambda>4  s    Q_ r   re   r\  rN   r1   s    r   r   r   4  s    ;T;T!U!U!U r   )BaseScriptCountBaseScriptRecordc                 @    t          t          |           d           S )Nc                     | j         S r#   r[  r  s    r   r   z<lambda>.<locals>.<lambda>9  s    !, r   r  r  r1   s    r   r   r   9  s    fXc]]8N8NOOO r   )ri  r]  )rW  Lookup)Formatr   )r  	classDefs)CoverageLigGlyphCountLigGlyph)r  
GlyphCountAttachPoint)MarkSetTableFormatMarkSetCountr  )BaseTagCountBaselineTag)r^   Version)r   r]   GDEFGSUBGPOSBASEJSTFMATHc                    t          |          t          |j                  k    sJ t          t          ||j                            D ]i\  }\  }}|s|	|t          usJ d|dz   |fz              d }d }|j        j        j        D ])}|j        dk    r|j	        j
        gd |j	        j        D             z   D ]}	|	d |	j        D             }
t          |
          dk    sJ |
r	|
d         }
n|st          j                    }d|_        t          j                    x}|_        d |_        d|_        g |_        |	j                            |           |	j                            d 	           |j        j        j                            |           |j        j        xj        dz  c_        |}
|st          j                    }||_        t          j                    }d|_        d|_        d|_        |g|_        |j        j        ?t          j                    |j        _        g |j        j        _        d|j        j        _        |j        j        j                            |           |j        j        xj        dz  c_        |g|
j        j        d d<   |
j        xj        dz  c_        +ktA          j!        | ||           | S )
Nz6Have duplicates to resolve for font %d but no GSUB: %srv   DFLTc                     g | ]	}|j         
S r$   )rg  rT  s     r   rG   zmerge.<locals>.<listcomp>  s    3c3c3c!AI3c3c3cr   c                 (    g | ]}|j         d k    |S )loclr  r%   vs     r   rG   zmerge.<locals>.<listcomp>  s$    IIIQ!,&2H2Hq2H2H2Hr   r   r  c                     | j         S r#   r  )r  s    r   r   zmerge.<locals>.<lambda>  s    al r   r  )"rA   r9  r   zipr4   r]   
ScriptListr|  r{  rq  rm  ro  rf  r   r]  r[  rU  rV  rW  rS  r   sortFeatureListri  SingleSubstr   r  
LookupFlag
LookupTypeSubTableCountSubTable
LookupListr	   r   )r   r   r   r   r]   dupssynthFeaturesynthLookupscriptlangsysfeaturer/  rD  s                r   r   r   ~  s	    	Fs13444444 VQ-E!F!FGG .% .%^Q|d	x

^ ; ; ;>vz{~z  BF  zG  ?G ; ; ;,+&3 )% )%f&  (=/03c3cv}Gb3c3c3cc '% '%wII'.IIIGw<<1 qzWW 
0+--l &l!)!1!3!33a,
aoama!!,///$:$:;;;k+22<@@@k**a/**W -$&&XX?$$[[[!"[%J[&  (244ek&(ek#+,ek(
["))+666
[''1,''+6-GO#BQB'O1$O'%)%V D!V$$$r   c                     d S r#   r$   r   	lookupMaps     r   
mapLookupsr    s	     r   c                 (    G d dt                     }| j        dvrd S t          | j        d          si | j        _        | j        | j        j        vr* || j        | j                  }|| j        j        | j        <   | j        j        | j                 S )Nc                       e Zd Zd ZdS )/__merge_classify_context.<locals>.ContextHelperc                 P   |j                             d          rd}d}nd}d}|j                             d          rd}nd}||z   }|| _        || _        || _        || _        |dz   | _        |dk    r|dz   | _        |d	z   | _	        d S |d
k    r|dz   | _        |dz   | _	        d S d S )NSubstSubPosChain LookupRecordrv   RuleRuleSetr   	ClassRuleClassSet)
r   endswith
startswithTypTyper  ChainTypr  r  r  )r   klassr  r  r  r  r  s          r   __init__z8__merge_classify_context.<locals>.ContextHelper.__init__  s    ng&& 
CDD
CDn(( EEECi848494:4=N*4kkDII%DLLL!$DIJ&DLLL 	r   N)r   r'  r(  r  r$   r   r   ContextHelperr    s#        ' ' ' ' 'r   r  )rv   r   r   _merge__ContextHelpers)objectr  r   rf   r  )r   r  helpers      r   __merge_classify_contextr    s    ' ' ' ' 'V ' ' '8 	Ky  	 899 -*,$.'Kt~<<<=55&7=$.'4-dk::r   c                    |                                  }| j        dv ret          | |j                  D ]M}|st          ||j                  D ]2}|st          ||j                  D ]}|s||j                 |_        3Nd S | j        dk    r/t          | |j                  D ]}|s||j                 |_        d S J d| j        z              )N)rv   r   r   r   unknown format: %s)r  r  rc   r  r  r  rS  )r   r  crsrlls         r   r  r    s   
 
""$$K6D!)$$ 8 8b
hB 8 8qha(( 8 8#B$67R888 8 kQD!.)) 6 6b
h!""4526 6 / 4;....r   c                 t    | j         dk    r| j                            |           d S J d| j         z              )Nrv   r   r  )r  ExtSubTabler  r  s     r   r  r    sD     	K1i(((((. 4;....r   c                 J    | j         D ]}|s|                    |           d S r#   )r  r  )r   r  sts      r   r  r    s:    =  R	X--	 r   c                 J    | j         D ]}|s|                    |           d S r#   )r  r  )r   r  rM   s      r   r  r    s:    
+  Q	
H,,y r   c                 8    fd| j         D             | _         d S )Nc                      g | ]
}|         S r$   r$   )r%   r   r  s     r   rG   zmapLookups.<locals>.<listcomp>  s    DDD!1DDDr   rR  r  s    `r   r  r    s(    DDDDt/CDDDr   c                 b    | j         D ]&}|r|j        s|j                            |           'd S r#   )r]  rU  r  )r   r  r/  s      r   r  r    sF    

 " "Q	
%!)%X)y!!!!" "r   c                 v    fd| j         D             | _         | j        dk    r| j                 | _        d S d S )Nc                      g | ]
}|         S r$   r$   )r%   r   
featureMaps     r   rG   zmapFeatures.<locals>.<listcomp>'  s    ???jm???r   r1  )rf  rd  )r   r  s    `r   mapFeaturesr  $  sQ     @???T->???E!!#D$89$ "!r   c                     | j         r| j                             |           | j        D ]&}|r|j        s|j                            |           'd S r#   )rm  r  ro  rg  )r   r  rM   s      r   r  r  +  sh     .!!*---

 $ $Q	
%!)%X)
####$ $r   c                 b    | j         D ]&}|r|j        s|j                            |           'd S r#   )r|  rq  r  )r   r  rn  s      r   r  r  3  sF    

 # #Q	
$!($H(z""""# #r   c                   @    e Zd Z G d de          Zd Zd Zg fdZdS )Optionsc                       e Zd ZdS )Options.UnknownOptionErrorN)r   r'  r(  r$   r   r   UnknownOptionErrorr  <  s        $r   r  c                 <    d| _         d| _         | j        di | d S )NFr$   )verbosetimingrh   )r   r   s     r   r  zOptions.__init__?  s.    $,$+
$(Vr   c                     |                                 D ]>\  }}t          | |          s|                     d|z            t          | ||           ?d S )NUnknown option '%s')rH   r   r  r   )r   r   kr  s       r   rh   zOptions.setF  sh    \\^^  ca
$

 =

!
!"7!";
<
<<
4A r   c                 ,   g }i }|D ]}|}|                     d          s|                    |           0|dd          }|                    d          }d}|dk    r'|                     d          r|dd          }	d}
n;|}	d}
n6|d |         }	|	d         d	v r|	d         dz   }|	d d         }	||d
z   d          }
|	                    dd          }	t	          | |	          s6|du s|	|v r|                    |           |                     d|z            t          | |	          }t          |t                    rt          |
          }
nt          |t                    rt          |
          }
nt          |t                    rz|
                    d          }|dgk    rg }d |D             }|dk    r|}
nG|dk    r|}
|
                    |           n)|dk    r!|}
|D ]}||
v r|
                    |           nJ |
||	<     | j        di | |S )Nz--r   =zno-r   FTz-+rv   -_r  ,r  c                 d    g | ]-}t          |          r|d          dv rt          |d           n|.S )r   
0123456789)rA   int)r%   xs     r   rG   z&Options.parse_opts.<locals>.<listcomp>u  s=    	J	J	J!s1vv
=!A$,"6"6#a)))A	J	J	Jr   z+=z-=r   r$   )r  r   findreplacer   r  rc   r   rx   r  r)   splitrL   removerh   )r   argvignore_unknownr_  optsaorig_ar   opr  r  ovvvr  s                 r   
parse_optszOptions.parse_optsL  s|   
#	$ 4 4a6
,,t

 JJqMMMu1vvc{{122gg||E 	
122Q	QQ	
Q	QQ	"1"Au}}
B%)R	
3B3Q	!A#$$Ayyc1
$

 >n!4!4ZZ""#81#<===a2T QAA2s AAA2t 	
B	bTzz
R	J	Jr	J	J	JB	Syy	QQ	t	QXXb\\\\	t	Q  	
axx{{{ X477
$(T	*r   N)r   r'  r(  rk   r  r  rh   r
  r$   r   r   r  r  :  su            )        ,. : : : : : :r   r  c                       e Zd ZdZd Zd ZdS ) _AttendanceRecordingIdentityDictzVA dictionary-like object that records indices of items actually accessed
	from a list.c                 v    || _         d t          |          D             | _        t                      | _        d S )Nc                 4    i | ]\  }}t          |          |S r$   idr%   r   r  s      r   r4  z=_AttendanceRecordingIdentityDict.__init__.<locals>.<dictcomp>  s$    ...!BqEE!...r   )rM   r   rR   rh   rn  r  s     r   r  z)_AttendanceRecordingIdentityDict.__init__  s3    $&..y~~...$&55$&&&r   c                 j    | j                             | j        t          |                              |S r#   )rn  addrR   r  r   r  s     r   __getitem__z,_AttendanceRecordingIdentityDict.__getitem__  s'    &**TVBqEE]	
(r   Nr   r'  r(  __doc__r  r  r$   r   r   r  r    s<           
    r   r  c                       e Zd ZdZd Zd ZdS )_GregariousIdentityDictzoA dictionary-like object that welcomes guests without reservations and
	adds them to the end of the guest list.c                 P    || _         t          d |D                       | _        d S )Nc              3   4   K   | ]}t          |          V  d S r#   r  r  s     r   r(   z3_GregariousIdentityDict.__init__.<locals>.<genexpr>  s(      ""r!uu""""""r   )rM   rh   rn  r  s     r   r  z _GregariousIdentityDict.__init__  s+    $&""c"""""$&&&r   c                     t          |          | j        vrA| j                            t          |                     | j                            |           |S r#   )r  rn  r  rM   r   r  s     r   r  z#_GregariousIdentityDict.__getitem__  sH    UU$&6::bee6==	
(r   Nr  r$   r   r   r  r    s<        , ,# # #    r   r  c                   ,    e Zd ZdZddZd Zd Zd ZdS )_NonhashableDictz3A dictionary-like object mapping objects to values.Nc                     | d t          |          D             | _        d S d t          ||          D             | _        d S )Nc                 4    i | ]\  }}t          |          |S r$   r  r  s      r   r4  z-_NonhashableDict.__init__.<locals>.<dictcomp>  s$    0001RUU1000r   c                 4    i | ]\  }}t          |          |S r$   r  )r%   r  r  s      r   r4  z-_NonhashableDict.__init__.<locals>.<dictcomp>  s$    2221RUU1222r   )r   rR   r  )r   r[   r  s      r   r  z_NonhashableDict.__init__  sI    ^00	$000466622D& 1 12224666r   c                 6    | j         t          |                   S r#   rR   r  r   r  s     r   r  z_NonhashableDict.__getitem__  s    	1r   c                 4    || j         t          |          <   d S r#   r#  )r   r  r  s      r   __setitem__z_NonhashableDict.__setitem__  s    $&A---r   c                 0    | j         t          |          = d S r#   r#  r$  s     r   __delitem__z_NonhashableDict.__delitem__  s    
fRUUmmmr   r#   )r   r'  r(  r  r  r  r&  r(  r$   r   r   r  r    s[        ::3 3 3 3        r   r  c                   8    e Zd ZdZd	dZd Zd Zd Zd Zd Z	dS )
Mergera  Font merger.

	This class merges multiple files into a single OpenType font, taking into
	account complexities such as OpenType layout (``GSUB``/``GPOS``) tables and
	cross-font metrics (e.g. ``hhea.ascent`` is set to the maximum value across
	all the fonts).

	If multiple glyphs map to the same Unicode value, and the glyphs are considered
	sufficiently different (that is, they differ in any of paths, widths, or
	height), then subsequent glyphs are renamed and a lookup in the ``locl``
	feature will be created to disambiguate them. For example, if the arguments
	are an Arabic font and a Latin font and both contain a set of parentheses,
	the Latin glyphs will be renamed to ``parenleft#1`` and ``parenright#1``,
	and a lookup will be inserted into the to ``locl`` feature (creating it if
	necessary) under the ``latn`` script to substitute ``parenleft`` with
	``parenleft#1`` etc.

	Restrictions:

	- All fonts must currently have TrueType outlines (``glyf`` table).
		Merging fonts with CFF outlines is not supported.
	- All fonts must have the same units per em.
	- If duplicate glyph disambiguation takes place as described above then the
		fonts must have a ``GSUB`` table.

	Attributes:
		options: Currently unused.
	Nc                 4    |st                      }|| _        d S r#   )r  options)r   r,  s     r   r  zMerger.__init__  s    	 YY7$,,,r   c                    t          j                    }d |D             }d |D             }|                     |          }d |D             }t          ||          D ]\  }}|                    |           |                    |           |D ]}|                     |           || _        d |D             | _        t          t          j
        d |D             t                                }|                    d           d|v r(|                    d           dgt          |          z   }d|v r(|                    d           dgt          |          z   }|D ]ъt          d	z            5  fd
|D             }	t                              d           t          j                  }
 |
                              | |	          }|t$          ur%|dur!||<   t                              d           nt                              d           ddd           n# 1 swxY w Y   | `| `|                     |           |S )zMerges fonts together.

		Args:
			fontfiles: A list of file names to be merged

		Returns:
			A :class:`fontTools.ttLib.TTFont` object. Call the ``save`` method on
			this to write it out to an OTF file.
		c                 6    g | ]}t          j        |          S r$   r   TTFontr%   fontfiles     r   rG   z Merger.merge.<locals>.<listcomp>  "    
<
<
<h5<!!
<
<
<r   c                 6    g | ]}|                                 S r$   )getGlyphOrderr%   fonts     r   rG   z Merger.merge.<locals>.<listcomp>  s$    888$##%%888r   c                 6    g | ]}t          j        |          S r$   r/  r1  s     r   rG   z Merger.merge.<locals>.<listcomp>  r3  r   c                     g | ]}i S r$   r$   )r%   r  s     r   rG   z Merger.merge.<locals>.<listcomp>  s     3 3 3 3 3 3r   c              3   X   K   | ]%}t          |                                          V  &d S r#   )r)   r[   r6  s     r   r(   zMerger.merge.<locals>.<genexpr>  s2      CCTtDIIKK00CCCCCCr   
GlyphOrderr  r+  z
merge '%s'c                 F    g | ]}|                     t                    S r$   )r   r4   )r%   r7  r^  s     r   rG   z Merger.merge.<locals>.<listcomp>  s'    >>>dhhsN++>>>r   zMerging '%s'.FzMerged '%s'.zDropped '%s'.N)r   r0  _mergeGlyphOrdersr  setGlyphOrder	_preMerger-  r9  r   rh   ri   r  r)   timerr   r   getTableClassr   r4   
_postMerge)r   	fontfilesmegar-  glyphOrdersmegaGlyphOrderr7  r   allTagsr   r   r]   r^  s               @r   r   zMerger.merge  s    
$
 =
<)
<
<
<%88%888+))+66. =
<)
<
<
<%UK00 " "od:j!!!!^$$$  d>>$$* 3 3U 3 3 3$39CCUCCCSUUKK'	.. w
>>&XW%7w
>>&XW%7 $ $clS !! $ $>>>>>>>FHH_c"""$$EE#JJT6**E N""uE'9'9T#YXXnc""""XXos###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ !
j//$	+s   4B&H&&H*	-H*	c                 B   i }|D ]z}t          |          D ]h\  }}||v rZ||         }|dz   t          |          z   |v r|dz  }|dz   t          |          z   |v |||<   |dt          |          z   z  }|||<   d||<   i{t          |                                          S )zdModifies passed-in glyphOrders to reflect new glyph names.
		Returns glyphOrder for the merged font.#rv   )r   reprr)   r[   )r   rE  rD  r   r   	glyphNamens          r   r=  zMerger._mergeGlyphOrders  s     
$ 	 	j
++  {qD	iQOd1gg%$..1fa Od1gg%$..T)_#Q-YZ]DOO 
diikk		r   c           	      z   t          j        t                      gd |D             R  }|D ]	 |         }nG# t          $ r: 	 |d         }n-# t          $ r  t          dd|j        j                  w xY wY nw xY w|t          u r] |fd|D                       }|t          urt          ||           |S )Nc              3   j   K   | ].}|t           ut          |                                          V  /d S r#   )r4   rZ   r[   r\   s     r   r(   z&Merger.mergeObjects.<locals>.<genexpr>/  s?      eeeVdIdIdtE{{//11IdIdIdIdeer   r^   r_   r`   c              3   D   K   | ]}t          |t                    V  d S r#   rb   rd   s     r   r(   z&Merger.mergeObjects.<locals>.<genexpr>;  s/      NNegeS.99NNNNNNr   )rh   ri   rj   rk   rf   r   r4   r   )r   rm   rl   r   ro   rp   rq   re   s          @r   rr   zMerger.mergeObjects+  s    Iceefeeveeefff' % %c.sJJ
 . . ..*ZZ . . .9["++- . . .. Z. N"":NNNNvNNNNN5>!!Ke$$$	s'   8
A<AA<*A66A<;A<c                 :   |                     d          }|                     d          }|                     d          }||fD ]}|s|j        j        rfd t          |j        j        j                  D             }|j        j                            |           |j        j                            |           |j        j        rS|j        j        rGd t          |j        j        j                  D             }|j        j        	                    |           d S )Nr  r  r  c                     i | ]\  }}||	S r$   r$   r  s      r   r4  z$Merger._preMerge.<locals>.<dictcomp>M  s    EEE11EEEr   c                     i | ]\  }}||	S r$   r$   r  s      r   r4  z$Merger._preMerge.<locals>.<dictcomp>R  s    NNN#!A!ANNNr   )
r   r]   r  r   r  r  r  r  r]  r  )r   r7  r  r  r  r.   r  r  s           r   r?  zMerger._preMergeA  s    
&		$	&		$	&		$$< 
/ 
/a
Xg .EE	!'*<*C D DEEEIG!!),,,G""9---g /ag0 /NN17+>+L!M!MNNNJG"":...
/ 
/r   c                 6   |                     d          }|                     d          }|                     d          }||fD ]}|s|j        j        r1|j        j        r$t	          |j        j        j                  }|j        j                            |           t          |j        j        j                  }|j        j                            |           |j        fdt          |j        j        j                  D             |j        j        _        t          |j        j        j                  }|j        j                            |           t          |j        j        j                  |j        j        _        |j        j        rt	          |j        j        j                  }|j        j                            |           |j        j                            |           t          |j        j        j                  }|j        j                            |           |j        j                            |           |j        fdt          |j        j        j                  D             |j        j        _        t          |j        j        j                  }|j        j                            |           |j        j                            |           t          |j        j        j                  |j        j        _        d S )Nr  r  r  c                 "    g | ]\  }}|v 	|S r$   r$   )r%   r   r/  usedIndicess      r   rG   z%Merger._postMerge.<locals>.<listcomp>o  s)    (w(w(wsqfgkvfvfvfvfvfvr   c                 "    g | ]\  }}|v 	|S r$   r$   )r%   r   rM   rU  s      r   rG   z%Merger._postMerge.<locals>.<listcomp>  s)     g g gsqVW[fVfVfVfVfVfr   )r   r]   r  r  r  r]  r  r  rn  r   r  rA   ri  r  r  r  rW  )	r   r7  r  r  r  r.   r  r  rU  s	           @r   rB  zMerger._postMergeX  s    
&		$	&		$	&		$$< ,D ,Da
Xg Nag0 N ))<)JKKJG"":... 2!'2E2STTJG"":...,K )x(w(w(wi@S@a6b6b(w(w(wAG% "!'"5"CDDJG"":...'*17+>+L'M'MAG$g D ((:(ABBIG""9---G!!),,, 11C1JKKIG""9---G!!),,,+K !h g g gi8J8Q.R.R g g gAG !!3!:;;IG""9---G!!),,,%();)B%C%CAG"Y,D ,Dr   r#   )
r   r'  r(  r  r  r   r=  rr   r?  rB  r$   r   r   r*  r*    s         :   ? ? ?B     ,/ / /.4D 4D 4D 4D 4Dr   r*  )r  r*  mainz%make one with everything (TOTAL TIME)c                    ddl m} | t          j        dd         } t	                      }|                    |           } t          |           dk     rt          dt          j                   dS  ||j	        rt          j        nt          j                   |j        r*t          j                            t          j                   ndt          j        _        t'          |	          }|                    |           }d
}t          d          5  |                    |           ddd           dS # 1 swxY w Y   dS )zMerge multiple fonts into oner   )configLoggerNrv   zusage: pyftmerge font...)file)r   T)r,  z
merged.ttfzcompile and save font)	fontToolsrY  sysr  r  r
  rA   printstderrr  loggingINFOWARNINGr  r@  r   setLevelDEBUGdisabledr*  r   save)argsrY  r,  mergerr7  outfiles         r   rW  rW    sl    $#####L	!""$994  IIMM"4444	
GOHGLLIIIIN ,&&&&%,

!
!
!T#$$  ))G                 s   D44D8;D8__main__r#   )jfontTools.misc.timeToolsr   r[  r   r   fontTools.ttLib.tablesr   r   #fontTools.ttLib.tables.DefaultTabler	   fontTools.misc.loggingToolsr
   fontTools.pens.recordingPenr   	functoolsr   r\  timer9   r_  	getLoggerr   r   r`  r@  r    r/   r'   r5   r7   r;   r>   rB   rJ   rN   rS   rr   r   r   maxr@   rA  rg   headFlagsMergeBitMapminr   r   r  r  rO  rY  ra  rj  ry  r}  r  BaseScriptListr  r  r  ClassDefLigCaretList
AttachListMarkGlyphSetsDefAxisBaseTagListr  r  r  r  r  r  r  MultipleSubstAlternateSubstLigatureSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPosr  ContextSubstChainContextSubst
ContextPosChainContextPosr  ExtensionSubstExtensionPosr  rU  rm  rg  r  rq  r  r  r  r  r  r*  __all__rW  exitr$   r   r   <module>r     s#  
 2 1 1 1 1 1 # # # # # # # # 5 5 5 5 5 5 5 5 < < < < < < - - - - - - ? ? ? ? ? ?       



    g)**&W&x'899NNN  $        # # #" " "  
 
 

 
 

 
 
! ! !F  * \T222
 
 32
 

( 
(  F   $ 
M]  (U(( ( }}	(
 ( 	))(
)
)( u( L( \( ( ( ( ( U( #(  mm!(" [#($ E%( (  F   $,  ( (  F   $$  ( (  F   $$ 
m    0(e(U( C( '	(
 
>( 
5( J( J( J( J( S( C( #( 3( (  !(" #(& "\*--!\*--\#|C  ,u%%U##c""(L--(L--;( ( (  F   $@  U (())  *) L""~( (  F   $ O O   F   $':u':6'B'B'K 
( (  F   $ ( (  F   $ ( (  F   $  U (()), , *), (D'C  F   $'C'C  F   $'C'C  F   $'C'C  F   $	9 	9 	98 8 8 8 8 8 8 8  U (())K K *)K\           8  " ! #     
 %$UU$ $    OO! !                 " "         & &  " l  ! !    	  	  	  	 	 	 	    \%  
 	  F   $ 	  F   $	  F   $	  F   $	  F   $  F   $  U (())4 4 *)4l X!



"






 
 
 
 X"


 %; %;	 %;P X"


 / /	 /$ X$
 / / / X_  
 X !!  "!
 XE E E X!""" " #""
 X$
 : : :
 X_$ $ $ X !!# # "!#L L L L Lf L L L\    v       f       v   $WD WD WD WD WDV WD WD WDz   .//   0/6 z	$$&& r   