ImageFont.py 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264
  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # PIL raster font management
  6. #
  7. # History:
  8. # 1996-08-07 fl created (experimental)
  9. # 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3
  10. # 1999-02-06 fl rewrote most font management stuff in C
  11. # 1999-03-17 fl take pth files into account in load_path (from Richard Jones)
  12. # 2001-02-17 fl added freetype support
  13. # 2001-05-09 fl added TransposedFont wrapper class
  14. # 2002-03-04 fl make sure we have a "L" or "1" font
  15. # 2002-12-04 fl skip non-directory entries in the system path
  16. # 2003-04-29 fl add embedded default font
  17. # 2003-09-27 fl added support for truetype charmap encodings
  18. #
  19. # Todo:
  20. # Adapt to PILFONT2 format (16-bit fonts, compressed, single file)
  21. #
  22. # Copyright (c) 1997-2003 by Secret Labs AB
  23. # Copyright (c) 1996-2003 by Fredrik Lundh
  24. #
  25. # See the README file for information on usage and redistribution.
  26. #
  27. from __future__ import annotations
  28. import base64
  29. import os
  30. import sys
  31. import warnings
  32. from enum import IntEnum
  33. from io import BytesIO
  34. from pathlib import Path
  35. from typing import BinaryIO
  36. from . import Image
  37. from ._util import is_directory, is_path
  38. class Layout(IntEnum):
  39. BASIC = 0
  40. RAQM = 1
  41. MAX_STRING_LENGTH = 1_000_000
  42. try:
  43. from . import _imagingft as core
  44. except ImportError as ex:
  45. from ._util import DeferredError
  46. core = DeferredError.new(ex)
  47. def _string_length_check(text):
  48. if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH:
  49. msg = "too many characters in string"
  50. raise ValueError(msg)
  51. # FIXME: add support for pilfont2 format (see FontFile.py)
  52. # --------------------------------------------------------------------
  53. # Font metrics format:
  54. # "PILfont" LF
  55. # fontdescriptor LF
  56. # (optional) key=value... LF
  57. # "DATA" LF
  58. # binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox)
  59. #
  60. # To place a character, cut out srcbox and paste at dstbox,
  61. # relative to the character position. Then move the character
  62. # position according to dx, dy.
  63. # --------------------------------------------------------------------
  64. class ImageFont:
  65. """PIL font wrapper"""
  66. def _load_pilfont(self, filename):
  67. with open(filename, "rb") as fp:
  68. image = None
  69. for ext in (".png", ".gif", ".pbm"):
  70. if image:
  71. image.close()
  72. try:
  73. fullname = os.path.splitext(filename)[0] + ext
  74. image = Image.open(fullname)
  75. except Exception:
  76. pass
  77. else:
  78. if image and image.mode in ("1", "L"):
  79. break
  80. else:
  81. if image:
  82. image.close()
  83. msg = "cannot find glyph data file"
  84. raise OSError(msg)
  85. self.file = fullname
  86. self._load_pilfont_data(fp, image)
  87. image.close()
  88. def _load_pilfont_data(self, file, image):
  89. # read PILfont header
  90. if file.readline() != b"PILfont\n":
  91. msg = "Not a PILfont file"
  92. raise SyntaxError(msg)
  93. file.readline().split(b";")
  94. self.info = [] # FIXME: should be a dictionary
  95. while True:
  96. s = file.readline()
  97. if not s or s == b"DATA\n":
  98. break
  99. self.info.append(s)
  100. # read PILfont metrics
  101. data = file.read(256 * 20)
  102. # check image
  103. if image.mode not in ("1", "L"):
  104. msg = "invalid font image mode"
  105. raise TypeError(msg)
  106. image.load()
  107. self.font = Image.core.font(image.im, data)
  108. def getmask(self, text, mode="", *args, **kwargs):
  109. """
  110. Create a bitmap for the text.
  111. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  112. maximum value of 255. Otherwise, it should have mode ``1``.
  113. :param text: Text to render.
  114. :param mode: Used by some graphics drivers to indicate what mode the
  115. driver prefers; if empty, the renderer may return either
  116. mode. Note that the mode is always a string, to simplify
  117. C-level implementations.
  118. .. versionadded:: 1.1.5
  119. :return: An internal PIL storage memory instance as defined by the
  120. :py:mod:`PIL.Image.core` interface module.
  121. """
  122. _string_length_check(text)
  123. Image._decompression_bomb_check(self.font.getsize(text))
  124. return self.font.getmask(text, mode)
  125. def getbbox(self, text, *args, **kwargs):
  126. """
  127. Returns bounding box (in pixels) of given text.
  128. .. versionadded:: 9.2.0
  129. :param text: Text to render.
  130. :param mode: Used by some graphics drivers to indicate what mode the
  131. driver prefers; if empty, the renderer may return either
  132. mode. Note that the mode is always a string, to simplify
  133. C-level implementations.
  134. :return: ``(left, top, right, bottom)`` bounding box
  135. """
  136. _string_length_check(text)
  137. width, height = self.font.getsize(text)
  138. return 0, 0, width, height
  139. def getlength(self, text, *args, **kwargs):
  140. """
  141. Returns length (in pixels) of given text.
  142. This is the amount by which following text should be offset.
  143. .. versionadded:: 9.2.0
  144. """
  145. _string_length_check(text)
  146. width, height = self.font.getsize(text)
  147. return width
  148. ##
  149. # Wrapper for FreeType fonts. Application code should use the
  150. # <b>truetype</b> factory function to create font objects.
  151. class FreeTypeFont:
  152. """FreeType font wrapper (requires _imagingft service)"""
  153. def __init__(
  154. self,
  155. font: bytes | str | Path | BinaryIO | None = None,
  156. size: float = 10,
  157. index: int = 0,
  158. encoding: str = "",
  159. layout_engine: Layout | None = None,
  160. ) -> None:
  161. # FIXME: use service provider instead
  162. if size <= 0:
  163. msg = "font size must be greater than 0"
  164. raise ValueError(msg)
  165. self.path = font
  166. self.size = size
  167. self.index = index
  168. self.encoding = encoding
  169. if layout_engine not in (Layout.BASIC, Layout.RAQM):
  170. layout_engine = Layout.BASIC
  171. if core.HAVE_RAQM:
  172. layout_engine = Layout.RAQM
  173. elif layout_engine == Layout.RAQM and not core.HAVE_RAQM:
  174. warnings.warn(
  175. "Raqm layout was requested, but Raqm is not available. "
  176. "Falling back to basic layout."
  177. )
  178. layout_engine = Layout.BASIC
  179. self.layout_engine = layout_engine
  180. def load_from_bytes(f):
  181. self.font_bytes = f.read()
  182. self.font = core.getfont(
  183. "", size, index, encoding, self.font_bytes, layout_engine
  184. )
  185. if is_path(font):
  186. if isinstance(font, Path):
  187. font = str(font)
  188. if sys.platform == "win32":
  189. font_bytes_path = font if isinstance(font, bytes) else font.encode()
  190. try:
  191. font_bytes_path.decode("ascii")
  192. except UnicodeDecodeError:
  193. # FreeType cannot load fonts with non-ASCII characters on Windows
  194. # So load it into memory first
  195. with open(font, "rb") as f:
  196. load_from_bytes(f)
  197. return
  198. self.font = core.getfont(
  199. font, size, index, encoding, layout_engine=layout_engine
  200. )
  201. else:
  202. load_from_bytes(font)
  203. def __getstate__(self):
  204. return [self.path, self.size, self.index, self.encoding, self.layout_engine]
  205. def __setstate__(self, state):
  206. path, size, index, encoding, layout_engine = state
  207. self.__init__(path, size, index, encoding, layout_engine)
  208. def getname(self):
  209. """
  210. :return: A tuple of the font family (e.g. Helvetica) and the font style
  211. (e.g. Bold)
  212. """
  213. return self.font.family, self.font.style
  214. def getmetrics(self):
  215. """
  216. :return: A tuple of the font ascent (the distance from the baseline to
  217. the highest outline point) and descent (the distance from the
  218. baseline to the lowest outline point, a negative value)
  219. """
  220. return self.font.ascent, self.font.descent
  221. def getlength(self, text, mode="", direction=None, features=None, language=None):
  222. """
  223. Returns length (in pixels with 1/64 precision) of given text when rendered
  224. in font with provided direction, features, and language.
  225. This is the amount by which following text should be offset.
  226. Text bounding box may extend past the length in some fonts,
  227. e.g. when using italics or accents.
  228. The result is returned as a float; it is a whole number if using basic layout.
  229. Note that the sum of two lengths may not equal the length of a concatenated
  230. string due to kerning. If you need to adjust for kerning, include the following
  231. character and subtract its length.
  232. For example, instead of ::
  233. hello = font.getlength("Hello")
  234. world = font.getlength("World")
  235. hello_world = hello + world # not adjusted for kerning
  236. assert hello_world == font.getlength("HelloWorld") # may fail
  237. use ::
  238. hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning
  239. world = font.getlength("World")
  240. hello_world = hello + world # adjusted for kerning
  241. assert hello_world == font.getlength("HelloWorld") # True
  242. or disable kerning with (requires libraqm) ::
  243. hello = draw.textlength("Hello", font, features=["-kern"])
  244. world = draw.textlength("World", font, features=["-kern"])
  245. hello_world = hello + world # kerning is disabled, no need to adjust
  246. assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"])
  247. .. versionadded:: 8.0.0
  248. :param text: Text to measure.
  249. :param mode: Used by some graphics drivers to indicate what mode the
  250. driver prefers; if empty, the renderer may return either
  251. mode. Note that the mode is always a string, to simplify
  252. C-level implementations.
  253. :param direction: Direction of the text. It can be 'rtl' (right to
  254. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  255. Requires libraqm.
  256. :param features: A list of OpenType font features to be used during text
  257. layout. This is usually used to turn on optional
  258. font features that are not enabled by default,
  259. for example 'dlig' or 'ss01', but can be also
  260. used to turn off default font features for
  261. example '-liga' to disable ligatures or '-kern'
  262. to disable kerning. To get all supported
  263. features, see
  264. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  265. Requires libraqm.
  266. :param language: Language of the text. Different languages may use
  267. different glyph shapes or ligatures. This parameter tells
  268. the font which language the text is in, and to apply the
  269. correct substitutions as appropriate, if available.
  270. It should be a `BCP 47 language code
  271. <https://www.w3.org/International/articles/language-tags/>`_
  272. Requires libraqm.
  273. :return: Either width for horizontal text, or height for vertical text.
  274. """
  275. _string_length_check(text)
  276. return self.font.getlength(text, mode, direction, features, language) / 64
  277. def getbbox(
  278. self,
  279. text,
  280. mode="",
  281. direction=None,
  282. features=None,
  283. language=None,
  284. stroke_width=0,
  285. anchor=None,
  286. ):
  287. """
  288. Returns bounding box (in pixels) of given text relative to given anchor
  289. when rendered in font with provided direction, features, and language.
  290. Use :py:meth:`getlength()` to get the offset of following text with
  291. 1/64 pixel precision. The bounding box includes extra margins for
  292. some fonts, e.g. italics or accents.
  293. .. versionadded:: 8.0.0
  294. :param text: Text to render.
  295. :param mode: Used by some graphics drivers to indicate what mode the
  296. driver prefers; if empty, the renderer may return either
  297. mode. Note that the mode is always a string, to simplify
  298. C-level implementations.
  299. :param direction: Direction of the text. It can be 'rtl' (right to
  300. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  301. Requires libraqm.
  302. :param features: A list of OpenType font features to be used during text
  303. layout. This is usually used to turn on optional
  304. font features that are not enabled by default,
  305. for example 'dlig' or 'ss01', but can be also
  306. used to turn off default font features for
  307. example '-liga' to disable ligatures or '-kern'
  308. to disable kerning. To get all supported
  309. features, see
  310. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  311. Requires libraqm.
  312. :param language: Language of the text. Different languages may use
  313. different glyph shapes or ligatures. This parameter tells
  314. the font which language the text is in, and to apply the
  315. correct substitutions as appropriate, if available.
  316. It should be a `BCP 47 language code
  317. <https://www.w3.org/International/articles/language-tags/>`_
  318. Requires libraqm.
  319. :param stroke_width: The width of the text stroke.
  320. :param anchor: The text anchor alignment. Determines the relative location of
  321. the anchor to the text. The default alignment is top left,
  322. specifically ``la`` for horizontal text and ``lt`` for
  323. vertical text. See :ref:`text-anchors` for details.
  324. :return: ``(left, top, right, bottom)`` bounding box
  325. """
  326. _string_length_check(text)
  327. size, offset = self.font.getsize(
  328. text, mode, direction, features, language, anchor
  329. )
  330. left, top = offset[0] - stroke_width, offset[1] - stroke_width
  331. width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width
  332. return left, top, left + width, top + height
  333. def getmask(
  334. self,
  335. text,
  336. mode="",
  337. direction=None,
  338. features=None,
  339. language=None,
  340. stroke_width=0,
  341. anchor=None,
  342. ink=0,
  343. start=None,
  344. ):
  345. """
  346. Create a bitmap for the text.
  347. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  348. maximum value of 255. If the font has embedded color data, the bitmap
  349. should have mode ``RGBA``. Otherwise, it should have mode ``1``.
  350. :param text: Text to render.
  351. :param mode: Used by some graphics drivers to indicate what mode the
  352. driver prefers; if empty, the renderer may return either
  353. mode. Note that the mode is always a string, to simplify
  354. C-level implementations.
  355. .. versionadded:: 1.1.5
  356. :param direction: Direction of the text. It can be 'rtl' (right to
  357. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  358. Requires libraqm.
  359. .. versionadded:: 4.2.0
  360. :param features: A list of OpenType font features to be used during text
  361. layout. This is usually used to turn on optional
  362. font features that are not enabled by default,
  363. for example 'dlig' or 'ss01', but can be also
  364. used to turn off default font features for
  365. example '-liga' to disable ligatures or '-kern'
  366. to disable kerning. To get all supported
  367. features, see
  368. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  369. Requires libraqm.
  370. .. versionadded:: 4.2.0
  371. :param language: Language of the text. Different languages may use
  372. different glyph shapes or ligatures. This parameter tells
  373. the font which language the text is in, and to apply the
  374. correct substitutions as appropriate, if available.
  375. It should be a `BCP 47 language code
  376. <https://www.w3.org/International/articles/language-tags/>`_
  377. Requires libraqm.
  378. .. versionadded:: 6.0.0
  379. :param stroke_width: The width of the text stroke.
  380. .. versionadded:: 6.2.0
  381. :param anchor: The text anchor alignment. Determines the relative location of
  382. the anchor to the text. The default alignment is top left,
  383. specifically ``la`` for horizontal text and ``lt`` for
  384. vertical text. See :ref:`text-anchors` for details.
  385. .. versionadded:: 8.0.0
  386. :param ink: Foreground ink for rendering in RGBA mode.
  387. .. versionadded:: 8.0.0
  388. :param start: Tuple of horizontal and vertical offset, as text may render
  389. differently when starting at fractional coordinates.
  390. .. versionadded:: 9.4.0
  391. :return: An internal PIL storage memory instance as defined by the
  392. :py:mod:`PIL.Image.core` interface module.
  393. """
  394. return self.getmask2(
  395. text,
  396. mode,
  397. direction=direction,
  398. features=features,
  399. language=language,
  400. stroke_width=stroke_width,
  401. anchor=anchor,
  402. ink=ink,
  403. start=start,
  404. )[0]
  405. def getmask2(
  406. self,
  407. text,
  408. mode="",
  409. direction=None,
  410. features=None,
  411. language=None,
  412. stroke_width=0,
  413. anchor=None,
  414. ink=0,
  415. start=None,
  416. *args,
  417. **kwargs,
  418. ):
  419. """
  420. Create a bitmap for the text.
  421. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  422. maximum value of 255. If the font has embedded color data, the bitmap
  423. should have mode ``RGBA``. Otherwise, it should have mode ``1``.
  424. :param text: Text to render.
  425. :param mode: Used by some graphics drivers to indicate what mode the
  426. driver prefers; if empty, the renderer may return either
  427. mode. Note that the mode is always a string, to simplify
  428. C-level implementations.
  429. .. versionadded:: 1.1.5
  430. :param direction: Direction of the text. It can be 'rtl' (right to
  431. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  432. Requires libraqm.
  433. .. versionadded:: 4.2.0
  434. :param features: A list of OpenType font features to be used during text
  435. layout. This is usually used to turn on optional
  436. font features that are not enabled by default,
  437. for example 'dlig' or 'ss01', but can be also
  438. used to turn off default font features for
  439. example '-liga' to disable ligatures or '-kern'
  440. to disable kerning. To get all supported
  441. features, see
  442. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  443. Requires libraqm.
  444. .. versionadded:: 4.2.0
  445. :param language: Language of the text. Different languages may use
  446. different glyph shapes or ligatures. This parameter tells
  447. the font which language the text is in, and to apply the
  448. correct substitutions as appropriate, if available.
  449. It should be a `BCP 47 language code
  450. <https://www.w3.org/International/articles/language-tags/>`_
  451. Requires libraqm.
  452. .. versionadded:: 6.0.0
  453. :param stroke_width: The width of the text stroke.
  454. .. versionadded:: 6.2.0
  455. :param anchor: The text anchor alignment. Determines the relative location of
  456. the anchor to the text. The default alignment is top left,
  457. specifically ``la`` for horizontal text and ``lt`` for
  458. vertical text. See :ref:`text-anchors` for details.
  459. .. versionadded:: 8.0.0
  460. :param ink: Foreground ink for rendering in RGBA mode.
  461. .. versionadded:: 8.0.0
  462. :param start: Tuple of horizontal and vertical offset, as text may render
  463. differently when starting at fractional coordinates.
  464. .. versionadded:: 9.4.0
  465. :return: A tuple of an internal PIL storage memory instance as defined by the
  466. :py:mod:`PIL.Image.core` interface module, and the text offset, the
  467. gap between the starting coordinate and the first marking
  468. """
  469. _string_length_check(text)
  470. if start is None:
  471. start = (0, 0)
  472. im = None
  473. size = None
  474. def fill(width, height):
  475. nonlocal im, size
  476. size = (width, height)
  477. if Image.MAX_IMAGE_PIXELS is not None:
  478. pixels = max(1, width) * max(1, height)
  479. if pixels > 2 * Image.MAX_IMAGE_PIXELS:
  480. return
  481. im = Image.core.fill("RGBA" if mode == "RGBA" else "L", size)
  482. return im
  483. offset = self.font.render(
  484. text,
  485. fill,
  486. mode,
  487. direction,
  488. features,
  489. language,
  490. stroke_width,
  491. anchor,
  492. ink,
  493. start[0],
  494. start[1],
  495. )
  496. Image._decompression_bomb_check(size)
  497. return im, offset
  498. def font_variant(
  499. self, font=None, size=None, index=None, encoding=None, layout_engine=None
  500. ):
  501. """
  502. Create a copy of this FreeTypeFont object,
  503. using any specified arguments to override the settings.
  504. Parameters are identical to the parameters used to initialize this
  505. object.
  506. :return: A FreeTypeFont object.
  507. """
  508. if font is None:
  509. try:
  510. font = BytesIO(self.font_bytes)
  511. except AttributeError:
  512. font = self.path
  513. return FreeTypeFont(
  514. font=font,
  515. size=self.size if size is None else size,
  516. index=self.index if index is None else index,
  517. encoding=self.encoding if encoding is None else encoding,
  518. layout_engine=layout_engine or self.layout_engine,
  519. )
  520. def get_variation_names(self):
  521. """
  522. :returns: A list of the named styles in a variation font.
  523. :exception OSError: If the font is not a variation font.
  524. """
  525. try:
  526. names = self.font.getvarnames()
  527. except AttributeError as e:
  528. msg = "FreeType 2.9.1 or greater is required"
  529. raise NotImplementedError(msg) from e
  530. return [name.replace(b"\x00", b"") for name in names]
  531. def set_variation_by_name(self, name):
  532. """
  533. :param name: The name of the style.
  534. :exception OSError: If the font is not a variation font.
  535. """
  536. names = self.get_variation_names()
  537. if not isinstance(name, bytes):
  538. name = name.encode()
  539. index = names.index(name) + 1
  540. if index == getattr(self, "_last_variation_index", None):
  541. # When the same name is set twice in a row,
  542. # there is an 'unknown freetype error'
  543. # https://savannah.nongnu.org/bugs/?56186
  544. return
  545. self._last_variation_index = index
  546. self.font.setvarname(index)
  547. def get_variation_axes(self):
  548. """
  549. :returns: A list of the axes in a variation font.
  550. :exception OSError: If the font is not a variation font.
  551. """
  552. try:
  553. axes = self.font.getvaraxes()
  554. except AttributeError as e:
  555. msg = "FreeType 2.9.1 or greater is required"
  556. raise NotImplementedError(msg) from e
  557. for axis in axes:
  558. axis["name"] = axis["name"].replace(b"\x00", b"")
  559. return axes
  560. def set_variation_by_axes(self, axes):
  561. """
  562. :param axes: A list of values for each axis.
  563. :exception OSError: If the font is not a variation font.
  564. """
  565. try:
  566. self.font.setvaraxes(axes)
  567. except AttributeError as e:
  568. msg = "FreeType 2.9.1 or greater is required"
  569. raise NotImplementedError(msg) from e
  570. class TransposedFont:
  571. """Wrapper for writing rotated or mirrored text"""
  572. def __init__(self, font, orientation=None):
  573. """
  574. Wrapper that creates a transposed font from any existing font
  575. object.
  576. :param font: A font object.
  577. :param orientation: An optional orientation. If given, this should
  578. be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM,
  579. Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or
  580. Image.Transpose.ROTATE_270.
  581. """
  582. self.font = font
  583. self.orientation = orientation # any 'transpose' argument, or None
  584. def getmask(self, text, mode="", *args, **kwargs):
  585. im = self.font.getmask(text, mode, *args, **kwargs)
  586. if self.orientation is not None:
  587. return im.transpose(self.orientation)
  588. return im
  589. def getbbox(self, text, *args, **kwargs):
  590. # TransposedFont doesn't support getmask2, move top-left point to (0, 0)
  591. # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont
  592. left, top, right, bottom = self.font.getbbox(text, *args, **kwargs)
  593. width = right - left
  594. height = bottom - top
  595. if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
  596. return 0, 0, height, width
  597. return 0, 0, width, height
  598. def getlength(self, text, *args, **kwargs):
  599. if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
  600. msg = "text length is undefined for text rotated by 90 or 270 degrees"
  601. raise ValueError(msg)
  602. return self.font.getlength(text, *args, **kwargs)
  603. def load(filename):
  604. """
  605. Load a font file. This function loads a font object from the given
  606. bitmap font file, and returns the corresponding font object.
  607. :param filename: Name of font file.
  608. :return: A font object.
  609. :exception OSError: If the file could not be read.
  610. """
  611. f = ImageFont()
  612. f._load_pilfont(filename)
  613. return f
  614. def truetype(font=None, size=10, index=0, encoding="", layout_engine=None):
  615. """
  616. Load a TrueType or OpenType font from a file or file-like object,
  617. and create a font object.
  618. This function loads a font object from the given file or file-like
  619. object, and creates a font object for a font of the given size.
  620. Pillow uses FreeType to open font files. On Windows, be aware that FreeType
  621. will keep the file open as long as the FreeTypeFont object exists. Windows
  622. limits the number of files that can be open in C at once to 512, so if many
  623. fonts are opened simultaneously and that limit is approached, an
  624. ``OSError`` may be thrown, reporting that FreeType "cannot open resource".
  625. A workaround would be to copy the file(s) into memory, and open that instead.
  626. This function requires the _imagingft service.
  627. :param font: A filename or file-like object containing a TrueType font.
  628. If the file is not found in this filename, the loader may also
  629. search in other directories, such as the :file:`fonts/`
  630. directory on Windows or :file:`/Library/Fonts/`,
  631. :file:`/System/Library/Fonts/` and :file:`~/Library/Fonts/` on
  632. macOS.
  633. :param size: The requested size, in pixels.
  634. :param index: Which font face to load (default is first available face).
  635. :param encoding: Which font encoding to use (default is Unicode). Possible
  636. encodings include (see the FreeType documentation for more
  637. information):
  638. * "unic" (Unicode)
  639. * "symb" (Microsoft Symbol)
  640. * "ADOB" (Adobe Standard)
  641. * "ADBE" (Adobe Expert)
  642. * "ADBC" (Adobe Custom)
  643. * "armn" (Apple Roman)
  644. * "sjis" (Shift JIS)
  645. * "gb " (PRC)
  646. * "big5"
  647. * "wans" (Extended Wansung)
  648. * "joha" (Johab)
  649. * "lat1" (Latin-1)
  650. This specifies the character set to use. It does not alter the
  651. encoding of any text provided in subsequent operations.
  652. :param layout_engine: Which layout engine to use, if available:
  653. :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`.
  654. If it is available, Raqm layout will be used by default.
  655. Otherwise, basic layout will be used.
  656. Raqm layout is recommended for all non-English text. If Raqm layout
  657. is not required, basic layout will have better performance.
  658. You can check support for Raqm layout using
  659. :py:func:`PIL.features.check_feature` with ``feature="raqm"``.
  660. .. versionadded:: 4.2.0
  661. :return: A font object.
  662. :exception OSError: If the file could not be read.
  663. :exception ValueError: If the font size is not greater than zero.
  664. """
  665. def freetype(font):
  666. return FreeTypeFont(font, size, index, encoding, layout_engine)
  667. try:
  668. return freetype(font)
  669. except OSError:
  670. if not is_path(font):
  671. raise
  672. ttf_filename = os.path.basename(font)
  673. dirs = []
  674. if sys.platform == "win32":
  675. # check the windows font repository
  676. # NOTE: must use uppercase WINDIR, to work around bugs in
  677. # 1.5.2's os.environ.get()
  678. windir = os.environ.get("WINDIR")
  679. if windir:
  680. dirs.append(os.path.join(windir, "fonts"))
  681. elif sys.platform in ("linux", "linux2"):
  682. lindirs = os.environ.get("XDG_DATA_DIRS")
  683. if not lindirs:
  684. # According to the freedesktop spec, XDG_DATA_DIRS should
  685. # default to /usr/share
  686. lindirs = "/usr/share"
  687. dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")]
  688. elif sys.platform == "darwin":
  689. dirs += [
  690. "/Library/Fonts",
  691. "/System/Library/Fonts",
  692. os.path.expanduser("~/Library/Fonts"),
  693. ]
  694. ext = os.path.splitext(ttf_filename)[1]
  695. first_font_with_a_different_extension = None
  696. for directory in dirs:
  697. for walkroot, walkdir, walkfilenames in os.walk(directory):
  698. for walkfilename in walkfilenames:
  699. if ext and walkfilename == ttf_filename:
  700. return freetype(os.path.join(walkroot, walkfilename))
  701. elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename:
  702. fontpath = os.path.join(walkroot, walkfilename)
  703. if os.path.splitext(fontpath)[1] == ".ttf":
  704. return freetype(fontpath)
  705. if not ext and first_font_with_a_different_extension is None:
  706. first_font_with_a_different_extension = fontpath
  707. if first_font_with_a_different_extension:
  708. return freetype(first_font_with_a_different_extension)
  709. raise
  710. def load_path(filename):
  711. """
  712. Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a
  713. bitmap font along the Python path.
  714. :param filename: Name of font file.
  715. :return: A font object.
  716. :exception OSError: If the file could not be read.
  717. """
  718. for directory in sys.path:
  719. if is_directory(directory):
  720. if not isinstance(filename, str):
  721. filename = filename.decode("utf-8")
  722. try:
  723. return load(os.path.join(directory, filename))
  724. except OSError:
  725. pass
  726. msg = "cannot find font file"
  727. raise OSError(msg)
  728. def load_default(size=None):
  729. """If FreeType support is available, load a version of Aileron Regular,
  730. https://dotcolon.net/font/aileron, with a more limited character set.
  731. Otherwise, load a "better than nothing" font.
  732. .. versionadded:: 1.1.4
  733. :param size: The font size of Aileron Regular.
  734. .. versionadded:: 10.1.0
  735. :return: A font object.
  736. """
  737. if core.__class__.__name__ == "module" or size is not None:
  738. f = truetype(
  739. BytesIO(
  740. base64.b64decode(
  741. b"""
  742. AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA
  743. AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA
  744. MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh
  745. tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk
  746. OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/
  747. 2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ
  748. AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI
  749. BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA
  750. AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ
  751. AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk
  752. QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB
  753. kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC
  754. ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA
  755. EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg
  756. JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y
  757. AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q
  758. AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq
  759. QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB//
  760. //4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  761. AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT
  762. FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT
  763. U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA
  764. AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9
  765. ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO
  766. AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ
  767. gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG
  768. oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz
  769. qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA
  770. DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA
  771. P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA
  772. LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc
  773. jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb
  774. 2ziMONvb29s4jAAAAAMANf+mAg4DDAAfACYALAAAJRQGBxUjNS4BJzMeARcRLgE0Njc1MxUeARcjJ
  775. icVHgEBFBYXNQ4BExU+ATU0Ag5xWDpgcgRcBz41Xl9oVTpVYwpcC1ttXP6cLTQuM5szOrVRZwlOTQ
  776. ZqVzZECAEAGlukZAlOTQdrUG8O7iNlAQgxNhDlCDj+8/YGOjReAAAAAAUAKf/yArsCvAAHAAsAFQA
  777. dACcAABIyFhQGIiY0EyMBMwQiBhUUFjI2NTQSMhYUBiImNDYiBhUUFjI2NTR5iFBQiFCVVwHAV/5c
  778. OiMjOiPmiFBQiFCxOiMjOiMCvFaSVlaS/ZoCsjIzMC80NC8w/uNWklZWkhozMC80NC8wAAAAAgBA/
  779. /ICbgLAACIALgAAARUjEQYjIiY1NDY3LgE1NDYzMhcVJiMiBhUUFhcWOwE1MxUFFBYzMjc1IyIHDg
  780. ECbmBcYYOOVkg7R4hsQjY4Q0RNRD4SLDxW/pJUXzksPCkUUk0BgUb+zBVUZ0BkDw5RO1huCkULQzp
  781. COAMBcHDHRz0J/AIHRQAAAAEAKwHlAIUC3wADAAATIycze0YKWgHl+gAAAAABAGT/sAEXAwwACQAA
  782. EzMGEBcjLgE0Nt06dXU6OUBAAwzG/jDGVePs4wAAAAEAHv+wANEDDAAJAAATMx4BFAYHIzYQHjo5Q
  783. EA5OnUDDFXj7ONVxgHQAAAAAQBVAFIB2wHbAA4AAAE3FwcXBycHJzcnNxcnMwEtmxOfcTJjYzJxnx
  784. ObCj4BKD07KYolmZkliik7PbMAAQBQAFUB9AIlAAsAAAEjFSM1IzUzNTMVMwH0tTq1tTq1AR/Kyjj
  785. OzgAAAAAB/+H/iACMAGQABAAANwcjNzOMWlFOXVrS3AAAAQAgAP8A8gE3AAMAABMjNTPy0tIA/zgA
  786. AQAl//IApQByAAcAADYyFhQGIiY0STgkJDgkciQ4JCQ4AAAAAf/7/+IBNALQAAMAABcjEzM5Pvs+H
  787. gLuAAAAAAIAKf/yAhsCwAADAAcAABIgECA2IBAgKQHy/g5gATL+zgLA/TJEAkYAAAAAAQCCAAABlg
  788. KyAAgAAAERIxEHNTc2MwGWVr6SIygCsv1OAldxW1sWAAEAPAAAAg4CwAAZAAA3IRUhNRM+ATU0JiM
  789. iDwEjNz4BMzIWFRQGB7kBUv4x+kI2QTt+EAFWAQp8aGVtSl5GRjEA/0RVLzlLmAoKa3FsUkNxXQAA
  790. AAEALf/yAhYCwAAqAAABHgEVFAYjIi8BMxceATMyNjU0KwE1MzI2NTQmIyIGDwEjNz4BMzIWFRQGA
  791. YxBSZJo2RUBVgEHV0JBUaQREUBUQzc5TQcBVgEKfGhfcEMBbxJbQl1x0AoKRkZHPn9GSD80QUVCCg
  792. pfbGBPOlgAAAACACEAAAIkArIACgAPAAAlIxUjNSE1ATMRMyMRBg8BAiRXVv6qAVZWV60dHLCurq4
  793. rAdn+QgFLMibzAAABADn/8gIZArIAHQAAATIWFRQGIyIvATMXFjMyNjU0JiMiByMTIRUhBzc2ATNv
  794. d5Fl1RQBVgIad0VSTkVhL1IwAYj+vh8rMAHHgGdtgcUKCoFXTU5bYgGRRvAuHQAAAAACACv/8gITA
  795. sAAFwAjAAABMhYVFAYjIhE0NjMyFh8BIycmIyIDNzYTMjY1NCYjIgYVFBYBLmp7imr0l3RZdAgBXA
  796. IYZ5wKJzU6QVNJSz5SUAHSgWltiQFGxcNlVQoKdv7sPiz+ZF1LTmJbU0lhAAAAAQAyAAACGgKyAAY
  797. AAAEVASMBITUCGv6oXAFL/oECsij9dgJsRgAAAAMALP/xAhgCwAAWACAALAAAAR4BFRQGIyImNTQ2
  798. Ny4BNTQ2MhYVFAYmIgYVFBYyNjU0AzI2NTQmIyIGFRQWAZQ5S5BmbIpPOjA7ecp5P2F8Q0J8RIVJS
  799. 0pLTEtOAW0TXTxpZ2ZqPF0SE1A3VWVlVTdQ/UU0N0RENzT9/ko+Ok1NOj1LAAIAMf/yAhkCwAAXAC
  800. MAAAEyERQGIyImLwEzFxYzMhMHBiMiJjU0NhMyNjU0JiMiBhUUFgEl9Jd0WXQIAVwCGGecCic1SWp
  801. 7imo+UlBAQVNJAsD+usXDZVUKCnYBFD4sgWltif5kW1NJYV1LTmIAAAACACX/8gClAiAABwAPAAAS
  802. MhYUBiImNBIyFhQGIiY0STgkJDgkJDgkJDgkAiAkOCQkOP52JDgkJDgAAAAC/+H/iAClAiAABwAMA
  803. AASMhYUBiImNBMHIzczSTgkJDgkaFpSTl4CICQ4JCQ4/mba5gAAAQBnAB4B+AH0AAYAAAENARUlNS
  804. UB+P6qAVb+bwGRAbCmpkbJRMkAAAIAUAC7AfQBuwADAAcAAAEhNSERITUhAfT+XAGk/lwBpAGDOP8
  805. AOAABAEQAHgHVAfQABgAAARUFNS0BNQHV/m8BVv6qAStEyUSmpkYAAAAAAgAj//IB1ALAABgAIAAA
  806. ATIWFRQHDgEHIz4BNz4BNTQmIyIGByM+ARIyFhQGIiY0AQRibmktIAJWBSEqNig+NTlHBFoDezQ4J
  807. CQ4JALAZ1BjaS03JS1DMD5LLDQ/SUVgcv2yJDgkJDgAAAAAAgA2/5gDFgKYADYAQgAAAQMGFRQzMj
  808. Y1NCYjIg4CFRQWMzI2NxcGIyImNTQ+AjMyFhUUBiMiJwcGIyImNTQ2MzIfATcHNzYmIyIGFRQzMjY
  809. Cej8EJjJJlnBAfGQ+oHtAhjUYg5OPx0h2k06Os3xRWQsVLjY5VHtdPBwJETcJDyUoOkZEJz8B0f74
  810. EQ8kZl6EkTFZjVOLlyknMVm1pmCiaTq4lX6CSCknTVRmmR8wPdYnQzxuSWVGAAIAHQAAAncCsgAHA
  811. AoAACUjByMTMxMjATMDAcj+UVz4dO5d/sjPZPT0ArL9TgE6ATQAAAADAGQAAAJMArIAEAAbACcAAA
  812. EeARUUBgcGKwERMzIXFhUUJRUzMjc2NTQnJiMTPgE1NCcmKwEVMzIBvkdHZkwiNt7LOSGq/oeFHBt
  813. hahIlSTM+cB8Yj5UWAW8QT0VYYgwFArIEF5Fv1eMED2NfDAL93AU+N24PBP0AAAAAAQAv//ICjwLA
  814. ABsAAAEyFh8BIycmIyIGFRQWMzI/ATMHDgEjIiY1NDYBdX+PCwFWAiKiaHx5ZaIiAlYBCpWBk6a0A
  815. sCAagoKpqN/gaOmCgplhcicn8sAAAIAZAAAAp8CsgAMABkAAAEeARUUBgcGKwERMzITPgE1NCYnJi
  816. sBETMyAY59lJp8IzXN0jUVWmdjWRs5d3I4Aq4QqJWUug8EArL9mQ+PeHGHDgX92gAAAAABAGQAAAI
  817. vArIACwAAJRUhESEVIRUhFSEVAi/+NQHB/pUBTf6zRkYCskbwRvAAAAABAGQAAAIlArIACQAAExUh
  818. FSERIxEhFboBQ/69VgHBAmzwRv7KArJGAAAAAAEAL//yAo8CwAAfAAABMxEjNQcGIyImNTQ2MzIWH
  819. wEjJyYjIgYVFBYzMjY1IwGP90wfPnWTprSSf48LAVYCIqJofHllVG+hAU3+s3hARsicn8uAagoKpq
  820. N/gaN1XAAAAAEAZAAAAowCsgALAAABESMRIREjETMRIRECjFb+hFZWAXwCsv1OAS7+0gKy/sQBPAA
  821. AAAABAGQAAAC6ArIAAwAAMyMRM7pWVgKyAAABADf/8gHoArIAEwAAAREUBw4BIyImLwEzFxYzMjc2
  822. NREB6AIFcGpgbQIBVgIHfXQKAQKy/lYxIltob2EpKYyEFD0BpwAAAAABAGQAAAJ0ArIACwAACQEjA
  823. wcVIxEzEQEzATsBJ3ntQlZWAVVlAWH+nwEnR+ACsv6RAW8AAQBkAAACLwKyAAUAACUVIREzEQIv/j
  824. VWRkYCsv2UAAABAGQAAAMUArIAFAAAAREjETQ3BgcDIwMmJxYVESMRMxsBAxRWAiMxemx8NxsCVo7
  825. MywKy/U4BY7ZLco7+nAFmoFxLtP6dArL9lwJpAAAAAAEAZAAAAoACsgANAAAhIwEWFREjETMBJjUR
  826. MwKAhP67A1aEAUUDVAJeeov+pwKy/aJ5jAFZAAAAAgAv//ICuwLAAAkAEwAAEiAWFRQGICY1NBIyN
  827. jU0JiIGFRTbATSsrP7MrNrYenrYegLAxaKhxsahov47nIeIm5uIhwACAGQAAAJHArIADgAYAAABHg
  828. EVFAYHBisBESMRMzITNjQnJisBETMyAZRUX2VOHzuAVtY7GlxcGDWIiDUCrgtnVlVpCgT+5gKy/rU
  829. V1BUF/vgAAAACAC//zAK9AsAAEgAcAAAlFhcHJiMiBwYjIiY1NDYgFhUUJRQWMjY1NCYiBgI9PUMx
  830. UDcfKh8omqysATSs/dR62Hp62HpICTg7NgkHxqGixcWitbWHnJyHiJubAAIAZAAAAlgCsgAXACMAA
  831. CUWFyMmJyYnJisBESMRMzIXHgEVFAYHFiUzMjc+ATU0JyYrAQIqDCJfGQwNWhAhglbiOx9QXEY1Tv
  832. 6bhDATMj1lGSyMtYgtOXR0BwH+1wKyBApbU0BSESRAAgVAOGoQBAABADT/8gIoAsAAJQAAATIWFyM
  833. uASMiBhUUFhceARUUBiMiJiczHgEzMjY1NCYnLgE1NDYBOmd2ClwGS0E6SUNRdW+HZnKKC1wPWkQ9
  834. Uk1cZGuEAsBwXUJHNjQ3OhIbZVZZbm5kREo+NT5DFRdYUFdrAAAAAAEAIgAAAmQCsgAHAAABIxEjE
  835. SM1IQJk9lb2AkICbP2UAmxGAAEAXv/yAmQCsgAXAAABERQHDgEiJicmNREzERQXHgEyNjc2NRECZA
  836. IIgfCBCAJWAgZYmlgGAgKy/k0qFFxzc1wUKgGz/lUrEkRQUEQSKwGrAAAAAAEAIAAAAnoCsgAGAAA
  837. hIwMzGwEzAYJ07l3N1FwCsv2PAnEAAAEAGgAAA7ECsgAMAAABAyMLASMDMxsBMxsBA7HAcZyicrZi
  838. kaB0nJkCsv1OAlP9rQKy/ZsCW/2kAmYAAAEAGQAAAm8CsgALAAAhCwEjEwMzGwEzAxMCCsrEY/bkY
  839. re+Y/D6AST+3AFcAVb+5gEa/q3+oQAAAQATAAACUQKyAAgAAAERIxEDMxsBMwFdVvRjwLphARD+8A
  840. EQAaL+sQFPAAABAC4AAAI5ArIACQAAJRUhNQEhNSEVAQI5/fUBof57Aen+YUZGQgIqRkX92QAAAAA
  841. BAGL/sAEFAwwABwAAARUjETMVIxEBBWlpowMMOP0UOANcAAAB//v/4gE0AtAAAwAABSMDMwE0Pvs+
  842. HgLuAAAAAQAi/7AAxQMMAAcAABcjNTMRIzUzxaNpaaNQOALsOAABAFAA1wH0AmgABgAAJQsBIxMzE
  843. wGwjY1GsESw1wFZ/qcBkf5vAAAAAQAy/6oBwv/iAAMAAAUhNSEBwv5wAZBWOAAAAAEAKQJEALYCsg
  844. ADAAATIycztjhVUAJEbgAAAAACACT/8gHQAiAAHQAlAAAhJwcGIyImNTQ2OwE1NCcmIyIHIz4BMzI
  845. XFh0BFBcnMjY9ASYVFAF6CR0wVUtgkJoiAgdgaQlaBm1Zrg4DCuQ9R+5MOSFQR1tbDiwUUXBUXowf
  846. J8c9SjRORzYSgVwAAAAAAgBK//ICRQLfABEAHgAAATIWFRQGIyImLwEVIxEzETc2EzI2NTQmIyIGH
  847. QEUFgFUcYCVbiNJEyNWVigySElcU01JXmECIJd4i5QTEDRJAt/+3jkq/hRuZV55ZWsdX14AAQAe//
  848. IB9wIgABgAAAEyFhcjJiMiBhUUFjMyNjczDgEjIiY1NDYBF152DFocbEJXU0A1Rw1aE3pbaoKQAiB
  849. oWH5qZm1tPDlaXYuLgZcAAAACAB7/8gIZAt8AEQAeAAABESM1BwYjIiY1NDYzMhYfAREDMjY9ATQm
  850. IyIGFRQWAhlWKDJacYCVbiNJEyOnSV5hQUlcUwLf/SFVOSqXeIuUExA0ARb9VWVrHV9ebmVeeQACA
  851. B7/8gH9AiAAFQAbAAABFAchHgEzMjY3Mw4BIyImNTQ2MzIWJyIGByEmAf0C/oAGUkA1SwlaD4FXbI
  852. WObmt45UBVBwEqDQEYFhNjWD84W16Oh3+akU9aU60AAAEAFQAAARoC8gAWAAATBh0BMxUjESMRIzU
  853. zNTQ3PgEzMhcVJqcDbW1WOTkDB0k8Hx5oAngVITRC/jQBzEIsJRs5PwVHEwAAAAIAHv8uAhkCIAAi
  854. AC8AAAERFAcOASMiLwEzFx4BMzI2NzY9AQcGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZAQSEd
  855. NwRAVcBBU5DTlUDASgyWnGAlW4jSRMjp0leYUFJXFMCEv5wSh1zeq8KCTI8VU0ZIQk5Kpd4i5QTED
  856. RJ/iJlax1fXm5lXnkAAQBKAAACCgLkABcAAAEWFREjETQnLgEHDgEdASMRMxE3NjMyFgIIAlYCBDs
  857. 6RVRWViE5UVViAYUbQP7WASQxGzI7AQJyf+kC5P7TPSxUAAACAD4AAACsAsAABwALAAASMhYUBiIm
  858. NBMjETNeLiAgLiBiVlYCwCAuICAu/WACEgAC//P/LgCnAsAABwAVAAASMhYUBiImNBcRFAcGIyInN
  859. RY3NjURWS4gIC4gYgMLcRwNSgYCAsAgLiAgLo79wCUbZAJGBzMOHgJEAAAAAQBKAAACCALfAAsAAC
  860. EnBxUjETMREzMHEwGTwTJWVvdu9/rgN6kC3/4oAQv6/ugAAQBG//wA3gLfAA8AABMRFBceATcVBiM
  861. iJicmNRGcAQIcIxkkKi4CAQLf/bkhERoSBD4EJC8SNAJKAAAAAQBKAAADEAIgACQAAAEWFREjETQn
  862. JiMiFREjETQnJiMiFREjETMVNzYzMhYXNzYzMhYDCwVWBAxedFYEDF50VlYiJko7ThAvJkpEVAGfI
  863. jn+vAEcQyRZ1v76ARxDJFnW/voCEk08HzYtRB9HAAAAAAEASgAAAgoCIAAWAAABFhURIxE0JyYjIg
  864. YdASMRMxU3NjMyFgIIAlYCCXBEVVZWITlRVWIBhRtA/tYBJDEbbHR/6QISWz0sVAAAAAACAB7/8gI
  865. sAiAABwARAAASIBYUBiAmNBIyNjU0JiIGFRSlAQCHh/8Ah7ieWlqeWgIgn/Cfn/D+s3ZfYHV1YF8A
  866. AgBK/zwCRQIgABEAHgAAATIWFRQGIyImLwERIxEzFTc2EzI2NTQmIyIGHQEUFgFUcYCVbiNJEyNWV
  867. igySElcU01JXmECIJd4i5QTEDT+8wLWVTkq/hRuZV55ZWsdX14AAgAe/zwCGQIgABEAHgAAAREjEQ
  868. cGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZVigyWnGAlW4jSRMjp0leYUFJXFMCEv0qARk5Kpd
  869. 4i5QTEDRJ/iJlax1fXm5lXnkAAQBKAAABPgIeAA0AAAEyFxUmBhURIxEzFTc2ARoWDkdXVlYwIwIe
  870. B0EFVlf+0gISU0cYAAEAGP/yAa0CIAAjAAATMhYXIyYjIgYVFBYXHgEVFAYjIiYnMxYzMjY1NCYnL
  871. gE1NDbkV2MJWhNdKy04PF1XbVhWbgxaE2ktOjlEUllkAiBaS2MrJCUoEBlPQkhOVFZoKCUmLhIWSE
  872. BIUwAAAAEAFP/4ARQCiQAXAAATERQXHgE3FQYjIiYnJjURIzUzNTMVMxWxAQMmMx8qMjMEAUdHVmM
  873. BzP7PGw4mFgY/BSwxDjQBNUJ7e0IAAAABAEL/8gICAhIAFwAAAREjNQcGIyImJyY1ETMRFBceATMy
  874. Nj0BAgJWITlRT2EKBVYEBkA1RFECEv3uWj4qTToiOQE+/tIlJC43c4DpAAAAAAEAAQAAAfwCEgAGA
  875. AABAyMDMxsBAfzJaclfop8CEv3uAhL+LQHTAAABAAEAAAMLAhIADAAAAQMjCwEjAzMbATMbAQMLqW
  876. Z2dmapY3t0a3Z7AhL97gG+/kICEv5AAcD+QwG9AAAB//oAAAHWAhIACwAAARMjJwcjEwMzFzczARq
  877. 8ZIuKY763ZoWFYwEO/vLV1QEMAQbNzQAAAQAB/y4B+wISABEAAAEDDgEjIic1FjMyNj8BAzMbAQH7
  878. 2iFZQB8NDRIpNhQH02GenQIS/cFVUAJGASozEwIt/i4B0gABABQAAAGxAg4ACQAAJRUhNQEhNSEVA
  879. QGx/mMBNP7iAYL+zkREQgGIREX+ewAAAAABAED/sAEOAwwALAAAASMiBhUUFxYVFAYHHgEVFAcGFR
  880. QWOwEVIyImNTQ3NjU0JzU2NTQnJjU0NjsBAQ4MKiMLDS4pKS4NCyMqDAtERAwLUlILDERECwLUGBk
  881. WTlsgKzUFBTcrIFtOFhkYOC87GFVMIkUIOAhFIkxVGDsvAAAAAAEAYP84AJoDIAADAAAXIxEzmjo6
  882. yAPoAAEAIf+wAO8DDAAsAAATFQYVFBcWFRQGKwE1MzI2NTQnJjU0NjcuATU0NzY1NCYrATUzMhYVF
  883. AcGFRTvUgsMREQLDCojCw0uKSkuDQsjKgwLREQMCwF6OAhFIkxVGDsvOBgZFk5bICs1BQU3KyBbTh
  884. YZGDgvOxhVTCJFAAABAE0A3wH2AWQAEwAAATMUIyImJyYjIhUjNDMyFhcWMzIBvjhuGywtQR0xOG4
  885. bLC1BHTEBZIURGCNMhREYIwAAAwAk/94DIgLoAAcAEQApAAAAIBYQBiAmECQgBhUUFiA2NTQlMhYX
  886. IyYjIgYUFjMyNjczDgEjIiY1NDYBAQFE3d3+vN0CB/7wubkBELn+xVBnD1wSWDo+QTcqOQZcEmZWX
  887. HN2Aujg/rbg4AFKpr+Mjb6+jYxbWEldV5ZZNShLVn5na34AAgB4AFIB9AGeAAUACwAAAQcXIyc3Mw
  888. cXIyc3AUqJiUmJifOJiUmJiQGepqampqampqYAAAIAHAHSAQ4CwAAHAA8AABIyFhQGIiY0NiIGFBY
  889. yNjRgakREakSTNCEhNCECwEJqQkJqCiM4IyM4AAAAAAIAUAAAAfQCCwALAA8AAAEzFSMVIzUjNTM1
  890. MxMhNSEBP7W1OrW1OrX+XAGkAVs4tLQ4sP31OAAAAQB0AkQBAQKyAAMAABMjNzOsOD1QAkRuAAAAA
  891. AEAIADsAKoBdgAHAAASMhYUBiImNEg6KCg6KAF2KDooKDoAAAIAOQBSAbUBngAFAAsAACUHIzcnMw
  892. UHIzcnMwELiUmJiUkBM4lJiYlJ+KampqampqYAAAABADYB5QDhAt8ABAAAEzczByM2Xk1OXQHv8Po
  893. AAQAWAeUAwQLfAAQAABMHIzczwV5NTl0C1fD6AAIANgHlAYsC3wAEAAkAABM3MwcjPwEzByM2Xk1O
  894. XapeTU5dAe/w+grw+gAAAgAWAeUBawLfAAQACQAAEwcjNzMXByM3M8FeTU5dql5NTl0C1fD6CvD6A
  895. AADACX/8gI1AHIABwAPABcAADYyFhQGIiY0NjIWFAYiJjQ2MhYUBiImNEk4JCQ4JOw4JCQ4JOw4JC
  896. Q4JHIkOCQkOCQkOCQkOCQkOCQkOAAAAAEAeABSAUoBngAFAAABBxcjJzcBSomJSYmJAZ6mpqamAAA
  897. AAAEAOQBSAQsBngAFAAAlByM3JzMBC4lJiYlJ+KampgAAAf9qAAABgQKyAAMAACsBATM/VwHAVwKy
  898. AAAAAAIAFAHIAdwClAAHABQAABMVIxUjNSM1BRUjNwcjJxcjNTMXN9pKMkoByDICKzQqATJLKysCl
  899. CmjoykBy46KiY3Lm5sAAQAVAAABvALyABgAAAERIxEjESMRIzUzNTQ3NjMyFxUmBgcGHQEBvFbCVj
  900. k5AxHHHx5iVgcDAg798gHM/jQBzEIOJRuWBUcIJDAVIRYAAAABABX//AHkAvIAJQAAJR4BNxUGIyI
  901. mJyY1ESYjIgcGHQEzFSMRIxEjNTM1NDc2MzIXERQBowIcIxkkKi4CAR4nXgwDbW1WLy8DEbNdOmYa
  902. EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA
  903. QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA
  904. AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA
  905. BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A
  906. AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA
  907. gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm
  908. lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV
  909. ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy
  910. AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA
  911. HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg
  912. B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk
  913. AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41
  914. ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA
  915. HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3
  916. JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB
  917. odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs
  918. AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA
  919. AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB
  920. QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA
  921. xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A
  922. TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A
  923. LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA
  924. AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ
  925. ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG
  926. AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE
  927. AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE
  928. kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ
  929. PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA
  930. AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA
  931. AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  932. AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  933. AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA
  934. ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA
  935. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA
  936. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA
  937. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA
  938. AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  939. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA
  940. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD
  941. /4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA
  942. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA
  943. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA
  944. AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  945. AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA
  946. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA
  947. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA
  948. AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  949. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  950. AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  951. AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  952. AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA
  953. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA
  954. BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA
  955. AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA
  956. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA
  957. AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ
  958. ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA
  959. gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC
  960. YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA
  961. AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ==
  962. """
  963. )
  964. ),
  965. 10 if size is None else size,
  966. layout_engine=Layout.BASIC,
  967. )
  968. else:
  969. f = ImageFont()
  970. f._load_pilfont_data(
  971. # courB08
  972. BytesIO(
  973. base64.b64decode(
  974. b"""
  975. UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  976. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  977. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  978. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  979. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  980. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  981. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  982. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  983. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  984. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  985. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  986. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA
  987. BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL
  988. AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA
  989. AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB
  990. ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A
  991. BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB
  992. //kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA
  993. AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH
  994. AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA
  995. ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv
  996. AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/
  997. /gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5
  998. AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA
  999. AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG
  1000. AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA
  1001. BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA
  1002. AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA
  1003. 2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF
  1004. AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA////
  1005. +gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA
  1006. ////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA
  1007. BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv
  1008. AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA
  1009. AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA
  1010. AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA
  1011. BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP//
  1012. //kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA
  1013. AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF
  1014. AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB
  1015. mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn
  1016. AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA
  1017. AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7
  1018. AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA
  1019. Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA
  1020. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1021. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1022. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1023. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1024. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1025. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1026. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1027. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1028. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1029. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1030. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1031. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB
  1032. //sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA
  1033. AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ
  1034. AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC
  1035. DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ
  1036. AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/
  1037. +wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5
  1038. AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/
  1039. ///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG
  1040. AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA
  1041. BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA
  1042. Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC
  1043. eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG
  1044. AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA////
  1045. +gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA
  1046. ////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA
  1047. BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT
  1048. AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A
  1049. AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA
  1050. Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA
  1051. Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP//
  1052. //cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA
  1053. AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ
  1054. AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA
  1055. LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5
  1056. AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA
  1057. AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5
  1058. AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA
  1059. AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG
  1060. AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA
  1061. EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK
  1062. AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA
  1063. pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG
  1064. AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA////
  1065. +QAGAAIAzgAKANUAEw==
  1066. """
  1067. )
  1068. ),
  1069. Image.open(
  1070. BytesIO(
  1071. base64.b64decode(
  1072. b"""
  1073. iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u
  1074. Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9
  1075. M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g
  1076. LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F
  1077. IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA
  1078. Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791
  1079. NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx
  1080. in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9
  1081. SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY
  1082. AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt
  1083. y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG
  1084. ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY
  1085. lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H
  1086. /Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3
  1087. AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47
  1088. c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/
  1089. /yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw
  1090. pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv
  1091. oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR
  1092. evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA
  1093. AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v//
  1094. Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR
  1095. w7IkEbzhVQAAAABJRU5ErkJggg==
  1096. """
  1097. )
  1098. )
  1099. ),
  1100. )
  1101. return f