Bug 1507726 - Update encoding_rs to 0.8.12. r=m_kato
authorHenri Sivonen <hsivonen@hsivonen.fi>
Thu, 22 Nov 2018 01:41:51 +0000
changeset 447691 3691033d6e78b3481438c6d75b6a1e4200591388
parent 447690 f5ada684f144e794bbb55cf6031adc3473cca387
child 447692 240b08a258e907a50403beb079e2afbcd456a3f8
push id35086
push userdvarga@mozilla.com
push dateThu, 22 Nov 2018 21:47:14 +0000
treeherdermozilla-central@522388759018 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersm_kato
bugs1507726
milestone65.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1507726 - Update encoding_rs to 0.8.12. r=m_kato * Improves UTF-8 validation performance. * Improves UTF-8 to UTF-16 decode performance. * Improves non-Latin and Latin1-ish Latin single-byte encode performance. * Improves code quality by addressing some clippy lints. The optional legacy CJK encoder changes are not used by Firefox. Differential Revision: https://phabricator.services.mozilla.com/D12514
Cargo.lock
third_party/rust/encoding_rs/.cargo-checksum.json
third_party/rust/encoding_rs/CONTRIBUTING.md
third_party/rust/encoding_rs/COPYRIGHT
third_party/rust/encoding_rs/Cargo.toml
third_party/rust/encoding_rs/Ideas.md
third_party/rust/encoding_rs/LICENSE-MIT
third_party/rust/encoding_rs/README.md
third_party/rust/encoding_rs/generate-encoding-data.py
third_party/rust/encoding_rs/src/ascii.rs
third_party/rust/encoding_rs/src/big5.rs
third_party/rust/encoding_rs/src/data.rs
third_party/rust/encoding_rs/src/euc_jp.rs
third_party/rust/encoding_rs/src/euc_kr.rs
third_party/rust/encoding_rs/src/gb18030.rs
third_party/rust/encoding_rs/src/handles.rs
third_party/rust/encoding_rs/src/iso_2022_jp.rs
third_party/rust/encoding_rs/src/lib.rs
third_party/rust/encoding_rs/src/macros.rs
third_party/rust/encoding_rs/src/mem.rs
third_party/rust/encoding_rs/src/replacement.rs
third_party/rust/encoding_rs/src/shift_jis.rs
third_party/rust/encoding_rs/src/simd_funcs.rs
third_party/rust/encoding_rs/src/single_byte.rs
third_party/rust/encoding_rs/src/utf_16.rs
third_party/rust/encoding_rs/src/utf_8.rs
third_party/rust/encoding_rs/src/utf_8_core.rs
third_party/rust/encoding_rs/src/variant.rs
third_party/rust/encoding_rs/src/x_user_defined.rs
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -794,31 +794,31 @@ dependencies = [
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "encoding_c"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "encoding_rs 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "encoding_glue"
 version = "0.1.0"
 dependencies = [
- "encoding_rs 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "nserror 0.1.0",
  "nsstring 0.1.0",
 ]
 
 [[package]]
 name = "encoding_rs"
-version = "0.8.9"
+version = "0.8.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "simd 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "env_logger"
@@ -1699,17 +1699,17 @@ dependencies = [
  "nsstring 0.1.0",
 ]
 
 [[package]]
 name = "nsstring"
 version = "0.1.0"
 dependencies = [
  "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "encoding_rs 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "nsstring-gtest"
 version = "0.1.0"
 dependencies = [
  "nsstring 0.1.0",
 ]
@@ -3196,17 +3196,17 @@ dependencies = [
 "checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a"
 "checksum docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d8acd393692c503b168471874953a2531df0e9ab77d0b6bbc582395743300a4a"
 "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
 "checksum dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "068d4026697c1a18f0b0bb8cfcad1b0c151b90d8edb9bf4c235ad68128920d1d"
 "checksum dwrote 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "18e895b763d82cafef31c7c1e2f4f17fb70f385ac651b0918a46ff5790664a63"
 "checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a"
 "checksum ena 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "88dc8393b3c7352f94092497f6b52019643e493b6b890eb417cdb7c46117e621"
 "checksum encoding_c 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "769ecb8b33323998e482b218c0d13cd64c267609023b4b7ec3ee740714c318ee"
-"checksum encoding_rs 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f1a79fa56c329a5b087de13748054fb3b974c4a672c12c71f0b66e35c5addec5"
+"checksum encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ca20350a7cb5aab5b9034731123d6d412caf3e92d4985e739e411ba0955fd0eb"
 "checksum env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0561146661ae44c579e993456bc76d11ce1e0c7d745e57b2fa7146b6e49fa2ad"
 "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
 "checksum euclid 0.19.3 (registry+https://github.com/rust-lang/crates.io-index)" = "600657e7e5c03bfbccdc68721bc3b5abcb761553973387124eae9c9e4f02c210"
 "checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7"
 "checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596"
 "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
 "checksum fixedbitset 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "85cb8fec437468d86dc7c83ca7cfc933341d561873275f22dd5eedefa63a6478"
 "checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909"
--- a/third_party/rust/encoding_rs/.cargo-checksum.json
+++ b/third_party/rust/encoding_rs/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"CONTRIBUTING.md":"0d4bfb1068c2b2f32b7bc7833662dfff628d86b0f31068266027c719fb727360","COPYRIGHT":"20d4fff11cca11529df3f02096fbe8ffe350219cdb07cdedea34e6a762866da5","Cargo.toml":"0bd10cb96d4bb16aa6a0fd341aa9722caec0d8a141825c68cf01ddc1091b2338","Ideas.md":"7fbeddb0f8ba7b233673ee705997adc2fddb1636a17fe662532b35ef2810a51d","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"74aa8b6d04c36bb640ee81187a3f24a2fa94e36d4c1d4f2ca164c3784ae87a83","README.md":"b338629279a35274194677f42394e6e8e4b6cc0d8bfddb81acaf43d0a3440a55","build.rs":"f5defca2c68b73e8723f489a9279af4fbe9724abc6e9abf58d32542e8a459e26","doc/Big5.txt":"f73a2edc5cb6c2d140ba6e07f4542e1c4a234950378acde1df93480f0ca0be0b","doc/EUC-JP.txt":"ee2818b907d0137f40a9ab9fd525fc700a44dbdddb6cf0c157a656566bae4bf1","doc/EUC-KR.txt":"71d9e2ccf3b124e8bdfb433c8cf2773fd878077038d0cec3c7237a50f4a78a30","doc/GBK.txt":"c1b522b5a799884e5001da661f42c5a8f4d0acb9ef1d74b206f22b5f65365606","doc/IBM866.txt":"a5a433e804d0f83af785015179fbc1d9b0eaf1f7960efcd04093e136b51fbd0e","doc/ISO-2022-JP.txt":"af86684f5a8f0e2868d7b2c292860140c3d2e5527530ca091f1b28198e8e2fe6","doc/ISO-8859-10.txt":"6d3949ad7c81ca176895101ed81a1db7df1060d64e262880b94bd31bb344ab4d","doc/ISO-8859-13.txt":"3951dd89cf93f7729148091683cf8511f4529388b7dc8dcd0d62eaed55be93fa","doc/ISO-8859-14.txt":"3d330784a0374fd255a38b47949675cc7168c800530534b0a01cac6edc623adc","doc/ISO-8859-15.txt":"24b1084aab5127a85aab99153f86e24694d0a3615f53b5ce23683f97cf66c47a","doc/ISO-8859-16.txt":"ce0272559b92ba76d7a7e476f6424ae4a5cc72e75b183611b08392e44add4d25","doc/ISO-8859-2.txt":"18ceff88c13d1b5ba455a3919b1e3de489045c4c3d2dd7e8527c125c75d54aad","doc/ISO-8859-3.txt":"21798404c68f4f5db59223362f24999da96968c0628427321fccce7d2849a130","doc/ISO-8859-4.txt":"d27f6520c6c5bfbcc19176b71d081cdb3bccde1622bb3e420d5680e812632d53","doc/ISO-8859-5.txt":"a10ec8d6ea7a78ad15da7275f6cb1a3365118527e28f9af6d0d5830501303f3a","doc/ISO-8859-6.txt":"ccda8a2efc96115336bdd77776637b9712425e44fbcf745353b9057fbef144e7","doc/ISO-8859-7.txt":"17900fa1f27a445958f0a77d7d9056be375a6bd7ee4492aa680c7c1500bab85e","doc/ISO-8859-8-I.txt":"8357555646d54265a9b9ffa3e68b08d132312f1561c60108ff9b8b1167b6ecf2","doc/ISO-8859-8.txt":"72cd6f3afb7b4a9c16a66a362473315770b7755d72c86c870e52fc3eba86c8af","doc/KOI8-R.txt":"839cf19a38da994488004ed7814b1f6151640156a9a2af02bf2efca745fb5966","doc/KOI8-U.txt":"0cc76624ed1f024183e2298b7e019957da2c70c8ca06e0fc4e6f353f50a5054f","doc/Shift_JIS.txt":"34c49141818cb9ddbcf59cc858f78a79be8ad148d563f26415108ae1f148443f","doc/UTF-16BE.txt":"e2e280d8acbaa6d2a6b3569d60e17500a285f2baa0df3363dd85537cd5a1ef8f","doc/UTF-16LE.txt":"70bdc170e3fc5298ba68f10125fb5eeb8b077036cc96bb4416c4de396f6d76c1","doc/UTF-8.txt":"ea7bae742e613010ced002cf4b601a737d2203fad65e115611451bc4428f548a","doc/gb18030.txt":"dc71378a8f07a2d8659f69ee81fb8791fef56ba86f124b429978285237bb4a7b","doc/macintosh.txt":"57491e53866711b4672d9b9ff35380b9dac9e0d8e3d6c20bdd6140603687c023","doc/replacement.txt":"4b6c3bbd7999d9d4108a281594bd02d13607e334a95465afff8c2c08d395f0e4","doc/windows-1250.txt":"61296bb6a21cdab602300d32ecfba434cb82de5ac3bc88d58710d2f125e28d39","doc/windows-1251.txt":"7deea1c61dea1485c8ff02db2c7d578db7a9aab63ab1cfd02ec04b515864689e","doc/windows-1252.txt":"933ef3bdddfce5ee132b9f1a1aa8b47423d2587bbe475b19028d0a6d38e180b6","doc/windows-1253.txt":"1a38748b88e99071a5c7b3d5456ead4caedeabab50d50d658be105bc113714de","doc/windows-1254.txt":"f8372f86c6f8d642563cd6ddc025260553292a39423df1683a98670bd7bf2b47","doc/windows-1255.txt":"4e5852494730054e2da258a74e1b9d780abbcdd8ce22ebc218ca2efe9e90493d","doc/windows-1256.txt":"c0879c5172abedead302a406e8f60d9cd9598694a0ffa4fd288ffe4fef7b8ea1","doc/windows-1257.txt":"c28a0c9f964fcb2b46d21f537c402446501a2800670481d6abf9fd9e9018d523","doc/windows-1258.txt":"5019ae4d61805c79aacbf17c93793342dbb098d65a1837783bc3e2c6d6a23602","doc/windows-874.txt":"4ef0e4501c5feba8b17aee1818602ed44b36ca8475db771ce2fc16d392cabecc","doc/x-mac-cyrillic.txt":"58be154d8a888ca3d484b83b44f749823ef339ab27f14d90ca9a856f5050a8bd","doc/x-user-defined.txt":"f9cd07c4321bf5cfb0be4bdddd251072999b04a6cf7a6f5bc63709a84e2c1ffc","generate-encoding-data.py":"bbe134cc013a17c32bd51e868a2ee4f2c3e2205e40afb9fc60f98fa9758961b8","rustfmt.toml":"85c1a3b4382fd89e991cbb81b70fb52780472edc064c963943cdaaa56e0a2030","src/ascii.rs":"a9cf02c992229952976761655c044be23675a278de1a6186d8baaf66879c4f4a","src/big5.rs":"659ddb66f82142468774715cd9ecdc8356005fec9d91e46d54ae2280a88adb4b","src/data.rs":"18793e23f98d9aba1ed2858c43b2103c9c05a8571429b2128510c68d05ba8cb6","src/euc_jp.rs":"b178172274af1a6be38d388e5a2468e7140e9facf63d2f679f4ed77c3fc20a92","src/euc_kr.rs":"e27bd9c4e2172bb02004dd2a1fcbe02118415a1aec6a90b5632c9eac6f12ba7d","src/gb18030.rs":"752869f47ad0cad02ad3ccb6fde3eb277fa528e10e3d9432a90563db610d9dc2","src/handles.rs":"c722b818f4178f04232ef540a840f7104f087c29b1cd2724bed77df9f54fbd45","src/iso_2022_jp.rs":"d904a92d49fc5878e6cb82a21185051c801489cf2800db8f37269965ca7974cc","src/lib.rs":"f778c1319d0f7605894b852540f156ef74d6e202690e1ff0a668c14988804584","src/macros.rs":"04b3d81f1701b746dcce466ad2c3202a0a3e9c00f1d8db336276660640a12d7b","src/mem.rs":"c374b8ba7265e1f304328099b8f3187797cf8e7ba9d10f84da462cd96899a9c8","src/replacement.rs":"61e0ae52664b3856f1ed202af6266b441ffcf5e2c9b22976047540e4a3252b41","src/shift_jis.rs":"7106d0a9785425b5af2323f3046e6130bd5125effa4ab484d84b529914855d67","src/simd_funcs.rs":"745283779e40e73d608636bbb0297b27689df19ee7af984d0fcfb85455789a54","src/single_byte.rs":"986571bb52f2cf7779c1dc8bdd8058c3183524a512bc2fcca6637eeee394b573","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"c962c7aeac3d9ef2aca70c9e21983b231d4cf998cb06879374b0401e5149d1da","src/testing.rs":"b299d27055f3b068de66cc10a75c024b881c48bc093627c01e0b1f8bd7d94666","src/utf_16.rs":"288c590fb4438b6f3886ce8d37eae52069ba61bd5c037f291df36cbab9404568","src/utf_8.rs":"5d16295faf1707b2058629eb2467200b86b02acfceda27433ac1d05ac385f9f3","src/utf_8_core.rs":"fe218284dbb9111a2336ff1684d7f58b55d9c4fe7363089a29e57f52901f0707","src/variant.rs":"e2c988a645429fd7457d7fbc487b838ab7ec7bfb8943d192992f18bbac8973f0","src/x_user_defined.rs":"1d25920ec5d005cbd623f34473d68991521aa3a83e52d4eb9b645711f10cd484"},"package":"f1a79fa56c329a5b087de13748054fb3b974c4a672c12c71f0b66e35c5addec5"}
\ No newline at end of file
+{"files":{"CONTRIBUTING.md":"06c26277e8dbd3f57be2eb51b5e3285dc1cbbf8c11326df413868ae702e6a61c","COPYRIGHT":"8b98376eb373dcf81950474efe34b5576a8171460dff500cc58a1ed8d160cd57","Cargo.toml":"ae14c07eec898dbd482c06690880acfe2a1478eae2d3f456da2294b743b95db6","Ideas.md":"b7452893f500163868d8de52c09addaf91e1632454ed02e892c467ed7ec39dbd","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"f2ad48641d9c997d9ae3b95d93d1cd6e1ab12ab4c44de89937c7bfabbd076a4a","README.md":"29217032b77c4adb65d77ecec862e62f23de38ea35d0188238682f50646dc6cb","build.rs":"f5defca2c68b73e8723f489a9279af4fbe9724abc6e9abf58d32542e8a459e26","doc/Big5.txt":"f73a2edc5cb6c2d140ba6e07f4542e1c4a234950378acde1df93480f0ca0be0b","doc/EUC-JP.txt":"ee2818b907d0137f40a9ab9fd525fc700a44dbdddb6cf0c157a656566bae4bf1","doc/EUC-KR.txt":"71d9e2ccf3b124e8bdfb433c8cf2773fd878077038d0cec3c7237a50f4a78a30","doc/GBK.txt":"c1b522b5a799884e5001da661f42c5a8f4d0acb9ef1d74b206f22b5f65365606","doc/IBM866.txt":"a5a433e804d0f83af785015179fbc1d9b0eaf1f7960efcd04093e136b51fbd0e","doc/ISO-2022-JP.txt":"af86684f5a8f0e2868d7b2c292860140c3d2e5527530ca091f1b28198e8e2fe6","doc/ISO-8859-10.txt":"6d3949ad7c81ca176895101ed81a1db7df1060d64e262880b94bd31bb344ab4d","doc/ISO-8859-13.txt":"3951dd89cf93f7729148091683cf8511f4529388b7dc8dcd0d62eaed55be93fa","doc/ISO-8859-14.txt":"3d330784a0374fd255a38b47949675cc7168c800530534b0a01cac6edc623adc","doc/ISO-8859-15.txt":"24b1084aab5127a85aab99153f86e24694d0a3615f53b5ce23683f97cf66c47a","doc/ISO-8859-16.txt":"ce0272559b92ba76d7a7e476f6424ae4a5cc72e75b183611b08392e44add4d25","doc/ISO-8859-2.txt":"18ceff88c13d1b5ba455a3919b1e3de489045c4c3d2dd7e8527c125c75d54aad","doc/ISO-8859-3.txt":"21798404c68f4f5db59223362f24999da96968c0628427321fccce7d2849a130","doc/ISO-8859-4.txt":"d27f6520c6c5bfbcc19176b71d081cdb3bccde1622bb3e420d5680e812632d53","doc/ISO-8859-5.txt":"a10ec8d6ea7a78ad15da7275f6cb1a3365118527e28f9af6d0d5830501303f3a","doc/ISO-8859-6.txt":"ccda8a2efc96115336bdd77776637b9712425e44fbcf745353b9057fbef144e7","doc/ISO-8859-7.txt":"17900fa1f27a445958f0a77d7d9056be375a6bd7ee4492aa680c7c1500bab85e","doc/ISO-8859-8-I.txt":"8357555646d54265a9b9ffa3e68b08d132312f1561c60108ff9b8b1167b6ecf2","doc/ISO-8859-8.txt":"72cd6f3afb7b4a9c16a66a362473315770b7755d72c86c870e52fc3eba86c8af","doc/KOI8-R.txt":"839cf19a38da994488004ed7814b1f6151640156a9a2af02bf2efca745fb5966","doc/KOI8-U.txt":"0cc76624ed1f024183e2298b7e019957da2c70c8ca06e0fc4e6f353f50a5054f","doc/Shift_JIS.txt":"34c49141818cb9ddbcf59cc858f78a79be8ad148d563f26415108ae1f148443f","doc/UTF-16BE.txt":"e2e280d8acbaa6d2a6b3569d60e17500a285f2baa0df3363dd85537cd5a1ef8f","doc/UTF-16LE.txt":"70bdc170e3fc5298ba68f10125fb5eeb8b077036cc96bb4416c4de396f6d76c1","doc/UTF-8.txt":"ea7bae742e613010ced002cf4b601a737d2203fad65e115611451bc4428f548a","doc/gb18030.txt":"dc71378a8f07a2d8659f69ee81fb8791fef56ba86f124b429978285237bb4a7b","doc/macintosh.txt":"57491e53866711b4672d9b9ff35380b9dac9e0d8e3d6c20bdd6140603687c023","doc/replacement.txt":"4b6c3bbd7999d9d4108a281594bd02d13607e334a95465afff8c2c08d395f0e4","doc/windows-1250.txt":"61296bb6a21cdab602300d32ecfba434cb82de5ac3bc88d58710d2f125e28d39","doc/windows-1251.txt":"7deea1c61dea1485c8ff02db2c7d578db7a9aab63ab1cfd02ec04b515864689e","doc/windows-1252.txt":"933ef3bdddfce5ee132b9f1a1aa8b47423d2587bbe475b19028d0a6d38e180b6","doc/windows-1253.txt":"1a38748b88e99071a5c7b3d5456ead4caedeabab50d50d658be105bc113714de","doc/windows-1254.txt":"f8372f86c6f8d642563cd6ddc025260553292a39423df1683a98670bd7bf2b47","doc/windows-1255.txt":"4e5852494730054e2da258a74e1b9d780abbcdd8ce22ebc218ca2efe9e90493d","doc/windows-1256.txt":"c0879c5172abedead302a406e8f60d9cd9598694a0ffa4fd288ffe4fef7b8ea1","doc/windows-1257.txt":"c28a0c9f964fcb2b46d21f537c402446501a2800670481d6abf9fd9e9018d523","doc/windows-1258.txt":"5019ae4d61805c79aacbf17c93793342dbb098d65a1837783bc3e2c6d6a23602","doc/windows-874.txt":"4ef0e4501c5feba8b17aee1818602ed44b36ca8475db771ce2fc16d392cabecc","doc/x-mac-cyrillic.txt":"58be154d8a888ca3d484b83b44f749823ef339ab27f14d90ca9a856f5050a8bd","doc/x-user-defined.txt":"f9cd07c4321bf5cfb0be4bdddd251072999b04a6cf7a6f5bc63709a84e2c1ffc","generate-encoding-data.py":"11f92c0df48ce12919b5b71cbd03bd5e14a34dcdcdfbb20e6c7b327d203a9659","rustfmt.toml":"85c1a3b4382fd89e991cbb81b70fb52780472edc064c963943cdaaa56e0a2030","src/ascii.rs":"72ba111e4d4a0f81d11be7c8597f904006f45a33adace3b0d36b29cf54d51c06","src/big5.rs":"1c94b35813314775c3fa1b10923cf8e8f8eba8c465d9833ad4293594e16c17f2","src/data.rs":"664e87f88c4558458b09d6c600f48bac287c5db29a98a47ac097281573608dcf","src/euc_jp.rs":"0842e4f564a36051c6b85c47bbb652efae2f2926e91491daf77e4ceeecb18163","src/euc_kr.rs":"8e68590efa65485583bf57cae44ebf6de535bac1d37232e7f0307a38425fb992","src/gb18030.rs":"d269efb5e5d175f9d2ecf01d5606955a284b6f00749bb0ee23d3412c83aa3d59","src/handles.rs":"a3d953b0bc88bfd07f9c12d1b5cd85904d0d8f0fe3bee19e7fad74d4f3d3b4fa","src/iso_2022_jp.rs":"9db1cc612787ab0a874f904306d4c516bc82440183f9a6a045f601aab070ed18","src/lib.rs":"293648fbd3976c2ae06b10fe2b2b3bc46dab013ab476aeae61306be5f95eb653","src/macros.rs":"c7a019fd81d31de77569036ac36fd4e404b3f20144bbf79747faf4ea21538d09","src/mem.rs":"4791afe98b47321f8a5dcfca114aabb3f4b60bb9b7efd89d749880d3e95be704","src/replacement.rs":"182c2093a6edb162183ca5990554fd7b199d3011924a8d80d894ba98ee7c479e","src/shift_jis.rs":"1c0c69ba6c123fcf720276646074660193bf9e6fa4327fe0d739a3e67874e081","src/simd_funcs.rs":"565ceeffe81173b85700c55c396ab72068751ef809bea8e1cb1e6c7919f5a905","src/single_byte.rs":"383d325dedbf3295acd50d880db1cecc29b69efe332ae2a37367cf40bf138ac4","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"c962c7aeac3d9ef2aca70c9e21983b231d4cf998cb06879374b0401e5149d1da","src/testing.rs":"b299d27055f3b068de66cc10a75c024b881c48bc093627c01e0b1f8bd7d94666","src/utf_16.rs":"1ec4e1c8ed7e42e4de401c6d0f64c2835bd80c2a306f358959957d30e6ff1501","src/utf_8.rs":"3b1d508dd23e2f3c1a21e3d2c971e167c2a799f093584798783c03d6e8e39c5d","src/variant.rs":"619a8e604d2febe6a874e3ad73cddf3ef9e6011480aecf86f23708b313415251","src/x_user_defined.rs":"3f1956b698eb27bc7b323f853b188726bb5f62d15d899a7b08590ba5c26d9d45"},"package":"ca20350a7cb5aab5b9034731123d6d412caf3e92d4985e739e411ba0955fd0eb"}
\ No newline at end of file
--- a/third_party/rust/encoding_rs/CONTRIBUTING.md
+++ b/third_party/rust/encoding_rs/CONTRIBUTING.md
@@ -23,17 +23,19 @@ If you require the addition of your copy
 your notice as part of your Contribution. Not adding a copyright notice is
 taken as a waiver of copyright notice.
 
 ## No Encodings Beyond The Encoding Standard
 
 Please do not contribute implementations of encodings that are not specified
 in the [Encoding Standard](https://encoding.spec.whatwg.org/).
 
-For example, an implementation of UTF-7 would be explicitly not welcome.
+For example, an implementation of UTF-7 is explicitly out of scope for this
+crate and is, therefore, provided by the [charset](https://crates.io/crates/charset)
+crate instead.
 
 ## Compatibility with Stable Rust
 
 Please ensure that your Contribution compiles with the latest stable-channel
 rustc.
 
 ## rustfmt
 
--- a/third_party/rust/encoding_rs/COPYRIGHT
+++ b/third_party/rust/encoding_rs/COPYRIGHT
@@ -5,22 +5,8 @@ Licensed under the Apache License, Versi
 https://www.apache.org/licenses/LICENSE-2.0> or the MIT
 license <LICENSE-MIT or https://opensource.org/licenses/MIT>,
 at your option. All files in the project carrying such
 notice may not be copied, modified, or distributed except
 according to those terms.
 
 Test code within encoding_rs is dedicated to the Public Domain when so
 designated (see the individual files for PD/CC0-dedicated sections).
-
-The file utf_8_core.rs was extracted from the Rust project at revision
-7ad7232422f7e5bbfa0e52dabe36c12677df19e2, whose COPYRIGHT file said (in part):
-
-The Rust Project is copyright 2010, The Rust Project
-Developers.
-
-Licensed under the Apache License, Version 2.0
-<LICENSE-APACHE or
-http://www.apache.org/licenses/LICENSE-2.0> or the MIT
-license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
-at your option. All files in the project carrying such
-notice may not be copied, modified, or distributed except
-according to those terms.
--- a/third_party/rust/encoding_rs/Cargo.toml
+++ b/third_party/rust/encoding_rs/Cargo.toml
@@ -7,24 +7,24 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "encoding_rs"
-version = "0.8.9"
+version = "0.8.12"
 authors = ["Henri Sivonen <hsivonen@hsivonen.fi>"]
 description = "A Gecko-oriented implementation of the Encoding Standard"
 homepage = "https://docs.rs/encoding_rs/"
 documentation = "https://docs.rs/encoding_rs/"
 readme = "README.md"
 keywords = ["encoding", "web", "unicode", "charset"]
-categories = ["text-processing", "encoding", "web-programming", "email"]
+categories = ["text-processing", "encoding", "web-programming", "internationalization"]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/hsivonen/encoding_rs"
 [profile.release]
 lto = true
 [dependencies.cfg-if]
 version = "0.1.0"
 
 [dependencies.serde]
@@ -39,14 +39,20 @@ version = "0.8"
 
 [dev-dependencies.serde_derive]
 version = "1.0"
 
 [dev-dependencies.serde_json]
 version = "1.0"
 
 [features]
+fast-big5-hanzi-encode = []
+fast-gb-hanzi-encode = []
+fast-hangul-encode = []
+fast-hanja-encode = []
+fast-kanji-encode = []
+fast-legacy-encode = ["fast-hangul-encode", "fast-hanja-encode", "fast-kanji-encode", "fast-gb-hanzi-encode", "fast-big5-hanzi-encode"]
 less-slow-big5-hanzi-encode = []
 less-slow-gb-hanzi-encode = []
 less-slow-kanji-encode = []
 simd-accel = ["simd"]
 [badges.travis-ci]
 repository = "hsivonen/encoding_rs"
--- a/third_party/rust/encoding_rs/Ideas.md
+++ b/third_party/rust/encoding_rs/Ideas.md
@@ -71,8 +71,36 @@ than generic code.
 
 On [Cortex-A57](https://stackoverflow.com/questions/45714535/performance-of-unaligned-simd-load-store-on-aarch64/45938112#45938112
 ), it might be a good idea to move the destination into 16-byte alignment.
 
 ## Unalign UTF-8 validation on Aarch64
 
 Currently, Aarch64 runs the generic ALU UTF-8 validation code that aligns
 reads. That's probably unnecessary on Aarch64. (SIMD was slower than ALU!)
+
+## Table-driven UTF-8 validation
+
+When there are at least four bytes left, read all four. With each byte
+index into tables corresponding to magic values indexable by byte in
+each position.
+
+In the value read from the table indexed by lead byte, encode the
+following in 16 bits: advance 2 bits (2, 3 or 4 bytes), 9 positional
+bits one of which is set to indicate the type of lead byte (8 valid
+types, in the 8 lowest bits, and invalid, ASCII would be tenth type),
+and the mask for extracting the payload bits from the lead byte
+(for conversion to UTF-16 or UTF-32).
+
+In the tables indexable by the trail bytes, in each positions
+corresponding byte the lead byte type, store 1 if the trail is
+invalid given the lead and 0 if valid given the lead.
+
+Use the low 8 bits of the of the 16 bits read from the first
+table to mask (bitwise AND) one positional bit from each of the 
+three other values. Bitwise OR the results together with the
+bit that is 1 if the lead is invalid. If the result is zero,
+the sequence is valid. Otherwise it's invalid.
+
+Use the advance to advance. In the conversion to UTF-16 or
+UTF-32 case, use the mast for extracting the meaningful
+bits from the lead byte to mask them from the lead. Shift
+left by 6 as many times as the advance indicates, etc.
--- a/third_party/rust/encoding_rs/LICENSE-MIT
+++ b/third_party/rust/encoding_rs/LICENSE-MIT
@@ -18,37 +18,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOU
 ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
 SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
-
-The file utf_8_core.rs was extracted from the Rust project at revision
-7ad7232422f7e5bbfa0e52dabe36c12677df19e2, whose LICENSE-MIT file said:
-
-Copyright (c) 2010 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
--- a/third_party/rust/encoding_rs/README.md
+++ b/third_party/rust/encoding_rs/README.md
@@ -70,16 +70,22 @@ Additionally, `encoding_rs::mem` does th
 
 ## Integration with `std::io`
 
 Notably, the above feature list doesn't include the capability to wrap
 a `std::io::Read`, decode it into UTF-8 and presenting the result via
 `std::io::Read`. The [`encoding_rs_io`](https://crates.io/crates/encoding_rs_io)
 crate provides that capability.
 
+## Decoding Email
+
+For decoding character encodings that occur in email, use the
+[`charset`](https://crates.io/crates/charset) crate instead of using this
+one directly. (It wraps this crate and adds UTF-7 decoding.)
+
 ## Licensing
 
 Please see the file named
 [COPYRIGHT](https://github.com/hsivonen/encoding_rs/blob/master/COPYRIGHT).
 
 ## API Documentation
 
 Generated [API documentation](https://docs.rs/encoding_rs/) is available
@@ -100,118 +106,237 @@ These bindings do not cover the `mem` mo
 ## Sample programs
 
 * [Rust](https://github.com/hsivonen/recode_rs)
 * [C](https://github.com/hsivonen/recode_c)
 * [C++](https://github.com/hsivonen/recode_cpp)
 
 ## Optional features
 
-There are currently three optional cargo features:
+There are currently these optional cargo features:
 
 ### `simd-accel`
 
 Enables SSE2 acceleration on x86 and x86_64 and NEON acceleration on Aarch64
 and ARMv7. _Enabling this cargo feature is recommended when building for x86,
 x86_64, ARMv7 or Aarch64._ The intention is for the functionality enabled by
 this feature to become the normal on-by-default behavior once
 [portable SIMD](https://github.com/rust-lang/rfcs/pull/2366) becames part of
 stable Rust.
 
 Enabling this feature breaks the build unless the target is x86 with SSE2
 (Rust's default 32-bit x86 target, `i686`, has SSE2, but Linux distros may
 use an x86 target without SSE2, i.e. `i586` in `rustup` terms), ARMv7 or
 thumbv7 with NEON (`-C target_feature=+neon`), x86_64 or Aarch64.
 
+Used by Firefox.
+
 ### `serde`
 
 Enables support for serializing and deserializing `&'static Encoding`-typed
 struct fields using [Serde][1].
 
 [1]: https://serde.rs/
 
+Not used by Firefox.
+
+### `fast-legacy-encode`
+
+A catch-all option for enabling the fastest legacy encode options. _Does not
+affect decode speed or UTF-8 encode speed._
+
+At present, this option is equivalent to enabling the following options:
+ * `fast-hangul-encode`
+ * `fast-hanja-encode`
+ * `fast-kanji-encode`
+ * `fast-gb-hanzi-encode`
+ * `fast-big5-hanzi-encode`
+
+Adds 176 KB to the binary size.
+
+Not used by Firefox.
+
+### `fast-hangul-encode`
+
+Changes encoding precomposed Hangul syllables into EUC-KR from binary
+search over the decode-optimized tables to lookup by index making Korean
+plain-text encode about 4 times as fast as without this option.
+
+Adds 20 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-hanja-encode`
+
+Changes encoding of Hanja into EUC-KR from linear search over the
+decode-optimized table to lookup by index. Since Hanja is practically absent
+in modern Korean text, this option doesn't affect perfomance in the common
+case and mainly makes sense if you want to make your application resilient
+agaist denial of service by someone intentionally feeding it a lot of Hanja
+to encode into EUC-KR.
+
+Adds 40 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-kanji-encode`
+
+Changes encoding of Kanji into Shift_JIS, EUC-JP and ISO-2022-JP from linear
+search over the decode-optimized tables to lookup by index making Japanese
+plain-text encode to legacy encodings 30 to 50 times as fast as without this
+option (about 2 times as fast as with `less-slow-kanji-encode`).
+
+Takes precedence over `less-slow-kanji-encode`.
+
+Adds 36 KB to the binary size (24 KB compared to `less-slow-kanji-encode`).
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
 ### `less-slow-kanji-encode`
 
 Makes JIS X 0208 Level 1 Kanji (the most common Kanji in Shift_JIS, EUC-JP and
-ISO-2022-JP) encode less slow (binary search instead of linear search) at the
-expense of binary size. (Does _not_ affect decode speed.)
+ISO-2022-JP) encode less slow (binary search instead of linear search) making
+Japanese plain-text encode to legacy encodings 14 to 23 times as fast as
+without this option.
+
+Adds 12 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-gb-hanzi-encode`
+
+Changes encoding of Hanzi in the CJK Unified Ideographs block into GBK and
+gb18030 from linear search over a part the decode-optimized tables followed
+by a binary search over another part of the decode-optimized tables to lookup
+by index making Simplified Chinese plain-text encode to the legacy encodings
+100 to 110 times as fast as without this option (about 2.5 times as fast as
+with `less-slow-gb-hanzi-encode`).
+
+Takes precedence over `less-slow-gb-hanzi-encode`.
+
+Adds 36 KB to the binary size (24 KB compared to `less-slow-gb-hanzi-encode`).
+
+Does _not_ affect decode speed.
 
 Not used by Firefox.
 
 ### `less-slow-gb-hanzi-encode`
 
 Makes GB2312 Level 1 Hanzi (the most common Hanzi in gb18030 and GBK) encode
-less slow (binary search instead of linear search) at the expense of binary
-size. (Does _not_ affect decode speed.)
+less slow (binary search instead of linear search) making Simplified Chinese
+plain-text encode to the legacy encodings about 40 times as fast as without
+this option.
+
+Adds 12 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-big5-hanzi-encode`
+
+Changes encoding of Hanzi in the CJK Unified Ideographs block into Big5 from
+linear search over a part the decode-optimized tables to lookup by index
+making Traditional Chinese plain-text encode to Big5 105 to 125 times as fast
+as without this option (about 3 times as fast as with
+`less-slow-big5-hanzi-encode`).
+
+Takes precedence over `less-slow-big5-hanzi-encode`.
+
+Adds 40 KB to the binary size (20 KB compared to `less-slow-big5-hanzi-encode`).
+
+Does _not_ affect decode speed.
 
 Not used by Firefox.
 
 ### `less-slow-big5-hanzi-encode`
 
 Makes Big5 Level 1 Hanzi (the most common Hanzi in Big5) encode less slow
-(binary search instead of linear search) at the expense of binary size. (Does
-_not_ affect decode speed.)
+(binary search instead of linear search) making Traditional Chinese
+plain-text encode to Big5 about 36 times as fast as without this option.
+
+Adds 20 KB to the binary size.
+
+Does _not_ affect decode speed.
 
 Not used by Firefox.
 
 ## Performance goals
 
 For decoding to UTF-16, the goal is to perform at least as well as Gecko's old
 uconv. For decoding to UTF-8, the goal is to perform at least as well as
-rust-encoding.
+rust-encoding. These goals have been achieved.
 
 Encoding to UTF-8 should be fast. (UTF-8 to UTF-8 encode should be equivalent
 to `memcpy` and UTF-16 to UTF-8 should be fast.)
 
-Speed is a non-goal when encoding to legacy encodings. Encoding to legacy
-encodings should not be optimized for speed at the expense of code size as long
-as form submission and URL parsing in Gecko don't become noticeably too slow
-in real-world use.
+Speed is a non-goal when encoding to legacy encodings. By default, encoding to
+legacy encodings should not be optimized for speed at the expense of code size
+as long as form submission and URL parsing in Gecko don't become noticeably
+too slow in real-world use.
 
-In the interest of binary size, by default, encoding_rs does not have any
-encode-specific data tables. Therefore, encoders search the decode-optimized
-data tables. This is a linear search in most cases. As a result, encode to
-legacy encodings varies from slow to extremely slow relative to other
-libraries. Still, with realistic work loads, this seemed fast enough
-not to be user-visibly slow on Raspberry Pi 3 (which stood in for a phone
-for testing) in the Web-exposed encoder use cases.
+In the interest of binary size, by default, encoding_rs does not have
+encode-specific data tables beyond 32 bits of encode-specific data for each
+single-byte encoding. Therefore, encoders search the decode-optimized data
+tables. This is a linear search in most cases. As a result, by default, encode
+to legacy encodings varies from slow to extremely slow relative to other
+libraries. Still, with realistic work loads, this seemed fast enough not to be
+user-visibly slow on Raspberry Pi 3 (which stood in for a phone for testing)
+in the Web-exposed encoder use cases.
 
-See the cargo features above for optionally making Kanji and Hanzi legacy
-encode a bit less slow.
-
-Actually fast options for legacy encode may be added in the future, but there
-do not appear to be pressing use cases.
+See the cargo features above for optionally making CJK legacy encode fast.
 
 A framework for measuring performance is [available separately][2].
 
 [2]: https://github.com/hsivonen/encoding_bench/
 
 ## Rust Version Compatibility
 
 It is a goal to support the latest stable Rust, the latest nightly Rust and
-the version of Rust that's used for Firefox Nightly (currently 1.25.0).
+the version of Rust that's used for Firefox Nightly (currently 1.29.0).
 These are tested on Travis.
 
 Additionally, beta and the oldest known to work Rust version (currently
-1.21.0) are tested on Travis. The oldest Rust known to work is tested as
+1.29.0) are tested on Travis. The oldest Rust known to work is tested as
 a canary so that when the oldest known to work no longer works, the change
 can be documented here. At this time, there is no firm commitment to support
 a version older than what's required by Firefox. The oldest supported Rust
-is expected to move forward rapidly when `stdsimd` can replace the `simd`
+is expected to move forward rapidly when `packed_simd` can replace the `simd`
 crate without performance regression.
 
 ## Compatibility with rust-encoding
 
 A compatibility layer that implements the rust-encoding API on top of
 encoding_rs is
 [provided as a separate crate](https://github.com/hsivonen/encoding_rs_compat)
 (cannot be uploaded to crates.io). The compatibility layer was originally
 written with the assuption that Firefox would need it, but it is not currently
 used in Firefox.
 
+## Regenerating Generated Code
+
+To regenerate the generated code:
+
+ * Have Python 2 installed.
+ * Clone [`https://github.com/hsivonen/encoding_c`](https://github.com/hsivonen/encoding_c)
+   next to the `encoding_rs` directory.
+ * Clone [`https://github.com/whatwg/encoding`](https://github.com/whatwg/encoding)
+   next to the `encoding_rs` directory.
+ * Checkout revision `f381389` of the `encoding` repo.
+ * With the `encoding_rs` directory as the working directory, run
+   `python generate-encoding-data.py`.
+
 ## Roadmap
 
 - [x] Design the low-level API.
 - [x] Provide Rust-only convenience features.
 - [x] Provide an stl/gsl-flavored C++ API.
 - [x] Implement all decoders and encoders.
 - [x] Add unit tests for all decoders and encoders.
 - [x] Finish BOM sniffing variants in Rust-only convenience features.
@@ -226,28 +351,63 @@ used in Firefox.
 - [x] Compress CJK indices by making use of sequential code points as well
       as Unicode-ordered parts of indices.
 - [x] Make lookups by label or name use binary search that searches from the
       end of the label/name to the start.
 - [x] Make labels with non-ASCII bytes fail fast.
 - [ ] ~Parallelize UTF-8 validation using [Rayon](https://github.com/nikomatsakis/rayon).~
       (This turned out to be a pessimization in the ASCII case due to memory bandwidth reasons.)
 - [x] Provide an XPCOM/MFBT-flavored C++ API.
-- [ ] Investigate accelerating single-byte encode with a single fast-tracked
+- [x] Investigate accelerating single-byte encode with a single fast-tracked
       range per encoding.
 - [x] Replace uconv with encoding_rs in Gecko.
 - [x] Implement the rust-encoding API in terms of encoding_rs.
 - [x] Add SIMD acceleration for Aarch64.
 - [x] Investigate the use of NEON on 32-bit ARM.
-- [ ] Investigate Björn Höhrmann's lookup table acceleration for UTF-8 as
-      adapted to Rust in rust-encoding.
-- [ ] Add actually fast CJK encode options.
+- [ ] ~Investigate Björn Höhrmann's lookup table acceleration for UTF-8 as
+      adapted to Rust in rust-encoding.~
+- [x] Add actually fast CJK encode options.
+- [ ] Investigate [Bob Steagall's lookup table acceleration for UTF-8](https://github.com/BobSteagall/CppNow2018/blob/master/FastConversionFromUTF-8/Fast%20Conversion%20From%20UTF-8%20with%20C%2B%2B%2C%20DFAs%2C%20and%20SSE%20Intrinsics%20-%20Bob%20Steagall%20-%20C%2B%2BNow%202018.pdf).
 
 ## Release Notes
 
+### 0.8.12
+
+* Removed the `clippy::` prefix from clippy lint names.
+
+### 0.8.11
+
+* Changed minimum Rust requirement to 1.29.0 (for the ability to refer
+  to the interior of a `static` when defining another `static`).
+* Explicitly aligned the lookup tables for single-byte encodings and
+  UTF-8 to cache lines in the hope of freeing up one cache line for
+  other data. (Perhaps the tables were already aligned and this is
+  placebo.)
+* Added 32 bits of encode-oriented data for each single-byte encoding.
+  The change was performance-neutral for non-Latin1-ish Latin legacy
+  encodings, improved Latin1-ish and Arabic legacy encode speed
+  somewhat (new speed is 2.4x the old speed for German, 2.3x for
+  Arabic, 1.7x for Portuguese and 1.4x for French) and improved
+  non-Latin1, non-Arabic legacy single-byte encode a lot (7.2x for
+  Thai, 6x for Greek, 5x for Russian, 4x for Hebrew).
+* Added compile-time options for fast CJK legacy encode options (at
+  the cost of binary size (up to 176 KB) and run-time memory usage).
+  These options still retain the overall code structure instead of
+  rewriting the CJK encoders totally, so the speed isn't as good as
+  what could be achieved by using even more memory / making the
+  binary even langer.
+* Made UTF-8 decode and validation faster.
+* Added method `is_single_byte()` on `Encoding`.
+* Added `mem::decode_latin1()` and `mem::encode_latin1_lossy()`.
+
+### 0.8.10
+
+* Disabled a unit test that tests a panic condition when the assertion
+  being tested is disabled.
+
 ### 0.8.9
 
 * Made `--features simd-accel` work with stable-channel compiler to
   simplify the Firefox build system.
 
 ### 0.8.8
 
 * Made the `is_foo_bidi()` not treat U+FEFF (ZERO WIDTH NO-BREAK SPACE
--- a/third_party/rust/encoding_rs/generate-encoding-data.py
+++ b/third_party/rust/encoding_rs/generate-encoding-data.py
@@ -7,16 +7,25 @@
 # https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
 # <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
 # option. This file may not be copied, modified, or distributed
 # except according to those terms.
 
 import json
 import subprocess
 import sys
+import os.path
+
+if (not os.path.isfile("../encoding/encodings.json")) or (not os.path.isfile("../encoding/indexes.json")):
+  sys.stderr.write("This script needs a clone of https://github.com/whatwg/encoding/ (preferably at revision f381389) next to the encoding_rs directory.\n");
+  sys.exit(-1)
+
+if not os.path.isfile("../encoding_c/src/lib.rs"):
+  sys.stderr.write("This script also writes the generated parts of the encoding_c crate and needs a clone of https://github.com/hsivonen/encoding_c next to the encoding_rs directory.\n");
+  sys.exit(-1)
 
 def cmp_from_end(one, other):
   c = cmp(len(one), len(other))
   if c != 0:
     return c
   i = len(one) - 1
   while i >= 0:
     c = cmp(one[i], other[i])
@@ -47,34 +56,55 @@ def static_u16_table(name, data):
   for i in xrange(len(data)):
     data_file.write('0x%04X,\n' % data[i])
 
   data_file.write('''];
 
   ''')
 
 def static_u16_table_from_indexable(name, data, item, feature):
-  data_file.write('''#[cfg(feature = "%s")]
+  data_file.write('''#[cfg(all(
+    feature = "less-slow-%s",
+    not(feature = "fast-%s")
+))]
 static %s: [u16; %d] = [
-  ''' % (feature, name, len(data)))
+  ''' % (feature, feature, name, len(data)))
 
   for i in xrange(len(data)):
     data_file.write('0x%04X,\n' % data[i][item])
 
   data_file.write('''];
 
   ''')
 
 def static_u8_pair_table_from_indexable(name, data, item, feature):
+  data_file.write('''#[cfg(all(
+    feature = "less-slow-%s",
+    not(feature = "fast-%s")
+))]
+static %s: [[u8; 2]; %d] = [
+  ''' % (feature, feature, name, len(data)))
+
+  for i in xrange(len(data)):
+    data_file.write('[0x%02X, 0x%02X],\n' % data[i][item])
+
+  data_file.write('''];
+
+  ''')
+
+def static_u8_pair_table(name, data, feature):
   data_file.write('''#[cfg(feature = "%s")]
 static %s: [[u8; 2]; %d] = [
   ''' % (feature, name, len(data)))
 
   for i in xrange(len(data)):
-    data_file.write('[0x%02X, 0x%02X],\n' % data[i][item])
+    pair = data[i]
+    if not pair:
+      pair = (0, 0)
+    data_file.write('[0x%02X, 0x%02X],\n' % pair)
 
   data_file.write('''];
 
   ''')
 
 preferred = []
 
 dom = []
@@ -162,16 +192,56 @@ encoding_by_alias_code_page = {
   28601: "windows-847",
   50220: "ISO-2022-JP",
   50222: "ISO-2022-JP",
   51949: "EUC-JP",
   51936: "GBK",
   51949: "EUC-KR",
 }
 
+# The position in the index (0 is the first index entry,
+# i.e. byte value 0x80) that starts the longest run of
+# consecutive code points. Must not be in the first
+# quadrant. If the character to be encoded is not in this
+# run, the part of the index after the run is searched
+# forward. Then the part of the index from 32 to the start
+# of the run. The first quadrant is searched last.
+#
+# If there is no obviously most useful longest run,
+# the index here is just used to affect the search order.
+start_of_longest_run_in_single_byte = {
+  "IBM866": 96, # 0 would be longest, but we don't want to start in the first quadrant
+  "windows-874": 33,
+  "windows-1250": 92,
+  "windows-1251": 64,
+  "windows-1252": 32,
+  "windows-1253": 83,
+  "windows-1254": 95,
+  "windows-1255": 96,
+  "windows-1256": 65,
+  "windows-1257": 95, # not actually longest
+  "windows-1258": 95, # not actually longest
+  "macintosh": 106, # useless
+  "x-mac-cyrillic": 96,
+  "KOI8-R": 64, # not actually longest
+  "KOI8-U": 64, # not actually longest
+  "ISO-8859-2": 95, # not actually longest
+  "ISO-8859-3": 95, # not actually longest
+  "ISO-8859-4": 95, # not actually longest
+  "ISO-8859-5": 46,
+  "ISO-8859-6": 65,
+  "ISO-8859-7": 83,
+  "ISO-8859-8": 96,
+  "ISO-8859-10": 90, # not actually longest
+  "ISO-8859-13": 95, # not actually longest
+  "ISO-8859-14": 95,
+  "ISO-8859-15": 63,
+  "ISO-8859-16": 95, # not actually longest
+}
+
 #
 
 for group in data:
   if group["heading"] == "Legacy single-byte encodings":
     single_byte = group["encodings"]
   else:
     multi_byte.extend(group["encodings"])
   for encoding in group["encodings"]:
@@ -196,37 +266,56 @@ for name in preferred:
     longest_name_length = len(name)
     longest_name = name
 
 for label in labels:
   if len(label.label) > longest_label_length:
     longest_label_length = len(label.label)
     longest_label = label.label
 
+def longest_run_for_single_byte(name):
+  if name == u"ISO-8859-8-I":
+    name = u"ISO-8859-8"
+  index = indexes[name.lower()]
+  run_byte_offset = start_of_longest_run_in_single_byte[name]
+  run_bmp_offset = index[run_byte_offset]
+  previous_code_point = run_bmp_offset
+  run_length = 1
+  while True:
+    i = run_byte_offset + run_length
+    if i == len(index):
+      break
+    code_point = index[i]
+    if previous_code_point + 1 != code_point:
+      break
+    previous_code_point = code_point
+    run_length += 1
+  return (run_bmp_offset, run_byte_offset, run_length)
+
 def is_single_byte(name):
   for encoding in single_byte:
     if name == encoding["name"]:
       return True
   return False
 
 def read_non_generated(path):
   partially_generated_file = open(path, "r")
   full = partially_generated_file.read()
   partially_generated_file.close()
 
   generated_begin = "// BEGIN GENERATED CODE. PLEASE DO NOT EDIT."
   generated_end = "// END GENERATED CODE"
 
   generated_begin_index = full.find(generated_begin)
   if generated_begin_index < 0:
-    print "Can't find generated code start marker in %s. Exiting." % path
+    sys.stderr.write("Can't find generated code start marker in %s. Exiting.\n" % path)
     sys.exit(-1)
   generated_end_index = full.find(generated_end)
   if generated_end_index < 0:
-    print "Can't find generated code end marker in %s. Exiting." % path
+    sys.stderr.write("Can't find generated code end marker in %s. Exiting.\n" % path)
     sys.exit(-1)
 
   return (full[0:generated_begin_index + len(generated_begin)],
           full[generated_end_index:])
 
 (lib_rs_begin, lib_rs_end) = read_non_generated("src/lib.rs")
 
 label_file = open("src/lib.rs", "w")
@@ -237,17 +326,18 @@ label_file.write("""
 
 const LONGEST_LABEL_LENGTH: usize = %d; // %s
 
 """ % (longest_label_length, longest_label))
 
 for name in preferred:
   variant = None
   if is_single_byte(name):
-    variant = "SingleByte(data::%s_DATA)" % to_constant_name(u"iso-8859-8" if name == u"ISO-8859-8-I" else name)
+    (run_bmp_offset, run_byte_offset, run_length) = longest_run_for_single_byte(name)
+    variant = "SingleByte(&data::SINGLE_BYTE_DATA.%s, 0x%04X, %d, %d)" % (to_snake_name(u"iso-8859-8" if name == u"ISO-8859-8-I" else name), run_bmp_offset, run_byte_offset, run_length)
   else:
     variant = to_camel_name(name)
 
   docfile = open("doc/%s.txt" % name, "r")
   doctext = docfile.read()
   docfile.close()
 
   label_file.write('''/// The initializer for the [%s](static.%s.html) encoding.
@@ -318,45 +408,57 @@ label_test_file.write('''}
 ''')
 label_test_file.close()
 
 def null_to_zero(code_point):
   if not code_point:
     code_point = 0
   return code_point
 
+(data_rs_begin, data_rs_end) = read_non_generated("src/data.rs")
+
 data_file = open("src/data.rs", "w")
-data_file.write('''// Copyright 2015-2016 Mozilla Foundation. See the COPYRIGHT
-// file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
+data_file.write(data_rs_begin)
+data_file.write('''
 // Instead, please regenerate using generate-encoding-data.py
 
+#[repr(align(64))] // Align to cache lines
+pub struct SingleByteData {
 ''')
 
 # Single-byte
 
 for encoding in single_byte:
   name = encoding["name"]
   if name == u"ISO-8859-8-I":
     continue
 
-  data_file.write('''pub const %s_DATA: &'static [u16; 128] = &[
-''' % to_constant_name(name))
+  data_file.write('''    pub %s: [u16; 128],
+''' % to_snake_name(name))
+
+data_file.write('''}
+
+pub static SINGLE_BYTE_DATA: SingleByteData = SingleByteData {
+''')
+
+for encoding in single_byte:
+  name = encoding["name"]
+  if name == u"ISO-8859-8-I":
+    continue
+
+  data_file.write('''    %s: [
+''' % to_snake_name(name))
 
   for code_point in indexes[name.lower()]:
     data_file.write('0x%04X,\n' % null_to_zero(code_point))
 
-  data_file.write('''];
+  data_file.write('''],
+''')
+
+data_file.write('''};
 
 ''')
 
 # Big5
 
 index = indexes["big5"]
 
 astralness = []
@@ -369,17 +471,18 @@ for code_point in index[942:19782]:
   else:
     astralness.append(0)
     low_bits.append(0)
 
 # pad length to multiple of 32
 for j in xrange(32 - (len(astralness) % 32)):
   astralness.append(0)
 
-data_file.write('''static BIG5_ASTRALNESS: [u32; %d] = [
+data_file.write('''#[cfg_attr(feature = "cargo-clippy", allow(unreadable_literal))]
+static BIG5_ASTRALNESS: [u32; %d] = [
 ''' % (len(astralness) / 32))
 
 i = 0
 while i < len(astralness):
   accu = 0
   for j in xrange(32):
     accu |= astralness[i + j] << j
   data_file.write('0x%08X,\n' % accu)
@@ -403,18 +506,33 @@ for i in xrange(len(level1_hanzi_index))
   level1_hanzi_pairs.append((level1_hanzi_index[i], (hanzi_lead, hanzi_trail)))
 level1_hanzi_pairs.append((0x4E5A, (0xC8, 0x7B)))
 level1_hanzi_pairs.append((0x5202, (0xC8, 0x7D)))
 level1_hanzi_pairs.append((0x9FB0, (0xC8, 0xA1)))
 level1_hanzi_pairs.append((0x5188, (0xC8, 0xA2)))
 level1_hanzi_pairs.append((0x9FB1, (0xC8, 0xA3)))
 level1_hanzi_pairs.sort(key=lambda x: x[0])
 
-static_u16_table_from_indexable("BIG5_LEVEL1_HANZI_CODE_POINTS", level1_hanzi_pairs, 0, "less-slow-big5-hanzi-encode")
-static_u8_pair_table_from_indexable("BIG5_LEVEL1_HANZI_BYTES", level1_hanzi_pairs, 1, "less-slow-big5-hanzi-encode")
+static_u16_table_from_indexable("BIG5_LEVEL1_HANZI_CODE_POINTS", level1_hanzi_pairs, 0, "big5-hanzi-encode")
+static_u8_pair_table_from_indexable("BIG5_LEVEL1_HANZI_BYTES", level1_hanzi_pairs, 1, "big5-hanzi-encode")
+
+# Fast Unified Ideograph encode
+big5_unified_ideograph_bytes = [None] * (0x9FCC - 0x4E00)
+for row in xrange(0x7E - 0x20):
+  for column in xrange(157):
+    pointer = 5024 + column + (row * 157)
+    code_point = index[pointer]
+    if code_point and code_point >= 0x4E00 and code_point <= 0x9FCB:
+      unified_offset = code_point - 0x4E00
+      unified_lead = 0xA1 + row
+      unified_trail = (0x40 if column < 0x3F else 0x62) + column
+      if code_point == 0x5341 or code_point == 0x5345 or not big5_unified_ideograph_bytes[unified_offset]:
+        big5_unified_ideograph_bytes[unified_offset] = (unified_lead, unified_trail)
+
+static_u8_pair_table("BIG5_UNIFIED_IDEOGRAPH_BYTES", big5_unified_ideograph_bytes, "fast-big5-hanzi-encode")
 
 # JIS0208
 
 index = indexes["jis0208"]
 
 # JIS 0208 Level 1 Kanji
 static_u16_table("JIS0208_LEVEL1_KANJI", index[1410:4375])
 
@@ -545,18 +663,33 @@ level1_kanji_pairs = []
 for i in xrange(len(level1_kanji_index)):
   pointer = 1410 + i
   (lead, trail) = divmod(pointer, 188)
   lead += 0x81 if lead < 0x1F else 0xC1
   trail += 0x40 if trail < 0x3F else 0x41
   level1_kanji_pairs.append((level1_kanji_index[i], (lead, trail)))
 level1_kanji_pairs.sort(key=lambda x: x[0])
 
-static_u16_table_from_indexable("JIS0208_LEVEL1_KANJI_CODE_POINTS", level1_kanji_pairs, 0, "less-slow-kanji-encode")
-static_u8_pair_table_from_indexable("JIS0208_LEVEL1_KANJI_SHIFT_JIS_BYTES", level1_kanji_pairs, 1, "less-slow-kanji-encode")
+static_u16_table_from_indexable("JIS0208_LEVEL1_KANJI_CODE_POINTS", level1_kanji_pairs, 0, "kanji-encode")
+static_u8_pair_table_from_indexable("JIS0208_LEVEL1_KANJI_SHIFT_JIS_BYTES", level1_kanji_pairs, 1, "kanji-encode")
+
+# Fast encoder table for Kanji
+kanji_bytes = [None] * (0x9FA1 - 0x4E00)
+for pointer in xrange(len(index)):
+  code_point = index[pointer]
+  if code_point and code_point >= 0x4E00 and code_point <= 0x9FA0:
+    (lead, trail) = divmod(pointer, 188)
+    lead += 0x81 if lead < 0x1F else 0xC1
+    trail += 0x40 if trail < 0x3F else 0x41
+    # unset the high bit of lead if IBM Kanji
+    if pointer >= 8272:
+      lead = lead & 0x7F
+    kanji_bytes[code_point - 0x4E00] = (lead, trail)
+
+static_u8_pair_table("JIS0208_KANJI_BYTES", kanji_bytes, "fast-kanji-encode")
 
 # ISO-2022-JP half-width katakana
 
 # index is still jis0208
 half_width_index = indexes["iso-2022-jp-katakana"]
 
 data_file.write('''pub static ISO_2022_JP_HALF_WIDTH_TRAIL: [u8; %d] = [
 ''' % len(half_width_index))
@@ -723,16 +856,38 @@ for row in xrange(10):
       offsets.append(code_point)
     previous_code_point = code_point
 
 static_u16_table("KSX1001_OTHER_POINTERS", pointers)
 # Omit the last offset, because the end of the last line
 # is unmapped, so we don't want to look at it.
 static_u16_table("KSX1001_OTHER_UNSORTED_OFFSETS", offsets[:-1])
 
+# Fast Hangul and Hanja encode
+hangul_bytes = [None] * (0xD7A4 - 0xAC00)
+hanja_unified_bytes = [None] * (0x9F9D - 0x4E00)
+hanja_compatibility_bytes = [None] * (0xFA0C - 0xF900)
+for row in xrange(0x7D):
+  for column in xrange(190):
+    pointer = column + (row * 190)
+    code_point = index[pointer]
+    if code_point:
+      lead = 0x81 + row
+      trail = 0x41 + column
+      if code_point >= 0xAC00 and code_point < 0xD7A4:
+        hangul_bytes[code_point - 0xAC00] = (lead, trail)
+      elif code_point >= 0x4E00 and code_point < 0x9F9D:
+        hanja_unified_bytes[code_point - 0x4E00] = (lead, trail)
+      elif code_point >= 0xF900 and code_point < 0xFA0C:
+        hanja_compatibility_bytes[code_point - 0xF900] = (lead, trail)
+
+static_u8_pair_table("CP949_HANGUL_BYTES", hangul_bytes, "fast-hangul-encode")
+static_u8_pair_table("KSX1001_UNIFIED_HANJA_BYTES", hanja_unified_bytes, "fast-hanja-encode")
+static_u8_pair_table("KSX1001_COMPATIBILITY_HANJA_BYTES", hanja_compatibility_bytes, "fast-hanja-encode")
+
 # JIS 0212
 
 index = indexes["jis0212"]
 
 # JIS 0212 Kanji
 static_u16_table("JIS0212_KANJI", index[1410:7211])
 
 # JIS 0212 accented (all non-Kanji, non-range items)
@@ -922,512 +1077,33 @@ static_u16_table("GB18030_RANGE_OFFSETS"
 level1_hanzi_index = hanzi_index[:(94 * (0xD8 - 0xB0) - 5)]
 level1_hanzi_pairs = []
 for i in xrange(len(level1_hanzi_index)):
   hanzi_lead = (i / 94) + 0xB0
   hanzi_trail = (i % 94) + 0xA1
   level1_hanzi_pairs.append((level1_hanzi_index[i], (hanzi_lead, hanzi_trail)))
 level1_hanzi_pairs.sort(key=lambda x: x[0])
 
-static_u16_table_from_indexable("GB2312_LEVEL1_HANZI_CODE_POINTS", level1_hanzi_pairs, 0, "less-slow-gb-hanzi-encode")
-static_u8_pair_table_from_indexable("GB2312_LEVEL1_HANZI_BYTES", level1_hanzi_pairs, 1, "less-slow-gb-hanzi-encode")
-
-data_file.write('''#[inline(always)]
-fn map_with_ranges(haystack: &[u16], other: &[u16], needle: u16) -> u16 {
-    debug_assert_eq!(haystack.len(), other.len());
-    match haystack.binary_search(&needle) {
-        Ok(i) => other[i],
-        Err(i) => other[i - 1] + (needle - haystack[i - 1]),
-    }
-}
-
-#[inline(always)]
-fn map_with_unsorted_ranges(haystack: &[u16], other: &[u16], needle: u16) -> Option<u16> {
-    debug_assert_eq!(haystack.len() + 1, other.len());
-    for i in 0..haystack.len() {
-        let start = other[i];
-        let end = other[i + 1];
-        let length = end - start;
-        let offset = needle.wrapping_sub(haystack[i]);
-        if offset < length {
-            return Some(start + offset);
-        }
-    }
-    None
-}
-
-#[inline(always)]
-pub fn position(haystack: &[u16], needle: u16) -> Option<usize> {
-    haystack.iter().position(|&x| x == needle)
-}
-
-#[inline(always)]
-pub fn gb18030_range_decode(pointer: u16) -> u16 {
-    map_with_ranges(&GB18030_RANGE_POINTERS[..],
-                    &GB18030_RANGE_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn gb18030_range_encode(bmp: u16) -> usize {
-    if bmp == 0xE7C7 {
-        return 7457;
-    }
-    map_with_ranges(&GB18030_RANGE_OFFSETS[..], &GB18030_RANGE_POINTERS[..], bmp) as usize
-}
-
-#[inline(always)]
-pub fn gbk_top_ideograph_decode(pointer: u16) -> u16 {
-    map_with_ranges(&GBK_TOP_IDEOGRAPH_POINTERS[..],
-                    &GBK_TOP_IDEOGRAPH_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn gbk_top_ideograph_encode(bmp: u16) -> u16 {
-    map_with_ranges(&GBK_TOP_IDEOGRAPH_OFFSETS[..],
-                    &GBK_TOP_IDEOGRAPH_POINTERS[..],
-                    bmp)
-}
-
-#[inline(always)]
-pub fn gbk_left_ideograph_decode(pointer: u16) -> u16 {
-    map_with_ranges(&GBK_LEFT_IDEOGRAPH_POINTERS[..],
-                    &GBK_LEFT_IDEOGRAPH_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn gbk_left_ideograph_encode(bmp: u16) -> u16 {
-    map_with_ranges(&GBK_LEFT_IDEOGRAPH_OFFSETS[..],
-                    &GBK_LEFT_IDEOGRAPH_POINTERS[..],
-                    bmp)
-}
-
-#[inline(always)]
-pub fn cp949_top_hangul_decode(pointer: u16) -> u16 {
-    map_with_ranges(&CP949_TOP_HANGUL_POINTERS[..],
-                    &CP949_TOP_HANGUL_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn cp949_top_hangul_encode(bmp: u16) -> u16 {
-    map_with_ranges(&CP949_TOP_HANGUL_OFFSETS[..],
-                    &CP949_TOP_HANGUL_POINTERS[..],
-                    bmp)
-}
-
-#[inline(always)]
-pub fn cp949_left_hangul_decode(pointer: u16) -> u16 {
-    map_with_ranges(&CP949_LEFT_HANGUL_POINTERS[..],
-                    &CP949_LEFT_HANGUL_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn cp949_left_hangul_encode(bmp: u16) -> u16 {
-    map_with_ranges(&CP949_LEFT_HANGUL_OFFSETS[..],
-                    &CP949_LEFT_HANGUL_POINTERS[..],
-                    bmp)
-}
-
-#[inline(always)]
-pub fn gbk_other_decode(pointer: u16) -> u16 {
-    map_with_ranges(&GBK_OTHER_POINTERS[..GBK_OTHER_POINTERS.len() - 1],
-                    &GBK_OTHER_UNSORTED_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn gbk_other_encode(bmp: u16) -> Option<u16> {
-    map_with_unsorted_ranges(&GBK_OTHER_UNSORTED_OFFSETS[..],
-                             &GBK_OTHER_POINTERS[..],
-                             bmp)
-}
-
-#[inline(always)]
-pub fn gb2312_other_decode(pointer: u16) -> u16 {
-    map_with_ranges(&GB2312_OTHER_POINTERS[..GB2312_OTHER_POINTERS.len() - 1],
-                    &GB2312_OTHER_UNSORTED_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn gb2312_other_encode(bmp: u16) -> Option<u16> {
-    map_with_unsorted_ranges(&GB2312_OTHER_UNSORTED_OFFSETS[..],
-                             &GB2312_OTHER_POINTERS[..],
-                             bmp)
-}
-
-#[cfg(not(feature = "less-slow-gb-hanzi-encode"))]
-#[inline(always)]
-pub fn gb2312_level1_hanzi_encode(bmp: u16) -> Option<(u8, u8)> {
-    position(&GB2312_HANZI[..(94 * (0xD8 - 0xB0) - 5)], bmp).map(|hanzi_pointer| {
-        let hanzi_lead = (hanzi_pointer / 94) + 0xB0;
-        let hanzi_trail = (hanzi_pointer % 94) + 0xA1;
-        (hanzi_lead as u8, hanzi_trail as u8)
-    })
-}
-
-#[cfg(feature = "less-slow-gb-hanzi-encode")]
-#[inline(always)]
-pub fn gb2312_level1_hanzi_encode(bmp: u16) -> Option<(u8, u8)> {
-    match GB2312_LEVEL1_HANZI_CODE_POINTS.binary_search(&bmp) {
-        Ok(i) => {
-            let pair = &GB2312_LEVEL1_HANZI_BYTES[i];
-            Some((pair[0], pair[1]))
-        }
-        Err(_) => None,
-    }
-}
-
-#[inline(always)]
-pub fn gb2312_level2_hanzi_encode(bmp: u16) -> Option<usize> {
-    // TODO: optimize
-    position(&GB2312_HANZI[(94 * (0xD8 - 0xB0))..], bmp)
-}
-
-#[inline(always)]
-pub fn ksx1001_other_decode(pointer: u16) -> u16 {
-    map_with_ranges(&KSX1001_OTHER_POINTERS[..KSX1001_OTHER_POINTERS.len() - 1],
-                    &KSX1001_OTHER_UNSORTED_OFFSETS[..],
-                    pointer)
-}
-
-#[inline(always)]
-pub fn ksx1001_other_encode(bmp: u16) -> Option<u16> {
-    map_with_unsorted_ranges(&KSX1001_OTHER_UNSORTED_OFFSETS[..],
-                             &KSX1001_OTHER_POINTERS[..],
-                             bmp)
-}
-
-#[cfg(not(feature = "less-slow-kanji-encode"))]
-#[inline(always)]
-pub fn jis0208_level1_kanji_shift_jis_encode(bmp: u16) -> Option<(u8, u8)> {
-    position(&JIS0208_LEVEL1_KANJI[..], bmp).map(|kanji_pointer| {
-        let pointer = 1410 + kanji_pointer;
-        let lead = pointer / 188;
-        let lead_offset = if lead < 0x1F {
-            0x81
-        } else {
-            0xC1
-        };
-        let trail = pointer % 188;
-        let trail_offset = if trail < 0x3F {
-            0x40
-        } else {
-            0x41
-        };
-        ((lead + lead_offset) as u8, (trail + trail_offset) as u8)
-    })
-}
-
-#[cfg(feature = "less-slow-kanji-encode")]
-#[inline(always)]
-pub fn jis0208_level1_kanji_shift_jis_encode(bmp: u16) -> Option<(u8, u8)> {
-    match JIS0208_LEVEL1_KANJI_CODE_POINTS.binary_search(&bmp) {
-        Ok(i) => {
-            let pair = &JIS0208_LEVEL1_KANJI_SHIFT_JIS_BYTES[i];
-            Some((pair[0], pair[1]))
-        }
-        Err(_) => None,
-    }
-}
-
-#[cfg(not(feature = "less-slow-kanji-encode"))]
-#[inline(always)]
-pub fn jis0208_level1_kanji_euc_jp_encode(bmp: u16) -> Option<(u8, u8)> {
-    position(&JIS0208_LEVEL1_KANJI[..], bmp).map(|kanji_pointer| {
-        let lead = (kanji_pointer / 94) + 0xB0;
-        let trail = (kanji_pointer % 94) + 0xA1;
-        (lead as u8, trail as u8)
-    })
-}
-
-#[cfg(feature = "less-slow-kanji-encode")]
-#[inline(always)]
-pub fn jis0208_level1_kanji_euc_jp_encode(bmp: u16) -> Option<(u8, u8)> {
-    jis0208_level1_kanji_shift_jis_encode(bmp).map(|(shift_jis_lead, shift_jis_trail)| {
-        let mut lead = shift_jis_lead as usize;
-        if shift_jis_lead >= 0xA0 {
-            lead -= 0xC1 - 0x81;
-        }
-        // The next line would overflow u8. Letting it go over allows us to
-        // subtract fewer times.
-        lead <<= 1;
-        // Bring it back to u8 range
-        lead -= 0x61;
-        let trail = if shift_jis_trail >= 0x9F {
-            lead += 1;
-            shift_jis_trail + (0xA1 - 0x9F)
-        } else if shift_jis_trail < 0x7F {
-            shift_jis_trail + (0xA1 - 0x40)
-        } else {
-            shift_jis_trail + (0xA1 - 0x41)
-        };
-        (lead as u8, trail)
-    })
-}
+static_u16_table_from_indexable("GB2312_LEVEL1_HANZI_CODE_POINTS", level1_hanzi_pairs, 0, "gb-hanzi-encode")
+static_u8_pair_table_from_indexable("GB2312_LEVEL1_HANZI_BYTES", level1_hanzi_pairs, 1, "gb-hanzi-encode")
 
-#[cfg(not(feature = "less-slow-kanji-encode"))]
-#[inline(always)]
-pub fn jis0208_level1_kanji_iso_2022_jp_encode(bmp: u16) -> Option<(u8, u8)> {
-    position(&JIS0208_LEVEL1_KANJI[..], bmp).map(|kanji_pointer| {
-        let lead = (kanji_pointer / 94) + (0xB0 - 0x80);
-        let trail = (kanji_pointer % 94) + 0x21;
-        (lead as u8, trail as u8)
-    })
-}
-
-#[cfg(feature = "less-slow-kanji-encode")]
-#[inline(always)]
-pub fn jis0208_level1_kanji_iso_2022_jp_encode(bmp: u16) -> Option<(u8, u8)> {
-    jis0208_level1_kanji_shift_jis_encode(bmp).map(|(shift_jis_lead, shift_jis_trail)| {
-        let mut lead = shift_jis_lead as usize;
-        if shift_jis_lead >= 0xA0 {
-            lead -= 0xC1 - 0x81;
-        }
-        // The next line would overflow u8. Letting it go over allows us to
-        // subtract fewer times.
-        lead <<= 1;
-        // Bring it back to u8 range
-        lead -= 0xE1;
-        let trail = if shift_jis_trail >= 0x9F {
-            lead += 1;
-            shift_jis_trail - (0x9F - 0x21)
-        } else if shift_jis_trail < 0x7F {
-            shift_jis_trail - (0x40 - 0x21)
-        } else {
-            shift_jis_trail - (0x41 - 0x21)
-        };
-        (lead as u8, trail)
-    })
-}
-
-#[inline(always)]
-pub fn jis0208_level2_and_additional_kanji_encode(bmp: u16) -> Option<usize> {
-    // TODO: optimize
-    position(&JIS0208_LEVEL2_AND_ADDITIONAL_KANJI[..], bmp)
-}
-
-pub fn jis0208_symbol_decode(pointer: usize) -> Option<u16> {
-    let mut i = 0;
-    while i < JIS0208_SYMBOL_TRIPLES.len() {
-        let start = JIS0208_SYMBOL_TRIPLES[i] as usize;
-        let length = JIS0208_SYMBOL_TRIPLES[i + 1] as usize;
-        let pointer_minus_start = pointer.wrapping_sub(start);
-        if pointer_minus_start < length {
-            let offset = JIS0208_SYMBOL_TRIPLES[i + 2] as usize;
-            return Some(JIS0208_SYMBOLS[pointer_minus_start + offset]);
-        }
-        i += 3;
-    }
-    None
-}
-
-/// Prefers Shift_JIS pointers for the three symbols that are in both ranges.
-#[inline(always)]
-pub fn jis0208_symbol_encode(bmp: u16) -> Option<usize> {
-    let mut i = 0;
-    while i < JIS0208_SYMBOL_TRIPLES.len() {
-        let pointer_start = JIS0208_SYMBOL_TRIPLES[i] as usize;
-        let length = JIS0208_SYMBOL_TRIPLES[i + 1] as usize;
-        let symbol_start = JIS0208_SYMBOL_TRIPLES[i + 2] as usize;
-        let symbol_end = symbol_start + length;
-        let mut symbol_pos = symbol_start;
-        while symbol_pos < symbol_end {
-            if JIS0208_SYMBOLS[symbol_pos] == bmp {
-                return Some(symbol_pos - symbol_start + pointer_start);
-            }
-            symbol_pos += 1;
-        }
-        i += 3;
-    }
-    None
-}
-
-#[inline(always)]
-pub fn ibm_symbol_encode(bmp: u16) -> Option<usize> {
-    position(&JIS0208_SYMBOLS[IBM_SYMBOL_START..IBM_SYMBOL_END], bmp)
-        .map(|x| x + IBM_SYMBOL_POINTER_START)
-}
-
-#[inline(always)]
-pub fn jis0208_range_decode(pointer: usize) -> Option<u16> {
-    let mut i = 0;
-    while i < JIS0208_RANGE_TRIPLES.len() {
-        let start = JIS0208_RANGE_TRIPLES[i] as usize;
-        let length = JIS0208_RANGE_TRIPLES[i + 1] as usize;
-        let pointer_minus_start = pointer.wrapping_sub(start);
-        if pointer_minus_start < length {
-            let offset = JIS0208_RANGE_TRIPLES[i + 2] as usize;
-            return Some((pointer_minus_start + offset) as u16);
-        }
-        i += 3;
-    }
-    None
-}
-
-#[inline(always)]
-pub fn jis0208_range_encode(bmp: u16) -> Option<usize> {
-    let mut i = 0;
-    while i < JIS0208_RANGE_TRIPLES.len() {
-        let start = JIS0208_RANGE_TRIPLES[i + 2] as usize;
-        let length = JIS0208_RANGE_TRIPLES[i + 1] as usize;
-        let bmp_minus_start = (bmp as usize).wrapping_sub(start);
-        if bmp_minus_start < length {
-            let offset = JIS0208_RANGE_TRIPLES[i] as usize;
-            return Some(bmp_minus_start + offset);
-        }
-        i += 3;
-    }
-    None
-}
+# Fast Hanzi encoder table
+hanzi_bytes = [None] * (0x9FA7 - 0x4E00)
+for row in xrange(126):
+  for column in xrange(190):
+    pointer = column + (row * 190)
+    code_point = index[pointer]
+    if code_point and code_point >= 0x4E00 and code_point <= 0x9FA6:
+      hanzi_lead = 0x81 + row
+      hanzi_trail = column + (0x40 if column < 0x3F else 0x41)
+      hanzi_bytes[code_point - 0x4E00] = (hanzi_lead, hanzi_trail)
 
-pub fn jis0212_accented_decode(pointer: usize) -> Option<u16> {
-    let mut i = 0;
-    while i < JIS0212_ACCENTED_TRIPLES.len() {
-        let start = JIS0212_ACCENTED_TRIPLES[i] as usize;
-        let length = JIS0212_ACCENTED_TRIPLES[i + 1] as usize;
-        let pointer_minus_start = pointer.wrapping_sub(start);
-        if pointer_minus_start < length {
-            let offset = JIS0212_ACCENTED_TRIPLES[i + 2] as usize;
-            let candidate = JIS0212_ACCENTED[pointer_minus_start + offset];
-            if candidate == 0 {
-                return None;
-            }
-            return Some(candidate);
-        }
-        i += 3;
-    }
-    None
-}
-
-#[inline(always)]
-pub fn big5_is_astral(rebased_pointer: usize) -> bool {
-    (BIG5_ASTRALNESS[rebased_pointer >> 5] & (1 << (rebased_pointer & 0x1F))) != 0
-}
-
-#[inline(always)]
-pub fn big5_low_bits(rebased_pointer: usize) -> u16 {
-    if rebased_pointer < BIG5_LOW_BITS.len() {
-        BIG5_LOW_BITS[rebased_pointer]
-    } else {
-        0
-    }
-}
-
-#[inline(always)]
-pub fn big5_astral_encode(low_bits: u16) -> Option<usize> {
-    match low_bits {
-        0x00CC => Some(11205 - 942),
-        0x008A => Some(11207 - 942),
-        0x7607 => Some(11213 - 942),
-        _ => {
-            let mut i = 18997 - 942;
-            while i < BIG5_LOW_BITS.len() - 1 {
-                if BIG5_LOW_BITS[i] == low_bits && big5_is_astral(i) {
-                    return Some(i);
-                }
-                i += 1;
-            }
-            None
-        }
-    }
-}
+static_u8_pair_table("GBK_HANZI_BYTES", hanzi_bytes, "fast-gb-hanzi-encode")
 
-#[cfg(not(feature = "less-slow-big5-hanzi-encode"))]
-#[inline(always)]
-pub fn big5_level1_hanzi_encode(bmp: u16) -> Option<(u8, u8)> {
-    if super::in_inclusive_range16(bmp, 0x4E00, 0x9FB1) {
-        if let Some(hanzi_pointer) = position(&BIG5_LOW_BITS[(5495 - 942)..(10951 - 942)], bmp) {
-            let lead = hanzi_pointer / 157 + 0xA4;
-            let remainder = hanzi_pointer % 157;
-            let trail = if remainder < 0x3F {
-                remainder + 0x40
-            } else {
-                remainder + 0x62
-            };
-            return Some((lead as u8, trail as u8));
-        }
-        match bmp {
-            0x4E5A => {
-                return Some((0xC8, 0x7B));
-            }
-            0x5202 => {
-                return Some((0xC8, 0x7D));
-            }
-            0x9FB0 => {
-                return Some((0xC8, 0xA1));
-            }
-            0x5188 => {
-                return Some((0xC8, 0xA2));
-            }
-            0x9FB1 => {
-                return Some((0xC8, 0xA3));
-            }
-            _ => {
-                return None;
-            }
-        }
-    }
-    None
-}
-
-#[cfg(feature = "less-slow-big5-hanzi-encode")]
-#[inline(always)]
-pub fn big5_level1_hanzi_encode(bmp: u16) -> Option<(u8, u8)> {
-    if super::in_inclusive_range16(bmp, 0x4E00, 0x9FB1) {
-        match BIG5_LEVEL1_HANZI_CODE_POINTS.binary_search(&bmp) {
-            Ok(i) => {
-                let pair = &BIG5_LEVEL1_HANZI_BYTES[i];
-                Some((pair[0], pair[1]))
-            }
-            Err(_) => None,
-        }
-    } else {
-        None
-    }
-}
-
-#[inline(always)]
-pub fn big5_box_encode(bmp: u16) -> Option<usize> {
-    position(&BIG5_LOW_BITS[(18963 - 942)..(18992 - 942)], bmp).map(|x| x + 18963)
-}
-
-#[inline(always)]
-pub fn big5_other_encode(bmp: u16) -> Option<usize> {
-    if 0x4491 == bmp {
-        return Some(11209);
-    }
-    if let Some(pos) = position(&BIG5_LOW_BITS[(5024 - 942)..(5466 - 942)], bmp) {
-        return Some(pos + 5024);
-    }
-    if let Some(pos) = position(&BIG5_LOW_BITS[(10896 - 942)..(11205 - 942)], bmp) {
-        return Some(pos + 10896);
-    }
-    if let Some(pos) = position(&BIG5_LOW_BITS[(11254 - 942)..(18963 - 942)], bmp) {
-        return Some(pos + 11254);
-    }
-    let mut i = 18996 - 942;
-    while i < BIG5_LOW_BITS.len() {
-        if BIG5_LOW_BITS[i] == bmp && !big5_is_astral(i) {
-            return Some(i + 942);
-        }
-        i += 1;
-    }
-    None
-}
-
-#[inline(always)]
-pub fn mul_94(lead: u8) -> usize {
-    lead as usize * 94
-}
-''')
+data_file.write(data_rs_end)
 
 data_file.close()
 
 # Variant
 
 variant_file = open("src/variant.rs", "w")
 variant_file.write('''// Copyright 2015-2016 Mozilla Foundation. See the COPYRIGHT
 // file at the top-level directory of this distribution.
@@ -1563,57 +1239,64 @@ write_variant_method("encode_from_utf16_
 write_variant_method("encode_from_utf8_raw", True, [("src", "&str"),
                            ("dst", "&mut [u8]"),
                            ("last", "bool")], "(EncoderResult, usize, usize)", encoder_variants, [], "Encoder")
 
 
 variant_file.write('''}
 
 pub enum VariantEncoding {
-    SingleByte(&'static [u16; 128]),''')
+    SingleByte(&'static [u16; 128], u16, u8, u8),''')
 
 for encoding in multi_byte:
   variant_file.write("%s,\n" % to_camel_name(encoding["name"]))
 
 variant_file.write('''}
 
 impl VariantEncoding {
     pub fn new_variant_decoder(&self) -> VariantDecoder {
         match *self {
-            VariantEncoding::SingleByte(table) => SingleByteDecoder::new(table),
+            VariantEncoding::SingleByte(table, _, _, _) => SingleByteDecoder::new(table),
             VariantEncoding::Utf8 => Utf8Decoder::new(),
             VariantEncoding::Gbk | VariantEncoding::Gb18030 => Gb18030Decoder::new(),
             VariantEncoding::Big5 => Big5Decoder::new(),
             VariantEncoding::EucJp => EucJpDecoder::new(),
             VariantEncoding::Iso2022Jp => Iso2022JpDecoder::new(),
             VariantEncoding::ShiftJis => ShiftJisDecoder::new(),
             VariantEncoding::EucKr => EucKrDecoder::new(),
             VariantEncoding::Replacement => ReplacementDecoder::new(),
             VariantEncoding::UserDefined => UserDefinedDecoder::new(),
             VariantEncoding::Utf16Be => Utf16Decoder::new(true),
             VariantEncoding::Utf16Le => Utf16Decoder::new(false),
         }
     }
 
     pub fn new_encoder(&self, encoding: &'static Encoding) -> Encoder {
         match *self {
-            VariantEncoding::SingleByte(table) => SingleByteEncoder::new(encoding, table),
+            VariantEncoding::SingleByte(table, run_bmp_offset, run_byte_offset, run_length) => SingleByteEncoder::new(encoding, table, run_bmp_offset, run_byte_offset, run_length),
             VariantEncoding::Utf8 => Utf8Encoder::new(encoding),
             VariantEncoding::Gbk => Gb18030Encoder::new(encoding, false),
             VariantEncoding::Gb18030 => Gb18030Encoder::new(encoding, true),
             VariantEncoding::Big5 => Big5Encoder::new(encoding),
             VariantEncoding::EucJp => EucJpEncoder::new(encoding),
             VariantEncoding::Iso2022Jp => Iso2022JpEncoder::new(encoding),
             VariantEncoding::ShiftJis => ShiftJisEncoder::new(encoding),
             VariantEncoding::EucKr => EucKrEncoder::new(encoding),
             VariantEncoding::UserDefined => UserDefinedEncoder::new(encoding),
             VariantEncoding::Utf16Be | VariantEncoding::Replacement |
             VariantEncoding::Utf16Le => unreachable!(),
         }
     }
+
+    pub fn is_single_byte(&self) -> bool {
+        match *self {
+            VariantEncoding::SingleByte(_, _, _, _) | VariantEncoding::UserDefined => true,
+            _ => false,
+        }
+    }
 }
 ''')
 
 variant_file.close()
 
 (ffi_rs_begin, ffi_rs_end) = read_non_generated("../encoding_c/src/lib.rs")
 
 ffi_file = open("../encoding_c/src/lib.rs", "w")
@@ -1648,30 +1331,30 @@ single_byte_file.write("""
     #[test]
     fn test_single_byte_decode() {""")
 
 for name in preferred:
   if name == u"ISO-8859-8-I":
     continue;
   if is_single_byte(name):
     single_byte_file.write("""
-        decode_single_byte(%s, %s_DATA);""" % (to_constant_name(name), to_constant_name(name)))
+        decode_single_byte(%s, &data::SINGLE_BYTE_DATA.%s);""" % (to_constant_name(name), to_snake_name(name)))
 
 single_byte_file.write("""
     }
 
     #[test]
     fn test_single_byte_encode() {""")
 
 for name in preferred:
   if name == u"ISO-8859-8-I":
     continue;
   if is_single_byte(name):
     single_byte_file.write("""
-        encode_single_byte(%s, %s_DATA);""" % (to_constant_name(name), to_constant_name(name)))
+        encode_single_byte(%s, &data::SINGLE_BYTE_DATA.%s);""" % (to_constant_name(name), to_snake_name(name)))
 
 
 single_byte_file.write("""
     }
 """)
 
 single_byte_file.write(single_byte_rs_end)
 single_byte_file.close()
@@ -1743,35 +1426,58 @@ static_file.close()
 (utf_8_rs_begin, utf_8_rs_end) = read_non_generated("src/utf_8.rs")
 
 utf_8_file = open("src/utf_8.rs", "w")
 
 utf_8_file.write(utf_8_rs_begin)
 utf_8_file.write("""
 // Instead, please regenerate using generate-encoding-data.py
 
-/// Bit is 1 if the trail is invalid.
-pub static UTF8_TRAIL_INVALID: [u8; 256] = [""")
+pub static UTF8_DATA: Utf8Data = Utf8Data {
+    table: [
+""")
 
 for i in range(256):
-  combined = 0
+  combined = (1 << 2) # invalid lead
   if i < 0x80 or i > 0xBF:
-    combined |= (1 << 3)
+    combined |= (1 << 3) # normal trail
   if i < 0xA0 or i > 0xBF:
-    combined |= (1 << 4)
+    combined |= (1 << 4) # three-byte special lower bound
   if i < 0x80 or i > 0x9F:
-    combined |= (1 << 5)
+    combined |= (1 << 5) # three-byte special upper bound
   if i < 0x90 or i > 0xBF:
-    combined |= (1 << 6)
+    combined |= (1 << 6) # four-byte special lower bound
   if i < 0x80 or i > 0x8F:
-    combined |= (1 << 7)
+    combined |= (1 << 7) # four-byte special upper bound
   utf_8_file.write("%d," % combined)
 
+for i in range(128, 256):
+  lane = (1 << 2) # invalid lead
+  if i >= 0xC2 and i <= 0xDF:
+    lane = (1 << 3) # normal trail
+  elif i == 0xE0:
+    lane = (1 << 4) # three-byte special lower bound
+  elif i >= 0xE1 and i <= 0xEC:
+    lane = (1 << 3) # normal trail
+  elif i == 0xED:
+    lane = (1 << 5) # three-byte special upper bound
+  elif i >= 0xEE and i <= 0xEF:
+    lane = (1 << 3) # normal trail
+  elif i == 0xF0:
+    lane = (1 << 6) # four-byte special lower bound
+  elif i >= 0xF1 and i <= 0xF3:
+    lane = (1 << 3) # normal trail
+  elif i == 0xF4:
+    lane = (1 << 7) # four-byte special upper bound
+  utf_8_file.write("%d," % lane)
+
 utf_8_file.write("""
-];
+    ],
+};
+
 """)
 
 utf_8_file.write(utf_8_rs_end)
 utf_8_file.close()
 
 # Unit tests
 
 TEST_HEADER = '''Any copyright to the test code below this comment is dedicated to the
--- a/third_party/rust/encoding_rs/src/ascii.rs
+++ b/third_party/rust/encoding_rs/src/ascii.rs
@@ -16,285 +16,336 @@
 // numbers of the actual ARMv7 CPU I have access to, because (thermal?)
 // throttling kept interfering. Since Raspberry Pi 3 (ARMv8 core but running
 // ARMv7 code) produced reproducible performance numbers, that's the ARM
 // computer that this code ended up being optimized for in the ALU case.
 // Less popular CPU architectures simply get the approach that was chosen based
 // on Raspberry Pi 3 measurements. The UTF-16 and UTF-8 ALU cases take
 // different approaches based on benchmarking on Raspberry Pi 3.
 
-#[cfg(
-    all(
-        feature = "simd-accel",
-        any(
-            target_feature = "sse2",
-            all(target_endian = "little", target_arch = "aarch64"),
-            all(target_endian = "little", target_feature = "neon")
-        )
+#[cfg(all(
+    feature = "simd-accel",
+    any(
+        target_feature = "sse2",
+        all(target_endian = "little", target_arch = "aarch64"),
+        all(target_endian = "little", target_feature = "neon")
     )
-)]
+))]
 use simd_funcs::*;
 
+cfg_if!{
+    if #[cfg(feature = "simd-accel")] {
+        #[allow(unused_imports)]
+        use ::std::intrinsics::unlikely;
+        #[allow(unused_imports)]
+        use ::std::intrinsics::likely;
+    } else {
+        #[allow(dead_code)]
+        #[inline(always)]
+        // Unsafe to match the intrinsic, which is needlessly unsafe.
+        unsafe fn unlikely(b: bool) -> bool {
+            b
+        }
+        #[allow(dead_code)]
+        #[inline(always)]
+        // Unsafe to match the intrinsic, which is needlessly unsafe.
+        unsafe fn likely(b: bool) -> bool {
+            b
+        }
+    }
+}
+
 // `as` truncates, so works on 32-bit, too.
 #[allow(dead_code)]
-pub const ASCII_MASK: usize = 0x80808080_80808080u64 as usize;
+pub const ASCII_MASK: usize = 0x8080_8080_8080_8080u64 as usize;
 
 // `as` truncates, so works on 32-bit, too.
 #[allow(dead_code)]
-pub const BASIC_LATIN_MASK: usize = 0xFF80FF80_FF80FF80u64 as usize;
+pub const BASIC_LATIN_MASK: usize = 0xFF80_FF80_FF80_FF80u64 as usize;
 
 #[allow(unused_macros)]
 macro_rules! ascii_naive {
     ($name:ident, $src_unit:ty, $dst_unit:ty) => {
         #[inline(always)]
         pub unsafe fn $name(
             src: *const $src_unit,
             dst: *mut $dst_unit,
             len: usize,
         ) -> Option<($src_unit, usize)> {
             // Yes, manually omitting the bound check here matters
             // a lot for perf.
             for i in 0..len {
-                let code_unit = *(src.offset(i as isize));
+                let code_unit = *(src.add(i));
                 if code_unit > 127 {
                     return Some((code_unit, i));
                 }
-                *(dst.offset(i as isize)) = code_unit as $dst_unit;
+                *(dst.add(i)) = code_unit as $dst_unit;
             }
             return None;
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! ascii_alu {
     ($name:ident,
      $src_unit:ty,
      $dst_unit:ty,
-     $stride_fn:ident) => (
-    #[cfg_attr(feature = "cargo-clippy", allow(never_loop))]
-    #[inline(always)]
-    pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) -> Option<($src_unit, usize)> {
-        let mut offset = 0usize;
-        // This loop is only broken out of as a `goto` forward
-        loop {
-            let mut until_alignment = {
-                // Check if the other unit aligns if we move the narrower unit
-                // to alignment.
-                //               if ::std::mem::size_of::<$src_unit>() == ::std::mem::size_of::<$dst_unit>() {
-                // ascii_to_ascii
-                let src_alignment = (src as usize) & ALU_ALIGNMENT_MASK;
-                let dst_alignment = (dst as usize) & ALU_ALIGNMENT_MASK;
-                if src_alignment != dst_alignment {
-                    break;
-                }
-                (ALU_ALIGNMENT - src_alignment) & ALU_ALIGNMENT_MASK
-                //               } else if ::std::mem::size_of::<$src_unit>() < ::std::mem::size_of::<$dst_unit>() {
-                // ascii_to_basic_latin
-                //                   let src_until_alignment = (ALIGNMENT - ((src as usize) & ALIGNMENT_MASK)) & ALIGNMENT_MASK;
-                //                   if (dst.offset(src_until_alignment as isize) as usize) & ALIGNMENT_MASK != 0 {
-                //                       break;
-                //                   }
-                //                   src_until_alignment
-                //               } else {
-                // basic_latin_to_ascii
-                //                   let dst_until_alignment = (ALIGNMENT - ((dst as usize) & ALIGNMENT_MASK)) & ALIGNMENT_MASK;
-                //                   if (src.offset(dst_until_alignment as isize) as usize) & ALIGNMENT_MASK != 0 {
-                //                       break;
-                //                   }
-                //                   dst_until_alignment
-                //               }
-            };
-            if until_alignment + ALU_STRIDE_SIZE <= len {
-                // Moving pointers to alignment seems to be a pessimization on
-                // x86_64 for operations that have UTF-16 as the internal
-                // Unicode representation. However, since it seems to be a win
-                // on ARM (tested ARMv7 code running on ARMv8 [rpi3]), except
-                // mixed results when encoding from UTF-16 and since x86 and
-                // x86_64 should be using SSE2 in due course, keeping the move
-                // to alignment here. It would be good to test on more ARM CPUs
-                // and on real MIPS and POWER hardware.
-                while until_alignment != 0 {
-                    let code_unit = *(src.offset(offset as isize));
-                    if code_unit > 127 {
-                        return Some((code_unit, offset));
-                    }
-                    *(dst.offset(offset as isize)) = code_unit as $dst_unit;
-                    offset += 1;
-                    until_alignment -= 1;
-                }
-                let len_minus_stride = len - ALU_STRIDE_SIZE;
-                loop {
-                    if let Some(num_ascii) = $stride_fn(src.offset(offset as isize) as *const usize,
-                                   dst.offset(offset as isize) as *mut usize) {
-                        offset += num_ascii;
-                        return Some((*(src.offset(offset as isize)), offset));
-                    }
-                    offset += ALU_STRIDE_SIZE;
-                    if offset > len_minus_stride {
+     $stride_fn:ident) => {
+        #[cfg_attr(
+            feature = "cargo-clippy",
+            allow(never_loop, cast_ptr_alignment)
+        )]
+        #[inline(always)]
+        pub unsafe fn $name(
+            src: *const $src_unit,
+            dst: *mut $dst_unit,
+            len: usize,
+        ) -> Option<($src_unit, usize)> {
+            let mut offset = 0usize;
+            // This loop is only broken out of as a `goto` forward
+            loop {
+                let mut until_alignment = {
+                    // Check if the other unit aligns if we move the narrower unit
+                    // to alignment.
+                    //               if ::std::mem::size_of::<$src_unit>() == ::std::mem::size_of::<$dst_unit>() {
+                    // ascii_to_ascii
+                    let src_alignment = (src as usize) & ALU_ALIGNMENT_MASK;
+                    let dst_alignment = (dst as usize) & ALU_ALIGNMENT_MASK;
+                    if src_alignment != dst_alignment {
                         break;
                     }
+                    (ALU_ALIGNMENT - src_alignment) & ALU_ALIGNMENT_MASK
+                    //               } else if ::std::mem::size_of::<$src_unit>() < ::std::mem::size_of::<$dst_unit>() {
+                    // ascii_to_basic_latin
+                    //                   let src_until_alignment = (ALIGNMENT - ((src as usize) & ALIGNMENT_MASK)) & ALIGNMENT_MASK;
+                    //                   if (dst.add(src_until_alignment) as usize) & ALIGNMENT_MASK != 0 {
+                    //                       break;
+                    //                   }
+                    //                   src_until_alignment
+                    //               } else {
+                    // basic_latin_to_ascii
+                    //                   let dst_until_alignment = (ALIGNMENT - ((dst as usize) & ALIGNMENT_MASK)) & ALIGNMENT_MASK;
+                    //                   if (src.add(dst_until_alignment) as usize) & ALIGNMENT_MASK != 0 {
+                    //                       break;
+                    //                   }
+                    //                   dst_until_alignment
+                    //               }
+                };
+                if until_alignment + ALU_STRIDE_SIZE <= len {
+                    // Moving pointers to alignment seems to be a pessimization on
+                    // x86_64 for operations that have UTF-16 as the internal
+                    // Unicode representation. However, since it seems to be a win
+                    // on ARM (tested ARMv7 code running on ARMv8 [rpi3]), except
+                    // mixed results when encoding from UTF-16 and since x86 and
+                    // x86_64 should be using SSE2 in due course, keeping the move
+                    // to alignment here. It would be good to test on more ARM CPUs
+                    // and on real MIPS and POWER hardware.
+                    while until_alignment != 0 {
+                        let code_unit = *(src.add(offset));
+                        if code_unit > 127 {
+                            return Some((code_unit, offset));
+                        }
+                        *(dst.add(offset)) = code_unit as $dst_unit;
+                        offset += 1;
+                        until_alignment -= 1;
+                    }
+                    let len_minus_stride = len - ALU_STRIDE_SIZE;
+                    loop {
+                        if let Some(num_ascii) = $stride_fn(
+                            src.add(offset) as *const usize,
+                            dst.add(offset) as *mut usize,
+                        ) {
+                            offset += num_ascii;
+                            return Some((*(src.add(offset)), offset));
+                        }
+                        offset += ALU_STRIDE_SIZE;
+                        if offset > len_minus_stride {
+                            break;
+                        }
+                    }
                 }
+                break;
             }
-            break;
+            while offset < len {
+                let code_unit = *(src.add(offset));
+                if code_unit > 127 {
+                    return Some((code_unit, offset));
+                }
+                *(dst.add(offset)) = code_unit as $dst_unit;
+                offset += 1;
+            }
+            None
         }
-        while offset < len {
-            let code_unit = *(src.offset(offset as isize));
-            if code_unit > 127 {
-                return Some((code_unit, offset));
-            }
-            *(dst.offset(offset as isize)) = code_unit as $dst_unit;
-            offset += 1;
-        }
-        None
-    });
+    };
 }
 
 #[allow(unused_macros)]
 macro_rules! basic_latin_alu {
     ($name:ident,
      $src_unit:ty,
      $dst_unit:ty,
-     $stride_fn:ident) => (
-    #[cfg_attr(feature = "cargo-clippy", allow(never_loop))]
-    #[inline(always)]
-    pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) -> Option<($src_unit, usize)> {
-        let mut offset = 0usize;
-        // This loop is only broken out of as a `goto` forward
-        loop {
-            let mut until_alignment = {
-                // Check if the other unit aligns if we move the narrower unit
-                // to alignment.
-                //               if ::std::mem::size_of::<$src_unit>() == ::std::mem::size_of::<$dst_unit>() {
-                // ascii_to_ascii
-                //                   let src_alignment = (src as usize) & ALIGNMENT_MASK;
-                //                   let dst_alignment = (dst as usize) & ALIGNMENT_MASK;
-                //                   if src_alignment != dst_alignment {
-                //                       break;
-                //                   }
-                //                   (ALIGNMENT - src_alignment) & ALIGNMENT_MASK
-                //               } else
-                if ::std::mem::size_of::<$src_unit>() < ::std::mem::size_of::<$dst_unit>() {
-                    // ascii_to_basic_latin
-                    let src_until_alignment = (ALU_ALIGNMENT - ((src as usize) & ALU_ALIGNMENT_MASK)) & ALU_ALIGNMENT_MASK;
-                    if (dst.offset(src_until_alignment as isize) as usize) & ALU_ALIGNMENT_MASK != 0 {
-                        break;
+     $stride_fn:ident) => {
+        #[cfg_attr(
+            feature = "cargo-clippy",
+            allow(
+                never_loop,
+                cast_ptr_alignment,
+                cast_lossless
+            )
+        )]
+        #[inline(always)]
+        pub unsafe fn $name(
+            src: *const $src_unit,
+            dst: *mut $dst_unit,
+            len: usize,
+        ) -> Option<($src_unit, usize)> {
+            let mut offset = 0usize;
+            // This loop is only broken out of as a `goto` forward
+            loop {
+                let mut until_alignment = {
+                    // Check if the other unit aligns if we move the narrower unit
+                    // to alignment.
+                    //               if ::std::mem::size_of::<$src_unit>() == ::std::mem::size_of::<$dst_unit>() {
+                    // ascii_to_ascii
+                    //                   let src_alignment = (src as usize) & ALIGNMENT_MASK;
+                    //                   let dst_alignment = (dst as usize) & ALIGNMENT_MASK;
+                    //                   if src_alignment != dst_alignment {
+                    //                       break;
+                    //                   }
+                    //                   (ALIGNMENT - src_alignment) & ALIGNMENT_MASK
+                    //               } else
+                    if ::std::mem::size_of::<$src_unit>() < ::std::mem::size_of::<$dst_unit>() {
+                        // ascii_to_basic_latin
+                        let src_until_alignment = (ALU_ALIGNMENT
+                            - ((src as usize) & ALU_ALIGNMENT_MASK))
+                            & ALU_ALIGNMENT_MASK;
+                        if (dst.add(src_until_alignment) as usize) & ALU_ALIGNMENT_MASK != 0 {
+                            break;
+                        }
+                        src_until_alignment
+                    } else {
+                        // basic_latin_to_ascii
+                        let dst_until_alignment = (ALU_ALIGNMENT
+                            - ((dst as usize) & ALU_ALIGNMENT_MASK))
+                            & ALU_ALIGNMENT_MASK;
+                        if (src.add(dst_until_alignment) as usize) & ALU_ALIGNMENT_MASK != 0 {
+                            break;
+                        }
+                        dst_until_alignment
                     }
-                    src_until_alignment
-                } else {
-                    // basic_latin_to_ascii
-                    let dst_until_alignment = (ALU_ALIGNMENT - ((dst as usize) & ALU_ALIGNMENT_MASK)) & ALU_ALIGNMENT_MASK;
-                    if (src.offset(dst_until_alignment as isize) as usize) & ALU_ALIGNMENT_MASK != 0 {
-                        break;
+                };
+                if until_alignment + ALU_STRIDE_SIZE <= len {
+                    // Moving pointers to alignment seems to be a pessimization on
+                    // x86_64 for operations that have UTF-16 as the internal
+                    // Unicode representation. However, since it seems to be a win
+                    // on ARM (tested ARMv7 code running on ARMv8 [rpi3]), except
+                    // mixed results when encoding from UTF-16 and since x86 and
+                    // x86_64 should be using SSE2 in due course, keeping the move
+                    // to alignment here. It would be good to test on more ARM CPUs
+                    // and on real MIPS and POWER hardware.
+                    while until_alignment != 0 {
+                        let code_unit = *(src.add(offset));
+                        if code_unit > 127 {
+                            return Some((code_unit, offset));
+                        }
+                        *(dst.add(offset)) = code_unit as $dst_unit;
+                        offset += 1;
+                        until_alignment -= 1;
                     }
-                    dst_until_alignment
-                }
-            };
-            if until_alignment + ALU_STRIDE_SIZE <= len {
-                // Moving pointers to alignment seems to be a pessimization on
-                // x86_64 for operations that have UTF-16 as the internal
-                // Unicode representation. However, since it seems to be a win
-                // on ARM (tested ARMv7 code running on ARMv8 [rpi3]), except
-                // mixed results when encoding from UTF-16 and since x86 and
-                // x86_64 should be using SSE2 in due course, keeping the move
-                // to alignment here. It would be good to test on more ARM CPUs
-                // and on real MIPS and POWER hardware.
-                while until_alignment != 0 {
-                    let code_unit = *(src.offset(offset as isize));
-                    if code_unit > 127 {
-                        return Some((code_unit, offset));
-                    }
-                    *(dst.offset(offset as isize)) = code_unit as $dst_unit;
-                    offset += 1;
-                    until_alignment -= 1;
-                }
-                let len_minus_stride = len - ALU_STRIDE_SIZE;
-                loop {
-                    if !$stride_fn(src.offset(offset as isize) as *const usize,
-                                   dst.offset(offset as isize) as *mut usize) {
-                        break;
-                    }
-                    offset += ALU_STRIDE_SIZE;
-                    if offset > len_minus_stride {
-                        break;
+                    let len_minus_stride = len - ALU_STRIDE_SIZE;
+                    loop {
+                        if !$stride_fn(
+                            src.add(offset) as *const usize,
+                            dst.add(offset) as *mut usize,
+                        ) {
+                            break;
+                        }
+                        offset += ALU_STRIDE_SIZE;
+                        if offset > len_minus_stride {
+                            break;
+                        }
                     }
                 }
+                break;
             }
-            break;
+            while offset < len {
+                let code_unit = *(src.add(offset));
+                if code_unit > 127 {
+                    return Some((code_unit, offset));
+                }
+                *(dst.add(offset)) = code_unit as $dst_unit;
+                offset += 1;
+            }
+            None
         }
-        while offset < len {
-            let code_unit = *(src.offset(offset as isize));
-            if code_unit > 127 {
-                return Some((code_unit, offset));
-            }
-            *(dst.offset(offset as isize)) = code_unit as $dst_unit;
-            offset += 1;
-        }
-        None
-    });
+    };
 }
 
 #[allow(unused_macros)]
 macro_rules! latin1_alu {
     ($name:ident, $src_unit:ty, $dst_unit:ty, $stride_fn:ident) => {
-        #[cfg_attr(feature = "cargo-clippy", allow(never_loop))]
+        #[cfg_attr(
+            feature = "cargo-clippy",
+            allow(
+                never_loop,
+                cast_ptr_alignment,
+                cast_lossless
+            )
+        )]
         #[inline(always)]
         pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) {
             let mut offset = 0usize;
             // This loop is only broken out of as a `goto` forward
             loop {
                 let mut until_alignment = {
                     if ::std::mem::size_of::<$src_unit>() < ::std::mem::size_of::<$dst_unit>() {
                         // unpack
                         let src_until_alignment = (ALU_ALIGNMENT
                             - ((src as usize) & ALU_ALIGNMENT_MASK))
                             & ALU_ALIGNMENT_MASK;
-                        if (dst.offset(src_until_alignment as isize) as usize) & ALU_ALIGNMENT_MASK
-                            != 0
-                        {
+                        if (dst.add(src_until_alignment) as usize) & ALU_ALIGNMENT_MASK != 0 {
                             break;
                         }
                         src_until_alignment
                     } else {
                         // pack
                         let dst_until_alignment = (ALU_ALIGNMENT
                             - ((dst as usize) & ALU_ALIGNMENT_MASK))
                             & ALU_ALIGNMENT_MASK;
-                        if (src.offset(dst_until_alignment as isize) as usize) & ALU_ALIGNMENT_MASK
-                            != 0
-                        {
+                        if (src.add(dst_until_alignment) as usize) & ALU_ALIGNMENT_MASK != 0 {
                             break;
                         }
                         dst_until_alignment
                     }
                 };
                 if until_alignment + ALU_STRIDE_SIZE <= len {
                     while until_alignment != 0 {
-                        let code_unit = *(src.offset(offset as isize));
-                        *(dst.offset(offset as isize)) = code_unit as $dst_unit;
+                        let code_unit = *(src.add(offset));
+                        *(dst.add(offset)) = code_unit as $dst_unit;
                         offset += 1;
                         until_alignment -= 1;
                     }
                     let len_minus_stride = len - ALU_STRIDE_SIZE;
                     loop {
                         $stride_fn(
-                            src.offset(offset as isize) as *const usize,
-                            dst.offset(offset as isize) as *mut usize,
+                            src.add(offset) as *const usize,
+                            dst.add(offset) as *mut usize,
                         );
                         offset += ALU_STRIDE_SIZE;
                         if offset > len_minus_stride {
                             break;
                         }
                     }
                 }
                 break;
             }
             while offset < len {
-                let code_unit = *(src.offset(offset as isize));
-                *(dst.offset(offset as isize)) = code_unit as $dst_unit;
+                let code_unit = *(src.add(offset));
+                *(dst.add(offset)) = code_unit as $dst_unit;
                 offset += 1;
             }
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! ascii_simd_check_align {
@@ -320,77 +371,188 @@ macro_rules! ascii_simd_check_align {
                 // avoid the cost of the branchiness below if the first stride fails anyway?
                 // XXX Should we just use unaligned SSE2 access unconditionally? It seems that
                 // on Haswell, it would make sense to just use unaligned and not bother
                 // checking. Need to benchmark older architectures before deciding.
                 let dst_masked = (dst as usize) & SIMD_ALIGNMENT_MASK;
                 if ((src as usize) & SIMD_ALIGNMENT_MASK) == 0 {
                     if dst_masked == 0 {
                         loop {
-                            if !$stride_both_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            ) {
+                            if !$stride_both_aligned(src.add(offset), dst.add(offset)) {
                                 break;
                             }
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     } else {
                         loop {
-                            if !$stride_src_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            ) {
+                            if !$stride_src_aligned(src.add(offset), dst.add(offset)) {
                                 break;
                             }
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     }
                 } else {
                     if dst_masked == 0 {
                         loop {
-                            if !$stride_dst_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            ) {
+                            if !$stride_dst_aligned(src.add(offset), dst.add(offset)) {
                                 break;
                             }
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     } else {
                         loop {
-                            if !$stride_neither_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            ) {
+                            if !$stride_neither_aligned(src.add(offset), dst.add(offset)) {
                                 break;
                             }
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     }
                 }
             }
             while offset < len {
-                let code_unit = *(src.offset(offset as isize));
+                let code_unit = *(src.add(offset));
                 if code_unit > 127 {
                     return Some((code_unit, offset));
                 }
-                *(dst.offset(offset as isize)) = code_unit as $dst_unit;
+                *(dst.add(offset)) = code_unit as $dst_unit;
+                offset += 1;
+            }
+            None
+        }
+    };
+}
+
+#[allow(unused_macros)]
+macro_rules! ascii_simd_check_align_unrolled {
+    (
+        $name:ident,
+        $src_unit:ty,
+        $dst_unit:ty,
+        $stride_both_aligned:ident,
+        $stride_src_aligned:ident,
+        $stride_neither_aligned:ident,
+        $double_stride_both_aligned:ident,
+        $double_stride_src_aligned:ident
+    ) => {
+        #[inline(always)]
+        pub unsafe fn $name(
+            src: *const $src_unit,
+            dst: *mut $dst_unit,
+            len: usize,
+        ) -> Option<($src_unit, usize)> {
+            let unit_size = ::std::mem::size_of::<$src_unit>();
+            let mut offset = 0usize;
+            // This loop is only broken out of as a goto forward without
+            // actually looping
+            'outer: loop {
+                if SIMD_STRIDE_SIZE <= len {
+                    // First, process one unaligned
+                    if !$stride_neither_aligned(src, dst) {
+                        break 'outer;
+                    }
+                    offset = SIMD_STRIDE_SIZE;
+
+                    // We have now seen 16 ASCII bytes. Let's guess that
+                    // there will be enough more to justify more expense
+                    // in the case of non-ASCII.
+                    // Use aligned reads for the sake of old microachitectures.
+                    let until_alignment = ((SIMD_ALIGNMENT
+                        - ((src.add(offset) as usize) & SIMD_ALIGNMENT_MASK))
+                        & SIMD_ALIGNMENT_MASK)
+                        / unit_size;
+                    // This addition won't overflow, because even in the 32-bit PAE case the
+                    // address space holds enough code that the slice length can't be that
+                    // close to address space size.
+                    // offset now equals SIMD_STRIDE_SIZE, hence times 3 below.
+                    if until_alignment + (SIMD_STRIDE_SIZE * 3) <= len {
+                        if until_alignment != 0 {
+                            if !$stride_neither_aligned(src.add(offset), dst.add(offset)) {
+                                break;
+                            }
+                            offset += until_alignment;
+                        }
+                        let len_minus_stride_times_two = len - (SIMD_STRIDE_SIZE * 2);
+                        let dst_masked = (dst.add(offset) as usize) & SIMD_ALIGNMENT_MASK;
+                        if dst_masked == 0 {
+                            loop {
+                                if let Some(advance) =
+                                    $double_stride_both_aligned(src.add(offset), dst.add(offset))
+                                {
+                                    offset += advance;
+                                    let code_unit = *(src.add(offset));
+                                    return Some((code_unit, offset));
+                                }
+                                offset += SIMD_STRIDE_SIZE * 2;
+                                if offset > len_minus_stride_times_two {
+                                    break;
+                                }
+                            }
+                            if offset + SIMD_STRIDE_SIZE <= len {
+                                if !$stride_both_aligned(src.add(offset), dst.add(offset)) {
+                                    break 'outer;
+                                }
+                                offset += SIMD_STRIDE_SIZE;
+                            }
+                        } else {
+                            loop {
+                                if let Some(advance) =
+                                    $double_stride_src_aligned(src.add(offset), dst.add(offset))
+                                {
+                                    offset += advance;
+                                    let code_unit = *(src.add(offset));
+                                    return Some((code_unit, offset));
+                                }
+                                offset += SIMD_STRIDE_SIZE * 2;
+                                if offset > len_minus_stride_times_two {
+                                    break;
+                                }
+                            }
+                            if offset + SIMD_STRIDE_SIZE <= len {
+                                if !$stride_src_aligned(src.add(offset), dst.add(offset)) {
+                                    break 'outer;
+                                }
+                                offset += SIMD_STRIDE_SIZE;
+                            }
+                        }
+                    } else {
+                        // At most two iterations, so unroll
+                        if offset + SIMD_STRIDE_SIZE <= len {
+                            if !$stride_neither_aligned(src.add(offset), dst.add(offset)) {
+                                break;
+                            }
+                            offset += SIMD_STRIDE_SIZE;
+                            if offset + SIMD_STRIDE_SIZE <= len {
+                                if !$stride_neither_aligned(src.add(offset), dst.add(offset)) {
+                                    break;
+                                }
+                                offset += SIMD_STRIDE_SIZE;
+                            }
+                        }
+                    }
+                }
+                break 'outer;
+            }
+            while offset < len {
+                let code_unit = *(src.add(offset));
+                if code_unit > 127 {
+                    return Some((code_unit, offset));
+                }
+                *(dst.add(offset)) = code_unit as $dst_unit;
                 offset += 1;
             }
             None
         }
     };
 }
 
 #[allow(unused_macros)]
@@ -408,66 +570,54 @@ macro_rules! latin1_simd_check_align {
         pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) {
             let mut offset = 0usize;
             if SIMD_STRIDE_SIZE <= len {
                 let len_minus_stride = len - SIMD_STRIDE_SIZE;
                 let dst_masked = (dst as usize) & SIMD_ALIGNMENT_MASK;
                 if ((src as usize) & SIMD_ALIGNMENT_MASK) == 0 {
                     if dst_masked == 0 {
                         loop {
-                            $stride_both_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_both_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     } else {
                         loop {
-                            $stride_src_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_src_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     }
                 } else {
                     if dst_masked == 0 {
                         loop {
-                            $stride_dst_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_dst_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     } else {
                         loop {
-                            $stride_neither_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_neither_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride {
                                 break;
                             }
                         }
                     }
                 }
             }
             while offset < len {
-                let code_unit = *(src.offset(offset as isize));
-                *(dst.offset(offset as isize)) = code_unit as $dst_unit;
+                let code_unit = *(src.add(offset));
+                *(dst.add(offset)) = code_unit as $dst_unit;
                 offset += 1;
             }
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! latin1_simd_check_align_unrolled {
@@ -480,84 +630,71 @@ macro_rules! latin1_simd_check_align_unr
         $stride_dst_aligned:ident,
         $stride_neither_aligned:ident
     ) => {
         #[inline(always)]
         pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) {
             let unit_size = ::std::mem::size_of::<$src_unit>();
             let mut offset = 0usize;
             if SIMD_STRIDE_SIZE <= len {
-                let mut until_alignment = ((SIMD_STRIDE_SIZE - ((src as usize) & SIMD_ALIGNMENT_MASK))
-                    & SIMD_ALIGNMENT_MASK) / unit_size;
+                let mut until_alignment = ((SIMD_STRIDE_SIZE
+                    - ((src as usize) & SIMD_ALIGNMENT_MASK))
+                    & SIMD_ALIGNMENT_MASK)
+                    / unit_size;
                 while until_alignment != 0 {
-                    *(dst.offset(offset as isize)) = *(src.offset(offset as isize)) as $dst_unit;
+                    *(dst.add(offset)) = *(src.add(offset)) as $dst_unit;
                     offset += 1;
                     until_alignment -= 1;
                 }
                 let len_minus_stride = len - SIMD_STRIDE_SIZE;
                 if offset + SIMD_STRIDE_SIZE * 2 <= len {
                     let len_minus_stride_times_two = len_minus_stride - SIMD_STRIDE_SIZE;
-                    if (dst.offset(offset as isize) as usize) & SIMD_ALIGNMENT_MASK == 0 {
+                    if (dst.add(offset) as usize) & SIMD_ALIGNMENT_MASK == 0 {
                         loop {
-                            $stride_both_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_both_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
-                            $stride_both_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_both_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride_times_two {
                                 break;
                             }
                         }
                     } else {
                         loop {
-                            $stride_src_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_src_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
-                            $stride_src_aligned(
-                                src.offset(offset as isize),
-                                dst.offset(offset as isize),
-                            );
+                            $stride_src_aligned(src.add(offset), dst.add(offset));
                             offset += SIMD_STRIDE_SIZE;
                             if offset > len_minus_stride_times_two {
                                 break;
                             }
                         }
                     }
                 }
                 if offset < len_minus_stride {
-                    $stride_src_aligned(
-                        src.offset(offset as isize),
-                        dst.offset(offset as isize),
-                    );
+                    $stride_src_aligned(src.add(offset), dst.add(offset));
                     offset += SIMD_STRIDE_SIZE;
                 }
             }
             while offset < len {
-                let code_unit = *(src.offset(offset as isize));
+                let code_unit = *(src.add(offset));
                 // On x86_64, this loop autovectorizes but in the pack
                 // case there are instructions whose purpose is to make sure
                 // each u16 in the vector is truncated before packing. However,
                 // since we don't care about saturating behavior of SSE2 packing
                 // when the input isn't Latin1, those instructions are useless.
                 // Unfortunately, using the `assume` intrinsic to lie to the
                 // optimizer doesn't make LLVM omit the trunctation that we
                 // don't need. Possibly this loop could be manually optimized
                 // to do the sort of thing that LLVM does but without the
                 // ANDing the read vectors of u16 with a constant that discards
                 // the high half of each u16. As far as I can tell, the
                 // optimization assumes that doing a SIMD read past the end of
                 // the array is OK.
-                *(dst.offset(offset as isize)) = code_unit as $dst_unit;
+                *(dst.add(offset)) = code_unit as $dst_unit;
                 offset += 1;
             }
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! ascii_simd_unalign {
@@ -567,63 +704,57 @@ macro_rules! ascii_simd_unalign {
             src: *const $src_unit,
             dst: *mut $dst_unit,
             len: usize,
         ) -> Option<($src_unit, usize)> {
             let mut offset = 0usize;
             if SIMD_STRIDE_SIZE <= len {
                 let len_minus_stride = len - SIMD_STRIDE_SIZE;
                 loop {
-                    if !$stride_neither_aligned(
-                        src.offset(offset as isize),
-                        dst.offset(offset as isize),
-                    ) {
+                    if !$stride_neither_aligned(src.add(offset), dst.add(offset)) {
                         break;
                     }
                     offset += SIMD_STRIDE_SIZE;
                     if offset > len_minus_stride {
                         break;
                     }
                 }
             }
             while offset < len {
-                let code_unit = *(src.offset(offset as isize));
+                let code_unit = *(src.add(offset));
                 if code_unit > 127 {
                     return Some((code_unit, offset));
                 }
-                *(dst.offset(offset as isize)) = code_unit as $dst_unit;
+                *(dst.add(offset)) = code_unit as $dst_unit;
                 offset += 1;
             }
             None
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! latin1_simd_unalign {
     ($name:ident, $src_unit:ty, $dst_unit:ty, $stride_neither_aligned:ident) => {
         #[inline(always)]
         pub unsafe fn $name(src: *const $src_unit, dst: *mut $dst_unit, len: usize) {
             let mut offset = 0usize;
             if SIMD_STRIDE_SIZE <= len {
                 let len_minus_stride = len - SIMD_STRIDE_SIZE;
                 loop {
-                    $stride_neither_aligned(
-                        src.offset(offset as isize),
-                        dst.offset(offset as isize),
-                    );
+                    $stride_neither_aligned(src.add(offset), dst.add(offset));
                     offset += SIMD_STRIDE_SIZE;
                     if offset > len_minus_stride {
                         break;
                     }
                 }
             }
             while offset < len {
-                let code_unit = *(src.offset(offset as isize));
-                *(dst.offset(offset as isize)) = code_unit as $dst_unit;
+                let code_unit = *(src.add(offset));
+                *(dst.add(offset)) = code_unit as $dst_unit;
                 offset += 1;
             }
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! ascii_to_ascii_simd_stride {
@@ -636,84 +767,142 @@ macro_rules! ascii_to_ascii_simd_stride 
             }
             $store(dst, simd);
             true
         }
     };
 }
 
 #[allow(unused_macros)]
+macro_rules! ascii_to_ascii_simd_double_stride {
+    ($name:ident, $store:ident) => {
+        #[inline(always)]
+        pub unsafe fn $name(src: *const u8, dst: *mut u8) -> Option<usize> {
+            let first = load16_aligned(src);
+            let second = load16_aligned(src.add(SIMD_STRIDE_SIZE));
+            $store(dst, first);
+            if unlikely(!simd_is_ascii(first | second)) {
+                let mask_first = mask_ascii(first);
+                if mask_first != 0 {
+                    return Some(mask_first.trailing_zeros() as usize);
+                }
+                $store(dst.add(SIMD_STRIDE_SIZE), second);
+                let mask_second = mask_ascii(second);
+                return Some(SIMD_STRIDE_SIZE + mask_second.trailing_zeros() as usize);
+            }
+            $store(dst.add(SIMD_STRIDE_SIZE), second);
+            None
+        }
+    };
+}
+
+#[allow(unused_macros)]
 macro_rules! ascii_to_basic_latin_simd_stride {
     ($name:ident, $load:ident, $store:ident) => {
         #[inline(always)]
         pub unsafe fn $name(src: *const u8, dst: *mut u16) -> bool {
             let simd = $load(src);
             if !simd_is_ascii(simd) {
                 return false;
             }
             let (first, second) = simd_unpack(simd);
             $store(dst, first);
-            $store(dst.offset(8), second);
+            $store(dst.add(8), second);
             true
         }
     };
 }
 
 #[allow(unused_macros)]
+macro_rules! ascii_to_basic_latin_simd_double_stride {
+    ($name:ident, $store:ident) => {
+        #[inline(always)]
+        pub unsafe fn $name(src: *const u8, dst: *mut u16) -> Option<usize> {
+            let first = load16_aligned(src);
+            let second = load16_aligned(src.add(SIMD_STRIDE_SIZE));
+            let (a, b) = simd_unpack(first);
+            $store(dst, a);
+            $store(dst.add(SIMD_STRIDE_SIZE / 2), b);
+            if unlikely(!simd_is_ascii(first | second)) {
+                let mask_first = mask_ascii(first);
+                if mask_first != 0 {
+                    return Some(mask_first.trailing_zeros() as usize);
+                }
+                let (c, d) = simd_unpack(second);
+                $store(dst.add(SIMD_STRIDE_SIZE), c);
+                $store(dst.add(SIMD_STRIDE_SIZE + (SIMD_STRIDE_SIZE / 2)), d);
+                let mask_second = mask_ascii(second);
+                return Some(SIMD_STRIDE_SIZE + mask_second.trailing_zeros() as usize);
+            }
+            let (c, d) = simd_unpack(second);
+            $store(dst.add(SIMD_STRIDE_SIZE), c);
+            $store(dst.add(SIMD_STRIDE_SIZE + (SIMD_STRIDE_SIZE / 2)), d);
+            None
+        }
+    };
+}
+
+#[allow(unused_macros)]
 macro_rules! unpack_simd_stride {
     ($name:ident, $load:ident, $store:ident) => {
         #[inline(always)]
         pub unsafe fn $name(src: *const u8, dst: *mut u16) {
             let simd = $load(src);
             let (first, second) = simd_unpack(simd);
             $store(dst, first);
-            $store(dst.offset(8), second);
+            $store(dst.add(8), second);
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! basic_latin_to_ascii_simd_stride {
     ($name:ident, $load:ident, $store:ident) => {
         #[inline(always)]
         pub unsafe fn $name(src: *const u16, dst: *mut u8) -> bool {
             let first = $load(src);
-            let second = $load(src.offset(8));
+            let second = $load(src.add(8));
             if simd_is_basic_latin(first | second) {
                 $store(dst, simd_pack(first, second));
                 true
             } else {
                 false
             }
         }
     };
 }
 
 #[allow(unused_macros)]
 macro_rules! pack_simd_stride {
     ($name:ident, $load:ident, $store:ident) => {
         #[inline(always)]
         pub unsafe fn $name(src: *const u16, dst: *mut u8) {
             let first = $load(src);
-            let second = $load(src.offset(8));
+            let second = $load(src.add(8));
             $store(dst, simd_pack(first, second));
         }
     };
 }
 
 cfg_if! {
     if #[cfg(all(feature = "simd-accel", target_endian = "little", target_arch = "aarch64"))] {
         // SIMD with the same instructions for aligned and unaligned loads and stores
 
         pub const SIMD_STRIDE_SIZE: usize = 16;
 
         pub const MAX_STRIDE_SIZE: usize = 16;
 
 //        pub const ALIGNMENT: usize = 8;
 
+        pub const ALU_STRIDE_SIZE: usize = 16;
+
+        pub const ALU_ALIGNMENT: usize = 8;
+
+        pub const ALU_ALIGNMENT_MASK: usize = 7;
+
         ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_neither_aligned, load16_unaligned, store16_unaligned);
 
         ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_neither_aligned, load16_unaligned, store8_unaligned);
         unpack_simd_stride!(unpack_stride_neither_aligned, load16_unaligned, store8_unaligned);
 
         basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_neither_aligned, load8_unaligned, store16_unaligned);
         pack_simd_stride!(pack_stride_neither_aligned, load8_unaligned, store16_unaligned);
 
@@ -769,175 +958,182 @@ cfg_if! {
         // SIMD with different instructions for aligned and unaligned loads and stores.
         //
         // Newer microarchitectures are not supposed to have a performance difference between
         // aligned and unaligned SSE2 loads and stores when the address is actually aligned,
         // but the benchmark results I see don't agree.
 
         pub const SIMD_STRIDE_SIZE: usize = 16;
 
+        pub const SIMD_ALIGNMENT: usize = 16;
+
         pub const MAX_STRIDE_SIZE: usize = 16;
 
         pub const SIMD_ALIGNMENT_MASK: usize = 15;
 
+        ascii_to_ascii_simd_double_stride!(ascii_to_ascii_simd_double_stride_both_aligned, store16_aligned);
+        ascii_to_ascii_simd_double_stride!(ascii_to_ascii_simd_double_stride_src_aligned, store16_unaligned);
+
+        ascii_to_basic_latin_simd_double_stride!(ascii_to_basic_latin_simd_double_stride_both_aligned, store8_aligned);
+        ascii_to_basic_latin_simd_double_stride!(ascii_to_basic_latin_simd_double_stride_src_aligned, store8_unaligned);
+
         ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_both_aligned, load16_aligned, store16_aligned);
         ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_src_aligned, load16_aligned, store16_unaligned);
-        ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_dst_aligned, load16_unaligned, store16_aligned);
         ascii_to_ascii_simd_stride!(ascii_to_ascii_stride_neither_aligned, load16_unaligned, store16_unaligned);
 
         ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_both_aligned, load16_aligned, store8_aligned);
         ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_src_aligned, load16_aligned, store8_unaligned);
-        ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_dst_aligned, load16_unaligned, store8_aligned);
         ascii_to_basic_latin_simd_stride!(ascii_to_basic_latin_stride_neither_aligned, load16_unaligned, store8_unaligned);
 
         unpack_simd_stride!(unpack_stride_both_aligned, load16_aligned, store8_aligned);
         unpack_simd_stride!(unpack_stride_src_aligned, load16_aligned, store8_unaligned);
 
         basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_both_aligned, load8_aligned, store16_aligned);
         basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_src_aligned, load8_aligned, store16_unaligned);
         basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_dst_aligned, load8_unaligned, store16_aligned);
         basic_latin_to_ascii_simd_stride!(basic_latin_to_ascii_stride_neither_aligned, load8_unaligned, store16_unaligned);
 
         pack_simd_stride!(pack_stride_both_aligned, load8_aligned, store16_aligned);
         pack_simd_stride!(pack_stride_src_aligned, load8_aligned, store16_unaligned);
 
-        ascii_simd_check_align!(ascii_to_ascii, u8, u8, ascii_to_ascii_stride_both_aligned, ascii_to_ascii_stride_src_aligned, ascii_to_ascii_stride_dst_aligned, ascii_to_ascii_stride_neither_aligned);
-        ascii_simd_check_align!(ascii_to_basic_latin, u8, u16, ascii_to_basic_latin_stride_both_aligned, ascii_to_basic_latin_stride_src_aligned, ascii_to_basic_latin_stride_dst_aligned, ascii_to_basic_latin_stride_neither_aligned);
+        ascii_simd_check_align_unrolled!(ascii_to_ascii, u8, u8, ascii_to_ascii_stride_both_aligned, ascii_to_ascii_stride_src_aligned, ascii_to_ascii_stride_neither_aligned, ascii_to_ascii_simd_double_stride_both_aligned, ascii_to_ascii_simd_double_stride_src_aligned);
+        ascii_simd_check_align_unrolled!(ascii_to_basic_latin, u8, u16, ascii_to_basic_latin_stride_both_aligned, ascii_to_basic_latin_stride_src_aligned, ascii_to_basic_latin_stride_neither_aligned, ascii_to_basic_latin_simd_double_stride_both_aligned, ascii_to_basic_latin_simd_double_stride_src_aligned);
+
         ascii_simd_check_align!(basic_latin_to_ascii, u16, u8, basic_latin_to_ascii_stride_both_aligned, basic_latin_to_ascii_stride_src_aligned, basic_latin_to_ascii_stride_dst_aligned, basic_latin_to_ascii_stride_neither_aligned);
         latin1_simd_check_align_unrolled!(unpack_latin1, u8, u16, unpack_stride_both_aligned, unpack_stride_src_aligned, unpack_stride_dst_aligned, unpack_stride_neither_aligned);
         latin1_simd_check_align_unrolled!(pack_latin1, u16, u8, pack_stride_both_aligned, pack_stride_src_aligned, pack_stride_dst_aligned, pack_stride_neither_aligned);
     } else if #[cfg(all(target_endian = "little", target_pointer_width = "64"))] {
         // Aligned ALU word, little-endian, 64-bit
 
         pub const ALU_STRIDE_SIZE: usize = 16;
 
         pub const MAX_STRIDE_SIZE: usize = 16;
 
         pub const ALU_ALIGNMENT: usize = 8;
 
         pub const ALU_ALIGNMENT_MASK: usize = 7;
 
         #[inline(always)]
         unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) {
-            let first = ((0x00000000_FF000000usize & word) << 24) |
-                        ((0x00000000_00FF0000usize & word) << 16) |
-                        ((0x00000000_0000FF00usize & word) << 8) |
-                        (0x00000000_000000FFusize & word);
-            let second = ((0xFF000000_00000000usize & word) >> 8) |
-                         ((0x00FF0000_00000000usize & word) >> 16) |
-                         ((0x0000FF00_00000000usize & word) >> 24) |
-                         ((0x000000FF_00000000usize & word) >> 32);
-            let third = ((0x00000000_FF000000usize & second_word) << 24) |
-                        ((0x00000000_00FF0000usize & second_word) << 16) |
-                        ((0x00000000_0000FF00usize & second_word) << 8) |
-                        (0x00000000_000000FFusize & second_word);
-            let fourth = ((0xFF000000_00000000usize & second_word) >> 8) |
-                         ((0x00FF0000_00000000usize & second_word) >> 16) |
-                         ((0x0000FF00_00000000usize & second_word) >> 24) |
-                         ((0x000000FF_00000000usize & second_word) >> 32);
+            let first = ((0x0000_0000_FF00_0000usize & word) << 24) |
+                        ((0x0000_0000_00FF_0000usize & word) << 16) |
+                        ((0x0000_0000_0000_FF00usize & word) << 8) |
+                        (0x0000_0000_0000_00FFusize & word);
+            let second = ((0xFF00_0000_0000_0000usize & word) >> 8) |
+                         ((0x00FF_0000_0000_0000usize & word) >> 16) |
+                         ((0x0000_FF00_0000_0000usize & word) >> 24) |
+                         ((0x0000_00FF_0000_0000usize & word) >> 32);
+            let third = ((0x0000_0000_FF00_0000usize & second_word) << 24) |
+                        ((0x0000_0000_00FF_0000usize & second_word) << 16) |
+                        ((0x0000_0000_0000_FF00usize & second_word) << 8) |
+                        (0x0000_0000_0000_00FFusize & second_word);
+            let fourth = ((0xFF00_0000_0000_0000usize & second_word) >> 8) |
+                         ((0x00FF_0000_0000_0000usize & second_word) >> 16) |
+                         ((0x0000_FF00_0000_0000usize & second_word) >> 24) |
+                         ((0x0000_00FF_0000_0000usize & second_word) >> 32);
             *dst = first;
-            *(dst.offset(1)) = second;
-            *(dst.offset(2)) = third;
-            *(dst.offset(3)) = fourth;
+            *(dst.add(1)) = second;
+            *(dst.add(2)) = third;
+            *(dst.add(3)) = fourth;
         }
 
         #[inline(always)]
         unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) {
-            let word = ((0x00FF0000_00000000usize & second) << 8) |
-                       ((0x000000FF_00000000usize & second) << 16) |
-                       ((0x00000000_00FF0000usize & second) << 24) |
-                       ((0x00000000_000000FFusize & second) << 32) |
-                       ((0x00FF0000_00000000usize & first) >> 24) |
-                       ((0x000000FF_00000000usize & first) >> 16) |
-                       ((0x00000000_00FF0000usize & first) >> 8) |
-                       (0x00000000_000000FFusize & first);
-            let second_word = ((0x00FF0000_00000000usize & fourth) << 8) |
-                              ((0x000000FF_00000000usize & fourth) << 16) |
-                              ((0x00000000_00FF0000usize & fourth) << 24) |
-                              ((0x00000000_000000FFusize & fourth) << 32) |
-                              ((0x00FF0000_00000000usize & third) >> 24) |
-                              ((0x000000FF_00000000usize & third) >> 16) |
-                              ((0x00000000_00FF0000usize & third) >> 8) |
-                              (0x00000000_000000FFusize & third);
+            let word = ((0x00FF_0000_0000_0000usize & second) << 8) |
+                       ((0x0000_00FF_0000_0000usize & second) << 16) |
+                       ((0x0000_0000_00FF_0000usize & second) << 24) |
+                       ((0x0000_0000_0000_00FFusize & second) << 32) |
+                       ((0x00FF_0000_0000_0000usize & first) >> 24) |
+                       ((0x0000_00FF_0000_0000usize & first) >> 16) |
+                       ((0x0000_0000_00FF_0000usize & first) >> 8) |
+                       (0x0000_0000_0000_00FFusize & first);
+            let second_word = ((0x00FF_0000_0000_0000usize & fourth) << 8) |
+                              ((0x0000_00FF_0000_0000usize & fourth) << 16) |
+                              ((0x0000_0000_00FF_0000usize & fourth) << 24) |
+                              ((0x0000_0000_0000_00FFusize & fourth) << 32) |
+                              ((0x00FF_0000_0000_0000usize & third) >> 24) |
+                              ((0x0000_00FF_0000_0000usize & third) >> 16) |
+                              ((0x0000_0000_00FF_0000usize & third) >> 8) |
+                              (0x0000_0000_0000_00FFusize & third);
             *dst = word;
-            *(dst.offset(1)) = second_word;
+            *(dst.add(1)) = second_word;
         }
     } else if #[cfg(all(target_endian = "little", target_pointer_width = "32"))] {
         // Aligned ALU word, little-endian, 32-bit
 
         pub const ALU_STRIDE_SIZE: usize = 8;
 
         pub const MAX_STRIDE_SIZE: usize = 8;
 
         pub const ALU_ALIGNMENT: usize = 4;
 
         pub const ALU_ALIGNMENT_MASK: usize = 3;
 
         #[inline(always)]
         unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) {
-            let first = ((0x0000FF00usize & word) << 8) |
-                        (0x000000FFusize & word);
-            let second = ((0xFF000000usize & word) >> 8) |
-                         ((0x00FF0000usize & word) >> 16);
-            let third = ((0x0000FF00usize & second_word) << 8) |
-                        (0x000000FFusize & second_word);
-            let fourth = ((0xFF000000usize & second_word) >> 8) |
-                         ((0x00FF0000usize & second_word) >> 16);
+            let first = ((0x0000_FF00usize & word) << 8) |
+                        (0x0000_00FFusize & word);
+            let second = ((0xFF00_0000usize & word) >> 8) |
+                         ((0x00FF_0000usize & word) >> 16);
+            let third = ((0x0000_FF00usize & second_word) << 8) |
+                        (0x0000_00FFusize & second_word);
+            let fourth = ((0xFF00_0000usize & second_word) >> 8) |
+                         ((0x00FF_0000usize & second_word) >> 16);
             *dst = first;
-            *(dst.offset(1)) = second;
-            *(dst.offset(2)) = third;
-            *(dst.offset(3)) = fourth;
+            *(dst.add(1)) = second;
+            *(dst.add(2)) = third;
+            *(dst.add(3)) = fourth;
         }
 
         #[inline(always)]
         unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) {
-            let word = ((0x00FF0000usize & second) << 8) |
-                       ((0x000000FFusize & second) << 16) |
-                       ((0x00FF0000usize & first) >> 8) |
-                       (0x000000FFusize & first);
-            let second_word = ((0x00FF0000usize & fourth) << 8) |
-                              ((0x000000FFusize & fourth) << 16) |
-                              ((0x00FF0000usize & third) >> 8) |
-                              (0x000000FFusize & third);
+            let word = ((0x00FF_0000usize & second) << 8) |
+                       ((0x0000_00FFusize & second) << 16) |
+                       ((0x00FF_0000usize & first) >> 8) |
+                       (0x0000_00FFusize & first);
+            let second_word = ((0x00FF_0000usize & fourth) << 8) |
+                              ((0x0000_00FFusize & fourth) << 16) |
+                              ((0x00FF_0000usize & third) >> 8) |
+                              (0x0000_00FFusize & third);
             *dst = word;
-            *(dst.offset(1)) = second_word;
+            *(dst.add(1)) = second_word;
         }
     } else if #[cfg(all(target_endian = "big", target_pointer_width = "64"))] {
         // Aligned ALU word, big-endian, 64-bit
 
         pub const ALU_STRIDE_SIZE: usize = 16;
 
         pub const MAX_STRIDE_SIZE: usize = 16;
 
         pub const ALU_ALIGNMENT: usize = 8;
 
         pub const ALU_ALIGNMENT_MASK: usize = 7;
 
         #[inline(always)]
         unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) {
-            let first = ((0xFF000000_00000000usize & word) >> 8) |
-                         ((0x00FF0000_00000000usize & word) >> 16) |
-                         ((0x0000FF00_00000000usize & word) >> 24) |
-                         ((0x000000FF_00000000usize & word) >> 32);
-            let second = ((0x00000000_FF000000usize & word) << 24) |
-                        ((0x00000000_00FF0000usize & word) << 16) |
-                        ((0x00000000_0000FF00usize & word) << 8) |
-                        (0x00000000_000000FFusize & word);
-            let third = ((0xFF000000_00000000usize & second_word) >> 8) |
-                         ((0x00FF0000_00000000usize & second_word) >> 16) |
-                         ((0x0000FF00_00000000usize & second_word) >> 24) |
-                         ((0x000000FF_00000000usize & second_word) >> 32);
-            let fourth = ((0x00000000_FF000000usize & second_word) << 24) |
-                        ((0x00000000_00FF0000usize & second_word) << 16) |
-                        ((0x00000000_0000FF00usize & second_word) << 8) |
-                        (0x00000000_000000FFusize & second_word);
+            let first = ((0xFF00_0000_0000_0000usize & word) >> 8) |
+                         ((0x00FF_0000_0000_0000usize & word) >> 16) |
+                         ((0x0000_FF00_0000_0000usize & word) >> 24) |
+                         ((0x0000_00FF_0000_0000usize & word) >> 32);
+            let second = ((0x0000_0000_FF00_0000usize & word) << 24) |
+                        ((0x0000_0000_00FF_0000usize & word) << 16) |
+                        ((0x0000_0000_0000_FF00usize & word) << 8) |
+                        (0x0000_0000_0000_00FFusize & word);
+            let third = ((0xFF00_0000_0000_0000usize & second_word) >> 8) |
+                         ((0x00FF_0000_0000_0000usize & second_word) >> 16) |
+                         ((0x0000_FF00_0000_0000usize & second_word) >> 24) |
+                         ((0x0000_00FF_0000_0000usize & second_word) >> 32);
+            let fourth = ((0x0000_0000_FF00_0000usize & second_word) << 24) |
+                        ((0x0000_0000_00FF_0000usize & second_word) << 16) |
+                        ((0x0000_0000_0000_FF00usize & second_word) << 8) |
+                        (0x0000_0000_0000_00FFusize & second_word);
             *dst = first;
-            *(dst.offset(1)) = second;
-            *(dst.offset(2)) = third;
-            *(dst.offset(3)) = fourth;
+            *(dst.add(1)) = second;
+            *(dst.add(2)) = third;
+            *(dst.add(3)) = fourth;
         }
 
         #[inline(always)]
         unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) {
             let word = ((0x00FF0000_00000000usize & first) << 8) |
                        ((0x000000FF_00000000usize & first) << 16) |
                        ((0x00000000_00FF0000usize & first) << 24) |
                        ((0x00000000_000000FFusize & first) << 32) |
@@ -949,57 +1145,57 @@ cfg_if! {
                               ((0x000000FF_00000000usize & third) << 16) |
                               ((0x00000000_00FF0000usize & third) << 24) |
                               ((0x00000000_000000FFusize & third) << 32) |
                               ((0x00FF0000_00000000usize & fourth) >> 24) |
                               ((0x000000FF_00000000usize & fourth) >> 16) |
                               ((0x00000000_00FF0000usize & fourth) >> 8) |
                               (0x00000000_000000FFusize &  fourth);
             *dst = word;
-            *(dst.offset(1)) = second_word;
+            *(dst.add(1)) = second_word;
         }
     } else if #[cfg(all(target_endian = "big", target_pointer_width = "32"))] {
         // Aligned ALU word, big-endian, 32-bit
 
         pub const ALU_STRIDE_SIZE: usize = 8;
 
         pub const MAX_STRIDE_SIZE: usize = 8;
 
         pub const ALU_ALIGNMENT: usize = 4;
 
         pub const ALU_ALIGNMENT_MASK: usize = 3;
 
         #[inline(always)]
         unsafe fn unpack_alu(word: usize, second_word: usize, dst: *mut usize) {
-            let first = ((0xFF000000usize & word) >> 8) |
-                         ((0x00FF0000usize & word) >> 16);
-            let second = ((0x0000FF00usize & word) << 8) |
-                        (0x000000FFusize & word);
-            let third = ((0xFF000000usize & second_word) >> 8) |
-                         ((0x00FF0000usize & second_word) >> 16);
-            let fourth = ((0x0000FF00usize & second_word) << 8) |
-                        (0x000000FFusize & second_word);
+            let first = ((0xFF00_0000usize & word) >> 8) |
+                         ((0x00FF_0000usize & word) >> 16);
+            let second = ((0x0000_FF00usize & word) << 8) |
+                        (0x0000_00FFusize & word);
+            let third = ((0xFF00_0000usize & second_word) >> 8) |
+                         ((0x00FF_0000usize & second_word) >> 16);
+            let fourth = ((0x0000_FF00usize & second_word) << 8) |
+                        (0x0000_00FFusize & second_word);
             *dst = first;
-            *(dst.offset(1)) = second;
-            *(dst.offset(2)) = third;
-            *(dst.offset(3)) = fourth;
+            *(dst.add(1)) = second;
+            *(dst.add(2)) = third;
+            *(dst.add(3)) = fourth;
         }
 
         #[inline(always)]
         unsafe fn pack_alu(first: usize, second: usize, third: usize, fourth: usize, dst: *mut usize) {
-            let word = ((0x00FF0000usize & first) << 8) |
-                       ((0x000000FFusize & first) << 16) |
-                       ((0x00FF0000usize & second) >> 8) |
-                       (0x000000FFusize & second);
-            let second_word = ((0x00FF0000usize & third) << 8) |
-                              ((0x000000FFusize & third) << 16) |
-                              ((0x00FF0000usize & fourth) >> 8) |
-                              (0x000000FFusize & fourth);
+            let word = ((0x00FF_0000usize & first) << 8) |
+                       ((0x0000_00FFusize & first) << 16) |
+                       ((0x00FF_0000usize & second) >> 8) |
+                       (0x0000_00FFusize & second);
+            let second_word = ((0x00FF_0000usize & third) << 8) |
+                              ((0x0000_00FFusize & third) << 16) |
+                              ((0x00FF_0000usize & fourth) >> 8) |
+                              (0x0000_00FFusize & fourth);
             *dst = word;
-            *(dst.offset(1)) = second_word;
+            *(dst.add(1)) = second_word;
         }
     } else {
         ascii_naive!(ascii_to_ascii, u8, u8);
         ascii_naive!(ascii_to_basic_latin, u8, u16);
         ascii_naive!(basic_latin_to_ascii, u16, u8);
     }
 }
 
@@ -1015,26 +1211,26 @@ cfg_if! {
         #[inline(always)]
         fn count_zeros(word: usize) -> u32 {
             word.leading_zeros()
         }
     }
 }
 
 cfg_if! {
-    if #[cfg(all(feature = "simd-accel", target_endian = "little", target_arch = "aarch64"))] {
+    if #[cfg(all(feature = "simd-accel", target_endian = "little", target_arch = "disabled"))] {
         #[inline(always)]
         pub fn validate_ascii(slice: &[u8]) -> Option<(u8, usize)> {
             let src = slice.as_ptr();
             let len = slice.len();
             let mut offset = 0usize;
             if SIMD_STRIDE_SIZE <= len {
                 let len_minus_stride = len - SIMD_STRIDE_SIZE;
                 loop {
-                    let simd = unsafe { load16_unaligned(src.offset(offset as isize)) };
+                    let simd = unsafe { load16_unaligned(src.add(offset)) };
                     if !simd_is_ascii(simd) {
                         break;
                     }
                     offset += SIMD_STRIDE_SIZE;
                     if offset > len_minus_stride {
                         break;
                     }
                 }
@@ -1050,54 +1246,102 @@ cfg_if! {
         }
     } else if #[cfg(all(feature = "simd-accel", target_feature = "sse2"))] {
         #[inline(always)]
         pub fn validate_ascii(slice: &[u8]) -> Option<(u8, usize)> {
             let src = slice.as_ptr();
             let len = slice.len();
             let mut offset = 0usize;
             if SIMD_STRIDE_SIZE <= len {
-                let len_minus_stride = len - SIMD_STRIDE_SIZE;
-                // XXX Should we first process one stride unconditionally as unaligned to
-                // avoid the cost of the branchiness below if the first stride fails anyway?
-                // XXX Should we just use unaligned SSE2 access unconditionally? It seems that
-                // on Haswell, it would make sense to just use unaligned and not bother
-                // checking. Need to benchmark older architectures before deciding.
-                if ((src as usize) & SIMD_ALIGNMENT_MASK) == 0 {
-                    loop {
-                        let simd = unsafe { load16_aligned(src.offset(offset as isize)) };
+                // First, process one unaligned vector
+                let simd = unsafe { load16_unaligned(src) };
+                let mask = mask_ascii(simd);
+                if mask != 0 {
+                    offset = mask.trailing_zeros() as usize;
+                    let non_ascii = unsafe { *src.add(offset) };
+                    return Some((non_ascii, offset));
+                }
+                offset = SIMD_STRIDE_SIZE;
+
+                // We have now seen 16 ASCII bytes. Let's guess that
+                // there will be enough more to justify more expense
+                // in the case of non-ASCII.
+                // Use aligned reads for the sake of old microachitectures.
+                let until_alignment = unsafe { (SIMD_ALIGNMENT - ((src.add(offset) as usize) & SIMD_ALIGNMENT_MASK)) & SIMD_ALIGNMENT_MASK };
+                // This addition won't overflow, because even in the 32-bit PAE case the
+                // address space holds enough code that the slice length can't be that
+                // close to address space size.
+                // offset now equals SIMD_STRIDE_SIZE, hence times 3 below.
+                if until_alignment + (SIMD_STRIDE_SIZE * 3) <= len {
+                    if until_alignment != 0 {
+                        let simd = unsafe { load16_unaligned(src.add(offset)) };
                         let mask = mask_ascii(simd);
                         if mask != 0 {
                             offset += mask.trailing_zeros() as usize;
-                            let non_ascii = unsafe { *src.offset(offset as isize) };
+                            let non_ascii = unsafe { *src.add(offset) };
+                            return Some((non_ascii, offset));
+                        }
+                        offset += until_alignment;
+                    }
+                    let len_minus_stride_times_two = len - (SIMD_STRIDE_SIZE * 2);
+                    loop {
+                        let first = unsafe { load16_aligned(src.add(offset)) };
+                        let second = unsafe { load16_aligned(src.add(offset + SIMD_STRIDE_SIZE)) };
+                        if !simd_is_ascii(first | second) {
+                            let mask_first = mask_ascii(first);
+                            if mask_first != 0 {
+                                offset += mask_first.trailing_zeros() as usize;
+                            } else {
+                                let mask_second = mask_ascii(second);
+                                offset += SIMD_STRIDE_SIZE + mask_second.trailing_zeros() as usize;
+                            }
+                            let non_ascii = unsafe { *src.add(offset) };
+                            return Some((non_ascii, offset));
+                        }
+                        offset += SIMD_STRIDE_SIZE * 2;
+                        if offset > len_minus_stride_times_two {
+                            break;
+                        }
+                    }
+                    if offset + SIMD_STRIDE_SIZE <= len {
+                         let simd = unsafe { load16_aligned(src.add(offset)) };
+                         let mask = mask_ascii(simd);
+                        if mask != 0 {
+                            offset += mask.trailing_zeros() as usize;
+                            let non_ascii = unsafe { *src.add(offset) };
                             return Some((non_ascii, offset));
                         }
                         offset += SIMD_STRIDE_SIZE;
-                        if offset > len_minus_stride {
-                            break;
-                        }
                     }
                 } else {
-                    loop {
-                        let simd = unsafe { load16_unaligned(src.offset(offset as isize)) };
+                    // At most two iterations, so unroll
+                    if offset + SIMD_STRIDE_SIZE <= len {
+                        let simd = unsafe { load16_unaligned(src.add(offset)) };
                         let mask = mask_ascii(simd);
                         if mask != 0 {
                             offset += mask.trailing_zeros() as usize;
-                            let non_ascii = unsafe { *src.offset(offset as isize) };
+                            let non_ascii = unsafe { *src.add(offset) };
                             return Some((non_ascii, offset));
                         }
                         offset += SIMD_STRIDE_SIZE;
-                        if offset > len_minus_stride {
-                            break;
+                        if offset + SIMD_STRIDE_SIZE <= len {
+                             let simd = unsafe { load16_unaligned(src.add(offset)) };
+                             let mask = mask_ascii(simd);
+                            if mask != 0 {
+                                offset += mask.trailing_zeros() as usize;
+                                let non_ascii = unsafe { *src.add(offset) };
+                                return Some((non_ascii, offset));
+                            }
+                            offset += SIMD_STRIDE_SIZE;
                         }
                     }
                 }
             }
             while offset < len {
-                let code_unit = slice[offset];
+                let code_unit = unsafe { *(src.add(offset)) };
                 if code_unit > 127 {
                     return Some((code_unit, offset));
                 }
                 offset += 1;
             }
             None
         }
     } else {
@@ -1124,20 +1368,21 @@ cfg_if! {
             // text order before the non-ASCII byte in the big-endian case.
             let num_ascii = (zeros >> 3) as usize;
             Some(ALU_ALIGNMENT + num_ascii)
         }
 
         #[inline(always)]
         unsafe fn validate_ascii_stride(src: *const usize) -> Option<usize> {
             let word = *src;
-            let second_word = *(src.offset(1));
+            let second_word = *(src.add(1));
             find_non_ascii(word, second_word)
         }
 
+        #[cfg_attr(feature = "cargo-clippy", allow(cast_ptr_alignment))]
         #[inline(always)]
         pub fn validate_ascii(slice: &[u8]) -> Option<(u8, usize)> {
             let src = slice.as_ptr();
             let len = slice.len();
             let mut offset = 0usize;
             let mut until_alignment = (ALU_ALIGNMENT - ((src as usize) & ALU_ALIGNMENT_MASK)) & ALU_ALIGNMENT_MASK;
             if until_alignment + ALU_STRIDE_SIZE <= len {
                 while until_alignment != 0 {
@@ -1145,20 +1390,20 @@ cfg_if! {
                     if code_unit > 127 {
                         return Some((code_unit, offset));
                     }
                     offset += 1;
                     until_alignment -= 1;
                 }
                 let len_minus_stride = len - ALU_STRIDE_SIZE;
                 loop {
-                    let ptr = unsafe { src.offset(offset as isize) as *const usize };
+                    let ptr = unsafe { src.add(offset) as *const usize };
                     if let Some(num_ascii) = unsafe { validate_ascii_stride(ptr) } {
                         offset += num_ascii;
-                        return Some((unsafe { *(src.offset(offset as isize)) }, offset));
+                        return Some((unsafe { *(src.add(offset)) }, offset));
                     }
                     offset += ALU_STRIDE_SIZE;
                     if offset > len_minus_stride {
                         break;
                     }
                 }
             }
             while offset < len {
@@ -1186,60 +1431,60 @@ cfg_if! {
 
         pub const ALU_ALIGNMENT: usize = 4;
 
         pub const ALU_ALIGNMENT_MASK: usize = 3;
     } else {
         #[inline(always)]
         unsafe fn unpack_latin1_stride_alu(src: *const usize, dst: *mut usize) {
             let word = *src;
-            let second_word = *(src.offset(1));
+            let second_word = *(src.add(1));
             unpack_alu(word, second_word, dst);
         }
 
         #[inline(always)]
         unsafe fn pack_latin1_stride_alu(src: *const usize, dst: *mut usize) {
             let first = *src;
-            let second = *(src.offset(1));
-            let third = *(src.offset(2));
-            let fourth = *(src.offset(3));
+            let second = *(src.add(1));
+            let third = *(src.add(2));
+            let fourth = *(src.add(3));
             pack_alu(first, second, third, fourth, dst);
         }
 
         #[inline(always)]
         unsafe fn ascii_to_basic_latin_stride_alu(src: *const usize, dst: *mut usize) -> bool {
             let word = *src;
-            let second_word = *(src.offset(1));
+            let second_word = *(src.add(1));
             // Check if the words contains non-ASCII
             if (word & ASCII_MASK) | (second_word & ASCII_MASK) != 0 {
                 return false;
             }
             unpack_alu(word, second_word, dst);
             true
         }
 
         #[inline(always)]
         unsafe fn basic_latin_to_ascii_stride_alu(src: *const usize, dst: *mut usize) -> bool {
             let first = *src;
-            let second = *(src.offset(1));
-            let third = *(src.offset(2));
-            let fourth = *(src.offset(3));
+            let second = *(src.add(1));
+            let third = *(src.add(2));
+            let fourth = *(src.add(3));
             if (first & BASIC_LATIN_MASK) | (second & BASIC_LATIN_MASK) | (third & BASIC_LATIN_MASK) | (fourth & BASIC_LATIN_MASK) != 0 {
                 return false;
             }
             pack_alu(first, second, third, fourth, dst);
             true
         }
 
         #[inline(always)]
         unsafe fn ascii_to_ascii_stride(src: *const usize, dst: *mut usize) -> Option<usize> {
             let word = *src;
-            let second_word = *(src.offset(1));
+            let second_word = *(src.add(1));
             *dst = word;
-            *(dst.offset(1)) = second_word;
+            *(dst.add(1)) = second_word;
             find_non_ascii(word, second_word)
         }
 
         basic_latin_alu!(ascii_to_basic_latin, u8, u16, ascii_to_basic_latin_stride_alu);
         basic_latin_alu!(basic_latin_to_ascii, u16, u8, basic_latin_to_ascii_stride_alu);
         latin1_alu!(unpack_latin1, u8, u16, unpack_latin1_stride_alu);
         latin1_alu!(pack_latin1, u16, u8, pack_latin1_stride_alu);
         ascii_alu!(ascii_to_ascii, u8, u8, ascii_to_ascii_stride);
--- a/third_party/rust/encoding_rs/src/big5.rs
+++ b/third_party/rust/encoding_rs/src/big5.rs
@@ -136,17 +136,17 @@ impl Big5Decoder {
                                     handle.written());
                         }
                         return (DecoderResult::Malformed(2, 0),
                                 unread_handle_trail.consumed(),
                                 handle.written());
                     }
                 }
             } else if big5_is_astral(rebased_pointer) {
-                handle.write_astral(low_bits as u32 |
+                handle.write_astral(u32::from(low_bits) |
                                     0x20000u32)
             } else {
                 handle.write_bmp_excl_ascii(low_bits)
             }
         },
         self,
         non_ascii,
         byte,
--- a/third_party/rust/encoding_rs/src/data.rs
+++ b/third_party/rust/encoding_rs/src/data.rs
@@ -2,397 +2,432 @@
 // file at the top-level directory of this distribution.
 //
 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
 // https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
 // <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
+// BEGIN GENERATED CODE. PLEASE DO NOT EDIT.
 // Instead, please regenerate using generate-encoding-data.py
 
-pub const IBM866_DATA: &'static [u16; 128] = &[
-    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,
-    0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
-    0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433,
-    0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
-    0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557,
-    0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
-    0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559,
-    0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
-    0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,
-    0x044C, 0x044D, 0x044E, 0x044F, 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E,
-    0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0,
-];
-
-pub const ISO_8859_2_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x02D8, 0x0141,
-    0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
-    0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165,
-    0x017A, 0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
-    0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3,
-    0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
-    0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB,
-    0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
-    0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
-];
-
-pub const ISO_8859_3_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0126, 0x02D8, 0x00A3,
-    0x00A4, 0x0000, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B,
-    0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F,
-    0x0135, 0x00BD, 0x0000, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7,
-    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0000, 0x00D1, 0x00D2, 0x00D3,
-    0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
-    0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
-    0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9,
-];
-
-pub const ISO_8859_4_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x0138, 0x0156,
-    0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
-    0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123,
-    0x0167, 0x014A, 0x017E, 0x014B, 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
-    0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, 0x0110, 0x0145, 0x014C, 0x0136,
-    0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
-    0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB,
-    0x0117, 0x00ED, 0x00EE, 0x012B, 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
-    0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9,
-];
-
-pub const ISO_8859_5_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0401, 0x0402, 0x0403,
-    0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
-    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,
-    0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
-    0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433,
-    0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
-    0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,
-    0x044C, 0x044D, 0x044E, 0x044F, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
-    0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F,
-];
-
-pub const ISO_8859_6_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0000, 0x0000, 0x0000,
-    0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000,
-    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061B,
-    0x0000, 0x0000, 0x0000, 0x061F, 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
-    0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633,
-    0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-    0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B,
-    0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-];
-
-pub const ISO_8859_7_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x2018, 0x2019, 0x00A3,
-    0x20AC, 0x20AF, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB,
-    0x038C, 0x00BD, 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
-    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x0000, 0x03A3,
-    0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
-    0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB,
-    0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
-    0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
-];
-
-pub const ISO_8859_8_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0000, 0x00A2, 0x00A3,
-    0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
-    0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB,
-    0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
-    0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
-];
-
-pub const ISO_8859_10_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x0112, 0x0122,
-    0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
-    0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167,
-    0x017E, 0x2015, 0x016B, 0x014B, 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
-    0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x0145, 0x014C, 0x00D3,
-    0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
-    0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB,
-    0x0117, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169,
-    0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138,
-];
-
-pub const ISO_8859_13_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x201D, 0x00A2, 0x00A3,
-    0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
-    0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3,
-    0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
-    0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117,
-    0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
-    0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019,
-];
-
-pub const ISO_8859_14_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x1E02, 0x1E03, 0x00A3,
-    0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
-    0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60,
-    0x1EF3, 0x1E84, 0x1E85, 0x1E61, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
-    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0174, 0x00D1, 0x00D2, 0x00D3,
-    0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
-    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B,
-    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF,
-];
-
-pub const ISO_8859_15_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3,
-    0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB,
-    0x0152, 0x0153, 0x0178, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
-    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3,
-    0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
-    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
-    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF,
-];
-
-pub const ISO_8859_16_DATA: &'static [u16; 128] = &[
-    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x0105, 0x0141,
-    0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B,
-    0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB,
-    0x0152, 0x0153, 0x0178, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7,
-    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0110, 0x0143, 0x00D2, 0x00D3,
-    0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF,
-    0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B,
-    0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF,
-];
+#[repr(align(64))] // Align to cache lines
+pub struct SingleByteData {
+    pub ibm866: [u16; 128],
+    pub iso_8859_2: [u16; 128],
+    pub iso_8859_3: [u16; 128],
+    pub iso_8859_4: [u16; 128],
+    pub iso_8859_5: [u16; 128],
+    pub iso_8859_6: [u16; 128],
+    pub iso_8859_7: [u16; 128],
+    pub iso_8859_8: [u16; 128],
+    pub iso_8859_10: [u16; 128],
+    pub iso_8859_13: [u16; 128],
+    pub iso_8859_14: [u16; 128],
+    pub iso_8859_15: [u16; 128],
+    pub iso_8859_16: [u16; 128],
+    pub koi8_r: [u16; 128],
+    pub koi8_u: [u16; 128],
+    pub macintosh: [u16; 128],
+    pub windows_874: [u16; 128],
+    pub windows_1250: [u16; 128],
+    pub windows_1251: [u16; 128],
+    pub windows_1252: [u16; 128],
+    pub windows_1253: [u16; 128],
+    pub windows_1254: [u16; 128],
+    pub windows_1255: [u16; 128],
+    pub windows_1256: [u16; 128],
+    pub windows_1257: [u16; 128],
+    pub windows_1258: [u16; 128],
+    pub x_mac_cyrillic: [u16; 128],
+}
 
-pub const KOI8_R_DATA: &'static [u16; 128] = &[
-    0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C, 0x2580,
-    0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
-    0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, 0x2550, 0x2551, 0x2552, 0x0451,
-    0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E,
-    0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569,
-    0x256A, 0x256B, 0x256C, 0x00A9, 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
-    0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x044F, 0x0440, 0x0441,
-    0x0442, 0x0443, 0x0436, 0x0432, 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
-    0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A,
-    0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
-    0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A,
-];
-
-pub const KOI8_U_DATA: &'static [u16; 128] = &[
-    0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C, 0x2580,
-    0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
-    0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, 0x2550, 0x2551, 0x2552, 0x0451,
-    0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x045E, 0x255E,
-    0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569,
-    0x256A, 0x0490, 0x040E, 0x00A9, 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
-    0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x044F, 0x0440, 0x0441,
-    0x0442, 0x0443, 0x0436, 0x0432, 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
-    0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A,
-    0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
-    0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A,
-];
-
-pub const MACINTOSH_DATA: &'static [u16; 128] = &[
-    0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, 0x00E0, 0x00E2, 0x00E4, 0x00E3,
-    0x00E5, 0x00E7, 0x00E9, 0x00E8, 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3,
-    0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, 0x2020, 0x00B0, 0x00A2, 0x00A3,
-    0x00A7, 0x2022, 0x00B6, 0x00DF, 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8,
-    0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, 0x220F, 0x03C0, 0x222B, 0x00AA,
-    0x00BA, 0x03A9, 0x00E6, 0x00F8, 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB,
-    0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, 0x2013, 0x2014, 0x201C, 0x201D,
-    0x2018, 0x2019, 0x00F7, 0x25CA, 0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02,
-    0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, 0x00CB, 0x00C8, 0x00CD, 0x00CE,
-    0x00CF, 0x00CC, 0x00D3, 0x00D4, 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC,
-    0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7,
-];
-
-pub const WINDOWS_874_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x0082, 0x0083, 0x0084, 0x2026, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0E01, 0x0E02, 0x0E03,
-    0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
-    0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B,
-    0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
-    0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, 0x0E30, 0x0E31, 0x0E32, 0x0E33,
-    0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
-    0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B,
-    0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
-    0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000,
-];
-
-pub const WINDOWS_1250_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x201A, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x0160, 0x2039,
-    0x015A, 0x0164, 0x017D, 0x0179, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x0098, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, 0x00A0, 0x02C7, 0x02D8, 0x0141,
-    0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
-    0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB,
-    0x013D, 0x02DD, 0x013E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
-    0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3,
-    0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
-    0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB,
-    0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
-    0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
-];
-
-pub const WINDOWS_1251_DATA: &'static [u16; 128] = &[
-    0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039,
-    0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x0098, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, 0x00A0, 0x040E, 0x045E, 0x0408,
-    0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
-    0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB,
-    0x0458, 0x0405, 0x0455, 0x0457, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
-    0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423,
-    0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
-    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,
-    0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
-    0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
-];
-
-pub const WINDOWS_1252_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039,
-    0x0152, 0x008D, 0x017D, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3,
-    0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
-    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3,
-    0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
-    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
-    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF,
-];
+pub static SINGLE_BYTE_DATA: SingleByteData = SingleByteData {
+    ibm866: [
+        0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,
+        0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+        0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430,
+        0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,
+        0x043C, 0x043D, 0x043E, 0x043F, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562,
+        0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534,
+        0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560,
+        0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
+        0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x0440, 0x0441, 0x0442,
+        0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D,
+        0x044E, 0x044F, 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0,
+        0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0,
+    ],
+    iso_8859_2: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164,
+        0x0179, 0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B,
+        0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1,
+        0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A,
+        0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+        0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2,
+        0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED,
+        0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159,
+        0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
+    ],
+    iso_8859_3: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E,
+        0x0134, 0x00AD, 0x0000, 0x017B, 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125,
+        0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C, 0x00C0, 0x00C1,
+        0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+        0x00CD, 0x00CE, 0x00CF, 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7,
+        0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, 0x00E0, 0x00E1, 0x00E2,
+        0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED,
+        0x00EE, 0x00EF, 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D,
+        0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9,
+    ],
+    iso_8859_4: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122,
+        0x0166, 0x00AD, 0x017D, 0x00AF, 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C,
+        0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, 0x0100, 0x00C1,
+        0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116,
+        0x00CD, 0x00CE, 0x012A, 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+        0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, 0x0101, 0x00E1, 0x00E2,
+        0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED,
+        0x00EE, 0x012B, 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8,
+        0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9,
+    ],
+    iso_8859_5: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B,
+        0x040C, 0x00AD, 0x040E, 0x040F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416,
+        0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421,
+        0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C,
+        0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+        0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,
+        0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D,
+        0x044E, 0x044F, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458,
+        0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F,
+    ],
+    iso_8859_6: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x060C, 0x00AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F, 0x0000, 0x0621,
+        0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C,
+        0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
+        0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0640, 0x0641, 0x0642,
+        0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D,
+        0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    ],
+    iso_8859_7: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x037A, 0x00AB,
+        0x00AC, 0x00AD, 0x0000, 0x2015, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386,
+        0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, 0x0390, 0x0391,
+        0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C,
+        0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+        0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2,
+        0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,
+        0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+        0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
+    ],
+    iso_8859_8: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, 0x05D0, 0x05D1, 0x05D2,
+        0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD,
+        0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8,
+        0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
+    ],
+    iso_8859_10: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166,
+        0x017D, 0x00AD, 0x016A, 0x014A, 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137,
+        0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, 0x0100, 0x00C1,
+        0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116,
+        0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168,
+        0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x0101, 0x00E1, 0x00E2,
+        0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED,
+        0x00EE, 0x00EF, 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8,
+        0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138,
+    ],
+    iso_8859_13: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00C6, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6,
+        0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E,
+        0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122,
+        0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
+        0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101,
+        0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137,
+        0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173,
+        0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019,
+    ],
+    iso_8859_14: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B,
+        0x1EF2, 0x00AD, 0x00AE, 0x0178, 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6,
+        0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, 0x00C0, 0x00C1,
+        0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+        0x00CD, 0x00CE, 0x00CF, 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A,
+        0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, 0x00E0, 0x00E1, 0x00E2,
+        0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED,
+        0x00EE, 0x00EF, 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8,
+        0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF,
+    ],
+    iso_8859_15: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6,
+        0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, 0x00C0, 0x00C1,
+        0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+        0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+        0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2,
+        0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED,
+        0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8,
+        0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF,
+    ],
+    iso_8859_16: [
+        0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095,
+        0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB,
+        0x0179, 0x00AD, 0x017A, 0x017B, 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6,
+        0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C, 0x00C0, 0x00C1,
+        0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+        0x00CD, 0x00CE, 0x00CF, 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A,
+        0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF, 0x00E0, 0x00E1, 0x00E2,
+        0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED,
+        0x00EE, 0x00EF, 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171,
+        0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF,
+    ],
+    koi8_r: [
+        0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C,
+        0x2580, 0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219,
+        0x221A, 0x2248, 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, 0x2550,
+        0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A,
+        0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564,
+        0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9, 0x044E, 0x0430,
+        0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043A, 0x043B,
+        0x043C, 0x043D, 0x043E, 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+        0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, 0x042E, 0x0410, 0x0411,
+        0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,
+        0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042C,
+        0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A,
+    ],
+    koi8_u: [
+        0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C,
+        0x2580, 0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219,
+        0x221A, 0x2248, 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, 0x2550,
+        0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255A,
+        0x255B, 0x0491, 0x045E, 0x255E, 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406,
+        0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x040E, 0x00A9, 0x044E, 0x0430,
+        0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043A, 0x043B,
+        0x043C, 0x043D, 0x043E, 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+        0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, 0x042E, 0x0410, 0x0411,
+        0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,
+        0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042C,
+        0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A,
+    ],
+    macintosh: [
+        0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, 0x00E0, 0x00E2, 0x00E4,
+        0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF,
+        0x00F1, 0x00F3, 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, 0x2020,
+        0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, 0x00AE, 0x00A9, 0x2122, 0x00B4,
+        0x00A8, 0x2260, 0x00C6, 0x00D8, 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202,
+        0x2211, 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8, 0x00BF, 0x00A1,
+        0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3,
+        0x00D5, 0x0152, 0x0153, 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA,
+        0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2021, 0x00B7, 0x201A,
+        0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC,
+        0x00D3, 0x00D4, 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, 0x00AF,
+        0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7,
+    ],
+    windows_874: [
+        0x20AC, 0x0081, 0x0082, 0x0083, 0x0084, 0x2026, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A,
+        0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B,
+        0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16,
+        0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 0x0E20, 0x0E21,
+        0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C,
+        0x0E2D, 0x0E2E, 0x0E2F, 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
+        0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, 0x0E40, 0x0E41, 0x0E42,
+        0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D,
+        0x0E4E, 0x0E4F, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58,
+        0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000,
+    ],
+    windows_1250: [
+        0x20AC, 0x0081, 0x201A, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x0160,
+        0x2039, 0x015A, 0x0164, 0x017D, 0x0179, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x0098, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, 0x00A0,
+        0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x017B, 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, 0x0154, 0x00C1,
+        0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A,
+        0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+        0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2,
+        0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED,
+        0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159,
+        0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
+    ],
+    windows_1251: [
+        0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409,
+        0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x0098, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, 0x00A0,
+        0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x0407, 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6,
+        0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, 0x0410, 0x0411,
+        0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,
+        0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+        0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432,
+        0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D,
+        0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448,
+        0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+    ],
+    windows_1252: [
+        0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160,
+        0x2039, 0x0152, 0x008D, 0x017D, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178, 0x00A0,
+        0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1,
+        0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+        0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+        0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2,
+        0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED,
+        0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8,
+        0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF,
+    ],
+    windows_1253: [
+        0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008A,
+        0x2039, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x2015, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6,
+        0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, 0x0390, 0x0391,
+        0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C,
+        0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+        0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2,
+        0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,
+        0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+        0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
+    ],
+    windows_1254: [
+        0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160,
+        0x2039, 0x0152, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x009E, 0x0178, 0x00A0,
+        0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1,
+        0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+        0x00CD, 0x00CE, 0x00CF, 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+        0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, 0x00E0, 0x00E1, 0x00E2,
+        0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED,
+        0x00EE, 0x00EF, 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8,
+        0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,
+    ],
+    windows_1255: [
+        0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x008A,
+        0x2039, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x02DC, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0,
+        0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x05B0, 0x05B1,
+        0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x05BC,
+        0x05BD, 0x05BE, 0x05BF, 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
+        0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05D0, 0x05D1, 0x05D2,
+        0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD,
+        0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8,
+        0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
+    ],
+    windows_1256: [
+        0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679,
+        0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, 0x00A0,
+        0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, 0x06C1, 0x0621,
+        0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C,
+        0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
+        0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, 0x00E0, 0x0644, 0x00E2,
+        0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A,
+        0x00EE, 0x00EF, 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651,
+        0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,
+    ],
+    windows_1257: [
+        0x20AC, 0x0081, 0x201A, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008A,
+        0x2039, 0x008C, 0x00A8, 0x02C7, 0x00B8, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x00AF, 0x02DB, 0x009F, 0x00A0,
+        0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00C6, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E,
+        0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122,
+        0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
+        0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101,
+        0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137,
+        0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173,
+        0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,
+    ],
+    windows_1258: [
+        0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x008A,
+        0x2039, 0x0152, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022,
+        0x2013, 0x2014, 0x02DC, 0x2122, 0x009A, 0x203A, 0x0153, 0x009D, 0x009E, 0x0178, 0x00A0,
+        0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB,
+        0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+        0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1,
+        0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300,
+        0x00CD, 0x00CE, 0x00CF, 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7,
+        0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, 0x00E0, 0x00E1, 0x00E2,
+        0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED,
+        0x00EE, 0x00EF, 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, 0x00F8,
+        0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF,
+    ],
+    x_mac_cyrillic: [
+        0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,
+        0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+        0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x2020,
+        0x00B0, 0x0490, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x0406, 0x00AE, 0x00A9, 0x2122, 0x0402,
+        0x0452, 0x2260, 0x0403, 0x0453, 0x221E, 0x00B1, 0x2264, 0x2265, 0x0456, 0x00B5, 0x0491,
+        0x0408, 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040A, 0x045A, 0x0458, 0x0405,
+        0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, 0x00BB, 0x2026, 0x00A0, 0x040B, 0x045B,
+        0x040C, 0x045C, 0x0455, 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x201E,
+        0x040E, 0x045E, 0x040F, 0x045F, 0x2116, 0x0401, 0x0451, 0x044F, 0x0430, 0x0431, 0x0432,
+        0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D,
+        0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448,
+        0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x20AC,
+    ],
+};
 
-pub const WINDOWS_1253_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008A, 0x2039,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0385, 0x0386, 0x00A3,
-    0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB,
-    0x038C, 0x00BD, 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
-    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x0000, 0x03A3,
-    0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
-    0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB,
-    0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
-    0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
-];
-
-pub const WINDOWS_1254_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039,
-    0x0152, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x009E, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3,
-    0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
-    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x011E, 0x00D1, 0x00D2, 0x00D3,
-    0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
-    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
-    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,
-];
-
-pub const WINDOWS_1255_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x008A, 0x2039,
-    0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x02DC, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3,
-    0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
-    0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, 0x05C0, 0x05C1, 0x05C2, 0x05C3,
-    0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-    0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB,
-    0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
-    0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
-];
-
-pub const WINDOWS_1256_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039,
-    0x0152, 0x0686, 0x0698, 0x0688, 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, 0x00A0, 0x060C, 0x00A2, 0x00A3,
-    0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x061F, 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
-    0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633,
-    0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
-    0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x0649, 0x064A, 0x00EE, 0x00EF, 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
-    0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,
-];
-
-pub const WINDOWS_1257_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x201A, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008A, 0x2039,
-    0x008C, 0x00A8, 0x02C7, 0x00B8, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x00AF, 0x02DB, 0x009F, 0x00A0, 0x0000, 0x00A2, 0x00A3,
-    0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
-    0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3,
-    0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
-    0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117,
-    0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
-    0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,
-];
-
-pub const WINDOWS_1258_DATA: &'static [u16; 128] = &[
-    0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x008A, 0x2039,
-    0x0152, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-    0x02DC, 0x2122, 0x009A, 0x203A, 0x0153, 0x009D, 0x009E, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3,
-    0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB,
-    0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
-    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, 0x0110, 0x00D1, 0x0309, 0x00D3,
-    0x00D4, 0x01A0, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
-    0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
-    0x0301, 0x00ED, 0x00EE, 0x00EF, 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7,
-    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF,
-];
-
-pub const X_MAC_CYRILLIC_DATA: &'static [u16; 128] = &[
-    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,
-    0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
-    0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x2020, 0x00B0, 0x0490, 0x00A3,
-    0x00A7, 0x2022, 0x00B6, 0x0406, 0x00AE, 0x00A9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453,
-    0x221E, 0x00B1, 0x2264, 0x2265, 0x0456, 0x00B5, 0x0491, 0x0408, 0x0404, 0x0454, 0x0407, 0x0457,
-    0x0409, 0x0459, 0x040A, 0x045A, 0x0458, 0x0405, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB,
-    0x00BB, 0x2026, 0x00A0, 0x040B, 0x045B, 0x040C, 0x045C, 0x0455, 0x2013, 0x2014, 0x201C, 0x201D,
-    0x2018, 0x2019, 0x00F7, 0x201E, 0x040E, 0x045E, 0x040F, 0x045F, 0x2116, 0x0401, 0x0451, 0x044F,
-    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,
-    0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
-    0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x20AC,
-];
-
+#[cfg_attr(feature = "cargo-clippy", allow(unreadable_literal))]
 static BIG5_ASTRALNESS: [u32; 589] = [
     0x445F0520, 0xB882520F, 0x400000F8, 0x044EA920, 0x00000000, 0x00010B34, 0x00000000, 0x00000000,
     0x00000000, 0x0C000000, 0x00000040, 0x00000000, 0x00580400, 0x0000003C, 0x5C800000, 0xBBF3DCAD,
     0xEDEE43C9, 0xC1260FA4, 0xEFF2769B, 0xF7FAFBDE, 0xAF44320F, 0xFEFDEFFE, 0x00B06011, 0x81192100,
     0xA8881020, 0x24692160, 0xC4894400, 0x40030000, 0x84430035, 0x68935131, 0x00000202, 0x00000000,
     0x00000000, 0x01004000, 0x8264AC80, 0x90A18C40, 0xD4605004, 0x182AD200, 0x9735689D, 0x20F8D84F,
     0x281C82C4, 0x02947582, 0xA1A04038, 0x4D7110C5, 0xB9980DC4, 0x43015B5E, 0x7803999F, 0x081FE220,
     0x40C90189, 0x9A0D0307, 0x4FD15290, 0x2102037C, 0x136EC020, 0xF5DBB583, 0x4F9077E5, 0x17369A17,
@@ -2033,17 +2068,20 @@ pub static BIG5_LOW_BITS: [u16; 18840] =
     0x4D13, 0x758E, 0x745D, 0x759E, 0x75B4, 0x7602, 0x762C, 0x7651, 0x764F, 0x766F, 0x7676, 0x63F5,
     0x7690, 0x81EF, 0x37F8, 0x6911, 0x690E, 0x76A1, 0x76A5, 0x76B7, 0x76CC, 0x6F9F, 0x8462, 0x509D,
     0x517D, 0x1E1C, 0x771E, 0x7726, 0x7740, 0x64AF, 0x5220, 0x7758, 0x32AC, 0x77AF, 0x8964, 0x8968,
     0x16C1, 0x77F4, 0x7809, 0x1376, 0x4A12, 0x68CA, 0x78AF, 0x78C7, 0x78D3, 0x96A5, 0x792E, 0x55E0,
     0x78D7, 0x7934, 0x78B1, 0x760C, 0x8FB8, 0x8884, 0x8B2B, 0x6083, 0x261C, 0x7986, 0x8900, 0x6902,
     0x7980, 0x5857, 0x799D, 0x7B39, 0x793C, 0x79A9, 0x6E2A, 0x7126, 0x3EA8, 0x79C6, 0x910D, 0x79D4,
 ];
 
-#[cfg(feature = "less-slow-big5-hanzi-encode")]
+#[cfg(all(
+    feature = "less-slow-big5-hanzi-encode",
+    not(feature = "fast-big5-hanzi-encode")
+))]
 static BIG5_LEVEL1_HANZI_CODE_POINTS: [u16; 5406] = [
     0x4E00, 0x4E01, 0x4E03, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x4E0D, 0x4E10, 0x4E11, 0x4E14, 0x4E15,
     0x4E16, 0x4E18, 0x4E19, 0x4E1E, 0x4E1F, 0x4E26, 0x4E2B, 0x4E2D, 0x4E30, 0x4E32, 0x4E38, 0x4E39,
     0x4E3B, 0x4E43, 0x4E45, 0x4E48, 0x4E4B, 0x4E4D, 0x4E4E, 0x4E4F, 0x4E52, 0x4E53, 0x4E56, 0x4E58,
     0x4E59, 0x4E5A, 0x4E5D, 0x4E5E, 0x4E5F, 0x4E69, 0x4E73, 0x4E7E, 0x4E82, 0x4E86, 0x4E88, 0x4E8B,
     0x4E8C, 0x4E8E, 0x4E91, 0x4E92, 0x4E94, 0x4E95, 0x4E99, 0x4E9B, 0x4E9E, 0x4E9F, 0x4EA1, 0x4EA2,
     0x4EA4, 0x4EA5, 0x4EA6, 0x4EA8, 0x4EAB, 0x4EAC, 0x4EAD, 0x4EAE, 0x4EB3, 0x4EBA, 0x4EC0, 0x4EC1,
     0x4EC3, 0x4EC4, 0x4EC6, 0x4EC7, 0x4ECA, 0x4ECB, 0x4ECD, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4ED8,
@@ -2488,17 +2526,20 @@ static BIG5_LEVEL1_HANZI_CODE_POINTS: [u
     0x9E75, 0x9E79, 0x9E7C, 0x9E7D, 0x9E7F, 0x9E82, 0x9E8B, 0x9E92, 0x9E93, 0x9E97, 0x9E9D, 0x9E9F,
     0x9EA5, 0x9EA9, 0x9EB4, 0x9EB5, 0x9EBB, 0x9EBC, 0x9EBE, 0x9EC3, 0x9ECC, 0x9ECD, 0x9ECE, 0x9ECF,
     0x9ED1, 0x9ED4, 0x9ED8, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EDE, 0x9EE0, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF7,
     0x9F07, 0x9F0E, 0x9F13, 0x9F15, 0x9F19, 0x9F20, 0x9F2C, 0x9F2F, 0x9F34, 0x9F3B, 0x9F3E, 0x9F4A,
     0x9F4B, 0x9F52, 0x9F5C, 0x9F5F, 0x9F61, 0x9F63, 0x9F66, 0x9F67, 0x9F6A, 0x9F6C, 0x9F72, 0x9F77,
     0x9F8D, 0x9F90, 0x9F94, 0x9F9C, 0x9FB0, 0x9FB1,
 ];
 
-#[cfg(feature = "less-slow-big5-hanzi-encode")]
+#[cfg(all(
+    feature = "less-slow-big5-hanzi-encode",
+    not(feature = "fast-big5-hanzi-encode")
+))]
 static BIG5_LEVEL1_HANZI_BYTES: [[u8; 2]; 5406] = [
     [0xA4, 0x40],
     [0xA4, 0x42],
     [0xA4, 0x43],
     [0xA4, 0x56],
     [0xA4, 0x54],
     [0xA4, 0x57],
     [0xA4, 0x55],
@@ -7898,16 +7939,20960 @@ static BIG5_LEVEL1_HANZI_BYTES: [[u8; 2]
     [0xC0, 0x73],
     [0xC3, 0x65],
     [0xC5, 0xC7],
     [0xC0, 0x74],
     [0xC8, 0xA1],
     [0xC8, 0xA3],
 ];
 
+#[cfg(feature = "fast-big5-hanzi-encode")]
+static BIG5_UNIFIED_IDEOGRAPH_BYTES: [[u8; 2]; 20940] = [
+    [0xA4, 0x40],
+    [0xA4, 0x42],
+    [0x00, 0x00],
+    [0xA4, 0x43],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x45],
+    [0xA4, 0x56],
+    [0xA4, 0x54],
+    [0xA4, 0x57],
+    [0xA4, 0x55],
+    [0xC9, 0x46],
+    [0xA4, 0xA3],
+    [0xC9, 0x4F],
+    [0xC9, 0x4D],
+    [0xA4, 0xA2],
+    [0xA4, 0xA1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0x42],
+    [0xA5, 0x41],
+    [0xA5, 0x40],
+    [0x00, 0x00],
+    [0xA5, 0x43],
+    [0xA4, 0xFE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0xE0],
+    [0xA5, 0xE1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xC3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0x58],
+    [0x00, 0x00],
+    [0xA4, 0xA4],
+    [0xC9, 0x50],
+    [0x00, 0x00],
+    [0xA4, 0xA5],
+    [0xC9, 0x63],
+    [0xA6, 0xEA],
+    [0xCB, 0xB1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC6, 0xBF],
+    [0x00, 0x00],
+    [0xA4, 0x59],
+    [0xA4, 0xA6],
+    [0x00, 0x00],
+    [0xA5, 0x44],
+    [0xC9, 0x64],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC6, 0xC0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x40],
+    [0xA4, 0x44],
+    [0x00, 0x00],
+    [0xA4, 0x5B],
+    [0x00, 0x00],
+    [0xC9, 0x47],
+    [0xA4, 0x5C],
+    [0xFA, 0xE5],
+    [0x00, 0x00],
+    [0xA4, 0xA7],
+    [0x00, 0x00],
+    [0xA5, 0x45],
+    [0xA5, 0x47],
+    [0xA5, 0x46],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0xE2],
+    [0xA5, 0xE3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xC4],
+    [0x00, 0x00],
+    [0xAD, 0xBC],
+    [0xA4, 0x41],
+    [0xC8, 0x7B],
+    [0x00, 0x00],
+    [0xC9, 0x41],
+    [0xA4, 0x45],
+    [0xA4, 0x5E],
+    [0xA4, 0x5D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0xE4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xC5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xAE],
+    [0xD4, 0x4B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB6, 0xC3],
+    [0xDC, 0xB1],
+    [0xDC, 0xB2],
+    [0xC6, 0xC1],
+    [0xA4, 0x46],
+    [0x00, 0x00],
+    [0xA4, 0xA9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xC6],
+    [0xA4, 0x47],
+    [0xC9, 0x48],
+    [0xA4, 0x5F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0xAA],
+    [0xA4, 0xAC],
+    [0xC9, 0x51],
+    [0xA4, 0xAD],
+    [0xA4, 0xAB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0xE5],
+    [0x00, 0x00],
+    [0xA8, 0xC7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xC8],
+    [0xAB, 0x45],
+    [0xC6, 0xC2],
+    [0xA4, 0x60],
+    [0xA4, 0xAE],
+    [0x00, 0x00],
+    [0xA5, 0xE6],
+    [0xA5, 0xE8],
+    [0xA5, 0xE7],
+    [0x00, 0x00],
+    [0xA6, 0xEB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xC9],
+    [0xA8, 0xCA],
+    [0xAB, 0x46],
+    [0xAB, 0x47],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAD, 0xBD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDC, 0xB3],
+    [0xFB, 0xF8],
+    [0x00, 0x00],
+    [0xF6, 0xD6],
+    [0xA4, 0x48],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0xB0],
+    [0xA4, 0xAF],
+    [0xC9, 0x52],
+    [0xA4, 0xB1],
+    [0xA4, 0xB7],
+    [0x00, 0x00],
+    [0xA4, 0xB2],
+    [0xA4, 0xB3],
+    [0xC9, 0x54],
+    [0xC9, 0x53],
+    [0xA4, 0xB5],
+    [0xA4, 0xB6],
+    [0x00, 0x00],
+    [0xA4, 0xB4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0x4A],
+    [0xA5, 0x4B],
+    [0xA5, 0x4C],
+    [0xA5, 0x4D],
+    [0xA5, 0x49],
+    [0xA5, 0x50],
+    [0xC9, 0x6A],
+    [0x00, 0x00],
+    [0xC9, 0x66],
+    [0xC6, 0xDF],
+    [0xA5, 0x51],
+    [0xA5, 0x61],
+    [0x00, 0x00],
+    [0xC9, 0x68],
+    [0x00, 0x00],
+    [0xA5, 0x4E],
+    [0xA5, 0x4F],
+    [0xA5, 0x48],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x65],
+    [0xC9, 0x67],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0xF5],
+    [0xC9, 0xB0],
+    [0xA5, 0xF2],
+    [0xA5, 0xF6],
+    [0xC9, 0xBA],
+    [0xC9, 0xAE],
+    [0xA5, 0xF3],
+    [0xC9, 0xB2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0xF4],
+    [0x00, 0x00],
+    [0xA5, 0xF7],
+    [0x00, 0x00],
+    [0xA5, 0xE9],
+    [0xC9, 0xB1],
+    [0xA5, 0xF8],
+    [0xC9, 0xB5],
+    [0x00, 0x00],
+    [0xC9, 0xB9],
+    [0xC9, 0xB6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xB3],
+    [0xA5, 0xEA],
+    [0xA5, 0xEC],
+    [0xA5, 0xF9],
+    [0x00, 0x00],
+    [0xA5, 0xEE],
+    [0xC9, 0xAB],
+    [0xA5, 0xF1],
+    [0xA5, 0xEF],
+    [0xA5, 0xF0],
+    [0xC9, 0xBB],
+    [0xC9, 0xB8],
+    [0xC9, 0xAF],
+    [0xA5, 0xED],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xAC],
+    [0xA5, 0xEB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xB4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xB7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xAD],
+    [0xCA, 0x66],
+    [0x00, 0x00],
+    [0xA7, 0x42],
+    [0xA6, 0xF4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0x67],
+    [0xA6, 0xF1],
+    [0x00, 0x00],
+    [0xA7, 0x44],
+    [0x00, 0x00],
+    [0xA6, 0xF9],
+    [0x00, 0x00],
+    [0xA6, 0xF8],
+    [0xCA, 0x5B],
+    [0xA6, 0xFC],
+    [0xA6, 0xF7],
+    [0xCA, 0x60],
+    [0xCA, 0x68],
+    [0x00, 0x00],
+    [0xCA, 0x64],
+    [0x00, 0x00],
+    [0xA6, 0xFA],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0xFD],
+    [0xA6, 0xEE],
+    [0xA7, 0x47],
+    [0xCA, 0x5D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xBD],
+    [0xA6, 0xEC],
+    [0xA7, 0x43],
+    [0xA6, 0xED],
+    [0xA6, 0xF5],
+    [0xA6, 0xF6],
+    [0xCA, 0x62],
+    [0xCA, 0x5E],
+    [0xA6, 0xFB],
+    [0xA6, 0xF3],
+    [0xCA, 0x5A],
+    [0xA6, 0xEF],
+    [0xCA, 0x65],
+    [0xA7, 0x45],
+    [0xA7, 0x48],
+    [0xA6, 0xF2],
+    [0xA7, 0x40],
+    [0xA7, 0x46],
+    [0xA6, 0xF0],
+    [0xCA, 0x63],
+    [0xA7, 0x41],
+    [0xCA, 0x69],
+    [0xCA, 0x5C],
+    [0xA6, 0xFE],
+    [0xCA, 0x5F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0x61],
+    [0x00, 0x00],
+    [0xA8, 0xD8],
+    [0xCB, 0xBF],
+    [0xCB, 0xCB],
+    [0xA8, 0xD0],
+    [0x00, 0x00],
+    [0xCB, 0xCC],
+    [0xA8, 0xCB],
+    [0xA8, 0xD5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xCE],
+    [0xCB, 0xB9],
+    [0xA8, 0xD6],
+    [0xCB, 0xB8],
+    [0xCB, 0xBC],
+    [0xCB, 0xC3],
+    [0xCB, 0xC1],
+    [0xA8, 0xDE],
+    [0xA8, 0xD9],
+    [0xCB, 0xB3],
+    [0xCB, 0xB5],
+    [0xA8, 0xDB],
+    [0xA8, 0xCF],
+    [0xCB, 0xB6],
+    [0xCB, 0xC2],
+    [0xCB, 0xC9],
+    [0xA8, 0xD4],
+    [0xCB, 0xBB],
+    [0xCB, 0xB4],
+    [0xA8, 0xD3],
+    [0xCB, 0xB7],
+    [0xA8, 0xD7],
+    [0xCB, 0xBA],
+    [0x00, 0x00],
+    [0xA8, 0xD2],
+    [0x00, 0x00],
+    [0xA8, 0xCD],
+    [0x00, 0x00],
+    [0xA8, 0xDC],
+    [0xCB, 0xC4],
+    [0xA8, 0xDD],
+    [0xCB, 0xC8],
+    [0x00, 0x00],
+    [0xCB, 0xC6],
+    [0xCB, 0xCA],
+    [0xA8, 0xDA],
+    [0xCB, 0xBE],
+    [0xCB, 0xB2],
+    [0x00, 0x00],
+    [0xCB, 0xC0],
+    [0xA8, 0xD1],
+    [0xCB, 0xC5],
+    [0xA8, 0xCC],
+    [0xCB, 0xC7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0x57],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0x56],
+    [0xAB, 0x4A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCD, 0xE0],
+    [0xCD, 0xE8],
+    [0x00, 0x00],
+    [0xAB, 0x49],
+    [0xAB, 0x51],
+    [0xAB, 0x5D],
+    [0x00, 0x00],
+    [0xCD, 0xEE],
+    [0xCD, 0xEC],
+    [0xCD, 0xE7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0x4B],
+    [0xCD, 0xED],
+    [0xCD, 0xE3],
+    [0xAB, 0x59],
+    [0xAB, 0x50],
+    [0xAB, 0x58],
+    [0xCD, 0xDE],
+    [0x00, 0x00],
+    [0xCD, 0xEA],
+    [0x00, 0x00],
+    [0xCD, 0xE1],
+    [0xAB, 0x54],
+    [0xCD, 0xE2],
+    [0x00, 0x00],
+    [0xCD, 0xDD],
+    [0xAB, 0x5B],
+    [0xAB, 0x4E],
+    [0xAB, 0x57],
+    [0xAB, 0x4D],
+    [0x00, 0x00],
+    [0xCD, 0xDF],
+    [0xCD, 0xE4],
+    [0x00, 0x00],
+    [0xCD, 0xEB],
+    [0xAB, 0x55],
+    [0xAB, 0x52],
+    [0xCD, 0xE6],
+    [0xAB, 0x5A],
+    [0xCD, 0xE9],
+    [0xCD, 0xE5],
+    [0xAB, 0x4F],
+    [0xAB, 0x5C],
+    [0xAB, 0x53],
+    [0xAB, 0x4C],
+    [0xAB, 0x48],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCD, 0xEF],
+    [0x00, 0x00],
+    [0xAD, 0xD7],
+    [0xAD, 0xC1],
+    [0x00, 0x00],
+    [0xAD, 0xD1],
+    [0x00, 0x00],
+    [0xAD, 0xD6],
+    [0xD0, 0xD0],
+    [0xD0, 0xCF],
+    [0xD0, 0xD4],
+    [0xD0, 0xD5],
+    [0xAD, 0xC4],
+    [0x00, 0x00],
+    [0xAD, 0xCD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAD, 0xDA],
+    [0x00, 0x00],
+    [0xAD, 0xCE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xC9],
+    [0xAD, 0xC7],
+    [0xD0, 0xCA],
+    [0xFA, 0x59],
+    [0xAD, 0xDC],
+    [0x00, 0x00],
+    [0xAD, 0xD3],
+    [0xAD, 0xBE],
+    [0xAD, 0xBF],
+    [0xD0, 0xDD],
+    [0xB0, 0xBF],
+    [0x00, 0x00],
+    [0xAD, 0xCC],
+    [0xAD, 0xCB],
+    [0xD0, 0xCB],
+    [0xAD, 0xCF],
+    [0xD4, 0x5B],
+    [0xAD, 0xC6],
+    [0xD0, 0xD6],
+    [0xAD, 0xD5],
+    [0xAD, 0xD4],
+    [0xAD, 0xCA],
+    [0xD0, 0xCE],
+    [0xD0, 0xD7],
+    [0x00, 0x00],
+    [0xD0, 0xC8],
+    [0xAD, 0xC9],
+    [0xD0, 0xD8],
+    [0xAD, 0xD2],
+    [0xD0, 0xCC],
+    [0xAD, 0xC0],
+    [0x00, 0x00],
+    [0xAD, 0xC3],
+    [0xAD, 0xC2],
+    [0xD0, 0xD9],
+    [0xAD, 0xD0],
+    [0xAD, 0xC5],
+    [0xAD, 0xD9],
+    [0xAD, 0xDB],
+    [0xD0, 0xD3],
+    [0xAD, 0xD8],
+    [0x00, 0x00],
+    [0xD0, 0xDB],
+    [0xD0, 0xCD],
+    [0xD0, 0xDC],
+    [0x00, 0x00],
+    [0xD0, 0xD1],
+    [0x00, 0x00],
+    [0xD0, 0xDA],
+    [0x00, 0x00],
+    [0xD0, 0xD2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAD, 0xC8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0x63],
+    [0xD4, 0x57],
+    [0x00, 0x00],
+    [0xB0, 0xB3],
+    [0x00, 0x00],
+    [0xD4, 0x5C],
+    [0xD4, 0x62],
+    [0xB0, 0xB2],
+    [0xD4, 0x55],
+    [0xB0, 0xB6],
+    [0xD4, 0x59],
+    [0xD4, 0x52],
+    [0xB0, 0xB4],
+    [0xD4, 0x56],
+    [0xB0, 0xB9],
+    [0xB0, 0xBE],
+    [0x00, 0x00],
+    [0xD4, 0x67],
+    [0x00, 0x00],
+    [0xD4, 0x51],
+    [0x00, 0x00],
+    [0xB0, 0xBA],
+    [0x00, 0x00],
+    [0xD4, 0x66],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xB5],
+    [0xD4, 0x58],
+    [0xB0, 0xB1],
+    [0xD4, 0x53],
+    [0xD4, 0x4F],
+    [0xD4, 0x5D],
+    [0xD4, 0x50],
+    [0xD4, 0x4E],
+    [0xD4, 0x5A],
+    [0xD4, 0x60],
+    [0xD4, 0x61],
+    [0xB0, 0xB7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0x5B],
+    [0xD4, 0x5E],
+    [0xD4, 0x4D],
+    [0xD4, 0x5F],
+    [0x00, 0x00],
+    [0xB0, 0xC1],
+    [0xD4, 0x64],
+    [0xB0, 0xC0],
+    [0xD4, 0x4C],
+    [0x00, 0x00],
+    [0xD4, 0x54],
+    [0xD4, 0x65],
+    [0xB0, 0xBC],
+    [0xB0, 0xBB],
+    [0xB0, 0xB8],
+    [0xB0, 0xBD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xAF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xB0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xC8],
+    [0x00, 0x00],
+    [0xD8, 0x5E],
+    [0xD8, 0x57],
+    [0x00, 0x00],
+    [0xB3, 0xC5],
+    [0x00, 0x00],
+    [0xD8, 0x5F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0x55],
+    [0xD8, 0x58],
+    [0xB3, 0xC4],
+    [0xD8, 0x59],
+    [0x00, 0x00],
+    [0xFD, 0x56],
+    [0xB3, 0xC7],
+    [0xD8, 0x5D],
+    [0x00, 0x00],
+    [0xD8, 0x53],
+    [0xD8, 0x52],
+    [0xB3, 0xC9],
+    [0x00, 0x00],
+    [0xB3, 0xCA],
+    [0xB3, 0xC6],
+    [0xB3, 0xCB],
+    [0xD8, 0x51],
+    [0xD8, 0x5C],
+    [0xD8, 0x5A],
+    [0xD8, 0x54],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xC3],
+    [0xD8, 0x56],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB6, 0xCA],
+    [0xB6, 0xC4],
+    [0xDC, 0xB7],
+    [0xB6, 0xCD],
+    [0xDC, 0xBD],
+    [0xDC, 0xC0],
+    [0xB6, 0xC6],
+    [0xB6, 0xC7],
+    [0xDC, 0xBA],
+    [0xB6, 0xC5],
+    [0xDC, 0xC3],
+    [0xB6, 0xCB],
+    [0xDC, 0xC4],
+    [0x00, 0x00],
+    [0xDC, 0xBF],
+    [0xB6, 0xCC],
+    [0x00, 0x00],
+    [0xDC, 0xB4],
+    [0xB6, 0xC9],
+    [0xDC, 0xB5],
+    [0x00, 0x00],
+    [0xDC, 0xBE],
+    [0xDC, 0xBC],
+    [0x00, 0x00],
+    [0xDC, 0xB8],
+    [0xB6, 0xC8],
+    [0xDC, 0xB6],
+    [0xB6, 0xCE],
+    [0xDC, 0xBB],
+    [0xDC, 0xC2],
+    [0xDC, 0xB9],
+    [0xDC, 0xC1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB9, 0xB6],
+    [0xB9, 0xB3],
+    [0x00, 0x00],
+    [0xB9, 0xB4],
+    [0x00, 0x00],
+    [0xE0, 0xF9],
+    [0xE0, 0xF1],
+    [0xB9, 0xB2],
+    [0xB9, 0xAF],
+    [0xE0, 0xF2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB9, 0xB1],
+    [0xE0, 0xF5],
+    [0x00, 0x00],
+    [0xE0, 0xF7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE0, 0xFE],
+    [0xFC, 0x72],
+    [0x00, 0x00],
+    [0xE0, 0xFD],
+    [0xE0, 0xF8],
+    [0xB9, 0xAE],
+    [0xE0, 0xF0],
+    [0xB9, 0xAC],
+    [0xE0, 0xF3],
+    [0xB9, 0xB7],
+    [0xE0, 0xF6],
+    [0x00, 0x00],
+    [0xE0, 0xFA],
+    [0xB9, 0xB0],
+    [0xB9, 0xAD],
+    [0xE0, 0xFC],
+    [0xE0, 0xFB],
+    [0xB9, 0xB5],
+    [0x00, 0x00],
+    [0xE0, 0xF4],
+    [0x00, 0x00],
+    [0xBB, 0xF8],
+    [0xE4, 0xEC],
+    [0x00, 0x00],
+    [0xE4, 0xE9],
+    [0xBB, 0xF9],
+    [0x00, 0x00],
+    [0xBB, 0xF7],
+    [0x00, 0x00],
+    [0xE4, 0xF0],
+    [0xE4, 0xED],
+    [0xE4, 0xE6],
+    [0xBB, 0xF6],
+    [0xFA, 0x67],
+    [0xBB, 0xFA],
+    [0xE4, 0xE7],
+    [0xBB, 0xF5],
+    [0xBB, 0xFD],
+    [0xE4, 0xEA],
+    [0xE4, 0xEB],
+    [0xBB, 0xFB],
+    [0xBB, 0xFC],
+    [0xE4, 0xF1],
+    [0xE4, 0xEE],
+    [0xE4, 0xEF],
+    [0x00, 0x00],
+    [0xFA, 0x69],
+    [0x00, 0x00],
+    [0xBE, 0xAA],
+    [0xE8, 0xF8],
+    [0xBE, 0xA7],
+    [0xE8, 0xF5],
+    [0xBE, 0xA9],
+    [0xBE, 0xAB],
+    [0x00, 0x00],
+    [0xE8, 0xF6],
+    [0xBE, 0xA8],
+    [0x00, 0x00],
+    [0xE8, 0xF7],
+    [0x00, 0x00],
+    [0xE8, 0xF4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC0, 0x76],
+    [0xEC, 0xBD],
+    [0xC0, 0x77],
+    [0xEC, 0xBB],
+    [0x00, 0x00],
+    [0xEC, 0xBC],
+    [0xEC, 0xBA],
+    [0xEC, 0xB9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEC, 0xBE],
+    [0xC0, 0x75],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEF, 0xB8],
+    [0xEF, 0xB9],
+    [0x00, 0x00],
+    [0xE4, 0xE8],
+    [0xEF, 0xB7],
+    [0xC0, 0x78],
+    [0xC3, 0x5F],
+    [0xF1, 0xEB],
+    [0xF1, 0xEC],
+    [0x00, 0x00],
+    [0xC4, 0xD7],
+    [0xC4, 0xD8],
+    [0xF5, 0xC1],
+    [0xF5, 0xC0],
+    [0xC5, 0x6C],
+    [0xC5, 0x6B],
+    [0xF7, 0xD0],
+    [0x00, 0x00],
+    [0xA4, 0x49],
+    [0xA4, 0x61],
+    [0xA4, 0xB9],
+    [0x00, 0x00],
+    [0xA4, 0xB8],
+    [0xA5, 0x53],
+    [0xA5, 0x52],
+    [0xA5, 0xFC],
+    [0xA5, 0xFB],
+    [0xA5, 0xFD],
+    [0xA5, 0xFA],
+    [0x00, 0x00],
+    [0xA7, 0x4A],
+    [0xA7, 0x49],
+    [0xA7, 0x4B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xE0],
+    [0x00, 0x00],
+    [0xA8, 0xDF],
+    [0xA8, 0xE1],
+    [0x00, 0x00],
+    [0xAB, 0x5E],
+    [0x00, 0x00],
+    [0xA2, 0x59],
+    [0xD0, 0xDE],
+    [0xA2, 0x5A],
+    [0xB0, 0xC2],
+    [0xA2, 0x5C],
+    [0xA2, 0x5B],
+    [0xD8, 0x60],
+    [0xFA, 0x6F],
+    [0xA2, 0x5D],
+    [0xB9, 0xB8],
+    [0xA2, 0x5E],
+    [0x00, 0x00],
+    [0xA4, 0x4A],
+    [0x00, 0x00],
+    [0xA4, 0xBA],
+    [0xA5, 0xFE],
+    [0xA8, 0xE2],
+    [0xFA, 0x71],
+    [0xA4, 0x4B],
+    [0xA4, 0xBD],
+    [0xA4, 0xBB],
+    [0xA4, 0xBC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x40],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0x4C],
+    [0xA8, 0xE4],
+    [0xA8, 0xE3],
+    [0xA8, 0xE5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAD, 0xDD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBE, 0xAC],
+    [0x00, 0x00],
+    [0xC6, 0xC3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x4E],
+    [0xC8, 0xA2],
+    [0xA5, 0x54],
+    [0xA5, 0x55],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x41],
+    [0x00, 0x00],
+    [0xCA, 0x6A],
+    [0x00, 0x00],
+    [0xAB, 0x60],
+    [0xAB, 0x5F],
+    [0xD0, 0xE0],
+    [0xD0, 0xDF],
+    [0xB0, 0xC3],
+    [0xC6, 0xC4],
+    [0xA4, 0xBE],
+    [0xC9, 0x55],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xCD],
+    [0x00, 0x00],
+    [0xAB, 0x61],
+    [0x00, 0x00],
+    [0xAD, 0xE0],
+    [0x00, 0x00],
+    [0xAD, 0xDE],
+    [0xAD, 0xDF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBE, 0xAD],
+    [0xC6, 0xC5],
+    [0xA5, 0x56],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x42],
+    [0xC9, 0xBC],
+    [0xFA, 0x7D],
+    [0xFA, 0xA8],
+    [0x00, 0x00],
+    [0xFA, 0x47],
+    [0xA7, 0x4D],
+    [0xA7, 0x4E],
+    [0xFA, 0x7E],
+    [0xCA, 0x6B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xCE],
+    [0xA8, 0xE6],
+    [0xCB, 0xCF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xE2],
+    [0xD0, 0xE3],
+    [0xAD, 0xE3],
+    [0xFD, 0xB6],
+    [0xD0, 0xE4],
+    [0xFA, 0xA2],
+    [0xD0, 0xE1],
+    [0xAD, 0xE4],
+    [0xAD, 0xE2],
+    [0xAD, 0xE1],
+    [0xD0, 0xE5],
+    [0xFA, 0xA3],
+    [0xD4, 0x68],
+    [0xFA, 0xA4],
+    [0x00, 0x00],
+    [0xFA, 0xA6],
+    [0xD8, 0x61],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDC, 0xC5],
+    [0xE1, 0x40],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBB, 0xFE],
+    [0xBE, 0xAE],
+    [0xE8, 0xF9],
+    [0xFD, 0xDB],
+    [0xA4, 0x4C],
+    [0xA4, 0x5A],
+    [0xFA, 0xA9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0xAB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xC4],
+    [0xB3, 0xCD],
+    [0x00, 0x00],
+    [0xB9, 0xB9],
+    [0xFC, 0x7A],
+    [0xC9, 0x42],
+    [0xA4, 0xBF],
+    [0x00, 0x00],
+    [0xA5, 0x59],
+    [0xA5, 0x57],
+    [0xA5, 0x58],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xE7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0x4D],
+    [0xA4, 0x4E],
+    [0xC8, 0x7D],
+    [0xA4, 0x62],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0xC0],
+    [0xA4, 0xC1],
+    [0xA4, 0xC2],
+    [0xC9, 0xBE],
+    [0xA5, 0x5A],
+    [0xFA, 0xB0],
+    [0xC9, 0x6B],
+    [0x00, 0x00],
+    [0xA6, 0x46],
+    [0x00, 0x00],
+    [0xC9, 0xBF],
+    [0xA6, 0x44],
+    [0xA6, 0x45],
+    [0xC9, 0xBD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x47],
+    [0xA6, 0x43],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0x6C],
+    [0xAA, 0xEC],
+    [0xCA, 0x6D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0x6E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0x50],
+    [0xA7, 0x4F],
+    [0xFA, 0xB1],
+    [0x00, 0x00],
+    [0xA7, 0x53],
+    [0xA7, 0x51],
+    [0xA7, 0x52],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xED],
+    [0x00, 0x00],
+    [0xA8, 0xEC],
+    [0xCB, 0xD4],
+    [0xCB, 0xD1],
+    [0xCB, 0xD2],
+    [0x00, 0x00],
+    [0xCB, 0xD0],
+    [0xA8, 0xEE],
+    [0xA8, 0xEA],
+    [0xA8, 0xE9],
+    [0x00, 0x00],
+    [0xA8, 0xEB],
+    [0xA8, 0xE8],
+    [0xFA, 0xB2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xEF],
+    [0x00, 0x00],
+    [0xAB, 0x63],
+    [0xCD, 0xF0],
+    [0x00, 0x00],
+    [0xCB, 0xD3],
+    [0xAB, 0x68],
+    [0x00, 0x00],
+    [0xCD, 0xF1],
+    [0xAB, 0x64],
+    [0xAB, 0x67],
+    [0xAB, 0x66],
+    [0xAB, 0x65],
+    [0xAB, 0x62],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xE8],
+    [0x00, 0x00],
+    [0xAD, 0xE7],
+    [0xD0, 0xEB],
+    [0xAD, 0xE5],
+    [0xFA, 0xB4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xE7],
+    [0xAD, 0xE8],
+    [0xAD, 0xE6],
+    [0xAD, 0xE9],
+    [0xD0, 0xE9],
+    [0xD0, 0xEA],
+    [0x00, 0x00],
+    [0xD0, 0xE6],
+    [0xD0, 0xEC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xD1],
+    [0xB0, 0xC5],
+    [0xD4, 0x69],
+    [0xD4, 0x6B],
+    [0xD4, 0x6A],
+    [0xD4, 0x6C],
+    [0xB0, 0xC6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xCE],
+    [0x00, 0x00],
+    [0xB3, 0xCF],
+    [0xB3, 0xD0],
+    [0x00, 0x00],
+    [0xB6, 0xD0],
+    [0xDC, 0xC7],
+    [0x00, 0x00],
+    [0xDC, 0xC6],
+    [0xDC, 0xC8],
+    [0xDC, 0xC9],
+    [0xB6, 0xD1],
+    [0x00, 0x00],
+    [0xB6, 0xCF],
+    [0xE1, 0x41],
+    [0xE1, 0x42],
+    [0xB9, 0xBB],
+    [0xB9, 0xBA],
+    [0xE3, 0x5A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0x40],
+    [0xBC, 0x41],
+    [0xBC, 0x42],
+    [0xBC, 0x44],
+    [0xE4, 0xF2],
+    [0xE4, 0xF3],
+    [0xBC, 0x43],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBE, 0xAF],
+    [0x00, 0x00],
+    [0xBE, 0xB0],
+    [0xFA, 0xB5],
+    [0x00, 0x00],
+    [0xF1, 0xED],
+    [0xF5, 0xC3],
+    [0xF5, 0xC2],
+    [0xF7, 0xD1],
+    [0x00, 0x00],
+    [0xA4, 0x4F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0x5C],
+    [0xA5, 0x5B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x48],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xC0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0x55],
+    [0xA7, 0x56],
+    [0xA7, 0x54],
+    [0xA7, 0x57],
+    [0xCA, 0x6F],
+    [0xCA, 0x70],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0xB3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0xB6],
+    [0x00, 0x00],
+    [0xA8, 0xF1],
+    [0xCB, 0xD5],
+    [0x00, 0x00],
+    [0xA8, 0xF0],
+    [0x00, 0x00],
+    [0xCD, 0xF2],
+    [0xAB, 0x6C],
+    [0xCD, 0xF3],
+    [0xAB, 0x6B],
+    [0x00, 0x00],
+    [0xFA, 0xB7],
+    [0x00, 0x00],
+    [0xAB, 0x69],
+    [0x00, 0x00],
+    [0xAB, 0x6A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xED],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFB, 0xC4],
+    [0x00, 0x00],
+    [0xB0, 0xC7],
+    [0xD4, 0x6E],
+    [0x00, 0x00],
+    [0xB0, 0xCA],
+    [0xD4, 0x6D],
+    [0xB1, 0xE5],
+    [0xB0, 0xC9],
+    [0xB0, 0xC8],
+    [0x00, 0x00],
+    [0xB3, 0xD4],
+    [0x00, 0x00],
+    [0xB3, 0xD3],
+    [0xB3, 0xD2],
+    [0xB6, 0xD2],
+    [0xFA, 0xBA],
+    [0x00, 0x00],
+    [0xB6, 0xD5],
+    [0xB6, 0xD6],
+    [0xB6, 0xD4],
+    [0x00, 0x00],
+    [0xB6, 0xD3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0x43],
+    [0x00, 0x00],
+    [0xE1, 0x44],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE4, 0xF5],
+    [0xBC, 0x45],
+    [0xE4, 0xF4],
+    [0x00, 0x00],
+    [0xBE, 0xB1],
+    [0xEC, 0xBF],
+    [0xC0, 0x79],
+    [0x00, 0x00],
+    [0xF1, 0xEE],
+    [0xC4, 0x55],
+    [0xC6, 0xC6],
+    [0xA4, 0x63],
+    [0xA4, 0xC3],
+    [0xC9, 0x56],
+    [0x00, 0x00],
+    [0xA4, 0xC4],
+    [0xA4, 0xC5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0x5D],
+    [0xA5, 0x5E],
+    [0x00, 0x00],
+    [0xA6, 0x49],
+    [0xCA, 0x71],
+    [0xCB, 0xD6],
+    [0xCB, 0xD7],
+    [0x00, 0x00],
+    [0xAB, 0x6D],
+    [0xD0, 0xEE],
+    [0xB0, 0xCC],
+    [0xB0, 0xCB],
+    [0xD8, 0x63],
+    [0xD8, 0x62],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0x50],
+    [0xA4, 0xC6],
+    [0xA5, 0x5F],
+    [0x00, 0x00],
+    [0xB0, 0xCD],
+    [0xC9, 0x43],
+    [0x00, 0x00],
+    [0xC9, 0x6C],
+    [0xA5, 0x60],
+    [0x00, 0x00],
+    [0xC9, 0xC2],
+    [0xA6, 0x4B],
+    [0xA6, 0x4A],
+    [0xC9, 0xC1],
+    [0xA7, 0x58],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAD, 0xEA],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0x6F],
+    [0x00, 0x00],
+    [0xB6, 0xD7],
+    [0xE1, 0x45],
+    [0xB9, 0xBC],
+    [0x00, 0x00],
+    [0xFA, 0xC4],
+    [0xE8, 0xFA],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xF3, 0xFD],
+    [0xC6, 0xC7],
+    [0xA4, 0xC7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xD8],
+    [0xCD, 0xF4],
+    [0xB0, 0xD0],
+    [0xB0, 0xCE],
+    [0xB0, 0xCF],
+    [0xA4, 0x51],
+    [0xFA, 0xAA],
+    [0xA4, 0x64],
+    [0xA2, 0xCD],
+    [0xA4, 0xCA],
+    [0x00, 0x00],
+    [0xA4, 0xC9],
+    [0xA4, 0xC8],
+    [0xA5, 0x63],
+    [0xA5, 0x62],
+    [0x00, 0x00],
+    [0xC9, 0x6D],
+    [0xC9, 0xC3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xF5],
+    [0xA8, 0xF2],
+    [0xA8, 0xF4],
+    [0xA8, 0xF3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0x6E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xD5],
+    [0x00, 0x00],
+    [0xA4, 0x52],
+    [0x00, 0x00],
+    [0xA4, 0xCB],
+    [0x00, 0x00],
+    [0xA5, 0x65],
+    [0xA5, 0x64],
+    [0x00, 0x00],
+    [0xCA, 0x72],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xF6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC6, 0xC8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x57],
+    [0xFA, 0xD1],
+    [0xA5, 0x67],
+    [0xA5, 0x66],
+    [0xA6, 0x4C],
+    [0xA6, 0x4D],
+    [0xCA, 0x73],
+    [0xA7, 0x59],
+    [0xFA, 0xD2],
+    [0xA7, 0x5A],
+    [0x00, 0x00],
+    [0xA8, 0xF7],
+    [0xA8, 0xF8],
+    [0xA8, 0xF9],
+    [0x00, 0x00],
+    [0xAB, 0x6F],
+    [0xCD, 0xF5],
+    [0x00, 0x00],
+    [0xFA, 0xD4],
+    [0xAD, 0xEB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x44],
+    [0x00, 0x00],
+    [0xA4, 0xCC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xC4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0x74],
+    [0xCA, 0x75],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xD9],
+    [0xFA, 0xD9],
+    [0xCB, 0xDA],
+    [0x00, 0x00],
+    [0xCD, 0xF7],
+    [0xCD, 0xF6],
+    [0xCD, 0xF9],
+    [0xCD, 0xF8],
+    [0xAB, 0x70],
+    [0x00, 0x00],
+    [0xD4, 0x70],
+    [0xAD, 0xED],
+    [0xD0, 0xEF],
+    [0xAD, 0xEC],
+    [0xFA, 0xDB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0x64],
+    [0xB3, 0xD6],
+    [0xFB, 0xF7],
+    [0xD8, 0x65],
+    [0xFB, 0xFA],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0xDC],
+    [0xE1, 0x46],
+    [0xB9, 0xBD],
+    [0xFA, 0xDD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0x46],
+    [0x00, 0x00],
+    [0xF1, 0xEF],
+    [0x00, 0x00],
+    [0xC6, 0xC9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x58],
+    [0x00, 0x00],
+    [0xA5, 0x68],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0xE2],
+    [0x00, 0x00],
+    [0xB0, 0xD1],
+    [0x00, 0x00],
+    [0xFA, 0xE3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0x53],
+    [0xA4, 0x65],
+    [0xA4, 0xCE],
+    [0xA4, 0xCD],
+    [0x00, 0x00],
+    [0xA4, 0xCF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA8, 0xFB],
+    [0x00, 0x00],
+    [0xA8, 0xFA],
+    [0xA8, 0xFC],
+    [0x00, 0x00],
+    [0xFA, 0xE7],
+    [0x00, 0x00],
+    [0xAB, 0x71],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAD, 0xEE],
+    [0xFA, 0xEA],
+    [0xE8, 0xFB],
+    [0xC2, 0x4F],
+    [0xA4, 0x66],
+    [0xA5, 0x6A],
+    [0xA5, 0x79],
+    [0xA5, 0x74],
+    [0x00, 0x00],
+    [0xA5, 0x6F],
+    [0xA5, 0x6E],
+    [0xA5, 0x75],
+    [0xA5, 0x73],
+    [0xA5, 0x6C],
+    [0xA5, 0x7A],
+    [0xA5, 0x6D],
+    [0xA5, 0x69],
+    [0xA5, 0x78],
+    [0xA5, 0x77],
+    [0xA5, 0x76],
+    [0xA5, 0x6B],
+    [0x00, 0x00],
+    [0xA5, 0x72],
+    [0xFA, 0xED],
+    [0x00, 0x00],
+    [0xA5, 0x71],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0x7B],
+    [0xA5, 0x70],
+    [0x00, 0x00],
+    [0xFB, 0x59],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x53],
+    [0x00, 0x00],
+    [0xA6, 0x59],
+    [0xA6, 0x55],
+    [0x00, 0x00],
+    [0xA6, 0x5B],
+    [0xC9, 0xC5],
+    [0xA6, 0x58],
+    [0xA6, 0x4E],
+    [0xA6, 0x51],
+    [0xA6, 0x54],
+    [0xA6, 0x50],
+    [0xA6, 0x57],
+    [0xA6, 0x5A],
+    [0xA6, 0x4F],
+    [0xA6, 0x52],
+    [0xA6, 0x56],
+    [0xA6, 0x5C],
+    [0xFA, 0xEF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0x7E],
+    [0xCA, 0x7B],
+    [0x00, 0x00],
+    [0xA7, 0x67],
+    [0xCA, 0x7C],
+    [0xA7, 0x5B],
+    [0xA7, 0x5D],
+    [0xA7, 0x75],
+    [0xA7, 0x70],
+    [0xFD, 0x6D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0xA5],
+    [0xCA, 0x7D],
+    [0xA7, 0x5F],
+    [0xA7, 0x61],
+    [0xCA, 0xA4],
+    [0xA7, 0x68],
+    [0xCA, 0x78],
+    [0xA7, 0x74],
+    [0xA7, 0x76],
+    [0xA7, 0x5C],
+    [0xA7, 0x6D],
+    [0xFB, 0x44],
+    [0xCA, 0x76],
+    [0xA7, 0x73],
+    [0x00, 0x00],
+    [0xA7, 0x64],
+    [0x00, 0x00],
+    [0xA7, 0x6E],
+    [0xA7, 0x6F],
+    [0xCA, 0x77],
+    [0xA7, 0x6C],
+    [0xA7, 0x6A],
+    [0x00, 0x00],
+    [0xA7, 0x6B],
+    [0xA7, 0x71],
+    [0xCA, 0xA1],
+    [0xA7, 0x5E],
+    [0x00, 0x00],
+    [0xA7, 0x72],
+    [0xCA, 0xA3],
+    [0xA7, 0x66],
+    [0xA7, 0x63],
+    [0x00, 0x00],
+    [0xCA, 0x7A],
+    [0xA7, 0x62],
+    [0xCA, 0xA6],
+    [0xA7, 0x65],
+    [0x00, 0x00],
+    [0xA7, 0x69],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0x60],
+    [0xCA, 0xA2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0x79],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xEB],
+    [0xCB, 0xEA],
+    [0xA9, 0x4F],
+    [0xCB, 0xED],
+    [0xCB, 0xEF],
+    [0xCB, 0xE4],
+    [0xCB, 0xE7],
+    [0xCB, 0xEE],
+    [0xA9, 0x50],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xE1],
+    [0xCB, 0xE5],
+    [0xFA, 0xF4],
+    [0x00, 0x00],
+    [0xCB, 0xE9],
+    [0xCE, 0x49],
+    [0xA9, 0x4B],
+    [0xCE, 0x4D],
+    [0xA8, 0xFD],
+    [0xCB, 0xE6],
+    [0xA8, 0xFE],
+    [0xA9, 0x4C],
+    [0xA9, 0x45],
+    [0xA9, 0x41],
+    [0x00, 0x00],
+    [0xCB, 0xE2],
+    [0xA9, 0x44],
+    [0xA9, 0x49],
+    [0xA9, 0x52],
+    [0xCB, 0xE3],
+    [0xCB, 0xDC],
+    [0xA9, 0x43],
+    [0xCB, 0xDD],
+    [0xCB, 0xDF],
+    [0x00, 0x00],
+    [0xA9, 0x46],
+    [0x00, 0x00],
+    [0xA9, 0x48],
+    [0xCB, 0xDB],
+    [0xCB, 0xE0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0x51],
+    [0xA9, 0x4D],
+    [0xCB, 0xE8],
+    [0xA9, 0x53],
+    [0xFA, 0xF8],
+    [0xA9, 0x4A],
+    [0xCB, 0xDE],
+    [0xA9, 0x47],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0x42],
+    [0xA9, 0x40],
+    [0x00, 0x00],
+    [0xCB, 0xEC],
+    [0x00, 0x00],
+    [0xA9, 0x4E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x48],
+    [0xCD, 0xFB],
+    [0xCE, 0x4B],
+    [0x00, 0x00],
+    [0xFA, 0xF9],
+    [0xCD, 0xFD],
+    [0xAB, 0x78],
+    [0xAB, 0xA8],
+    [0xAB, 0x74],
+    [0xAB, 0xA7],
+    [0xAB, 0x7D],
+    [0xAB, 0xA4],
+    [0xAB, 0x72],
+    [0xCD, 0xFC],
+    [0xCE, 0x43],
+    [0xAB, 0xA3],
+    [0xCE, 0x4F],
+    [0xAB, 0xA5],
+    [0x00, 0x00],
+    [0xAB, 0x79],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x45],
+    [0xCE, 0x42],
+    [0xAB, 0x77],
+    [0x00, 0x00],
+    [0xCD, 0xFA],
+    [0xAB, 0xA6],
+    [0xCE, 0x4A],
+    [0xAB, 0x7C],
+    [0xCE, 0x4C],
+    [0xAB, 0xA9],
+    [0xAB, 0x73],
+    [0xAB, 0x7E],
+    [0xAB, 0x7B],
+    [0xCE, 0x40],
+    [0xAB, 0xA1],
+    [0xCE, 0x46],
+    [0xCE, 0x47],
+    [0xAB, 0x7A],
+    [0xAB, 0xA2],
+    [0xAB, 0x76],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0x75],
+    [0xCD, 0xFE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x44],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x4E],
+    [0x00, 0x00],
+    [0xD1, 0x44],
+    [0xAD, 0xFB],
+    [0xD0, 0xF1],
+    [0x00, 0x00],
+    [0xD0, 0xF6],
+    [0xAD, 0xF4],
+    [0xAE, 0x40],
+    [0xD0, 0xF4],
+    [0xAD, 0xEF],
+    [0xAD, 0xF9],
+    [0xAD, 0xFE],
+    [0xD0, 0xFB],
+    [0x00, 0x00],
+    [0xAD, 0xFA],
+    [0xAD, 0xFD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xFE],
+    [0xAD, 0xF5],
+    [0xD0, 0xF5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0x42],
+    [0xD1, 0x43],
+    [0x00, 0x00],
+    [0xAD, 0xF7],
+    [0xD1, 0x41],
+    [0xAD, 0xF3],
+    [0xAE, 0x43],
+    [0x00, 0x00],
+    [0xD0, 0xF8],
+    [0x00, 0x00],
+    [0xAD, 0xF1],
+    [0x00, 0x00],
+    [0xD1, 0x46],
+    [0xD0, 0xF9],
+    [0xD0, 0xFD],
+    [0xAD, 0xF6],
+    [0xAE, 0x42],
+    [0xD0, 0xFA],
+    [0xAD, 0xFC],
+    [0xD1, 0x40],
+    [0xD1, 0x47],
+    [0xD4, 0xA1],
+    [0x00, 0x00],
+    [0xD1, 0x45],
+    [0xAE, 0x44],
+    [0xAD, 0xF0],
+    [0xD0, 0xFC],
+    [0xD0, 0xF3],
+    [0x00, 0x00],
+    [0xAD, 0xF8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xF2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xF7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD0, 0xF0],
+    [0xAE, 0x41],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0x77],
+    [0xFA, 0xF1],
+    [0xB0, 0xE4],
+    [0xD4, 0xA7],
+    [0xB0, 0xE2],
+    [0xB0, 0xDF],
+    [0xD4, 0x7C],
+    [0xB0, 0xDB],
+    [0xD4, 0xA2],
+    [0xB0, 0xE6],
+    [0xD4, 0x76],
+    [0xD4, 0x7B],
+    [0xD4, 0x7A],
+    [0xAD, 0xF2],
+    [0xB0, 0xE1],
+    [0xD4, 0xA5],
+    [0x00, 0x00],
+    [0xD4, 0xA8],
+    [0xD4, 0x73],
+    [0x00, 0x00],
+    [0xB3, 0xE8],
+    [0x00, 0x00],
+    [0xD4, 0xA9],
+    [0xB0, 0xE7],
+    [0x00, 0x00],
+    [0xB0, 0xD9],
+    [0xB0, 0xD6],
+    [0xD4, 0x7E],
+    [0xB0, 0xD3],
+    [0xFB, 0x42],
+    [0xD4, 0xA6],
+    [0xFA, 0xBF],
+    [0xB0, 0xDA],
+    [0xD4, 0xAA],
+    [0x00, 0x00],
+    [0xD4, 0x74],
+    [0xD4, 0xA4],
+    [0xB0, 0xDD],
+    [0xD4, 0x75],
+    [0xD4, 0x78],
+    [0xD4, 0x7D],
+    [0xFB, 0xA3],
+    [0x00, 0x00],
+    [0xB0, 0xDE],
+    [0xB0, 0xDC],
+    [0xB0, 0xE8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xE3],
+    [0xFA, 0xF7],
+    [0xB0, 0xD7],
+    [0xB1, 0xD2],
+    [0x00, 0x00],
+    [0xB0, 0xD8],
+    [0xD4, 0x79],
+    [0xB0, 0xE5],
+    [0xB0, 0xE0],
+    [0xD4, 0xA3],
+    [0xB0, 0xD5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xD4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0x71],
+    [0xD4, 0x72],
+    [0xD8, 0x6A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xD7],
+    [0xB3, 0xDA],
+    [0xD8, 0x75],
+    [0xB3, 0xEE],
+    [0xD8, 0x78],
+    [0xB3, 0xD8],
+    [0xD8, 0x71],
+    [0xB3, 0xDE],
+    [0xB3, 0xE4],
+    [0xB5, 0xBD],
+    [0x00, 0x00],
+    [0xFB, 0x46],
+    [0xB3, 0xE2],
+    [0xD8, 0x6E],
+    [0xB3, 0xEF],
+    [0xB3, 0xDB],
+    [0xB3, 0xE3],
+    [0xD8, 0x76],
+    [0xDC, 0xD7],
+    [0xD8, 0x7B],
+    [0xD8, 0x6F],
+    [0x00, 0x00],
+    [0xD8, 0x66],
+    [0xD8, 0x73],
+    [0xD8, 0x6D],
+    [0xB3, 0xE1],
+    [0xD8, 0x79],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xDD],
+    [0xB3, 0xF1],
+    [0xB3, 0xEA],
+    [0x00, 0x00],
+    [0xB3, 0xDF],
+    [0xB3, 0xDC],
+    [0x00, 0x00],
+    [0xB3, 0xE7],
+    [0x00, 0x00],
+    [0xD8, 0x7A],
+    [0xD8, 0x6C],
+    [0xD8, 0x72],
+    [0xD8, 0x74],
+    [0xD8, 0x68],
+    [0xD8, 0x77],
+    [0xB3, 0xD9],
+    [0xD8, 0x67],
+    [0xFB, 0x47],
+    [0xB3, 0xE0],
+    [0xB3, 0xF0],
+    [0xB3, 0xEC],
+    [0xD8, 0x69],
+    [0xB3, 0xE6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xED],
+    [0xB3, 0xE9],
+    [0xB3, 0xE5],
+    [0x00, 0x00],
+    [0xD8, 0x70],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xEB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDC, 0xD5],
+    [0xDC, 0xD1],
+    [0x00, 0x00],
+    [0xDC, 0xE0],
+    [0xDC, 0xCA],
+    [0xDC, 0xD3],
+    [0xB6, 0xE5],
+    [0xB6, 0xE6],
+    [0xB6, 0xDE],
+    [0xDC, 0xDC],
+    [0xB6, 0xE8],
+    [0xDC, 0xCF],
+    [0xDC, 0xCE],
+    [0xDC, 0xCC],
+    [0xDC, 0xDE],
+    [0xB6, 0xDC],
+    [0xDC, 0xD8],
+    [0xDC, 0xCD],
+    [0xB6, 0xDF],
+    [0xDC, 0xD6],
+    [0xB6, 0xDA],
+    [0xDC, 0xD2],
+    [0xDC, 0xD9],
+    [0xDC, 0xDB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDC, 0xDF],
+    [0xB6, 0xE3],
+    [0xDC, 0xCB],
+    [0xB6, 0xDD],
+    [0xDC, 0xD0],
+    [0x00, 0x00],
+    [0xB6, 0xD8],
+    [0x00, 0x00],
+    [0xB6, 0xE4],
+    [0xDC, 0xDA],
+    [0xB6, 0xE0],
+    [0xB6, 0xE1],
+    [0xB6, 0xE7],
+    [0xB6, 0xDB],
+    [0xA2, 0x5F],
+    [0xB6, 0xD9],
+    [0xDC, 0xD4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB6, 0xE2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDC, 0xDD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB9, 0xCD],
+    [0xB9, 0xC8],
+    [0x00, 0x00],
+    [0xE1, 0x55],
+    [0xE1, 0x51],
+    [0x00, 0x00],
+    [0xE1, 0x4B],
+    [0xB9, 0xC2],
+    [0xB9, 0xBE],
+    [0xE1, 0x54],
+    [0xB9, 0xBF],
+    [0xE1, 0x4E],
+    [0xE1, 0x50],
+    [0x00, 0x00],
+    [0xE1, 0x53],
+    [0xFB, 0x48],
+    [0xB9, 0xC4],
+    [0x00, 0x00],
+    [0xB9, 0xCB],
+    [0xB9, 0xC5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0x49],
+    [0xB9, 0xC6],
+    [0xB9, 0xC7],
+    [0xE1, 0x4C],
+    [0xB9, 0xCC],
+    [0x00, 0x00],
+    [0xE1, 0x4A],
+    [0xE1, 0x4F],
+    [0xB9, 0xC3],
+    [0xE1, 0x48],
+    [0xB9, 0xC9],
+    [0xB9, 0xC1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB9, 0xC0],
+    [0xE1, 0x4D],
+    [0xE1, 0x52],
+    [0x00, 0x00],
+    [0xB9, 0xCA],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0x47],
+    [0x00, 0x00],
+    [0xBC, 0x4D],
+    [0xE5, 0x47],
+    [0x00, 0x00],
+    [0xE5, 0x44],
+    [0x00, 0x00],
+    [0xBC, 0x47],
+    [0xBC, 0x53],
+    [0xBC, 0x54],
+    [0x00, 0x00],
+    [0xBC, 0x4A],
+    [0xE5, 0x42],
+    [0xBC, 0x4C],
+    [0xE4, 0xF9],
+    [0xBC, 0x52],
+    [0xFB, 0x4F],
+    [0xE5, 0x46],
+    [0xBC, 0x49],
+    [0xE5, 0x48],
+    [0xBC, 0x48],
+    [0x00, 0x00],
+    [0xE5, 0x43],
+    [0xE5, 0x45],
+    [0xBC, 0x4B],
+    [0xE5, 0x41],
+    [0xE4, 0xFA],
+    [0xE4, 0xF7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0x6B],
+    [0xE4, 0xFD],
+    [0x00, 0x00],
+    [0xE4, 0xF6],
+    [0xE4, 0xFC],
+    [0xE4, 0xFB],
+    [0x00, 0x00],
+    [0xE4, 0xF8],
+    [0xFB, 0x54],
+    [0xBC, 0x4F],
+    [0xFB, 0x55],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0x4E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0x50],
+    [0xE4, 0xFE],
+    [0xBE, 0xB2],
+    [0xE5, 0x40],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE9, 0x45],
+    [0x00, 0x00],
+    [0xE8, 0xFD],
+    [0x00, 0x00],
+    [0xBE, 0xBE],
+    [0xE9, 0x42],
+    [0xBE, 0xB6],
+    [0xBE, 0xBA],
+    [0xE9, 0x41],
+    [0x00, 0x00],
+    [0xBE, 0xB9],
+    [0xBE, 0xB5],
+    [0xBE, 0xB8],
+    [0xBE, 0xB3],
+    [0xBE, 0xBD],
+    [0xE9, 0x43],
+    [0xE8, 0xFE],
+    [0xBE, 0xBC],
+    [0xE8, 0xFC],
+    [0xBE, 0xBB],
+    [0xE9, 0x44],
+    [0xE9, 0x40],
+    [0xBC, 0x51],
+    [0x00, 0x00],
+    [0xBE, 0xBF],
+    [0xE9, 0x46],
+    [0xBE, 0xB7],
+    [0xBE, 0xB4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEC, 0xC6],
+    [0xEC, 0xC8],
+    [0xC0, 0x7B],
+    [0xEC, 0xC9],
+    [0xEC, 0xC7],
+    [0xEC, 0xC5],
+    [0xEC, 0xC4],
+    [0xC0, 0x7D],
+    [0xEC, 0xC3],
+    [0xC0, 0x7E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEC, 0xC1],
+    [0xEC, 0xC2],
+    [0xC0, 0x7A],
+    [0xC0, 0xA1],
+    [0xC0, 0x7C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEC, 0xC0],
+    [0x00, 0x00],
+    [0xC2, 0x50],
+    [0x00, 0x00],
+    [0xEF, 0xBC],
+    [0xEF, 0xBA],
+    [0xEF, 0xBF],
+    [0xEF, 0xBD],
+    [0x00, 0x00],
+    [0xEF, 0xBB],
+    [0xEF, 0xBE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC3, 0x60],
+    [0xF1, 0xF2],
+    [0xF1, 0xF3],
+    [0xC4, 0x56],
+    [0x00, 0x00],
+    [0xF1, 0xF4],
+    [0xF1, 0xF0],
+    [0xF1, 0xF5],
+    [0xF1, 0xF1],
+    [0xC2, 0x51],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xF3, 0xFE],
+    [0xF4, 0x41],
+    [0xC4, 0x59],
+    [0xF4, 0x40],
+    [0xC4, 0x58],
+    [0xC4, 0x57],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC4, 0x5A],
+    [0xF5, 0xC5],
+    [0xF5, 0xC6],
+    [0x00, 0x00],
+    [0xC4, 0xDA],
+    [0xC4, 0xD9],
+    [0xC4, 0xDB],
+    [0xF5, 0xC4],
+    [0x00, 0x00],
+    [0xF6, 0xD8],
+    [0xF6, 0xD7],
+    [0x00, 0x00],
+    [0xC5, 0x6D],
+    [0xC5, 0x6F],
+    [0xC5, 0x6E],
+    [0xF6, 0xD9],
+    [0xC5, 0xC8],
+    [0xF8, 0xA6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC5, 0xF1],
+    [0x00, 0x00],
+    [0xF8, 0xA5],
+    [0xF8, 0xEE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x49],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0x7D],
+    [0xA5, 0x7C],
+    [0x00, 0x00],
+    [0xA6, 0x5F],
+    [0xA6, 0x5E],
+    [0xC9, 0xC7],
+    [0xA6, 0x5D],
+    [0xC9, 0xC6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0x79],
+    [0xCA, 0xA9],
+    [0x00, 0x00],
+    [0xCA, 0xA8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0x77],
+    [0xA7, 0x7A],
+    [0x00, 0x00],
+    [0xFB, 0x5C],
+    [0xCA, 0xA7],
+    [0xFB, 0x5B],
+    [0xA7, 0x78],
+    [0xFB, 0x57],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xF0],
+    [0x00, 0x00],
+    [0xCB, 0xF1],
+    [0xA9, 0x54],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xAA],
+    [0xFB, 0x5A],
+    [0xD1, 0x48],
+    [0xD1, 0x49],
+    [0xAE, 0x45],
+    [0xAE, 0x46],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0xAC],
+    [0xB0, 0xE9],
+    [0xB0, 0xEB],
+    [0xD4, 0xAB],
+    [0xB0, 0xEA],
+    [0xD8, 0x7C],
+    [0xB3, 0xF2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB6, 0xE9],
+    [0xB6, 0xEA],
+    [0xDC, 0xE1],
+    [0x00, 0x00],
+    [0xB9, 0xCF],
+    [0x00, 0x00],
+    [0xB9, 0xCE],
+    [0x00, 0x00],
+    [0xE5, 0x49],
+    [0xE9, 0x48],
+    [0xE9, 0x47],
+    [0x00, 0x00],
+    [0xF9, 0x6B],
+    [0xA4, 0x67],
+    [0xC9, 0x59],
+    [0x00, 0x00],
+    [0xC9, 0x6E],
+    [0xC9, 0x6F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x62],
+    [0xA6, 0x66],
+    [0xC9, 0xC9],
+    [0x00, 0x00],
+    [0xA6, 0x64],
+    [0xA6, 0x63],
+    [0xC9, 0xC8],
+    [0xA6, 0x65],
+    [0xA6, 0x61],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x60],
+    [0xC9, 0xCA],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xA6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xA3],
+    [0x00, 0x00],
+    [0xA7, 0x7D],
+    [0xCA, 0xAA],
+    [0xFB, 0x64],
+    [0xFB, 0x76],
+    [0x00, 0x00],
+    [0xCA, 0xAB],
+    [0xFB, 0x60],
+    [0xA7, 0xA1],
+    [0x00, 0x00],
+    [0xCA, 0xAD],
+    [0xA7, 0x7B],
+    [0xCA, 0xAE],
+    [0xCA, 0xAC],
+    [0xA7, 0x7E],
+    [0xA7, 0xA2],
+    [0xA7, 0xA5],
+    [0xA7, 0xA4],
+    [0xA7, 0x7C],
+    [0xCA, 0xAF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0x59],
+    [0xCB, 0xFE],
+    [0x00, 0x00],
+    [0xA9, 0x5B],
+    [0x00, 0x00],
+    [0xA9, 0x5A],
+    [0x00, 0x00],
+    [0xCC, 0x40],
+    [0xA9, 0x58],
+    [0xA9, 0x57],
+    [0xCB, 0xF5],
+    [0x00, 0x00],
+    [0xCB, 0xF4],
+    [0x00, 0x00],
+    [0xCB, 0xF2],
+    [0xCB, 0xF7],
+    [0xCB, 0xF6],
+    [0xCB, 0xF3],
+    [0xCB, 0xFC],
+    [0xCB, 0xFD],
+    [0xCB, 0xFA],
+    [0xCB, 0xF8],
+    [0xA9, 0x56],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xFB],
+    [0xA9, 0x5C],
+    [0xCC, 0x41],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCB, 0xF9],
+    [0x00, 0x00],
+    [0xAB, 0xAB],
+    [0xA9, 0x55],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xAC],
+    [0xCE, 0x54],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x5A],
+    [0xFC, 0x67],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xB2],
+    [0xCE, 0x58],
+    [0xCE, 0x5E],
+    [0x00, 0x00],
+    [0xCE, 0x55],
+    [0xCE, 0x59],
+    [0xCE, 0x5B],
+    [0xCE, 0x5D],
+    [0xCE, 0x57],
+    [0x00, 0x00],
+    [0xCE, 0x56],
+    [0xCE, 0x51],
+    [0xCE, 0x52],
+    [0xAB, 0xAD],
+    [0x00, 0x00],
+    [0xAB, 0xAF],
+    [0xAB, 0xAE],
+    [0xCE, 0x53],
+    [0xCE, 0x5C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xB1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x50],
+    [0xD1, 0x53],
+    [0x00, 0x00],
+    [0xD1, 0x52],
+    [0xD1, 0x57],
+    [0xD1, 0x4E],
+    [0x00, 0x00],
+    [0xD1, 0x51],
+    [0xD1, 0x50],
+    [0x00, 0x00],
+    [0xD1, 0x54],
+    [0x00, 0x00],
+    [0xD1, 0x58],
+    [0xAE, 0x47],
+    [0xAE, 0x4A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0x4F],
+    [0xD1, 0x55],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x49],
+    [0xD1, 0x4A],
+    [0x00, 0x00],
+    [0xAB, 0xB0],
+    [0xD4, 0xBA],
+    [0xD1, 0x56],
+    [0x00, 0x00],
+    [0xD1, 0x4D],
+    [0x00, 0x00],
+    [0xAE, 0x48],
+    [0xD1, 0x4C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0xB1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB0, 0xEC],
+    [0xB0, 0xF0],
+    [0xD4, 0xC1],
+    [0xD4, 0xAF],
+    [0xD4, 0xBD],
+    [0xB0, 0xF1],
+    [0xD4, 0xBF],
+    [0xFB, 0x67],
+    [0xD4, 0xC5],
+    [0x00, 0x00],
+    [0xD4, 0xC9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0xC0],
+    [0xD4, 0xB4],
+    [0xD4, 0xBC],
+    [0x00, 0x00],
+    [0xD4, 0xCA],
+    [0xD4, 0xC8],
+    [0xD4, 0xBE],
+    [0xD4, 0xB9],
+    [0xD4, 0xB2],
+    [0xD8, 0xA6],
+    [0xD4, 0xB0],
+    [0xB0, 0xF5],
+    [0xD4, 0xB7],
+    [0xB0, 0xF6],
+    [0xB0, 0xF2],
+    [0xD4, 0xAD],
+    [0xD4, 0xC3],
+    [0xD4, 0xB5],
+    [0xFA, 0xE6],
+    [0x00, 0x00],
+    [0xD4, 0xB3],
+    [0xD4, 0xC6],
+    [0xB0, 0xF3],
+    [0xFB, 0x69],
+    [0xD4, 0xCC],
+    [0xB0, 0xED],
+    [0xB0, 0xEF],
+    [0xD4, 0xBB],
+    [0xD4, 0xB6],
+    [0xAE, 0x4B],
+    [0xB0, 0xEE],
+    [0xD4, 0xB8],
+    [0xD4, 0xC7],
+    [0xD4, 0xCB],
+    [0xD4, 0xC2],
+    [0x00, 0x00],
+    [0xD4, 0xC4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0xAE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xA1],
+    [0x00, 0x00],
+    [0xD8, 0xAA],
+    [0xD8, 0xA9],
+    [0xB3, 0xFA],
+    [0xD8, 0xA2],
+    [0x00, 0x00],
+    [0xB3, 0xFB],
+    [0xB3, 0xF9],
+    [0x00, 0x00],
+    [0xD8, 0xA4],
+    [0xB3, 0xF6],
+    [0xD8, 0xA8],
+    [0xFB, 0x6C],
+    [0xD8, 0xA3],
+    [0xD8, 0xA5],
+    [0xD8, 0x7D],
+    [0xB3, 0xF4],
+    [0x00, 0x00],
+    [0xD8, 0xB2],
+    [0xD8, 0xB1],
+    [0xD8, 0xAE],
+    [0xB3, 0xF3],
+    [0xB3, 0xF7],
+    [0xB3, 0xF8],
+    [0xD1, 0x4B],
+    [0xD8, 0xAB],
+    [0xB3, 0xF5],
+    [0xB0, 0xF4],
+    [0xD8, 0xAD],
+    [0xD8, 0x7E],
+    [0xD8, 0xB0],
+    [0xD8, 0xAF],
+    [0x00, 0x00],
+    [0xD8, 0xB3],
+    [0x00, 0x00],
+    [0xDC, 0xEF],
+    [0x00, 0x00],
+    [0xD8, 0xAC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xA7],
+    [0xDC, 0xE7],
+    [0xB6, 0xF4],
+    [0xB6, 0xF7],
+    [0xB6, 0xF2],
+    [0xDC, 0xE6],
+    [0xDC, 0xEA],
+    [0xDC, 0xE5],
+    [0x00, 0x00],
+    [0xB6, 0xEC],
+    [0xB6, 0xF6],
+    [0xDC, 0xE2],
+    [0xB6, 0xF0],
+    [0xDC, 0xE9],
+    [0x00, 0x00],
+    [0xB6, 0xEE],
+    [0xB6, 0xED],
+    [0xDC, 0xEC],
+    [0xB6, 0xEF],
+    [0xDC, 0xEE],
+    [0xFB, 0x6E],
+    [0xDC, 0xEB],
+    [0xB6, 0xEB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB6, 0xF5],
+    [0xDC, 0xF0],
+    [0xDC, 0xE4],
+    [0xDC, 0xED],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDC, 0xE3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB6, 0xF1],
+    [0x00, 0x00],
+    [0xB6, 0xF3],
+    [0x00, 0x00],
+    [0xDC, 0xE8],
+    [0x00, 0x00],
+    [0xDC, 0xF1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0x5D],
+    [0xB9, 0xD0],
+    [0xE1, 0x63],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB9, 0xD5],
+    [0xE1, 0x5F],
+    [0xE1, 0x66],
+    [0xE1, 0x57],
+    [0xB9, 0xD7],
+    [0xB9, 0xD1],
+    [0xE1, 0x5C],
+    [0xBC, 0x55],
+    [0xE1, 0x5B],
+    [0xE1, 0x64],
+    [0xB9, 0xD2],
+    [0x00, 0x00],
+    [0xB9, 0xD6],
+    [0xE1, 0x5A],
+    [0xE1, 0x60],
+    [0xE1, 0x65],
+    [0xE1, 0x56],
+    [0xB9, 0xD4],
+    [0xE1, 0x5E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0x62],
+    [0xE1, 0x68],
+    [0xE1, 0x58],
+    [0xE1, 0x61],
+    [0x00, 0x00],
+    [0xB9, 0xD3],
+    [0xE1, 0x67],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0x59],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0x59],
+    [0xE5, 0x4B],
+    [0xBC, 0x57],
+    [0xBC, 0x56],
+    [0xE5, 0x4D],
+    [0xE5, 0x52],
+    [0x00, 0x00],
+    [0xE5, 0x4E],
+    [0x00, 0x00],
+    [0xE5, 0x51],
+    [0xBC, 0x5C],
+    [0x00, 0x00],
+    [0xBE, 0xA5],
+    [0xBC, 0x5B],
+    [0xFB, 0x6F],
+    [0xE5, 0x4A],
+    [0xE5, 0x50],
+    [0x00, 0x00],
+    [0xBC, 0x5A],
+    [0xE5, 0x4F],
+    [0x00, 0x00],
+    [0xE5, 0x4C],
+    [0x00, 0x00],
+    [0xBC, 0x58],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE9, 0x4D],
+    [0xF9, 0xD9],
+    [0xE9, 0x4F],
+    [0xE9, 0x4A],
+    [0xBE, 0xC1],
+    [0xE9, 0x4C],
+    [0x00, 0x00],
+    [0xBE, 0xC0],
+    [0xE9, 0x4E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBE, 0xC3],
+    [0xE9, 0x50],
+    [0xBE, 0xC2],
+    [0xE9, 0x49],
+    [0xE9, 0x4B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC0, 0xA5],
+    [0xEC, 0xCC],
+    [0x00, 0x00],
+    [0xC0, 0xA4],
+    [0xEC, 0xCD],
+    [0xC0, 0xA3],
+    [0xEC, 0xCB],
+    [0xC0, 0xA2],
+    [0xEC, 0xCA],
+    [0x00, 0x00],
+    [0xC2, 0x53],
+    [0xC2, 0x52],
+    [0xF1, 0xF6],
+    [0xF1, 0xF8],
+    [0xFB, 0x72],
+    [0xF1, 0xF7],
+    [0xC3, 0x61],
+    [0xC3, 0x62],
+    [0xFB, 0x71],
+    [0x00, 0x00],
+    [0xC3, 0x63],
+    [0xF4, 0x42],
+    [0xC4, 0x5B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xF7, 0xD3],
+    [0xF7, 0xD2],
+    [0xC5, 0xF2],
+    [0x00, 0x00],
+    [0xA4, 0x68],
+    [0xA4, 0xD0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xA7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x5F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xFC],
+    [0xB3, 0xFD],
+    [0xFB, 0x74],
+    [0xDC, 0xF2],
+    [0xB9, 0xD8],
+    [0xE1, 0x69],
+    [0xE5, 0x53],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x5A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0xB0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC6, 0xCA],
+    [0x00, 0x00],
+    [0xCC, 0x42],
+    [0xCE, 0x60],
+    [0xD1, 0x59],
+    [0xAE, 0x4C],
+    [0x00, 0x00],
+    [0xFE, 0x42],
+    [0xF1, 0xF9],
+    [0x00, 0x00],
+    [0xC4, 0xDC],
+    [0xA4, 0x69],
+    [0xA5, 0x7E],
+    [0xC9, 0x70],
+    [0x00, 0x00],
+    [0xA6, 0x67],
+    [0xA6, 0x68],
+    [0x00, 0x00],
+    [0xA9, 0x5D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFB, 0x7B],
+    [0xB0, 0xF7],
+    [0x00, 0x00],
+    [0xB9, 0xDA],
+    [0x00, 0x00],
+    [0xB9, 0xDB],
+    [0xB9, 0xD9],
+    [0x00, 0x00],
+    [0xA4, 0x6A],
+    [0x00, 0x00],
+    [0xA4, 0xD1],
+    [0xA4, 0xD3],
+    [0xA4, 0xD2],
+    [0xC9, 0x5B],
+    [0xA4, 0xD4],
+    [0xA5, 0xA1],
+    [0xC9, 0x71],
+    [0x00, 0x00],
+    [0xA5, 0xA2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x69],
+    [0xA6, 0x6A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0xCB],
+    [0x00, 0x00],
+    [0xA7, 0xA8],
+    [0x00, 0x00],
+    [0xCA, 0xB1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0x61],
+    [0xCC, 0x43],
+    [0x00, 0x00],
+    [0xA9, 0x5F],
+    [0xA9, 0x60],
+    [0xA9, 0x5E],
+    [0xD1, 0x5A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xB6],
+    [0xAB, 0xB5],
+    [0xAB, 0xB7],
+    [0xAB, 0xB4],
+    [0x00, 0x00],
+    [0xCE, 0x61],
+    [0xA9, 0x62],
+    [0xAB, 0xB3],
+    [0x00, 0x00],
+    [0xAE, 0x4D],
+    [0xAE, 0x4E],
+    [0x00, 0x00],
+    [0xAE, 0x4F],
+    [0x00, 0x00],
+    [0xD4, 0xCD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB3, 0xFE],
+    [0xD8, 0xB4],
+    [0xB0, 0xF8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB6, 0xF8],
+    [0x00, 0x00],
+    [0xB9, 0xDD],
+    [0xB9, 0xDC],
+    [0xE1, 0x6A],
+    [0x00, 0x00],
+    [0xBC, 0x5D],
+    [0xBE, 0xC4],
+    [0x00, 0x00],
+    [0xEF, 0xC0],
+    [0xF6, 0xDA],
+    [0xF7, 0xD4],
+    [0xA4, 0x6B],
+    [0xA5, 0xA3],
+    [0x00, 0x00],
+    [0xA5, 0xA4],
+    [0xC9, 0xD1],
+    [0xA6, 0x6C],
+    [0xA6, 0x6F],
+    [0x00, 0x00],
+    [0xC9, 0xCF],
+    [0xC9, 0xCD],
+    [0xA6, 0x6E],
+    [0xC9, 0xD0],
+    [0xC9, 0xD2],
+    [0xC9, 0xCC],
+    [0xA6, 0x71],
+    [0xA6, 0x70],
+    [0xA6, 0x6D],
+    [0xA6, 0x6B],
+    [0xC9, 0xCE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xB3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xB0],
+    [0xCA, 0xB6],
+    [0xCA, 0xB9],
+    [0xCA, 0xB8],
+    [0x00, 0x00],
+    [0xA7, 0xAA],
+    [0xA7, 0xB2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xAF],
+    [0xCA, 0xB5],
+    [0xCA, 0xB3],
+    [0xA7, 0xAE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xA9],
+    [0xA7, 0xAC],
+    [0x00, 0x00],
+    [0xCA, 0xB4],
+    [0xCA, 0xBB],
+    [0xCA, 0xB7],
+    [0xA7, 0xAD],
+    [0xA7, 0xB1],
+    [0xA7, 0xB4],
+    [0xCA, 0xB2],
+    [0xCA, 0xBA],
+    [0xA7, 0xAB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0x67],
+    [0xA9, 0x6F],
+    [0x00, 0x00],
+    [0xCC, 0x4F],
+    [0xCC, 0x48],
+    [0xA9, 0x70],
+    [0xCC, 0x53],
+    [0xCC, 0x44],
+    [0xCC, 0x4B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0x66],
+    [0xCC, 0x45],
+    [0xA9, 0x64],
+    [0xCC, 0x4C],
+    [0xCC, 0x50],
+    [0xA9, 0x63],
+    [0x00, 0x00],
+    [0xCC, 0x51],
+    [0xCC, 0x4A],
+    [0x00, 0x00],
+    [0xCC, 0x4D],
+    [0x00, 0x00],
+    [0xA9, 0x72],
+    [0xA9, 0x69],
+    [0xCC, 0x54],
+    [0xCC, 0x52],
+    [0xFB, 0xA6],
+    [0xA9, 0x6E],
+    [0xA9, 0x6C],
+    [0xCC, 0x49],
+    [0xA9, 0x6B],
+    [0xCC, 0x47],
+    [0xCC, 0x46],
+    [0xA9, 0x6A],
+    [0xA9, 0x68],
+    [0xA9, 0x71],
+    [0xA9, 0x6D],
+    [0xA9, 0x65],
+    [0x00, 0x00],
+    [0xCC, 0x4E],
+    [0x00, 0x00],
+    [0xAB, 0xB9],
+    [0xFB, 0xAB],
+    [0xAB, 0xC0],
+    [0xCE, 0x6F],
+    [0xAB, 0xB8],
+    [0xCE, 0x67],
+    [0xCE, 0x63],
+    [0x00, 0x00],
+    [0xCE, 0x73],
+    [0xCE, 0x62],
+    [0x00, 0x00],
+    [0xAB, 0xBB],
+    [0xCE, 0x6C],
+    [0xAB, 0xBE],
+    [0xAB, 0xC1],
+    [0x00, 0x00],
+    [0xAB, 0xBC],
+    [0xCE, 0x70],
+    [0xAB, 0xBF],
+    [0x00, 0x00],
+    [0xAE, 0x56],
+    [0xCE, 0x76],
+    [0xCE, 0x64],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0x66],
+    [0xCE, 0x6D],
+    [0xCE, 0x71],
+    [0xCE, 0x75],
+    [0xCE, 0x72],
+    [0xCE, 0x6B],
+    [0xCE, 0x6E],
+    [0x00, 0x00],
+    [0xFB, 0xB2],
+    [0xCE, 0x68],
+    [0xAB, 0xC3],
+    [0xCE, 0x6A],
+    [0xCE, 0x69],
+    [0xCE, 0x74],
+    [0xAB, 0xBA],
+    [0xCE, 0x65],
+    [0xAB, 0xC2],
+    [0x00, 0x00],
+    [0xAB, 0xBD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x5C],
+    [0xD1, 0x62],
+    [0x00, 0x00],
+    [0xAE, 0x5B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0x60],
+    [0x00, 0x00],
+    [0xAE, 0x50],
+    [0x00, 0x00],
+    [0xAE, 0x55],
+    [0x00, 0x00],
+    [0xD1, 0x5F],
+    [0xD1, 0x5C],
+    [0xD1, 0x61],
+    [0xAE, 0x51],
+    [0xD1, 0x5B],
+    [0x00, 0x00],
+    [0xAE, 0x54],
+    [0xAE, 0x52],
+    [0x00, 0x00],
+    [0xD1, 0x63],
+    [0xAE, 0x53],
+    [0xAE, 0x57],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x58],
+    [0xFB, 0xA2],
+    [0xAE, 0x5A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x59],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0x5D],
+    [0xD1, 0x5E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0x64],
+    [0x00, 0x00],
+    [0xD4, 0xD4],
+    [0xB0, 0xF9],
+    [0xD8, 0xC2],
+    [0xD4, 0xD3],
+    [0xD4, 0xE6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x40],
+    [0x00, 0x00],
+    [0xD4, 0xE4],
+    [0x00, 0x00],
+    [0xB0, 0xFE],
+    [0xB0, 0xFA],
+    [0xD4, 0xED],
+    [0xD4, 0xDD],
+    [0xD4, 0xE0],
+    [0x00, 0x00],
+    [0xB1, 0x43],
+    [0xD4, 0xEA],
+    [0xD4, 0xE2],
+    [0xB0, 0xFB],
+    [0xB1, 0x44],
+    [0x00, 0x00],
+    [0xD4, 0xE7],
+    [0xD4, 0xE5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0xD6],
+    [0xD4, 0xEB],
+    [0xD4, 0xDF],
+    [0xD4, 0xDA],
+    [0x00, 0x00],
+    [0xD4, 0xD0],
+    [0xD4, 0xEC],
+    [0xD4, 0xDC],
+    [0xD4, 0xCF],
+    [0x00, 0x00],
+    [0xB1, 0x42],
+    [0xD4, 0xE1],
+    [0xD4, 0xEE],
+    [0xD4, 0xDE],
+    [0xD4, 0xD2],
+    [0xD4, 0xD7],
+    [0xD4, 0xCE],
+    [0x00, 0x00],
+    [0xB1, 0x41],
+    [0xFB, 0xB5],
+    [0xD4, 0xDB],
+    [0xD4, 0xD8],
+    [0xB0, 0xFC],
+    [0xD4, 0xD1],
+    [0x00, 0x00],
+    [0xD4, 0xE9],
+    [0xB0, 0xFD],
+    [0x00, 0x00],
+    [0xD4, 0xD9],
+    [0xD4, 0xD5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0xE8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x40],
+    [0xD8, 0xBB],
+    [0x00, 0x00],
+    [0xD8, 0xB8],
+    [0xD8, 0xC9],
+    [0xD8, 0xBD],
+    [0xD8, 0xCA],
+    [0x00, 0x00],
+    [0xB4, 0x42],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xC6],
+    [0xD8, 0xC3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFD, 0xEF],
+    [0x00, 0x00],
+    [0xD8, 0xC4],
+    [0xD8, 0xC7],
+    [0xD8, 0xCB],
+    [0x00, 0x00],
+    [0xD4, 0xE3],
+    [0xD8, 0xCD],
+    [0xDD, 0x47],
+    [0xFD, 0xC1],
+    [0xB4, 0x43],
+    [0xD8, 0xCE],
+    [0xD8, 0xB6],
+    [0xD8, 0xC0],
+    [0xFB, 0xBA],
+    [0xD8, 0xC5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x41],
+    [0xB4, 0x44],
+    [0xD8, 0xCC],
+    [0xD8, 0xCF],
+    [0xD8, 0xBA],
+    [0xD8, 0xB7],
+    [0xFC, 0x73],
+    [0x00, 0x00],
+    [0xD8, 0xB9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xBE],
+    [0xD8, 0xBC],
+    [0xB4, 0x45],
+    [0x00, 0x00],
+    [0xD8, 0xC8],
+    [0x00, 0x00],
+    [0xFB, 0xB4],
+    [0xD8, 0xBF],
+    [0x00, 0x00],
+    [0xD8, 0xC1],
+    [0xD8, 0xB5],
+    [0xDC, 0xFA],
+    [0xDC, 0xF8],
+    [0xB7, 0x42],
+    [0xB7, 0x40],
+    [0xDD, 0x43],
+    [0xDC, 0xF9],
+    [0xDD, 0x44],
+    [0xDD, 0x40],
+    [0xDC, 0xF7],
+    [0xDD, 0x46],
+    [0xDC, 0xF6],
+    [0xDC, 0xFD],
+    [0xB6, 0xFE],
+    [0xB6, 0xFD],
+    [0xB6, 0xFC],
+    [0xDC, 0xFB],
+    [0xDD, 0x41],
+    [0xB6, 0xF9],
+    [0xB7, 0x41],
+    [0x00, 0x00],
+    [0xDC, 0xF4],
+    [0x00, 0x00],
+    [0xDC, 0xFE],
+    [0xDC, 0xF3],
+    [0xDC, 0xFC],
+    [0xB6, 0xFA],
+    [0xDD, 0x42],
+    [0xDC, 0xF5],
+    [0xB6, 0xFB],
+    [0xDD, 0x45],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFB, 0xBC],
+    [0x00, 0x00],
+    [0xE1, 0x6E],
+    [0xB9, 0xE2],
+    [0xB9, 0xE1],
+    [0xB9, 0xE3],
+    [0xE1, 0x7A],
+    [0xE1, 0x70],
+    [0xE1, 0x76],
+    [0xE1, 0x6B],
+    [0xE1, 0x79],
+    [0xE1, 0x78],
+    [0xE1, 0x7C],
+    [0xE1, 0x75],
+    [0xB9, 0xDE],
+    [0xE1, 0x74],
+    [0xB9, 0xE4],
+    [0x00, 0x00],
+    [0xE1, 0x6D],
+    [0xB9, 0xDF],
+    [0x00, 0x00],
+    [0xE1, 0x7B],
+    [0xB9, 0xE0],
+    [0xE1, 0x6F],
+    [0xE1, 0x72],
+    [0xE1, 0x77],
+    [0xE1, 0x71],
+    [0xE1, 0x6C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0x73],
+    [0xE5, 0x55],
+    [0xBC, 0x61],
+    [0xE5, 0x58],
+    [0xE5, 0x57],
+    [0xE5, 0x5A],
+    [0xE5, 0x5C],
+    [0xF9, 0xDC],
+    [0xBC, 0x5F],
+    [0x00, 0x00],
+    [0xE5, 0x56],
+    [0x00, 0x00],
+    [0xE5, 0x54],
+    [0x00, 0x00],
+    [0xE5, 0x5D],
+    [0xE5, 0x5B],
+    [0xE5, 0x59],
+    [0x00, 0x00],
+    [0xE5, 0x5F],
+    [0x00, 0x00],
+    [0xE5, 0x5E],
+    [0xBC, 0x63],
+    [0xBC, 0x5E],
+    [0x00, 0x00],
+    [0xBC, 0x60],
+    [0xBC, 0x62],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE5, 0x60],
+    [0xE9, 0x57],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE9, 0x56],
+    [0xE9, 0x55],
+    [0x00, 0x00],
+    [0xE9, 0x58],
+    [0xE9, 0x51],
+    [0x00, 0x00],
+    [0xE9, 0x52],
+    [0xE9, 0x5A],
+    [0xE9, 0x53],
+    [0x00, 0x00],
+    [0xBE, 0xC5],
+    [0xE9, 0x5C],
+    [0x00, 0x00],
+    [0xE9, 0x5B],
+    [0xE9, 0x54],
+    [0x00, 0x00],
+    [0xEC, 0xD1],
+    [0xC0, 0xA8],
+    [0xEC, 0xCF],
+    [0xEC, 0xD4],
+    [0xEC, 0xD3],
+    [0xE9, 0x59],
+    [0x00, 0x00],
+    [0xC0, 0xA7],
+    [0x00, 0x00],
+    [0xEC, 0xD2],
+    [0xEC, 0xCE],
+    [0xEC, 0xD6],
+    [0xEC, 0xD5],
+    [0xC0, 0xA6],
+    [0x00, 0x00],
+    [0xEC, 0xD0],
+    [0x00, 0x00],
+    [0xBE, 0xC6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC2, 0x54],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEF, 0xC1],
+    [0xF1, 0xFA],
+    [0xF1, 0xFB],
+    [0xF1, 0xFC],
+    [0xC4, 0x5C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC4, 0x5D],
+    [0x00, 0x00],
+    [0xF4, 0x43],
+    [0xFE, 0xA4],
+    [0xF5, 0xC8],
+    [0xF5, 0xC7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xF6, 0xDB],
+    [0xF6, 0xDC],
+    [0xF7, 0xD5],
+    [0xF8, 0xA7],
+    [0x00, 0x00],
+    [0xA4, 0x6C],
+    [0xA4, 0x6D],
+    [0x00, 0x00],
+    [0xA4, 0x6E],
+    [0xA4, 0xD5],
+    [0xA5, 0xA5],
+    [0xC9, 0xD3],
+    [0xA6, 0x72],
+    [0xA6, 0x73],
+    [0x00, 0x00],
+    [0xA7, 0xB7],
+    [0xA7, 0xB8],
+    [0xA7, 0xB6],
+    [0xA7, 0xB5],
+    [0x00, 0x00],
+    [0xA9, 0x73],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCC, 0x55],
+    [0xA9, 0x75],
+    [0xA9, 0x74],
+    [0xCC, 0x56],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xC4],
+    [0x00, 0x00],
+    [0xAE, 0x5D],
+    [0xD1, 0x65],
+    [0x00, 0x00],
+    [0xD4, 0xF0],
+    [0x00, 0x00],
+    [0xB1, 0x45],
+    [0xB4, 0x47],
+    [0xD4, 0xEF],
+    [0xB4, 0x46],
+    [0x00, 0x00],
+    [0xB9, 0xE5],
+    [0xFB, 0xC5],
+    [0xE1, 0x7D],
+    [0xBE, 0xC7],
+    [0x00, 0x00],
+    [0xC0, 0xA9],
+    [0xEC, 0xD7],
+    [0xFB, 0xC7],
+    [0xC4, 0x5E],
+    [0x00, 0x00],
+    [0xC5, 0x70],
+    [0xC6, 0xCB],
+    [0xC9, 0x72],
+    [0xFA, 0x79],
+    [0xA5, 0xA6],
+    [0xC9, 0x73],
+    [0xA6, 0x76],
+    [0x00, 0x00],
+    [0xA6, 0x74],
+    [0xA6, 0x75],
+    [0xA6, 0x77],
+    [0x00, 0x00],
+    [0xA7, 0xBA],
+    [0xA7, 0xB9],
+    [0x00, 0x00],
+    [0xCA, 0xBC],
+    [0xA7, 0xBB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0xBD],
+    [0xCC, 0x57],
+    [0x00, 0x00],
+    [0xCC, 0x58],
+    [0x00, 0x00],
+    [0xA9, 0x76],
+    [0xA9, 0x78],
+    [0xA9, 0x7A],
+    [0xA9, 0x77],
+    [0xA9, 0x7B],
+    [0xA9, 0x79],
+    [0xFB, 0xD2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xC8],
+    [0xAB, 0xC5],
+    [0xAB, 0xC7],
+    [0xAB, 0xC9],
+    [0xAB, 0xC6],
+    [0xD1, 0x66],
+    [0xCE, 0x77],
+    [0x00, 0x00],
+    [0xFC, 0x7D],
+    [0x00, 0x00],
+    [0xD1, 0x68],
+    [0xD1, 0x67],
+    [0xAE, 0x63],
+    [0x00, 0x00],
+    [0xAE, 0x5F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x60],
+    [0xAE, 0x62],
+    [0xAE, 0x64],
+    [0xAE, 0x61],
+    [0x00, 0x00],
+    [0xAE, 0x66],
+    [0xAE, 0x65],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x4A],
+    [0xD4, 0xF2],
+    [0xD4, 0xF1],
+    [0xB1, 0x49],
+    [0x00, 0x00],
+    [0xB1, 0x48],
+    [0xB1, 0x47],
+    [0xB1, 0x4B],
+    [0xB1, 0x46],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xD5],
+    [0xD8, 0xD2],
+    [0xB4, 0x49],
+    [0xD8, 0xD1],
+    [0xD8, 0xD6],
+    [0x00, 0x00],
+    [0xB4, 0x4B],
+    [0xD8, 0xD4],
+    [0xB4, 0x48],
+    [0xB4, 0x4A],
+    [0xD8, 0xD3],
+    [0xFB, 0xCC],
+    [0xDD, 0x48],
+    [0xFE, 0xAE],
+    [0xDD, 0x49],
+    [0xDD, 0x4A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB9, 0xE6],
+    [0xB9, 0xEE],
+    [0xE1, 0x7E],
+    [0xB9, 0xE8],
+    [0xB9, 0xEC],
+    [0xE1, 0xA1],
+    [0xB9, 0xED],
+    [0xB9, 0xE9],
+    [0xB9, 0xEA],
+    [0xB9, 0xE7],
+    [0xB9, 0xEB],
+    [0xBC, 0x66],
+    [0xD8, 0xD0],
+    [0xBC, 0x67],
+    [0xBC, 0x65],
+    [0x00, 0x00],
+    [0xBC, 0x64],
+    [0xE9, 0x5D],
+    [0xBE, 0xC8],
+    [0xEC, 0xD8],
+    [0xEC, 0xD9],
+    [0xFB, 0xD1],
+    [0x00, 0x00],
+    [0xC3, 0x64],
+    [0xC4, 0x5F],
+    [0x00, 0x00],
+    [0xA4, 0x6F],
+    [0x00, 0x00],
+    [0xA6, 0x78],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFB, 0x75],
+    [0x00, 0x00],
+    [0xAB, 0xCA],
+    [0x00, 0x00],
+    [0xD1, 0x69],
+    [0xAE, 0x67],
+    [0xFB, 0xD4],
+    [0x00, 0x00],
+    [0xB1, 0x4E],
+    [0xB1, 0x4D],
+    [0xB1, 0x4C],
+    [0xB4, 0x4C],
+    [0xB4, 0x4D],
+    [0xD8, 0xD7],
+    [0xB9, 0xEF],
+    [0xBE, 0xC9],
+    [0xA4, 0x70],
+    [0xC9, 0x5C],
+    [0xA4, 0xD6],
+    [0xC9, 0x74],
+    [0xFB, 0xD6],
+    [0xFB, 0xD8],
+    [0xC9, 0xD4],
+    [0xA6, 0x79],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0x7C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDD, 0x4B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0x71],
+    [0x00, 0x00],
+    [0xA4, 0xD7],
+    [0xC9, 0xD5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0xBE],
+    [0x00, 0x00],
+    [0xCA, 0xBF],
+    [0x00, 0x00],
+    [0xA7, 0xBC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xD8],
+    [0xB4, 0x4E],
+    [0x00, 0x00],
+    [0xDD, 0x4C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC0, 0xAA],
+    [0xA4, 0x72],
+    [0xA4, 0xA8],
+    [0xA4, 0xD8],
+    [0xC9, 0x75],
+    [0xA5, 0xA7],
+    [0x00, 0x00],
+    [0xA7, 0xC0],
+    [0xA7, 0xBF],
+    [0xA7, 0xBD],
+    [0xA7, 0xBE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCC, 0x59],
+    [0xA9, 0x7E],
+    [0xA9, 0xA1],
+    [0xCC, 0x5A],
+    [0xA9, 0x7D],
+    [0xFB, 0xDB],
+    [0x00, 0x00],
+    [0xAB, 0xCE],
+    [0xCE, 0x78],
+    [0xAB, 0xCD],
+    [0xAB, 0xCB],
+    [0xAB, 0xCC],
+    [0xAE, 0x6A],
+    [0xAE, 0x68],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0x6B],
+    [0xAE, 0x69],
+    [0xD1, 0x6A],
+    [0x00, 0x00],
+    [0xAE, 0x5E],
+    [0xD4, 0xF3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x50],
+    [0xB1, 0x51],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x4F],
+    [0x00, 0x00],
+    [0xB9, 0xF0],
+    [0xE1, 0xA2],
+    [0xBC, 0x68],
+    [0xBC, 0x69],
+    [0x00, 0x00],
+    [0xE5, 0x61],
+    [0xC0, 0xAB],
+    [0xEF, 0xC2],
+    [0xEF, 0xC3],
+    [0x00, 0x00],
+    [0xC4, 0xDD],
+    [0xF8, 0xA8],
+    [0xC9, 0x4B],
+    [0xA4, 0xD9],
+    [0x00, 0x00],
+    [0xA4, 0x73],
+    [0x00, 0x00],
+    [0xC9, 0x77],
+    [0xC9, 0x76],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0x7A],
+    [0xC9, 0xD7],
+    [0xC9, 0xD8],
+    [0xC9, 0xD6],
+    [0x00, 0x00],
+    [0xC9, 0xD9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFB, 0xDD],
+    [0xCA, 0xC7],
+    [0x00, 0x00],
+    [0xCA, 0xC2],
+    [0xCA, 0xC4],
+    [0xCA, 0xC6],
+    [0xCA, 0xC3],
+    [0xA7, 0xC4],
+    [0xCA, 0xC0],
+    [0x00, 0x00],
+    [0xCA, 0xC1],
+    [0xA7, 0xC1],
+    [0xA7, 0xC2],
+    [0xCA, 0xC5],
+    [0xCA, 0xC8],
+    [0xA7, 0xC3],
+    [0xCA, 0xC9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFD, 0xF2],
+    [0xCC, 0x68],
+    [0x00, 0x00],
+    [0xCC, 0x62],
+    [0xCC, 0x5D],
+    [0xA9, 0xA3],
+    [0xCC, 0x65],
+    [0xCC, 0x63],
+    [0xCC, 0x5C],
+    [0xCC, 0x69],
+    [0xCC, 0x6C],
+    [0xCC, 0x67],
+    [0xCC, 0x60],
+    [0xA9, 0xA5],
+    [0xCC, 0x66],
+    [0xA9, 0xA6],
+    [0xCC, 0x61],
+    [0xCC, 0x64],
+    [0xCC, 0x5B],
+    [0xCC, 0x5F],
+    [0xCC, 0x6B],
+    [0xA9, 0xA7],
+    [0x00, 0x00],
+    [0xA9, 0xA8],
+    [0x00, 0x00],
+    [0xCC, 0x5E],
+    [0xCC, 0x6A],
+    [0xA9, 0xA2],
+    [0xA9, 0xA4],
+    [0x00, 0x00],
+    [0xFB, 0xE7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0xAB],
+    [0xCE, 0xA4],
+    [0xCE, 0xAA],
+    [0xCE, 0xA3],
+    [0xCE, 0xA5],
+    [0xCE, 0x7D],
+    [0xCE, 0x7B],
+    [0x00, 0x00],
+    [0xCE, 0xAC],
+    [0xCE, 0xA9],
+    [0xCE, 0x79],
+    [0x00, 0x00],
+    [0xAB, 0xD0],
+    [0xCE, 0xA7],
+    [0xCE, 0xA8],
+    [0x00, 0x00],
+    [0xCE, 0xA6],
+    [0xCE, 0x7C],
+    [0xCE, 0x7A],
+    [0xAB, 0xCF],
+    [0xCE, 0xA2],
+    [0xCE, 0x7E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0xA1],
+    [0xCE, 0xAD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x6F],
+    [0xFB, 0xDE],
+    [0xAE, 0x6E],
+    [0x00, 0x00],
+    [0xD1, 0x6C],
+    [0xAE, 0x6B],
+    [0xD1, 0x6E],
+    [0xFB, 0xDF],
+    [0xAE, 0x70],
+    [0xD1, 0x6F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x73],
+    [0x00, 0x00],
+    [0xAE, 0x71],
+    [0xD1, 0x70],
+    [0xCE, 0xAE],
+    [0xD1, 0x72],
+    [0x00, 0x00],
+    [0xAE, 0x6D],
+    [0x00, 0x00],
+    [0xAE, 0x6C],
+    [0x00, 0x00],
+    [0xD1, 0x6D],
+    [0xD1, 0x71],
+    [0xAE, 0x72],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x53],
+    [0xB1, 0x52],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD4, 0xF5],
+    [0xD4, 0xF9],
+    [0xD4, 0xFB],
+    [0xB1, 0x54],
+    [0xD4, 0xFE],
+    [0xFB, 0xE3],
+    [0xB1, 0x58],
+    [0xD5, 0x41],
+    [0x00, 0x00],
+    [0xB1, 0x5A],
+    [0x00, 0x00],
+    [0xB1, 0x56],
+    [0xB1, 0x5E],
+    [0xFB, 0xE4],
+    [0xB1, 0x5B],
+    [0xD4, 0xF7],
+    [0xB1, 0x55],
+    [0x00, 0x00],
+    [0xD4, 0xF6],
+    [0xD4, 0xF4],
+    [0xD5, 0x43],
+    [0xD4, 0xF8],
+    [0x00, 0x00],
+    [0xB1, 0x57],
+    [0xD5, 0x42],
+    [0xB1, 0x5C],
+    [0xD4, 0xFD],
+    [0xD4, 0xFC],
+    [0xB1, 0x5D],
+    [0xD4, 0xFA],
+    [0xB1, 0x59],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD5, 0x44],
+    [0x00, 0x00],
+    [0xD5, 0x40],
+    [0xD8, 0xE7],
+    [0xD8, 0xEE],
+    [0xD8, 0xE3],
+    [0xB4, 0x51],
+    [0xD8, 0xDF],
+    [0xD8, 0xEF],
+    [0xD8, 0xD9],
+    [0xD8, 0xEC],
+    [0xD8, 0xEA],
+    [0xD8, 0xE4],
+    [0x00, 0x00],
+    [0xD8, 0xED],
+    [0xD8, 0xE6],
+    [0x00, 0x00],
+    [0xD8, 0xDE],
+    [0xD8, 0xF0],
+    [0xD8, 0xDC],
+    [0xD8, 0xE9],
+    [0xD8, 0xDA],
+    [0x00, 0x00],
+    [0xD8, 0xF1],
+    [0xFB, 0xE5],
+    [0xB4, 0x52],
+    [0x00, 0x00],
+    [0xD8, 0xEB],
+    [0xDD, 0x4F],
+    [0xD8, 0xDD],
+    [0xB4, 0x4F],
+    [0x00, 0x00],
+    [0xD8, 0xE1],
+    [0x00, 0x00],
+    [0xB4, 0x50],
+    [0xD8, 0xE0],
+    [0xD8, 0xE5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xE2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD8, 0xE8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDD, 0x53],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDD, 0x56],
+    [0xDD, 0x4E],
+    [0x00, 0x00],
+    [0xDD, 0x50],
+    [0x00, 0x00],
+    [0xDD, 0x55],
+    [0xDD, 0x54],
+    [0xB7, 0x43],
+    [0x00, 0x00],
+    [0xD8, 0xDB],
+    [0xDD, 0x52],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB7, 0x44],
+    [0x00, 0x00],
+    [0xDD, 0x4D],
+    [0xDD, 0x51],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0xA9],
+    [0x00, 0x00],
+    [0xE1, 0xB0],
+    [0xE1, 0xA7],
+    [0x00, 0x00],
+    [0xE1, 0xAE],
+    [0xE1, 0xA5],
+    [0xE1, 0xAD],
+    [0xE1, 0xB1],
+    [0xE1, 0xA4],
+    [0xE1, 0xA8],
+    [0xE1, 0xA3],
+    [0x00, 0x00],
+    [0xB9, 0xF1],
+    [0x00, 0x00],
+    [0xE1, 0xA6],
+    [0xB9, 0xF2],
+    [0xE1, 0xAC],
+    [0xE1, 0xAB],
+    [0xE1, 0xAA],
+    [0xFB, 0xE0],
+    [0x00, 0x00],
+    [0xE1, 0xAF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE5, 0x65],
+    [0xE5, 0x67],
+    [0xBC, 0x6B],
+    [0xE5, 0x68],
+    [0x00, 0x00],
+    [0xE5, 0x63],
+    [0x00, 0x00],
+    [0xE5, 0x62],
+    [0xE5, 0x6C],
+    [0x00, 0x00],
+    [0xE5, 0x6A],
+    [0xBC, 0x6A],
+    [0xE5, 0x6D],
+    [0xE5, 0x64],
+    [0xE5, 0x69],
+    [0xE5, 0x6B],
+    [0xE5, 0x66],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE9, 0x61],
+    [0xE9, 0x66],
+    [0xE9, 0x60],
+    [0xE9, 0x65],
+    [0x00, 0x00],
+    [0xE9, 0x5E],
+    [0xE9, 0x68],
+    [0xE9, 0x64],
+    [0xE9, 0x69],
+    [0xE9, 0x63],
+    [0xE9, 0x5F],
+    [0xE9, 0x67],
+    [0x00, 0x00],
+    [0xE9, 0x6A],
+    [0xE9, 0x62],
+    [0xFC, 0x58],
+    [0xEC, 0xDA],
+    [0xC0, 0xAF],
+    [0x00, 0x00],
+    [0xC0, 0xAD],
+    [0x00, 0x00],
+    [0xC0, 0xAC],
+    [0xC0, 0xAE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEF, 0xC4],
+    [0x00, 0x00],
+    [0xF1, 0x72],
+    [0xF1, 0xFD],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xF4, 0x44],
+    [0xF4, 0x45],
+    [0x00, 0x00],
+    [0xC4, 0x60],
+    [0x00, 0x00],
+    [0xF5, 0xC9],
+    [0x00, 0x00],
+    [0xC4, 0xDE],
+    [0x00, 0x00],
+    [0xF5, 0xCA],
+    [0x00, 0x00],
+    [0xF6, 0xDE],
+    [0xC5, 0x72],
+    [0x00, 0x00],
+    [0xC5, 0x71],
+    [0xF6, 0xDD],
+    [0xC5, 0xC9],
+    [0xFB, 0xE8],
+    [0xF7, 0xD6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC6, 0xCC],
+    [0x00, 0x00],
+    [0xA4, 0x74],
+    [0xA6, 0x7B],
+    [0xC9, 0xDA],
+    [0xCA, 0xCA],
+    [0xA8, 0xB5],
+    [0xB1, 0x5F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA4, 0x75],
+    [0xA5, 0xAA],
+    [0xA5, 0xA9],
+    [0xA5, 0xA8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xC5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x74],
+    [0x00, 0x00],
+    [0xDD, 0x57],
+    [0xA4, 0x76],
+    [0xA4, 0x77],
+    [0xA4, 0x78],
+    [0xA4, 0xDA],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xD1],
+    [0x00, 0x00],
+    [0xCE, 0xAF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x53],
+    [0xA4, 0x79],
+    [0xC9, 0x5D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA5, 0xAB],
+    [0xA5, 0xAC],
+    [0xC9, 0x78],
+    [0x00, 0x00],
+    [0xA6, 0x7C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFB, 0xFC],
+    [0xCA, 0xCB],
+    [0x00, 0x00],
+    [0xA7, 0xC6],
+    [0x00, 0x00],
+    [0xCA, 0xCC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0xAE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCC, 0x6E],
+    [0xA9, 0xAC],
+    [0xA9, 0xAB],
+    [0xCC, 0x6D],
+    [0xA9, 0xA9],
+    [0xCC, 0x6F],
+    [0xA9, 0xAA],
+    [0xA9, 0xAD],
+    [0x00, 0x00],
+    [0xAB, 0xD2],
+    [0x00, 0x00],
+    [0xAB, 0xD4],
+    [0xCE, 0xB3],
+    [0xCE, 0xB0],
+    [0xCE, 0xB1],
+    [0xCE, 0xB2],
+    [0xCE, 0xB4],
+    [0xAB, 0xD3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0x74],
+    [0xD1, 0x73],
+    [0x00, 0x00],
+    [0xAE, 0x76],
+    [0x00, 0x00],
+    [0xAE, 0x75],
+    [0xFB, 0xF1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x62],
+    [0xD5, 0x46],
+    [0x00, 0x00],
+    [0xB1, 0x61],
+    [0xB1, 0x63],
+    [0xB1, 0x60],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x55],
+    [0xD5, 0x45],
+    [0x00, 0x00],
+    [0xB4, 0x56],
+    [0xD8, 0xF3],
+    [0x00, 0x00],
+    [0xB4, 0x57],
+    [0xD8, 0xF2],
+    [0xB4, 0x54],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDD, 0x5A],
+    [0xDD, 0x5C],
+    [0xB7, 0x45],
+    [0xDD, 0x5B],
+    [0xDD, 0x59],
+    [0xDD, 0x58],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0xB4],
+    [0xB9, 0xF7],
+    [0xB9, 0xF5],
+    [0x00, 0x00],
+    [0xB9, 0xF6],
+    [0xE1, 0xB2],
+    [0xE1, 0xB3],
+    [0x00, 0x00],
+    [0xB9, 0xF3],
+    [0xE5, 0x71],
+    [0xE5, 0x6F],
+    [0x00, 0x00],
+    [0xBC, 0x6D],
+    [0xE5, 0x70],
+    [0xBC, 0x6E],
+    [0xBC, 0x6C],
+    [0xB9, 0xF4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE9, 0x6D],
+    [0xE9, 0x6B],
+    [0xE9, 0x6C],
+    [0xE5, 0x6E],
+    [0xEC, 0xDC],
+    [0xC0, 0xB0],
+    [0xEC, 0xDB],
+    [0xEF, 0xC5],
+    [0xEF, 0xC6],
+    [0xE9, 0x6E],
+    [0xF1, 0xFE],
+    [0x00, 0x00],
+    [0xA4, 0x7A],
+    [0xA5, 0xAD],
+    [0xA6, 0x7E],
+    [0xC9, 0xDB],
+    [0xA6, 0x7D],
+    [0x00, 0x00],
+    [0xA9, 0xAF],
+    [0xB7, 0x46],
+    [0xFB, 0xF4],
+    [0xA4, 0xDB],
+    [0xA5, 0xAE],
+    [0xAB, 0xD5],
+    [0xB4, 0x58],
+    [0xC6, 0xCE],
+    [0xC9, 0x79],
+    [0x00, 0x00],
+    [0xC9, 0x7A],
+    [0xFB, 0xC3],
+    [0xC9, 0xDC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xC8],
+    [0xCA, 0xD0],
+    [0xCA, 0xCE],
+    [0xA7, 0xC9],
+    [0xCA, 0xCD],
+    [0xCA, 0xCF],
+    [0xCA, 0xD1],
+    [0x00, 0x00],
+    [0xA7, 0xC7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0xB3],
+    [0xA9, 0xB4],
+    [0xA9, 0xB1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0xB0],
+    [0xCE, 0xB8],
+    [0xA9, 0xB2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xD6],
+    [0x00, 0x00],
+    [0xCE, 0xB7],
+    [0xCE, 0xB9],
+    [0xCE, 0xB6],
+    [0xCE, 0xBA],
+    [0xAB, 0xD7],
+    [0xAE, 0x79],
+    [0xD1, 0x75],
+    [0x00, 0x00],
+    [0xD1, 0x77],
+    [0xAE, 0x77],
+    [0xD1, 0x78],
+    [0xAE, 0x78],
+    [0xD1, 0x76],
+    [0x00, 0x00],
+    [0xCE, 0xB5],
+    [0xD5, 0x47],
+    [0xD5, 0x4A],
+    [0xD5, 0x4B],
+    [0xD5, 0x48],
+    [0xB1, 0x67],
+    [0xB1, 0x66],
+    [0xB1, 0x64],
+    [0xB1, 0x65],
+    [0xD5, 0x49],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x68],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x5A],
+    [0xB4, 0x5B],
+    [0x00, 0x00],
+    [0xB4, 0x5C],
+    [0xDD, 0x5D],
+    [0xDD, 0x5F],
+    [0xDD, 0x61],
+    [0xB7, 0x48],
+    [0xB7, 0x47],
+    [0xB4, 0x59],
+    [0xDD, 0x60],
+    [0xDD, 0x5E],
+    [0x00, 0x00],
+    [0xE1, 0xB8],
+    [0x00, 0x00],
+    [0xFB, 0xF9],
+    [0xE1, 0xB6],
+    [0xE1, 0xBC],
+    [0xB9, 0xF8],
+    [0xE1, 0xBD],
+    [0xE1, 0xBA],
+    [0xB9, 0xF9],
+    [0xE1, 0xB7],
+    [0xE1, 0xB5],
+    [0xE1, 0xBB],
+    [0xBC, 0x70],
+    [0xE5, 0x73],
+    [0xE1, 0xB9],
+    [0xBC, 0x72],
+    [0xE5, 0x74],
+    [0xBC, 0x71],
+    [0xBC, 0x74],
+    [0xE5, 0x75],
+    [0xBC, 0x6F],
+    [0xBC, 0x73],
+    [0x00, 0x00],
+    [0xE9, 0x73],
+    [0xE9, 0x71],
+    [0xE9, 0x70],
+    [0xE9, 0x72],
+    [0xE9, 0x6F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC3, 0x66],
+    [0x00, 0x00],
+    [0xF4, 0x46],
+    [0xF4, 0x47],
+    [0x00, 0x00],
+    [0xF5, 0xCB],
+    [0xF6, 0xDF],
+    [0xC6, 0x55],
+    [0xC6, 0xCF],
+    [0x00, 0x00],
+    [0xA9, 0xB5],
+    [0xA7, 0xCA],
+    [0x00, 0x00],
+    [0xFC, 0x40],
+    [0xAB, 0xD8],
+    [0xFC, 0x41],
+    [0xFC, 0x43],
+    [0x00, 0x00],
+    [0xA4, 0x7B],
+    [0xA4, 0xDC],
+    [0x00, 0x00],
+    [0xA5, 0xAF],
+    [0xC9, 0xDD],
+    [0x00, 0x00],
+    [0xA7, 0xCB],
+    [0xCA, 0xD2],
+    [0x00, 0x00],
+    [0xCE, 0xBB],
+    [0xAB, 0xD9],
+    [0x00, 0x00],
+    [0xB9, 0xFA],
+    [0xA4, 0x7C],
+    [0x00, 0x00],
+    [0xFC, 0x46],
+    [0x00, 0x00],
+    [0xA6, 0xA1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB7, 0x49],
+    [0xA4, 0x7D],
+    [0xA4, 0xDD],
+    [0xA4, 0xDE],
+    [0x00, 0x00],
+    [0xA5, 0xB1],
+    [0xA5, 0xB0],
+    [0x00, 0x00],
+    [0xC9, 0xDE],
+    [0xA6, 0xA2],
+    [0x00, 0x00],
+    [0xCA, 0xD3],
+    [0x00, 0x00],
+    [0xA7, 0xCC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCC, 0x71],
+    [0xCC, 0x72],
+    [0xCC, 0x73],
+    [0x00, 0x00],
+    [0xA9, 0xB6],
+    [0xA9, 0xB7],
+    [0xCC, 0x70],
+    [0xA9, 0xB8],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xDA],
+    [0xCE, 0xBC],
+    [0x00, 0x00],
+    [0xD1, 0x7A],
+    [0xAE, 0x7A],
+    [0x00, 0x00],
+    [0xD1, 0x79],
+    [0x00, 0x00],
+    [0xB1, 0x69],
+    [0xD5, 0x4C],
+    [0xB1, 0x6A],
+    [0xD5, 0x4D],
+    [0x00, 0x00],
+    [0xFC, 0x4C],
+    [0x00, 0x00],
+    [0xB4, 0x5D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDD, 0x62],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0xBF],
+    [0xE1, 0xBE],
+    [0x00, 0x00],
+    [0xB9, 0xFB],
+    [0x00, 0x00],
+    [0xBC, 0x75],
+    [0xE5, 0x76],
+    [0xBE, 0xCA],
+    [0xE9, 0x74],
+    [0xC0, 0xB1],
+    [0x00, 0x00],
+    [0xC5, 0x73],
+    [0xF7, 0xD8],
+    [0xC6, 0xD0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCC, 0x74],
+    [0x00, 0x00],
+    [0xCE, 0xBD],
+    [0xB1, 0x6B],
+    [0xD8, 0xF4],
+    [0xB7, 0x4A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC2, 0x55],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC6, 0xD1],
+    [0xA7, 0xCE],
+    [0xFC, 0x51],
+    [0xA7, 0xCD],
+    [0xAB, 0xDB],
+    [0x00, 0x00],
+    [0xD1, 0x7B],
+    [0x00, 0x00],
+    [0xB1, 0x6D],
+    [0xB3, 0x43],
+    [0xB1, 0x6E],
+    [0xB1, 0x6C],
+    [0xB4, 0x5E],
+    [0x00, 0x00],
+    [0xE1, 0xC0],
+    [0xB9, 0xFC],
+    [0xBC, 0x76],
+    [0xFC, 0x54],
+    [0xC9, 0x4C],
+    [0xC9, 0xDF],
+    [0x00, 0x00],
+    [0xCA, 0xD5],
+    [0xA7, 0xCF],
+    [0xCA, 0xD4],
+    [0xA7, 0xD0],
+    [0x00, 0x00],
+    [0xFA, 0xAF],
+    [0xA9, 0xBC],
+    [0xCC, 0x77],
+    [0xCC, 0x76],
+    [0xA9, 0xBB],
+    [0xA9, 0xB9],
+    [0xA9, 0xBA],
+    [0xCC, 0x75],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xDD],
+    [0xCE, 0xBE],
+    [0xAB, 0xE0],
+    [0xAB, 0xDC],
+    [0xAB, 0xE2],
+    [0xAB, 0xDE],
+    [0xAB, 0xDF],
+    [0xAB, 0xE1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0x7D],
+    [0xAE, 0x7C],
+    [0xAE, 0x7B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD5, 0x4F],
+    [0xB1, 0x6F],
+    [0xB1, 0x72],
+    [0xB1, 0x70],
+    [0x00, 0x00],
+    [0xD5, 0x4E],
+    [0xB1, 0x75],
+    [0x00, 0x00],
+    [0xB1, 0x71],
+    [0xD5, 0x50],
+    [0xB1, 0x74],
+    [0xB1, 0x73],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0x61],
+    [0xD8, 0xF6],
+    [0xD8, 0xF5],
+    [0xFC, 0x57],
+    [0xB4, 0x61],
+    [0xB4, 0x5F],
+    [0xB4, 0x60],
+    [0xD8, 0xF7],
+    [0xB7, 0x4B],
+    [0xDD, 0x64],
+    [0xB7, 0x4C],
+    [0xDD, 0x63],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE5, 0x77],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0x78],
+    [0xE1, 0xC1],
+    [0xBC, 0x77],
+    [0x00, 0x00],
+    [0xB9, 0xFD],
+    [0x00, 0x00],
+    [0xEC, 0xDE],
+    [0xE9, 0x75],
+    [0xC0, 0xB2],
+    [0xEC, 0xDD],
+    [0xF2, 0x40],
+    [0xF4, 0x48],
+    [0xF4, 0x49],
+    [0x00, 0x00],
+    [0xA4, 0xDF],
+    [0x00, 0x00],
+    [0xA5, 0xB2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC9, 0x7B],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xD2],
+    [0xA7, 0xD4],
+    [0x00, 0x00],
+    [0xC9, 0xE2],
+    [0xCA, 0xD8],
+    [0xCA, 0xD7],
+    [0xCA, 0xD6],
+    [0x00, 0x00],
+    [0xC9, 0xE1],
+    [0xC9, 0xE0],
+    [0xA6, 0xA4],
+    [0xA7, 0xD3],
+    [0xA7, 0xD1],
+    [0xA6, 0xA3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0xBD],
+    [0xCC, 0x78],
+    [0xFC, 0xD5],
+    [0xA9, 0xBE],
+    [0xCA, 0xDD],
+    [0x00, 0x00],
+    [0xCA, 0xDF],
+    [0xCA, 0xDE],
+    [0xCC, 0x79],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0xDA],
+    [0x00, 0x00],
+    [0xA7, 0xD8],
+    [0xA7, 0xD6],
+    [0x00, 0x00],
+    [0xCA, 0xD9],
+    [0xCA, 0xDB],
+    [0xCA, 0xE1],
+    [0x00, 0x00],
+    [0xA7, 0xD5],
+    [0x00, 0x00],
+    [0xCA, 0xDC],
+    [0xCA, 0xE5],
+    [0xA9, 0xC0],
+    [0x00, 0x00],
+    [0xCA, 0xE2],
+    [0xA7, 0xD7],
+    [0x00, 0x00],
+    [0xCA, 0xE0],
+    [0xCA, 0xE3],
+    [0x00, 0x00],
+    [0xA9, 0xBF],
+    [0x00, 0x00],
+    [0xA9, 0xC1],
+    [0xCA, 0xE4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCC, 0xAF],
+    [0xCC, 0xA2],
+    [0xCC, 0x7E],
+    [0xCC, 0xAE],
+    [0xCC, 0xA9],
+    [0xAB, 0xE7],
+    [0xA9, 0xC2],
+    [0xCC, 0xAA],
+    [0xCC, 0xAD],
+    [0xAB, 0xE3],
+    [0xCC, 0xAC],
+    [0xA9, 0xC3],
+    [0xA9, 0xC8],
+    [0xA9, 0xC6],
+    [0xCC, 0xA3],
+    [0x00, 0x00],
+    [0xCC, 0x7C],
+    [0xCC, 0xA5],
+    [0xA9, 0xCD],
+    [0xCC, 0xB0],
+    [0xAB, 0xE4],
+    [0xCC, 0xA6],
+    [0x00, 0x00],
+    [0xAB, 0xE5],
+    [0xA9, 0xC9],
+    [0xCC, 0xA8],
+    [0xFC, 0xA9],
+    [0xCE, 0xCD],
+    [0xAB, 0xE6],
+    [0xCC, 0x7B],
+    [0xA9, 0xCA],
+    [0xAB, 0xE8],
+    [0xA9, 0xCB],
+    [0xA9, 0xC7],
+    [0xA9, 0xCC],
+    [0xCC, 0xA7],
+    [0xCC, 0x7A],
+    [0xCC, 0xAB],
+    [0xA9, 0xC4],
+    [0x00, 0x00],
+    [0xFC, 0x61],
+    [0xCC, 0x7D],
+    [0xCC, 0xA4],
+    [0xCC, 0xA1],
+    [0xA9, 0xC5],
+    [0x00, 0x00],
+    [0xCE, 0xBF],
+    [0x00, 0x00],
+    [0xCE, 0xC0],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0xCA],
+    [0xD1, 0xA1],
+    [0xCE, 0xCB],
+    [0xAB, 0xEE],
+    [0xCE, 0xCE],
+    [0xCE, 0xC4],
+    [0xAB, 0xED],
+    [0xCE, 0xC6],
+    [0x00, 0x00],
+    [0xCE, 0xC7],
+    [0xFA, 0xCB],
+    [0x00, 0x00],
+    [0xCE, 0xC9],
+    [0xAB, 0xE9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0xA3],
+    [0x00, 0x00],
+    [0xF9, 0xDA],
+    [0xCE, 0xC5],
+    [0xCE, 0xC1],
+    [0xAE, 0xA4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0xCF],
+    [0xAE, 0x7E],
+    [0xD1, 0x7D],
+    [0xCE, 0xC8],
+    [0x00, 0x00],
+    [0xD1, 0x7C],
+    [0xCE, 0xC3],
+    [0xCE, 0xCC],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xEC],
+    [0xAE, 0xA1],
+    [0xAB, 0xF2],
+    [0xAE, 0xA2],
+    [0xCE, 0xD0],
+    [0xD1, 0x7E],
+    [0xAB, 0xEB],
+    [0xAE, 0xA6],
+    [0xAB, 0xF1],
+    [0xAB, 0xF0],
+    [0xAB, 0xEF],
+    [0xAE, 0xA5],
+    [0xCE, 0xD1],
+    [0xAE, 0xA7],
+    [0xAB, 0xEA],
+    [0x00, 0x00],
+    [0xCE, 0xC2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x76],
+    [0xD1, 0xA4],
+    [0xD1, 0xA6],
+    [0x00, 0x00],
+    [0xD1, 0xA8],
+    [0xAE, 0xA8],
+    [0xAE, 0xAE],
+    [0xD5, 0x53],
+    [0xD1, 0xAC],
+    [0xD1, 0xA3],
+    [0xB1, 0x78],
+    [0xD5, 0x51],
+    [0x00, 0x00],
+    [0xAE, 0xAD],
+    [0xAE, 0xAB],
+    [0xD1, 0xAE],
+    [0x00, 0x00],
+    [0xD5, 0x52],
+    [0x00, 0x00],
+    [0xD1, 0xA5],
+    [0x00, 0x00],
+    [0xAE, 0xAC],
+    [0xD1, 0xA9],
+    [0xAE, 0xAF],
+    [0xD1, 0xAB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0xAA],
+    [0xD1, 0xAA],
+    [0xD1, 0xAD],
+    [0xD1, 0xA7],
+    [0xFC, 0x6B],
+    [0xAE, 0xA9],
+    [0xB1, 0x79],
+    [0x00, 0x00],
+    [0xD1, 0xA2],
+    [0xB1, 0x77],
+    [0xFC, 0x6C],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0x7A],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD5, 0x55],
+    [0xD5, 0x5E],
+    [0xB4, 0x64],
+    [0xFC, 0x6D],
+    [0xB1, 0x7C],
+    [0xB1, 0xA3],
+    [0xB4, 0x65],
+    [0xD5, 0x60],
+    [0xB1, 0xAA],
+    [0xD8, 0xF9],
+    [0xD5, 0x56],
+    [0xB1, 0xA2],
+    [0xB1, 0xA5],
+    [0xB1, 0x7E],
+    [0xD5, 0x54],
+    [0xD5, 0x62],
+    [0xD5, 0x65],
+    [0xD9, 0x49],
+    [0x00, 0x00],
+    [0xD5, 0x63],
+    [0xD8, 0xFD],
+    [0xB1, 0xA1],
+    [0xB1, 0xA8],
+    [0xB1, 0xAC],
+    [0xD5, 0x5D],
+    [0xD8, 0xF8],
+    [0xD5, 0x61],
+    [0xB1, 0x7B],
+    [0xD8, 0xFA],
+    [0xD5, 0x64],
+    [0xD8, 0xFC],
+    [0xD5, 0x59],
+    [0x00, 0x00],
+    [0xB4, 0x62],
+    [0x00, 0x00],
+    [0xD5, 0x57],
+    [0xD5, 0x58],
+    [0xB1, 0xA7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB1, 0xA6],
+    [0xD5, 0x5B],
+    [0xB1, 0xAB],
+    [0xD5, 0x5F],
+    [0xB1, 0xA4],
+    [0xD5, 0x5C],
+    [0xFD, 0x64],
+    [0xB1, 0xA9],
+    [0xB4, 0x66],
+    [0xB4, 0x63],
+    [0xD8, 0xFB],
+    [0x00, 0x00],
+    [0xD5, 0x5A],
+    [0x00, 0x00],
+    [0xB1, 0x7D],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x6B],
+    [0xB4, 0x6F],
+    [0xD9, 0x40],
+    [0xB7, 0x51],
+    [0xB4, 0x6D],
+    [0xD9, 0x44],
+    [0xB4, 0x71],
+    [0xDD, 0x65],
+    [0xD9, 0x46],
+    [0xB7, 0x53],
+    [0xB4, 0x69],
+    [0xB4, 0x6C],
+    [0xD9, 0x47],
+    [0x00, 0x00],
+    [0xD9, 0x48],
+    [0xD9, 0x4E],
+    [0xB4, 0x73],
+    [0xB7, 0x54],
+    [0x00, 0x00],
+    [0xD9, 0x4A],
+    [0xD9, 0x4F],
+    [0xD9, 0x43],
+    [0xB7, 0x5E],
+    [0x00, 0x00],
+    [0xB7, 0x55],
+    [0xB4, 0x72],
+    [0xD9, 0x41],
+    [0xD9, 0x50],
+    [0x00, 0x00],
+    [0xB7, 0x5D],
+    [0xB4, 0x70],
+    [0xB7, 0x4E],
+    [0xD9, 0x4D],
+    [0x00, 0x00],
+    [0xB4, 0x74],
+    [0xD9, 0x45],
+    [0xD8, 0xFE],
+    [0xB4, 0x6A],
+    [0xD9, 0x42],
+    [0x00, 0x00],
+    [0xD9, 0x4B],
+    [0x00, 0x00],
+    [0xB7, 0x4D],
+    [0xB7, 0x52],
+    [0xB4, 0x67],
+    [0xD9, 0x4C],
+    [0x00, 0x00],
+    [0xB7, 0x50],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x68],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB7, 0x5C],
+    [0xE1, 0xC3],
+    [0xDD, 0x70],
+    [0x00, 0x00],
+    [0xDD, 0x68],
+    [0xE1, 0xC2],
+    [0x00, 0x00],
+    [0xDD, 0x6C],
+    [0xDD, 0x6E],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xDD, 0x6B],
+    [0x00, 0x00],
+    [0xB7, 0x5B],
+    [0x00, 0x00],
+    [0xDD, 0x6A],
+    [0xB7, 0x5F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0xD2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB7, 0x5A],
+    [0xBA, 0x40],
+    [0xDD, 0x71],
+    [0xE1, 0xC4],
+    [0xFC, 0x76],
+    [0x00, 0x00],
+    [0xB7, 0x58],
+    [0xDD, 0x69],
+    [0xDD, 0x6D],
+    [0xB9, 0xFE],
+    [0xB7, 0x4F],
+    [0xDD, 0x66],
+    [0xDD, 0x67],
+    [0xBA, 0x41],
+    [0xB7, 0x57],
+    [0xB7, 0x59],
+    [0xB7, 0x56],
+    [0xDD, 0x6F],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xE1, 0xC8],
+    [0xE1, 0xC9],
+    [0xE1, 0xCE],
+    [0xBC, 0x7D],
+    [0xE1, 0xD5],
+    [0x00, 0x00],
+    [0xBA, 0x47],
+    [0x00, 0x00],
+    [0xBA, 0x46],
+    [0xE1, 0xD0],
+    [0xFC, 0xAA],
+    [0xBC, 0x7C],
+    [0xE1, 0xC5],
+    [0xBA, 0x45],
+    [0xFB, 0xCD],
+    [0xE1, 0xD4],
+    [0xBA, 0x43],
+    [0xBA, 0x44],
+    [0xFC, 0x74],
+    [0xE1, 0xD1],
+    [0xE5, 0xAA],
+    [0xBC, 0x7A],
+    [0xB4, 0x6E],
+    [0x00, 0x00],
+    [0xE1, 0xD3],
+    [0xBC, 0xA3],
+    [0xE1, 0xCB],
+    [0x00, 0x00],
+    [0xBC, 0x7B],
+    [0x00, 0x00],
+    [0xBC, 0xA2],
+    [0xE1, 0xC6],
+    [0xE1, 0xCA],
+    [0xE1, 0xC7],
+    [0xE1, 0xCD],
+    [0xBA, 0x48],
+    [0xBC, 0x79],
+    [0xBA, 0x42],
+    [0x00, 0x00],
+    [0xE5, 0x7A],
+    [0xE1, 0xCF],
+    [0x00, 0x00],
+    [0xBC, 0xA1],
+    [0x00, 0x00],
+    [0xBC, 0xA4],
+    [0x00, 0x00],
+    [0xE1, 0xCC],
+    [0xFC, 0x79],
+    [0xBC, 0x7E],
+    [0xE5, 0x79],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFC, 0x7C],
+    [0x00, 0x00],
+    [0xE5, 0x7E],
+    [0xBE, 0xCE],
+    [0xE5, 0x78],
+    [0xE9, 0xA3],
+    [0xE5, 0xA9],
+    [0xBC, 0xA8],
+    [0x00, 0x00],
+    [0xBC, 0xA6],
+    [0xBE, 0xCC],
+    [0xE5, 0xA6],
+    [0xE5, 0xA2],
+    [0xBC, 0xAC],
+    [0x00, 0x00],
+    [0xE9, 0x78],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0xAA],
+    [0xE5, 0xA1],
+    [0x00, 0x00],
+    [0xE9, 0x76],
+    [0x00, 0x00],
+    [0xE5, 0xA5],
+    [0x00, 0x00],
+    [0xE5, 0xA8],
+    [0xE5, 0x7D],
+    [0x00, 0x00],
+    [0xBC, 0xAB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xBC, 0xA5],
+    [0xE9, 0x77],
+    [0xBE, 0xCD],
+    [0xE5, 0xA7],
+    [0xBC, 0xA7],
+    [0xBC, 0xA9],
+    [0xE5, 0xA4],
+    [0xBC, 0xAD],
+    [0xE5, 0xA3],
+    [0xE5, 0x7C],
+    [0xE5, 0x7B],
+    [0xBE, 0xCB],
+    [0xE5, 0xAB],
+    [0xE9, 0x7A],
+    [0xEC, 0xE0],
+    [0xBE, 0xD0],
+    [0x00, 0x00],
+    [0xE9, 0xA2],
+    [0x00, 0x00],
+    [0xE9, 0x7E],
+    [0x00, 0x00],
+    [0xEC, 0xE1],
+    [0x00, 0x00],
+    [0xBE, 0xD1],
+    [0xE9, 0xA1],
+    [0x00, 0x00],
+    [0xE9, 0x7C],
+    [0xC0, 0xB4],
+    [0xEC, 0xDF],
+    [0x00, 0x00],
+    [0xE9, 0x79],
+    [0xE9, 0x7B],
+    [0xC0, 0xB5],
+    [0xBE, 0xD3],
+    [0xC0, 0xB3],
+    [0xBE, 0xD2],
+    [0xC0, 0xB7],
+    [0xE9, 0x7D],
+    [0xBE, 0xCF],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFC, 0xA5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFC, 0xA2],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEF, 0xCF],
+    [0x00, 0x00],
+    [0xEF, 0xC7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xEC, 0xE7],
+    [0xEF, 0xC8],
+    [0xEC, 0xE3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC2, 0x56],
+    [0xEC, 0xE5],
+    [0xEC, 0xE4],
+    [0xC0, 0xB6],
+    [0xEC, 0xE2],
+    [0xEC, 0xE6],
+    [0xEF, 0xD0],
+    [0xEF, 0xCC],
+    [0xEF, 0xCE],
+    [0x00, 0x00],
+    [0xEF, 0xC9],
+    [0xEF, 0xCA],
+    [0x00, 0x00],
+    [0xEF, 0xCD],
+    [0xEF, 0xCB],
+    [0xC3, 0x67],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xC3, 0x6A],
+    [0xC3, 0x69],
+    [0xC3, 0x68],
+    [0xC4, 0x61],
+    [0xF4, 0x4A],
+    [0xC4, 0x62],
+    [0xF2, 0x41],
+    [0xC4, 0xDF],
+    [0xF5, 0xCC],
+    [0xC4, 0xE0],
+    [0xC5, 0x74],
+    [0xC5, 0xCA],
+    [0xF7, 0xD9],
+    [0x00, 0x00],
+    [0xF7, 0xDA],
+    [0xF7, 0xDB],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xF9, 0xBA],
+    [0xA4, 0xE0],
+    [0xC9, 0x7C],
+    [0xA5, 0xB3],
+    [0x00, 0x00],
+    [0xA6, 0xA6],
+    [0xA6, 0xA7],
+    [0xA6, 0xA5],
+    [0x00, 0x00],
+    [0xA6, 0xA8],
+    [0xA7, 0xDA],
+    [0xA7, 0xD9],
+    [0x00, 0x00],
+    [0xCC, 0xB1],
+    [0xA9, 0xCF],
+    [0xA9, 0xCE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0xAF],
+    [0xB1, 0xAD],
+    [0xB1, 0xAE],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xB4, 0x75],
+    [0xDD, 0x72],
+    [0xB7, 0x60],
+    [0xB7, 0x61],
+    [0xDD, 0x74],
+    [0xDD, 0x76],
+    [0xDD, 0x75],
+    [0x00, 0x00],
+    [0xE1, 0xD7],
+    [0x00, 0x00],
+    [0xE1, 0xD6],
+    [0xBA, 0x49],
+    [0xE1, 0xD8],
+    [0x00, 0x00],
+    [0xE5, 0xAC],
+    [0xBC, 0xAE],
+    [0x00, 0x00],
+    [0xBE, 0xD4],
+    [0x00, 0x00],
+    [0xC0, 0xB8],
+    [0xC2, 0x57],
+    [0xC0, 0xB9],
+    [0x00, 0x00],
+    [0xA4, 0xE1],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCA, 0xE6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCC, 0xB2],
+    [0xA9, 0xD1],
+    [0xA9, 0xD0],
+    [0xA9, 0xD2],
+    [0xAB, 0xF3],
+    [0xCE, 0xD2],
+    [0xCE, 0xD3],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD1, 0xB0],
+    [0xAE, 0xB0],
+    [0xB1, 0xAF],
+    [0xB4, 0x76],
+    [0xD9, 0x51],
+    [0xA4, 0xE2],
+    [0x00, 0x00],
+    [0xA4, 0x7E],
+    [0xA4, 0xE3],
+    [0x00, 0x00],
+    [0xC9, 0x7D],
+    [0xA5, 0xB7],
+    [0xA5, 0xB6],
+    [0xA5, 0xB4],
+    [0xA5, 0xB5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA6, 0xAB],
+    [0xC9, 0xE9],
+    [0xC9, 0xEB],
+    [0xA6, 0xAA],
+    [0xC9, 0xE3],
+    [0x00, 0x00],
+    [0xC9, 0xE4],
+    [0x00, 0x00],
+    [0xC9, 0xEA],
+    [0xC9, 0xE6],
+    [0xC9, 0xE8],
+    [0xA6, 0xA9],
+    [0xC9, 0xE5],
+    [0xC9, 0xEC],
+    [0xC9, 0xE7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA7, 0xE1],
+    [0xA7, 0xEA],
+    [0xA7, 0xE8],
+    [0xCA, 0xF0],
+    [0xCA, 0xED],
+    [0xCA, 0xF5],
+    [0xA7, 0xE6],
+    [0xCA, 0xF6],
+    [0x00, 0x00],
+    [0xA7, 0xDF],
+    [0xCA, 0xF3],
+    [0x00, 0x00],
+    [0xA7, 0xE5],
+    [0xCA, 0xEF],
+    [0xCA, 0xEE],
+    [0xA7, 0xE3],
+    [0xCA, 0xF4],
+    [0xA7, 0xE4],
+    [0xA9, 0xD3],
+    [0xA7, 0xDE],
+    [0xCA, 0xF1],
+    [0x00, 0x00],
+    [0xCA, 0xE7],
+    [0xA7, 0xDB],
+    [0x00, 0x00],
+    [0xA7, 0xEE],
+    [0xCA, 0xEC],
+    [0xCA, 0xF2],
+    [0xA7, 0xE0],
+    [0xA7, 0xE2],
+    [0x00, 0x00],
+    [0xCA, 0xE8],
+    [0x00, 0x00],
+    [0xCA, 0xE9],
+    [0xCA, 0xEA],
+    [0x00, 0x00],
+    [0xA7, 0xED],
+    [0xA7, 0xE7],
+    [0xA7, 0xEC],
+    [0xCA, 0xEB],
+    [0xA7, 0xEB],
+    [0xA7, 0xDD],
+    [0xA7, 0xDC],
+    [0xA7, 0xE9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0xE1],
+    [0xCC, 0xBE],
+    [0xCC, 0xB7],
+    [0xA9, 0xDC],
+    [0xA9, 0xEF],
+    [0xCC, 0xB3],
+    [0xCC, 0xBA],
+    [0xCC, 0xBC],
+    [0xCC, 0xBF],
+    [0xA9, 0xEA],
+    [0x00, 0x00],
+    [0xCC, 0xBB],
+    [0xCC, 0xB4],
+    [0xA9, 0xE8],
+    [0xCC, 0xB8],
+    [0x00, 0x00],
+    [0xCC, 0xC0],
+    [0xA9, 0xD9],
+    [0x00, 0x00],
+    [0xCC, 0xBD],
+    [0xA9, 0xE3],
+    [0xA9, 0xE2],
+    [0xCC, 0xB6],
+    [0xA9, 0xD7],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xA9, 0xD8],
+    [0x00, 0x00],
+    [0xA9, 0xD6],
+    [0xFC, 0xAE],
+    [0xA9, 0xEE],
+    [0xA9, 0xE6],
+    [0xA9, 0xE0],
+    [0xA9, 0xD4],
+    [0xCC, 0xB9],
+    [0xA9, 0xDF],
+    [0xA9, 0xD5],
+    [0xA9, 0xE7],
+    [0xA9, 0xF0],
+    [0xCE, 0xD4],
+    [0xA9, 0xE4],
+    [0xCC, 0xB5],
+    [0xA9, 0xDA],
+    [0xA9, 0xDD],
+    [0xA9, 0xDE],
+    [0xFC, 0xB0],
+    [0xA9, 0xEC],
+    [0xA9, 0xED],
+    [0xA9, 0xEB],
+    [0xA9, 0xE5],
+    [0xA9, 0xE9],
+    [0xA9, 0xDB],
+    [0xAB, 0xF4],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xFA, 0x51],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xCE, 0xDA],
+    [0xAC, 0x41],
+    [0xAB, 0xF8],
+    [0xAB, 0xFA],
+    [0xAC, 0x40],
+    [0xCE, 0xE6],
+    [0xAB, 0xFD],
+    [0xD1, 0xB1],
+    [0xAE, 0xB1],
+    [0xAC, 0x43],
+    [0xCE, 0xD7],
+    [0xCE, 0xDF],
+    [0xAB, 0xFE],
+    [0xCE, 0xDE],
+    [0xCE, 0xDB],
+    [0xCE, 0xE3],
+    [0xCE, 0xE5],
+    [0xAB, 0xF7],
+    [0xAB, 0xFB],
+    [0xAC, 0x42],
+    [0xAE, 0xB3],
+    [0xCE, 0xE0],
+    [0xAB, 0xF9],
+    [0xAC, 0x45],
+    [0xCE, 0xD9],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAB, 0xFC],
+    [0xAE, 0xB2],
+    [0xAB, 0xF6],
+    [0x00, 0x00],
+    [0xCE, 0xD6],
+    [0xCE, 0xDD],
+    [0xCE, 0xD5],
+    [0xCE, 0xD8],
+    [0xCE, 0xDC],
+    [0xD1, 0xB2],
+    [0xAC, 0x44],
+    [0x00, 0x00],
+    [0xCE, 0xE1],
+    [0xCE, 0xE2],
+    [0xCE, 0xE4],
+    [0xAB, 0xF5],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xAE, 0xC1],
+    [0xD1, 0xBE],
+    [0xAE, 0xBF],
+    [0xAE, 0xC0],
+    [0xD1, 0xB4],
+    [0xD1, 0xC4],
+    [0x00, 0x00],
+    [0xAE, 0xB6],
+    [0x00, 0x00],
+    [0x00, 0x00],
+    [0xD5, 0x66],
+    [0xD1, 0xC6],
+    [0xD1, 0xC0],
+    [0x00, 0x00],
+    [0xD1, 0xB7],
+    [0x00, 0x00],
+    [0xD1, 0xC9],
+    [0xD1, 0xBA],
+    [0xAE, 0xBC],
+    [0xD5, 0x7D