0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

疎行列の圧縮を使った Unicode → シフト JIS(コードページ 932)変換

Last updated at Posted at 2021-12-15

変換には CP932.txt (unicode.org) のデータを使用しています。

実行環境にテキスト処理の支援がなくとも、十分なリソースがあれば、変換可能な約 8000 文字に対して 65536 個の参照表を用意する方法もアリでしょうが、ここではコンパクトなテーブル参照による変換を目指します。

疎行列の圧縮

まず、入力となる Unicode で有効な値をビット単位の表にしてみます。

上位 8 ビット(256行)、下位 8 ビット(256桁)の表(長いので折りたたみ)

下位 8 ビットは 256 ビットの 16 進表記(ビッグエンディアン)

UCS2中のシフトJISフラグ(256×256)
00: ffffffffffffffffffffffffffffffff000000000180ca000000010000000100
01: 0000000000000000000000000000000000000000000000000000000000000000
02: 0000000000000000000000000000000000000000000000000000000000000000
03: 0000000000000000000000000000000000007fffdfc07fffdfc0000000000000
04: 4000ffffffffffffffff40000000000000000000000000000000000000000000
05: 0000000000000000000000000000000000000000000000000000000000000000
06: 0000000000000000000000000000000000000000000000000000000000000000
07: 0000000000000000000000000000000000000000000000000000000000000000
08: 0000000000000000000000000000000000000000000000000000000000000000
09: 0000000000000000000000000000000000000000000000000000000000000000
0a: 0000000000000000000000000000000000000000000000000000000000000000
0b: 0000000000000000000000000000000000000000000000000000000000000000
0c: 0000000000000000000000000000000000000000000000000000000000000000
0d: 0000000000000000000000000000000000000000000000000000000000000000
0e: 0000000000000000000000000000000000000000000000000000000000000000
0f: 0000000000000000000000000000000000000000000000000000000000000000
10: 0000000000000000000000000000000000000000000000000000000000000000
11: 0000000000000000000000000000000000000000000000000000000000000000
12: 0000000000000000000000000000000000000000000000000000000000000000
13: 0000000000000000000000000000000000000000000000000000000000000000
14: 0000000000000000000000000000000000000000000000000000000000000000
15: 0000000000000000000000000000000000000000000000000000000000000000
16: 0000000000000000000000000000000000000000000000000000000000000000
17: 0000000000000000000000000000000000000000000000000000000000000000
18: 0000000000000000000000000000000000000000000000000000000000000000
19: 0000000000000000000000000000000000000000000000000000000000000000
1a: 0000000000000000000000000000000000000000000000000000000000000000
1b: 0000000000000000000000000000000000000000000000000000000000000000
1c: 0000000000000000000000000000000000000000000000000000000000000000
1d: 0000000000000000000000000000000000000000000000000000000000000000
1e: 0000000000000000000000000000000000000000000000000000000000000000
1f: 0000000000000000000000000000000000000000000000000000000000000000
20: 000084ccc600b010000000000000000000000000000000000000000000000000
21: 100002004010000000000000ffc0ffc00000f000000000000000280000000000
22: b190402785fa0c0400002000c330000033000000040000010000000000000000
23: 0000200000000000000000000000000000000000000000000000000000000000
24: 000000000000000000000000fffff00000000000000000000000000000000000
25: f009999c9c999999201000000000000000000000c000300c0313000000010000
26: 0600000000000000a00000000025000000000000000000000000000000000000
27: 0000000000000000000000000000000000000000000000000000000000000000
28: 0000000000000000000000000000000000000000000000000000000000000000
29: 0000000000000000000000000000000000000000000000000000000000000000
2a: 0000000000000000000000000000000000000000000000000000000000000000
2b: 0000000000000000000000000000000000000000000000000000000000000000
2c: 0000000000000000000000000000000000000000000000000000000000000000
2d: 0000000000000000000000000000000000000000000000000000000000000000
2e: 0000000000000000000000000000000000000000000000000000000000000000
2f: 0000000000000000000000000000000000000000000000000000000000000000
30: f7fffc05000000007ffffffffffffffffffff01e7ffffffffffffffffffffe1e
31: 0000000000000000000000000000000000000000000000000000000000000000
32: 00000000000060400000000000000000000000000f8000000000000000000000
33: 1004088033100210006441000000001e0003000e400000000804000000000000
34: 0000000000000000000000000000000000000000000000000000000000000000
35: 0000000000000000000000000000000000000000000000000000000000000000
36: 0000000000000000000000000000000000000000000000000000000000000000
37: 0000000000000000000000000000000000000000000000000000000000000000
38: 0000000000000000000000000000000000000000000000000000000000000000
39: 0000000000000000000000000000000000000000000000000000000000000000
3a: 0000000000000000000000000000000000000000000000000000000000000000
3b: 0000000000000000000000000000000000000000000000000000000000000000
3c: 0000000000000000000000000000000000000000000000000000000000000000
3d: 0000000000000000000000000000000000000000000000000000000000000000
3e: 0000000000000000000000000000000000000000000000000000000000000000
3f: 0000000000000000000000000000000000000000000000000000000000000000
40: 0000000000000000000000000000000000000000000000000000000000000000
41: 0000000000000000000000000000000000000000000000000000000000000000
42: 0000000000000000000000000000000000000000000000000000000000000000
43: 0000000000000000000000000000000000000000000000000000000000000000
44: 0000000000000000000000000000000000000000000000000000000000000000
45: 0000000000000000000000000000000000000000000000000000000000000000
46: 0000000000000000000000000000000000000000000000000000000000000000
47: 0000000000000000000000000000000000000000000000000000000000000000
48: 0000000000000000000000000000000000000000000000000000000000000000
49: 0000000000000000000000000000000000000000000000000000000000000000
4a: 0000000000000000000000000000000000000000000000000000000000000000
4b: 0000000000000000000000000000000000000000000000000000000000000000
4c: 0000000000000000000000000000000000000000000000000000000000000000
4d: 0000000000000000000000000000000000000000000000000000000000000000
4e: d1f6cfc242a462d9341707c720005002a6fa6cdbee9e9220eb370fc75c06a318
4f: d067c02c00018aec1307d77e0041961912b56ab4c01706013866c9b55c0316a3
50: 06556a637efc0240b3c186280408ae84840448e0000c3d02246546a215060c50
51: e8402ea140202139dffea8282cfe4788a66df744aef8ff060e5c021cc36cc6e6
52: 9bb24d040d6293f0193d0a121c61fc0511c46819927d4c4ad54425d7bb0034e3
53: e7858764d82150f1d7e479aa8243fd91280012a186c6b21030fe0b557cfff3a0
54: 58ffc015825e02dea2e2400100a0d71c8a3ba0082cd9308ee9c0008066c62025
55: 0b018a00000350c28e09130c1000001a9b7000ef01fa82000d00082918000146
56: 02400b9000416a80200a801008b808a083210800a4020a08f08251b29002b065
57: 98d5328903848190a123c0404e60000120d01000b828900093923a0990000968
58: a63004444821cc24c03069e22050a4421400110b009230f2452855cb0c1be17c
59: 207186f8257e618209c3ddb4b5ea1884782412541c8820720250d86806b00211
5a: 504040a984410608c240002022280001000020300000000e6058830052400030
5b: 005802002028a2029400cfbd1e50d4a095dd05fd3e029ec1bf48b8976fda96a3
5c: 6ff75222a88440ffc6b7d402cc0b42400008c80042d853ba05000040c0e58634
5d: 01124ff121400000201ab008004d120029188004200a01ec004cb21657927d16
5e: 32184274041593849d0a0d0178003eff592107288314078070e19235f0c8dbbb
5f: 587ddf9147454d8a44aa534c637cd149fdb8f1c2c0e6194c140c03ce8810c495
60: 0003a65cc7f140207234a465bcfd85005c7c2b3193603e8c070054abd180fb70
61: d2c74431c188890f29be14e53593df022122cae0095a222213fc800012002baf
62: 80eefa374223b891c1d614929082424bb8607f9a0218445c27edf9dcc00f5703
63: 61c8404101910027004d850801d2233090cb2291f5f82c129a41a23050420e20
64: 02051308028c0a2220020080814102a0108034260c56a058650628a0f3096a26
65: 8400008c18390fd3048747c63208ad8031cac1594d1d814c5e192150e7cc4030
66: b36b1c0b8d874e19785121472fc39a2059c243c4a21228cb4940026c8240bdff
67: 90d70f1703be4ba54243d24bfe25f50b0558852ce2411bd0ca23d8a6294b5c13
68: 78001302607028ccfa86f84d11000b0354051915a385d6680af52da1d1032060
69: cc9f207876a08a4500201c6ee0b71dce60224c9881026813513e90c621942055
6a: 24383953707286e40b9000c16210308388068108b02a10907000503328a00030
6b: 0c202205d10021e6114a98517a6118d19a74068208317d3986163a9100191000
6c: 0081591018000983e002852fa0a1b026728cb270601250ff4c68157474a1d000
6d: 08182153047036964c0000681a6b09c0058a165800092488871964c24aba75f8
6e: 05f01475df5f00ea1026029901132203a009828d242123252c585c0600092983
6f: 62415c00b0186083440008990a0788a8ea82410058205440f2000c91c81b5622
70: 455144b70388a002000840801011808c04622040001f10f00091004500004044
71: 0841086842000208034a06482f4a000408a10c410088404250c2ad01870e045b
72: 0204801000aca63f839820d561402846e1002200a10962423a02a150e04c01cc
73: 0020031d0c730b030c03010010a0a5b00950020000403014a0e6220294264482
74: 1740000026623e214000047bb8619202105000032100800400210808b342e380
75: 5c0e54ab1699f1b80a7d487caf759b8123734824141074ce35242cd23040b82b
76: 40540001e90088102388228861e8a2bebb92927a020289e132a4231b5d222892
77: 49d800138e4001a8830000305690004300124002840c925d0104013835471008
78: 20082c00c70028210402000408192828430e55201161042a4630c82001890804
79: 410260400238802ac1c09727a4840121cc27081403229067c05064815b488010
7a: 809609e98002611fb247810070508a6558803781006382211db5746df73582e1
7b: 2ab140d28688164006ddea04050acc2003152def40244880cb5900048e441300
7c: 8104790151300187900d8a818c0814027054a5916d967046a422228ba1012ab2
7d: ae348df8e01bb4613e9b821a7282764400411079b01fedb7013166aec8c92810
7e: 4c7020137212657652342e660364805d30ebba18000000000000000000000000
7f: 00000000000002a0050ecc8181f2a5c037aa082658c322c446282c00c2509058
80: de18a5c840801215022022a36081bb470f5812b4646d68201a0a02764c01488c
81: 27e00030104150420212dc010612c8e1b0a1142c98c094a7a2c450e195a4183a
82: 65eea39b007a17c0810000e52ab3638200142045061d50d40400795b57105870
83: 7e42038810916ec08461a0802000151905621223a0b04404452a12898051eb14
84: 191e1000a068448c02c20110725f456028108849400428d94a74c268000a0809
85: 82005da1420c0404d0f215e010f4010289a0c9580afb80604045840c0c600172
86: 233013202005800100068c2b0110405000381400187182000b560853084f00d2
87: b2e460a804400911005a154192a20a8120040001201110348b10a00080012352
88: 0507460071004250aa0c31567090a507609423422812cd017c010ccd40803cce
89: 2928b00e04300290580c02038a25290353b113a0436930258000202c13000880
8a: b0aab39514245b384280ec12b25ef0482d4c54a2df8ca04b291d223beb1653a2
8b: e90a8b74c2981042404b12b90219e905902ab260000000000000000000000000
8c: 000000000000012142aa8420603800e8246e0886e1ffbb9df9a6503aba24883c
8d: 0db5ba0000000000000000000b14db0044200040108010222019023550b11409
8e: 00e1800700208c0029e8844198002a084d3458404039c00206bd20113010009e
8f: 14683c5d026110d32e4e0109780000000000001b1187e1392c024820267589e4
90: d617df67f10266ca6577fecad5c727adf961400012a144804022001268840504
91: 200024400104a000007e2a80346835802154a10828310ca0c3dfc3bf5f060609
92: 0226cc02004809698cd2c1722b004182948056b8010401400001b540896430f9
93: 220180e6f69b243008940b18800a840a00080b20090e80401280c3864c800080
94: 110098e0401046a04c807032a020850f40000000000000000000000000000000
95: 00000000000000000000000000000100b1717ac0bd84205a112c0e8864000000
96: 0000000840a32011a81d801f3e28b7a406b70ddc91a1ebd8cf5e465830b0a350
97: 8ba7524a0920b0d63ac5664aead448684e158088929418001290100800063611
98: 7689f1a0480c099c021f0d920511d8000000000000a142001a0000192057280e
99: 1468b886c98a00062458e50000000000000003c2048e18084e80e49520066091
9a: 4403304000908102b40605312c7000000000000000848088880158cb32374910
9b: 020000a135e360187c0748a000012c001003730180b6485082616a107880e400
9c: 8aecbc104c07a072038021208100028000000000000000000000000005589a00
9d: 13c2241112b800134a80c04ec819a02001410020085128b06a011040020520e4
9e: 000000720000000000000000000004c540987505066400fb080fe8de84810b5c
9f: 01821400c008001200332801f32823000004040c800000000000000000000000
a0: 0000000000000000000000000000000000000000000000000000000000000000
a1: 0000000000000000000000000000000000000000000000000000000000000000
a2: 0000000000000000000000000000000000000000000000000000000000000000
a3: 0000000000000000000000000000000000000000000000000000000000000000
a4: 0000000000000000000000000000000000000000000000000000000000000000
a5: 0000000000000000000000000000000000000000000000000000000000000000
a6: 0000000000000000000000000000000000000000000000000000000000000000
a7: 0000000000000000000000000000000000000000000000000000000000000000
a8: 0000000000000000000000000000000000000000000000000000000000000000
a9: 0000000000000000000000000000000000000000000000000000000000000000
aa: 0000000000000000000000000000000000000000000000000000000000000000
ab: 0000000000000000000000000000000000000000000000000000000000000000
ac: 0000000000000000000000000000000000000000000000000000000000000000
ad: 0000000000000000000000000000000000000000000000000000000000000000
ae: 0000000000000000000000000000000000000000000000000000000000000000
af: 0000000000000000000000000000000000000000000000000000000000000000
b0: 0000000000000000000000000000000000000000000000000000000000000000
b1: 0000000000000000000000000000000000000000000000000000000000000000
b2: 0000000000000000000000000000000000000000000000000000000000000000
b3: 0000000000000000000000000000000000000000000000000000000000000000
b4: 0000000000000000000000000000000000000000000000000000000000000000
b5: 0000000000000000000000000000000000000000000000000000000000000000
b6: 0000000000000000000000000000000000000000000000000000000000000000
b7: 0000000000000000000000000000000000000000000000000000000000000000
b8: 0000000000000000000000000000000000000000000000000000000000000000
b9: 0000000000000000000000000000000000000000000000000000000000000000
ba: 0000000000000000000000000000000000000000000000000000000000000000
bb: 0000000000000000000000000000000000000000000000000000000000000000
bc: 0000000000000000000000000000000000000000000000000000000000000000
bd: 0000000000000000000000000000000000000000000000000000000000000000
be: 0000000000000000000000000000000000000000000000000000000000000000
bf: 0000000000000000000000000000000000000000000000000000000000000000
c0: 0000000000000000000000000000000000000000000000000000000000000000
c1: 0000000000000000000000000000000000000000000000000000000000000000
c2: 0000000000000000000000000000000000000000000000000000000000000000
c3: 0000000000000000000000000000000000000000000000000000000000000000
c4: 0000000000000000000000000000000000000000000000000000000000000000
c5: 0000000000000000000000000000000000000000000000000000000000000000
c6: 0000000000000000000000000000000000000000000000000000000000000000
c7: 0000000000000000000000000000000000000000000000000000000000000000
c8: 0000000000000000000000000000000000000000000000000000000000000000
c9: 0000000000000000000000000000000000000000000000000000000000000000
ca: 0000000000000000000000000000000000000000000000000000000000000000
cb: 0000000000000000000000000000000000000000000000000000000000000000
cc: 0000000000000000000000000000000000000000000000000000000000000000
cd: 0000000000000000000000000000000000000000000000000000000000000000
ce: 0000000000000000000000000000000000000000000000000000000000000000
cf: 0000000000000000000000000000000000000000000000000000000000000000
d0: 0000000000000000000000000000000000000000000000000000000000000000
d1: 0000000000000000000000000000000000000000000000000000000000000000
d2: 0000000000000000000000000000000000000000000000000000000000000000
d3: 0000000000000000000000000000000000000000000000000000000000000000
d4: 0000000000000000000000000000000000000000000000000000000000000000
d5: 0000000000000000000000000000000000000000000000000000000000000000
d6: 0000000000000000000000000000000000000000000000000000000000000000
d7: 0000000000000000000000000000000000000000000000000000000000000000
d8: 0000000000000000000000000000000000000000000000000000000000000000
d9: 0000000000000000000000000000000000000000000000000000000000000000
da: 0000000000000000000000000000000000000000000000000000000000000000
db: 0000000000000000000000000000000000000000000000000000000000000000
dc: 0000000000000000000000000000000000000000000000000000000000000000
dd: 0000000000000000000000000000000000000000000000000000000000000000
de: 0000000000000000000000000000000000000000000000000000000000000000
df: 0000000000000000000000000000000000000000000000000000000000000000
e0: 0000000000000000000000000000000000000000000000000000000000000000
e1: 0000000000000000000000000000000000000000000000000000000000000000
e2: 0000000000000000000000000000000000000000000000000000000000000000
e3: 0000000000000000000000000000000000000000000000000000000000000000
e4: 0000000000000000000000000000000000000000000000000000000000000000
e5: 0000000000000000000000000000000000000000000000000000000000000000
e6: 0000000000000000000000000000000000000000000000000000000000000000
e7: 0000000000000000000000000000000000000000000000000000000000000000
e8: 0000000000000000000000000000000000000000000000000000000000000000
e9: 0000000000000000000000000000000000000000000000000000000000000000
ea: 0000000000000000000000000000000000000000000000000000000000000000
eb: 0000000000000000000000000000000000000000000000000000000000000000
ec: 0000000000000000000000000000000000000000000000000000000000000000
ed: 0000000000000000000000000000000000000000000000000000000000000000
ee: 0000000000000000000000000000000000000000000000000000000000000000
ef: 0000000000000000000000000000000000000000000000000000000000000000
f0: 0000000000000000000000000000000000000000000000000000000000000000
f1: 0000000000000000000000000000000000000000000000000000000000000000
f2: 0000000000000000000000000000000000000000000000000000000000000000
f3: 0000000000000000000000000000000000000000000000000000000000000000
f4: 0000000000000000000000000000000000000000000000000000000000000000
f5: 0000000000000000000000000000000000000000000000000000000000000000
f6: 0000000000000000000000000000000000000000000000000000000000000000
f7: 0000000000000000000000000000000000000000000000000000000000000000
f8: 0000000000000000000000000000000000000000000000000000000000000000
f9: 0000000000400000000000000000000000000000000000000000000800000000
fa: 0003fffffffc0000000000000000000000000000000000000000000000000000
fb: 0000000000000000000000000000000000000000000000000000000000000000
fc: 0000000000000000000000000000000000000000000000000000000000000000
fd: 0000000000000000000000000000000000000000000000000000000000000000
fe: 0000000000000000000000000000000000000000000000000000000000000000
ff: 7ffffffffffffffffffffffe7fffffffffffffff0000000000000000fc000000

変換可能な文字コードが特に集中している部分は 0x5000 〜 0xA000 付近です。しかし、'0' や 'f' が続いている部分がほぼありません。例えば、"11808c0462" の部分を 8 ビットで区切ると

16進 ビット列
11 0001 0001
80 1000 0000
8c 1000 1100
04 0000 0100
62 0110 0010

なので、変換可能な Unicode 文字はまばらです。

ビット列の "1" (有効な部分)にバイト毎の番号を割り当てて

| 16進 | ビット列 | データ | 番号 |
|:-:|:-:|:-:|:-:|:-:|
| 11 | 0001 0001 | 0001 0001 | 1 |
| 80 | 1000 0000 | 2000 0000 | 2 |
| 8c | 1000 1100 | 3000 3300 | 3 |
| 04 | 0000 0100 | 0000 0400 | 4 |
| 62 | 0110 0010 | 0550 0050 | 5 |

データを二次元の表と考えます。 "0" (無効)の部分は何でもよいので、ずらして重ねると

-1 0 1 2 3 4 5 6 7 8 9
11 0 0 0 1 0 0 0 1 1
80 2 0 0 0 0 0 0 3
8c 3 0 0 0 3 3 0 0 2
04 0 0 0 0 0 4 4
62 0 5 5 0 0 0 5 0 0 -1
5 5 3 2 1 5 3 3 1 4

みっちり詰まった「重」が出来上がります。これと「所」を使えば「ビット列」が再現できます。この方法を応用します。

サンプル プログラム

UCS2中のシフトJISフラグ(256×256)に対応する参照表の変数は

  • UxCP932_VALID_HI_TABLE
  • UxCP932_VALID_LO_TABLE

コード変換は 4096x16(上位 12 ビット、下位 4 ビット)になっていて、対応する参照表の変数は

  • UxCP932_SPARSE_HI_TABLE
    • インデックスは UxCP932_VALID_HI_TABLE を流用
  • UxCP932_SPARSE_LO_TABLE

です。テーブルの構造は関数を読んでください。

CP932への変換表(Python)
CP932への変換表
UxCP932_VALID_HI_TABLE = [
    +1,  0,  0,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +4,  5,  6,  7,  8,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    11,  0, 12, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 15,
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    +0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    +0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 97,  0,  0,  0,  0, 98,
]
UxCP932_VALID_LO_TABLE = [
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00530180, 0x00800000, 0x00800000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfffe0000, 0xfffe03fb, 0x000003fb, 0x00000000,
    0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x33210000, 0x080d0063, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00400008, 0x00000802, 0x00000000, 0x03ff03ff, 0x000f0000, 0x00000000, 0x00140000, 0x00000000,
    0xe402098d, 0x20305fa1, 0x00040000, 0x00000cc3, 0x000000cc, 0x80000020, 0x00000000, 0x00000000,
    0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x000fffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x3999900f, 0x99999939, 0x00000804, 0x00000000, 0x00000000, 0x300c0003, 0x0000c8c0, 0x00008000,
    0x00000060, 0x00000000, 0x00000005, 0x0000a400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0xa03fffef, 0x00000000, 0xfffffffe, 0xffffffff, 0x780fffff, 0xfffffffe, 0xffffffff, 0x787fffff,
    0x00000000, 0x02060000, 0x00000000, 0x00000000, 0x00000000, 0x000001f0, 0x00000000, 0x00000000,
    0x01102008, 0x084008cc, 0x00822600, 0x78000000, 0x7000c000, 0x00000002, 0x00002010, 0x00000000,
    0x43f36f8b, 0x9b462542, 0xe3e0e82c, 0x400a0004, 0xdb365f65, 0x04497977, 0xe3f0ecd7, 0x18c5603a,
    0x3403e60b, 0x37518000, 0x7eebe0c8, 0x98698200, 0x2d56ad48, 0x8060e803, 0xad93661c, 0xc568c03a,
    0xc656aa60, 0x02403f7e, 0x146183cd, 0x21751020, 0x07122021, 0x40bc3000, 0x4562a624, 0x0a3060a8,
    0x85740217, 0x9c840402, 0x14157ffb, 0x11e27f34, 0x22efb665, 0x60ff1f75, 0x38403a70, 0x676336c3,
    0x20b24dd9, 0x0fc946b0, 0x4850bc98, 0xa03f8638, 0x98162388, 0x5232be49, 0xeba422ab, 0xc72c00dd,
    0x26e1a1e7, 0x8f0a841b, 0x559e27eb, 0x89bfc241, 0x85480014, 0x084d6361, 0xaad07f0c, 0x05cfff3e,
    0xa803ff1a, 0x7b407a41, 0x80024745, 0x38eb0500, 0x1005dc51, 0x710c9b34, 0x01000397, 0xa4046366,
    0x005180d0, 0x430ac000, 0x30c89071, 0x58000008, 0xf7000ed9, 0x00415f80, 0x941000b0, 0x62800018,
    0x09d00240, 0x01568200, 0x08015004, 0x05101d10, 0x001084c1, 0x10504025, 0x4d8a410f, 0xa60d4009,
    0x914cab19, 0x098121c0, 0x0203c485, 0x80000672, 0x00080b04, 0x0009141d, 0x905c49c9, 0x16900009,
    0x22200c65, 0x24338412, 0x47960c03, 0x42250a04, 0xd0880028, 0x4f0c4900, 0xd3aa14a2, 0x3e87d830,
    0x1f618e04, 0x41867ea4, 0x2dbbc390, 0x211857ad, 0x2a48241e, 0x4e041138, 0x161b0a40, 0x88400d60,
    0x9502020a, 0x10608221, 0x04000243, 0x80001444, 0x0c040000, 0x70000000, 0x00c11a06, 0x0c00024a,
    0x00401a00, 0x40451404, 0xbdf30029, 0x052b0a78, 0xbfa0bba9, 0x8379407c, 0xe91d12fd, 0xc5695bf6,
    0x444aeff6, 0xff022115, 0x402bed63, 0x0242d033, 0x00131000, 0x5dca1b42, 0x020000a0, 0x2c61a703,
    0x8ff24880, 0x00000284, 0x100d5804, 0x0048b200, 0x20011894, 0x37805004, 0x684d3200, 0x68be49ea,
    0x2e42184c, 0x21c9a820, 0x80b050b9, 0xff7c001e, 0x14e0849a, 0x01e028c1, 0xac49870e, 0xdddb130f,
    0x89fbbe1a, 0x51b2a2e2, 0x32ca5522, 0x928b3ec6, 0x438f1dbf, 0x32986703, 0x73c03028, 0xa9230811,
    0x3a65c000, 0x04028fe3, 0xa6252c4e, 0x00a1bf3d, 0x8cd43e3a, 0x317c06c9, 0xd52a00e0, 0x0edf018b,
    0x8c22e34b, 0xf0911183, 0xa7287d94, 0x40fbc9ac, 0x07534484, 0x44445a90, 0x00013fc8, 0xf5d40048,
    0xec5f7701, 0x891dc442, 0x49286b83, 0xd2424109, 0x59fe061d, 0x3a221840, 0x3b9fb7e4, 0xc0eaf003,
    0x82021386, 0xe4008980, 0x10a1b200, 0x0cc44b80, 0x8944d309, 0x48341faf, 0x0c458259, 0x0470420a,
    0x10c8a040, 0x44503140, 0x01004004, 0x05408281, 0x642c0108, 0x1a056a30, 0x051460a6, 0x645690cf,
    0x31000021, 0xcbf09c18, 0x63e2e120, 0x01b5104c, 0x9a83538c, 0x3281b8b2, 0x0a84987a, 0x0c0233e7,
    0xd038d6cd, 0x9872e1b1, 0xe2848a1e, 0x0459c3f4, 0x23c2439a, 0xd3144845, 0x36400292, 0xffbd0241,
    0xe8f0eb09, 0xa5d27dc0, 0xd24bc242, 0xd0afa47f, 0x34a11aa0, 0x0bd88247, 0x651bc453, 0xc83ad294,
    0x40c8001e, 0x33140e06, 0xb21f615f, 0xc0d00088, 0xa898a02a, 0x166ba1c5, 0x85b4af50, 0x0604c08b,
    0x1e04f933, 0xa251056e, 0x76380400, 0x73b8ed07, 0x19324406, 0xc8164081, 0x63097c8a, 0xaa042984,
    0xca9c1c24, 0x27614e0e, 0x830009d0, 0xc10c0846, 0x10816011, 0x0908540d, 0xcc0a000e, 0x0c000514,
    0xa0440430, 0x6784008b, 0x8a195288, 0x8b18865e, 0x41602e59, 0x9cbe8c10, 0x895c6861, 0x00089800,
    0x089a8100, 0xc1900018, 0xf4a14007, 0x640d8505, 0x0e4d314e, 0xff0a4806, 0x2ea81632, 0x000b852e,
    0xca841810, 0x696c0e20, 0x16000032, 0x0390d658, 0x1a6851a0, 0x11249000, 0x432698e1, 0x1fae5d52,
    0xae280fa0, 0x5700fafb, 0x99406408, 0xc044c880, 0xb1419005, 0xa4c48424, 0x603a1a34, 0xc1949000,
    0x003a8246, 0xc106180d, 0x99100022, 0x1511e050, 0x00824157, 0x022a041a, 0x8930004f, 0x446ad813,
    0xed228aa2, 0x400511c0, 0x01021000, 0x31018808, 0x02044620, 0x0f08f800, 0xa2008900, 0x22020000,
    0x16108210, 0x10400042, 0x126052c0, 0x200052f4, 0x82308510, 0x42021100, 0x80b5430a, 0xda2070e1,
    0x08012040, 0xfc653500, 0xab0419c1, 0x62140286, 0x00440087, 0x42469085, 0x0a85405c, 0x33803207,
    0xb8c00400, 0xc0d0ce30, 0x0080c030, 0x0da50508, 0x00400a90, 0x280c0200, 0x40446705, 0x41226429,
    0x000002e8, 0x847c4664, 0xde200002, 0x4049861d, 0xc0000a08, 0x20010084, 0x10108400, 0x01c742cd,
    0xd52a703a, 0x1d8f9968, 0x3e12be50, 0x81d9aef5, 0x2412cec4, 0x732e0828, 0x4b3424ac, 0xd41d020c,
    0x80002a02, 0x08110097, 0x114411c4, 0x7d451786, 0x5e4949dd, 0x87914040, 0xd8c4254c, 0x491444ba,
    0xc8001b92, 0x15800271, 0x0c0000c1, 0xc200096a, 0x40024800, 0xba493021, 0x1c802080, 0x1008e2ac,
    0x00341004, 0x841400e3, 0x20004020, 0x14149810, 0x04aa70c2, 0x54208688, 0x04130c62, 0x20109180,
    0x02064082, 0x54011c40, 0xe4e90383, 0x84802125, 0x2810e433, 0xe60944c0, 0x81260a03, 0x080112da,
    0x97906901, 0xf8864001, 0x0081e24d, 0xa6510a0e, 0x81ec011a, 0x8441c600, 0xb62eadb8, 0x8741acef,
    0x4b028d54, 0x02681161, 0x2057bb60, 0x043350a0, 0xf7b4a8c0, 0x01122402, 0x20009ad3, 0x00c82271,
    0x809e2081, 0xe1800c8a, 0x8151b009, 0x40281031, 0x89a52a0e, 0x620e69b6, 0xd1444425, 0x4d548085,
    0x1fb12c75, 0x862dd807, 0x5841d97c, 0x226e414e, 0x9e088200, 0xedb7f80d, 0x75668c80, 0x08149313,
    0xc8040e32, 0x6ea6484e, 0x66742c4a, 0xba0126c0, 0x185dd70c, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x05400000, 0x813370a0, 0x03a54f81, 0x641055ec, 0x2344c31a, 0x00341462, 0x1a090a43,
    0x13a5187b, 0xa8480102, 0xc5440440, 0xe2dd8106, 0x2d481af0, 0x0416b626, 0x6e405058, 0x31128032,
    0x0c0007e4, 0x420a8208, 0x803b4840, 0x87134860, 0x3428850d, 0xe5290319, 0x870a2345, 0x5c1825a9,
    0xd9c577a6, 0x03e85e00, 0xa7000081, 0x41c6cd54, 0xa2042800, 0x2b0ab860, 0xda9e0020, 0x0e1a08ea,
    0x11c0427e, 0x03768908, 0x01058621, 0x98a80004, 0xc44846a0, 0x20220d05, 0x914854a2, 0x28d78a01,
    0x00087898, 0x31221605, 0x08804340, 0x06a2fa4e, 0x92110814, 0x9b142002, 0x16432e52, 0x90105000,
    0x85ba0041, 0x20203042, 0x07a84f0b, 0x40802f08, 0x1a930591, 0x0601df50, 0x3021a202, 0x4e800630,
    0x04c80cc4, 0x8001a004, 0xd4316000, 0x0a020880, 0x00281c00, 0x00418e18, 0xca106ad0, 0x4b00f210,
    0x1506274d, 0x88900220, 0x82a85a00, 0x81504549, 0x80002004, 0x2c088804, 0x000508d1, 0x4ac48001,
    0x0062e0a0, 0x0a42008e, 0x6a8c3055, 0xe0a5090e, 0x42c42906, 0x80b34814, 0xb330803e, 0x733c0102,
    0x700d1494, 0x09400c20, 0xc040301a, 0xc094a451, 0x05c88dca, 0xa40c96c2, 0x34040001, 0x011000c8,
    0xa9cd550d, 0x1cda2428, 0x48370142, 0x120f7a4d, 0x452a32b4, 0xd20531fb, 0xdc44b894, 0x45ca68d7,
    0x2ed15097, 0x42081943, 0x9d48d202, 0xa0979840, 0x064d5409, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x84800000, 0x04215542, 0x17001c06, 0x61107624, 0xb9ddff87, 0x5c0a659f, 0x3c11245d,
    0x005dadb0, 0x00000000, 0x00000000, 0x00db28d0, 0x02000422, 0x44080108, 0xac409804, 0x90288d0a,
    0xe0018700, 0x00310400, 0x82211794, 0x10540019, 0x021a2cb2, 0x40039c02, 0x8804bd60, 0x7900080c,
    0xba3c1628, 0xcb088640, 0x90807274, 0x0000001e, 0xd8000000, 0x9c87e188, 0x04124034, 0x2791ae64,
    0xe6fbe86b, 0x5366408f, 0x537feea6, 0xb5e4e3ab, 0x0002869f, 0x01228548, 0x48004402, 0x20a02116,
    0x02240004, 0x00052080, 0x01547e00, 0x01ac162c, 0x10852a84, 0x05308c14, 0xfdc3fbc3, 0x906060fa,
    0x40336440, 0x96901200, 0x4e834b31, 0x418200d4, 0x1d6a0129, 0x02802080, 0x02ad8000, 0x9f0c2691,
    0x67018044, 0x0c24d96f, 0x18d02910, 0x50215001, 0x04d01000, 0x02017090, 0x61c30148, 0x01000132,
    0x07190088, 0x05620802, 0x4c0e0132, 0xf0a10405, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00800000, 0x035e8e8d, 0x5a0421bd, 0x11703488, 0x00000026,
    0x10000000, 0x8804c502, 0xf801b815, 0x25ed147c, 0x3bb0ed60, 0x1bd78589, 0x1a627af3, 0x0ac50d0c,
    0x524ae5d1, 0x6b0d0490, 0x5266a35c, 0x16122b57, 0x1101a872, 0x00182949, 0x10080948, 0x886c6000,
    0x058f916e, 0x39903012, 0x49b0f840, 0x001b88a0, 0x00000000, 0x00428500, 0x98000058, 0x7014ea04,
    0x611d1628, 0x60005193, 0x00a71a24, 0x00000000, 0x43c00000, 0x10187120, 0xa9270172, 0x89066004,
    0x020cc022, 0x40810900, 0x8ca0602d, 0x00000e34, 0x00000000, 0x11012100, 0xd31a8011, 0x0892ec4c,
    0x85000040, 0x1806c7ac, 0x0512e03e, 0x00348000, 0x80cec008, 0x0a126d01, 0x08568641, 0x0027011e,
    0x083d3751, 0x4e05e032, 0x048401c0, 0x01400081, 0x00000000, 0x00000000, 0x00000000, 0x00591aa0,
    0x882443c8, 0xc8001d48, 0x72030152, 0x04059813, 0x04008280, 0x0d148a10, 0x02088056, 0x2704a040,
    0x4e000000, 0x00000000, 0x00000000, 0xa3200000, 0xa0ae1902, 0xdf002660, 0x7b17f010, 0x3ad08121,
    0x00284180, 0x48001003, 0x8014cc00, 0x00c414cf, 0x30202000, 0x00000001, 0x00000000, 0x00000000,
    0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000,
    0xffffc000, 0x00003fff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0xfffffffe, 0xffffffff, 0x7fffffff, 0xfffffffe, 0xffffffff, 0x00000000, 0x00000000, 0x0000003f,
]
UxCP932_SPARSE_HI_TABLE = [
    +  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    3393, 1919, 1903, 1887, 1871, 1855, 1839, 1823,    0,    0, 5914, 7723,    0, 3236,    0, 3206,
    +  0,    0,    0,    0,    0,    0,    0,    0,    0, 3377, 7195, 3362, 7185,    0,    0,    0,
    3164, 1807, 1791, 1775, 1759, 3126,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    +  0, 4907, 7720, 5394,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    2978, 2961, 2009,    0,    0,    0, 7175, 7165,    0, 7874,    0,    0,    0, 5323,    0,    0,
    6434, 2384, 3348, 5334,    0, 2923, 6220,    0, 7794,    0, 2864, 2844,    0,    0,    0,    0,
    +  0, 2822,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    +  0,    0,    0,    0,    0,    0, 1743, 7870,    0,    0,    0,    0,    0,    0,    0,    0,
    1051, 4898, 1727, 1714, 2721,    0,    0,    0,    0,    0, 5902, 4901, 7149,    0, 2790,    0,
    5656,    0,    0,    0, 5159,    0, 5351,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    1698, 1520,    0,    0, 3332, 1682, 1666, 1650, 1634, 3318, 3302, 1618, 1602, 1586, 1570, 3288,
    +  0,    0,    0, 6284,    0,    0,    0,    0,    0,    0, 7845,    0,    0,    0,    0,    0,
    1374, 5109, 7151, 4780, 7835, 4671,    0, 7855, 5499, 7656, 2757,    0, 2703,    0,    0,    0,
    3273, 3263, 5861, 3250, 4882, 6863, 2646,  792, 3236, 3220, 3206, 6857, 1554, 6418, 4878, 5854,
    1538, 4053, 2607, 4865, 5844, 3191, 4509, 1531, 5833, 5827, 1515, 2437, 5813, 1499, 3175, 5804,
    6843, 3160, 5793, 4406, 1489, 5781, 4110, 4855, 1527, 7142, 5288, 3347, 4843, 4833, 6389, 7596,
    7140, 4827, 2648, 4815, 3146, 3825, 5766, 6409, 1475, 4807, 5755, 3131, 7126, 7286, 4793, 3116,
    3104, 5416, 6793, 6398, 5741, 6763, 5732, 1463, 6632, 3094, 1447, 4783, 4776, 4760, 7592, 4749,
    1436, 4740, 1425, 3082, 4729, 4714, 1288, 1416, 5138, 5724, 3073, 5642, 5712, 6384, 3057, 6837,
    3042,  924, 3028, 7393, 3021,  155, 5041, 4701, 1400, 2015, 4688, 5704, 7120, 2596, 4675, 2273,
    4317, 6502, 5206, 4665, 1393, 6829, 2496, 6589, 6376, 7576, 7569, 4266, 6290, 4786, 4654, 7561,
    4237, 7558, 3940, 7555, 2691, 1188, 7386, 5222,  879, 2480, 2409, 6479, 2899, 4653,  561, 1381,
    1367, 3841, 7547, 5581, 1257, 4917, 7109, 2436, 6267, 2419, 5701, 3981, 3011, 4647, 3882, 7379,
    6367, 6724, 1318, 4642, 4889, 4631, 5397, 3001, 4968, 5513, 7503, 5688, 5904, 2990, 6351, 4618,
    4606, 5677, 5662, 4230, 6345, 4599, 2980, 5338, 5655, 6820, 7104, 5641, 5176, 5637, 7708, 2823,
    4988, 2815,  366, 6063, 6620, 2325, 6045, 2285,    0, 2662,    0, 7207, 5606, 5039, 7378, 3898,
    7136, 2286, 2974, 2189, 4179, 1353, 7371, 6817, 1337, 6801, 5459, 1326, 5627, 1310, 4584, 1301,
    2964, 3601, 4574, 2949, 1285, 2520, 1269, 7058, 2219, 7839, 6339, 4561, 4431, 2199, 1253, 4550,
    5930, 2938, 6255,    0, 2318, 3237, 7697, 3227, 6753,  625, 1146, 7695, 7829, 2927, 4540, 4526,
    6793, 5615, 6776, 4513, 2914, 5487, 7861, 4497, 2905, 7540, 4485, 7853, 2895, 1245, 5611, 1232,
    2880, 1219, 2873, 4446, 4476, 5597, 5584, 1206, 5572, 2863, 2848, 6781, 6205, 7359, 3710, 1197,
    3691, 4467, 1185, 2556, 5558,  820, 1169, 5863, 5545, 4455, 6773, 6331, 6918, 2832, 7356, 6321,
    1153, 2821, 4558, 1137, 5531, 5521, 4441, 2814, 5197, 6762, 6747, 3010, 6737, 2186, 3181, 4427,
    2799, 1132, 2541, 1116, 2789, 5735,  837, 2779, 6732, 4416, 6899, 5510, 4401, 4389,  943, 2772,
    6308,  509, 7312, 7780, 7686, 4482, 7530, 7095, 1100, 4373, 5498, 5257, 1095, 4165, 3867, 7687,
    5097, 7092, 5011, 6673,  607, 2100,  694, 5997, 3811, 5483, 6717, 5472, 4369, 7350, 1090, 4359,
    3532, 7779, 4204, 6297, 6710, 4345, 6155, 7343, 5468, 1074, 2759, 3514, 2750, 7085, 4336, 1444,
    1058, 5454, 1042, 2737, 2725, 4320, 4311, 6710, 4300, 5447, 2719, 4285, 6646, 7523, 3507, 1026,
    1010, 6285, 7328, 2707, 2049, 1002,  994,  978, 7519, 4273,  967, 7322,  960, 2696, 4267, 2687,
    7853, 5246, 6243, 6275, 2681,  950, 4847, 6267, 2234, 5436,  934, 5432, 6257, 4260,  913, 5277,
    +918, 6697, 7080,  902, 2067, 6246,  890, 6234, 3074, 6224,  430, 2258, 4247, 2456, 5922, 3720,
    6693, 4238, 4225, 4212, 7514, 4417, 5311, 3938, 1720, 1015, 2666, 6892, 5878, 2660, 7314, 3625,
    3784, 2503, 7479, 5417, 4837,  884, 2650, 5407, 4200, 7070, 3442, 2635, 2621, 4190, 7822, 2003,
    3852, 6690, 3560, 5975, 1432,  868,  496, 2615, 5401, 6213, 2165, 2599, 6202, 6679, 2591, 3664,
    5059, 4176, 7562, 5387, 7831, 3568, 5373, 7777, 7065, 7057, 2732, 6141,  859, 4172, 4158, 6190,
    7679, 5360,  843, 7671, 4539, 7046, 6661, 2994,  601,  704, 2079, 4148, 6669, 4143, 2451, 4128,
    2381, 7826, 5356, 1371, 4810, 6164, 6101, 4141, 2583, 3756, 5888, 6124, 7672, 6179,  827, 4123,
    2571, 2560, 7659,  907, 1690, 3623, 2492, 1505, 4071, 3111, 7811, 7304, 6084, 5116,    0, 2257,
    3251, 6881, 2910, 3672, 7297, 7507, 5348, 1532, 3986, 4751, 3715, 1156, 4026,  819, 2204, 6655,
    2881, 1048, 7770,  803, 5337, 4112, 6710, 5182, 7508, 3321,  792, 4104, 4620, 6171, 4099, 7651,
    1509, 7038, 6155, 6148, 4705, 1486, 5442, 6140, 7496, 1455, 1296, 5476, 2550, 1115, 2535, 1997,
    7648,    0, 5326, 4088, 1291, 6647,  787,  726, 2773, 3496, 2560,  531, 1534, 2109, 2530, 7294,
    4083, 2514, 5318, 5308, 6126, 5294,  773,  761, 4068, 2292, 4883, 4059, 6121, 5288, 3276,  748,
    2568, 1263, 7497, 2839, 4663, 3910, 6110, 2500, 2490, 2477, 1480,  734, 6100, 4044, 4038, 5280,
    6089, 7806, 7037, 5721, 3026, 3130, 6643, 6020, 2150,  369, 3089,  724, 3417, 7765, 4023, 1554,
    +865, 7121, 7489, 3424, 1322, 1252, 4968, 4768, 4010, 7029, 4952, 7019, 6632, 3534, 7278, 1151,
    +577, 4635, 5541, 2138, 7019,  708, 3975, 5199,  692, 3789, 1709,  676, 4188, 1387, 6082, 1001,
    2468, 6072,  153, 2460,  669, 2478, 6571,  655, 4740, 4000, 7635,  220, 5270, 2445,  647,  636,
    3989, 3978, 5264, 7637, 6619, 3972, 6991, 5820, 7010, 3956, 1307, 3617,  628, 1216, 3745, 7812,
    +310, 2099, 6612, 7274,  567,  618, 4251, 2778, 5254,  612, 3943, 3929, 2439, 3921,  294, 5240,
    3915, 5229,  596,  590, 3899, 2333, 3892, 5222, 3200, 5207,  574,  558, 6331, 3878,  537, 3547,
    6607, 1548, 3472, 3864, 5202, 5188, 7478,  542, 3849, 5177,    0,    0,    0,    0,    0,    0,
    +  0,    0,    0, 5237, 6406,  535, 2426, 7006, 5164, 5068, 2416, 6065, 6060, 4609, 6053, 5153,
    5146, 5136, 2437, 5124, 2725, 3840,  672,  519, 7268, 6596, 2403, 7000, 6046, 7257,  662, 5120,
    7252, 3053, 2709, 3035, 6869,  512, 5149,  499,  487, 6585, 6991,  478, 3832, 2392, 3823, 6034,
    3808,  465, 7759, 7630, 2225, 7468, 3797, 3790, 4091, 1067, 6581, 5083, 1171, 2377, 6578, 6567,
    3781, 6956, 4460, 7247,  459, 4290, 1161, 5111, 5962, 5105, 5947,  450, 3767, 4679,  447, 3760,
    6029, 1137, 4107, 4283, 7236, 2520, 2362, 6980, 2675,  445,  292, 3744, 5096, 5089, 4019,  716,
    3007, 2352, 2618, 1417, 2340, 7465, 6556, 2120, 5845, 5076, 6016,  520, 1174, 2855, 6309, 7455,
    3161, 7453, 1030,  186, 3034,  438, 1730, 2594, 5698, 3645, 5064, 2804, 6549, 6004, 5997, 5945,
    3734, 3768, 1398, 4590, 7753, 4529, 2328, 4489,  628, 1079, 1437,  935, 5993, 2952,  180, 5055,
    6535, 7755, 5677, 2310, 3726, 5045, 6543,  426, 5042, 4923, 3885,  417, 2322, 5983,  745, 5028,
    6531,  798, 5507, 6813, 4327, 1073,  410, 2539, 2307, 7447, 2297, 3689, 1062, 2631, 7240, 1335,
    2287,  396, 6524, 5974, 5167, 2280, 2265, 5026, 5961, 3492, 3712,  341, 3696, 3171, 2250, 3687,
    2241, 3676, 4356, 2792, 1202, 5010, 4218,  393, 2226, 6522,    0,    0,    0,    0,    0,    0,
    +  0,    0,    0, 3952, 3667, 1277, 5950, 7804, 4998, 5001,  377,  361, 2220, 3660, 3656, 2841,
    5935, 7628,    0,    0,    0,    0, 6010, 7445, 3118, 1035, 1366,  491, 2024, 6973, 2204, 3637,
    6420,  203, 1010, 7754, 6511,  244, 5769, 4721, 4991, 7208,  976,  233, 6499, 1336, 2045, 7613,
    6968, 3642, 3133, 4979, 4972, 5525, 3294,    0,    0, 7796, 4006,  347, 2871, 1469, 3628, 3619,
    +331,  315, 2199, 3608, 2183, 2169,  299, 3593,  288, 1005, 4960, 2615,  771, 2048, 4956, 4005,
    +723, 2401, 2359, 2244, 7739, 7614, 6491, 7607, 5925, 2655, 2735, 7598,  272,  256, 3583, 1496,
    6175, 1275, 1192, 5916, 2154, 2146, 4860, 1070, 7233, 5907, 2339, 2142,  666, 6967, 3572, 3559,
    +600, 2131,  240, 6955, 6948, 7228,  401,  470,  644, 5595, 6485,  547, 3931, 2129, 7436,  623,
    +829, 6478,  249, 6845, 7434, 2921, 4047,  224,  603,    0,    0,    0,    0,    0,    0,    0,
    +  0,    0,    0,    0,    0,    0,    0,  541,  212, 7222, 3552, 4942, 6467, 7210, 3252,    0,
    +  0,  473, 2118,  755,  198,  193, 6463, 3540, 6449, 6942,  184, 4934, 2111, 5895, 6934, 5888,
    +175, 3527, 3070, 2096, 3516, 3503, 3490, 4513, 2082, 1728, 3476, 1983, 7202,  424,  958, 3466,
    2070, 5782, 2357, 6927, 6915, 6442, 4865, 7802,    0,    0, 2172,  983, 1246, 3088, 3452, 2755,
    6910, 2066, 2053,  883, 6359, 7429,    0,    0,    0, 5686, 6904,  348, 7420,  163, 1109,  861,
    +260, 1353,  763,  405, 1469, 6433, 6897,    0,    0,    0,  453, 1401,  162, 2037, 3445, 5659,
    +423, 1975, 3435, 4393, 2029, 4130,  318, 2932,  685, 2022, 2008, 4376,  145, 4817, 7415, 7742,
    3423, 5882, 1999,  745, 2084, 3478,  225,  904,    0,    0,    0,    0,    0,    0, 4572, 3322,
    5869, 1226, 6886,  158, 6858,  326,  146, 2588, 3455,  301, 3184, 5370, 1124,  273, 3560, 2419,
    +  0, 4938,    0,    0,    0,    0,    0, 4297, 3215, 1994, 5557, 7400, 3579, 1980,  144, 6875,
    1099,  377,  434,  684, 7726,  579, 4921, 2949,  264,  848,  258,    0,    0,    0,    0,    0,
    +  0,    0,  219,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  136,    0,    0,
    +182,  128, 3409,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    1964,  112,   96,   80,   64, 1950, 1934,   48,   32,   16,    0,    0,    0,    0, 7730,    0,
]
UxCP932_SPARSE_LO_TABLE = [
    + 208,   209,   210,   211,   212,   213,   214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
    + 192,   193,   194,   195,   196,   197,   198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
    + 176,   177,   178,   179,   180,   181,   182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
    33101, 33409, 33410, 33411, 33412, 33413, 33414, 33415, 33416, 33417, 33418, 33419, 33420, 33421, 33422, 33423,
    33391, 33392, 33393, 33394, 33395, 33396, 33397, 33398, 33399, 33400, 33401, 33133, 33119, 33134, 33103, 33105,
    33175, 33376, 33377, 33378, 33379, 33380, 33381, 33382, 33383, 33384, 33385, 33386, 33387, 33388, 33389, 33390,
    33359, 33360, 33361, 33362, 33363, 33364, 33365, 33366, 33367, 33368, 33094, 33095, 33155, 33153, 33156, 33096,
    64156, 64177, 64216, 64232, 64234, 64344, 64350, 64373, 64381, 64382, 64384, 64386, 64390, 64393, 64402, 64413,
    60027, 59839, 36244, 38583, 64489, 60028, 59970, 59842, 60029, 57958, 36079, 59840, 37851, 64584, 38481, 60030,
    59843, 59978, 59791, 37523, 59757, 35822, 37009, 36589, 35309, 36227, 39402, 59756, 59898, 59897, 59754, 36601,
    59755, 59792, 59753, 59578, 58804, 59579, 36971, 59580, 35138, 38892, 58725, 38871, 59575, 59582, 59584, 59561,
    59308, 36032, 59560, 58802, 64144, 64155, 37321, 64492, 59544, 58726, 38285, 59126, 38339, 59549, 59551, 59550,
    59552, 59547, 59545, 36222, 38629, 59546, 59512, 37197, 59124, 59125, 59127, 59513, 57982, 38338, 59514, 35402,
    59503, 59876, 57984, 35163, 64224, 59504, 35149, 59505, 59877, 59227, 59229, 57987, 59508, 59506, 59509, 59511,
    36857, 64472, 59457, 59459, 59203, 64471, 35793, 59230, 38244, 59210, 59492, 36576, 38978, 59205, 59388, 36342,
    59352, 35808, 60062, 37078, 59490, 59764, 59353, 64443, 37698, 59766, 64442, 59356, 35480, 36970, 64444, 59354,
    59348, 59349, 35666, 59765, 59993, 38836, 38094, 36305, 36575, 59350, 59992, 59351, 38818, 36708, 38636, 38858,
    59313, 59312, 59310, 57988, 35538, 58606, 36198, 59278, 58101, 59315, 59314, 35219, 37227, 38854, 36013, 59316,
    38777, 58584, 64437, 59305, 37707, 58103, 58053, 59980, 37272, 36565, 59306, 37504, 59283, 58054, 37628, 37746,
    59284, 59288, 36992, 58059, 38023, 37578, 59972, 59971, 37056, 59287, 37292, 37342, 37271, 38980, 37798, 59973,
    59280, 35700, 35148, 59968, 59969, 37454, 59289, 35291, 59286, 59299, 37799, 37443, 36938, 37983, 38126, 37497,
    37865, 35682, 59272, 64423, 37554, 38355, 37586, 36254, 59752, 38625, 37448, 59077, 59078, 35661, 36944, 59080,
    38019, 37341, 57810, 39757, 38127, 37724, 59076, 38360, 38502, 38281, 36320, 36214, 36059, 36066, 60042, 57812,
    38254, 35293, 38092, 59075, 35537, 37075, 59074, 59079, 37529, 35683, 58303, 36855, 58975, 59042, 64419, 35920,
    36076, 59464, 58974, 37365, 35660, 37803, 59043, 58977, 64428, 58978, 58875, 36823, 59770, 35916, 58945, 59466,
    58944, 58844, 58846, 59776, 58947, 36049, 58834, 58946, 35007, 58948, 37002, 35544, 58835, 59808, 40659, 58832,
    58845, 37519, 37228, 60043, 59625, 40656, 35699, 58833, 58830, 35804, 58729, 39292, 40644, 36686, 60044, 58568,
    35733, 36522, 38840, 38793, 35825, 58730, 38614, 58551, 38380, 38246, 58559, 58532, 58597, 36252, 35288, 58573,
    58535, 58482, 59788, 39086, 37264, 35956, 64479, 58483, 38364, 35546, 35168, 36014, 37187, 36727, 58455, 38289,
    36685, 37206, 59465, 58456, 36831, 38284, 58458, 58446, 58462, 58447, 58443, 58459, 58457, 37982, 37291, 58444,
    37490, 58445, 40841, 36248, 58438, 59109, 36208, 58442, 40849, 59108, 40842, 37552, 38304, 37186, 37543, 64248,
    38277, 58436, 37338, 58435, 36207, 39026, 35731, 58336, 64414, 58335, 58334, 37550, 35762, 58337, 36933, 58452,
    58338, 58710, 58708, 35522, 58339, 38999, 58340, 58275, 58276, 37623, 58221, 58278, 58277, 58217, 35914, 58279,
    36515, 38354, 35529, 59468, 37559, 38601, 58280, 58248, 35036, 58252, 58251, 58255, 59472, 58257, 58214, 36202,
    38612, 35062, 37588, 58204, 37475, 64396, 58212, 58072, 58201, 37469, 58069, 58206, 35003, 38600, 64397, 39577,
    58209, 58203, 36810, 58068, 37072, 60047, 58071, 60048, 57924, 58207, 36600, 35035, 58202, 58210, 36311, 37218,
    58183, 36961, 60050, 58185, 37222, 38497, 36341, 36816, 36270, 38558, 64478, 40929, 59510, 58184, 36427, 36487,
    37595, 37083, 58182, 38877, 58082, 38060, 38833, 59385, 40941, 38036, 58073, 37221, 37971, 40343, 58070, 36716,
    58077, 39893, 58074, 35006, 37087, 58041, 58789, 64484, 38093, 58075, 58045, 38353, 58002, 37498, 39889, 58040,
    58042, 38746, 35747, 58043, 39262, 37500, 36529, 36813, 57998, 57999, 36726, 35526, 37814, 58000, 64389, 57972,
    35481, 37447, 64391, 35978, 58001, 35718, 37467, 36051, 57973, 35827, 35067, 58351, 57974, 36242, 37114, 38372,
    57965, 37263, 58332, 38515, 37960, 58358, 57967, 57945, 58333, 59381, 37071, 35182, 35256, 57946, 57947, 38908,
    59831, 35799, 35281, 37827, 57960, 35798, 64202, 38208, 39004, 37204, 60045, 35004, 64579, 40340, 57939, 38528,
    36025, 35280, 37621, 38303, 38739, 40341, 36736, 57936, 40931, 57935, 37219, 57932, 38829, 36193, 57934, 40944,
    58609, 36714, 36959, 57933, 57813, 59325, 57585, 37813, 58616, 36282, 57814, 58608, 57588, 57815, 57772, 57819,
    57817, 57818, 57773, 57816, 57589, 60041, 57774, 57775, 57776, 59870, 38817, 59872, 57730, 36429, 57732, 57733,
    37491, 58857, 35471, 59851, 35158, 38504, 57731, 59874, 57728, 35033, 57725, 57726, 36852, 57702, 37226, 57699,
    37867, 57698, 34978, 37323, 35048, 38057, 59769, 38220, 35653, 57694, 38826, 35948, 57695, 36216, 57693, 38100,
    57696, 39001, 57697, 38874, 64367, 64363, 57586, 60066, 35677, 38800, 57527, 37883, 57584, 57587, 35468, 57528,
    38474, 58862, 57573, 57511, 36002, 57512, 35491, 38086, 36573, 38275, 64093, 58874, 58864, 38634, 57513, 57514,
    37237, 36514, 57515, 38867, 35760, 57494, 36176, 57496, 35213, 36762, 57491, 36234, 37959, 40089, 40075, 40887,
    59486, 64188, 39546, 40079, 59487, 40268, 38804, 57436, 40266, 57440, 37363, 35732, 37742, 40269, 40916, 40925,
    34989, 35153, 64328, 38319, 35255, 60060, 40918, 37290, 40909, 40911, 36192, 38788, 60061, 57971, 59760, 59761,
    40902, 40896, 40893, 36283, 36524, 59763, 38866, 40899, 59762, 40840, 64322, 35518, 36728, 57828, 35224, 39558,
    64246, 37872, 40839, 36189, 40798, 39557, 35428, 35517, 40800, 39559, 37869, 40638, 37864, 40799, 39562, 40801,
    59736, 59737, 64233, 40802, 40642, 40629, 40637, 35782, 40632, 36732, 37836, 57455, 40610, 57457, 59878, 40633,
    59879, 40617, 40604, 40635, 40614, 37590, 39023, 40598, 40608, 57456, 40612, 35030, 37734, 36092, 40600, 36952,
    40618, 38584, 40605, 36929, 37573, 40595, 40593, 35918, 36797, 39397, 58798, 35809, 39659, 36070, 38812, 35730,
    35431, 38790, 58801, 40584, 58792, 37618, 35787, 35915, 64227, 35514, 35690, 35463, 36928, 40296, 40301, 40578,
    64228, 37318, 36343, 38545, 38335, 36438, 40565, 39015, 40549, 37013, 38209, 59626, 37954, 40548, 40564, 38032,
    40543, 59225, 40542, 37772, 40412, 40416, 36045, 35694, 59717, 37990, 59224, 36967, 59226, 59718, 40544, 35819,
    36796, 38082, 40537, 36848, 38619, 40539, 40540, 38792, 64225, 36812, 36318, 37306, 40545, 36571, 38743, 36185,
    36849, 38004, 36293, 40538, 35034, 39152, 37741, 40695, 40536, 37289, 35982, 38732, 59208, 38396, 40768, 38302,
    64223, 40523, 40520, 40567, 35784, 35175, 36184, 40521, 58723, 40522, 36753, 37250, 64222, 64102, 39382, 37213,
    37212, 37334, 35174, 38806, 59106, 57786, 64212, 36724, 57506, 38534, 36336, 33951, 33962, 33952, 33963, 36794,
    64210, 37029, 64206, 57507, 36182, 40414, 58966, 33953, 36265, 36792, 33964, 64209, 40413, 58506, 36793, 36218,
    38590, 36264, 38115, 38081, 38279, 64461, 64462, 35238, 36549, 37740, 58508, 38847, 38503, 40397, 36558, 58876,
    35805, 40398, 40361, 40362, 37702, 40364, 58788, 40323, 36419, 40359, 37301, 40329, 40310, 40324, 35675, 37244,
    40326, 40365, 60039, 60040, 36598, 40315, 38240, 59767, 36790, 37699, 40309, 40314, 40260, 64356, 40261, 40262,
    37333, 64354, 59758, 59759, 36043, 59985, 59991, 38623, 59984, 57570, 59989, 38491, 37036, 35300, 35322, 64199,
    40187, 64197, 35005, 59990, 58558, 40134, 37066, 40188, 64196, 59073, 40256, 35969, 39888, 40132, 40135, 40127,
    40131, 40117, 36676, 57923, 40120, 37965, 39890, 40114, 39891, 38650, 38649, 64404, 57922, 57492, 40124, 40125,
    35027, 40062, 57493, 35320, 40083, 40085, 37488, 39021, 35489, 36262, 35254, 40077, 40088, 40087, 35761, 58707,
    37287, 37331, 40061, 38805, 39545, 58709, 35709, 40072, 37035, 35205, 40066, 35318, 40071, 40107, 40057, 35482,
    35759, 59502, 37967, 59030, 59363, 40056, 36786, 35173, 40054, 40037, 36250, 59034, 40060, 40038, 59031, 38640,
    59033, 59032, 38110, 37875, 40021, 40041, 35708, 37538, 35064, 40022, 38308, 36175, 59895, 58046, 37487, 59894,
    40012, 40010, 37613, 40011, 40013, 35221, 35204, 37612, 40014, 59892, 35994, 35316, 37973, 39931, 40015, 37881,
    35430, 59720, 59719, 40000, 59721, 37819, 35756, 40003, 40004, 39596, 40002, 36322, 38239, 35299, 39860, 39865,
    35791, 36809, 39863, 38486, 38389, 37738, 36550, 39594, 39597, 37239, 38810, 64450, 59365, 59058, 57737, 59362,
    59364, 39842, 59059, 39843, 37844, 35783, 39835, 37848, 37096, 59360, 35727, 39836, 57582, 35836, 35924, 37837,
    35246, 39365, 36466, 39837, 39840, 39822, 39366, 35147, 39824, 35551, 37534, 39823, 35527, 37025, 39815, 36507,
    35494, 35829, 39814, 37326, 36597, 37468, 64169, 39622, 37115, 35504, 37607, 36945, 39819, 36416, 36297, 57833,
    35500, 35409, 35203, 36778, 35270, 60063, 39810, 38757, 64377, 39806, 36012, 58971, 39808, 36712, 37358, 58972,
    35142, 36583, 35008, 59234, 37238, 35502, 36531, 37870, 36167, 36465, 39794, 37275, 36017, 36165, 39795, 64166,
    36506, 37302, 59768, 39796, 39797, 36473, 36166, 39579, 38608, 36591, 38366, 39581, 40953, 40955, 37014, 39583,
    39582, 34661, 39584, 37201, 39585, 36258, 35991, 35021, 36989, 57408, 40951, 34665, 35272, 38242, 39578, 36037,
    57949, 39504, 36241, 38121, 39580, 37357, 39509, 36772, 39408, 59789, 37220, 58770, 39410, 39506, 39412, 58771,
    38626, 35419, 64146, 36334, 39009, 59790, 39401, 39399, 35059, 35563, 64140, 37286, 35696, 38801, 37280, 39369,
    35253, 36768, 35751, 39368, 39352, 64139, 38337, 35752, 37619, 36704, 35713, 38105, 64137, 38630, 37877, 58787,
    39353, 38383, 39344, 64138, 39345, 40411, 38084, 35265, 58796, 39347, 38898, 39349, 58790, 64134, 35232, 40415,
    36757, 37751, 36229, 39328, 39329, 35816, 64375, 36840, 39323, 35460, 39317, 39315, 37230, 59773, 35807, 59772,
    59774, 38356, 59771, 39266, 39319, 39267, 39318, 59273, 37856, 35198, 59778, 64507, 39270, 36347, 64372, 39269,
    36292, 64116, 39271, 64122, 39150, 57555, 38119, 64120, 39151, 39155, 35020, 39132, 39130, 59358, 59359, 39125,
    38350, 35396, 37293, 39128, 59357, 39131, 39129, 59361, 38363, 35716, 39126, 35744, 35263, 36572, 36304, 57543,
    33145, 33146, 33191, 33196, 33131, 33132, 39748, 39160, 38553, 38286, 36082, 39119, 39162, 34688, 35264, 34689,
    38329, 39113, 64107, 35561, 38484, 64108, 39117, 36081, 57593, 37112, 36455, 39106, 35017, 57594, 58226, 36062,
    35562, 38298, 36697, 36973, 39100, 37070, 39098, 38043, 39099, 35703, 36552, 58228, 36257, 35310, 57827, 39097,
    39096, 38311, 33664, 33665, 33666, 33667, 33668, 33669, 33670, 33671, 33672, 33673, 33674, 33675, 33676, 33677,
    33678, 33679, 33647, 33648, 33649, 33650, 33651, 33652, 33653, 33654, 33655, 33656, 33657, 33658, 33659, 33660,
    33661, 33662, 33631, 33632, 33633, 33634, 33635, 33636, 33637, 33638, 33639, 33640, 33641, 33642, 33643, 33644,
    33645, 33646, 33615, 33616, 33617, 33618, 33619, 33620, 33621, 33622, 33623, 33624, 33625, 33626, 33627, 33628,
    33629, 33630, 33502, 33503, 33504, 33505, 33506, 33507, 33508, 33509, 33510, 33511, 33512, 33513, 33514, 33515,
    33516, 33517, 33486, 33487, 33488, 33489, 33490, 33491, 33492, 33493, 33494, 33495, 33496, 33497, 33498, 33499,
    33500, 33501, 33470, 33471, 33472, 33473, 33474, 33475, 33476, 33477, 33478, 33479, 33480, 33481, 33482, 33483,
    33484, 33485, 33454, 33455, 33456, 33457, 33458, 33459, 33460, 33461, 33462, 33463, 33464, 33465, 33466, 33467,
    33468, 33469, 33088, 33089, 33090, 33110, 40947, 33112, 33113, 33114, 33137, 33138, 33139, 33140, 33141, 33142,
    33143, 33144, 33979, 35738, 57941, 33969, 33960, 57943, 37480, 33976, 33981, 57944, 40698, 33971, 33961, 33973,
    59614, 33977, 33968, 33959, 33980, 40696, 36071, 33975, 36834, 58731, 33970, 33958, 59615, 37518, 33974, 34624,
    34625, 34626, 34627, 34628, 34629, 34630, 34631, 34632, 34633, 34634, 34635, 34636, 34637, 34638, 34639, 33922,
    33923, 33924, 33925, 33926, 33927, 33928, 33929, 33930, 33931, 33932, 33933, 33934, 33935, 33936, 33937, 33904,
    33905, 33906, 33907, 33908, 33909, 33911, 33912, 33913, 33914, 33915, 33916, 33917, 33918, 33920, 33921, 33873,
    33874, 33875, 33876, 33877, 33878, 33879, 33880, 33881, 33882, 33883, 33884, 33885, 33886, 33887, 33888, 33856,
    33857, 33858, 33859, 33860, 33861, 33863, 33864, 33865, 33866, 33867, 33868, 33869, 33870, 33871, 33872,   112,
    + 113,   114,   115,   116,   117,   118,   119,   120,   121,   122,   123,   124,   125,   126,   127,    96,
    +  97,    98,    99,   100,   101,   102,   103,   104,   105,   106,   107,   108,   109,   110,   111,    80,
    +  81,    82,    83,    84,    85,    86,    87,    88,    89,    90,    91,    92,    93,    94,    95,    64,
    +  65,    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,    48,
    +  49,    50,    51,    52,    53,    54,    55,    56,    57,    58,    59,    60,    61,    62,    63,    32,
    +  33,    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,    46,    47,    16,
    +  17,    18,    19,    20,    21,    22,    23,    24,    25,    26,    27,    28,    29,    30,    31,   161,
    + 162,   163,   164,   165,   166,   167,   168,   169,   170,   171,   172,   173,   174,   175, 33424, 33425,
    33426, 33427, 33428, 33429, 33430, 33431, 33432, 33433, 33434, 33135, 33122, 33136, 33120, 33097, 64087, 33172,
    33168, 33171, 33173, 64086, 33129, 33130, 33174, 33147, 33091, 33148, 33092, 33118, 60022, 64587, 36245, 59809,
    60023, 59810, 59619, 59620, 57554, 38617, 59811, 37345, 60024, 60026, 60025, 60011, 60009, 39003, 57596, 60010,
    59869, 38893, 64358, 59868, 59867, 57575, 40829, 60012, 59836, 38873, 64090, 36027, 38248, 59865, 35057, 39411,
    59837, 39406, 38542, 36428, 33264, 36344, 37198, 59832, 38313, 59830, 59107, 64145, 59833, 59834, 35392, 36272,
    59823, 59822, 38563, 59115, 59113, 59835, 59793, 59110, 59794, 59795, 59825, 59826, 59824, 36226, 64508, 37725,
    59235, 64576, 40532, 59796, 59797, 59733, 59729, 40535, 59238, 59732, 37017, 59324, 64504, 35545, 64438, 38811,
    35015, 59734, 36448, 59735, 59726, 35308, 59727, 38341, 37560, 36256, 59728, 36224, 36743, 38763, 36987, 59730,
    59731, 35052, 59633, 59609, 40942, 59632, 35475, 59607, 59611, 40930, 59873, 59871, 37452, 59612, 40936, 35014,
    59589, 59613, 38985, 64493, 58048, 39379, 58055, 58049, 40528, 59590, 58058, 64494, 37701, 59591, 59592, 37021,
    35557, 57595, 58064, 38745, 35307, 36695, 36057, 59540, 59571, 35162, 59570, 36499, 59572, 59569, 59541, 58704,
    36323, 59480, 37708, 37005, 59542, 59543, 58705, 59473, 59474, 59477, 64380, 37006, 59456, 59458, 59479, 64483,
    64477, 64475, 59375, 64457, 36518, 59383, 38887, 59382, 36560, 59367, 64453, 64456, 59380, 35220, 37715, 59368,
    59366, 57809, 59371, 59369, 57808, 59374, 38518, 37362, 64455, 59296, 59297, 59298, 37817, 37442, 35041, 59302,
    38551, 59303, 60065, 40860, 38295, 37307, 59715, 59304, 37849, 37003, 35321, 59716, 37496, 35172, 35830, 39786,
    59300, 38742, 35166, 39789, 38357, 35295, 59295, 37282, 59285, 34983, 38977, 39790, 57498, 37077, 59290, 59119,
    39859, 37255, 36439, 57500, 36055, 37343, 59116, 59117, 57499, 36931, 39383, 38984, 35306, 59082, 38983, 37568,
    39012, 58488, 59044, 36497, 59081, 36445, 37295, 39847, 37624, 59098, 37191, 38848, 40396, 40588, 59045, 38014,
    59046, 38500, 35193, 35040, 59329, 37795, 59328, 40596, 59017, 40583, 59011, 59019, 59012, 59016, 59008, 37860,
    37626, 59006, 57463, 40673, 40643, 59004, 40662, 38720, 36496, 35186, 38466, 58989, 35959, 40654, 57474, 36494,
    40649, 40646, 36493, 37710, 39020, 58988, 58987, 37190, 36284, 37312, 58983, 39501, 36825, 38237, 39498, 36030,
    64148, 37625, 58973, 58982, 39785, 35678, 36492, 35958, 57706, 36981, 58957, 58976, 38585, 37794, 57707, 58959,
    38807, 57708, 58958, 36965, 38774, 58960, 58952, 58817, 58961, 38306, 37989, 58953, 58818, 58954, 36009, 58819,
    64178, 58821, 35659, 36313, 38900, 58847, 58848, 37269, 58773, 39881, 39878, 58784, 39880, 35979, 35290, 36261,
    58780, 38816, 58785, 58188, 58617, 58688, 58781, 38103, 58197, 64395, 64460, 36201, 58620, 36820, 36551, 58690,
    37195, 38348, 35772, 38560, 58615, 58614, 59636, 58610, 58611, 59635, 35157, 38290, 58594, 37791, 64441, 58613,
    34991, 38506, 37802, 58587, 37697, 58583, 37266, 58577, 58585, 58590, 35217, 58514, 38888, 37339, 35737, 38233,
    38243, 34708, 58526, 36541, 35285, 58524, 36247, 58522, 58513, 58465, 34709, 37279, 38994, 33253, 33159, 34712,
    58467, 58466, 58469, 59326, 36050, 36488, 64440, 58470, 38124, 39560, 59327, 37976, 36008, 38498, 39563, 58349,
    58347, 64401, 36205, 58296, 35921, 39016, 39604, 39564, 37185, 35680, 58281, 59994, 37353, 36331, 58300, 58297,
    59998, 58284, 58282, 58283, 36319, 35954, 58322, 58095, 37493, 58097, 36942, 38837, 58096, 58323, 64388, 39666,
    57994, 36048, 57993, 39602, 38358, 37207, 57995, 57996, 40645, 38835, 57997, 40648, 59629, 57961, 35054, 40948,
    38764, 38538, 40954, 57964, 35656, 40653, 40663, 57962, 35282, 35949, 57963, 36197, 57954, 36424, 34986, 37622,
    57769, 57955, 37061, 57768, 39561, 57966, 57770, 57771, 64371, 64369, 57763, 64370, 64368, 57764, 37705, 57459,
    35398, 36195, 57765, 39505, 57758, 57766, 57759, 35278, 57767, 40786, 57760, 37780, 57761, 40787, 38061, 37743,
    57762, 38034, 38227, 36249, 35156, 57681, 40789, 57680, 39839, 35835, 35523, 39838, 36978, 37719, 37723, 37528,
    57682, 37046, 57664, 35467, 38234, 57665, 37294, 36588, 35490, 57666, 64355, 57667, 57568, 36688, 40257, 58949,
    57668, 35933, 58950, 37101, 38087, 57569, 57567, 40258, 35279, 58951, 37052, 40259, 35673, 40068, 57563, 64353,
    36440, 57445, 57571, 37567, 57565, 38253, 40074, 57592, 57453, 57729, 57450, 57449, 57446, 57452, 37842, 57454,
    64334, 57736, 64335, 57734, 57442, 57735, 57443, 57415, 57414, 57420, 57447, 37023, 64583, 57411, 59974, 64331,
    38465, 37991, 35715, 58732, 37700, 57423, 59979, 37517, 40861, 40867, 35277, 37880, 39493, 35000, 40865, 38310,
    38651, 40863, 36513, 36800, 40856, 40862, 35208, 37311, 59319, 35714, 40850, 58607, 59320, 39626, 38028, 37696,
    37587, 35976, 35650, 40823, 35652, 40848, 58612, 35068, 40824, 35440, 38378, 38536, 40819, 40818, 40820, 35235,
    37481, 58967, 40821, 58968, 58969, 36421, 35435, 40822, 39844, 39251, 37729, 40803, 36478, 37043, 36255, 36077,
    38288, 37057, 38724, 38368, 39011, 40777, 38062, 38981, 38013, 36501, 40697, 36696, 40699, 40700, 40780, 35833,
    39770, 38225, 40776, 40778, 40779, 58586, 40775, 58581, 40589, 40571, 35973, 35946, 37773, 64230, 36819, 40569,
    37516, 35012, 38646, 36548, 36338, 35164, 40572, 40574, 38494, 35513, 36280, 37109, 36703, 38543, 35424, 37208,
    37585, 39544, 38733, 34676, 36585, 40560, 40559, 38512, 58362, 40531, 40534, 40533, 34691, 35575, 58361, 64219,
    35712, 37544, 40530, 33982, 58363, 38895, 40424, 36510, 36183, 40422, 36450, 58327, 33972, 38377, 40423, 58326,
    36951, 59341, 64099, 36829, 40421, 40419, 40417, 40418, 64321, 59344, 59342, 35413, 64208, 37515, 59343, 40403,
    40517, 40401, 40404, 38839, 40402, 35065, 34677, 35001, 34996, 37113, 40405, 35794, 37067, 37296, 38272, 36500,
    38479, 36860, 40399, 36449, 37478, 40297, 36474, 35997, 38814, 40302, 36417, 36233, 34997, 38340, 64364, 58080,
    57590, 38269, 36677, 40284, 38113, 36746, 40263, 40270, 38624, 40273, 36787, 59024, 37102, 59323, 38112, 40182,
    36584, 35806, 36299, 40264, 58743, 33276, 59028, 40183, 40184, 38376, 58739, 40186, 40185, 36702, 35028, 40147,
    39759, 40138, 40144, 40151, 35939, 40139, 64195, 38586, 33244, 39762, 40113, 39760, 38780, 34982, 39758, 35824,
    34980, 39014, 35063, 40105, 35508, 64192, 36464, 57744, 40111, 64429, 36251, 57743, 37065, 64430, 64191, 35026,
    40049, 36068, 57745, 59087, 59088, 36215, 59086, 58711, 40050, 38300, 36730, 34713, 58712, 40051, 38135, 36761,
    40044, 37739, 36701, 58715, 58713, 34710, 37822, 40048, 40047, 35145, 64183, 38552, 36982, 40046, 38637, 36023,
    36042, 38361, 40023, 40016, 38989, 35965, 40024, 38042, 40030, 40017, 38334, 40020, 39071, 39087, 57505, 36526,
    39928, 39929, 38000, 39571, 39569, 39567, 39570, 39930, 38901, 38988, 37537, 39572, 36172, 36783, 39932, 38579,
    38109, 39573, 39914, 36784, 36805, 39913, 39912, 38301, 36760, 39921, 35539, 59495, 38648, 34704, 38521, 64182,
    39915, 39899, 39898, 59507, 59497, 39900, 64578, 59500, 59829, 64577, 39901, 39872, 37100, 36674, 39873, 39867,
    35410, 39868, 39877, 39876, 39875, 39871, 36673, 60058, 58794, 39870, 58811, 60059, 60057, 39833, 39834, 36570,
    36939, 37874, 36979, 38134, 37953, 38293, 37098, 64089, 36555, 39825, 36779, 39826, 39827, 35025, 37304, 36977,
    36844, 39828, 37809, 36780, 39673, 33166, 39672, 64163, 39788, 35228, 37594, 39674, 36775, 39676, 37444, 39641,
    39675, 39640, 38321, 36232, 40913, 39642, 39644, 39643, 40919, 39625, 39646, 39621, 39635, 39648, 36975, 36545,
    39024, 36540, 39629, 39599, 35995, 58575, 39610, 36717, 35247, 39611, 64154, 64153, 40169, 39390, 38532, 38979,
    35510, 36841, 37509, 38384, 38505, 37606, 36064, 36240, 64374, 57799, 38107, 39398, 37445, 39396, 37981, 35548,
    39391, 39392, 39394, 39388, 37551, 35688, 35429, 58727, 36053, 58434, 36231, 35687, 37597, 35140, 37807, 38588,
    36160, 38809, 35170, 37232, 36091, 36035, 35813, 35698, 58360, 39385, 37440, 37372, 35753, 36770, 39386, 39384,
    35266, 39372, 59587, 40641, 35412, 38582, 39374, 39373, 59588, 36990, 35160, 39354, 36325, 39355, 35197, 39375,
    35196, 57811, 39356, 38211, 35814, 35043, 38347, 39325, 39322, 37821, 39321, 38130, 58314, 36725, 38852, 36936,
    37761, 38861, 64133, 36974, 39299, 36087, 38314, 37080, 35488, 57461, 35495, 39300, 39296, 35405, 39302, 59105,
    57460, 39297, 35749, 37556, 37834, 35226, 36719, 33910, 35194, 38047, 39298, 39285, 39283, 39284, 39282, 36321,
    39286, 38632, 38882, 59250, 57800, 57803, 38009, 38870, 39287, 64130, 39257, 35058, 36691, 36019, 35930, 36699,
    37531, 35746, 37094, 36085, 64126, 36238, 39259, 38598, 37733, 39148, 37756, 58689, 39137, 33862, 36084, 58722,
    37224, 36083, 39135, 58717, 58719, 38856, 64119, 36568, 36941, 39007, 38547, 39133, 39134, 59003, 59015, 37555,
    40174, 59014, 64424, 40173, 59981, 36675, 39147, 36274, 38723, 59982, 37324, 59977, 35261, 64110, 39111, 59890,
    38749, 39107, 39109, 36332, 39110, 39747, 39091, 38483, 39092, 58196, 36080, 35045, 38546, 33152, 35740, 58198,
    60005, 35741, 35742, 37600, 38842, 35165, 36061, 60006, 36060, 35044, 60007, 60008, 39018, 39017, 39883, 36273,
    34975, 39884, 39089, 39090, 35668, 38802, 39082, 39879, 64176, 39083, 38841, 33150, 38748, 37256, 39085, 36502,
    37873, 39869, 39088, 39075, 35832, 59537, 59539, 64340, 39076, 59538, 35547, 37455, 57473, 36581, 39077, 39072,
    35150, 39078, 64339, 35470, 39073, 37026, 39360, 35701, 38328, 35050, 37530,     0, 36533, 36837, 38815, 57723,
    38556, 36836, 36431, 36835, 35258, 37257, 38259, 38750, 33680, 33681, 33682, 33683, 33684, 33685, 33686, 35908,
    59264, 59265, 59266, 33093, 33115, 33106, 33107, 33600, 33601, 33602, 33603, 33604, 33605, 33606, 33607, 33608,
    33609, 33610, 33611, 33612, 33613, 33614, 33518, 33519, 33520, 33521, 59882, 57525,     0, 38480, 38594, 57526,
    37838, 33098, 33099, 33108, 33109, 33439, 33440, 33441, 33442, 33443, 33444, 33445, 33446, 33447, 33448, 33449,
    33450, 33451, 33452, 33453, 34711, 39164, 39234, 39163, 36290, 33121, 36765, 33224, 33225, 34715, 34716, 34706,
    33256, 35928, 34707, 33727, 33728, 33729, 33730, 33731, 33732, 33733, 33734, 33735, 33736, 33737, 33738, 33739,
    33740, 33741, 33695, 33696, 33697, 33698, 33699, 33700, 33701, 33702, 33703, 33704, 33705, 33706, 33707, 33708,
    33709,     0,     1,     2,     3,     4,     5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
    +  15, 64415, 64416, 64425, 64433, 64435, 64436, 64439, 64467, 64474, 64490, 64502, 64503, 64505, 64585, 64582,
    57820,     0, 38467, 59864, 37994, 59860, 57821, 59861, 59857, 59863, 37750, 59859, 35458, 59812, 59813, 36219,
    59814,     0, 59815, 59816, 59817, 59818, 40814, 59798, 59799, 59819, 59820, 59800, 40815, 40816, 35665, 38063,
    59802, 40817, 38213, 59803, 59801, 59722, 59976, 59723, 59975, 39338, 40794, 38097, 59628, 35257, 35963, 59631,
    59630, 58225, 58231, 58224, 35686, 35139, 36707, 59618, 38544, 35775, 59617, 38468, 59616, 38872, 36715, 59025,
    59875, 38362, 59599, 60018, 38602, 58995, 59600, 37054, 59601, 37473, 59602, 35446, 38741, 59604, 58998, 36984,
    64498, 37058, 36074, 40516, 64499, 38645, 57591, 64365, 37059, 40518, 36950, 59598, 40519, 38129, 59596, 64495,
    59593, 40400, 59594, 38395, 59595, 59597, 35223, 36475, 59583, 64496, 59581, 64497, 40371, 59585, 38102, 57844,
    59586, 40375, 57847, 37274, 35137, 35296, 59554, 37570, 57921, 38859, 37801, 59548, 38820, 58220, 36015, 38907,
    59520, 38778, 35542, 35444, 36221, 38068, 58219, 59522, 59521, 38245, 37522, 40838, 40837, 59523, 59995, 35736,
    64101, 59386, 64473, 36220, 64469, 59996, 64476, 59997, 36763, 40884, 40882, 64463, 38252, 59384, 38365, 35241,
    59355, 35187, 37598, 64447, 64448, 38516, 35834, 60019, 35695, 60020, 60021, 59309, 64445, 64446, 36741, 59307,
    37194, 37193, 36781, 35042, 39829, 38857, 59311, 37099, 38128, 36692, 36969, 36782,     0, 59292, 59291, 64171,
    35053, 59293, 38048, 36721, 38222, 58044, 59301, 59279, 57458, 38050, 38592, 59294, 59281, 59282, 59275, 37861,
    37575, 59274, 35294, 40785, 40782, 37876, 59276, 38039, 37557, 37714, 37192, 59277, 59243, 59245, 38371, 59242,
    58733, 59120, 36444, 59244, 59123, 59248, 59246, 35664, 38021, 59247, 36011, 59084, 59083, 37878, 38282, 38255,
    37335, 40854, 36543, 35178, 59053, 37745, 59085, 36446, 36498, 37796, 36828, 59055, 59021, 38476, 37202, 59056,
    59010, 59057, 59020, 59022, 36804, 36010, 59018, 36213, 59009, 36563, 59005, 58962, 35535, 64426, 59013, 36756,
    +   0, 36031, 59002, 58963, 59000, 37368, 58964, 37483, 58965, 40067, 40073, 37055, 35536, 59001, 37513, 36986,
    37053, 58994, 40055, 58999, 36075, 58996, 58997, 64422, 58993, 35317, 40670, 57489, 37088, 37831, 35980, 57490,
    58823, 40669, 58822, 37582, 36687, 37253, 58758, 40667, 38473, 58759, 36211, 40869, 58756,     0, 58757, 58762,
    58765, 36546, 35479, 58763, 64409, 37828, 58051, 58050, 36854, 58595, 58047, 58600, 37267, 57424, 38997, 58596,
    36052, 38216, 58569, 35520, 58557,     0, 64407, 58566, 58565, 58761, 58755, 58576, 37019, 58561, 64406,     0,
    37495, 35685, 58772, 35803, 38568, 58560, 64403, 38606, 58519, 35286, 35485, 58523, 38803, 40783, 58525, 58501,
    36934, 64385, 40668, 35955, 35216, 58502, 58503, 58496, 64387, 58494, 57940, 35533, 58504, 58497,     0, 58498,
    58499, 58476, 58477, 36271, 38855, 58478, 35970, 58479, 35771, 40360, 58480, 40349, 37091, 58481, 36553, 58471,
    +   0, 36505, 36962, 39258, 35303, 39260, 58472, 38869, 58460, 36521, 58461, 37757, 36684, 35477, 35248,     0,
    58468, 58463, 58328, 35200, 39586, 58464, 37049, 39588, 58329, 39587, 58330, 36443, 58253, 39590, 38327, 58331,
    37753, 58258, 58259, 64092, 40833, 58260,     0, 58266, 37722, 58227, 58240, 36481, 34988, 58235, 40325, 58238,
    +   0, 58236, 58241, 58234, 40322, 58208, 37073, 38862, 36751, 35574, 38261, 58254, 64398, 39617, 58215, 58841,
    37116, 58843, 58211, 58216, 58218, 38797, 35002, 58194, 38125,     0, 35723, 58839, 58191, 36681, 36028, 37223,
    58180, 58186, 58192, 64394, 39781, 39782, 58181, 35951, 38652, 58189, 58193, 35657, 38344, 58176, 57750, 38641,
    36199, 58108, 57749, 58099,     0, 58179, 38628, 37788, 37979, 58098, 58091, 58090, 58089, 58100, 59478, 38323,
    37260, 64482, 58093, 59481, 40685, 64240, 58094, 37048, 58087, 58085, 40687, 58083, 35487, 35292, 36815, 58088,
    64241, 35456, 58086, 39554, 58084, 58092, 58036, 37450, 38035, 38565, 59052, 36442, 58030, 58039, 58034, 59054,
    58033, 58029, 64392, 58031, 58014, 37501, 37787, 57931, 37786, 37961, 36340, 36814, 36811, 39609,     0, 38235,
    39606, 58038, 58008, 58009, 36309, 37706, 57487, 58003, 58010, 58016, 57479, 58006, 35910, 35720,     0, 58005,
    58018, 57485, 37506, 37259, 58004, 57977, 57979, 57976, 57978, 59269, 38744, 36073, 35773, 39327, 39326, 35905,
    57836, 37620, 37747, 59270, 58256, 59271, 57839, 35414, 57834, 38638, 57825, 64345, 37485, 37970, 38026, 38472,
    35817, 38976, 37781, 57495, 37466, 57826, 35768, 57782, 57497, 35524, 38101, 57783,     0, 57784, 57780, 59498,
    57785, 59499, 57779, 37776, 38618, 38064, 35704, 37047, 40792, 59501, 57781, 38591, 57718, 38118, 57712, 35311,
    57714, 39141, 37728, 57716, 36957,     0, 57705, 57717, 57715, 36542, 57700, 57701, 64337, 57704, 57703, 38212,
    38982, 36998, 37217, 37216, 64366, 35210, 57675, 57674, 57676,     0, 57576, 38868, 35797, 38138, 37993, 57677,
    57679, 57678, 57577, 57537, 57538, 57536, 35056, 57579, 58505, 64347, 57530, 58572, 36587, 58571, 36851, 37830,
    35767, 57529, 37547, 35986, 38027, 58578, 64348, 58589, 57519, 35301, 39158, 35725, 57439, 38596, 57418, 38580,
    64333, 59529, 40952, 59827, 37704, 57444, 38530, 57410, 40949, 57448, 59828,     0, 35739, 37591, 40950, 40926,
    35466, 57451, 40934, 40939, 40940, 57413, 40938, 57412,     0, 57421, 38766, 40933, 37354, 37336, 37709, 37463,
    +   0, 40935, 40905, 64330, 40894, 37617, 40900, 40327, 40907, 35066, 40897, 38731, 40908, 36713, 40901, 38759,
    35511, 40906, 40877, 39793, 37777, 40904, 39791, 37108, 39792, 40874, 40898, 38796, 36679, 36484, 37812, 40868,
    37829, 40825, 38116,     0, 64244, 57948, 38137, 36680, 40807, 38609,     0, 40809, 40808, 40826, 38519, 40377,
    40376, 36733, 36586, 36451, 64237, 40810, 40344, 40378, 40366, 36799, 40686, 36472, 40693, 36599, 35474,     0,
    35960, 37453, 38605, 40694, 40681, 59038, 59040, 36536, 39663, 59041, 36000, 35233, 35454, 35022, 39664, 40657,
    40679, 40682, 40676, 37457, 39665, 37524, 35267, 38231, 40647, 40666, 40655, 58052, 40674, 36798, 60064, 58076,
    58078, 40652, 36188, 37574, 37252, 40650, 38495, 58079, 40607, 40609, 35826, 40613, 40601, 40561, 37449, 40558,
    35171, 37069, 40566, 37775, 40556,     0, 38541, 40554, 38865, 40562, 40552, 38535, 35486, 35274, 36477, 64220,
    58592, 38492, 58534, 58574, 36210, 40513, 40441, 58579, 38798, 40444, 37265, 40443, 64221, 35781, 60002, 40433,
    40437, 36018, 60003, 35273, 40434, 40436, 60004,     0, 36525, 40431, 40435, 40427, 64213, 35393, 40428, 40429,
    38099, 35155, 36430, 36276, 36943, 38273, 35945, 64214, 58868, 64215, 58863, 58869, 39496, 40426, 40425, 40430,
    40409, 40410, 35577, 58873, 59573, 37882, 37461, 35724, 36476, 37249, 35710,     0, 36731, 34990, 40387, 40386,
    38003, 40389, 35763,     0, 59023, 38775, 40391, 40390, 40358, 40369, 59026, 40368, 59029, 40367,     0, 59027,
    38228, 40370, 38761, 40357, 40372, 36847, 40353, 38002, 40354, 64580,     0, 40308, 59838, 35904, 37248, 64204,
    35452, 59841,     0, 64581, 40316, 35323, 40281, 35729, 37361, 40277, 40788, 59821, 40280, 36179, 37081,     0,
    36789, 40288, 38001, 40291, 58102, 35667, 37459, 40285, 40292, 40287, 40294, 40290, 35812, 40289, 38031, 35984,
    40283, 38781, 40274, 40275, 40279, 37770, 40276, 36178, 37084, 35691, 40690, 40293, 38066, 37542, 37360, 40177,
    35648, 40175, 40165, 35996, 39856, 40176, 39858, 40180, 40179, 40181, 40178, 38557, 35509,     0, 40146, 36579,
    35940, 35411, 64184, 37539, 40143, 35757, 40025, 38838, 40145, 40099, 38218, 35319, 37477, 40097, 40098, 58546,
    +   0, 40094, 40096, 40065, 35055, 37755, 36069, 58537, 40070, 38268,     0, 58536, 40064, 40026, 40069, 38885,
    36470, 64103, 40303,     0, 40027, 39927, 35758, 38367, 40028, 37563, 40029, 37752, 36288, 58778, 37243, 37553,
    36041, 58775, 37611, 35505, 38333, 37966, 39922, 39923, 38024, 36171, 35506, 39924, 36022, 38755, 38728, 35572,
    39926, 35649, 59605,     0, 37536, 35907, 39118, 39910, 39911, 36845, 59606, 59610, 39121, 59608, 38488, 36040,
    39903, 38564, 37986, 39904, 58783, 36170, 36937,     0, 58779, 35498, 58782, 37446, 35792, 36740, 40922, 37251,
    58774, 36168, 36278, 36169, 35728, 38569, 38388, 39902, 40920, 40924, 36279, 64174, 37767,     0, 64193, 40121,
    39862, 36723, 37328, 39861, 35448, 40129, 40128, 39853, 39855, 35549, 40133, 64173, 39852, 39854, 39830, 39857,
    39831, 37561, 38622, 59880,     0, 38069, 39832, 59885, 59881, 35271, 39818, 35780, 39816, 39820, 39817, 37962,
    40651, 36946, 58766, 39821, 64170, 58768, 38846, 39668, 35935, 58769, 64160, 38522, 39667, 58767, 37765, 39671,
    39655, 39670, 64161, 36683, 64162, 58308, 58307, 38351, 39656, 64159, 37050, 35051, 38020, 35268, 35766, 57531,
    57533, 37593, 57532, 39651, 39650, 39652, 39653, 39654, 37209, 39627, 57534, 37763, 57926, 57925, 37736, 37764,
    38071, 37579, 35201, 38385, 57927, 36295, 36842, 37735,     0, 39613, 39614, 39612, 36324, 39616, 39574, 39628,
    39575, 36459, 39535, 37975, 39576, 39268, 35046, 36602, 36460, 38851, 36773, 35313, 39513, 57748, 57746, 57747,
    34663, 39512, 39503, 35552, 35061, 39502, 34664, 37313, 39494, 39495, 35289, 36771, 38537, 36818,     0, 58563,
    39500, 39499, 39414, 36312, 39490, 39416, 37744,     0, 39420, 64147,     0, 39488, 39417, 39405, 39403, 39517,
    38561,     0, 39400, 39409, 39404, 36246, 36482,     0, 39407, 36036, 38589, 38106, 37298, 37356, 35750, 57552,
    57553, 37868, 37456, 59212, 38030, 36690, 38509, 59211, 39364, 39357, 36700,     0, 37095, 59213, 39359, 39358,
    36769, 36063, 39361, 38076, 39348, 37835, 39362, 37086, 36339, 39350, 35259, 38507, 57975, 36346, 39351, 35917,
    39340, 37240, 39341, 38767, 57488, 39342, 39343, 36569, 60068,     0, 59603, 36089, 38620, 37806, 36718, 39334,
    35496, 38577, 38049, 64136, 57835, 36767, 39335, 38373, 64135, 39332, 64379, 38517, 57837, 37562,     0, 38725,
    38883, 38359, 34662, 38986, 39331, 39333, 39536, 34670, 36088, 39291, 38525, 39330, 39530, 35406, 39534, 36744,
    37370, 39532, 39293, 37858,     0, 64131, 39294, 58348, 39272, 38496, 39273, 40945, 39274, 39275, 36839, 35521,
    36554, 38615, 59844, 59845, 64129, 59849, 39253, 36425,     0, 39252, 39255, 39254, 37346, 36594, 39256, 39249,
    39248, 39247, 35745, 39124,     0, 39250, 38508, 39236, 40796, 64125, 36766, 38843, 40795, 39235, 40797, 39237,
    35789, 35276, 40579, 37462, 39232, 39233, 38223, 64121, 37805, 36547, 37276, 37284, 37603, 35828, 38059, 39159,
    59370, 39108, 36830, 64459, 35669, 38074, 64501, 38880, 36058, 36940, 64109, 36454, 59642, 36503, 35262, 64105,
    59643, 37347, 38879, 35016, 39079, 37972, 57710, 35702, 57709, 38331, 38875, 39103, 35260, 37974, 35189, 37857,
    36033, 38482, 33954, 35314, 39624, 33965, 33956, 33187, 33186, 33967, 33955, 33117,     0, 33966, 33957, 33978,
    33116, 33189, 33188, 33125, 33126, 36287, 36162, 33127, 33128, 60051, 60052, 38894, 60049, 58838, 64150, 60053,
    60054, 37299, 58837, 60056, 58840, 60055, 59564, 59562, 59563, 58831, 59565,     0, 59566, 38890, 59567, 59568,
    35195, 37063, 38073, 64586, 59999, 60000,     0, 59526, 60001, 59525, 59524, 57840, 59527, 35923, 59321, 38345,
    59322, 37079, 57842, 37855, 38292,     0, 38477, 57843, 59317, 35443, 36567, 35755, 64378, 39630, 59255, 59318,
    35469, 59254, 59259, 38832, 36196, 59258, 59251, 36005, 59257, 37713, 59260, 38721, 59253, 35024, 59252, 34977,
    59214, 59256, 38752, 59217, 59216, 39761, 59215,     0, 59064, 59219, 59218, 59066, 38644, 59070,     0, 59065,
    59067, 59072, 38501, 59068, 59069, 64427, 35404, 37605, 59035, 40334, 36527, 40338, 59037, 59036, 38280, 38080,
    37771, 59039, 35692, 39010, 35417, 36826, 58858, 36822, 58856, 64418,     0, 64421, 38791, 58853, 58986, 39787,
    58855, 37051, 37022, 58829, 58836, 39780, 39777, 58824, 36720, 36604, 35925, 36596, 35416, 37340, 58825, 58842,
    35185, 58803, 36821, 58826,     0, 58808, 58809, 64250, 35401,     0, 35681, 58734, 37985, 58807, 38765, 40878,
    58292, 58735, 58736, 58746, 58706, 58695, 58295, 58740, 58699, 58294, 58293, 35218, 35284, 37859, 38470, 58700,
    58703, 58602, 38570, 35964, 35802,     0, 58509, 58605, 35304, 58603, 58598, 58601, 37502, 64096, 58604, 40332,
    +   0, 38773, 58593, 35415, 58518, 58599, 37305, 58545, 40339, 34656, 58552, 58541, 58553, 34659, 35287, 35534,
    58543, 58359, 35244, 58550, 37815, 57472, 64405, 36520, 35769, 57470, 38635, 57468, 58437, 37980,     0, 58325,
    37327, 37470, 58318, 58324, 39370, 36203, 38639, 38613, 58319, 58320, 38771, 38998, 58321, 36204, 58316, 36562,
    58315, 35531, 58440, 58441, 58312, 58317, 36519, 33162, 36590, 33161, 58313, 58439, 38524, 38787, 58286, 58288,
    58981, 38789, 58287, 58290, 58289, 58984, 38770, 58985, 58291, 58262, 38140, 58261, 58263, 58264, 39751, 58265,
    37045, 36463, 57520, 36462, 58267, 58268, 64399, 37825, 36932, 37205, 58244, 36001, 57521, 58246, 58247, 38730,
    +   0, 58243, 58245, 38089, 40154, 58237, 37784, 40158, 58232, 57937, 58195, 37278, 37184, 35953, 57938, 36682,
    35952, 37297, 58200, 37262, 39507, 38722, 58213, 37789, 58190, 58187, 38316, 35399, 37090, 38226, 37843, 36006,
    38070, 36739, 58178, 58199, 36561, 36200, 36486, 35721, 38324, 58177, 58104, 35530, 58105, 58269, 58106, 58270,
    36485, 37104, 58107, 35950, 37042, 35913, 35722, 35788, 35912, 58081,     0, 35942, 40568, 37581, 40317, 38322,
    35453, 37000,     0, 38574, 37246, 36985, 38276, 40321, 58012, 35478, 57986, 57985, 37350, 57989, 57981, 37041,
    57990, 38823, 38611, 57991, 37564, 57992, 40616, 35515, 37258,     0, 57721, 57787, 36516, 36269, 36738, 38056,
    37783, 57722, 38088, 37577, 36291, 38754, 57724, 38831, 57692, 57690, 37499, 37028, 37731, 38738, 36194, 36956,
    37833, 40689,     0, 37482, 39346, 40691, 37548, 35302, 57685, 36441, 64238, 35225, 57683, 33227, 38768, 33228,
    37364, 38369, 57684, 57574, 64359, 64168,     0, 64361, 64360, 57516, 33160, 64091, 64362, 36759, 37754, 57517,
    38352, 38085, 39744, 33252, 57518, 38006, 57481, 36164, 38017, 57477, 57480, 36806, 38041, 38095, 35519, 38904,
    57484, 33268, 36559, 35947, 33267, 40890, 33266, 38559, 37584, 40912, 36749, 36024, 59983, 40927, 37599, 40921,
    40879, 40881, 59987, 35161, 59988, 59986, 36191, 38993,     0, 35420,     0, 38274, 64252, 36678, 40876,     0,
    40875, 40870, 33265, 40873, 33164, 33165, 35464, 39623, 40872, 37992, 40846, 40843, 38784, 33190, 35222, 64247,
    37717, 37566, 36302, 38896,     0, 37847, 40844, 40804, 40805, 35929, 36480, 38782, 39301, 64132, 40806, 38897,
    40791, 40790, 40793, 35676,     0, 36745, 35796, 35516, 35394, 36267,     0, 40576,     0, 40592, 35457, 34994,
    40585, 40590, 40594, 36187, 37774, 36706,     0, 40587, 36747, 40586, 57557, 40582, 57556, 37479, 35011, 40438,
    64218, 35029, 37068, 64207, 40439, 35697, 37097, 36538, 38727, 39809, 40420,     0, 64211, 37039, 40394, 40395,
    37103, 35707, 38511, 38326, 39804, 37060, 38886, 57564, 38251, 35432, 36310, 40355, 40350, 36436, 40346, 57566,
    40345, 64352,     0, 39917, 38539, 37969, 39916,     0, 64203, 37811, 38825, 36300, 37460, 40313, 39918, 37082,
    +   0, 36180, 36996, 35206, 37211, 40311, 35684, 38392, 58865, 34674, 34675, 37615, 38374, 58866, 58867, 38549,
    37277, 40282, 35231, 37514, 40150, 37572, 38375, 64157, 39632, 40140, 40141, 40142, 59261, 40136, 40149, 40137,
    40148, 59262, 40126, 36508, 36236, 40130, 37332, 36177, 40112, 36948, 40090, 57830, 40093, 40095, 64189, 57832,
    57929, 57928, 36539, 64190, 40101, 37614, 40091, 40076, 40086, 40084, 60013, 38046, 40081,     0, 60014, 60016,
    40080, 38902, 60017, 40082, 35229, 37034, 40040, 40039, 35937, 37330,     0, 40045, 40043, 37486, 40042, 38821,
    36067, 40035, 35936,     0, 39592, 39593, 38214, 64185, 39595, 36298, 38230, 37540, 38250, 40036, 40031, 59471,
    37782, 36285, 37273, 40032, 40033, 37576, 40034, 35269, 39774, 40019, 40018, 36785, 40006, 40005, 40001, 36537,
    39908, 39773, 35993, 40007, 40008, 37535,     0, 40009, 39907, 39906, 39909, 64167, 37609, 36578, 39811, 35569,
    37840, 38567, 39812,     0, 39813, 34999, 36038, 38264, 37033, 35023, 39376, 39750, 64142, 36021, 39755, 39756,
    39377, 39753, 38533, 64165, 36296, 35726,     0, 36776, 39745, 37952, 38108, 38607, 59805, 33178, 33177, 59804,
    38578, 37956, 59806, 39660, 39754, 37349, 59807, 37718, 37310, 38262, 39661, 39662, 35227, 39657, 58816, 58815,
    58745,     0, 38747, 35407, 58820, 39367, 36711, 37309, 39658, 38633, 64158, 38317, 36593, 59747, 59748, 36225,
    39637, 39631, 39634, 39636, 64506, 39605, 36260, 36163, 35423, 39607, 36327, 35408, 35297, 58737, 58738, 39608,
    39415, 64152, 36433, 39378, 39492, 35060, 39491,     0, 38548, 36275, 35705, 38726, 37231, 38077, 36603, 64141,
    57797, 57798, 39371, 37549, 38864, 35553, 36090, 35989, 36316, 38029, 37317, 36020, 38309, 39316, 39314, 37359,
    37604, 39309, 40267, 38299, 37285, 40265,     0, 36333, 39310, 39311, 37199, 35493, 39308, 39278,     0, 39276,
    38587, 39277,     0, 38265, 39279, 39280, 39281, 37758, 39261, 59207, 64128, 37884, 59209, 59206, 37203, 39263,
    39264, 38058, 36086, 39002, 39265, 39154, 38753, 35558, 38096, 37850, 39153, 39157,     0, 37020, 38860, 39156,
    35962, 37602, 39143, 64117, 38381, 37484, 39139, 35985,     0, 39136, 39144, 39138, 38863, 39145, 39008, 37999,
    +   0, 38229, 39142,     0, 38382,     0, 35252, 35927, 37283, 35298, 39146, 64118, 58025, 58026, 64097, 36722,
    58023, 58021, 64115, 39127, 39120, 64111, 58015, 64114,     0, 39123,     0, 39116, 35492, 64113, 35743, 39122,
    35019, 39114,     0, 64112, 38881, 58692, 36504, 37583, 39115, 38038, 37441, 39112, 58702, 58694, 35778, 58696,
    37511, 35018, 37601, 36698, 35983, 39105, 38844, 35462,     0, 37955, 64106, 38336, 35938, 64104, 40078, 39074,
    59886,     0, 37510, 59887, 37820, 59884, 59883, 40680, 40772, 40771, 39019, 35240, 59862, 59858, 59856, 59855,
    38325, 57429, 35167, 57428, 57430, 59866, 38891, 38795, 36423, 59577, 57433, 37732, 59576, 58795, 33185, 33184,
    39380, 38343, 37015, 59574, 37196, 39639, 59378, 37476, 59372, 59377, 35315, 38593, 36843, 37558, 59379, 59376,
    38889, 33176, 33102, 36056, 64236, 64458, 64452, 59340, 64454, 40671, 40664, 59373, 36742, 40677, 59339, 40675,
    59338, 37010, 37351, 59089, 59090, 39866, 59092, 37281, 36328, 59091, 35556, 58554, 59094, 58544, 59093, 36827,
    59060, 37371, 58764, 58556, 58760, 58542, 38044, 35305, 36235, 39084, 59061, 58991,     0, 58992, 58990, 58540,
    36054, 58548, 38751, 58555, 58549, 36495, 37958, 35734, 58547, 38643, 37225, 36997, 58980, 64420, 38232, 35177,
    36966, 37520, 36824, 58849, 38740, 38083, 64245, 58850, 58851, 58793,     0, 38370, 58852, 58797, 36286, 58800,
    58799, 38072,     0, 40342, 58791, 38604, 58749, 37024, 58747, 58750, 38247, 38104, 58754, 35422, 37076, 58753,
    36557, 59101, 58748, 58752, 58693, 35441, 37189, 59102, 58697, 36422, 36964, 35919, 38642, 57807, 38647, 36754,
    58562, 37816, 57806, 57805, 58567, 36490, 37494,     0, 58564, 38471, 58570, 35038, 58473, 58474, 35152, 39768,
    58475, 35037, 58354, 38263, 37471, 37001, 58309, 39769,     0, 39764, 38007, 58310, 37337, 35237, 58311,     0,
    35555, 58304, 58305, 58298, 39766, 39767, 58306, 58301, 38786, 58302, 58299, 36777, 38571,     0, 35144, 38210,
    57956, 57957, 37492, 57952, 38853, 57953, 38025, 57959, 36960, 57950, 36808, 37505, 38899, 57790, 57951, 57469,
    57789, 57788, 38139, 35143, 35525, 36007, 57777, 38005,     0, 36737, 38526, 57426, 35181,     0, 35190, 57751,
    57752, 57778, 57419, 37546, 57416, 57756, 57753, 57754, 57755,     0, 57757, 57711, 57713, 37730, 38241, 57427,
    36807, 64332, 57686, 57720, 57691, 57431, 57719, 57689, 57688, 40384, 35397, 57687, 57558, 35032, 35436, 35188,
    +   0, 57560, 40892, 64351, 57559, 40895, 57562, 57561, 57547, 38849, 38736, 38737,     0, 35512, 36437, 64349,
    57550, 37846, 57551, 35214, 57549, 37526, 37964, 35944, 35977, 36003, 57548, 36047, 57422, 57535,     0, 57417,
    37110,     0, 35815, 35459, 37215, 64449, 36253, 57437, 57435, 64451,     0, 57438, 37853, 35426, 57441, 36955,
    64324, 36734, 57434, 38307,     0, 36268, 64323, 40889, 40903, 37721, 64325, 35765,     0,     0, 40853, 40858,
    36947,     0, 38219, 37106, 38033, 40852, 38117, 40851, 35906, 35573, 37957, 35243, 33154, 34705, 36281, 40845,
    40847, 40658, 33157, 33158, 38992, 40661, 33249, 33250, 64235,     0,     0, 36953, 40660, 38016, 40634, 35785,
    +   0, 40626, 40628, 40625, 36186, 35484, 38991, 35449, 40631, 38294, 40630, 37320, 40570, 35476, 40577, 40636,
    37214, 39874, 40627, 40640, 40639, 35580, 64175, 40624, 38390, 64100, 38599, 40599, 35579, 36994, 40606, 40591,
    64231, 35249, 40580, 39600, 39603, 40573, 35934, 37105,     0, 40597, 40581, 35434, 36266, 64088, 34699, 35433,
    36301, 36337, 37565, 40524, 38990, 34700, 39533, 39531, 38493, 39589, 37545, 40525, 35578, 40379, 40380, 40382,
    40381, 40383, 35324,     0, 36181, 36509, 40299, 38394, 37037, 37793, 58714, 36471, 40300, 35010, 38091, 58701,
    40295, 37316, 40123, 64194, 37242, 40118,     0, 40115, 40116,     0, 36580, 40119, 40122, 38111, 40059, 40106,
    40110, 38627, 58205, 40103, 35242, 35801, 38122, 37769, 40108, 64172, 37261, 37210, 35554, 35202, 39851, 38566,
    35567, 37854, 38386, 39647, 39645,     0,     0, 39669, 37236, 59738, 36461, 36976, 59740, 37235, 39649, 38520,
    59739, 37808, 59742, 59745, 35992, 37325,     0,     0, 39516, 39615, 39618, 39526, 37200,     0, 64149, 39528,
    +   0, 36161, 39518, 37533, 36710,     0, 36582, 36595, 39240, 36758, 39238, 38078, 37229, 64143, 37790, 39381,
    +   0, 39306, 39239, 39241, 37031, 36348, 35988, 39307, 36456, 36239, 35748, 58271,     0, 64400, 38330, 37300,
    35823, 37716, 58272, 58273, 58274, 35987, 36453, 36452, 37308, 39101, 38260, 37093, 59121, 59122, 38776, 33111,
    39102, 39104, 33229, 37797, 33245, 33230, 59777,     0, 59780, 33246, 33208, 35777, 59779, 33209, 35559, 36016,
    59781, 64500, 35560,     0,     0, 37726, 35831, 38834, 38878, 35911,     0, 37344, 58432,     0, 59556, 35403,
    37007, 35136, 36983, 36764, 35543, 59553, 59530,     0,     0, 38022, 35013, 59555,     0, 59528, 59488, 59532,
    59531, 59485, 59484, 39566,     0, 39565, 36832, 37800, 59483, 64481,     0, 39568, 35418, 36988, 59333,     0,
    59334, 59469, 59470, 37569, 59335, 38799, 37762, 36694, 59231, 59228, 39497, 59232, 34976, 36564, 59233, 35663,
    35922, 59128, 64434, 37627,     0,     0, 59200, 59204, 59201, 59132, 36689, 59202, 59047, 59048,     0, 35981,
    59049, 58979,     0, 59050, 59051, 58854, 38475, 58859,     0, 37085, 38305,     0, 58786, 58861, 64417, 58860,
    36212, 58827, 35039,     0, 58806, 58810, 58805, 38236,     0, 58741, 58828, 58742, 36566,     0, 58744, 58618,
    37472,     0, 35957, 35425, 39022, 37792, 38291, 64412, 35184, 58698, 58516, 58515, 57968, 57969, 36853,     0,
    58521, 58517, 58520, 58511, 57970, 58512, 35438, 36577, 35818, 37527, 35400, 34992, 58453, 37839, 58449,     0,
    58507, 58510, 37997, 38278, 36963, 38540, 38215, 58345, 39520, 39525, 36817, 39521, 38217,     0, 58346, 58344,
    35215, 35532,     0, 37866, 58222, 35528,     0, 58061, 58229, 58223, 58230, 58062, 39763, 38987, 58063, 58066,
    58020, 38221, 37995, 38052, 37785, 39765, 35800, 58019, 58017, 36517, 38067, 35427,     0, 57850, 57845, 35968,
    39324, 38827, 57851, 57846, 36999, 39320, 37826, 40440, 57804, 38514, 40512, 57801, 57578, 37852, 57802, 40442,
    57581, 36072, 35180, 57583, 57501, 37008, 57580,     0, 57503,     0, 57486, 57502, 38734, 64346, 57504, 40943,
    40917, 40937, 38597, 40910, 37778, 40331, 40932, 40335, 36512, 40956, 40855, 35943, 38464,     0, 40857, 36335,
    40866, 64249, 40864, 38575, 40859, 40834, 40835, 40665,     0, 35651, 40672, 40611,     0, 40836,     0, 40678,
    38131, 40684, 37018, 40621, 35473, 35999, 40432, 35250, 38995, 64217, 37040, 36044, 36795, 38513, 40385, 38312,
    37489, 37712, 40347, 40388, 64205, 38257, 40348,     0, 38287, 37314, 37988, 36418, 35674, 39619, 40271, 40278,
    36788, 39620,     0,     0, 40167, 40272, 37987, 40168, 36263, 40166, 40164, 40163, 40170, 40162, 40172, 38318,
    +   0,     0, 37810, 39887, 35941, 39886, 40160, 40155, 39885, 40161, 38903, 40159, 37768, 39864, 40156, 39313,
    40153, 38485, 64198, 40152, 40157, 38729, 36228,     0, 35507, 39312,     0, 35192, 40100, 36995, 37977, 34987,
    37823, 37541,     0, 36468, 64186, 37064, 37711, 37329,     0, 40052, 35658, 36467, 38266, 38075, 38346, 38079,
    39303,     0, 38808, 39304, 39905, 35571, 37766, 39305, 36672, 35503, 37512, 37608, 34998, 35672, 38387,     0,
    36544, 39800, 39841, 58871, 39801, 58872, 39802, 35671, 58870, 39803, 38756, 39805,     0, 38573,     0, 39850,
    35931, 39746,     0, 39510, 39511, 37348, 36534, 36458, 35141, 39508, 39514, 35472, 36230, 36457, 64485, 39387,
    39140, 39149, 59491, 59489, 37233, 37366, 36034, 59493, 38011, 39093, 57541, 59896, 39094,     0, 59893, 39095,
    59899,     0, 59900, 36972, 58728, 39080, 36838, 39081, 35251,     0,     0, 58433, 35811, 36078, 38631, 60032,
    58364, 60033, 60034, 36980, 60035, 35211, 60036, 60037, 60038, 59891, 57476, 38320, 59889, 57475, 35483, 40774,
    59888, 36528, 35239, 59782, 40773, 59784, 59783, 40770,     0, 64200, 59785, 59787, 59786, 59749, 38114, 40363,
    35421, 59724,     0, 38621, 37998, 59750, 59751, 59725, 38779, 59639, 35169, 36846, 40109, 37845, 59641, 37352,
    35450, 35451, 59640, 35183,     0,     0, 59637, 59634, 38819, 37871, 38256, 38794, 59638,     0, 35146,     0,
    37089, 36532, 35445, 59558,     0, 59559, 59557, 35972, 59387, 36315, 36833, 64491, 64094, 39006,     0, 37863,
    59461, 37748, 58529, 58538, 58539, 59460, 59462, 64466, 34985, 38478, 64470, 35442, 64468, 59241, 64464,     0,
    64465, 36314, 59240, 59112, 59249, 37963,     0, 59111, 59114, 34984, 35735, 58582, 59118, 58591, 38296, 58448,
    +   0,     0, 58451, 58450, 58022,     0, 58024, 38499, 58454, 36206, 35047, 58027, 36326, 58028, 38065,     0,
    36752,     0, 38008, 37996,     0, 38123, 58285, 40171, 38349, 35283,     0, 57930, 35926, 58035,     0, 58032,
    57841, 58037, 35679, 35654, 36483, 35437, 38120, 57849, 35151, 57848, 36330,     0, 39025, 38576,     0, 57838,
    +   0, 57792, 57794, 57795, 57545, 57542, 57791,     0,     0, 38610, 57544, 57546, 36046, 38850, 36803,     0,
    +   0, 37464, 64327, 36434, 40880, 40914, 40886, 64320, 39845,     0, 38876, 39846, 37779, 37824, 40888,     0,
    64251, 36801,     0, 40812, 36930, 38735, 40811, 40885,     0, 40623, 40602, 40622, 40813, 40615, 40603, 40406,
    40619,     0, 40620,     0, 35576,     0, 40408, 40333, 40407, 35998, 40330, 40337,     0, 40312, 36791,     0,
    40306, 37862, 37968, 39749, 64164, 37315, 39601,     0, 38487, 36259, 64151, 37458, 37737,     0, 39598, 37592,
    34979, 38249, 39489, 57829, 39418, 36004, 36307, 39413, 39419, 36294, 37030, 39288, 36729,     0,     0, 39289,
    +   0, 37532, 38845, 37760, 35670, 39245, 39246, 35974, 35245, 35568, 64123, 39784, 39783, 39244, 36432, 38133,
    39161, 34657, 34667, 33183, 33182, 34666, 34660,     0, 33179,     0, 34668, 33181, 33180, 64064, 64065, 64066,
    64067, 64068, 64069, 64070, 64071, 64072, 64073, 64074, 64075, 64076, 64077, 64078, 64079, 64080, 64081, 64082,
    64083, 33742, 33743,     0, 33744, 33745, 33746, 33747, 33748, 33749, 33750, 33710, 33711,     0, 33712, 33713,
    33714, 33715, 33716, 33717, 33718, 59621,     0,     0, 59622, 59221, 59623, 59220, 59222, 59624, 59534, 59533,
    59535, 59223, 37804, 39771, 39775, 39772, 59536, 35541, 64488, 35540, 59515,     0, 59516,     0, 59517, 59518,
    37589, 35810, 59467, 64480, 36709,     0, 37818, 37474, 59463, 64095, 58588, 35312, 64408, 38772, 36935, 58970,
    58531, 58530, 38824, 58528, 58527, 37507, 36489, 37369, 58533, 35770, 37062, 39013, 38572, 58357, 37074, 58356,
    +   0,     0, 58352, 58355, 58350,     0, 58353, 38469, 58341, 58343, 58342, 38051,     0, 37879,     0, 39005,
    38055, 58065, 38132,     0,     0, 57920, 38529, 58067, 38906, 38379, 57852,     0, 39363, 35049, 57670, 57671,
    57669, 39290, 60067, 35779, 38258, 57673, 57672, 64342, 64343,     0, 38905, 57466,     0, 57482,     0, 37111,
    57465, 37727, 35031, 64098, 64242,     0, 64243, 40298, 34981,     0, 38053, 36289, 40781, 40555, 40553, 36949,
    35275, 40551, 40557, 40563,     0, 64226, 40526, 40527, 38616,     0, 38562, 38550, 38523, 36420, 40529, 37012,
    +   0, 40392,     0, 37038, 37703,     0, 38270, 40393, 40352,     0, 40286,     0, 40104, 40102, 40356, 37241,
    40351,     0,     0, 40092, 36435, 40053, 36469, 38489, 38490,     0,     0, 35230, 40058, 64187, 35655, 36039,
    39798, 35447,     0, 37508, 39799, 39776, 37303, 36859, 39778,     0, 36535, 39779, 38012, 35566, 39553, 36329,
    +   0,     0, 35565,     0, 39556, 39552, 39555, 39395,     0, 35706, 36993,     0, 38315, 39393, 39389, 36065,
    60015, 36237, 38603, 38531, 39925,     0, 40832, 38555, 59850, 59847, 59846, 59848,     0, 38045,     0, 35966,
    37322, 35191, 35820,     0, 35821, 59741, 59743, 59744,     0,     0, 59746, 59494, 35776, 35774, 59496, 64486,
    59482, 59476, 64487,     0, 59475, 37270, 59103,     0, 59104, 38283, 58955, 64432, 35662, 36491, 37984, 58956,
    58718, 35439,     0, 40784, 40769,     0, 36755, 58724, 58716, 58721, 37268,     0, 64410, 58720, 58691,     0,
    38297, 58619, 64411, 58580, 58490, 58489, 58492, 35975, 36511, 58491, 35795, 58493, 58233, 58242, 35234, 58250,
    58249, 57831, 64376, 38554,     0,     0, 37749, 36308, 35693, 57739, 57740, 57741, 36026, 57742,     0, 38822,
    57738, 35786,     0, 35236, 36306, 57523, 57522, 38510, 57478, 57483, 39633, 57524, 35212, 39638, 40683, 64341,
    64239, 40688, 40692,     0, 40550, 35764, 38136,     0, 40541, 40514, 40547, 40546, 36748, 40515,     0, 38762,
    38040, 38393, 36556, 40320,     0, 40318,     0,     0, 37016, 37610, 38391, 37720,     0,     0, 36173,     0,
    38267, 39591, 34995, 36317, 36858, 39549,     0, 39547, 35932, 39548, 39537, 39550, 39539, 36774, 35154, 37571,
    39538, 39542, 39543, 35179, 36190, 40871, 39541, 39540, 35990, 39529, 39527, 37234, 35689, 35754,     0, 39524,
    39522, 39515, 35499,     0, 35564, 35461, 39523, 39519, 39339,     0, 37032, 39336, 35790,     0, 39337, 35497,
    64124, 39243, 59346, 59345,     0, 39242, 36856, 38342, 59347, 59337, 59336,     0, 36217,     0, 36243, 36447,
    36592,     0, 37004,     0, 59331, 36530, 59332,     0, 59237, 59236, 35961, 59239, 59095,     0, 64431, 59097,
    59099, 58487, 59100, 37319, 38037, 36029, 58486, 37188, 58007,     0, 58011, 58013, 57980, 35909, 36345,     0,
    +   0, 35719, 38769, 35717,     0, 57572, 38813, 64357,     0, 38830, 57540, 37451, 57539,     0,     0, 38996,
    38018, 37525, 37355, 64336, 34671, 34672, 34673, 37027, 35971, 37367, 57425, 37978,     0,     0, 57432, 40928,
    64326, 40923,     0, 64329, 37044, 40915, 35465, 36303, 36802, 40891, 36705, 35207, 64201, 40328,     0, 37288,
    +   0, 38760, 36426, 40305,     0, 40307, 39894, 64180, 64181, 38884, 37011, 39895, 39892, 39882, 64179,     0,
    36277, 35159, 35501,     0, 39752,     0, 38595, 38224, 33269, 33270,     0, 33163, 33149, 33124, 33123, 33100,
    +   0, 33271, 33169, 33170, 64084, 33104, 64085, 33167, 60046, 57942,     0,     0, 59096, 59627, 59854, 59853,
    59852,     0,     0, 34993, 37841, 59330, 36693, 36574, 38010, 37521, 59130,     0, 58812,     0, 59131, 59129,
    58814, 58813, 37092,     0, 39000, 58776,     0, 58777, 58484, 36209, 58485, 38090, 57822, 58500,     0, 57823,
    38581, 57824, 57508,     0, 37596, 38785, 57510, 57509, 35395, 36954, 40883, 40373,     0,     0, 37616, 40374,
    40336, 38098, 40304, 37245, 33212, 33213,     0,     0, 33210, 33211, 59644, 59712,     0, 59714, 59713, 36968,
    59267,     0, 36523, 59268, 59062, 38238, 59063, 58056, 59071, 57796, 58060, 58057, 57793, 36958, 64338, 57464,
    37465, 57467, 57462, 40946,     0, 57409, 35209, 37254, 38828, 40828, 40827, 36850, 37107, 40830, 39896, 35570,
    39848, 35550, 39897, 39849, 34655, 34669,     0,     0, 34658, 34693, 34694, 34695, 34696, 34697, 64229, 37580,
    37832, 35176, 35009, 36750, 36174, 38758, 38054, 39919, 38332, 39920, 34686, 34703, 34702, 34701, 34640, 34641,
    34642, 34643, 33193, 33194, 33192, 33195,
]
CP932へのチェックと変換の関数(Python)
調査と変換の関数
def is_uxcp932(c):
    if (c < 0) or (c >= 0x10000):
        return False
    p = UxCP932_VALID_HI_TABLE[(c >> 8) & 0xff]
    if p == 0:
        return False
    b = UxCP932_VALID_LO_TABLE[(p << 3) + ((c >> 5) & 7)]
    return (((b >> (c & 31)) & 1) != 0)


def to_uxcp932(c):
    p = UxCP932_VALID_HI_TABLE[(c >> 8) & 0xff]
    q = UxCP932_SPARSE_HI_TABLE[(p << 4) + ((c >> 4) & 15)]
    return UxCP932_SPARSE_LO_TABLE[q + (c & 15) - 16]
参照表を作るプログラム(Python)
make_table.py
#!/usr/bin/env python3

import re

####


class SparseMatrixToLinear:
    def __init__(self):
        self.data = []
        self.part = []

    def append(self, code, data):
        send = len(data)
        dlen = len(self.data)

        while send > 0:
            if data[send - 1] >= 0:
                break
            send -= 1
        if send == 0:
            return

        stop = 0
        while stop < send:
            if data[stop] >= 0:
                break
            stop += 1

        part = data[stop:send]
        self.part.append([len(part) - part.count(0), code, stop, part])

    def build(self):
        for part in sorted(self.part, reverse=True):
            self.build_store(part)
        for i in range(len(self.data)):
            if self.data[i] < 0:
                self.data[i] = 0

    def build_store(self, part):
        z0, code, stop, data = part
        slen = len(data)

        dpos = 0
        loop = True
        while loop:
            loop = False
            try:
                dpos = self.data.index(-1, dpos + 1)
            except ValueError:
                dpos = len(self.data)
                break
            qend = len(self.data)
            for i in range(slen):
                s = data[i]
                if s < 0:
                    continue
                qpos = i + dpos
                if qpos >= qend:
                    break
                d = self.data[qpos]
                if d < 0:
                    continue
                if s != d:
                    loop = True
                    break

        part.append(dpos - stop)
        for i in range(slen):
            s = data[i]
            qpos = i + dpos
            if qpos >= len(self.data):
                self.data.append(s)
                continue
            if s >= 0:
                self.data[qpos] = s


####

def from_binary_list(data):
    r = 0
    for i in range(len(data)):
        r |= (data[i] << i)
    return r


def gen_slice(data, count):
    r = []
    for i in range(0, len(data), count):
        r.append(data[i:i+count])
    return r

####


def get_map_source(data):
    r = []
    for d in data:
        r.append(d[0])
    return r


def get_map_target(data):
    r = []
    for d in data:
        r.append(d[1])
    return r


def set_head_plus(s):
    if s[0] == ' ':
        return ('+' + s[1:])
    return s


def make_linear_table(data, size):
    r = [-1] * size
    for d in data:
        r[d[0]] = d[1]
    return r


def make_valid_table(data, width, height, zswap=False):
    mark = [0] * (width * height)
    for d in data:
        mark[d] = 1

    h = []
    l = []
    hn = {}
    for line in gen_slice(mark, width):
        t = []
        s = ''
        for v in line:
            t.append(v)
            s += str(v)
        if s not in hn:
            hn[s] = len(hn)
            l.append(t)
        n = hn[s]
        h.append(n)

    def empty(l): return (sum(l) == 0)

    if zswap and (not empty(l[0])) and empty(l[1]):
        t = l[0]
        l[0] = l[1]
        l[1] = t
        for i in range(len(h)):
            v = h[i]
            if v == 0:
                h[i] = 1
            elif v == 1:
                h[i] = 0

    return [h, l]


def make_sparse_table_sb(vtable, data, wline, wslice):
    raise NotImplemented


def make_sparse_table_ub(vtable, data, wline, wslice):
    hf = tuple(filter(lambda x: x != 0, vtable[0]))
    if len(hf) != len(set(hf)):
        raise Exception('invalid: vtable')

    sparse = SparseMatrixToLinear()
    wstep = int(wline / wslice)

    hi = vtable[0]
    for i in range(len(hi)):
        h = hi[i]
        if h == 0:
            continue
        line = data[i]
        code = h * wstep
        for part in gen_slice(line, wslice):
            sparse.append(code, part)
            code += 1
    sparse.build()

    sh = [0] * ((max(hi) + 1) * wstep)
    for part in sparse.part:
        sh[part[1]] = wslice + part[4]
    return [sh, sparse.data]


def make_valid_and_sparse(data, code_size, line_size, slice_size):
    if (code_size % line_size) != 0:
        raise Exception('invalid line size: code(%d) %% line(%d) != 0' % (code_size, line_size))
    if (line_size % slice_size) != 0:
        raise Exception('invalid line size: line(%d) %% slice(%d) != 0' % (line_size, slice_size))
    line_count = int(code_size / line_size)
    valid = make_valid_table(get_map_source(data), line_count, line_size, True)
    table = gen_slice(make_linear_table(data, code_size), line_size)
    sparse = make_sparse_table_ub(valid, table, line_size, slice_size)
    return (valid, sparse)

####


def make_reverse_list(data):
    l = []
    for s, u in data:
        l.append([u, s])

    m = []

    def check(u):
        if u in m:
            return False
        m.append(u)
        return True

    return list(filter(check, sorted(l)))


def read_mapping_file(path, nonull=False):
    RE = re.compile('^(?P<s>0x[0-9A-Fa-f]+)\s+(?P<u>0x[0-9A-Fa-f]+)')
    r = []
    for line in open(path).readlines():
        if line[0] == '#':
            continue
        m = RE.match(line)
        if not m:
            continue
        s = int(m.group('s'), 16)
        u = int(m.group('u'), 16)
        r.append([s, u])
    if nonull and r[0] == [0, 0]:
        del r[0]
    return r


def write_valid(out, data, sym_h, sym_l):
    hi, lo = data
    hfmt, lfmt = '%2d', '%#010x'

    out.write(sym_h + ' = [\n')
    for line in gen_slice(hi, 16):
        s = ', '.join([(hfmt % v) for v in line])
        out.write('    %s,\n' % set_head_plus(s))
    out.write(']\n')

    out.write(sym_l + ' = [\n')
    for line in lo:
        s = ', '.join([(lfmt % from_binary_list(part))
                       for part in gen_slice(line, 32)])
        out.write('    %s,\n' % set_head_plus(s))
    out.write(']\n')


def write_sparse(out, data, sym_h, sym_l):
    def afmt(l): return ('%' + ('%d' % len('%d' % max(l))) + 'd')

    hi, lo = data
    hfmt, lfmt = afmt(hi), afmt(lo)

    out.write(sym_h + ' = [\n')
    for line in gen_slice(hi, 16):
        s = ', '.join([(hfmt % v) for v in line])
        out.write('    %s,\n' % set_head_plus(s))
    out.write(']\n')

    out.write(sym_l + ' = [\n')
    for line in gen_slice(lo, 16):
        s = ', '.join([(lfmt % v) for v in line])
        out.write('    %s,\n' % set_head_plus(s))
    out.write(']\n')


def dump_valid(out, data, code_size, line_size):
    table = [0] * code_size
    for d in data:
        table[d] = 1
    table = [('%064x' % from_binary_list(tuple(reversed(line)))) for line in gen_slice(table, line_size)]
    for i in range(len(table)):
        out.write('%02x: %s\n' % (i, table[i]))
    return
make_uxcp932.py
#!/usr/bin/env python3

import sys
from make_table import *

cp2u_map = read_mapping_file('CP932.txt')
u2cp_map = make_reverse_list(cp2u_map)
valid, sparse = make_valid_and_sparse(u2cp_map, 65536, 256, 16)

out = sys.stdout
write_valid(out, valid, 'UxCP932_VALID_HI_TABLE', 'UxCP932_VALID_LO_TABLE')
write_sparse(out, sparse, 'UxCP932_SPARSE_HI_TABLE', 'UxCP932_SPARSE_LO_TABLE')
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?