├── .gitattributes ├── .github ├── FUNDING.yml └── workflows │ └── ci.yml ├── .gitignore ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── LICENSE-UNICODE ├── MAINTENANCE.md ├── README.md ├── benches └── id.rs ├── diagram ├── .gitignore ├── Cargo.toml └── src │ └── main.rs ├── generate ├── Cargo.toml └── src │ ├── main.rs │ ├── output.rs │ ├── parse.rs │ └── write.rs ├── rust-toolchain.toml ├── src ├── lib.rs └── tables.rs └── tests ├── compare.rs ├── crate ├── .gitignore ├── Cargo.toml └── test.rs ├── fst ├── .gitignore ├── id_continue.fst ├── id_start.fst └── mod.rs ├── roaring └── mod.rs ├── static_size.rs ├── tables ├── mod.rs └── tables.rs └── trie ├── mod.rs └── trie.rs /.gitattributes: -------------------------------------------------------------------------------- 1 | src/tables.rs linguist-generated 2 | tests/fst/id_continue.fst linguist-generated 3 | tests/fst/id_start.fst linguist-generated 4 | tests/tables/tables.rs linguist-generated 5 | tests/trie/trie.rs linguist-generated 6 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: dtolnay 2 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | workflow_dispatch: 7 | schedule: [cron: "40 1 * * *"] 8 | 9 | permissions: 10 | contents: read 11 | 12 | env: 13 | RUSTFLAGS: -Dwarnings 14 | 15 | jobs: 16 | pre_ci: 17 | uses: dtolnay/.github/.github/workflows/pre_ci.yml@master 18 | 19 | unicode: 20 | name: latest Unicode 21 | runs-on: ubuntu-latest 22 | if: github.event_name != 'pull_request' 23 | timeout-minutes: 45 24 | steps: 25 | - uses: taiki-e/checkout-action@v1 26 | - uses: dtolnay/rust-toolchain@stable 27 | - id: ucd-generate 28 | run: echo "version=$(grep 'ucd-generate [0-9]\+\.[0-9]\+\.[0-9]\+' tests/tables/tables.rs --only-matching)" >> $GITHUB_OUTPUT 29 | - run: cargo install ucd-generate 30 | - run: curl https://www.unicode.org/Public/zipped/latest/UCD.zip --location --remote-name --silent --show-error --fail --retry 2 31 | - run: unzip UCD.zip -d UCD 32 | - run: ucd-generate property-bool UCD --include ID_Start,ID_Continue > tests/tables/tables.rs 33 | - run: ucd-generate property-bool UCD --include ID_Start,ID_Continue --fst-dir tests/fst 34 | - run: ucd-generate property-bool UCD --include ID_Start,ID_Continue --trie-set > tests/trie/trie.rs 35 | - run: cargo run --manifest-path generate/Cargo.toml 36 | - run: sed --in-place 's/ucd-generate [0-9]\+\.[0-9]\+\.[0-9]\+/${{steps.ucd-generate.outputs.version}}/' tests/tables/tables.rs tests/trie/trie.rs 37 | - run: git diff --exit-code 38 | 39 | test: 40 | name: Rust ${{matrix.rust}} 41 | needs: pre_ci 42 | if: needs.pre_ci.outputs.continue 43 | runs-on: ubuntu-latest 44 | strategy: 45 | fail-fast: false 46 | matrix: 47 | rust: [nightly, beta, stable, 1.74.0] 48 | timeout-minutes: 45 49 | steps: 50 | - uses: taiki-e/checkout-action@v1 51 | - run: rm rust-toolchain.toml 52 | - uses: dtolnay/rust-toolchain@master 53 | with: 54 | toolchain: ${{matrix.rust}} 55 | - name: Enable type layout randomization 56 | run: echo RUSTFLAGS=${RUSTFLAGS}\ -Zrandomize-layout >> $GITHUB_ENV 57 | if: matrix.rust == 'nightly' 58 | - run: cargo test 59 | - run: cargo check --benches 60 | 61 | msrv: 62 | name: Rust 1.31.0 63 | needs: pre_ci 64 | if: needs.pre_ci.outputs.continue 65 | runs-on: ubuntu-latest 66 | timeout-minutes: 45 67 | steps: 68 | - uses: taiki-e/checkout-action@v1 69 | - uses: dtolnay/rust-toolchain@1.31.0 70 | - run: cargo check --manifest-path tests/crate/Cargo.toml 71 | 72 | clippy: 73 | name: Clippy 74 | runs-on: ubuntu-latest 75 | if: github.event_name != 'pull_request' 76 | timeout-minutes: 45 77 | steps: 78 | - uses: taiki-e/checkout-action@v1 79 | - uses: dtolnay/rust-toolchain@clippy 80 | - run: cargo clippy --tests --benches --workspace -- -Dclippy::all -Dclippy::pedantic 81 | 82 | outdated: 83 | name: Outdated 84 | runs-on: ubuntu-latest 85 | if: github.event_name != 'pull_request' 86 | timeout-minutes: 45 87 | steps: 88 | - uses: taiki-e/checkout-action@v1 89 | - uses: dtolnay/install@cargo-outdated 90 | # - run: cargo outdated --workspace --exit-code 1 # https://github.com/kbknapp/cargo-outdated/issues/389 91 | - run: cargo outdated --exit-code 1 92 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /Cargo.lock 3 | /UCD 4 | /UCD.zip 5 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "unicode-id-start" 3 | version = "1.3.1" 4 | authors = ["David Tolnay ", "Boshen "] 5 | categories = ["development-tools::procedural-macro-helpers", "no-std", "no-std::no-alloc"] 6 | description = "Determine whether characters have the ID_Start or ID_Continue properties according to Unicode Standard Annex #31" 7 | documentation = "https://docs.rs/unicode-id-start" 8 | edition = "2018" 9 | keywords = ["unicode", "id"] 10 | license = "(MIT OR Apache-2.0) AND Unicode-3.0" 11 | repository = "https://github.com/Boshen/unicode-id-start" 12 | rust-version = "1.31" 13 | 14 | [dev-dependencies] 15 | criterion = { version = "0.5", default-features = false } 16 | fst = "0.4" 17 | rand = { version = "0.8", features = ["small_rng"] } 18 | roaring = "0.10" 19 | ucd-trie = { version = "0.1", default-features = false } 20 | unicode-id = "0.3.5" 21 | 22 | [[bench]] 23 | name = "id" 24 | harness = false 25 | 26 | [workspace] 27 | members = ["diagram", "generate"] 28 | 29 | [lib] 30 | doc-scrape-examples = false 31 | 32 | [package.metadata.docs.rs] 33 | targets = ["x86_64-unknown-linux-gnu"] 34 | rustdoc-args = ["--generate-link-to-definition"] 35 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /LICENSE-UNICODE: -------------------------------------------------------------------------------- 1 | UNICODE LICENSE V3 2 | 3 | COPYRIGHT AND PERMISSION NOTICE 4 | 5 | Copyright © 1991-2023 Unicode, Inc. 6 | 7 | NOTICE TO USER: Carefully read the following legal agreement. BY 8 | DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR 9 | SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE 10 | TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT 11 | DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a 14 | copy of data files and any associated documentation (the "Data Files") or 15 | software and any associated documentation (the "Software") to deal in the 16 | Data Files or Software without restriction, including without limitation 17 | the rights to use, copy, modify, merge, publish, distribute, and/or sell 18 | copies of the Data Files or Software, and to permit persons to whom the 19 | Data Files or Software are furnished to do so, provided that either (a) 20 | this copyright and permission notice appear with all copies of the Data 21 | Files or Software, or (b) this copyright and permission notice appear in 22 | associated Documentation. 23 | 24 | THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY 25 | KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF 27 | THIRD PARTY RIGHTS. 28 | 29 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE 30 | BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, 31 | OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 32 | WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 33 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA 34 | FILES OR SOFTWARE. 35 | 36 | Except as contained in this notice, the name of a copyright holder shall 37 | not be used in advertising or otherwise to promote the sale, use or other 38 | dealings in these Data Files or Software without prior written 39 | authorization of the copyright holder. 40 | -------------------------------------------------------------------------------- /MAINTENANCE.md: -------------------------------------------------------------------------------- 1 | 2 | To regenerate tables, run the following in the repo root (replace the unicode version): 3 | 4 | ```bash 5 | cargo binstall ucd-generate 6 | curl -LO https://www.unicode.org/Public/zipped/16.0.0/UCD.zip 7 | unzip UCD.zip -d UCD 8 | ucd-generate property-bool UCD --include ID_Start,ID_Continue > tests/tables/tables.rs 9 | ucd-generate property-bool UCD --include ID_Start,ID_Continue --fst-dir tests/fst 10 | ucd-generate property-bool UCD --include ID_Start,ID_Continue --trie-set > tests/trie/trie.rs 11 | cargo run --manifest-path generate/Cargo.toml 12 | ``` 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!IMPORTANT] 2 | > This crate is a better optimized implementation of the older `unicode-id` crate. 3 | > This crate uses less static storage, and is able to classify both ASCII and non-ASCII codepoints with better performance, 2–10× faster than `unicode-id`. 4 | 5 | Unicode ID_start 6 | ============= 7 | 8 | [github](https://github.com/dtolnay/unicode-ident) 9 | [crates.io](https://crates.io/crates/unicode-ident) 10 | [docs.rs](https://docs.rs/unicode-ident) 11 | [build status](https://github.com/dtolnay/unicode-ident/actions?query=branch%3Amaster) 12 | 13 | Implementation of [Unicode Standard Annex #31][tr31] for determining which 14 | `char` values are valid in programming language identifiers. 15 | 16 | [tr31]: https://www.unicode.org/reports/tr31/ 17 | 18 | ## Changelog 19 | 20 | ### 1.3.0 21 | 22 | - Unicode 16.0.0 23 | 24 | ### 1.2.0 25 | 26 | - patch `・` U+30FB KATAKANA MIDDLE DOT and `・` U+FF65 HALFWIDTH KATAKANA MIDDLE DOT 27 | 28 | Unicode 4.1 through Unicode 15 omitted these two characters from ID_Continue by accident. 29 | However, this accident was corrected in Unicode 15.1. 30 | Any JS VM that supports ES6+ but that uses a version of Unicode earlier than 15.1 will consider these to be a syntax error, 31 | so we deliberately omit these characters from the set of identifiers that are valid in both ES5 and ES6+. 32 | For more info see 2.2 in https://www.unicode.org/L2/L2023/23160-utc176-properties-recs.pdf 33 | 34 | ### 1.1.2 35 | 36 | - Unicode 15.1.0 37 | 38 | ### 1.1.1 39 | 40 | - Unicode 15.0.0 41 | 42 | ### 1.0.4 43 | 44 | - Unicode 14.0.0 45 | 46 | 47 |
48 | 49 | ## Comparison of performance 50 | 51 | The following table shows a comparison between five Unicode identifier 52 | implementations. 53 | 54 | - `unicode-id-start` is this crate, which is a fork of [`unicode-ident`]; 55 | - [`unicode-xid`] is a widely used crate run by the "unicode-rs" org, [`unicode-id`] is a fork of [`unicode-xid`]; 56 | - `ucd-trie` and `fst` are two data structures supported by the [`ucd-generate`] tool; 57 | - [`roaring`] is a Rust implementation of Roaring bitmap. 58 | 59 | The *static storage* column shows the total size of `static` tables that the 60 | crate bakes into your binary, measured in 1000s of bytes. 61 | 62 | The remaining columns show the **cost per call** to evaluate whether a single 63 | `char` has the ID\_Start or ID\_Continue Unicode property, comparing across 64 | different ratios of ASCII to non-ASCII codepoints in the input data. 65 | 66 | [`unicode-ident`]: https://github.com/dtolnay/unicode-ident 67 | [`unicode-xid`]: https://github.com/unicode-rs/unicode-xid 68 | [`unicode-id`]: https://github.com/Boshen/unicode-id 69 | [`ucd-generate`]: https://github.com/BurntSushi/ucd-generate 70 | [`roaring`]: https://github.com/RoaringBitmap/roaring-rs 71 | 72 | | | static storage | 0% nonascii | 1% | 10% | 100% nonascii | 73 | |---|---|---|---|---|---| 74 | | **`unicode-ident`** | 10.0 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns | 75 | | **`unicode-xid`** | 11.5 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns | 76 | | **`ucd-trie`** | 10.2 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns | 77 | | **`fst`** | 138 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns | 78 | | **`roaring`** | 66.1 K | 2.78 ns | 3.09 ns | 3.37 ns | 4.70 ns | 79 | 80 | Source code for the benchmark is provided in the *bench* directory of this repo 81 | and may be repeated by running `cargo criterion`. 82 | 83 |
84 | 85 | ## Comparison of data structures 86 | 87 | #### unicode-id 88 | 89 | They use a sorted array of character ranges, and do a binary search to look up 90 | whether a given character lands inside one of those ranges. 91 | 92 | ```rust 93 | static ID_Continue_table: [(char, char); 763] = [ 94 | ('\u{30}', '\u{39}'), // 0-9 95 | ('\u{41}', '\u{5a}'), // A-Z 96 | … 97 | ('\u{e0100}', '\u{e01ef}'), 98 | ]; 99 | ``` 100 | 101 | The static storage used by this data structure scales with the number of 102 | contiguous ranges of identifier codepoints in Unicode. Every table entry 103 | consumes 8 bytes, because it consists of a pair of 32-bit `char` values. 104 | 105 | In some ranges of the Unicode codepoint space, this is quite a sparse 106 | representation – there are some ranges where tens of thousands of adjacent 107 | codepoints are all valid identifier characters. In other places, the 108 | representation is quite inefficient. A characater like `µ` (U+00B5) which is 109 | surrounded by non-identifier codepoints consumes 64 bits in the table, while it 110 | would be just 1 bit in a dense bitmap. 111 | 112 | On a system with 64-byte cache lines, binary searching the table touches 7 cache 113 | lines on average. Each cache line fits only 8 table entries. Additionally, the 114 | branching performed during the binary search is probably mostly unpredictable to 115 | the branch predictor. 116 | 117 | Overall, the crate ends up being about 10× slower on non-ASCII input 118 | compared to the fastest crate. 119 | 120 | A potential improvement would be to pack the table entries more compactly. 121 | Rust's `char` type is a 21-bit integer padded to 32 bits, which means every 122 | table entry is holding 22 bits of wasted space, adding up to 3.9 K. They could 123 | instead fit every table entry into 6 bytes, leaving out some of the padding, for 124 | a 25% improvement in space used. With some cleverness it may be possible to fit 125 | in 5 bytes or even 4 bytes by storing a low char and an extent, instead of low 126 | char and high char. I don't expect that performance would improve much but this 127 | could be the most efficient for space across all the libraries, needing only 128 | about 7 K to store. 129 | 130 | #### ucd-trie 131 | 132 | Their data structure is a compressed trie set specifically tailored for Unicode 133 | codepoints. The design is credited to Raph Levien in [rust-lang/rust#33098]. 134 | 135 | [rust-lang/rust#33098]: https://github.com/rust-lang/rust/pull/33098 136 | 137 | ```rust 138 | pub struct TrieSet { 139 | tree1_level1: &'static [u64; 32], 140 | tree2_level1: &'static [u8; 992], 141 | tree2_level2: &'static [u64], 142 | tree3_level1: &'static [u8; 256], 143 | tree3_level2: &'static [u8], 144 | tree3_level3: &'static [u64], 145 | } 146 | ``` 147 | 148 | It represents codepoint sets using a trie to achieve prefix compression. The 149 | final states of the trie are embedded in leaves or "chunks", where each chunk is 150 | a 64-bit integer. Each bit position of the integer corresponds to whether a 151 | particular codepoint is in the set or not. These chunks are not just a compact 152 | representation of the final states of the trie, but are also a form of suffix 153 | compression. In particular, if multiple ranges of 64 contiguous codepoints have 154 | the same Unicode properties, then they all map to the same chunk in the final 155 | level of the trie. 156 | 157 | Being tailored for Unicode codepoints, this trie is partitioned into three 158 | disjoint sets: tree1, tree2, tree3. The first set corresponds to codepoints \[0, 159 | 0x800), the second \[0x800, 0x10000) and the third \[0x10000, 0x110000). These 160 | partitions conveniently correspond to the space of 1 or 2 byte UTF-8 encoded 161 | codepoints, 3 byte UTF-8 encoded codepoints and 4 byte UTF-8 encoded codepoints, 162 | respectively. 163 | 164 | Lookups in this data structure are significantly more efficient than binary 165 | search. A lookup touches either 1, 2, or 3 cache lines based on which of the 166 | trie partitions is being accessed. 167 | 168 | One possible performance improvement would be for this crate to expose a way to 169 | query based on a UTF-8 encoded string, returning the Unicode property 170 | corresponding to the first character in the string. Without such an API, the 171 | caller is required to tokenize their UTF-8 encoded input data into `char`, hand 172 | the `char` into `ucd-trie`, only for `ucd-trie` to undo that work by converting 173 | back into the variable-length representation for trie traversal. 174 | 175 | #### fst 176 | 177 | Uses a [finite state transducer][fst]. This representation is built into 178 | [ucd-generate] but I am not aware of any advantage over the `ucd-trie` 179 | representation. In particular `ucd-trie` is optimized for storing Unicode 180 | properties while `fst` is not. 181 | 182 | [fst]: https://github.com/BurntSushi/fst 183 | [ucd-generate]: https://github.com/BurntSushi/ucd-generate 184 | 185 | As far as I can tell, the main thing that causes `fst` to have large size and 186 | slow lookups for this use case relative to `ucd-trie` is that it does not 187 | specialize for the fact that only 21 of the 32 bits in a `char` are meaningful. 188 | There are some dense arrays in the structure with large ranges that could never 189 | possibly be used. 190 | 191 | #### roaring 192 | 193 | This crate is a pure-Rust implementation of [Roaring Bitmap], a data structure 194 | designed for storing sets of 32-bit unsigned integers. 195 | 196 | [Roaring Bitmap]: https://roaringbitmap.org/about/ 197 | 198 | Roaring bitmaps are compressed bitmaps which tend to outperform conventional 199 | compressed bitmaps such as WAH, EWAH or Concise. In some instances, they can be 200 | hundreds of times faster and they often offer significantly better compression. 201 | 202 | In this use case the performance was reasonably competitive but still 203 | substantially slower than the Unicode-optimized crates. Meanwhile the 204 | compression was significantly worse, requiring 6× as much storage for the 205 | data structure. 206 | 207 | I also benchmarked the [`croaring`] crate which is an FFI wrapper around the C 208 | reference implementation of Roaring Bitmap. This crate was consistently about 209 | 15% slower than pure-Rust `roaring`, which could just be FFI overhead. I did not 210 | investigate further. 211 | 212 | [`croaring`]: https://crates.io/crates/croaring 213 | 214 | #### unicode-ident 215 | 216 | This crate is most similar to the `ucd-trie` library, in that it's based on 217 | bitmaps stored in the leafs of a trie representation, achieving both prefix 218 | compression and suffix compression. 219 | 220 | The key differences are: 221 | 222 | - Uses a single 2-level trie, rather than 3 disjoint partitions of different 223 | depth each. 224 | - Uses significantly larger chunks: 512 bits rather than 64 bits. 225 | - Compresses the ID\_Start and ID\_Continue properties together 226 | simultaneously, rather than duplicating identical trie leaf chunks across the 227 | two. 228 | 229 | The following diagram show the ID\_Start and ID\_Continue Unicode boolean 230 | properties in uncompressed form, in row-major order: 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 |
ID_StartID_Continue
ID_Start bitmapID_Continue bitmap
239 | 240 | Uncompressed, these would take 140 K to store, which is beyond what would be 241 | reasonable. However, as you can see there is a large degree of similarity 242 | between the two bitmaps and across the rows, which lends well to compression. 243 | 244 | This crate stores one 512-bit "row" of the above bitmaps in the leaf level of a 245 | trie, and a single additional level to index into the leafs. It turns out there 246 | are 124 unique 512-bit chunks across the two bitmaps so 7 bits are sufficient to 247 | index them. 248 | 249 | The chunk size of 512 bits is selected as the size that minimizes the total size 250 | of the data structure. A smaller chunk, like 256 or 128 bits, would achieve 251 | better deduplication but require a larger index. A larger chunk would increase 252 | redundancy in the leaf bitmaps. 512 bit chunks are the optimum for total size of 253 | the index plus leaf bitmaps. 254 | 255 | In fact since there are only 124 unique chunks, we can use an 8-bit index with a 256 | spare bit to index at the half-chunk level. This achieves an additional 8.5% 257 | compression by eliminating redundancies between the second half of any chunk and 258 | the first half of any other chunk. Note that this is not the same as using 259 | chunks which are half the size, because it does not necessitate raising the size 260 | of the trie's first level. 261 | 262 | In contrast to binary search or the `ucd-trie` crate, performing lookups in this 263 | data structure is straight-line code with no need for branching. 264 | 265 | ```asm 266 | is_id_start: 267 | mov eax, edi 268 | shr eax, 9 269 | lea rcx, [rip + unicode_ident::tables::TRIE_START] 270 | add rcx, rax 271 | xor eax, eax 272 | cmp edi, 201728 273 | cmovb rax, rcx 274 | test rax, rax 275 | lea rcx, [rip + .L__unnamed_1] 276 | cmovne rcx, rax 277 | movzx eax, byte ptr [rcx] 278 | shl rax, 5 279 | mov ecx, edi 280 | shr ecx, 3 281 | and ecx, 63 282 | add rcx, rax 283 | lea rax, [rip + unicode_ident::tables::LEAF] 284 | mov al, byte ptr [rax + rcx] 285 | and dil, 7 286 | mov ecx, edi 287 | shr al, cl 288 | and al, 1 289 | ret 290 | ``` 291 | 292 |
293 | 294 | ## License 295 | 296 | Use of the Unicode Character Database, as this crate does, is governed by the UNICODE LICENSE V3. 298 | 299 | All intellectual property within this crate that is **not generated** using the 300 | Unicode Character Database as input is licensed under either of Apache License, Version 2.0 or MIT license at your option. 303 | 304 | The **generated** files incorporate tabular data derived from the Unicode 305 | Character Database, together with intellectual property from the original source 306 | code content of the crate. One must comply with the terms of both the Unicode 307 | License Agreement and either of the Apache license or MIT license when those 308 | generated files are involved. 309 | 310 | Unless you explicitly state otherwise, any contribution intentionally submitted 311 | for inclusion in this crate by you, as defined in the Apache-2.0 license, shall 312 | be licensed as just described, without any additional terms or conditions. 313 | -------------------------------------------------------------------------------- /benches/id.rs: -------------------------------------------------------------------------------- 1 | // To run: 2 | // 3 | // cargo criterion --features criterion/real_blackbox 4 | // 5 | // This benchmarks each of the different libraries at several ratios of ASCII to 6 | // non-ASCII content. There is one additional benchmark labeled "baseline" which 7 | // just iterates over characters in a string, converting UTF-8 to 32-bit chars. 8 | // 9 | // Criterion will show a time in milliseconds. The non-baseline bench functions 10 | // each make one million function calls (2 calls per character, 500K characters 11 | // in the strings created by gen_string). The "time per call" listed in our 12 | // readme is computed by subtracting this baseline from the other bench 13 | // functions' time, then dividing by one million (ms -> ns). 14 | 15 | #![allow( 16 | clippy::incompatible_msrv, // https://github.com/rust-lang/rust-clippy/issues/12257 17 | clippy::needless_pass_by_value, 18 | )] 19 | 20 | #[path = "../tests/fst/mod.rs"] 21 | mod fst; 22 | #[path = "../tests/roaring/mod.rs"] 23 | mod roaring; 24 | #[path = "../tests/trie/mod.rs"] 25 | mod trie; 26 | 27 | use criterion::{black_box, criterion_group, criterion_main, Criterion}; 28 | use rand::distributions::{Bernoulli, Distribution, Uniform}; 29 | use rand::rngs::SmallRng; 30 | use rand::SeedableRng; 31 | use std::time::Duration; 32 | 33 | fn gen_string(p_nonascii: u32) -> String { 34 | let mut rng = SmallRng::from_seed([b'!'; 32]); 35 | let pick_nonascii = Bernoulli::from_ratio(p_nonascii, 100).unwrap(); 36 | let ascii = Uniform::new_inclusive('\0', '\x7f'); 37 | let nonascii = Uniform::new_inclusive(0x80 as char, char::MAX); 38 | 39 | let mut string = String::new(); 40 | for _ in 0..500_000 { 41 | let distribution = if pick_nonascii.sample(&mut rng) { 42 | nonascii 43 | } else { 44 | ascii 45 | }; 46 | string.push(distribution.sample(&mut rng)); 47 | } 48 | 49 | string 50 | } 51 | 52 | fn bench(c: &mut Criterion, group_name: &str, string: String) { 53 | let mut group = c.benchmark_group(group_name); 54 | group.measurement_time(Duration::from_secs(10)); 55 | group.bench_function("baseline", |b| { 56 | b.iter(|| { 57 | for ch in string.chars() { 58 | black_box(ch); 59 | } 60 | }); 61 | }); 62 | group.bench_function("unicode-id-start", |b| { 63 | b.iter(|| { 64 | for ch in string.chars() { 65 | black_box(unicode_id_start::is_id_start(ch)); 66 | black_box(unicode_id_start::is_id_continue(ch)); 67 | } 68 | }); 69 | }); 70 | group.bench_function("unicode-id", |b| { 71 | b.iter(|| { 72 | for ch in string.chars() { 73 | black_box(unicode_id::UnicodeID::is_id_start(ch)); 74 | black_box(unicode_id::UnicodeID::is_id_continue(ch)); 75 | } 76 | }); 77 | }); 78 | group.bench_function("ucd-trie", |b| { 79 | b.iter(|| { 80 | for ch in string.chars() { 81 | black_box(trie::ID_START.contains_char(ch)); 82 | black_box(trie::ID_CONTINUE.contains_char(ch)); 83 | } 84 | }); 85 | }); 86 | group.bench_function("fst", |b| { 87 | let id_start_fst = fst::id_start_fst(); 88 | let id_continue_fst = fst::id_continue_fst(); 89 | b.iter(|| { 90 | for ch in string.chars() { 91 | let ch_bytes = (ch as u32).to_be_bytes(); 92 | black_box(id_start_fst.contains(ch_bytes)); 93 | black_box(id_continue_fst.contains(ch_bytes)); 94 | } 95 | }); 96 | }); 97 | group.bench_function("roaring", |b| { 98 | let id_start_bitmap = roaring::id_start_bitmap(); 99 | let id_continue_bitmap = roaring::id_continue_bitmap(); 100 | b.iter(|| { 101 | for ch in string.chars() { 102 | black_box(id_start_bitmap.contains(ch as u32)); 103 | black_box(id_continue_bitmap.contains(ch as u32)); 104 | } 105 | }); 106 | }); 107 | group.finish(); 108 | } 109 | 110 | fn bench0(c: &mut Criterion) { 111 | bench(c, "0%-nonascii", gen_string(0)); 112 | } 113 | 114 | fn bench1(c: &mut Criterion) { 115 | bench(c, "1%-nonascii", gen_string(1)); 116 | } 117 | 118 | fn bench10(c: &mut Criterion) { 119 | bench(c, "10%-nonascii", gen_string(10)); 120 | } 121 | 122 | fn bench100(c: &mut Criterion) { 123 | bench(c, "100%-nonascii", gen_string(100)); 124 | } 125 | 126 | criterion_group!(benches, bench0, bench1, bench10, bench100); 127 | criterion_main!(benches); 128 | -------------------------------------------------------------------------------- /diagram/.gitignore: -------------------------------------------------------------------------------- 1 | *.png 2 | -------------------------------------------------------------------------------- /diagram/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "unicode-ident-diagram" 3 | version = "0.0.0" 4 | authors = ["David Tolnay "] 5 | edition = "2018" 6 | publish = false 7 | 8 | [dependencies] 9 | image = "0.25.0" 10 | unicode-id-start = { path = ".." } 11 | -------------------------------------------------------------------------------- /diagram/src/main.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::type_complexity, clippy::uninlined_format_args)] 2 | 3 | use image::{ImageBuffer, Rgb}; 4 | use std::process; 5 | 6 | fn main() { 7 | let width = 512; 8 | let height = 400; 9 | let diagrams: [(&str, fn(char) -> bool); 2] = [ 10 | ("id_start.png", unicode_id_start::is_id_start), 11 | ("id_continue.png", unicode_id_start::is_id_continue), 12 | ]; 13 | for (name, f) in diagrams { 14 | let mut imgbuf = ImageBuffer::new(width, height); 15 | for (col, row, pixel) in imgbuf.enumerate_pixels_mut() { 16 | *pixel = if char::from_u32(row * width + col).map_or(false, f) { 17 | Rgb([0u8, 0, 0]) 18 | } else { 19 | Rgb([255, 255, 255]) 20 | }; 21 | } 22 | if let Err(err) = imgbuf.save(name) { 23 | eprintln!("Error: {}", err); 24 | process::exit(1); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /generate/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "unicode-ident-generate" 3 | version = "0.0.0" 4 | authors = ["David Tolnay "] 5 | edition = "2018" 6 | publish = false 7 | -------------------------------------------------------------------------------- /generate/src/main.rs: -------------------------------------------------------------------------------- 1 | #![allow( 2 | clippy::cast_lossless, 3 | clippy::cast_possible_truncation, // https://github.com/rust-lang/rust-clippy/issues/9613 4 | clippy::let_underscore_untyped, 5 | clippy::match_wild_err_arm, 6 | clippy::module_name_repetitions, 7 | clippy::too_many_lines, 8 | clippy::uninlined_format_args 9 | )] 10 | 11 | mod output; 12 | mod parse; 13 | mod write; 14 | 15 | use crate::parse::parse_id_properties; 16 | use std::collections::{BTreeMap as Map, VecDeque}; 17 | use std::convert::TryFrom; 18 | use std::fs; 19 | use std::io::{self, Write}; 20 | use std::path::Path; 21 | use std::process; 22 | 23 | const CHUNK: usize = 64; 24 | const UCD: &str = "UCD"; 25 | const TABLES: &str = "src/tables.rs"; 26 | 27 | fn main() { 28 | let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); 29 | let unicode_ident_dir = manifest_dir.parent().unwrap(); 30 | let ucd_dir = unicode_ident_dir.join(UCD); 31 | let properties = parse_id_properties(&ucd_dir); 32 | 33 | let mut chunkmap = Map::<[u8; CHUNK], u8>::new(); 34 | let mut dense = Vec::<[u8; CHUNK]>::new(); 35 | let mut new_chunk = |chunk| { 36 | if let Some(prev) = chunkmap.get(&chunk) { 37 | *prev 38 | } else { 39 | dense.push(chunk); 40 | let Ok(new) = u8::try_from(chunkmap.len()) else { 41 | panic!("exceeded 256 unique chunks"); 42 | }; 43 | chunkmap.insert(chunk, new); 44 | new 45 | } 46 | }; 47 | 48 | let empty_chunk = [0u8; CHUNK]; 49 | new_chunk(empty_chunk); 50 | 51 | let mut index_start = Vec::::new(); 52 | let mut index_continue = Vec::::new(); 53 | for i in 0..(u32::from(char::MAX) + 1) / CHUNK as u32 / 8 { 54 | let mut start_bits = empty_chunk; 55 | let mut continue_bits = empty_chunk; 56 | for j in 0..CHUNK as u32 { 57 | let this_start = &mut start_bits[j as usize]; 58 | let this_continue = &mut continue_bits[j as usize]; 59 | for k in 0..8u32 { 60 | let code = (i * CHUNK as u32 + j) * 8 + k; 61 | if code >= 0x80 { 62 | if let Some(ch) = char::from_u32(code) { 63 | *this_start |= (properties.is_id_start(ch) as u8) << k; 64 | *this_continue |= (properties.is_id_continue(ch) as u8) << k; 65 | } 66 | } 67 | } 68 | } 69 | index_start.push(new_chunk(start_bits)); 70 | index_continue.push(new_chunk(continue_bits)); 71 | } 72 | 73 | while let Some(0) = index_start.last() { 74 | index_start.pop(); 75 | } 76 | while let Some(0) = index_continue.last() { 77 | index_continue.pop(); 78 | } 79 | 80 | let mut halfchunkmap = Map::new(); 81 | for chunk in &dense { 82 | let mut front = [0u8; CHUNK / 2]; 83 | let mut back = [0u8; CHUNK / 2]; 84 | front.copy_from_slice(&chunk[..CHUNK / 2]); 85 | back.copy_from_slice(&chunk[CHUNK / 2..]); 86 | halfchunkmap 87 | .entry(front) 88 | .or_insert_with(VecDeque::new) 89 | .push_back(back); 90 | } 91 | 92 | let mut halfdense = Vec::::new(); 93 | let mut dense_to_halfdense = Map::::new(); 94 | for chunk in &dense { 95 | let original_pos = chunkmap[chunk]; 96 | if dense_to_halfdense.contains_key(&original_pos) { 97 | continue; 98 | } 99 | let mut front = [0u8; CHUNK / 2]; 100 | let mut back = [0u8; CHUNK / 2]; 101 | front.copy_from_slice(&chunk[..CHUNK / 2]); 102 | back.copy_from_slice(&chunk[CHUNK / 2..]); 103 | dense_to_halfdense.insert( 104 | original_pos, 105 | match u8::try_from(halfdense.len() / (CHUNK / 2)) { 106 | Ok(byte) => byte, 107 | Err(_) => panic!("exceeded 256 half-chunks"), 108 | }, 109 | ); 110 | halfdense.extend_from_slice(&front); 111 | halfdense.extend_from_slice(&back); 112 | while let Some(next) = halfchunkmap.get_mut(&back).and_then(VecDeque::pop_front) { 113 | let mut concat = empty_chunk; 114 | concat[..CHUNK / 2].copy_from_slice(&back); 115 | concat[CHUNK / 2..].copy_from_slice(&next); 116 | let original_pos = chunkmap[&concat]; 117 | if dense_to_halfdense.contains_key(&original_pos) { 118 | continue; 119 | } 120 | dense_to_halfdense.insert( 121 | original_pos, 122 | match u8::try_from(halfdense.len() / (CHUNK / 2) - 1) { 123 | Ok(byte) => byte, 124 | Err(_) => panic!("exceeded 256 half-chunks"), 125 | }, 126 | ); 127 | halfdense.extend_from_slice(&next); 128 | back = next; 129 | } 130 | } 131 | 132 | for index in &mut index_start { 133 | *index = dense_to_halfdense[index]; 134 | } 135 | for index in &mut index_continue { 136 | *index = dense_to_halfdense[index]; 137 | } 138 | 139 | let out = write::output(&properties, &index_start, &index_continue, &halfdense); 140 | let path = unicode_ident_dir.join(TABLES); 141 | if let Err(err) = fs::write(&path, out) { 142 | let _ = writeln!(io::stderr(), "{}: {err}", path.display()); 143 | process::exit(1); 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /generate/src/output.rs: -------------------------------------------------------------------------------- 1 | use std::fmt; 2 | 3 | pub struct Output(String); 4 | 5 | impl Output { 6 | pub fn new() -> Self { 7 | Output(String::new()) 8 | } 9 | 10 | pub fn write_fmt(&mut self, arguments: fmt::Arguments) { 11 | fmt::Write::write_fmt(&mut self.0, arguments).unwrap(); 12 | } 13 | } 14 | 15 | impl AsRef<[u8]> for Output { 16 | fn as_ref(&self) -> &[u8] { 17 | self.0.as_bytes() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /generate/src/parse.rs: -------------------------------------------------------------------------------- 1 | use std::collections::BTreeSet as Set; 2 | use std::fs; 3 | use std::io::{self, Write}; 4 | use std::path::Path; 5 | use std::process; 6 | 7 | pub struct Properties { 8 | id_start: Set, 9 | id_continue: Set, 10 | } 11 | 12 | impl Properties { 13 | pub fn is_id_start(&self, ch: char) -> bool { 14 | self.id_start.contains(&(ch as u32)) 15 | } 16 | 17 | pub fn is_id_continue(&self, ch: char) -> bool { 18 | self.id_continue.contains(&(ch as u32)) 19 | } 20 | } 21 | 22 | pub fn parse_id_properties(ucd_dir: &Path) -> Properties { 23 | let mut properties = Properties { 24 | id_start: Set::new(), 25 | id_continue: Set::new(), 26 | }; 27 | 28 | let filename = "DerivedCoreProperties.txt"; 29 | let path = ucd_dir.join(filename); 30 | let contents = fs::read_to_string(path).unwrap_or_else(|err| { 31 | let suggestion = 32 | "Download from https://www.unicode.org/Public/zipped/l5.0.0/UCD.zip and unzip."; 33 | let _ = writeln!(io::stderr(), "{}: {err}\n{suggestion}", ucd_dir.display()); 34 | process::exit(1); 35 | }); 36 | 37 | for (i, line) in contents.lines().enumerate() { 38 | if line.starts_with('#') || line.trim().is_empty() { 39 | continue; 40 | } 41 | let (lo, hi, name) = parse_line(line).unwrap_or_else(|| { 42 | let _ = writeln!(io::stderr(), "{filename} line {i} is unexpected:\n{line}"); 43 | process::exit(1); 44 | }); 45 | let set = match name { 46 | "ID_Start" => &mut properties.id_start, 47 | "ID_Continue" => &mut properties.id_continue, 48 | _ => continue, 49 | }; 50 | set.extend(lo..=hi); 51 | } 52 | 53 | properties 54 | } 55 | 56 | fn parse_line(line: &str) -> Option<(u32, u32, &str)> { 57 | let (mut codepoint, rest) = line.split_once(';')?; 58 | 59 | let (lo, hi); 60 | codepoint = codepoint.trim(); 61 | if let Some((a, b)) = codepoint.split_once("..") { 62 | lo = parse_codepoint(a)?; 63 | hi = parse_codepoint(b)?; 64 | } else { 65 | lo = parse_codepoint(codepoint)?; 66 | hi = lo; 67 | } 68 | 69 | let name = rest.trim().split('#').next()?.trim_end(); 70 | Some((lo, hi, name)) 71 | } 72 | 73 | fn parse_codepoint(s: &str) -> Option { 74 | u32::from_str_radix(s, 16).ok() 75 | } 76 | -------------------------------------------------------------------------------- /generate/src/write.rs: -------------------------------------------------------------------------------- 1 | use crate::output::Output; 2 | use crate::parse::Properties; 3 | use crate::CHUNK; 4 | 5 | const HEAD: &str = "\ 6 | const T: bool = true; 7 | const F: bool = false; 8 | 9 | #[repr(C, align(8))] 10 | pub(crate) struct Align8(pub(crate) T); 11 | #[repr(C, align(64))] 12 | pub(crate) struct Align64(pub(crate) T); 13 | "; 14 | 15 | pub fn output( 16 | properties: &Properties, 17 | index_start: &[u8], 18 | index_continue: &[u8], 19 | halfdense: &[u8], 20 | ) -> Output { 21 | let mut out = Output::new(); 22 | writeln!(out, "{}", HEAD); 23 | 24 | writeln!( 25 | out, 26 | "pub(crate) static ASCII_START: Align64<[bool; 128]> = Align64([", 27 | ); 28 | for i in 0u8..4 { 29 | write!(out, " "); 30 | for j in 0..32 { 31 | let ch = (i * 32 + j) as char; 32 | let is_id_start = properties.is_id_start(ch); 33 | write!(out, " {},", if is_id_start { 'T' } else { 'F' }); 34 | } 35 | writeln!(out); 36 | } 37 | writeln!(out, "]);"); 38 | writeln!(out); 39 | 40 | writeln!( 41 | out, 42 | "pub(crate) static ASCII_CONTINUE: Align64<[bool; 128]> = Align64([", 43 | ); 44 | for i in 0u8..4 { 45 | write!(out, " "); 46 | for j in 0..32 { 47 | let ch = (i * 32 + j) as char; 48 | let is_id_continue = properties.is_id_continue(ch); 49 | write!(out, " {},", if is_id_continue { 'T' } else { 'F' }); 50 | } 51 | writeln!(out); 52 | } 53 | writeln!(out, "]);"); 54 | writeln!(out); 55 | 56 | writeln!(out, "pub(crate) const CHUNK: usize = {};", CHUNK); 57 | writeln!(out); 58 | 59 | writeln!( 60 | out, 61 | "pub(crate) static TRIE_START: Align8<[u8; {}]> = Align8([", 62 | index_start.len(), 63 | ); 64 | for line in index_start.chunks(16) { 65 | write!(out, " "); 66 | for byte in line { 67 | write!(out, " 0x{:02X},", byte); 68 | } 69 | writeln!(out); 70 | } 71 | writeln!(out, "]);"); 72 | writeln!(out); 73 | 74 | writeln!( 75 | out, 76 | "pub(crate) static TRIE_CONTINUE: Align8<[u8; {}]> = Align8([", 77 | index_continue.len(), 78 | ); 79 | for line in index_continue.chunks(16) { 80 | write!(out, " "); 81 | for byte in line { 82 | write!(out, " 0x{:02X},", byte); 83 | } 84 | writeln!(out); 85 | } 86 | writeln!(out, "]);"); 87 | writeln!(out); 88 | 89 | writeln!( 90 | out, 91 | "pub(crate) static LEAF: Align64<[u8; {}]> = Align64([", 92 | halfdense.len(), 93 | ); 94 | for line in halfdense.chunks(16) { 95 | write!(out, " "); 96 | for byte in line { 97 | write!(out, " 0x{:02X},", byte); 98 | } 99 | writeln!(out); 100 | } 101 | writeln!(out, "]);"); 102 | 103 | out 104 | } 105 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "stable" 3 | profile = "default" 4 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | //! [![github]](https://github.com/Boshen/unicode-id-start) [![crates-io]](https://crates.io/crates/unicode-id-start) [![docs-rs]](https://docs.rs/unicode-id-start) 2 | //! 3 | //! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github 4 | //! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust 5 | //! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs 6 | //! 7 | //!
8 | //! 9 | //! Implementation of [Unicode Standard Annex #31][tr31] for determining which 10 | //! `char` values are valid in programming language identifiers. 11 | //! 12 | //! [tr31]: https://www.unicode.org/reports/tr31/ 13 | //! 14 | //! This crate is a better optimized implementation of the older `unicode-id` 15 | //! crate. This crate uses less static storage, and is able to classify both 16 | //! ASCII and non-ASCII codepoints with better performance, 2–10× 17 | //! faster than `unicode-id`. 18 | //! 19 | //!
20 | //! 21 | //! ## Comparison of performance 22 | //! 23 | //! The following table shows a comparison between five Unicode identifier 24 | //! implementations. 25 | //! 26 | //! - `unicode-id-start` is this crate, which is a fork of `unicode-ident`; 27 | //! - [`unicode-xid`] is a widely used crate run by the "unicode-rs" org; [`unicode-id`] is a fork of `unicode-xid`; 28 | //! - `ucd-trie` and `fst` are two data structures supported by the 29 | //! [`ucd-generate`] tool; 30 | //! - [`roaring`] is a Rust implementation of Roaring bitmap. 31 | //! 32 | //! The *static storage* column shows the total size of `static` tables that the 33 | //! crate bakes into your binary, measured in 1000s of bytes. 34 | //! 35 | //! The remaining columns show the **cost per call** to evaluate whether a 36 | //! single `char` has the ID\_Start or ID\_Continue Unicode property, 37 | //! comparing across different ratios of ASCII to non-ASCII codepoints in the 38 | //! input data. 39 | //! 40 | //! [`unicode-ident`]: https://github.com/dtolnay/unicode-ident 41 | //! [`unicode-xid`]: https://github.com/unicode-rs/unicode-xid 42 | //! [`unicode-id`]: https://github.com/Boshen/unicode-id 43 | //! [`ucd-generate`]: https://github.com/BurntSushi/ucd-generate 44 | //! [`roaring`]: https://github.com/RoaringBitmap/roaring-rs 45 | //! 46 | //! | | static storage | 0% nonascii | 1% | 10% | 100% nonascii | 47 | //! |---|---|---|---|---|---| 48 | //! | **`unicode-id-start`** | 9.68 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns | 49 | //! | **`unicode-id`** | 11.23 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns | 50 | //! | **`ucd-trie`** | 9.93 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns | 51 | //! | **`fst`** | 131 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns | 52 | //! | **`roaring`** | 66.1 K | 2.78 ns | 3.09 ns | 3.37 ns | 4.70 ns | 53 | //! | **`roaring`** | 66.1 K | 2.78 ns | 3.09 ns | 3.37 ns | 4.70 ns | 54 | //! 55 | //! Source code for the benchmark is provided in the *bench* directory of this 56 | //! repo and may be repeated by running `cargo criterion`. 57 | //! 58 | //!
59 | //! 60 | //! ## Comparison of data structures 61 | //! 62 | //! #### unicode-id 63 | //! 64 | //! They use a sorted array of character ranges, and do a binary search to look 65 | //! up whether a given character lands inside one of those ranges. 66 | //! 67 | //! ```rust 68 | //! # const _: &str = stringify! { 69 | //! static ID_Continue_table: [(char, char); 763] = [ 70 | //! ('\u{30}', '\u{39}'), // 0-9 71 | //! ('\u{41}', '\u{5a}'), // A-Z 72 | //! # " 73 | //! … 74 | //! # " 75 | //! ('\u{e0100}', '\u{e01ef}'), 76 | //! ]; 77 | //! # }; 78 | //! ``` 79 | //! 80 | //! The static storage used by this data structure scales with the number of 81 | //! contiguous ranges of identifier codepoints in Unicode. Every table entry 82 | //! consumes 8 bytes, because it consists of a pair of 32-bit `char` values. 83 | //! 84 | //! In some ranges of the Unicode codepoint space, this is quite a sparse 85 | //! representation – there are some ranges where tens of thousands of 86 | //! adjacent codepoints are all valid identifier characters. In other places, 87 | //! the representation is quite inefficient. A characater like `µ` (U+00B5) 88 | //! which is surrounded by non-identifier codepoints consumes 64 bits in the 89 | //! table, while it would be just 1 bit in a dense bitmap. 90 | //! 91 | //! On a system with 64-byte cache lines, binary searching the table touches 7 92 | //! cache lines on average. Each cache line fits only 8 table entries. 93 | //! Additionally, the branching performed during the binary search is probably 94 | //! mostly unpredictable to the branch predictor. 95 | //! 96 | //! Overall, the crate ends up being about 10× slower on non-ASCII input 97 | //! compared to the fastest crate. 98 | //! 99 | //! A potential improvement would be to pack the table entries more compactly. 100 | //! Rust's `char` type is a 21-bit integer padded to 32 bits, which means every 101 | //! table entry is holding 22 bits of wasted space, adding up to 3.9 K. They 102 | //! could instead fit every table entry into 6 bytes, leaving out some of the 103 | //! padding, for a 25% improvement in space used. With some cleverness it may be 104 | //! possible to fit in 5 bytes or even 4 bytes by storing a low char and an 105 | //! extent, instead of low char and high char. I don't expect that performance 106 | //! would improve much but this could be the most efficient for space across all 107 | //! the libraries, needing only about 7 K to store. 108 | //! 109 | //! #### ucd-trie 110 | //! 111 | //! Their data structure is a compressed trie set specifically tailored for 112 | //! Unicode codepoints. The design is credited to Raph Levien in 113 | //! [rust-lang/rust#33098]. 114 | //! 115 | //! [rust-lang/rust#33098]: https://github.com/rust-lang/rust/pull/33098 116 | //! 117 | //! ```rust 118 | //! pub struct TrieSet { 119 | //! tree1_level1: &'static [u64; 32], 120 | //! tree2_level1: &'static [u8; 992], 121 | //! tree2_level2: &'static [u64], 122 | //! tree3_level1: &'static [u8; 256], 123 | //! tree3_level2: &'static [u8], 124 | //! tree3_level3: &'static [u64], 125 | //! } 126 | //! ``` 127 | //! 128 | //! It represents codepoint sets using a trie to achieve prefix compression. The 129 | //! final states of the trie are embedded in leaves or "chunks", where each 130 | //! chunk is a 64-bit integer. Each bit position of the integer corresponds to 131 | //! whether a particular codepoint is in the set or not. These chunks are not 132 | //! just a compact representation of the final states of the trie, but are also 133 | //! a form of suffix compression. In particular, if multiple ranges of 64 134 | //! contiguous codepoints have the same Unicode properties, then they all map to 135 | //! the same chunk in the final level of the trie. 136 | //! 137 | //! Being tailored for Unicode codepoints, this trie is partitioned into three 138 | //! disjoint sets: tree1, tree2, tree3. The first set corresponds to codepoints 139 | //! \[0, 0x800), the second \[0x800, 0x10000) and the third \[0x10000, 140 | //! 0x110000). These partitions conveniently correspond to the space of 1 or 2 141 | //! byte UTF-8 encoded codepoints, 3 byte UTF-8 encoded codepoints and 4 byte 142 | //! UTF-8 encoded codepoints, respectively. 143 | //! 144 | //! Lookups in this data structure are significantly more efficient than binary 145 | //! search. A lookup touches either 1, 2, or 3 cache lines based on which of the 146 | //! trie partitions is being accessed. 147 | //! 148 | //! One possible performance improvement would be for this crate to expose a way 149 | //! to query based on a UTF-8 encoded string, returning the Unicode property 150 | //! corresponding to the first character in the string. Without such an API, the 151 | //! caller is required to tokenize their UTF-8 encoded input data into `char`, 152 | //! hand the `char` into `ucd-trie`, only for `ucd-trie` to undo that work by 153 | //! converting back into the variable-length representation for trie traversal. 154 | //! 155 | //! #### fst 156 | //! 157 | //! Uses a [finite state transducer][fst]. This representation is built into 158 | //! [ucd-generate] but I am not aware of any advantage over the `ucd-trie` 159 | //! representation. In particular `ucd-trie` is optimized for storing Unicode 160 | //! properties while `fst` is not. 161 | //! 162 | //! [fst]: https://github.com/BurntSushi/fst 163 | //! [ucd-generate]: https://github.com/BurntSushi/ucd-generate 164 | //! 165 | //! As far as I can tell, the main thing that causes `fst` to have large size 166 | //! and slow lookups for this use case relative to `ucd-trie` is that it does 167 | //! not specialize for the fact that only 21 of the 32 bits in a `char` are 168 | //! meaningful. There are some dense arrays in the structure with large ranges 169 | //! that could never possibly be used. 170 | //! 171 | //! #### roaring 172 | //! 173 | //! This crate is a pure-Rust implementation of [Roaring Bitmap], a data 174 | //! structure designed for storing sets of 32-bit unsigned integers. 175 | //! 176 | //! [Roaring Bitmap]: https://roaringbitmap.org/about/ 177 | //! 178 | //! Roaring bitmaps are compressed bitmaps which tend to outperform conventional 179 | //! compressed bitmaps such as WAH, EWAH or Concise. In some instances, they can 180 | //! be hundreds of times faster and they often offer significantly better 181 | //! compression. 182 | //! 183 | //! In this use case the performance was reasonably competitive but still 184 | //! substantially slower than the Unicode-optimized crates. Meanwhile the 185 | //! compression was significantly worse, requiring 6× as much storage for 186 | //! the data structure. 187 | //! 188 | //! I also benchmarked the [`croaring`] crate which is an FFI wrapper around the 189 | //! C reference implementation of Roaring Bitmap. This crate was consistently 190 | //! about 15% slower than pure-Rust `roaring`, which could just be FFI overhead. 191 | //! I did not investigate further. 192 | //! 193 | //! [`croaring`]: https://crates.io/crates/croaring 194 | //! 195 | //! #### unicode-ident 196 | //! 197 | //! This crate is most similar to the `ucd-trie` library, in that it's based on 198 | //! bitmaps stored in the leafs of a trie representation, achieving both prefix 199 | //! compression and suffix compression. 200 | //! 201 | //! The key differences are: 202 | //! 203 | //! - Uses a single 2-level trie, rather than 3 disjoint partitions of different 204 | //! depth each. 205 | //! - Uses significantly larger chunks: 512 bits rather than 64 bits. 206 | //! - Compresses the ID\_Start and ID\_Continue properties together 207 | //! simultaneously, rather than duplicating identical trie leaf chunks across 208 | //! the two. 209 | //! 210 | //! The following diagram show the ID\_Start and ID\_Continue Unicode boolean 211 | //! properties in uncompressed form, in row-major order: 212 | //! 213 | //! 214 | //! 215 | //! 216 | //! 217 | //! 218 | //! 219 | //!
ID_StartID_Continue
ID_Start bitmapID_Continue bitmap
220 | //! 221 | //! Uncompressed, these would take 140 K to store, which is beyond what would be 222 | //! reasonable. However, as you can see there is a large degree of similarity 223 | //! between the two bitmaps and across the rows, which lends well to 224 | //! compression. 225 | //! 226 | //! This crate stores one 512-bit "row" of the above bitmaps in the leaf level 227 | //! of a trie, and a single additional level to index into the leafs. It turns 228 | //! out there are 124 unique 512-bit chunks across the two bitmaps so 7 bits are 229 | //! sufficient to index them. 230 | //! 231 | //! The chunk size of 512 bits is selected as the size that minimizes the total 232 | //! size of the data structure. A smaller chunk, like 256 or 128 bits, would 233 | //! achieve better deduplication but require a larger index. A larger chunk 234 | //! would increase redundancy in the leaf bitmaps. 512 bit chunks are the 235 | //! optimum for total size of the index plus leaf bitmaps. 236 | //! 237 | //! In fact since there are only 124 unique chunks, we can use an 8-bit index 238 | //! with a spare bit to index at the half-chunk level. This achieves an 239 | //! additional 8.5% compression by eliminating redundancies between the second 240 | //! half of any chunk and the first half of any other chunk. Note that this is 241 | //! not the same as using chunks which are half the size, because it does not 242 | //! necessitate raising the size of the trie's first level. 243 | //! 244 | //! In contrast to binary search or the `ucd-trie` crate, performing lookups in 245 | //! this data structure is straight-line code with no need for branching. 246 | 247 | #![no_std] 248 | #![doc(html_root_url = "https://docs.rs/unicode-id-start/1.1.0")] 249 | #![allow(clippy::doc_markdown, clippy::must_use_candidate)] 250 | 251 | #[rustfmt::skip] 252 | mod tables; 253 | 254 | use crate::tables::{ASCII_CONTINUE, ASCII_START, CHUNK, LEAF, TRIE_CONTINUE, TRIE_START}; 255 | 256 | /// Check ascii and unicode for id_start 257 | #[inline] 258 | pub fn is_id_start(ch: char) -> bool { 259 | if ch.is_ascii() { 260 | return ASCII_START.0[ch as usize]; 261 | } 262 | is_id_start_unicode(ch) 263 | } 264 | 265 | /// Check unicode only for id_start 266 | #[inline] 267 | pub fn is_id_start_unicode(ch: char) -> bool { 268 | let chunk = *TRIE_START.0.get(ch as usize / 8 / CHUNK).unwrap_or(&0); 269 | let offset = chunk as usize * CHUNK / 2 + ch as usize / 8 % CHUNK; 270 | unsafe { LEAF.0.get_unchecked(offset) }.wrapping_shr(ch as u32 % 8) & 1 != 0 271 | } 272 | 273 | /// Check ascii and unicode for id_continue 274 | #[inline] 275 | pub fn is_id_continue(ch: char) -> bool { 276 | if ch.is_ascii() { 277 | return ASCII_CONTINUE.0[ch as usize]; 278 | } 279 | is_id_continue_unicode(ch) 280 | } 281 | 282 | /// Check and unicode only for id_continue 283 | #[inline] 284 | pub fn is_id_continue_unicode(ch: char) -> bool { 285 | let chunk = *TRIE_CONTINUE.0.get(ch as usize / 8 / CHUNK).unwrap_or(&0); 286 | let offset = chunk as usize * CHUNK / 2 + ch as usize / 8 % CHUNK; 287 | unsafe { LEAF.0.get_unchecked(offset) }.wrapping_shr(ch as u32 % 8) & 1 != 0 288 | } 289 | -------------------------------------------------------------------------------- /src/tables.rs: -------------------------------------------------------------------------------- 1 | const T: bool = true; 2 | const F: bool = false; 3 | 4 | #[repr(C, align(8))] 5 | pub(crate) struct Align8(pub(crate) T); 6 | #[repr(C, align(64))] 7 | pub(crate) struct Align64(pub(crate) T); 8 | 9 | pub(crate) static ASCII_START: Align64<[bool; 128]> = Align64([ 10 | F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, 11 | F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, 12 | F, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, F, F, F, F, 13 | F, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, F, F, F, F, 14 | ]); 15 | 16 | pub(crate) static ASCII_CONTINUE: Align64<[bool; 128]> = Align64([ 17 | F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, 18 | F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, T, T, T, T, T, T, T, T, T, F, F, F, F, F, F, 19 | F, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, F, F, F, T, 20 | F, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, F, F, F, F, 21 | ]); 22 | 23 | pub(crate) const CHUNK: usize = 64; 24 | 25 | pub(crate) static TRIE_START: Align8<[u8; 402]> = Align8([ 26 | 0x04, 0x0B, 0x0F, 0x13, 0x17, 0x1B, 0x1F, 0x23, 0x27, 0x2D, 0x31, 0x34, 0x38, 0x3C, 0x40, 0x02, 27 | 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 28 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 29 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 30 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 31 | 0x05, 0x05, 0x51, 0x54, 0x58, 0x5C, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 32 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x60, 0x28, 0x64, 34 | 0x68, 0x6C, 0x70, 0x2B, 0x74, 0x76, 0x7A, 0x7E, 0x82, 0x86, 0x8A, 0x8E, 0x92, 0x96, 0x9A, 0x9E, 35 | 0x05, 0x32, 0xA2, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x05, 0x05, 0xA6, 0x05, 0x05, 0x05, 0x05, 0x05, 36 | 0x05, 0x43, 0x05, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 37 | 0xAD, 0x00, 0x00, 0x00, 0x05, 0xB1, 0xB5, 0xB9, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 38 | 0x05, 0x05, 0x05, 0x52, 0x05, 0x05, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xA7, 0xC1, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xD2, 0x00, 0x00, 0x00, 0xC8, 41 | 0xD9, 0xDD, 0xE1, 0xCB, 0xE5, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 43 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 44 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 45 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 46 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 47 | 0x05, 0x05, 0x05, 0xEB, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xAA, 0xEE, 0x05, 0x05, 0x05, 48 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xF1, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 49 | 0x05, 0x05, 0x05, 0x05, 0x05, 0xEC, 0x05, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x05, 0xAE, 0x00, 0x00, 50 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xEF, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 51 | 0x05, 0xF2, 52 | ]); 53 | 54 | pub(crate) static TRIE_CONTINUE: Align8<[u8; 1793]> = Align8([ 55 | 0x08, 0x0D, 0x11, 0x15, 0x19, 0x1D, 0x21, 0x25, 0x2A, 0x2F, 0x31, 0x36, 0x3A, 0x3E, 0x42, 0x02, 56 | 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x4F, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 57 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 58 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 59 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 60 | 0x05, 0x05, 0x51, 0x56, 0x5A, 0x5E, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 61 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 62 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62, 0x28, 0x66, 63 | 0x6A, 0x6E, 0x72, 0x2B, 0x74, 0x78, 0x7C, 0x80, 0x84, 0x88, 0x8C, 0x90, 0x94, 0x98, 0x9C, 0xA0, 64 | 0x05, 0x32, 0xA2, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x05, 0x05, 0xA9, 0x05, 0x05, 0x05, 0x05, 0x05, 65 | 0x05, 0x43, 0x05, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 66 | 0xAF, 0x00, 0x00, 0x00, 0x05, 0xB3, 0xB7, 0xBB, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 67 | 0x05, 0x05, 0x05, 0x52, 0x05, 0x05, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xA7, 0xC1, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x00, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0xC2, 0xC5, 0xCD, 0xD0, 0xD4, 0x00, 0xD6, 0x00, 0xC8, 70 | 0xDB, 0xDF, 0xE3, 0xCB, 0xE7, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 71 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 72 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 73 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 74 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 75 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 76 | 0x05, 0x05, 0x05, 0xEB, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xAA, 0xEE, 0x05, 0x05, 0x05, 77 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xF1, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 78 | 0x05, 0x05, 0x05, 0x05, 0x05, 0xEC, 0x05, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x05, 0xAE, 0x00, 0x00, 79 | 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xEF, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 80 | 0x05, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 91 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 92 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 93 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 94 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 95 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 96 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 97 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 98 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 99 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 103 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 104 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 105 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 106 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 107 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 108 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 109 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 110 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 111 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 112 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 113 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 114 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 115 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 116 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 118 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 119 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 120 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 121 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 122 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 123 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 124 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 125 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 127 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 128 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 129 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 130 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 132 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 134 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 136 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 137 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 138 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 140 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 141 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 142 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 143 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 144 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 145 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 146 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 147 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 148 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 149 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 150 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 151 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 156 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 157 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 158 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 159 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 160 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 162 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 163 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 165 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 166 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 167 | 0xD7, 168 | ]); 169 | 170 | pub(crate) static LEAF: Align64<[u8; 7872]> = Align64([ 171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 175 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 176 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 177 | 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xAA, 0xFF, 0xFF, 0xFF, 0x3F, 178 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x5F, 0xDC, 0x1F, 0xCF, 0x0F, 0xFF, 0x1F, 0xDC, 0x1F, 179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 181 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 182 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 183 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 184 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 185 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 186 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xA0, 0x04, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 189 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 190 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 191 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 192 | 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x7F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 193 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 194 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0x03, 0x00, 0x1F, 0x50, 0x00, 0x00, 195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xBC, 196 | 0x40, 0xD7, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 197 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 198 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0x03, 0x00, 0x1F, 0x50, 0x00, 0x00, 199 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xBC, 200 | 0xC0, 0xD7, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 201 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 202 | 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 203 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 204 | 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x87, 0x07, 0x00, 205 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 206 | 0xFB, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 207 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 208 | 0xFF, 0x01, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xB6, 0x00, 0xFF, 0xFF, 0xFF, 0x87, 0x07, 0x00, 209 | 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 210 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x00, 0x60, 0xC0, 0x00, 0x9C, 211 | 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 212 | 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x02, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0x30, 0x04, 213 | 0x00, 0x00, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 214 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x9F, 0xFF, 0xFD, 0xFF, 0x9F, 215 | 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 216 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x24, 217 | 0xFF, 0xFF, 0x3F, 0x04, 0x10, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x07, 0xFF, 0xFF, 218 | 0xFF, 0x7E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 219 | 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x23, 0x00, 0x00, 0x01, 0xFF, 0x03, 0x00, 0xFE, 0xFF, 220 | 0xE1, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xC5, 0x23, 0x00, 0x40, 0x00, 0xB0, 0x03, 0x00, 0x03, 0x10, 221 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x07, 0xFF, 0xFF, 222 | 0xFF, 0x7E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 223 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xFF, 224 | 0xEF, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xC5, 0xF3, 0x9F, 0x79, 0x80, 0xB0, 0xCF, 0xFF, 0x03, 0x50, 225 | 0xE0, 0x87, 0xF9, 0xFF, 0xFF, 0xFD, 0x6D, 0x03, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x1C, 0x00, 226 | 0xE0, 0xBF, 0xFB, 0xFF, 0xFF, 0xFD, 0xED, 0x23, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x02, 227 | 0xE0, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xED, 0x23, 0x00, 0x00, 0x00, 0xB0, 0x03, 0x00, 0x02, 0x00, 228 | 0xE8, 0xC7, 0x3D, 0xD6, 0x18, 0xC7, 0xFF, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 229 | 0xEE, 0x87, 0xF9, 0xFF, 0xFF, 0xFD, 0x6D, 0xD3, 0x87, 0x39, 0x02, 0x5E, 0xC0, 0xFF, 0x3F, 0x00, 230 | 0xEE, 0xBF, 0xFB, 0xFF, 0xFF, 0xFD, 0xED, 0xF3, 0xBF, 0x3B, 0x01, 0x00, 0xCF, 0xFF, 0x00, 0xFE, 231 | 0xEE, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xED, 0xF3, 0x9F, 0x39, 0xE0, 0xB0, 0xCF, 0xFF, 0x02, 0x00, 232 | 0xEC, 0xC7, 0x3D, 0xD6, 0x18, 0xC7, 0xFF, 0xC3, 0xC7, 0x3D, 0x81, 0x00, 0xC0, 0xFF, 0x00, 0x00, 233 | 0xE0, 0xDF, 0xFD, 0xFF, 0xFF, 0xFD, 0xFF, 0x23, 0x00, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, 0x00, 234 | 0xE1, 0xDF, 0xFD, 0xFF, 0xFF, 0xFD, 0xEF, 0x23, 0x00, 0x00, 0x00, 0x60, 0x03, 0x00, 0x06, 0x00, 235 | 0xF0, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0x27, 0x00, 0x40, 0x70, 0x80, 0x03, 0x00, 0x00, 0xFC, 236 | 0xE0, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0xFB, 0x2F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 237 | 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFD, 0xFF, 0xF3, 0xDF, 0x3D, 0x60, 0x27, 0xCF, 0xFF, 0x00, 0x00, 238 | 0xEF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFD, 0xEF, 0xF3, 0xDF, 0x3D, 0x60, 0x60, 0xCF, 0xFF, 0x0E, 0x00, 239 | 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x7D, 0xF0, 0x80, 0xCF, 0xFF, 0x00, 0xFC, 240 | 0xEE, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0xFB, 0x2F, 0x7F, 0x84, 0x5F, 0xFF, 0xC0, 0xFF, 0x0C, 0x00, 241 | 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 242 | 0xD6, 0xF7, 0xFF, 0xFF, 0xAF, 0xFF, 0x0D, 0x20, 0x5F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 243 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 244 | 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 245 | 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x7F, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 246 | 0xD6, 0xF7, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0x3F, 0x5F, 0x7F, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 247 | 0x01, 0x00, 0x00, 0x03, 0xFF, 0x03, 0xA0, 0xC2, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0xFE, 0xFF, 248 | 0xDF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 249 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0x00, 0x00, 0x3F, 0x3C, 0x62, 0xC0, 0xE1, 0xFF, 250 | 0x03, 0x40, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 251 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 252 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 253 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 254 | 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 255 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 256 | 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 257 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 258 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 259 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0x00, 0x00, 260 | 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 261 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3D, 0x7F, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 262 | 0xFF, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0x3D, 0x7F, 0x3D, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 263 | 0xFF, 0xFF, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 264 | 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 265 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3D, 0x7F, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 266 | 0xFF, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0x3D, 0x7F, 0x3D, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 267 | 0xFF, 0xFF, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x00, 0xFE, 0x03, 0x00, 268 | 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 269 | 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 270 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 271 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 272 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 273 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 274 | 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 275 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 276 | 0xFE, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0x01, 277 | 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0xFF, 0xDF, 0x01, 0x00, 278 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 279 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 280 | 0xFE, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0x01, 281 | 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xDF, 0x0D, 0x00, 282 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0xFF, 0x03, 0x00, 0x00, 283 | 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 284 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 285 | 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x00, 286 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 287 | 0x00, 0xB8, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 288 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 289 | 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x0F, 0xFF, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x00, 290 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 291 | 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 292 | 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 293 | 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 294 | 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 295 | 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x9F, 296 | 0xFF, 0x03, 0xFF, 0x03, 0x80, 0x00, 0xFF, 0xBF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 297 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x03, 0x00, 0xF8, 0x0F, 0x00, 298 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 299 | 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 300 | 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x6F, 0x04, 301 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 302 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 303 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 304 | 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 305 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 306 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 307 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 308 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 309 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 310 | 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 311 | 0x84, 0xFC, 0x2F, 0x3F, 0x50, 0xFD, 0xFF, 0xF3, 0xE0, 0x43, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 312 | 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 313 | 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x80, 314 | 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0xE2, 0xFF, 0x01, 0x00, 315 | 0x84, 0xFC, 0x2F, 0x3F, 0x50, 0xFD, 0xFF, 0xF3, 0xE0, 0x43, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 316 | 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 317 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 318 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x78, 0x0C, 0x00, 319 | 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 320 | 0xFF, 0xFF, 0x7F, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 321 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 322 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xF8, 0x0F, 0x00, 323 | 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x80, 324 | 0xFF, 0xFF, 0x7F, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 325 | 0xE0, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x3E, 0x1F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 326 | 0xFF, 0xFF, 0x7F, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 327 | 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 328 | 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 329 | 0xE0, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3E, 0x1F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 330 | 0xFF, 0xFF, 0x7F, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 331 | 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 332 | 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 333 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 334 | 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 335 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 336 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 337 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 338 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 339 | 0xFF, 0x1F, 0xFF, 0xFF, 0x00, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x80, 340 | 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 341 | 0x00, 0x00, 0x80, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 342 | 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xEB, 0x1F, 0x00, 0x00, 0xFC, 0xFF, 343 | 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xBF, 344 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 345 | 0x00, 0x00, 0x80, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 346 | 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xEB, 0x1F, 0x00, 0x00, 0xFC, 0xFF, 347 | 0xBB, 0xF7, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 348 | 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x68, 349 | 0x00, 0xFC, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x1F, 350 | 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0xDF, 0xFF, 0x00, 0x7C, 351 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 352 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xE8, 353 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0x1F, 354 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x7F, 355 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF7, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0xC4, 356 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x3E, 0x05, 0x00, 0x00, 0x38, 0xFF, 0x07, 0x1C, 0x00, 357 | 0x7E, 0x7E, 0x7E, 0x00, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x03, 0xFF, 0xFF, 358 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 359 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0x3F, 0xFF, 0x03, 0xFF, 0xFF, 0x7F, 0xFC, 360 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x38, 0xFF, 0xFF, 0x7C, 0x00, 361 | 0x7E, 0x7E, 0x7E, 0x00, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x03, 0xFF, 0xFF, 362 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0x03, 363 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 364 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 365 | 0x7F, 0x00, 0xF8, 0xA0, 0xFF, 0xFD, 0x7F, 0x5F, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 366 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 367 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 368 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 369 | 0x7F, 0x00, 0xF8, 0xE0, 0xFF, 0xFD, 0x7F, 0x5F, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 370 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 372 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 373 | 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 374 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFC, 0xFC, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, 375 | 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 376 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 377 | 0x00, 0x00, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x87, 0xFE, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 378 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFC, 0xFC, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, 379 | 0xFF, 0xEF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xB7, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 380 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 383 | 0xFF, 0xEF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xB7, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 384 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 388 | 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 389 | 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 390 | 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 392 | 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 393 | 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 394 | 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 395 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 396 | 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 397 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xF7, 398 | 0xFF, 0xF7, 0xB7, 0xFF, 0xFB, 0xFF, 0xFB, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 399 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 400 | 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 401 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xF7, 402 | 0xFF, 0xF7, 0xB7, 0xFF, 0xFB, 0xFF, 0xFB, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 403 | 0x3F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x91, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 404 | 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x37, 0x00, 405 | 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 406 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 407 | 0x01, 0x00, 0xEF, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x1F, 408 | 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 409 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x07, 0x00, 410 | 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 411 | 0x6F, 0xF0, 0xEF, 0xFE, 0xFF, 0xFF, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x1F, 412 | 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 413 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x07, 0x00, 414 | 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 415 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 416 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 417 | 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 418 | 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 419 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 420 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 421 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xBE, 0xFF, 0xFF, 422 | 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 423 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 424 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 425 | 0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 426 | 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 427 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 428 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0x03, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 429 | 0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 430 | 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 431 | 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 432 | 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 433 | 0xF8, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x90, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x47, 0x00, 434 | 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 435 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x80, 436 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x04, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x03, 437 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x00, 438 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xDE, 0xFF, 0x17, 0x00, 0x00, 0x00, 0x00, 439 | 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 440 | 0x7F, 0xBD, 0xFF, 0xBF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 441 | 0xE0, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xED, 0x23, 0x00, 0x00, 0x01, 0xE0, 0x03, 0x00, 0x00, 0x00, 442 | 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 443 | 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 444 | 0x7F, 0xBD, 0xFF, 0xBF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x03, 445 | 0xEF, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xED, 0xFB, 0x9F, 0x39, 0x81, 0xE0, 0xCF, 0x1F, 0x1F, 0x00, 446 | 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xA5, 0xF7, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00, 447 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 448 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 449 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 450 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 451 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xC3, 0x03, 0x00, 0x00, 0x00, 452 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 453 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 454 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x01, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 455 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 456 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 457 | 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 458 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 459 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 460 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 461 | 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0x0F, 0xFF, 0x03, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 462 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 463 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 464 | 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x80, 465 | 0x7F, 0xF2, 0x6F, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 466 | 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 467 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 468 | 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x80, 469 | 0x7F, 0xF2, 0x6F, 0xFF, 0xFF, 0xFF, 0xBF, 0xF9, 0x0F, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 470 | 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1B, 0x00, 0x00, 0x00, 471 | 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x04, 0x00, 0x00, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 472 | 0xFF, 0x03, 0x00, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 473 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 474 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 475 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 476 | 0xFF, 0xFF, 0xFF, 0x23, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 477 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 478 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0x03, 479 | 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 480 | 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 481 | 0x7F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0xBF, 0xFD, 0xFF, 0xFF, 482 | 0xFF, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 483 | 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x01, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0xFF, 484 | 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 485 | 0x7F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xB4, 0xFF, 0x00, 0xFF, 0x03, 0xBF, 0xFD, 0xFF, 0xFF, 486 | 0xFF, 0x7F, 0xFB, 0x01, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 487 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 488 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 489 | 0xF4, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 490 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 491 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 492 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 493 | 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x07, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 494 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 495 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 496 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 497 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 498 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 499 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 500 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 501 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 502 | 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 503 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 504 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 505 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 506 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 507 | 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x27, 0x00, 0xF0, 0x00, 0xFF, 0xFF, 508 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 509 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 510 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 511 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 512 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 513 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 514 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 515 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 516 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 517 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 518 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 519 | 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 520 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 521 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 522 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 523 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 524 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 525 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 526 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 527 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xE0, 528 | 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 529 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0xFF, 530 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x00, 531 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x0F, 0x00, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0xE0, 532 | 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 533 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 534 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 535 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 536 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 537 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 538 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 539 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x03, 540 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 541 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 542 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 543 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 544 | 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 545 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 546 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 547 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 548 | 0xFF, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x03, 0x00, 549 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 550 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x80, 551 | 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 552 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 553 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 554 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 555 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 556 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x6F, 557 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 558 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 559 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 560 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 561 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 562 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 563 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x1F, 564 | 0xFF, 0x01, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 565 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 566 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 567 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE3, 0x07, 0xF8, 568 | 0xE7, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 569 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x1F, 570 | 0xFF, 0x01, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 571 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 572 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 573 | 0xFF, 0xFF, 0xFF, 0x7F, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 574 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 575 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 576 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 577 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 578 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 579 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 580 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x6F, 0xFF, 0x7F, 581 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 582 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 583 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 584 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 585 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 586 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 587 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 588 | 0xFF, 0xFF, 0xFF, 0xDF, 0x64, 0xDE, 0xFF, 0xEB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 589 | 0xBF, 0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0x7B, 0x5F, 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 590 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 591 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 592 | 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xF7, 593 | 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 594 | 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF7, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 595 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 596 | 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xF7, 597 | 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 598 | 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF7, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 599 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x20, 0x00, 600 | 0x10, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 601 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 602 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 603 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 604 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 605 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 606 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 607 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0x3F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 608 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 609 | 0x7F, 0xFF, 0xFF, 0xF9, 0xDB, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 610 | 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 611 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 612 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 613 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 614 | 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 615 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 616 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 617 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 618 | 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 619 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 620 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 621 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 622 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 623 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 624 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x01, 0x00, 625 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 626 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 627 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 628 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 629 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 630 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 631 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 632 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 633 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 634 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 635 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 636 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 637 | 0xEF, 0xFF, 0xFF, 0xFF, 0x96, 0xFE, 0xF7, 0x0A, 0x84, 0xEA, 0x96, 0xAA, 0x96, 0xF7, 0xF7, 0x5E, 638 | 0xFF, 0xFB, 0xFF, 0x0F, 0xEE, 0xFB, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 639 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 640 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 641 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 642 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 643 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 644 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 645 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 646 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF, 647 | 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 648 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 649 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 650 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 651 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 652 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 653 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 654 | 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 655 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 656 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 657 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 658 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 659 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 660 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 661 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 662 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 663 | ]); 664 | -------------------------------------------------------------------------------- /tests/compare.rs: -------------------------------------------------------------------------------- 1 | #![allow( 2 | clippy::incompatible_msrv, // https://github.com/rust-lang/rust-clippy/issues/12257 3 | )] 4 | 5 | mod fst; 6 | mod roaring; 7 | mod trie; 8 | 9 | #[test] 10 | fn compare_all_implementations() { 11 | let id_start_fst = fst::id_start_fst(); 12 | let id_continue_fst = fst::id_continue_fst(); 13 | let id_start_roaring = roaring::id_start_bitmap(); 14 | let id_continue_roaring = roaring::id_continue_bitmap(); 15 | 16 | for ch in '\0'..=char::MAX { 17 | let thought_to_be_start = unicode_id_start::is_id_start(ch); 18 | let thought_to_be_continue = unicode_id_start::is_id_continue(ch); 19 | 20 | // unicode-id 21 | assert_eq!( 22 | thought_to_be_start, 23 | unicode_id::UnicodeID::is_id_start(ch), 24 | "{ch:?}", 25 | ); 26 | assert_eq!( 27 | thought_to_be_continue, 28 | unicode_id::UnicodeID::is_id_continue(ch), 29 | "{ch:?}", 30 | ); 31 | 32 | // ucd-trie 33 | assert_eq!( 34 | thought_to_be_start, 35 | trie::ID_START.contains_char(ch), 36 | "{ch:?}", 37 | ); 38 | assert_eq!( 39 | thought_to_be_continue, 40 | trie::ID_CONTINUE.contains_char(ch), 41 | "{ch:?}", 42 | ); 43 | 44 | // fst 45 | assert_eq!( 46 | thought_to_be_start, 47 | id_start_fst.contains((ch as u32).to_be_bytes()), 48 | "{ch:?}", 49 | ); 50 | assert_eq!( 51 | thought_to_be_continue, 52 | id_continue_fst.contains((ch as u32).to_be_bytes()), 53 | "{ch:?}", 54 | ); 55 | 56 | // roaring 57 | assert_eq!( 58 | thought_to_be_start, 59 | id_start_roaring.contains(ch as u32), 60 | "{ch:?}", 61 | ); 62 | assert_eq!( 63 | thought_to_be_continue, 64 | id_continue_roaring.contains(ch as u32), 65 | "{ch:?}", 66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /tests/crate/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /Cargo.lock 3 | -------------------------------------------------------------------------------- /tests/crate/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "unicode-ident-test" 3 | version = "0.0.0" 4 | authors = ["David Tolnay "] 5 | edition = "2018" 6 | publish = false 7 | 8 | [lib] 9 | path = "test.rs" 10 | 11 | [dependencies] 12 | unicode-id-start = { path = "../.." } 13 | 14 | [workspace] 15 | -------------------------------------------------------------------------------- /tests/crate/test.rs: -------------------------------------------------------------------------------- 1 | #![no_std] 2 | 3 | pub use unicode_id_start::*; 4 | -------------------------------------------------------------------------------- /tests/fst/.gitignore: -------------------------------------------------------------------------------- 1 | prop_list.rs 2 | -------------------------------------------------------------------------------- /tests/fst/id_continue.fst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oxc-project/unicode-id-start/b43e0c58bfc0bea0268baa67235705c0c9fb39ae/tests/fst/id_continue.fst -------------------------------------------------------------------------------- /tests/fst/id_start.fst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oxc-project/unicode-id-start/b43e0c58bfc0bea0268baa67235705c0c9fb39ae/tests/fst/id_start.fst -------------------------------------------------------------------------------- /tests/fst/mod.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::module_name_repetitions)] 2 | 3 | pub fn id_start_fst() -> fst::Set<&'static [u8]> { 4 | let data = include_bytes!("id_start.fst"); 5 | fst::Set::from(fst::raw::Fst::new(data.as_slice()).unwrap()) 6 | } 7 | 8 | pub fn id_continue_fst() -> fst::Set<&'static [u8]> { 9 | let data = include_bytes!("id_continue.fst"); 10 | fst::Set::from(fst::raw::Fst::new(data.as_slice()).unwrap()) 11 | } 12 | -------------------------------------------------------------------------------- /tests/roaring/mod.rs: -------------------------------------------------------------------------------- 1 | use roaring::RoaringBitmap; 2 | 3 | pub fn id_start_bitmap() -> RoaringBitmap { 4 | let mut bitmap = RoaringBitmap::new(); 5 | for ch in '\0'..=char::MAX { 6 | if unicode_id_start::is_id_start(ch) { 7 | bitmap.insert(ch as u32); 8 | } 9 | } 10 | bitmap 11 | } 12 | 13 | pub fn id_continue_bitmap() -> RoaringBitmap { 14 | let mut bitmap = RoaringBitmap::new(); 15 | for ch in '\0'..=char::MAX { 16 | if unicode_id_start::is_id_continue(ch) { 17 | bitmap.insert(ch as u32); 18 | } 19 | } 20 | bitmap 21 | } 22 | -------------------------------------------------------------------------------- /tests/static_size.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::let_underscore_untyped, clippy::unreadable_literal)] 2 | 3 | use std::mem::size_of_val; 4 | 5 | #[test] 6 | fn test_size() { 7 | #[allow(dead_code)] 8 | #[path = "../src/tables.rs"] 9 | mod tables; 10 | 11 | let size = size_of_val(&tables::ASCII_START) 12 | + size_of_val(&tables::ASCII_CONTINUE) 13 | + size_of_val(&tables::TRIE_START) 14 | + size_of_val(&tables::TRIE_CONTINUE) 15 | + size_of_val(&tables::LEAF); 16 | assert_eq!(10336, size); 17 | } 18 | 19 | #[test] 20 | fn test_id_size() { 21 | #[deny(dead_code)] 22 | #[path = "tables/mod.rs"] 23 | mod tables; 24 | 25 | let size = size_of_val(tables::ID_START) + size_of_val(tables::ID_CONTINUE); 26 | assert_eq!(11760, size); 27 | 28 | let _ = tables::BY_NAME; 29 | } 30 | 31 | #[cfg(target_pointer_width = "64")] 32 | #[test] 33 | fn test_trieset_size() { 34 | #[deny(dead_code)] 35 | #[allow(clippy::redundant_static_lifetimes)] 36 | #[path = "trie/trie.rs"] 37 | mod trie; 38 | 39 | let ucd_trie::TrieSet { 40 | tree1_level1, 41 | tree2_level1, 42 | tree2_level2, 43 | tree3_level1, 44 | tree3_level2, 45 | tree3_level3, 46 | } = *trie::ID_START; 47 | 48 | let start_size = size_of_val(trie::ID_START) 49 | + size_of_val(tree1_level1) 50 | + size_of_val(tree2_level1) 51 | + size_of_val(tree2_level2) 52 | + size_of_val(tree3_level1) 53 | + size_of_val(tree3_level2) 54 | + size_of_val(tree3_level3); 55 | 56 | let ucd_trie::TrieSet { 57 | tree1_level1, 58 | tree2_level1, 59 | tree2_level2, 60 | tree3_level1, 61 | tree3_level2, 62 | tree3_level3, 63 | } = *trie::ID_CONTINUE; 64 | 65 | let continue_size = size_of_val(trie::ID_CONTINUE) 66 | + size_of_val(tree1_level1) 67 | + size_of_val(tree2_level1) 68 | + size_of_val(tree2_level2) 69 | + size_of_val(tree3_level1) 70 | + size_of_val(tree3_level2) 71 | + size_of_val(tree3_level3); 72 | 73 | assert_eq!(10328, start_size + continue_size); 74 | 75 | let _ = trie::BY_NAME; 76 | } 77 | 78 | #[test] 79 | fn test_fst_size() { 80 | let id_start_fst = include_bytes!("fst/id_start.fst"); 81 | let id_continue_fst = include_bytes!("fst/id_continue.fst"); 82 | let size = id_start_fst.len() + id_continue_fst.len(); 83 | assert_eq!(142646, size); 84 | } 85 | 86 | #[test] 87 | fn test_roaring_size() { 88 | #[path = "roaring/mod.rs"] 89 | mod roaring; 90 | 91 | let id_start_bitmap = roaring::id_start_bitmap(); 92 | let id_continue_bitmap = roaring::id_continue_bitmap(); 93 | let size = id_start_bitmap.serialized_size() + id_continue_bitmap.serialized_size(); 94 | assert_eq!(66104, size); 95 | } 96 | -------------------------------------------------------------------------------- /tests/tables/mod.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::module_inception)] 2 | 3 | #[allow(clippy::redundant_static_lifetimes)] 4 | #[rustfmt::skip] 5 | mod tables; 6 | 7 | pub(crate) use self::tables::*; 8 | -------------------------------------------------------------------------------- /tests/tables/tables.rs: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: 2 | // 3 | // ucd-generate property-bool UCD --include ID_Start,ID_Continue 4 | // 5 | // Unicode version: 16.0.0. 6 | // 7 | // ucd-generate 0.3.1 is available on crates.io. 8 | 9 | pub const BY_NAME: &'static [(&'static str, &'static [(u32, u32)])] = &[ 10 | ("ID_Continue", ID_CONTINUE), ("ID_Start", ID_START), 11 | ]; 12 | 13 | pub const ID_CONTINUE: &'static [(u32, u32)] = &[ 14 | (48, 57), (65, 90), (95, 95), (97, 122), (170, 170), (181, 181), (183, 183), 15 | (186, 186), (192, 214), (216, 246), (248, 705), (710, 721), (736, 740), 16 | (748, 748), (750, 750), (768, 884), (886, 887), (890, 893), (895, 895), 17 | (902, 906), (908, 908), (910, 929), (931, 1013), (1015, 1153), (1155, 1159), 18 | (1162, 1327), (1329, 1366), (1369, 1369), (1376, 1416), (1425, 1469), 19 | (1471, 1471), (1473, 1474), (1476, 1477), (1479, 1479), (1488, 1514), 20 | (1519, 1522), (1552, 1562), (1568, 1641), (1646, 1747), (1749, 1756), 21 | (1759, 1768), (1770, 1788), (1791, 1791), (1808, 1866), (1869, 1969), 22 | (1984, 2037), (2042, 2042), (2045, 2045), (2048, 2093), (2112, 2139), 23 | (2144, 2154), (2160, 2183), (2185, 2190), (2199, 2273), (2275, 2403), 24 | (2406, 2415), (2417, 2435), (2437, 2444), (2447, 2448), (2451, 2472), 25 | (2474, 2480), (2482, 2482), (2486, 2489), (2492, 2500), (2503, 2504), 26 | (2507, 2510), (2519, 2519), (2524, 2525), (2527, 2531), (2534, 2545), 27 | (2556, 2556), (2558, 2558), (2561, 2563), (2565, 2570), (2575, 2576), 28 | (2579, 2600), (2602, 2608), (2610, 2611), (2613, 2614), (2616, 2617), 29 | (2620, 2620), (2622, 2626), (2631, 2632), (2635, 2637), (2641, 2641), 30 | (2649, 2652), (2654, 2654), (2662, 2677), (2689, 2691), (2693, 2701), 31 | (2703, 2705), (2707, 2728), (2730, 2736), (2738, 2739), (2741, 2745), 32 | (2748, 2757), (2759, 2761), (2763, 2765), (2768, 2768), (2784, 2787), 33 | (2790, 2799), (2809, 2815), (2817, 2819), (2821, 2828), (2831, 2832), 34 | (2835, 2856), (2858, 2864), (2866, 2867), (2869, 2873), (2876, 2884), 35 | (2887, 2888), (2891, 2893), (2901, 2903), (2908, 2909), (2911, 2915), 36 | (2918, 2927), (2929, 2929), (2946, 2947), (2949, 2954), (2958, 2960), 37 | (2962, 2965), (2969, 2970), (2972, 2972), (2974, 2975), (2979, 2980), 38 | (2984, 2986), (2990, 3001), (3006, 3010), (3014, 3016), (3018, 3021), 39 | (3024, 3024), (3031, 3031), (3046, 3055), (3072, 3084), (3086, 3088), 40 | (3090, 3112), (3114, 3129), (3132, 3140), (3142, 3144), (3146, 3149), 41 | (3157, 3158), (3160, 3162), (3165, 3165), (3168, 3171), (3174, 3183), 42 | (3200, 3203), (3205, 3212), (3214, 3216), (3218, 3240), (3242, 3251), 43 | (3253, 3257), (3260, 3268), (3270, 3272), (3274, 3277), (3285, 3286), 44 | (3293, 3294), (3296, 3299), (3302, 3311), (3313, 3315), (3328, 3340), 45 | (3342, 3344), (3346, 3396), (3398, 3400), (3402, 3406), (3412, 3415), 46 | (3423, 3427), (3430, 3439), (3450, 3455), (3457, 3459), (3461, 3478), 47 | (3482, 3505), (3507, 3515), (3517, 3517), (3520, 3526), (3530, 3530), 48 | (3535, 3540), (3542, 3542), (3544, 3551), (3558, 3567), (3570, 3571), 49 | (3585, 3642), (3648, 3662), (3664, 3673), (3713, 3714), (3716, 3716), 50 | (3718, 3722), (3724, 3747), (3749, 3749), (3751, 3773), (3776, 3780), 51 | (3782, 3782), (3784, 3790), (3792, 3801), (3804, 3807), (3840, 3840), 52 | (3864, 3865), (3872, 3881), (3893, 3893), (3895, 3895), (3897, 3897), 53 | (3902, 3911), (3913, 3948), (3953, 3972), (3974, 3991), (3993, 4028), 54 | (4038, 4038), (4096, 4169), (4176, 4253), (4256, 4293), (4295, 4295), 55 | (4301, 4301), (4304, 4346), (4348, 4680), (4682, 4685), (4688, 4694), 56 | (4696, 4696), (4698, 4701), (4704, 4744), (4746, 4749), (4752, 4784), 57 | (4786, 4789), (4792, 4798), (4800, 4800), (4802, 4805), (4808, 4822), 58 | (4824, 4880), (4882, 4885), (4888, 4954), (4957, 4959), (4969, 4977), 59 | (4992, 5007), (5024, 5109), (5112, 5117), (5121, 5740), (5743, 5759), 60 | (5761, 5786), (5792, 5866), (5870, 5880), (5888, 5909), (5919, 5940), 61 | (5952, 5971), (5984, 5996), (5998, 6000), (6002, 6003), (6016, 6099), 62 | (6103, 6103), (6108, 6109), (6112, 6121), (6155, 6157), (6159, 6169), 63 | (6176, 6264), (6272, 6314), (6320, 6389), (6400, 6430), (6432, 6443), 64 | (6448, 6459), (6470, 6509), (6512, 6516), (6528, 6571), (6576, 6601), 65 | (6608, 6618), (6656, 6683), (6688, 6750), (6752, 6780), (6783, 6793), 66 | (6800, 6809), (6823, 6823), (6832, 6845), (6847, 6862), (6912, 6988), 67 | (6992, 7001), (7019, 7027), (7040, 7155), (7168, 7223), (7232, 7241), 68 | (7245, 7293), (7296, 7306), (7312, 7354), (7357, 7359), (7376, 7378), 69 | (7380, 7418), (7424, 7957), (7960, 7965), (7968, 8005), (8008, 8013), 70 | (8016, 8023), (8025, 8025), (8027, 8027), (8029, 8029), (8031, 8061), 71 | (8064, 8116), (8118, 8124), (8126, 8126), (8130, 8132), (8134, 8140), 72 | (8144, 8147), (8150, 8155), (8160, 8172), (8178, 8180), (8182, 8188), 73 | (8204, 8205), (8255, 8256), (8276, 8276), (8305, 8305), (8319, 8319), 74 | (8336, 8348), (8400, 8412), (8417, 8417), (8421, 8432), (8450, 8450), 75 | (8455, 8455), (8458, 8467), (8469, 8469), (8472, 8477), (8484, 8484), 76 | (8486, 8486), (8488, 8488), (8490, 8505), (8508, 8511), (8517, 8521), 77 | (8526, 8526), (8544, 8584), (11264, 11492), (11499, 11507), (11520, 11557), 78 | (11559, 11559), (11565, 11565), (11568, 11623), (11631, 11631), 79 | (11647, 11670), (11680, 11686), (11688, 11694), (11696, 11702), 80 | (11704, 11710), (11712, 11718), (11720, 11726), (11728, 11734), 81 | (11736, 11742), (11744, 11775), (12293, 12295), (12321, 12335), 82 | (12337, 12341), (12344, 12348), (12353, 12438), (12441, 12447), 83 | (12449, 12543), (12549, 12591), (12593, 12686), (12704, 12735), 84 | (12784, 12799), (13312, 19903), (19968, 42124), (42192, 42237), 85 | (42240, 42508), (42512, 42539), (42560, 42607), (42612, 42621), 86 | (42623, 42737), (42775, 42783), (42786, 42888), (42891, 42957), 87 | (42960, 42961), (42963, 42963), (42965, 42972), (42994, 43047), 88 | (43052, 43052), (43072, 43123), (43136, 43205), (43216, 43225), 89 | (43232, 43255), (43259, 43259), (43261, 43309), (43312, 43347), 90 | (43360, 43388), (43392, 43456), (43471, 43481), (43488, 43518), 91 | (43520, 43574), (43584, 43597), (43600, 43609), (43616, 43638), 92 | (43642, 43714), (43739, 43741), (43744, 43759), (43762, 43766), 93 | (43777, 43782), (43785, 43790), (43793, 43798), (43808, 43814), 94 | (43816, 43822), (43824, 43866), (43868, 43881), (43888, 44010), 95 | (44012, 44013), (44016, 44025), (44032, 55203), (55216, 55238), 96 | (55243, 55291), (63744, 64109), (64112, 64217), (64256, 64262), 97 | (64275, 64279), (64285, 64296), (64298, 64310), (64312, 64316), 98 | (64318, 64318), (64320, 64321), (64323, 64324), (64326, 64433), 99 | (64467, 64829), (64848, 64911), (64914, 64967), (65008, 65019), 100 | (65024, 65039), (65056, 65071), (65075, 65076), (65101, 65103), 101 | (65136, 65140), (65142, 65276), (65296, 65305), (65313, 65338), 102 | (65343, 65343), (65345, 65370), (65381, 65470), (65474, 65479), 103 | (65482, 65487), (65490, 65495), (65498, 65500), (65536, 65547), 104 | (65549, 65574), (65576, 65594), (65596, 65597), (65599, 65613), 105 | (65616, 65629), (65664, 65786), (65856, 65908), (66045, 66045), 106 | (66176, 66204), (66208, 66256), (66272, 66272), (66304, 66335), 107 | (66349, 66378), (66384, 66426), (66432, 66461), (66464, 66499), 108 | (66504, 66511), (66513, 66517), (66560, 66717), (66720, 66729), 109 | (66736, 66771), (66776, 66811), (66816, 66855), (66864, 66915), 110 | (66928, 66938), (66940, 66954), (66956, 66962), (66964, 66965), 111 | (66967, 66977), (66979, 66993), (66995, 67001), (67003, 67004), 112 | (67008, 67059), (67072, 67382), (67392, 67413), (67424, 67431), 113 | (67456, 67461), (67463, 67504), (67506, 67514), (67584, 67589), 114 | (67592, 67592), (67594, 67637), (67639, 67640), (67644, 67644), 115 | (67647, 67669), (67680, 67702), (67712, 67742), (67808, 67826), 116 | (67828, 67829), (67840, 67861), (67872, 67897), (67968, 68023), 117 | (68030, 68031), (68096, 68099), (68101, 68102), (68108, 68115), 118 | (68117, 68119), (68121, 68149), (68152, 68154), (68159, 68159), 119 | (68192, 68220), (68224, 68252), (68288, 68295), (68297, 68326), 120 | (68352, 68405), (68416, 68437), (68448, 68466), (68480, 68497), 121 | (68608, 68680), (68736, 68786), (68800, 68850), (68864, 68903), 122 | (68912, 68921), (68928, 68965), (68969, 68973), (68975, 68997), 123 | (69248, 69289), (69291, 69292), (69296, 69297), (69314, 69316), 124 | (69372, 69404), (69415, 69415), (69424, 69456), (69488, 69509), 125 | (69552, 69572), (69600, 69622), (69632, 69702), (69734, 69749), 126 | (69759, 69818), (69826, 69826), (69840, 69864), (69872, 69881), 127 | (69888, 69940), (69942, 69951), (69956, 69959), (69968, 70003), 128 | (70006, 70006), (70016, 70084), (70089, 70092), (70094, 70106), 129 | (70108, 70108), (70144, 70161), (70163, 70199), (70206, 70209), 130 | (70272, 70278), (70280, 70280), (70282, 70285), (70287, 70301), 131 | (70303, 70312), (70320, 70378), (70384, 70393), (70400, 70403), 132 | (70405, 70412), (70415, 70416), (70419, 70440), (70442, 70448), 133 | (70450, 70451), (70453, 70457), (70459, 70468), (70471, 70472), 134 | (70475, 70477), (70480, 70480), (70487, 70487), (70493, 70499), 135 | (70502, 70508), (70512, 70516), (70528, 70537), (70539, 70539), 136 | (70542, 70542), (70544, 70581), (70583, 70592), (70594, 70594), 137 | (70597, 70597), (70599, 70602), (70604, 70611), (70625, 70626), 138 | (70656, 70730), (70736, 70745), (70750, 70753), (70784, 70853), 139 | (70855, 70855), (70864, 70873), (71040, 71093), (71096, 71104), 140 | (71128, 71133), (71168, 71232), (71236, 71236), (71248, 71257), 141 | (71296, 71352), (71360, 71369), (71376, 71395), (71424, 71450), 142 | (71453, 71467), (71472, 71481), (71488, 71494), (71680, 71738), 143 | (71840, 71913), (71935, 71942), (71945, 71945), (71948, 71955), 144 | (71957, 71958), (71960, 71989), (71991, 71992), (71995, 72003), 145 | (72016, 72025), (72096, 72103), (72106, 72151), (72154, 72161), 146 | (72163, 72164), (72192, 72254), (72263, 72263), (72272, 72345), 147 | (72349, 72349), (72368, 72440), (72640, 72672), (72688, 72697), 148 | (72704, 72712), (72714, 72758), (72760, 72768), (72784, 72793), 149 | (72818, 72847), (72850, 72871), (72873, 72886), (72960, 72966), 150 | (72968, 72969), (72971, 73014), (73018, 73018), (73020, 73021), 151 | (73023, 73031), (73040, 73049), (73056, 73061), (73063, 73064), 152 | (73066, 73102), (73104, 73105), (73107, 73112), (73120, 73129), 153 | (73440, 73462), (73472, 73488), (73490, 73530), (73534, 73538), 154 | (73552, 73562), (73648, 73648), (73728, 74649), (74752, 74862), 155 | (74880, 75075), (77712, 77808), (77824, 78895), (78912, 78933), 156 | (78944, 82938), (82944, 83526), (90368, 90425), (92160, 92728), 157 | (92736, 92766), (92768, 92777), (92784, 92862), (92864, 92873), 158 | (92880, 92909), (92912, 92916), (92928, 92982), (92992, 92995), 159 | (93008, 93017), (93027, 93047), (93053, 93071), (93504, 93548), 160 | (93552, 93561), (93760, 93823), (93952, 94026), (94031, 94087), 161 | (94095, 94111), (94176, 94177), (94179, 94180), (94192, 94193), 162 | (94208, 100343), (100352, 101589), (101631, 101640), (110576, 110579), 163 | (110581, 110587), (110589, 110590), (110592, 110882), (110898, 110898), 164 | (110928, 110930), (110933, 110933), (110948, 110951), (110960, 111355), 165 | (113664, 113770), (113776, 113788), (113792, 113800), (113808, 113817), 166 | (113821, 113822), (118000, 118009), (118528, 118573), (118576, 118598), 167 | (119141, 119145), (119149, 119154), (119163, 119170), (119173, 119179), 168 | (119210, 119213), (119362, 119364), (119808, 119892), (119894, 119964), 169 | (119966, 119967), (119970, 119970), (119973, 119974), (119977, 119980), 170 | (119982, 119993), (119995, 119995), (119997, 120003), (120005, 120069), 171 | (120071, 120074), (120077, 120084), (120086, 120092), (120094, 120121), 172 | (120123, 120126), (120128, 120132), (120134, 120134), (120138, 120144), 173 | (120146, 120485), (120488, 120512), (120514, 120538), (120540, 120570), 174 | (120572, 120596), (120598, 120628), (120630, 120654), (120656, 120686), 175 | (120688, 120712), (120714, 120744), (120746, 120770), (120772, 120779), 176 | (120782, 120831), (121344, 121398), (121403, 121452), (121461, 121461), 177 | (121476, 121476), (121499, 121503), (121505, 121519), (122624, 122654), 178 | (122661, 122666), (122880, 122886), (122888, 122904), (122907, 122913), 179 | (122915, 122916), (122918, 122922), (122928, 122989), (123023, 123023), 180 | (123136, 123180), (123184, 123197), (123200, 123209), (123214, 123214), 181 | (123536, 123566), (123584, 123641), (124112, 124153), (124368, 124410), 182 | (124896, 124902), (124904, 124907), (124909, 124910), (124912, 124926), 183 | (124928, 125124), (125136, 125142), (125184, 125259), (125264, 125273), 184 | (126464, 126467), (126469, 126495), (126497, 126498), (126500, 126500), 185 | (126503, 126503), (126505, 126514), (126516, 126519), (126521, 126521), 186 | (126523, 126523), (126530, 126530), (126535, 126535), (126537, 126537), 187 | (126539, 126539), (126541, 126543), (126545, 126546), (126548, 126548), 188 | (126551, 126551), (126553, 126553), (126555, 126555), (126557, 126557), 189 | (126559, 126559), (126561, 126562), (126564, 126564), (126567, 126570), 190 | (126572, 126578), (126580, 126583), (126585, 126588), (126590, 126590), 191 | (126592, 126601), (126603, 126619), (126625, 126627), (126629, 126633), 192 | (126635, 126651), (130032, 130041), (131072, 173791), (173824, 177977), 193 | (177984, 178205), (178208, 183969), (183984, 191456), (191472, 192093), 194 | (194560, 195101), (196608, 201546), (201552, 205743), (917760, 917999), 195 | ]; 196 | 197 | pub const ID_START: &'static [(u32, u32)] = &[ 198 | (65, 90), (97, 122), (170, 170), (181, 181), (186, 186), (192, 214), 199 | (216, 246), (248, 705), (710, 721), (736, 740), (748, 748), (750, 750), 200 | (880, 884), (886, 887), (890, 893), (895, 895), (902, 902), (904, 906), 201 | (908, 908), (910, 929), (931, 1013), (1015, 1153), (1162, 1327), 202 | (1329, 1366), (1369, 1369), (1376, 1416), (1488, 1514), (1519, 1522), 203 | (1568, 1610), (1646, 1647), (1649, 1747), (1749, 1749), (1765, 1766), 204 | (1774, 1775), (1786, 1788), (1791, 1791), (1808, 1808), (1810, 1839), 205 | (1869, 1957), (1969, 1969), (1994, 2026), (2036, 2037), (2042, 2042), 206 | (2048, 2069), (2074, 2074), (2084, 2084), (2088, 2088), (2112, 2136), 207 | (2144, 2154), (2160, 2183), (2185, 2190), (2208, 2249), (2308, 2361), 208 | (2365, 2365), (2384, 2384), (2392, 2401), (2417, 2432), (2437, 2444), 209 | (2447, 2448), (2451, 2472), (2474, 2480), (2482, 2482), (2486, 2489), 210 | (2493, 2493), (2510, 2510), (2524, 2525), (2527, 2529), (2544, 2545), 211 | (2556, 2556), (2565, 2570), (2575, 2576), (2579, 2600), (2602, 2608), 212 | (2610, 2611), (2613, 2614), (2616, 2617), (2649, 2652), (2654, 2654), 213 | (2674, 2676), (2693, 2701), (2703, 2705), (2707, 2728), (2730, 2736), 214 | (2738, 2739), (2741, 2745), (2749, 2749), (2768, 2768), (2784, 2785), 215 | (2809, 2809), (2821, 2828), (2831, 2832), (2835, 2856), (2858, 2864), 216 | (2866, 2867), (2869, 2873), (2877, 2877), (2908, 2909), (2911, 2913), 217 | (2929, 2929), (2947, 2947), (2949, 2954), (2958, 2960), (2962, 2965), 218 | (2969, 2970), (2972, 2972), (2974, 2975), (2979, 2980), (2984, 2986), 219 | (2990, 3001), (3024, 3024), (3077, 3084), (3086, 3088), (3090, 3112), 220 | (3114, 3129), (3133, 3133), (3160, 3162), (3165, 3165), (3168, 3169), 221 | (3200, 3200), (3205, 3212), (3214, 3216), (3218, 3240), (3242, 3251), 222 | (3253, 3257), (3261, 3261), (3293, 3294), (3296, 3297), (3313, 3314), 223 | (3332, 3340), (3342, 3344), (3346, 3386), (3389, 3389), (3406, 3406), 224 | (3412, 3414), (3423, 3425), (3450, 3455), (3461, 3478), (3482, 3505), 225 | (3507, 3515), (3517, 3517), (3520, 3526), (3585, 3632), (3634, 3635), 226 | (3648, 3654), (3713, 3714), (3716, 3716), (3718, 3722), (3724, 3747), 227 | (3749, 3749), (3751, 3760), (3762, 3763), (3773, 3773), (3776, 3780), 228 | (3782, 3782), (3804, 3807), (3840, 3840), (3904, 3911), (3913, 3948), 229 | (3976, 3980), (4096, 4138), (4159, 4159), (4176, 4181), (4186, 4189), 230 | (4193, 4193), (4197, 4198), (4206, 4208), (4213, 4225), (4238, 4238), 231 | (4256, 4293), (4295, 4295), (4301, 4301), (4304, 4346), (4348, 4680), 232 | (4682, 4685), (4688, 4694), (4696, 4696), (4698, 4701), (4704, 4744), 233 | (4746, 4749), (4752, 4784), (4786, 4789), (4792, 4798), (4800, 4800), 234 | (4802, 4805), (4808, 4822), (4824, 4880), (4882, 4885), (4888, 4954), 235 | (4992, 5007), (5024, 5109), (5112, 5117), (5121, 5740), (5743, 5759), 236 | (5761, 5786), (5792, 5866), (5870, 5880), (5888, 5905), (5919, 5937), 237 | (5952, 5969), (5984, 5996), (5998, 6000), (6016, 6067), (6103, 6103), 238 | (6108, 6108), (6176, 6264), (6272, 6312), (6314, 6314), (6320, 6389), 239 | (6400, 6430), (6480, 6509), (6512, 6516), (6528, 6571), (6576, 6601), 240 | (6656, 6678), (6688, 6740), (6823, 6823), (6917, 6963), (6981, 6988), 241 | (7043, 7072), (7086, 7087), (7098, 7141), (7168, 7203), (7245, 7247), 242 | (7258, 7293), (7296, 7306), (7312, 7354), (7357, 7359), (7401, 7404), 243 | (7406, 7411), (7413, 7414), (7418, 7418), (7424, 7615), (7680, 7957), 244 | (7960, 7965), (7968, 8005), (8008, 8013), (8016, 8023), (8025, 8025), 245 | (8027, 8027), (8029, 8029), (8031, 8061), (8064, 8116), (8118, 8124), 246 | (8126, 8126), (8130, 8132), (8134, 8140), (8144, 8147), (8150, 8155), 247 | (8160, 8172), (8178, 8180), (8182, 8188), (8305, 8305), (8319, 8319), 248 | (8336, 8348), (8450, 8450), (8455, 8455), (8458, 8467), (8469, 8469), 249 | (8472, 8477), (8484, 8484), (8486, 8486), (8488, 8488), (8490, 8505), 250 | (8508, 8511), (8517, 8521), (8526, 8526), (8544, 8584), (11264, 11492), 251 | (11499, 11502), (11506, 11507), (11520, 11557), (11559, 11559), 252 | (11565, 11565), (11568, 11623), (11631, 11631), (11648, 11670), 253 | (11680, 11686), (11688, 11694), (11696, 11702), (11704, 11710), 254 | (11712, 11718), (11720, 11726), (11728, 11734), (11736, 11742), 255 | (12293, 12295), (12321, 12329), (12337, 12341), (12344, 12348), 256 | (12353, 12438), (12443, 12447), (12449, 12538), (12540, 12543), 257 | (12549, 12591), (12593, 12686), (12704, 12735), (12784, 12799), 258 | (13312, 19903), (19968, 42124), (42192, 42237), (42240, 42508), 259 | (42512, 42527), (42538, 42539), (42560, 42606), (42623, 42653), 260 | (42656, 42735), (42775, 42783), (42786, 42888), (42891, 42957), 261 | (42960, 42961), (42963, 42963), (42965, 42972), (42994, 43009), 262 | (43011, 43013), (43015, 43018), (43020, 43042), (43072, 43123), 263 | (43138, 43187), (43250, 43255), (43259, 43259), (43261, 43262), 264 | (43274, 43301), (43312, 43334), (43360, 43388), (43396, 43442), 265 | (43471, 43471), (43488, 43492), (43494, 43503), (43514, 43518), 266 | (43520, 43560), (43584, 43586), (43588, 43595), (43616, 43638), 267 | (43642, 43642), (43646, 43695), (43697, 43697), (43701, 43702), 268 | (43705, 43709), (43712, 43712), (43714, 43714), (43739, 43741), 269 | (43744, 43754), (43762, 43764), (43777, 43782), (43785, 43790), 270 | (43793, 43798), (43808, 43814), (43816, 43822), (43824, 43866), 271 | (43868, 43881), (43888, 44002), (44032, 55203), (55216, 55238), 272 | (55243, 55291), (63744, 64109), (64112, 64217), (64256, 64262), 273 | (64275, 64279), (64285, 64285), (64287, 64296), (64298, 64310), 274 | (64312, 64316), (64318, 64318), (64320, 64321), (64323, 64324), 275 | (64326, 64433), (64467, 64829), (64848, 64911), (64914, 64967), 276 | (65008, 65019), (65136, 65140), (65142, 65276), (65313, 65338), 277 | (65345, 65370), (65382, 65470), (65474, 65479), (65482, 65487), 278 | (65490, 65495), (65498, 65500), (65536, 65547), (65549, 65574), 279 | (65576, 65594), (65596, 65597), (65599, 65613), (65616, 65629), 280 | (65664, 65786), (65856, 65908), (66176, 66204), (66208, 66256), 281 | (66304, 66335), (66349, 66378), (66384, 66421), (66432, 66461), 282 | (66464, 66499), (66504, 66511), (66513, 66517), (66560, 66717), 283 | (66736, 66771), (66776, 66811), (66816, 66855), (66864, 66915), 284 | (66928, 66938), (66940, 66954), (66956, 66962), (66964, 66965), 285 | (66967, 66977), (66979, 66993), (66995, 67001), (67003, 67004), 286 | (67008, 67059), (67072, 67382), (67392, 67413), (67424, 67431), 287 | (67456, 67461), (67463, 67504), (67506, 67514), (67584, 67589), 288 | (67592, 67592), (67594, 67637), (67639, 67640), (67644, 67644), 289 | (67647, 67669), (67680, 67702), (67712, 67742), (67808, 67826), 290 | (67828, 67829), (67840, 67861), (67872, 67897), (67968, 68023), 291 | (68030, 68031), (68096, 68096), (68112, 68115), (68117, 68119), 292 | (68121, 68149), (68192, 68220), (68224, 68252), (68288, 68295), 293 | (68297, 68324), (68352, 68405), (68416, 68437), (68448, 68466), 294 | (68480, 68497), (68608, 68680), (68736, 68786), (68800, 68850), 295 | (68864, 68899), (68938, 68965), (68975, 68997), (69248, 69289), 296 | (69296, 69297), (69314, 69316), (69376, 69404), (69415, 69415), 297 | (69424, 69445), (69488, 69505), (69552, 69572), (69600, 69622), 298 | (69635, 69687), (69745, 69746), (69749, 69749), (69763, 69807), 299 | (69840, 69864), (69891, 69926), (69956, 69956), (69959, 69959), 300 | (69968, 70002), (70006, 70006), (70019, 70066), (70081, 70084), 301 | (70106, 70106), (70108, 70108), (70144, 70161), (70163, 70187), 302 | (70207, 70208), (70272, 70278), (70280, 70280), (70282, 70285), 303 | (70287, 70301), (70303, 70312), (70320, 70366), (70405, 70412), 304 | (70415, 70416), (70419, 70440), (70442, 70448), (70450, 70451), 305 | (70453, 70457), (70461, 70461), (70480, 70480), (70493, 70497), 306 | (70528, 70537), (70539, 70539), (70542, 70542), (70544, 70581), 307 | (70583, 70583), (70609, 70609), (70611, 70611), (70656, 70708), 308 | (70727, 70730), (70751, 70753), (70784, 70831), (70852, 70853), 309 | (70855, 70855), (71040, 71086), (71128, 71131), (71168, 71215), 310 | (71236, 71236), (71296, 71338), (71352, 71352), (71424, 71450), 311 | (71488, 71494), (71680, 71723), (71840, 71903), (71935, 71942), 312 | (71945, 71945), (71948, 71955), (71957, 71958), (71960, 71983), 313 | (71999, 71999), (72001, 72001), (72096, 72103), (72106, 72144), 314 | (72161, 72161), (72163, 72163), (72192, 72192), (72203, 72242), 315 | (72250, 72250), (72272, 72272), (72284, 72329), (72349, 72349), 316 | (72368, 72440), (72640, 72672), (72704, 72712), (72714, 72750), 317 | (72768, 72768), (72818, 72847), (72960, 72966), (72968, 72969), 318 | (72971, 73008), (73030, 73030), (73056, 73061), (73063, 73064), 319 | (73066, 73097), (73112, 73112), (73440, 73458), (73474, 73474), 320 | (73476, 73488), (73490, 73523), (73648, 73648), (73728, 74649), 321 | (74752, 74862), (74880, 75075), (77712, 77808), (77824, 78895), 322 | (78913, 78918), (78944, 82938), (82944, 83526), (90368, 90397), 323 | (92160, 92728), (92736, 92766), (92784, 92862), (92880, 92909), 324 | (92928, 92975), (92992, 92995), (93027, 93047), (93053, 93071), 325 | (93504, 93548), (93760, 93823), (93952, 94026), (94032, 94032), 326 | (94099, 94111), (94176, 94177), (94179, 94179), (94208, 100343), 327 | (100352, 101589), (101631, 101640), (110576, 110579), (110581, 110587), 328 | (110589, 110590), (110592, 110882), (110898, 110898), (110928, 110930), 329 | (110933, 110933), (110948, 110951), (110960, 111355), (113664, 113770), 330 | (113776, 113788), (113792, 113800), (113808, 113817), (119808, 119892), 331 | (119894, 119964), (119966, 119967), (119970, 119970), (119973, 119974), 332 | (119977, 119980), (119982, 119993), (119995, 119995), (119997, 120003), 333 | (120005, 120069), (120071, 120074), (120077, 120084), (120086, 120092), 334 | (120094, 120121), (120123, 120126), (120128, 120132), (120134, 120134), 335 | (120138, 120144), (120146, 120485), (120488, 120512), (120514, 120538), 336 | (120540, 120570), (120572, 120596), (120598, 120628), (120630, 120654), 337 | (120656, 120686), (120688, 120712), (120714, 120744), (120746, 120770), 338 | (120772, 120779), (122624, 122654), (122661, 122666), (122928, 122989), 339 | (123136, 123180), (123191, 123197), (123214, 123214), (123536, 123565), 340 | (123584, 123627), (124112, 124139), (124368, 124397), (124400, 124400), 341 | (124896, 124902), (124904, 124907), (124909, 124910), (124912, 124926), 342 | (124928, 125124), (125184, 125251), (125259, 125259), (126464, 126467), 343 | (126469, 126495), (126497, 126498), (126500, 126500), (126503, 126503), 344 | (126505, 126514), (126516, 126519), (126521, 126521), (126523, 126523), 345 | (126530, 126530), (126535, 126535), (126537, 126537), (126539, 126539), 346 | (126541, 126543), (126545, 126546), (126548, 126548), (126551, 126551), 347 | (126553, 126553), (126555, 126555), (126557, 126557), (126559, 126559), 348 | (126561, 126562), (126564, 126564), (126567, 126570), (126572, 126578), 349 | (126580, 126583), (126585, 126588), (126590, 126590), (126592, 126601), 350 | (126603, 126619), (126625, 126627), (126629, 126633), (126635, 126651), 351 | (131072, 173791), (173824, 177977), (177984, 178205), (178208, 183969), 352 | (183984, 191456), (191472, 192093), (194560, 195101), (196608, 201546), 353 | (201552, 205743), 354 | ]; 355 | -------------------------------------------------------------------------------- /tests/trie/mod.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::module_inception)] 2 | 3 | #[allow(dead_code, clippy::redundant_static_lifetimes, clippy::unreadable_literal)] 4 | #[rustfmt::skip] 5 | mod trie; 6 | 7 | pub(crate) use self::trie::*; 8 | -------------------------------------------------------------------------------- /tests/trie/trie.rs: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: 2 | // 3 | // ucd-generate property-bool UCD --include ID_Start,ID_Continue --trie-set 4 | // 5 | // Unicode version: 16.0.0. 6 | // 7 | // ucd-generate 0.3.1 is available on crates.io. 8 | 9 | pub const BY_NAME: &'static [(&'static str, &'static ::ucd_trie::TrieSet)] = &[ 10 | ("ID_Continue", ID_CONTINUE), ("ID_Start", ID_START), 11 | ]; 12 | 13 | pub const ID_CONTINUE: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { 14 | tree1_level1: &[ 15 | 0x3FF000000000000, 0x7FFFFFE87FFFFFE, 0x4A0040000000000, 16 | 0xFF7FFFFFFF7FFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 17 | 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 18 | 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x501F0003FFC3, 19 | 0xFFFFFFFFFFFFFFFF, 0xBCDFFFFFFFFFFFFF, 0xFFFFFFFBFFFFD7C0, 20 | 0xFFBFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 21 | 0xFFFFFFFFFFFFFCFB, 0xFFFFFFFFFFFFFFFF, 0xFFFEFFFFFFFFFFFF, 22 | 0xFFFFFFFF027FFFFF, 0xBFFFFFFFFFFE01FF, 0x787FFFFFF00B6, 23 | 0xFFFFFFFF07FF0000, 0xFFFFC3FFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 24 | 0x9FFFFDFF9FEFFFFF, 0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFFE7FF, 25 | 0x3FFFFFFFFFFFF, 0x243FFFFFFFFFFFFF, 26 | ], 27 | tree2_level1: &[ 28 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 29 | 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 4, 32, 33, 34, 4, 4, 4, 4, 4, 30 | 35, 36, 37, 38, 39, 40, 41, 42, 4, 4, 4, 4, 4, 4, 4, 4, 43, 44, 45, 46, 31 | 47, 4, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 4, 61, 4, 62, 32 | 63, 64, 65, 66, 4, 4, 4, 4, 4, 4, 4, 4, 67, 68, 69, 70, 71, 72, 73, 74, 33 | 75, 76, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 34 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 35 | 78, 78, 78, 78, 78, 78, 78, 78, 4, 4, 4, 79, 80, 81, 82, 83, 78, 78, 78, 36 | 78, 78, 78, 78, 78, 84, 42, 85, 4, 86, 4, 87, 88, 78, 78, 78, 78, 78, 78, 37 | 78, 78, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 38 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 39 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 40 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 41 | 4, 4, 4, 4, 4, 4, 78, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 42 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 43 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 44 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 45 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 46 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 47 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 48 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 49 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 50 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 51 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 52 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 53 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 55 | 4, 4, 4, 4, 89, 90, 4, 4, 4, 4, 91, 92, 4, 93, 94, 4, 95, 96, 97, 62, 4, 56 | 98, 99, 100, 4, 101, 102, 103, 4, 104, 105, 106, 4, 107, 4, 4, 4, 4, 4, 4, 57 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 58 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 59 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 60 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 61 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 62 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 63 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 108, 109, 78, 78, 64 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 65 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 66 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 67 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 68 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 69 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 70 | 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 71 | 78, 78, 78, 78, 4, 4, 4, 4, 4, 99, 4, 110, 111, 112, 93, 113, 4, 4, 4, 4, 72 | 114, 115, 116, 117, 118, 119, 4, 120, 121, 122, 123, 124, 73 | ], 74 | tree2_level2: &[ 75 | 0x3FFFFFFFFFFF, 0xFFFF07FF0FFFFFFF, 0xFFFFFFFFFF807EFF, 76 | 0xFFFFFFFBFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFEFFCFFFFFFFFF, 77 | 0xF3C5FDFFFFF99FEF, 0x5003FFCFB080799F, 0xD36DFDFFFFF987EE, 78 | 0x3FFFC05E023987, 0xF3EDFDFFFFFBBFEE, 0xFE00FFCF00013BBF, 79 | 0xF3EDFDFFFFF99FEE, 0x2FFCFB0E0399F, 0xC3FFC718D63DC7EC, 0xFFC000813DC7, 80 | 0xF3FFFDFFFFFDDFFF, 0xFFCF27603DDF, 0xF3EFFDFFFFFDDFEF, 0xEFFCF60603DDF, 81 | 0xFFFFFFFFFFFDDFFF, 0xFC00FFCF80F07DDF, 0x2FFBFFFFFC7FFFEE, 82 | 0xCFFC0FF5F847F, 0x7FFFFFFFFFFFFFE, 0x3FF7FFF, 0x3FFFFFAFFFFFF7D6, 83 | 0xF3FF7F5F, 0xC2A003FF03000001, 0xFFFE1FFFFFFFFEFF, 0x1FFFFFFFFEFFFFDF, 84 | 0x40, 0xFFFFFFFFFFFF03FF, 0xFFFFFFFF3FFFFFFF, 0xF7FFFFFFFFFF20BF, 85 | 0xFFFFFFFF3D7F3DFF, 0x7F3DFFFFFFFF3DFF, 0xFFFFFFFFFF7FFF3D, 86 | 0xFFFFFFFFFF3DFFFF, 0x3FE00E7FFFFFF, 0xFFFFFFFF0000FFFF, 87 | 0x3F3FFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFE, 0xFFFF9FFFFFFFFFFF, 88 | 0xFFFFFFFF07FFFFFE, 0x1FFC7FFFFFFFFFF, 0x1FFFFF803FFFFF, 0xDDFFF000FFFFF, 89 | 0x3FF308FFFFF, 0xFFFFFFFF03FFB800, 0x1FFFFFFFFFFFFFF, 0xFFFF07FFFFFFFFFF, 90 | 0x3FFFFFFFFFFFFF, 0xFFF0FFF7FFFFFFF, 0x1F3FFFFFFFFFC0, 0xFFFF0FFFFFFFFFFF, 91 | 0x7FF03FF, 0xFFFFFFFF0FFFFFFF, 0x9FFFFFFF7FFFFFFF, 0xBFFF008003FF03FF, 92 | 0x7FFF, 0xFF80003FF1FFF, 0xFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFF, 93 | 0x3FFFFFFFFFFFE3FF, 0xE7FFFFFFFFFF07FF, 0x7FFFFFFFFF70000, 94 | 0xFFFFFFFF3F3FFFFF, 0x3FFFFFFFAAFF3F3F, 0x5FDFFFFFFFFFFFFF, 95 | 0x1FDC1FFF0FCF1FDC, 0x8000000000003000, 0x8002000000100001, 0x1FFF0000, 96 | 0x1FFE21FFF0000, 0xF3FFFD503F2FFC84, 0xFFFFFFFF000043E0, 0x1FF, 0, 97 | 0xFF81FFFFFFFFF, 0xFFFF20BFFFFFFFFF, 0x800080FFFFFFFFFF, 98 | 0x7F7F7F7F007FFFFF, 0xFFFFFFFF7F7F7F7F, 0x1F3EFFFE000000E0, 99 | 0xFFFFFFFEFE7FFFFF, 0xFFFEFFFFFFFFFFE0, 0xFFFFFFFF00007FFF, 100 | 0xFFFF000000000000, 0x1FFF, 0x3FFFFFFFFFFF0000, 0xFFFFFFF1FFF, 101 | 0xBFF0FFFFFFFFFFFF, 0x3FFFFFFFFFFFF, 0xFFFFFFFCFF800000, 102 | 0xFFFFFFFFFFFFF9FF, 0xFFFC00001FEB3FFF, 0x10FFFFFFFFFF, 103 | 0xE8FFFFFF03FF003F, 0xFFFF3FFFFFFFFFFF, 0x1FFFFFFF000FFFFF, 104 | 0x7FFFFFFF03FF8001, 0x7FFFFFFFFFFFFF, 0xFC7FFFFF03FF3FFF, 105 | 0x7CFFFF38000007, 0xFFFF7F7F007E7E7E, 0xFFFF03FFF7FFFFFF, 106 | 0x3FF37FFFFFFFFFF, 0xFFFF000FFFFFFFFF, 0xFFFFFFFFFFFF87F, 0x3FFFFFF, 107 | 0x5F7FFDFFE0F8007F, 0xFFFFFFFFFFFFFFDB, 0xFFFFFFFFFFF80000, 108 | 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFCFFFF, 109 | 0xFFF0000000000FF, 0x18FFFF0000FFFF, 0xFFDF00000000E000, 110 | 0x1FFFFFFFFFFFFFFF, 0x87FFFFFE03FF0000, 0xFFFFFFE007FFFFFE, 111 | 0x7FFFFFFFFFFFFFFF, 0x1CFCFCFC, 112 | ], 113 | tree3_level1: &[ 114 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 10, 11, 12, 13, 14, 7, 7, 7, 7, 7, 7, 7, 115 | 7, 7, 7, 15, 16, 17, 7, 18, 19, 7, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 116 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 117 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 118 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 119 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 120 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 121 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 122 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 123 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 124 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 125 | ], 126 | tree3_level2: &[ 127 | 0, 1, 2, 3, 4, 5, 4, 6, 4, 4, 7, 8, 9, 10, 11, 12, 2, 2, 13, 14, 15, 16, 128 | 17, 18, 2, 2, 2, 2, 19, 20, 21, 4, 22, 23, 24, 25, 26, 4, 27, 4, 28, 29, 129 | 30, 31, 32, 33, 34, 4, 2, 35, 36, 36, 37, 38, 39, 4, 4, 4, 40, 41, 42, 43, 130 | 44, 45, 2, 46, 3, 47, 48, 49, 2, 50, 51, 52, 53, 54, 55, 56, 57, 58, 2, 131 | 59, 2, 60, 4, 4, 61, 62, 2, 63, 64, 65, 66, 67, 4, 4, 3, 4, 68, 69, 70, 132 | 71, 72, 73, 74, 75, 76, 64, 4, 4, 4, 77, 78, 79, 80, 4, 81, 82, 83, 4, 4, 133 | 4, 4, 84, 85, 86, 87, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 88, 4, 134 | 2, 89, 2, 2, 2, 90, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 135 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 91, 92, 136 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 93, 94, 2, 2, 2, 2, 2, 2, 137 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 138 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 139 | 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 67, 4, 4, 4, 4, 4, 4, 4, 4, 140 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 141 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 142 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 143 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 95, 144 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 145 | 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 64, 96, 74, 97, 19, 98, 99, 4, 4, 4, 4, 4, 146 | 4, 100, 4, 4, 4, 2, 4, 4, 2, 101, 102, 103, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 147 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 148 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 149 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 150 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 151 | 2, 2, 2, 2, 2, 2, 105, 35, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 152 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 153 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 154 | 4, 4, 4, 4, 4, 4, 4, 4, 106, 2, 2, 2, 2, 107, 108, 2, 2, 2, 2, 2, 109, 4, 155 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 156 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 110, 111, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 157 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 158 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 159 | 4, 4, 4, 4, 112, 4, 4, 4, 4, 4, 4, 4, 4, 113, 67, 4, 4, 4, 4, 4, 4, 4, 160 | 114, 115, 4, 4, 116, 4, 4, 4, 4, 4, 4, 2, 117, 118, 119, 120, 121, 2, 2, 161 | 2, 2, 122, 123, 124, 125, 126, 127, 4, 4, 4, 4, 4, 4, 4, 4, 128, 129, 130, 162 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 131, 4, 4, 4, 132, 133, 163 | 134, 4, 135, 136, 4, 4, 4, 4, 137, 95, 4, 4, 4, 4, 4, 4, 4, 138, 4, 4, 4, 164 | 139, 4, 4, 4, 4, 4, 4, 4, 140, 2, 2, 2, 141, 2, 142, 4, 4, 4, 4, 4, 4, 4, 165 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 143, 144, 145, 4, 4, 4, 4, 4, 4, 4, 4, 4, 166 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 167 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 112, 4, 4, 4, 4, 4, 168 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 169 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 146, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 170 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 171 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 172 | 2, 2, 2, 2, 95, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 173 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 174 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 175 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 176 | 147, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 177 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 178 | 2, 2, 2, 2, 148, 2, 2, 2, 2, 2, 2, 2, 2, 2, 149, 4, 4, 4, 4, 4, 4, 4, 4, 179 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 180 | 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 149, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 181 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 182 | 2, 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 183 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 184 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 93, 4, 4, 4, 4, 4, 4, 185 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 186 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 187 | 93, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 188 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 189 | 4, 4, 4, 4, 4, 4, 4, 4, 190 | ], 191 | tree3_level3: &[ 192 | 0xB7FFFF7FFFFFEFFF, 0x3FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0, 193 | 0x1FFFFFFFFFFFFF, 0x2000000000000000, 0xFFFFFFFF1FFFFFFF, 0x10001FFFF, 194 | 0xFFFFE000FFFFFFFF, 0x7FFFFFFFFFF07FF, 0xFFFFFFFF3FFFFFFF, 0x3EFF0F, 195 | 0xFFFF03FF3FFFFFFF, 0xFFFFFFFFF0FFFFF, 0xFFFF00FFFFFFFFFF, 196 | 0xF7FF000FFFFFFFFF, 0x1BFBFFFBFFB7F7FF, 0xFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFF, 197 | 0xFF003FFFFF, 0x7FDFFFFFFFFFFBF, 0x91BFFFFFFFFFFD3F, 0x7FFFFF003FFFFF, 198 | 0x7FFFFFFF, 0x37FFFF00000000, 0x3FFFFFF003FFFFF, 0xC0FFFFFFFFFFFFFF, 199 | 0x873FFFFFFEEFF06F, 0x1FFFFFFF00000000, 0x1FFFFFFF, 0x7FFFFFFEFF, 200 | 0x3FFFFFFFFFFFFF, 0x7FFFF003FFFFF, 0x3FFFF, 0x1FF, 0x7FFFFFFFFFFFF, 201 | 0x3FF00FFFFFFFFFF, 0xFFFFBE3FFFFFFFFF, 0x3F, 0x31BFFFFFFFFFF, 202 | 0xF00000000000001C, 0xFFFF00801FFFFFFF, 0xFFFF00000001FFFF, 203 | 0xFFFF00000000003F, 0x7FFFFF0000001F, 0x803FFFC00000007F, 204 | 0x3FF01FFFFFF0004, 0xFFDFFFFFFFFFFFFF, 0x4FFFFFFFFF00F0, 0x17FFDE1F, 205 | 0xC0FFFFFFFFFBFFFF, 0x3, 0xFFFF01FFBFFFBD7F, 0x3FF07FFFFFFFFFF, 206 | 0xFBEDFDFFFFF99FEF, 0x1F1FCFE081399F, 0xFFBFFFFFFFFF4BFF, 0x6000FF7A5, 207 | 0x3C3FF07FF, 0x3FF00BF, 0xFF3FFFFFFFFFFFFF, 0x3F000001, 0x3FF0011, 208 | 0x1FFFFFFFFFFFFFF, 0xFFFFF03FF, 0x3FF0FFFE7FFFFFF, 0x7F, 209 | 0xFFFFFFFF00000000, 0x800003FFFFFFFFFF, 0xF9BFFFFFFF6FF27F, 0x3FF000F, 210 | 0xFFFFFCFF00000000, 0x1BFCFFFFFF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0080, 211 | 0xFFFF000023FFFFFF, 0x3FF0001FFFFFFFF, 0xFF7FFFFFFFFFFDFF, 212 | 0xFFFC000003FF0001, 0x7FFEFFFFFCFFFF, 0xB47FFFFFFFFFFB7F, 213 | 0xFFFFFDBF03FF00FF, 0x3FF01FB7FFF, 0x7FFFFF00000000, 0xC7FFFFFFFFFDFFFF, 214 | 0x7FF0007, 0x1000000000000, 0x3FFFFFF, 0x7FFFFFFFFFFF, 0xF, 215 | 0xFFFFFFFFFFFF0000, 0x1FFFFFFFFFFFF, 0xFFFFFFFFFFFF, 0xFFFFFFFF003FFFFF, 216 | 0x3FFFFFFFFFFFFFF, 0xFFFF03FF7FFFFFFF, 0x1F3FFFFFFF03FF, 217 | 0xE0FFFFF803FF000F, 0xFFFF, 0x3FF1FFFFFFFFFFF, 0xFFFFFFFFFFFF87FF, 218 | 0xFFFF80FF, 0x3001B00000000, 0xFFFFFFFFFFFFFF, 0x80000000003FFFFF, 219 | 0x6FEF000000000000, 0x40007FFFFFFFF, 0xFFFF00F000270000, 220 | 0xFFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF, 0x63FF01FF, 0x3FF000000000000, 221 | 0xFFFF3FFFFFFFFFFF, 0xF807E3E000000000, 0x3C0000000FE7, 0x1C, 222 | 0xFFFFFFFFFFDFFFFF, 0xEBFFDE64DFFFFFFF, 0xFFFFFFFFFFFFFFEF, 223 | 0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F, 0xFFFFFF3FFFFFFFFF, 224 | 0xF7FFFFFFF7FFFFFD, 0xFFDFFFFFFFDFFFFF, 0xFFFF7FFFFFFF7FFF, 225 | 0xFFFFFDFFFFFFFDFF, 0xFFFFFFFFFFFFCFF7, 0xF87FFFFFFFFFFFFF, 226 | 0x201FFFFFFFFFFF, 0xFFFEF8000010, 0x7E07FFFFFFF, 0xFFFF07DBF9FFFF7F, 227 | 0x3FFFFFFFFFFF, 0x8000, 0x3FFF1FFFFFFFFFFF, 0x43FF, 0x7FFFFFFF0000, 228 | 0x3FFFFFFFFFF0000, 0x7FFFFFFFFFF0000, 0x7FFF6F7F00000000, 0x7F001F, 229 | 0x3FF0FFF, 0xAF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF, 230 | 0xFFFFFFFF, 0xFFFF0003FFFFFFFF, 0xFFFF0001FFFFFFFF, 0x3FFFFFFF, 231 | 0xFFFFFFFFFFFF07FF, 232 | ], 233 | }; 234 | 235 | pub const ID_START: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { 236 | tree1_level1: &[ 237 | 0, 0x7FFFFFE07FFFFFE, 0x420040000000000, 0xFF7FFFFFFF7FFFFF, 238 | 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 239 | 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 240 | 0xFFFFFFFFFFFFFFFF, 0x501F0003FFC3, 0, 0xBCDF000000000000, 241 | 0xFFFFFFFBFFFFD740, 0xFFBFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 242 | 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFC03, 0xFFFFFFFFFFFFFFFF, 243 | 0xFFFEFFFFFFFFFFFF, 0xFFFFFFFF027FFFFF, 0x1FF, 0x787FFFFFF0000, 244 | 0xFFFFFFFF00000000, 0xFFFEC000000007FF, 0xFFFFFFFFFFFFFFFF, 245 | 0x9C00C060002FFFFF, 0xFFFFFFFD0000, 0xFFFFFFFFFFFFE000, 0x2003FFFFFFFFF, 246 | 0x43007FFFFFFFC00, 247 | ], 248 | tree2_level1: &[ 249 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 250 | 21, 22, 23, 24, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 35, 251 | 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 35, 35, 35, 35, 35, 35, 35, 35, 252 | 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 3, 58, 59, 60, 30, 253 | 61, 62, 63, 64, 65, 66, 67, 68, 35, 35, 35, 30, 35, 35, 35, 35, 69, 70, 254 | 71, 72, 30, 73, 74, 30, 75, 76, 77, 30, 30, 30, 30, 30, 30, 30, 30, 30, 255 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 256 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 35, 35, 35, 78, 257 | 79, 80, 81, 82, 30, 30, 30, 30, 30, 30, 30, 30, 83, 43, 84, 85, 86, 35, 258 | 87, 88, 30, 30, 30, 30, 30, 30, 30, 30, 35, 35, 35, 35, 35, 35, 35, 35, 259 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 260 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 261 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 262 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 263 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 264 | 35, 35, 35, 35, 35, 30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 265 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 266 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 267 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 268 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 269 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 270 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 271 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 272 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 273 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 274 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 275 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 276 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 277 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 278 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 279 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 280 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 281 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 282 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 283 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 89, 90, 35, 35, 35, 35, 91, 92, 284 | 93, 94, 95, 35, 96, 97, 98, 49, 99, 100, 101, 102, 103, 104, 105, 106, 285 | 107, 108, 109, 110, 35, 111, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 286 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 287 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 288 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 289 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 290 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 291 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 292 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 293 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 294 | 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 295 | 35, 112, 113, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 296 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 297 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 298 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 299 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 300 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 301 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 302 | 30, 30, 30, 30, 30, 30, 30, 30, 30, 35, 35, 35, 35, 35, 114, 35, 115, 116, 303 | 117, 118, 119, 35, 35, 35, 35, 120, 121, 122, 123, 30, 124, 35, 125, 126, 304 | 127, 128, 129, 305 | ], 306 | tree2_level2: &[ 307 | 0x110043FFFFF, 0xFFFF07FF01FFFFFF, 0xFFFFFFFF00007EFF, 0x3FF, 308 | 0x23FFFFFFFFFFFFF0, 0xFFFE0003FF010000, 0x23C5FDFFFFF99FE1, 309 | 0x10030003B0004000, 0x36DFDFFFFF987E0, 0x1C00005E000000, 310 | 0x23EDFDFFFFFBBFE0, 0x200000300010000, 0x23EDFDFFFFF99FE0, 311 | 0x20003B0000000, 0x3FFC718D63DC7E8, 0x10000, 0x23FFFDFFFFFDDFE0, 312 | 0x327000000, 0x23EFFDFFFFFDDFE1, 0x6000360000000, 0x27FFFFFFFFFDDFF0, 313 | 0xFC00000380704000, 0x2FFBFFFFFC7FFFE0, 0x7F, 0xDFFFFFFFFFFFE, 314 | 0x200DFFAFFFFFF7D6, 0xF000005F, 0x1, 0x1FFFFFFFFEFF, 0x1F00, 0, 315 | 0x800007FFFFFFFFFF, 0xFFE1C0623C3F0000, 0xFFFFFFFF00004003, 316 | 0xF7FFFFFFFFFF20BF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF3D7F3DFF, 317 | 0x7F3DFFFFFFFF3DFF, 0xFFFFFFFFFF7FFF3D, 0xFFFFFFFFFF3DFFFF, 0x7FFFFFF, 318 | 0xFFFFFFFF0000FFFF, 0x3F3FFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFE, 319 | 0xFFFF9FFFFFFFFFFF, 0xFFFFFFFF07FFFFFE, 0x1FFC7FFFFFFFFFF, 320 | 0x3FFFF8003FFFF, 0x1DFFF0003FFFF, 0xFFFFFFFFFFFFF, 0x10800000, 321 | 0xFFFFFFFF00000000, 0x1FFFFFFFFFFFFFF, 0xFFFF05FFFFFFFFFF, 322 | 0x3FFFFFFFFFFFFF, 0x7FFFFFFF, 0x1F3FFFFFFF0000, 0xFFFF0FFFFFFFFFFF, 323 | 0xFFFFFFFF007FFFFF, 0x1FFFFF, 0x8000000000, 0xFFFFFFFFFFFE0, 0x1FE0, 324 | 0xFC00C001FFFFFFF8, 0x3FFFFFFFFF, 0xFFFFFFFFF, 0x3FFFFFFFFC00E000, 325 | 0xE7FFFFFFFFFF07FF, 0x46FDE0000000000, 0xFFFFFFFF3F3FFFFF, 326 | 0x3FFFFFFFAAFF3F3F, 0x5FDFFFFFFFFFFFFF, 0x1FDC1FFF0FCF1FDC, 327 | 0x8002000000000000, 0x1FFF0000, 0xF3FFFD503F2FFC84, 0xFFFFFFFF000043E0, 328 | 0x1FF, 0xC781FFFFFFFFF, 0xFFFF20BFFFFFFFFF, 0x80FFFFFFFFFF, 329 | 0x7F7F7F7F007FFFFF, 0x7F7F7F7F, 0x1F3E03FE000000E0, 0xFFFFFFFEF87FFFFF, 330 | 0xF7FFFFFFFFFFFFFF, 0xFFFEFFFFFFFFFFE0, 0xFFFFFFFF00007FFF, 331 | 0xFFFF000000000000, 0x1FFF, 0x3FFFFFFFFFFF0000, 0xC00FFFF1FFF, 332 | 0x80007FFFFFFFFFFF, 0xFFFFFFFF3FFFFFFF, 0xFFFFFFFFFFFF, 333 | 0xFFFFFFFCFF800000, 0xFFFFFFFFFFFFF9FF, 0xFFFC00001FEB3FFF, 0x7FFFFF7BB, 334 | 0xFFFFFFFFFFFFC, 0x68FC000000000000, 0xFFFF003FFFFFFC00, 335 | 0x1FFFFFFF0000007F, 0x7FFFFFFFFFFF0, 0x7C00FFDF00008000, 0x1FFFFFFFFFF, 336 | 0xC47FFFFF00000FF7, 0x3E62FFFFFFFFFFFF, 0x1C07FF38000005, 337 | 0xFFFF7F7F007E7E7E, 0xFFFF03FFF7FFFFFF, 0x7FFFFFFFF, 0xFFFF000FFFFFFFFF, 338 | 0xFFFFFFFFFFFF87F, 0xFFFF3FFFFFFFFFFF, 0x3FFFFFF, 0x5F7FFDFFA0F8007F, 339 | 0xFFFFFFFFFFFFFFDB, 0x3FFFFFFFFFFFF, 0xFFFFFFFFFFF80000, 340 | 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFCFFFF, 341 | 0xFFF0000000000FF, 0xFFDF000000000000, 0x1FFFFFFFFFFFFFFF, 342 | 0x7FFFFFE00000000, 0xFFFFFFC007FFFFFE, 0x7FFFFFFFFFFFFFFF, 0x1CFCFCFC, 343 | ], 344 | tree3_level1: &[ 345 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 10, 5, 11, 12, 5, 7, 7, 7, 7, 7, 7, 7, 7, 346 | 7, 7, 13, 14, 15, 7, 16, 17, 7, 18, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 347 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 348 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 349 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 350 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 351 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 352 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 353 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 354 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 355 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 356 | ], 357 | tree3_level2: &[ 358 | 0, 1, 2, 3, 4, 5, 4, 4, 4, 4, 6, 7, 8, 9, 10, 11, 2, 2, 12, 13, 14, 15, 359 | 16, 17, 2, 2, 2, 2, 18, 19, 20, 4, 21, 22, 23, 24, 25, 4, 26, 4, 27, 28, 360 | 29, 30, 31, 32, 33, 4, 2, 34, 35, 35, 36, 37, 38, 4, 4, 4, 39, 40, 41, 42, 361 | 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 23, 56, 57, 58, 59, 5, 362 | 60, 61, 62, 4, 4, 63, 64, 61, 65, 66, 4, 67, 68, 4, 4, 69, 4, 70, 71, 72, 363 | 73, 74, 75, 76, 77, 78, 79, 4, 4, 4, 80, 81, 82, 83, 4, 84, 85, 86, 4, 4, 364 | 4, 4, 87, 88, 4, 89, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 90, 4, 365 | 2, 63, 2, 2, 2, 91, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 366 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 92, 93, 367 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 61, 94, 2, 2, 2, 2, 2, 2, 368 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 369 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 370 | 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 68, 4, 4, 4, 4, 4, 4, 4, 4, 371 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 372 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 373 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 374 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 95, 375 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 376 | 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 79, 96, 97, 98, 61, 99, 83, 4, 4, 4, 4, 4, 377 | 4, 100, 4, 4, 4, 2, 4, 4, 2, 101, 102, 103, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 378 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 379 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 380 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 381 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 382 | 2, 2, 2, 2, 2, 2, 105, 34, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 383 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 384 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 385 | 4, 4, 4, 4, 4, 4, 4, 4, 106, 2, 2, 2, 2, 107, 108, 2, 2, 2, 2, 2, 109, 4, 386 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 387 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 110, 111, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 388 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 112, 113, 114, 389 | 115, 116, 2, 2, 2, 2, 117, 118, 119, 120, 121, 122, 4, 4, 4, 4, 4, 4, 4, 390 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 123, 4, 4, 391 | 4, 124, 125, 4, 4, 126, 127, 4, 4, 4, 4, 98, 69, 4, 4, 4, 4, 4, 4, 4, 128, 392 | 4, 4, 4, 129, 4, 4, 4, 4, 4, 4, 4, 130, 2, 2, 2, 131, 2, 132, 4, 4, 4, 4, 393 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 133, 134, 135, 4, 4, 4, 4, 4, 2, 394 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 395 | 2, 136, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 396 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 397 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 137, 2, 2, 2, 10, 2, 2, 398 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 399 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 400 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 401 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 138, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 402 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 403 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 2, 2, 2, 2, 2, 2, 2, 404 | 2, 2, 95, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 405 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 406 | 95, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 407 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 140, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 408 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 409 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 410 | 2, 2, 2, 2, 61, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 411 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 412 | 4, 4, 4, 4, 4, 413 | ], 414 | tree3_level3: &[ 415 | 0xB7FFFF7FFFFFEFFF, 0x3FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0, 416 | 0x1FFFFFFFFFFFFF, 0xFFFFFFFF1FFFFFFF, 0x1FFFF, 0xFFFFE000FFFFFFFF, 417 | 0x3FFFFFFFFF07FF, 0xFFFFFFFF3FFFFFFF, 0x3EFF0F, 0xFFFF00003FFFFFFF, 418 | 0xFFFFFFFFF0FFFFF, 0xFFFF00FFFFFFFFFF, 0xF7FF000FFFFFFFFF, 419 | 0x1BFBFFFBFFB7F7FF, 0xFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFF, 0xFF003FFFFF, 420 | 0x7FDFFFFFFFFFFBF, 0x91BFFFFFFFFFFD3F, 0x7FFFFF003FFFFF, 0x7FFFFFFF, 421 | 0x37FFFF00000000, 0x3FFFFFF003FFFFF, 0xC0FFFFFFFFFFFFFF, 0x3FFFFFFEEF0001, 422 | 0x1FFFFFFF00000000, 0x1FFFFFFF, 0x1FFFFFFEFF, 0x3FFFFFFFFFFFFF, 423 | 0x7FFFF003FFFFF, 0x3FFFF, 0x1FF, 0x7FFFFFFFFFFFF, 0xFFFFFFFFF, 424 | 0xFFFF803FFFFFFC00, 0x3F, 0x303FFFFFFFFFF, 0x1C, 0xFFFF00801FFFFFFF, 425 | 0xFFFF00000000003F, 0xFFFF000000000003, 0x7FFFFF0000001F, 426 | 0xFFFFFFFFFFFFF8, 0x26000000000000, 0xFFFFFFFFFFF8, 0x1FFFFFF0000, 427 | 0x7FFFFFFFF8, 0x47FFFFFFFF0090, 0x7FFFFFFFFFFF8, 0x1400001E, 428 | 0x80000FFFFFFBFFFF, 0x1, 0xFFFF01FFBFFFBD7F, 0x23EDFDFFFFF99FE0, 429 | 0x3E0010000, 0xBFFFFFFFFF4BFF, 0xA0000, 0x380000780, 0xFFFFFFFFFFFF, 0xB0, 430 | 0x7FFFFFFFFFFF, 0xF000000, 0x10, 0x10007FFFFFFFFFF, 0x7FFFFFF, 0x7F, 431 | 0xFFFFFFFFFFF, 0xFFFFFFFF00000000, 0x80000000FFFFFFFF, 0x8000FFFFFF6FF27F, 432 | 0x2, 0xFFFFFCFF00000000, 0xA0001FFFF, 0x407FFFFFFFFF801, 433 | 0xFFFFFFFFF0010000, 0xFFFF0000200003FF, 0x1FFFFFFFFFFFFFF, 0x1FFFFFFFF, 434 | 0x7FFFFFFFFDFF, 0xFFFC000000000001, 0xFFFF, 0x1FFFFFFFFFB7F, 435 | 0xFFFFFDBF00000040, 0x10003FF, 0x7FFFF00000000, 0xFFFFFFFFDFFF4, 436 | 0x1000000000000, 0x3FFFFFF, 0xF, 0xFFFFFFFFFFFF0000, 0x1FFFFFFFFFFFF, 437 | 0xFFFFFFFF0000007E, 0x3FFFFFFF, 0xFFFF00007FFFFFFF, 0x7FFFFFFFFFFFFFFF, 438 | 0x3FFFFFFF0000, 0xE0FFFFF80000000F, 0x1FFFFFFFFFFF, 0x107FF, 0xFFF80000, 439 | 0xB00000000, 0xFFFFFFFFFFFFFF, 0x80000000003FFFFF, 0x6FEF000000000000, 440 | 0x40007FFFFFFFF, 0xFFFF00F000270000, 0xFFFFFFFFFFFFFFF, 441 | 0x1FFF07FFFFFFFFFF, 0x3FF01FF, 0xFFFFFFFFFFDFFFFF, 0xEBFFDE64DFFFFFFF, 442 | 0xFFFFFFFFFFFFFFEF, 0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F, 443 | 0xFFFFFF3FFFFFFFFF, 0xF7FFFFFFF7FFFFFD, 0xFFDFFFFFFFDFFFFF, 444 | 0xFFFF7FFFFFFF7FFF, 0xFFFFFDFFFFFFFDFF, 0xFF7, 0x7E07FFFFFFF, 445 | 0xFFFF000000000000, 0x3FFFFFFFFFFF, 0x3F801FFFFFFFFFFF, 0x4000, 446 | 0xFFFFFFF0000, 0x13FFFFFFF0000, 0x7FFF6F7F00000000, 0x1F, 0x80F, 447 | 0xAF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF, 0xFFFFFFFF, 448 | 0x3FFFFFFFFFFFFFF, 0xFFFF0003FFFFFFFF, 0xFFFF0001FFFFFFFF, 449 | 0xFFFFFFFFFFFF07FF, 450 | ], 451 | }; 452 | --------------------------------------------------------------------------------