Ë
    £eh0Y  ã            
       ó€  — d 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ZddlmZ ddlZ ej                   e«      Z G d	„ d
e«      ZdZdZddddddddddœ	Zefd„Z G d„ de«      ZdZ ej6                  e«      ZdZ ej6                  e«      ZdZ ej6                  e«      Z dZ! ej6                  e!«      Z"dZ# ej6                  e#«      Z$ G d„ d e«      Z% G d!„ d"e%«      Z& G d#„ d$e%«      Z' G d%„ d&«      Z(d'„ Z)d(„ Z*d)„ Z+ed*k(  r4ddl,Z,ddl-Z- e,j\                   e-j^                  «       j`                  «       yy)+a¯  ttLib/sfnt.py -- low-level module to deal with the sfnt file format.

Defines two public classes:

- SFNTReader
- SFNTWriter

(Normally you don't have to use these classes explicitly; they are
used automatically by ttLib.TTFont.)

The reading and writing of sfnt files is separated in two distinct
classes, since whenever the number of tables changes or whenever
a table's length changes you need to rewrite the whole file anyway.
é    )ÚBytesIO)ÚSimpleNamespace)ÚTag)Ússtruct)Ú
TTLibErrorÚTTLibFileIsCollectionErrorN)ÚOrderedDictc                   óH   — e Zd Zd„ Zdd„Zd„ ZeZd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zy
)Ú
SFNTReaderc                 ó  — |ri| t         u ra|d   }|j                  d«       t        |j                  d«      «      }|j                  d«       |dk(  rddlm} t        j                  |«      S t        j                  | «      S )zmReturn an instance of the SFNTReader sub-class which is compatible
        with the input file type.
        r   é   ÚwOF2)ÚWOFF2Reader)r   Úseekr   ÚreadÚfontTools.ttLib.woff2r   ÚobjectÚ__new__)ÚclsÚargsÚkwargsÚinfileÚsfntVersionr   s         úR/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/ttLib/sfnt.pyr   zSFNTReader.__new__   sh   € ñ �Cœ:Ñ%Ø˜!‘WˆFØ�K‰K˜ŒNÜ˜fŸk™k¨!›nÓ-ˆKØ�K‰K˜ŒNØ˜fÒ$å=ä—~‘~ kÓ2Ð2ä�~‰~˜cÓ"Ð"ó    c                 ó  — || _         || _        d | _        d | _        t        | _        | j                   j                  d«       | j                   j                  d«      | _        | j                   j                  d«       | j                  dk(  rÆt        | j                   «      }|j                  }d|cxk  r|k  sn t        d|dz
  z  «      ‚|| _
        | j                   j                  |j                  |   «       | j                   j                  t        «      }t        |«      t        k7  rt        d«      ‚t!        j"                  t$        || «       nÐ| j                  dk(  rjd| _        t&        | _        | j                   j                  t(        «      }t        |«      t(        k7  rt        d	«      ‚t!        j"                  t*        || «       nW| j                   j                  t        «      }t        |«      t        k7  rt        d
«      ‚t!        j"                  t$        || «       t-        | j                  «      | _        | j                  dvrt        d«      ‚i }t/        | j0                  «      D ]G  }| j                  «       }	|	j3                  | j                   «       t-        |	j4                  «      }
|	||
<   ŒI t7        t9        |j;                  «       d„ ¬«      «      | _        | j                  dk(  rt?        | «      | _        y y )Nr   r   s   ttcfz2specify a font number between 0 and %d (inclusive)é   ú'Not a Font Collection (not enough data)ó   wOFFÚwoffz!Not a WOFF font (not enough data)z1Not a TrueType or OpenType font (not enough data))ú   ÚOTTOÚtruez1Not a TrueType or OpenType font (bad sfntVersion)c                 ó    — | d   j                   S )Nr   )Úoffset)Úis    r   ú<lambda>z%SFNTReader.__init__.<locals>.<lambda>]   s   € ÀqÈÁtÇ{Á{€ r   )Úkey) ÚfileÚcheckChecksumsÚflavorÚ
flavorDataÚSFNTDirectoryEntryÚDirectoryEntryr   r   r   ÚreadTTCHeaderÚnumFontsr   ÚoffsetTableÚsfntDirectorySizeÚlenr   r   ÚunpackÚsfntDirectoryFormatÚWOFFDirectoryEntryÚwoffDirectorySizeÚwoffDirectoryFormatr   ÚrangeÚ	numTablesÚfromFileÚtagr	   ÚsortedÚitemsÚtablesÚWOFFFlavorData)Úselfr)   r*   Ú
fontNumberÚheaderr0   Údatar?   r&   Úentryr<   s              r   Ú__init__zSFNTReader.__init__/   s\  € ØˆŒ	Ø,ˆÔàˆŒØˆŒÜ0ˆÔØ�	‰	�‰�qÔØŸ9™9Ÿ>™>¨!Ó,ˆÔØ�	‰	�‰�qÔØ×Ñ˜wÒ&Ü" 4§9¡9Ó-ˆFØ—‘ˆHØ˜
Ô- XÔ-Ü0ØHØ !‘|ñ%óð ð %ˆDŒMØ�I‰I�N‰N˜6×-Ñ-¨jÑ9Ô:Ø—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ò-Ü Ð!JÓKÐKÜ�N‰NÔ.°°dÕ;Ø×Ñ Ò(Ø ˆDŒKÜ"4ˆDÔØ—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ò-Ü Ð!DÓEÐEÜ�N‰NÔ.°°dÕ;à—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ò-Ü Ð!TÓUÐUÜ�N‰NÔ.°°dÔ;Ü˜t×/Ñ/Ó0ˆÔà×ÑÐ#GÑGÜÐPÓQÐQØˆÜ�t—~‘~Ó&ò 	 ˆAØ×'Ñ'Ó)ˆEØ�N‰N˜4Ÿ9™9Ô%Ü�e—i‘i“.ˆCØˆF�3ŠKð		 ô
 "¤&¨¯©«Ñ=RÔ"SÓTˆŒð �;‰;˜&Ò Ü,¨TÓ2ˆD�Oð !r   c                 ó   — || j                   v S ©N©r?   ©rA   r<   s     r   Úhas_keyzSFNTReader.has_keyc   s   € Ø�d—k‘kÐ!Ð!r   c                 ó6   — | j                   j                  «       S rH   )r?   Úkeys©rA   s    r   rM   zSFNTReader.keysh   s   € Ø�{‰{×ÑÓ!Ð!r   c                 ór  — | j                   t        |«         }|j                  | j                  «      }| j                  rw|dk(  rt        |dd dz   |dd z   «      }nt        |«      }| j                  dkD  r||j                  k(  s
J d|z  «       ‚|S ||j                  k7  rt        j                  d|«       |S )zFetch the raw table data.ÚheadNé   ó       é   r   zbad checksum for '%s' table)	r?   r   ÚloadDatar)   r*   ÚcalcChecksumÚcheckSumÚlogÚwarning)rA   r<   rE   rD   Úchecksums        r   Ú__getitem__zSFNTReader.__getitem__k   sµ   € à—‘œC ›HÑ%ˆØ�~‰~˜dŸi™iÓ(ˆØ×ÒØ�fŠ}ä'¨¨R¨a¨°;Ñ(>ÀÀbÀcÀÑ(JÓK‘ä'¨Ó-�Ø×"Ñ" QÒ&à 5§>¡>Ò1ÐVÐ3PÐSVÑ3VÓVÐ1ð ˆð ˜UŸ^™^Ò+ä—‘Ð9¸3Ô?Øˆr   c                 ó0   — | j                   t        |«      = y rH   )r?   r   rJ   s     r   Ú__delitem__zSFNTReader.__delitem__}   s   € Ø�K‰Kœ˜C›Ñ!r   c                 ó8   — | j                   j                  «        y rH   )r)   ÚcloserN   s    r   r^   zSFNTReader.close€   s   € Ø�	‰	�‰Õr   c                 óø   — t        | j                  t        «      r| j                  S | j                  j	                  «       }|d= | j                  j
                  |d<   | j                  j                  «       |d<   |S )Nr)   Ú	_filenameÚ_filepos)Ú
isinstancer)   r   Ú__dict__ÚcopyÚnameÚtell©rA   Ústates     r   Ú__getstate__zSFNTReader.__getstate__‰   sa   € Ü�d—i‘i¤Ô)à—=‘=Ð ð —‘×"Ñ"Ó$ˆØ�&ˆMØ!ŸY™YŸ^™^ˆˆkÑØ ŸI™IŸN™NÓ,ˆˆjÑØˆr   c                 óÖ   — d|vrJt        |j                  d«      d«      | _        | j                  j                  |j                  d«      «       | j                  j                  |«       y )Nr)   r`   Úrbra   )ÚopenÚpopr)   r   rc   Úupdaterg   s     r   Ú__setstate__zSFNTReader.__setstate__•   sL   € Ø˜ÑÜ˜UŸY™Y {Ó3°TÓ:ˆDŒIØ�I‰I�N‰N˜5Ÿ9™9 ZÓ0Ô1Ø�‰×Ñ˜UÕ#r   N)r   éÿÿÿÿ)Ú__name__Ú
__module__Ú__qualname__r   rF   rK   Ú__contains__rM   rZ   r\   r^   ri   ro   © r   r   r   r      s7   „ ò#ó"23òh"ð €Lò"òò$"òò
ó$r   r   é   Fr   é   é   rQ   é
   é   é   é2   éd   )	r   é   rw   r   rx   rv   é   rQ   é	   c                 óš   — d|cxk  rdk  sn t        d|z  «      ‚t        r|dk(  rddlm}  || |«      S ddlm}  || t
        |   ¬«      S )aE  Compress 'data' to Zlib format. If 'USE_ZOPFLI' variable is True,
    zopfli is used instead of the zlib module.
    The compression 'level' must be between 0 and 9. 1 gives best speed,
    9 gives best compression (0 gives no compression at all).
    The default value is a compromise between speed and compression (6).
    r   r€   zBad compression level: %s)Úcompress)Únumiterations)Ú
ValueErrorÚ
USE_ZOPFLIÚzlibr‚   Úzopfli.zlibÚZOPFLI_LEVELS)rD   Úlevelr‚   s      r   r‚   r‚   ³   sN   € ð �ŒO˜!ŒOÜÐ4°uÑ<Ó=Ð=Ý˜ !šÝ!á˜˜eÓ$Ð$å(á˜¬M¸%Ñ,@ÔAÐAr   c                   óJ   — e Zd Zd„ Z	 	 	 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zy)Ú
SFNTWriterc                 óÂ   — d}|r
d|v r|d   }n|rt        |«      dkD  r|d   }| t        u r |dk(  rddlm} t        j                  |«      S t        j                  | «      S )zpReturn an instance of the SFNTWriter sub-class which is compatible
        with the specified 'flavor'.
        Nr+   rw   Úwoff2r   )ÚWOFF2Writer)r3   r‹   r   rŽ   r   r   )r   r   r   r+   rŽ   s        r   r   zSFNTWriter.__new__Ç   sd   € ð ˆÙ�h &Ñ(Ø˜HÑ%‰FÙ”c˜$“i !’mØ˜!‘WˆFØ”*ÑØ˜Ò å=ä—~‘~ kÓ2Ð2ä�~‰~˜cÓ"Ð"r   Nc                 óX  — || _         || _        t        |«      | _        || _        || _        | j                  dk(  r>t        | _        t        | _	        t        | _        d| _        t        |t        z  z   | _        nc| j                  rJ d| j                  z  «       ‚t         | _        t        | _	        t"        | _        ddlm}  ||d«      \  | _        | _        | _        | j                   j/                  «       | _        | j0                  | j                  z   || j                  j2                  z  z   | _        | j                   j7                  | j4                  «       | j                   j9                  d| j4                  | j                   j/                  «       z
  z  «       t;        «       | _        y )Nr    ÚwOFFúUnknown flavor '%s'r   ©ÚgetSearchRangeé   ó    )r)   r:   r   r   r+   r,   r8   ÚdirectoryFormatr7   ÚdirectorySizer6   r.   Ú	signaturer2   ÚsfntDirectoryEntrySizeÚorigNextTableOffsetr5   r-   ÚfontTools.ttLibr“   ÚsearchRangeÚentrySelectorÚ
rangeShiftrf   ÚdirectoryOffsetÚ
formatSizeÚnextTableOffsetr   Úwriter	   r?   )rA   r)   r:   r   r+   r,   r“   s          r   rF   zSFNTWriter.__init__Ù   s`  € ð ˆŒ	Ø"ˆŒÜ˜{Ó+ˆÔØˆŒØ$ˆŒà�;‰;˜&Ò Ü#6ˆDÔ Ü!2ˆDÔÜ"4ˆDÔà#ˆDŒNô " IÔ0FÑ$FÑFð Õ$ð —{’{ÐGÐ$9¸D¿K¹KÑ$GÓG�?Ü#6ˆDÔ Ü!2ˆDÔÜ"4ˆDÔå6áDRØ˜2óEÑAˆDÔ˜dÔ0°$´/ð  $Ÿy™yŸ~™~Ó/ˆÔà× Ñ Ø× Ñ ñ!à˜$×-Ñ-×8Ñ8Ñ8ñ9ð 	Ôð 	�	‰	�‰�t×+Ñ+Ô,à�	‰	�‰˜ ×!5Ñ!5¸¿	¹	¿¹Ó8HÑ!HÑIÔJÜ!“mˆ�r   c                 óZ   — || j                   v rt        d|z  «      ‚|| j                   |<   y )Núcannot rewrite '%s' table)r?   r   )rA   r<   rE   s      r   ÚsetEntryzSFNTWriter.setEntry
  s-   € Ø�$—+‘+ÑÜÐ8¸3Ñ>Ó?Ð?à ˆ�‰�CÒr   c                 ó  — || j                   v rt        d|z  «      ‚| j                  «       }||_        | j                  |_        |dk(  r+t        |dd dz   |dd z   «      |_        || _        d|_	        nt        |«      |_        |j                  | j                  |«       | j                  dk(  r6| j                  |_        | xj                  |j                  d	z   d
z  z  c_        | j                  |j                   d	z   d
z  z   | _        | j                  j#                  d| j                  | j                  j%                  «       z
  z  «       | j                  | j                  j%                  «       k(  sJ ‚| j'                  ||«       y)zWrite raw table data to disk.r¤   rP   NrQ   rR   rS   Tr    rw   éüÿÿÿr•   )r?   r   r.   r<   r¡   r%   rU   rV   Ú	headTableÚuncompressedÚsaveDatar)   r+   rš   Ú
origOffsetÚ
origLengthÚlengthr¢   rf   r¥   )rA   r<   rD   rE   s       r   Ú__setitem__zSFNTWriter.__setitem__  sM  € à�$—+‘+ÑÜÐ8¸3Ñ>Ó?Ð?à×#Ñ#Ó%ˆØˆŒ	Ø×+Ñ+ˆŒØ�&Š=Ü)¨$¨r°¨(°[Ñ*@À4ÈÈÀ9Ñ*LÓMˆEŒNØ!ˆDŒNØ!%ˆEÕä)¨$Ó/ˆEŒNØ�‰�t—y‘y $Ô'à�;‰;˜&Ò Ø#×7Ñ7ˆEÔØ×$Ò$¨×)9Ñ)9¸AÑ)=ÀÑ(CÑCÕ$à#×3Ñ3¸¿¹ÀqÑ8HÈBÑ7NÑOˆÔð
 	�	‰	�‰˜ ×!5Ñ!5¸¿	¹	¿¹Ó8HÑ!HÑIÔJØ×#Ñ# t§y¡y§~¡~Ó'7Ò7Ð7Ð7à�‰�c˜5Õ!r   c                 ó    — | j                   |   S rH   rI   rJ   s     r   rZ   zSFNTWriter.__getitem__.  s   € Ø�{‰{˜3ÑÐr   c                 óh  — t        | j                  j                  «       «      }t        |«      | j                  k7  r#t        d| j                  t        |«      fz  «      ‚| j                  dk(  �rØd| _        d| _        d| _	        | xj                  dt        |«      z  z  c_	        |D ]*  \  }}| xj                  |j                  dz   dz  z  c_	        Œ, | j                  r| j                  n	t        «       }|j                  �/|j                  �#|j                  | _        |j                  | _        nKt        | d
«      r1t!        j"                  d| j$                  dd «      \  | _        | _        ndx| _        | _        |j&                  r–t        |j&                  «      | _        | j*                  j-                  dd«       | j*                  j/                  «       | _        t3        |j&                  «      }t        |«      | _        | j*                  j7                  |«       ndx| _        x| _        | _        |j8                  r¾| j*                  j-                  dd«       | j*                  j/                  «       }|dz   dz  }| j*                  j7                  d||z
  z  «       | j*                  j/                  «       | _        t        |j8                  «      | _        | j*                  j7                  |j8                  «       ndx| _        | _        | j*                  j-                  dd«       | j*                  j/                  «       | _        n!| j                  rJ d| j                  z  «       ‚	 tA        jB                  | jD                  | «      }| j*                  j-                  | jF                  | jH                  z   «       d}	|D ]  \  }}|dk(  rd}	||jK                  «       z   }Œ! |	r| jM                  |«       | j*                  j-                  | jF                  «       | j*                  j7                  |«       y	)zTAll tables must have been written to disk. Now write the
        directory.
        z-wrong number of tables; expected %d, found %dr    r   r   rS   r”   rw   r§   Nr¨   z>HHr   rQ   r~   r•   r‘   rP   r   )'r=   r?   r>   r3   r:   r   r+   r˜   ÚreservedÚtotalSfntSizer¬   r,   r@   ÚmajorVersionÚminorVersionÚhasattrÚstructr4   r¨   ÚmetaDataÚmetaOrigLengthr)   r   rf   Ú
metaOffsetr‚   Ú
metaLengthr¢   ÚprivDataÚ
privOffsetÚ
privLengthr­   r   Úpackr–   rŸ   r—   ÚtoStringÚwriteMasterChecksum)
rA   r?   r<   rE   rD   ÚcompressedMetaDataÚoffÚ	paddedOffÚ	directoryÚseenHeads
             r   r^   zSFNTWriter.close1  sM  € ô ˜Ÿ™×)Ñ)Ó+Ó,ˆÜˆv‹;˜$Ÿ.™.Ò(ÜØ?Ø—>‘>¤3 v£;Ð/ñ0óð ð
 �;‰;˜&Ó Ø$ˆDŒNØˆDŒMà!#ˆDÔØ×Ò "¤s¨6£{Ñ"2Ñ2ÕØ$ò B‘
��UØ×"Ò" u×'7Ñ'7¸!Ñ';¸rÑ&AÑAÖ"ðBð '+§o¢o�4—?’?¼>Ó;KˆDØ× Ñ Ð,°×1BÑ1BÐ1NØ$(×$5Ñ$5�Ô!Ø$(×$5Ñ$5�Õ!ä˜4 Ô-Ü;A¿=¹=Ø˜tŸ~™~¨a°Ð2ó<Ñ8�DÔ% tÕ'8ð =>Ð=�DÔ%¨Ô(9Ø�}Š}Ü&)¨$¯-©-Ó&8�Ô#Ø—	‘	—‘˜q !Ô$Ø"&§)¡)§.¡.Ó"2�”Ü%-¨d¯m©mÓ%<Ð"Ü"%Ð&8Ó"9�”Ø—	‘	—‘Ð 2Õ3àJKÐK�”ÐK $¤/°DÔ4GØ�}Š}Ø—	‘	—‘˜q !Ô$Ø—i‘i—n‘nÓ&�Ø  1™W¨™N�	Ø—	‘	—‘ ¨°S©Ñ 9Ô:Ø"&§)¡)§.¡.Ó"2�”Ü"% d§m¡mÓ"4�”Ø—	‘	—‘ §¡Õ.à45Ð5�” $¤/à�I‰I�N‰N˜1˜aÔ ØŸ)™)Ÿ.™.Ó*ˆD�Kð —{’{ÐGÐ$9¸D¿K¹KÑ$GÓG�?Øä—L‘L ×!5Ñ!5°tÓ<ˆ	à�	‰	�‰�t×+Ñ+¨d×.@Ñ.@Ñ@ÔAØˆØ ò 	5‰JˆC�Ø�fŠ}Ø�Ø! E§N¡NÓ$4Ñ4‰Ið	5ñ Ø×$Ñ$ YÔ/Ø�	‰	�‰�t×+Ñ+Ô,Ø�	‰	�‰˜	Õ"r   c                 ól  — t        | j                  j                  «       «      }g }t        t	        |«      «      D ]-  }|j                  | j                  ||      j                  «       Œ/ | j                  t        k7  rÔddl	m
}  || j                  d«      \  | _        | _        | _        t        j                   t"        | «      }t%        | j                  j'                  «       «      }|D ]f  \  }}t        «       }	|j(                  |	_        |j                  |	_        |j*                  |	_        |j.                  |	_        ||	j3                  «       z   }Œh t4        t	        | j                  «      t6        z  z   }
|
t	        |«      k(  sJ ‚|j                  t9        |«      «       t;        |«      dz  }d|z
  dz  }|S )Nr   r’   r”   ì   ÿÿ l   º/ac )Úlistr?   rM   r9   r3   ÚappendrV   r.   r-   r›   r“   r:   rœ   r�   rž   r   r¾   r5   r=   r>   r<   r«   r%   r¬   r­   r¿   r2   r™   rU   Úsum)rA   rÄ   ÚtagsÚ	checksumsr&   r“   r?   r<   rE   Ú	sfntEntryÚdirectory_endrY   Úchecksumadjustments                r   Ú_calcMasterChecksumzSFNTWriter._calcMasterChecksumx  s}  € ä�D—K‘K×$Ñ$Ó&Ó'ˆØˆ	Ü”s˜4“yÓ!ò 	<ˆAØ×Ñ˜TŸ[™[¨¨a©Ñ1×:Ñ:Õ;ð	<ð ×ÑÔ"4Ò4å6áDRØ—‘ óEÑAˆDÔ˜dÔ0°$´/ô  Ÿ™Ô%8¸$Ó?ˆIÜ˜DŸK™K×-Ñ-Ó/Ó0ˆFØ$ò =‘
��UÜ.Ó0�	Ø %§	¡	�	”Ø%*§^¡^�	Ô"Ø#(×#3Ñ#3�	Ô Ø#(×#3Ñ#3�	Ô Ø%¨	×(:Ñ(:Ó(<Ñ<‘	ð=ô *¬C°·±Ó,<Ô?UÑ,UÑUˆØ¤ I£Ò.Ð.Ð.à×Ñœ iÓ0Ô1Ü�y“> JÑ.ˆà(¨8Ñ3°zÑAÐØ!Ð!r   c                 óî   — | j                  |«      }| j                  j                  | j                  d   j                  dz   «       | j                  j                  t        j                  d|«      «       y )NrP   rQ   z>L)rÐ   r)   r   r?   r%   r¢   r¶   r¾   )rA   rÄ   rÏ   s      r   rÀ   zSFNTWriter.writeMasterChecksum™  sS   € Ø!×5Ñ5°iÓ@Ðà�	‰	�‰�t—{‘{ 6Ñ*×1Ñ1°AÑ5Ô6Ø�	‰	�‰œŸ™ DÐ*<Ó=Õ>r   c                  ó   — y©NFru   rN   s    r   ÚreordersTableszSFNTWriter.reordersTablesŸ  s   € Ør   )r!   NN)rq   rr   rs   r   rF   r¥   r®   rZ   r^   rÐ   rÀ   rÔ   ru   r   r   r‹   r‹   Æ   s>   „ ò#ð, 'ØØó/$òb!ò"ò< òE#òN"òB?ór   r‹   a  
		> # big endian
		TTCTag:                  4s # "ttcf"
		Version:                 L  # 0x00010000 or 0x00020000
		numFonts:                L  # number of fonts
		# OffsetTable[numFonts]: L  # array with offsets from beginning of file
		# ulDsigTag:             L  # version 2.0 only
		# ulDsigLength:          L  # version 2.0 only
		# ulDsigOffset:          L  # version 2.0 only
zä
		> # big endian
		sfntVersion:    4s
		numTables:      H    # number of tables
		searchRange:    H    # (max2 <= numTables)*16
		entrySelector:  H    # log2(max2 <= numTables)
		rangeShift:     H    # numTables*16-searchRange
zc
		> # big endian
		tag:            4s
		checkSum:       L
		offset:         L
		length:         L
ab  
		> # big endian
		signature:      4s   # "wOFF"
		sfntVersion:    4s
		length:         L    # total woff file size
		numTables:      H    # number of tables
		reserved:       H    # set to 0
		totalSfntSize:  L    # uncompressed size
		majorVersion:   H    # major version of WOFF file
		minorVersion:   H    # minor version of WOFF file
		metaOffset:     L    # offset to metadata block
		metaLength:     L    # length of compressed metadata
		metaOrigLength: L    # length of uncompressed metadata
		privOffset:     L    # offset to private data block
		privLength:     L    # length of private data block
zº
		> # big endian
		tag:            4s
		offset:         L
		length:         L    # compressed length
		origLength:     L    # original length
		checkSum:       L    # original checksum
c                   óB   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)r.   c                 ó   — d| _         y rÓ   )r©   rN   s    r   rF   zDirectoryEntry.__init__ç  s
   € Ø!ˆÕr   c                 óx   — t        j                  | j                  |j                  | j                  «      | «       y rH   )r   r4   Úformatr   r    )rA   r)   s     r   r;   zDirectoryEntry.fromFileê  s#   € Ü�‰�t—{‘{ D§I¡I¨d¯o©oÓ$>ÀÕEr   c                 óF   — t        j                  | j                  || «       y rH   )r   r4   rØ   )rA   Ústrs     r   Ú
fromStringzDirectoryEntry.fromStringí  s   € Ü�‰�t—{‘{ C¨Õ.r   c                 óB   — t        j                  | j                  | «      S rH   )r   r¾   rØ   rN   s    r   r¿   zDirectoryEntry.toStringð  s   € Ü�|‰|˜DŸK™K¨Ó.Ð.r   c                 óÀ   — t        | d«      r/d| j                  j                  | j                  t	        | «      fz  S d| j                  j                  t	        | «      fz  S )Nr<   z<%s '%s' at %x>z
<%s at %x>)rµ   Ú	__class__rq   r<   ÚidrN   s    r   Ú__repr__zDirectoryEntry.__repr__ó  sN   € Ü�4˜ÔØ$¨¯©×(?Ñ(?ÀÇÁÌ2ÈdË8Ð'TÑTÐTà 4§>¡>×#:Ñ#:¼B¸t»HÐ"EÑEÐEr   c                 óô   — |j                  | j                  «       |j                  | j                  «      }t	        |«      | j                  k(  sJ ‚t        | j                  d«      r| j                  |«      }|S )NÚ
decodeData)r   r%   r   r­   r3   rµ   rÞ   râ   ©rA   r)   rD   s      r   rT   zDirectoryEntry.loadDataù  s[   € Ø�	‰	�$—+‘+ÔØ�y‰y˜Ÿ™Ó%ˆÜ�4‹y˜DŸK™KÒ'Ð'Ð'Ü�4—>‘> <Ô0Ø—?‘? 4Ó(ˆDØˆr   c                 óÊ   — t        | j                  d«      r| j                  |«      }t        |«      | _        |j                  | j                  «       |j                  |«       y )NÚ
encodeData)rµ   rÞ   rå   r3   r­   r   r%   r¢   rã   s      r   rª   zDirectoryEntry.saveData  sE   € Ü�4—>‘> <Ô0Ø—?‘? 4Ó(ˆDÜ˜$“iˆŒØ�	‰	�$—+‘+ÔØ�
‰
�4Õr   c                 ó   — |S rH   ru   )rA   ÚrawDatas     r   râ   zDirectoryEntry.decodeData  s   € Øˆr   c                 ó   — |S rH   ru   )rA   rD   s     r   rå   zDirectoryEntry.encodeData  s   € Øˆr   N)rq   rr   rs   rF   r;   rÛ   r¿   rà   rT   rª   râ   rå   ru   r   r   r.   r.   æ  s1   „ ò"òFò/ò/òFòòòór   r.   c                   ó   — e Zd ZeZeZy)r-   N)rq   rr   rs   ÚsfntDirectoryEntryFormatrØ   r™   r    ru   r   r   r-   r-     s   „ Ø%€FØ'�Jr   r-   c                   ó2   ‡ — e Zd ZeZeZˆ fd„Zd„ Zd„ Z	ˆ xZ
S )r6   c                 ób   •— t         t        | �  «        t        t        d«      st        | _        y y )NÚzlibCompressionLevel)Úsuperr6   rF   rµ   ÚZLIB_COMPRESSION_LEVELrí   )rA   rÞ   s    €r   rF   zWOFFDirectoryEntry.__init__  s-   ø€ ÜÔ  $Ñ0Ô2ô Ô)Ð+AÔBÜ(>ˆDÕ%ð Cr   c                 óÔ   — dd l }| j                  | j                  k(  r|}|S | j                  | j                  k  sJ ‚|j                  |«      }t	        |«      | j                  k(  sJ ‚|S ©Nr   )r†   r­   r¬   Ú
decompressr3   )rA   rç   r†   rD   s       r   râ   zWOFFDirectoryEntry.decodeData#  sb   € Ûà�;‰;˜$Ÿ/™/Ò)ØˆDð
 ˆð —;‘; §¡Ò0Ð0Ð0Ø—?‘? 7Ó+ˆDÜ�t“9 §¡Ò/Ð/Ð/Øˆr   c                 ó   — t        |«      | _        | j                  st        || j                  «      }| j                  st        «      | j                  k\  r|}| j                  | _        |S |}t        |«      | _        |S rH   )r3   r¬   r©   r‚   rí   r­   )rA   rD   ÚcompressedDatarç   s       r   rå   zWOFFDirectoryEntry.encodeData.  so   € Ü˜d›)ˆŒØ× Ò Ü% d¨D×,EÑ,EÓFˆNØ×Ò¤ NÓ 3°t·±Ò FàˆGØŸ/™/ˆDŒKð ˆð %ˆGÜ˜g›,ˆDŒKØˆr   )rq   rr   rs   ÚwoffDirectoryEntryFormatrØ   ÚwoffDirectoryEntrySizer    rF   râ   rå   Ú__classcell__)rÞ   s   @r   r6   r6     s   ø„ Ø%€FØ'€Jô	?ò	ör   r6   c                   ó   — e Zd ZdZdd„Zd„ Zy)r@   r    Nc                 ó¼  — d | _         d | _        d | _        d | _        |�r=|j                   | _         |j                  | _        |j                  r–|j
                  j                  |j                  «       |j
                  j                  |j                  «      }t        |«      |j                  k(  sJ ‚| j                  |«      }t        |«      |j                  k(  sJ ‚|| _        |j                  rl|j
                  j                  |j                  «       |j
                  j                  |j                  «      }t        |«      |j                  k(  sJ ‚|| _        y y y rH   )r³   r´   r·   r»   rº   r)   r   r¹   r   r3   Ú_decompressr¸   r½   r¼   )rA   Úreaderrç   rD   s       r   rF   zWOFFFlavorData.__init__?  s%  € Ø ˆÔØ ˆÔØˆŒØˆŒÚØ &× 3Ñ 3ˆDÔØ &× 3Ñ 3ˆDÔØ× Ò Ø—‘× Ñ  ×!2Ñ!2Ô3Ø Ÿ+™+×*Ñ*¨6×+<Ñ+<Ó=�Ü˜7“| v×'8Ñ'8Ò8Ð8Ð8Ø×'Ñ'¨Ó0�Ü˜4“y F×$9Ñ$9Ò9Ð9Ð9Ø $�”Ø× Ò Ø—‘× Ñ  ×!2Ñ!2Ô3Ø—{‘{×'Ñ'¨×(9Ñ(9Ó:�Ü˜4“y F×$5Ñ$5Ò5Ð5Ð5Ø $�•ð	 !ð r   c                 ó,   — dd l }|j                  |«      S rñ   )r†   rò   )rA   rç   r†   s      r   rú   zWOFFFlavorData._decompressT  s   € Ûà�‰˜wÓ'Ð'r   rH   )rq   rr   rs   ÚFlavorrF   rú   ru   r   r   r@   r@   <  s   „ Ø€Fó%ó*(r   r@   c                 ó
  — t        | «      dz  }|r| dd|z
  z  z  } d}d}|dz  dk(  sJ ‚t        dt        | «      |«      D ]@  }| |||z    }t        j                  dt        |«      dz  z  |«      }|t	        |«      z   dz  }ŒB |S )a,  Calculate the checksum for an arbitrary block of data.

    If the data length is not a multiple of four, it assumes
    it is to be padded with null byte.

            >>> print(calcChecksum(b"abcd"))
            1633837924
            >>> print(calcChecksum(b"abcdxyz"))
            3655064932
    r   r•   r   i   ú>%dLrÇ   )r3   r9   r¶   r4   rÊ   )rD   Ú	remainderÚvalueÚ	blockSizer&   ÚblockÚlongss          r   rU   rU   Z  s¦   € ô �D“	˜A‘€IÙØ�˜˜Y™Ñ'Ñ'ˆØ€EØ€IØ�q‰=˜AÒÐÐÜ�1”c˜$“i Ó+ò 2ˆØ�Q˜˜Y™Ð'ˆÜ—‘˜f¬¨E«
°a©Ñ8¸%Ó@ˆØœ˜U›Ñ# zÑ1‰ð2ð €Lr   c                 ó  — | j                  d«       | j                  t        «      }t        |«      t        k7  rt	        d«      ‚t        «       }t        j                  t        ||«       |j                  dk7  rt	        d«      ‚|j                  dk(  s#|j                  dk(  sJ d|j                  z  «       ‚t        j                  d|j                  z  | j                  |j                  d	z  «      «      |_        |j                  dk(  r	 |S )
Nr   r   ÚttcfzNot a Font Collectioné   i   zunrecognized TTC version 0x%08xrÿ   r   )r   r   ÚttcHeaderSizer3   r   r   r   r4   ÚttcHeaderFormatÚTTCTagÚVersionr¶   r0   r1   )r)   rD   rA   s      r   r/   r/   r  sÜ   € Ø‡I�Iˆa„LØ�9‰9”]Ó#€DÜ
ˆ4ƒy”MÒ!ÜÐBÓCÐCÜÓ€DÜ‡N�N”? D¨$Ô/Ø‡{�{�fÒÜÐ0Ó1Ð1Ø�<‰<˜:Ò%¨¯©¸Ò)Cð Ø)¨D¯L©LÑ8óÐCô —}‘}Ø�—‘Ñ §	¡	¨$¯-©-¸!Ñ*;Ó <ó€DÔð ‡|�|�zÒ!ØØ€Kr   c                 óX  — t        «       }d|_        d|_        ||_        | j	                  d«       | j                  t        j                  t        |«      «       | j                  «       }| j                  t        j                  d|j                  z  gdg|j                  z  ¢­Ž «       |S )Nr  r  r   rÿ   )r   r
  r  r0   r   r¢   r   r¾   r	  rf   r¶   )r)   r0   rA   r%   s       r   ÚwriteTTCHeaderr  †  s   € ÜÓ€DØ€D„KØ€D„LØ€D„MØ‡I�Iˆa„LØ‡J�JŒw�|‰|œO¨TÓ2Ô3Ø�Y‰Y‹[€FØ‡J�JŒv�{‰{˜6 D§M¡MÑ1ÐJ°a°S¸4¿=¹=Ñ5HÒJÔKØ€Mr   Ú__main__)1Ú__doc__Úior   Útypesr   ÚfontTools.misc.textToolsr   ÚfontTools.miscr   r›   r   r   r¶   Úcollectionsr	   ÚloggingÚ	getLoggerrq   rW   r   r   rï   r…   rˆ   r‚   r‹   r	  Úcalcsizer  r5   r2   rê   r™   r8   r7   rõ   rö   r.   r-   r6   r@   rU   r/   r  ÚsysÚdoctestÚexitÚtestmodÚfailedru   r   r   ú<module>r     s˜  ðñõ Ý !Ý (Ý "ß BÛ Ý #Û ð €g×Ñ˜Ó!€ô|$�ô |$ð@ Ð ð €
ð 	ØØØØ	Ø	Ø	Ø	Ø
ñ€ð 0ó Bô&Z�ô Zð~	€ð !�× Ñ  Ó1€ðÐ ð %�G×$Ñ$Ð%8Ó9Ð ðÐ ð *˜×)Ñ)Ð*BÓCÐ ðÐ ð" %�G×$Ñ$Ð%8Ó9Ð ðÐ ð *˜×)Ñ)Ð*BÓCÐ ô&�Vô &ôR(˜ô (ô
%˜ô %÷P(ñ (ò<ò0ò(	ð ˆzÒÛÛà€C‡H�Hˆ_ˆW�_‰_Ó×%Ñ%Õ&ð	 r   