B
    ¶ôJd‚  ã               @   sr  d dl mZ d dlmZ d dlmZmZ ddlmZ ddlm	Z	 d dl
m
Z
 d dlmZ d d	lZd d	lZd d	l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dd„ eeƒD ƒƒZdd„ Z e !d¡Z"dd„ Z#dd„ Z$d d!„ Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(d)„ Z,d*d+„ Z-d,d-„ Z.d;d/d0„Z/G d1d2„ d2ƒZ0G d3d4„ d4ejƒZ1G d5d6„ d6e2ƒZ3G d7d8„ d8e2ƒZ4G d9d:„ d:e2ƒZ5d	S )<é    )Ússtruct)ÚfloatToFixedToStr)ÚbyteordÚsafeEvalé   )ÚDefaultTable)ÚgrUtils)Úarray)ÚreduceNz&
    >
    version:            16.16F
zŽ
    >
    version:            16.16F
    compilerVersion:    L
    numSilf:            H
                        x
                        x
zZ
    >
    ruleVersion:        16.16F
    passOffset:         H
    pseudosOffset:      H
aÁ  
    >
    maxGlyphID:         H
    extraAscent:        h
    extraDescent:       h
    numPasses:          B
    iSubst:             B
    iPos:               B
    iJust:              B
    iBidi:              B
    flags:              B
    maxPreContext:      B
    maxPostContext:     B
    attrPseudo:         B
    attrBreakWeight:    B
    attrDirectionality: B
    attrMirroring:      B
    attrSkipPasses:     B
    numJLevels:         B
z×
    >
    attrStretch:        B
    attrShrink:         B
    attrStep:           B
    attrWeight:         B
    runto:              B
                        x
                        x
                        x
zñ
    >
    numLigComp:         H
    numUserDefn:        B
    maxCompPerLig:      B
    direction:          B
    attCollisions:      B
                        x
                        x
                        x
    numCritFeatures:    B
z;
    >
    unicode:            L
    nPseudo:            H
z;
    >
    unicode:            H
    nPseudo:            H
z;
    >
    numClass:           H
    numLinear:          H
zo
    >
    numIDs:             H
    searchRange:        H
    entrySelector:      H
    rangeShift:         H
z;
    >
    glyphId:            H
    index:              H
as  
    >
    flags:              B
    maxRuleLoop:        B
    maxRuleContext:     B
    maxBackup:          B
    numRules:           H
    fsmOffset:          H
    pcCode:             L
    rcCode:             L
    aCode:              L
    oDebug:             L
    numRows:            H
    numTransitional:    H
    numSuccess:         H
    numColumns:         H
)C)ÚNOPr   )Z	PUSH_BYTEÚb)ZPUSH_BYTE_UÚB)Z
PUSH_SHORTz>h)ZPUSH_SHORT_Uz>H)Z	PUSH_LONGz>L)ZADDr   )ZSUBr   )ZMULr   )ZDIVr   )ZMINr   )ÚMAXr   )ZNEGr   )ZTRUNC8r   )ZTRUNC16r   )ZCONDr   )ÚANDr   )ÚORr   )ZNOTr   )ÚEQUALr   )ZNOT_EQr   )ÚLESSr   )ZGTRr   )ZLESS_EQr   )ZGTR_EQr   )ZNEXTr   )ZNEXT_Nr   )Z	COPY_NEXTr   )ZPUT_GLYPH_8BIT_OBSr   )ZPUT_SUBS_8BIT_OBSZbBB)ZPUT_COPYr   )ZINSERTr   )ÚDELETEr   )ZASSOCéÿÿÿÿ)Z
CNTXT_ITEMZbB)ZATTR_SETr   )ZATTR_ADDr   )ZATTR_SUBr   )ZATTR_SET_SLOTr   )ZIATTR_SET_SLOTÚBB)ZPUSH_SLOT_ATTRÚBb)ZPUSH_GLYPH_ATTR_OBSr   )ZPUSH_GLYPH_METRICÚBbb)Z	PUSH_FEATr   )ZPUSH_ATT_TO_GATTR_OBSr   )ZPUSH_ATT_TO_GLYPH_METRICr   )ZPUSH_ISLOT_ATTRr   )ZPUSH_IGLYPH_ATTRr   )ZPOP_RETr   )ZRET_ZEROr   )ZRET_TRUEr   )Z	IATTR_SETr   )Z	IATTR_ADDr   )Z	IATTR_SUBr   )ZPUSH_PROC_STATEr   )ZPUSH_VERSIONr   )ZPUT_SUBSz>bHH)Z	PUT_SUBS2r   )Z	PUT_SUBS3r   )Z	PUT_GLYPHz>H)ZPUSH_GLYPH_ATTRz>Hb)ZPUSH_ATT_TO_GLYPH_ATTRz>Hb)ZBITORr   )ZBITANDr   )ZBITNOTr   )ZBITSETz>HH)ZSET_FEATr   c             C   s$   g | ]\}}|d  ||d ff‘qS )r   r   © )Ú.0ÚiÚxr   r   úQ/var/www/html/venv/lib/python3.7/site-packages/fontTools/ttLib/tables/S__i_l_f.pyú
<listcomp>Å   s    r   c       	      C   s  t | ƒ}d}g }x||k rt| ||d … ƒ}|t tƒkrHtd }nt| }|d7 }|d dkrp||krp|S |d dkršt| | ƒ}d| }|d7 }n|d dkr¬d}n|d }|dkrÌ| |d ¡ qt || |d … ¡}| |d d d tt|ƒ¡ d ¡ |t 	|¡7 }qW |S )	Nr   r   r   z%dBÚ ú(z, ú))
Úlenr   Ú
aCode_infoÚappendÚstructÚunpack_fromÚjoinÚmapÚstrÚcalcsize)	ÚaCodeZcodelenZpcÚresÚopcodeÚinstrÚcountÚfmtÚparmsr   r   r   ÚdisassembleÇ   s2    
 
&r1   z^\s*([^(]+)\s*(?:\(([^)]+)\))?c             C   sÊ   d}xÀ| D ]¸}t  |¡}|r
| d¡tkr,q
t| d¡ \}}|t d|¡7 }| d¡r
|dkrbq
dd„ t d| d¡¡D ƒ}|d	kr®t|ƒ}|tjd
|d  |f|žŽ 7 }q
|tj|f|žŽ 7 }q
W |S )Nó    r   r   é   r   c             S   s   g | ]}t |ƒ‘qS r   )Úint)r   r   r   r   r   r   ï   s    zassemble.<locals>.<listcomp>z,\s*r   z%dB)	ÚinstreÚmatchÚgroupÚ	aCode_mapr$   ÚpackÚreÚsplitr!   )Úinstrsr+   ÚinstÚmr,   Zparmfmtr0   Úlr   r   r   Úassembleä   s     


 r@   c             C   sL   |  | ¡ | ¡  x"t|ƒD ]}| |¡ | ¡  qW | | ¡ | ¡  d S )N)ÚbegintagÚnewliner1   ÚwriteÚendtag)ÚtagÚwriterr<   r?   r   r   r   Ú	writecode÷   s    


rG   c             C   s@   g }x2t | ƒ d¡D ] }| ¡ }t|ƒs*q| |¡ qW t|ƒS )NÚ
)Úcontent_stringr;   Ústripr!   r#   r@   )Úcontentr+   Úer   r   r   Úreadcode   s     rM   )	ÚflagsZextraAscentZextraDescentZ
maxGlyphIDZ
numLigCompZnumUserDefnZmaxCompPerLigÚ	directionÚlbGID)ZiSubstZiPosZiJustZiBidi)ZmaxPreContextZmaxPostContext)Z
attrPseudoZattrBreakWeightZattrDirectionalityZattrMirroringZattrSkipPassesZattCollisions)rN   ZmaxRuleLoopZmaxRuleContextZ	maxBackupÚminRulePreContextÚmaxRulePreContextÚcollisionThreshold)ÚnumRowsÚnumTransitionalÚ
numSuccessÚ
numColumnsc                s0   t ‡ fdd„|D ƒƒ}|j| f|Ž | ¡  d S )Nc                s   g | ]}|t ˆ |ƒf‘qS r   )Úgetattr)r   Úk)Úselfr   r   r     s    zwritesimple.<locals>.<listcomp>)ÚdictÚ	simpletagrB   )rE   rZ   rF   ZattrkeysÚattrsr   )rZ   r   Úwritesimple  s    r^   c             G   s2   x,|D ]$}||krt | |tt|| ƒƒƒ qW d S )N)Úsetattrr4   r   )rZ   r]   Z	attr_listrY   r   r   r   Ú	getSimple  s    
r`   c             C   s.   d}x | D ]}t |tƒrq
||7 }q
W | ¡ S )Nr   )Ú
isinstanceÚtuplerJ   )Úcontentsr+   Úelementr   r   r   rI     s    

 rI   éP   c             C   sn   d}xB|D ]:}t |ƒ|kr8|  |d d… ¡ |  ¡  d}||d 7 }q
W t |ƒrj|  |d d… ¡ |  ¡  d S )Nr   r   ú )r!   rC   rB   )rF   ZdatÚlengthZcurrlineÚdr   r   r   Úwrapline#  s    
ri   c               @   s   e Zd ZdS )Ú_ObjectN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   rj   /  s   rj   c               @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Útable_S__i_l_fzSilf table supportNc             C   s   t j  | |¡ g | _d S )N)r   Ú__init__Úsilfs)rZ   rE   r   r   r   ro   5  s    ztable_S__i_l_f.__init__c             C   sü   t  t|| ¡ tt| jddƒ| _| jdkrVt |¡\}| _t  t	|| ¡ t  
t	¡}nP| jdk rˆt d|dd… ¡| _d| _d| _d	}nd| _t  t	|| ¡ t  
t	¡}t d
| j ||d … ¡}x6|D ].}tƒ }| j |¡ | ||d … || j¡ qÆW d S )Né   )ÚprecisionBitsg      @g      @z>Hé   é   r   é   z>%dL)r   Úunpack2ÚSilf_hdr_formatÚfloatr   Úversionr   Ú
decompressÚschemeÚSilf_hdr_format_3r)   r$   ÚunpackÚnumSilfÚcompilerVersionr%   ÚSilfrp   r#   Ú	decompile)rZ   ÚdataÚttFontÚbaseZsilfoffsetsÚoffsetÚsr   r   r   r   9  s&    



ztable_S__i_l_f.decompilec             C   sÀ   t | jƒ| _| jdk r8t t| ¡}|t d| jd¡7 }nt t| ¡}t |ƒd| j  }d}x@| jD ]6}|t d|¡7 }| 	|| j¡}|t |ƒ7 }||7 }qbW | jdkr¸t
 | j|| ¡S || S )Ng      @z>HHr   rs   r2   z>Lg      @)r!   rp   r~   ry   r   r9   rw   r$   r|   Úcompiler   Úcompressr{   )rZ   rƒ   Úhdrr…   r‚   r†   Zsubdatar   r   r   r‡   P  s    

ztable_S__i_l_f.compilec             C   sz   |  d¡ | ¡  |jd| j| j| jd | ¡  xB| jD ]8}| d¡ | ¡  | ||| j¡ | 	d¡ | ¡  q:W d S )Nz/Attributes starting with _ are informative onlyry   )ry   r   ÚcompressionSchemeÚsilf)
ÚcommentrB   r\   ry   r   r{   rp   rA   ÚtoXMLrD   )rZ   rF   rƒ   r†   r   r   r   r   b  s    



ztable_S__i_l_f.toXMLc       	      C   s˜   |dkrBt t|d ƒƒ| _tt|d ƒƒ| _t t|d ƒƒ| _d S |dkr”tƒ }| j |¡ x6|D ].}t	|t
ƒsrqb|\}}}| ||||| j¡ qbW d S )Nry   rŠ   r   r‹   )r4   r   r{   rx   ry   r   r€   rp   r#   ra   rb   ÚfromXML)	rZ   Únamer]   rK   rƒ   r†   rd   rE   Ú
subcontentr   r   r   rŽ   o  s    

 
ztable_S__i_l_f.fromXML)N)	rk   rl   rm   Ú__doc__ro   r   r‡   r   rŽ   r   r   r   r   rn   2  s   
rn   c               @   s@   e Zd ZdZdd„ Zddd„Zddd„Zdd	d
„Zddd„ZdS )r€   zA particular Silf subtablec             C   s"   g | _ g | _g | _g | _i | _d S )N)ÚpassesÚ
scriptTagsÚcritFeaturesÚjLevelsÚpMap)rZ   r   r   r   ro   €  s
    zSilf.__init__ç       @c          	      sð  |dkr.t  tˆ | ¡\}‰ tt| jddƒ| _t  tˆ | ¡\}‰ x2t| jƒD ]$}t  t	ˆ t
ƒ ¡\}‰ | j |¡ qLW t  tˆ | ¡\}‰ | jr t d| j ˆ ¡| _ˆ | jd d d … ‰ t dˆ ¡\}|rì‡ fdd	„tddd
|  d
ƒD ƒ| _ˆ dd
|  d … ‰ t dˆ d d… ¡\| _| jrJt d| jd  ˆ ddd
| j  … ¡| _ˆ dd
| j  d … ‰ t dˆ d d… ¡\}x‚t|ƒD ]v}	|dkr¸t  tˆ dd|	  dd|	  … t
ƒ ¡}
n(t  tˆ dd
|	  dd
|	  … t
ƒ ¡}
| |
j¡| j|
j< q€W ˆ dd|  d … ‰ t  t¡t  t	¡| j  t  t¡ d| j  d d d
|  d d
| j  d d|  }|dkr~|t  t¡7 }tƒ | _| j  ˆ ||¡ xTt| jƒD ]F}	t!ƒ }| j" |¡ |  ˆ | j|	 | | j|	d  | … ||¡ q¢W d S )Ng      @rq   )rr   z>%dHr3   r   r   c          	      s.   g | ]&}t  d ˆ ||d … ¡d  d¡‘qS )Ú4srs   r   Úascii)r$   r}   Údecode)r   r   )r‚   r   r   r   •  s    z"Silf.decompile.<locals>.<listcomp>rs   z>Hz>%dLrt   ru   é   é   )#r   rv   ÚSilf_part1_format_v3rx   r   ÚruleVersionÚSilf_part1_formatÚrangeÚ
numJLevelsÚSilf_justify_formatrj   r•   r#   ÚSilf_part2_formatÚnumCritFeaturesr$   r%   r”   r“   r}   rP   Ú	numPassesZoPassesÚSilf_pseudomap_formatÚSilf_pseudomap_format_hÚgetGlyphNameZnPseudor–   Úunicoder)   ÚClassesÚclassesr   ÚPassr’   )rZ   r‚   rƒ   ry   Ú_ZjlevelÚjZnumScriptTagÚ	numPseudor   ÚpseudoÚcurrposÚpr   )r‚   r   r   ‡  sH    $*
*(X
&zSilf.decompilec          	   C   s6  t | jƒ| _t | jƒ| _t | jƒ| _t | jƒ}d}|dkrFt 	t
¡}nd}|t t| ¡7 }x| jD ]}|t t|¡7 }qbW |t t| ¡7 }| jr¬|tjd| j f| jžŽ 7 }|t ddt | jƒ¡7 }t | jƒrìdd„ | jD ƒ}|d |¡7 }|t d| j¡7 }t |ƒ| _t |d	¡}|t |ƒ d
| jd   }	|	t |ƒ | _xBt| j ¡ ƒD ]0\}
}|t |dkrhdnd|
| |¡¡7 }qLW || j ||¡7 }|	t |ƒ7 }	d}d}xFt| jƒD ]8\}}|	t |ƒ }|t d|¡7 }|| |||¡7 }q²W |t d|	t |ƒ ¡7 }|dkrt t
| ¡}nd}|| | | | S )Nr2   g      @r   z>%dHr   c             S   s   g | ]}t  d | d¡¡‘qS )r˜   r™   )r$   r9   Úencode)r   r   r   r   r   r   Ã  s    z Silf.compile.<locals>.<listcomp>z>Hrt   rs   r   z>LHz>HHz>L)r!   r’   r¥   r•   r¡   r”   r¤   r–   r   r)   r   r9   rŸ   r¢   r£   r$   ZnumCritFeatursr“   r&   rP   Z
passOffsetr   ÚbininfoZpseudosOffsetÚsortedÚitemsÚ
getGlyphIDr«   r‡   Ú	enumerate)rZ   rƒ   ry   r¯   r‚   Z	hdroffsetr®   ZtdataZdata1r±   Úur²   Zdata2Zdataor   r„   Zdata3r   r   r   r‡   ±  sN    



zSilf.compilec                s|  |dkr |j d| jd | ¡  td| |ftžŽ  td| |ftžŽ  td| |ftžŽ  td| |ftžŽ  t| j	ƒrè| 
d¡ | ¡  t t¡\}}}x@t| j	ƒD ]2\}‰ t‡ fd	d
„|D ƒƒ}|j d|Ž | ¡  q W | d¡ | ¡  t| jƒr8| 
d¡ | ¡  | d tt| jƒ¡¡ | ¡  | d¡ | ¡  t| jƒr‚| 
d¡ | ¡  | d | j¡¡ | ¡  | d¡ | ¡  | jrè| 
d¡ | ¡  x8t| j ¡ ƒD ]&\}	}
|j dt|	ƒ|
d | ¡  q¬W | d¡ | ¡  | j |||¡ t| jƒrx| 
d¡ | ¡  xNt| jƒD ]@\}}|j
d|d | ¡  | |||¡ | d¡ | ¡  q"W | d¡ | ¡  d S )Ng      @ry   )rž   ÚinfoÚpassindexesÚcontextsÚ
attributesÚjustificationsc                s   g | ]}|t ˆ |ƒf‘qS r   )rX   )r   rY   )r®   r   r   r   ì  s    zSilf.toXML.<locals>.<listcomp>Újustifyr”   rf   r“   Ú	pseudoMapr°   )r©   r°   r’   Úpass)Ú_index)r¿   )r\   rž   rB   r^   Ú
attrs_infoÚattrs_passindexesÚattrs_contextsÚattrs_attributesr!   r•   rA   r   Z	getformatr¢   r¸   r[   rD   r”   rC   r&   r'   r(   r“   r–   rµ   r¶   Úhexr«   r   r’   )rZ   rF   rƒ   ry   ZjformatZjnamesZjfixesr   r]   rY   Úvr²   r   )r®   r   r   ß  sf    











z
Silf.toXMLc          	   C   s¶  |dkrt t| dd¡ƒƒ| _|dkr:t| |ftžŽ  nx|dkrVt| |ftžŽ  n\|dkrrt| |ftžŽ  n@|dkrŽt| |ftžŽ  n$|dkrþxb|D ]Z}t	|t
ƒs¬qœ|\}}}|d	krœtƒ }	x$| ¡ D ]\}
}t|	|
t|ƒƒ qÎW | j |	¡ qœW n´|d
kr0g | _t|ƒ}| j tt| ¡ ƒ¡ n‚|dkrlg | _t|ƒ}x| ¡ D ]}| j |¡ qRW nF|dkrÒi | _xR|D ]J}t	|t
ƒs–q‚|\}}}|dkrÀt|d dƒ}
|d }|| j|
< q‚W nà|dkr$tƒ | _xÌ|D ]4}t	|t
ƒsþqê|\}}}| j |||||¡ qêW nŽ|dkr²x‚|D ]z}t	|t
ƒsHq4|\}}}|dkr4tƒ }x<|D ]4}t	|t
ƒs|qh| |d |d |d ||¡ qhW | j |¡ q4W d S )Nry   rž   Ú0rº   r»   r¼   r½   r¾   r¿   r”   r“   rÀ   r°   r©   rq   r«   r’   rÁ   r   r   r3   )rx   r   Úgetrž   r`   rÃ   rÄ   rÅ   rÆ   ra   rb   rj   r¶   r_   r4   r•   r#   r”   rI   Úextendr'   r;   r“   r–   rª   r«   rŽ   r¬   r’   )rZ   r   r]   rK   rƒ   ry   rd   rE   r   r®   rY   rÈ   Únr²   rL   r   r   r   rŽ     st    

 




 



 


 


 $zSilf.fromXMLN)r—   )r—   )r—   )r—   )	rk   rl   rm   r‘   ro   r   r‡   r   rŽ   r   r   r   r   r€   }  s   
*
.
5r€   c               @   s<   e Zd Zdd„ Zddd„Zddd„Zddd	„Zdd
d„ZdS )rª   c             C   s   g | _ g | _d S )N)ÚlinearÚ	nonLinear)rZ   r   r   r   ro   N  s    zClasses.__init__ç       @c       	   
      sJ  t  tˆ | ¡ |dkr@t d| jd  ˆ ddd| j  … ¡}n(t d| jd  ˆ ddd| j  … ¡}xdt|d | j… |d| jd … ƒD ]>\}}| j 	‡fd	d
„t d|| d  ˆ ||… ¡D ƒ¡ qŒW xvt|| j| j… || jd | jd … ƒD ]H\}}‡ fdd„t
|d |dƒD ƒ}t‡fdd„|D ƒƒ}| j 	|¡ qúW d S )Ng      @z>%dLr   rs   ru   z>%dHrt   r3   c             3   s   | ]}ˆ   |¡V  qd S )N)r¨   )r   r   )rƒ   r   r   ú	<genexpr>[  s    z$Classes.decompile.<locals>.<genexpr>c          	      s$   g | ]}t  d ˆ ||d … ¡‘qS )z>HHrs   )r$   r}   )r   r   )r‚   r   r   r   _  s    z%Classes.decompile.<locals>.<listcomp>c                s"   g | ]}ˆ   |d  ¡|d f‘qS )r   r   )r¨   )r   r   )rƒ   r   r   r   `  s    )r   rv   ÚSilf_classmap_formatr$   r}   ÚnumClassÚzipÚ	numLinearrÍ   r#   r    r[   rÎ   )	rZ   r‚   rƒ   ry   ÚoClassesr†   rL   Z	nonLinidsZnonLinr   )r‚   rƒ   r   r   R  s    ,*"zClasses.decompilec                sb  d}g }|dkr.ddt | jƒt | jƒ   }nddt | jƒt | jƒ   }xN| jD ]D}| t |ƒ| ¡ ‡ fdd„|D ƒ}|tjd	t |ƒ f|žŽ 7 }qRW xd| jD ]Z}| t |ƒ| ¡ ‡ fd
d„| ¡ D ƒ}|t t |ƒ¡7 }|d 	dd„ t
|ƒD ƒ¡7 }q¢W | t |ƒ| ¡ t |ƒd | _t | jƒ| _t t| ¡tj|dkrHdnd	t |ƒ f|žŽ  | S )Nr2   g      @ru   rs   rt   r3   c                s   g | ]}ˆ   |¡‘qS r   )r·   )r   r   )rƒ   r   r   r   l  s    z#Classes.compile.<locals>.<listcomp>z>%dHc                s"   g | ]}ˆ   |d  ¡|d f‘qS )r   r   )r·   )r   r   )rƒ   r   r   r   p  s    c             S   s   g | ]}t jd|žŽ ‘qS )ú>HH)rÖ   )r$   r9   )r   r   r   r   r   r   r  s    r   z>%dL)r!   rÍ   rÎ   r#   r$   r9   r¶   r   r´   r&   rµ   rÒ   rÔ   r   rÑ   )rZ   rƒ   ry   r‚   rÕ   r…   r?   Úgsr   )rƒ   r   r‡   c  s$      zClasses.compilec             C   s.  |  d¡ | ¡  |  d¡ | ¡  xHt| jƒD ]:\}}|j d|d | ¡  t||ƒ | d¡ | ¡  q0W | d¡ | ¡  |  d¡ | ¡  xrt| jƒD ]d\}}|j d|| j d | ¡  x,| ¡ D ] \}}|j	d||d | ¡  qÌW | d¡ | ¡  qžW | d¡ | ¡  | d¡ | ¡  d S )	Nr«   ÚlinearClassesrÍ   )rÂ   ÚnonLinearClassesrÎ   r'   )ÚglyphÚindex)
rA   rB   r¸   rÍ   ri   rD   rÎ   rÔ   r¶   r\   )rZ   rF   rƒ   ry   r   r?   ZinpÚindr   r   r   r   z  s4    








zClasses.toXMLc             C   sÚ   |dkrNxÌ|D ]:}t |tƒsq|\}}}|dkrt|ƒ ¡ }	| j |	¡ qW nˆ|dkrÖx~|D ]v}t |tƒslq\|\}}}|dkr\i }	xB|D ]:}
t |
tƒs˜qˆ|
\}}}|dkrˆtt|d ƒƒ|	|d < qˆW | j |	¡ q\W d S )NrØ   rÍ   rÙ   rÎ   r'   rÛ   rÚ   )	ra   rb   rI   r;   rÍ   r#   r4   r   rÎ   )rZ   r   r]   rK   rƒ   ry   rd   rE   r   r?   rL   Zsubsubcontentr   r   r   rŽ   –  s,    

 


 


 
zClasses.fromXMLN)rÏ   )rÏ   )rÏ   )rÏ   )rk   rl   rm   ro   r   r‡   r   rŽ   r   r   r   r   rª   L  s
   


rª   c               @   s<   e Zd Zdd„ Zddd„Zddd„Zddd	„Zdd
d„ZdS )r¬   c             C   s:   i | _ g | _g | _g | _g | _d| _g | _g | _g | _d S )Nr2   )	ÚcolMapÚrulesÚrulePreContextsÚruleSortKeysÚruleConstraintsÚpassConstraintsÚactionsÚ
stateTransÚstartStates)rZ   r   r   r   ro   ­  s    zPass.__init__ç       @c          	      s¼  t  tˆ | ¡\}‰ t dˆ d d… ¡\}}}}ˆ dd … ‰ x^t|ƒD ]R}t dˆ d| d| d … ¡\}}}	x&t||d ƒD ]}
|	| j| |
¡< q~W qDW ˆ d| d … ‰ t d| j	d  ˆ ¡}ˆ dd| j	  d … ‰ t d|d  ˆ ¡‰‡fd	d
„t
||dd … ƒD ƒ| _ˆ d|d  d … ‰ t dˆ d d… ¡\| _| _| j| j d }t d| ˆ dd|d  … ¡| _ˆ d|d  d … ‰ t d| j ˆ d d| j … ¡| _ˆ d| j d … ‰ t d| j ˆ d | j… ¡| _ˆ | jd … ‰ t dˆ d d… ¡\| _}tt d| jd  ˆ dd| jd  … ¡ƒ}ˆ d| jd  d … ‰ tt d| jd  ˆ d d| jd  … ¡ƒ}ˆ d| j d d … ‰ x^t| jƒD ]P}tdˆ || j d |d | j d … ƒ}tjdkrÎ| ¡  | j |¡ qŒW ˆ | j| j d d d … ‰ ˆ d |… | _ˆ |d … ‰ x<tt|ƒd ddƒD ]$}|| dkr,||d  ||< q,W ‡ fdd
„t
||dd … ƒD ƒ| _ˆ |d d … ‰ ‡ fdd
„t
||dd … ƒD ƒ| _ˆ |d d … ‰ d S )Nz>4Hru   z>3Hrt   r   z>%dHr3   r   c                s   g | ]\}}ˆ ||… ‘qS r   r   )r   r†   rL   )rÞ   r   r   r   Ä  s    z"Pass.decompile.<locals>.<listcomp>r   z%dBz>BHé   é   ÚHÚbigr   c                s,   g | ]$\}}|| d kr$ˆ ||… nd‘qS )r   r2   r   )r   r†   rL   )r‚   r   r   r   à  s    c                s,   g | ]$\}}|| d kr$ˆ ||… nd‘qS )r   r   r   )r   r†   rL   )r‚   r   r   r   â  s    ) r   rv   ÚSilf_pass_formatr$   r}   r    rÝ   r¨   r%   rV   rÓ   rÞ   rQ   rR   rå   ÚnumRulesrà   rß   rS   ÚlistrU   r	   rW   ÚsysÚ	byteorderÚbyteswaprä   r#   râ   r!   rá   rã   )rZ   r‚   rƒ   ry   r­   ZnumRanger   ÚfirstÚlastÚcolÚgÚoRuleMapZnumStartStatesZpConstraintÚoConstraintsÚoActionsÚar   )r‚   rÞ   r   r   ¸  sX    &"
"* ""zPass.decompilec                s^  t dd„ | jdg dg fƒd }t dd„ | jdg dg fƒd }dd | j¡ }g }x@| jD ]6}tjdkrr| ¡  | | 	¡ ¡ tjdkr\| ¡  q\W t
|ƒs¦dg| _t d	d„ | jg g dg fƒd }	g }
t‡ fd
d„| j ¡ D ƒƒ}xJtj|ddD ]8}|d rö|
 |d |d |d  d |d d f¡ qöW t
| jƒ| _t t¡d t
|
ƒd  t
|	ƒd  d|	d   d dt
| jƒ  d| j  d d| j  d | _| jd| j | j  d | | _| jt
| jƒ | _| jt
|ƒ | _d| _t t| ¡}|t t
|
ƒd¡7 }|d dd„ |
D ƒ¡7 }|t jdt
|	ƒ f|	žŽ 7 }t dd„ | jg ƒ}|t jd|	d  f|žŽ 7 }|t  d| j!| j"¡7 }|t jdt
| jƒ f| jžŽ 7 }|t jd| j f| j#žŽ 7 }|t jd| j f| j$žŽ 7 }|t  d| j%t
| jƒ¡7 }|t jd| jd  f|žŽ 7 }|t jd| jd  f|žŽ 7 }|d |¡ t  dd¡ | j | d | j¡ S )Nc             S   s"   | d t |ƒ | d | d g fS )Nr   r   )r!   )rø   r   r   r   r   Ú<lambda>è  r2   zPass.compile.<locals>.<lambda>r2   r   r   c             S   s"   | d t |ƒ | d | d g fS )Nr   r   )r!   )rø   r   r   r   r   rù   é  r2   ó    rê   c             S   s"   | d t |ƒ | d | d g fS )Nr   r   )r!   )rø   r   r   r   r   rù   ò  r2   c                s"   g | ]}ˆ   |d  ¡|d f‘qS )r   r   )r·   )r   r   )rƒ   r   r   r   ô  s    z Pass.compile.<locals>.<listcomp>T)Zsamevalr3   ru   rt   r   rç   rs   c             s   s   | ]}t jd|žŽ V  qdS )ú>3HN)rû   )r$   r9   )r   r²   r   r   r   rÐ     s    zPass.compile.<locals>.<genexpr>z>%dHc             S   s   | | S )Nr   )rø   r   r   r   r   rù     r2   r   z%dBz>BHr   )&r
   rã   rá   r&   rä   rî   rï   rð   r#   Útobytesr!   rå   rÞ   r[   rÝ   r¶   r   Úentriesrì   r   r)   rë   Z	fsmOffsetrU   rW   ZpcCoderâ   ZrcCoder*   ZoDebugr9   r´   r$   rQ   rR   rà   rß   rS   )rZ   rƒ   r„   ry   r÷   rö   ZconstraintCodeZtransesÚtrõ   Z
passRangesZ	gidcolmaprL   r‚   Z	flatrulesr   )rƒ   r   r‡   æ  sL      
 
  0b  zPass.compilec          	      sZ  t d| |ftžŽ  t d| |ftžŽ  | d¡ | ¡  t|dd„ t| j ¡ ‡ fdd„dD ƒƒ | 	d¡ | ¡  | d	¡ | ¡  xFt
| jƒD ]8\}}|jd
| j| j | d tt|ƒ¡d | ¡  qW | 	d	¡ | ¡  | d¡ | ¡  x„tt| jƒƒD ]r}|jd|| j| | j| d | ¡  t| j| ƒrLtd|| j| ƒ td|| j| ƒ | 	d¡ | ¡  q W | 	d¡ | ¡  t| jƒr¢td|| jƒ t| jƒrV| d¡ | ¡  | d¡ | d tt| jƒ¡¡ | 	d¡ | ¡  xNt
| jƒD ]@\}}|jd|d | d tt|ƒ¡¡ | 	d¡ | ¡  q W | 	d¡ | ¡  d S )Nrº   ÚfsminfoÚcolmapc             S   s   g | ]}d j |Ž ‘qS )z{}={})Úformat)r   r   r   r   r   r     s    zPass.toXML.<locals>.<listcomp>c                s   ˆ   | d ¡S )Nr   )r·   )r   )rƒ   r   r   rù     r2   zPass.toXML.<locals>.<lambda>)ÚkeyÚstaterulemapÚstaterf   )ÚnumberrÞ   rÞ   Úrule)rÛ   Ú
precontextÚsortkeyÚ
constraintÚactionÚpassConstraintÚfsmÚstartsÚrow)Z_i)r^   Úpass_attrs_infoÚpass_attrs_fsmrA   rB   ri   rµ   rÝ   r¶   rD   r¸   rÞ   r\   rT   rV   r&   r'   r(   r    r!   rã   rß   rà   rá   rG   râ   rä   rC   rå   )rZ   rF   rƒ   ry   r   Úrr†   r   )rƒ   r   r     sZ    











z
Pass.toXMLc             C   s’  |dkrt | |ftžŽ  nr|dkr8t | |ftžŽ  nV|dkr¤t|ƒ}xV| ¡ D ]J}| d¡}t|ƒdksR|d dksR|d dkr†qRt|d ƒ| j|d < qRW nê|d	krüxJ|D ]B}t|t	ƒsÂq²|\}	}
}|	d
kr²| j
 dd„ |
d  d¡D ƒ¡ q²W n’|dkrØxÎ|D ]Æ}t|t	ƒs q|\}	}
}|	dkr8q| j t|
d ƒ¡ | j t|
d ƒ¡ d}d}xN|D ]F}t|t	ƒs‚qn|\}	}
}|	dkr t|ƒ}n|	dkrnt|ƒ}qnW | j |¡ | j |¡ qW n¶|dkrît|ƒ| _n |dkrŽx”|D ]Œ}t|t	ƒsqþ|\}	}
}|	dkrXtdƒ}t|ƒ}| tt| ¡ ƒ¡ | j |¡ n0|	dkrþg }t|ƒ}| tt| ¡ ƒ¡ || _qþW d S )Nrº   rÿ   r   ú=r3   r   r   r   r  r  c             S   s   g | ]}t |ƒ‘qS r   )r4   )r   r   r   r   r   r   R  s    z Pass.fromXML.<locals>.<listcomp>rÞ   rf   r  r  r  r2   r	  r
  r  r  r  ré   r  )r`   r  r  rI   r;   r!   r4   rÝ   ra   rb   rÞ   r#   rß   rà   rM   rã   rá   râ   r	   rË   r'   rä   rå   )rZ   r   r]   rK   rƒ   ry   rL   Úwr   rE   rø   Úcrd   ÚconZactZsubcr†   r   r   r   rŽ   B  sp    
$ 

 
(

 

 
 






 


zPass.fromXMLN)ræ   )ræ   )ræ   )ræ   )rk   rl   rm   ro   r   r‡   r   rŽ   r   r   r   r   r¬   «  s
   
.
,
0r¬   )re   )6ZfontTools.miscr   ZfontTools.misc.fixedToolsr   ZfontTools.misc.textToolsr   r   r   r   r   r	   Ú	functoolsr
   r$   r:   rî   rw   r|   r   rŸ   r¢   r£   r¦   r§   rÑ   ZSilf_lookupclass_formatZSilf_lookuppair_formatrë   r"   r[   r¸   r8   r1   r‡   r5   r@   rG   rM   rÃ   rÄ   rÅ   rÆ   r  r  r^   r`   rI   ri   rj   rn   Úobjectr€   rª   r¬   r   r   r   r   Ú<module>   sT   	D
	
K P_