+
    f7iY  c                   s   R t ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
Ht ^ RIt^ RIHt ^ RIt]P                   ! ]4      t ! R R	]4      t^tR
t^^^^^^^^^^
^^^^^^2^	^d/	t]3R lt ! R R]4      tRt]P6                  ! ]4      tRt]P6                  ! ]4      tRt]P6                  ! ]4      t Rt!]P6                  ! ]!4      t"Rt#]P6                  ! ]#4      t$ ! R R]4      t% ! R R]%4      t& ! R R]%4      t' ! R R4      t(R t)R t*R t+]R8X  d6   ^ RI,t,^ RI-t-],P\                  ! ]-P^                  ! 4       P`                  4       R# R# )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                   s^   a  ] tR t^t o R tRR ltR t]tR tR t	R t
R tR tR	 tR
tV tR# )
SFNTReaderc                s   V'       dr   V \         J dh   V^ ,          pVP                  ^ 4       \        VP                  ^4      4      pVP                  ^ 4       VR8X  d   ^ RIHp \        P                  V4      # \        P                  V 4      # )z]Return an instance of the SFNTReader sub-class which is compatible
with the input file type.
ZwOF2)WOFF2Reader)r   seekr   readfontTools.ttLib.woff2r   object__new__)clsargskwargsZinfilesfntVersionr   s   &*,   ;/usr/lib64/python3.14/site-packages/fontTools/ttLib/sfnt.pyr   ZSFNTReader.__new__   sh     C:%!WFKKNfkk!n-KKKNf$=~~k22~~c""    c                sB   Wn         W n        R V n        R V n        \        V n        V P                   P                  ^ 4       V P                   P                  ^4      V n        V P                   P                  ^ 4       V P                  R8X  d   \        V P                   4      pVP                  p^ Tu;8:  d   V8  g   M \        RV^,
          ,          4      hWPn
        V P                   P                  VP                  V,          4       V P                   P                  \        4      p\        V4      \        8w  d   \        R4      h\         P"                  ! \$        W`4       MV P                  R8X  dm   RV n        \&        V n        V P                   P                  \(        4      p\        V4      \(        8w  d   \        R4      h\         P"                  ! \*        W`4       MYV P                   P                  \        4      p\        V4      \        8w  d   \        R4      h\         P"                  ! \$        W`4       \-        V P                  4      V n        V P                  R9  d   \        R4      h/ p\/        V P0                  4       FG  pV P                  4       p	V	P3                  V P                   4       \-        V	P4                  4      p
WV
&   KI  	  \7        \9        VP;                  4       R	 R
7      4      V n        V P                  R8X  d   \?        V 4      V n        R # R # )Ns   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)z1Not a TrueType or OpenType font (bad sfntVersion)c                 s(    V ^,          P                   # )i   )offset)i   &r   Z<lambda>Z%SFNTReader.__init__.<locals>.<lambda>]   s    qt{{r   )Zkey)   ZOTTOZtrue) 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   Z
fontNumberZheaderr"   datar1   r   entryr.   s   &&&&       r   __init__ZSFNTReader.__init__/   sI   	,0		q99>>!,		qw&"499-FH
-X-0H!|%  %MIINN6--j9:99>>"34D4y-- !JKKNN.;( DK"4D99>>"34D4y-- !DEENN.;99>>"34D4y-- !TUUNN.;t//0#GGPQQt~~&A'')ENN499%eii.C3K	 '
 "&=R"ST ;;& ,T2DO !r   c                s    WP                   9   # Nr1   r3   r.      &&r   has_keyZSFNTReader.has_keyc   s    kk!!r   c                s6    V P                   P                  4       # r7   )r1   keysr3   r   r   r<   ZSFNTReader.keysh   s    {{!!r   c                s   V P                   \        V4      ,          pVP                  V P                  4      pV P                  '       d   VR8X  d)   \        VR,          R,           VR,          ,           4      pM\        V4      pV P                  ^8  d"   WBP                  8X  g   Q RV,          4       h V# WBP                  8w  d   \        P                  RV4       V# )zFetch the raw table data.headN   N       i   NNzbad checksum for '%s' table)	r1   r   loadDatar   r   calcChecksumcheckSumlogZwarning)r3   r.   r5   r4   checksums   &&   r   __getitem__ZSFNTReader.__getitem__k   s    CH%~~dii(f}'R;(>c(JK'-""Q&>>1V3PSV3VV1  ^^+93?r   c                s2    V P                   \        V4       R # r7   )r1   r   r9   r:   r   __delitem__ZSFNTReader.__delitem__}   s    KKC!r   c                s:    V P                   P                  4        R # r7   )r   closer=   r   r   rJ   ZSFNTReader.close   s    		r   c                s   \        V P                  \        4      '       d   V P                  # V P                  P	                  4       pVR  V P                  P
                  VR&   V P                  P                  4       VR&   V# )r   	_filename_filepos)Z
isinstancer   r    __dict__ZcopyZnametellr3   Zstates   & r   __getstate__ZSFNTReader.__getstate__   sd    dii))==  ""$&M!YY^^k IINN,jr   c                s    R V9  dK   \        VP                  R4      R4      V n        V P                  P                  VP                  R4      4       V P                  P                  V4       R# )r   rK   ZrbrL   N)ZopenZpopr   r	   rM   ZupdaterO   r:   r   __setstate__ZSFNTReader.__setstate__   sL    UYY{3T:DIIINN599Z01U#r   )r    r   r   r   r   r"   r   r1   N)    i)__name__
__module____qualname____firstlineno__r   r6   r;   Z__contains__r<   rH   rI   rJ   rP   rQ   __static_attributes____classdictcell____classdict__   @r   r   r      s?     #"23h" L"$"
$ $r   r   Fc                s    ^ Tu;8:  d   ^	8:  g   M \        RV,          4      h\        '       d   V^ 8X  d   ^ RIHp V! W4      # ^ RIHp V! V \
        V,          R7      # )a1  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).
zBad compression level: %s)compress)Znumiterations)Z
ValueError
USE_ZOPFLIzlibr\   Zzopfli.zlibZOPFLI_LEVELS)r4   Zlevelr\      && r   r\   r\      sN     O!O4u<==:!!$$(M%,@AAr   c                   sZ   a  ] tR t^t o R tRR ltR tR tR tR t	R t
R	 tR
 tRtV tR# )
SFNTWriterc                s    RpV'       d   RV9   d   VR,          pM!V'       d   \        V4      ^8  d
   V^,          pV \        J d#   VR8X  d   ^ RIHp \        P                  V4      # \        P                  V 4      # )z`Return an instance of the SFNTWriter sub-class which is compatible
with the specified 'flavor'.
Nr   Zwoff2)WOFF2Writer)r%   ra   r   rb   r   r   )r   r   r   r   rb   s   &*,  r   r   ZSFNTWriter.__new__   sd     h&(H%Fc$i!m!WF* =~~k22~~c""r   Nc                s   Wn         W n        \        V4      V n        W@n        WPn        V P                  R 8X  dG   \        V n        \        V n	        \        V n        RV n        \        V\        ,          ,           V n        MmV P                  '       d   Q RV P                  ,          4       h\         V n        \        V n	        \"        V n        ^ RIHp V! V^4      w  V n        V n        V n        V P                   P/                  4       V n        V P0                  V P                  ,           W P                  P2                  ,          ,           V n        V P                   P7                  V P4                  4       V P                   P9                  RV P4                  V P                   P/                  4       ,
          ,          4       \;        4       V n        R# )r   ZwOFFUnknown flavor '%s'getSearchRange    N)r   r,   r   r   r   r   r*   directoryFormatr)   directorySizer(   r    	signaturer$   sfntDirectoryEntrySizeorigNextTableOffsetr'   r   fontTools.ttLibre   searchRangeentrySelector
rangeShiftrN   directoryOffset
formatSizenextTableOffsetr	   writer   r1   )r3   r   r,   r   r   r   re   s   &&&&&& r   r6   ZSFNTWriter.__init__   sX    	"{+$;;& #6D !2D"4D#DN "I0F$FF $ {{{G$9DKK$GG?#6D !2D"4D6DR2EADd0$/  $yy~~/    !--8889 	 			t++,		!5!5		8H!HIJ!mr   c                sf    WP                   9   d   \        R V,          4      hW P                   V&   R# )cannot rewrite '%s' tableN)r1   r   )r3   r.   r5      &&&r   setEntryZSFNTWriter.setEntry
  s)    ++83>?? Cr   c                s   WP                   9   d   \        RV,          4      hV P                  4       pWn        V P                  Vn        VR8X  d;   \        VR,          R,           VR,          ,           4      Vn        W n        RVn	        M\        V4      Vn        VP                  V P                  V4       V P                  R8X  dC   V P                  Vn        V ;P                  VP                  ^,           R
,          ,          un        V P                  VP                   ^,           R
,          ,           V n        V P                  P#                  RV P                  V P                  P%                  4       ,
          ,          4       V P                  V P                  P%                  4       8X  g   Q hV P'                  W4       R	# )zWrite raw table data to disk.rt   r>   r?   rA   rB   Tr   rf   N)r1   r   r    r.   rr   r   rD   rE   	headTableuncompressedsaveDatar   r   rk   
origOffset
origLengthlengthrs   rN   rv   )r3   r.   r4   r5   s   &&& r   __setitem__ZSFNTWriter.__setitem__  sA   ++83>??##%	++&=)$r([*@49*LMEN!N!%E)$/ENtyy$';;& #77E$$)9)9A)=(CC$#33q8HB7NO
 			!5!5		8H!HIJ##tyy~~'7777c!r   c                s(    V P                   V,          # r7   r8   r9   r:   r   rH   ZSFNTWriter.__getitem__.  s    {{3r   c                s:	   \        V P                  P                  4       4      p\        V4      V P                  8w  d(   \        RV P                  \        V4      3,          4      hV P                  R8X  Ed   RV n        ^ V n        ^V n	        V ;P                  ^\        V4      ,          ,          un	        V F6  w  r#V ;P                  VP                  ^,           R,          ,          un	        K8  	  V P                  '       d   V P                  M	\        4       pVP                  e2   VP                  e$   VP                  V n        VP                  V n        MV\        V R4      '       d7   \         P"                  ! RV P$                  R,          4      w  V n        V n        M^ ;V n        V n        VP&                  '       d   \        VP&                  4      V n        V P*                  P-                  ^ ^4       V P*                  P/                  4       V n        \3        VP&                  4      p\        V4      V n        V P*                  P7                  V4       M^ ;V n        ;V n        V n        VP8                  '       d   V P*                  P-                  ^ ^4       V P*                  P/                  4       pV^,           R,          pV P*                  P7                  RWv,
          ,          4       V P*                  P/                  4       V n        \        VP8                  4      V n        V P*                  P7                  VP8                  4       M^ ;V n        V n        V P*                  P-                  ^ ^4       V P*                  P/                  4       V n        M+V P                  '       d   Q R	V P                  ,          4       h \@        PB                  ! V PD                  V 4      pV P*                  P-                  V PF                  V PH                  ,           4       ^ p	V F$  w  r#VR
8X  d   ^p	WPK                  4       ,           pK&  	  V	'       d   V PM                  V4       V P*                  P-                  V PF                  4       V P*                  P7                  V4       R# )zDAll tables must have been written to disk. Now write the
directory.
z-wrong number of tables; expected %d, found %dr   r   Nrx   z>HH:i   r@   Nrf   rc   r>   rw   )'r/   r1   r0   r%   r,   r   r   ri   reservedtotalSfntSizer|   r   r2   majorVersionminorVersionhasattrstructr&   rx   metaDatametaOrigLengthr   r	   rN   
metaOffsetr\   
metaLengthrs   privData
privOffset
privLengthr}   r   packrg   rp   rh   toStringwriteMasterChecksum)
r3   r1   r.   r5   r4   ZcompressedMetaDataZoffZ	paddedOff	directoryZseenHeads
   &         r   rJ   ZSFNTWriter.close1  sB    ))+,v;$..(?>>3v;/0 
 ;;& $DNDM!#D"s6{"22$
""u'7'7!';r&AA" % '+ooo4??>;KD  ,1B1B1N$($5$5!$($5$5!4--;A==t~~c2<8D%t'8 =>=D%(9}}}&)$--&8#		q!$"&)).."2%-dmm%<""%&8"9		 23JKKK$/D4G}}}		q!$iinn& 1WN			 9:"&)).."2"%dmm"4		.455$/IINN1a ))..*DK {{{G$9DKK$GG?LL!5!5t<			t++d.@.@@A JCf}!NN$44I ! $$Y/		t++,			"r   c                sr   . pV P                   P                  4        F/  pVP                  V P                   V,          P                  4       K1  	  V P                  \
        8w  d   ^ RIHp V! V P                  ^4      w  V n	        V n
        V n        \        P                  ! \        V 4      p\        V P                   P!                  4       4      pV Fi  w  r6\        4       pVP"                  Vn        VP                  Vn        VP$                  Vn        VP(                  Vn        WP-                  4       ,           pKk  	  \.        \1        V P                   4      \2        ,          ,           pV\1        V4      8X  g   Q hVP                  \5        V4      4       \7        V4      R,          p	RV	,
          R,          p
V
# )rR   rd       l   /ac )r1   r<   ZappendrE   r    r   rl   re   r,   rm   rn   ro   r   r   r'   r/   r0   r.   r{   r   r|   r}   r   r$   r%   rj   rD   sum)r3   r   Z	checksumsr.   re   r1   r5   Z	sfntEntryZdirectory_endrG   checksumadjustments   &&         r   _calcMasterChecksumZSFNTWriter._calcMasterChecksumx  sX   	;;##%CT[[-667 & "446DREADd0$/  %8$?IDKK--/0F$
.0	 %			%*^^	"#(#3#3	 #(#3#3	 %(:(:(<<	 % *C,<?U,UUI...i01y>J.(83zA!!r   c                s   V P                  V4      pV P                  P                  V P                  R ,          P                  ^,           4       V P                  P                  \        P                  ! RV4      4       R# )r>   z>LN)r   r   r	   r1   r   rs   r   r   )r3   r   r   r`   r   r   ZSFNTWriter.writeMasterChecksum  sS    !55i@		t{{6*11A56		D*<=>r   c                s    R # )F r=   r   r   reordersTablesZSFNTWriter.reordersTables  s    r   )r    rg   rp   rh   rn   r   r   r   rx   r}   r   r   r   r   r   rr   r,   rk   r   r   ro   r   rm   r   ri   r1   r   )r   NN)rS   rT   rU   rV   r   r6   rv   r~   rH   rJ   r   r   r   rW   rX   rY   r[   r   ra   ra      s;     #$/$b!"< E#N"@? r   ra   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                   sV   a  ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
 tRtV tR# )r    i  c                s    R V n         R# )FN)ry   r=   r   r   r6   ZDirectoryEntry.__init__  s
    !r   c                s|    \         P                  ! V P                  VP                  V P                  4      V 4       R # r7   )r   r&   formatr
   rq   )r3   r   r:   r   r-   ZDirectoryEntry.fromFile  s#    t{{DIIdoo$>Er   c                sH    \         P                  ! V P                  W4       R # r7   )r   r&   r   )r3   Zstrr:   r   
fromStringZDirectoryEntry.fromString  s    t{{C.r   c                sD    \         P                  ! V P                  V 4      # r7   )r   r   r   r=   r   r   r   ZDirectoryEntry.toString  s    ||DKK..r   c                s    \        V R 4      '       d4   RV P                  P                  V P                  \	        V 4      3,          # RV P                  P                  \	        V 4      3,          # )r.   z<%s '%s' at %x>z
<%s at %x>)r   	__class__rS   r.   Zidr=   r   r   __repr__ZDirectoryEntry.__repr__  sQ    4$(?(?2d8'TTT4>>#:#:BtH"EEEr   c                s   VP                  V P                  4       VP                  V P                  4      p\	        V4      V P                  8X  g   Q h\        V P                  R 4      '       d   V P                  V4      pV# )
decodeData)r	   r   r
   r}   r%   r   r   r   r3   r   r4   r`   r   rC   ZDirectoryEntry.loadData  s^    		$++yy%4yDKK'''4>><00??4(Dr   c                s    \        V P                  R 4      '       d   V P                  V4      p\        V4      V n        VP                  V P                  4       VP                  V4       R# )
encodeDataN)r   r   r   r%   r}   r	   r   rs   r   ru   r   rz   ZDirectoryEntry.saveData   sH    4>><00??4(D$i		$++

4r   c                    V# r7   r   )r3   rawDatar:   r   r   ZDirectoryEntry.decodeData  s    r   c                r   r7   r   )r3   r4   r:   r   r   ZDirectoryEntry.encodeData
  s    r   )r}   ry   N)rS   rT   rU   rV   r6   r-   r   r   r   rC   rz   r   r   rW   rX   rY   r[   r   r    r      s9     "F//F r   r    c                   s    ] tR tRt]t]tRtR# )r   i  r   N)	rS   rT   rU   rV   sfntDirectoryEntryFormatr   rj   rq   rW   r   r   r   r   r     s    %F'Jr   r   c                   sF   a a ] tR tRt o]t]tV 3R ltR t	R t
RtVtV ;t# )r(   i  c                sr   < \         \        V `  4        \        \        R 4      '       g   \        V n        R# R# )zlibCompressionLevelN)Zsuperr(   r6   r   ZLIB_COMPRESSION_LEVELr   )r3   r   s   &r   r6   ZWOFFDirectoryEntry.__init__  s0     $02 )+ABB(>D% Cr   c                s    ^ RI pV P                  V P                  8X  d   TpV# V P                  V P                  8  g   Q hVP                  V4      p\	        V4      V P                  8X  g   Q hV# rR   N)r^   r}   r|   
decompressr%   )r3   r   r^   r4      &&  r   r   ZWOFFDirectoryEntry.decodeData"  sb    ;;$//)D
  ;;000??7+Dt9///r   c                s   \        V4      V n        V P                  '       g   \        WP                  4      pV P                  '       g   \        X4      V P                  8  d   TpV P                  V n        V# Tp\        V4      V n        V# r7   )r%   r|   ry   r\   r   r}   )r3   r4   ZcompressedDatar   r   r   r   ZWOFFDirectoryEntry.encodeData-  ss    d)   %d,E,EFNN 3t FG//DK  %Gg,DKr   )r}   r|   r   )rS   rT   rU   rV   woffDirectoryEntryFormatr   woffDirectoryEntrySizerq   r6   r   r   rW   rX   Z__classcell__)r   rZ   s   @@r   r(   r(     s#     %F'J	?	 r   r(   c                   s4   a  ] tR tRt o RtRR ltR tRtV tR# )r2   i;  r   Nc                s   R V n         R V n        R V n        R V n        V'       EdP   VP                   V n         VP                  V n        VP                  '       d   VP
                  P                  VP                  4       VP
                  P                  VP                  4      p\        V4      VP                  8X  g   Q hV P                  V4      p\        V4      VP                  8X  g   Q hW0n        VP                  '       do   VP
                  P                  VP                  4       VP
                  P                  VP                  4      p\        V4      VP                  8X  g   Q hW0n        R # R # R # r7   )r   r   r   r   r   r   r	   r   r
   r%   _decompressr   r   r   )r3   Zreaderr   r4   r   r   r6   ZWOFFFlavorData.__init__>  s)     6 & 3 3D & 3 3D     !2!23 ++**6+<+<=7|v'8'8888''04yF$9$9999 $     !2!23{{''(9(9:4yF$5$5555 $	 ! r   c                s,    ^ RI pVP                  V4      # r   )r^   r   )r3   r   r^   r`   r   r   ZWOFFFlavorData._decompressS  s    w''r   )r   r   r   r   r7   )	rS   rT   rU   rV   ZFlavorr6   r   rW   rX   rY   r[   r   r2   r2   ;  s     F%*( (r   r2   c                sl   \        V 4      ^,          pV'       d   V R^V,
          ,          ,          p ^ pRpV^,          ^ 8X  g   Q h\        ^ \        V 4      V4       FT  pWWC,            p\        P                  ! R\        V4      ^,          ,          V4      pV\	        V4      ,           R,          pKV  	  V# )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
rf   i   >%dLr   )r%   r+   r   r&   r   )r4   Z	remainderZvalueZ	blockSizer   ZblockZlongss   &      r   rD   rD   Y  s     D	AIY''EIq=A1c$i+'fE
a8%@U#z1 , Lr   c                 sD   V P                  ^ 4       V P                  \        4      p\        V4      \        8w  d   \	        R4      h\        4       p\        P                  ! \        W4       VP                  R8w  d   \	        R4      hVP                  R8X  g*   VP                  R8X  g   Q RVP                  ,          4       h\        P                  ! RVP                  ,          V P                  VP                  ^,          4      4      Vn        VP                  R8X  d    V# )rR   r   ttcfzNot a Font Collection   i   zunrecognized TTC version 0x%08xr   )r	   r
   ttcHeaderSizer%   r   r   r   r&   ttcHeaderFormatTTCTagVersionr   r"   r#   )r   r4   r3   s   &  r   r!   r!   q  s    IIaL99]#D
4yM!BCCDNN?D/{{f011<<:%)C )DLL8C }}		$--!*; <D ||z!Kr   c                 sl   \        4       pR Vn        RVn        Wn        V P	                  ^ 4       V P                  \        P                  ! \        V4      4       V P                  4       pV P                  \        P                  ! RVP                  ,          .^ .VP                  ,          O5!  4       V# )r   r   r   )r   r   r   r"   r	   rs   r   r   r   rN   r   )r   r"   r3   r   r   r   writeTTCHeaderr     s}    DDKDLMIIaLJJw||OT23YY[FJJv{{6DMM1JaS4==5HJKMr   Z__main__)1Z__doc__Zior    Ztypesr   ZfontTools.misc.textToolsr   ZfontTools.miscr   rl   r   r   r   Zcollectionsr   ZloggingZ	getLoggerrS   rF   r   r   r   r]   r_   r\   ra   r   Zcalcsizer   r'   r$   r   rj   r*   r)   r   r   r    r   r(   r2   rD   r!   r   ZsysZdoctestZexitZtestmodZfailedr   r   r   <module>r      s    ! ( " B  #  !|$ |$@   
 qqqqrrrrs 0 B&Y Y|	   1  $$%89   !))*BC  " $$%89   !))*BC &V &R( (
% %P( (<0(	 zHHW__%%&	 r   