feat: Support for proportional numeral spacing (#1414)

## Summary

**What is the goal of this PR?**

Reading a book with frequent numbers, I noticed that the spacing between
numeral glyphs was strangely large. This was because Bookerly and Noto
Sans default to tabular figures, where every digit gets an identical
advance width. This is designed for column alignment in spreadsheets,
but in rendering prose it produces visually wide gaps between digits.

This change adds a `--pnum` flag to fontconvert.py that applies the
font's OpenType `pnum` (proportional numerals) feature during
conversion. When active, the converter:
- Parses the GSUB table for pnum SingleSubst lookups
- Resolves substitute glyph indices via fonttools' glyph order
- Loads the proportional alternate glyphs instead of the tabular
defaults
- Includes substitute glyph names in kern pair extraction, so kerning
data that references proportional alternates is captured

Bookerly's proportional alternates also carry digit-digit and
digit-punctuation kerning that the tabular glyphs lack (e.g., at 16pt
7->4 at -1.69px, 7->. at -2.31px, 7->1 at +1.00px).

Noto Sans gains proportional advances but no new kerning (its
proportional glyphs have no kern class data in the font).

OpenDyslexic is unaffected. Its `cmap` already points to proportional
glyphs, so `--pnum` is a no-op. `--pnum` is intentionally omitted from
OpenDyslexic in the build script for deliberately uniform digit spacing
as an accessibility choice.

UI fonts (Ubuntu, notosans_8) also omit `--pnum` to preserve tabular
alignment for page numbers, battery percentages, etc.

| Before | After |
| -- | -- |
| <img
src="https://github.com/user-attachments/files/26042238/screenshot-31673.bmp"
width="300" /> | <img
src="https://github.com/user-attachments/files/26042241/screenshot-124075.bmp"
width="300" /> |

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**YES**_
This commit is contained in:
Zach Nelson
2026-04-18 17:03:04 -05:00
committed by GitHub
parent 3cdfc6c781
commit 64f5ef018a
35 changed files with 97345 additions and 96583 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+308 -308
View File
@@ -3,239 +3,239 @@
* name: notosans_16_regular
* size: 16
* mode: 2-bit compressed: true
* Command used: fontconvert.py notosans_16_regular 16 ../builtinFonts/source/NotoSans/NotoSans-Regular.ttf --2bit --compress
* Command used: fontconvert.py notosans_16_regular 16 ../builtinFonts/source/NotoSans/NotoSans-Regular.ttf --2bit --compress --pnum
*/
#pragma once
#include "EpdFontData.h"
static const uint8_t notosans_16_regularBitmaps[35113] = {
0xBD, 0x5A, 0x3D, 0x8C, 0xE4, 0xC8, 0x75, 0x2E, 0x92, 0xBB, 0x4B, 0x40, 0x84, 0xC1, 0x0B, 0xB4,
0xB2, 0xA0, 0x0D, 0x98, 0x5C, 0x24, 0xC1, 0xC7, 0x54, 0xC1, 0x0E, 0x8B, 0x82, 0xA1, 0x7C, 0x83,
0x9D, 0x5B, 0xC0, 0x1B, 0x9C, 0x53, 0x1D, 0x20, 0x4C, 0xA2, 0xC0, 0xC1, 0xCC, 0x90, 0xF6, 0x05,
0x0A, 0x14, 0x68, 0x01, 0xE1, 0x0C, 0x03, 0x97, 0x28, 0x38, 0x19, 0x72, 0x6F, 0xB0, 0x89, 0x03,
0x09, 0xE8, 0x69, 0x12, 0x36, 0xE0, 0xC4, 0xC1, 0xD1, 0x06, 0x04, 0x87, 0xA2, 0xE0, 0xDB, 0x40,
0xE7, 0xE0, 0x08, 0x9B, 0x07, 0xB3, 0x57, 0x45, 0x96, 0xBF, 0xEF, 0x15, 0xD9, 0xDD, 0xB3, 0x3B,
0xFB, 0xAB, 0x85, 0x39, 0xAC, 0xC7, 0x6E, 0x76, 0xFD, 0xBC, 0x7A, 0xFF, 0xEF, 0xD5, 0x68, 0xA5,
0xAF, 0xF8, 0xCB, 0xD4, 0x7B, 0xF3, 0xDF, 0x9F, 0xA9, 0x6B, 0x8A, 0x97, 0x56, 0x55, 0x5E, 0x95,
0x05, 0xBE, 0xAD, 0xA3, 0x66, 0xBE, 0xC3, 0x1A, 0xF7, 0x29, 0xEE, 0x80, 0xF7, 0x77, 0x83, 0x52,
0xA9, 0x7F, 0xF4, 0x5A, 0x74, 0xEE, 0x03, 0xC2, 0x2E, 0x68, 0x94, 0xF2, 0xBA, 0xA0, 0x56, 0xCA,
0xEF, 0x42, 0xC2, 0x36, 0x02, 0x0C, 0x9A, 0xA8, 0x54, 0x5F, 0x7B, 0xF8, 0xE4, 0xD1, 0x17, 0x79,
0x6C, 0x71, 0x95, 0xD7, 0xEF, 0xFF, 0xE6, 0xE4, 0x38, 0x57, 0x51, 0x99, 0x62, 0x50, 0x9C, 0x67,
0x02, 0x8F, 0x00, 0x13, 0x75, 0x1B, 0x30, 0x55, 0xA7, 0x58, 0x1E, 0x1D, 0xA7, 0x19, 0xAA, 0x23,
0xD5, 0xE3, 0xFD, 0x6D, 0xD5, 0x01, 0x9E, 0x7A, 0x84, 0x6B, 0x9F, 0x70, 0xF0, 0xDD, 0xE2, 0xCD,
0xB2, 0xB8, 0xF2, 0xD0, 0xB0, 0x9A, 0xB4, 0x5B, 0x0F, 0x54, 0x68, 0x6D, 0x93, 0x58, 0xDB, 0x15,
0x9F, 0xFC, 0x6D, 0x77, 0x81, 0x77, 0x66, 0x6E, 0x23, 0x5A, 0xF1, 0x93, 0x52, 0xA5, 0xB6, 0x44,
0x9F, 0x41, 0xA9, 0x02, 0x1F, 0x22, 0xDB, 0xA9, 0xE8, 0xC7, 0x03, 0xC6, 0x1A, 0xB4, 0x35, 0x9F,
0x79, 0xF4, 0xD7, 0x66, 0xBA, 0xFF, 0xA8, 0x07, 0x1A, 0x4D, 0x41, 0x4C, 0x6E, 0x95, 0xFB, 0xF9,
0xD9, 0xDC, 0xE5, 0x4F, 0xDC, 0x81, 0x8A, 0x6D, 0x0D, 0xE4, 0x55, 0xFA, 0xE7, 0x2D, 0x30, 0x56,
0x19, 0x10, 0x5D, 0x13, 0xF7, 0x8E, 0xD8, 0x9F, 0x02, 0xCD, 0x4E, 0x1E, 0x24, 0x0C, 0x1E, 0x71,
0x29, 0x8F, 0x44, 0x36, 0xD6, 0x67, 0x37, 0x1E, 0xA8, 0x23, 0xAF, 0x5B, 0x6B, 0xA3, 0xDE, 0xF3,
0xBB, 0x7E, 0x53, 0xA9, 0xE4, 0x93, 0x7F, 0xEF, 0xFA, 0x38, 0x8F, 0xEC, 0x47, 0xFF, 0xD6, 0xC5,
0xA5, 0xF7, 0xEB, 0xF8, 0x9F, 0x3A, 0x12, 0x33, 0xF1, 0x5B, 0x4E, 0x90, 0x05, 0xF2, 0x38, 0x75,
0x8F, 0x41, 0x5E, 0xFA, 0x9D, 0xCF, 0x2E, 0x41, 0xE3, 0x61, 0x80, 0xC2, 0xA7, 0x21, 0xC9, 0x89,
0x56, 0x31, 0x91, 0x9B, 0x2A, 0x19, 0x04, 0x57, 0x2F, 0x5F, 0xB0, 0x4E, 0x2C, 0x3F, 0x56, 0x16,
0x34, 0xF4, 0xA6, 0xFB, 0xC0, 0x31, 0xE8, 0x3D, 0xF4, 0x01, 0x9A, 0x66, 0x0F, 0xF9, 0xC6, 0x1B,
0x02, 0xD2, 0x7F, 0x4C, 0x48, 0x6D, 0x5D, 0x71, 0xDB, 0xC9, 0xC8, 0x19, 0x0A, 0xBE, 0xF6, 0xED,
0xA8, 0x82, 0x36, 0xEA, 0x8B, 0x32, 0x6C, 0x92, 0x3A, 0x69, 0xE3, 0x5A, 0xE7, 0xE1, 0x00, 0x88,
0x59, 0x75, 0xAE, 0x49, 0x5B, 0x59, 0xDE, 0x10, 0x46, 0x46, 0xA5, 0xB5, 0xD2, 0x93, 0x8A, 0xB7,
0xF7, 0x2C, 0x46, 0x58, 0x3B, 0xC4, 0x2D, 0x70, 0x28, 0x03, 0xA3, 0xBC, 0x3B, 0x64, 0x2C, 0xAF,
0xD3, 0xD3, 0xD3, 0xEF, 0x42, 0x24, 0xD7, 0x58, 0xB8, 0x0B, 0x9B, 0xB8, 0x4E, 0xCA, 0x34, 0xA7,
0x94, 0x9E, 0xE3, 0xEF, 0xE2, 0xE0, 0x8F, 0xDF, 0xF9, 0x3E, 0x2D, 0xE3, 0x3A, 0x6E, 0xC2, 0xD6,
0x27, 0xD2, 0x67, 0xEA, 0xDA, 0x1A, 0xEF, 0x92, 0x3C, 0xAE, 0xC3, 0x36, 0xE8, 0x7C, 0x6E, 0xCA,
0xE0, 0x6F, 0x19, 0xB0, 0xFC, 0x5D, 0xA8, 0x91, 0xEF, 0x7D, 0xAE, 0xD1, 0x45, 0x4D, 0x5C, 0x6A,
0x0C, 0x7D, 0xC7, 0x11, 0x28, 0x6C, 0x5D, 0xA3, 0x4C, 0xA1, 0xBD, 0x1B, 0xD4, 0xD7, 0x8B, 0x9F,
0xFD, 0xCB, 0x54, 0x41, 0x0E, 0xBE, 0x55, 0x4D, 0xBF, 0x50, 0x31, 0x36, 0xAE, 0xC1, 0xDC, 0x0B,
0x6C, 0xD2, 0xA4, 0x65, 0xD0, 0xC7, 0x8D, 0xD0, 0xFE, 0x1D, 0x8F, 0x42, 0xAF, 0x5E, 0x02, 0x0A,
0x4C, 0x93, 0x0B, 0xB8, 0x79, 0xEF, 0xAB, 0xE3, 0x97, 0x8D, 0x50, 0xC0, 0x27, 0x26, 0x11, 0x6A,
0x12, 0x21, 0x83, 0x40, 0x9D, 0x12, 0x4D, 0x72, 0x2E, 0xC7, 0x7D, 0x7C, 0x7C, 0x49, 0x59, 0x15,
0x54, 0x58, 0x61, 0x77, 0x8A, 0xB2, 0x47, 0x16, 0x7A, 0xBD, 0x30, 0x53, 0x51, 0x43, 0x23, 0x6C,
0x27, 0xA6, 0x10, 0x95, 0xD4, 0x32, 0x91, 0x0A, 0xEC, 0x59, 0xBA, 0x29, 0xF0, 0xD9, 0x9F, 0xBB,
0x86, 0x2F, 0xE8, 0xEA, 0xAE, 0x14, 0x22, 0xE5, 0x59, 0x88, 0x7B, 0x30, 0x7E, 0xD0, 0xA9, 0xB8,
0xF5, 0x07, 0x76, 0x06, 0x6F, 0x73, 0xE1, 0x88, 0x30, 0xC5, 0x81, 0x94, 0xB8, 0xA4, 0xF9, 0x73,
0x41, 0x46, 0xB0, 0x1F, 0x21, 0x13, 0x40, 0x7A, 0x2F, 0xB0, 0x65, 0xCF, 0xA8, 0x60, 0x7B, 0xAB,
0xE7, 0x42, 0x40, 0x26, 0xA5, 0xB4, 0x8A, 0x88, 0x80, 0x2A, 0x49, 0xA7, 0xAA, 0x2E, 0xB0, 0x5D,
0xFC, 0x9F, 0x9D, 0xFE, 0xA8, 0xFB, 0x13, 0x20, 0xFD, 0x06, 0xB7, 0x5C, 0x54, 0x8E, 0x88, 0x0B,
0xE8, 0xED, 0x49, 0x0F, 0xA1, 0xF1, 0x0D, 0x89, 0x48, 0x82, 0x00, 0x87, 0x4B, 0x80, 0xEF, 0xA8,
0x0D, 0x6E, 0x68, 0x44, 0xD6, 0x40, 0x94, 0x31, 0x03, 0xDF, 0xF3, 0xC7, 0x90, 0xEF, 0x93, 0xE7,
0xBD, 0xFA, 0x62, 0xB5, 0x3A, 0x60, 0xBC, 0x53, 0xC5, 0x6A, 0xA2, 0x16, 0x42, 0x01, 0xF5, 0x63,
0x2C, 0xFE, 0x9E, 0xF2, 0x65, 0xDD, 0xF1, 0x8A, 0x75, 0x09, 0x22, 0x4C, 0xF6, 0x61, 0x85, 0xC9,
0x2C, 0x7B, 0x70, 0x18, 0xEC, 0x91, 0x8C, 0x98, 0xD4, 0xBC, 0xA8, 0xB0, 0xE9, 0x00, 0x14, 0xEA,
0x8E, 0xF2, 0x46, 0xB5, 0xC9, 0xD1, 0xAF, 0xE2, 0x88, 0xC4, 0x4E, 0x58, 0xFB, 0xA6, 0xAC, 0x2F,
0x93, 0x06, 0x04, 0x31, 0x41, 0x4A, 0x70, 0x44, 0x60, 0x0C, 0x0D, 0xB8, 0xA1, 0x20, 0x18, 0x4A,
0x81, 0x21, 0x1B, 0x0D, 0xF9, 0x6F, 0x28, 0x27, 0xC6, 0x19, 0x87, 0xB0, 0x01, 0x00, 0xAB, 0x44,
0xAF, 0x8D, 0xEC, 0xAD, 0x17, 0xF0, 0xED, 0xD5, 0x6A, 0xFA, 0xF9, 0x8C, 0xF8, 0xB3, 0x00, 0xFB,
0x6D, 0x52, 0xA0, 0x92, 0xF2, 0x39, 0xE3, 0xB9, 0xB4, 0x6C, 0x69, 0x1F, 0x3E, 0x50, 0x85, 0x33,
0xFF, 0xCD, 0x35, 0x32, 0x5B, 0x05, 0xC3, 0x8C, 0xEF, 0x53, 0xCD, 0x1F, 0x72, 0x10, 0x79, 0xFB,
0xBD, 0xA2, 0x21, 0x55, 0x53, 0x9A, 0xF2, 0x9B, 0x8B, 0x90, 0x7A, 0xFC, 0x96, 0x10, 0x54, 0x8F,
0xEF, 0x2A, 0x7F, 0xDC, 0xB1, 0x8E, 0x8E, 0x82, 0xB2, 0x0D, 0x76, 0x2B, 0x27, 0xDD, 0x4A, 0xDF,
0x00, 0x5D, 0x74, 0x0A, 0x0F, 0xA0, 0x37, 0xF7, 0xB1, 0xA3, 0x16, 0x34, 0xD5, 0xE5, 0x2C, 0xC2,
0x94, 0xCF, 0xE4, 0x00, 0x40, 0x48, 0x53, 0x58, 0x17, 0xFC, 0x06, 0x29, 0xD8, 0x40, 0x07, 0x42,
0x43, 0x7E, 0x74, 0x4A, 0xFC, 0x89, 0x02, 0xCD, 0x1D, 0xA7, 0xAB, 0x43, 0x76, 0x0B, 0x3F, 0xCE,
0x9F, 0x15, 0x24, 0x2A, 0x1B, 0x84, 0x7D, 0x41, 0x29, 0xDD, 0xF5, 0xDD, 0x31, 0xDF, 0x7F, 0xAA,
0x6F, 0xBD, 0xC8, 0x94, 0xCE, 0x17, 0xB6, 0x8F, 0x3B, 0x02, 0xCB, 0x75, 0x82, 0xCD, 0xF8, 0x64,
0x77, 0xB4, 0xBD, 0x2F, 0x9A, 0x39, 0x72, 0xAB, 0xE7, 0x4E, 0xBB, 0x04, 0x24, 0xA2, 0x62, 0x2D,
0xD0, 0x08, 0x46, 0xCA, 0x95, 0x25, 0xE2, 0x7A, 0x12, 0xB9, 0xAA, 0x55, 0x38, 0x24, 0xD0, 0x85,
0x1A, 0x92, 0x43, 0xF3, 0x4D, 0x96, 0x1C, 0xAA, 0xB1, 0xD3, 0x56, 0xF8, 0x15, 0x95, 0xB4, 0x37,
0x46, 0xFA, 0xD8, 0x9E, 0xC6, 0xA8, 0x9C, 0xD5, 0xD3, 0x61, 0x30, 0xD2, 0x31, 0x60, 0xAA, 0x68,
0x7B, 0xD2, 0x61, 0x2A, 0xEC, 0x01, 0x23, 0x44, 0x54, 0x32, 0xCE, 0xA7, 0x65, 0x3E, 0x07, 0xF8,
0x55, 0xFC, 0x44, 0x9E, 0x96, 0x9E, 0xCD, 0xE3, 0xFE, 0x96, 0x55, 0x81, 0xB5, 0xE0, 0x4B, 0x35,
0xEC, 0x45, 0x39, 0xBB, 0x4C, 0x93, 0xDE, 0x29, 0xC4, 0x35, 0x0F, 0x0A, 0x11, 0x59, 0x51, 0xE2,
0xCF, 0xF1, 0xEA, 0x2E, 0xDA, 0x35, 0x67, 0x0E, 0x73, 0xAD, 0xAE, 0xBA, 0xF6, 0xA6, 0xD2, 0x03,
0x5E, 0x69, 0x93, 0x36, 0x42, 0xD0, 0x67, 0xAE, 0x84, 0x06, 0xB7, 0xA4, 0x00, 0x9C, 0xC1, 0x94,
0x0E, 0x6A, 0xB7, 0x35, 0x15, 0x0A, 0xD9, 0xE9, 0x25, 0x2C, 0x3F, 0xD0, 0x55, 0x4C, 0x87, 0x1F,
0x74, 0x33, 0xFF, 0xAE, 0xD2, 0x41, 0xC4, 0x90, 0xDF, 0x13, 0xD1, 0xD1, 0x8A, 0x38, 0x46, 0x56,
0x2D, 0x1D, 0xC2, 0xFC, 0x00, 0x31, 0x08, 0x8A, 0x03, 0x57, 0x5D, 0x50, 0xAA, 0xD5, 0xD3, 0x5D,
0x7E, 0xB4, 0x9B, 0x27, 0x75, 0x8E, 0xF8, 0xAA, 0x8F, 0xDE, 0x6E, 0xB5, 0x88, 0x46, 0xBB, 0x6A,
0x9C, 0xF3, 0xF6, 0xED, 0x03, 0x2C, 0x39, 0x2C, 0x13, 0xFC, 0xE8, 0xD2, 0x62, 0x37, 0xC0, 0xD1,
0x82, 0x4B, 0xFD, 0xA2, 0x2A, 0xDF, 0x15, 0x81, 0x0B, 0x1B, 0xE7, 0x41, 0x0E, 0x5D, 0x03, 0x18,
0x0A, 0x09, 0x51, 0x61, 0x3F, 0x7F, 0xA5, 0xF9, 0x60, 0x80, 0x36, 0xB7, 0xAF, 0x1F, 0x4C, 0x48,
0xCF, 0x61, 0xE7, 0x36, 0x2D, 0xBF, 0x79, 0x8F, 0x3E, 0x15, 0xD4, 0x44, 0xF6, 0x02, 0xFB, 0xF1,
0x09, 0xD5, 0xB5, 0x45, 0xD4, 0xE0, 0x84, 0x1A, 0xC2, 0x30, 0x88, 0xB6, 0x42, 0xF4, 0xAF, 0x43,
0xFE, 0xC3, 0x9A, 0x91, 0x06, 0xE2, 0xA6, 0x18, 0xEC, 0x1E, 0x12, 0x2C, 0x8F, 0x08, 0x21, 0x05,
0x6F, 0x32, 0x75, 0x9A, 0x81, 0x41, 0x78, 0x1C, 0xC1, 0xD9, 0xC9, 0xA3, 0xA3, 0x97, 0x74, 0x8F,
0x35, 0x5F, 0x9E, 0xA9, 0xE1, 0x08, 0x5D, 0x46, 0xD5, 0x65, 0xEA, 0xC2, 0xB7, 0x41, 0x9B, 0x2A,
0xFD, 0xE5, 0x67, 0x5F, 0xD6, 0x89, 0x8A, 0xA7, 0xC0, 0xD2, 0x8A, 0xDD, 0xC1, 0x1F, 0x37, 0x49,
0x55, 0xEB, 0x1D, 0xD2, 0x93, 0x8B, 0x05, 0xD2, 0xED, 0xF7, 0x1F, 0x95, 0x64, 0xB6, 0xD3, 0xE3,
0xEF, 0xD8, 0x4F, 0x77, 0x32, 0x49, 0x13, 0x41, 0xAE, 0x8A, 0x00, 0x09, 0x9B, 0xBD, 0xFF, 0xA5,
0x8A, 0x06, 0xFF, 0x4D, 0x6D, 0x0D, 0x7E, 0x27, 0x42, 0xDA, 0x88, 0x85, 0xAD, 0x29, 0xBA, 0x49,
0x79, 0x2E, 0x06, 0xC7, 0xD9, 0x3B, 0xAA, 0xFA, 0x85, 0x90, 0xCE, 0x10, 0xC2, 0xCD, 0x41, 0x63,
0xA1, 0x34, 0x30, 0x24, 0xC1, 0x93, 0xD5, 0xC3, 0x9E, 0xC4, 0xF6, 0x86, 0xB9, 0x03, 0x15, 0x7E,
0x23, 0x43, 0xB4, 0x1B, 0x4E, 0x5D, 0xC4, 0x84, 0x6E, 0xF2, 0xCA, 0xFE, 0x9E, 0x9A, 0x8B, 0xF1,
0x00, 0x0C, 0x76, 0x10, 0x91, 0xE2, 0x97, 0x8A, 0x40, 0x5F, 0x06, 0x1B, 0x00, 0x58, 0x52, 0xBB,
0xAA, 0xA4, 0x73, 0x4E, 0xD0, 0xF3, 0x9D, 0x8C, 0xD0, 0x39, 0x8D, 0x3D, 0x67, 0x4D, 0xEA, 0x05,
0xA4, 0x04, 0x9A, 0xEF, 0xAC, 0x9A, 0x56, 0x8F, 0x46, 0x37, 0xC2, 0x8A, 0x27, 0x71, 0xE1, 0x2F,
0x3F, 0xC2, 0x9E, 0x77, 0x9E, 0xFD, 0xE2, 0x51, 0x13, 0x8C, 0xCA, 0x2B, 0xE3, 0x6E, 0x71, 0x8F,
0x7B, 0x23, 0xB5, 0xD9, 0x59, 0xAA, 0xF1, 0xB2, 0x53, 0xD8, 0xBF, 0xDB, 0xEC, 0x1D, 0x99, 0xD8,
0x41, 0x31, 0x75, 0xA4, 0x68, 0x34, 0xC8, 0x3A, 0x1F, 0xDF, 0xAF, 0xE9, 0xC7, 0xA8, 0xF2, 0x14,
0x1A, 0xF8, 0xB1, 0x4B, 0x3B, 0x67, 0x40, 0x07, 0xD1, 0x27, 0xCE, 0xA4, 0x7A, 0x44, 0x1F, 0x16,
0xF4, 0xE2, 0x26, 0x18, 0x09, 0x99, 0xC5, 0xB9, 0x39, 0x30, 0xEE, 0xC0, 0xEE, 0x9D, 0x74, 0x91,
0xCE, 0x32, 0x2C, 0xEE, 0xE6, 0xED, 0xC3, 0x2C, 0x4D, 0xAB, 0x6A, 0x5C, 0x16, 0xDA, 0xD2, 0xDE,
0x59, 0xBA, 0x9C, 0x96, 0x99, 0xC1, 0x15, 0x7E, 0x69, 0xD7, 0xEC, 0x6A, 0x55, 0xA2, 0x4F, 0xCD,
0xF6, 0xA2, 0x7E, 0x6C, 0xD3, 0x6A, 0xF5, 0x60, 0x9E, 0xB3, 0x7D, 0xD5, 0xF9, 0x5F, 0x77, 0x0D,
0x73, 0xC9, 0x51, 0x78, 0x15, 0xCC, 0x40, 0x42, 0xC2, 0xD9, 0x27, 0x0F, 0x4D, 0x00, 0x89, 0x7F,
0x97, 0xA1, 0xED, 0xEC, 0x5E, 0xCA, 0xE7, 0x73, 0x6E, 0xF5, 0x0F, 0x24, 0x8A, 0x15, 0xC0, 0x77,
0x05, 0xBB, 0x68, 0x76, 0xD6, 0xE4, 0x9C, 0x26, 0xEB, 0x35, 0x22, 0x7B, 0xA5, 0xE9, 0x1B, 0xB5,
0x6F, 0x1F, 0xBF, 0x6F, 0xC5, 0x29, 0x52, 0x8F, 0x60, 0x04, 0xAF, 0xDF, 0x61, 0x7C, 0xEA, 0x09,
0x6F, 0x5E, 0x19, 0x60, 0x9F, 0x0F, 0x99, 0x8A, 0x59, 0x07, 0x5E, 0x6B, 0xEC, 0x1E, 0xC0, 0x53,
0x55, 0xB6, 0x0E, 0xB7, 0xEA, 0xCD, 0xA2, 0x46, 0x58, 0x07, 0x0C, 0xAF, 0x28, 0x83, 0x35, 0x75,
0xF3, 0x6D, 0xDD, 0x69, 0x79, 0x5C, 0x29, 0x04, 0x84, 0x55, 0x0F, 0x6B, 0x47, 0xE2, 0x88, 0x6E,
0x17, 0x4E, 0x5B, 0x0D, 0x97, 0x35, 0x0C, 0x13, 0x8C, 0xF3, 0xA3, 0xE0, 0x94, 0x61, 0x5C, 0x60,
0x18, 0x87, 0x1A, 0x52, 0xDB, 0x90, 0xF8, 0x13, 0xB5, 0x42, 0xC2, 0x65, 0xFB, 0x13, 0x68, 0xE0,
0xC4, 0xB0, 0xC9, 0x90, 0x69, 0x86, 0x8C, 0x94, 0xDC, 0x0B, 0xB3, 0xB4, 0x8C, 0xDE, 0x38, 0x9F,
0xCF, 0x99, 0xA1, 0xD5, 0x8B, 0x7E, 0x27, 0xCD, 0xFA, 0x15, 0xC5, 0xE7, 0x75, 0x9A, 0x3D, 0x14,
0xEB, 0x72, 0x4E, 0x1C, 0xE8, 0xE1, 0x5B, 0xB1, 0xAA, 0x1D, 0x3D, 0xE2, 0x44, 0x27, 0x52, 0x19,
0x7A, 0x00, 0x4D, 0x1D, 0xD4, 0xDA, 0xC0, 0x67, 0x1C, 0x69, 0x03, 0x5B, 0x87, 0xA4, 0x18, 0xB1,
0xC0, 0xA0, 0x4D, 0x52, 0x7A, 0xBD, 0x36, 0x71, 0xED, 0x77, 0xDA, 0xC0, 0x2D, 0xB4, 0xDA, 0x20,
0xEF, 0xAC, 0x01, 0x3B, 0x64, 0x9B, 0xC6, 0xEB, 0x11, 0x9E, 0x61, 0x43, 0x30, 0xAF, 0x46, 0xAD,
0x33, 0xC2, 0xF3, 0x33, 0x42, 0x77, 0xC3, 0x17, 0x03, 0xC2, 0x2E, 0xED, 0x20, 0xCC, 0xBD, 0xA6,
0xD8, 0xAE, 0x49, 0xB4, 0x35, 0x71, 0x5A, 0x13, 0x99, 0x35, 0xC3, 0x99, 0x35, 0xED, 0xC2, 0xDA,
0x54, 0x04, 0x20, 0xF8, 0xDA, 0x40, 0x23, 0xD6, 0x24, 0xF6, 0xDA, 0x80, 0x13, 0x6B, 0x03, 0x9E,
0xAC, 0xC9, 0x85, 0x35, 0xF9, 0xB1, 0x26, 0x61, 0xD7, 0x24, 0xEC, 0x9A, 0xB1, 0xF1, 0x9A, 0x84,
0x05, 0x50, 0x23, 0x41, 0x41, 0x90, 0x72, 0x4F, 0x31, 0x41, 0x28, 0x16, 0xC6, 0xEC, 0x1C, 0xED,
0xD6, 0x79, 0xC0, 0x06, 0x76, 0xEB, 0x71, 0x35, 0x20, 0xF2, 0x62, 0xA0, 0x4A, 0xC5, 0x29, 0xC4,
0x7C, 0x32, 0x02, 0xA1, 0x81, 0x2F, 0x24, 0x48, 0xDC, 0x48, 0xE2, 0x31, 0x4A, 0x62, 0xE1, 0xC2,
0x59, 0x73, 0x00, 0xC7, 0x1D, 0x0C, 0x3B, 0xD7, 0xD3, 0x8D, 0x72, 0x33, 0x50, 0x9B, 0xD3, 0x32,
0x69, 0x38, 0x33, 0xAC, 0x29, 0xCC, 0xBD, 0xEF, 0x5C, 0xAE, 0xE4, 0x05, 0x2E, 0x86, 0x52, 0x14,
0x3D, 0xBC, 0xF8, 0x94, 0x86, 0x8E, 0x26, 0x05, 0x33, 0x47, 0x03, 0xB7, 0x63, 0x9C, 0xA5, 0xBC,
0x98, 0x1B, 0x3F, 0x1B, 0xF7, 0x3E, 0xE9, 0xAC, 0x98, 0xAA, 0x09, 0x7C, 0x7E, 0xF0, 0x1A, 0xA6,
0xE7, 0xFF, 0x7D, 0xEF, 0xF5, 0x4B, 0xF7, 0x6E, 0x0F, 0x7C, 0xBA, 0x78, 0x1D, 0xA2, 0x34, 0x97,
0x77, 0x70, 0xAD, 0x72, 0x52, 0x46, 0x48, 0xA3, 0xC4, 0x4B, 0x93, 0x38, 0x8B, 0x7E, 0x4A, 0x31,
0x01, 0xEE, 0x7C, 0x01, 0xF2, 0x55, 0x14, 0x77, 0x50, 0xD3, 0xF1, 0xC9, 0xCE, 0xD7, 0xCA, 0x4F,
0x07, 0x0A, 0x59, 0x2E, 0x6A, 0x1D, 0x76, 0x8B, 0x96, 0xBB, 0xF9, 0x36, 0x7B, 0x77, 0xEC, 0xE2,
0xD3, 0x13, 0xFB, 0x00, 0x3A, 0x63, 0xE2, 0xE9, 0xE1, 0x00, 0x61, 0xFC, 0xBA, 0x98, 0xD9, 0x25,
0x77, 0xCA, 0x5D, 0x2F, 0xDA, 0xEE, 0x50, 0x4C, 0xC0, 0x96, 0x99, 0x0F, 0x3E, 0x54, 0x4C, 0xE7,
0xCD, 0x6C, 0xB8, 0x37, 0x73, 0x06, 0xC2, 0x76, 0xF1, 0x0E, 0xD6, 0x29, 0x3E, 0xFE, 0x80, 0x29,
0x1B, 0xF2, 0xB1, 0x69, 0x76, 0xA6, 0xD8, 0xD6, 0x1E, 0x3C, 0x2F, 0x85, 0x7B, 0xEB, 0xE0, 0x0D,
0x2D, 0xF9, 0x4B, 0x41, 0x40, 0x59, 0x08, 0xBA, 0x82, 0xF2, 0x80, 0x58, 0x22, 0xAD, 0xE3, 0xED,
0xFB, 0x36, 0x0F, 0xC4, 0x65, 0x15, 0x92, 0x3F, 0xDF, 0x75, 0x75, 0x92, 0x73, 0x92, 0x66, 0x43,
0x52, 0x52, 0xDB, 0x3D, 0x58, 0x1A, 0x4C, 0x00, 0xA3, 0x0C, 0xCB, 0xD2, 0x80, 0x33, 0x08, 0xC4,
0x24, 0x0C, 0x85, 0xE9, 0x41, 0x5E, 0x54, 0x7A, 0x66, 0x97, 0xCC, 0xB0, 0xA4, 0x04, 0x4E, 0x8E,
0x73, 0x70, 0x95, 0xFE, 0x0D, 0x04, 0x26, 0xFE, 0xE7, 0x6E, 0x06, 0xE1, 0x7F, 0x30, 0x6C, 0xFE,
0x2F, 0xB1, 0x76, 0x35, 0x0D, 0x5F, 0x3E, 0xC7, 0xC0, 0x64, 0xC5, 0xB9, 0x84, 0xCD, 0x7E, 0x5F,
0x30, 0x5A, 0xC1, 0x4A, 0x4C, 0xAB, 0x5A, 0x3C, 0x11, 0xE3, 0xE9, 0x0E, 0xB1, 0x1F, 0x70, 0x38,
0xEF, 0xB0, 0x2E, 0x3A, 0x5D, 0x30, 0x0A, 0x64, 0x81, 0x85, 0x81, 0x62, 0xD4, 0x78, 0xC3, 0x1A,
0x58, 0xB0, 0xDC, 0x75, 0x86, 0x88, 0x30, 0xE8, 0x02, 0x44, 0xB5, 0x1A, 0x23, 0x61, 0x11, 0xF1,
0xF4, 0xFB, 0xB0, 0x61, 0xA6, 0xE6, 0x0D, 0x18, 0x53, 0x22, 0xEC, 0x34, 0x1C, 0x4B, 0x2A, 0x27,
0x79, 0xC4, 0xE7, 0x45, 0xAA, 0x42, 0x86, 0xA6, 0xE7, 0xDA, 0x05, 0xAA, 0x3A, 0x53, 0xFE, 0xFF,
0xF0, 0x79, 0xE6, 0xC2, 0xD7, 0x04, 0x14, 0xF9, 0x43, 0xE3, 0xAA, 0x02, 0x76, 0x96, 0x2A, 0x86,
0xB8, 0xCC, 0x13, 0xA9, 0x1C, 0x2C, 0x6A, 0x60, 0xFF, 0x9A, 0xFE, 0x3B, 0x9D, 0x69, 0x14, 0x93,
0x3C, 0x49, 0xC9, 0x34, 0x8F, 0xB2, 0x86, 0x55, 0x0B, 0x46, 0xEF, 0xE9, 0x47, 0x24, 0xC5, 0xBF,
0x36, 0x14, 0x4B, 0xD6, 0x83, 0xED, 0x52, 0xAD, 0x90, 0x4F, 0x01, 0x25, 0x34, 0xFE, 0x8C, 0x19,
0x09, 0xFB, 0x69, 0x3A, 0x34, 0x56, 0xE5, 0x30, 0xB2, 0xA0, 0xAB, 0x4D, 0x4B, 0xA4, 0x1A, 0x2C,
0x7C, 0x61, 0x69, 0xCD, 0x90, 0x6C, 0xC3, 0x08, 0xED, 0x82, 0xD9, 0x73, 0x41, 0xBE, 0x02, 0x89,
0xA8, 0x15, 0xEF, 0x09, 0xC3, 0x9C, 0x96, 0x18, 0xA1, 0x99, 0x2C, 0x5F, 0x38, 0xC5, 0x53, 0x1B,
0x06, 0xF2, 0x9A, 0xD8, 0x26, 0x3F, 0xE5, 0x76, 0xBE, 0x2C, 0xE7, 0x94, 0x8D, 0x71, 0x8E, 0xAB,
0x26, 0xBC, 0x8E, 0x90, 0xEE, 0x8B, 0x37, 0x4B, 0x4A, 0xBF, 0xD9, 0x15, 0x51, 0xE6, 0x6C, 0xF4,
0x30, 0x2F, 0xAF, 0xDE, 0xFC, 0x47, 0xA4, 0x7A, 0x25, 0x15, 0xB0, 0x16, 0x50, 0x30, 0x70, 0x52,
0xC5, 0x8A, 0x02, 0xF3, 0x56, 0x6E, 0x37, 0xE1, 0xCD, 0x63, 0xC9, 0xCA, 0xB2, 0xD9, 0x84, 0xB0,
0x14, 0xC2, 0x4C, 0x83, 0x35, 0x66, 0xA9, 0x7C, 0x76, 0x73, 0x92, 0x3D, 0xCC, 0x24, 0x38, 0x9B,
0x3B, 0xA6, 0xCA, 0x15, 0x05, 0xA5, 0xF3, 0x9C, 0x15, 0xB2, 0x33, 0xEB, 0x8C, 0xD2, 0x71, 0x3D,
0x5B, 0x18, 0xC8, 0x22, 0x93, 0xD5, 0xFC, 0xDB, 0x15, 0xCB, 0x25, 0x6F, 0xE5, 0xC6, 0x6C, 0xB8,
0x81, 0xB9, 0xE2, 0x19, 0x83, 0xAB, 0xAE, 0xB9, 0x78, 0x95, 0x8B, 0x66, 0xCC, 0x3E, 0x6F, 0x13,
0xBF, 0x5F, 0xC5, 0xD8, 0x4D, 0x1F, 0xB1, 0x24, 0x1E, 0x40, 0xB5, 0x1A, 0xBF, 0xE3, 0xBE, 0x7A,
0x16, 0xC3, 0xD7, 0xDC, 0xC0, 0x91, 0x2B, 0x69, 0x9C, 0x4A, 0xD5, 0x7E, 0xC9, 0xBD, 0x97, 0xBC,
0xFA, 0x43, 0x70, 0x21, 0xA9, 0xC3, 0x16, 0x1B, 0xFA, 0x2B, 0x57, 0x22, 0xB4, 0x39, 0xC2, 0x94,
0x36, 0x78, 0x7C, 0xAB, 0xF7, 0x5C, 0x31, 0x66, 0xEF, 0xCD, 0x6E, 0x3C, 0x34, 0x3E, 0x8D, 0xF2,
0x93, 0x63, 0x03, 0xD5, 0x60, 0x0C, 0x66, 0xCE, 0xA5, 0xC1, 0xB8, 0xAA, 0x00, 0xEF, 0x52, 0x93,
0xD8, 0xF1, 0x34, 0xB4, 0xED, 0x29, 0x0B, 0x53, 0x37, 0xAF, 0xA8, 0xD1, 0x5D, 0x05, 0xB2, 0x08,
0x02, 0x96, 0x15, 0x2C, 0x47, 0x6D, 0x59, 0x8E, 0x6A, 0x5C, 0x39, 0xAA, 0x90, 0x22, 0x69, 0xBE,
0xAB, 0x49, 0x95, 0xCF, 0x02, 0x57, 0x9E, 0xC9, 0x5D, 0xED, 0xAA, 0xE6, 0xB0, 0x01, 0xF6, 0xFF,
0xA8, 0xC2, 0x54, 0xB7, 0x93, 0xA5, 0x3A, 0x35, 0x97, 0xFF, 0x1F, 0x78, 0xDC, 0xD6, 0xF4, 0x17,
0x0D, 0x7D, 0x2E, 0xE5, 0x2F, 0xCD, 0x2F, 0xD7, 0xE3, 0x2E, 0xB5, 0xDC, 0xF5, 0x61, 0xDF, 0x70,
0xBC, 0xDE, 0x72, 0x2C, 0x92, 0xBE, 0x66, 0x9E, 0xF0, 0xBA, 0x9A, 0xE5, 0xE2, 0x85, 0x20, 0x1D,
0xE3, 0x12, 0xF4, 0xFA, 0xAC, 0x0C, 0xB7, 0xF7, 0x6C, 0xC9, 0xCA, 0x7F, 0x89, 0x39, 0x75, 0x89,
0xC9, 0xD3, 0x2B, 0x36, 0x13, 0x1F, 0x7E, 0x65, 0x17, 0xB8, 0x4B, 0x5D, 0xC2, 0xDC, 0x54, 0x65,
0x34, 0xDC, 0xB0, 0x6E, 0x2A, 0x55, 0x4C, 0xC8, 0xDF, 0xF7, 0xC7, 0x1A, 0x29, 0xF3, 0x52, 0x22,
0x17, 0x6C, 0x6F, 0x0D, 0xCE, 0xB7, 0x62, 0x65, 0xC9, 0x9D, 0x97, 0xB2, 0xF4, 0x6A, 0x55, 0xCD,
0xB5, 0x14, 0xA9, 0xAA, 0xEC, 0x69, 0x9F, 0x2F, 0x8A, 0xC8, 0x5D, 0x62, 0x9B, 0xDF, 0xFB, 0xE1,
0x9C, 0xE0, 0xA4, 0x0C, 0x0A, 0xA5, 0xBA, 0xE4, 0x1D, 0x3B, 0xD7, 0x0A, 0x41, 0x14, 0x4B, 0x66,
0x5C, 0x31, 0x6F, 0x69, 0xB7, 0x2C, 0x2B, 0xAD, 0x46, 0x7D, 0x63, 0x7B, 0xF7, 0xD2, 0xFB, 0xD7,
0x6D, 0xF3, 0x5E, 0xC6, 0xA8, 0xF4, 0x84, 0x5E, 0xE3, 0x7D, 0xA1, 0x97, 0x75, 0xF4, 0x4A, 0x9F,
0xA1, 0x57, 0x7C, 0x19, 0x08, 0xBD, 0x92, 0x1D, 0xBD, 0x8A, 0x1D, 0xBD, 0x7E, 0xBB, 0xA3, 0x57,
0xBC, 0x63, 0xCC, 0x5C, 0x73, 0xBC, 0x4E, 0xDF, 0x14, 0xFF, 0x1E, 0xF2, 0x16, 0xD1, 0xF9, 0x7B,
0x15, 0x08, 0x79, 0x53, 0xBD, 0x40, 0x22, 0xD8, 0x22, 0x5B, 0x42, 0x4E, 0x7B, 0xBD, 0xBD, 0x67,
0x20, 0xA5, 0x23, 0xE4, 0xEE, 0x9C, 0x34, 0x7E, 0xDD, 0xF6, 0x4D, 0xC8, 0x76, 0xE1, 0x6A, 0x7C,
0x62, 0x94, 0xF4, 0x4B, 0xFF, 0xD4, 0x37, 0x25, 0x39, 0x2D, 0xD4, 0x6E, 0xD4, 0x5C, 0x25, 0xD4,
0x7F, 0xC4, 0x9D, 0xD1, 0xA8, 0xFF, 0xBD, 0x51, 0x76, 0x50, 0x55, 0x23, 0x55, 0xAA, 0xEC, 0x85,
0xCD, 0x1F, 0x32, 0xB8, 0xA0, 0x0C, 0xCC, 0xC8, 0x60, 0xD3, 0x33, 0xC4, 0xF5, 0x19, 0x8C, 0x79,
0x06, 0x1E, 0x65, 0x44, 0x0C, 0x22, 0xA2, 0xE1, 0xF7, 0x34, 0x72, 0x31, 0x1D, 0xB0, 0x42, 0x35,
0xA2, 0x71, 0x9B, 0x69, 0x9D, 0x41, 0xC4, 0x32, 0x98, 0xFF, 0x0C, 0x96, 0xE2, 0xA6, 0x7E, 0xDE,
0x35, 0xEF, 0xEA, 0x36, 0xCC, 0x41, 0x3A, 0xA9, 0xA3, 0xC2, 0xFE, 0x0E, 0x0E, 0x01, 0x26, 0xE1,
0x0F, 0x8F, 0x4F, 0x10, 0xD0, 0xF8, 0x88, 0x65, 0x3A, 0x50, 0xDC, 0xC2, 0x52, 0x8B, 0xDB, 0x95,
0x07, 0x02, 0xC8, 0xB7, 0xFB, 0x98, 0x31, 0x28, 0x8F, 0xF6, 0x7C, 0x9E, 0xDE, 0x94, 0xCF, 0xB3,
0x58, 0x43, 0x7F, 0x3C, 0x16, 0x91, 0x82, 0xF1, 0x9E, 0x44, 0xFC, 0x05, 0xB5, 0x2E, 0xA5, 0x58,
0xF3, 0xDC, 0x70, 0x06, 0x0C, 0xDE, 0xA3, 0x1D, 0x90, 0xAF, 0x71, 0x2D, 0x5D, 0xA4, 0xB3, 0x0C,
0x0B, 0xB6, 0x37, 0x46, 0x37, 0xD5, 0xBE, 0xF6, 0x2E, 0xD7, 0x11, 0x10, 0x26, 0xC1, 0xFE, 0x18,
0x0B, 0x5A, 0x1C, 0x58, 0xD0, 0x8C, 0x16, 0x34, 0x13, 0xC5, 0xE7, 0x1A, 0xAF, 0x60, 0xC3, 0x9F,
0xD6, 0xE0, 0xB7, 0x65, 0xF1, 0x44, 0x83, 0x13, 0x6A, 0xF0, 0x4B, 0xCD, 0xED, 0x0C, 0x6E, 0x47,
0x06, 0x99, 0xF4, 0xD1, 0xE6, 0xEF, 0x10, 0x57, 0x62, 0x47, 0x2E, 0x76, 0x7B, 0xE9, 0xED, 0x8E,
0x50, 0x26, 0x15, 0x53, 0xE4, 0x9A, 0x0F, 0xA4, 0x9C, 0x7E, 0xBE, 0xA8, 0x3D, 0xE3, 0x29, 0xA9,
0x22, 0xB7, 0xCB, 0x61, 0x60, 0xE9, 0x2C, 0x27, 0x43, 0x02, 0xD6, 0x51, 0xA3, 0xE6, 0x4C, 0x9D,
0xD4, 0x2C, 0x22, 0xEF, 0x0E, 0x65, 0x3A, 0xDE, 0x9E, 0x14, 0x51, 0x12, 0x6B, 0x0A, 0x6B, 0xFE,
0xF4, 0xAB, 0xBB, 0xAF, 0x52, 0x6E, 0xE1, 0xC9, 0x0D, 0x6C, 0x70, 0x0A, 0x46, 0xB3, 0xE8, 0x99,
0xA1, 0xE9, 0x57, 0x6C, 0x05, 0x5A, 0x05, 0x84, 0xAD, 0xCE, 0x7D, 0x9B, 0xB6, 0xB7, 0x2C, 0x36,
0xA3, 0x7D, 0x3B, 0xA4, 0x34, 0x76, 0x17, 0x73, 0x41, 0x76, 0x3E, 0xD1, 0x58, 0xCE, 0x45, 0x46,
0x77, 0x94, 0xC9, 0x30, 0x9B, 0x31, 0x75, 0xE7, 0x80, 0x37, 0x70, 0x67, 0x86, 0x51, 0xCF, 0x9A,
0x44, 0x3D, 0x97, 0xB3, 0x2B, 0x09, 0x88, 0xCE, 0x96, 0x13, 0xB4, 0x98, 0x76, 0x9B, 0xE5, 0xF0,
0x33, 0x66, 0xF8, 0x61, 0xCB, 0x08, 0x40, 0x84, 0x37, 0x18, 0x45, 0x72, 0x23, 0x4B, 0xD9, 0x2D,
0xE3, 0x47, 0x58, 0x06, 0x31, 0xF9, 0x07, 0x39, 0x4F, 0x91, 0x12, 0xB2, 0x1C, 0x9D, 0x28, 0xF3,
0x61, 0x9B, 0x85, 0xA0, 0x5B, 0xD0, 0x9D, 0x05, 0xED, 0x9A, 0x95, 0x04, 0xA6, 0xB7, 0x7E, 0x3F,
0xF8, 0x1D, 0x66, 0xDE, 0xF6, 0xEA, 0x2B, 0xCC, 0x3D, 0x75, 0xEA, 0x09, 0x28, 0xB9, 0x69, 0x25,
0xB7, 0x2B, 0x1A, 0x39, 0x77, 0x20, 0x57, 0x1B, 0x89, 0xCE, 0x11, 0x90, 0x2F, 0xC7, 0x53, 0x1B,
0x97, 0x53, 0xFA, 0x72, 0x7A, 0x2F, 0x85, 0xA2, 0x82, 0xE8, 0xA7, 0x0C, 0x3E, 0xE3, 0x69, 0x39,
0xFB, 0x93, 0xEC, 0x50, 0xBE, 0xEA, 0x13, 0xF8, 0x81, 0x8D, 0x94, 0x9B, 0x43, 0x12, 0x1E, 0xA1,
0x0E, 0x06, 0x8D, 0x64, 0x6B, 0xA1, 0x44, 0x18, 0xAF, 0xA2, 0x18, 0xD3, 0x13, 0x47, 0xB1, 0xB0,
0x5D, 0x28, 0xE6, 0xCB, 0xFF, 0x3A, 0xEC, 0x29, 0x76, 0x46, 0x5F, 0xA3, 0xE9, 0x66, 0x52, 0x49,
0xC8, 0x37, 0x0B, 0xC5, 0xC2, 0x5D, 0x0C, 0xBC, 0x3F, 0xDF, 0xDA, 0x1F, 0xCF, 0xD1, 0x1D, 0xBF,
0x4F, 0xCC, 0x2A, 0x76, 0xE3, 0xC9, 0x05, 0xBD, 0x76, 0xCD, 0x76, 0xF3, 0xF8, 0xC4, 0x9D, 0x40,
0xA8, 0x8D, 0x8B, 0xA4, 0x39, 0x9E, 0x23, 0x93, 0xF9, 0x24, 0x62, 0x74, 0x6E, 0x94, 0xAF, 0x79,
0xB8, 0x06, 0x35, 0x52, 0xC5, 0xF1, 0x31, 0x8F, 0xE4, 0x9A, 0x4A, 0x0A, 0x64, 0x3F, 0x60, 0x1A,
0x10, 0x6F, 0xF9, 0xCB, 0xF3, 0x34, 0xE0, 0x42, 0x7D, 0x67, 0x90, 0x53, 0xC0, 0x5E, 0x0E, 0x3A,
0xCE, 0x9F, 0xA7, 0x2B, 0xF0, 0xB4, 0x9F, 0xF3, 0x74, 0xC5, 0x93, 0xA3, 0x8D, 0xA3, 0x97, 0x5D,
0xEA, 0x97, 0x10, 0xC8, 0x92, 0xEC, 0xC3, 0xCE, 0x89, 0xE4, 0xB3, 0xB7, 0x54, 0x09, 0x94, 0xFE,
0x9C, 0x05, 0x88, 0x04, 0xBE, 0x28, 0x77, 0x27, 0xAF, 0x4F, 0xDD, 0x18, 0xCB, 0x7C, 0xB4, 0xE3,
0xD1, 0x83, 0x2B, 0x51, 0x84, 0xC8, 0xFB, 0x11, 0x22, 0x7F, 0x1E, 0xE5, 0xE7, 0x27, 0xC8, 0x51,
0xFE, 0x52, 0x55, 0xCC, 0xFB, 0xBD, 0x3B, 0xEA, 0xFF, 0x00, 0xD5, 0x5A, 0x3D, 0x8C, 0xDC, 0xD6,
0xBD, 0x5A, 0x3D, 0x8C, 0xE5, 0x56, 0x15, 0xBE, 0xB6, 0x77, 0xD7, 0x12, 0x16, 0x72, 0x8A, 0x2C,
0x44, 0x6C, 0xE1, 0x26, 0x55, 0x22, 0xE2, 0x36, 0xC5, 0x8E, 0xAF, 0xA3, 0x88, 0x3E, 0xC5, 0x4E,
0x56, 0x62, 0x8A, 0xD0, 0x12, 0x09, 0x4D, 0x93, 0x82, 0x62, 0xE6, 0xD9, 0x90, 0x82, 0x22, 0x05,
0x2B, 0xA1, 0x20, 0xA4, 0x34, 0x14, 0x09, 0x82, 0xB7, 0xC5, 0x36, 0x14, 0x20, 0xBD, 0x79, 0xB6,
0x40, 0xA2, 0xA1, 0x88, 0x41, 0x42, 0x94, 0x38, 0x62, 0xB7, 0x48, 0x28, 0x62, 0x81, 0x23, 0xFC,
0x36, 0xB6, 0x2F, 0xDF, 0x77, 0xAE, 0xFD, 0xDE, 0xCC, 0xEE, 0xEC, 0x6F, 0x56, 0xF8, 0xF9, 0x1E,
0xCF, 0xF3, 0xBB, 0x3F, 0xE7, 0x9E, 0xFF, 0x73, 0xEE, 0x68, 0xA5, 0xCF, 0xF9, 0x24, 0xEA, 0x95,
0xE9, 0xF3, 0x6D, 0x75, 0x41, 0xF1, 0xD2, 0xAA, 0x48, 0x8B, 0x3C, 0xC3, 0xB7, 0x55, 0x50, 0x4D,
0xB7, 0x5F, 0xE2, 0x3E, 0xC2, 0xED, 0xF1, 0x7E, 0xD5, 0xCB, 0x95, 0xFA, 0xAD, 0x53, 0xA3, 0x73,
0xEB, 0x11, 0x36, 0x5E, 0xA5, 0x94, 0xD3, 0x78, 0xA5, 0x52, 0x6E, 0xE3, 0x13, 0xD6, 0x01, 0xA0,
0x57, 0x05, 0xB9, 0xFA, 0xDA, 0xCD, 0xBB, 0xB7, 0x3E, 0x4B, 0x43, 0x83, 0x2B, 0xBF, 0x78, 0xF0,
0xB7, 0xC3, 0xFD, 0x54, 0x05, 0x79, 0x8C, 0x41, 0x61, 0x9A, 0x08, 0xDC, 0x03, 0x8C, 0xD4, 0x55,
0xC0, 0x58, 0x1D, 0x61, 0x79, 0x74, 0x1C, 0x27, 0xA8, 0xF6, 0x54, 0x8B, 0xF7, 0x57, 0x55, 0x03,
0x78, 0xE4, 0x10, 0xAE, 0x5C, 0xC2, 0xCE, 0xB5, 0x8B, 0x57, 0xF3, 0xE2, 0xCA, 0x41, 0xC3, 0x6A,
0xD2, 0xAE, 0xDC, 0x50, 0xBE, 0x31, 0x55, 0x64, 0x4C, 0x93, 0x7D, 0xF0, 0xF3, 0xE6, 0x04, 0xEF,
0xFA, 0xA9, 0x0D, 0x68, 0xD9, 0x7B, 0xB9, 0x8A, 0x4D, 0x8E, 0x3E, 0x9D, 0x52, 0x19, 0xFE, 0x08,
0x4C, 0xA3, 0x82, 0x9F, 0x74, 0x18, 0xDB, 0xA3, 0xAD, 0xF8, 0x4C, 0x83, 0x1F, 0xF5, 0xE3, 0xC1,
0xAD, 0x16, 0x68, 0x54, 0x19, 0x31, 0xB9, 0x92, 0xEF, 0xE6, 0x67, 0xB3, 0x97, 0x3B, 0x72, 0x07,
0x2A, 0x34, 0x25, 0x90, 0x57, 0xF1, 0xEB, 0x35, 0x30, 0x56, 0x09, 0x10, 0x5D, 0x11, 0xF7, 0x86,
0xD8, 0x1F, 0x01, 0xCD, 0x46, 0x1E, 0x24, 0x0C, 0x1E, 0x61, 0x2E, 0x8F, 0x48, 0x36, 0xD6, 0x26,
0x97, 0x6E, 0xA8, 0x3D, 0xA7, 0x59, 0xE9, 0x5E, 0xBD, 0xE2, 0x36, 0xED, 0xBA, 0x50, 0xD1, 0x07,
0x7F, 0x6D, 0xDA, 0x30, 0x0D, 0xCC, 0xBB, 0x7F, 0x69, 0xC2, 0xDC, 0xF9, 0x7D, 0xF8, 0x87, 0x86,
0xC4, 0x8C, 0xDC, 0x9A, 0x13, 0x24, 0x9E, 0x3C, 0x8E, 0xEC, 0xA3, 0x93, 0x97, 0x6E, 0xE3, 0xB2,
0x8B, 0x57, 0x39, 0x18, 0xA0, 0xF0, 0x57, 0x17, 0xA5, 0x44, 0x2B, 0x1B, 0xC9, 0x4D, 0x15, 0x75,
0x82, 0xAB, 0x93, 0xCE, 0x58, 0x47, 0x86, 0x7F, 0x16, 0x06, 0x34, 0x74, 0xC6, 0x03, 0xE0, 0xE8,
0xB5, 0x0E, 0xFA, 0x00, 0xCD, 0x7E, 0x07, 0xF9, 0xC6, 0xE9, 0x3C, 0xD2, 0x7F, 0x88, 0x48, 0x6D,
0x5D, 0x70, 0xDB, 0xD1, 0xC0, 0x19, 0x32, 0xBE, 0x76, 0xCD, 0xA0, 0xBC, 0x3A, 0x68, 0xB3, 0xDC,
0xAF, 0xA2, 0x32, 0xAA, 0xC3, 0x52, 0xA7, 0x7E, 0x07, 0x88, 0x59, 0x75, 0xAA, 0x49, 0x5B, 0x59,
0xBE, 0x27, 0x0C, 0x7A, 0x15, 0x97, 0x4A, 0x8F, 0x2A, 0xDC, 0x5C, 0x37, 0x18, 0x61, 0x4C, 0x17,
0xD6, 0xC0, 0x21, 0xF7, 0x7A, 0xE5, 0xBC, 0x41, 0xC6, 0xF2, 0x3A, 0x3A, 0x3A, 0x7A, 0x15, 0x22,
0xB9, 0xC2, 0xC2, 0x8D, 0x5F, 0x85, 0x65, 0x94, 0xC7, 0x29, 0xA5, 0x74, 0x81, 0xCF, 0xC9, 0xA9,
0x0F, 0xBF, 0xF3, 0x7D, 0x9C, 0x87, 0x65, 0x58, 0xF9, 0xB5, 0x4B, 0xA4, 0x8F, 0xD5, 0x85, 0x15,
0xDE, 0x45, 0x69, 0x58, 0xFA, 0xB5, 0xD7, 0xB8, 0xDC, 0x54, 0x8F, 0xCF, 0x3C, 0x60, 0xFE, 0x9C,
0xA8, 0x81, 0xEF, 0x5D, 0xAE, 0xD1, 0x04, 0x55, 0x98, 0x6B, 0x0C, 0x7D, 0xCE, 0x12, 0xC8, 0xAF,
0x6D, 0xA3, 0x4C, 0xA1, 0xBD, 0xE8, 0x95, 0x17, 0xB3, 0x9F, 0xFD, 0x69, 0x2C, 0x20, 0x07, 0xDF,
0x2A, 0xC6, 0x8F, 0x54, 0x88, 0x8D, 0x6B, 0x30, 0xF7, 0x04, 0x9B, 0xEC, 0xE3, 0xDC, 0x6B, 0xC3,
0x4A, 0x68, 0xFF, 0x9C, 0x43, 0xA1, 0x57, 0x8F, 0x00, 0x19, 0xA6, 0x49, 0x05, 0x5C, 0xBE, 0xFE,
0xC5, 0xFE, 0xA3, 0x46, 0x28, 0xE0, 0x13, 0x92, 0x08, 0x25, 0x89, 0x90, 0x40, 0xA0, 0x8E, 0x88,
0x26, 0x39, 0x97, 0xE2, 0xDE, 0xDF, 0x3F, 0xA3, 0xAC, 0x0A, 0x2A, 0xAC, 0xB0, 0x3B, 0x45, 0xD9,
0x23, 0x0B, 0x9D, 0x56, 0x98, 0xA9, 0xA8, 0xA1, 0x01, 0xB6, 0x13, 0x52, 0x88, 0x72, 0x6A, 0x99,
0x48, 0x05, 0xF6, 0x2C, 0xDD, 0x14, 0xF8, 0xEC, 0x4E, 0x5D, 0xFD, 0x87, 0x74, 0xB5, 0x57, 0x0C,
0x91, 0x52, 0xD0, 0x09, 0xE5, 0x51, 0x70, 0x82, 0xDA, 0xE9, 0xD9, 0xF9, 0x84, 0xBD, 0xC1, 0x8D,
0x54, 0x98, 0xA2, 0x88, 0xAE, 0x05, 0x51, 0xFE, 0x30, 0x30, 0xF5, 0x93, 0x61, 0x32, 0x01, 0xA6,
0x5A, 0x63, 0x52, 0xA0, 0xE5, 0x6D, 0xAE, 0x74, 0x5C, 0x08, 0x08, 0xC5, 0x22, 0xAD, 0x14, 0x11,
0xEC, 0x04, 0x92, 0x58, 0xD4, 0xDE, 0x97, 0x75, 0xF4, 0xCF, 0x5A, 0xBF, 0x5E, 0x7F, 0x1D, 0x6F,
0x9E, 0xE2, 0x16, 0x1A, 0x0E, 0x50, 0x7B, 0x53, 0xEA, 0x3B, 0x87, 0x4D, 0x02, 0xF9, 0xBF, 0x00,
0x76, 0x4E, 0xF4, 0x98, 0x9A, 0x33, 0xD1, 0xC5, 0x6F, 0x2C, 0x3D, 0x34, 0xB0, 0x58, 0xE3, 0x15,
0x5E, 0x07, 0xC4, 0x2A, 0xBF, 0xEF, 0x6B, 0xB1, 0x5C, 0x2E, 0x29, 0x28, 0x6C, 0x56, 0xE3, 0x8A,
0x91, 0xCA, 0x86, 0x4D, 0x60, 0x99, 0x16, 0xFC, 0x71, 0x39, 0xB7, 0x12, 0x0D, 0x3A, 0xD9, 0x02,
0xBE, 0x93, 0xC5, 0x03, 0xAC, 0xF4, 0x76, 0x81, 0xA5, 0xCC, 0xA0, 0xA6, 0xBD, 0xAB, 0x2B, 0x32,
0x62, 0x14, 0x9D, 0x53, 0x13, 0x37, 0x4E, 0x81, 0x0C, 0x74, 0x71, 0x06, 0xB5, 0x4E, 0xD1, 0xAF,
0xE0, 0x88, 0xC8, 0x8C, 0xC0, 0xF3, 0xB2, 0xA8, 0xBA, 0x4C, 0xEA, 0x11, 0x84, 0x04, 0x31, 0xC1,
0x9E, 0xEC, 0xAE, 0xA7, 0x9D, 0x06, 0xF0, 0x2B, 0x80, 0x10, 0x56, 0x0F, 0x9C, 0xEE, 0xC9, 0xE6,
0x9E, 0xE2, 0xD0, 0x5B, 0x1B, 0xE0, 0x57, 0x00, 0xB0, 0x27, 0xA2, 0xBE, 0xBD, 0xC8, 0x6E, 0x2B,
0xE0, 0xA5, 0xE5, 0x72, 0xFC, 0xE5, 0x84, 0xF8, 0xFD, 0x00, 0xFB, 0xAD, 0x62, 0xA0, 0x12, 0xF3,
0x39, 0xE1, 0x39, 0xB7, 0x64, 0x6E, 0x6F, 0xDF, 0x50, 0x99, 0xB5, 0xF2, 0xD5, 0x05, 0x15, 0x51,
0x48, 0x3B, 0x75, 0x1F, 0x07, 0xD8, 0xDC, 0x2E, 0x05, 0x07, 0x36, 0xAF, 0x65, 0x15, 0xB5, 0x26,
0xA6, 0xC5, 0xBE, 0x3C, 0xCB, 0xA2, 0xC3, 0x6F, 0x11, 0x41, 0x71, 0xE7, 0x9A, 0x72, 0x49, 0x34,
0x0A, 0xB1, 0x48, 0xB0, 0xB0, 0x0C, 0xA6, 0x40, 0x59, 0x21, 0x56, 0xFA, 0x12, 0xE8, 0xA2, 0x63,
0x18, 0x7A, 0xBD, 0x3E, 0xC0, 0x8E, 0x6A, 0xD0, 0x54, 0xE7, 0xA7, 0xC4, 0x35, 0x3A, 0x05, 0x20,
0x90, 0x31, 0x8C, 0x08, 0x7E, 0x03, 0x6B, 0xD7, 0xCA, 0x1B, 0xFC, 0x9E, 0xFC, 0x68, 0x94, 0xB8,
0x0D, 0x91, 0x45, 0xE1, 0xF1, 0x0E, 0xCC, 0xFC, 0xD8, 0x32, 0x94, 0x92, 0x33, 0x61, 0x53, 0x6F,
0xB1, 0xC9, 0xE7, 0x6E, 0x8B, 0x59, 0x0C, 0x9C, 0x7B, 0xFA, 0x6E, 0x31, 0x8F, 0xB7, 0x7D, 0xD7,
0x67, 0x64, 0x64, 0xD2, 0x42, 0xA8, 0x84, 0x43, 0x84, 0xFC, 0xCD, 0x75, 0xF0, 0xA8, 0x42, 0x27,
0x41, 0xD7, 0x2A, 0xD1, 0xA4, 0x49, 0x0B, 0x0A, 0x14, 0x78, 0x39, 0x50, 0xAE, 0x0A, 0x78, 0x28,
0x0C, 0x13, 0xE3, 0x01, 0xE5, 0xED, 0x82, 0x0E, 0xC3, 0x9C, 0x91, 0xEB, 0x08, 0x0D, 0x44, 0x1F,
0xC3, 0x2D, 0x80, 0x52, 0xCA, 0x2C, 0x2D, 0x1C, 0x9C, 0x67, 0x84, 0xC4, 0xE6, 0x86, 0xB2, 0x86,
0x5A, 0xAE, 0xC3, 0x81, 0xF6, 0x1F, 0x93, 0x06, 0x9B, 0xC3, 0x46, 0x45, 0x25, 0xF4, 0x00, 0x0A,
0x22, 0xA2, 0x92, 0x90, 0xC5, 0x34, 0xD9, 0xA0, 0xBC, 0x00, 0x7E, 0x15, 0x77, 0x80, 0x49, 0x1D,
0x93, 0x86, 0x5F, 0x1C, 0x18, 0x4E, 0x0A, 0xBE, 0x14, 0xDD, 0x4E, 0x94, 0x93, 0xFB, 0xE9, 0x07,
0xC4, 0x2F, 0x38, 0x50, 0x88, 0x80, 0x0E, 0x38, 0x30, 0xB7, 0xF1, 0xEA, 0x1A, 0xDA, 0x05, 0x6B,
0xF5, 0x52, 0xAD, 0xCE, 0xBB, 0x76, 0x16, 0xD1, 0x01, 0x5E, 0x71, 0x15, 0x57, 0x42, 0xD0, 0xFB,
0xAE, 0x88, 0x76, 0x35, 0xE7, 0xE6, 0x8F, 0x61, 0x31, 0x3B, 0xB5, 0xDD, 0x9A, 0xF2, 0x29, 0x35,
0x19, 0x9D, 0x01, 0xE9, 0x95, 0xD1, 0x23, 0x8C, 0xA7, 0xFF, 0xD0, 0xD5, 0xF4, 0xBB, 0x8A, 0x3B,
0x11, 0x43, 0x7E, 0x8F, 0x44, 0x47, 0x0B, 0xE2, 0x18, 0x88, 0x3C, 0x48, 0x07, 0x3F, 0x3D, 0x85,
0x18, 0x05, 0x45, 0xCF, 0xB6, 0xE1, 0xDE, 0x0B, 0x4A, 0xB5, 0xBC, 0xB7, 0xCB, 0x3B, 0xDB, 0x79,
0x62, 0xEB, 0x6F, 0xCF, 0xFB, 0xD3, 0xD9, 0xAE, 0x16, 0x8C, 0x34, 0x39, 0x95, 0xF5, 0xD1, 0x2E,
0xF9, 0xA5, 0xBB, 0x79, 0x82, 0x77, 0xCE, 0x2C, 0x76, 0xC9, 0xB4, 0xD4, 0x67, 0xA5, 0x3F, 0x2A,
0xF2, 0x17, 0x45, 0xE0, 0xFC, 0xCA, 0x3A, 0x8A, 0xD3, 0x1E, 0x00, 0x0C, 0x85, 0x6D, 0x51, 0x7E,
0x3B, 0x7D, 0xA5, 0xF9, 0x60, 0x1C, 0x36, 0xB5, 0xE7, 0x4F, 0x4D, 0x48, 0x07, 0x61, 0xA6, 0x36,
0xCE, 0xBF, 0x39, 0xB7, 0x3E, 0x14, 0xD4, 0x0C, 0x95, 0xC6, 0x33, 0xEF, 0x1F, 0x52, 0x5D, 0x6B,
0x04, 0x07, 0xD6, 0x96, 0x41, 0x18, 0x3A, 0x91, 0x79, 0x88, 0xFE, 0x45, 0xC8, 0xBF, 0x5F, 0x32,
0xA0, 0x40, 0x78, 0x14, 0x82, 0xDD, 0x5D, 0x84, 0xE5, 0x11, 0x08, 0xC4, 0xE0, 0x4D, 0xA2, 0x8E,
0x12, 0x30, 0x08, 0x8F, 0x3D, 0xF8, 0x34, 0x79, 0x34, 0x74, 0x86, 0xF6, 0xB1, 0xE2, 0xCB, 0x63,
0xD5, 0xED, 0xA1, 0xCB, 0xA0, 0x60, 0xCC, 0x4F, 0x5C, 0xE3, 0xD5, 0xB1, 0xD2, 0x9F, 0x7F, 0xFC,
0x79, 0x19, 0xA9, 0x70, 0xF4, 0x0C, 0x55, 0xE2, 0x0D, 0x7C, 0xB8, 0x49, 0xAA, 0x5A, 0x6B, 0x91,
0x1E, 0xAD, 0xCB, 0x8F, 0x37, 0xDF, 0xB9, 0x95, 0x93, 0xD9, 0x46, 0x88, 0xFA, 0xB2, 0xF9, 0x70,
0x2B, 0x93, 0x34, 0x11, 0xE4, 0xAA, 0x08, 0x90, 0xB0, 0xD9, 0xF9, 0x2F, 0xD5, 0xD9, 0xFB, 0x37,
0xB5, 0xD5, 0xFB, 0x44, 0x84, 0xB4, 0x12, 0x0B, 0x5B, 0x9E, 0x88, 0x86, 0x2F, 0xC4, 0xE0, 0x58,
0x7B, 0x07, 0x33, 0x02, 0x81, 0x26, 0xE9, 0xC4, 0x49, 0x42, 0x61, 0x61, 0xA0, 0xA1, 0x34, 0xD0,
0x5B, 0xEF, 0xEE, 0xF2, 0x66, 0x4B, 0x62, 0x83, 0x04, 0xB6, 0x43, 0x54, 0x52, 0xD5, 0x39, 0x44,
0xDB, 0xE1, 0xE9, 0x42, 0x26, 0xB4, 0x93, 0x17, 0xE6, 0x53, 0x5A, 0x20, 0x8C, 0x07, 0x60, 0x4C,
0x03, 0xBD, 0xC4, 0x2F, 0x05, 0x81, 0x3E, 0x0B, 0xD6, 0x00, 0x30, 0x15, 0x66, 0x59, 0x48, 0xE7,
0x94, 0xA0, 0xE5, 0x3B, 0x19, 0xA1, 0x53, 0x1A, 0x7B, 0xCE, 0x1A, 0x95, 0x33, 0x88, 0x09, 0x34,
0xDF, 0x19, 0x35, 0x2E, 0x6F, 0x0D, 0x76, 0x84, 0x11, 0x4F, 0x62, 0xA3, 0x5C, 0xFE, 0x09, 0x7B,
0xDE, 0x38, 0xE6, 0xB3, 0x5B, 0x95, 0x37, 0x28, 0x27, 0x0F, 0x49, 0x80, 0xB8, 0x54, 0xD6, 0x2F,
0x5A, 0xDF, 0xB4, 0xDE, 0x3A, 0xB7, 0xE1, 0xAC, 0x53, 0xD8, 0xBD, 0x5B, 0xEF, 0x1C, 0x19, 0x87,
0x69, 0x31, 0x8B, 0xA4, 0x68, 0xD0, 0xC9, 0x3A, 0xEF, 0x1F, 0x94, 0x34, 0xA8, 0x54, 0x79, 0x0A,
0x0D, 0xFC, 0xD8, 0x99, 0x9D, 0x33, 0x6E, 0x83, 0xE8, 0x13, 0x67, 0x52, 0x3D, 0xA0, 0x0F, 0xF3,
0x5A, 0x71, 0x13, 0xF4, 0xD8, 0xFD, 0xEC, 0xDC, 0x2C, 0x18, 0xB6, 0x60, 0xFB, 0x4E, 0xBA, 0x48,
0x67, 0x19, 0x16, 0x36, 0xD3, 0xF6, 0x61, 0x96, 0xC6, 0x65, 0x31, 0xCC, 0x0B, 0x6D, 0xC4, 0xC0,
0xD3, 0xE5, 0xD4, 0x4C, 0x00, 0xCE, 0xF1, 0x4B, 0xDB, 0x66, 0x96, 0xCB, 0x1C, 0x7D, 0x4A, 0xB6,
0x87, 0xF5, 0x63, 0x1B, 0x97, 0xCB, 0x1B, 0xD3, 0x9C, 0xF5, 0xE3, 0xCE, 0xFF, 0xA4, 0x6B, 0xCC,
0x6D, 0x72, 0x91, 0x34, 0xDB, 0x11, 0x09, 0x67, 0xEE, 0xDE, 0xEC, 0x3D, 0x48, 0xFC, 0x8B, 0x8C,
0x60, 0x45, 0xDA, 0xAC, 0x70, 0x3F, 0x80, 0x73, 0xCB, 0xDF, 0x90, 0x28, 0x46, 0x00, 0xDF, 0x65,
0xEC, 0xA2, 0xD9, 0x59, 0x93, 0x73, 0x9A, 0xAC, 0xD7, 0x08, 0xE0, 0x95, 0xA6, 0x6F, 0xD4, 0xAE,
0xB9, 0xF3, 0xA6, 0x91, 0x10, 0x81, 0x7A, 0x04, 0x23, 0x78, 0xF1, 0x0D, 0x86, 0xA1, 0x8E, 0xF0,
0xE6, 0xB1, 0x01, 0xF6, 0x79, 0x93, 0x19, 0x97, 0xB1, 0xE0, 0x89, 0xC6, 0xEE, 0x00, 0x72, 0x0A,
0x78, 0x3B, 0x7F, 0x43, 0x97, 0xFA, 0x34, 0x77, 0x4B, 0x67, 0x49, 0x7F, 0x89, 0xB0, 0x3E, 0x7C,
0x76, 0x77, 0x9C, 0xEF, 0x17, 0x0A, 0x01, 0x61, 0xD1, 0xC2, 0xDA, 0x91, 0x38, 0xA2, 0xDB, 0x99,
0xD5, 0xD6, 0x9E, 0xCB, 0x8A, 0x27, 0xEF, 0xAD, 0x1F, 0x05, 0xA7, 0x7A, 0xC6, 0x96, 0x3D, 0xC3,
0x87, 0x9E, 0xD4, 0xEE, 0x49, 0xFC, 0x91, 0x5A, 0xC1, 0xF0, 0x5B, 0x99, 0xF7, 0xA0, 0x81, 0x23,
0xC3, 0xA6, 0x9E, 0x4C, 0xEB, 0xC9, 0x48, 0x49, 0xB1, 0x30, 0x0B, 0x03, 0x68, 0x9F, 0xF3, 0xB9,
0x9C, 0x19, 0x5A, 0x3D, 0xEB, 0x77, 0x54, 0xAD, 0x1E, 0x53, 0x7C, 0x9E, 0xA4, 0x99, 0xD3, 0x62,
0x9D, 0xD3, 0x23, 0x31, 0xD8, 0xF0, 0x24, 0x80, 0xF5, 0x25, 0x6C, 0x82, 0x03, 0xA7, 0x13, 0x29,
0x7A, 0x7A, 0x00, 0x4D, 0x1D, 0xD4, 0xBA, 0x87, 0xCF, 0xD8, 0xD3, 0x3D, 0x6C, 0x1D, 0x72, 0x5F,
0xC4, 0x02, 0x9D, 0xEE, 0xA3, 0xDC, 0x69, 0x75, 0x1F, 0x96, 0x6E, 0xA3, 0x7B, 0xB8, 0x85, 0x5A,
0xF7, 0x48, 0x2F, 0x4B, 0xC0, 0x06, 0x49, 0x65, 0xEF, 0xB4, 0x08, 0xCF, 0xB0, 0x21, 0x98, 0xD7,
0x5E, 0xAD, 0x12, 0xC2, 0xC5, 0x31, 0xA1, 0xBD, 0xE1, 0x8B, 0x01, 0x61, 0x97, 0xB6, 0x10, 0xE6,
0x5E, 0x53, 0x6C, 0x57, 0x24, 0xDA, 0x8A, 0x38, 0xAD, 0x88, 0xCC, 0x0A, 0xC6, 0x4D, 0xAD, 0x68,
0x17, 0x56, 0x7D, 0x41, 0x00, 0x82, 0xAF, 0x7A, 0x68, 0xC4, 0x8A, 0xC4, 0x5E, 0xF5, 0xE0, 0xC4,
0xAA, 0x07, 0x4F, 0x56, 0xE4, 0xC2, 0x8A, 0xFC, 0x58, 0x91, 0xB0, 0x2B, 0x12, 0x76, 0xC5, 0xD8,
0x78, 0x45, 0xC2, 0x02, 0xA8, 0x81, 0x20, 0x23, 0x88, 0xB9, 0xA7, 0x90, 0xC0, 0x17, 0x0B, 0xD3,
0x6F, 0x1D, 0xED, 0xC6, 0x7A, 0xC0, 0x0A, 0x76, 0xEB, 0x4E, 0xD1, 0x29, 0xBF, 0x63, 0xA0, 0x4A,
0xC5, 0xC9, 0xC4, 0x7C, 0x32, 0x02, 0xA1, 0x81, 0x27, 0x73, 0xC3, 0x6A, 0x2D, 0xF1, 0x22, 0xF5,
0xCD, 0x6F, 0x6C, 0x38, 0xDB, 0x9F, 0x82, 0xC3, 0x16, 0xFA, 0x8D, 0xED, 0x69, 0x47, 0xD9, 0x19,
0xA8, 0xCD, 0x71, 0x1E, 0x55, 0x9C, 0x19, 0xD6, 0x14, 0xE6, 0xDE, 0xB5, 0x2E, 0x57, 0xF2, 0x02,
0x1B, 0x43, 0x29, 0x8A, 0x1E, 0x5E, 0x7C, 0x48, 0x43, 0x47, 0x93, 0x82, 0x99, 0x83, 0x8E, 0xDB,
0xE9, 0xAD, 0xA5, 0x3C, 0x99, 0x1A, 0xFF, 0xEE, 0xED, 0xFB, 0xA8, 0x31, 0x62, 0xAA, 0x46, 0xF0,
0xF9, 0xC6, 0x13, 0x98, 0x9E, 0xFF, 0xFB, 0xDE, 0xCB, 0x47, 0xEE, 0xDD, 0x9C, 0xF2, 0xE9, 0xE2,
0x75, 0x88, 0xD2, 0x54, 0xC5, 0xC1, 0xB5, 0x4C, 0x49, 0x19, 0x21, 0x8D, 0x12, 0x2F, 0x4D, 0xE2,
0xCC, 0xFA, 0x29, 0x35, 0x03, 0xB8, 0xF3, 0x19, 0xC8, 0x57, 0x51, 0xDC, 0x4E, 0x8D, 0xFB, 0x87,
0x5B, 0x5F, 0x2B, 0x3F, 0x9D, 0x52, 0xC8, 0x7C, 0x56, 0x6B, 0xBF, 0x99, 0xB5, 0xDC, 0xCE, 0xB7,
0xDE, 0xB9, 0x63, 0x1B, 0x9F, 0x1E, 0x9A, 0x1B, 0xD0, 0x99, 0x3E, 0x1C, 0x6F, 0x76, 0x10, 0xC6,
0xE7, 0xC5, 0xCC, 0xCE, 0xB9, 0x53, 0x6A, 0x7B, 0xD1, 0x76, 0xFB, 0x62, 0x02, 0x36, 0xCC, 0x7C,
0x98, 0x73, 0x32, 0x6B, 0xEF, 0x27, 0xC3, 0xBD, 0x9E, 0x52, 0x0B, 0xB6, 0x93, 0xE7, 0xB0, 0x4E,
0xF6, 0xFE, 0x5B, 0x4C, 0xD9, 0x90, 0x8F, 0x8D, 0x93, 0x33, 0xC5, 0xB6, 0x76, 0xE0, 0x41, 0x29,
0xDC, 0x33, 0x07, 0x4F, 0x69, 0xC9, 0x1F, 0x09, 0x3C, 0xCA, 0x82, 0xD7, 0x64, 0x94, 0x07, 0xC4,
0x12, 0x71, 0x19, 0x6E, 0xDE, 0x34, 0xA9, 0x27, 0x2E, 0x2B, 0x93, 0xFC, 0xF9, 0x9A, 0x2D, 0x87,
0x2C, 0x48, 0x9A, 0x35, 0x49, 0x49, 0x6D, 0x77, 0x60, 0x69, 0x30, 0x01, 0x8C, 0x32, 0x2C, 0x4B,
0x05, 0xCE, 0x20, 0x10, 0x93, 0x30, 0x14, 0xA6, 0xA7, 0x85, 0x5D, 0x76, 0xFA, 0x6D, 0x32, 0xC3,
0xCA, 0x11, 0x38, 0x39, 0x4C, 0xC1, 0x55, 0xFC, 0x63, 0x08, 0x4C, 0xF8, 0xC7, 0x66, 0x02, 0xFE,
0xDF, 0x19, 0x36, 0xFF, 0x4B, 0xAC, 0x5D, 0x49, 0xC3, 0x97, 0x4E, 0x31, 0x30, 0x59, 0xB1, 0x90,
0xB0, 0xD9, 0x6D, 0x33, 0x46, 0x2B, 0x58, 0x09, 0xB3, 0x21, 0xED, 0xF4, 0x1A, 0x96, 0x3B, 0x90,
0xB9, 0xD5, 0xC0, 0x61, 0xD1, 0x60, 0x5D, 0xD6, 0x4F, 0x18, 0x05, 0xE2, 0xD9, 0x33, 0x50, 0x0C,
0x2A, 0xA7, 0x5B, 0x01, 0x0B, 0x56, 0xB5, 0x8E, 0x11, 0x11, 0x7A, 0x8D, 0x87, 0xA8, 0x56, 0x63,
0x24, 0x2C, 0x22, 0x9E, 0x6E, 0xEB, 0x57, 0x31, 0xA2, 0x43, 0xA7, 0xC3, 0x98, 0x1C, 0x61, 0x67,
0xCF, 0xB1, 0xA4, 0x72, 0x94, 0x06, 0x7C, 0x9E, 0xC4, 0xCA, 0x67, 0x68, 0xBA, 0xD0, 0x36, 0x50,
0xD5, 0x89, 0x72, 0xFF, 0xC3, 0xE7, 0xB1, 0x0D, 0x5F, 0x23, 0x50, 0xE4, 0xCB, 0xCA, 0x56, 0x05,
0xCC, 0x24, 0x55, 0x0C, 0x71, 0x99, 0x27, 0x52, 0x39, 0x58, 0xF1, 0xD0, 0xAC, 0xC9, 0xC0, 0x7F,
0xC7, 0x13, 0x8D, 0x42, 0x92, 0x27, 0xCA, 0x99, 0xE6, 0x51, 0xD6, 0xB0, 0x6A, 0xC6, 0xE8, 0x3D,
0x7E, 0x97, 0xA4, 0xF8, 0x73, 0x45, 0xB1, 0x64, 0xD9, 0xD7, 0xCC, 0xD5, 0x0A, 0xF9, 0xCB, 0xA3,
0x84, 0x86, 0x1F, 0x33, 0x23, 0x61, 0x3F, 0x4D, 0x87, 0xC6, 0xE2, 0x1B, 0x46, 0x66, 0x74, 0xB5,
0x71, 0x8E, 0x54, 0x83, 0xF5, 0x2D, 0x2C, 0xAD, 0x19, 0x92, 0xAD, 0x19, 0xA1, 0x9D, 0xB0, 0xF6,
0x92, 0x91, 0xAF, 0x40, 0x22, 0xA8, 0xC5, 0x7B, 0xC2, 0x30, 0xC7, 0x39, 0x46, 0x68, 0x16, 0x5C,
0x4E, 0xAC, 0xE2, 0xA9, 0x35, 0x03, 0x79, 0x4D, 0x6C, 0xA3, 0x9F, 0x72, 0x3B, 0x9F, 0xE7, 0x53,
0xCA, 0xC6, 0x38, 0x67, 0x4A, 0x97, 0x9F, 0x00, 0xEC, 0x8A, 0x73, 0xD9, 0x94, 0x0A, 0xAC, 0xB7,
0x45, 0x94, 0x29, 0x1B, 0x9D, 0x03, 0x27, 0x29, 0x9F, 0x3E, 0xFD, 0x8F, 0x48, 0xF5, 0x72, 0x2A,
0x60, 0x29, 0x20, 0x63, 0xE0, 0xA4, 0xB2, 0x25, 0x05, 0xE6, 0x99, 0xDC, 0x76, 0xC2, 0xCB, 0xFB,
0x92, 0x95, 0x25, 0x93, 0x09, 0x61, 0x29, 0x84, 0x99, 0x06, 0x4B, 0xC9, 0x52, 0xE0, 0x6C, 0xA6,
0x24, 0xBB, 0x9B, 0x48, 0x70, 0x3C, 0x75, 0x8C, 0xA7, 0x4A, 0x85, 0x74, 0x9E, 0xB2, 0x42, 0x76,
0x66, 0x39, 0x51, 0x3A, 0xAE, 0x26, 0x0B, 0x03, 0x59, 0x64, 0xB2, 0x9A, 0xBE, 0x54, 0xB0, 0x5C,
0xF2, 0x4C, 0x6E, 0xCC, 0x86, 0x1B, 0x98, 0x2B, 0x1E, 0x25, 0x88, 0x20, 0x2A, 0x1B, 0xAF, 0x72,
0xD1, 0x84, 0xD9, 0xE7, 0x55, 0xE2, 0xF7, 0xBB, 0x10, 0xBB, 0x69, 0x03, 0x56, 0xBE, 0x3D, 0xA8,
0x56, 0xE5, 0x36, 0xDC, 0x57, 0xCB, 0x9A, 0xF7, 0x8A, 0x1B, 0xD8, 0xE3, 0xB6, 0xE5, 0x34, 0x21,
0x4C, 0xB7, 0xB9, 0xF7, 0x9C, 0x57, 0xBF, 0x0D, 0x2E, 0x44, 0xA5, 0x5F, 0x63, 0x43, 0x3F, 0x54,
0x36, 0x41, 0x4D, 0x11, 0xA6, 0xD4, 0xDE, 0x9D, 0x2B, 0xAD, 0x23, 0x05, 0xBD, 0x53, 0xDE, 0xEC,
0xD2, 0xCD, 0xDE, 0xA5, 0x51, 0xBE, 0xBB, 0xDF, 0x43, 0x35, 0x18, 0x83, 0xF5, 0x0B, 0x69, 0x30,
0xAE, 0xCA, 0xC3, 0xBB, 0xB8, 0x8F, 0xCC, 0x70, 0xE4, 0x9B, 0xFA, 0x88, 0x85, 0xA9, 0xCB, 0xE7,
0xD4, 0xE8, 0xCE, 0x03, 0x49, 0x00, 0x01, 0x4B, 0x32, 0x96, 0xA3, 0x36, 0x2C, 0x47, 0x55, 0xB6,
0x1C, 0x95, 0xF1, 0x57, 0xFD, 0xD0, 0xEA, 0xA9, 0xFC, 0x80, 0x2E, 0x52, 0xB7, 0x29, 0x39, 0xAC,
0x83, 0xFD, 0xDF, 0x2B, 0x30, 0xD5, 0xD5, 0x68, 0xAE, 0x4E, 0x4D, 0x55, 0xFE, 0x1B, 0x0E, 0xB7,
0x35, 0x7E, 0xB7, 0xA2, 0xCF, 0xA5, 0xFC, 0xC5, 0xE9, 0xD9, 0x7A, 0xDC, 0x99, 0x96, 0xDA, 0x3E,
0xEC, 0xEB, 0x0F, 0x17, 0x6B, 0x8E, 0x45, 0xD2, 0x57, 0x4D, 0x13, 0x5E, 0x54, 0x73, 0x05, 0xEB,
0x61, 0x20, 0x1E, 0xC2, 0x1C, 0xF4, 0xFA, 0x38, 0xF7, 0x37, 0xD7, 0x4D, 0xCE, 0x02, 0x7F, 0x8E,
0x39, 0x75, 0x8E, 0xC9, 0xE3, 0x73, 0x36, 0x13, 0x9E, 0xFE, 0xCA, 0x2E, 0xAC, 0x3A, 0xE5, 0x30,
0x37, 0x45, 0x1E, 0x74, 0x97, 0x8C, 0x9D, 0x4A, 0x65, 0x23, 0xF2, 0xF7, 0xDD, 0xE9, 0x45, 0xCC,
0xBC, 0x94, 0xC8, 0x49, 0x8D, 0x58, 0x7C, 0x2B, 0x56, 0x5E, 0x6F, 0xAB, 0xCF, 0x00, 0xCB, 0x65,
0x31, 0xD5, 0x52, 0xA4, 0xAA, 0xB2, 0xA3, 0x7D, 0x3A, 0x2B, 0x22, 0x77, 0x89, 0x6D, 0xBE, 0xF6,
0x83, 0x29, 0xC1, 0x89, 0x19, 0x14, 0x4A, 0x75, 0xC9, 0xD9, 0xB7, 0xAE, 0x15, 0x82, 0x28, 0x96,
0x6C, 0x2A, 0x05, 0xCF, 0xED, 0x8A, 0x61, 0xA5, 0xB5, 0x57, 0xDF, 0xD8, 0x5C, 0x3B, 0xF3, 0xFE,
0x49, 0xDB, 0xB4, 0x97, 0x21, 0xC8, 0x1D, 0xA1, 0xD7, 0x70, 0x20, 0xF4, 0x32, 0x96, 0x5E, 0xF1,
0x7D, 0xF4, 0x0A, 0xCF, 0x02, 0xA1, 0x57, 0xB4, 0xA5, 0x57, 0xB6, 0xA5, 0xD7, 0x3F, 0xB6, 0xF4,
0x0A, 0xB7, 0x8C, 0x89, 0x25, 0xD7, 0x26, 0x0B, 0x8D, 0x0A, 0x3F, 0x85, 0xBC, 0x05, 0x74, 0xFE,
0x4E, 0x01, 0x42, 0x5E, 0x56, 0x0F, 0x91, 0x08, 0xB6, 0xC0, 0xE4, 0x90, 0xD3, 0x56, 0x6F, 0xAE,
0xF7, 0x90, 0xD2, 0x01, 0x72, 0xB7, 0x20, 0x8D, 0x9F, 0xB4, 0xBD, 0x00, 0xD9, 0xCE, 0x6C, 0x8D,
0x4F, 0x8C, 0x92, 0x7E, 0xE4, 0x47, 0xBD, 0x20, 0xC9, 0x69, 0xA6, 0xB6, 0xA3, 0xA6, 0x2A, 0xA1,
0xFE, 0x0A, 0x77, 0x42, 0xA3, 0xFE, 0xAB, 0x5E, 0x99, 0x4E, 0x15, 0x95, 0x54, 0xA9, 0x92, 0x87,
0x36, 0xB7, 0x4B, 0xE0, 0x82, 0x12, 0x30, 0x23, 0x81, 0x4D, 0x4F, 0x10, 0xD7, 0x27, 0x30, 0xE6,
0x09, 0x78, 0x94, 0x10, 0x31, 0x88, 0x88, 0x86, 0xDF, 0xD3, 0xC8, 0xC5, 0xB4, 0xC7, 0x0A, 0xD5,
0x80, 0xC6, 0x6D, 0xC6, 0x65, 0x02, 0x11, 0xE3, 0xC1, 0x42, 0x02, 0x4B, 0x71, 0x59, 0x3F, 0xE8,
0x9A, 0x76, 0x75, 0x15, 0xE6, 0x20, 0x1E, 0xD5, 0x5E, 0x66, 0x3E, 0xE1, 0x99, 0xC4, 0xE6, 0xE0,
0xCB, 0x3B, 0x87, 0x08, 0x68, 0x5C, 0xC4, 0x32, 0x0D, 0x28, 0x6E, 0x60, 0xA9, 0xC5, 0xED, 0xCA,
0x03, 0x01, 0xE4, 0xB3, 0x7D, 0x4C, 0x18, 0xE4, 0x7B, 0x3B, 0x3E, 0x8F, 0x4F, 0xCB, 0xE7, 0xB9,
0x3E, 0x9D, 0x53, 0xAF, 0x5A, 0xE5, 0x0D, 0xD7, 0x25, 0xE2, 0xCF, 0xA8, 0x75, 0x31, 0xC5, 0x9A,
0xC7, 0x83, 0x13, 0x60, 0xF0, 0x1E, 0x6C, 0x81, 0x7C, 0x0D, 0x4B, 0xE9, 0x22, 0x9D, 0x65, 0x98,
0xB7, 0xB9, 0x34, 0xD8, 0xA9, 0x76, 0xB5, 0x77, 0xB9, 0xF6, 0x80, 0x30, 0x09, 0xF6, 0x55, 0x2C,
0x68, 0x76, 0xCA, 0x82, 0x26, 0xB4, 0xA0, 0x89, 0x28, 0x3E, 0xD7, 0x78, 0x0C, 0x1B, 0x7E, 0xAF,
0x06, 0x3F, 0x2B, 0x8B, 0x27, 0x1A, 0x1C, 0x51, 0x83, 0x1F, 0x69, 0x6E, 0x27, 0x70, 0x35, 0xE8,
0x91, 0x49, 0xEF, 0xAD, 0x7F, 0x81, 0xB8, 0x12, 0x3B, 0xB2, 0xB1, 0xDB, 0x23, 0x6F, 0x7B, 0x84,
0x32, 0xAA, 0x90, 0x22, 0x57, 0xBD, 0x25, 0xE5, 0xF4, 0xC5, 0xAC, 0xF6, 0x8C, 0xA7, 0xA4, 0x8A,
0x5C, 0xDB, 0x33, 0x3F, 0x87, 0xC4, 0x8F, 0xA6, 0x90, 0x80, 0x75, 0xD4, 0xA0, 0x3A, 0x56, 0x87,
0x25, 0x8B, 0xC8, 0xDB, 0x43, 0x99, 0x86, 0xB7, 0x23, 0x45, 0x94, 0xC8, 0xF4, 0x99, 0xE9, 0xBF,
0xF9, 0xC5, 0xB5, 0xC7, 0x29, 0xB7, 0xF0, 0xE4, 0x06, 0x36, 0x38, 0x06, 0xA3, 0x59, 0xF4, 0x4C,
0xD0, 0xF4, 0x63, 0xB6, 0x0C, 0xAD, 0x00, 0xC2, 0x46, 0xA7, 0xAE, 0x89, 0xEB, 0x2B, 0x06, 0x9B,
0xD1, 0xAE, 0xE9, 0x62, 0x1A, 0xBB, 0x93, 0xA9, 0x20, 0x6B, 0x19, 0x4E, 0x2B, 0xB8, 0x20, 0xBD,
0x06, 0x86, 0x36, 0xB0, 0x81, 0x08, 0xB3, 0x19, 0x53, 0x37, 0x16, 0x38, 0x1D, 0x77, 0xD6, 0x33,
0xEA, 0x59, 0x91, 0xA8, 0x0B, 0x39, 0xBB, 0x92, 0x80, 0xE8, 0x78, 0x3E, 0x41, 0x0B, 0x69, 0xB7,
0x59, 0x0E, 0x3F, 0x66, 0x86, 0xEF, 0xD7, 0x8C, 0x00, 0x44, 0x78, 0xBD, 0x41, 0x24, 0x37, 0x30,
0x94, 0xDD, 0x3C, 0xBC, 0x85, 0x65, 0x10, 0x93, 0xBF, 0x95, 0xF2, 0x14, 0x29, 0x22, 0xCB, 0xD1,
0x89, 0x32, 0xEF, 0xD7, 0x89, 0x0F, 0xBA, 0x79, 0xCD, 0xB1, 0x57, 0xAF, 0x58, 0x49, 0x60, 0x7A,
0xEB, 0xB6, 0x9D, 0xDB, 0x60, 0xE6, 0x4D, 0xAB, 0xBE, 0xC0, 0xDC, 0x63, 0xA3, 0xEE, 0x82, 0x92,
0xEB, 0x5A, 0x72, 0xBB, 0xAC, 0x92, 0x73, 0x07, 0x72, 0xB5, 0x92, 0xE8, 0x1C, 0x01, 0xF9, 0x7C,
0x3C, 0xB5, 0xB6, 0x39, 0xA5, 0x2B, 0x87, 0xF4, 0x52, 0x28, 0xCA, 0x88, 0x7E, 0xCC, 0xE0, 0x33,
0x1C, 0xE7, 0xB3, 0x3F, 0xC9, 0x0E, 0xE5, 0xAB, 0x3E, 0xE4, 0x11, 0xA6, 0x94, 0x9B, 0x7D, 0x12,
0x1E, 0xA1, 0x0E, 0x06, 0x0D, 0x64, 0x6B, 0xA6, 0x44, 0x18, 0xCF, 0xA3, 0x98, 0x1C, 0xEF, 0x0A,
0xC5, 0x10, 0x32, 0x4D, 0x14, 0x73, 0xE5, 0x5F, 0x1A, 0x76, 0x14, 0x3B, 0xA6, 0xAF, 0xD1, 0x74,
0x33, 0xB1, 0x24, 0xE4, 0xEB, 0x99, 0x62, 0xFE, 0x36, 0x06, 0x96, 0xF3, 0x2D, 0xBF, 0x3E, 0x73,
0xC8, 0x45, 0x77, 0xFC, 0x26, 0x31, 0x2B, 0xD8, 0x8D, 0x27, 0x17, 0xF4, 0xDA, 0x25, 0xDB, 0xE5,
0xFD, 0xC3, 0xDD, 0x99, 0xAB, 0x63, 0xFF, 0x2D, 0x41, 0x46, 0x46, 0xD3, 0x49, 0xC4, 0x60, 0xDD,
0x28, 0x5F, 0x43, 0x7B, 0xE4, 0xBC, 0x2C, 0xDB, 0xDF, 0x4F, 0x59, 0x56, 0x2D, 0xA4, 0x40, 0xF6,
0x7D, 0xA6, 0x01, 0xE1, 0xC6, 0x9E, 0x70, 0x9D, 0x7F, 0x9F, 0xA8, 0x97, 0x3B, 0x39, 0x05, 0x6C,
0xE5, 0xA0, 0x63, 0xF1, 0x20, 0x5D, 0x81, 0xA7, 0xBD, 0xCD, 0xD3, 0x15, 0x47, 0x8E, 0x36, 0xF6,
0x1E, 0x75, 0xA9, 0x5F, 0x43, 0x20, 0x73, 0xB2, 0x0F, 0x3B, 0x27, 0x92, 0xF7, 0xDF, 0x52, 0x25,
0x50, 0xFA, 0x36, 0x0B, 0x10, 0x11, 0x7C, 0x51, 0x6A, 0x4F, 0x5E, 0xEF, 0xB9, 0x31, 0x96, 0xF9,
0x68, 0xC3, 0xA3, 0x07, 0x5B, 0xA2, 0xF0, 0x91, 0xF7, 0x23, 0x44, 0xBE, 0x1D, 0xA4, 0x8B, 0x43,
0xE4, 0x28, 0xDF, 0xE3, 0x31, 0xB6, 0x1C, 0xCB, 0xFD, 0x0F, 0xD5, 0x5A, 0x3D, 0x8C, 0xDC, 0xD6,
0x11, 0x1E, 0x92, 0xD2, 0xD1, 0x10, 0x81, 0x50, 0x85, 0x64, 0x04, 0x16, 0x2C, 0xBA, 0x48, 0x11,
0x0B, 0xB6, 0xD8, 0xBA, 0xB8, 0x5B, 0xD2, 0x48, 0x91, 0x22, 0x85, 0x55, 0xE8, 0x2C, 0x20, 0x2E,
0x54, 0xC7, 0x41, 0x70, 0x29, 0x5C, 0xA8, 0x58, 0x2D, 0xE9, 0x2A, 0x65, 0xAE, 0x71, 0x95, 0x46,
@@ -2225,85 +2225,85 @@ static const EpdGlyph notosans_16_regularGlyphs[] = {
{ 9, 4, 172, 1, 11, 9, 898 }, // -
{ 5, 6, 143, 2, 5, 8, 907 }, // .
{ 13, 24, 198, 0, 24, 78, 915 }, // /
{ 17, 26, 305, 1, 25, 111, 993 }, // 0
{ 10, 24, 305, 2, 24, 60, 1104 }, // 1
{ 17, 25, 305, 1, 25, 107, 1164 }, // 2
{ 17, 26, 305, 1, 25, 111, 1271 }, // 3
{ 19, 24, 305, 0, 24, 114, 1382 }, // 4
{ 16, 25, 305, 2, 24, 100, 1496 }, // 5
{ 17, 26, 305, 1, 25, 111, 1596 }, // 6
{ 17, 24, 305, 1, 24, 102, 1707 }, // 7
{ 17, 26, 305, 1, 25, 111, 1809 }, // 8
{ 17, 26, 305, 1, 25, 111, 1920 }, // 9
{ 5, 20, 143, 2, 19, 25, 2031 }, // :
{ 6, 24, 143, 1, 19, 36, 2056 }, // ;
{ 17, 18, 305, 1, 21, 77, 2092 }, // <
{ 17, 10, 305, 1, 17, 43, 2169 }, // =
{ 17, 18, 305, 1, 21, 77, 2212 }, // >
{ 14, 26, 231, 0, 25, 91, 2289 }, // ?
{ 28, 27, 479, 1, 24, 189, 2380 }, // @
{ 22, 24, 341, 0, 24, 132, 2569 }, // A
{ 17, 24, 347, 3, 24, 102, 2701 }, // B
{ 19, 26, 337, 2, 25, 124, 2803 }, // C
{ 20, 24, 389, 3, 24, 120, 2927 }, // D
{ 14, 24, 296, 3, 24, 84, 3047 }, // E
{ 14, 24, 277, 3, 24, 84, 3131 }, // F
{ 20, 26, 388, 2, 25, 130, 3215 }, // G
{ 19, 24, 395, 3, 24, 114, 3345 }, // H
{ 9, 24, 181, 1, 24, 54, 3459 }, // I
{ 10, 31, 146, -3, 24, 78, 3513 }, // J
{ 18, 24, 330, 3, 24, 108, 3591 }, // K
{ 14, 24, 279, 3, 24, 84, 3699 }, // L
{ 24, 24, 484, 3, 24, 144, 3783 }, // M
{ 20, 24, 405, 3, 24, 120, 3927 }, // N
{ 22, 26, 416, 2, 25, 143, 4047 }, // O
{ 16, 24, 323, 3, 24, 96, 4190 }, // P
{ 22, 31, 416, 2, 25, 171, 4286 }, // Q
{ 18, 24, 332, 3, 24, 108, 4457 }, // R
{ 16, 26, 293, 1, 25, 104, 4565 }, // S
{ 19, 24, 296, 0, 24, 114, 4669 }, // T
{ 19, 25, 390, 3, 24, 119, 4783 }, // U
{ 20, 24, 320, 0, 24, 120, 4902 }, // V
{ 31, 24, 496, 0, 24, 186, 5022 }, // W
{ 20, 24, 312, 0, 24, 120, 5208 }, // X
{ 19, 24, 302, 0, 24, 114, 5328 }, // Y
{ 17, 24, 305, 1, 24, 102, 5442 }, // Z
{ 9, 30, 175, 2, 24, 68, 5544 }, // [
{ 13, 24, 198, 0, 24, 78, 5612 }, // <backslash>
{ 9, 30, 175, 0, 24, 68, 5690 }, // ]
{ 17, 16, 305, 1, 24, 68, 5758 }, // ^
{ 16, 3, 237, -1, -3, 12, 5826 }, // _
{ 8, 6, 150, 1, 26, 12, 5838 }, // `
{ 15, 20, 299, 1, 19, 75, 5850 }, // a
{ 17, 27, 328, 2, 26, 115, 5925 }, // b
{ 14, 20, 256, 1, 19, 70, 6040 }, // c
{ 17, 27, 328, 1, 26, 115, 6110 }, // d
{ 17, 20, 301, 1, 19, 85, 6225 }, // e
{ 13, 26, 183, 0, 26, 85, 6310 }, // f
{ 17, 27, 328, 1, 19, 115, 6395 }, // g
{ 16, 26, 330, 2, 26, 104, 6510 }, // h
{ 5, 25, 138, 2, 25, 32, 6614 }, // i
{ 9, 33, 138, -2, 25, 75, 6646 }, // j
{ 16, 26, 285, 2, 26, 104, 6721 }, // k
{ 4, 26, 138, 2, 26, 26, 6825 }, // l
{ 27, 19, 499, 2, 19, 129, 6851 }, // m
{ 16, 19, 330, 2, 19, 76, 6980 }, // n
{ 18, 20, 323, 1, 19, 90, 7056 }, // o
{ 17, 27, 328, 2, 19, 115, 7146 }, // p
{ 17, 27, 328, 1, 19, 115, 7261 }, // q
{ 12, 19, 220, 2, 19, 57, 7376 }, // r
{ 14, 20, 255, 1, 19, 70, 7433 }, // s
{ 12, 23, 193, 0, 22, 69, 7503 }, // t
{ 16, 19, 330, 2, 18, 76, 7572 }, // u
{ 17, 18, 271, 0, 18, 77, 7648 }, // v
{ 26, 18, 419, 0, 18, 117, 7725 }, // w
{ 18, 18, 282, 0, 18, 81, 7842 }, // x
{ 17, 26, 272, 0, 18, 111, 7923 }, // y
{ 14, 18, 251, 1, 18, 63, 8034 }, // z
{ 12, 30, 203, 0, 24, 90, 8097 }, // {
{ 4, 35, 294, 7, 26, 35, 8187 }, // |
{ 11, 30, 203, 1, 24, 83, 8222 }, // }
{ 17, 5, 305, 1, 14, 22, 8305 }, // ~
{ 17, 26, 311, 1, 25, 111, 993 }, // 0
{ 10, 24, 235, 0, 24, 60, 1104 }, // 1
{ 16, 25, 296, 1, 25, 100, 1164 }, // 2
{ 17, 26, 305, 1, 25, 111, 1264 }, // 3
{ 19, 24, 305, 0, 24, 114, 1375 }, // 4
{ 16, 25, 305, 2, 24, 100, 1489 }, // 5
{ 17, 26, 305, 1, 25, 111, 1589 }, // 6
{ 17, 24, 272, 0, 24, 102, 1700 }, // 7
{ 17, 26, 314, 1, 25, 111, 1802 }, // 8
{ 17, 26, 305, 1, 25, 111, 1913 }, // 9
{ 5, 20, 143, 2, 19, 25, 2024 }, // :
{ 6, 24, 143, 1, 19, 36, 2049 }, // ;
{ 17, 18, 305, 1, 21, 77, 2085 }, // <
{ 17, 10, 305, 1, 17, 43, 2162 }, // =
{ 17, 18, 305, 1, 21, 77, 2205 }, // >
{ 14, 26, 231, 0, 25, 91, 2282 }, // ?
{ 28, 27, 479, 1, 24, 189, 2373 }, // @
{ 22, 24, 341, 0, 24, 132, 2562 }, // A
{ 17, 24, 347, 3, 24, 102, 2694 }, // B
{ 19, 26, 337, 2, 25, 124, 2796 }, // C
{ 20, 24, 389, 3, 24, 120, 2920 }, // D
{ 14, 24, 296, 3, 24, 84, 3040 }, // E
{ 14, 24, 277, 3, 24, 84, 3124 }, // F
{ 20, 26, 388, 2, 25, 130, 3208 }, // G
{ 19, 24, 395, 3, 24, 114, 3338 }, // H
{ 9, 24, 181, 1, 24, 54, 3452 }, // I
{ 10, 31, 146, -3, 24, 78, 3506 }, // J
{ 18, 24, 330, 3, 24, 108, 3584 }, // K
{ 14, 24, 279, 3, 24, 84, 3692 }, // L
{ 24, 24, 484, 3, 24, 144, 3776 }, // M
{ 20, 24, 405, 3, 24, 120, 3920 }, // N
{ 22, 26, 416, 2, 25, 143, 4040 }, // O
{ 16, 24, 323, 3, 24, 96, 4183 }, // P
{ 22, 31, 416, 2, 25, 171, 4279 }, // Q
{ 18, 24, 332, 3, 24, 108, 4450 }, // R
{ 16, 26, 293, 1, 25, 104, 4558 }, // S
{ 19, 24, 296, 0, 24, 114, 4662 }, // T
{ 19, 25, 390, 3, 24, 119, 4776 }, // U
{ 20, 24, 320, 0, 24, 120, 4895 }, // V
{ 31, 24, 496, 0, 24, 186, 5015 }, // W
{ 20, 24, 312, 0, 24, 120, 5201 }, // X
{ 19, 24, 302, 0, 24, 114, 5321 }, // Y
{ 17, 24, 305, 1, 24, 102, 5435 }, // Z
{ 9, 30, 175, 2, 24, 68, 5537 }, // [
{ 13, 24, 198, 0, 24, 78, 5605 }, // <backslash>
{ 9, 30, 175, 0, 24, 68, 5683 }, // ]
{ 17, 16, 305, 1, 24, 68, 5751 }, // ^
{ 16, 3, 237, -1, -3, 12, 5819 }, // _
{ 8, 6, 150, 1, 26, 12, 5831 }, // `
{ 15, 20, 299, 1, 19, 75, 5843 }, // a
{ 17, 27, 328, 2, 26, 115, 5918 }, // b
{ 14, 20, 256, 1, 19, 70, 6033 }, // c
{ 17, 27, 328, 1, 26, 115, 6103 }, // d
{ 17, 20, 301, 1, 19, 85, 6218 }, // e
{ 13, 26, 183, 0, 26, 85, 6303 }, // f
{ 17, 27, 328, 1, 19, 115, 6388 }, // g
{ 16, 26, 330, 2, 26, 104, 6503 }, // h
{ 5, 25, 138, 2, 25, 32, 6607 }, // i
{ 9, 33, 138, -2, 25, 75, 6639 }, // j
{ 16, 26, 285, 2, 26, 104, 6714 }, // k
{ 4, 26, 138, 2, 26, 26, 6818 }, // l
{ 27, 19, 499, 2, 19, 129, 6844 }, // m
{ 16, 19, 330, 2, 19, 76, 6973 }, // n
{ 18, 20, 323, 1, 19, 90, 7049 }, // o
{ 17, 27, 328, 2, 19, 115, 7139 }, // p
{ 17, 27, 328, 1, 19, 115, 7254 }, // q
{ 12, 19, 220, 2, 19, 57, 7369 }, // r
{ 14, 20, 255, 1, 19, 70, 7426 }, // s
{ 12, 23, 193, 0, 22, 69, 7496 }, // t
{ 16, 19, 330, 2, 18, 76, 7565 }, // u
{ 17, 18, 271, 0, 18, 77, 7641 }, // v
{ 26, 18, 419, 0, 18, 117, 7718 }, // w
{ 18, 18, 282, 0, 18, 81, 7835 }, // x
{ 17, 26, 272, 0, 18, 111, 7916 }, // y
{ 14, 18, 251, 1, 18, 63, 8027 }, // z
{ 12, 30, 203, 0, 24, 90, 8090 }, // {
{ 4, 35, 294, 7, 26, 35, 8180 }, // |
{ 11, 30, 203, 1, 24, 83, 8215 }, // }
{ 17, 5, 305, 1, 14, 22, 8298 }, // ~
{ 0, 0, 139, 0, 0, 0, 0 }, // U+00A0
{ 5, 26, 143, 2, 19, 33, 0 }, // U+00A1
{ 14, 26, 305, 3, 25, 91, 33 }, // U+00A2
@@ -3303,7 +3303,7 @@ static const EpdUnicodeInterval notosans_16_regularIntervals[] = {
};
static const EpdFontGroup notosans_16_regularGroups[] = {
{ 0, 3626, 9206, 97, 0 },
{ 0, 3626, 9181, 97, 0 },
{ 3626, 3331, 11053, 96, 97 },
{ 6957, 4095, 16723, 128, 193 },
{ 11052, 4104, 15196, 96, 321 },
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -14,7 +14,7 @@ for size in ${BOOKERLY_FONT_SIZES[@]}; do
font_name="bookerly_${size}_$(echo $style | tr '[:upper:]' '[:lower:]')"
font_path="../builtinFonts/source/Bookerly/Bookerly-${style}.ttf"
output_path="../builtinFonts/${font_name}.h"
python fontconvert.py $font_name $size $font_path --2bit --compress > $output_path
python fontconvert.py $font_name $size $font_path --2bit --compress --pnum > $output_path
echo "Generated $output_path"
done
done
@@ -24,7 +24,7 @@ for size in ${NOTOSANS_FONT_SIZES[@]}; do
font_name="notosans_${size}_$(echo $style | tr '[:upper:]' '[:lower:]')"
font_path="../builtinFonts/source/NotoSans/NotoSans-${style}.ttf"
output_path="../builtinFonts/${font_name}.h"
python fontconvert.py $font_name $size $font_path --2bit --compress > $output_path
python fontconvert.py $font_name $size $font_path --2bit --compress --pnum > $output_path
echo "Generated $output_path"
done
done
+70 -4
View File
@@ -18,6 +18,7 @@ parser.add_argument("--2bit", dest="is2Bit", action="store_true", help="generate
parser.add_argument("--additional-intervals", dest="additional_intervals", action="append", help="Additional code point intervals to export as min,max. This argument can be repeated.")
parser.add_argument("--compress", dest="compress", action="store_true", help="Compress glyph bitmaps using DEFLATE with group-based compression.")
parser.add_argument("--force-autohint", dest="force_autohint", action="store_true", help="Force FreeType auto-hinter instead of native font hinting. Improves stem width consistency for fonts with weak or no native TrueType hints.")
parser.add_argument("--pnum", dest="pnum", action="store_true", help="Use proportional numerals (pnum OpenType feature) instead of default tabular figures. Reduces visual gaps between digits in running prose.")
args = parser.parse_args()
GlyphProps = namedtuple("GlyphProps", ["width", "height", "advance_x", "left", "top", "data_length", "data_offset", "code_point"])
@@ -168,11 +169,68 @@ def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
def extract_pnum_subs(font_path):
"""Extract pnum (proportional figures) GSUB substitutions.
Parses the font's GSUB table for the 'pnum' feature, which replaces
tabular-width figure glyphs with proportional-width alternates.
Returns {original_glyph_name: substitute_glyph_name} or empty dict.
"""
font = TTFont(font_path)
subs = {}
if 'GSUB' not in font:
font.close()
return subs
gsub = font['GSUB'].table
pnum_indices = set()
if gsub.FeatureList:
for fr in gsub.FeatureList.FeatureRecord:
if fr.FeatureTag == 'pnum':
pnum_indices.update(fr.Feature.LookupListIndex)
for li in pnum_indices:
lookup = gsub.LookupList.Lookup[li]
for st in lookup.SubTable:
actual = st
if lookup.LookupType == 7 and hasattr(st, 'ExtSubTable'):
actual = st.ExtSubTable
if hasattr(actual, 'mapping'):
subs.update(actual.mapping)
font.close()
return subs
# Build proportional numeral glyph overrides when --pnum is active.
# Maps (face_index, codepoint) -> freetype glyph index for the proportional alternate.
pnum_glyph_overrides = {}
pnum_kern_subs = {} # face_index -> {original_glyph_name: substitute_glyph_name}
if args.pnum:
for face_idx, font_path in enumerate(args.fontstack):
subs = extract_pnum_subs(font_path)
if not subs:
continue
pnum_kern_subs[face_idx] = subs
tt_font = TTFont(font_path)
cmap = tt_font.getBestCmap() or {}
glyph_order = tt_font.getGlyphOrder()
name_to_glyph_idx = {name: idx for idx, name in enumerate(glyph_order)}
count = 0
for cp, glyph_name in cmap.items():
if glyph_name in subs:
sub_name = subs[glyph_name]
sub_idx = name_to_glyph_idx.get(sub_name, 0)
if sub_idx > 0:
pnum_glyph_overrides[(face_idx, cp)] = sub_idx
count += 1
tt_font.close()
if count > 0:
print(f"pnum: {count} glyph substitutions from {font_path}", file=sys.stderr)
def load_glyph(code_point):
face_index = 0
while face_index < len(font_stack):
face = font_stack[face_index]
glyph_index = face.get_char_index(code_point)
glyph_index = pnum_glyph_overrides.get((face_index, code_point))
if glyph_index is None:
glyph_index = face.get_char_index(code_point)
if glyph_index > 0:
face.load_glyph(glyph_index, load_flags)
return face
@@ -386,23 +444,30 @@ def _extract_pairpos_subtable(subtable, glyph_to_cp, raw_kern):
key = (left_glyph, right_glyph)
raw_kern[key] = raw_kern.get(key, 0) + xa
def extract_kerning_fonttools(font_path, codepoints, ppem):
def extract_kerning_fonttools(font_path, codepoints, ppem, pnum_subs=None):
"""Extract kerning pairs from a font file using fonttools.
Returns dict of {(leftCp, rightCp): pixel_adjust} for the given
codepoints. Values are scaled from font design units to integer
pixels at ppem.
When pnum_subs is provided, substitute glyph names are also included
in the lookup so kern pairs referencing proportional alternates are found.
"""
font = TTFont(font_path)
units_per_em = font['head'].unitsPerEm
cmap = font.getBestCmap() or {}
# Build glyph_name -> codepoint map (only for requested codepoints)
# Build glyph_name -> codepoint map (only for requested codepoints).
# When pnum is active, include both the original and substitute glyph
# names so kern pairs referencing either are captured.
glyph_to_cp = {}
for cp in codepoints:
gname = cmap.get(cp)
if gname:
glyph_to_cp[gname] = cp
if pnum_subs and gname in pnum_subs:
glyph_to_cp[pnum_subs[gname]] = cp
# Collect raw kerning values in font design units
raw_kern = {} # (left_glyph_name, right_glyph_name) -> design_units
@@ -454,7 +519,8 @@ ppem = size * 150.0 / 72.0
kern_map = {} # (leftCp, rightCp) -> adjust
for face_idx, cps in face_idx_cps.items():
font_path = args.fontstack[face_idx]
kern_map.update(extract_kerning_fonttools(font_path, cps, ppem))
subs = pnum_kern_subs.get(face_idx) if args.pnum else None
kern_map.update(extract_kerning_fonttools(font_path, cps, ppem, pnum_subs=subs))
print(f"kerning: {len(kern_map)} pairs extracted", file=sys.stderr)