regress-0.10.5/.cargo_vcs_info.json0000644000000001360000000000100125710ustar { "git": { "sha1": "f74c8c3723b0d351e1bba764f1a6000040d339e2" }, "path_in_vcs": "" }regress-0.10.5/.github/dependabot.yml000064400000000000000000000003211046102023000155450ustar 00000000000000--- version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" - package-ecosystem: "cargo" directory: "/" schedule: interval: "daily" regress-0.10.5/.github/workflows/autofix.yml000064400000000000000000000014441046102023000171630ustar 00000000000000name: autofix.ci on: workflow_call: pull_request: push: branches: [ "main" ] permissions: contents: read jobs: autofix: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: autofix-${{ hashFiles('**/Cargo.lock') }} - run: rustup toolchain install ${{ env.rust_clippy }} --profile minimal --component rustfmt --component clippy - run: rustup default ${{ env.rust_clippy }} - run: cargo clippy --fix --workspace - run: cargo fmt --all - uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 regress-0.10.5/.github/workflows/rust.yml000064400000000000000000000037451046102023000165070ustar 00000000000000on: pull_request: branches: - "**" push: branches: - "**" name: Continuous integration jobs: check: name: Check strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - run: cargo check --verbose test: name: Test Suite strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] features: - "" - "index-positions" - "prohibit-unsafe" - "utf16" - "index-positions,prohibit-unsafe" - "index-positions,utf16" - "prohibit-unsafe,utf16" - "index-positions,prohibit-unsafe,utf16" runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - run: cargo test --features "${{ matrix.features }}" --verbose clippy: name: Clippy runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable with: components: clippy - uses: Swatinem/rust-cache@v2 - run: cargo clippy --all-targets --features "backend-pikevm,std,index-positions,prohibit-unsafe,utf16" -- -D warnings test-nightly: name: Test (Nightly) strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@nightly - uses: Swatinem/rust-cache@v2 - run: cargo test --all-features --verbose doc: name: Documentation runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - run: cargo doc --verbose --document-private-items env: RUSTDOCFLAGS: -D warnings regress-0.10.5/.gitignore000064400000000000000000000004361046102023000133540ustar 00000000000000/target **/*.rs.bk Cargo.lock .vscode .vscode/* .DS_Store regexp-pcre.js .claude/ CLAUDE.md # Unicode Database Files DerivedCoreProperties.txt DerivedBinaryProperties.txt DerivedGeneralCategory.txt DerivedNormalizationProps.txt CaseFolding.txt emoji-data.txt PropList.txt Scripts.txt regress-0.10.5/Cargo.lock0000644000000023170000000000100105470ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "foldhash" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ "allocator-api2", "equivalent", "foldhash", ] [[package]] name = "memchr" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "regress" version = "0.10.5" dependencies = [ "hashbrown", "memchr", ] regress-0.10.5/Cargo.toml0000644000000035170000000000100105750ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2024" name = "regress" version = "0.10.5" authors = ["ridiculousfish "] build = false autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "A regular expression engine targeting EcmaScript syntax" readme = "README.md" keywords = [ "regex", "regexp", ] license = "MIT OR Apache-2.0" repository = "https://github.com/ridiculousfish/regress" [features] backend-pikevm = [] default = [ "backend-pikevm", "std", ] index-positions = [] pattern = [] prohibit-unsafe = [] std = ["memchr/std"] utf16 = [] [lib] name = "regress" path = "src/lib.rs" [[test]] name = "anchored_optimization" path = "tests/anchored_optimization.rs" [[test]] name = "escape_tests" path = "tests/escape_tests.rs" [[test]] name = "pattern_tests" path = "tests/pattern_tests.rs" [[test]] name = "pcre_tests" path = "tests/pcre_tests.rs" [[test]] name = "replacement_tests" path = "tests/replacement_tests.rs" [[test]] name = "syntax_error_tests" path = "tests/syntax_error_tests.rs" [[test]] name = "tests" path = "tests/tests.rs" [[test]] name = "unicode_property_escapes" path = "tests/unicode_property_escapes.rs" [[test]] name = "unicodesets" path = "tests/unicodesets.rs" [dependencies.hashbrown] version = "0.16.0" [dependencies.memchr] version = "2.4.0" default-features = false [profile.release] regress-0.10.5/Cargo.toml.orig000064400000000000000000000020371046102023000142520ustar 00000000000000[package] name = "regress" version = "0.10.5" authors = ["ridiculousfish "] description = "A regular expression engine targeting EcmaScript syntax" license = "MIT OR Apache-2.0" repository = "https://github.com/ridiculousfish/regress" keywords = ["regex", "regexp"] edition = "2024" readme = "README.md" [workspace] members = ["regress-tool", "gen-unicode", "."] default-members = ["regress-tool", "."] [profile.release] [features] default = ["backend-pikevm", "std"] std = ["memchr/std"] # Enables the PikeVM backend. backend-pikevm = [] # Prefers indexes to pointers for bytecode IP and string positions, for the paranoid. index-positions = [] # Prohibits all uses of unsafe code, for the paranoid. prohibit-unsafe = [] # Enables UTF-16 support. This disables some optimizations, so it should only be used when necessary. utf16 = [] # Enables Pattern trait implementation for str::find, str::contains, etc. pattern = [] [dependencies] hashbrown = "0.16.0" memchr = { version = "2.4.0", default-features = false } regress-0.10.5/LICENSE-APACHE000064400000000000000000000251231046102023000133100ustar 00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 ridiculous_fish Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. regress-0.10.5/LICENSE-MIT000064400000000000000000000020601046102023000130130ustar 00000000000000MIT License Copyright (c) 2020 ridiculous_fish Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. regress-0.10.5/README.md000064400000000000000000000063621046102023000126470ustar 00000000000000# regress - REGex in Rust with EcmaScript Syntax oh no why ## Introduction regress is a backtracking regular expression engine implemented in Rust, which targets JavaScript regular expression syntax. See [the crate documentation](https://docs.rs/regress) for more. It's fast, Unicode-aware, has few dependencies, and has a big test suite. It makes fewer guarantees than the `regex` crate but it enables more syntactic features, such as backreferences and lookaround assertions. ## Syntax regress targets the EcmaScript 2018 standard regexp syntax, including support for gnarly cases such as variable-width lookbehind assertions containing capture groups. Note that subsequent standard have mostly left regexp syntax untouched, with a few exceptions such as the 'v' flag, which is supported. ### That darn 'u' flag You will be sad to learn that JavaScript does not use UTF-8. Originally JavaScript was designed for UCS-2, with 16-bit characters. Later UCS-2 was supplanted with UTF-16; however this was not automatic for regexps, but instead required opt-in for each regexp, with the 'u' flag. For example, the grinning face emoji U+1F600 is represented in a JavaScript string as a surrogate pair U+D83D and U+DE00. In a regexp without the 'u' flag, these surrogate pairs are matched as distinct characters: const s = "😀"; const re = /./; const m = s.match(re); console.log(m); // returns \uD83D, high surrogate This behavior is almost never desired but is required by the ES spec. It's also super-awkward to express in Rust, which uses UTF-8 extensively. See below for how regress handles this. The 'u' flag doesn't just modify character sets; it _also_ affects other behaviors such as how case-insensitive matching works, and (most bizarrely) the behavior of backreferences like \2. For example, in non-Unicode mode, \2 is a backreference if there are at least two capture groups; otherwise it is an octal escape (!). regress mostly ignores the 'u' flag for character decoding - that's instead given by the call site (see below). regress attempts to implement the other behaviors faithfully. ### Character sets tl;dr use UTF-8 (or ASCII) input and the 'u' flag, unless you are implementing a JavaScript engine and care about strict conformance. To support JavaScript pre-Unicode semantics, regress supports multiple input forms on the `Regex` object. These are: - **UTF-8**. The default (unsuffixed) form. Input is `&str`. This always decodes whole characters from the input string. - **ASCII**. Use the `*_ascii` family of functions on `Regex` if you know your input is ASCII. Input is still `&str`. - **UTF-16**. Use the `*_utf16` family of functions. Input is `&[u16]`. Characters are always decoded as UTF-16. - **UCS-2**. OG JavaScript. Use `*_ucs2` functions. Input is `&[u16]`. Surrogate pairs are split freely. Only use if you want to implement strict JS semantics. Both the UTF-16 and UCS-2 forms require the Rust feature 'utf16' to be enabled. It is off by default. ### Fun Tools The `regress-tool` binary can be used for some fun. You can see how things get compiled with the `dump-phases` cli flag: > cargo run 'x{3,4}' 'i' --dump-phases You can run a little benchmark too, for example: > cargo run --release -- 'abcd' --flags 'i' --bench ~/3200.txt regress-0.10.5/perf.md000064400000000000000000000242271046102023000126460ustar 00000000000000These are perf results from 5/25/20, from [regex-performance](github.com/rust-leipzig/regex-performance.git). ``` '../3200.txt' loaded. (Length: 16013977 bytes) ----------------- Regex: 'Twain' [ pcre] time: 1.6 ms (+/- 6.8 %), matches: 811 [ pcre-dfa] time: 8.4 ms (+/- 1.3 %), matches: 811 [ pcre-jit] time: 9.9 ms (+/- 0.3 %), matches: 811 [ re2] time: 1.1 ms (+/- 3.6 %), matches: 811 [ onig] time: 11.0 ms (+/- 1.1 %), matches: 811 [ tre] time: 141.0 ms (+/- 0.1 %), matches: 811 [ hscan] time: 0.7 ms (+/- 3.2 %), matches: 811 [rust_regex] time: 1.1 ms (+/- 3.1 %), matches: 811 [rust_regrs] time: 7.1 ms (+/- 1.0 %), matches: 811 ----------------- Regex: '(?i)Twain' [ pcre] time: 28.4 ms (+/- 0.5 %), matches: 965 [ pcre-dfa] time: 41.0 ms (+/- 1.2 %), matches: 965 [ pcre-jit] time: 10.1 ms (+/- 1.0 %), matches: 965 [ re2] time: 32.0 ms (+/- 0.4 %), matches: 965 [ onig] time: 46.6 ms (+/- 0.4 %), matches: 965 [ tre] time: 184.6 ms (+/- 0.1 %), matches: 965 [ hscan] time: 0.9 ms (+/- 10.5 %), matches: 965 [rust_regex] time: 1.5 ms (+/- 3.3 %), matches: 965 [rust_regrs] time: 11.0 ms (+/- 1.1 %), matches: 965 ----------------- Regex: '[a-z]shing' [ pcre] time: 183.2 ms (+/- 0.4 %), matches: 1540 [ pcre-dfa] time: 314.4 ms (+/- 0.1 %), matches: 1540 [ pcre-jit] time: 9.3 ms (+/- 1.0 %), matches: 1540 [ re2] time: 52.2 ms (+/- 0.6 %), matches: 1540 [ onig] time: 9.3 ms (+/- 0.6 %), matches: 1540 [ tre] time: 207.8 ms (+/- 0.1 %), matches: 1540 [ hscan] time: 2.5 ms (+/- 3.7 %), matches: 1540 [rust_regex] time: 3.5 ms (+/- 2.8 %), matches: 1540 [rust_regrs] time: 132.4 ms (+/- 0.2 %), matches: 1540 ----------------- Regex: 'Huck[a-zA-Z]+|Saw[a-zA-Z]+' [ pcre] time: 10.4 ms (+/- 1.9 %), matches: 262 [ pcre-dfa] time: 10.9 ms (+/- 1.0 %), matches: 262 [ pcre-jit] time: 1.4 ms (+/- 4.0 %), matches: 262 [ re2] time: 22.9 ms (+/- 1.2 %), matches: 262 [ onig] time: 19.4 ms (+/- 1.2 %), matches: 262 [ tre] time: 204.2 ms (+/- 0.1 %), matches: 262 [ hscan] time: 1.3 ms (+/- 1.1 %), matches: 977 [rust_regex] time: 1.4 ms (+/- 4.3 %), matches: 262 [rust_regrs] time: 1.6 ms (+/- 3.2 %), matches: 262 ----------------- Regex: '\b\w+nn\b' [ pcre] time: 269.1 ms (+/- 0.3 %), matches: 262 [ pcre-dfa] time: 435.1 ms (+/- 0.1 %), matches: 262 [ pcre-jit] time: 51.4 ms (+/- 0.3 %), matches: 262 [ re2] time: 19.6 ms (+/- 0.7 %), matches: 262 [ onig] time: 327.9 ms (+/- 0.1 %), matches: 262 [ tre] time: 344.2 ms (+/- 1.8 %), matches: 262 [ hscan] time: 66.4 ms (+/- 0.3 %), matches: 262 [rust_regex] time: 100.4 ms (+/- 0.4 %), matches: 262 [rust_regrs] time: 191.5 ms (+/- 0.1 %), matches: 262 ----------------- Regex: '[a-q][^u-z]{13}x' [ pcre] time: 229.4 ms (+/- 0.2 %), matches: 4094 [ pcre-dfa] time: 838.4 ms (+/- 0.2 %), matches: 4094 [ pcre-jit] time: 1.1 ms (+/- 10.3 %), matches: 4094 [ re2] time: 103.9 ms (+/- 9.5 %), matches: 4094 [ onig] time: 22.8 ms (+/- 0.3 %), matches: 4094 [ tre] time: 518.4 ms (+/- 0.1 %), matches: 4094 [ hscan] time: 36.6 ms (+/- 0.2 %), matches: 4094 [rust_regex] time: 1578.3 ms (+/- 1.8 %), matches: 4094 [rust_regrs] time: 358.9 ms (+/- 0.2 %), matches: 4094 ----------------- Regex: 'Tom|Sawyer|Huckleberry|Finn' [ pcre] time: 13.2 ms (+/- 1.1 %), matches: 2598 [ pcre-dfa] time: 14.3 ms (+/- 0.4 %), matches: 2598 [ pcre-jit] time: 14.9 ms (+/- 0.6 %), matches: 2598 [ re2] time: 23.9 ms (+/- 0.6 %), matches: 2598 [ onig] time: 22.0 ms (+/- 0.6 %), matches: 2598 [ tre] time: 338.2 ms (+/- 0.1 %), matches: 2598 [ hscan] time: 1.6 ms (+/- 1.1 %), matches: 2598 [rust_regex] time: 1.4 ms (+/- 2.9 %), matches: 2598 [rust_regrs] time: 11.7 ms (+/- 0.7 %), matches: 2598 ----------------- Regex: '(?i)Tom|Sawyer|Huckleberry|Finn' [ pcre] time: 132.6 ms (+/- 0.4 %), matches: 4152 [ pcre-dfa] time: 161.6 ms (+/- 0.2 %), matches: 4152 [ pcre-jit] time: 40.7 ms (+/- 0.9 %), matches: 4152 [ re2] time: 48.0 ms (+/- 0.4 %), matches: 4152 [ onig] time: 140.3 ms (+/- 0.1 %), matches: 4152 [ tre] time: 491.6 ms (+/- 0.1 %), matches: 4152 [ hscan] time: 1.7 ms (+/- 7.4 %), matches: 4152 [rust_regex] time: 2.8 ms (+/- 3.1 %), matches: 4152 [rust_regrs] time: 110.9 ms (+/- 0.2 %), matches: 4152 ----------------- Regex: '.{0,2}(Tom|Sawyer|Huckleberry|Finn)' [ pcre] time: 1613.8 ms (+/- 0.0 %), matches: 2598 [ pcre-dfa] time: 1514.8 ms (+/- 0.2 %), matches: 2598 [ pcre-jit] time: 129.9 ms (+/- 0.3 %), matches: 2598 [ re2] time: 22.2 ms (+/- 0.6 %), matches: 2598 [ onig] time: 40.6 ms (+/- 0.9 %), matches: 2598 [ tre] time: 1087.0 ms (+/- 0.8 %), matches: 2598 [ hscan] time: 1.6 ms (+/- 0.8 %), matches: 2598 [rust_regex] time: 21.4 ms (+/- 0.8 %), matches: 2598 [rust_regrs] time: 961.8 ms (+/- 1.0 %), matches: 2598 ----------------- Regex: '.{2,4}(Tom|Sawyer|Huckleberry|Finn)' [ pcre] time: 1688.0 ms (+/- 0.0 %), matches: 1976 [ pcre-dfa] time: 1808.7 ms (+/- 0.1 %), matches: 1976 [ pcre-jit] time: 141.8 ms (+/- 0.1 %), matches: 1976 [ re2] time: 22.2 ms (+/- 0.5 %), matches: 1976 [ onig] time: 38.7 ms (+/- 0.4 %), matches: 1976 [ tre] time: 1656.9 ms (+/- 0.3 %), matches: 1976 [ hscan] time: 1.8 ms (+/- 7.2 %), matches: 2598 [rust_regex] time: 21.3 ms (+/- 1.5 %), matches: 1976 [rust_regrs] time: 965.6 ms (+/- 0.3 %), matches: 1976 ----------------- Regex: 'Tom.{10,25}river|river.{10,25}Tom' [ pcre] time: 27.7 ms (+/- 0.5 %), matches: 2 [ pcre-dfa] time: 34.9 ms (+/- 0.4 %), matches: 2 [ pcre-jit] time: 8.3 ms (+/- 1.5 %), matches: 2 [ re2] time: 27.9 ms (+/- 2.3 %), matches: 2 [ onig] time: 37.3 ms (+/- 0.4 %), matches: 2 [ tre] time: 244.5 ms (+/- 0.1 %), matches: 2 [ hscan] time: 1.3 ms (+/- 2.1 %), matches: 4 [rust_regex] time: 1.9 ms (+/- 23.8 %), matches: 2 [rust_regrs] time: 9.9 ms (+/- 0.5 %), matches: 2 ----------------- Regex: '[a-zA-Z]+ing' [ pcre] time: 398.0 ms (+/- 0.1 %), matches: 78424 [ pcre-dfa] time: 717.5 ms (+/- 0.1 %), matches: 78424 [ pcre-jit] time: 44.4 ms (+/- 0.4 %), matches: 78424 [ re2] time: 59.2 ms (+/- 0.2 %), matches: 78424 [ onig] time: 338.3 ms (+/- 0.0 %), matches: 78424 [ tre] time: 265.1 ms (+/- 0.1 %), matches: 78424 [ hscan] time: 9.6 ms (+/- 1.7 %), matches: 78872 [rust_regex] time: 9.1 ms (+/- 1.1 %), matches: 78424 [rust_regrs] time: 295.3 ms (+/- 0.1 %), matches: 78424 ----------------- Regex: '\s[a-zA-Z]{0,12}ing\s' [ pcre] time: 180.9 ms (+/- 0.2 %), matches: 55248 [ pcre-dfa] time: 278.2 ms (+/- 0.1 %), matches: 55248 [ pcre-jit] time: 56.4 ms (+/- 0.5 %), matches: 55248 [ re2] time: 33.4 ms (+/- 0.5 %), matches: 55248 [ onig] time: 39.2 ms (+/- 0.4 %), matches: 55248 [ tre] time: 370.6 ms (+/- 0.1 %), matches: 55248 [ hscan] time: 13.2 ms (+/- 1.2 %), matches: 55640 [rust_regex] time: 24.7 ms (+/- 0.7 %), matches: 55248 [rust_regrs] time: 151.3 ms (+/- 0.1 %), matches: 55248 ----------------- Regex: '([A-Za-z]awyer|[A-Za-z]inn)\s' [ pcre] time: 377.8 ms (+/- 0.1 %), matches: 209 [ pcre-dfa] time: 493.5 ms (+/- 0.1 %), matches: 209 [ pcre-jit] time: 20.3 ms (+/- 0.9 %), matches: 209 [ re2] time: 49.7 ms (+/- 0.5 %), matches: 209 [ onig] time: 90.5 ms (+/- 0.2 %), matches: 209 [ tre] time: 407.0 ms (+/- 0.1 %), matches: 209 [ hscan] time: 2.9 ms (+/- 4.2 %), matches: 209 [rust_regex] time: 21.1 ms (+/- 0.6 %), matches: 209 [rust_regrs] time: 229.7 ms (+/- 0.1 %), matches: 209 ----------------- Regex: '["'][^"']{0,30}[?!\.]["']' [ pcre] time: 25.0 ms (+/- 1.1 %), matches: 8886 [ pcre-dfa] time: 36.9 ms (+/- 0.3 %), matches: 8886 [ pcre-jit] time: 5.5 ms (+/- 1.3 %), matches: 8886 [ re2] time: 24.7 ms (+/- 0.7 %), matches: 8886 [ onig] time: 35.1 ms (+/- 0.2 %), matches: 8886 [ tre] time: 202.6 ms (+/- 0.2 %), matches: 8886 [ hscan] time: 8.1 ms (+/- 1.8 %), matches: 8898 [rust_regex] time: 5.7 ms (+/- 4.9 %), matches: 8886 [rust_regrs] time: 16.9 ms (+/- 0.5 %), matches: 8886 ----------------- Regex: '∞|✓' [ pcre] time: 0.6 ms (+/- 12.9 %), matches: 2 [ pcre-dfa] time: 7.1 ms (+/- 1.7 %), matches: 2 [ pcre-jit] time: 0.8 ms (+/- 8.5 %), matches: 2 [ re2] time: 0.5 ms (+/- 9.5 %), matches: 0 [ onig] time: 21.5 ms (+/- 0.1 %), matches: 2 [ tre] time: 168.0 ms (+/- 0.2 %), matches: 2 [ hscan] time: 1.2 ms (+/- 9.9 %), matches: 2 [rust_regex] time: 1.3 ms (+/- 2.4 %), matches: 2 [rust_regrs] time: 0.5 ms (+/- 11.8 %), matches: 2 ----------------- Total Results: [ pcre] time: 5179.7 ms, score: 3 points, [ pcre-dfa] time: 6715.7 ms, score: 0 points, [ pcre-jit] time: 546.2 ms, score: 33 points, [ re2] time: 543.5 ms, score: 23 points, [ onig] time: 1240.5 ms, score: 7 points, [ tre] time: 6831.5 ms, score: 0 points, [ hscan] time: 151.3 ms, score: 67 points, [rust_regex] time: 1796.8 ms, score: 52 points, [rust_regrs] time: 3456.0 ms, score: 7 points, ``` regress-0.10.5/rustfmt.toml000064400000000000000000000000271046102023000137610ustar 00000000000000# wrap_comments = true regress-0.10.5/src/api.rs000064400000000000000000000763601046102023000133030ustar 00000000000000use crate::classicalbacktrack; use crate::emit; use crate::exec; use crate::indexing; use crate::insn::CompiledRegex; use crate::optimizer; use crate::parse; use crate::types::MAX_CAPTURE_GROUPS; use std::iter::FusedIterator; #[cfg(feature = "utf16")] use crate::{ classicalbacktrack::MatchAttempter, indexing::{InputIndexer, Ucs2Input, Utf16Input}, }; #[cfg(feature = "backend-pikevm")] use crate::pikevm; use crate::util::to_char_sat; use core::{fmt, str::FromStr}; #[cfg(feature = "std")] #[cfg(not(feature = "std"))] use { alloc::{string::String, vec::Vec}, hashbrown::{HashMap, hash_map::Iter}, }; pub use parse::Error; /// Flags used to control regex parsing. /// The default flags are case-sensitive, not-multiline, and optimizing. #[derive(Debug, Copy, Clone, Default)] pub struct Flags { /// If set, make the regex case-insensitive. /// Equivalent to the 'i' flag in JavaScript. pub icase: bool, /// If set, ^ and $ match at line separators, not just the input boundaries. /// Equivalent to the 'm' flag in JavaScript. pub multiline: bool, /// If set, . matches at line separators as well as any other character. /// Equivalent to the 'm' flag in JavaScript. pub dot_all: bool, /// If set, disable regex IR passes. pub no_opt: bool, /// If set, the regex is interpreted as a Unicode regex. /// Equivalent to the 'u' flag in JavaScript. pub unicode: bool, /// If set, the regex is interpreted as a UnicodeSets regex. /// Equivalent to the 'v' flag in JavaScript. pub unicode_sets: bool, } impl Flags { /// Construct a Flags from a Unicode codepoints iterator, using JavaScript field names. /// 'i' means to ignore case, 'm' means multiline, 'u' means unicode. /// Note the 'g' flag implies a stateful regex and is not supported. /// Other flags are not implemented and are ignored. #[inline] pub fn new>(chars: T) -> Self { let mut result = Self::default(); for c in chars { match to_char_sat(c) { 'm' => { result.multiline = true; } 'i' => { result.icase = true; } 's' => { result.dot_all = true; } 'u' => { result.unicode = true; } 'v' => { result.unicode_sets = true; } _ => { // Silently skip unsupported flags. } } } result } } impl From<&str> for Flags { /// Construct a Flags from a string, using JavaScript field names. /// /// See also: [`Flags::new`]. #[inline] fn from(s: &str) -> Self { Self::new(s.chars().map(u32::from)) } } impl fmt::Display for Flags { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { if self.multiline { f.write_str("m")?; } if self.icase { f.write_str("i")?; } if self.dot_all { f.write_str("s")?; } if self.unicode { f.write_str("u")?; } Ok(()) } } /// Range is used to express the extent of a match, as indexes into the input /// string. pub type Range = core::ops::Range; /// An iterator type which yields `Match`es found in a string. pub type Matches<'r, 't> = exec::Matches>; /// An iterator type which yields `Match`es found in a string, supporting ASCII /// only. pub type AsciiMatches<'r, 't> = exec::Matches>; /// A Match represents a portion of a string which was found to match a Regex. #[derive(Debug, Clone)] pub struct Match { /// The total range of the match. Note this may be empty, if the regex /// matched an empty string. pub range: Range, /// The list of captures. This has length equal to the number of capturing /// groups in the regex. For each capture, if the value is None, that group /// did not match (for example, it was in a not-taken branch of an /// alternation). If the value is Some, the group did match with the /// enclosed range. pub captures: Vec>, // A list of capture group names. This is either: // - Empty, if there were no named capture groups. // - A list of names with length `captures.len()`, corresponding to the // capture group names in order. Groups without names have an empty string. pub(crate) group_names: Box<[Box]>, } impl Match { /// Access a group by index, using the convention of Python's group() /// function. Index 0 is the total match, index 1 is the first capture /// group. #[inline] pub fn group(&self, idx: usize) -> Option { if idx == 0 { Some(self.range.clone()) } else if idx <= self.captures.len() { self.captures[idx - 1].clone() } else { None } } /// Access a named group by name. #[inline] pub fn named_group(&self, name: &str) -> Option { // Empty strings are used as sentinels to indicate unnamed group. if name.is_empty() { return None; } let pos = self.group_names.iter().position(|s| s.as_ref() == name)?; self.captures[pos].clone() } /// Return an iterator over the named groups of a Match. #[inline] pub fn named_groups(&self) -> NamedGroups<'_> { NamedGroups::new(self) } /// Returns the range over the starting and ending byte offsets of the match in the haystack. /// /// This is a convenience function to work around /// the fact that Range does not support Copy. #[inline] pub fn range(&self) -> Range { self.range.clone() } /// Returns the starting byte offset of the match in the haystack. #[inline] pub fn start(&self) -> usize { self.range.start } /// Returns the ending byte offset of the match in the haystack. #[inline] pub fn end(&self) -> usize { self.range.end } /// Returns the matched text as a string slice. /// /// # Examples /// /// ```rust /// use regress::Regex; /// /// let re = Regex::new(r"\d+").unwrap(); /// let text = "Price: $123"; /// let m = re.find(text).unwrap(); /// assert_eq!(m.as_str(text), "123"); /// ``` #[inline] pub fn as_str<'t>(&self, text: &'t str) -> &'t str { &text[self.range()] } /// Return an iterator over a Match. The first returned value is the total /// match, and subsequent values represent the capture groups. #[inline] pub fn groups(&self) -> Groups<'_> { Groups::new(self) } } /// An iterator over the capture groups of a [`Match`] /// /// This struct is created by the [`groups`] method on [`Match`]. /// /// [`Match`]: ../struct.Match.html /// [`groups`]: ../struct.Match.html#method.groups #[derive(Clone)] pub struct Groups<'m> { mat: &'m Match, // The next group index to return, where 0 references the total match. next_group_idx: usize, // The maximum group index to return, with a +1 for the implicit total match. // For example, in a regex with 1 capture group, this will be 2. max: usize, } impl<'m> Groups<'m> { #[inline] fn new(mat: &'m Match) -> Self { Self { mat, next_group_idx: 0, max: mat.captures.len() + 1, // +1 for the total match } } } impl Iterator for Groups<'_> { type Item = Option; #[inline] fn next(&mut self) -> Option { let i = self.next_group_idx; if i < self.max { self.next_group_idx += 1; Some(self.mat.group(i)) } else { None } } fn size_hint(&self) -> (usize, Option) { let size = self.max.saturating_sub(self.next_group_idx); (size, Some(size)) } } impl<'m> ExactSizeIterator for Groups<'m> {} impl<'m> FusedIterator for Groups<'m> {} /// An iterator over the named capture groups of a [`Match`] /// /// This struct is created by the [`named_groups`] method on [`Match`]. /// /// [`Match`]: ../struct.Match.html /// [`named_groups`]: ../struct.Match.html#method.named_groups #[derive(Clone)] pub struct NamedGroups<'m> { mat: &'m Match, // The next group name index to return. // Note unlike `Groups` this does NOT include the implicit total match. // That is, group 0 is the first capture group, NOT the total match. next_group_idx: usize, } impl<'m> NamedGroups<'m> { #[inline] fn new(mat: &'m Match) -> Self { Self { mat, next_group_idx: 0, } } } impl<'m> Iterator for NamedGroups<'m> { type Item = (&'m str, Option); #[inline] fn next(&mut self) -> Option { // Increment next_group_idx until we find a non-empty name. debug_assert!(self.next_group_idx <= self.mat.group_names.len()); let end = self.mat.group_names.len(); let mut idx = self.next_group_idx; while idx < end && self.mat.group_names[idx].is_empty() { idx += 1; } if idx == end { return None; } let name = self.mat.group_names[idx].as_ref(); let range = self.mat.captures[idx].clone(); self.next_group_idx = idx + 1; Some((name, range)) } fn size_hint(&self) -> (usize, Option) { let size = self.mat.group_names[self.next_group_idx..] .iter() .filter(|s| !s.is_empty()) .count(); (size, Some(size)) } } impl<'m> ExactSizeIterator for NamedGroups<'m> {} impl<'m> FusedIterator for NamedGroups<'m> {} /// A Regex is the compiled version of a pattern. #[derive(Debug, Clone)] pub struct Regex { cr: CompiledRegex, } impl From for Regex { fn from(cr: CompiledRegex) -> Self { Self { cr } } } impl Regex { /// Construct a regex by parsing `pattern` using the default flags. /// An Error may be returned if the syntax is invalid. /// Note that this is rather expensive; prefer to cache a Regex which is /// intended to be used more than once. #[inline] pub fn new(pattern: &str) -> Result { Self::with_flags(pattern, Flags::default()) } /// Construct a regex by parsing `pattern` with `flags`. /// An Error may be returned if the syntax is invalid. // /// Note it is preferable to cache a Regex which is intended to be used more /// than once, as the parse may be expensive. For example: #[inline] pub fn with_flags(pattern: &str, flags: F) -> Result where F: Into, { Self::from_unicode(pattern.chars().map(u32::from), flags) } /// Construct a regex by parsing `pattern` with `flags`, where /// `pattern` is an iterator of `u32` Unicode codepoints. /// An Error may be returned if the syntax is invalid. /// This allows parsing regular expressions from exotic strings in /// other encodings, such as UTF-16 or UTF-32. pub fn from_unicode(pattern: I, flags: F) -> Result where I: Iterator + Clone, F: Into, { let flags = flags.into(); let mut ire = parse::try_parse(pattern, flags)?; if !flags.no_opt { optimizer::optimize(&mut ire); } let cr = emit::emit(&ire); Ok(Regex { cr }) } /// Searches `text` to find the first match. #[inline] pub fn find(&self, text: &str) -> Option { self.find_iter(text).next() } /// Searches `text`, returning an iterator over non-overlapping matches. /// Note that the resulting Iterator borrows both the regex `'r` and the /// input string as `'t`. #[inline] pub fn find_iter<'r, 't>(&'r self, text: &'t str) -> Matches<'r, 't> { self.find_from(text, 0) } /// Returns an iterator for matches found in 'text' starting at byte index /// `start`. Note this may be different from passing a sliced `text` in /// the case of lookbehind assertions. /// Example: /// /// ```rust /// use regress::Regex; /// let text = "xyxy"; /// let re = Regex::new(r"(?<=x)y").unwrap(); /// let t1 = re.find(&text[1..]).unwrap().range(); /// assert!(t1 == (2..3)); /// let t2 = re.find_from(text, 1).next().unwrap().range(); /// assert!(t2 == (1..2)); /// ``` #[inline] pub fn find_from<'r, 't>(&'r self, text: &'t str, start: usize) -> Matches<'r, 't> { backends::find(self, text, start) } /// Searches `text` to find the first match. /// The input text is expected to be ascii-only: only ASCII case-folding is /// supported. #[inline] pub fn find_ascii(&self, text: &str) -> Option { self.find_iter_ascii(text).next() } /// Searches `text`, returning an iterator over non-overlapping matches. /// The input text is expected to be ascii-only: only ASCII case-folding is /// supported. #[inline] pub fn find_iter_ascii<'r, 't>(&'r self, text: &'t str) -> AsciiMatches<'r, 't> { self.find_from_ascii(text, 0) } /// Returns an iterator for matches found in 'text' starting at byte index /// `start`. #[inline] pub fn find_from_ascii<'r, 't>(&'r self, text: &'t str, start: usize) -> AsciiMatches<'r, 't> { backends::find(self, text, start) } /// Returns an iterator for matches found in 'text' starting at index `start`. #[cfg(feature = "utf16")] pub fn find_from_utf16<'r, 't>( &'r self, text: &'t [u16], start: usize, ) -> exec::Matches>> { let input = Utf16Input::new(text, self.cr.flags.unicode); exec::Matches::new( super::classicalbacktrack::BacktrackExecutor::new( input, MatchAttempter::new(&self.cr, input.left_end()), ), start, ) } /// Returns an iterator for matches found in 'text' starting at index `start`. #[cfg(feature = "utf16")] pub fn find_from_ucs2<'r, 't>( &'r self, text: &'t [u16], start: usize, ) -> exec::Matches>> { let input = Ucs2Input::new(text, self.cr.flags.unicode); exec::Matches::new( super::classicalbacktrack::BacktrackExecutor::new( input, MatchAttempter::new(&self.cr, input.left_end()), ), start, ) } /// Replaces the first match of the regex in `text` with the replacement string. /// /// The replacement string may contain capture group references in the form `$1`, `$2`, etc., /// where `$1` refers to the first capture group, `$2` to the second, and so on. /// `$0` refers to the entire match. Use `$$` to insert a literal `$`. /// /// If no match is found, the original text is returned unchanged. /// /// # Examples /// /// ```rust /// use regress::Regex; /// /// let re = Regex::new(r"(\w+)\s+(\w+)").unwrap(); /// let result = re.replace("hello world", "$2 $1"); /// assert_eq!(result, "world hello"); /// /// let re = Regex::new(r"(\d{4})-(\d{2})-(\d{2})").unwrap(); /// let result = re.replace("2023-12-25", "$2/$3/$1"); /// assert_eq!(result, "12/25/2023"); /// ``` pub fn replace(&self, text: &str, replacement: &str) -> String { match self.find(text) { Some(m) => { let mut result = String::with_capacity(text.len()); result.push_str(&text[..m.start()]); self.expand_replacement(&m, text, replacement, &mut result); result.push_str(&text[m.end()..]); result } None => text.to_string(), } } /// Replaces all matches of the regex in `text` with the replacement string. /// /// The replacement string may contain capture group references in the form `$1`, `$2`, etc., /// where `$1` refers to the first capture group, `$2` to the second, and so on. /// `$0` refers to the entire match. Use `$$` to insert a literal `$`. /// /// # Examples /// /// ```rust /// use regress::Regex; /// /// let re = Regex::new(r"(\w+)\s+(\w+)").unwrap(); /// let result = re.replace_all("hello world foo bar", "$2-$1"); /// assert_eq!(result, "world-hello bar-foo"); /// /// let re = Regex::new(r"\b(\w)(\w+)").unwrap(); /// let result = re.replace_all("hello world", "$1.$2"); /// assert_eq!(result, "h.ello w.orld"); /// ``` pub fn replace_all(&self, text: &str, replacement: &str) -> String { let mut result = String::with_capacity(text.len()); let mut last_end = 0; for m in self.find_iter(text) { result.push_str(&text[last_end..m.start()]); self.expand_replacement(&m, text, replacement, &mut result); last_end = m.end(); } result.push_str(&text[last_end..]); result } /// Replaces the first match of the regex in `text` using a closure. /// /// The closure receives a `&Match` and should return the replacement string. /// This is useful for dynamic replacements that depend on the match details. /// /// If no match is found, the original text is returned unchanged. /// /// # Examples /// /// ```rust /// use regress::Regex; /// /// let re = Regex::new(r"\d+").unwrap(); /// let text = "Price: $123"; /// let result = re.replace_with(text, |m| { /// let num: i32 = m.as_str(text).parse().unwrap(); /// format!("{}", num * 2) /// }); /// assert_eq!(result, "Price: $246"); /// ``` pub fn replace_with(&self, text: &str, replacement: F) -> String where F: FnOnce(&Match) -> String, { match self.find(text) { Some(m) => { let mut result = String::with_capacity(text.len()); result.push_str(&text[..m.start()]); result.push_str(&replacement(&m)); result.push_str(&text[m.end()..]); result } None => text.to_string(), } } /// Replaces all matches of the regex in `text` using a closure. /// /// The closure receives a `&Match` and should return the replacement string. /// This is useful for dynamic replacements that depend on the match details. /// /// # Examples /// /// ```rust /// use regress::Regex; /// /// let re = Regex::new(r"\d+").unwrap(); /// let text = "Items: 5, 10, 15"; /// let result = re.replace_all_with(text, |m| { /// let num: i32 = m.as_str(text).parse().unwrap(); /// format!("[{}]", num * 10) /// }); /// assert_eq!(result, "Items: [50], [100], [150]"); /// ``` pub fn replace_all_with(&self, text: &str, replacement: F) -> String where F: Fn(&Match) -> String, { let mut result = String::with_capacity(text.len()); let mut last_end = 0; for m in self.find_iter(text) { result.push_str(&text[last_end..m.start()]); result.push_str(&replacement(&m)); last_end = m.end(); } result.push_str(&text[last_end..]); result } /// Helper method to expand replacement strings with capture group substitutions. fn expand_replacement(&self, m: &Match, text: &str, replacement: &str, output: &mut String) { let mut chars = replacement.chars().peekable(); while let Some(ch) = chars.next() { if ch == '$' { match chars.peek() { Some('$') => { // $$ -> literal $ chars.next(); output.push('$'); } Some(&digit) if digit.is_ascii_digit() => { // Parse the group number let mut group_num = 0; while let Some(&digit) = chars.peek() { if digit.is_ascii_digit() { chars.next(); group_num = group_num * 10 + (digit as u32 - '0' as u32) as usize; // Limit to reasonable group numbers to avoid overflow if group_num > MAX_CAPTURE_GROUPS { break; } } else { break; } } // Get the matched text for this group if let Some(range) = m.group(group_num) { output.push_str(&text[range]); } // If group doesn't exist or didn't match, add nothing } Some('{') => { // Handle ${name} syntax for named groups chars.next(); // consume '{' let mut name = String::new(); let mut found_closing_brace = false; for ch in chars.by_ref() { if ch == '}' { found_closing_brace = true; break; } name.push(ch); } if found_closing_brace { if let Some(range) = m.named_group(&name) { output.push_str(&text[range]); } } else { // Malformed ${...}, treat as literal output.push_str("${"); output.push_str(&name); } } _ => { // Just a $ at end or followed by non-digit output.push('$'); } } } else { output.push(ch); } } } } impl FromStr for Regex { type Err = Error; /// Attempts to parse a string into a regular expression #[inline] fn from_str(s: &str) -> Result { Self::new(s) } } // Pattern trait implementation for str::find, str::contains, etc. #[cfg(feature = "pattern")] mod pattern_impl { use super::*; use core::str::pattern::{Pattern, ReverseSearcher, SearchStep, Searcher}; /// A searcher for a regex pattern. pub struct RegexSearcher<'r, 't> { haystack: &'t str, regex: &'r Regex, current_pos: usize, done: bool, // For reverse searching reverse_pos: usize, reverse_done: bool, } impl<'r, 't> RegexSearcher<'r, 't> { fn new(regex: &'r Regex, haystack: &'t str) -> Self { Self { haystack, regex, current_pos: 0, done: false, reverse_pos: haystack.len(), reverse_done: false, } } fn find_last_match_before(&self, pos: usize) -> Option { // Find all matches up to the given position and return the last one let mut last_match = None; for m in self.regex.find_from(self.haystack, 0) { if m.end() <= pos { last_match = Some(m); } else { break; } } last_match } } unsafe impl<'r, 't> Searcher<'t> for RegexSearcher<'r, 't> { fn haystack(&self) -> &'t str { self.haystack } fn next(&mut self) -> SearchStep { if self.done { return SearchStep::Done; } // Try to find the next match starting from current position if let Some(m) = self.regex.find_from(self.haystack, self.current_pos).next() { let match_start = m.start(); let match_end = m.end(); // Handle any gap between current position and match start if self.current_pos < match_start { let reject_end = match_start; let reject_start = self.current_pos; self.current_pos = match_start; return SearchStep::Reject(reject_start, reject_end); } // Return the match self.current_pos = match_end; // Handle zero-width matches to avoid infinite loops if match_start == match_end { // For zero-width matches, we need to advance at least one byte // to avoid infinite loops if match_end < self.haystack.len() { // Find the next character boundary let mut next_pos = match_end + 1; while next_pos < self.haystack.len() && !self.haystack.is_char_boundary(next_pos) { next_pos += 1; } self.current_pos = next_pos; } else { // We're at the end of the string self.done = true; } } SearchStep::Match(match_start, match_end) } else { // No more matches, reject remaining text if any if self.current_pos < self.haystack.len() { let reject_start = self.current_pos; let reject_end = self.haystack.len(); self.current_pos = self.haystack.len(); self.done = true; SearchStep::Reject(reject_start, reject_end) } else { self.done = true; SearchStep::Done } } } } unsafe impl<'r, 't> ReverseSearcher<'t> for RegexSearcher<'r, 't> { fn next_back(&mut self) -> SearchStep { if self.reverse_done { return SearchStep::Done; } // Try to find the last match before current reverse position if let Some(m) = self.find_last_match_before(self.reverse_pos) { let match_start = m.start(); let match_end = m.end(); // Handle any gap between match end and current reverse position if match_end < self.reverse_pos { let reject_start = match_end; let reject_end = self.reverse_pos; self.reverse_pos = match_end; return SearchStep::Reject(reject_start, reject_end); } // Return the match self.reverse_pos = match_start; // Handle zero-width matches if match_start == match_end { // For zero-width matches, move back by one character if match_start > 0 { let mut prev_pos = match_start - 1; while prev_pos > 0 && !self.haystack.is_char_boundary(prev_pos) { prev_pos -= 1; } self.reverse_pos = prev_pos; } else { // We're at the beginning of the string self.reverse_done = true; } } SearchStep::Match(match_start, match_end) } else { // No more matches, reject remaining text if any if self.reverse_pos > 0 { let reject_start = 0; let reject_end = self.reverse_pos; self.reverse_pos = 0; self.reverse_done = true; SearchStep::Reject(reject_start, reject_end) } else { self.reverse_done = true; SearchStep::Done } } } } impl<'r> Pattern for &'r Regex { type Searcher<'a> = RegexSearcher<'r, 'a>; fn into_searcher(self, haystack: &str) -> Self::Searcher<'_> { RegexSearcher::new(self, haystack) } } } #[cfg(feature = "pattern")] pub use pattern_impl::*; // Support for using regress with different regex backends. // Currently there is only the classical backtracking, and PikeVM. #[doc(hidden)] pub mod backends { use super::Regex; use super::exec; use super::indexing; pub use crate::emit::emit; pub use crate::optimizer::optimize; pub use crate::parse::try_parse; /// An Executor using the classical backtracking algorithm. pub type BacktrackExecutor<'r, 't> = super::classicalbacktrack::BacktrackExecutor<'r, indexing::Utf8Input<'t>>; /// A Executor using the PikeVM executor. #[cfg(feature = "backend-pikevm")] pub type PikeVMExecutor<'r, 't> = super::pikevm::PikeVMExecutor<'r, indexing::Utf8Input<'t>>; /// An alias type to the default Executor. pub type DefaultExecutor<'r, 't> = BacktrackExecutor<'r, 't>; /// An alias type to the default executor's ASCII form. pub type DefaultAsciiExecutor<'r, 't> = as exec::Executor<'r, 't>>::AsAscii; /// Searches `text`, returning an iterator over non-overlapping matches. pub fn find<'r, 't, Executor: exec::Executor<'r, 't>>( re: &'r Regex, text: &'t str, start: usize, ) -> exec::Matches { exec::Matches::new(Executor::new(&re.cr, text), start) } /// Searches `text`, returning an iterator over non-overlapping matches. /// This is a convenience method to avoid E0223. pub fn find_ascii<'r, 't, Executor: exec::Executor<'r, 't>>( re: &'r Regex, text: &'t str, start: usize, ) -> exec::Matches { find::(re, text, start) } } /// Escapes all special regex characters in a string to make it a literal match. /// /// This function takes a string and returns a new string with all special /// regex characters escaped with backslashes, so the resulting string can be /// used as a literal pattern in a regular expression. /// /// # Example /// /// ``` /// use regress::escape; /// /// let escaped = escape("Hello. How are you?"); /// assert_eq!(escaped, "Hello\\. How are you\\?"); /// /// let escaped = escape("$100 + tax (15%)"); /// assert_eq!(escaped, "\\$100 \\+ tax \\(15%\\)"); /// ``` pub fn escape(text: &str) -> String { let mut result = String::with_capacity(text.len()); for c in text.chars() { match c { // Characters that have special meaning in regex and need escaping '\\' | '^' | '$' | '.' | '|' | '?' | '*' | '+' | '(' | ')' | '[' | ']' | '{' | '}' => { result.push('\\'); result.push(c); } // All other characters are literal _ => result.push(c), } } result } regress-0.10.5/src/bytesearch.rs000064400000000000000000000255561046102023000146640ustar 00000000000000use crate::insn::MAX_CHAR_SET_LENGTH; use core::fmt; extern crate memchr; #[cfg(not(feature = "std"))] use alloc::vec::Vec; /// Facilities for searching bytes. pub trait ByteSearcher { /// Search for ourselves in a slice of bytes. /// The length of the slice is unspecified and may be 0. /// \return the next index of ourselves in the slice, or None. fn find_in(&self, rhs: &[u8]) -> Option; } impl ByteSearcher for [u8; 1] { #[inline(always)] fn find_in(&self, rhs: &[u8]) -> Option { memchr::memchr(self[0], rhs) } } impl ByteSearcher for [u8; 2] { #[inline(always)] fn find_in(&self, rhs: &[u8]) -> Option { memchr::memchr2(self[0], self[1], rhs) } } impl ByteSearcher for [u8; 3] { #[inline(always)] fn find_in(&self, rhs: &[u8]) -> Option { memchr::memchr3(self[0], self[1], self[2], rhs) } } impl ByteSearcher for memchr::memmem::Finder<'_> { fn find_in(&self, rhs: &[u8]) -> Option { self.find(rhs) } } /// A ByteSet is any set of bytes. pub trait ByteSet { /// \return whether the ByteSet contains the byte. fn contains(&self, b: u8) -> bool; } /// A ByteArraySet wraps a small array and uses linear equality. #[derive(Copy, Clone, Debug)] #[repr(align(4))] pub struct ByteArraySet(pub ArraySet); /// Cover over contains() to avoid bumping into native contains call. impl ByteArraySet { #[inline(always)] pub fn contains(self, b: u8) -> bool { self.0.contains(b) } } impl ByteSearcher for ByteArraySet { #[inline(always)] fn find_in(&self, rhs: &[u8]) -> Option { self.0.find_in(rhs) } } /// A SmallArraySet is a set implemented as a small byte array. pub trait SmallArraySet: Copy { fn contains(self, b: u8) -> bool; fn find_in(self, rhs: &[u8]) -> Option; } // Beware: Rust is cranky about loop unrolling. // Do not try to be too clever here. impl SmallArraySet for [u8; 2] { #[inline(always)] fn contains(self, b: u8) -> bool { b == self[0] || b == self[1] } #[inline(always)] fn find_in(self, rhs: &[u8]) -> Option { memchr::memchr2(self[0], self[1], rhs) } } impl SmallArraySet for [u8; 3] { #[inline(always)] fn contains(self, b: u8) -> bool { b == self[0] || b == self[1] || b == self[2] } #[inline(always)] fn find_in(self, rhs: &[u8]) -> Option { memchr::memchr3(self[0], self[1], self[2], rhs) } } impl SmallArraySet for [u8; 4] { #[inline(always)] fn contains(self, b: u8) -> bool { b == self[0] || b == self[1] || b == self[2] || b == self[3] } #[inline(always)] fn find_in(self, rhs: &[u8]) -> Option { // TODO. for (idx, byte) in rhs.iter().enumerate() { if self.contains(*byte) { return Some(idx); } } None } } // CharSet helper. Avoid branching in the loop to get good unrolling. #[allow(unused_parens)] #[inline(always)] pub fn charset_contains(set: &[u32; MAX_CHAR_SET_LENGTH], c: u32) -> bool { let mut result = false; for &v in set.iter() { result |= (v == c); } result } /// A helper function for formatting bitmaps, using - ranges. fn format_bitmap(name: &str, f: &mut fmt::Formatter<'_>, contains: Func) -> fmt::Result where Func: Fn(u8) -> bool, { write!(f, "{}[", name)?; let mut idx = 0; let mut maybe_space = ""; while idx <= 256 { // Compute the next value not contained. let mut end = idx; while end <= 256 && contains(end as u8) { end += 1; } match end - idx { 0 => (), 1 => write!(f, "{}{}", maybe_space, idx)?, _ => write!(f, "{}{}-{}", maybe_space, idx, end - 1)?, }; if end > idx { maybe_space = " "; } idx = end + 1 } write!(f, "]")?; Ok(()) } /// A bitmap covering ASCII characters. #[derive(Default, Copy, Clone)] #[repr(align(4))] pub struct AsciiBitmap(pub [u8; 16]); impl AsciiBitmap { /// Set a byte val in this bitmap. #[inline(always)] pub fn set(&mut self, val: u8) { debug_assert!(val <= 127, "Value should be ASCII"); self.0[(val >> 3) as usize] |= 1 << (val & 0x7); } } impl fmt::Debug for AsciiBitmap { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { format_bitmap("AsciiBitmap", f, |v| self.contains(v)) } } impl ByteSet for AsciiBitmap { /// \return whether this bitmap contains a given value. /// The value does NOT have to be ASCII. #[inline(always)] fn contains(&self, val: u8) -> bool { // Delicate tricks to avoid branches. // In general we want to compute the byte via /8, and then mask into the // byte. But if the value is not ASCII then the byte could be too large. // So mask off the MSB so that the byte is always in range. let byte = (val & 0x7F) >> 3; let bit = val & 0x7; // Now probe the bitmap. If our sign bit was set, we want the mask to be 0; // otherwise we want to set only the 'bit' offset. // Invert the sign bit and reuse it. let mask = ((val >> 7) ^ 1) << bit; // Probe the bitmap. We expect the compiler to elide the bounds check. (self.0[byte as usize] & mask) != 0 } } /// A bitmap covering all bytes. #[derive(Default, Copy, Clone, PartialEq, Eq)] #[repr(align(4))] pub struct ByteBitmap([u16; 16]); // TODO: the codegen here is pretty horrible; LLVM is emitting a sequence of // halfword instructions. Consider using a union? impl ByteBitmap { /// Construct from a sequence of bytes. pub fn new(bytes: &[u8]) -> ByteBitmap { let mut bb = ByteBitmap::default(); for &b in bytes { bb.set(b) } bb } /// \return whether this bitmap contains a given byte val. #[inline(always)] pub fn contains(&self, val: u8) -> bool { let byte = val >> 4; let bit = val & 0xF; (self.0[byte as usize] & (1 << bit)) != 0 } /// Set a bit in this bitmap. #[inline(always)] pub fn set(&mut self, val: u8) { let byte = val >> 4; let bit = val & 0xF; self.0[byte as usize] |= 1 << bit; } /// Update ourselves from another bitmap, in place. pub fn bitor(&mut self, rhs: &ByteBitmap) { for idx in 0..self.0.len() { self.0[idx] |= rhs.0[idx]; } } /// Invert our bits, in place. pub fn bitnot(&mut self) -> &mut Self { for val in self.0.iter_mut() { *val = !*val; } self } /// Count number of set bits. pub fn count_bits(&self) -> u32 { self.0.iter().map(|v| v.count_ones()).sum() } /// Return ourselves as an array of a fixed length. /// Panics if the array is not large enough. #[allow(clippy::wrong_self_convention)] #[inline(always)] pub fn as_array(&self) -> [u8; N] { let mut array = [0u8; N]; let mut idx = 0; for byte in 0..=255 { if self.contains(byte) { array[idx] = byte; idx += 1; } } array } /// \return the index of the first byte in the slice that is present in this /// bitmap, using some unsafe tricks. #[inline(always)] fn unsafe_find_in_slice(&self, bytes: &[u8]) -> Option { type Chunk = u32; let bm = &self.0; let mut offset = 0; let (prefix, body, suffix) = unsafe { bytes.align_to::() }; for &byte in prefix.iter() { if self.contains(byte) { return Some(offset); } offset += 1; } for &chunk in body { // Use LE. Here index 0 is the earliest address. let byte_idxs = ((chunk >> 4) & 0x0F0F0F0F).to_le_bytes(); let bit_idxs = (chunk & 0x0F0F0F0F).to_le_bytes(); if (bm[byte_idxs[0] as usize] & (1 << bit_idxs[0])) != 0 { return Some(offset); } if (bm[byte_idxs[1] as usize] & (1 << bit_idxs[1])) != 0 { return Some(offset + 1); } if (bm[byte_idxs[2] as usize] & (1 << bit_idxs[2])) != 0 { return Some(offset + 2); } if (bm[byte_idxs[3] as usize] & (1 << bit_idxs[3])) != 0 { return Some(offset + 3); } offset += 4; } for &byte in suffix.iter() { if self.contains(byte) { return Some(offset); } offset += 1; } None } } impl ByteSearcher for ByteBitmap { #[inline(always)] fn find_in(&self, bytes: &[u8]) -> Option { if cfg!(feature = "prohibit-unsafe") { for (idx, byte) in bytes.iter().enumerate() { if self.contains(*byte) { return Some(idx); } } None } else { self.unsafe_find_in_slice(bytes) } } } impl fmt::Debug for ByteBitmap { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { format_bitmap("ByteBitmap", f, |v| self.contains(v)) } } /// A trivial ByteSearcher corresponding to the empty string. #[derive(Debug, Copy, Clone)] pub struct EmptyString {} impl ByteSearcher for EmptyString { #[inline(always)] fn find_in(&self, _bytes: &[u8]) -> Option { Some(0) } } #[cfg(test)] mod tests { use super::*; fn make_bitmap(bytes: &[u8]) -> ByteBitmap { let mut bm = ByteBitmap::default(); for &b in bytes { bm.set(b) } bm } #[test] fn empty_search() { assert_eq!(EmptyString {}.find_in(&[1, 2, 3]), Some(0)); assert_eq!(EmptyString {}.find_in(&[]), Some(0)); } #[test] fn bitmap_search() { assert_eq!(make_bitmap(&[]).find_in(&[1, 2, 3]), None); assert_eq!(make_bitmap(&[]).bitnot().find_in(&[1, 2, 3]), Some(0)); assert_eq!(make_bitmap(&[1]).bitnot().find_in(&[1, 2, 3]), Some(1)); assert_eq!(make_bitmap(&[2]).bitnot().find_in(&[1, 2, 3]), Some(0)); assert_eq!( make_bitmap(&[4, 5, 6, 7]).find_in(&[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]), None ); assert_eq!( make_bitmap(&[4, 5, 6, 7]).find_in(&[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]), None ); assert_eq!( make_bitmap(&[4, 5, 6, 7]) .find_in(&[8, 9, 10, 11, 12, 13, 4, 14, 6, 15, 7, 16, 17, 18, 19, 20]), Some(6) ); } #[test] fn literal_search() { assert_eq!([0, 1, 2, 3].find_in(&[4, 5, 6, 7]), None); assert_eq!([0, 1, 2, 3].find_in(&[]), None); } } regress-0.10.5/src/charclasses.rs000064400000000000000000000043771046102023000150240ustar 00000000000000use crate::codepointset::Interval; // Character classes like \d or \S. /// Construct an interval from an inclusive range of char. const fn r(first: char, last: char) -> Interval { Interval { first: first as u32, last: last as u32, } } /// Construct an interval from a single char. const fn r1(c: char) -> Interval { Interval { first: c as u32, last: c as u32, } } // Note all of these are sorted. /// ES9 21.2.2.6.1. pub const WORD_CHARS: [Interval; 4] = [r('0', '9'), r('A', 'Z'), r1('_'), r('a', 'z')]; /// ES9 21.2.2.12 pub const DIGITS: [Interval; 1] = [r('0', '9')]; /// [`ES13 12.2 White Space`][spec] /// /// [spec]: https://262.ecma-international.org/13.0/#prod-WhiteSpace pub const WHITESPACE: [Interval; 9] = [ // U+0009 - Character Tabulation - // U+000B - Line Tabulation - // U+000C - Form Feed (FF) - r('\u{0009}', '\u{000C}'), // From unicode “Space_Separator” (`Zs`) category: // // U+0020 - Space - r1('\u{0020}'), // From unicode “Space_Separator” (`Zs`) category: // // U+00A0 - No-Break Space - r1('\u{00A0}'), // From unicode “Space_Separator” (`Zs`) category: // // U+1680 - Ogham Space Mark r1('\u{1680}'), // From unicode “Space_Separator” (`Zs`) category: // // U+2000 - En Quad // U+2001 - Em Quad // U+2002 - En Space // U+2003 - Em Space // U+2004 - Three-Per-Em Space // U+2005 - Four-Per-Em Space // U+2006 - Six-Per-Em Space // U+2007 - Figure Space // U+2008 - Punctuation Space // U+2009 - Thin Space // U+200A - Hair Space r('\u{2000}', '\u{200A}'), // From unicode “Space_Separator” (`Zs`) category: // // U+202F - Narrow No-Break Space - r1('\u{202F}'), // From unicode “Space_Separator” (`Zs`) category: // // U+205F - Medium Mathematical Space - r1('\u{205F}'), // From unicode “Space_Separator” (`Zs`) category: // // U+3000 - Ideographic Space r1('\u{3000}'), // U+FEFF - ZERO WIDTH NO-BREAK SPACE - r1('\u{FEFF}'), ]; /// ES9 11.3 pub const LINE_TERMINATOR: [Interval; 3] = [r1('\u{000A}'), r1('\u{000D}'), r('\u{2028}', '\u{2029}')]; regress-0.10.5/src/classicalbacktrack.rs000064400000000000000000001304671046102023000163350ustar 00000000000000//! Classical backtracking execution engine use crate::api::Match; use crate::bytesearch; use crate::cursor; use crate::cursor::{Backward, Direction, Forward}; use crate::exec; use crate::indexing; use crate::indexing::{AsciiInput, ElementType, InputIndexer, Utf8Input}; #[cfg(not(feature = "utf16"))] use crate::insn::StartPredicate; use crate::insn::{CompiledRegex, Insn, LoopFields}; use crate::matchers; use crate::matchers::CharProperties; use crate::position::PositionType; use crate::scm; use crate::scm::SingleCharMatcher; use crate::types::{CaptureGroupID, GroupData, IP, LoopData, LoopID, MAX_CAPTURE_GROUPS}; use crate::util::DebugCheckIndex; #[cfg(not(feature = "std"))] use alloc::vec::Vec; use core::ops::Range; #[derive(Clone, Debug)] enum BacktrackInsn { /// Nothing more to backtrack. /// This "backstops" our stack. Exhausted, /// Restore the IP and position. SetPosition { ip: IP, pos: Input::Position }, SetLoopData { id: LoopID, data: LoopData, }, SetCaptureGroup { id: CaptureGroupID, data: GroupData, }, EnterNonGreedyLoop { // The IP of the loop. // This is guaranteed to point to an EnterLoopInsn. ip: IP, // The input position of the loop before entering it. // This is used to set up backtracking that restores this position. orig_pos: Input::Position, data: LoopData, }, GreedyLoop1Char { continuation: IP, min: Input::Position, max: Input::Position, }, NonGreedyLoop1Char { continuation: IP, min: Input::Position, max: Input::Position, }, } #[derive(Debug, Default)] struct State { loops: Vec>, groups: Vec>, } #[derive(Debug)] pub(crate) struct MatchAttempter<'a, Input: InputIndexer> { re: &'a CompiledRegex, bts: Vec>, s: State, } impl<'a, Input: InputIndexer> MatchAttempter<'a, Input> { pub(crate) fn new(re: &'a CompiledRegex, entry: Input::Position) -> Self { Self { re, bts: vec![BacktrackInsn::Exhausted], s: State { loops: vec![LoopData::new(entry); re.loops as usize], groups: vec![GroupData::new(); re.groups as usize], }, } } #[inline(always)] fn push_backtrack(&mut self, bt: BacktrackInsn) { self.bts.push(bt) } #[inline(always)] fn pop_backtrack(&mut self) { // Note we never pop the last instruction so this will never be empty. debug_assert!(!self.bts.is_empty()); if cfg!(feature = "prohibit-unsafe") { self.bts.pop(); } else { unsafe { self.bts.set_len(self.bts.len() - 1) } } } fn prepare_to_enter_loop( bts: &mut Vec>, pos: Input::Position, loop_fields: &LoopFields, loop_data: &mut LoopData, ) { bts.push(BacktrackInsn::SetLoopData { id: loop_fields.loop_id, data: *loop_data, }); loop_data.iters += 1; loop_data.entry = pos; } fn run_loop( &mut self, loop_fields: &'a LoopFields, pos: Input::Position, ip: IP, ) -> Option { let loop_data = &mut self.s.loops[loop_fields.loop_id as usize]; let iteration = loop_data.iters; let do_taken = iteration < loop_fields.max_iters; let do_not_taken = iteration >= loop_fields.min_iters; let loop_taken_ip = ip + 1; let loop_not_taken_ip = loop_fields.exit as IP; // If we have looped more than the minimum number of iterations, reject empty // matches. ES6 21.2.2.5.1 Note 4: "once the minimum number of // repetitions has been satisfied, any more expansions of Atom that match the // empty character sequence are not considered for further repetitions." if loop_data.entry == pos && iteration > loop_fields.min_iters { return None; } match (do_taken, do_not_taken) { (false, false) => { // No arms viable. None } (false, true) => { // Only skipping is viable. Some(loop_not_taken_ip) } (true, false) => { // Only entering is viable. MatchAttempter::prepare_to_enter_loop(&mut self.bts, pos, loop_fields, loop_data); Some(loop_taken_ip) } (true, true) if !loop_fields.greedy => { // Both arms are viable; backtrack into the loop. let orig_pos = loop_data.entry; loop_data.entry = pos; self.bts.push(BacktrackInsn::EnterNonGreedyLoop { ip, orig_pos, data: *loop_data, }); Some(loop_not_taken_ip) } (true, true) => { debug_assert!(loop_fields.greedy, "Should be greedy"); // Both arms are viable; backtrack out of the loop. self.bts.push(BacktrackInsn::SetPosition { ip: loop_not_taken_ip, pos, }); MatchAttempter::prepare_to_enter_loop(&mut self.bts, pos, loop_fields, loop_data); Some(loop_taken_ip) } } } // Drive the loop up to \p max times. // \return the position (min, max), or None on failure. #[inline(always)] fn run_scm_loop_impl>( input: &Input, mut pos: Input::Position, min: usize, max: usize, dir: Dir, matcher: Scm, ) -> Option<(Input::Position, Input::Position)> { debug_assert!(min <= max, "min should be <= max"); // Drive the iteration min times. // That tells us the min position. for _ in 0..min { if !matcher.matches(input, dir, &mut pos) { return None; } } let min_pos = pos; // Drive it up to the max. for _ in 0..(max - min) { let saved = pos; if !matcher.matches(input, dir, &mut pos) { pos = saved; break; } } let max_pos = pos; Some((min_pos, max_pos)) } // Compute the maximum position from a starting position, up to a limit. // This is used for lazy computation in non-greedy loops. fn compute_max_pos>( input: &Input, mut pos: Input::Position, limit: usize, dir: Dir, matcher: Scm, ) -> Input::Position { for _ in 0..limit { let saved = pos; if !matcher.matches(input, dir, &mut pos) { pos = saved; break; } } pos } // Helper function to extract the duplicated match blocks that handle different instruction types // with different matcher functions. This significantly reduces code duplication and compile times. fn with_scm_loop_impl( re: &CompiledRegex, input: &Input, pos: Input::Position, min: usize, max: usize, dir: Dir, ip: IP, ) -> Option<(Input::Position, Input::Position)> { match re.insns.iat(ip + 1) { &Insn::Char(c) => { let c = <::Element as ElementType>::try_from(c)?; Self::run_scm_loop_impl(input, pos, min, max, dir, scm::Char { c }) } &Insn::CharICase(c) => { let c = <::Element as ElementType>::try_from(c)?; Self::run_scm_loop_impl(input, pos, min, max, dir, scm::CharICase { c }) } &Insn::Bracket(idx) => { let bc = &re.brackets[idx]; Self::run_scm_loop_impl(input, pos, min, max, dir, scm::Bracket { bc }) } Insn::AsciiBracket(bitmap) => Self::run_scm_loop_impl( input, pos, min, max, dir, scm::MatchByteSet { bytes: bitmap }, ), Insn::MatchAny => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchAny::new()) } Insn::MatchAnyExceptLineTerminator => Self::run_scm_loop_impl( input, pos, min, max, dir, scm::MatchAnyExceptLineTerminator::new(), ), Insn::CharSet(chars) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::CharSet { chars }) } &Insn::ByteSet2(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteArraySet(bytes)) } &Insn::ByteSet3(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteArraySet(bytes)) } &Insn::ByteSet4(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteArraySet(bytes)) } Insn::ByteSeq1(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq2(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq3(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq4(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq5(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq6(bytes) => { Self::run_scm_loop_impl(input, pos, min, max, dir, scm::MatchByteSeq(bytes)) } _ => { unreachable!("Missing SCM: {:?}", re.insns.iat(ip + 1)); } } } // Helper function for compute_max_pos to avoid duplication fn with_scm_compute_max( re: &CompiledRegex, input: &Input, pos: Input::Position, limit: usize, dir: Dir, ip: IP, ) -> Option { let result = match re.insns.iat(ip + 1) { &Insn::Char(c) => { let c = <::Element as ElementType>::try_from(c)?; Self::compute_max_pos(input, pos, limit, dir, scm::Char { c }) } &Insn::CharICase(c) => { let c = <::Element as ElementType>::try_from(c)?; Self::compute_max_pos(input, pos, limit, dir, scm::CharICase { c }) } &Insn::Bracket(idx) => { let bc = &re.brackets[idx]; Self::compute_max_pos(input, pos, limit, dir, scm::Bracket { bc }) } Insn::AsciiBracket(bitmap) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteSet { bytes: bitmap }) } Insn::MatchAny => Self::compute_max_pos(input, pos, limit, dir, scm::MatchAny::new()), Insn::MatchAnyExceptLineTerminator => Self::compute_max_pos( input, pos, limit, dir, scm::MatchAnyExceptLineTerminator::new(), ), Insn::CharSet(chars) => { Self::compute_max_pos(input, pos, limit, dir, scm::CharSet { chars }) } &Insn::ByteSet2(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteArraySet(bytes)) } &Insn::ByteSet3(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteArraySet(bytes)) } &Insn::ByteSet4(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteArraySet(bytes)) } Insn::ByteSeq1(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq2(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq3(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq4(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq5(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteSeq(bytes)) } Insn::ByteSeq6(bytes) => { Self::compute_max_pos(input, pos, limit, dir, scm::MatchByteSeq(bytes)) } _ => { unreachable!("Missing SCM: {:?}", re.insns.iat(ip + 1)); } }; Some(result) } // Given that ip points at a loop whose body matches exactly one character, run // a "single character loop". The big idea here is that we don't need to save // our position every iteration: we know that our loop body matches a single // character so we can backtrack by matching a character backwards. // \return the next IP, or None if the loop failed. #[allow(clippy::too_many_arguments)] fn run_scm_loop( &mut self, input: &Input, dir: Dir, pos: &mut Input::Position, min: usize, max: usize, ip: IP, greedy: bool, ) -> Option { // For non-greedy loops, we can avoid computing the maximum match eagerly. // We'll only compute it when we need to set up backtracking. let (min_pos, max_pos) = if greedy { // For greedy loops, compute both min and max positions Self::with_scm_loop_impl(self.re, input, *pos, min, max, dir, ip)? } else { // For non-greedy loops, initially only compute the minimum position let (min_pos, _) = Self::with_scm_loop_impl(self.re, input, *pos, min, min, dir, ip)?; // For non-greedy loops, we only compute the max position if we need to set up backtracking let max_pos = if min < max { // We need to compute the max for backtracking purposes Self::with_scm_compute_max(self.re, input, min_pos, max - min, dir, ip)? } else { min_pos }; (min_pos, max_pos) }; debug_assert!( if Dir::FORWARD { min_pos <= max_pos } else { min_pos >= max_pos }, "min should be <= (>=) max if cursor is tracking forwards (backwards)" ); // Oh no where is the continuation? It's one past the loop body, which is one // past the loop. Strap in! let continuation = ip + 2; if min_pos != max_pos { // Backtracking is possible. let bti = if greedy { BacktrackInsn::GreedyLoop1Char { continuation, min: min_pos, max: max_pos, } } else { BacktrackInsn::NonGreedyLoop1Char { continuation, min: min_pos, max: max_pos, } }; self.bts.push(bti); } // Start at the max (min) if greedy (nongreedy). *pos = if greedy { max_pos } else { min_pos }; Some(continuation) } // Run a lookaround instruction, which is either forwards or backwards // (according to Direction). The half-open range // start_group..end_group is the range of contained capture groups. // \return whether we matched and negate was false, or did not match but negate // is true. fn run_lookaround( &mut self, input: &Input, ip: IP, pos: Input::Position, start_group: CaptureGroupID, end_group: CaptureGroupID, negate: bool, ) -> bool { // Copy capture groups, because if the match fails (or if we are inverted) // we need to restore these. let range = (start_group as usize)..(end_group as usize); // TODO: consider retaining storage here? // Temporarily defeat backtracking. let saved_groups = self.s.groups.iat(range.clone()).to_vec(); // Start with an "empty" backtrack stack. // TODO: consider using a stack-allocated array. let mut saved_bts = vec![BacktrackInsn::Exhausted]; core::mem::swap(&mut self.bts, &mut saved_bts); // Enter into the lookaround's instruction stream. let matched = self.try_at_pos(*input, ip, pos, Dir::new()).is_some(); // Put back our bts. core::mem::swap(&mut self.bts, &mut saved_bts); // If we are a positive lookahead that successfully matched, retain the // capture groups (but we need to set up backtracking). Otherwise restore // them. if matched && !negate { for (idx, cg) in saved_groups.iter().enumerate() { debug_assert!(idx + (start_group as usize) < MAX_CAPTURE_GROUPS); self.push_backtrack(BacktrackInsn::SetCaptureGroup { id: (idx as CaptureGroupID) + start_group, data: *cg, }); } } else { self.s.groups.splice(range, saved_groups); } matched != negate } /// Attempt to backtrack. /// \return true if we backtracked, false if we exhaust the backtrack stack. fn try_backtrack( &mut self, input: &Input, ip: &mut IP, pos: &mut Input::Position, _dir: Dir, ) -> bool { loop { // We always have a single Exhausted instruction backstopping our stack, // so we do not need to check for empty bts. debug_assert!(!self.bts.is_empty(), "Backtrack stack should not be empty"); let bt = match self.bts.last_mut() { Some(bt) => bt, None => rs_unreachable!("BT stack should never be empty"), }; match bt { BacktrackInsn::Exhausted => return false, BacktrackInsn::SetPosition { ip: saved_ip, pos: saved_pos, } => { *ip = *saved_ip; *pos = *saved_pos; self.pop_backtrack(); return true; } BacktrackInsn::SetLoopData { id, data } => { *self.s.loops.mat(*id as usize) = *data; self.pop_backtrack(); } BacktrackInsn::SetCaptureGroup { id, data } => { *self.s.groups.mat(*id as usize) = *data; self.pop_backtrack(); } &mut BacktrackInsn::EnterNonGreedyLoop { ip: loop_ip, orig_pos, data, } => { *ip = loop_ip + 1; *pos = data.entry; let loop_fields = match &self.re.insns.iat(loop_ip) { Insn::EnterLoop(loop_fields) => loop_fields, _ => rs_unreachable!("EnterNonGreedyLoop must point at a loop instruction"), }; let loop_data = self.s.loops.mat(loop_fields.loop_id as usize); // Need to restore the position should we backtrack out of the loop (#131). *bt = BacktrackInsn::SetLoopData { id: loop_fields.loop_id, data: LoopData { entry: orig_pos, ..data }, }; *loop_data = data; MatchAttempter::prepare_to_enter_loop( &mut self.bts, *pos, loop_fields, loop_data, ); return true; } BacktrackInsn::GreedyLoop1Char { continuation, min, max, } => { // The match failed at the max location. debug_assert!( if Dir::FORWARD { max >= min } else { max <= min }, "max should be >= min (or <= if tracking backwards)" ); // If min is equal to max, there is no more backtracking to be done; // otherwise move opposite the direction of the cursor. if *max == *min { // We have backtracked this loop as far as possible. self.bts.pop(); continue; } let newmax = if Dir::FORWARD { input.next_left_pos(*max) } else { input.next_right_pos(*max) }; if let Some(newmax) = newmax { *pos = newmax; *max = newmax; } else { rs_unreachable!("Should always be able to advance since min != max") } *ip = *continuation; return true; } BacktrackInsn::NonGreedyLoop1Char { continuation, min, max, } => { // The match failed at the min location. debug_assert!( if Dir::FORWARD { max >= min } else { max <= min }, "max should be >= min (or <= if tracking backwards)" ); if *max == *min { // We have backtracked this loop as far as possible. self.bts.pop(); continue; } // Move in the direction of the cursor. let newmin = if Dir::FORWARD { input.next_right_pos(*min) } else { input.next_left_pos(*min) }; if let Some(newmin) = newmin { *pos = newmin; *min = newmin; } else { rs_unreachable!("Should always be able to advance since min != max") } *ip = *continuation; return true; } } } } /// Attempt to match at a given IP and position. fn try_at_pos( &mut self, inp: Input, mut ip: IP, mut pos: Input::Position, dir: Dir, ) -> Option { debug_assert!( self.bts.len() == 1, "Should be only initial exhausted backtrack insn" ); // TODO: we are inconsistent about passing Input by reference or value. let input = &inp; let re = self.re; // These are not really loops, they are just labels that we effectively 'goto' // to. #[allow(clippy::never_loop)] 'nextinsn: loop { 'backtrack: loop { // Helper macro to either increment ip and go to the next insn, or backtrack. macro_rules! next_or_bt { ($e:expr) => { if $e { ip += 1; continue 'nextinsn; } else { break 'backtrack; } }; } match re.insns.iat(ip) { &Insn::Char(c) => { let m = match <::Element as ElementType>::try_from(c) { Some(c) => scm::Char { c }.matches(input, dir, &mut pos), None => false, }; next_or_bt!(m); } Insn::CharSet(chars) => { let m = scm::CharSet { chars }.matches(input, dir, &mut pos); next_or_bt!(m); } &Insn::ByteSet2(bytes) => { next_or_bt!(scm::MatchByteArraySet(bytes).matches(input, dir, &mut pos)) } &Insn::ByteSet3(bytes) => { next_or_bt!(scm::MatchByteArraySet(bytes).matches(input, dir, &mut pos)) } &Insn::ByteSet4(bytes) => { next_or_bt!(scm::MatchByteArraySet(bytes).matches(input, dir, &mut pos)) } Insn::ByteSeq1(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq2(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq3(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq4(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq5(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq6(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq7(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq8(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq9(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq10(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq11(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq12(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq13(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq14(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq15(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } Insn::ByteSeq16(v) => { next_or_bt!(cursor::try_match_lit(input, dir, &mut pos, v)) } &Insn::CharICase(c) => { let m = match <::Element as indexing::ElementType>::try_from(c) { Some(c) => scm::CharICase { c }.matches(input, dir, &mut pos), None => false, }; next_or_bt!(m) } Insn::AsciiBracket(bitmap) => next_or_bt!( scm::MatchByteSet { bytes: bitmap }.matches(input, dir, &mut pos) ), &Insn::Bracket(idx) => { next_or_bt!( scm::Bracket { bc: &self.re.brackets[idx] } .matches(input, dir, &mut pos) ) } Insn::MatchAny => { next_or_bt!(scm::MatchAny::new().matches(input, dir, &mut pos)) } Insn::MatchAnyExceptLineTerminator => { next_or_bt!( scm::MatchAnyExceptLineTerminator::new().matches(input, dir, &mut pos) ) } &Insn::WordBoundary { invert } => { // Copy the positions since these destructively move them. let prev_wordchar = input .peek_left(pos) .is_some_and(Input::CharProps::is_word_char); let curr_wordchar = input .peek_right(pos) .is_some_and(Input::CharProps::is_word_char); let is_boundary = prev_wordchar != curr_wordchar; next_or_bt!(is_boundary != invert) } Insn::StartOfLine { multiline } => { let multiline = *multiline; let matches = match input.peek_left(pos) { None => true, Some(c) if multiline && Input::CharProps::is_line_terminator(c) => true, _ => false, }; next_or_bt!(matches) } Insn::EndOfLine { multiline } => { let multiline = *multiline; let matches = match input.peek_right(pos) { None => true, // we're at the right of the string Some(c) if multiline && Input::CharProps::is_line_terminator(c) => true, _ => false, }; next_or_bt!(matches) } &Insn::Jump { target } => { ip = target as usize; continue 'nextinsn; } &Insn::BeginCaptureGroup(cg_idx) => { let cg = self.s.groups.mat(cg_idx as usize); self.bts.push(BacktrackInsn::SetCaptureGroup { id: cg_idx, data: *cg, }); if Dir::FORWARD { cg.start = Some(pos); debug_assert!( cg.end.is_none(), "Should not have already exited capture group we are entering" ) } else { cg.end = Some(pos); debug_assert!( cg.start.is_none(), "Should not have already exited capture group we are entering" ) } next_or_bt!(true) } &Insn::EndCaptureGroup(cg_idx) => { let cg = self.s.groups.mat(cg_idx as usize); if Dir::FORWARD { debug_assert!( cg.start_matched(), "Capture group should have been entered" ); cg.end = Some(pos); } else { debug_assert!( cg.end_matched(), "Capture group should have been entered" ); cg.start = Some(pos) } next_or_bt!(true) } &Insn::ResetCaptureGroup(cg_idx) => { let cg = self.s.groups.mat(cg_idx as usize); self.bts.push(BacktrackInsn::SetCaptureGroup { id: cg_idx, data: *cg, }); cg.reset(); next_or_bt!(true) } &Insn::BackRef(cg_idx) => { let cg = self.s.groups.mat(cg_idx as usize); // Backreferences to a capture group that did not match always succeed (ES5 // 15.10.2.9). // Note we may be in the capture group we are examining, e.g. /(abc\1)/. let matched; if let Some(orig_range) = cg.as_range() { if re.flags.icase { matched = matchers::backref_icase(input, dir, orig_range, &mut pos); } else { matched = matchers::backref(input, dir, orig_range, &mut pos); } } else { // This group has not been exited and so the match succeeds (ES6 // 21.2.2.9). matched = true; } next_or_bt!(matched) } &Insn::Lookahead { negate, start_group, end_group, continuation, } => { if self.run_lookaround::( input, ip + 1, pos, start_group, end_group, negate, ) { ip = continuation as IP; continue 'nextinsn; } else { break 'backtrack; } } &Insn::Lookbehind { negate, start_group, end_group, continuation, } => { if self.run_lookaround::( input, ip + 1, pos, start_group, end_group, negate, ) { ip = continuation as IP; continue 'nextinsn; } else { break 'backtrack; } } &Insn::Alt { secondary } => { self.push_backtrack(BacktrackInsn::SetPosition { ip: secondary as IP, pos, }); next_or_bt!(true); } Insn::EnterLoop(fields) => { // Entering a loop, not re-entering it. self.s.loops.mat(fields.loop_id as usize).iters = 0; match self.run_loop(fields, pos, ip) { Some(next_ip) => { ip = next_ip; continue 'nextinsn; } None => { break 'backtrack; } } } &Insn::LoopAgain { begin } => { let act = match re.insns.iat(begin as IP) { Insn::EnterLoop(fields) => self.run_loop(fields, pos, begin as IP), _ => rs_unreachable!("EnterLoop should always refer to loop field"), }; match act { Some(next_ip) => { ip = next_ip; continue 'nextinsn; } None => break 'backtrack, } } &Insn::Loop1CharBody { min_iters, max_iters, greedy, } => { if let Some(next_ip) = self .run_scm_loop(input, dir, &mut pos, min_iters, max_iters, ip, greedy) { ip = next_ip; continue 'nextinsn; } else { break 'backtrack; } } Insn::Goal => { // Keep all but the initial give-up bts. self.bts.truncate(1); return Some(pos); } Insn::JustFail => { break 'backtrack; } } } // This after the backtrack loop. // A break 'backtrack will jump here. if self.try_backtrack(input, &mut ip, &mut pos, dir) { continue 'nextinsn; } else { // We have exhausted the backtracking stack. debug_assert!(self.bts.len() == 1, "Should have exhausted backtrack stack"); return None; } } // This is outside the nextinsn loop. // It is an error to get here. // Every instruction should either continue 'nextinsn, or break 'backtrack. { #![allow(unreachable_code)] rs_unreachable!("Should not fall to end of nextinsn loop") } } } #[derive(Debug)] pub struct BacktrackExecutor<'r, Input: InputIndexer> { input: Input, matcher: MatchAttempter<'r, Input>, } #[cfg(feature = "utf16")] impl<'r, Input: InputIndexer> BacktrackExecutor<'r, Input> { pub(crate) fn new(input: Input, matcher: MatchAttempter<'r, Input>) -> Self { Self { input, matcher } } } impl BacktrackExecutor<'_, Input> { fn successful_match(&mut self, start: Input::Position, end: Input::Position) -> Match { // We want to simultaneously map our groups to offsets, and clear the groups. // A for loop is the easiest way to do this while satisfying the borrow checker. // TODO: avoid allocating so much. let mut captures = Vec::new(); captures.reserve_exact(self.matcher.s.groups.len()); for gd in self.matcher.s.groups.iter_mut() { captures.push(match gd.as_range() { Some(r) => Some(Range { start: self.input.pos_to_offset(r.start), end: self.input.pos_to_offset(r.end), }), None => None, }); gd.start = None; gd.end = None; } Match { range: self.input.pos_to_offset(start)..self.input.pos_to_offset(end), captures, group_names: self.matcher.re.group_names.clone(), } } /// \return the next match for an anchored regex that only matches at the start. /// This avoids any string searching and only tries matching at the given position. #[cfg(not(feature = "utf16"))] fn next_match_anchored( &mut self, pos: Input::Position, next_start: &mut Option, ) -> Option { let inp = self.input; // For anchored regexes, only try matching at the current position if let Some(end) = self.matcher.try_at_pos(inp, 0, pos, Forward::new()) { // If we matched the empty string, we have to increment. if end != pos { *next_start = Some(end) } else { *next_start = inp.next_right_pos(end); } Some(self.successful_match(pos, end)) } else { // Anchored regex failed to match at this position, no more matches None } } /// \return the next match, searching the remaining bytes using the given /// prefix searcher to quickly find the first potential match location. fn next_match_with_prefix_search( &mut self, mut pos: Input::Position, next_start: &mut Option, prefix_search: &PrefixSearch, ) -> Option { let inp = self.input; loop { // Find the next start location, or None if none. // Don't try this unless CODE_UNITS_ARE_BYTES - i.e. don't do byte searches // on UTF-16 or UCS2. if Input::CODE_UNITS_ARE_BYTES { pos = inp.find_bytes(pos, prefix_search)?; } if let Some(end) = self.matcher.try_at_pos(inp, 0, pos, Forward::new()) { // If we matched the empty string, we have to increment. if end != pos { *next_start = Some(end) } else { *next_start = inp.next_right_pos(end); } return Some(self.successful_match(pos, end)); } // Didn't find it at this position, try the next one. pos = inp.next_right_pos(pos)?; } } } impl exec::MatchProducer for BacktrackExecutor<'_, Input> { type Position = Input::Position; fn initial_position(&self, offset: usize) -> Option { self.input.try_move_right(self.input.left_end(), offset) } fn next_match( &mut self, pos: Input::Position, next_start: &mut Option, ) -> Option { // When UTF-16 support is active prefix search is not used due to the different encoding. #[cfg(feature = "utf16")] return self.next_match_with_prefix_search(pos, next_start, &bytesearch::EmptyString {}); #[cfg(not(feature = "utf16"))] match &self.matcher.re.start_pred { StartPredicate::Arbitrary => { self.next_match_with_prefix_search(pos, next_start, &bytesearch::EmptyString {}) } StartPredicate::StartAnchored => self.next_match_anchored(pos, next_start), StartPredicate::ByteSet1(bytes) => { self.next_match_with_prefix_search(pos, next_start, bytes) } StartPredicate::ByteSet2(bytes) => { self.next_match_with_prefix_search(pos, next_start, bytes) } StartPredicate::ByteSet3(bytes) => { self.next_match_with_prefix_search(pos, next_start, bytes) } StartPredicate::ByteSeq(bytes) => { self.next_match_with_prefix_search(pos, next_start, bytes.as_ref()) } StartPredicate::ByteBracket(bitmap) => { self.next_match_with_prefix_search(pos, next_start, bitmap) } } } } impl<'r, 't> exec::Executor<'r, 't> for BacktrackExecutor<'r, Utf8Input<'t>> { type AsAscii = BacktrackExecutor<'r, AsciiInput<'t>>; fn new(re: &'r CompiledRegex, text: &'t str) -> Self { let input = Utf8Input::new(text, re.flags.unicode); Self { input, matcher: MatchAttempter::new(re, input.left_end()), } } } impl<'r, 't> exec::Executor<'r, 't> for BacktrackExecutor<'r, AsciiInput<'t>> { type AsAscii = BacktrackExecutor<'r, AsciiInput<'t>>; fn new(re: &'r CompiledRegex, text: &'t str) -> Self { let input = AsciiInput::new(text); Self { input, matcher: MatchAttempter::new(re, input.left_end()), } } } regress-0.10.5/src/codepointset.rs000064400000000000000000000361151046102023000152240ustar 00000000000000use crate::util::SliceHelp; #[cfg(not(feature = "std"))] use alloc::vec::Vec; use core::cmp::{self, Ordering}; pub type CodePoint = u32; /// The maximum (inclusive) code point. pub const CODE_POINT_MAX: CodePoint = 0x10FFFF; /// An inclusive range of code points. /// This is more efficient than InclusiveRange because it does not need to carry /// around the `Option`. #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub struct Interval { pub(crate) first: CodePoint, pub(crate) last: CodePoint, } /// A list of sorted, inclusive, non-empty ranges of code points. impl Interval { pub(crate) const fn new(first: CodePoint, last: CodePoint) -> Interval { debug_assert!(first <= last); Interval { first, last } } #[inline(always)] pub fn compare(self, cp: u32) -> Ordering { if self.first > cp { Ordering::Greater } else if self.last < cp { Ordering::Less } else { Ordering::Equal } } /// Return whether self is before rhs. fn is_before(self, other: Interval) -> bool { self.last < other.first } /// Return whether self is strictly before rhs. /// "Strictly" here means there is at least one value after the end of self, /// and before the start of rhs. Overlapping *or abutting* intervals are /// not considered strictly before. fn is_strictly_before(self, rhs: Interval) -> bool { self.last + 1 < rhs.first } /// Compare two intervals. /// Overlapping *or abutting* intervals are considered equal. fn mergecmp(self, rhs: Interval) -> cmp::Ordering { if self.is_strictly_before(rhs) { Ordering::Less } else if rhs.is_strictly_before(self) { Ordering::Greater } else { Ordering::Equal } } /// Return whether self is mergeable with rhs. fn mergeable(self, rhs: Interval) -> bool { self.mergecmp(rhs) == Ordering::Equal } /// Return whether self contains a code point \p cp. pub fn contains(self, cp: CodePoint) -> bool { self.first <= cp && cp <= self.last } /// Return whether self overlaps 'other'. /// Overlaps means that we share at least one code point with 'other'. pub fn overlaps(self, other: Interval) -> bool { !self.is_before(other) && !other.is_before(self) } /// Return the interval of codepoints. pub fn codepoints(self) -> core::ops::Range { debug_assert!(self.last + 1 > self.last, "Overflow"); self.first..(self.last + 1) } /// Return the number of contained code points. pub fn count_codepoints(self) -> usize { (self.last - self.first + 1) as usize } } pub(crate) fn interval_contains(interval: &[Interval], cp: u32) -> bool { interval.binary_search_by(|iv| iv.compare(cp)).is_ok() } /// Merge two intervals, which must be overlapping or abutting. fn merge_intervals(x: Interval, y: &Interval) -> Interval { debug_assert!(x.mergeable(*y), "Ranges not mergeable"); Interval { first: core::cmp::min(x.first, y.first), last: core::cmp::max(x.last, y.last), } } #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct CodePointSet { ivs: Vec, } /// A set of code points stored via as disjoint, non-abutting, sorted intervals. impl CodePointSet { pub fn new() -> CodePointSet { CodePointSet { ivs: Vec::new() } } pub(crate) fn clear(&mut self) { self.ivs.clear(); } // Return true if the set is empty. pub(crate) fn is_empty(&self) -> bool { self.ivs.is_empty() } // Return true if we contain all code points. pub(crate) fn contains_all_codepoints(&self) -> bool { self.ivs.len() == 1 && self.ivs[0] == Interval::new(0, CODE_POINT_MAX) } pub(crate) fn contains(&self, cp: u32) -> bool { interval_contains(&self.ivs, cp) } #[inline] fn assert_is_well_formed(&self) { if cfg!(debug_assertions) { for iv in &self.ivs { debug_assert!(iv.last <= CODE_POINT_MAX); debug_assert!(iv.first <= iv.last); } for w in self.ivs.windows(2) { debug_assert!(w[0].is_strictly_before(w[1])); } } } /// Construct from sorted, disjoint intervals. Note these are not allowed to /// even abut. pub fn from_sorted_disjoint_intervals(ivs: Vec) -> CodePointSet { let res = CodePointSet { ivs }; res.assert_is_well_formed(); res } /// Add an interval of code points to the set. pub fn add(&mut self, new_iv: Interval) { // Find the mergeable subarray, that is, the range of intervals that intersect // or abut new_iv. let mergeable = self.ivs.equal_range_by(|iv| iv.mergecmp(new_iv)); // Check our work. if cfg!(debug_assertions) { debug_assert!(new_iv.first <= new_iv.last); for (idx, iv) in self.ivs.iter().enumerate() { if idx < mergeable.start { debug_assert!(iv.is_strictly_before(new_iv)); } else if idx >= mergeable.end { debug_assert!(new_iv.is_strictly_before(*iv)); } else { debug_assert!(iv.mergeable(new_iv) && new_iv.mergeable(*iv)); } } } // Merge all the overlapping intervals (possibly none), and then replace the // range. Tests show that drain(), which modifies the vector, is not effectively // optimized, so try to avoid it in the cases of a new entry or replacing an existing // entry. match mergeable.end - mergeable.start { 0 => { // New entry. self.ivs.insert(mergeable.start, new_iv); } 1 => { // Replace a single entry. let entry = &mut self.ivs[mergeable.start]; *entry = Interval { first: cmp::min(entry.first, new_iv.first), last: cmp::max(entry.last, new_iv.last), }; } _ => { // Replace range of entries. let merged_iv: Interval = self.ivs[mergeable.clone()] .iter() .fold(new_iv, merge_intervals); self.ivs[mergeable.start] = merged_iv; self.ivs.drain(mergeable.start + 1..mergeable.end); } } self.assert_is_well_formed(); } /// Add a single code point to the set. #[inline] pub fn add_one(&mut self, cp: CodePoint) { self.add(Interval { first: cp, last: cp, }) } /// Add another code point set. pub fn add_set(&mut self, mut rhs: CodePointSet) { // Prefer to add to the set with more intervals. if self.ivs.len() < rhs.ivs.len() { core::mem::swap(self, &mut rhs); } for iv in rhs.intervals() { self.add(*iv) } } /// \return the intervals pub fn intervals(&self) -> &[Interval] { self.ivs.as_slice() } /// \return the number of intervals that would be produced by inverting. pub fn inverted_interval_count(&self) -> usize { let mut result = 0; let mut start: CodePoint = 0; for iv in &self.ivs { if start < iv.first { result += 1; } start = iv.last + 1; } if start <= CODE_POINT_MAX { result += 1; } result } /// \return an inverted set: a set containing every code point NOT in the /// receiver. pub fn inverted(&self) -> CodePointSet { // The intervals we collect. let mut inverted_ivs = Vec::new(); // The first code point *not* in the previous interval. let mut start: CodePoint = 0; for iv in &self.ivs { if start < iv.first { inverted_ivs.push(Interval { first: start, last: iv.first - 1, }) } start = iv.last + 1; } if start <= CODE_POINT_MAX { inverted_ivs.push(Interval { first: start, last: CODE_POINT_MAX, }) } CodePointSet::from_sorted_disjoint_intervals(inverted_ivs) } /// Remove the the given intervals from the set. /// /// Invariants: The intervals must be sorted and disjoint. pub(crate) fn remove(&mut self, intervals: &[Interval]) { let mut result = Vec::new(); let mut remove_iter = intervals.iter().peekable(); let mut current_remove = remove_iter.next(); for iv in &mut self.ivs { while let Some(remove_iv) = current_remove { if remove_iv.last < iv.first { current_remove = remove_iter.next(); } else if remove_iv.first > iv.last { result.push(*iv); break; } else { if remove_iv.first > iv.first { result.push(Interval { first: iv.first, last: remove_iv.first - 1, }); } if remove_iv.last < iv.last { iv.first = remove_iv.last + 1; current_remove = remove_iter.next(); } else { break; } } } if current_remove.is_none() { result.push(*iv); } } self.ivs = result; } /// Intersect the set with the given intervals. pub(crate) fn intersect(&mut self, intervals: &[Interval]) { let mut new_ivs = Vec::new(); for iv in intervals { for self_iv in self.intervals() { if iv.overlaps(*self_iv) { new_ivs.push(Interval { first: cmp::max(iv.first, self_iv.first), last: cmp::min(iv.last, self_iv.last), }); } } } self.ivs = new_ivs; } } #[cfg(test)] mod tests { use super::*; fn iv(first: u32, last: u32) -> Interval { Interval { first, last } } #[test] fn test_is_before() { let a = iv(0, 9); let b = iv(10, 19); assert!(a.is_before(b)); assert!(!b.is_before(a)); } #[test] fn test_is_strictly_before() { let a = iv(0, 9); let b = iv(10, 19); let c = iv(11, 19); assert!(!a.is_strictly_before(b)); assert!(a.is_strictly_before(c)); assert!(!b.is_strictly_before(a)); assert!(!b.is_strictly_before(c)); } #[test] fn test_mergecmp() { let a = iv(0, 9); let b = iv(10, 19); let c = iv(9, 18); assert_eq!(a.mergecmp(b), Ordering::Equal); assert_eq!(b.mergecmp(a), Ordering::Equal); assert_eq!(a.mergecmp(c), Ordering::Equal); assert_eq!(c.mergecmp(a), Ordering::Equal); let d = iv(11, 19); assert_eq!(a.mergecmp(d), Ordering::Less); assert_eq!(d.mergecmp(a), Ordering::Greater); assert_eq!(b.mergecmp(d), Ordering::Equal); assert_eq!(d.mergecmp(b), Ordering::Equal); assert_eq!(c.mergecmp(d), Ordering::Equal); assert_eq!(d.mergecmp(c), Ordering::Equal); let e = iv(100, 109); assert_eq!(a.mergecmp(e), Ordering::Less); assert_eq!(e.mergecmp(a), Ordering::Greater); } #[test] fn test_mergeable() { let a = iv(0, 9); let b = iv(9, 19); assert!(a.mergeable(a)); assert!(a.mergeable(b)); assert!(b.mergeable(b)); } #[test] fn test_contains() { let a = iv(0, 9); assert!(a.contains(0)); assert!(a.contains(9)); assert!(!a.contains(10)); } #[test] fn test_overlaps() { let a = iv(0, 9); let b = iv(5, 14); let c = iv(10, 19); assert!(a.overlaps(b)); assert!(!a.overlaps(c)); } #[test] fn test_codepoints() { let a = iv(0, 9); assert_eq!(a.codepoints(), 0..10); } #[test] fn test_count_codepoints() { assert_eq!(iv(0, 9).count_codepoints(), 10); assert_eq!(iv(0, 0).count_codepoints(), 1); assert_eq!( iv(0, CODE_POINT_MAX).count_codepoints(), (CODE_POINT_MAX + 1) as usize ); } #[test] fn test_add() { let mut set = CodePointSet::new(); set.add(iv(10, 20)); set.add(iv(30, 40)); set.add(iv(15, 35)); assert_eq!(set.intervals(), &[iv(10, 40)]); } #[test] fn test_add_one() { let mut set = CodePointSet::new(); set.add_one(10); set.add_one(20); set.add_one(15); assert_eq!(set.intervals(), &[iv(10, 10), iv(15, 15), iv(20, 20)]); } #[test] fn test_add_set() { let mut set1 = CodePointSet::new(); set1.add(iv(10, 20)); set1.add(iv(30, 40)); let mut set2 = CodePointSet::new(); set2.add(iv(15, 25)); set2.add(iv(35, 45)); set1.add_set(set2); assert_eq!(set1.intervals(), &[iv(10, 25), iv(30, 45)]); } #[test] fn test_inverted() { let mut set = CodePointSet::new(); set.add(iv(10, 20)); set.add(iv(30, 40)); let inverted_set = set.inverted(); assert_eq!( inverted_set.intervals(), &[iv(0, 9), iv(21, 29), iv(41, CODE_POINT_MAX)] ); let set_again = inverted_set.inverted(); assert_eq!(set_again.intervals(), set.intervals()); assert_eq!( set.inverted_interval_count(), inverted_set.intervals().len() ); assert_eq!( inverted_set.inverted_interval_count(), set.intervals().len() ); } #[test] fn test_adds_torture() { let mut set = CodePointSet::new(); set.add(iv(1, 3)); assert_eq!(&set.intervals(), &[iv(1, 3)]); set.add(iv(0, 0)); assert_eq!(&set.intervals(), &[iv(0, 3)]); set.add(iv(3, 5)); assert_eq!(&set.intervals(), &[iv(0, 5)]); set.add(iv(6, 10)); assert_eq!(&set.intervals(), &[iv(0, 10)]); set.add(iv(15, 15)); assert_eq!(&set.intervals(), &[iv(0, 10), iv(15, 15)]); set.add(iv(12, 14)); assert_eq!(&set.intervals(), &[iv(0, 10), iv(12, 15)]); set.add(iv(16, 20)); assert_eq!(&set.intervals(), &[iv(0, 10), iv(12, 20)]); set.add(iv(21, 22)); assert_eq!(&set.intervals(), &[iv(0, 10), iv(12, 22)]); set.add(iv(23, 23)); assert_eq!(&set.intervals(), &[iv(0, 10), iv(12, 23)]); set.add(iv(100, 200)); assert_eq!(&set.intervals(), &[iv(0, 10), iv(12, 23), iv(100, 200)]); set.add(iv(201, 250)); assert_eq!(&set.intervals(), &[iv(0, 10), iv(12, 23), iv(100, 250)]); set.add(iv(0, 0x10ffff)); assert_eq!(&set.intervals(), &[iv(0, 0x10ffff)]); } } regress-0.10.5/src/cursor.rs000064400000000000000000000034221046102023000140340ustar 00000000000000use crate::indexing::InputIndexer; #[derive(Debug, Copy, Clone)] pub struct Forward; #[derive(Debug, Copy, Clone)] pub struct Backward; pub trait Direction: core::fmt::Debug + Copy + Clone { const FORWARD: bool; fn new() -> Self; } impl Direction for Forward { const FORWARD: bool = true; #[inline(always)] fn new() -> Self { Forward {} } } impl Direction for Backward { const FORWARD: bool = false; #[inline(always)] fn new() -> Self { Backward {} } } /// \return whether we match some literal bytes. /// If so, update the position. If not, the position is unspecified. #[inline(always)] pub fn try_match_lit( input: &Input, dir: Dir, pos: &mut Input::Position, bytes: &[u8; N], ) -> bool { input.match_bytes(dir, pos, bytes) } /// \return the next character, updating the position. #[inline(always)] pub fn next( input: &Input, _dir: Dir, pos: &mut Input::Position, ) -> Option { if Dir::FORWARD { input.next_right(pos) } else { input.next_left(pos) } } /// \return the next *byte*, or None if at the end, updating the position. /// Note this may break UTF8 sequences. #[inline(always)] pub fn next_byte( input: &Input, _dir: Dir, pos: &mut Input::Position, ) -> Option { assert!( Input::CODE_UNITS_ARE_BYTES, "Not implemented for non-byte input" ); let res; if Dir::FORWARD { res = input.peek_byte_right(*pos); *pos += if res.is_some() { 1 } else { 0 }; } else { res = input.peek_byte_left(*pos); *pos -= if res.is_some() { 1 } else { 0 }; } res } regress-0.10.5/src/emit.rs000064400000000000000000000406441046102023000134640ustar 00000000000000//! Regex compiler back-end: transforms IR into a CompiledRegex use crate::bytesearch::{AsciiBitmap, ByteArraySet}; use crate::insn::{CompiledRegex, Insn, LoopFields, MAX_BYTE_SEQ_LENGTH, MAX_CHAR_SET_LENGTH}; use crate::ir; use crate::ir::Node; use crate::startpredicate; use crate::types::{BracketContents, CaptureGroupID, LoopID}; use crate::unicode; use core::convert::TryInto; #[cfg(not(feature = "std"))] use {alloc::vec::Vec, hashbrown::HashMap}; /// \return an anchor instruction for a given IR anchor. fn make_anchor(anchor_type: ir::AnchorType, multiline: bool) -> Insn { match anchor_type { ir::AnchorType::StartOfLine => Insn::StartOfLine { multiline }, ir::AnchorType::EndOfLine => Insn::EndOfLine { multiline }, } } /// Weirdly placed optimization. /// If the given bracket can be represented as ASCII contents, return the /// bitmap. Otherwise nothing. fn bracket_as_ascii(bc: &BracketContents) -> Option { let mut result = AsciiBitmap::default(); // We just assume that inverted brackets contain non-ASCII characters. if bc.invert { return None; } for r in bc.cps.intervals() { debug_assert!(r.first <= r.last); if r.last >= 128 { return None; } for bit in r.first..=r.last { result.set(bit as u8) } } Some(result) } /// Type which wraps up the context needed to emit a CompiledRegex. struct Emitter { result: CompiledRegex, // Number of loops seen so far. next_loop_id: LoopID, // List of group names, in order, with empties for unnamed groups. group_names: Vec>, } impl Emitter { /// Emit a ByteSet instruction. /// We awkwardly optimize it like so. fn make_byte_set_insn(&self, bytes: &[u8]) -> Insn { match bytes.len() { 0 => Insn::JustFail, 1 => Insn::ByteSeq1(bytes.try_into().unwrap()), 2 => Insn::ByteSet2(ByteArraySet(bytes.try_into().unwrap())), 3 => Insn::ByteSet3(ByteArraySet(bytes.try_into().unwrap())), 4 => Insn::ByteSet4(ByteArraySet(bytes.try_into().unwrap())), _ => panic!("Byte set is too long"), } } /// Emit an instruction. /// Return the "instruction" as an index. fn emit_insn(&mut self, insn: Insn) { self.result.insns.push(insn); } /// Get an instruction at a given index. fn get_insn(&mut self, idx: u32) -> &mut Insn { &mut self.result.insns[idx as usize] } /// \return the offset of the next instruction emitted. fn next_offset(&self) -> u32 { self.result.insns.len() as u32 } fn emit_insn_offset(&mut self, insn: Insn) -> u32 { let ret = self.next_offset(); self.emit_insn(insn); ret } /// Emit instructions corresponding to a given node. fn emit_node(&mut self, node: &Node) { enum Emitter<'a> { Node(&'a Node), NodeLoopFinish { loop_instruction_index: u32, }, NodeLookaroundAssertionFinish { lookaround_instruction_index: u32, }, NodeAltMiddle { alt_instruction_index: u32, right_node: &'a Node, }, NodeAltFinish { alt_instruction_index: u32, jump_instruction_index: u32, right_branch_index: u32, }, EndCaptureGroup { group: CaptureGroupID, }, } let mut stack = vec![Emitter::Node(node)]; while let Some(inst) = stack.pop() { match inst { Emitter::NodeLoopFinish { loop_instruction_index, } => { self.emit_insn(Insn::LoopAgain { begin: loop_instruction_index, }); // Fix up our loop exit. let exit = self.next_offset(); match self.get_insn(loop_instruction_index) { Insn::EnterLoop(fields) => fields.exit = exit, _ => panic!("Should be an EnterLoop instruction"), } } Emitter::NodeLookaroundAssertionFinish { lookaround_instruction_index, } => { self.emit_insn(Insn::Goal); // Fix up the continuation. let next_insn = self.next_offset(); match self.get_insn(lookaround_instruction_index) { Insn::Lookbehind { continuation, .. } => *continuation = next_insn, Insn::Lookahead { continuation, .. } => *continuation = next_insn, _ => panic!("Should be a Lookaround instruction"), } } Emitter::NodeAltMiddle { alt_instruction_index, right_node, } => { let jump_insn = self.emit_insn_offset(Insn::Jump { target: 0 }); let right_branch = self.next_offset(); stack.push(Emitter::NodeAltFinish { alt_instruction_index, jump_instruction_index: jump_insn, right_branch_index: right_branch, }); stack.push(Emitter::Node(right_node)); } Emitter::NodeAltFinish { alt_instruction_index, jump_instruction_index, right_branch_index, } => { let exit = self.next_offset(); // Fix up our jump targets. match self.get_insn(alt_instruction_index) { Insn::Alt { secondary } => *secondary = right_branch_index, _ => panic!("Should be an Alt instruction"), } match self.get_insn(jump_instruction_index) { Insn::Jump { target } => *target = exit, _ => panic!("Should be a Jump instruction"), } } Emitter::EndCaptureGroup { group } => self.emit_insn(Insn::EndCaptureGroup(group)), Emitter::Node(node) => match node { Node::Empty => {} Node::Goal => self.emit_insn(Insn::Goal), Node::Char { c, icase } => { let c = *c; if !*icase { self.emit_insn(Insn::Char(c)) } else { core::debug_assert!( unicode::fold_code_point(c, self.result.flags.unicode) == c, "Char {:x} should be folded", c ); self.emit_insn(Insn::CharICase(c)) } } Node::Cat(children) => { for nn in children.iter().rev() { stack.push(Emitter::Node(nn)); } } Node::Alt(left, right) => { // Alternation is followed by the primary branch and has a jump to secondary // branch. After primary branch, jump to the continuation. let alt_insn = self.emit_insn_offset(Insn::Alt { secondary: 0 }); stack.push(Emitter::NodeAltMiddle { alt_instruction_index: alt_insn, right_node: right, }); stack.push(Emitter::Node(left)); } Node::Bracket(contents) => { if let Some(ascii_contents) = bracket_as_ascii(contents) { self.emit_insn(Insn::AsciiBracket(ascii_contents)) } else { let idx = self.result.brackets.len(); self.result.brackets.push(contents.clone()); self.emit_insn(Insn::Bracket(idx)) } } Node::MatchAny => self.emit_insn(Insn::MatchAny), Node::MatchAnyExceptLineTerminator => { self.emit_insn(Insn::MatchAnyExceptLineTerminator) } Node::Anchor { anchor_type, multiline, } => self.emit_insn(make_anchor(*anchor_type, *multiline)), Node::Loop { loopee, quant, enclosed_groups, } => { let loop_id = self.next_loop_id; self.next_loop_id += 1; let loop_insn = self.emit_insn_offset(Insn::EnterLoop(LoopFields { loop_id, min_iters: quant.min, // If the loop is unbounded, just emit usize::MAX, // as we cannot match more characters than that. max_iters: quant.max.unwrap_or(usize::MAX), greedy: quant.greedy, exit: 0, })); self.result.loops += 1; // Emit a sequence of ResetCaptureGroup for any contained groups. for gid in enclosed_groups.start..enclosed_groups.end { self.emit_insn(Insn::ResetCaptureGroup(gid)) } stack.push(Emitter::NodeLoopFinish { loop_instruction_index: loop_insn, }); stack.push(Emitter::Node(loopee)); } Node::Loop1CharBody { loopee, quant } => { self.emit_insn(Insn::Loop1CharBody { min_iters: quant.min, max_iters: quant.max.unwrap_or(usize::MAX), greedy: quant.greedy, }); stack.push(Emitter::Node(loopee)); } Node::CaptureGroup(contents, group) => { let group = *group as CaptureGroupID; self.result.groups += 1; self.group_names.push("".into()); self.emit_insn(Insn::BeginCaptureGroup(group)); stack.push(Emitter::EndCaptureGroup { group }); stack.push(Emitter::Node(contents)); } Node::NamedCaptureGroup(contents, group, name) => { let group = *group as CaptureGroupID; self.result.groups += 1; self.group_names.push(name.as_str().into()); self.emit_insn(Insn::BeginCaptureGroup(group)); stack.push(Emitter::EndCaptureGroup { group }); stack.push(Emitter::Node(contents)); } Node::LookaroundAssertion { negate, backwards, start_group, end_group, contents, } => { let lookaround = if *backwards { self.emit_insn_offset(Insn::Lookbehind { negate: *negate, start_group: *start_group, end_group: *end_group, continuation: 0, }) } else { self.emit_insn_offset(Insn::Lookahead { negate: *negate, start_group: *start_group, end_group: *end_group, continuation: 0, }) }; stack.push(Emitter::NodeLookaroundAssertionFinish { lookaround_instruction_index: lookaround, }); stack.push(Emitter::Node(contents)); } Node::WordBoundary { invert } => { self.emit_insn(Insn::WordBoundary { invert: *invert }) } &Node::BackRef(group) => { debug_assert!(group >= 1, "Group should not be zero"); // -1 because \1 matches the first capture group, which has index 0. self.emit_insn(Insn::BackRef(group - 1)) } Node::ByteSet(bytes) => self.emit_insn(self.make_byte_set_insn(bytes)), Node::CharSet(chars) => { debug_assert!(chars.len() <= MAX_CHAR_SET_LENGTH); if chars.is_empty() { self.emit_insn(Insn::JustFail); } else { let mut arr = [chars[0]; MAX_CHAR_SET_LENGTH]; arr[..chars.len()].copy_from_slice(chars.as_slice()); self.emit_insn(Insn::CharSet(arr)) } } #[allow(clippy::assertions_on_constants)] Node::ByteSequence(bytes) => { assert!( MAX_BYTE_SEQ_LENGTH == 16, "Need to update our emitting logic" ); for chunk in bytes.as_slice().chunks(MAX_BYTE_SEQ_LENGTH) { let insn = match chunk.len() { 1 => Insn::ByteSeq1(chunk.try_into().unwrap()), 2 => Insn::ByteSeq2(chunk.try_into().unwrap()), 3 => Insn::ByteSeq3(chunk.try_into().unwrap()), 4 => Insn::ByteSeq4(chunk.try_into().unwrap()), 5 => Insn::ByteSeq5(chunk.try_into().unwrap()), 6 => Insn::ByteSeq6(chunk.try_into().unwrap()), 7 => Insn::ByteSeq7(chunk.try_into().unwrap()), 8 => Insn::ByteSeq8(chunk.try_into().unwrap()), 9 => Insn::ByteSeq9(chunk.try_into().unwrap()), 10 => Insn::ByteSeq10(chunk.try_into().unwrap()), 11 => Insn::ByteSeq11(chunk.try_into().unwrap()), 12 => Insn::ByteSeq12(chunk.try_into().unwrap()), 13 => Insn::ByteSeq13(chunk.try_into().unwrap()), 14 => Insn::ByteSeq14(chunk.try_into().unwrap()), 15 => Insn::ByteSeq15(chunk.try_into().unwrap()), 16 => Insn::ByteSeq16(chunk.try_into().unwrap()), _ => panic!("Unexpected chunk size"), }; self.emit_insn(insn) } } }, } } } } /// Compile the given IR to a CompiledRegex. pub fn emit(n: &ir::Regex) -> CompiledRegex { let mut emitter = Emitter { next_loop_id: 0, group_names: Vec::new(), result: CompiledRegex { insns: Vec::new(), brackets: Vec::new(), loops: 0, groups: 0, group_names: Box::new([]), flags: n.flags, start_pred: startpredicate::predicate_for_re(n), }, }; emitter.emit_node(&n.node); let mut result = emitter.result; // Populate group names, unless all are empty. debug_assert!( result.group_names.is_empty(), "Group names should not be set" ); if emitter.group_names.iter().any(|s| !s.is_empty()) { result.group_names = emitter.group_names.into_boxed_slice(); } debug_assert!( result.group_names.is_empty() || result.group_names.len() == result.groups as usize ); result } regress-0.10.5/src/exec.rs000064400000000000000000000031721046102023000134450ustar 00000000000000//! Execution engine bits. use crate::api::Match; use crate::insn::CompiledRegex; use crate::position::PositionType; /// A trait for finding the next match in a regex. /// This is broken out from Executor to avoid needing to thread lifetimes /// around. pub trait MatchProducer: core::fmt::Debug { /// The position type of our indexer. type Position: PositionType; /// \return an initial position for the given start offset. fn initial_position(&self, offset: usize) -> Option; /// Attempt to match at the given location. /// \return either the Match and the position to start looking for the next /// match, or None on failure. fn next_match( &mut self, pos: Self::Position, next_start: &mut Option, ) -> Option; } /// A trait for executing a regex. pub trait Executor<'r, 't>: MatchProducer { /// The ASCII variant. type AsAscii: Executor<'r, 't>; /// Construct a new Executor. fn new(re: &'r CompiledRegex, text: &'t str) -> Self; } /// A struct which enables iteration over matches. #[derive(Debug)] pub struct Matches { mp: Producer, position: Option, } impl Matches { pub fn new(mp: Producer, start: usize) -> Self { let position = mp.initial_position(start); Matches { mp, position } } } impl Iterator for Matches { type Item = Match; fn next(&mut self) -> Option { let pos = self.position?; self.mp.next_match(pos, &mut self.position) } } regress-0.10.5/src/indexing.rs000064400000000000000000001145061046102023000143320ustar 00000000000000use crate::bytesearch; use crate::cursor::Direction; use crate::matchers::{self, CharProperties}; #[cfg(feature = "utf16")] use crate::position::IndexPosition; use crate::position::{DefPosition, PositionType}; use crate::util::{is_utf8_continuation, utf8_w2, utf8_w3, utf8_w4}; use core::convert::TryInto; use core::ops::Range; use core::{ops, str}; // A type which may be an Element. pub trait ElementType: core::fmt::Debug + Copy + Clone + core::cmp::Eq + core::cmp::Ord + core::convert::Into + core::convert::TryFrom { /// Return another ElementType as self. #[inline(always)] fn try_from(v: Elem) -> Option { // Annoying there is no char->u8 conversion. let vv: u32 = v.into(); vv.try_into().ok() } #[inline(always)] fn as_u32(self) -> u32 { self.into() } } impl ElementType for char {} impl ElementType for u8 {} impl ElementType for u32 {} // A helper type that holds a string and allows indexing into it. pub trait InputIndexer: core::fmt::Debug + Copy + Clone where Self::CharProps: matchers::CharProperties, { /// The char type, typically u8 or char. type Element: ElementType; /// The CharProperties to use for the given element. type CharProps: matchers::CharProperties; /// A type which references a position in the input string. type Position: PositionType; /// Whether we have bytes as code units. This can optimize some operations. /// This is true for ASCII and UTF8, but not for UCS2 or UTF16. const CODE_UNITS_ARE_BYTES: bool; /// \return whether we are using unicode for case-folding. fn unicode(&self) -> bool; /// Case-fold an element. fn fold(&self, c: Self::Element) -> Self::Element { Self::CharProps::fold(c, self.unicode()) } /// Return whether these two elements fold to the same value. fn fold_equals(&self, c1: Self::Element, c2: Self::Element) -> bool { c1 == c2 || self.fold(c1) == self.fold(c2) } /// \return a sub-input. Note that positions in the original may no longer be valid in the sub-input. fn subinput(&self, range: ops::Range) -> Self; /// \return the char to the right (starting at) \p idx, or None if we are at /// the end. Advance the position by the amount. fn next_right(&self, pos: &mut Self::Position) -> Option; /// \return the char to the left (ending just before) \p idx, or None if we are at /// the end. Retreat the position by the amount. fn next_left(&self, pos: &mut Self::Position) -> Option; // Like next_right, but does not decode the element. fn next_right_pos(&self, pos: Self::Position) -> Option; // Like next_left, but does not decode the element. fn next_left_pos(&self, pos: Self::Position) -> Option; /// \return the byte to the right (starting at) \p idx, or None if we are at /// the end. This panics if CODE_UNITS_ARE_BYTES is false. fn peek_byte_right(&self, pos: Self::Position) -> Option; /// \return the byte to the left (ending just before) \p idx, or None if we /// are at the start. This panics if CODE_UNITS_ARE_BYTES is false. fn peek_byte_left(&self, pos: Self::Position) -> Option; /// \return a position at the left end of this input. fn left_end(&self) -> Self::Position; /// \return a position at the right end of this input. fn right_end(&self) -> Self::Position; /// Move a position right by a certain amount. /// \return the new position, or None if it would exceed the length. fn try_move_right(&self, pos: Self::Position, amt: usize) -> Option; /// Move a position left by a certain amount. /// \return the new position, or None if it would underflow 0. fn try_move_left(&self, pos: Self::Position, amt: usize) -> Option; /// Convert a position to an offset. fn pos_to_offset(&self, pos: Self::Position) -> usize; /// Apply a literal byte matcher, finding a literal byte sequence in a string. /// \return the new position, or None on failure. fn find_bytes( &self, pos: Self::Position, search: &Search, ) -> Option; /// Peek at the char to the right of a position, without changing that position. #[inline(always)] fn peek_right(&self, mut pos: Self::Position) -> Option { self.next_right(&mut pos) } /// Peek at the char to the left of a position, without changing that position. #[inline(always)] fn peek_left(&self, mut pos: Self::Position) -> Option { self.next_left(&mut pos) } /// Check if the subrange `range` is byte-for-byte equal to a range of the same length from the current position `pos`. /// If `dir` is FORWARD, then the range is checked starting at `pos` and ending at `pos + range.len()`. /// If `dir` is BACKWARD, then the range is checked starting at `pos - range.len()` and ending at `pos`. fn subrange_eq( &self, dir: Dir, pos: &mut Self::Position, range: Range, ) -> bool; /// Return whether we match some literal bytes. /// If so, update the position. If not, the position is unspecified. fn match_bytes( &self, dir: Dir, pos: &mut Self::Position, bytes: &[u8; N], ) -> bool; } /// \return the length of a UTF8 sequence starting with this byte. #[inline(always)] const fn utf8_seq_len(b: u8) -> usize { if b < 128 { 1 } else { match b & 0xF0 { 0xE0 => 3, 0xF0 => 4, _ => 2, } } } /// \return whether a byte represents the start of a utf8 sequence (aka a /// char boundary). #[inline(always)] fn is_seq_start(b: u8) -> bool { // Taken from is_char_boundary. // "This is bit magic equivalent to: b < 128 || b >= 192" (b as i8) >= -0x40 } #[derive(Debug, Copy, Clone)] pub struct Utf8Input<'a> { input: &'a str, unicode: bool, } impl<'a> Utf8Input<'a> { #[inline(always)] fn contents(&self) -> &[u8] { self.input.as_bytes() } #[inline(always)] fn bytelength(&self) -> usize { self.input.len() } #[inline(always)] fn slice( &self, start: ::Position, end: ::Position, ) -> &[u8] { self.debug_assert_valid_pos(start); self.debug_assert_valid_pos(end); debug_assert!(end >= start, "Slice start after end"); #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let res = &self.contents()[core::ops::Range { start: self.pos_to_offset(start), end: self.pos_to_offset(end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let res = unsafe { core::slice::from_raw_parts(start.ptr(), end - start) }; debug_assert!(res.len() <= self.bytelength() && res.len() == end - start); res } #[inline(always)] pub fn new(s: &'a str, unicode: bool) -> Self { // The big idea of RefPosition is enforced here. ::Position::check_size(); Self { input: s, unicode } } /// \return a byte at a given position. /// This asserts that we are not at the right end. #[inline(always)] fn getb(&self, pos: ::Position) -> u8 { debug_assert!(self.left_end() <= pos && pos < self.right_end()); if cfg!(feature = "prohibit-unsafe") { self.contents()[self.pos_to_offset(pos)] } else { unsafe { *self.contents().get_unchecked(self.pos_to_offset(pos)) } } } /// \return a slice as a str. #[inline(always)] fn str_slice(&self, range: ops::Range<::Position>) -> &'a str { self.debug_assert_boundary(range.start); self.debug_assert_boundary(range.end); if cfg!(feature = "prohibit-unsafe") { &self.input[core::ops::Range { start: self.pos_to_offset(range.start), end: self.pos_to_offset(range.end), }] } else { unsafe { self.input.get_unchecked(core::ops::Range { start: self.pos_to_offset(range.start), end: self.pos_to_offset(range.end), }) } } } /// Assert that a position is valid, i.e. between our left and right ends. #[inline(always)] fn debug_assert_valid_pos(&self, pos: ::Position) { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); } /// Assert that a position is a valid UTF8 character boundary. #[inline(always)] fn debug_assert_boundary(&self, pos: ::Position) { self.debug_assert_valid_pos(pos); debug_assert!(pos == self.right_end() || is_seq_start(self.getb(pos))); } } impl<'a> InputIndexer for Utf8Input<'a> { type Position = DefPosition<'a>; type Element = char; type CharProps = matchers::UTF8CharProperties; const CODE_UNITS_ARE_BYTES: bool = true; #[inline(always)] fn unicode(&self) -> bool { self.unicode } #[inline(always)] fn subinput(&self, range: ops::Range) -> Self { Self::new(self.str_slice(range), self.unicode) } #[inline(always)] fn next_right(&self, pos: &mut Self::Position) -> Option { self.debug_assert_boundary(*pos); if *pos == self.right_end() { return None; } let b0 = self.getb(*pos); if b0 < 128 { *pos += 1; return Some(b0 as Self::Element); } // Multibyte case. let len = utf8_seq_len(b0); let codepoint = match len { 2 => utf8_w2(b0, self.getb(*pos + 1)), 3 => utf8_w3(b0, self.getb(*pos + 1), self.getb(*pos + 2)), 4 => utf8_w4( b0, self.getb(*pos + 1), self.getb(*pos + 2), self.getb(*pos + 3), ), _ => rs_unreachable!("Invalid utf8 sequence length"), }; *pos += len; if let Some(c) = core::char::from_u32(codepoint) { Some(c) } else { rs_unreachable!("Should have decoded a valid char from utf8 sequence"); } } #[inline(always)] fn next_right_pos(&self, mut pos: Self::Position) -> Option { self.debug_assert_boundary(pos); if pos == self.right_end() { return None; } let b0 = self.getb(pos); if b0 < 128 { return Some(pos + 1); } // Multibyte case. pos += utf8_seq_len(b0); self.debug_assert_boundary(pos); Some(pos) } #[inline(always)] fn next_left(&self, pos: &mut Self::Position) -> Option { self.debug_assert_boundary(*pos); if *pos == self.left_end() { return None; } let z = self.getb(*pos - 1); if z < 128 { *pos -= 1; return Some(z as Self::Element); } // Multibyte case. // bytes are w x y z, with 'pos' pointing after z. let codepoint; let y = self.getb(*pos - 2); if !is_utf8_continuation(y) { codepoint = utf8_w2(y, z); *pos -= 2; } else { let x = self.getb(*pos - 3); if !is_utf8_continuation(x) { codepoint = utf8_w3(x, y, z); *pos -= 3; } else { let w = self.getb(*pos - 4); codepoint = utf8_w4(w, x, y, z); *pos -= 4; } } self.debug_assert_boundary(*pos); if let Some(c) = core::char::from_u32(codepoint) { Some(c) } else { rs_unreachable!("Should have decoded a valid char from utf8 sequence"); } } #[inline(always)] fn next_left_pos(&self, mut pos: Self::Position) -> Option { self.debug_assert_boundary(pos); if pos == self.left_end() { return None; } let z = self.getb(pos - 1); if z < 128 { pos -= 1; self.debug_assert_valid_pos(pos); return Some(pos); } if !is_utf8_continuation(self.getb(pos - 2)) { pos -= 2; } else if !is_utf8_continuation(self.getb(pos - 3)) { pos -= 3; } else { debug_assert!(!is_utf8_continuation(self.getb(pos - 4))); pos -= 4; } self.debug_assert_valid_pos(pos); Some(pos) } #[inline(always)] fn peek_byte_right(&self, pos: Self::Position) -> Option { self.debug_assert_valid_pos(pos); if pos == self.right_end() { None } else { Some(self.getb(pos)) } } #[inline(always)] fn peek_byte_left(&self, pos: Self::Position) -> Option { self.debug_assert_valid_pos(pos); if pos == self.left_end() { None } else { Some(self.getb(pos - 1)) } } #[inline(always)] fn try_move_right(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if self.right_end() - pos < amt { None } else { pos += amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[inline(always)] fn try_move_left(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if pos - self.left_end() < amt { None } else { pos -= amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[cfg(feature = "index-positions")] #[inline(always)] fn left_end(&self) -> Self::Position { Self::Position::new(0) } #[cfg(feature = "index-positions")] #[inline(always)] fn right_end(&self) -> Self::Position { Self::Position::new(self.bytelength()) } #[cfg(not(feature = "index-positions"))] #[inline(always)] fn left_end(&self) -> Self::Position { Self::Position::new(self.contents().as_ptr()) } #[cfg(not(feature = "index-positions"))] #[inline(always)] fn right_end(&self) -> Self::Position { self.left_end() + self.bytelength() } #[inline(always)] fn pos_to_offset(&self, pos: Self::Position) -> usize { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); pos - self.left_end() } #[inline(always)] fn find_bytes( &self, pos: Self::Position, search: &Search, ) -> Option { let rem = self.slice(pos, self.right_end()); let idx = search.find_in(rem)?; Some(pos + idx) } fn subrange_eq( &self, _dir: Dir, pos: &mut Self::Position, range: Range, ) -> bool { let len = range.end - range.start; let (start, end) = if Dir::FORWARD { if let Some(end) = self.try_move_right(*pos, len) { let start = *pos; *pos = end; (start, end) } else { return false; } } else if let Some(start) = self.try_move_left(*pos, len) { let end = *pos; *pos = start; (start, end) } else { return false; }; #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let new_range = &self.contents()[core::ops::Range { start: self.pos_to_offset(start), end: self.pos_to_offset(end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let new_range = unsafe { core::slice::from_raw_parts(start.ptr(), end - start) }; #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let old_range = &self.contents()[core::ops::Range { start: self.pos_to_offset(range.start), end: self.pos_to_offset(range.end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let old_range = unsafe { core::slice::from_raw_parts(range.start.ptr(), range.end - range.start) }; new_range == old_range } fn match_bytes( &self, _dir: Dir, pos: &mut Self::Position, bytes: &[u8; N], ) -> bool { let len = N; let (start, end) = if Dir::FORWARD { if let Some(end) = self.try_move_right(*pos, len) { let start = *pos; *pos = end; (start, end) } else { return false; } } else if let Some(start) = self.try_move_left(*pos, len) { let end = *pos; *pos = start; (start, end) } else { return false; }; #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let new_range = &self.contents()[core::ops::Range { start: self.pos_to_offset(start), end: self.pos_to_offset(end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let new_range = unsafe { core::slice::from_raw_parts(start.ptr(), end - start) }; bytes == new_range } } #[derive(Debug, Copy, Clone)] pub struct AsciiInput<'a> { input: &'a [u8], } impl<'a> AsciiInput<'a> { #[inline(always)] fn contents(&self) -> &[u8] { self.input } #[inline(always)] fn bytelength(&self) -> usize { self.input.len() } #[inline(always)] fn slice( &self, start: ::Position, end: ::Position, ) -> &[u8] { self.debug_assert_valid_pos(start); self.debug_assert_valid_pos(end); #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let res = &self.contents()[core::ops::Range { start: self.pos_to_offset(start), end: self.pos_to_offset(end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let res = unsafe { core::slice::from_raw_parts(start.ptr(), end - start) }; debug_assert!(res.len() <= self.bytelength() && res.len() == end - start); res } pub fn new(s: &'a str) -> Self { // The big idea of RefPosition is enforced here. ::Position::check_size(); Self { input: s.as_bytes(), } } /// \return a byte at a given position. /// This asserts that we are not at the right end. #[inline(always)] fn getb(&self, pos: ::Position) -> u8 { debug_assert!(self.left_end() <= pos && pos < self.right_end()); if cfg!(feature = "prohibit-unsafe") { self.contents()[self.pos_to_offset(pos)] } else { unsafe { *self.contents().get_unchecked(self.pos_to_offset(pos)) } } } #[inline(always)] fn debug_assert_valid_pos(&self, pos: ::Position) -> &Self { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); self } } impl<'a> InputIndexer for AsciiInput<'a> { type Position = DefPosition<'a>; type Element = u8; type CharProps = matchers::ASCIICharProperties; const CODE_UNITS_ARE_BYTES: bool = true; #[inline(always)] fn unicode(&self) -> bool { false } #[inline(always)] fn subinput(&self, range: ops::Range) -> AsciiInput<'a> { self.debug_assert_valid_pos(range.start); self.debug_assert_valid_pos(range.end); debug_assert!(range.end >= range.start); AsciiInput { input: &self.input[core::ops::Range { start: self.pos_to_offset(range.start), end: self.pos_to_offset(range.end), }], } } #[inline(always)] fn next_right(&self, pos: &mut Self::Position) -> Option { self.debug_assert_valid_pos(*pos); if *pos == self.right_end() { None } else { let c = self.getb(*pos); *pos += 1; self.debug_assert_valid_pos(*pos); Some(c) } } #[inline(always)] fn next_left(&self, pos: &mut Self::Position) -> Option { self.debug_assert_valid_pos(*pos); if *pos == self.left_end() { None } else { *pos -= 1; self.debug_assert_valid_pos(*pos); let c = self.getb(*pos); Some(c) } } #[inline(always)] fn next_right_pos(&self, pos: Self::Position) -> Option { self.try_move_right(pos, 1) } #[inline(always)] fn next_left_pos(&self, pos: Self::Position) -> Option { self.try_move_left(pos, 1) } #[inline(always)] fn peek_byte_right(&self, mut pos: Self::Position) -> Option { self.next_right(&mut pos) } #[inline(always)] fn peek_byte_left(&self, mut pos: Self::Position) -> Option { self.next_left(&mut pos) } #[cfg(feature = "index-positions")] #[inline(always)] fn left_end(&self) -> Self::Position { Self::Position::new(0) } #[cfg(feature = "index-positions")] #[inline(always)] fn right_end(&self) -> Self::Position { Self::Position::new(self.bytelength()) } #[cfg(not(feature = "index-positions"))] #[inline(always)] fn left_end(&self) -> Self::Position { Self::Position::new(self.contents().as_ptr()) } #[cfg(not(feature = "index-positions"))] #[inline(always)] fn right_end(&self) -> Self::Position { self.left_end() + self.bytelength() } #[inline(always)] fn pos_to_offset(&self, pos: Self::Position) -> usize { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); pos - self.left_end() } fn try_move_right(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if self.right_end() - pos < amt { None } else { pos += amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[inline(always)] fn try_move_left(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if pos - self.left_end() < amt { None } else { pos -= amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[inline(always)] fn find_bytes( &self, pos: Self::Position, search: &Search, ) -> Option { let rem = self.slice(pos, self.right_end()); let idx = search.find_in(rem)?; Some(pos + idx) } fn subrange_eq( &self, _dir: Dir, pos: &mut Self::Position, range: Range, ) -> bool { let len = range.end - range.start; let (start, end) = if Dir::FORWARD { if let Some(end) = self.try_move_right(*pos, len) { let start = *pos; *pos = end; (start, end) } else { return false; } } else if let Some(start) = self.try_move_left(*pos, len) { let end = *pos; *pos = start; (start, end) } else { return false; }; #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let new_range = &self.contents()[core::ops::Range { start: self.pos_to_offset(start), end: self.pos_to_offset(end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let new_range = unsafe { core::slice::from_raw_parts(start.ptr(), end - start) }; #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let old_range = &self.contents()[core::ops::Range { start: self.pos_to_offset(range.start), end: self.pos_to_offset(range.end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let old_range = unsafe { core::slice::from_raw_parts(range.start.ptr(), range.end - range.start) }; new_range == old_range } fn match_bytes( &self, _dir: Dir, pos: &mut Self::Position, bytes: &[u8; N], ) -> bool { let len = N; let (start, end) = if Dir::FORWARD { if let Some(end) = self.try_move_right(*pos, len) { let start = *pos; *pos = end; (start, end) } else { return false; } } else if let Some(start) = self.try_move_left(*pos, len) { let end = *pos; *pos = start; (start, end) } else { return false; }; #[cfg(any(feature = "index-positions", feature = "prohibit-unsafe"))] let new_range = &self.contents()[core::ops::Range { start: self.pos_to_offset(start), end: self.pos_to_offset(end), }]; #[cfg(all(not(feature = "index-positions"), not(feature = "prohibit-unsafe")))] let new_range = unsafe { core::slice::from_raw_parts(start.ptr(), end - start) }; bytes == new_range } } #[cfg(feature = "utf16")] #[derive(Debug, Copy, Clone)] pub struct Utf16Input<'a> { input: &'a [u16], unicode: bool, } #[cfg(feature = "utf16")] impl<'a> Utf16Input<'a> { pub fn new(s: &'a [u16], unicode: bool) -> Self { Self { input: s, unicode } } #[inline(always)] fn debug_assert_valid_pos(&self, pos: ::Position) -> &Self { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); self } const SURROGATE_HIGH_START: u16 = 0xD800; const SURROGATE_HIGH_END: u16 = 0xDBFF; const SURROGATE_LOW_START: u16 = 0xDC00; const SURROGATE_LOW_END: u16 = 0xDFFF; #[inline(always)] fn is_high_surrogate(b: u16) -> bool { b >= Self::SURROGATE_HIGH_START && b <= Self::SURROGATE_HIGH_END } #[inline(always)] fn is_low_surrogate(b: u16) -> bool { b >= Self::SURROGATE_LOW_START && b <= Self::SURROGATE_LOW_END } #[inline(always)] fn code_point_from_surrogates(high: u16, low: u16) -> u32 { (((high & 0x3ff) as u32) << 10 | (low & 0x3ff) as u32) + 0x1_0000 } } #[cfg(feature = "utf16")] impl<'a> InputIndexer for Utf16Input<'a> { type Position = IndexPosition<'a>; type Element = u32; type CharProps = matchers::Utf16CharProperties; const CODE_UNITS_ARE_BYTES: bool = false; #[inline(always)] fn unicode(&self) -> bool { self.unicode } #[inline(always)] fn subinput(&self, range: ops::Range) -> Utf16Input<'a> { self.debug_assert_valid_pos(range.start); self.debug_assert_valid_pos(range.end); debug_assert!(range.end >= range.start); Utf16Input { input: &self.input[core::ops::Range { start: self.pos_to_offset(range.start), end: self.pos_to_offset(range.end), }], unicode: self.unicode(), } } #[inline(always)] fn next_right(&self, pos: &mut Self::Position) -> Option { let u1 = self.input.get(self.pos_to_offset(*pos)).copied()?; *pos += 1; // If the code unit is not a high surrogate, it is not the start of a surrogate pair. if !Self::is_high_surrogate(u1) { return Some(u1.into()); } let Some(u2) = self.input.get(self.pos_to_offset(*pos)).copied() else { return Some(u1.into()); }; // If the code unit is not a low surrogate, it is not a surrogate pair. if !Self::is_low_surrogate(u2) { return Some(u1.into()); } *pos += 1; Some(Self::code_point_from_surrogates(u1, u2)) } #[inline(always)] fn next_left(&self, pos: &mut Self::Position) -> Option { let left_end = self.left_end(); if *pos == left_end { return None; } let u2 = self.input.get(self.pos_to_offset(*pos - 1)).copied()?; *pos -= 1; // If the code unit is not a low surrogate, it is not the end of a surrogate pair. if *pos == left_end || !Self::is_low_surrogate(u2) { return Some(u2.into()); } let Some(u1) = self.input.get(self.pos_to_offset(*pos - 1)).copied() else { return Some(u2.into()); }; // If the code unit is not a high surrogate, it is not a surrogate pair. if !Self::is_high_surrogate(u1) { return Some(u2.into()); } *pos -= 1; Some(Self::code_point_from_surrogates(u1, u2)) } #[inline(always)] fn next_right_pos(&self, mut pos: Self::Position) -> Option { let u1 = self.input.get(self.pos_to_offset(pos)).copied()?; pos += 1; // If the code unit is not a high surrogate, it is not the start of a surrogate pair. if !Self::is_high_surrogate(u1) { return Some(pos); } let Some(u2) = self.input.get(self.pos_to_offset(pos)).copied() else { return Some(pos); }; // If the code unit is not a low surrogate, it is not a surrogate pair. if !Self::is_low_surrogate(u2) { return Some(pos); } pos += 1; Some(pos) } #[inline(always)] fn next_left_pos(&self, mut pos: Self::Position) -> Option { let left_end = self.left_end(); if pos == left_end { return None; } let u2 = self.input.get(self.pos_to_offset(pos - 1)).copied()?; pos -= 1; // If the code unit is not a low surrogate, it is not the end of a surrogate pair. if pos == left_end || !Self::is_low_surrogate(u2) { return Some(pos); } let Some(u1) = self.input.get(self.pos_to_offset(pos - 1)).copied() else { return Some(pos); }; // If the code unit is not a high surrogate, it is not a surrogate pair. if !Self::is_high_surrogate(u1) { return Some(pos); } pos -= 1; Some(pos) } #[inline(always)] fn peek_byte_right(&self, _pos: Self::Position) -> Option { panic!("Should never be inspecting bytes for utf16"); } #[inline(always)] fn peek_byte_left(&self, _pos: Self::Position) -> Option { panic!("Should never be inspecting bytes for utf16"); } #[inline(always)] fn left_end(&self) -> Self::Position { Self::Position::new(0) } #[inline(always)] fn right_end(&self) -> Self::Position { Self::Position::new(self.input.len()) } #[inline(always)] fn pos_to_offset(&self, pos: Self::Position) -> usize { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); pos - self.left_end() } fn try_move_right(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if self.right_end() - pos < amt { None } else { pos += amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[inline(always)] fn try_move_left(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if pos - self.left_end() < amt { None } else { pos -= amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[inline(always)] fn find_bytes( &self, _pos: Self::Position, _search: &Search, ) -> Option { panic!("Should never be finding bytes for utf16"); } fn subrange_eq( &self, _dir: Dir, pos: &mut Self::Position, range: Range, ) -> bool { let len = range.end - range.start; let (start, end) = if Dir::FORWARD { if let Some(end) = self.try_move_right(*pos, len) { let start = *pos; *pos = end; (start, end) } else { return false; } } else if let Some(start) = self.try_move_left(*pos, len) { let end = *pos; *pos = start; (start, end) } else { return false; }; let new_range = &self.input[self.pos_to_offset(start)..self.pos_to_offset(end)]; let old_range = &self.input[self.pos_to_offset(range.start)..self.pos_to_offset(range.end)]; new_range == old_range } fn match_bytes( &self, _dir: Dir, _pos: &mut Self::Position, _bytes: &[u8; N], ) -> bool { panic!("Should never be matching bytes for utf16"); } } #[cfg(feature = "utf16")] #[derive(Debug, Copy, Clone)] pub struct Ucs2Input<'a> { input: &'a [u16], unicode: bool, } #[cfg(feature = "utf16")] impl<'a> Ucs2Input<'a> { pub fn new(s: &'a [u16], unicode: bool) -> Self { Self { input: s, unicode } } #[inline(always)] fn debug_assert_valid_pos(&self, pos: ::Position) -> &Self { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); self } } #[cfg(feature = "utf16")] impl<'a> InputIndexer for Ucs2Input<'a> { type Position = IndexPosition<'a>; type Element = u32; type CharProps = matchers::Utf16CharProperties; const CODE_UNITS_ARE_BYTES: bool = false; #[inline(always)] fn unicode(&self) -> bool { self.unicode } #[inline(always)] fn subinput(&self, range: ops::Range) -> Ucs2Input<'a> { self.debug_assert_valid_pos(range.start); self.debug_assert_valid_pos(range.end); debug_assert!(range.end >= range.start); Ucs2Input { input: &self.input[core::ops::Range { start: self.pos_to_offset(range.start), end: self.pos_to_offset(range.end), }], unicode: self.unicode(), } } #[inline(always)] fn next_right(&self, pos: &mut Self::Position) -> Option { let u1 = self.input.get(self.pos_to_offset(*pos)).copied()?; *pos += 1; Some(u1.into()) } #[inline(always)] fn next_left(&self, pos: &mut Self::Position) -> Option { if *pos == self.left_end() { return None; } let u2 = self.input.get(self.pos_to_offset(*pos - 1)).copied()?; *pos -= 1; Some(u2.into()) } #[inline(always)] fn next_right_pos(&self, pos: Self::Position) -> Option { self.try_move_right(pos, 1) } #[inline(always)] fn next_left_pos(&self, pos: Self::Position) -> Option { self.try_move_left(pos, 1) } #[inline(always)] fn peek_byte_right(&self, _pos: Self::Position) -> Option { panic!("Should never be inspecting bytes for ucs2"); } #[inline(always)] fn peek_byte_left(&self, _pos: Self::Position) -> Option { panic!("Should never be inspecting bytes for ucs2"); } #[inline(always)] fn left_end(&self) -> Self::Position { Self::Position::new(0) } #[inline(always)] fn right_end(&self) -> Self::Position { Self::Position::new(self.input.len()) } #[inline(always)] fn pos_to_offset(&self, pos: Self::Position) -> usize { debug_assert!(self.left_end() <= pos && pos <= self.right_end()); pos - self.left_end() } fn try_move_right(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if self.right_end() - pos < amt { None } else { pos += amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[inline(always)] fn try_move_left(&self, mut pos: Self::Position, amt: usize) -> Option { self.debug_assert_valid_pos(pos); if pos - self.left_end() < amt { None } else { pos -= amt; self.debug_assert_valid_pos(pos); Some(pos) } } #[inline(always)] fn find_bytes( &self, _pos: Self::Position, _search: &Search, ) -> Option { panic!("Should never be finding bytes for ucs2"); } fn subrange_eq( &self, _dir: Dir, pos: &mut Self::Position, range: Range, ) -> bool { let len = range.end - range.start; let (start, end) = if Dir::FORWARD { if let Some(end) = self.try_move_right(*pos, len) { let start = *pos; *pos = end; (start, end) } else { return false; } } else if let Some(start) = self.try_move_left(*pos, len) { let end = *pos; *pos = start; (start, end) } else { return false; }; let new_range = &self.input[self.pos_to_offset(start)..self.pos_to_offset(end)]; let old_range = &self.input[self.pos_to_offset(range.start)..self.pos_to_offset(range.end)]; new_range == old_range } fn match_bytes( &self, _dir: Dir, _pos: &mut Self::Position, _bytes: &[u8; N], ) -> bool { panic!("Should never be matching bytes for ucs2"); } } regress-0.10.5/src/insn.rs000064400000000000000000000130611046102023000134660ustar 00000000000000//! Bytecode instructions for a compiled regex #[cfg(not(feature = "std"))] use { alloc::{string::String, vec::Vec}, hashbrown::HashMap, }; use crate::api; use crate::bytesearch::{AsciiBitmap, ByteArraySet, ByteBitmap}; use crate::types::{BracketContents, CaptureGroupID, LoopID}; extern crate memchr; use memchr::memmem; type JumpTarget = u32; /// The maximum size of a byte sequence instruction. pub const MAX_BYTE_SEQ_LENGTH: usize = 16; /// The maximum size of an array-type-byteset instruction. pub const MAX_BYTE_SET_LENGTH: usize = 4; /// The maximum size of an array-type-charset instruction. /// This also happens to be the maximum number of characters in case-insensitive /// equivalence classes. pub const MAX_CHAR_SET_LENGTH: usize = 4; #[derive(Debug, Clone)] pub struct LoopFields { pub loop_id: LoopID, pub min_iters: usize, pub max_iters: usize, pub greedy: bool, pub exit: JumpTarget, } #[derive(Debug, Clone)] /// The list of bytecode instructions. pub enum Insn { /// The match was successful. Goal, /// Match a single char. Char(u32), /// Match a single char, case-insensitive. CharICase(u32), /// Match the start of a line (if multiline); emitted by '^' StartOfLine { multiline: bool, }, /// Match the end of a line; emitted by '$' EndOfLine { multiline: bool, }, /// Match any character except a line terminator; emitted by '.' only when /// the dot_all flag is set to true. MatchAny, /// Match any character except a line terminator; emitted by '.' MatchAnyExceptLineTerminator, /// Enter a loop from "outside". EnterLoop(LoopFields), /// Re-enter a loop. LoopAgain { begin: JumpTarget, }, /// The next instruction is a "1Char" instruction which always matches one /// character. Attempt to match it [min, max] times. Loop1CharBody { min_iters: usize, max_iters: usize, greedy: bool, }, /// Set the IP to a new value. Jump { target: JumpTarget, }, /// The next instruction is the primary branch. /// If it fails to match, jump to secondary. Alt { secondary: JumpTarget, }, /// Enter a capture group. BeginCaptureGroup(CaptureGroupID), /// Exit a capture group. EndCaptureGroup(CaptureGroupID), /// Clear a capture group. ResetCaptureGroup(CaptureGroupID), /// Perform a backreference match. BackRef(u32), /// Match the next character against the bracket contents, stored at the given index in the CompiledRegex. Bracket(usize), /// A simple bitmap bracket for ASCII. /// It contains a bitmap of the range [0, 127]. AsciiBracket(AsciiBitmap), /// Perform a lookahead assertion. Lookahead { negate: bool, start_group: CaptureGroupID, end_group: CaptureGroupID, continuation: JumpTarget, }, /// Perform a lookbehind assertion. Lookbehind { negate: bool, start_group: CaptureGroupID, end_group: CaptureGroupID, continuation: JumpTarget, }, /// \w or \W word boundaries. WordBoundary { invert: bool, }, /// Match any of the contained chars /// There is no length field; characters are simply duplicated as necessary. CharSet([u32; MAX_CHAR_SET_LENGTH]), /// Match the next byte against some possibilities. ByteSet2(ByteArraySet<[u8; 2]>), ByteSet3(ByteArraySet<[u8; 3]>), ByteSet4(ByteArraySet<[u8; 4]>), /// Match a sequence of literal bytes. ByteSeq1([u8; 1]), ByteSeq2([u8; 2]), ByteSeq3([u8; 3]), ByteSeq4([u8; 4]), ByteSeq5([u8; 5]), ByteSeq6([u8; 6]), ByteSeq7([u8; 7]), ByteSeq8([u8; 8]), ByteSeq9([u8; 9]), ByteSeq10([u8; 10]), ByteSeq11([u8; 11]), ByteSeq12([u8; 12]), ByteSeq13([u8; 13]), ByteSeq14([u8; 14]), ByteSeq15([u8; 15]), ByteSeq16([u8; 16]), /// An instruction that always fails, which may be produced in weird cases /// like an inverted bracket which matches everything. JustFail, } /// The peeled prefix start predicate. /// This is a fast way of locating the first potential match. #[derive(Debug, Clone)] pub enum StartPredicate { /// May match an arbitrary sequence. Arbitrary, /// Look for the first instance of any of the given bytes. ByteSet1([u8; 1]), ByteSet2([u8; 2]), ByteSet3([u8; 3]), /// Look for a byte sequence. ByteSeq(Box>), /// Look for a byte which matches the bitmap. ByteBracket(ByteBitmap), /// The regex is anchored to the start of the line/string. /// This avoids string searching entirely and only tries matching at the beginning. StartAnchored, } #[derive(Debug, Clone)] pub struct CompiledRegex { // Sequence of instructions. pub insns: Vec, // The bracket contents, indexed by the value of the `Bracket` instruction. pub brackets: Vec, // Predicate to rapidly find the first potential match. pub start_pred: StartPredicate, // Number of loops, used to populate loop data. pub loops: u32, // Number of capture groups, used to populate capture group data. pub groups: u32, // A list of capture group names. This is either: // - Empty, if there were no named capture groups. // - A list of names with length `groups`, corresponding to the capture // group names in order. Groups without names have an empty string. pub group_names: Box<[Box]>, // Flags controlling matching. pub flags: api::Flags, } regress-0.10.5/src/ir.rs000064400000000000000000000412521046102023000131340ustar 00000000000000//! Intermediate representation for a regex use crate::api; use crate::types::{BracketContents, CaptureGroupID, CaptureGroupName}; #[cfg(not(feature = "std"))] use alloc::{boxed::Box, string::ToString, vec::Vec}; use core::fmt; #[derive(Debug, Copy, Clone)] pub enum AnchorType { StartOfLine, // ^ EndOfLine, // $ } /// A Quantifier. #[derive(Debug, Copy, Clone)] pub struct Quantifier { /// Minimum number of iterations of the loop, inclusive. pub min: usize, /// Maximum number of iterations of the loop, inclusive; /// or None if unbounded. pub max: Option, /// Whether the loop is greedy. pub greedy: bool, } /// The node types of our IR. #[derive(Debug)] pub enum Node { /// Matches the empty string. Empty, /// Reaching this node terminates the match successfully. Goal, /// Match a literal character. /// If icase is true, then `c` MUST be already folded. Char { c: u32, icase: bool }, /// Match a literal sequence of bytes. ByteSequence(Vec), /// Match any of a set of *bytes*. /// This may not exceed length MAX_BYTE_SET_LENGTH. ByteSet(Vec), /// Match any of a set of *chars*, case-insensitive. /// This may not exceed length MAX_CHAR_SET_LENGTH. CharSet(Vec), /// Match the catenation of multiple nodes. Cat(Vec), /// Match an alternation like a|b. Alt(Box, Box), /// Match anything including newlines. MatchAny, /// Match anything except a newline. MatchAnyExceptLineTerminator, /// Match an anchor like ^ or $. The `multiline` flag controls whether the /// anchor should treat line terminators as boundaries. Anchor { anchor_type: AnchorType, multiline: bool, }, /// Word boundary (\b or \B). WordBoundary { invert: bool }, /// A capturing group. CaptureGroup(Box, CaptureGroupID), /// A named capturing group. NamedCaptureGroup(Box, CaptureGroupID, CaptureGroupName), /// A backreference. BackRef(u32), /// A bracket. Bracket(BracketContents), /// A lookaround assertions like (?:) or (?!). LookaroundAssertion { negate: bool, backwards: bool, start_group: CaptureGroupID, end_group: CaptureGroupID, contents: Box, }, /// A loop like /.*/ or /x{3, 5}?/ Loop { loopee: Box, quant: Quantifier, enclosed_groups: core::ops::Range, }, /// A loop whose body matches exactly one character. /// Enclosed capture groups are forbidden here. Loop1CharBody { loopee: Box, quant: Quantifier, }, } pub type NodeList = Vec; impl Node { /// Helper to return an "always fails" node. pub fn make_always_fails() -> Node { Node::CharSet(Vec::new()) } /// Reverse the children of \p self if in a lookbehind. /// Used as a parameter to walk_mut. pub fn reverse_cats(&mut self, w: &mut Walk) { match self { Node::Cat(nodes) if w.in_lookbehind => nodes.reverse(), Node::ByteSequence(..) => panic!("Should not be reversing literal bytes"), _ => {} } } /// \return whether this is an Empty node. pub fn is_empty(&self) -> bool { matches!(self, Node::Empty) } /// \return whether this is a Cat node. pub fn is_cat(&self) -> bool { matches!(self, Node::Cat(..)) } /// \return whether this node is known to match exactly one char. /// This is best-effort: a false return is always safe. pub fn matches_exactly_one_char(&self) -> bool { match self { Node::Char { .. } => true, Node::CharSet(contents) => !contents.is_empty(), Node::Bracket(contents) => !contents.is_empty(), Node::MatchAny => true, Node::MatchAnyExceptLineTerminator => true, _ => false, } } /// \return true if this node will always fail to match. /// Note this is different than matching the empty string. /// For example, an empty bracket /[]/ tries to match one char /// from an empty set. pub fn match_always_fails(&self) -> bool { match self { Node::ByteSet(bytes) => bytes.is_empty(), Node::CharSet(contents) => contents.is_empty(), Node::Bracket(contents) => contents.is_empty(), _ => false, } } /// Duplicate a node, perhaps assigning new loop IDs. Note we must never /// copy a capture group. /// /// Returns None if the depth is too high. pub fn try_duplicate(&self, mut depth: usize) -> Option { if depth > 100 { return None; } depth += 1; Some(match self { Node::Empty => Node::Empty, Node::Goal => Node::Goal, &Node::Char { c, icase } => Node::Char { c, icase }, Node::ByteSequence(bytes) => Node::ByteSequence(bytes.clone()), Node::ByteSet(bytes) => Node::ByteSet(bytes.clone()), Node::CharSet(chars) => Node::CharSet(chars.clone()), Node::Cat(nodes) => { let mut new_nodes = Vec::with_capacity(nodes.len()); for n in nodes { new_nodes.push(n.try_duplicate(depth)?); } Node::Cat(new_nodes) } Node::Alt(left, right) => Node::Alt( Box::new(left.try_duplicate(depth)?), Box::new(right.try_duplicate(depth)?), ), Node::MatchAny => Node::MatchAny, Node::MatchAnyExceptLineTerminator => Node::MatchAnyExceptLineTerminator, &Node::Anchor { anchor_type, multiline, } => Node::Anchor { anchor_type, multiline, }, Node::Loop { loopee, quant, enclosed_groups, } => { assert!( enclosed_groups.start >= enclosed_groups.end, "Cannot duplicate a loop with enclosed groups" ); Node::Loop { loopee: Box::new(loopee.as_ref().try_duplicate(depth)?), quant: *quant, enclosed_groups: enclosed_groups.clone(), } } Node::Loop1CharBody { loopee, quant } => Node::Loop1CharBody { loopee: Box::new(loopee.as_ref().try_duplicate(depth)?), quant: *quant, }, Node::CaptureGroup(..) | Node::NamedCaptureGroup(..) => { panic!("Refusing to duplicate a capture group"); } &Node::WordBoundary { invert } => Node::WordBoundary { invert }, &Node::BackRef(idx) => Node::BackRef(idx), Node::Bracket(bc) => Node::Bracket(bc.clone()), // Do not reverse into lookarounds, they already have the right sense. Node::LookaroundAssertion { negate, backwards, start_group, end_group, contents, } => { assert!( start_group >= end_group, "Cannot duplicate an assertion with enclosed groups" ); Node::LookaroundAssertion { negate: *negate, backwards: *backwards, start_group: *start_group, end_group: *end_group, contents: Box::new((*contents).try_duplicate(depth)?), } } }) } } /// A helper type for walking. #[derive(Debug, Clone)] pub struct Walk { // It set to true, skip the children of this node. pub skip_children: bool, // The current depth of the walk. pub depth: usize, // If true, we are in a lookbehind (and so the cursor will move backwards). pub in_lookbehind: bool, // If the regex is in unicode mode. pub unicode: bool, } impl Walk { fn new(unicode: bool) -> Self { Self { skip_children: false, depth: 0, in_lookbehind: false, unicode, } } } #[derive(Debug)] struct Walker<'a, F> where F: FnMut(&Node, &mut Walk), { func: &'a mut F, postorder: bool, walk: Walk, } impl Walker<'_, F> where F: FnMut(&Node, &mut Walk), { fn process_children(&mut self, n: &Node) { match n { Node::Empty | Node::Goal | Node::Char { .. } | Node::ByteSequence(..) | Node::ByteSet(..) | Node::CharSet(..) | Node::WordBoundary { .. } | Node::BackRef { .. } | Node::Bracket { .. } | Node::MatchAny | Node::MatchAnyExceptLineTerminator | Node::Anchor { .. } => {} Node::Cat(nodes) => { for node in nodes { self.process(node); } } Node::Alt(left, right) => { self.process(left.as_ref()); self.process(right.as_ref()); } Node::Loop { loopee, .. } | Node::Loop1CharBody { loopee, .. } => self.process(loopee), Node::CaptureGroup(contents, ..) | Node::NamedCaptureGroup(contents, ..) => { self.process(contents.as_ref()) } Node::LookaroundAssertion { backwards, contents, .. } => { let saved = self.walk.in_lookbehind; self.walk.in_lookbehind = *backwards; self.process(contents.as_ref()); self.walk.in_lookbehind = saved; } } } fn process(&mut self, n: &Node) { self.walk.skip_children = false; if !self.postorder { (self.func)(n, &mut self.walk); } if !self.walk.skip_children { self.walk.depth += 1; self.process_children(n); self.walk.depth -= 1; } if self.postorder { (self.func)(n, &mut self.walk) } } } #[derive(Debug)] struct MutWalker<'a, F> where F: FnMut(&mut Node, &mut Walk), { func: &'a mut F, postorder: bool, walk: Walk, } impl MutWalker<'_, F> where F: FnMut(&mut Node, &mut Walk), { fn process_children(&mut self, n: &mut Node) { match n { Node::Empty | Node::Goal | Node::Char { .. } | Node::ByteSequence(..) | Node::ByteSet(..) | Node::CharSet(..) | Node::MatchAny | Node::MatchAnyExceptLineTerminator | Node::Anchor { .. } | Node::WordBoundary { .. } | Node::BackRef { .. } | Node::Bracket { .. } => {} Node::Cat(nodes) => { nodes.iter_mut().for_each(|node| self.process(node)); } Node::Alt(left, right) => { self.process(left.as_mut()); self.process(right.as_mut()); } Node::Loop { loopee, .. } | Node::Loop1CharBody { loopee, .. } => { self.process(loopee); } Node::CaptureGroup(contents, ..) | Node::NamedCaptureGroup(contents, ..) => { self.process(contents.as_mut()) } Node::LookaroundAssertion { backwards, contents, .. } => { let saved = self.walk.in_lookbehind; self.walk.in_lookbehind = *backwards; self.process(contents.as_mut()); self.walk.in_lookbehind = saved; } } } fn process(&mut self, n: &mut Node) { self.walk.skip_children = false; if !self.postorder { (self.func)(n, &mut self.walk); } if !self.walk.skip_children { self.walk.depth += 1; self.process_children(n); self.walk.depth -= 1; } if self.postorder { (self.func)(n, &mut self.walk); } } } /// Call a function on every Node. /// If \p postorder is true, then process children before the node; /// otherwise process children after the node. pub fn walk(postorder: bool, unicode: bool, n: &Node, func: &mut F) where F: FnMut(&Node, &mut Walk), { let mut walker = Walker { func, postorder, walk: Walk::new(unicode), }; walker.process(n); } /// Call a function on every Node, which may mutate the node. /// If \p postorder is true, then process children before the node; /// otherwise process children after the node. /// If postorder is false, the function should return true to process children, /// false to avoid descending into children. If postorder is true, the return /// value is ignored. pub fn walk_mut(postorder: bool, unicode: bool, n: &mut Node, func: &mut F) where F: FnMut(&mut Node, &mut Walk), { let mut walker = MutWalker { func, postorder, walk: Walk::new(unicode), }; walker.process(n); } /// A regex in IR form. pub struct Regex { pub node: Node, pub flags: api::Flags, } impl Regex {} fn display_node(node: &Node, depth: usize, f: &mut fmt::Formatter) -> fmt::Result { for _ in 0..depth { write!(f, "..")?; } match node { Node::Empty => { writeln!(f, "Empty")?; } Node::Goal => { writeln!(f, "Goal")?; } Node::Char { c, icase: _ } => { writeln!(f, "'{}'", &c.to_string())?; } Node::ByteSequence(bytes) => { write!(f, "ByteSeq{} 0x", bytes.len())?; for &b in bytes { write!(f, "{:x}", b)?; } writeln!(f)?; } Node::ByteSet(bytes) => { let len = bytes.len(); write!(f, "ByteSet{}", len)?; for &b in bytes { write!(f, " 0x{:x}", b)?; } writeln!(f)?; } Node::CharSet(chars) => { write!(f, "CharSet ")?; let mut first = true; for &c in chars { if !first { write!(f, ", ")?; } first = false; write!(f, "0x{:x}", { c })?; } writeln!(f)?; } Node::Cat(..) => { writeln!(f, "Cat")?; } Node::Alt(..) => { writeln!(f, "Alt")?; } Node::MatchAny => { writeln!(f, "MatchAny")?; } Node::MatchAnyExceptLineTerminator => { writeln!(f, "MatchAnyExceptLineTerminator")?; } Node::Anchor { anchor_type, multiline, } => { writeln!(f, "Anchor {:?} multiline={}", anchor_type, multiline)?; } Node::Loop { quant, enclosed_groups, .. } => { writeln!(f, "Loop (groups {:?}) {:?}", enclosed_groups, quant)?; } Node::Loop1CharBody { quant, .. } => { writeln!(f, "Loop1Char {:?}", quant)?; } Node::CaptureGroup(_node, idx, ..) => { writeln!(f, "CaptureGroup {:?}", idx)?; } Node::NamedCaptureGroup(_node, _, name) => { writeln!(f, "NamedCaptureGroup {:?}", name)?; } &Node::WordBoundary { invert } => { let kind = if invert { "\\B" } else { "\\b" }; writeln!(f, "WordBoundary {:?} ", kind)?; } &Node::BackRef(group) => { writeln!(f, "BackRef {:?} ", group)?; } Node::Bracket(contents) => { writeln!(f, "Bracket {:?}", contents)?; } &Node::LookaroundAssertion { negate, backwards, start_group, end_group, .. } => { let sense = if negate { "negative" } else { "positive" }; let direction = if backwards { "backwards" } else { "forwards" }; writeln!( f, "LookaroundAssertion {} {} {:?} {:?}", sense, direction, start_group, end_group )?; } } Ok(()) } impl fmt::Display for Regex { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { //display_node(&self.node, 0, f) let mut result = Ok(()); walk( false, self.flags.unicode, &self.node, &mut |node: &Node, walk: &mut Walk| { if result.is_ok() { result = display_node(node, walk.depth, f) } }, ); result } } regress-0.10.5/src/lib.rs000064400000000000000000000127421046102023000132720ustar 00000000000000/*! # regress - REGex in Rust with EcmaScript Syntax This crate provides a regular expression engine which targets EcmaScript (aka JavaScript) regular expression syntax. # Example: test if a string contains a match ```rust use regress::Regex; let re = Regex::new(r"\d{4}").unwrap(); let matched = re.find("2020-20-05").is_some(); assert!(matched); ``` # Example: iterating over matches Here we use a backreference to find doubled characters: ```rust use regress::Regex; let re = Regex::new(r"(\w)\1").unwrap(); let text = "Frankly, Miss Piggy, I don't give a hoot!"; for m in re.find_iter(text) { println!("{}", &text[m.range()]) } // Output: ss // Output: gg // Output: oo ``` # Example: using capture groups Capture groups are available in the `Match` object produced by a successful match. A capture group is a range of byte indexes into the original string. ```rust use regress::Regex; let re = Regex::new(r"(\d{4})").unwrap(); let text = "Today is 2020-20-05"; let m = re.find(text).unwrap(); let group = m.group(1).unwrap(); println!("Year: {}", &text[group]); // Output: Year: 2020 ``` # Example: using with Pattern trait (nightly only) When the `pattern` feature is enabled and using nightly Rust, `Regex` can be used with standard string methods: ```rust,ignore #![feature(pattern)] use regress::Regex; let re = Regex::new(r"\d+").unwrap(); let text = "abc123def456"; // Use with str methods assert_eq!(text.find(&re), Some(3)); assert!(text.contains(&re)); let parts: Vec<&str> = text.split(&re).collect(); assert_eq!(parts, vec!["abc", "def", ""]); ``` # Example: escaping strings for literal matching Use the `escape` function to escape special regex characters in a string: ```rust use regress::{escape, Regex}; let user_input = "How much $ do you have? (in dollars)"; let escaped = escape(user_input); let re = Regex::new(&escaped).unwrap(); assert!(re.find(user_input).is_some()); ``` # Supported Syntax regress targets ES 2018 syntax. You can refer to the many resources about JavaScript regex syntax. There are some features which have yet to be implemented: - Named character classes liks `[[:alpha:]]` - Unicode property escapes like `\p{Sc}` Note the parser assumes the `u` (Unicode) flag, as the non-Unicode path is tied to JS's UCS-2 string encoding and the semantics cannot be usefully expressed in Rust. # Unicode remarks regress supports Unicode case folding. For example: ```rust use regress::Regex; let re = Regex::with_flags("\u{00B5}", "i").unwrap(); assert!(re.find("\u{03BC}").is_some()); ``` Here the U+00B5 (micro sign) was case-insensitively matched against U+03BC (small letter mu). regress does NOT perform normalization. For example, e-with-accute-accent can be precomposed or decomposed, and these are treated as not equivalent: ```rust use regress::{Regex, Flags}; let re = Regex::new("\u{00E9}").unwrap(); assert!(re.find("\u{0065}\u{0301}").is_none()); ``` This agrees with JavaScript semantics. Perform any required normalization before regex matching. ## Ascii matching regress has an "ASCII mode" which treats each 8-bit quantity as a separate character. This may provide improved performance if you do not need Unicode semantics, because it can avoid decoding UTF-8 and has simpler (ASCII-only) case-folding. Example: ```rust use regress::Regex; let re = Regex::with_flags("BC", "i").unwrap(); assert!(re.find("abcd").is_some()); ``` # Comparison to regex crate regress supports features (required by the EcmaScript spec) that regex does not, including backreferences and zero-width lookaround assertions. However the regex crate provides linear-time matching guarantees, while regress does not. This difference is due to the architecture: regex uses finite automata while regress uses "classical backtracking." # Architecture regress has a parser, intermediate representation, optimizer which acts on the IR, bytecode emitter, and two bytecode interpreters, referred to as "backends". The major interpreter is the "classical backtracking" which uses an explicit backtracking stack, similar to JS implementations. There is also the "PikeVM" pseudo-toy backend which is mainly used for testing and verification. # Crate features - **utf16**. When enabled, additional APIs are made available that allow matching text formatted in UTF-16 and UCS-2 (`&[u16]`) without going through a conversion to and from UTF-8 (`&str`) first. This is particularly useful when interacting with and/or (re)implementing existing systems that use those encodings, such as JavaScript, Windows, and the JVM. - **pattern**. When enabled (nightly only), implements the `std::str::pattern::Pattern` trait for `Regex`, allowing it to be used with standard string methods like `str::find`, `str::contains`, `str::split`, etc. */ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(feature = "pattern", feature(pattern))] #![warn(clippy::all)] #![allow( clippy::upper_case_acronyms, clippy::match_like_matches_macro, clippy::uninlined_format_args, clippy::collapsible_if )] // Clippy's manual_range_contains suggestion produces worse codegen. #![allow(clippy::manual_range_contains)] #[cfg(not(feature = "std"))] #[macro_use] extern crate alloc; pub use crate::api::*; #[macro_use] mod util; mod api; mod bytesearch; mod charclasses; mod classicalbacktrack; mod codepointset; mod cursor; mod emit; mod exec; mod indexing; mod insn; mod ir; mod matchers; mod optimizer; mod parse; mod position; mod scm; mod startpredicate; mod types; mod unicode; mod unicodetables; #[cfg(feature = "backend-pikevm")] mod pikevm; regress-0.10.5/src/matchers.rs000064400000000000000000000053521046102023000143310ustar 00000000000000use crate::cursor::Direction; use crate::indexing::{ElementType, InputIndexer}; use crate::types::BracketContents; use crate::{cursor, unicode}; pub trait CharProperties { type Element: ElementType; /// Case-fold an element. fn fold(c: Self::Element, unicode: bool) -> Self::Element; /// \return whether this is a word char. /// ES9 21.2.2.6.2. fn is_word_char(c: Self::Element) -> bool { let c = c.as_u32(); 'a' as u32 <= c && c <= 'z' as u32 || 'A' as u32 <= c && c <= 'Z' as u32 || '0' as u32 <= c && c <= '9' as u32 || c == '_' as u32 } /// ES9 11.3 fn is_line_terminator(c: Self::Element) -> bool { matches!(c.as_u32(), 0x000A | 0x000D | 0x2028 | 0x2029) } /// \return whether the bracket \p bc matches the given character \p c, /// respecting case. Respects 'invert'. #[inline(always)] fn bracket(bc: &BracketContents, cp: Self::Element) -> bool { let cp = cp.into(); if bc.cps.contains(cp) { return !bc.invert; } bc.invert } } pub struct UTF8CharProperties {} impl CharProperties for UTF8CharProperties { type Element = char; fn fold(c: Self::Element, unicode: bool) -> Self::Element { char::from_u32(unicode::fold_code_point(c.into(), unicode)).unwrap_or(c) } } pub struct ASCIICharProperties {} impl CharProperties for ASCIICharProperties { type Element = u8; fn fold(c: Self::Element, _: bool) -> Self::Element { c.to_ascii_uppercase() } } #[cfg(feature = "utf16")] pub struct Utf16CharProperties {} #[cfg(feature = "utf16")] impl CharProperties for Utf16CharProperties { type Element = u32; fn fold(c: Self::Element, unicode: bool) -> Self::Element { unicode::fold_code_point(c, unicode) } } /// Check whether the \p orig_range within \p cursor matches position \p pos. pub fn backref( input: &Input, dir: Dir, orig_range: core::ops::Range, pos: &mut Input::Position, ) -> bool { input.subrange_eq(dir, pos, orig_range) } pub fn backref_icase( input: &Input, dir: Dir, orig_range: core::ops::Range, pos: &mut Input::Position, ) -> bool { let ref_input = input.subinput(orig_range); let mut ref_pos = if Dir::FORWARD { ref_input.left_end() } else { ref_input.right_end() }; while let Some(c1) = cursor::next(&ref_input, dir, &mut ref_pos) { let mut matched = false; if let Some(c2) = cursor::next(input, dir, pos) { matched = input.fold_equals(c1, c2) } if !matched { return false; } } true } regress-0.10.5/src/optimizer.rs000064400000000000000000000442501046102023000145450ustar 00000000000000//! Optimizations on regex IR use crate::insn::{MAX_BYTE_SET_LENGTH, MAX_CHAR_SET_LENGTH}; use crate::ir::*; use crate::types::BracketContents; use crate::unicode; #[cfg(not(feature = "std"))] use alloc::{boxed::Box, vec::Vec}; /// When unrolling a loop, the largest minimum count we will unroll. const LOOP_UNROLL_THRESHOLD: usize = 5; /// Things that a Pass may do. pub enum PassAction { // Do nothing to the given node. Keep, // Notes that we modified the node in-place. Modified, // Remove the given node outright, effectively replacing it with empty. Remove, /// Replace the given node with a new Node. Replace(Node), } #[derive(Debug)] struct Pass<'a, F> where F: FnMut(&mut Node, &Walk) -> PassAction, { // The function. func: &'a mut F, // Whether this pass has changed anything. changed: bool, // If the regex is in unicode mode. unicode: bool, } impl<'a, F> Pass<'a, F> where F: FnMut(&mut Node, &Walk) -> PassAction, { fn new(func: &'a mut F, unicode: bool) -> Self { Pass { func, changed: false, unicode, } } fn run_postorder(&mut self, start: &mut Node) { walk_mut( true, self.unicode, start, &mut |n: &mut Node, walk: &mut Walk| match (self.func)(n, walk) { PassAction::Keep => {} PassAction::Modified => { self.changed = true; } PassAction::Remove => { *n = Node::Empty; self.changed = true; } PassAction::Replace(newnode) => { *n = newnode; self.changed = true; } }, ) } fn run_to_fixpoint(&mut self, n: &mut Node) { debug_assert!(!self.changed, "Pass has already been run"); loop { self.changed = false; self.run_postorder(n); if !self.changed { break; } } } } /// Run a "pass" on a regex, which is a function that takes a Node and maybe /// returns a new node. \return true if something changed, false if nothing did. fn run_pass(r: &mut Regex, func: &mut F) -> bool where F: FnMut(&mut Node, &Walk) -> PassAction, { let mut p = Pass::new(func, r.flags.unicode); p.run_to_fixpoint(&mut r.node); p.changed } // Here are some optimizations we support. // Remove empty Nodes. fn remove_empties(n: &mut Node, _w: &Walk) -> PassAction { match n { Node::Empty | Node::Goal | Node::Char { .. } => PassAction::Keep, Node::ByteSequence(v) => { if v.is_empty() { PassAction::Remove } else { PassAction::Keep } } // Note: do not remove empty sets. These always match against one character; an empty set // should just fail. Node::ByteSet(..) | Node::CharSet(..) => PassAction::Keep, Node::Cat(nodes) => { let blen = nodes.len(); nodes.retain(|nn| !nn.is_empty()); if nodes.len() == blen { // Nothing was removed. PassAction::Keep } else { match nodes.len() { 0 => PassAction::Remove, 1 => PassAction::Replace(nodes.pop().unwrap()), _ => PassAction::Modified, } } } Node::Alt(left, right) => { // Empty alt may match the empty string. // Remove it only if both sides are empty. if left.is_empty() && right.is_empty() { PassAction::Remove } else { PassAction::Keep } } Node::MatchAny | Node::MatchAnyExceptLineTerminator | Node::Anchor { .. } => { PassAction::Keep } Node::Loop { quant, loopee, enclosed_groups, } => { // A loop is empty if it has an empty body, or 0 max iters. // But do not remove contained capture groups. if loopee.is_empty() || (quant.max == Some(0) && enclosed_groups.start == enclosed_groups.end) { PassAction::Remove } else { PassAction::Keep } } Node::Loop1CharBody { .. } => PassAction::Keep, Node::CaptureGroup(..) | Node::NamedCaptureGroup(..) => { // Capture groups could in principle be optimized if they only match empties. PassAction::Keep } Node::WordBoundary { .. } | Node::BackRef { .. } | Node::Bracket { .. } => PassAction::Keep, Node::LookaroundAssertion { negate, contents, .. } => { // Negative arounds that match empties could in principle be optimized to always // fail. Here we only optimize positive ones. if !*negate && contents.is_empty() { PassAction::Remove } else { PassAction::Keep } } } } /// Check if a node contains any capture groups (direct or nested) fn contains_capture_groups(node: &Node) -> bool { match node { Node::CaptureGroup(_, _) | Node::NamedCaptureGroup(_, _, _) => true, Node::Cat(nodes) => nodes.iter().any(contains_capture_groups), Node::Alt(left, right) => contains_capture_groups(left) || contains_capture_groups(right), Node::Loop { loopee, .. } => contains_capture_groups(loopee), Node::LookaroundAssertion { contents, .. } => contains_capture_groups(contents), _ => false, } } // If a node can never match, replace it with an always fails node. fn propagate_early_fails(n: &mut Node, _w: &Walk) -> PassAction { // Don't optimize nodes containing capture groups to preserve user-visible group numbers if contains_capture_groups(n) { return PassAction::Keep; } match n { Node::Cat(nodes) => { // If any child is an early fail, we are an early fail. // Note this assumes that there is no node after a Goal node. if nodes.iter().any(|nn| nn.match_always_fails()) { PassAction::Replace(Node::make_always_fails()) } else { PassAction::Keep } } Node::Alt(left, right) => { // If both sides are early fails, we are an early fail. let left_fails = left.match_always_fails(); let right_fails = right.match_always_fails(); match (left_fails, right_fails) { (true, true) => PassAction::Replace(Node::make_always_fails()), (false, false) => PassAction::Keep, (true, false) | (false, true) => { // Here either our left or right node always fails. // "Steal" the other and return it, replacing us. let mut new_node = Node::Empty; core::mem::swap( &mut new_node, if left_fails { &mut *right } else { &mut *left }, ); PassAction::Replace(new_node) } } } Node::Loop { loopee, quant, enclosed_groups, } => { if enclosed_groups.start < enclosed_groups.end { return PassAction::Keep; } // If the loop body always fails, we always fail. if quant.min > 0 && loopee.match_always_fails() { PassAction::Replace(Node::make_always_fails()) } else { PassAction::Keep } } _ => PassAction::Keep, } } // Remove excess cats. fn decat(n: &mut Node, _w: &Walk) -> PassAction { match n { Node::Cat(nodes) => { if nodes.is_empty() { PassAction::Remove } else if nodes.len() == 1 { PassAction::Replace(nodes.pop().unwrap()) } else if nodes.iter().any(|nn| nn.is_cat()) { // Flatmap child cats. // Unfortunately we can't use flatmap() because there's no single iterator type // we can return. // Avoid copying nodes by switching them into owned vec. let mut catted = Vec::new(); core::mem::swap(nodes, &mut catted); // Decat them. let mut decatted = Vec::new(); for nn in catted { match nn { Node::Cat(mut nnodes) => { decatted.append(&mut nnodes); } _ => decatted.push(nn), } } PassAction::Replace(Node::Cat(decatted)) } else { PassAction::Keep } } _ => PassAction::Keep, } } /// Unfold icase chars. /// That means for case-insensitive characters, figure out everything that they /// could match. /// TODO: evaluate unfolding performance and consider a cache within the optimizer. fn unfold_icase_chars(n: &mut Node, w: &Walk) -> PassAction { match *n { Node::Char { c, icase } if icase && !w.unicode => { let unfolded = unicode::unfold_uppercase_char(c); debug_assert!( unfolded.contains(&c), "Char should always unfold to at least itself" ); match unfolded.len() { 0 => panic!("Char should always unfold to at least itself"), 1 => { // Character does not fold or unfold at all. PassAction::Replace(Node::Char { c, icase: false }) } 2..=MAX_BYTE_SET_LENGTH => { // We unfolded to 2+ characters. PassAction::Replace(Node::CharSet(unfolded)) } _ => panic!("Unfolded to more characters than we believed possible"), } } Node::Char { c, icase } if icase => { let unfolded = unicode::unfold_char(c); debug_assert!( unfolded.contains(&c), "Char should always unfold to at least itself" ); match unfolded.len() { 0 => panic!("Char should always unfold to at least itself"), 1 => { // Character does not fold or unfold at all. PassAction::Replace(Node::Char { c, icase: false }) } 2..=MAX_BYTE_SET_LENGTH => { // We unfolded to 2+ characters. PassAction::Replace(Node::CharSet(unfolded)) } _ => panic!("Unfolded to more characters than we believed possible"), } } _ => PassAction::Keep, } } // Perform simple unrolling of loops that have a minimum. fn unroll_loops(n: &mut Node, _w: &Walk) -> PassAction { match n { Node::Loop { loopee, quant, enclosed_groups, } => { // TODO: consider ignoring loops with nested sub-loops? // Do not unroll loops with enclosed groups. if enclosed_groups.start < enclosed_groups.end { return PassAction::Keep; } // Do not unroll large loops, or loops which may execute zero times. if quant.min == 0 || quant.min > LOOP_UNROLL_THRESHOLD { return PassAction::Keep; } // We made it through. Replace us with a cat. let mut unrolled = Vec::new(); for _ in 0..quant.min { let Some(node) = loopee.try_duplicate(0) else { return PassAction::Keep; }; unrolled.push(node); } // We unrolled 'min' elements. // Maybe our loop is now empty. quant.max = quant.max.map(|v| v - quant.min); quant.min = 0; if quant.max != Some(0) { // Move the loop to the end of unrolled. let mut loop_node = Node::Empty; core::mem::swap(&mut loop_node, n); unrolled.push(loop_node); } *n = Node::Cat(unrolled); PassAction::Modified } _ => PassAction::Keep, } } /// Replace Loops with 1Char loops whenever possible. fn promote_1char_loops(n: &mut Node, _w: &Walk) -> PassAction { match n { Node::Loop { loopee, quant, enclosed_groups, } => { // Must be 1Char. if !loopee.matches_exactly_one_char() { return PassAction::Keep; } // The above check should be sufficient to ensure we have no enclosed groups. assert!( enclosed_groups.start >= enclosed_groups.end, "Should have no enclosed groups" ); // This feels hackish? let mut new_loopee = Box::new(Node::Empty); core::mem::swap(&mut new_loopee, loopee); *n = Node::Loop1CharBody { loopee: new_loopee, quant: *quant, }; PassAction::Modified } _ => PassAction::Keep, } } /// Replace Cat(Char) with ByteSeq. /// Also replace chars with literal bytes. /// Don't do this in utf16 mode because UTF-16 should never match against bytes. /// TODO: this seems to do too much; consider breaking this up. #[cfg(not(feature = "utf16"))] fn form_literal_bytes(n: &mut Node, walk: &Walk) -> PassAction { // Helper to return a mutable reference to the nodes of a literal bytes. fn get_literal_bytes(n: &mut Node) -> Option<&mut Vec> { match n { Node::ByteSequence(v) => Some(v), _ => None, } } match n { Node::Char { c, icase } if !*icase => { if let Some(c) = char::from_u32(*c) { let mut buff = [0; 4]; PassAction::Replace(Node::ByteSequence( c.encode_utf8(&mut buff).as_bytes().to_vec(), )) } else { PassAction::Keep } } Node::CharSet(chars) if chars.iter().all(|&c| c <= 0x7F) => { // All of our chars are ASCII; use a byte set instead. PassAction::Replace(Node::ByteSet(chars.iter().map(|&c| c as u8).collect())) } Node::Cat(nodes) => { // Find and merge adjacent ByteSeq. let mut modified = false; for idx in 1..nodes.len() { let (prev_slice, curr_slice) = nodes.split_at_mut(idx); match ( get_literal_bytes(prev_slice.last_mut().unwrap()), get_literal_bytes(curr_slice.first_mut().unwrap()), ) { (Some(prev_bytes), Some(curr_bytes)) if !prev_bytes.is_empty() && !curr_bytes.is_empty() => { if walk.in_lookbehind { // Our characters were already reversed; we need to reverse them again // as literal bytes are always forwards. For // example, if we have (<=ab), then we will get Cat(b, a) but we want // literal bytes "ab". curr_bytes.append(prev_bytes); } else { prev_bytes.append(curr_bytes); core::mem::swap(prev_bytes, curr_bytes); } modified = true; } _ => (), } } if modified { PassAction::Modified } else { PassAction::Keep } } _ => PassAction::Keep, } } /// Try to reduce a bracket to something simpler. fn try_reduce_bracket(bc: &BracketContents) -> Option { if bc.invert { // Give up. return None; } // Count the number of code points. let mut cps_count = 0; for iv in bc.cps.intervals() { cps_count += iv.count_codepoints(); } if cps_count > MAX_CHAR_SET_LENGTH { // Too many code points. return None; } // Ok, we want to make a char set. // Note we cannot make a char out of surrogates; should char conversion fail we // just give up. let mut res = Vec::new(); for iv in bc.cps.intervals() { for cp in iv.codepoints() { res.push(cp); } } debug_assert!(res.len() <= MAX_CHAR_SET_LENGTH, "Unexpectedly many chars"); Some(Node::CharSet(res)) } /// Optimize brackets like [a-b]. /// Optimize certain stupid brackets like `[a]` to a single char. /// Invert a bracket if it would *reduce* the number of ranges. /// Note we only run this once. fn simplify_brackets(n: &mut Node, _walk: &Walk) -> PassAction { match n { Node::Bracket(bc) => { if let Some(new_node) = try_reduce_bracket(bc) { return PassAction::Replace(new_node); } // TODO: does this ever help anything? if bc.cps.intervals().len() > bc.cps.inverted_interval_count() { bc.cps = bc.cps.inverted(); bc.invert = !bc.invert; PassAction::Modified } else { PassAction::Keep } } _ => PassAction::Keep, } } pub fn optimize(r: &mut Regex) { run_pass(r, &mut simplify_brackets); loop { let mut changed = false; changed |= run_pass(r, &mut decat); if r.flags.icase { changed |= run_pass(r, &mut unfold_icase_chars); } changed |= run_pass(r, &mut unroll_loops); changed |= run_pass(r, &mut promote_1char_loops); #[cfg(not(feature = "utf16"))] { changed |= run_pass(r, &mut form_literal_bytes); } changed |= run_pass(r, &mut remove_empties); changed |= run_pass(r, &mut propagate_early_fails); if !changed { break; } } } regress-0.10.5/src/parse.rs000064400000000000000000002227731046102023000136450ustar 00000000000000//! Parser from regex patterns to IR use crate::{ api, charclasses, codepointset::{CodePointSet, Interval, interval_contains}, ir, types::{ BracketContents, CaptureGroupID, CaptureGroupName, CharacterClassType, MAX_CAPTURE_GROUPS, MAX_LOOPS, }, unicode::{ self, PropertyEscapeKind, unicode_property_from_str, unicode_property_name_from_str, }, unicodetables::{id_continue_ranges, id_start_ranges}, util::to_char_sat, }; use core::{fmt, iter::Peekable}; #[cfg(feature = "std")] use std::collections::HashMap; #[cfg(not(feature = "std"))] use { alloc::{ boxed::Box, string::{String, ToString}, vec::Vec, }, hashbrown::HashMap, }; /// Represents an error encountered during regex compilation. /// /// The text contains a human-readable error message. #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Error { pub text: String, } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str(&self.text) } } #[cfg(feature = "std")] impl std::error::Error for Error {} enum ClassAtom { CodePoint(u32), CharacterClass { class_type: CharacterClassType, positive: bool, }, Range { iv: CodePointSet, negate: bool, }, } /// Represents the result of a class set. #[derive(Debug, Clone)] struct ClassSet { codepoints: CodePointSet, alternatives: ClassSetAlternativeStrings, } impl ClassSet { fn new() -> Self { ClassSet { codepoints: CodePointSet::new(), alternatives: ClassSetAlternativeStrings::new(), } } fn node(self, icase: bool, negate_set: bool) -> ir::Node { let codepoints = if icase { unicode::add_icase_code_points(self.codepoints) } else { self.codepoints }; if codepoints.is_empty() && self.alternatives.0.is_empty() { ir::Node::Bracket(BracketContents { invert: negate_set, cps: codepoints, }) } else if codepoints.is_empty() { make_alt(self.alternatives.to_nodes(icase)) } else if self.alternatives.0.is_empty() { ir::Node::Bracket(BracketContents { invert: negate_set, cps: codepoints, }) } else { let mut nodes = self.alternatives.to_nodes(icase); nodes.push(ir::Node::Bracket(BracketContents { invert: negate_set, cps: codepoints, })); make_alt(nodes) } } fn union_operand(&mut self, operand: ClassSetOperand) { match operand { ClassSetOperand::ClassSetCharacter(c) => { self.codepoints.add_one(c); } ClassSetOperand::CharacterClassEscape(cps) => { self.codepoints.add_set(cps); } ClassSetOperand::Class(class) => { self.codepoints.add_set(class.codepoints); self.alternatives.extend(class.alternatives); } ClassSetOperand::ClassStringDisjunction(s) => { self.alternatives.extend(s); } } } fn intersect_operand(&mut self, operand: ClassSetOperand) { match operand { ClassSetOperand::ClassSetCharacter(c) => { if self.codepoints.contains(c) { self.codepoints = CodePointSet::from_sorted_disjoint_intervals(Vec::from([Interval { first: c, last: c, }])); } else { self.codepoints.clear(); } let mut found_alternative = false; for alternative in &mut self.alternatives.0 { if alternative.len() == 1 && alternative[0] == c { found_alternative = true; break; } } self.alternatives.0.clear(); if found_alternative { self.alternatives.0.push(Vec::from([c])); } } ClassSetOperand::CharacterClassEscape(cps) => { self.codepoints.intersect(cps.intervals()); let mut retained = Vec::new(); for alternative in &self.alternatives.0 { if alternative.len() == 1 && cps.contains(alternative[0]) { retained.push(alternative.clone()); } } self.alternatives.0 = retained; } ClassSetOperand::Class(class) => { let mut retained_codepoints = CodePointSet::new(); for alternative in &class.alternatives.0 { if alternative.len() == 1 && self.codepoints.contains(alternative[0]) { retained_codepoints.add_one(alternative[0]); } } let mut retained_alternatives = ClassSetAlternativeStrings::new(); for alternative in &self.alternatives.0 { if alternative.len() == 1 && class.codepoints.contains(alternative[0]) { retained_alternatives.0.push(alternative.clone()); } } self.codepoints.intersect(class.codepoints.intervals()); self.codepoints.add_set(retained_codepoints); self.alternatives.intersect(class.alternatives); self.alternatives.extend(retained_alternatives); } ClassSetOperand::ClassStringDisjunction(s) => { let mut retained = CodePointSet::new(); for alternative in &s.0 { if alternative.len() == 1 && self.codepoints.contains(alternative[0]) { retained.add_one(alternative[0]); } } self.codepoints = retained; self.alternatives.intersect(s); } } } fn subtract_operand(&mut self, operand: ClassSetOperand) { match operand { ClassSetOperand::ClassSetCharacter(c) => { self.codepoints.remove(&[Interval { first: c, last: c }]); self.alternatives .remove(ClassSetAlternativeStrings(Vec::from([Vec::from([c])]))); } ClassSetOperand::CharacterClassEscape(cps) => { self.codepoints.remove(cps.intervals()); let mut to_remove = ClassSetAlternativeStrings::new(); for alternative in &self.alternatives.0 { if alternative.len() == 1 && cps.contains(alternative[0]) { to_remove.0.push(alternative.clone()); } } self.alternatives.remove(to_remove); } ClassSetOperand::Class(class) => { let mut codepoints_removed = CodePointSet::new(); for alternative in &class.alternatives.0 { if alternative.len() == 1 && self.codepoints.contains(alternative[0]) { codepoints_removed.add_one(alternative[0]); } } let mut alternatives_removed = ClassSetAlternativeStrings::new(); for alternative in &self.alternatives.0 { if alternative.len() == 1 && class.codepoints.contains(alternative[0]) { alternatives_removed.0.push(alternative.clone()); } } self.codepoints.remove(codepoints_removed.intervals()); self.codepoints.remove(class.codepoints.intervals()); self.alternatives.remove(alternatives_removed); self.alternatives.remove(class.alternatives); } ClassSetOperand::ClassStringDisjunction(s) => { let mut to_remove = CodePointSet::new(); for alternative in &s.0 { if alternative.len() == 1 && self.codepoints.contains(alternative[0]) { to_remove.add_one(alternative[0]); } } self.codepoints.remove(to_remove.intervals()); self.alternatives.remove(s); } } } } /// Represents all different types of class set operands. #[derive(Debug, Clone)] enum ClassSetOperand { ClassSetCharacter(u32), CharacterClassEscape(CodePointSet), Class(ClassSet), ClassStringDisjunction(ClassSetAlternativeStrings), } #[derive(Debug, Clone)] struct ClassSetAlternativeStrings(Vec>); impl ClassSetAlternativeStrings { fn new() -> Self { ClassSetAlternativeStrings(Vec::new()) } fn extend(&mut self, other: Self) { self.0.extend(other.0); } fn intersect(&mut self, other: Self) { let mut retained = Vec::new(); for string in &self.0 { for other_string in &other.0 { if string == other_string { retained.push(string.clone()); break; } } } self.0 = retained; } fn remove(&mut self, other: Self) { self.0.retain(|string| !other.0.contains(string)); } fn to_nodes(&self, icase: bool) -> Vec { let mut nodes = Vec::new(); for string in &self.0 { nodes.push(ir::Node::Cat( string .iter() .map(|cp| ir::Node::Char { c: *cp, icase }) .collect::>(), )); } nodes } } fn error(text: S) -> Result where S: ToString, { Err(Error { text: text.to_string(), }) } fn make_cat(nodes: ir::NodeList) -> ir::Node { match nodes.len() { 0 => ir::Node::Empty, 1 => nodes.into_iter().next().unwrap(), _ => ir::Node::Cat(nodes), } } fn make_alt(nodes: ir::NodeList) -> ir::Node { let mut mright = None; for node in nodes.into_iter().rev() { match mright { None => mright = Some(node), Some(right) => mright = Some(ir::Node::Alt(Box::new(node), Box::new(right))), } } mright.unwrap_or(ir::Node::Empty) } /// \return a CodePointSet for a given character escape (positive or negative). /// See ES9 21.2.2.12. fn codepoints_from_class(ct: CharacterClassType, positive: bool) -> CodePointSet { let mut cps; match ct { CharacterClassType::Digits => { cps = CodePointSet::from_sorted_disjoint_intervals(charclasses::DIGITS.to_vec()) } CharacterClassType::Words => { cps = CodePointSet::from_sorted_disjoint_intervals(charclasses::WORD_CHARS.to_vec()) } CharacterClassType::Spaces => { cps = CodePointSet::from_sorted_disjoint_intervals(charclasses::WHITESPACE.to_vec()); for &iv in charclasses::LINE_TERMINATOR.iter() { cps.add(iv) } } }; if !positive { cps = cps.inverted() } cps } /// \return a Bracket for a given character escape (positive or negative). fn make_bracket_class(ct: CharacterClassType, positive: bool) -> ir::Node { ir::Node::Bracket(BracketContents { invert: false, cps: codepoints_from_class(ct, positive), }) } fn add_class_atom(bc: &mut BracketContents, atom: ClassAtom) { match atom { ClassAtom::CodePoint(c) => bc.cps.add_one(c), ClassAtom::CharacterClass { class_type, positive, } => { bc.cps.add_set(codepoints_from_class(class_type, positive)); } ClassAtom::Range { iv, negate } => { if negate { bc.cps.add_set(iv.inverted()); } else { bc.cps.add_set(iv); } } } } struct LookaroundParams { negate: bool, backwards: bool, } /// Represents the state used to parse a regex. struct Parser where I: Iterator, { /// The remaining input. input: Peekable, /// Flags used. flags: api::Flags, /// Number of loops. loop_count: u32, /// Number of capturing groups. group_count: CaptureGroupID, /// Maximum number of capturing groups. group_count_max: u32, /// Named capture group references. named_group_indices: HashMap, /// Whether a lookbehind was encountered. has_lookbehind: bool, } impl Parser where I: Iterator + Clone, { /// Consume a character, returning it. fn consume>(&mut self, c: C) -> u32 { let nc = self.input.next(); core::debug_assert!(nc == Some(c.into()), "char was not next"); nc.unwrap() } /// If our contents begin with the char c, consume it from our contents /// and return true. Otherwise return false. fn try_consume>(&mut self, c: C) -> bool { self.input.next_if_eq(&c.into()).is_some() } /// If our contents begin with the string \p s, consume it from our contents /// and return true. Otherwise return false. fn try_consume_str(&mut self, s: &str) -> bool { let mut cursor = self.input.clone(); for c1 in s.chars() { if cursor.next() != Some(c1 as u32) { return false; } } self.input = cursor; true } /// Fold a character if icase. fn fold_if_icase(&self, c: u32) -> u32 { if self.flags.icase { unicode::fold_code_point(c, self.flags.unicode) } else { c } } /// Peek at the next character. fn peek(&mut self) -> Option { self.input.peek().copied() } /// \return the next character. fn next(&mut self) -> Option { self.input.next() } fn try_parse(&mut self) -> Result { self.parse_capture_groups()?; // Parse a catenation. If we consume everything, it's success. If there's // something left, it's an error (for example, an excess closing paren). let body = self.consume_disjunction()?; match self.input.peek().copied() { Some(c) if c == ')' as u32 => error("Unbalanced parenthesis"), Some(c) => error(format!( "Unexpected char: {}", char::from_u32(c) .map(String::from) .unwrap_or_else(|| format!("\\u{c:04X}")) )), None => self.finalize(ir::Regex { node: make_cat(vec![body, ir::Node::Goal]), flags: self.flags, }), } } /// ES6 21.2.2.3 Disjunction. fn consume_disjunction(&mut self) -> Result { let mut terms = vec![self.consume_term()?]; while self.try_consume('|') { terms.push(self.consume_term()?) } Ok(make_alt(terms)) } /// ES6 21.2.2.5 Term. fn consume_term(&mut self) -> Result { let mut result: Vec = Vec::new(); loop { let start_group = self.group_count; let mut start_offset = result.len(); let mut quantifier_allowed = true; let nc = self.peek(); if nc.is_none() { return Ok(make_cat(result)); } let c = nc.unwrap(); match to_char_sat(c) { // A concatenation is terminated by closing parens or vertical bar (alternations). ')' | '|' => break, // Term :: Assertion :: ^ '^' => { self.consume('^'); result.push(ir::Node::Anchor { anchor_type: ir::AnchorType::StartOfLine, multiline: self.flags.multiline, }); quantifier_allowed = false; } // Term :: Assertion :: $ '$' => { self.consume('$'); result.push(ir::Node::Anchor { anchor_type: ir::AnchorType::EndOfLine, multiline: self.flags.multiline, }); quantifier_allowed = false; } '\\' => { self.consume('\\'); let Some(c) = self.peek() else { return error("Incomplete escape"); }; match to_char_sat(c) { // Term :: Assertion :: \b 'b' => { self.consume('b'); result.push(ir::Node::WordBoundary { invert: false }); } // Term :: Assertion :: \B 'B' => { self.consume('B'); result.push(ir::Node::WordBoundary { invert: true }); } // Term :: Atom :: \ AtomEscape :: CharacterEscape :: c AsciiLetter // Term :: ExtendedAtom :: \ [lookahead = c] 'c' if !self.flags.unicode => { self.consume('c'); if self .peek() .and_then(char::from_u32) .map(|c| c.is_ascii_alphabetic()) == Some(true) { result.push(ir::Node::Char { c: self.next().expect("char was not next") % 32, icase: self.flags.icase, }); } else { start_offset += 1; result.push(ir::Node::Char { c: u32::from('\\'), icase: self.flags.icase, }); result.push(ir::Node::Char { c: u32::from('c'), icase: self.flags.icase, }); } } // Term :: Atom :: \ AtomEscape _ => { result.push(self.consume_atom_escape()?); } } } // Term :: Atom :: . '.' => { self.consume('.'); result.push(if self.flags.dot_all { ir::Node::MatchAny } else { ir::Node::MatchAnyExceptLineTerminator }); } '(' => { if self.try_consume_str("(?=") { // Positive lookahead. quantifier_allowed = !self.flags.unicode; result.push(self.consume_lookaround_assertion(LookaroundParams { negate: false, backwards: false, })?); } else if self.try_consume_str("(?!") { // Negative lookahead. quantifier_allowed = !self.flags.unicode; result.push(self.consume_lookaround_assertion(LookaroundParams { negate: true, backwards: false, })?); } else if self.try_consume_str("(?<=") { // Positive lookbehind. quantifier_allowed = false; self.has_lookbehind = true; result.push(self.consume_lookaround_assertion(LookaroundParams { negate: false, backwards: true, })?); } else if self.try_consume_str("(?= MAX_CAPTURE_GROUPS { return error("Capture group count limit exceeded"); } self.group_count += 1; // Parse capture group name. if self.try_consume_str("?") { let group_name = if let Some(group_name) = self.try_consume_named_capture_group_name() { group_name } else { return error("Invalid token at named capture group identifier"); }; let contents = self.consume_disjunction()?; result.push(ir::Node::NamedCaptureGroup( Box::new(contents), group, group_name, )) } else { let contents = self.consume_disjunction()?; result.push(ir::Node::CaptureGroup(Box::new(contents), group)) } } if !self.try_consume(')') { return error("Unbalanced parenthesis"); } } // CharacterClass :: ClassContents :: ClassSetExpression '[' if self.flags.unicode_sets => { self.consume('['); let negate_set = self.try_consume('^'); result.push( self.consume_class_set_expression(negate_set)? .node(self.flags.icase, negate_set), ); } '[' => { result.push(self.consume_bracket()?); } // Term :: ExtendedAtom :: InvalidBracedQuantifier '{' if !self.flags.unicode => { if self.try_consume_braced_quantifier().is_some() { return error("Invalid braced quantifier"); } // Term :: ExtendedAtom :: ExtendedPatternCharacter result.push(ir::Node::Char { c: self.consume(c), icase: self.flags.icase, }) } // Term :: Atom :: PatternCharacter :: SourceCharacter but not ^ $ \ . * + ? ( ) [ ] { } | '*' | '+' | '?' | ']' | '{' | '}' if self.flags.unicode => { return error("Invalid atom character"); } // Term :: ExtendedAtom :: SourceCharacter but not ^ $ \ . * + ? ( ) [ | '*' | '+' | '?' => { return error("Invalid atom character"); } // Term :: Atom :: PatternCharacter // Term :: ExtendedAtom :: ExtendedPatternCharacter _ => { self.consume(c); result.push(ir::Node::Char { c: self.fold_if_icase(c), icase: self.flags.icase, }) } } // We just parsed a term; try parsing a quantifier. if let Some(quant) = self.try_consume_quantifier()? { if !quantifier_allowed { return error("Quantifier not allowed here"); } // Validate the quantifier. // Note we don't want to do this as part of parsing the quantiifer in some cases // an incomplete quantifier is not recognized as a quantifier, e.g. `/{3/` is // valid. if matches!(quant.max, Some(max) if quant.min > max) { return error("Invalid quantifier"); } let quantifee = result.split_off(start_offset); if self.loop_count as usize >= MAX_LOOPS { return error("Loop count limit exceeded"); } self.loop_count += 1; result.push(ir::Node::Loop { loopee: Box::new(make_cat(quantifee)), quant, enclosed_groups: start_group..self.group_count, }); } } Ok(make_cat(result)) } fn try_consume_modifier_group(&mut self) -> Result, Error> { let mut cursor = self.input.clone(); if cursor.next() != Some('(' as u32) { return Ok(None); } if cursor.next() != Some('?' as u32) { return Ok(None); } let Some(mut current) = cursor.next() else { return Ok(None); }; if to_char_sat(current) == '<' { return Ok(None); } let mut seen_hyphen = false; let mut saw_flag = false; let mut icase_override: Option = None; let mut multiline_override: Option = None; let mut dot_all_override: Option = None; loop { let ch = to_char_sat(current); match ch { 'i' | 'm' | 's' => { let value = !seen_hyphen; let target = match ch { 'i' => &mut icase_override, 'm' => &mut multiline_override, 's' => &mut dot_all_override, _ => unreachable!(), }; if target.is_some() { return error("Invalid group modifier"); } *target = Some(value); saw_flag = true; } '-' => { if seen_hyphen { return error("Invalid group modifier"); } seen_hyphen = true; } ':' => { if !saw_flag { return error("Invalid group modifier"); } self.input = cursor; let mut new_flags = self.flags; if let Some(value) = icase_override { new_flags.icase = value; } if let Some(value) = multiline_override { new_flags.multiline = value; } if let Some(value) = dot_all_override { new_flags.dot_all = value; } let saved_flags = self.flags; self.flags = new_flags; let contents = match self.consume_disjunction() { Ok(node) => node, Err(err) => { self.flags = saved_flags; return Err(err); } }; self.flags = saved_flags; return Ok(Some(contents)); } _ => { return error("Invalid group modifier"); } } current = match cursor.next() { Some(next) => next, None => return error("Invalid group modifier"), }; } } /// ES6 21.2.2.13 CharacterClass. fn consume_bracket(&mut self) -> Result { self.consume('['); let invert = self.try_consume('^'); let mut result = BracketContents { invert, cps: CodePointSet::default(), }; loop { match self.peek().map(to_char_sat) { None => { return error("Unbalanced bracket"); } Some(']') => { self.consume(']'); if self.flags.icase { result.cps = unicode::add_icase_code_points(result.cps); } return Ok(ir::Node::Bracket(result)); } _ => {} } // Parse a code point or character class. let Some(first) = self.try_consume_bracket_class_atom()? else { continue; }; // Check for a dash; we may have a range. if !self.try_consume('-') { add_class_atom(&mut result, first); continue; } let Some(second) = self.try_consume_bracket_class_atom()? else { // No second atom. For example: [a-]. add_class_atom(&mut result, first); add_class_atom(&mut result, ClassAtom::CodePoint(u32::from('-'))); continue; }; // Ranges must also be in order: z-a is invalid. // ES6 21.2.2.15.1 "If i > j, throw a SyntaxError exception" if let (ClassAtom::CodePoint(c1), ClassAtom::CodePoint(c2)) = (&first, &second) { if c1 > c2 { return error( "Range values reversed, start char code is greater than end char code.", ); } result.cps.add(Interval { first: *c1, last: *c2, }); continue; } if self.flags.unicode { return error("Invalid character range"); } // If it does not match a range treat as any match single characters. add_class_atom(&mut result, first); add_class_atom(&mut result, ClassAtom::CodePoint(u32::from('-'))); add_class_atom(&mut result, second); } } fn try_consume_bracket_class_atom(&mut self) -> Result, Error> { let c = self.peek(); if c.is_none() { return Ok(None); } let c = c.unwrap(); match to_char_sat(c) { // End of bracket. ']' => Ok(None), // ClassEscape '\\' => { self.consume('\\'); let ec = if let Some(ec) = self.peek() { ec } else { return error("Unterminated escape"); }; match to_char_sat(ec) { // ClassEscape :: b 'b' => { self.consume('b'); Ok(Some(ClassAtom::CodePoint(u32::from('\x08')))) } // ClassEscape :: [+UnicodeMode] - '-' if self.flags.unicode => { self.consume('-'); Ok(Some(ClassAtom::CodePoint(u32::from('-')))) } 'c' if !self.flags.unicode => { let input = self.input.clone(); self.consume('c'); match self.peek().map(to_char_sat) { // ClassEscape :: [~UnicodeMode] c ClassControlLetter Some('0'..='9' | '_') => { let next = self.next().expect("char was not next"); Ok(Some(ClassAtom::CodePoint(next & 0x1F))) } // CharacterEscape :: c AsciiLetter Some('a'..='z' | 'A'..='Z') => { let next = self.next().expect("char was not next"); Ok(Some(ClassAtom::CodePoint(next % 32))) } // ClassAtomNoDash :: \ [lookahead = c] _ => { self.input = input; Ok(Some(ClassAtom::CodePoint(u32::from('\\')))) } } } // ClassEscape :: CharacterClassEscape :: d 'd' => { self.consume('d'); Ok(Some(ClassAtom::CharacterClass { class_type: CharacterClassType::Digits, positive: true, })) } // ClassEscape :: CharacterClassEscape :: D 'D' => { self.consume('D'); Ok(Some(ClassAtom::CharacterClass { class_type: CharacterClassType::Digits, positive: false, })) } // ClassEscape :: CharacterClassEscape :: s 's' => { self.consume('s'); Ok(Some(ClassAtom::CharacterClass { class_type: CharacterClassType::Spaces, positive: true, })) } // ClassEscape :: CharacterClassEscape :: S 'S' => { self.consume('S'); Ok(Some(ClassAtom::CharacterClass { class_type: CharacterClassType::Spaces, positive: false, })) } // ClassEscape :: CharacterClassEscape :: w 'w' => { self.consume('w'); Ok(Some(ClassAtom::CharacterClass { class_type: CharacterClassType::Words, positive: true, })) } // ClassEscape :: CharacterClassEscape :: W 'W' => { self.consume('W'); Ok(Some(ClassAtom::CharacterClass { class_type: CharacterClassType::Words, positive: false, })) } // ClassEscape :: CharacterClassEscape :: [+UnicodeMode] p{ UnicodePropertyValueExpression } // ClassEscape :: CharacterClassEscape :: [+UnicodeMode] P{ UnicodePropertyValueExpression } 'p' | 'P' if self.flags.unicode => { self.consume(ec); let negate = ec == 'P' as u32; match self.try_consume_unicode_property_escape()? { PropertyEscapeKind::CharacterClass(s) => Ok(Some(ClassAtom::Range { iv: CodePointSet::from_sorted_disjoint_intervals(s.to_vec()), negate, })), PropertyEscapeKind::StringSet(_) => error("Invalid property escape"), } } // ClassEscape :: CharacterEscape _ => { let cc = self.consume_character_escape()?; Ok(Some(ClassAtom::CodePoint(cc))) } } } _ => Ok(Some(ClassAtom::CodePoint(self.consume(c)))), } } // CharacterClass :: ClassContents :: ClassSetExpression fn consume_class_set_expression(&mut self, negate_set: bool) -> Result { let mut result = ClassSet::new(); let first = match self.peek() { Some(0x5D /* ] */) => { self.consume(']'); return Ok(result); } Some(_) => self.consume_class_set_operand(negate_set)?, None => { return error("Unbalanced class set bracket"); } }; enum ClassSetOperator { Union, Intersection, Subtraction, } let op = match self.peek() { Some(0x5D /* ] */) => { self.consume(']'); result.union_operand(first); return Ok(result); } Some(0x26 /* & */) => { self.consume('&'); if self.peek() == Some(0x26 /* & */) { self.consume('&'); result.union_operand(first.clone()); ClassSetOperator::Intersection } else { result.codepoints.add_one(0x26 /* & */); ClassSetOperator::Union } } Some(0x2D /* - */) => { self.consume('-'); if self.peek() == Some(0x2D /* - */) { self.consume('-'); result.union_operand(first.clone()); ClassSetOperator::Subtraction } else { match first { ClassSetOperand::ClassSetCharacter(first) => { let ClassSetOperand::ClassSetCharacter(last) = self.consume_class_set_operand(negate_set)? else { return error("Invalid class set range"); }; if first > last { return error("Invalid class set range"); } result.codepoints.add(Interval { first, last }); } _ => { return error("Invalid class set range"); } }; ClassSetOperator::Union } } Some(_) => { result.union_operand(first.clone()); ClassSetOperator::Union } None => { return error("Unbalanced class set bracket"); } }; match op { ClassSetOperator::Union => { loop { let operand = match self.peek() { Some(0x5D /* ] */) => { self.consume(']'); return Ok(result); } Some(_) => self.consume_class_set_operand(negate_set)?, None => return error("Unbalanced class set bracket"), }; if self.peek() == Some(0x2D /* - */) { self.consume('-'); match operand { ClassSetOperand::ClassSetCharacter(first) => { let ClassSetOperand::ClassSetCharacter(last) = self.consume_class_set_operand(negate_set)? else { return error("Invalid class set range"); }; if first > last { return error("Invalid class set range"); } result.codepoints.add(Interval { first, last }); } _ => { return error("Invalid class set range"); } }; } else { result.union_operand(operand); } } } // ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperator::Intersection => { loop { let operand = self.consume_class_set_operand(negate_set)?; result.intersect_operand(operand); match self.next() { Some(0x5D /* ] */) => return Ok(result), Some(0x26 /* & */) => {} Some(_) => return error("Unexpected character in class set intersection"), _ => return error("Unbalanced class set bracket"), } if self.next() != Some(0x26 /* & */) { return error("Unbalanced class set bracket"); } } } // ClassSubtraction :: ClassSubtraction -- ClassSetOperand ClassSetOperator::Subtraction => { loop { let operand = self.consume_class_set_operand(negate_set)?; result.subtract_operand(operand); match self.next() { Some(0x5D /* ] */) => return Ok(result), Some(0x2D /* - */) => {} Some(_) => return error("Unexpected character in class set subtraction"), _ => return error("Unbalanced class set bracket"), } if self.next() != Some(0x2D /* - */) { return error("Unbalanced class set bracket"); } } } } } fn consume_class_set_operand(&mut self, negate_set: bool) -> Result { use ClassSetOperand::*; let Some(cp) = self.peek() else { return error("Empty class set operand"); }; match cp { // ClassSetOperand :: NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] // ClassSetOperand :: NestedClass :: [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] 0x5B /* [ */ => { self.consume('['); let negate_set = self.try_consume('^'); let result = self.consume_class_set_expression(negate_set)?; if negate_set { result.codepoints.inverted(); } Ok(Class(result)) } // ClassSetOperand :: NestedClass :: \ CharacterClassEscape // ClassSetOperand :: ClassStringDisjunction // ClassSetOperand :: ClassSetCharacter :: \... // ClassSetRange :: ClassSetCharacter :: \... 0x5C /* \ */ => { self.consume('\\'); let Some(cp) = self.peek() else { return error("Incomplete class set escape"); }; match cp { // ClassStringDisjunction \q{ ClassStringDisjunctionContents } 0x71 /* q */ => { self.consume('q'); if !self.try_consume('{') { return error("Invalid class set escape: expected {"); } let mut alternatives = Vec::new(); let mut alternative = Vec::new(); loop { match self.peek() { Some(0x7D /* } */) => { self.consume('}'); if !alternative.is_empty() { alternatives.push(alternative.clone()); alternative.clear(); } break; } Some(0x7C /* | */) => { self.consume('|'); if !alternative.is_empty() { alternatives.push(alternative.clone()); alternative.clear(); } } Some(_) => { alternative.push(self.consume_class_set_character()?); } None => { return error("Unbalanced class set string disjunction"); } } } Ok(ClassStringDisjunction(ClassSetAlternativeStrings(alternatives))) } // CharacterClassEscape :: d 0x64 /* d */ => { self.consume('d'); Ok(CharacterClassEscape(codepoints_from_class(CharacterClassType::Digits, true))) } // CharacterClassEscape :: D 0x44 /* D */ => { self.consume('D'); Ok(CharacterClassEscape(codepoints_from_class(CharacterClassType::Digits, false))) } // CharacterClassEscape :: s 0x73 /* s */ => { self.consume('s'); Ok(CharacterClassEscape(codepoints_from_class(CharacterClassType::Spaces, true))) } // CharacterClassEscape :: S 0x53 /* S */ => { self.consume('S'); Ok(CharacterClassEscape(codepoints_from_class(CharacterClassType::Spaces, false))) } // CharacterClassEscape :: w 0x77 /* w */ => { self.consume('w'); Ok(CharacterClassEscape(codepoints_from_class(CharacterClassType::Words, true))) } // CharacterClassEscape :: W 0x57 /* W */ => { self.consume('W'); Ok(CharacterClassEscape(codepoints_from_class(CharacterClassType::Words, false))) } // CharacterClassEscape :: [+UnicodeMode] p{ UnicodePropertyValueExpression } 0x70 /* p */ => { self.consume('p'); match self.try_consume_unicode_property_escape()? { PropertyEscapeKind::CharacterClass(intervals) => { Ok(CharacterClassEscape(CodePointSet::from_sorted_disjoint_intervals( intervals.to_vec(), ))) } PropertyEscapeKind::StringSet(_) if negate_set => error("Invalid character escape"), PropertyEscapeKind::StringSet(strings) => { Ok(ClassStringDisjunction(ClassSetAlternativeStrings(strings.iter().map(|s| s.to_vec()).collect()))) } } } // CharacterClassEscape :: [+UnicodeMode] P{ UnicodePropertyValueExpression } 0x50 /* P */ => { self.consume('P'); match self.try_consume_unicode_property_escape()? { PropertyEscapeKind::CharacterClass(s) => { Ok(CharacterClassEscape(CodePointSet::from_sorted_disjoint_intervals( s.to_vec(), ).inverted())) } PropertyEscapeKind::StringSet(_) => error("Invalid character escape"), } } // ClassSetCharacter:: \b 0x62 /* b */ => { Ok(ClassSetCharacter(self.consume(cp))) } // ClassSetCharacter:: \ ClassSetReservedPunctuator _ if Self::is_class_set_reserved_punctuator(cp) => Ok(ClassSetCharacter(self.consume(cp))), // ClassSetCharacter:: \ CharacterEscape[+UnicodeMode] _ => Ok(ClassSetCharacter(self.consume_character_escape()?)) } } // ClassSetOperand :: ClassSetCharacter // ClassSetRange :: ClassSetCharacter _ => Ok(ClassSetCharacter(self.consume_class_set_character()?)), } } // ClassSetCharacter fn consume_class_set_character(&mut self) -> Result { let Some(cp) = self.next() else { return error("Incomplete class set character"); }; match cp { 0x5C /* \ */ => { let Some(cp) = self.peek() else { return error("Incomplete class set escape"); }; match cp { // \b 0x62 /* b */ => { Ok(self.consume(cp)) } // \ ClassSetReservedPunctuator _ if Self::is_class_set_reserved_punctuator(cp) => Ok(self.consume(cp)), // \ CharacterEscape[+UnicodeMode] _ => Ok(self.consume_character_escape()?) } } // [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter 0x28 /* ( */ | 0x29 /* ) */ | 0x7B /* { */ | 0x7D /* } */ | 0x2F /* / */ | 0x2D /* - */ | 0x7C /* | */ => error("Invalid class set character"), _ => { if Self::is_class_set_reserved_double_punctuator(cp) && let Some(cp) = self.peek() && Self::is_class_set_reserved_double_punctuator(cp) { return error("Invalid class set character"); } Ok(cp) } } } // ClassSetReservedPunctuator fn is_class_set_reserved_punctuator(cp: u32) -> bool { match cp { 0x26 /* & */ | 0x2D /* - */ | 0x21 /* ! */ | 0x23 /* # */ | 0x25 /* % */ | 0x2C /* , */ | 0x3A /* : */ | 0x3B /* ; */ | 0x3C /* < */ | 0x3D /* = */ | 0x3E /* > */ | 0x40 /* @ */ | 0x60 /* ` */ | 0x7E /* ~ */ => true, _ => false, } } fn is_class_set_reserved_double_punctuator(cp: u32) -> bool { match cp { 0x26 /* & */ | 0x21 /* ! */ | 0x23 /* # */ | 0x24 /* $ */ | 0x25 /* % */ | 0x2A /* * */ | 0x2B /* + */ | 0x2C /* , */ | 0x2E /* . */ | 0x3A /* : */ | 0x3B /* ; */ | 0x3C /* < */ | 0x3D /* = */ | 0x3E /* > */ | 0x3F /* ? */ | 0x40 /* @ */ | 0x5E /* ^ */ | 0x60 /* ` */ | 0x7E /* ~ */ => true, _ => false, } } fn try_consume_quantifier(&mut self) -> Result, Error> { if let Some(mut quant) = self.try_consume_quantifier_prefix()? { quant.greedy = !self.try_consume('?'); Ok(Some(quant)) } else { Ok(None) } } fn try_consume_quantifier_prefix(&mut self) -> Result, Error> { let nc = self.peek(); if nc.is_none() { return Ok(None); } let c = nc.unwrap(); match char::from_u32(c) { Some('+') => { self.consume('+'); Ok(Some(ir::Quantifier { min: 1, max: None, greedy: true, })) } Some('*') => { self.consume('*'); Ok(Some(ir::Quantifier { min: 0, max: None, greedy: true, })) } Some('?') => { self.consume('?'); Ok(Some(ir::Quantifier { min: 0, max: Some(1), greedy: true, })) } Some('{') => { if let Some(quantifier) = self.try_consume_braced_quantifier() { Ok(Some(quantifier)) } else if self.flags.unicode { // if there was a brace '{' that doesn't parse into a valid quantifier, // it's not valid with the unicode flag error("Invalid quantifier") } else { Ok(None) } } _ => Ok(None), } } fn try_consume_braced_quantifier(&mut self) -> Option { // if parsed input is actually invalid, keep the previous one for rollback let pre_input = self.input.clone(); self.consume('{'); let optmin = self.try_consume_decimal_integer_literal(); let Some(optmin) = optmin else { // not a valid quantifier, rollback consumption self.input = pre_input; return None; }; let mut quant = ir::Quantifier { min: optmin, max: Some(optmin), greedy: true, }; if self.try_consume(',') { let max = self.try_consume_decimal_integer_literal(); // Either like {3,4} in which case we want to set the max; // or like {3,} in which case the max should be None to indicate unbounded. quant.max = max; } else { // Like {3}. } if !self.try_consume('}') { // not a valid quantifier, rollback consumption self.input = pre_input; return None; } Some(quant) } /// ES6 11.8.3 DecimalIntegerLiteral. /// If the value would overflow, usize::MAX is returned. /// All decimal digits are consumed regardless. fn try_consume_decimal_integer_literal(&mut self) -> Option { let mut result: usize = 0; let mut char_count = 0; while let Some(c) = self.peek() { if let Some(digit) = char::from_u32(c).and_then(|c| char::to_digit(c, 10)) { self.consume(c); char_count += 1; result = result.saturating_mul(10); result = result.saturating_add(digit as usize); } else { break; } } if char_count > 0 { Some(result) } else { None } } fn consume_lookaround_assertion( &mut self, params: LookaroundParams, ) -> Result { let start_group = self.group_count; let contents = self.consume_disjunction()?; let end_group = self.group_count; Ok(ir::Node::LookaroundAssertion { negate: params.negate, backwards: params.backwards, start_group, end_group, contents: Box::new(contents), }) } fn consume_character_escape(&mut self) -> Result { let c = self.next().expect("Should have a character"); let ch = to_char_sat(c); match ch { // CharacterEscape :: ControlEscape :: f 'f' => Ok(0xC), // CharacterEscape :: ControlEscape :: n 'n' => Ok(0xA), // CharacterEscape :: ControlEscape :: r 'r' => Ok(0xD), // CharacterEscape :: ControlEscape :: t 't' => Ok(0x9), // CharacterEscape :: ControlEscape :: v 'v' => Ok(0xB), // CharacterEscape :: c AsciiLetter 'c' => { if let Some(nc) = self.next().and_then(char::from_u32) && (nc.is_ascii_lowercase() || nc.is_ascii_uppercase()) { return Ok((nc as u32) % 32); } error("Invalid character escape") } // CharacterEscape :: 0 [lookahead ∉ DecimalDigit] '0' if self .peek() .and_then(char::from_u32) .map(|c: char| c.is_ascii_digit()) != Some(true) => { Ok(0x0) } // CharacterEscape :: HexEscapeSequence :: x HexDigit HexDigit 'x' => { let hex_to_digit = |c: char| c.to_digit(16); let x1 = self.next().and_then(char::from_u32).and_then(hex_to_digit); let x2 = self.next().and_then(char::from_u32).and_then(hex_to_digit); match (x1, x2) { (Some(x1), Some(x2)) => Ok(x1 * 16 + x2), // CharacterEscape :: IdentityEscape :: SourceCharacterIdentityEscape _ if !self.flags.unicode => Ok(c), _ => error("Invalid character escape"), } } // CharacterEscape :: RegExpUnicodeEscapeSequence 'u' => { if let Some(c) = self.try_escape_unicode_sequence() { Ok(c) } else if !self.flags.unicode { // CharacterEscape :: IdentityEscape :: SourceCharacterIdentityEscape Ok(c) } else { error("Invalid unicode escape") } } // CharacterEscape :: [~UnicodeMode] LegacyOctalEscapeSequence '0'..='7' if !self.flags.unicode => { let Some(c1) = self.peek() else { return Ok(c - '0' as u32); }; let ch1 = to_char_sat(c1); match ch { // 0 [lookahead ∈ { 8, 9 }] '0' if ('8'..='9').contains(&ch1) => Ok(0x0), // NonZeroOctalDigit [lookahead ∉ OctalDigit] _ if !('0'..='7').contains(&ch1) => Ok(c - '0' as u32), // FourToSeven OctalDigit '4'..='7' => { self.consume(c1); Ok((c - '0' as u32) * 8 + c1 - '0' as u32) } // ZeroToThree OctalDigit [lookahead ∉ OctalDigit] // ZeroToThree OctalDigit OctalDigit '0'..='3' => { self.consume(c1); if self.peek().map(|c2| ('0'..='7').contains(&to_char_sat(c2))) == Some(true) { let c2 = self.next().expect("char was not next"); Ok((c - '0' as u32) * 64 + (c1 - '0' as u32) * 8 + c2 - '0' as u32) } else { Ok((c - '0' as u32) * 8 + c1 - '0' as u32) } } _ => unreachable!(), } } // CharacterEscape :: IdentityEscape :: [+UnicodeMode] SyntaxCharacter // CharacterEscape :: IdentityEscape :: [+UnicodeMode] / '^' | '$' | '\\' | '.' | '*' | '+' | '?' | '(' | ')' | '[' | ']' | '{' | '}' | '|' | '/' => Ok(c), // CharacterEscape :: IdentityEscape :: SourceCharacterIdentityEscape _ if !self.flags.unicode => Ok(c), _ => error("Invalid character escape"), } } // AtomEscape fn consume_atom_escape(&mut self) -> Result { let Some(c) = self.peek() else { return error("Incomplete escape"); }; match to_char_sat(c) { 'd' | 'D' => { self.consume(c); Ok(make_bracket_class( CharacterClassType::Digits, c == 'd' as u32, )) } 's' | 'S' => { self.consume(c); Ok(make_bracket_class( CharacterClassType::Spaces, c == 's' as u32, )) } 'w' | 'W' => { self.consume(c); Ok(make_bracket_class( CharacterClassType::Words, c == 'w' as u32, )) } // ClassEscape :: CharacterClassEscape :: [+UnicodeMode] p{ UnicodePropertyValueExpression } // ClassEscape :: CharacterClassEscape :: [+UnicodeMode] P{ UnicodePropertyValueExpression } 'p' | 'P' if self.flags.unicode || self.flags.unicode_sets => { self.consume(c); let negate = c == 'P' as u32; let property_escape = self.try_consume_unicode_property_escape()?; match property_escape { PropertyEscapeKind::CharacterClass(s) => { Ok(ir::Node::Bracket(BracketContents { invert: negate, cps: CodePointSet::from_sorted_disjoint_intervals(s.to_vec()), })) } PropertyEscapeKind::StringSet(_) if negate => error("Invalid character escape"), PropertyEscapeKind::StringSet(strings) => Ok(make_alt( strings .iter() .map(|s| { ir::Node::Cat( s.iter() .map(|c| ir::Node::Char { c: *c, icase: self.flags.icase, }) .collect(), ) }) .collect(), )), } } // [+UnicodeMode] DecimalEscape // Note: This is a backreference. '1'..='9' if self.flags.unicode => { let group = self.try_consume_decimal_integer_literal().unwrap(); if group <= self.group_count_max as usize { Ok(ir::Node::BackRef(group as u32)) } else { error("Invalid character escape") } } // [~UnicodeMode] DecimalEscape but only if the CapturingGroupNumber of DecimalEscape // is ≤ CountLeftCapturingParensWithin(the Pattern containing DecimalEscape) // Note: This could be either a backreference, a legacy octal escape or an identity escape. '1'..='9' => { let input = self.input.clone(); let group = self.try_consume_decimal_integer_literal().unwrap(); if group <= self.group_count_max as usize { Ok(ir::Node::BackRef(group as u32)) } else { self.input = input; let c = self.consume_character_escape()?; Ok(ir::Node::Char { c: self.fold_if_icase(c), icase: self.flags.icase, }) } } // [+NamedCaptureGroups] k GroupName 'k' if self.flags.unicode || !self.named_group_indices.is_empty() => { self.consume('k'); // The sequence `\k` must be the start of a backreference to a named capture group. if let Some(group_name) = self.try_consume_named_capture_group_name() { if let Some(index) = self.named_group_indices.get(&group_name) { Ok(ir::Node::BackRef(*index + 1)) } else { error(format!( "Backreference to invalid named capture group: {}", &group_name )) } } else { error("Unexpected end of named backreference") } } // [~NamedCaptureGroups] k GroupName 'k' => { self.consume('k'); Ok(ir::Node::Char { c: self.fold_if_icase(c), icase: self.flags.icase, }) } _ => { let c = self.consume_character_escape()?; Ok(ir::Node::Char { c: self.fold_if_icase(c), icase: self.flags.icase, }) } } } #[allow(clippy::branches_sharing_code)] fn try_escape_unicode_sequence(&mut self) -> Option { let mut orig_input = self.input.clone(); // Support \u{X..X} (Unicode CodePoint) if self.try_consume('{') { let mut s = String::new(); loop { match self.next().and_then(char::from_u32) { Some('}') => break, Some(c) => s.push(c), None => { // Surrogates not supported in code point escapes. self.input = orig_input; return None; } } } match u32::from_str_radix(&s, 16) { Ok(u) => { if u > 0x10_FFFF { self.input = orig_input; None } else { Some(u) } } _ => { self.input = orig_input; None } } } else { // Hex4Digits let mut s = String::new(); for _ in 0..4 { if let Some(c) = self.next().and_then(char::from_u32) { s.push(c); } else { // Surrogates are not hex digits. self.input = orig_input; return None; } } match u16::from_str_radix(&s, 16) { Ok(u) => { if (0xD800..=0xDBFF).contains(&u) { // Found a high surrogate. Try to parse a low surrogate next // to see if we can rebuild the original `char` if !self.try_consume_str("\\u") { return Some(u as u32); } orig_input = self.input.clone(); // A poor man's try block to handle the backtracking // in a single place instead of every time we want to return. // This allows us to use `?` within the inner block without returning // from the entire parent function. let result = (|| { let mut s = String::new(); for _ in 0..4 { let c = self.next().and_then(char::from_u32)?; s.push(c); } let uu = u16::from_str_radix(&s, 16).ok()?; let ch = char::decode_utf16([u, uu]).next()?.ok()?; Some(u32::from(ch)) })(); result.or_else(|| { self.input = orig_input; Some(u as u32) }) } else { // If `u` is not a surrogate or is a low surrogate we can directly return it, // since all paired low surrogates should have been handled above. Some(u as u32) } } _ => { self.input = orig_input; None } } } } fn try_consume_named_capture_group_name(&mut self) -> Option { if !self.try_consume('<') { return None; } let orig_input = self.input.clone(); let mut group_name = String::new(); if let Some(mut c) = self.next().and_then(char::from_u32) { if c == '\\' && self.try_consume('u') { if let Some(escaped) = self.try_escape_unicode_sequence().and_then(char::from_u32) { c = escaped; } else { self.input = orig_input; return None; } } if interval_contains(id_start_ranges(), c.into()) || c == '$' || c == '_' { group_name.push(c); } else { self.input = orig_input; return None; } } else { self.input = orig_input; return None; } loop { if let Some(mut c) = self.next().and_then(char::from_u32) { if c == '\\' && self.try_consume('u') { if let Some(escaped) = self.try_escape_unicode_sequence().and_then(char::from_u32) { c = escaped; } else { self.input = orig_input; return None; } } if c == '>' { break; } if interval_contains(id_continue_ranges(), c.into()) || c == '$' || c == '_' || c == '\u{200C}' /* */ || c == '\u{200D}' /* */ { group_name.push(c); } else { self.input = orig_input; return None; } } else { self.input = orig_input; return None; } } Some(group_name) } // Quickly parse all capture groups. fn parse_capture_groups(&mut self) -> Result<(), Error> { let orig_input = self.input.clone(); loop { match self.next().map(to_char_sat) { Some('\\') => { self.next(); continue; } Some('[') => loop { match self.next().map(to_char_sat) { Some('\\') => { self.next(); continue; } Some(']') => break, Some(_) => continue, None => break, } }, Some('(') => { if self.try_consume_str("?") && let Some(name) = self.try_consume_named_capture_group_name() && self .named_group_indices .insert(name, self.group_count_max) .is_some() { return error("Duplicate capture group name"); } self.group_count_max = if self.group_count_max + 1 > MAX_CAPTURE_GROUPS as u32 { MAX_CAPTURE_GROUPS as u32 } else { self.group_count_max + 1 }; } Some(_) => continue, None => break, } } self.input = orig_input; Ok(()) } fn try_consume_unicode_property_escape(&mut self) -> Result { if !self.try_consume('{') { return error("Invalid character at property escape start"); } let mut buffer = String::new(); let mut name = None; while let Some(c) = self.peek().and_then(char::from_u32) { match c { '}' => { self.consume(c); let Some(value) = unicode_property_from_str(&buffer, name, self.flags.unicode_sets) else { break; }; return Ok(value); } '=' if name.is_none() => { self.consume(c); let Some(n) = unicode_property_name_from_str(&buffer) else { break; }; name = Some(n); buffer.clear(); } c if c.is_ascii_alphanumeric() || c == '_' => { self.consume(c); buffer.push(c); } _ => break, } } error("Invalid property name") } fn finalize(&self, mut re: ir::Regex) -> Result { debug_assert!(self.loop_count <= MAX_LOOPS as u32); debug_assert!(self.group_count as usize <= MAX_CAPTURE_GROUPS); if self.has_lookbehind { ir::walk_mut( false, re.flags.unicode, &mut re.node, &mut ir::Node::reverse_cats, ); } Ok(re) } } /// Try parsing a given pattern. /// Return the resulting IR regex, or an error. pub fn try_parse(pattern: I, flags: api::Flags) -> Result where I: Iterator + Clone, { let mut p = Parser { input: pattern.peekable(), flags, loop_count: 0, group_count: 0, named_group_indices: HashMap::new(), group_count_max: 0, has_lookbehind: false, }; p.try_parse() } regress-0.10.5/src/pikevm.rs000064400000000000000000000414171046102023000140200ustar 00000000000000//! PikeVM regex execution engine use crate::api::Match; use crate::bytesearch::charset_contains; use crate::cursor; use crate::cursor::{Backward, Direction, Forward}; use crate::exec; use crate::indexing::{AsciiInput, ElementType, InputIndexer, Utf8Input}; use crate::insn::{CompiledRegex, Insn, LoopFields, StartPredicate}; use crate::matchers; use crate::matchers::CharProperties; use crate::position::PositionType; use crate::scm; use crate::scm::SingleCharMatcher; use crate::types::{GroupData, LoopData}; use crate::util::DebugCheckIndex; #[cfg(not(feature = "std"))] use alloc::{string::String, vec::Vec}; use core::ops::Range; #[derive(Debug, Clone)] struct State { /// Position in the input string. pos: Position, /// Offset in the bytecode. ip: usize, /// Loop datas. loops: Vec>, /// Group datas. groups: Vec>, } enum StateMatch { Fail, Continue, Split(State), Complete, } fn run_loop( s: &mut State, lf: &LoopFields, is_initial_entry: bool, ) -> StateMatch { debug_assert!(lf.max_iters >= lf.min_iters); let ld = &mut s.loops[lf.loop_id as usize]; let exit = lf.exit as usize; let skip_ok; let enter_ok; if is_initial_entry { // Entering the loop for the "first" time. ld.iters = 0; enter_ok = lf.max_iters > 0; skip_ok = lf.min_iters == 0; } else { // Note that iters is the number of complete iterations. ld.iters += 1; // We can enter the loop if we have iterated less than the maximum number of // times. enter_ok = ld.iters < lf.max_iters; // We can skip the loop if we have iterated at least the minimum number of // times. skip_ok = ld.iters >= lf.min_iters; // Check if this iteration was beyond the minimum number of times, and our entry // position is the same as last time (ES6 21.2.2.5.1 note 4). // If so, we matched the empty string and we stop. if ld.iters > lf.min_iters && ld.entry == s.pos { return StateMatch::Fail; } } // Set up our fields as if we are going to enter the loop. ld.entry = s.pos; s.ip += 1; if !enter_ok && !skip_ok { StateMatch::Fail } else if !enter_ok { s.ip = exit; StateMatch::Continue } else if !skip_ok { StateMatch::Continue } else { debug_assert!(enter_ok && skip_ok); // We need to split our state. let mut newstate = s.clone(); let exit_state = if lf.greedy { s } else { &mut newstate }; exit_state.ip = exit; StateMatch::Split(newstate) } } fn try_match_state( re: &CompiledRegex, input: &Input, s: &mut State, dir: Dir, ) -> StateMatch { macro_rules! nextinsn_or_fail { ($e:expr) => { if $e { s.ip += 1; StateMatch::Continue } else { StateMatch::Fail } }; } match &re.insns[s.ip] { Insn::Goal => StateMatch::Complete, Insn::JustFail => StateMatch::Fail, &Insn::Char(c) => match cursor::next(input, dir, &mut s.pos) { Some(c2) => nextinsn_or_fail!(c == c2.as_u32()), _ => StateMatch::Fail, }, &Insn::CharICase(c) => match cursor::next(input, dir, &mut s.pos) { Some(c2) => { nextinsn_or_fail!(c == c2.as_u32() || input.fold(c2).as_u32() == c) } _ => StateMatch::Fail, }, Insn::CharSet(v) => match cursor::next(input, dir, &mut s.pos) { Some(c) => nextinsn_or_fail!(charset_contains(v, c.as_u32())), _ => StateMatch::Fail, }, Insn::ByteSeq1(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq2(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq3(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq4(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq5(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq6(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq7(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq8(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq9(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq10(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq11(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq12(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq13(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq14(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq15(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::ByteSeq16(v) => nextinsn_or_fail!(cursor::try_match_lit(input, dir, &mut s.pos, v)), Insn::StartOfLine { multiline } => { let multiline = *multiline; let matches = match input.peek_left(s.pos) { None => true, Some(c) if multiline && Input::CharProps::is_line_terminator(c) => true, _ => false, }; nextinsn_or_fail!(matches) } Insn::EndOfLine { multiline } => { let multiline = *multiline; let matches = match input.peek_right(s.pos) { None => true, // we're at the right of the string Some(c) if multiline && Input::CharProps::is_line_terminator(c) => true, _ => false, }; nextinsn_or_fail!(matches) } Insn::MatchAny => match cursor::next(input, dir, &mut s.pos) { Some(_) => nextinsn_or_fail!(true), _ => StateMatch::Fail, }, Insn::MatchAnyExceptLineTerminator => match cursor::next(input, dir, &mut s.pos) { Some(c2) => nextinsn_or_fail!(!Input::CharProps::is_line_terminator(c2)), _ => StateMatch::Fail, }, &Insn::Jump { target } => { s.ip = target as usize; StateMatch::Continue } &Insn::Alt { secondary } => { let mut left = s.clone(); left.ip += 1; s.ip = secondary as usize; StateMatch::Split(left) } &Insn::BeginCaptureGroup(group_idx) => { let group = &mut s.groups[group_idx as usize]; if Dir::FORWARD { core::debug_assert!(!group.start_matched(), "Group should not have been entered"); group.start = Some(s.pos); } else { core::debug_assert!(!group.end_matched(), "Group should not have been entered"); group.end = Some(s.pos); } nextinsn_or_fail!(true) } &Insn::EndCaptureGroup(group_idx) => { let group = &mut s.groups[group_idx as usize]; if Dir::FORWARD { core::debug_assert!(group.start_matched(), "Group should have been entered"); group.end = Some(s.pos); } else { core::debug_assert!(group.end_matched(), "Group should have been exited"); group.start = Some(s.pos); } core::debug_assert!( group.end >= group.start, "Exit pos should be after start pos" ); nextinsn_or_fail!(true) } &Insn::ResetCaptureGroup(group_idx) => { s.groups[group_idx as usize].reset(); nextinsn_or_fail!(true) } &Insn::BackRef(group_idx) => { let matched; let group = &mut s.groups[group_idx as usize]; if let Some(orig_range) = group.as_range() { if re.flags.icase { matched = matchers::backref_icase(input, dir, orig_range, &mut s.pos); } else { matched = matchers::backref(input, dir, orig_range, &mut s.pos) } } else { // This group has not been exited, and therefore the match succeeds // (ES6 21.2.2.9). matched = true; } nextinsn_or_fail!(matched) } &Insn::Lookahead { negate, start_group: _, end_group: _, continuation, } => { // Enter into the lookaround's instruction stream. s.ip += 1; let saved_pos = s.pos; let attempt_succeeded = MatchAttempter::::new(re).try_at_pos(*input, s, Forward::new()); let matched = attempt_succeeded != negate; if matched { s.ip = continuation as usize; s.pos = saved_pos; StateMatch::Continue } else { StateMatch::Fail } } &Insn::Lookbehind { negate, start_group: _, end_group: _, continuation, } => { // Enter into the lookaround's instruction stream. s.ip += 1; let saved_pos = s.pos; let attempt_succeeded = MatchAttempter::new(re).try_at_pos(*input, s, Backward::new()); let matched = attempt_succeeded != negate; if matched { s.ip = continuation as usize; s.pos = saved_pos; StateMatch::Continue } else { StateMatch::Fail } } Insn::EnterLoop(lf) => run_loop(s, lf, true), &Insn::LoopAgain { begin } => { s.ip = begin as usize; match re.insns.iat(s.ip) { Insn::EnterLoop(lf) => run_loop(s, lf, false), _ => panic!("LoopAgain does not point at EnterLoop"), } } Insn::Loop1CharBody { .. } => panic!("Loop1CharBody unimplemented for pikevm"), &Insn::Bracket(idx) => match cursor::next(input, dir, &mut s.pos) { Some(c) => nextinsn_or_fail!(Input::CharProps::bracket(&re.brackets[idx], c)), _ => StateMatch::Fail, }, Insn::AsciiBracket(bytes) => { nextinsn_or_fail!(scm::MatchByteSet { bytes }.matches(input, dir, &mut s.pos)) } &Insn::ByteSet2(bytes) => { nextinsn_or_fail!(scm::MatchByteArraySet(bytes).matches(input, dir, &mut s.pos)) } &Insn::ByteSet3(bytes) => { nextinsn_or_fail!(scm::MatchByteArraySet(bytes).matches(input, dir, &mut s.pos)) } &Insn::ByteSet4(bytes) => { nextinsn_or_fail!(scm::MatchByteArraySet(bytes).matches(input, dir, &mut s.pos)) } &Insn::WordBoundary { invert } => { let prev_wordchar = input .peek_left(s.pos) .is_some_and(Input::CharProps::is_word_char); let curr_wordchar = input .peek_right(s.pos) .is_some_and(Input::CharProps::is_word_char); let is_boundary = prev_wordchar != curr_wordchar; nextinsn_or_fail!(is_boundary != invert) } } } fn successful_match( input: Input, start: Input::Position, state: &State, group_names: Box<[Box]>, ) -> Match { let group_to_offset = |mr: &GroupData| -> Option> { mr.as_range().map(|r| Range { start: input.pos_to_offset(r.start), end: input.pos_to_offset(r.end), }) }; let captures = state.groups.iter().map(group_to_offset).collect(); Match { range: input.pos_to_offset(start)..input.pos_to_offset(state.pos), captures, group_names, } } #[derive(Debug)] struct MatchAttempter<'a, Input: InputIndexer> { states: Vec>, re: &'a CompiledRegex, } impl<'a, Input: InputIndexer> MatchAttempter<'a, Input> { fn new(re: &'a CompiledRegex) -> Self { Self { states: Vec::new(), re, } } fn try_at_pos( &mut self, input: Input, init_state: &mut State, dir: Dir, ) -> bool { debug_assert!(self.states.is_empty(), "Should be no states"); self.states.push(init_state.clone()); while !self.states.is_empty() { let s = self.states.last_mut().unwrap(); match try_match_state(self.re, &input, s, dir) { StateMatch::Fail => { self.states.pop(); } StateMatch::Continue => {} StateMatch::Complete => { // Give the successful state to the caller. core::mem::swap(init_state, s); self.states.clear(); return true; } StateMatch::Split(newstate) => self.states.push(newstate), } } false } } #[derive(Debug)] pub struct PikeVMExecutor<'r, Input: InputIndexer> { input: Input, matcher: MatchAttempter<'r, Input>, } impl<'r, 't> exec::Executor<'r, 't> for PikeVMExecutor<'r, Utf8Input<'t>> { type AsAscii = PikeVMExecutor<'r, AsciiInput<'t>>; fn new(re: &'r CompiledRegex, text: &'t str) -> Self { let input = Utf8Input::new(text, re.flags.unicode); Self { input, matcher: MatchAttempter::new(re), } } } impl<'r, 't> exec::Executor<'r, 't> for PikeVMExecutor<'r, AsciiInput<'t>> { type AsAscii = PikeVMExecutor<'r, AsciiInput<'t>>; fn new(re: &'r CompiledRegex, text: &'t str) -> Self { let input = AsciiInput::new(text); Self { input, matcher: MatchAttempter::new(re), } } } impl exec::MatchProducer for PikeVMExecutor<'_, Input> { type Position = Input::Position; fn initial_position(&self, offset: usize) -> Option { self.input.try_move_right(self.input.left_end(), offset) } fn next_match( &mut self, pos: Self::Position, next_start: &mut Option, ) -> Option { let re = self.matcher.re; // Check if this is an anchored regex - if so, only try matching at the current position if matches!(re.start_pred, StartPredicate::StartAnchored) { let mut state = State { pos, ip: 0, loops: vec![LoopData::new(pos); re.loops as usize], groups: vec![GroupData::new(); re.groups as usize], }; if self .matcher .try_at_pos(self.input, &mut state, Forward::new()) { let end = state.pos; if end != pos { *next_start = Some(end) } else { *next_start = self.input.next_right_pos(end) } return Some(successful_match( self.input, pos, &state, re.group_names.clone(), )); } // Anchored regex failed to match at this position return None; } // Standard matching - try at each position // Note the "initial" loop position is ignored. Use whatever is most convenient. let mut state = State { pos, ip: 0, loops: vec![LoopData::new(pos); re.loops as usize], groups: vec![GroupData::new(); re.groups as usize], }; loop { let start = state.pos; if self .matcher .try_at_pos(self.input, &mut state, Forward::new()) { let end = state.pos; if end != start { *next_start = Some(end) } else { *next_start = self.input.next_right_pos(end) } return Some(successful_match( self.input, start, &state, re.group_names.clone(), )); } match self.input.next_right_pos(start) { Some(nextpos) => state.pos = nextpos, None => break, } } None } } regress-0.10.5/src/position.rs000064400000000000000000000124711046102023000143670ustar 00000000000000use core::cmp::Eq; use core::fmt; use core::marker::PhantomData; use core::ops; /// A trait which references a position in an input string. /// The intent is that this may be satisfied via indexes or pointers. /// Positions must be subtractable, producing usize; they also obey other "pointer arithmetic" ideas. pub trait PositionType: core::fmt::Debug + Copy + Clone + PartialEq + Eq + PartialOrd + Ord where Self: ops::Add, Self: ops::Sub, Self: ops::Sub, Self: ops::AddAssign, Self: ops::SubAssign, { } /// Choose the preferred position type with this alias. #[cfg(feature = "index-positions")] pub type DefPosition<'a> = IndexPosition<'a>; #[cfg(not(feature = "index-positions"))] pub type DefPosition<'a> = RefPosition<'a>; /// A simple index-based position. /// It remembers the lifetime of the slice it is tied to. #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct IndexPosition<'a>(usize, PhantomData<&'a ()>); impl<'a> fmt::Debug for IndexPosition<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("IndexPosition").field(&self.0).finish() } } #[allow(dead_code)] impl IndexPosition<'_> { /// IndexPosition does not enforce its size. #[inline(always)] pub fn check_size() {} #[inline(always)] pub fn new(pos: usize) -> Self { Self(pos, PhantomData) } } impl ops::Add for IndexPosition<'_> { type Output = Self; #[inline(always)] fn add(self, rhs: usize) -> Self::Output { debug_assert!(self.0 + rhs >= self.0, "Overflow"); IndexPosition(self.0 + rhs, PhantomData) } } impl ops::AddAssign for IndexPosition<'_> { #[inline(always)] fn add_assign(&mut self, rhs: usize) { *self = *self + rhs; } } impl ops::SubAssign for IndexPosition<'_> { #[inline(always)] fn sub_assign(&mut self, rhs: usize) { *self = *self - rhs; } } impl<'a> ops::Sub> for IndexPosition<'a> { type Output = usize; #[inline(always)] fn sub(self, rhs: Self) -> Self::Output { debug_assert!(self.0 >= rhs.0, "Underflow"); self.0 - rhs.0 } } impl ops::Sub for IndexPosition<'_> { type Output = Self; #[inline(always)] fn sub(self, rhs: usize) -> Self::Output { debug_assert!(self.0 >= rhs, "Underflow"); IndexPosition(self.0 - rhs, PhantomData) } } impl PositionType for IndexPosition<'_> {} /// A reference position holds a reference to a byte and uses pointer arithmetic. /// This must use raw pointers because it must be capable of representing the one-past-the-end value. /// TODO: thread lifetimes through this. #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct RefPosition<'a>(core::ptr::NonNull, PhantomData<&'a ()>); impl<'a> fmt::Debug for RefPosition<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let addr = self.0.as_ptr() as usize; f.debug_tuple("RefPosition").field(&addr).finish() } } #[allow(dead_code)] impl RefPosition<'_> { /// The big idea of RefPosition is that `Option` becomes pointer-sized, by using nullptr as the None value. /// Good candidate for const-panics when stabilized. #[inline(always)] pub fn check_size() { if core::mem::size_of::>() > core::mem::size_of::<*const u8>() { panic!("Option should be pointer sized") } } /// Access the underlying pointer. #[inline(always)] pub fn ptr(self) -> *const u8 { self.0.as_ptr() } /// Construct from a pointer, which must never be null. #[inline(always)] pub fn new(ptr: *const u8) -> Self { debug_assert!(!ptr.is_null(), "Pointer cannot be null"); // Annoyingly there's no *const NonNull. let mutp = ptr as *mut u8; let nonnullp = if cfg!(feature = "prohibit-unsafe") { core::ptr::NonNull::new(mutp).expect("Pointer was null") } else { unsafe { core::ptr::NonNull::new_unchecked(mutp) } }; Self(nonnullp, PhantomData) } } impl PositionType for RefPosition<'_> {} impl ops::Add for RefPosition<'_> { type Output = Self; #[inline(always)] fn add(self, rhs: usize) -> Self::Output { Self::new(unsafe { self.ptr().add(rhs) }) } } impl<'a> ops::Sub> for RefPosition<'a> { type Output = usize; #[inline(always)] fn sub(self, rhs: Self) -> Self::Output { debug_assert!(self.0 >= rhs.0, "Underflow"); // Note Rust has backwards naming here. The "origin" is self, not the param; the rhs is the offset value. unsafe { self.ptr().offset_from(rhs.ptr()) as usize } } } impl ops::Sub for RefPosition<'_> { type Output = Self; #[inline(always)] fn sub(self, rhs: usize) -> Self::Output { debug_assert!(self.ptr() as usize >= rhs, "Underflow"); Self::new(unsafe { self.ptr().sub(rhs) }) } } impl ops::AddAssign for RefPosition<'_> { #[inline(always)] fn add_assign(&mut self, rhs: usize) { *self = *self + rhs; } } impl ops::SubAssign for RefPosition<'_> { #[inline(always)] fn sub_assign(&mut self, rhs: usize) { *self = *self - rhs; } } regress-0.10.5/src/scm.rs000064400000000000000000000121551046102023000133040ustar 00000000000000use crate::bytesearch::{ByteArraySet, ByteSet, SmallArraySet, charset_contains}; use crate::cursor; use crate::cursor::Direction; use crate::indexing::{ElementType, InputIndexer}; use crate::insn::MAX_CHAR_SET_LENGTH; use crate::matchers::CharProperties; use crate::types::BracketContents; /// A trait for things that match a single Element. pub trait SingleCharMatcher { /// \return whether we match the character at the given position, advancing /// the position if so. On a false return, the position is unspecified. fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool; } /// Insn::Char pub struct Char { pub c: Input::Element, } impl SingleCharMatcher for Char { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { match cursor::next(input, dir, pos) { Some(c2) => c2 == self.c, _ => false, } } } /// Insn::CharICase pub struct CharICase { pub c: Input::Element, } impl SingleCharMatcher for CharICase { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { match cursor::next(input, dir, pos) { Some(c2) => c2 == self.c || input.fold(c2) == self.c, _ => false, } } } /// Insn::CharSet pub struct CharSet<'a> { pub chars: &'a [u32; MAX_CHAR_SET_LENGTH], } impl SingleCharMatcher for CharSet<'_> { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { match cursor::next(input, dir, pos) { Some(c) => charset_contains(self.chars, c.as_u32()), None => false, } } } /// Insn::Bracket pub struct Bracket<'a> { pub bc: &'a BracketContents, } impl SingleCharMatcher for Bracket<'_> { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { match cursor::next(input, dir, pos) { Some(c) => Input::CharProps::bracket(self.bc, c), _ => false, } } } /// Insn::MatchAny pub struct MatchAny {} impl MatchAny { pub fn new() -> Self { Self {} } } impl SingleCharMatcher for MatchAny { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { // If there is a character, it counts as a match. cursor::next(input, dir, pos).is_some() } } /// Insn::MatchAnyExceptLineTerminator pub struct MatchAnyExceptLineTerminator {} impl MatchAnyExceptLineTerminator { pub fn new() -> Self { Self {} } } impl SingleCharMatcher for MatchAnyExceptLineTerminator { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { match cursor::next(input, dir, pos) { Some(c2) => !Input::CharProps::is_line_terminator(c2), _ => false, } } } /// Any ByteSet may match a single char. pub struct MatchByteSet<'a, Bytes: ByteSet> { pub bytes: &'a Bytes, } impl SingleCharMatcher for MatchByteSet<'_, Bytes> { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { if Input::CODE_UNITS_ARE_BYTES { // Code units are bytes so we can skip decoding the full element. cursor::next_byte(input, dir, pos).is_some_and(|b| self.bytes.contains(b)) } else { // Must decode the full element. cursor::next(input, dir, pos) .and_then(|c| c.as_u32().try_into().ok()) .is_some_and(|c| self.bytes.contains(c)) } } } /// Provide a variant for ByteArraySet where we hold it directly. /// The arrays are small and so we don't want to indirect through a pointer. pub struct MatchByteArraySet(pub ByteArraySet); impl SingleCharMatcher for MatchByteArraySet { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { if let Some(b) = cursor::next_byte(input, dir, pos) { self.0.contains(b) } else { false } } } /// A ByteSeq of length <= 4 may match a single char. pub struct MatchByteSeq<'a, const N: usize>(pub &'a [u8; N]); impl SingleCharMatcher for MatchByteSeq<'_, N> { #[inline(always)] fn matches(&self, input: &Input, dir: Dir, pos: &mut Input::Position) -> bool { debug_assert!(N <= 4, "This looks like it could match more than one char"); cursor::try_match_lit(input, dir, pos, self.0) } } regress-0.10.5/src/startpredicate.rs000064400000000000000000000201001046102023000155250ustar 00000000000000//! Support for quickly finding potential match locations. use crate::bytesearch::ByteBitmap; use crate::codepointset; use crate::insn::StartPredicate; use crate::ir; use crate::ir::Node; use crate::util::{add_utf8_first_bytes_to_bitmap, utf8_first_byte}; #[cfg(not(feature = "std"))] use alloc::{boxed::Box, vec::Vec}; use memchr::memmem; /// Check if a node is anchored to the start of the line/string. /// Returns true if the node begins with a StartOfLine anchor. fn is_start_anchored(n: &Node) -> bool { match n { Node::Anchor { anchor_type: ir::AnchorType::StartOfLine, multiline, } => !multiline, Node::Cat(nodes) => { // For concatenation, check if the first node is start-anchored nodes.first().is_some_and(is_start_anchored) } Node::CaptureGroup(child, ..) | Node::NamedCaptureGroup(child, ..) => { is_start_anchored(child) } // Other nodes are not anchored _ => false, } } /// Convert the code point set to a first-byte bitmap. /// That is, make a list of all of the possible first bytes of every contained /// code point, and store that in a bitmap. fn cps_to_first_byte_bitmap(input: &codepointset::CodePointSet) -> Box { let mut bitmap = Box::::default(); for iv in input.intervals() { add_utf8_first_bytes_to_bitmap(*iv, &mut bitmap); } bitmap } /// The "IR" for a start predicate. enum AbstractStartPredicate { /// No predicate. Arbitrary, /// Sequence of non-empty bytes. Sequence(Vec), /// Set of bytes. Set(Box), } impl AbstractStartPredicate { /// \return the disjunction of two predicates. /// That is, a predicate that matches x OR y. fn disjunction(x: Self, y: Self) -> Self { match (x, y) { (Self::Arbitrary, _) => Self::Arbitrary, (_, Self::Arbitrary) => Self::Arbitrary, (Self::Sequence(s1), Self::Sequence(s2)) => { // Compute the length of the shared prefix. let shared_len = s1.iter().zip(s2.iter()).take_while(|(a, b)| a == b).count(); debug_assert!(s1[..shared_len] == s2[..shared_len]); if shared_len > 0 { // Use the shared prefix. Self::Sequence(s1[..shared_len].to_vec()) } else { // Use a set of their first byte. Self::Set(Box::new(ByteBitmap::new(&[s1[0], s2[0]]))) } } (Self::Set(mut s1), Self::Set(s2)) => { s1.bitor(s2.as_ref()); Self::Set(s1) } (Self::Set(mut s1), Self::Sequence(s2)) => { // Add first byte to set. s1.set(s2[0]); Self::Set(s1) } (Self::Sequence(s1), Self::Set(mut s2)) => { s2.set(s1[0]); Self::Set(s2) } } } /// Resolve ourselves to a concrete start predicate. fn resolve_to_insn(self) -> StartPredicate { match self { Self::Arbitrary => StartPredicate::Arbitrary, Self::Sequence(vals) => match vals.len() { 0 => StartPredicate::Arbitrary, 1 => StartPredicate::ByteSet1([vals[0]]), _ => StartPredicate::ByteSeq(Box::new(memmem::Finder::new(&vals).into_owned())), }, Self::Set(bm) => match bm.count_bits() { 0 => StartPredicate::Arbitrary, 1 => StartPredicate::ByteSet1(bm.as_array()), 2 => StartPredicate::ByteSet2(bm.as_array()), 3 => StartPredicate::ByteSet3(bm.as_array()), _ => StartPredicate::ByteBracket(*bm), }, } } } /// Compute any start-predicate for a node.. /// If this returns None, then the instruction is conceptually zero-width (e.g. /// lookahead assertion) and does not contribute to the predicate. /// If this returns StartPredicate::Arbitrary, then there is no predicate. fn compute_start_predicate(n: &Node) -> Option { let arbitrary = Some(AbstractStartPredicate::Arbitrary); match n { Node::ByteSequence(bytevec) => Some(AbstractStartPredicate::Sequence(bytevec.clone())), Node::ByteSet(bytes) => Some(AbstractStartPredicate::Set(Box::new(ByteBitmap::new( bytes, )))), Node::Empty => arbitrary, Node::Goal => arbitrary, Node::BackRef(..) => arbitrary, Node::CharSet(chars) => { // Pick the first bytes out. let bytes = chars .iter() .map(|&c| utf8_first_byte(c)) .collect::>(); Some(AbstractStartPredicate::Set(Box::new(ByteBitmap::new( &bytes, )))) } // We assume that most char nodes have been optimized to ByteSeq or AnyBytes2, so skip // these. // TODO: we could support icase through bitmap of de-folded first bytes. Node::Char { .. } => arbitrary, // Cats return the first non-None value, if any. Node::Cat(nodes) => nodes.iter().filter_map(compute_start_predicate).next(), // MatchAny (aka .) is too common to do a fast prefix search for. Node::MatchAny => arbitrary, // MatchAnyExceptLineTerminator (aka .) is too common to do a fast prefix search for. Node::MatchAnyExceptLineTerminator => arbitrary, // TODO: can probably exploit some of these. Node::Anchor { .. } => arbitrary, Node::WordBoundary { .. } => arbitrary, // Capture groups delegate to their contents. Node::CaptureGroup(child, ..) | Node::NamedCaptureGroup(child, ..) => { compute_start_predicate(child) } // Zero-width assertions are one of the few instructions that impose no start predicate. Node::LookaroundAssertion { .. } => None, Node::Loop { loopee, quant, .. } => { // TODO: we could try to join two predicates if the loop were optional. if quant.min > 0 { compute_start_predicate(loopee) } else { arbitrary } } Node::Loop1CharBody { loopee, quant } => { // TODO: we could try to join two predicates if the loop were optional. if quant.min > 0 { compute_start_predicate(loopee) } else { arbitrary } } // This one is interesting - we compute the disjunction of the predicates of our two arms. Node::Alt(left, right) => { if let (Some(x), Some(y)) = ( compute_start_predicate(left), compute_start_predicate(right), ) { Some(AbstractStartPredicate::disjunction(x, y)) } else { // This indicates that one of our branches could match the empty string. arbitrary } } // Brackets get a bitmap. Node::Bracket(bc) => { // If our bracket is inverted, construct the set of code points not contained. let storage; let cps = if bc.invert { storage = bc.cps.inverted(); &storage } else { &bc.cps }; let bitmap = cps_to_first_byte_bitmap(cps); Some(AbstractStartPredicate::Set(bitmap)) } } } /// \return the start predicate for a Regex. pub fn predicate_for_re(re: &ir::Regex) -> StartPredicate { // Check if the regex is anchored to the start - if so, we can optimize // by avoiding string searching entirely. However, only do this when // multiline mode is disabled, since in multiline mode ^ can match // at the beginning of any line, not just the string start. if is_start_anchored(&re.node) && !re.flags.multiline { return StartPredicate::StartAnchored; } compute_start_predicate(&re.node) .unwrap_or(AbstractStartPredicate::Arbitrary) .resolve_to_insn() } regress-0.10.5/src/types.rs000064400000000000000000000045021046102023000136630ustar 00000000000000use crate::codepointset::CodePointSet; use crate::position::PositionType; #[cfg(not(feature = "std"))] use alloc::string::String; use core::ops; /// A group index is u16. /// CaptureGroupID 0 corresponds to the first capture group. pub type CaptureGroupID = u16; /// The name of a named capture group. pub type CaptureGroupName = String; /// The maximum number of capture groups supported. pub const MAX_CAPTURE_GROUPS: usize = 65535; /// The maximum number of loops supported. pub const MAX_LOOPS: usize = 65535; pub type LoopID = u16; #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum CharacterClassType { Digits, Spaces, Words, } /// The stuff in a bracket. #[derive(Debug, Clone, Default)] pub struct BracketContents { pub invert: bool, pub cps: CodePointSet, } impl BracketContents { // Return true if the bracket is empty. pub fn is_empty(&self) -> bool { match self.invert { false => self.cps.is_empty(), true => self.cps.contains_all_codepoints(), } } } /// An instruction pointer. pub type IP = usize; /// Representation of a loop. #[derive(Debug, Copy, Clone)] pub struct LoopData { pub iters: usize, pub entry: Position, } impl LoopData { pub fn new(entry: Position) -> LoopData { LoopData { iters: 0, entry } } } /// Representation of a capture group. #[derive(Debug, Copy, Clone)] pub struct GroupData { pub start: Option, pub end: Option, } impl GroupData { pub fn new() -> GroupData { GroupData { start: None, end: None, } } pub fn start_matched(&self) -> bool { self.start.is_some() } pub fn end_matched(&self) -> bool { self.end.is_some() } pub fn as_range(&self) -> Option> { // Note: we may have only start_matched (if forwards) or end_matched (if // backwards) set. match (self.start, self.end) { (Some(start), Some(end)) => Some(ops::Range { start, end }), _ => None, } } /// Reset the group to "not entered." pub fn reset(&mut self) { self.start = None; self.end = None; } } regress-0.10.5/src/unicode.rs000064400000000000000000000456721046102023000141620ustar 00000000000000use crate::codepointset::{CodePointSet, Interval}; use crate::unicodetables::{ FOLDS, TO_UPPERCASE, binary_property_ranges, general_category_property_value_ranges, script_extensions_value_ranges, script_value_ranges, string_property_sets, unicode_property_binary_from_str, unicode_property_value_general_category_from_str, unicode_property_value_script_from_str, unicode_string_property_from_str, }; use crate::util::SliceHelp; #[cfg(not(feature = "std"))] use alloc::vec::Vec; use core::cmp::Ordering; // CodePointRange packs a code point and a length together into a u32. // We currently do not need to store any information about code points in plane 16 (U+100000), // which are private use, so we only need 20 bits of code point storage; // the remaining 12 can be the length. // The length is stored with a bias of -1, so the last codepoint may be obtained by adding the "length" and the first code point. const CODE_POINT_BITS: u32 = 20; const LENGTH_BITS: u32 = 32 - CODE_POINT_BITS; #[derive(Copy, Clone, Debug)] pub struct CodePointRange(u32); // This will trigger an error in const functions if $x is false. macro_rules! const_assert_true { ($x:expr $(,)*) => { [()][!$x as usize]; }; } impl CodePointRange { #[inline(always)] pub const fn from(start: u32, len: u32) -> Self { const_assert_true!(start < (1 << CODE_POINT_BITS)); const_assert_true!(len > 0 && len <= (1 << LENGTH_BITS)); const_assert_true!((start + len - 1) < ((1 << CODE_POINT_BITS) - 1)); CodePointRange((start << LENGTH_BITS) | (len - 1)) } #[inline(always)] const fn len_minus_1(self) -> u32 { self.0 & ((1 << LENGTH_BITS) - 1) } // \return the first codepoint in the range. #[inline(always)] pub const fn first(self) -> u32 { self.0 >> LENGTH_BITS } // \return the last codepoint in the range. #[inline(always)] pub const fn last(self) -> u32 { self.first() + self.len_minus_1() } } // The "extra" field contains a predicate mask in the low bits and a signed delta amount in the high bits. // A code point only transforms if its difference from the range base is 0 once masked. const PREDICATE_MASK_BITS: u32 = 4; pub(crate) struct FoldRange { /// The range of codepoints. pub(crate) range: CodePointRange, /// Combination of the signed delta amount and predicate mask. pub(crate) extra: i32, } impl FoldRange { #[inline(always)] pub const fn from(start: u32, length: u32, delta: i32, modulo: u8) -> Self { const_assert_true!(modulo.is_power_of_two()); let mask = (modulo - 1) as i32; const_assert_true!(mask < (1 << PREDICATE_MASK_BITS)); const_assert_true!(((delta << PREDICATE_MASK_BITS) >> PREDICATE_MASK_BITS) == delta); let extra = mask | (delta << PREDICATE_MASK_BITS); FoldRange { range: CodePointRange::from(start, length), extra, } } #[inline(always)] fn first(&self) -> u32 { self.range.first() } #[inline(always)] fn last(&self) -> u32 { self.range.last() } #[inline(always)] fn delta(&self) -> i32 { self.extra >> PREDICATE_MASK_BITS } #[inline(always)] fn predicate_mask(&self) -> u32 { (self.extra as u32) & ((1 << PREDICATE_MASK_BITS) - 1) } fn add_delta(&self, cu: u32) -> u32 { let cs = (cu as i32) + self.delta(); core::debug_assert!(0 <= cs && cs <= 0x10FFFF); cs as u32 } /// \return the Interval of transformed-to code points. fn transformed_to(&self) -> Interval { Interval { first: self.add_delta(self.first()), last: self.add_delta(self.last()), } } /// \return the Interval of transformed-from code points. fn transformed_from(&self) -> Interval { Interval { first: self.first(), last: self.last(), } } fn can_apply(&self, cu: u32) -> bool { self.transformed_from().contains(cu) } fn apply(&self, cu: u32) -> u32 { debug_assert!(self.can_apply(cu), "Cannot apply to this code point"); let offset = cu - self.first(); if (offset & self.predicate_mask()) == 0 { self.add_delta(cu) } else { cu } } } /// Implements the `Canonicalize` method from the [spec]. /// /// [spec]: https://tc39.es/ecma262/#sec-runtime-semantics-canonicalize-ch pub(crate) fn fold_code_point(cu: u32, unicode: bool) -> u32 { if unicode { return fold(cu); } uppercase(cu) } pub fn fold(cu: u32) -> u32 { let searched = FOLDS.binary_search_by(|fr| { if fr.first() > cu { Ordering::Greater } else if fr.last() < cu { Ordering::Less } else { Ordering::Equal } }); if let Ok(index) = searched { let fr: &FoldRange = if cfg!(feature = "prohibit-unsafe") { unsafe { FOLDS.get_unchecked(index) } } else { FOLDS.get(index).expect("Invalid index") }; fr.apply(cu) } else { cu } } fn uppercase(cu: u32) -> u32 { let searched = TO_UPPERCASE.binary_search_by(|fr| { if fr.first() > cu { Ordering::Greater } else if fr.last() < cu { Ordering::Less } else { Ordering::Equal } }); if let Ok(index) = searched { let fr: &FoldRange = if cfg!(feature = "prohibit-unsafe") { unsafe { TO_UPPERCASE.get_unchecked(index) } } else { TO_UPPERCASE.get(index).expect("Invalid index") }; fr.apply(cu) } else { cu } } // Add all folded characters in the given interval to the given code point set. // This skips characters which fold to themselves. fn fold_interval(iv: Interval, recv: &mut CodePointSet) { let overlaps = FOLDS.equal_range_by(|tr| { if tr.first() > iv.last { Ordering::Greater } else if tr.last() < iv.first { Ordering::Less } else { Ordering::Equal } }); for fr in &FOLDS[overlaps] { debug_assert!( fr.transformed_from().overlaps(iv), "Interval does not overlap transform" ); // Find the (inclusive) range of our interval that this transform covers. let first_trans = core::cmp::max(fr.first(), iv.first); let last_trans = core::cmp::min(fr.last(), iv.last); let modulo = fr.predicate_mask() + 1; if modulo == 1 { // Optimization: when modulo is 1, every character in range gets transformed for cu in first_trans..(last_trans + 1) { let cs = fr.add_delta(cu); if cs != cu { recv.add_one(cs); } } } else { // Optimization: walk by modulo amount instead of checking every character let offset_start = first_trans - fr.first(); let start_aligned = first_trans + ((modulo - (offset_start % modulo)) % modulo); let mut cu = start_aligned; while cu <= last_trans { let cs = fr.add_delta(cu); recv.add_one(cs); cu += modulo; } } } } /// Find all characters that fold into the given interval and add them to the given code point set. /// This skips characters which fold to themselves. fn unfold_interval(iv: Interval, recv: &mut CodePointSet) { // Note: We still need to check all ranges because the relationship between // transformed_from and transformed_to intervals can be complex for tr in FOLDS.iter() { if !iv.overlaps(tr.transformed_to()) { continue; } let modulo = tr.predicate_mask() + 1; let first_source = tr.first(); let last_source = tr.last(); let mut process_cp = |cp| { let tcp = tr.apply(cp); if tcp != cp && iv.contains(tcp) { recv.add_one(cp); } }; if modulo == 1 { // Optimization: when modulo is 1, every character in range gets transformed for cp in first_source..(last_source + 1) { process_cp(cp); } } else { // Walk by modulo amount instead of checking every character let mut cp = first_source; while cp <= last_source { process_cp(cp); cp += modulo; } } } } /// \return all the characters which fold to c's fold. /// This is a linear search across all ranges. /// The result always contains c. pub fn unfold_char(c: u32) -> Vec { let mut res = vec![c]; let fcp = fold(c); if fcp != c { res.push(fcp); } // TODO: optimize ASCII case. for tr in FOLDS.iter() { if !tr.transformed_to().contains(fcp) { continue; } for cp in tr.transformed_from().codepoints() { // TODO: this can be optimized. let tcp = tr.apply(cp); if tcp == fcp { res.push(cp); } } } res.sort_unstable(); res.dedup(); res } pub(crate) fn unfold_uppercase_char(c: u32) -> Vec { let mut res = vec![c]; let fcp = uppercase(c); if fcp != c { res.push(fcp); } for tr in TO_UPPERCASE.iter() { if !tr.transformed_to().contains(fcp) { continue; } for cp in tr.transformed_from().codepoints() { let tcp = tr.apply(cp); if tcp == fcp { res.push(cp); } } } res.sort_unstable(); res.dedup(); res } // Fold every character in \p input, then find all the prefolds. pub fn add_icase_code_points(mut input: CodePointSet) -> CodePointSet { let mut folded = input.clone(); for iv in input.intervals() { fold_interval(*iv, &mut folded) } // Reuse input storage. input.clone_from(&folded); for iv in folded.intervals() { unfold_interval(*iv, &mut input); } input } pub(crate) enum PropertyEscapeKind { CharacterClass(&'static [Interval]), StringSet(&'static [&'static [u32]]), } #[derive(Debug, Copy, Clone)] pub(crate) enum UnicodePropertyName { GeneralCategory, Script, ScriptExtensions, } pub(crate) fn unicode_property_name_from_str(s: &str) -> Option { use UnicodePropertyName::*; match s { "General_Category" | "gc" => Some(GeneralCategory), "Script" | "sc" => Some(Script), "Script_Extensions" | "scx" => Some(ScriptExtensions), _ => None, } } pub(crate) fn unicode_property_from_str( s: &str, name: Option, unicode_sets: bool, ) -> Option { match name { Some(UnicodePropertyName::GeneralCategory) => Some(PropertyEscapeKind::CharacterClass( general_category_property_value_ranges( &unicode_property_value_general_category_from_str(s)?, ), )), Some(UnicodePropertyName::Script) => Some(PropertyEscapeKind::CharacterClass( script_value_ranges(&unicode_property_value_script_from_str(s)?), )), Some(UnicodePropertyName::ScriptExtensions) => Some(PropertyEscapeKind::CharacterClass( script_extensions_value_ranges(&unicode_property_value_script_from_str(s)?), )), None => { if let Some(value) = unicode_property_binary_from_str(s) { return Some(PropertyEscapeKind::CharacterClass(binary_property_ranges( &value, ))); } if unicode_sets && let Some(value) = unicode_string_property_from_str(s) { return Some(PropertyEscapeKind::StringSet(string_property_sets(&value))); } Some(PropertyEscapeKind::CharacterClass( general_category_property_value_ranges( &unicode_property_value_general_category_from_str(s)?, ), )) } } } #[cfg(test)] mod tests { use super::*; use std::collections::HashMap; // Map from folded char to the chars that folded to it. // If an entry is missing, it means either nothing folds to the char, // or it folds exclusively to itself; this can be determined by comparing // the char to its fold. fn get_unfold_map() -> HashMap> { let mut unfold_map: HashMap> = HashMap::new(); for c in 0..=0x10FFFF { let fc = fold(c); if fc != c { unfold_map.entry(fc).or_default().push(c); } } // We neglected self-folds - add them now, but only for entries // where something else folds to it, else our map would be quite large. // Also sort them all. for (&k, v) in unfold_map.iter_mut() { assert_eq!(k, fold(k), "folds should be idempotent"); v.push(k); v.sort_unstable(); } unfold_map } #[test] fn test_folds() { for c in 0..0x41 { assert_eq!(fold(c), c); } for c in 0x41..=0x5A { assert_eq!(fold(c), c + 0x20); } assert_eq!(fold(0xB5), 0x3BC); assert_eq!(fold(0xC0), 0xE0); assert_eq!(fold(0x1B8), 0x1B9); assert_eq!(fold(0x1B9), 0x1B9); assert_eq!(fold(0x1BA), 0x1BA); assert_eq!(fold(0x1BB), 0x1BB); assert_eq!(fold(0x1BC), 0x1BD); assert_eq!(fold(0x1BD), 0x1BD); for c in 0x1F8..0x21F { if c % 2 == 0 { assert_eq!(fold(c), c + 1); } else { assert_eq!(fold(c), c); } } assert_eq!(fold(0x37F), 0x3F3); assert_eq!(fold(0x380), 0x380); assert_eq!(fold(0x16E40), 0x16E60); assert_eq!(fold(0x16E41), 0x16E61); assert_eq!(fold(0x16E42), 0x16E62); assert_eq!(fold(0x1E900), 0x1E922); assert_eq!(fold(0x1E901), 0x1E923); for c in 0xF0000..=0x10FFFF { assert_eq!(fold(c), c); } } #[test] fn test_fold_idempotent() { for c in 0..=0x10FFFF { let fc = fold(c); let ffc = fold(fc); assert_eq!(ffc, fc); } } #[test] fn test_unfolds_refold() { for c in 0..=0x10FFFF { let fc = fold(c); let unfolds = unfold_char(c); for uc in unfolds { assert_eq!(fold(uc), fc); } } } #[test] fn test_unfold_chars() { let unfold_map = get_unfold_map(); for c in 0..=0x10FFFF { let mut unfolded = unfold_char(c); unfolded.sort_unstable(); let fc = fold(c); if let Some(expected) = unfold_map.get(&fc) { // Explicit list of unfolds. assert_eq!(&unfolded, expected); } else { // No entry in our testing unfold map: that means that either the // character folds to itself and nothing else does, or the character // folds to a different character - but that different character // should fold to itself (folding is idempotent) so we should always // have multiple characters in that case. Therefore we expect this // character's unfolds to be itself exclusively. assert_eq!(&unfolded, &[c]); } } } #[test] fn test_add_icase_code_points() { let unfold_map = get_unfold_map(); let locs = [ 0x0, 0x42, 0x100, 0xdeba, 0x11419, 0x278f8, 0x2e000, 0x35df7, 0x462d6, 0x4bc29, 0x4f4c0, 0x58a9b, 0x5bafc, 0x62383, 0x66d60, 0x6974a, 0x77628, 0x87804, 0x9262b, 0x931e4, 0xaa08c, 0xad7a8, 0xca6b0, 0xcce27, 0xcd897, 0xcf5e7, 0xe2802, 0xe561b, 0xe5f43, 0xf4339, 0xfb78c, 0xfc5ee, 0x104fa9, 0x10e402, 0x10e6cf, 0x10FFFF, ]; for (idx, &first) in locs.iter().enumerate() { // Keep a running set of the unfolded code points we expect to be in the // range [first, last]. let mut expected = CodePointSet::default(); let mut from = first; for &last in &locs[idx..] { // Add both folded and unfolded characters to expected. for c in from..=last { let fc = fold(c); if let Some(unfolded) = unfold_map.get(&fc) { // Some nontrival set of characters fold to fc. for &ufc in unfolded { expected.add_one(ufc); } } else { // Only fc folds to fc. expected.add_one(fc); } } let mut input = CodePointSet::new(); input.add(Interval { first, last }); let folded = add_icase_code_points(input); assert_eq!(folded, expected); from = last; } } } #[test] fn test_fold_interval() { let locs = [ 0, 0x894, 0x59ac, 0xfa64, 0x10980, 0x12159, 0x16b8d, 0x1aaa2, 0x1f973, 0x1fcd4, 0x20c35, 0x23d8a, 0x276af, 0x2c6b8, 0x2fb25, 0x30b9b, 0x338ad, 0x35ab3, 0x38d37, 0x3bfa7, 0x3fba6, 0x404c9, 0x44572, 0x480c9, 0x4b5c4, 0x4f371, 0x5a9fa, 0x5ad6c, 0x5e395, 0x5f103, 0x5fa98, 0x617fa, 0x6500e, 0x68890, 0x6a3fc, 0x6eab3, 0x704a6, 0x70c22, 0x72efb, 0x737cc, 0x76796, 0x79da8, 0x7a450, 0x7b023, 0x7cc5c, 0x82027, 0x84ef4, 0x8ac66, 0x8b898, 0x8bd1a, 0x95841, 0x98a48, 0x9e6cd, 0xa035a, 0xa41fb, 0xa50e3, 0xa6387, 0xa7ba1, 0xaad9a, 0xabed8, 0xacc88, 0xb2737, 0xb31b1, 0xb6daf, 0xb7ff4, 0xba2b4, 0xbde4f, 0xbe38b, 0xbe7a5, 0xc4eb2, 0xc5670, 0xc7703, 0xc995d, 0xccb72, 0xcdfe3, 0xcfc99, 0xd09eb, 0xd2773, 0xd357d, 0xd6696, 0xd9aec, 0xdc3fa, 0xdc8ae, 0xdc9d5, 0xde31d, 0xe2edb, 0xe652b, 0xe92d5, 0xebf2d, 0xee335, 0xef45f, 0xf4280, 0xf74b1, 0xf9ac4, 0xfafca, 0x10208d, 0x107d63, 0x10821e, 0x108818, 0x10911f, 0x10b6fd, 0x10FFFF, ]; for (idx, &first) in locs.iter().enumerate() { // Keep a running set of the folded code points we expect to be in the // range [first, last]. let mut expected = CodePointSet::default(); let mut from = first; for &last in &locs[idx..] { // Add characters to expected which do not fold to themselves. for c in from..=last { let fc = fold(c); if fc != c { expected.add_one(fc); } } let mut cps = CodePointSet::default(); fold_interval(Interval { first, last }, &mut cps); assert_eq!(cps.intervals(), expected.intervals()); from = last; } } } } regress-0.10.5/src/unicodetables.rs000064400000000000000000035177411046102023000153610ustar 00000000000000// DO NOT EDIT! This file is autogenerated from gen-unicode. use crate::codepointset::Interval; use crate::unicode::FoldRange; const ALPHABETIC: [Interval; 733] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 705), Interval::new(710, 721), Interval::new(736, 740), Interval::new(748, 748), Interval::new(750, 750), Interval::new(837, 837), Interval::new(880, 884), Interval::new(886, 887), Interval::new(890, 893), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1369, 1369), Interval::new(1376, 1416), Interval::new(1456, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1477), Interval::new(1479, 1479), Interval::new(1488, 1514), Interval::new(1519, 1522), Interval::new(1552, 1562), Interval::new(1568, 1623), Interval::new(1625, 1631), Interval::new(1646, 1747), Interval::new(1749, 1756), Interval::new(1761, 1768), Interval::new(1773, 1775), Interval::new(1786, 1788), Interval::new(1791, 1791), Interval::new(1808, 1855), Interval::new(1869, 1969), Interval::new(1994, 2026), Interval::new(2036, 2037), Interval::new(2042, 2042), Interval::new(2048, 2071), Interval::new(2074, 2092), Interval::new(2112, 2136), Interval::new(2144, 2154), Interval::new(2160, 2183), Interval::new(2185, 2190), Interval::new(2208, 2249), Interval::new(2260, 2271), Interval::new(2275, 2281), Interval::new(2288, 2363), Interval::new(2365, 2380), Interval::new(2382, 2384), Interval::new(2389, 2403), Interval::new(2417, 2435), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2493, 2500), Interval::new(2503, 2504), Interval::new(2507, 2508), Interval::new(2510, 2510), Interval::new(2519, 2519), Interval::new(2524, 2525), Interval::new(2527, 2531), Interval::new(2544, 2545), Interval::new(2556, 2556), Interval::new(2561, 2563), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2622, 2626), Interval::new(2631, 2632), Interval::new(2635, 2636), Interval::new(2641, 2641), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2672, 2677), Interval::new(2689, 2691), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2749, 2757), Interval::new(2759, 2761), Interval::new(2763, 2764), Interval::new(2768, 2768), Interval::new(2784, 2787), Interval::new(2809, 2812), Interval::new(2817, 2819), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2877, 2884), Interval::new(2887, 2888), Interval::new(2891, 2892), Interval::new(2902, 2903), Interval::new(2908, 2909), Interval::new(2911, 2915), Interval::new(2929, 2929), Interval::new(2946, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3006, 3010), Interval::new(3014, 3016), Interval::new(3018, 3020), Interval::new(3024, 3024), Interval::new(3031, 3031), Interval::new(3072, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3133, 3140), Interval::new(3142, 3144), Interval::new(3146, 3148), Interval::new(3157, 3158), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3171), Interval::new(3200, 3203), Interval::new(3205, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3261, 3268), Interval::new(3270, 3272), Interval::new(3274, 3276), Interval::new(3285, 3286), Interval::new(3293, 3294), Interval::new(3296, 3299), Interval::new(3313, 3315), Interval::new(3328, 3340), Interval::new(3342, 3344), Interval::new(3346, 3386), Interval::new(3389, 3396), Interval::new(3398, 3400), Interval::new(3402, 3404), Interval::new(3406, 3406), Interval::new(3412, 3415), Interval::new(3423, 3427), Interval::new(3450, 3455), Interval::new(3457, 3459), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3535, 3540), Interval::new(3542, 3542), Interval::new(3544, 3551), Interval::new(3570, 3571), Interval::new(3585, 3642), Interval::new(3648, 3654), Interval::new(3661, 3661), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3769), Interval::new(3771, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3789, 3789), Interval::new(3804, 3807), Interval::new(3840, 3840), Interval::new(3904, 3911), Interval::new(3913, 3948), Interval::new(3953, 3971), Interval::new(3976, 3991), Interval::new(3993, 4028), Interval::new(4096, 4150), Interval::new(4152, 4152), Interval::new(4155, 4159), Interval::new(4176, 4239), Interval::new(4250, 4253), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4992, 5007), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5121, 5740), Interval::new(5743, 5759), Interval::new(5761, 5786), Interval::new(5792, 5866), Interval::new(5870, 5880), Interval::new(5888, 5907), Interval::new(5919, 5939), Interval::new(5952, 5971), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6002, 6003), Interval::new(6016, 6067), Interval::new(6070, 6088), Interval::new(6103, 6103), Interval::new(6108, 6108), Interval::new(6176, 6264), Interval::new(6272, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6432, 6443), Interval::new(6448, 6456), Interval::new(6480, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6656, 6683), Interval::new(6688, 6750), Interval::new(6753, 6772), Interval::new(6823, 6823), Interval::new(6847, 6848), Interval::new(6860, 6862), Interval::new(6912, 6963), Interval::new(6965, 6979), Interval::new(6981, 6988), Interval::new(7040, 7081), Interval::new(7084, 7087), Interval::new(7098, 7141), Interval::new(7143, 7153), Interval::new(7168, 7222), Interval::new(7245, 7247), Interval::new(7258, 7293), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7401, 7404), Interval::new(7406, 7411), Interval::new(7413, 7414), Interval::new(7418, 7418), Interval::new(7424, 7615), Interval::new(7655, 7668), Interval::new(7680, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8473, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8493), Interval::new(8495, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8544, 8584), Interval::new(9398, 9449), Interval::new(11264, 11492), Interval::new(11499, 11502), Interval::new(11506, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11631), Interval::new(11648, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(11744, 11775), Interval::new(11823, 11823), Interval::new(12293, 12295), Interval::new(12321, 12329), Interval::new(12337, 12341), Interval::new(12344, 12348), Interval::new(12353, 12438), Interval::new(12445, 12447), Interval::new(12449, 12538), Interval::new(12540, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12704, 12735), Interval::new(12784, 12799), Interval::new(13312, 19903), Interval::new(19968, 42124), Interval::new(42192, 42237), Interval::new(42240, 42508), Interval::new(42512, 42527), Interval::new(42538, 42539), Interval::new(42560, 42606), Interval::new(42612, 42619), Interval::new(42623, 42735), Interval::new(42775, 42783), Interval::new(42786, 42888), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43013), Interval::new(43015, 43047), Interval::new(43072, 43123), Interval::new(43136, 43203), Interval::new(43205, 43205), Interval::new(43250, 43255), Interval::new(43259, 43259), Interval::new(43261, 43263), Interval::new(43274, 43306), Interval::new(43312, 43346), Interval::new(43360, 43388), Interval::new(43392, 43442), Interval::new(43444, 43455), Interval::new(43471, 43471), Interval::new(43488, 43503), Interval::new(43514, 43518), Interval::new(43520, 43574), Interval::new(43584, 43597), Interval::new(43616, 43638), Interval::new(43642, 43710), Interval::new(43712, 43712), Interval::new(43714, 43714), Interval::new(43739, 43741), Interval::new(43744, 43759), Interval::new(43762, 43765), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 44010), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64296), Interval::new(64298, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65019), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(65382, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65856, 65908), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66304, 66335), Interval::new(66349, 66378), Interval::new(66384, 66426), Interval::new(66432, 66461), Interval::new(66464, 66499), Interval::new(66504, 66511), Interval::new(66513, 66517), Interval::new(66560, 66717), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67680, 67702), Interval::new(67712, 67742), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67840, 67861), Interval::new(67872, 67897), Interval::new(67968, 68023), Interval::new(68030, 68031), Interval::new(68096, 68099), Interval::new(68101, 68102), Interval::new(68108, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68192, 68220), Interval::new(68224, 68252), Interval::new(68288, 68295), Interval::new(68297, 68324), Interval::new(68352, 68405), Interval::new(68416, 68437), Interval::new(68448, 68466), Interval::new(68480, 68497), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68864, 68903), Interval::new(69248, 69289), Interval::new(69291, 69292), Interval::new(69296, 69297), Interval::new(69376, 69404), Interval::new(69415, 69415), Interval::new(69424, 69445), Interval::new(69488, 69505), Interval::new(69552, 69572), Interval::new(69600, 69622), Interval::new(69632, 69701), Interval::new(69745, 69749), Interval::new(69760, 69816), Interval::new(69826, 69826), Interval::new(69840, 69864), Interval::new(69888, 69938), Interval::new(69956, 69959), Interval::new(69968, 70002), Interval::new(70006, 70006), Interval::new(70016, 70079), Interval::new(70081, 70084), Interval::new(70094, 70095), Interval::new(70106, 70106), Interval::new(70108, 70108), Interval::new(70144, 70161), Interval::new(70163, 70196), Interval::new(70199, 70199), Interval::new(70206, 70209), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70312), Interval::new(70320, 70376), Interval::new(70400, 70403), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70461, 70468), Interval::new(70471, 70472), Interval::new(70475, 70476), Interval::new(70480, 70480), Interval::new(70487, 70487), Interval::new(70493, 70499), Interval::new(70656, 70721), Interval::new(70723, 70725), Interval::new(70727, 70730), Interval::new(70751, 70753), Interval::new(70784, 70849), Interval::new(70852, 70853), Interval::new(70855, 70855), Interval::new(71040, 71093), Interval::new(71096, 71102), Interval::new(71128, 71133), Interval::new(71168, 71230), Interval::new(71232, 71232), Interval::new(71236, 71236), Interval::new(71296, 71349), Interval::new(71352, 71352), Interval::new(71424, 71450), Interval::new(71453, 71466), Interval::new(71488, 71494), Interval::new(71680, 71736), Interval::new(71840, 71903), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71989), Interval::new(71991, 71992), Interval::new(71995, 71996), Interval::new(71999, 72002), Interval::new(72096, 72103), Interval::new(72106, 72151), Interval::new(72154, 72159), Interval::new(72161, 72161), Interval::new(72163, 72164), Interval::new(72192, 72242), Interval::new(72245, 72254), Interval::new(72272, 72343), Interval::new(72349, 72349), Interval::new(72368, 72440), Interval::new(72704, 72712), Interval::new(72714, 72758), Interval::new(72760, 72766), Interval::new(72768, 72768), Interval::new(72818, 72847), Interval::new(72850, 72871), Interval::new(72873, 72886), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73025), Interval::new(73027, 73027), Interval::new(73030, 73031), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73102), Interval::new(73104, 73105), Interval::new(73107, 73110), Interval::new(73112, 73112), Interval::new(73440, 73462), Interval::new(73472, 73488), Interval::new(73490, 73530), Interval::new(73534, 73536), Interval::new(73648, 73648), Interval::new(73728, 74649), Interval::new(74752, 74862), Interval::new(74880, 75075), Interval::new(77712, 77808), Interval::new(77824, 78895), Interval::new(78913, 78918), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92784, 92862), Interval::new(92880, 92909), Interval::new(92928, 92975), Interval::new(92992, 92995), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93823), Interval::new(93952, 94026), Interval::new(94031, 94087), Interval::new(94095, 94111), Interval::new(94176, 94177), Interval::new(94179, 94179), Interval::new(94192, 94193), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(113822, 113822), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(122928, 122989), Interval::new(123023, 123023), Interval::new(123136, 123180), Interval::new(123191, 123197), Interval::new(123214, 123214), Interval::new(123536, 123565), Interval::new(123584, 123627), Interval::new(124112, 124139), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125184, 125251), Interval::new(125255, 125255), Interval::new(125259, 125259), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(127280, 127305), Interval::new(127312, 127337), Interval::new(127344, 127369), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'Alphabetic' Unicode property. pub(crate) fn alphabetic_ranges() -> &'static [Interval] { &ALPHABETIC } const CASE_IGNORABLE: [Interval; 437] = [ Interval::new(39, 39), Interval::new(46, 46), Interval::new(58, 58), Interval::new(94, 94), Interval::new(96, 96), Interval::new(168, 168), Interval::new(173, 173), Interval::new(175, 175), Interval::new(180, 180), Interval::new(183, 184), Interval::new(688, 879), Interval::new(884, 885), Interval::new(890, 890), Interval::new(900, 901), Interval::new(903, 903), Interval::new(1155, 1161), Interval::new(1369, 1369), Interval::new(1375, 1375), Interval::new(1425, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1477), Interval::new(1479, 1479), Interval::new(1524, 1524), Interval::new(1536, 1541), Interval::new(1552, 1562), Interval::new(1564, 1564), Interval::new(1600, 1600), Interval::new(1611, 1631), Interval::new(1648, 1648), Interval::new(1750, 1757), Interval::new(1759, 1768), Interval::new(1770, 1773), Interval::new(1807, 1807), Interval::new(1809, 1809), Interval::new(1840, 1866), Interval::new(1958, 1968), Interval::new(2027, 2037), Interval::new(2042, 2042), Interval::new(2045, 2045), Interval::new(2070, 2093), Interval::new(2137, 2139), Interval::new(2184, 2184), Interval::new(2192, 2193), Interval::new(2200, 2207), Interval::new(2249, 2306), Interval::new(2362, 2362), Interval::new(2364, 2364), Interval::new(2369, 2376), Interval::new(2381, 2381), Interval::new(2385, 2391), Interval::new(2402, 2403), Interval::new(2417, 2417), Interval::new(2433, 2433), Interval::new(2492, 2492), Interval::new(2497, 2500), Interval::new(2509, 2509), Interval::new(2530, 2531), Interval::new(2558, 2558), Interval::new(2561, 2562), Interval::new(2620, 2620), Interval::new(2625, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2672, 2673), Interval::new(2677, 2677), Interval::new(2689, 2690), Interval::new(2748, 2748), Interval::new(2753, 2757), Interval::new(2759, 2760), Interval::new(2765, 2765), Interval::new(2786, 2787), Interval::new(2810, 2815), Interval::new(2817, 2817), Interval::new(2876, 2876), Interval::new(2879, 2879), Interval::new(2881, 2884), Interval::new(2893, 2893), Interval::new(2901, 2902), Interval::new(2914, 2915), Interval::new(2946, 2946), Interval::new(3008, 3008), Interval::new(3021, 3021), Interval::new(3072, 3072), Interval::new(3076, 3076), Interval::new(3132, 3132), Interval::new(3134, 3136), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3170, 3171), Interval::new(3201, 3201), Interval::new(3260, 3260), Interval::new(3263, 3263), Interval::new(3270, 3270), Interval::new(3276, 3277), Interval::new(3298, 3299), Interval::new(3328, 3329), Interval::new(3387, 3388), Interval::new(3393, 3396), Interval::new(3405, 3405), Interval::new(3426, 3427), Interval::new(3457, 3457), Interval::new(3530, 3530), Interval::new(3538, 3540), Interval::new(3542, 3542), Interval::new(3633, 3633), Interval::new(3636, 3642), Interval::new(3654, 3662), Interval::new(3761, 3761), Interval::new(3764, 3772), Interval::new(3782, 3782), Interval::new(3784, 3790), Interval::new(3864, 3865), Interval::new(3893, 3893), Interval::new(3895, 3895), Interval::new(3897, 3897), Interval::new(3953, 3966), Interval::new(3968, 3972), Interval::new(3974, 3975), Interval::new(3981, 3991), Interval::new(3993, 4028), Interval::new(4038, 4038), Interval::new(4141, 4144), Interval::new(4146, 4151), Interval::new(4153, 4154), Interval::new(4157, 4158), Interval::new(4184, 4185), Interval::new(4190, 4192), Interval::new(4209, 4212), Interval::new(4226, 4226), Interval::new(4229, 4230), Interval::new(4237, 4237), Interval::new(4253, 4253), Interval::new(4348, 4348), Interval::new(4957, 4959), Interval::new(5906, 5908), Interval::new(5938, 5939), Interval::new(5970, 5971), Interval::new(6002, 6003), Interval::new(6068, 6069), Interval::new(6071, 6077), Interval::new(6086, 6086), Interval::new(6089, 6099), Interval::new(6103, 6103), Interval::new(6109, 6109), Interval::new(6155, 6159), Interval::new(6211, 6211), Interval::new(6277, 6278), Interval::new(6313, 6313), Interval::new(6432, 6434), Interval::new(6439, 6440), Interval::new(6450, 6450), Interval::new(6457, 6459), Interval::new(6679, 6680), Interval::new(6683, 6683), Interval::new(6742, 6742), Interval::new(6744, 6750), Interval::new(6752, 6752), Interval::new(6754, 6754), Interval::new(6757, 6764), Interval::new(6771, 6780), Interval::new(6783, 6783), Interval::new(6823, 6823), Interval::new(6832, 6862), Interval::new(6912, 6915), Interval::new(6964, 6964), Interval::new(6966, 6970), Interval::new(6972, 6972), Interval::new(6978, 6978), Interval::new(7019, 7027), Interval::new(7040, 7041), Interval::new(7074, 7077), Interval::new(7080, 7081), Interval::new(7083, 7085), Interval::new(7142, 7142), Interval::new(7144, 7145), Interval::new(7149, 7149), Interval::new(7151, 7153), Interval::new(7212, 7219), Interval::new(7222, 7223), Interval::new(7288, 7293), Interval::new(7376, 7378), Interval::new(7380, 7392), Interval::new(7394, 7400), Interval::new(7405, 7405), Interval::new(7412, 7412), Interval::new(7416, 7417), Interval::new(7468, 7530), Interval::new(7544, 7544), Interval::new(7579, 7679), Interval::new(8125, 8125), Interval::new(8127, 8129), Interval::new(8141, 8143), Interval::new(8157, 8159), Interval::new(8173, 8175), Interval::new(8189, 8190), Interval::new(8203, 8207), Interval::new(8216, 8217), Interval::new(8228, 8228), Interval::new(8231, 8231), Interval::new(8234, 8238), Interval::new(8288, 8292), Interval::new(8294, 8303), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8400, 8432), Interval::new(11388, 11389), Interval::new(11503, 11505), Interval::new(11631, 11631), Interval::new(11647, 11647), Interval::new(11744, 11775), Interval::new(11823, 11823), Interval::new(12293, 12293), Interval::new(12330, 12333), Interval::new(12337, 12341), Interval::new(12347, 12347), Interval::new(12441, 12446), Interval::new(12540, 12542), Interval::new(40981, 40981), Interval::new(42232, 42237), Interval::new(42508, 42508), Interval::new(42607, 42610), Interval::new(42612, 42621), Interval::new(42623, 42623), Interval::new(42652, 42655), Interval::new(42736, 42737), Interval::new(42752, 42785), Interval::new(42864, 42864), Interval::new(42888, 42890), Interval::new(42994, 42996), Interval::new(43000, 43001), Interval::new(43010, 43010), Interval::new(43014, 43014), Interval::new(43019, 43019), Interval::new(43045, 43046), Interval::new(43052, 43052), Interval::new(43204, 43205), Interval::new(43232, 43249), Interval::new(43263, 43263), Interval::new(43302, 43309), Interval::new(43335, 43345), Interval::new(43392, 43394), Interval::new(43443, 43443), Interval::new(43446, 43449), Interval::new(43452, 43453), Interval::new(43471, 43471), Interval::new(43493, 43494), Interval::new(43561, 43566), Interval::new(43569, 43570), Interval::new(43573, 43574), Interval::new(43587, 43587), Interval::new(43596, 43596), Interval::new(43632, 43632), Interval::new(43644, 43644), Interval::new(43696, 43696), Interval::new(43698, 43700), Interval::new(43703, 43704), Interval::new(43710, 43711), Interval::new(43713, 43713), Interval::new(43741, 43741), Interval::new(43756, 43757), Interval::new(43763, 43764), Interval::new(43766, 43766), Interval::new(43867, 43871), Interval::new(43881, 43883), Interval::new(44005, 44005), Interval::new(44008, 44008), Interval::new(44013, 44013), Interval::new(64286, 64286), Interval::new(64434, 64450), Interval::new(65024, 65039), Interval::new(65043, 65043), Interval::new(65056, 65071), Interval::new(65106, 65106), Interval::new(65109, 65109), Interval::new(65279, 65279), Interval::new(65287, 65287), Interval::new(65294, 65294), Interval::new(65306, 65306), Interval::new(65342, 65342), Interval::new(65344, 65344), Interval::new(65392, 65392), Interval::new(65438, 65439), Interval::new(65507, 65507), Interval::new(65529, 65531), Interval::new(66045, 66045), Interval::new(66272, 66272), Interval::new(66422, 66426), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(68097, 68099), Interval::new(68101, 68102), Interval::new(68108, 68111), Interval::new(68152, 68154), Interval::new(68159, 68159), Interval::new(68325, 68326), Interval::new(68900, 68903), Interval::new(69291, 69292), Interval::new(69373, 69375), Interval::new(69446, 69456), Interval::new(69506, 69509), Interval::new(69633, 69633), Interval::new(69688, 69702), Interval::new(69744, 69744), Interval::new(69747, 69748), Interval::new(69759, 69761), Interval::new(69811, 69814), Interval::new(69817, 69818), Interval::new(69821, 69821), Interval::new(69826, 69826), Interval::new(69837, 69837), Interval::new(69888, 69890), Interval::new(69927, 69931), Interval::new(69933, 69940), Interval::new(70003, 70003), Interval::new(70016, 70017), Interval::new(70070, 70078), Interval::new(70089, 70092), Interval::new(70095, 70095), Interval::new(70191, 70193), Interval::new(70196, 70196), Interval::new(70198, 70199), Interval::new(70206, 70206), Interval::new(70209, 70209), Interval::new(70367, 70367), Interval::new(70371, 70378), Interval::new(70400, 70401), Interval::new(70459, 70460), Interval::new(70464, 70464), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70712, 70719), Interval::new(70722, 70724), Interval::new(70726, 70726), Interval::new(70750, 70750), Interval::new(70835, 70840), Interval::new(70842, 70842), Interval::new(70847, 70848), Interval::new(70850, 70851), Interval::new(71090, 71093), Interval::new(71100, 71101), Interval::new(71103, 71104), Interval::new(71132, 71133), Interval::new(71219, 71226), Interval::new(71229, 71229), Interval::new(71231, 71232), Interval::new(71339, 71339), Interval::new(71341, 71341), Interval::new(71344, 71349), Interval::new(71351, 71351), Interval::new(71453, 71455), Interval::new(71458, 71461), Interval::new(71463, 71467), Interval::new(71727, 71735), Interval::new(71737, 71738), Interval::new(71995, 71996), Interval::new(71998, 71998), Interval::new(72003, 72003), Interval::new(72148, 72151), Interval::new(72154, 72155), Interval::new(72160, 72160), Interval::new(72193, 72202), Interval::new(72243, 72248), Interval::new(72251, 72254), Interval::new(72263, 72263), Interval::new(72273, 72278), Interval::new(72281, 72283), Interval::new(72330, 72342), Interval::new(72344, 72345), Interval::new(72752, 72758), Interval::new(72760, 72765), Interval::new(72767, 72767), Interval::new(72850, 72871), Interval::new(72874, 72880), Interval::new(72882, 72883), Interval::new(72885, 72886), Interval::new(73009, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73029), Interval::new(73031, 73031), Interval::new(73104, 73105), Interval::new(73109, 73109), Interval::new(73111, 73111), Interval::new(73459, 73460), Interval::new(73472, 73473), Interval::new(73526, 73530), Interval::new(73536, 73536), Interval::new(73538, 73538), Interval::new(78896, 78912), Interval::new(78919, 78933), Interval::new(92912, 92916), Interval::new(92976, 92982), Interval::new(92992, 92995), Interval::new(94031, 94031), Interval::new(94095, 94111), Interval::new(94176, 94177), Interval::new(94179, 94180), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(113821, 113822), Interval::new(113824, 113827), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119143, 119145), Interval::new(119155, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(119362, 119364), Interval::new(121344, 121398), Interval::new(121403, 121452), Interval::new(121461, 121461), Interval::new(121476, 121476), Interval::new(121499, 121503), Interval::new(121505, 121519), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(122928, 122989), Interval::new(123023, 123023), Interval::new(123184, 123197), Interval::new(123566, 123566), Interval::new(123628, 123631), Interval::new(124139, 124143), Interval::new(125136, 125142), Interval::new(125252, 125259), Interval::new(127995, 127999), Interval::new(917505, 917505), Interval::new(917536, 917631), Interval::new(917760, 917999), ]; /// Return the code point ranges of the 'Case_Ignorable' Unicode property. pub(crate) fn case_ignorable_ranges() -> &'static [Interval] { &CASE_IGNORABLE } const CASED: [Interval; 157] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 442), Interval::new(444, 447), Interval::new(452, 659), Interval::new(661, 696), Interval::new(704, 705), Interval::new(736, 740), Interval::new(837, 837), Interval::new(880, 883), Interval::new(886, 887), Interval::new(890, 893), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1376, 1416), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4351), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7424, 7615), Interval::new(7680, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8473, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8493), Interval::new(8495, 8500), Interval::new(8505, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8544, 8575), Interval::new(8579, 8580), Interval::new(9398, 9449), Interval::new(11264, 11492), Interval::new(11499, 11502), Interval::new(11506, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(42560, 42605), Interval::new(42624, 42653), Interval::new(42786, 42887), Interval::new(42891, 42894), Interval::new(42896, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 42998), Interval::new(43000, 43002), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(66560, 66639), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67456, 67456), Interval::new(67459, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(71840, 71903), Interval::new(93760, 93823), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(122624, 122633), Interval::new(122635, 122654), Interval::new(122661, 122666), Interval::new(122928, 122989), Interval::new(125184, 125251), Interval::new(127280, 127305), Interval::new(127312, 127337), Interval::new(127344, 127369), ]; /// Return the code point ranges of the 'Cased' Unicode property. pub(crate) fn cased_ranges() -> &'static [Interval] { &CASED } const CHANGES_WHEN_CASEFOLDED: [Interval; 622] = [ Interval::new(65, 90), Interval::new(181, 181), Interval::new(192, 214), Interval::new(216, 223), Interval::new(256, 256), Interval::new(258, 258), Interval::new(260, 260), Interval::new(262, 262), Interval::new(264, 264), Interval::new(266, 266), Interval::new(268, 268), Interval::new(270, 270), Interval::new(272, 272), Interval::new(274, 274), Interval::new(276, 276), Interval::new(278, 278), Interval::new(280, 280), Interval::new(282, 282), Interval::new(284, 284), Interval::new(286, 286), Interval::new(288, 288), Interval::new(290, 290), Interval::new(292, 292), Interval::new(294, 294), Interval::new(296, 296), Interval::new(298, 298), Interval::new(300, 300), Interval::new(302, 302), Interval::new(304, 304), Interval::new(306, 306), Interval::new(308, 308), Interval::new(310, 310), Interval::new(313, 313), Interval::new(315, 315), Interval::new(317, 317), Interval::new(319, 319), Interval::new(321, 321), Interval::new(323, 323), Interval::new(325, 325), Interval::new(327, 327), Interval::new(329, 330), Interval::new(332, 332), Interval::new(334, 334), Interval::new(336, 336), Interval::new(338, 338), Interval::new(340, 340), Interval::new(342, 342), Interval::new(344, 344), Interval::new(346, 346), Interval::new(348, 348), Interval::new(350, 350), Interval::new(352, 352), Interval::new(354, 354), Interval::new(356, 356), Interval::new(358, 358), Interval::new(360, 360), Interval::new(362, 362), Interval::new(364, 364), Interval::new(366, 366), Interval::new(368, 368), Interval::new(370, 370), Interval::new(372, 372), Interval::new(374, 374), Interval::new(376, 377), Interval::new(379, 379), Interval::new(381, 381), Interval::new(383, 383), Interval::new(385, 386), Interval::new(388, 388), Interval::new(390, 391), Interval::new(393, 395), Interval::new(398, 401), Interval::new(403, 404), Interval::new(406, 408), Interval::new(412, 413), Interval::new(415, 416), Interval::new(418, 418), Interval::new(420, 420), Interval::new(422, 423), Interval::new(425, 425), Interval::new(428, 428), Interval::new(430, 431), Interval::new(433, 435), Interval::new(437, 437), Interval::new(439, 440), Interval::new(444, 444), Interval::new(452, 453), Interval::new(455, 456), Interval::new(458, 459), Interval::new(461, 461), Interval::new(463, 463), Interval::new(465, 465), Interval::new(467, 467), Interval::new(469, 469), Interval::new(471, 471), Interval::new(473, 473), Interval::new(475, 475), Interval::new(478, 478), Interval::new(480, 480), Interval::new(482, 482), Interval::new(484, 484), Interval::new(486, 486), Interval::new(488, 488), Interval::new(490, 490), Interval::new(492, 492), Interval::new(494, 494), Interval::new(497, 498), Interval::new(500, 500), Interval::new(502, 504), Interval::new(506, 506), Interval::new(508, 508), Interval::new(510, 510), Interval::new(512, 512), Interval::new(514, 514), Interval::new(516, 516), Interval::new(518, 518), Interval::new(520, 520), Interval::new(522, 522), Interval::new(524, 524), Interval::new(526, 526), Interval::new(528, 528), Interval::new(530, 530), Interval::new(532, 532), Interval::new(534, 534), Interval::new(536, 536), Interval::new(538, 538), Interval::new(540, 540), Interval::new(542, 542), Interval::new(544, 544), Interval::new(546, 546), Interval::new(548, 548), Interval::new(550, 550), Interval::new(552, 552), Interval::new(554, 554), Interval::new(556, 556), Interval::new(558, 558), Interval::new(560, 560), Interval::new(562, 562), Interval::new(570, 571), Interval::new(573, 574), Interval::new(577, 577), Interval::new(579, 582), Interval::new(584, 584), Interval::new(586, 586), Interval::new(588, 588), Interval::new(590, 590), Interval::new(837, 837), Interval::new(880, 880), Interval::new(882, 882), Interval::new(886, 886), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 911), Interval::new(913, 929), Interval::new(931, 939), Interval::new(962, 962), Interval::new(975, 977), Interval::new(981, 982), Interval::new(984, 984), Interval::new(986, 986), Interval::new(988, 988), Interval::new(990, 990), Interval::new(992, 992), Interval::new(994, 994), Interval::new(996, 996), Interval::new(998, 998), Interval::new(1000, 1000), Interval::new(1002, 1002), Interval::new(1004, 1004), Interval::new(1006, 1006), Interval::new(1008, 1009), Interval::new(1012, 1013), Interval::new(1015, 1015), Interval::new(1017, 1018), Interval::new(1021, 1071), Interval::new(1120, 1120), Interval::new(1122, 1122), Interval::new(1124, 1124), Interval::new(1126, 1126), Interval::new(1128, 1128), Interval::new(1130, 1130), Interval::new(1132, 1132), Interval::new(1134, 1134), Interval::new(1136, 1136), Interval::new(1138, 1138), Interval::new(1140, 1140), Interval::new(1142, 1142), Interval::new(1144, 1144), Interval::new(1146, 1146), Interval::new(1148, 1148), Interval::new(1150, 1150), Interval::new(1152, 1152), Interval::new(1162, 1162), Interval::new(1164, 1164), Interval::new(1166, 1166), Interval::new(1168, 1168), Interval::new(1170, 1170), Interval::new(1172, 1172), Interval::new(1174, 1174), Interval::new(1176, 1176), Interval::new(1178, 1178), Interval::new(1180, 1180), Interval::new(1182, 1182), Interval::new(1184, 1184), Interval::new(1186, 1186), Interval::new(1188, 1188), Interval::new(1190, 1190), Interval::new(1192, 1192), Interval::new(1194, 1194), Interval::new(1196, 1196), Interval::new(1198, 1198), Interval::new(1200, 1200), Interval::new(1202, 1202), Interval::new(1204, 1204), Interval::new(1206, 1206), Interval::new(1208, 1208), Interval::new(1210, 1210), Interval::new(1212, 1212), Interval::new(1214, 1214), Interval::new(1216, 1217), Interval::new(1219, 1219), Interval::new(1221, 1221), Interval::new(1223, 1223), Interval::new(1225, 1225), Interval::new(1227, 1227), Interval::new(1229, 1229), Interval::new(1232, 1232), Interval::new(1234, 1234), Interval::new(1236, 1236), Interval::new(1238, 1238), Interval::new(1240, 1240), Interval::new(1242, 1242), Interval::new(1244, 1244), Interval::new(1246, 1246), Interval::new(1248, 1248), Interval::new(1250, 1250), Interval::new(1252, 1252), Interval::new(1254, 1254), Interval::new(1256, 1256), Interval::new(1258, 1258), Interval::new(1260, 1260), Interval::new(1262, 1262), Interval::new(1264, 1264), Interval::new(1266, 1266), Interval::new(1268, 1268), Interval::new(1270, 1270), Interval::new(1272, 1272), Interval::new(1274, 1274), Interval::new(1276, 1276), Interval::new(1278, 1278), Interval::new(1280, 1280), Interval::new(1282, 1282), Interval::new(1284, 1284), Interval::new(1286, 1286), Interval::new(1288, 1288), Interval::new(1290, 1290), Interval::new(1292, 1292), Interval::new(1294, 1294), Interval::new(1296, 1296), Interval::new(1298, 1298), Interval::new(1300, 1300), Interval::new(1302, 1302), Interval::new(1304, 1304), Interval::new(1306, 1306), Interval::new(1308, 1308), Interval::new(1310, 1310), Interval::new(1312, 1312), Interval::new(1314, 1314), Interval::new(1316, 1316), Interval::new(1318, 1318), Interval::new(1320, 1320), Interval::new(1322, 1322), Interval::new(1324, 1324), Interval::new(1326, 1326), Interval::new(1329, 1366), Interval::new(1415, 1415), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7680, 7680), Interval::new(7682, 7682), Interval::new(7684, 7684), Interval::new(7686, 7686), Interval::new(7688, 7688), Interval::new(7690, 7690), Interval::new(7692, 7692), Interval::new(7694, 7694), Interval::new(7696, 7696), Interval::new(7698, 7698), Interval::new(7700, 7700), Interval::new(7702, 7702), Interval::new(7704, 7704), Interval::new(7706, 7706), Interval::new(7708, 7708), Interval::new(7710, 7710), Interval::new(7712, 7712), Interval::new(7714, 7714), Interval::new(7716, 7716), Interval::new(7718, 7718), Interval::new(7720, 7720), Interval::new(7722, 7722), Interval::new(7724, 7724), Interval::new(7726, 7726), Interval::new(7728, 7728), Interval::new(7730, 7730), Interval::new(7732, 7732), Interval::new(7734, 7734), Interval::new(7736, 7736), Interval::new(7738, 7738), Interval::new(7740, 7740), Interval::new(7742, 7742), Interval::new(7744, 7744), Interval::new(7746, 7746), Interval::new(7748, 7748), Interval::new(7750, 7750), Interval::new(7752, 7752), Interval::new(7754, 7754), Interval::new(7756, 7756), Interval::new(7758, 7758), Interval::new(7760, 7760), Interval::new(7762, 7762), Interval::new(7764, 7764), Interval::new(7766, 7766), Interval::new(7768, 7768), Interval::new(7770, 7770), Interval::new(7772, 7772), Interval::new(7774, 7774), Interval::new(7776, 7776), Interval::new(7778, 7778), Interval::new(7780, 7780), Interval::new(7782, 7782), Interval::new(7784, 7784), Interval::new(7786, 7786), Interval::new(7788, 7788), Interval::new(7790, 7790), Interval::new(7792, 7792), Interval::new(7794, 7794), Interval::new(7796, 7796), Interval::new(7798, 7798), Interval::new(7800, 7800), Interval::new(7802, 7802), Interval::new(7804, 7804), Interval::new(7806, 7806), Interval::new(7808, 7808), Interval::new(7810, 7810), Interval::new(7812, 7812), Interval::new(7814, 7814), Interval::new(7816, 7816), Interval::new(7818, 7818), Interval::new(7820, 7820), Interval::new(7822, 7822), Interval::new(7824, 7824), Interval::new(7826, 7826), Interval::new(7828, 7828), Interval::new(7834, 7835), Interval::new(7838, 7838), Interval::new(7840, 7840), Interval::new(7842, 7842), Interval::new(7844, 7844), Interval::new(7846, 7846), Interval::new(7848, 7848), Interval::new(7850, 7850), Interval::new(7852, 7852), Interval::new(7854, 7854), Interval::new(7856, 7856), Interval::new(7858, 7858), Interval::new(7860, 7860), Interval::new(7862, 7862), Interval::new(7864, 7864), Interval::new(7866, 7866), Interval::new(7868, 7868), Interval::new(7870, 7870), Interval::new(7872, 7872), Interval::new(7874, 7874), Interval::new(7876, 7876), Interval::new(7878, 7878), Interval::new(7880, 7880), Interval::new(7882, 7882), Interval::new(7884, 7884), Interval::new(7886, 7886), Interval::new(7888, 7888), Interval::new(7890, 7890), Interval::new(7892, 7892), Interval::new(7894, 7894), Interval::new(7896, 7896), Interval::new(7898, 7898), Interval::new(7900, 7900), Interval::new(7902, 7902), Interval::new(7904, 7904), Interval::new(7906, 7906), Interval::new(7908, 7908), Interval::new(7910, 7910), Interval::new(7912, 7912), Interval::new(7914, 7914), Interval::new(7916, 7916), Interval::new(7918, 7918), Interval::new(7920, 7920), Interval::new(7922, 7922), Interval::new(7924, 7924), Interval::new(7926, 7926), Interval::new(7928, 7928), Interval::new(7930, 7930), Interval::new(7932, 7932), Interval::new(7934, 7934), Interval::new(7944, 7951), Interval::new(7960, 7965), Interval::new(7976, 7983), Interval::new(7992, 7999), Interval::new(8008, 8013), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8031), Interval::new(8040, 8047), Interval::new(8064, 8111), Interval::new(8114, 8116), Interval::new(8119, 8124), Interval::new(8130, 8132), Interval::new(8135, 8140), Interval::new(8152, 8155), Interval::new(8168, 8172), Interval::new(8178, 8180), Interval::new(8183, 8188), Interval::new(8486, 8486), Interval::new(8490, 8491), Interval::new(8498, 8498), Interval::new(8544, 8559), Interval::new(8579, 8579), Interval::new(9398, 9423), Interval::new(11264, 11311), Interval::new(11360, 11360), Interval::new(11362, 11364), Interval::new(11367, 11367), Interval::new(11369, 11369), Interval::new(11371, 11371), Interval::new(11373, 11376), Interval::new(11378, 11378), Interval::new(11381, 11381), Interval::new(11390, 11392), Interval::new(11394, 11394), Interval::new(11396, 11396), Interval::new(11398, 11398), Interval::new(11400, 11400), Interval::new(11402, 11402), Interval::new(11404, 11404), Interval::new(11406, 11406), Interval::new(11408, 11408), Interval::new(11410, 11410), Interval::new(11412, 11412), Interval::new(11414, 11414), Interval::new(11416, 11416), Interval::new(11418, 11418), Interval::new(11420, 11420), Interval::new(11422, 11422), Interval::new(11424, 11424), Interval::new(11426, 11426), Interval::new(11428, 11428), Interval::new(11430, 11430), Interval::new(11432, 11432), Interval::new(11434, 11434), Interval::new(11436, 11436), Interval::new(11438, 11438), Interval::new(11440, 11440), Interval::new(11442, 11442), Interval::new(11444, 11444), Interval::new(11446, 11446), Interval::new(11448, 11448), Interval::new(11450, 11450), Interval::new(11452, 11452), Interval::new(11454, 11454), Interval::new(11456, 11456), Interval::new(11458, 11458), Interval::new(11460, 11460), Interval::new(11462, 11462), Interval::new(11464, 11464), Interval::new(11466, 11466), Interval::new(11468, 11468), Interval::new(11470, 11470), Interval::new(11472, 11472), Interval::new(11474, 11474), Interval::new(11476, 11476), Interval::new(11478, 11478), Interval::new(11480, 11480), Interval::new(11482, 11482), Interval::new(11484, 11484), Interval::new(11486, 11486), Interval::new(11488, 11488), Interval::new(11490, 11490), Interval::new(11499, 11499), Interval::new(11501, 11501), Interval::new(11506, 11506), Interval::new(42560, 42560), Interval::new(42562, 42562), Interval::new(42564, 42564), Interval::new(42566, 42566), Interval::new(42568, 42568), Interval::new(42570, 42570), Interval::new(42572, 42572), Interval::new(42574, 42574), Interval::new(42576, 42576), Interval::new(42578, 42578), Interval::new(42580, 42580), Interval::new(42582, 42582), Interval::new(42584, 42584), Interval::new(42586, 42586), Interval::new(42588, 42588), Interval::new(42590, 42590), Interval::new(42592, 42592), Interval::new(42594, 42594), Interval::new(42596, 42596), Interval::new(42598, 42598), Interval::new(42600, 42600), Interval::new(42602, 42602), Interval::new(42604, 42604), Interval::new(42624, 42624), Interval::new(42626, 42626), Interval::new(42628, 42628), Interval::new(42630, 42630), Interval::new(42632, 42632), Interval::new(42634, 42634), Interval::new(42636, 42636), Interval::new(42638, 42638), Interval::new(42640, 42640), Interval::new(42642, 42642), Interval::new(42644, 42644), Interval::new(42646, 42646), Interval::new(42648, 42648), Interval::new(42650, 42650), Interval::new(42786, 42786), Interval::new(42788, 42788), Interval::new(42790, 42790), Interval::new(42792, 42792), Interval::new(42794, 42794), Interval::new(42796, 42796), Interval::new(42798, 42798), Interval::new(42802, 42802), Interval::new(42804, 42804), Interval::new(42806, 42806), Interval::new(42808, 42808), Interval::new(42810, 42810), Interval::new(42812, 42812), Interval::new(42814, 42814), Interval::new(42816, 42816), Interval::new(42818, 42818), Interval::new(42820, 42820), Interval::new(42822, 42822), Interval::new(42824, 42824), Interval::new(42826, 42826), Interval::new(42828, 42828), Interval::new(42830, 42830), Interval::new(42832, 42832), Interval::new(42834, 42834), Interval::new(42836, 42836), Interval::new(42838, 42838), Interval::new(42840, 42840), Interval::new(42842, 42842), Interval::new(42844, 42844), Interval::new(42846, 42846), Interval::new(42848, 42848), Interval::new(42850, 42850), Interval::new(42852, 42852), Interval::new(42854, 42854), Interval::new(42856, 42856), Interval::new(42858, 42858), Interval::new(42860, 42860), Interval::new(42862, 42862), Interval::new(42873, 42873), Interval::new(42875, 42875), Interval::new(42877, 42878), Interval::new(42880, 42880), Interval::new(42882, 42882), Interval::new(42884, 42884), Interval::new(42886, 42886), Interval::new(42891, 42891), Interval::new(42893, 42893), Interval::new(42896, 42896), Interval::new(42898, 42898), Interval::new(42902, 42902), Interval::new(42904, 42904), Interval::new(42906, 42906), Interval::new(42908, 42908), Interval::new(42910, 42910), Interval::new(42912, 42912), Interval::new(42914, 42914), Interval::new(42916, 42916), Interval::new(42918, 42918), Interval::new(42920, 42920), Interval::new(42922, 42926), Interval::new(42928, 42932), Interval::new(42934, 42934), Interval::new(42936, 42936), Interval::new(42938, 42938), Interval::new(42940, 42940), Interval::new(42942, 42942), Interval::new(42944, 42944), Interval::new(42946, 42946), Interval::new(42948, 42951), Interval::new(42953, 42953), Interval::new(42960, 42960), Interval::new(42966, 42966), Interval::new(42968, 42968), Interval::new(42997, 42997), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65313, 65338), Interval::new(66560, 66599), Interval::new(66736, 66771), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(68736, 68786), Interval::new(71840, 71871), Interval::new(93760, 93791), Interval::new(125184, 125217), ]; /// Return the code point ranges of the 'Changes_When_Casefolded' Unicode property. pub(crate) fn changes_when_casefolded_ranges() -> &'static [Interval] { &CHANGES_WHEN_CASEFOLDED } const CHANGES_WHEN_CASEMAPPED: [Interval; 131] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(181, 181), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 311), Interval::new(313, 396), Interval::new(398, 410), Interval::new(412, 425), Interval::new(428, 441), Interval::new(444, 445), Interval::new(447, 447), Interval::new(452, 544), Interval::new(546, 563), Interval::new(570, 596), Interval::new(598, 599), Interval::new(601, 601), Interval::new(603, 604), Interval::new(608, 609), Interval::new(611, 611), Interval::new(613, 614), Interval::new(616, 620), Interval::new(623, 623), Interval::new(625, 626), Interval::new(629, 629), Interval::new(637, 637), Interval::new(640, 640), Interval::new(642, 643), Interval::new(647, 652), Interval::new(658, 658), Interval::new(669, 670), Interval::new(837, 837), Interval::new(880, 883), Interval::new(886, 887), Interval::new(891, 893), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 977), Interval::new(981, 1013), Interval::new(1015, 1019), Interval::new(1021, 1153), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1377, 1415), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4349, 4351), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7545, 7545), Interval::new(7549, 7549), Interval::new(7566, 7566), Interval::new(7680, 7835), Interval::new(7838, 7838), Interval::new(7840, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8486, 8486), Interval::new(8490, 8491), Interval::new(8498, 8498), Interval::new(8526, 8526), Interval::new(8544, 8575), Interval::new(8579, 8580), Interval::new(9398, 9449), Interval::new(11264, 11376), Interval::new(11378, 11379), Interval::new(11381, 11382), Interval::new(11390, 11491), Interval::new(11499, 11502), Interval::new(11506, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(42560, 42605), Interval::new(42624, 42651), Interval::new(42786, 42799), Interval::new(42802, 42863), Interval::new(42873, 42887), Interval::new(42891, 42893), Interval::new(42896, 42900), Interval::new(42902, 42926), Interval::new(42928, 42954), Interval::new(42960, 42961), Interval::new(42966, 42969), Interval::new(42997, 42998), Interval::new(43859, 43859), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(66560, 66639), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(71840, 71903), Interval::new(93760, 93823), Interval::new(125184, 125251), ]; /// Return the code point ranges of the 'Changes_When_Casemapped' Unicode property. pub(crate) fn changes_when_casemapped_ranges() -> &'static [Interval] { &CHANGES_WHEN_CASEMAPPED } const CHANGES_WHEN_LOWERCASED: [Interval; 609] = [ Interval::new(65, 90), Interval::new(192, 214), Interval::new(216, 222), Interval::new(256, 256), Interval::new(258, 258), Interval::new(260, 260), Interval::new(262, 262), Interval::new(264, 264), Interval::new(266, 266), Interval::new(268, 268), Interval::new(270, 270), Interval::new(272, 272), Interval::new(274, 274), Interval::new(276, 276), Interval::new(278, 278), Interval::new(280, 280), Interval::new(282, 282), Interval::new(284, 284), Interval::new(286, 286), Interval::new(288, 288), Interval::new(290, 290), Interval::new(292, 292), Interval::new(294, 294), Interval::new(296, 296), Interval::new(298, 298), Interval::new(300, 300), Interval::new(302, 302), Interval::new(304, 304), Interval::new(306, 306), Interval::new(308, 308), Interval::new(310, 310), Interval::new(313, 313), Interval::new(315, 315), Interval::new(317, 317), Interval::new(319, 319), Interval::new(321, 321), Interval::new(323, 323), Interval::new(325, 325), Interval::new(327, 327), Interval::new(330, 330), Interval::new(332, 332), Interval::new(334, 334), Interval::new(336, 336), Interval::new(338, 338), Interval::new(340, 340), Interval::new(342, 342), Interval::new(344, 344), Interval::new(346, 346), Interval::new(348, 348), Interval::new(350, 350), Interval::new(352, 352), Interval::new(354, 354), Interval::new(356, 356), Interval::new(358, 358), Interval::new(360, 360), Interval::new(362, 362), Interval::new(364, 364), Interval::new(366, 366), Interval::new(368, 368), Interval::new(370, 370), Interval::new(372, 372), Interval::new(374, 374), Interval::new(376, 377), Interval::new(379, 379), Interval::new(381, 381), Interval::new(385, 386), Interval::new(388, 388), Interval::new(390, 391), Interval::new(393, 395), Interval::new(398, 401), Interval::new(403, 404), Interval::new(406, 408), Interval::new(412, 413), Interval::new(415, 416), Interval::new(418, 418), Interval::new(420, 420), Interval::new(422, 423), Interval::new(425, 425), Interval::new(428, 428), Interval::new(430, 431), Interval::new(433, 435), Interval::new(437, 437), Interval::new(439, 440), Interval::new(444, 444), Interval::new(452, 453), Interval::new(455, 456), Interval::new(458, 459), Interval::new(461, 461), Interval::new(463, 463), Interval::new(465, 465), Interval::new(467, 467), Interval::new(469, 469), Interval::new(471, 471), Interval::new(473, 473), Interval::new(475, 475), Interval::new(478, 478), Interval::new(480, 480), Interval::new(482, 482), Interval::new(484, 484), Interval::new(486, 486), Interval::new(488, 488), Interval::new(490, 490), Interval::new(492, 492), Interval::new(494, 494), Interval::new(497, 498), Interval::new(500, 500), Interval::new(502, 504), Interval::new(506, 506), Interval::new(508, 508), Interval::new(510, 510), Interval::new(512, 512), Interval::new(514, 514), Interval::new(516, 516), Interval::new(518, 518), Interval::new(520, 520), Interval::new(522, 522), Interval::new(524, 524), Interval::new(526, 526), Interval::new(528, 528), Interval::new(530, 530), Interval::new(532, 532), Interval::new(534, 534), Interval::new(536, 536), Interval::new(538, 538), Interval::new(540, 540), Interval::new(542, 542), Interval::new(544, 544), Interval::new(546, 546), Interval::new(548, 548), Interval::new(550, 550), Interval::new(552, 552), Interval::new(554, 554), Interval::new(556, 556), Interval::new(558, 558), Interval::new(560, 560), Interval::new(562, 562), Interval::new(570, 571), Interval::new(573, 574), Interval::new(577, 577), Interval::new(579, 582), Interval::new(584, 584), Interval::new(586, 586), Interval::new(588, 588), Interval::new(590, 590), Interval::new(880, 880), Interval::new(882, 882), Interval::new(886, 886), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 911), Interval::new(913, 929), Interval::new(931, 939), Interval::new(975, 975), Interval::new(984, 984), Interval::new(986, 986), Interval::new(988, 988), Interval::new(990, 990), Interval::new(992, 992), Interval::new(994, 994), Interval::new(996, 996), Interval::new(998, 998), Interval::new(1000, 1000), Interval::new(1002, 1002), Interval::new(1004, 1004), Interval::new(1006, 1006), Interval::new(1012, 1012), Interval::new(1015, 1015), Interval::new(1017, 1018), Interval::new(1021, 1071), Interval::new(1120, 1120), Interval::new(1122, 1122), Interval::new(1124, 1124), Interval::new(1126, 1126), Interval::new(1128, 1128), Interval::new(1130, 1130), Interval::new(1132, 1132), Interval::new(1134, 1134), Interval::new(1136, 1136), Interval::new(1138, 1138), Interval::new(1140, 1140), Interval::new(1142, 1142), Interval::new(1144, 1144), Interval::new(1146, 1146), Interval::new(1148, 1148), Interval::new(1150, 1150), Interval::new(1152, 1152), Interval::new(1162, 1162), Interval::new(1164, 1164), Interval::new(1166, 1166), Interval::new(1168, 1168), Interval::new(1170, 1170), Interval::new(1172, 1172), Interval::new(1174, 1174), Interval::new(1176, 1176), Interval::new(1178, 1178), Interval::new(1180, 1180), Interval::new(1182, 1182), Interval::new(1184, 1184), Interval::new(1186, 1186), Interval::new(1188, 1188), Interval::new(1190, 1190), Interval::new(1192, 1192), Interval::new(1194, 1194), Interval::new(1196, 1196), Interval::new(1198, 1198), Interval::new(1200, 1200), Interval::new(1202, 1202), Interval::new(1204, 1204), Interval::new(1206, 1206), Interval::new(1208, 1208), Interval::new(1210, 1210), Interval::new(1212, 1212), Interval::new(1214, 1214), Interval::new(1216, 1217), Interval::new(1219, 1219), Interval::new(1221, 1221), Interval::new(1223, 1223), Interval::new(1225, 1225), Interval::new(1227, 1227), Interval::new(1229, 1229), Interval::new(1232, 1232), Interval::new(1234, 1234), Interval::new(1236, 1236), Interval::new(1238, 1238), Interval::new(1240, 1240), Interval::new(1242, 1242), Interval::new(1244, 1244), Interval::new(1246, 1246), Interval::new(1248, 1248), Interval::new(1250, 1250), Interval::new(1252, 1252), Interval::new(1254, 1254), Interval::new(1256, 1256), Interval::new(1258, 1258), Interval::new(1260, 1260), Interval::new(1262, 1262), Interval::new(1264, 1264), Interval::new(1266, 1266), Interval::new(1268, 1268), Interval::new(1270, 1270), Interval::new(1272, 1272), Interval::new(1274, 1274), Interval::new(1276, 1276), Interval::new(1278, 1278), Interval::new(1280, 1280), Interval::new(1282, 1282), Interval::new(1284, 1284), Interval::new(1286, 1286), Interval::new(1288, 1288), Interval::new(1290, 1290), Interval::new(1292, 1292), Interval::new(1294, 1294), Interval::new(1296, 1296), Interval::new(1298, 1298), Interval::new(1300, 1300), Interval::new(1302, 1302), Interval::new(1304, 1304), Interval::new(1306, 1306), Interval::new(1308, 1308), Interval::new(1310, 1310), Interval::new(1312, 1312), Interval::new(1314, 1314), Interval::new(1316, 1316), Interval::new(1318, 1318), Interval::new(1320, 1320), Interval::new(1322, 1322), Interval::new(1324, 1324), Interval::new(1326, 1326), Interval::new(1329, 1366), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(5024, 5109), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7680, 7680), Interval::new(7682, 7682), Interval::new(7684, 7684), Interval::new(7686, 7686), Interval::new(7688, 7688), Interval::new(7690, 7690), Interval::new(7692, 7692), Interval::new(7694, 7694), Interval::new(7696, 7696), Interval::new(7698, 7698), Interval::new(7700, 7700), Interval::new(7702, 7702), Interval::new(7704, 7704), Interval::new(7706, 7706), Interval::new(7708, 7708), Interval::new(7710, 7710), Interval::new(7712, 7712), Interval::new(7714, 7714), Interval::new(7716, 7716), Interval::new(7718, 7718), Interval::new(7720, 7720), Interval::new(7722, 7722), Interval::new(7724, 7724), Interval::new(7726, 7726), Interval::new(7728, 7728), Interval::new(7730, 7730), Interval::new(7732, 7732), Interval::new(7734, 7734), Interval::new(7736, 7736), Interval::new(7738, 7738), Interval::new(7740, 7740), Interval::new(7742, 7742), Interval::new(7744, 7744), Interval::new(7746, 7746), Interval::new(7748, 7748), Interval::new(7750, 7750), Interval::new(7752, 7752), Interval::new(7754, 7754), Interval::new(7756, 7756), Interval::new(7758, 7758), Interval::new(7760, 7760), Interval::new(7762, 7762), Interval::new(7764, 7764), Interval::new(7766, 7766), Interval::new(7768, 7768), Interval::new(7770, 7770), Interval::new(7772, 7772), Interval::new(7774, 7774), Interval::new(7776, 7776), Interval::new(7778, 7778), Interval::new(7780, 7780), Interval::new(7782, 7782), Interval::new(7784, 7784), Interval::new(7786, 7786), Interval::new(7788, 7788), Interval::new(7790, 7790), Interval::new(7792, 7792), Interval::new(7794, 7794), Interval::new(7796, 7796), Interval::new(7798, 7798), Interval::new(7800, 7800), Interval::new(7802, 7802), Interval::new(7804, 7804), Interval::new(7806, 7806), Interval::new(7808, 7808), Interval::new(7810, 7810), Interval::new(7812, 7812), Interval::new(7814, 7814), Interval::new(7816, 7816), Interval::new(7818, 7818), Interval::new(7820, 7820), Interval::new(7822, 7822), Interval::new(7824, 7824), Interval::new(7826, 7826), Interval::new(7828, 7828), Interval::new(7838, 7838), Interval::new(7840, 7840), Interval::new(7842, 7842), Interval::new(7844, 7844), Interval::new(7846, 7846), Interval::new(7848, 7848), Interval::new(7850, 7850), Interval::new(7852, 7852), Interval::new(7854, 7854), Interval::new(7856, 7856), Interval::new(7858, 7858), Interval::new(7860, 7860), Interval::new(7862, 7862), Interval::new(7864, 7864), Interval::new(7866, 7866), Interval::new(7868, 7868), Interval::new(7870, 7870), Interval::new(7872, 7872), Interval::new(7874, 7874), Interval::new(7876, 7876), Interval::new(7878, 7878), Interval::new(7880, 7880), Interval::new(7882, 7882), Interval::new(7884, 7884), Interval::new(7886, 7886), Interval::new(7888, 7888), Interval::new(7890, 7890), Interval::new(7892, 7892), Interval::new(7894, 7894), Interval::new(7896, 7896), Interval::new(7898, 7898), Interval::new(7900, 7900), Interval::new(7902, 7902), Interval::new(7904, 7904), Interval::new(7906, 7906), Interval::new(7908, 7908), Interval::new(7910, 7910), Interval::new(7912, 7912), Interval::new(7914, 7914), Interval::new(7916, 7916), Interval::new(7918, 7918), Interval::new(7920, 7920), Interval::new(7922, 7922), Interval::new(7924, 7924), Interval::new(7926, 7926), Interval::new(7928, 7928), Interval::new(7930, 7930), Interval::new(7932, 7932), Interval::new(7934, 7934), Interval::new(7944, 7951), Interval::new(7960, 7965), Interval::new(7976, 7983), Interval::new(7992, 7999), Interval::new(8008, 8013), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8031), Interval::new(8040, 8047), Interval::new(8072, 8079), Interval::new(8088, 8095), Interval::new(8104, 8111), Interval::new(8120, 8124), Interval::new(8136, 8140), Interval::new(8152, 8155), Interval::new(8168, 8172), Interval::new(8184, 8188), Interval::new(8486, 8486), Interval::new(8490, 8491), Interval::new(8498, 8498), Interval::new(8544, 8559), Interval::new(8579, 8579), Interval::new(9398, 9423), Interval::new(11264, 11311), Interval::new(11360, 11360), Interval::new(11362, 11364), Interval::new(11367, 11367), Interval::new(11369, 11369), Interval::new(11371, 11371), Interval::new(11373, 11376), Interval::new(11378, 11378), Interval::new(11381, 11381), Interval::new(11390, 11392), Interval::new(11394, 11394), Interval::new(11396, 11396), Interval::new(11398, 11398), Interval::new(11400, 11400), Interval::new(11402, 11402), Interval::new(11404, 11404), Interval::new(11406, 11406), Interval::new(11408, 11408), Interval::new(11410, 11410), Interval::new(11412, 11412), Interval::new(11414, 11414), Interval::new(11416, 11416), Interval::new(11418, 11418), Interval::new(11420, 11420), Interval::new(11422, 11422), Interval::new(11424, 11424), Interval::new(11426, 11426), Interval::new(11428, 11428), Interval::new(11430, 11430), Interval::new(11432, 11432), Interval::new(11434, 11434), Interval::new(11436, 11436), Interval::new(11438, 11438), Interval::new(11440, 11440), Interval::new(11442, 11442), Interval::new(11444, 11444), Interval::new(11446, 11446), Interval::new(11448, 11448), Interval::new(11450, 11450), Interval::new(11452, 11452), Interval::new(11454, 11454), Interval::new(11456, 11456), Interval::new(11458, 11458), Interval::new(11460, 11460), Interval::new(11462, 11462), Interval::new(11464, 11464), Interval::new(11466, 11466), Interval::new(11468, 11468), Interval::new(11470, 11470), Interval::new(11472, 11472), Interval::new(11474, 11474), Interval::new(11476, 11476), Interval::new(11478, 11478), Interval::new(11480, 11480), Interval::new(11482, 11482), Interval::new(11484, 11484), Interval::new(11486, 11486), Interval::new(11488, 11488), Interval::new(11490, 11490), Interval::new(11499, 11499), Interval::new(11501, 11501), Interval::new(11506, 11506), Interval::new(42560, 42560), Interval::new(42562, 42562), Interval::new(42564, 42564), Interval::new(42566, 42566), Interval::new(42568, 42568), Interval::new(42570, 42570), Interval::new(42572, 42572), Interval::new(42574, 42574), Interval::new(42576, 42576), Interval::new(42578, 42578), Interval::new(42580, 42580), Interval::new(42582, 42582), Interval::new(42584, 42584), Interval::new(42586, 42586), Interval::new(42588, 42588), Interval::new(42590, 42590), Interval::new(42592, 42592), Interval::new(42594, 42594), Interval::new(42596, 42596), Interval::new(42598, 42598), Interval::new(42600, 42600), Interval::new(42602, 42602), Interval::new(42604, 42604), Interval::new(42624, 42624), Interval::new(42626, 42626), Interval::new(42628, 42628), Interval::new(42630, 42630), Interval::new(42632, 42632), Interval::new(42634, 42634), Interval::new(42636, 42636), Interval::new(42638, 42638), Interval::new(42640, 42640), Interval::new(42642, 42642), Interval::new(42644, 42644), Interval::new(42646, 42646), Interval::new(42648, 42648), Interval::new(42650, 42650), Interval::new(42786, 42786), Interval::new(42788, 42788), Interval::new(42790, 42790), Interval::new(42792, 42792), Interval::new(42794, 42794), Interval::new(42796, 42796), Interval::new(42798, 42798), Interval::new(42802, 42802), Interval::new(42804, 42804), Interval::new(42806, 42806), Interval::new(42808, 42808), Interval::new(42810, 42810), Interval::new(42812, 42812), Interval::new(42814, 42814), Interval::new(42816, 42816), Interval::new(42818, 42818), Interval::new(42820, 42820), Interval::new(42822, 42822), Interval::new(42824, 42824), Interval::new(42826, 42826), Interval::new(42828, 42828), Interval::new(42830, 42830), Interval::new(42832, 42832), Interval::new(42834, 42834), Interval::new(42836, 42836), Interval::new(42838, 42838), Interval::new(42840, 42840), Interval::new(42842, 42842), Interval::new(42844, 42844), Interval::new(42846, 42846), Interval::new(42848, 42848), Interval::new(42850, 42850), Interval::new(42852, 42852), Interval::new(42854, 42854), Interval::new(42856, 42856), Interval::new(42858, 42858), Interval::new(42860, 42860), Interval::new(42862, 42862), Interval::new(42873, 42873), Interval::new(42875, 42875), Interval::new(42877, 42878), Interval::new(42880, 42880), Interval::new(42882, 42882), Interval::new(42884, 42884), Interval::new(42886, 42886), Interval::new(42891, 42891), Interval::new(42893, 42893), Interval::new(42896, 42896), Interval::new(42898, 42898), Interval::new(42902, 42902), Interval::new(42904, 42904), Interval::new(42906, 42906), Interval::new(42908, 42908), Interval::new(42910, 42910), Interval::new(42912, 42912), Interval::new(42914, 42914), Interval::new(42916, 42916), Interval::new(42918, 42918), Interval::new(42920, 42920), Interval::new(42922, 42926), Interval::new(42928, 42932), Interval::new(42934, 42934), Interval::new(42936, 42936), Interval::new(42938, 42938), Interval::new(42940, 42940), Interval::new(42942, 42942), Interval::new(42944, 42944), Interval::new(42946, 42946), Interval::new(42948, 42951), Interval::new(42953, 42953), Interval::new(42960, 42960), Interval::new(42966, 42966), Interval::new(42968, 42968), Interval::new(42997, 42997), Interval::new(65313, 65338), Interval::new(66560, 66599), Interval::new(66736, 66771), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(68736, 68786), Interval::new(71840, 71871), Interval::new(93760, 93791), Interval::new(125184, 125217), ]; /// Return the code point ranges of the 'Changes_When_Lowercased' Unicode property. pub(crate) fn changes_when_lowercased_ranges() -> &'static [Interval] { &CHANGES_WHEN_LOWERCASED } const CHANGES_WHEN_TITLECASED: [Interval; 626] = [ Interval::new(97, 122), Interval::new(181, 181), Interval::new(223, 246), Interval::new(248, 255), Interval::new(257, 257), Interval::new(259, 259), Interval::new(261, 261), Interval::new(263, 263), Interval::new(265, 265), Interval::new(267, 267), Interval::new(269, 269), Interval::new(271, 271), Interval::new(273, 273), Interval::new(275, 275), Interval::new(277, 277), Interval::new(279, 279), Interval::new(281, 281), Interval::new(283, 283), Interval::new(285, 285), Interval::new(287, 287), Interval::new(289, 289), Interval::new(291, 291), Interval::new(293, 293), Interval::new(295, 295), Interval::new(297, 297), Interval::new(299, 299), Interval::new(301, 301), Interval::new(303, 303), Interval::new(305, 305), Interval::new(307, 307), Interval::new(309, 309), Interval::new(311, 311), Interval::new(314, 314), Interval::new(316, 316), Interval::new(318, 318), Interval::new(320, 320), Interval::new(322, 322), Interval::new(324, 324), Interval::new(326, 326), Interval::new(328, 329), Interval::new(331, 331), Interval::new(333, 333), Interval::new(335, 335), Interval::new(337, 337), Interval::new(339, 339), Interval::new(341, 341), Interval::new(343, 343), Interval::new(345, 345), Interval::new(347, 347), Interval::new(349, 349), Interval::new(351, 351), Interval::new(353, 353), Interval::new(355, 355), Interval::new(357, 357), Interval::new(359, 359), Interval::new(361, 361), Interval::new(363, 363), Interval::new(365, 365), Interval::new(367, 367), Interval::new(369, 369), Interval::new(371, 371), Interval::new(373, 373), Interval::new(375, 375), Interval::new(378, 378), Interval::new(380, 380), Interval::new(382, 384), Interval::new(387, 387), Interval::new(389, 389), Interval::new(392, 392), Interval::new(396, 396), Interval::new(402, 402), Interval::new(405, 405), Interval::new(409, 410), Interval::new(414, 414), Interval::new(417, 417), Interval::new(419, 419), Interval::new(421, 421), Interval::new(424, 424), Interval::new(429, 429), Interval::new(432, 432), Interval::new(436, 436), Interval::new(438, 438), Interval::new(441, 441), Interval::new(445, 445), Interval::new(447, 447), Interval::new(452, 452), Interval::new(454, 455), Interval::new(457, 458), Interval::new(460, 460), Interval::new(462, 462), Interval::new(464, 464), Interval::new(466, 466), Interval::new(468, 468), Interval::new(470, 470), Interval::new(472, 472), Interval::new(474, 474), Interval::new(476, 477), Interval::new(479, 479), Interval::new(481, 481), Interval::new(483, 483), Interval::new(485, 485), Interval::new(487, 487), Interval::new(489, 489), Interval::new(491, 491), Interval::new(493, 493), Interval::new(495, 497), Interval::new(499, 499), Interval::new(501, 501), Interval::new(505, 505), Interval::new(507, 507), Interval::new(509, 509), Interval::new(511, 511), Interval::new(513, 513), Interval::new(515, 515), Interval::new(517, 517), Interval::new(519, 519), Interval::new(521, 521), Interval::new(523, 523), Interval::new(525, 525), Interval::new(527, 527), Interval::new(529, 529), Interval::new(531, 531), Interval::new(533, 533), Interval::new(535, 535), Interval::new(537, 537), Interval::new(539, 539), Interval::new(541, 541), Interval::new(543, 543), Interval::new(547, 547), Interval::new(549, 549), Interval::new(551, 551), Interval::new(553, 553), Interval::new(555, 555), Interval::new(557, 557), Interval::new(559, 559), Interval::new(561, 561), Interval::new(563, 563), Interval::new(572, 572), Interval::new(575, 576), Interval::new(578, 578), Interval::new(583, 583), Interval::new(585, 585), Interval::new(587, 587), Interval::new(589, 589), Interval::new(591, 596), Interval::new(598, 599), Interval::new(601, 601), Interval::new(603, 604), Interval::new(608, 609), Interval::new(611, 611), Interval::new(613, 614), Interval::new(616, 620), Interval::new(623, 623), Interval::new(625, 626), Interval::new(629, 629), Interval::new(637, 637), Interval::new(640, 640), Interval::new(642, 643), Interval::new(647, 652), Interval::new(658, 658), Interval::new(669, 670), Interval::new(837, 837), Interval::new(881, 881), Interval::new(883, 883), Interval::new(887, 887), Interval::new(891, 893), Interval::new(912, 912), Interval::new(940, 974), Interval::new(976, 977), Interval::new(981, 983), Interval::new(985, 985), Interval::new(987, 987), Interval::new(989, 989), Interval::new(991, 991), Interval::new(993, 993), Interval::new(995, 995), Interval::new(997, 997), Interval::new(999, 999), Interval::new(1001, 1001), Interval::new(1003, 1003), Interval::new(1005, 1005), Interval::new(1007, 1011), Interval::new(1013, 1013), Interval::new(1016, 1016), Interval::new(1019, 1019), Interval::new(1072, 1119), Interval::new(1121, 1121), Interval::new(1123, 1123), Interval::new(1125, 1125), Interval::new(1127, 1127), Interval::new(1129, 1129), Interval::new(1131, 1131), Interval::new(1133, 1133), Interval::new(1135, 1135), Interval::new(1137, 1137), Interval::new(1139, 1139), Interval::new(1141, 1141), Interval::new(1143, 1143), Interval::new(1145, 1145), Interval::new(1147, 1147), Interval::new(1149, 1149), Interval::new(1151, 1151), Interval::new(1153, 1153), Interval::new(1163, 1163), Interval::new(1165, 1165), Interval::new(1167, 1167), Interval::new(1169, 1169), Interval::new(1171, 1171), Interval::new(1173, 1173), Interval::new(1175, 1175), Interval::new(1177, 1177), Interval::new(1179, 1179), Interval::new(1181, 1181), Interval::new(1183, 1183), Interval::new(1185, 1185), Interval::new(1187, 1187), Interval::new(1189, 1189), Interval::new(1191, 1191), Interval::new(1193, 1193), Interval::new(1195, 1195), Interval::new(1197, 1197), Interval::new(1199, 1199), Interval::new(1201, 1201), Interval::new(1203, 1203), Interval::new(1205, 1205), Interval::new(1207, 1207), Interval::new(1209, 1209), Interval::new(1211, 1211), Interval::new(1213, 1213), Interval::new(1215, 1215), Interval::new(1218, 1218), Interval::new(1220, 1220), Interval::new(1222, 1222), Interval::new(1224, 1224), Interval::new(1226, 1226), Interval::new(1228, 1228), Interval::new(1230, 1231), Interval::new(1233, 1233), Interval::new(1235, 1235), Interval::new(1237, 1237), Interval::new(1239, 1239), Interval::new(1241, 1241), Interval::new(1243, 1243), Interval::new(1245, 1245), Interval::new(1247, 1247), Interval::new(1249, 1249), Interval::new(1251, 1251), Interval::new(1253, 1253), Interval::new(1255, 1255), Interval::new(1257, 1257), Interval::new(1259, 1259), Interval::new(1261, 1261), Interval::new(1263, 1263), Interval::new(1265, 1265), Interval::new(1267, 1267), Interval::new(1269, 1269), Interval::new(1271, 1271), Interval::new(1273, 1273), Interval::new(1275, 1275), Interval::new(1277, 1277), Interval::new(1279, 1279), Interval::new(1281, 1281), Interval::new(1283, 1283), Interval::new(1285, 1285), Interval::new(1287, 1287), Interval::new(1289, 1289), Interval::new(1291, 1291), Interval::new(1293, 1293), Interval::new(1295, 1295), Interval::new(1297, 1297), Interval::new(1299, 1299), Interval::new(1301, 1301), Interval::new(1303, 1303), Interval::new(1305, 1305), Interval::new(1307, 1307), Interval::new(1309, 1309), Interval::new(1311, 1311), Interval::new(1313, 1313), Interval::new(1315, 1315), Interval::new(1317, 1317), Interval::new(1319, 1319), Interval::new(1321, 1321), Interval::new(1323, 1323), Interval::new(1325, 1325), Interval::new(1327, 1327), Interval::new(1377, 1415), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7545, 7545), Interval::new(7549, 7549), Interval::new(7566, 7566), Interval::new(7681, 7681), Interval::new(7683, 7683), Interval::new(7685, 7685), Interval::new(7687, 7687), Interval::new(7689, 7689), Interval::new(7691, 7691), Interval::new(7693, 7693), Interval::new(7695, 7695), Interval::new(7697, 7697), Interval::new(7699, 7699), Interval::new(7701, 7701), Interval::new(7703, 7703), Interval::new(7705, 7705), Interval::new(7707, 7707), Interval::new(7709, 7709), Interval::new(7711, 7711), Interval::new(7713, 7713), Interval::new(7715, 7715), Interval::new(7717, 7717), Interval::new(7719, 7719), Interval::new(7721, 7721), Interval::new(7723, 7723), Interval::new(7725, 7725), Interval::new(7727, 7727), Interval::new(7729, 7729), Interval::new(7731, 7731), Interval::new(7733, 7733), Interval::new(7735, 7735), Interval::new(7737, 7737), Interval::new(7739, 7739), Interval::new(7741, 7741), Interval::new(7743, 7743), Interval::new(7745, 7745), Interval::new(7747, 7747), Interval::new(7749, 7749), Interval::new(7751, 7751), Interval::new(7753, 7753), Interval::new(7755, 7755), Interval::new(7757, 7757), Interval::new(7759, 7759), Interval::new(7761, 7761), Interval::new(7763, 7763), Interval::new(7765, 7765), Interval::new(7767, 7767), Interval::new(7769, 7769), Interval::new(7771, 7771), Interval::new(7773, 7773), Interval::new(7775, 7775), Interval::new(7777, 7777), Interval::new(7779, 7779), Interval::new(7781, 7781), Interval::new(7783, 7783), Interval::new(7785, 7785), Interval::new(7787, 7787), Interval::new(7789, 7789), Interval::new(7791, 7791), Interval::new(7793, 7793), Interval::new(7795, 7795), Interval::new(7797, 7797), Interval::new(7799, 7799), Interval::new(7801, 7801), Interval::new(7803, 7803), Interval::new(7805, 7805), Interval::new(7807, 7807), Interval::new(7809, 7809), Interval::new(7811, 7811), Interval::new(7813, 7813), Interval::new(7815, 7815), Interval::new(7817, 7817), Interval::new(7819, 7819), Interval::new(7821, 7821), Interval::new(7823, 7823), Interval::new(7825, 7825), Interval::new(7827, 7827), Interval::new(7829, 7835), Interval::new(7841, 7841), Interval::new(7843, 7843), Interval::new(7845, 7845), Interval::new(7847, 7847), Interval::new(7849, 7849), Interval::new(7851, 7851), Interval::new(7853, 7853), Interval::new(7855, 7855), Interval::new(7857, 7857), Interval::new(7859, 7859), Interval::new(7861, 7861), Interval::new(7863, 7863), Interval::new(7865, 7865), Interval::new(7867, 7867), Interval::new(7869, 7869), Interval::new(7871, 7871), Interval::new(7873, 7873), Interval::new(7875, 7875), Interval::new(7877, 7877), Interval::new(7879, 7879), Interval::new(7881, 7881), Interval::new(7883, 7883), Interval::new(7885, 7885), Interval::new(7887, 7887), Interval::new(7889, 7889), Interval::new(7891, 7891), Interval::new(7893, 7893), Interval::new(7895, 7895), Interval::new(7897, 7897), Interval::new(7899, 7899), Interval::new(7901, 7901), Interval::new(7903, 7903), Interval::new(7905, 7905), Interval::new(7907, 7907), Interval::new(7909, 7909), Interval::new(7911, 7911), Interval::new(7913, 7913), Interval::new(7915, 7915), Interval::new(7917, 7917), Interval::new(7919, 7919), Interval::new(7921, 7921), Interval::new(7923, 7923), Interval::new(7925, 7925), Interval::new(7927, 7927), Interval::new(7929, 7929), Interval::new(7931, 7931), Interval::new(7933, 7933), Interval::new(7935, 7943), Interval::new(7952, 7957), Interval::new(7968, 7975), Interval::new(7984, 7991), Interval::new(8000, 8005), Interval::new(8016, 8023), Interval::new(8032, 8039), Interval::new(8048, 8061), Interval::new(8064, 8071), Interval::new(8080, 8087), Interval::new(8096, 8103), Interval::new(8112, 8116), Interval::new(8118, 8119), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8135), Interval::new(8144, 8147), Interval::new(8150, 8151), Interval::new(8160, 8167), Interval::new(8178, 8180), Interval::new(8182, 8183), Interval::new(8526, 8526), Interval::new(8560, 8575), Interval::new(8580, 8580), Interval::new(9424, 9449), Interval::new(11312, 11359), Interval::new(11361, 11361), Interval::new(11365, 11366), Interval::new(11368, 11368), Interval::new(11370, 11370), Interval::new(11372, 11372), Interval::new(11379, 11379), Interval::new(11382, 11382), Interval::new(11393, 11393), Interval::new(11395, 11395), Interval::new(11397, 11397), Interval::new(11399, 11399), Interval::new(11401, 11401), Interval::new(11403, 11403), Interval::new(11405, 11405), Interval::new(11407, 11407), Interval::new(11409, 11409), Interval::new(11411, 11411), Interval::new(11413, 11413), Interval::new(11415, 11415), Interval::new(11417, 11417), Interval::new(11419, 11419), Interval::new(11421, 11421), Interval::new(11423, 11423), Interval::new(11425, 11425), Interval::new(11427, 11427), Interval::new(11429, 11429), Interval::new(11431, 11431), Interval::new(11433, 11433), Interval::new(11435, 11435), Interval::new(11437, 11437), Interval::new(11439, 11439), Interval::new(11441, 11441), Interval::new(11443, 11443), Interval::new(11445, 11445), Interval::new(11447, 11447), Interval::new(11449, 11449), Interval::new(11451, 11451), Interval::new(11453, 11453), Interval::new(11455, 11455), Interval::new(11457, 11457), Interval::new(11459, 11459), Interval::new(11461, 11461), Interval::new(11463, 11463), Interval::new(11465, 11465), Interval::new(11467, 11467), Interval::new(11469, 11469), Interval::new(11471, 11471), Interval::new(11473, 11473), Interval::new(11475, 11475), Interval::new(11477, 11477), Interval::new(11479, 11479), Interval::new(11481, 11481), Interval::new(11483, 11483), Interval::new(11485, 11485), Interval::new(11487, 11487), Interval::new(11489, 11489), Interval::new(11491, 11491), Interval::new(11500, 11500), Interval::new(11502, 11502), Interval::new(11507, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(42561, 42561), Interval::new(42563, 42563), Interval::new(42565, 42565), Interval::new(42567, 42567), Interval::new(42569, 42569), Interval::new(42571, 42571), Interval::new(42573, 42573), Interval::new(42575, 42575), Interval::new(42577, 42577), Interval::new(42579, 42579), Interval::new(42581, 42581), Interval::new(42583, 42583), Interval::new(42585, 42585), Interval::new(42587, 42587), Interval::new(42589, 42589), Interval::new(42591, 42591), Interval::new(42593, 42593), Interval::new(42595, 42595), Interval::new(42597, 42597), Interval::new(42599, 42599), Interval::new(42601, 42601), Interval::new(42603, 42603), Interval::new(42605, 42605), Interval::new(42625, 42625), Interval::new(42627, 42627), Interval::new(42629, 42629), Interval::new(42631, 42631), Interval::new(42633, 42633), Interval::new(42635, 42635), Interval::new(42637, 42637), Interval::new(42639, 42639), Interval::new(42641, 42641), Interval::new(42643, 42643), Interval::new(42645, 42645), Interval::new(42647, 42647), Interval::new(42649, 42649), Interval::new(42651, 42651), Interval::new(42787, 42787), Interval::new(42789, 42789), Interval::new(42791, 42791), Interval::new(42793, 42793), Interval::new(42795, 42795), Interval::new(42797, 42797), Interval::new(42799, 42799), Interval::new(42803, 42803), Interval::new(42805, 42805), Interval::new(42807, 42807), Interval::new(42809, 42809), Interval::new(42811, 42811), Interval::new(42813, 42813), Interval::new(42815, 42815), Interval::new(42817, 42817), Interval::new(42819, 42819), Interval::new(42821, 42821), Interval::new(42823, 42823), Interval::new(42825, 42825), Interval::new(42827, 42827), Interval::new(42829, 42829), Interval::new(42831, 42831), Interval::new(42833, 42833), Interval::new(42835, 42835), Interval::new(42837, 42837), Interval::new(42839, 42839), Interval::new(42841, 42841), Interval::new(42843, 42843), Interval::new(42845, 42845), Interval::new(42847, 42847), Interval::new(42849, 42849), Interval::new(42851, 42851), Interval::new(42853, 42853), Interval::new(42855, 42855), Interval::new(42857, 42857), Interval::new(42859, 42859), Interval::new(42861, 42861), Interval::new(42863, 42863), Interval::new(42874, 42874), Interval::new(42876, 42876), Interval::new(42879, 42879), Interval::new(42881, 42881), Interval::new(42883, 42883), Interval::new(42885, 42885), Interval::new(42887, 42887), Interval::new(42892, 42892), Interval::new(42897, 42897), Interval::new(42899, 42900), Interval::new(42903, 42903), Interval::new(42905, 42905), Interval::new(42907, 42907), Interval::new(42909, 42909), Interval::new(42911, 42911), Interval::new(42913, 42913), Interval::new(42915, 42915), Interval::new(42917, 42917), Interval::new(42919, 42919), Interval::new(42921, 42921), Interval::new(42933, 42933), Interval::new(42935, 42935), Interval::new(42937, 42937), Interval::new(42939, 42939), Interval::new(42941, 42941), Interval::new(42943, 42943), Interval::new(42945, 42945), Interval::new(42947, 42947), Interval::new(42952, 42952), Interval::new(42954, 42954), Interval::new(42961, 42961), Interval::new(42967, 42967), Interval::new(42969, 42969), Interval::new(42998, 42998), Interval::new(43859, 43859), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65345, 65370), Interval::new(66600, 66639), Interval::new(66776, 66811), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(68800, 68850), Interval::new(71872, 71903), Interval::new(93792, 93823), Interval::new(125218, 125251), ]; /// Return the code point ranges of the 'Changes_When_Titlecased' Unicode property. pub(crate) fn changes_when_titlecased_ranges() -> &'static [Interval] { &CHANGES_WHEN_TITLECASED } const CHANGES_WHEN_UPPERCASED: [Interval; 627] = [ Interval::new(97, 122), Interval::new(181, 181), Interval::new(223, 246), Interval::new(248, 255), Interval::new(257, 257), Interval::new(259, 259), Interval::new(261, 261), Interval::new(263, 263), Interval::new(265, 265), Interval::new(267, 267), Interval::new(269, 269), Interval::new(271, 271), Interval::new(273, 273), Interval::new(275, 275), Interval::new(277, 277), Interval::new(279, 279), Interval::new(281, 281), Interval::new(283, 283), Interval::new(285, 285), Interval::new(287, 287), Interval::new(289, 289), Interval::new(291, 291), Interval::new(293, 293), Interval::new(295, 295), Interval::new(297, 297), Interval::new(299, 299), Interval::new(301, 301), Interval::new(303, 303), Interval::new(305, 305), Interval::new(307, 307), Interval::new(309, 309), Interval::new(311, 311), Interval::new(314, 314), Interval::new(316, 316), Interval::new(318, 318), Interval::new(320, 320), Interval::new(322, 322), Interval::new(324, 324), Interval::new(326, 326), Interval::new(328, 329), Interval::new(331, 331), Interval::new(333, 333), Interval::new(335, 335), Interval::new(337, 337), Interval::new(339, 339), Interval::new(341, 341), Interval::new(343, 343), Interval::new(345, 345), Interval::new(347, 347), Interval::new(349, 349), Interval::new(351, 351), Interval::new(353, 353), Interval::new(355, 355), Interval::new(357, 357), Interval::new(359, 359), Interval::new(361, 361), Interval::new(363, 363), Interval::new(365, 365), Interval::new(367, 367), Interval::new(369, 369), Interval::new(371, 371), Interval::new(373, 373), Interval::new(375, 375), Interval::new(378, 378), Interval::new(380, 380), Interval::new(382, 384), Interval::new(387, 387), Interval::new(389, 389), Interval::new(392, 392), Interval::new(396, 396), Interval::new(402, 402), Interval::new(405, 405), Interval::new(409, 410), Interval::new(414, 414), Interval::new(417, 417), Interval::new(419, 419), Interval::new(421, 421), Interval::new(424, 424), Interval::new(429, 429), Interval::new(432, 432), Interval::new(436, 436), Interval::new(438, 438), Interval::new(441, 441), Interval::new(445, 445), Interval::new(447, 447), Interval::new(453, 454), Interval::new(456, 457), Interval::new(459, 460), Interval::new(462, 462), Interval::new(464, 464), Interval::new(466, 466), Interval::new(468, 468), Interval::new(470, 470), Interval::new(472, 472), Interval::new(474, 474), Interval::new(476, 477), Interval::new(479, 479), Interval::new(481, 481), Interval::new(483, 483), Interval::new(485, 485), Interval::new(487, 487), Interval::new(489, 489), Interval::new(491, 491), Interval::new(493, 493), Interval::new(495, 496), Interval::new(498, 499), Interval::new(501, 501), Interval::new(505, 505), Interval::new(507, 507), Interval::new(509, 509), Interval::new(511, 511), Interval::new(513, 513), Interval::new(515, 515), Interval::new(517, 517), Interval::new(519, 519), Interval::new(521, 521), Interval::new(523, 523), Interval::new(525, 525), Interval::new(527, 527), Interval::new(529, 529), Interval::new(531, 531), Interval::new(533, 533), Interval::new(535, 535), Interval::new(537, 537), Interval::new(539, 539), Interval::new(541, 541), Interval::new(543, 543), Interval::new(547, 547), Interval::new(549, 549), Interval::new(551, 551), Interval::new(553, 553), Interval::new(555, 555), Interval::new(557, 557), Interval::new(559, 559), Interval::new(561, 561), Interval::new(563, 563), Interval::new(572, 572), Interval::new(575, 576), Interval::new(578, 578), Interval::new(583, 583), Interval::new(585, 585), Interval::new(587, 587), Interval::new(589, 589), Interval::new(591, 596), Interval::new(598, 599), Interval::new(601, 601), Interval::new(603, 604), Interval::new(608, 609), Interval::new(611, 611), Interval::new(613, 614), Interval::new(616, 620), Interval::new(623, 623), Interval::new(625, 626), Interval::new(629, 629), Interval::new(637, 637), Interval::new(640, 640), Interval::new(642, 643), Interval::new(647, 652), Interval::new(658, 658), Interval::new(669, 670), Interval::new(837, 837), Interval::new(881, 881), Interval::new(883, 883), Interval::new(887, 887), Interval::new(891, 893), Interval::new(912, 912), Interval::new(940, 974), Interval::new(976, 977), Interval::new(981, 983), Interval::new(985, 985), Interval::new(987, 987), Interval::new(989, 989), Interval::new(991, 991), Interval::new(993, 993), Interval::new(995, 995), Interval::new(997, 997), Interval::new(999, 999), Interval::new(1001, 1001), Interval::new(1003, 1003), Interval::new(1005, 1005), Interval::new(1007, 1011), Interval::new(1013, 1013), Interval::new(1016, 1016), Interval::new(1019, 1019), Interval::new(1072, 1119), Interval::new(1121, 1121), Interval::new(1123, 1123), Interval::new(1125, 1125), Interval::new(1127, 1127), Interval::new(1129, 1129), Interval::new(1131, 1131), Interval::new(1133, 1133), Interval::new(1135, 1135), Interval::new(1137, 1137), Interval::new(1139, 1139), Interval::new(1141, 1141), Interval::new(1143, 1143), Interval::new(1145, 1145), Interval::new(1147, 1147), Interval::new(1149, 1149), Interval::new(1151, 1151), Interval::new(1153, 1153), Interval::new(1163, 1163), Interval::new(1165, 1165), Interval::new(1167, 1167), Interval::new(1169, 1169), Interval::new(1171, 1171), Interval::new(1173, 1173), Interval::new(1175, 1175), Interval::new(1177, 1177), Interval::new(1179, 1179), Interval::new(1181, 1181), Interval::new(1183, 1183), Interval::new(1185, 1185), Interval::new(1187, 1187), Interval::new(1189, 1189), Interval::new(1191, 1191), Interval::new(1193, 1193), Interval::new(1195, 1195), Interval::new(1197, 1197), Interval::new(1199, 1199), Interval::new(1201, 1201), Interval::new(1203, 1203), Interval::new(1205, 1205), Interval::new(1207, 1207), Interval::new(1209, 1209), Interval::new(1211, 1211), Interval::new(1213, 1213), Interval::new(1215, 1215), Interval::new(1218, 1218), Interval::new(1220, 1220), Interval::new(1222, 1222), Interval::new(1224, 1224), Interval::new(1226, 1226), Interval::new(1228, 1228), Interval::new(1230, 1231), Interval::new(1233, 1233), Interval::new(1235, 1235), Interval::new(1237, 1237), Interval::new(1239, 1239), Interval::new(1241, 1241), Interval::new(1243, 1243), Interval::new(1245, 1245), Interval::new(1247, 1247), Interval::new(1249, 1249), Interval::new(1251, 1251), Interval::new(1253, 1253), Interval::new(1255, 1255), Interval::new(1257, 1257), Interval::new(1259, 1259), Interval::new(1261, 1261), Interval::new(1263, 1263), Interval::new(1265, 1265), Interval::new(1267, 1267), Interval::new(1269, 1269), Interval::new(1271, 1271), Interval::new(1273, 1273), Interval::new(1275, 1275), Interval::new(1277, 1277), Interval::new(1279, 1279), Interval::new(1281, 1281), Interval::new(1283, 1283), Interval::new(1285, 1285), Interval::new(1287, 1287), Interval::new(1289, 1289), Interval::new(1291, 1291), Interval::new(1293, 1293), Interval::new(1295, 1295), Interval::new(1297, 1297), Interval::new(1299, 1299), Interval::new(1301, 1301), Interval::new(1303, 1303), Interval::new(1305, 1305), Interval::new(1307, 1307), Interval::new(1309, 1309), Interval::new(1311, 1311), Interval::new(1313, 1313), Interval::new(1315, 1315), Interval::new(1317, 1317), Interval::new(1319, 1319), Interval::new(1321, 1321), Interval::new(1323, 1323), Interval::new(1325, 1325), Interval::new(1327, 1327), Interval::new(1377, 1415), Interval::new(4304, 4346), Interval::new(4349, 4351), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7545, 7545), Interval::new(7549, 7549), Interval::new(7566, 7566), Interval::new(7681, 7681), Interval::new(7683, 7683), Interval::new(7685, 7685), Interval::new(7687, 7687), Interval::new(7689, 7689), Interval::new(7691, 7691), Interval::new(7693, 7693), Interval::new(7695, 7695), Interval::new(7697, 7697), Interval::new(7699, 7699), Interval::new(7701, 7701), Interval::new(7703, 7703), Interval::new(7705, 7705), Interval::new(7707, 7707), Interval::new(7709, 7709), Interval::new(7711, 7711), Interval::new(7713, 7713), Interval::new(7715, 7715), Interval::new(7717, 7717), Interval::new(7719, 7719), Interval::new(7721, 7721), Interval::new(7723, 7723), Interval::new(7725, 7725), Interval::new(7727, 7727), Interval::new(7729, 7729), Interval::new(7731, 7731), Interval::new(7733, 7733), Interval::new(7735, 7735), Interval::new(7737, 7737), Interval::new(7739, 7739), Interval::new(7741, 7741), Interval::new(7743, 7743), Interval::new(7745, 7745), Interval::new(7747, 7747), Interval::new(7749, 7749), Interval::new(7751, 7751), Interval::new(7753, 7753), Interval::new(7755, 7755), Interval::new(7757, 7757), Interval::new(7759, 7759), Interval::new(7761, 7761), Interval::new(7763, 7763), Interval::new(7765, 7765), Interval::new(7767, 7767), Interval::new(7769, 7769), Interval::new(7771, 7771), Interval::new(7773, 7773), Interval::new(7775, 7775), Interval::new(7777, 7777), Interval::new(7779, 7779), Interval::new(7781, 7781), Interval::new(7783, 7783), Interval::new(7785, 7785), Interval::new(7787, 7787), Interval::new(7789, 7789), Interval::new(7791, 7791), Interval::new(7793, 7793), Interval::new(7795, 7795), Interval::new(7797, 7797), Interval::new(7799, 7799), Interval::new(7801, 7801), Interval::new(7803, 7803), Interval::new(7805, 7805), Interval::new(7807, 7807), Interval::new(7809, 7809), Interval::new(7811, 7811), Interval::new(7813, 7813), Interval::new(7815, 7815), Interval::new(7817, 7817), Interval::new(7819, 7819), Interval::new(7821, 7821), Interval::new(7823, 7823), Interval::new(7825, 7825), Interval::new(7827, 7827), Interval::new(7829, 7835), Interval::new(7841, 7841), Interval::new(7843, 7843), Interval::new(7845, 7845), Interval::new(7847, 7847), Interval::new(7849, 7849), Interval::new(7851, 7851), Interval::new(7853, 7853), Interval::new(7855, 7855), Interval::new(7857, 7857), Interval::new(7859, 7859), Interval::new(7861, 7861), Interval::new(7863, 7863), Interval::new(7865, 7865), Interval::new(7867, 7867), Interval::new(7869, 7869), Interval::new(7871, 7871), Interval::new(7873, 7873), Interval::new(7875, 7875), Interval::new(7877, 7877), Interval::new(7879, 7879), Interval::new(7881, 7881), Interval::new(7883, 7883), Interval::new(7885, 7885), Interval::new(7887, 7887), Interval::new(7889, 7889), Interval::new(7891, 7891), Interval::new(7893, 7893), Interval::new(7895, 7895), Interval::new(7897, 7897), Interval::new(7899, 7899), Interval::new(7901, 7901), Interval::new(7903, 7903), Interval::new(7905, 7905), Interval::new(7907, 7907), Interval::new(7909, 7909), Interval::new(7911, 7911), Interval::new(7913, 7913), Interval::new(7915, 7915), Interval::new(7917, 7917), Interval::new(7919, 7919), Interval::new(7921, 7921), Interval::new(7923, 7923), Interval::new(7925, 7925), Interval::new(7927, 7927), Interval::new(7929, 7929), Interval::new(7931, 7931), Interval::new(7933, 7933), Interval::new(7935, 7943), Interval::new(7952, 7957), Interval::new(7968, 7975), Interval::new(7984, 7991), Interval::new(8000, 8005), Interval::new(8016, 8023), Interval::new(8032, 8039), Interval::new(8048, 8061), Interval::new(8064, 8116), Interval::new(8118, 8119), Interval::new(8124, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8135), Interval::new(8140, 8140), Interval::new(8144, 8147), Interval::new(8150, 8151), Interval::new(8160, 8167), Interval::new(8178, 8180), Interval::new(8182, 8183), Interval::new(8188, 8188), Interval::new(8526, 8526), Interval::new(8560, 8575), Interval::new(8580, 8580), Interval::new(9424, 9449), Interval::new(11312, 11359), Interval::new(11361, 11361), Interval::new(11365, 11366), Interval::new(11368, 11368), Interval::new(11370, 11370), Interval::new(11372, 11372), Interval::new(11379, 11379), Interval::new(11382, 11382), Interval::new(11393, 11393), Interval::new(11395, 11395), Interval::new(11397, 11397), Interval::new(11399, 11399), Interval::new(11401, 11401), Interval::new(11403, 11403), Interval::new(11405, 11405), Interval::new(11407, 11407), Interval::new(11409, 11409), Interval::new(11411, 11411), Interval::new(11413, 11413), Interval::new(11415, 11415), Interval::new(11417, 11417), Interval::new(11419, 11419), Interval::new(11421, 11421), Interval::new(11423, 11423), Interval::new(11425, 11425), Interval::new(11427, 11427), Interval::new(11429, 11429), Interval::new(11431, 11431), Interval::new(11433, 11433), Interval::new(11435, 11435), Interval::new(11437, 11437), Interval::new(11439, 11439), Interval::new(11441, 11441), Interval::new(11443, 11443), Interval::new(11445, 11445), Interval::new(11447, 11447), Interval::new(11449, 11449), Interval::new(11451, 11451), Interval::new(11453, 11453), Interval::new(11455, 11455), Interval::new(11457, 11457), Interval::new(11459, 11459), Interval::new(11461, 11461), Interval::new(11463, 11463), Interval::new(11465, 11465), Interval::new(11467, 11467), Interval::new(11469, 11469), Interval::new(11471, 11471), Interval::new(11473, 11473), Interval::new(11475, 11475), Interval::new(11477, 11477), Interval::new(11479, 11479), Interval::new(11481, 11481), Interval::new(11483, 11483), Interval::new(11485, 11485), Interval::new(11487, 11487), Interval::new(11489, 11489), Interval::new(11491, 11491), Interval::new(11500, 11500), Interval::new(11502, 11502), Interval::new(11507, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(42561, 42561), Interval::new(42563, 42563), Interval::new(42565, 42565), Interval::new(42567, 42567), Interval::new(42569, 42569), Interval::new(42571, 42571), Interval::new(42573, 42573), Interval::new(42575, 42575), Interval::new(42577, 42577), Interval::new(42579, 42579), Interval::new(42581, 42581), Interval::new(42583, 42583), Interval::new(42585, 42585), Interval::new(42587, 42587), Interval::new(42589, 42589), Interval::new(42591, 42591), Interval::new(42593, 42593), Interval::new(42595, 42595), Interval::new(42597, 42597), Interval::new(42599, 42599), Interval::new(42601, 42601), Interval::new(42603, 42603), Interval::new(42605, 42605), Interval::new(42625, 42625), Interval::new(42627, 42627), Interval::new(42629, 42629), Interval::new(42631, 42631), Interval::new(42633, 42633), Interval::new(42635, 42635), Interval::new(42637, 42637), Interval::new(42639, 42639), Interval::new(42641, 42641), Interval::new(42643, 42643), Interval::new(42645, 42645), Interval::new(42647, 42647), Interval::new(42649, 42649), Interval::new(42651, 42651), Interval::new(42787, 42787), Interval::new(42789, 42789), Interval::new(42791, 42791), Interval::new(42793, 42793), Interval::new(42795, 42795), Interval::new(42797, 42797), Interval::new(42799, 42799), Interval::new(42803, 42803), Interval::new(42805, 42805), Interval::new(42807, 42807), Interval::new(42809, 42809), Interval::new(42811, 42811), Interval::new(42813, 42813), Interval::new(42815, 42815), Interval::new(42817, 42817), Interval::new(42819, 42819), Interval::new(42821, 42821), Interval::new(42823, 42823), Interval::new(42825, 42825), Interval::new(42827, 42827), Interval::new(42829, 42829), Interval::new(42831, 42831), Interval::new(42833, 42833), Interval::new(42835, 42835), Interval::new(42837, 42837), Interval::new(42839, 42839), Interval::new(42841, 42841), Interval::new(42843, 42843), Interval::new(42845, 42845), Interval::new(42847, 42847), Interval::new(42849, 42849), Interval::new(42851, 42851), Interval::new(42853, 42853), Interval::new(42855, 42855), Interval::new(42857, 42857), Interval::new(42859, 42859), Interval::new(42861, 42861), Interval::new(42863, 42863), Interval::new(42874, 42874), Interval::new(42876, 42876), Interval::new(42879, 42879), Interval::new(42881, 42881), Interval::new(42883, 42883), Interval::new(42885, 42885), Interval::new(42887, 42887), Interval::new(42892, 42892), Interval::new(42897, 42897), Interval::new(42899, 42900), Interval::new(42903, 42903), Interval::new(42905, 42905), Interval::new(42907, 42907), Interval::new(42909, 42909), Interval::new(42911, 42911), Interval::new(42913, 42913), Interval::new(42915, 42915), Interval::new(42917, 42917), Interval::new(42919, 42919), Interval::new(42921, 42921), Interval::new(42933, 42933), Interval::new(42935, 42935), Interval::new(42937, 42937), Interval::new(42939, 42939), Interval::new(42941, 42941), Interval::new(42943, 42943), Interval::new(42945, 42945), Interval::new(42947, 42947), Interval::new(42952, 42952), Interval::new(42954, 42954), Interval::new(42961, 42961), Interval::new(42967, 42967), Interval::new(42969, 42969), Interval::new(42998, 42998), Interval::new(43859, 43859), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65345, 65370), Interval::new(66600, 66639), Interval::new(66776, 66811), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(68800, 68850), Interval::new(71872, 71903), Interval::new(93792, 93823), Interval::new(125218, 125251), ]; /// Return the code point ranges of the 'Changes_When_Uppercased' Unicode property. pub(crate) fn changes_when_uppercased_ranges() -> &'static [Interval] { &CHANGES_WHEN_UPPERCASED } const DEFAULT_IGNORABLE_CODE_POINT: [Interval; 17] = [ Interval::new(173, 173), Interval::new(847, 847), Interval::new(1564, 1564), Interval::new(4447, 4448), Interval::new(6068, 6069), Interval::new(6155, 6159), Interval::new(8203, 8207), Interval::new(8234, 8238), Interval::new(8288, 8303), Interval::new(12644, 12644), Interval::new(65024, 65039), Interval::new(65279, 65279), Interval::new(65440, 65440), Interval::new(65520, 65528), Interval::new(113824, 113827), Interval::new(119155, 119162), Interval::new(917504, 921599), ]; /// Return the code point ranges of the 'Default_Ignorable_Code_Point' Unicode property. pub(crate) fn default_ignorable_code_point_ranges() -> &'static [Interval] { &DEFAULT_IGNORABLE_CODE_POINT } const GRAPHEME_BASE: [Interval; 875] = [ Interval::new(32, 126), Interval::new(160, 172), Interval::new(174, 767), Interval::new(880, 887), Interval::new(890, 895), Interval::new(900, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1154), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1369, 1418), Interval::new(1421, 1423), Interval::new(1470, 1470), Interval::new(1472, 1472), Interval::new(1475, 1475), Interval::new(1478, 1478), Interval::new(1488, 1514), Interval::new(1519, 1524), Interval::new(1542, 1551), Interval::new(1563, 1563), Interval::new(1565, 1610), Interval::new(1632, 1647), Interval::new(1649, 1749), Interval::new(1758, 1758), Interval::new(1765, 1766), Interval::new(1769, 1769), Interval::new(1774, 1805), Interval::new(1808, 1808), Interval::new(1810, 1839), Interval::new(1869, 1957), Interval::new(1969, 1969), Interval::new(1984, 2026), Interval::new(2036, 2042), Interval::new(2046, 2069), Interval::new(2074, 2074), Interval::new(2084, 2084), Interval::new(2088, 2088), Interval::new(2096, 2110), Interval::new(2112, 2136), Interval::new(2142, 2142), Interval::new(2144, 2154), Interval::new(2160, 2190), Interval::new(2208, 2249), Interval::new(2307, 2361), Interval::new(2363, 2363), Interval::new(2365, 2368), Interval::new(2377, 2380), Interval::new(2382, 2384), Interval::new(2392, 2401), Interval::new(2404, 2432), Interval::new(2434, 2435), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2493, 2493), Interval::new(2495, 2496), Interval::new(2503, 2504), Interval::new(2507, 2508), Interval::new(2510, 2510), Interval::new(2524, 2525), Interval::new(2527, 2529), Interval::new(2534, 2557), Interval::new(2563, 2563), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2622, 2624), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2662, 2671), Interval::new(2674, 2676), Interval::new(2678, 2678), Interval::new(2691, 2691), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2749, 2752), Interval::new(2761, 2761), Interval::new(2763, 2764), Interval::new(2768, 2768), Interval::new(2784, 2785), Interval::new(2790, 2801), Interval::new(2809, 2809), Interval::new(2818, 2819), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2877, 2877), Interval::new(2880, 2880), Interval::new(2887, 2888), Interval::new(2891, 2892), Interval::new(2908, 2909), Interval::new(2911, 2913), Interval::new(2918, 2935), Interval::new(2947, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3007, 3007), Interval::new(3009, 3010), Interval::new(3014, 3016), Interval::new(3018, 3020), Interval::new(3024, 3024), Interval::new(3046, 3066), Interval::new(3073, 3075), Interval::new(3077, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3133, 3133), Interval::new(3137, 3140), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3169), Interval::new(3174, 3183), Interval::new(3191, 3200), Interval::new(3202, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3261, 3262), Interval::new(3264, 3265), Interval::new(3267, 3268), Interval::new(3271, 3272), Interval::new(3274, 3275), Interval::new(3293, 3294), Interval::new(3296, 3297), Interval::new(3302, 3311), Interval::new(3313, 3315), Interval::new(3330, 3340), Interval::new(3342, 3344), Interval::new(3346, 3386), Interval::new(3389, 3389), Interval::new(3391, 3392), Interval::new(3398, 3400), Interval::new(3402, 3404), Interval::new(3406, 3407), Interval::new(3412, 3414), Interval::new(3416, 3425), Interval::new(3430, 3455), Interval::new(3458, 3459), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3536, 3537), Interval::new(3544, 3550), Interval::new(3558, 3567), Interval::new(3570, 3572), Interval::new(3585, 3632), Interval::new(3634, 3635), Interval::new(3647, 3654), Interval::new(3663, 3675), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3760), Interval::new(3762, 3763), Interval::new(3773, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3792, 3801), Interval::new(3804, 3807), Interval::new(3840, 3863), Interval::new(3866, 3892), Interval::new(3894, 3894), Interval::new(3896, 3896), Interval::new(3898, 3911), Interval::new(3913, 3948), Interval::new(3967, 3967), Interval::new(3973, 3973), Interval::new(3976, 3980), Interval::new(4030, 4037), Interval::new(4039, 4044), Interval::new(4046, 4058), Interval::new(4096, 4140), Interval::new(4145, 4145), Interval::new(4152, 4152), Interval::new(4155, 4156), Interval::new(4159, 4183), Interval::new(4186, 4189), Interval::new(4193, 4208), Interval::new(4213, 4225), Interval::new(4227, 4228), Interval::new(4231, 4236), Interval::new(4238, 4252), Interval::new(4254, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4960, 4988), Interval::new(4992, 5017), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5120, 5788), Interval::new(5792, 5880), Interval::new(5888, 5905), Interval::new(5909, 5909), Interval::new(5919, 5937), Interval::new(5940, 5942), Interval::new(5952, 5969), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6016, 6067), Interval::new(6070, 6070), Interval::new(6078, 6085), Interval::new(6087, 6088), Interval::new(6100, 6108), Interval::new(6112, 6121), Interval::new(6128, 6137), Interval::new(6144, 6154), Interval::new(6160, 6169), Interval::new(6176, 6264), Interval::new(6272, 6276), Interval::new(6279, 6312), Interval::new(6314, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6435, 6438), Interval::new(6441, 6443), Interval::new(6448, 6449), Interval::new(6451, 6456), Interval::new(6464, 6464), Interval::new(6468, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6608, 6618), Interval::new(6622, 6678), Interval::new(6681, 6682), Interval::new(6686, 6741), Interval::new(6743, 6743), Interval::new(6753, 6753), Interval::new(6755, 6756), Interval::new(6765, 6770), Interval::new(6784, 6793), Interval::new(6800, 6809), Interval::new(6816, 6829), Interval::new(6916, 6963), Interval::new(6971, 6971), Interval::new(6973, 6977), Interval::new(6979, 6988), Interval::new(6992, 7018), Interval::new(7028, 7038), Interval::new(7042, 7073), Interval::new(7078, 7079), Interval::new(7082, 7082), Interval::new(7086, 7141), Interval::new(7143, 7143), Interval::new(7146, 7148), Interval::new(7150, 7150), Interval::new(7154, 7155), Interval::new(7164, 7211), Interval::new(7220, 7221), Interval::new(7227, 7241), Interval::new(7245, 7304), Interval::new(7312, 7354), Interval::new(7357, 7367), Interval::new(7379, 7379), Interval::new(7393, 7393), Interval::new(7401, 7404), Interval::new(7406, 7411), Interval::new(7413, 7415), Interval::new(7418, 7418), Interval::new(7424, 7615), Interval::new(7680, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8132), Interval::new(8134, 8147), Interval::new(8150, 8155), Interval::new(8157, 8175), Interval::new(8178, 8180), Interval::new(8182, 8190), Interval::new(8192, 8202), Interval::new(8208, 8231), Interval::new(8239, 8287), Interval::new(8304, 8305), Interval::new(8308, 8334), Interval::new(8336, 8348), Interval::new(8352, 8384), Interval::new(8448, 8587), Interval::new(8592, 9254), Interval::new(9280, 9290), Interval::new(9312, 11123), Interval::new(11126, 11157), Interval::new(11159, 11502), Interval::new(11506, 11507), Interval::new(11513, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11632), Interval::new(11648, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(11776, 11869), Interval::new(11904, 11929), Interval::new(11931, 12019), Interval::new(12032, 12245), Interval::new(12272, 12329), Interval::new(12336, 12351), Interval::new(12353, 12438), Interval::new(12443, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12688, 12771), Interval::new(12783, 12830), Interval::new(12832, 42124), Interval::new(42128, 42182), Interval::new(42192, 42539), Interval::new(42560, 42606), Interval::new(42611, 42611), Interval::new(42622, 42653), Interval::new(42656, 42735), Interval::new(42738, 42743), Interval::new(42752, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43009), Interval::new(43011, 43013), Interval::new(43015, 43018), Interval::new(43020, 43044), Interval::new(43047, 43051), Interval::new(43056, 43065), Interval::new(43072, 43127), Interval::new(43136, 43203), Interval::new(43214, 43225), Interval::new(43250, 43262), Interval::new(43264, 43301), Interval::new(43310, 43334), Interval::new(43346, 43347), Interval::new(43359, 43388), Interval::new(43395, 43442), Interval::new(43444, 43445), Interval::new(43450, 43451), Interval::new(43454, 43469), Interval::new(43471, 43481), Interval::new(43486, 43492), Interval::new(43494, 43518), Interval::new(43520, 43560), Interval::new(43567, 43568), Interval::new(43571, 43572), Interval::new(43584, 43586), Interval::new(43588, 43595), Interval::new(43597, 43597), Interval::new(43600, 43609), Interval::new(43612, 43643), Interval::new(43645, 43695), Interval::new(43697, 43697), Interval::new(43701, 43702), Interval::new(43705, 43709), Interval::new(43712, 43712), Interval::new(43714, 43714), Interval::new(43739, 43755), Interval::new(43758, 43765), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43883), Interval::new(43888, 44004), Interval::new(44006, 44007), Interval::new(44009, 44012), Interval::new(44016, 44025), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64285), Interval::new(64287, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64450), Interval::new(64467, 64911), Interval::new(64914, 64967), Interval::new(64975, 64975), Interval::new(65008, 65023), Interval::new(65040, 65049), Interval::new(65072, 65106), Interval::new(65108, 65126), Interval::new(65128, 65131), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(65281, 65437), Interval::new(65440, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65504, 65510), Interval::new(65512, 65518), Interval::new(65532, 65533), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65792, 65794), Interval::new(65799, 65843), Interval::new(65847, 65934), Interval::new(65936, 65948), Interval::new(65952, 65952), Interval::new(66000, 66044), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66273, 66299), Interval::new(66304, 66339), Interval::new(66349, 66378), Interval::new(66384, 66421), Interval::new(66432, 66461), Interval::new(66463, 66499), Interval::new(66504, 66517), Interval::new(66560, 66717), Interval::new(66720, 66729), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66927, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67671, 67742), Interval::new(67751, 67759), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67835, 67867), Interval::new(67871, 67897), Interval::new(67903, 67903), Interval::new(67968, 68023), Interval::new(68028, 68047), Interval::new(68050, 68096), Interval::new(68112, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68160, 68168), Interval::new(68176, 68184), Interval::new(68192, 68255), Interval::new(68288, 68324), Interval::new(68331, 68342), Interval::new(68352, 68405), Interval::new(68409, 68437), Interval::new(68440, 68466), Interval::new(68472, 68497), Interval::new(68505, 68508), Interval::new(68521, 68527), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68858, 68899), Interval::new(68912, 68921), Interval::new(69216, 69246), Interval::new(69248, 69289), Interval::new(69293, 69293), Interval::new(69296, 69297), Interval::new(69376, 69415), Interval::new(69424, 69445), Interval::new(69457, 69465), Interval::new(69488, 69505), Interval::new(69510, 69513), Interval::new(69552, 69579), Interval::new(69600, 69622), Interval::new(69632, 69632), Interval::new(69634, 69687), Interval::new(69703, 69709), Interval::new(69714, 69743), Interval::new(69745, 69746), Interval::new(69749, 69749), Interval::new(69762, 69810), Interval::new(69815, 69816), Interval::new(69819, 69820), Interval::new(69822, 69825), Interval::new(69840, 69864), Interval::new(69872, 69881), Interval::new(69891, 69926), Interval::new(69932, 69932), Interval::new(69942, 69959), Interval::new(69968, 70002), Interval::new(70004, 70006), Interval::new(70018, 70069), Interval::new(70079, 70088), Interval::new(70093, 70094), Interval::new(70096, 70111), Interval::new(70113, 70132), Interval::new(70144, 70161), Interval::new(70163, 70190), Interval::new(70194, 70195), Interval::new(70197, 70197), Interval::new(70200, 70205), Interval::new(70207, 70208), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70313), Interval::new(70320, 70366), Interval::new(70368, 70370), Interval::new(70384, 70393), Interval::new(70402, 70403), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70461, 70461), Interval::new(70463, 70463), Interval::new(70465, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70480, 70480), Interval::new(70493, 70499), Interval::new(70656, 70711), Interval::new(70720, 70721), Interval::new(70725, 70725), Interval::new(70727, 70747), Interval::new(70749, 70749), Interval::new(70751, 70753), Interval::new(70784, 70831), Interval::new(70833, 70834), Interval::new(70841, 70841), Interval::new(70843, 70844), Interval::new(70846, 70846), Interval::new(70849, 70849), Interval::new(70852, 70855), Interval::new(70864, 70873), Interval::new(71040, 71086), Interval::new(71088, 71089), Interval::new(71096, 71099), Interval::new(71102, 71102), Interval::new(71105, 71131), Interval::new(71168, 71218), Interval::new(71227, 71228), Interval::new(71230, 71230), Interval::new(71233, 71236), Interval::new(71248, 71257), Interval::new(71264, 71276), Interval::new(71296, 71338), Interval::new(71340, 71340), Interval::new(71342, 71343), Interval::new(71350, 71350), Interval::new(71352, 71353), Interval::new(71360, 71369), Interval::new(71424, 71450), Interval::new(71456, 71457), Interval::new(71462, 71462), Interval::new(71472, 71494), Interval::new(71680, 71726), Interval::new(71736, 71736), Interval::new(71739, 71739), Interval::new(71840, 71922), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71983), Interval::new(71985, 71989), Interval::new(71991, 71992), Interval::new(71997, 71997), Interval::new(71999, 72002), Interval::new(72004, 72006), Interval::new(72016, 72025), Interval::new(72096, 72103), Interval::new(72106, 72147), Interval::new(72156, 72159), Interval::new(72161, 72164), Interval::new(72192, 72192), Interval::new(72203, 72242), Interval::new(72249, 72250), Interval::new(72255, 72262), Interval::new(72272, 72272), Interval::new(72279, 72280), Interval::new(72284, 72329), Interval::new(72343, 72343), Interval::new(72346, 72354), Interval::new(72368, 72440), Interval::new(72448, 72457), Interval::new(72704, 72712), Interval::new(72714, 72751), Interval::new(72766, 72766), Interval::new(72768, 72773), Interval::new(72784, 72812), Interval::new(72816, 72847), Interval::new(72873, 72873), Interval::new(72881, 72881), Interval::new(72884, 72884), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73008), Interval::new(73030, 73030), Interval::new(73040, 73049), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73102), Interval::new(73107, 73108), Interval::new(73110, 73110), Interval::new(73112, 73112), Interval::new(73120, 73129), Interval::new(73440, 73458), Interval::new(73461, 73464), Interval::new(73474, 73488), Interval::new(73490, 73525), Interval::new(73534, 73535), Interval::new(73537, 73537), Interval::new(73539, 73561), Interval::new(73648, 73648), Interval::new(73664, 73713), Interval::new(73727, 74649), Interval::new(74752, 74862), Interval::new(74864, 74868), Interval::new(74880, 75075), Interval::new(77712, 77810), Interval::new(77824, 78895), Interval::new(78913, 78918), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92768, 92777), Interval::new(92782, 92862), Interval::new(92864, 92873), Interval::new(92880, 92909), Interval::new(92917, 92917), Interval::new(92928, 92975), Interval::new(92983, 92997), Interval::new(93008, 93017), Interval::new(93019, 93025), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93850), Interval::new(93952, 94026), Interval::new(94032, 94087), Interval::new(94099, 94111), Interval::new(94176, 94179), Interval::new(94192, 94193), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(113820, 113820), Interval::new(113823, 113823), Interval::new(118608, 118723), Interval::new(118784, 119029), Interval::new(119040, 119078), Interval::new(119081, 119140), Interval::new(119142, 119142), Interval::new(119146, 119149), Interval::new(119171, 119172), Interval::new(119180, 119209), Interval::new(119214, 119274), Interval::new(119296, 119361), Interval::new(119365, 119365), Interval::new(119488, 119507), Interval::new(119520, 119539), Interval::new(119552, 119638), Interval::new(119648, 119672), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120779), Interval::new(120782, 121343), Interval::new(121399, 121402), Interval::new(121453, 121460), Interval::new(121462, 121475), Interval::new(121477, 121483), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122928, 122989), Interval::new(123136, 123180), Interval::new(123191, 123197), Interval::new(123200, 123209), Interval::new(123214, 123215), Interval::new(123536, 123565), Interval::new(123584, 123627), Interval::new(123632, 123641), Interval::new(123647, 123647), Interval::new(124112, 124139), Interval::new(124144, 124153), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125127, 125135), Interval::new(125184, 125251), Interval::new(125259, 125259), Interval::new(125264, 125273), Interval::new(125278, 125279), Interval::new(126065, 126132), Interval::new(126209, 126269), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(126704, 126705), Interval::new(126976, 127019), Interval::new(127024, 127123), Interval::new(127136, 127150), Interval::new(127153, 127167), Interval::new(127169, 127183), Interval::new(127185, 127221), Interval::new(127232, 127405), Interval::new(127462, 127490), Interval::new(127504, 127547), Interval::new(127552, 127560), Interval::new(127568, 127569), Interval::new(127584, 127589), Interval::new(127744, 128727), Interval::new(128732, 128748), Interval::new(128752, 128764), Interval::new(128768, 128886), Interval::new(128891, 128985), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129024, 129035), Interval::new(129040, 129095), Interval::new(129104, 129113), Interval::new(129120, 129159), Interval::new(129168, 129197), Interval::new(129200, 129201), Interval::new(129280, 129619), Interval::new(129632, 129645), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), Interval::new(129792, 129938), Interval::new(129940, 129994), Interval::new(130032, 130041), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'Grapheme_Base' Unicode property. pub(crate) fn grapheme_base_ranges() -> &'static [Interval] { &GRAPHEME_BASE } const GRAPHEME_EXTEND: [Interval; 363] = [ Interval::new(768, 879), Interval::new(1155, 1161), Interval::new(1425, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1477), Interval::new(1479, 1479), Interval::new(1552, 1562), Interval::new(1611, 1631), Interval::new(1648, 1648), Interval::new(1750, 1756), Interval::new(1759, 1764), Interval::new(1767, 1768), Interval::new(1770, 1773), Interval::new(1809, 1809), Interval::new(1840, 1866), Interval::new(1958, 1968), Interval::new(2027, 2035), Interval::new(2045, 2045), Interval::new(2070, 2073), Interval::new(2075, 2083), Interval::new(2085, 2087), Interval::new(2089, 2093), Interval::new(2137, 2139), Interval::new(2200, 2207), Interval::new(2250, 2273), Interval::new(2275, 2306), Interval::new(2362, 2362), Interval::new(2364, 2364), Interval::new(2369, 2376), Interval::new(2381, 2381), Interval::new(2385, 2391), Interval::new(2402, 2403), Interval::new(2433, 2433), Interval::new(2492, 2492), Interval::new(2494, 2494), Interval::new(2497, 2500), Interval::new(2509, 2509), Interval::new(2519, 2519), Interval::new(2530, 2531), Interval::new(2558, 2558), Interval::new(2561, 2562), Interval::new(2620, 2620), Interval::new(2625, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2672, 2673), Interval::new(2677, 2677), Interval::new(2689, 2690), Interval::new(2748, 2748), Interval::new(2753, 2757), Interval::new(2759, 2760), Interval::new(2765, 2765), Interval::new(2786, 2787), Interval::new(2810, 2815), Interval::new(2817, 2817), Interval::new(2876, 2876), Interval::new(2878, 2879), Interval::new(2881, 2884), Interval::new(2893, 2893), Interval::new(2901, 2903), Interval::new(2914, 2915), Interval::new(2946, 2946), Interval::new(3006, 3006), Interval::new(3008, 3008), Interval::new(3021, 3021), Interval::new(3031, 3031), Interval::new(3072, 3072), Interval::new(3076, 3076), Interval::new(3132, 3132), Interval::new(3134, 3136), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3170, 3171), Interval::new(3201, 3201), Interval::new(3260, 3260), Interval::new(3263, 3263), Interval::new(3266, 3266), Interval::new(3270, 3270), Interval::new(3276, 3277), Interval::new(3285, 3286), Interval::new(3298, 3299), Interval::new(3328, 3329), Interval::new(3387, 3388), Interval::new(3390, 3390), Interval::new(3393, 3396), Interval::new(3405, 3405), Interval::new(3415, 3415), Interval::new(3426, 3427), Interval::new(3457, 3457), Interval::new(3530, 3530), Interval::new(3535, 3535), Interval::new(3538, 3540), Interval::new(3542, 3542), Interval::new(3551, 3551), Interval::new(3633, 3633), Interval::new(3636, 3642), Interval::new(3655, 3662), Interval::new(3761, 3761), Interval::new(3764, 3772), Interval::new(3784, 3790), Interval::new(3864, 3865), Interval::new(3893, 3893), Interval::new(3895, 3895), Interval::new(3897, 3897), Interval::new(3953, 3966), Interval::new(3968, 3972), Interval::new(3974, 3975), Interval::new(3981, 3991), Interval::new(3993, 4028), Interval::new(4038, 4038), Interval::new(4141, 4144), Interval::new(4146, 4151), Interval::new(4153, 4154), Interval::new(4157, 4158), Interval::new(4184, 4185), Interval::new(4190, 4192), Interval::new(4209, 4212), Interval::new(4226, 4226), Interval::new(4229, 4230), Interval::new(4237, 4237), Interval::new(4253, 4253), Interval::new(4957, 4959), Interval::new(5906, 5908), Interval::new(5938, 5939), Interval::new(5970, 5971), Interval::new(6002, 6003), Interval::new(6068, 6069), Interval::new(6071, 6077), Interval::new(6086, 6086), Interval::new(6089, 6099), Interval::new(6109, 6109), Interval::new(6155, 6157), Interval::new(6159, 6159), Interval::new(6277, 6278), Interval::new(6313, 6313), Interval::new(6432, 6434), Interval::new(6439, 6440), Interval::new(6450, 6450), Interval::new(6457, 6459), Interval::new(6679, 6680), Interval::new(6683, 6683), Interval::new(6742, 6742), Interval::new(6744, 6750), Interval::new(6752, 6752), Interval::new(6754, 6754), Interval::new(6757, 6764), Interval::new(6771, 6780), Interval::new(6783, 6783), Interval::new(6832, 6862), Interval::new(6912, 6915), Interval::new(6964, 6970), Interval::new(6972, 6972), Interval::new(6978, 6978), Interval::new(7019, 7027), Interval::new(7040, 7041), Interval::new(7074, 7077), Interval::new(7080, 7081), Interval::new(7083, 7085), Interval::new(7142, 7142), Interval::new(7144, 7145), Interval::new(7149, 7149), Interval::new(7151, 7153), Interval::new(7212, 7219), Interval::new(7222, 7223), Interval::new(7376, 7378), Interval::new(7380, 7392), Interval::new(7394, 7400), Interval::new(7405, 7405), Interval::new(7412, 7412), Interval::new(7416, 7417), Interval::new(7616, 7679), Interval::new(8204, 8204), Interval::new(8400, 8432), Interval::new(11503, 11505), Interval::new(11647, 11647), Interval::new(11744, 11775), Interval::new(12330, 12335), Interval::new(12441, 12442), Interval::new(42607, 42610), Interval::new(42612, 42621), Interval::new(42654, 42655), Interval::new(42736, 42737), Interval::new(43010, 43010), Interval::new(43014, 43014), Interval::new(43019, 43019), Interval::new(43045, 43046), Interval::new(43052, 43052), Interval::new(43204, 43205), Interval::new(43232, 43249), Interval::new(43263, 43263), Interval::new(43302, 43309), Interval::new(43335, 43345), Interval::new(43392, 43394), Interval::new(43443, 43443), Interval::new(43446, 43449), Interval::new(43452, 43453), Interval::new(43493, 43493), Interval::new(43561, 43566), Interval::new(43569, 43570), Interval::new(43573, 43574), Interval::new(43587, 43587), Interval::new(43596, 43596), Interval::new(43644, 43644), Interval::new(43696, 43696), Interval::new(43698, 43700), Interval::new(43703, 43704), Interval::new(43710, 43711), Interval::new(43713, 43713), Interval::new(43756, 43757), Interval::new(43766, 43766), Interval::new(44005, 44005), Interval::new(44008, 44008), Interval::new(44013, 44013), Interval::new(64286, 64286), Interval::new(65024, 65039), Interval::new(65056, 65071), Interval::new(65438, 65439), Interval::new(66045, 66045), Interval::new(66272, 66272), Interval::new(66422, 66426), Interval::new(68097, 68099), Interval::new(68101, 68102), Interval::new(68108, 68111), Interval::new(68152, 68154), Interval::new(68159, 68159), Interval::new(68325, 68326), Interval::new(68900, 68903), Interval::new(69291, 69292), Interval::new(69373, 69375), Interval::new(69446, 69456), Interval::new(69506, 69509), Interval::new(69633, 69633), Interval::new(69688, 69702), Interval::new(69744, 69744), Interval::new(69747, 69748), Interval::new(69759, 69761), Interval::new(69811, 69814), Interval::new(69817, 69818), Interval::new(69826, 69826), Interval::new(69888, 69890), Interval::new(69927, 69931), Interval::new(69933, 69940), Interval::new(70003, 70003), Interval::new(70016, 70017), Interval::new(70070, 70078), Interval::new(70089, 70092), Interval::new(70095, 70095), Interval::new(70191, 70193), Interval::new(70196, 70196), Interval::new(70198, 70199), Interval::new(70206, 70206), Interval::new(70209, 70209), Interval::new(70367, 70367), Interval::new(70371, 70378), Interval::new(70400, 70401), Interval::new(70459, 70460), Interval::new(70462, 70462), Interval::new(70464, 70464), Interval::new(70487, 70487), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70712, 70719), Interval::new(70722, 70724), Interval::new(70726, 70726), Interval::new(70750, 70750), Interval::new(70832, 70832), Interval::new(70835, 70840), Interval::new(70842, 70842), Interval::new(70845, 70845), Interval::new(70847, 70848), Interval::new(70850, 70851), Interval::new(71087, 71087), Interval::new(71090, 71093), Interval::new(71100, 71101), Interval::new(71103, 71104), Interval::new(71132, 71133), Interval::new(71219, 71226), Interval::new(71229, 71229), Interval::new(71231, 71232), Interval::new(71339, 71339), Interval::new(71341, 71341), Interval::new(71344, 71349), Interval::new(71351, 71351), Interval::new(71453, 71455), Interval::new(71458, 71461), Interval::new(71463, 71467), Interval::new(71727, 71735), Interval::new(71737, 71738), Interval::new(71984, 71984), Interval::new(71995, 71996), Interval::new(71998, 71998), Interval::new(72003, 72003), Interval::new(72148, 72151), Interval::new(72154, 72155), Interval::new(72160, 72160), Interval::new(72193, 72202), Interval::new(72243, 72248), Interval::new(72251, 72254), Interval::new(72263, 72263), Interval::new(72273, 72278), Interval::new(72281, 72283), Interval::new(72330, 72342), Interval::new(72344, 72345), Interval::new(72752, 72758), Interval::new(72760, 72765), Interval::new(72767, 72767), Interval::new(72850, 72871), Interval::new(72874, 72880), Interval::new(72882, 72883), Interval::new(72885, 72886), Interval::new(73009, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73029), Interval::new(73031, 73031), Interval::new(73104, 73105), Interval::new(73109, 73109), Interval::new(73111, 73111), Interval::new(73459, 73460), Interval::new(73472, 73473), Interval::new(73526, 73530), Interval::new(73536, 73536), Interval::new(73538, 73538), Interval::new(78912, 78912), Interval::new(78919, 78933), Interval::new(92912, 92916), Interval::new(92976, 92982), Interval::new(94031, 94031), Interval::new(94095, 94098), Interval::new(94180, 94180), Interval::new(113821, 113822), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119141, 119141), Interval::new(119143, 119145), Interval::new(119150, 119154), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(119362, 119364), Interval::new(121344, 121398), Interval::new(121403, 121452), Interval::new(121461, 121461), Interval::new(121476, 121476), Interval::new(121499, 121503), Interval::new(121505, 121519), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(123023, 123023), Interval::new(123184, 123190), Interval::new(123566, 123566), Interval::new(123628, 123631), Interval::new(124140, 124143), Interval::new(125136, 125142), Interval::new(125252, 125258), Interval::new(917536, 917631), Interval::new(917760, 917999), ]; /// Return the code point ranges of the 'Grapheme_Extend' Unicode property. pub(crate) fn grapheme_extend_ranges() -> &'static [Interval] { &GRAPHEME_EXTEND } const ID_CONTINUE: [Interval; 769] = [ Interval::new(48, 57), Interval::new(65, 90), Interval::new(95, 95), Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(183, 183), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 705), Interval::new(710, 721), Interval::new(736, 740), Interval::new(748, 748), Interval::new(750, 750), Interval::new(768, 884), Interval::new(886, 887), Interval::new(890, 893), Interval::new(895, 895), Interval::new(902, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1155, 1159), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1369, 1369), Interval::new(1376, 1416), Interval::new(1425, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1477), Interval::new(1479, 1479), Interval::new(1488, 1514), Interval::new(1519, 1522), Interval::new(1552, 1562), Interval::new(1568, 1641), Interval::new(1646, 1747), Interval::new(1749, 1756), Interval::new(1759, 1768), Interval::new(1770, 1788), Interval::new(1791, 1791), Interval::new(1808, 1866), Interval::new(1869, 1969), Interval::new(1984, 2037), Interval::new(2042, 2042), Interval::new(2045, 2045), Interval::new(2048, 2093), Interval::new(2112, 2139), Interval::new(2144, 2154), Interval::new(2160, 2183), Interval::new(2185, 2190), Interval::new(2200, 2273), Interval::new(2275, 2403), Interval::new(2406, 2415), Interval::new(2417, 2435), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2492, 2500), Interval::new(2503, 2504), Interval::new(2507, 2510), Interval::new(2519, 2519), Interval::new(2524, 2525), Interval::new(2527, 2531), Interval::new(2534, 2545), Interval::new(2556, 2556), Interval::new(2558, 2558), Interval::new(2561, 2563), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2620, 2620), Interval::new(2622, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2662, 2677), Interval::new(2689, 2691), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2748, 2757), Interval::new(2759, 2761), Interval::new(2763, 2765), Interval::new(2768, 2768), Interval::new(2784, 2787), Interval::new(2790, 2799), Interval::new(2809, 2815), Interval::new(2817, 2819), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2876, 2884), Interval::new(2887, 2888), Interval::new(2891, 2893), Interval::new(2901, 2903), Interval::new(2908, 2909), Interval::new(2911, 2915), Interval::new(2918, 2927), Interval::new(2929, 2929), Interval::new(2946, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3006, 3010), Interval::new(3014, 3016), Interval::new(3018, 3021), Interval::new(3024, 3024), Interval::new(3031, 3031), Interval::new(3046, 3055), Interval::new(3072, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3132, 3140), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3171), Interval::new(3174, 3183), Interval::new(3200, 3203), Interval::new(3205, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3260, 3268), Interval::new(3270, 3272), Interval::new(3274, 3277), Interval::new(3285, 3286), Interval::new(3293, 3294), Interval::new(3296, 3299), Interval::new(3302, 3311), Interval::new(3313, 3315), Interval::new(3328, 3340), Interval::new(3342, 3344), Interval::new(3346, 3396), Interval::new(3398, 3400), Interval::new(3402, 3406), Interval::new(3412, 3415), Interval::new(3423, 3427), Interval::new(3430, 3439), Interval::new(3450, 3455), Interval::new(3457, 3459), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3530, 3530), Interval::new(3535, 3540), Interval::new(3542, 3542), Interval::new(3544, 3551), Interval::new(3558, 3567), Interval::new(3570, 3571), Interval::new(3585, 3642), Interval::new(3648, 3662), Interval::new(3664, 3673), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3784, 3790), Interval::new(3792, 3801), Interval::new(3804, 3807), Interval::new(3840, 3840), Interval::new(3864, 3865), Interval::new(3872, 3881), Interval::new(3893, 3893), Interval::new(3895, 3895), Interval::new(3897, 3897), Interval::new(3902, 3911), Interval::new(3913, 3948), Interval::new(3953, 3972), Interval::new(3974, 3991), Interval::new(3993, 4028), Interval::new(4038, 4038), Interval::new(4096, 4169), Interval::new(4176, 4253), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4957, 4959), Interval::new(4969, 4977), Interval::new(4992, 5007), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5121, 5740), Interval::new(5743, 5759), Interval::new(5761, 5786), Interval::new(5792, 5866), Interval::new(5870, 5880), Interval::new(5888, 5909), Interval::new(5919, 5940), Interval::new(5952, 5971), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6002, 6003), Interval::new(6016, 6099), Interval::new(6103, 6103), Interval::new(6108, 6109), Interval::new(6112, 6121), Interval::new(6155, 6157), Interval::new(6159, 6169), Interval::new(6176, 6264), Interval::new(6272, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6432, 6443), Interval::new(6448, 6459), Interval::new(6470, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6608, 6618), Interval::new(6656, 6683), Interval::new(6688, 6750), Interval::new(6752, 6780), Interval::new(6783, 6793), Interval::new(6800, 6809), Interval::new(6823, 6823), Interval::new(6832, 6845), Interval::new(6847, 6862), Interval::new(6912, 6988), Interval::new(6992, 7001), Interval::new(7019, 7027), Interval::new(7040, 7155), Interval::new(7168, 7223), Interval::new(7232, 7241), Interval::new(7245, 7293), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7376, 7378), Interval::new(7380, 7418), Interval::new(7424, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8204, 8205), Interval::new(8255, 8256), Interval::new(8276, 8276), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8400, 8412), Interval::new(8417, 8417), Interval::new(8421, 8432), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8472, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8544, 8584), Interval::new(11264, 11492), Interval::new(11499, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11631), Interval::new(11647, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(11744, 11775), Interval::new(12293, 12295), Interval::new(12321, 12335), Interval::new(12337, 12341), Interval::new(12344, 12348), Interval::new(12353, 12438), Interval::new(12441, 12447), Interval::new(12449, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12704, 12735), Interval::new(12784, 12799), Interval::new(13312, 19903), Interval::new(19968, 42124), Interval::new(42192, 42237), Interval::new(42240, 42508), Interval::new(42512, 42539), Interval::new(42560, 42607), Interval::new(42612, 42621), Interval::new(42623, 42737), Interval::new(42775, 42783), Interval::new(42786, 42888), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43047), Interval::new(43052, 43052), Interval::new(43072, 43123), Interval::new(43136, 43205), Interval::new(43216, 43225), Interval::new(43232, 43255), Interval::new(43259, 43259), Interval::new(43261, 43309), Interval::new(43312, 43347), Interval::new(43360, 43388), Interval::new(43392, 43456), Interval::new(43471, 43481), Interval::new(43488, 43518), Interval::new(43520, 43574), Interval::new(43584, 43597), Interval::new(43600, 43609), Interval::new(43616, 43638), Interval::new(43642, 43714), Interval::new(43739, 43741), Interval::new(43744, 43759), Interval::new(43762, 43766), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 44010), Interval::new(44012, 44013), Interval::new(44016, 44025), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64296), Interval::new(64298, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65019), Interval::new(65024, 65039), Interval::new(65056, 65071), Interval::new(65075, 65076), Interval::new(65101, 65103), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(65296, 65305), Interval::new(65313, 65338), Interval::new(65343, 65343), Interval::new(65345, 65370), Interval::new(65381, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65856, 65908), Interval::new(66045, 66045), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66272, 66272), Interval::new(66304, 66335), Interval::new(66349, 66378), Interval::new(66384, 66426), Interval::new(66432, 66461), Interval::new(66464, 66499), Interval::new(66504, 66511), Interval::new(66513, 66517), Interval::new(66560, 66717), Interval::new(66720, 66729), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67680, 67702), Interval::new(67712, 67742), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67840, 67861), Interval::new(67872, 67897), Interval::new(67968, 68023), Interval::new(68030, 68031), Interval::new(68096, 68099), Interval::new(68101, 68102), Interval::new(68108, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68152, 68154), Interval::new(68159, 68159), Interval::new(68192, 68220), Interval::new(68224, 68252), Interval::new(68288, 68295), Interval::new(68297, 68326), Interval::new(68352, 68405), Interval::new(68416, 68437), Interval::new(68448, 68466), Interval::new(68480, 68497), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68864, 68903), Interval::new(68912, 68921), Interval::new(69248, 69289), Interval::new(69291, 69292), Interval::new(69296, 69297), Interval::new(69373, 69404), Interval::new(69415, 69415), Interval::new(69424, 69456), Interval::new(69488, 69509), Interval::new(69552, 69572), Interval::new(69600, 69622), Interval::new(69632, 69702), Interval::new(69734, 69749), Interval::new(69759, 69818), Interval::new(69826, 69826), Interval::new(69840, 69864), Interval::new(69872, 69881), Interval::new(69888, 69940), Interval::new(69942, 69951), Interval::new(69956, 69959), Interval::new(69968, 70003), Interval::new(70006, 70006), Interval::new(70016, 70084), Interval::new(70089, 70092), Interval::new(70094, 70106), Interval::new(70108, 70108), Interval::new(70144, 70161), Interval::new(70163, 70199), Interval::new(70206, 70209), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70312), Interval::new(70320, 70378), Interval::new(70384, 70393), Interval::new(70400, 70403), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70459, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70480, 70480), Interval::new(70487, 70487), Interval::new(70493, 70499), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70656, 70730), Interval::new(70736, 70745), Interval::new(70750, 70753), Interval::new(70784, 70853), Interval::new(70855, 70855), Interval::new(70864, 70873), Interval::new(71040, 71093), Interval::new(71096, 71104), Interval::new(71128, 71133), Interval::new(71168, 71232), Interval::new(71236, 71236), Interval::new(71248, 71257), Interval::new(71296, 71352), Interval::new(71360, 71369), Interval::new(71424, 71450), Interval::new(71453, 71467), Interval::new(71472, 71481), Interval::new(71488, 71494), Interval::new(71680, 71738), Interval::new(71840, 71913), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71989), Interval::new(71991, 71992), Interval::new(71995, 72003), Interval::new(72016, 72025), Interval::new(72096, 72103), Interval::new(72106, 72151), Interval::new(72154, 72161), Interval::new(72163, 72164), Interval::new(72192, 72254), Interval::new(72263, 72263), Interval::new(72272, 72345), Interval::new(72349, 72349), Interval::new(72368, 72440), Interval::new(72704, 72712), Interval::new(72714, 72758), Interval::new(72760, 72768), Interval::new(72784, 72793), Interval::new(72818, 72847), Interval::new(72850, 72871), Interval::new(72873, 72886), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73031), Interval::new(73040, 73049), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73102), Interval::new(73104, 73105), Interval::new(73107, 73112), Interval::new(73120, 73129), Interval::new(73440, 73462), Interval::new(73472, 73488), Interval::new(73490, 73530), Interval::new(73534, 73538), Interval::new(73552, 73561), Interval::new(73648, 73648), Interval::new(73728, 74649), Interval::new(74752, 74862), Interval::new(74880, 75075), Interval::new(77712, 77808), Interval::new(77824, 78895), Interval::new(78912, 78933), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92768, 92777), Interval::new(92784, 92862), Interval::new(92864, 92873), Interval::new(92880, 92909), Interval::new(92912, 92916), Interval::new(92928, 92982), Interval::new(92992, 92995), Interval::new(93008, 93017), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93823), Interval::new(93952, 94026), Interval::new(94031, 94087), Interval::new(94095, 94111), Interval::new(94176, 94177), Interval::new(94179, 94180), Interval::new(94192, 94193), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(113821, 113822), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119141, 119145), Interval::new(119149, 119154), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(119362, 119364), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(120782, 120831), Interval::new(121344, 121398), Interval::new(121403, 121452), Interval::new(121461, 121461), Interval::new(121476, 121476), Interval::new(121499, 121503), Interval::new(121505, 121519), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(122928, 122989), Interval::new(123023, 123023), Interval::new(123136, 123180), Interval::new(123184, 123197), Interval::new(123200, 123209), Interval::new(123214, 123214), Interval::new(123536, 123566), Interval::new(123584, 123641), Interval::new(124112, 124153), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125136, 125142), Interval::new(125184, 125259), Interval::new(125264, 125273), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(130032, 130041), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), Interval::new(917760, 917999), ]; /// Return the code point ranges of the 'ID_Continue' Unicode property. pub(crate) fn id_continue_ranges() -> &'static [Interval] { &ID_CONTINUE } const ID_START: [Interval; 660] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 705), Interval::new(710, 721), Interval::new(736, 740), Interval::new(748, 748), Interval::new(750, 750), Interval::new(880, 884), Interval::new(886, 887), Interval::new(890, 893), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1369, 1369), Interval::new(1376, 1416), Interval::new(1488, 1514), Interval::new(1519, 1522), Interval::new(1568, 1610), Interval::new(1646, 1647), Interval::new(1649, 1747), Interval::new(1749, 1749), Interval::new(1765, 1766), Interval::new(1774, 1775), Interval::new(1786, 1788), Interval::new(1791, 1791), Interval::new(1808, 1808), Interval::new(1810, 1839), Interval::new(1869, 1957), Interval::new(1969, 1969), Interval::new(1994, 2026), Interval::new(2036, 2037), Interval::new(2042, 2042), Interval::new(2048, 2069), Interval::new(2074, 2074), Interval::new(2084, 2084), Interval::new(2088, 2088), Interval::new(2112, 2136), Interval::new(2144, 2154), Interval::new(2160, 2183), Interval::new(2185, 2190), Interval::new(2208, 2249), Interval::new(2308, 2361), Interval::new(2365, 2365), Interval::new(2384, 2384), Interval::new(2392, 2401), Interval::new(2417, 2432), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2493, 2493), Interval::new(2510, 2510), Interval::new(2524, 2525), Interval::new(2527, 2529), Interval::new(2544, 2545), Interval::new(2556, 2556), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2674, 2676), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2749, 2749), Interval::new(2768, 2768), Interval::new(2784, 2785), Interval::new(2809, 2809), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2877, 2877), Interval::new(2908, 2909), Interval::new(2911, 2913), Interval::new(2929, 2929), Interval::new(2947, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3024, 3024), Interval::new(3077, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3133, 3133), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3169), Interval::new(3200, 3200), Interval::new(3205, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3261, 3261), Interval::new(3293, 3294), Interval::new(3296, 3297), Interval::new(3313, 3314), Interval::new(3332, 3340), Interval::new(3342, 3344), Interval::new(3346, 3386), Interval::new(3389, 3389), Interval::new(3406, 3406), Interval::new(3412, 3414), Interval::new(3423, 3425), Interval::new(3450, 3455), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3585, 3632), Interval::new(3634, 3635), Interval::new(3648, 3654), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3760), Interval::new(3762, 3763), Interval::new(3773, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3804, 3807), Interval::new(3840, 3840), Interval::new(3904, 3911), Interval::new(3913, 3948), Interval::new(3976, 3980), Interval::new(4096, 4138), Interval::new(4159, 4159), Interval::new(4176, 4181), Interval::new(4186, 4189), Interval::new(4193, 4193), Interval::new(4197, 4198), Interval::new(4206, 4208), Interval::new(4213, 4225), Interval::new(4238, 4238), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4992, 5007), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5121, 5740), Interval::new(5743, 5759), Interval::new(5761, 5786), Interval::new(5792, 5866), Interval::new(5870, 5880), Interval::new(5888, 5905), Interval::new(5919, 5937), Interval::new(5952, 5969), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6016, 6067), Interval::new(6103, 6103), Interval::new(6108, 6108), Interval::new(6176, 6264), Interval::new(6272, 6312), Interval::new(6314, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6480, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6656, 6678), Interval::new(6688, 6740), Interval::new(6823, 6823), Interval::new(6917, 6963), Interval::new(6981, 6988), Interval::new(7043, 7072), Interval::new(7086, 7087), Interval::new(7098, 7141), Interval::new(7168, 7203), Interval::new(7245, 7247), Interval::new(7258, 7293), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7401, 7404), Interval::new(7406, 7411), Interval::new(7413, 7414), Interval::new(7418, 7418), Interval::new(7424, 7615), Interval::new(7680, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8472, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8544, 8584), Interval::new(11264, 11492), Interval::new(11499, 11502), Interval::new(11506, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11631), Interval::new(11648, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(12293, 12295), Interval::new(12321, 12329), Interval::new(12337, 12341), Interval::new(12344, 12348), Interval::new(12353, 12438), Interval::new(12443, 12447), Interval::new(12449, 12538), Interval::new(12540, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12704, 12735), Interval::new(12784, 12799), Interval::new(13312, 19903), Interval::new(19968, 42124), Interval::new(42192, 42237), Interval::new(42240, 42508), Interval::new(42512, 42527), Interval::new(42538, 42539), Interval::new(42560, 42606), Interval::new(42623, 42653), Interval::new(42656, 42735), Interval::new(42775, 42783), Interval::new(42786, 42888), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43009), Interval::new(43011, 43013), Interval::new(43015, 43018), Interval::new(43020, 43042), Interval::new(43072, 43123), Interval::new(43138, 43187), Interval::new(43250, 43255), Interval::new(43259, 43259), Interval::new(43261, 43262), Interval::new(43274, 43301), Interval::new(43312, 43334), Interval::new(43360, 43388), Interval::new(43396, 43442), Interval::new(43471, 43471), Interval::new(43488, 43492), Interval::new(43494, 43503), Interval::new(43514, 43518), Interval::new(43520, 43560), Interval::new(43584, 43586), Interval::new(43588, 43595), Interval::new(43616, 43638), Interval::new(43642, 43642), Interval::new(43646, 43695), Interval::new(43697, 43697), Interval::new(43701, 43702), Interval::new(43705, 43709), Interval::new(43712, 43712), Interval::new(43714, 43714), Interval::new(43739, 43741), Interval::new(43744, 43754), Interval::new(43762, 43764), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 44002), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64285), Interval::new(64287, 64296), Interval::new(64298, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65019), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(65382, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65856, 65908), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66304, 66335), Interval::new(66349, 66378), Interval::new(66384, 66421), Interval::new(66432, 66461), Interval::new(66464, 66499), Interval::new(66504, 66511), Interval::new(66513, 66517), Interval::new(66560, 66717), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67680, 67702), Interval::new(67712, 67742), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67840, 67861), Interval::new(67872, 67897), Interval::new(67968, 68023), Interval::new(68030, 68031), Interval::new(68096, 68096), Interval::new(68112, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68192, 68220), Interval::new(68224, 68252), Interval::new(68288, 68295), Interval::new(68297, 68324), Interval::new(68352, 68405), Interval::new(68416, 68437), Interval::new(68448, 68466), Interval::new(68480, 68497), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68864, 68899), Interval::new(69248, 69289), Interval::new(69296, 69297), Interval::new(69376, 69404), Interval::new(69415, 69415), Interval::new(69424, 69445), Interval::new(69488, 69505), Interval::new(69552, 69572), Interval::new(69600, 69622), Interval::new(69635, 69687), Interval::new(69745, 69746), Interval::new(69749, 69749), Interval::new(69763, 69807), Interval::new(69840, 69864), Interval::new(69891, 69926), Interval::new(69956, 69956), Interval::new(69959, 69959), Interval::new(69968, 70002), Interval::new(70006, 70006), Interval::new(70019, 70066), Interval::new(70081, 70084), Interval::new(70106, 70106), Interval::new(70108, 70108), Interval::new(70144, 70161), Interval::new(70163, 70187), Interval::new(70207, 70208), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70312), Interval::new(70320, 70366), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70461, 70461), Interval::new(70480, 70480), Interval::new(70493, 70497), Interval::new(70656, 70708), Interval::new(70727, 70730), Interval::new(70751, 70753), Interval::new(70784, 70831), Interval::new(70852, 70853), Interval::new(70855, 70855), Interval::new(71040, 71086), Interval::new(71128, 71131), Interval::new(71168, 71215), Interval::new(71236, 71236), Interval::new(71296, 71338), Interval::new(71352, 71352), Interval::new(71424, 71450), Interval::new(71488, 71494), Interval::new(71680, 71723), Interval::new(71840, 71903), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71983), Interval::new(71999, 71999), Interval::new(72001, 72001), Interval::new(72096, 72103), Interval::new(72106, 72144), Interval::new(72161, 72161), Interval::new(72163, 72163), Interval::new(72192, 72192), Interval::new(72203, 72242), Interval::new(72250, 72250), Interval::new(72272, 72272), Interval::new(72284, 72329), Interval::new(72349, 72349), Interval::new(72368, 72440), Interval::new(72704, 72712), Interval::new(72714, 72750), Interval::new(72768, 72768), Interval::new(72818, 72847), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73008), Interval::new(73030, 73030), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73097), Interval::new(73112, 73112), Interval::new(73440, 73458), Interval::new(73474, 73474), Interval::new(73476, 73488), Interval::new(73490, 73523), Interval::new(73648, 73648), Interval::new(73728, 74649), Interval::new(74752, 74862), Interval::new(74880, 75075), Interval::new(77712, 77808), Interval::new(77824, 78895), Interval::new(78913, 78918), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92784, 92862), Interval::new(92880, 92909), Interval::new(92928, 92975), Interval::new(92992, 92995), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93823), Interval::new(93952, 94026), Interval::new(94032, 94032), Interval::new(94099, 94111), Interval::new(94176, 94177), Interval::new(94179, 94179), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122928, 122989), Interval::new(123136, 123180), Interval::new(123191, 123197), Interval::new(123214, 123214), Interval::new(123536, 123565), Interval::new(123584, 123627), Interval::new(124112, 124139), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125184, 125251), Interval::new(125259, 125259), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'ID_Start' Unicode property. pub(crate) fn id_start_ranges() -> &'static [Interval] { &ID_START } const MATH: [Interval; 138] = [ Interval::new(43, 43), Interval::new(60, 62), Interval::new(94, 94), Interval::new(124, 124), Interval::new(126, 126), Interval::new(172, 172), Interval::new(177, 177), Interval::new(215, 215), Interval::new(247, 247), Interval::new(976, 978), Interval::new(981, 981), Interval::new(1008, 1009), Interval::new(1012, 1014), Interval::new(1542, 1544), Interval::new(8214, 8214), Interval::new(8242, 8244), Interval::new(8256, 8256), Interval::new(8260, 8260), Interval::new(8274, 8274), Interval::new(8289, 8292), Interval::new(8314, 8318), Interval::new(8330, 8334), Interval::new(8400, 8412), Interval::new(8417, 8417), Interval::new(8421, 8422), Interval::new(8427, 8431), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8472, 8477), Interval::new(8484, 8484), Interval::new(8488, 8489), Interval::new(8492, 8493), Interval::new(8495, 8497), Interval::new(8499, 8504), Interval::new(8508, 8521), Interval::new(8523, 8523), Interval::new(8592, 8615), Interval::new(8617, 8622), Interval::new(8624, 8625), Interval::new(8630, 8631), Interval::new(8636, 8667), Interval::new(8669, 8669), Interval::new(8676, 8677), Interval::new(8692, 8959), Interval::new(8968, 8971), Interval::new(8992, 8993), Interval::new(9084, 9084), Interval::new(9115, 9141), Interval::new(9143, 9143), Interval::new(9168, 9168), Interval::new(9180, 9186), Interval::new(9632, 9633), Interval::new(9646, 9655), Interval::new(9660, 9665), Interval::new(9670, 9671), Interval::new(9674, 9675), Interval::new(9679, 9683), Interval::new(9698, 9698), Interval::new(9700, 9700), Interval::new(9703, 9708), Interval::new(9720, 9727), Interval::new(9733, 9734), Interval::new(9792, 9792), Interval::new(9794, 9794), Interval::new(9824, 9827), Interval::new(9837, 9839), Interval::new(10176, 10239), Interval::new(10496, 11007), Interval::new(11056, 11076), Interval::new(11079, 11084), Interval::new(64297, 64297), Interval::new(65121, 65126), Interval::new(65128, 65128), Interval::new(65291, 65291), Interval::new(65308, 65310), Interval::new(65340, 65340), Interval::new(65342, 65342), Interval::new(65372, 65372), Interval::new(65374, 65374), Interval::new(65506, 65506), Interval::new(65513, 65516), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120779), Interval::new(120782, 120831), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(126704, 126705), ]; /// Return the code point ranges of the 'Math' Unicode property. pub(crate) fn math_ranges() -> &'static [Interval] { &MATH } const XID_CONTINUE: [Interval; 776] = [ Interval::new(48, 57), Interval::new(65, 90), Interval::new(95, 95), Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(183, 183), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 705), Interval::new(710, 721), Interval::new(736, 740), Interval::new(748, 748), Interval::new(750, 750), Interval::new(768, 884), Interval::new(886, 887), Interval::new(891, 893), Interval::new(895, 895), Interval::new(902, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1155, 1159), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1369, 1369), Interval::new(1376, 1416), Interval::new(1425, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1477), Interval::new(1479, 1479), Interval::new(1488, 1514), Interval::new(1519, 1522), Interval::new(1552, 1562), Interval::new(1568, 1641), Interval::new(1646, 1747), Interval::new(1749, 1756), Interval::new(1759, 1768), Interval::new(1770, 1788), Interval::new(1791, 1791), Interval::new(1808, 1866), Interval::new(1869, 1969), Interval::new(1984, 2037), Interval::new(2042, 2042), Interval::new(2045, 2045), Interval::new(2048, 2093), Interval::new(2112, 2139), Interval::new(2144, 2154), Interval::new(2160, 2183), Interval::new(2185, 2190), Interval::new(2200, 2273), Interval::new(2275, 2403), Interval::new(2406, 2415), Interval::new(2417, 2435), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2492, 2500), Interval::new(2503, 2504), Interval::new(2507, 2510), Interval::new(2519, 2519), Interval::new(2524, 2525), Interval::new(2527, 2531), Interval::new(2534, 2545), Interval::new(2556, 2556), Interval::new(2558, 2558), Interval::new(2561, 2563), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2620, 2620), Interval::new(2622, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2662, 2677), Interval::new(2689, 2691), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2748, 2757), Interval::new(2759, 2761), Interval::new(2763, 2765), Interval::new(2768, 2768), Interval::new(2784, 2787), Interval::new(2790, 2799), Interval::new(2809, 2815), Interval::new(2817, 2819), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2876, 2884), Interval::new(2887, 2888), Interval::new(2891, 2893), Interval::new(2901, 2903), Interval::new(2908, 2909), Interval::new(2911, 2915), Interval::new(2918, 2927), Interval::new(2929, 2929), Interval::new(2946, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3006, 3010), Interval::new(3014, 3016), Interval::new(3018, 3021), Interval::new(3024, 3024), Interval::new(3031, 3031), Interval::new(3046, 3055), Interval::new(3072, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3132, 3140), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3171), Interval::new(3174, 3183), Interval::new(3200, 3203), Interval::new(3205, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3260, 3268), Interval::new(3270, 3272), Interval::new(3274, 3277), Interval::new(3285, 3286), Interval::new(3293, 3294), Interval::new(3296, 3299), Interval::new(3302, 3311), Interval::new(3313, 3315), Interval::new(3328, 3340), Interval::new(3342, 3344), Interval::new(3346, 3396), Interval::new(3398, 3400), Interval::new(3402, 3406), Interval::new(3412, 3415), Interval::new(3423, 3427), Interval::new(3430, 3439), Interval::new(3450, 3455), Interval::new(3457, 3459), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3530, 3530), Interval::new(3535, 3540), Interval::new(3542, 3542), Interval::new(3544, 3551), Interval::new(3558, 3567), Interval::new(3570, 3571), Interval::new(3585, 3642), Interval::new(3648, 3662), Interval::new(3664, 3673), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3784, 3790), Interval::new(3792, 3801), Interval::new(3804, 3807), Interval::new(3840, 3840), Interval::new(3864, 3865), Interval::new(3872, 3881), Interval::new(3893, 3893), Interval::new(3895, 3895), Interval::new(3897, 3897), Interval::new(3902, 3911), Interval::new(3913, 3948), Interval::new(3953, 3972), Interval::new(3974, 3991), Interval::new(3993, 4028), Interval::new(4038, 4038), Interval::new(4096, 4169), Interval::new(4176, 4253), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4957, 4959), Interval::new(4969, 4977), Interval::new(4992, 5007), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5121, 5740), Interval::new(5743, 5759), Interval::new(5761, 5786), Interval::new(5792, 5866), Interval::new(5870, 5880), Interval::new(5888, 5909), Interval::new(5919, 5940), Interval::new(5952, 5971), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6002, 6003), Interval::new(6016, 6099), Interval::new(6103, 6103), Interval::new(6108, 6109), Interval::new(6112, 6121), Interval::new(6155, 6157), Interval::new(6159, 6169), Interval::new(6176, 6264), Interval::new(6272, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6432, 6443), Interval::new(6448, 6459), Interval::new(6470, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6608, 6618), Interval::new(6656, 6683), Interval::new(6688, 6750), Interval::new(6752, 6780), Interval::new(6783, 6793), Interval::new(6800, 6809), Interval::new(6823, 6823), Interval::new(6832, 6845), Interval::new(6847, 6862), Interval::new(6912, 6988), Interval::new(6992, 7001), Interval::new(7019, 7027), Interval::new(7040, 7155), Interval::new(7168, 7223), Interval::new(7232, 7241), Interval::new(7245, 7293), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7376, 7378), Interval::new(7380, 7418), Interval::new(7424, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8204, 8205), Interval::new(8255, 8256), Interval::new(8276, 8276), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8400, 8412), Interval::new(8417, 8417), Interval::new(8421, 8432), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8472, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8544, 8584), Interval::new(11264, 11492), Interval::new(11499, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11631), Interval::new(11647, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(11744, 11775), Interval::new(12293, 12295), Interval::new(12321, 12335), Interval::new(12337, 12341), Interval::new(12344, 12348), Interval::new(12353, 12438), Interval::new(12441, 12442), Interval::new(12445, 12447), Interval::new(12449, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12704, 12735), Interval::new(12784, 12799), Interval::new(13312, 19903), Interval::new(19968, 42124), Interval::new(42192, 42237), Interval::new(42240, 42508), Interval::new(42512, 42539), Interval::new(42560, 42607), Interval::new(42612, 42621), Interval::new(42623, 42737), Interval::new(42775, 42783), Interval::new(42786, 42888), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43047), Interval::new(43052, 43052), Interval::new(43072, 43123), Interval::new(43136, 43205), Interval::new(43216, 43225), Interval::new(43232, 43255), Interval::new(43259, 43259), Interval::new(43261, 43309), Interval::new(43312, 43347), Interval::new(43360, 43388), Interval::new(43392, 43456), Interval::new(43471, 43481), Interval::new(43488, 43518), Interval::new(43520, 43574), Interval::new(43584, 43597), Interval::new(43600, 43609), Interval::new(43616, 43638), Interval::new(43642, 43714), Interval::new(43739, 43741), Interval::new(43744, 43759), Interval::new(43762, 43766), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 44010), Interval::new(44012, 44013), Interval::new(44016, 44025), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64296), Interval::new(64298, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64605), Interval::new(64612, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65017), Interval::new(65024, 65039), Interval::new(65056, 65071), Interval::new(65075, 65076), Interval::new(65101, 65103), Interval::new(65137, 65137), Interval::new(65139, 65139), Interval::new(65143, 65143), Interval::new(65145, 65145), Interval::new(65147, 65147), Interval::new(65149, 65149), Interval::new(65151, 65276), Interval::new(65296, 65305), Interval::new(65313, 65338), Interval::new(65343, 65343), Interval::new(65345, 65370), Interval::new(65381, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65856, 65908), Interval::new(66045, 66045), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66272, 66272), Interval::new(66304, 66335), Interval::new(66349, 66378), Interval::new(66384, 66426), Interval::new(66432, 66461), Interval::new(66464, 66499), Interval::new(66504, 66511), Interval::new(66513, 66517), Interval::new(66560, 66717), Interval::new(66720, 66729), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67680, 67702), Interval::new(67712, 67742), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67840, 67861), Interval::new(67872, 67897), Interval::new(67968, 68023), Interval::new(68030, 68031), Interval::new(68096, 68099), Interval::new(68101, 68102), Interval::new(68108, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68152, 68154), Interval::new(68159, 68159), Interval::new(68192, 68220), Interval::new(68224, 68252), Interval::new(68288, 68295), Interval::new(68297, 68326), Interval::new(68352, 68405), Interval::new(68416, 68437), Interval::new(68448, 68466), Interval::new(68480, 68497), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68864, 68903), Interval::new(68912, 68921), Interval::new(69248, 69289), Interval::new(69291, 69292), Interval::new(69296, 69297), Interval::new(69373, 69404), Interval::new(69415, 69415), Interval::new(69424, 69456), Interval::new(69488, 69509), Interval::new(69552, 69572), Interval::new(69600, 69622), Interval::new(69632, 69702), Interval::new(69734, 69749), Interval::new(69759, 69818), Interval::new(69826, 69826), Interval::new(69840, 69864), Interval::new(69872, 69881), Interval::new(69888, 69940), Interval::new(69942, 69951), Interval::new(69956, 69959), Interval::new(69968, 70003), Interval::new(70006, 70006), Interval::new(70016, 70084), Interval::new(70089, 70092), Interval::new(70094, 70106), Interval::new(70108, 70108), Interval::new(70144, 70161), Interval::new(70163, 70199), Interval::new(70206, 70209), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70312), Interval::new(70320, 70378), Interval::new(70384, 70393), Interval::new(70400, 70403), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70459, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70480, 70480), Interval::new(70487, 70487), Interval::new(70493, 70499), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70656, 70730), Interval::new(70736, 70745), Interval::new(70750, 70753), Interval::new(70784, 70853), Interval::new(70855, 70855), Interval::new(70864, 70873), Interval::new(71040, 71093), Interval::new(71096, 71104), Interval::new(71128, 71133), Interval::new(71168, 71232), Interval::new(71236, 71236), Interval::new(71248, 71257), Interval::new(71296, 71352), Interval::new(71360, 71369), Interval::new(71424, 71450), Interval::new(71453, 71467), Interval::new(71472, 71481), Interval::new(71488, 71494), Interval::new(71680, 71738), Interval::new(71840, 71913), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71989), Interval::new(71991, 71992), Interval::new(71995, 72003), Interval::new(72016, 72025), Interval::new(72096, 72103), Interval::new(72106, 72151), Interval::new(72154, 72161), Interval::new(72163, 72164), Interval::new(72192, 72254), Interval::new(72263, 72263), Interval::new(72272, 72345), Interval::new(72349, 72349), Interval::new(72368, 72440), Interval::new(72704, 72712), Interval::new(72714, 72758), Interval::new(72760, 72768), Interval::new(72784, 72793), Interval::new(72818, 72847), Interval::new(72850, 72871), Interval::new(72873, 72886), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73031), Interval::new(73040, 73049), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73102), Interval::new(73104, 73105), Interval::new(73107, 73112), Interval::new(73120, 73129), Interval::new(73440, 73462), Interval::new(73472, 73488), Interval::new(73490, 73530), Interval::new(73534, 73538), Interval::new(73552, 73561), Interval::new(73648, 73648), Interval::new(73728, 74649), Interval::new(74752, 74862), Interval::new(74880, 75075), Interval::new(77712, 77808), Interval::new(77824, 78895), Interval::new(78912, 78933), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92768, 92777), Interval::new(92784, 92862), Interval::new(92864, 92873), Interval::new(92880, 92909), Interval::new(92912, 92916), Interval::new(92928, 92982), Interval::new(92992, 92995), Interval::new(93008, 93017), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93823), Interval::new(93952, 94026), Interval::new(94031, 94087), Interval::new(94095, 94111), Interval::new(94176, 94177), Interval::new(94179, 94180), Interval::new(94192, 94193), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(113821, 113822), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119141, 119145), Interval::new(119149, 119154), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(119362, 119364), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(120782, 120831), Interval::new(121344, 121398), Interval::new(121403, 121452), Interval::new(121461, 121461), Interval::new(121476, 121476), Interval::new(121499, 121503), Interval::new(121505, 121519), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(122928, 122989), Interval::new(123023, 123023), Interval::new(123136, 123180), Interval::new(123184, 123197), Interval::new(123200, 123209), Interval::new(123214, 123214), Interval::new(123536, 123566), Interval::new(123584, 123641), Interval::new(124112, 124153), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125136, 125142), Interval::new(125184, 125259), Interval::new(125264, 125273), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(130032, 130041), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), Interval::new(917760, 917999), ]; /// Return the code point ranges of the 'XID_Continue' Unicode property. pub(crate) fn xid_continue_ranges() -> &'static [Interval] { &XID_CONTINUE } const XID_START: [Interval; 667] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 705), Interval::new(710, 721), Interval::new(736, 740), Interval::new(748, 748), Interval::new(750, 750), Interval::new(880, 884), Interval::new(886, 887), Interval::new(891, 893), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1369, 1369), Interval::new(1376, 1416), Interval::new(1488, 1514), Interval::new(1519, 1522), Interval::new(1568, 1610), Interval::new(1646, 1647), Interval::new(1649, 1747), Interval::new(1749, 1749), Interval::new(1765, 1766), Interval::new(1774, 1775), Interval::new(1786, 1788), Interval::new(1791, 1791), Interval::new(1808, 1808), Interval::new(1810, 1839), Interval::new(1869, 1957), Interval::new(1969, 1969), Interval::new(1994, 2026), Interval::new(2036, 2037), Interval::new(2042, 2042), Interval::new(2048, 2069), Interval::new(2074, 2074), Interval::new(2084, 2084), Interval::new(2088, 2088), Interval::new(2112, 2136), Interval::new(2144, 2154), Interval::new(2160, 2183), Interval::new(2185, 2190), Interval::new(2208, 2249), Interval::new(2308, 2361), Interval::new(2365, 2365), Interval::new(2384, 2384), Interval::new(2392, 2401), Interval::new(2417, 2432), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2493, 2493), Interval::new(2510, 2510), Interval::new(2524, 2525), Interval::new(2527, 2529), Interval::new(2544, 2545), Interval::new(2556, 2556), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2674, 2676), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2749, 2749), Interval::new(2768, 2768), Interval::new(2784, 2785), Interval::new(2809, 2809), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2877, 2877), Interval::new(2908, 2909), Interval::new(2911, 2913), Interval::new(2929, 2929), Interval::new(2947, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3024, 3024), Interval::new(3077, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3133, 3133), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3169), Interval::new(3200, 3200), Interval::new(3205, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3261, 3261), Interval::new(3293, 3294), Interval::new(3296, 3297), Interval::new(3313, 3314), Interval::new(3332, 3340), Interval::new(3342, 3344), Interval::new(3346, 3386), Interval::new(3389, 3389), Interval::new(3406, 3406), Interval::new(3412, 3414), Interval::new(3423, 3425), Interval::new(3450, 3455), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3585, 3632), Interval::new(3634, 3634), Interval::new(3648, 3654), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3760), Interval::new(3762, 3762), Interval::new(3773, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3804, 3807), Interval::new(3840, 3840), Interval::new(3904, 3911), Interval::new(3913, 3948), Interval::new(3976, 3980), Interval::new(4096, 4138), Interval::new(4159, 4159), Interval::new(4176, 4181), Interval::new(4186, 4189), Interval::new(4193, 4193), Interval::new(4197, 4198), Interval::new(4206, 4208), Interval::new(4213, 4225), Interval::new(4238, 4238), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4992, 5007), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5121, 5740), Interval::new(5743, 5759), Interval::new(5761, 5786), Interval::new(5792, 5866), Interval::new(5870, 5880), Interval::new(5888, 5905), Interval::new(5919, 5937), Interval::new(5952, 5969), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6016, 6067), Interval::new(6103, 6103), Interval::new(6108, 6108), Interval::new(6176, 6264), Interval::new(6272, 6312), Interval::new(6314, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6480, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6656, 6678), Interval::new(6688, 6740), Interval::new(6823, 6823), Interval::new(6917, 6963), Interval::new(6981, 6988), Interval::new(7043, 7072), Interval::new(7086, 7087), Interval::new(7098, 7141), Interval::new(7168, 7203), Interval::new(7245, 7247), Interval::new(7258, 7293), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7401, 7404), Interval::new(7406, 7411), Interval::new(7413, 7414), Interval::new(7418, 7418), Interval::new(7424, 7615), Interval::new(7680, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8472, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8544, 8584), Interval::new(11264, 11492), Interval::new(11499, 11502), Interval::new(11506, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11631), Interval::new(11648, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(12293, 12295), Interval::new(12321, 12329), Interval::new(12337, 12341), Interval::new(12344, 12348), Interval::new(12353, 12438), Interval::new(12445, 12447), Interval::new(12449, 12538), Interval::new(12540, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12704, 12735), Interval::new(12784, 12799), Interval::new(13312, 19903), Interval::new(19968, 42124), Interval::new(42192, 42237), Interval::new(42240, 42508), Interval::new(42512, 42527), Interval::new(42538, 42539), Interval::new(42560, 42606), Interval::new(42623, 42653), Interval::new(42656, 42735), Interval::new(42775, 42783), Interval::new(42786, 42888), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43009), Interval::new(43011, 43013), Interval::new(43015, 43018), Interval::new(43020, 43042), Interval::new(43072, 43123), Interval::new(43138, 43187), Interval::new(43250, 43255), Interval::new(43259, 43259), Interval::new(43261, 43262), Interval::new(43274, 43301), Interval::new(43312, 43334), Interval::new(43360, 43388), Interval::new(43396, 43442), Interval::new(43471, 43471), Interval::new(43488, 43492), Interval::new(43494, 43503), Interval::new(43514, 43518), Interval::new(43520, 43560), Interval::new(43584, 43586), Interval::new(43588, 43595), Interval::new(43616, 43638), Interval::new(43642, 43642), Interval::new(43646, 43695), Interval::new(43697, 43697), Interval::new(43701, 43702), Interval::new(43705, 43709), Interval::new(43712, 43712), Interval::new(43714, 43714), Interval::new(43739, 43741), Interval::new(43744, 43754), Interval::new(43762, 43764), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 44002), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64285), Interval::new(64287, 64296), Interval::new(64298, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64605), Interval::new(64612, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65017), Interval::new(65137, 65137), Interval::new(65139, 65139), Interval::new(65143, 65143), Interval::new(65145, 65145), Interval::new(65147, 65147), Interval::new(65149, 65149), Interval::new(65151, 65276), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(65382, 65437), Interval::new(65440, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65856, 65908), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66304, 66335), Interval::new(66349, 66378), Interval::new(66384, 66421), Interval::new(66432, 66461), Interval::new(66464, 66499), Interval::new(66504, 66511), Interval::new(66513, 66517), Interval::new(66560, 66717), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67680, 67702), Interval::new(67712, 67742), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67840, 67861), Interval::new(67872, 67897), Interval::new(67968, 68023), Interval::new(68030, 68031), Interval::new(68096, 68096), Interval::new(68112, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68192, 68220), Interval::new(68224, 68252), Interval::new(68288, 68295), Interval::new(68297, 68324), Interval::new(68352, 68405), Interval::new(68416, 68437), Interval::new(68448, 68466), Interval::new(68480, 68497), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68864, 68899), Interval::new(69248, 69289), Interval::new(69296, 69297), Interval::new(69376, 69404), Interval::new(69415, 69415), Interval::new(69424, 69445), Interval::new(69488, 69505), Interval::new(69552, 69572), Interval::new(69600, 69622), Interval::new(69635, 69687), Interval::new(69745, 69746), Interval::new(69749, 69749), Interval::new(69763, 69807), Interval::new(69840, 69864), Interval::new(69891, 69926), Interval::new(69956, 69956), Interval::new(69959, 69959), Interval::new(69968, 70002), Interval::new(70006, 70006), Interval::new(70019, 70066), Interval::new(70081, 70084), Interval::new(70106, 70106), Interval::new(70108, 70108), Interval::new(70144, 70161), Interval::new(70163, 70187), Interval::new(70207, 70208), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70312), Interval::new(70320, 70366), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70461, 70461), Interval::new(70480, 70480), Interval::new(70493, 70497), Interval::new(70656, 70708), Interval::new(70727, 70730), Interval::new(70751, 70753), Interval::new(70784, 70831), Interval::new(70852, 70853), Interval::new(70855, 70855), Interval::new(71040, 71086), Interval::new(71128, 71131), Interval::new(71168, 71215), Interval::new(71236, 71236), Interval::new(71296, 71338), Interval::new(71352, 71352), Interval::new(71424, 71450), Interval::new(71488, 71494), Interval::new(71680, 71723), Interval::new(71840, 71903), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71983), Interval::new(71999, 71999), Interval::new(72001, 72001), Interval::new(72096, 72103), Interval::new(72106, 72144), Interval::new(72161, 72161), Interval::new(72163, 72163), Interval::new(72192, 72192), Interval::new(72203, 72242), Interval::new(72250, 72250), Interval::new(72272, 72272), Interval::new(72284, 72329), Interval::new(72349, 72349), Interval::new(72368, 72440), Interval::new(72704, 72712), Interval::new(72714, 72750), Interval::new(72768, 72768), Interval::new(72818, 72847), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73008), Interval::new(73030, 73030), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73097), Interval::new(73112, 73112), Interval::new(73440, 73458), Interval::new(73474, 73474), Interval::new(73476, 73488), Interval::new(73490, 73523), Interval::new(73648, 73648), Interval::new(73728, 74649), Interval::new(74752, 74862), Interval::new(74880, 75075), Interval::new(77712, 77808), Interval::new(77824, 78895), Interval::new(78913, 78918), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92784, 92862), Interval::new(92880, 92909), Interval::new(92928, 92975), Interval::new(92992, 92995), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93823), Interval::new(93952, 94026), Interval::new(94032, 94032), Interval::new(94099, 94111), Interval::new(94176, 94177), Interval::new(94179, 94179), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122928, 122989), Interval::new(123136, 123180), Interval::new(123191, 123197), Interval::new(123214, 123214), Interval::new(123536, 123565), Interval::new(123584, 123627), Interval::new(124112, 124139), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125184, 125251), Interval::new(125259, 125259), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'XID_Start' Unicode property. pub(crate) fn xid_start_ranges() -> &'static [Interval] { &XID_START } const ASCII_HEX_DIGIT: [Interval; 3] = [ Interval::new(48, 57), Interval::new(65, 70), Interval::new(97, 102), ]; /// Return the code point ranges of the 'ASCII_Hex_Digit' Unicode property. pub(crate) fn ascii_hex_digit_ranges() -> &'static [Interval] { &ASCII_HEX_DIGIT } const BIDI_CONTROL: [Interval; 4] = [ Interval::new(1564, 1564), Interval::new(8206, 8207), Interval::new(8234, 8238), Interval::new(8294, 8297), ]; /// Return the code point ranges of the 'Bidi_Control' Unicode property. pub(crate) fn bidi_control_ranges() -> &'static [Interval] { &BIDI_CONTROL } const DASH: [Interval; 23] = [ Interval::new(45, 45), Interval::new(1418, 1418), Interval::new(1470, 1470), Interval::new(5120, 5120), Interval::new(6150, 6150), Interval::new(8208, 8213), Interval::new(8275, 8275), Interval::new(8315, 8315), Interval::new(8331, 8331), Interval::new(8722, 8722), Interval::new(11799, 11799), Interval::new(11802, 11802), Interval::new(11834, 11835), Interval::new(11840, 11840), Interval::new(11869, 11869), Interval::new(12316, 12316), Interval::new(12336, 12336), Interval::new(12448, 12448), Interval::new(65073, 65074), Interval::new(65112, 65112), Interval::new(65123, 65123), Interval::new(65293, 65293), Interval::new(69293, 69293), ]; /// Return the code point ranges of the 'Dash' Unicode property. pub(crate) fn dash_ranges() -> &'static [Interval] { &DASH } const DEPRECATED: [Interval; 8] = [ Interval::new(329, 329), Interval::new(1651, 1651), Interval::new(3959, 3959), Interval::new(3961, 3961), Interval::new(6051, 6052), Interval::new(8298, 8303), Interval::new(9001, 9002), Interval::new(917505, 917505), ]; /// Return the code point ranges of the 'Deprecated' Unicode property. pub(crate) fn deprecated_ranges() -> &'static [Interval] { &DEPRECATED } const DIACRITIC: [Interval; 195] = [ Interval::new(94, 94), Interval::new(96, 96), Interval::new(168, 168), Interval::new(175, 175), Interval::new(180, 180), Interval::new(183, 184), Interval::new(688, 846), Interval::new(848, 855), Interval::new(861, 866), Interval::new(884, 885), Interval::new(890, 890), Interval::new(900, 901), Interval::new(1155, 1159), Interval::new(1369, 1369), Interval::new(1425, 1441), Interval::new(1443, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1476), Interval::new(1611, 1618), Interval::new(1623, 1624), Interval::new(1759, 1760), Interval::new(1765, 1766), Interval::new(1770, 1772), Interval::new(1840, 1866), Interval::new(1958, 1968), Interval::new(2027, 2037), Interval::new(2072, 2073), Interval::new(2200, 2207), Interval::new(2249, 2258), Interval::new(2275, 2302), Interval::new(2364, 2364), Interval::new(2381, 2381), Interval::new(2385, 2388), Interval::new(2417, 2417), Interval::new(2492, 2492), Interval::new(2509, 2509), Interval::new(2620, 2620), Interval::new(2637, 2637), Interval::new(2748, 2748), Interval::new(2765, 2765), Interval::new(2813, 2815), Interval::new(2876, 2876), Interval::new(2893, 2893), Interval::new(2901, 2901), Interval::new(3021, 3021), Interval::new(3132, 3132), Interval::new(3149, 3149), Interval::new(3260, 3260), Interval::new(3277, 3277), Interval::new(3387, 3388), Interval::new(3405, 3405), Interval::new(3530, 3530), Interval::new(3655, 3660), Interval::new(3662, 3662), Interval::new(3770, 3770), Interval::new(3784, 3788), Interval::new(3864, 3865), Interval::new(3893, 3893), Interval::new(3895, 3895), Interval::new(3897, 3897), Interval::new(3902, 3903), Interval::new(3970, 3972), Interval::new(3974, 3975), Interval::new(4038, 4038), Interval::new(4151, 4151), Interval::new(4153, 4154), Interval::new(4195, 4196), Interval::new(4201, 4205), Interval::new(4231, 4237), Interval::new(4239, 4239), Interval::new(4250, 4251), Interval::new(4957, 4959), Interval::new(5908, 5909), Interval::new(6089, 6099), Interval::new(6109, 6109), Interval::new(6457, 6459), Interval::new(6773, 6780), Interval::new(6783, 6783), Interval::new(6832, 6846), Interval::new(6849, 6859), Interval::new(6964, 6964), Interval::new(6980, 6980), Interval::new(7019, 7027), Interval::new(7082, 7083), Interval::new(7222, 7223), Interval::new(7288, 7293), Interval::new(7376, 7400), Interval::new(7405, 7405), Interval::new(7412, 7412), Interval::new(7415, 7417), Interval::new(7468, 7530), Interval::new(7620, 7631), Interval::new(7669, 7679), Interval::new(8125, 8125), Interval::new(8127, 8129), Interval::new(8141, 8143), Interval::new(8157, 8159), Interval::new(8173, 8175), Interval::new(8189, 8190), Interval::new(11503, 11505), Interval::new(11823, 11823), Interval::new(12330, 12335), Interval::new(12441, 12444), Interval::new(12540, 12540), Interval::new(42607, 42607), Interval::new(42620, 42621), Interval::new(42623, 42623), Interval::new(42652, 42653), Interval::new(42736, 42737), Interval::new(42752, 42785), Interval::new(42888, 42890), Interval::new(43000, 43001), Interval::new(43204, 43204), Interval::new(43232, 43249), Interval::new(43307, 43310), Interval::new(43347, 43347), Interval::new(43443, 43443), Interval::new(43456, 43456), Interval::new(43493, 43493), Interval::new(43643, 43645), Interval::new(43711, 43714), Interval::new(43766, 43766), Interval::new(43867, 43871), Interval::new(43881, 43883), Interval::new(44012, 44013), Interval::new(64286, 64286), Interval::new(65056, 65071), Interval::new(65342, 65342), Interval::new(65344, 65344), Interval::new(65392, 65392), Interval::new(65438, 65439), Interval::new(65507, 65507), Interval::new(66272, 66272), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(68325, 68326), Interval::new(68898, 68903), Interval::new(69373, 69375), Interval::new(69446, 69456), Interval::new(69506, 69509), Interval::new(69702, 69702), Interval::new(69744, 69744), Interval::new(69817, 69818), Interval::new(69939, 69940), Interval::new(70003, 70003), Interval::new(70080, 70080), Interval::new(70090, 70092), Interval::new(70197, 70198), Interval::new(70377, 70378), Interval::new(70460, 70460), Interval::new(70477, 70477), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70722, 70722), Interval::new(70726, 70726), Interval::new(70850, 70851), Interval::new(71103, 71104), Interval::new(71231, 71231), Interval::new(71350, 71351), Interval::new(71467, 71467), Interval::new(71737, 71738), Interval::new(71997, 71998), Interval::new(72003, 72003), Interval::new(72160, 72160), Interval::new(72244, 72244), Interval::new(72263, 72263), Interval::new(72345, 72345), Interval::new(72767, 72767), Interval::new(73026, 73026), Interval::new(73028, 73029), Interval::new(73111, 73111), Interval::new(78919, 78933), Interval::new(92912, 92916), Interval::new(92976, 92982), Interval::new(94095, 94111), Interval::new(94192, 94193), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119143, 119145), Interval::new(119149, 119154), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(122928, 122989), Interval::new(123184, 123190), Interval::new(123566, 123566), Interval::new(123628, 123631), Interval::new(125136, 125142), Interval::new(125252, 125254), Interval::new(125256, 125258), ]; /// Return the code point ranges of the 'Diacritic' Unicode property. pub(crate) fn diacritic_ranges() -> &'static [Interval] { &DIACRITIC } const EXTENDER: [Interval; 33] = [ Interval::new(183, 183), Interval::new(720, 721), Interval::new(1600, 1600), Interval::new(2042, 2042), Interval::new(2901, 2901), Interval::new(3654, 3654), Interval::new(3782, 3782), Interval::new(6154, 6154), Interval::new(6211, 6211), Interval::new(6823, 6823), Interval::new(7222, 7222), Interval::new(7291, 7291), Interval::new(12293, 12293), Interval::new(12337, 12341), Interval::new(12445, 12446), Interval::new(12540, 12542), Interval::new(40981, 40981), Interval::new(42508, 42508), Interval::new(43471, 43471), Interval::new(43494, 43494), Interval::new(43632, 43632), Interval::new(43741, 43741), Interval::new(43763, 43764), Interval::new(65392, 65392), Interval::new(67457, 67458), Interval::new(70493, 70493), Interval::new(71110, 71112), Interval::new(72344, 72344), Interval::new(92994, 92995), Interval::new(94176, 94177), Interval::new(94179, 94179), Interval::new(123196, 123197), Interval::new(125252, 125254), ]; /// Return the code point ranges of the 'Extender' Unicode property. pub(crate) fn extender_ranges() -> &'static [Interval] { &EXTENDER } const HEX_DIGIT: [Interval; 6] = [ Interval::new(48, 57), Interval::new(65, 70), Interval::new(97, 102), Interval::new(65296, 65305), Interval::new(65313, 65318), Interval::new(65345, 65350), ]; /// Return the code point ranges of the 'Hex_Digit' Unicode property. pub(crate) fn hex_digit_ranges() -> &'static [Interval] { &HEX_DIGIT } const IDS_BINARY_OPERATOR: [Interval; 3] = [ Interval::new(12272, 12273), Interval::new(12276, 12285), Interval::new(12783, 12783), ]; /// Return the code point ranges of the 'IDS_Binary_Operator' Unicode property. pub(crate) fn ids_binary_operator_ranges() -> &'static [Interval] { &IDS_BINARY_OPERATOR } const IDS_TRINARY_OPERATOR: [Interval; 1] = [Interval::new(12274, 12275)]; /// Return the code point ranges of the 'IDS_Trinary_Operator' Unicode property. pub(crate) fn ids_trinary_operator_ranges() -> &'static [Interval] { &IDS_TRINARY_OPERATOR } const IDEOGRAPHIC: [Interval; 21] = [ Interval::new(12294, 12295), Interval::new(12321, 12329), Interval::new(12344, 12346), Interval::new(13312, 19903), Interval::new(19968, 40959), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(94180, 94180), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110960, 111355), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'Ideographic' Unicode property. pub(crate) fn ideographic_ranges() -> &'static [Interval] { &IDEOGRAPHIC } const JOIN_CONTROL: [Interval; 1] = [Interval::new(8204, 8205)]; /// Return the code point ranges of the 'Join_Control' Unicode property. pub(crate) fn join_control_ranges() -> &'static [Interval] { &JOIN_CONTROL } const LOGICAL_ORDER_EXCEPTION: [Interval; 7] = [ Interval::new(3648, 3652), Interval::new(3776, 3780), Interval::new(6581, 6583), Interval::new(6586, 6586), Interval::new(43701, 43702), Interval::new(43705, 43705), Interval::new(43707, 43708), ]; /// Return the code point ranges of the 'Logical_Order_Exception' Unicode property. pub(crate) fn logical_order_exception_ranges() -> &'static [Interval] { &LOGICAL_ORDER_EXCEPTION } const LOWERCASE: [Interval; 671] = [ Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(186, 186), Interval::new(223, 246), Interval::new(248, 255), Interval::new(257, 257), Interval::new(259, 259), Interval::new(261, 261), Interval::new(263, 263), Interval::new(265, 265), Interval::new(267, 267), Interval::new(269, 269), Interval::new(271, 271), Interval::new(273, 273), Interval::new(275, 275), Interval::new(277, 277), Interval::new(279, 279), Interval::new(281, 281), Interval::new(283, 283), Interval::new(285, 285), Interval::new(287, 287), Interval::new(289, 289), Interval::new(291, 291), Interval::new(293, 293), Interval::new(295, 295), Interval::new(297, 297), Interval::new(299, 299), Interval::new(301, 301), Interval::new(303, 303), Interval::new(305, 305), Interval::new(307, 307), Interval::new(309, 309), Interval::new(311, 312), Interval::new(314, 314), Interval::new(316, 316), Interval::new(318, 318), Interval::new(320, 320), Interval::new(322, 322), Interval::new(324, 324), Interval::new(326, 326), Interval::new(328, 329), Interval::new(331, 331), Interval::new(333, 333), Interval::new(335, 335), Interval::new(337, 337), Interval::new(339, 339), Interval::new(341, 341), Interval::new(343, 343), Interval::new(345, 345), Interval::new(347, 347), Interval::new(349, 349), Interval::new(351, 351), Interval::new(353, 353), Interval::new(355, 355), Interval::new(357, 357), Interval::new(359, 359), Interval::new(361, 361), Interval::new(363, 363), Interval::new(365, 365), Interval::new(367, 367), Interval::new(369, 369), Interval::new(371, 371), Interval::new(373, 373), Interval::new(375, 375), Interval::new(378, 378), Interval::new(380, 380), Interval::new(382, 384), Interval::new(387, 387), Interval::new(389, 389), Interval::new(392, 392), Interval::new(396, 397), Interval::new(402, 402), Interval::new(405, 405), Interval::new(409, 411), Interval::new(414, 414), Interval::new(417, 417), Interval::new(419, 419), Interval::new(421, 421), Interval::new(424, 424), Interval::new(426, 427), Interval::new(429, 429), Interval::new(432, 432), Interval::new(436, 436), Interval::new(438, 438), Interval::new(441, 442), Interval::new(445, 447), Interval::new(454, 454), Interval::new(457, 457), Interval::new(460, 460), Interval::new(462, 462), Interval::new(464, 464), Interval::new(466, 466), Interval::new(468, 468), Interval::new(470, 470), Interval::new(472, 472), Interval::new(474, 474), Interval::new(476, 477), Interval::new(479, 479), Interval::new(481, 481), Interval::new(483, 483), Interval::new(485, 485), Interval::new(487, 487), Interval::new(489, 489), Interval::new(491, 491), Interval::new(493, 493), Interval::new(495, 496), Interval::new(499, 499), Interval::new(501, 501), Interval::new(505, 505), Interval::new(507, 507), Interval::new(509, 509), Interval::new(511, 511), Interval::new(513, 513), Interval::new(515, 515), Interval::new(517, 517), Interval::new(519, 519), Interval::new(521, 521), Interval::new(523, 523), Interval::new(525, 525), Interval::new(527, 527), Interval::new(529, 529), Interval::new(531, 531), Interval::new(533, 533), Interval::new(535, 535), Interval::new(537, 537), Interval::new(539, 539), Interval::new(541, 541), Interval::new(543, 543), Interval::new(545, 545), Interval::new(547, 547), Interval::new(549, 549), Interval::new(551, 551), Interval::new(553, 553), Interval::new(555, 555), Interval::new(557, 557), Interval::new(559, 559), Interval::new(561, 561), Interval::new(563, 569), Interval::new(572, 572), Interval::new(575, 576), Interval::new(578, 578), Interval::new(583, 583), Interval::new(585, 585), Interval::new(587, 587), Interval::new(589, 589), Interval::new(591, 659), Interval::new(661, 696), Interval::new(704, 705), Interval::new(736, 740), Interval::new(837, 837), Interval::new(881, 881), Interval::new(883, 883), Interval::new(887, 887), Interval::new(890, 893), Interval::new(912, 912), Interval::new(940, 974), Interval::new(976, 977), Interval::new(981, 983), Interval::new(985, 985), Interval::new(987, 987), Interval::new(989, 989), Interval::new(991, 991), Interval::new(993, 993), Interval::new(995, 995), Interval::new(997, 997), Interval::new(999, 999), Interval::new(1001, 1001), Interval::new(1003, 1003), Interval::new(1005, 1005), Interval::new(1007, 1011), Interval::new(1013, 1013), Interval::new(1016, 1016), Interval::new(1019, 1020), Interval::new(1072, 1119), Interval::new(1121, 1121), Interval::new(1123, 1123), Interval::new(1125, 1125), Interval::new(1127, 1127), Interval::new(1129, 1129), Interval::new(1131, 1131), Interval::new(1133, 1133), Interval::new(1135, 1135), Interval::new(1137, 1137), Interval::new(1139, 1139), Interval::new(1141, 1141), Interval::new(1143, 1143), Interval::new(1145, 1145), Interval::new(1147, 1147), Interval::new(1149, 1149), Interval::new(1151, 1151), Interval::new(1153, 1153), Interval::new(1163, 1163), Interval::new(1165, 1165), Interval::new(1167, 1167), Interval::new(1169, 1169), Interval::new(1171, 1171), Interval::new(1173, 1173), Interval::new(1175, 1175), Interval::new(1177, 1177), Interval::new(1179, 1179), Interval::new(1181, 1181), Interval::new(1183, 1183), Interval::new(1185, 1185), Interval::new(1187, 1187), Interval::new(1189, 1189), Interval::new(1191, 1191), Interval::new(1193, 1193), Interval::new(1195, 1195), Interval::new(1197, 1197), Interval::new(1199, 1199), Interval::new(1201, 1201), Interval::new(1203, 1203), Interval::new(1205, 1205), Interval::new(1207, 1207), Interval::new(1209, 1209), Interval::new(1211, 1211), Interval::new(1213, 1213), Interval::new(1215, 1215), Interval::new(1218, 1218), Interval::new(1220, 1220), Interval::new(1222, 1222), Interval::new(1224, 1224), Interval::new(1226, 1226), Interval::new(1228, 1228), Interval::new(1230, 1231), Interval::new(1233, 1233), Interval::new(1235, 1235), Interval::new(1237, 1237), Interval::new(1239, 1239), Interval::new(1241, 1241), Interval::new(1243, 1243), Interval::new(1245, 1245), Interval::new(1247, 1247), Interval::new(1249, 1249), Interval::new(1251, 1251), Interval::new(1253, 1253), Interval::new(1255, 1255), Interval::new(1257, 1257), Interval::new(1259, 1259), Interval::new(1261, 1261), Interval::new(1263, 1263), Interval::new(1265, 1265), Interval::new(1267, 1267), Interval::new(1269, 1269), Interval::new(1271, 1271), Interval::new(1273, 1273), Interval::new(1275, 1275), Interval::new(1277, 1277), Interval::new(1279, 1279), Interval::new(1281, 1281), Interval::new(1283, 1283), Interval::new(1285, 1285), Interval::new(1287, 1287), Interval::new(1289, 1289), Interval::new(1291, 1291), Interval::new(1293, 1293), Interval::new(1295, 1295), Interval::new(1297, 1297), Interval::new(1299, 1299), Interval::new(1301, 1301), Interval::new(1303, 1303), Interval::new(1305, 1305), Interval::new(1307, 1307), Interval::new(1309, 1309), Interval::new(1311, 1311), Interval::new(1313, 1313), Interval::new(1315, 1315), Interval::new(1317, 1317), Interval::new(1319, 1319), Interval::new(1321, 1321), Interval::new(1323, 1323), Interval::new(1325, 1325), Interval::new(1327, 1327), Interval::new(1376, 1416), Interval::new(4304, 4346), Interval::new(4348, 4351), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7424, 7615), Interval::new(7681, 7681), Interval::new(7683, 7683), Interval::new(7685, 7685), Interval::new(7687, 7687), Interval::new(7689, 7689), Interval::new(7691, 7691), Interval::new(7693, 7693), Interval::new(7695, 7695), Interval::new(7697, 7697), Interval::new(7699, 7699), Interval::new(7701, 7701), Interval::new(7703, 7703), Interval::new(7705, 7705), Interval::new(7707, 7707), Interval::new(7709, 7709), Interval::new(7711, 7711), Interval::new(7713, 7713), Interval::new(7715, 7715), Interval::new(7717, 7717), Interval::new(7719, 7719), Interval::new(7721, 7721), Interval::new(7723, 7723), Interval::new(7725, 7725), Interval::new(7727, 7727), Interval::new(7729, 7729), Interval::new(7731, 7731), Interval::new(7733, 7733), Interval::new(7735, 7735), Interval::new(7737, 7737), Interval::new(7739, 7739), Interval::new(7741, 7741), Interval::new(7743, 7743), Interval::new(7745, 7745), Interval::new(7747, 7747), Interval::new(7749, 7749), Interval::new(7751, 7751), Interval::new(7753, 7753), Interval::new(7755, 7755), Interval::new(7757, 7757), Interval::new(7759, 7759), Interval::new(7761, 7761), Interval::new(7763, 7763), Interval::new(7765, 7765), Interval::new(7767, 7767), Interval::new(7769, 7769), Interval::new(7771, 7771), Interval::new(7773, 7773), Interval::new(7775, 7775), Interval::new(7777, 7777), Interval::new(7779, 7779), Interval::new(7781, 7781), Interval::new(7783, 7783), Interval::new(7785, 7785), Interval::new(7787, 7787), Interval::new(7789, 7789), Interval::new(7791, 7791), Interval::new(7793, 7793), Interval::new(7795, 7795), Interval::new(7797, 7797), Interval::new(7799, 7799), Interval::new(7801, 7801), Interval::new(7803, 7803), Interval::new(7805, 7805), Interval::new(7807, 7807), Interval::new(7809, 7809), Interval::new(7811, 7811), Interval::new(7813, 7813), Interval::new(7815, 7815), Interval::new(7817, 7817), Interval::new(7819, 7819), Interval::new(7821, 7821), Interval::new(7823, 7823), Interval::new(7825, 7825), Interval::new(7827, 7827), Interval::new(7829, 7837), Interval::new(7839, 7839), Interval::new(7841, 7841), Interval::new(7843, 7843), Interval::new(7845, 7845), Interval::new(7847, 7847), Interval::new(7849, 7849), Interval::new(7851, 7851), Interval::new(7853, 7853), Interval::new(7855, 7855), Interval::new(7857, 7857), Interval::new(7859, 7859), Interval::new(7861, 7861), Interval::new(7863, 7863), Interval::new(7865, 7865), Interval::new(7867, 7867), Interval::new(7869, 7869), Interval::new(7871, 7871), Interval::new(7873, 7873), Interval::new(7875, 7875), Interval::new(7877, 7877), Interval::new(7879, 7879), Interval::new(7881, 7881), Interval::new(7883, 7883), Interval::new(7885, 7885), Interval::new(7887, 7887), Interval::new(7889, 7889), Interval::new(7891, 7891), Interval::new(7893, 7893), Interval::new(7895, 7895), Interval::new(7897, 7897), Interval::new(7899, 7899), Interval::new(7901, 7901), Interval::new(7903, 7903), Interval::new(7905, 7905), Interval::new(7907, 7907), Interval::new(7909, 7909), Interval::new(7911, 7911), Interval::new(7913, 7913), Interval::new(7915, 7915), Interval::new(7917, 7917), Interval::new(7919, 7919), Interval::new(7921, 7921), Interval::new(7923, 7923), Interval::new(7925, 7925), Interval::new(7927, 7927), Interval::new(7929, 7929), Interval::new(7931, 7931), Interval::new(7933, 7933), Interval::new(7935, 7943), Interval::new(7952, 7957), Interval::new(7968, 7975), Interval::new(7984, 7991), Interval::new(8000, 8005), Interval::new(8016, 8023), Interval::new(8032, 8039), Interval::new(8048, 8061), Interval::new(8064, 8071), Interval::new(8080, 8087), Interval::new(8096, 8103), Interval::new(8112, 8116), Interval::new(8118, 8119), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8135), Interval::new(8144, 8147), Interval::new(8150, 8151), Interval::new(8160, 8167), Interval::new(8178, 8180), Interval::new(8182, 8183), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8458, 8458), Interval::new(8462, 8463), Interval::new(8467, 8467), Interval::new(8495, 8495), Interval::new(8500, 8500), Interval::new(8505, 8505), Interval::new(8508, 8509), Interval::new(8518, 8521), Interval::new(8526, 8526), Interval::new(8560, 8575), Interval::new(8580, 8580), Interval::new(9424, 9449), Interval::new(11312, 11359), Interval::new(11361, 11361), Interval::new(11365, 11366), Interval::new(11368, 11368), Interval::new(11370, 11370), Interval::new(11372, 11372), Interval::new(11377, 11377), Interval::new(11379, 11380), Interval::new(11382, 11389), Interval::new(11393, 11393), Interval::new(11395, 11395), Interval::new(11397, 11397), Interval::new(11399, 11399), Interval::new(11401, 11401), Interval::new(11403, 11403), Interval::new(11405, 11405), Interval::new(11407, 11407), Interval::new(11409, 11409), Interval::new(11411, 11411), Interval::new(11413, 11413), Interval::new(11415, 11415), Interval::new(11417, 11417), Interval::new(11419, 11419), Interval::new(11421, 11421), Interval::new(11423, 11423), Interval::new(11425, 11425), Interval::new(11427, 11427), Interval::new(11429, 11429), Interval::new(11431, 11431), Interval::new(11433, 11433), Interval::new(11435, 11435), Interval::new(11437, 11437), Interval::new(11439, 11439), Interval::new(11441, 11441), Interval::new(11443, 11443), Interval::new(11445, 11445), Interval::new(11447, 11447), Interval::new(11449, 11449), Interval::new(11451, 11451), Interval::new(11453, 11453), Interval::new(11455, 11455), Interval::new(11457, 11457), Interval::new(11459, 11459), Interval::new(11461, 11461), Interval::new(11463, 11463), Interval::new(11465, 11465), Interval::new(11467, 11467), Interval::new(11469, 11469), Interval::new(11471, 11471), Interval::new(11473, 11473), Interval::new(11475, 11475), Interval::new(11477, 11477), Interval::new(11479, 11479), Interval::new(11481, 11481), Interval::new(11483, 11483), Interval::new(11485, 11485), Interval::new(11487, 11487), Interval::new(11489, 11489), Interval::new(11491, 11492), Interval::new(11500, 11500), Interval::new(11502, 11502), Interval::new(11507, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(42561, 42561), Interval::new(42563, 42563), Interval::new(42565, 42565), Interval::new(42567, 42567), Interval::new(42569, 42569), Interval::new(42571, 42571), Interval::new(42573, 42573), Interval::new(42575, 42575), Interval::new(42577, 42577), Interval::new(42579, 42579), Interval::new(42581, 42581), Interval::new(42583, 42583), Interval::new(42585, 42585), Interval::new(42587, 42587), Interval::new(42589, 42589), Interval::new(42591, 42591), Interval::new(42593, 42593), Interval::new(42595, 42595), Interval::new(42597, 42597), Interval::new(42599, 42599), Interval::new(42601, 42601), Interval::new(42603, 42603), Interval::new(42605, 42605), Interval::new(42625, 42625), Interval::new(42627, 42627), Interval::new(42629, 42629), Interval::new(42631, 42631), Interval::new(42633, 42633), Interval::new(42635, 42635), Interval::new(42637, 42637), Interval::new(42639, 42639), Interval::new(42641, 42641), Interval::new(42643, 42643), Interval::new(42645, 42645), Interval::new(42647, 42647), Interval::new(42649, 42649), Interval::new(42651, 42653), Interval::new(42787, 42787), Interval::new(42789, 42789), Interval::new(42791, 42791), Interval::new(42793, 42793), Interval::new(42795, 42795), Interval::new(42797, 42797), Interval::new(42799, 42801), Interval::new(42803, 42803), Interval::new(42805, 42805), Interval::new(42807, 42807), Interval::new(42809, 42809), Interval::new(42811, 42811), Interval::new(42813, 42813), Interval::new(42815, 42815), Interval::new(42817, 42817), Interval::new(42819, 42819), Interval::new(42821, 42821), Interval::new(42823, 42823), Interval::new(42825, 42825), Interval::new(42827, 42827), Interval::new(42829, 42829), Interval::new(42831, 42831), Interval::new(42833, 42833), Interval::new(42835, 42835), Interval::new(42837, 42837), Interval::new(42839, 42839), Interval::new(42841, 42841), Interval::new(42843, 42843), Interval::new(42845, 42845), Interval::new(42847, 42847), Interval::new(42849, 42849), Interval::new(42851, 42851), Interval::new(42853, 42853), Interval::new(42855, 42855), Interval::new(42857, 42857), Interval::new(42859, 42859), Interval::new(42861, 42861), Interval::new(42863, 42872), Interval::new(42874, 42874), Interval::new(42876, 42876), Interval::new(42879, 42879), Interval::new(42881, 42881), Interval::new(42883, 42883), Interval::new(42885, 42885), Interval::new(42887, 42887), Interval::new(42892, 42892), Interval::new(42894, 42894), Interval::new(42897, 42897), Interval::new(42899, 42901), Interval::new(42903, 42903), Interval::new(42905, 42905), Interval::new(42907, 42907), Interval::new(42909, 42909), Interval::new(42911, 42911), Interval::new(42913, 42913), Interval::new(42915, 42915), Interval::new(42917, 42917), Interval::new(42919, 42919), Interval::new(42921, 42921), Interval::new(42927, 42927), Interval::new(42933, 42933), Interval::new(42935, 42935), Interval::new(42937, 42937), Interval::new(42939, 42939), Interval::new(42941, 42941), Interval::new(42943, 42943), Interval::new(42945, 42945), Interval::new(42947, 42947), Interval::new(42952, 42952), Interval::new(42954, 42954), Interval::new(42961, 42961), Interval::new(42963, 42963), Interval::new(42965, 42965), Interval::new(42967, 42967), Interval::new(42969, 42969), Interval::new(42994, 42996), Interval::new(42998, 42998), Interval::new(43000, 43002), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65345, 65370), Interval::new(66600, 66639), Interval::new(66776, 66811), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67456, 67456), Interval::new(67459, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(68800, 68850), Interval::new(71872, 71903), Interval::new(93792, 93823), Interval::new(119834, 119859), Interval::new(119886, 119892), Interval::new(119894, 119911), Interval::new(119938, 119963), Interval::new(119990, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120015), Interval::new(120042, 120067), Interval::new(120094, 120119), Interval::new(120146, 120171), Interval::new(120198, 120223), Interval::new(120250, 120275), Interval::new(120302, 120327), Interval::new(120354, 120379), Interval::new(120406, 120431), Interval::new(120458, 120485), Interval::new(120514, 120538), Interval::new(120540, 120545), Interval::new(120572, 120596), Interval::new(120598, 120603), Interval::new(120630, 120654), Interval::new(120656, 120661), Interval::new(120688, 120712), Interval::new(120714, 120719), Interval::new(120746, 120770), Interval::new(120772, 120777), Interval::new(120779, 120779), Interval::new(122624, 122633), Interval::new(122635, 122654), Interval::new(122661, 122666), Interval::new(122928, 122989), Interval::new(125218, 125251), ]; /// Return the code point ranges of the 'Lowercase' Unicode property. pub(crate) fn lowercase_ranges() -> &'static [Interval] { &LOWERCASE } const NONCHARACTER_CODE_POINT: [Interval; 18] = [ Interval::new(64976, 65007), Interval::new(65534, 65535), Interval::new(131070, 131071), Interval::new(196606, 196607), Interval::new(262142, 262143), Interval::new(327678, 327679), Interval::new(393214, 393215), Interval::new(458750, 458751), Interval::new(524286, 524287), Interval::new(589822, 589823), Interval::new(655358, 655359), Interval::new(720894, 720895), Interval::new(786430, 786431), Interval::new(851966, 851967), Interval::new(917502, 917503), Interval::new(983038, 983039), Interval::new(1048574, 1048575), Interval::new(1114110, 1114111), ]; /// Return the code point ranges of the 'Noncharacter_Code_Point' Unicode property. pub(crate) fn noncharacter_code_point_ranges() -> &'static [Interval] { &NONCHARACTER_CODE_POINT } const PATTERN_SYNTAX: [Interval; 28] = [ Interval::new(33, 47), Interval::new(58, 64), Interval::new(91, 94), Interval::new(96, 96), Interval::new(123, 126), Interval::new(161, 167), Interval::new(169, 169), Interval::new(171, 172), Interval::new(174, 174), Interval::new(176, 177), Interval::new(182, 182), Interval::new(187, 187), Interval::new(191, 191), Interval::new(215, 215), Interval::new(247, 247), Interval::new(8208, 8231), Interval::new(8240, 8254), Interval::new(8257, 8275), Interval::new(8277, 8286), Interval::new(8592, 9311), Interval::new(9472, 10101), Interval::new(10132, 11263), Interval::new(11776, 11903), Interval::new(12289, 12291), Interval::new(12296, 12320), Interval::new(12336, 12336), Interval::new(64830, 64831), Interval::new(65093, 65094), ]; /// Return the code point ranges of the 'Pattern_Syntax' Unicode property. pub(crate) fn pattern_syntax_ranges() -> &'static [Interval] { &PATTERN_SYNTAX } const PATTERN_WHITE_SPACE: [Interval; 5] = [ Interval::new(9, 13), Interval::new(32, 32), Interval::new(133, 133), Interval::new(8206, 8207), Interval::new(8232, 8233), ]; /// Return the code point ranges of the 'Pattern_White_Space' Unicode property. pub(crate) fn pattern_white_space_ranges() -> &'static [Interval] { &PATTERN_WHITE_SPACE } const QUOTATION_MARK: [Interval; 13] = [ Interval::new(34, 34), Interval::new(39, 39), Interval::new(171, 171), Interval::new(187, 187), Interval::new(8216, 8223), Interval::new(8249, 8250), Interval::new(11842, 11842), Interval::new(12300, 12303), Interval::new(12317, 12319), Interval::new(65089, 65092), Interval::new(65282, 65282), Interval::new(65287, 65287), Interval::new(65378, 65379), ]; /// Return the code point ranges of the 'Quotation_Mark' Unicode property. pub(crate) fn quotation_mark_ranges() -> &'static [Interval] { "ATION_MARK } const RADICAL: [Interval; 3] = [ Interval::new(11904, 11929), Interval::new(11931, 12019), Interval::new(12032, 12245), ]; /// Return the code point ranges of the 'Radical' Unicode property. pub(crate) fn radical_ranges() -> &'static [Interval] { &RADICAL } const REGIONAL_INDICATOR: [Interval; 1] = [Interval::new(127462, 127487)]; /// Return the code point ranges of the 'Regional_Indicator' Unicode property. pub(crate) fn regional_indicator_ranges() -> &'static [Interval] { ®IONAL_INDICATOR } const SENTENCE_TERMINAL: [Interval; 81] = [ Interval::new(33, 33), Interval::new(46, 46), Interval::new(63, 63), Interval::new(1417, 1417), Interval::new(1565, 1567), Interval::new(1748, 1748), Interval::new(1792, 1794), Interval::new(2041, 2041), Interval::new(2103, 2103), Interval::new(2105, 2105), Interval::new(2109, 2110), Interval::new(2404, 2405), Interval::new(4170, 4171), Interval::new(4962, 4962), Interval::new(4967, 4968), Interval::new(5742, 5742), Interval::new(5941, 5942), Interval::new(6100, 6101), Interval::new(6147, 6147), Interval::new(6153, 6153), Interval::new(6468, 6469), Interval::new(6824, 6827), Interval::new(7002, 7003), Interval::new(7006, 7007), Interval::new(7037, 7038), Interval::new(7227, 7228), Interval::new(7294, 7295), Interval::new(8252, 8253), Interval::new(8263, 8265), Interval::new(11822, 11822), Interval::new(11836, 11836), Interval::new(11859, 11860), Interval::new(12290, 12290), Interval::new(42239, 42239), Interval::new(42510, 42511), Interval::new(42739, 42739), Interval::new(42743, 42743), Interval::new(43126, 43127), Interval::new(43214, 43215), Interval::new(43311, 43311), Interval::new(43464, 43465), Interval::new(43613, 43615), Interval::new(43760, 43761), Interval::new(44011, 44011), Interval::new(65106, 65106), Interval::new(65110, 65111), Interval::new(65281, 65281), Interval::new(65294, 65294), Interval::new(65311, 65311), Interval::new(65377, 65377), Interval::new(68182, 68183), Interval::new(69461, 69465), Interval::new(69510, 69513), Interval::new(69703, 69704), Interval::new(69822, 69825), Interval::new(69953, 69955), Interval::new(70085, 70086), Interval::new(70093, 70093), Interval::new(70110, 70111), Interval::new(70200, 70201), Interval::new(70203, 70204), Interval::new(70313, 70313), Interval::new(70731, 70732), Interval::new(71106, 71107), Interval::new(71113, 71127), Interval::new(71233, 71234), Interval::new(71484, 71486), Interval::new(72004, 72004), Interval::new(72006, 72006), Interval::new(72258, 72259), Interval::new(72347, 72348), Interval::new(72769, 72770), Interval::new(73463, 73464), Interval::new(73539, 73540), Interval::new(92782, 92783), Interval::new(92917, 92917), Interval::new(92983, 92984), Interval::new(92996, 92996), Interval::new(93848, 93848), Interval::new(113823, 113823), Interval::new(121480, 121480), ]; /// Return the code point ranges of the 'Sentence_Terminal' Unicode property. pub(crate) fn sentence_terminal_ranges() -> &'static [Interval] { &SENTENCE_TERMINAL } const SOFT_DOTTED: [Interval; 34] = [ Interval::new(105, 106), Interval::new(303, 303), Interval::new(585, 585), Interval::new(616, 616), Interval::new(669, 669), Interval::new(690, 690), Interval::new(1011, 1011), Interval::new(1110, 1110), Interval::new(1112, 1112), Interval::new(7522, 7522), Interval::new(7574, 7574), Interval::new(7588, 7588), Interval::new(7592, 7592), Interval::new(7725, 7725), Interval::new(7883, 7883), Interval::new(8305, 8305), Interval::new(8520, 8521), Interval::new(11388, 11388), Interval::new(119842, 119843), Interval::new(119894, 119895), Interval::new(119946, 119947), Interval::new(119998, 119999), Interval::new(120050, 120051), Interval::new(120102, 120103), Interval::new(120154, 120155), Interval::new(120206, 120207), Interval::new(120258, 120259), Interval::new(120310, 120311), Interval::new(120362, 120363), Interval::new(120414, 120415), Interval::new(120466, 120467), Interval::new(122650, 122650), Interval::new(122956, 122957), Interval::new(122984, 122984), ]; /// Return the code point ranges of the 'Soft_Dotted' Unicode property. pub(crate) fn soft_dotted_ranges() -> &'static [Interval] { &SOFT_DOTTED } const TERMINAL_PUNCTUATION: [Interval; 108] = [ Interval::new(33, 33), Interval::new(44, 44), Interval::new(46, 46), Interval::new(58, 59), Interval::new(63, 63), Interval::new(894, 894), Interval::new(903, 903), Interval::new(1417, 1417), Interval::new(1475, 1475), Interval::new(1548, 1548), Interval::new(1563, 1563), Interval::new(1565, 1567), Interval::new(1748, 1748), Interval::new(1792, 1802), Interval::new(1804, 1804), Interval::new(2040, 2041), Interval::new(2096, 2110), Interval::new(2142, 2142), Interval::new(2404, 2405), Interval::new(3674, 3675), Interval::new(3848, 3848), Interval::new(3853, 3858), Interval::new(4170, 4171), Interval::new(4961, 4968), Interval::new(5742, 5742), Interval::new(5867, 5869), Interval::new(5941, 5942), Interval::new(6100, 6102), Interval::new(6106, 6106), Interval::new(6146, 6149), Interval::new(6152, 6153), Interval::new(6468, 6469), Interval::new(6824, 6827), Interval::new(7002, 7003), Interval::new(7005, 7007), Interval::new(7037, 7038), Interval::new(7227, 7231), Interval::new(7294, 7295), Interval::new(8252, 8253), Interval::new(8263, 8265), Interval::new(11822, 11822), Interval::new(11836, 11836), Interval::new(11841, 11841), Interval::new(11852, 11852), Interval::new(11854, 11855), Interval::new(11859, 11860), Interval::new(12289, 12290), Interval::new(42238, 42239), Interval::new(42509, 42511), Interval::new(42739, 42743), Interval::new(43126, 43127), Interval::new(43214, 43215), Interval::new(43311, 43311), Interval::new(43463, 43465), Interval::new(43613, 43615), Interval::new(43743, 43743), Interval::new(43760, 43761), Interval::new(44011, 44011), Interval::new(65104, 65106), Interval::new(65108, 65111), Interval::new(65281, 65281), Interval::new(65292, 65292), Interval::new(65294, 65294), Interval::new(65306, 65307), Interval::new(65311, 65311), Interval::new(65377, 65377), Interval::new(65380, 65380), Interval::new(66463, 66463), Interval::new(66512, 66512), Interval::new(67671, 67671), Interval::new(67871, 67871), Interval::new(68182, 68183), Interval::new(68336, 68341), Interval::new(68410, 68415), Interval::new(68505, 68508), Interval::new(69461, 69465), Interval::new(69510, 69513), Interval::new(69703, 69709), Interval::new(69822, 69825), Interval::new(69953, 69955), Interval::new(70085, 70086), Interval::new(70093, 70093), Interval::new(70110, 70111), Interval::new(70200, 70204), Interval::new(70313, 70313), Interval::new(70731, 70733), Interval::new(70746, 70747), Interval::new(71106, 71109), Interval::new(71113, 71127), Interval::new(71233, 71234), Interval::new(71484, 71486), Interval::new(72004, 72004), Interval::new(72006, 72006), Interval::new(72258, 72259), Interval::new(72347, 72348), Interval::new(72353, 72354), Interval::new(72769, 72771), Interval::new(72817, 72817), Interval::new(73463, 73464), Interval::new(73539, 73540), Interval::new(74864, 74868), Interval::new(92782, 92783), Interval::new(92917, 92917), Interval::new(92983, 92985), Interval::new(92996, 92996), Interval::new(93847, 93848), Interval::new(113823, 113823), Interval::new(121479, 121482), ]; /// Return the code point ranges of the 'Terminal_Punctuation' Unicode property. pub(crate) fn terminal_punctuation_ranges() -> &'static [Interval] { &TERMINAL_PUNCTUATION } const UNIFIED_IDEOGRAPH: [Interval; 17] = [ Interval::new(13312, 19903), Interval::new(19968, 40959), Interval::new(64014, 64015), Interval::new(64017, 64017), Interval::new(64019, 64020), Interval::new(64031, 64031), Interval::new(64033, 64033), Interval::new(64035, 64036), Interval::new(64039, 64041), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'Unified_Ideograph' Unicode property. pub(crate) fn unified_ideograph_ranges() -> &'static [Interval] { &UNIFIED_IDEOGRAPH } const UPPERCASE: [Interval; 651] = [ Interval::new(65, 90), Interval::new(192, 214), Interval::new(216, 222), Interval::new(256, 256), Interval::new(258, 258), Interval::new(260, 260), Interval::new(262, 262), Interval::new(264, 264), Interval::new(266, 266), Interval::new(268, 268), Interval::new(270, 270), Interval::new(272, 272), Interval::new(274, 274), Interval::new(276, 276), Interval::new(278, 278), Interval::new(280, 280), Interval::new(282, 282), Interval::new(284, 284), Interval::new(286, 286), Interval::new(288, 288), Interval::new(290, 290), Interval::new(292, 292), Interval::new(294, 294), Interval::new(296, 296), Interval::new(298, 298), Interval::new(300, 300), Interval::new(302, 302), Interval::new(304, 304), Interval::new(306, 306), Interval::new(308, 308), Interval::new(310, 310), Interval::new(313, 313), Interval::new(315, 315), Interval::new(317, 317), Interval::new(319, 319), Interval::new(321, 321), Interval::new(323, 323), Interval::new(325, 325), Interval::new(327, 327), Interval::new(330, 330), Interval::new(332, 332), Interval::new(334, 334), Interval::new(336, 336), Interval::new(338, 338), Interval::new(340, 340), Interval::new(342, 342), Interval::new(344, 344), Interval::new(346, 346), Interval::new(348, 348), Interval::new(350, 350), Interval::new(352, 352), Interval::new(354, 354), Interval::new(356, 356), Interval::new(358, 358), Interval::new(360, 360), Interval::new(362, 362), Interval::new(364, 364), Interval::new(366, 366), Interval::new(368, 368), Interval::new(370, 370), Interval::new(372, 372), Interval::new(374, 374), Interval::new(376, 377), Interval::new(379, 379), Interval::new(381, 381), Interval::new(385, 386), Interval::new(388, 388), Interval::new(390, 391), Interval::new(393, 395), Interval::new(398, 401), Interval::new(403, 404), Interval::new(406, 408), Interval::new(412, 413), Interval::new(415, 416), Interval::new(418, 418), Interval::new(420, 420), Interval::new(422, 423), Interval::new(425, 425), Interval::new(428, 428), Interval::new(430, 431), Interval::new(433, 435), Interval::new(437, 437), Interval::new(439, 440), Interval::new(444, 444), Interval::new(452, 452), Interval::new(455, 455), Interval::new(458, 458), Interval::new(461, 461), Interval::new(463, 463), Interval::new(465, 465), Interval::new(467, 467), Interval::new(469, 469), Interval::new(471, 471), Interval::new(473, 473), Interval::new(475, 475), Interval::new(478, 478), Interval::new(480, 480), Interval::new(482, 482), Interval::new(484, 484), Interval::new(486, 486), Interval::new(488, 488), Interval::new(490, 490), Interval::new(492, 492), Interval::new(494, 494), Interval::new(497, 497), Interval::new(500, 500), Interval::new(502, 504), Interval::new(506, 506), Interval::new(508, 508), Interval::new(510, 510), Interval::new(512, 512), Interval::new(514, 514), Interval::new(516, 516), Interval::new(518, 518), Interval::new(520, 520), Interval::new(522, 522), Interval::new(524, 524), Interval::new(526, 526), Interval::new(528, 528), Interval::new(530, 530), Interval::new(532, 532), Interval::new(534, 534), Interval::new(536, 536), Interval::new(538, 538), Interval::new(540, 540), Interval::new(542, 542), Interval::new(544, 544), Interval::new(546, 546), Interval::new(548, 548), Interval::new(550, 550), Interval::new(552, 552), Interval::new(554, 554), Interval::new(556, 556), Interval::new(558, 558), Interval::new(560, 560), Interval::new(562, 562), Interval::new(570, 571), Interval::new(573, 574), Interval::new(577, 577), Interval::new(579, 582), Interval::new(584, 584), Interval::new(586, 586), Interval::new(588, 588), Interval::new(590, 590), Interval::new(880, 880), Interval::new(882, 882), Interval::new(886, 886), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 911), Interval::new(913, 929), Interval::new(931, 939), Interval::new(975, 975), Interval::new(978, 980), Interval::new(984, 984), Interval::new(986, 986), Interval::new(988, 988), Interval::new(990, 990), Interval::new(992, 992), Interval::new(994, 994), Interval::new(996, 996), Interval::new(998, 998), Interval::new(1000, 1000), Interval::new(1002, 1002), Interval::new(1004, 1004), Interval::new(1006, 1006), Interval::new(1012, 1012), Interval::new(1015, 1015), Interval::new(1017, 1018), Interval::new(1021, 1071), Interval::new(1120, 1120), Interval::new(1122, 1122), Interval::new(1124, 1124), Interval::new(1126, 1126), Interval::new(1128, 1128), Interval::new(1130, 1130), Interval::new(1132, 1132), Interval::new(1134, 1134), Interval::new(1136, 1136), Interval::new(1138, 1138), Interval::new(1140, 1140), Interval::new(1142, 1142), Interval::new(1144, 1144), Interval::new(1146, 1146), Interval::new(1148, 1148), Interval::new(1150, 1150), Interval::new(1152, 1152), Interval::new(1162, 1162), Interval::new(1164, 1164), Interval::new(1166, 1166), Interval::new(1168, 1168), Interval::new(1170, 1170), Interval::new(1172, 1172), Interval::new(1174, 1174), Interval::new(1176, 1176), Interval::new(1178, 1178), Interval::new(1180, 1180), Interval::new(1182, 1182), Interval::new(1184, 1184), Interval::new(1186, 1186), Interval::new(1188, 1188), Interval::new(1190, 1190), Interval::new(1192, 1192), Interval::new(1194, 1194), Interval::new(1196, 1196), Interval::new(1198, 1198), Interval::new(1200, 1200), Interval::new(1202, 1202), Interval::new(1204, 1204), Interval::new(1206, 1206), Interval::new(1208, 1208), Interval::new(1210, 1210), Interval::new(1212, 1212), Interval::new(1214, 1214), Interval::new(1216, 1217), Interval::new(1219, 1219), Interval::new(1221, 1221), Interval::new(1223, 1223), Interval::new(1225, 1225), Interval::new(1227, 1227), Interval::new(1229, 1229), Interval::new(1232, 1232), Interval::new(1234, 1234), Interval::new(1236, 1236), Interval::new(1238, 1238), Interval::new(1240, 1240), Interval::new(1242, 1242), Interval::new(1244, 1244), Interval::new(1246, 1246), Interval::new(1248, 1248), Interval::new(1250, 1250), Interval::new(1252, 1252), Interval::new(1254, 1254), Interval::new(1256, 1256), Interval::new(1258, 1258), Interval::new(1260, 1260), Interval::new(1262, 1262), Interval::new(1264, 1264), Interval::new(1266, 1266), Interval::new(1268, 1268), Interval::new(1270, 1270), Interval::new(1272, 1272), Interval::new(1274, 1274), Interval::new(1276, 1276), Interval::new(1278, 1278), Interval::new(1280, 1280), Interval::new(1282, 1282), Interval::new(1284, 1284), Interval::new(1286, 1286), Interval::new(1288, 1288), Interval::new(1290, 1290), Interval::new(1292, 1292), Interval::new(1294, 1294), Interval::new(1296, 1296), Interval::new(1298, 1298), Interval::new(1300, 1300), Interval::new(1302, 1302), Interval::new(1304, 1304), Interval::new(1306, 1306), Interval::new(1308, 1308), Interval::new(1310, 1310), Interval::new(1312, 1312), Interval::new(1314, 1314), Interval::new(1316, 1316), Interval::new(1318, 1318), Interval::new(1320, 1320), Interval::new(1322, 1322), Interval::new(1324, 1324), Interval::new(1326, 1326), Interval::new(1329, 1366), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(5024, 5109), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7680, 7680), Interval::new(7682, 7682), Interval::new(7684, 7684), Interval::new(7686, 7686), Interval::new(7688, 7688), Interval::new(7690, 7690), Interval::new(7692, 7692), Interval::new(7694, 7694), Interval::new(7696, 7696), Interval::new(7698, 7698), Interval::new(7700, 7700), Interval::new(7702, 7702), Interval::new(7704, 7704), Interval::new(7706, 7706), Interval::new(7708, 7708), Interval::new(7710, 7710), Interval::new(7712, 7712), Interval::new(7714, 7714), Interval::new(7716, 7716), Interval::new(7718, 7718), Interval::new(7720, 7720), Interval::new(7722, 7722), Interval::new(7724, 7724), Interval::new(7726, 7726), Interval::new(7728, 7728), Interval::new(7730, 7730), Interval::new(7732, 7732), Interval::new(7734, 7734), Interval::new(7736, 7736), Interval::new(7738, 7738), Interval::new(7740, 7740), Interval::new(7742, 7742), Interval::new(7744, 7744), Interval::new(7746, 7746), Interval::new(7748, 7748), Interval::new(7750, 7750), Interval::new(7752, 7752), Interval::new(7754, 7754), Interval::new(7756, 7756), Interval::new(7758, 7758), Interval::new(7760, 7760), Interval::new(7762, 7762), Interval::new(7764, 7764), Interval::new(7766, 7766), Interval::new(7768, 7768), Interval::new(7770, 7770), Interval::new(7772, 7772), Interval::new(7774, 7774), Interval::new(7776, 7776), Interval::new(7778, 7778), Interval::new(7780, 7780), Interval::new(7782, 7782), Interval::new(7784, 7784), Interval::new(7786, 7786), Interval::new(7788, 7788), Interval::new(7790, 7790), Interval::new(7792, 7792), Interval::new(7794, 7794), Interval::new(7796, 7796), Interval::new(7798, 7798), Interval::new(7800, 7800), Interval::new(7802, 7802), Interval::new(7804, 7804), Interval::new(7806, 7806), Interval::new(7808, 7808), Interval::new(7810, 7810), Interval::new(7812, 7812), Interval::new(7814, 7814), Interval::new(7816, 7816), Interval::new(7818, 7818), Interval::new(7820, 7820), Interval::new(7822, 7822), Interval::new(7824, 7824), Interval::new(7826, 7826), Interval::new(7828, 7828), Interval::new(7838, 7838), Interval::new(7840, 7840), Interval::new(7842, 7842), Interval::new(7844, 7844), Interval::new(7846, 7846), Interval::new(7848, 7848), Interval::new(7850, 7850), Interval::new(7852, 7852), Interval::new(7854, 7854), Interval::new(7856, 7856), Interval::new(7858, 7858), Interval::new(7860, 7860), Interval::new(7862, 7862), Interval::new(7864, 7864), Interval::new(7866, 7866), Interval::new(7868, 7868), Interval::new(7870, 7870), Interval::new(7872, 7872), Interval::new(7874, 7874), Interval::new(7876, 7876), Interval::new(7878, 7878), Interval::new(7880, 7880), Interval::new(7882, 7882), Interval::new(7884, 7884), Interval::new(7886, 7886), Interval::new(7888, 7888), Interval::new(7890, 7890), Interval::new(7892, 7892), Interval::new(7894, 7894), Interval::new(7896, 7896), Interval::new(7898, 7898), Interval::new(7900, 7900), Interval::new(7902, 7902), Interval::new(7904, 7904), Interval::new(7906, 7906), Interval::new(7908, 7908), Interval::new(7910, 7910), Interval::new(7912, 7912), Interval::new(7914, 7914), Interval::new(7916, 7916), Interval::new(7918, 7918), Interval::new(7920, 7920), Interval::new(7922, 7922), Interval::new(7924, 7924), Interval::new(7926, 7926), Interval::new(7928, 7928), Interval::new(7930, 7930), Interval::new(7932, 7932), Interval::new(7934, 7934), Interval::new(7944, 7951), Interval::new(7960, 7965), Interval::new(7976, 7983), Interval::new(7992, 7999), Interval::new(8008, 8013), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8031), Interval::new(8040, 8047), Interval::new(8120, 8123), Interval::new(8136, 8139), Interval::new(8152, 8155), Interval::new(8168, 8172), Interval::new(8184, 8187), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8459, 8461), Interval::new(8464, 8466), Interval::new(8469, 8469), Interval::new(8473, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8493), Interval::new(8496, 8499), Interval::new(8510, 8511), Interval::new(8517, 8517), Interval::new(8544, 8559), Interval::new(8579, 8579), Interval::new(9398, 9423), Interval::new(11264, 11311), Interval::new(11360, 11360), Interval::new(11362, 11364), Interval::new(11367, 11367), Interval::new(11369, 11369), Interval::new(11371, 11371), Interval::new(11373, 11376), Interval::new(11378, 11378), Interval::new(11381, 11381), Interval::new(11390, 11392), Interval::new(11394, 11394), Interval::new(11396, 11396), Interval::new(11398, 11398), Interval::new(11400, 11400), Interval::new(11402, 11402), Interval::new(11404, 11404), Interval::new(11406, 11406), Interval::new(11408, 11408), Interval::new(11410, 11410), Interval::new(11412, 11412), Interval::new(11414, 11414), Interval::new(11416, 11416), Interval::new(11418, 11418), Interval::new(11420, 11420), Interval::new(11422, 11422), Interval::new(11424, 11424), Interval::new(11426, 11426), Interval::new(11428, 11428), Interval::new(11430, 11430), Interval::new(11432, 11432), Interval::new(11434, 11434), Interval::new(11436, 11436), Interval::new(11438, 11438), Interval::new(11440, 11440), Interval::new(11442, 11442), Interval::new(11444, 11444), Interval::new(11446, 11446), Interval::new(11448, 11448), Interval::new(11450, 11450), Interval::new(11452, 11452), Interval::new(11454, 11454), Interval::new(11456, 11456), Interval::new(11458, 11458), Interval::new(11460, 11460), Interval::new(11462, 11462), Interval::new(11464, 11464), Interval::new(11466, 11466), Interval::new(11468, 11468), Interval::new(11470, 11470), Interval::new(11472, 11472), Interval::new(11474, 11474), Interval::new(11476, 11476), Interval::new(11478, 11478), Interval::new(11480, 11480), Interval::new(11482, 11482), Interval::new(11484, 11484), Interval::new(11486, 11486), Interval::new(11488, 11488), Interval::new(11490, 11490), Interval::new(11499, 11499), Interval::new(11501, 11501), Interval::new(11506, 11506), Interval::new(42560, 42560), Interval::new(42562, 42562), Interval::new(42564, 42564), Interval::new(42566, 42566), Interval::new(42568, 42568), Interval::new(42570, 42570), Interval::new(42572, 42572), Interval::new(42574, 42574), Interval::new(42576, 42576), Interval::new(42578, 42578), Interval::new(42580, 42580), Interval::new(42582, 42582), Interval::new(42584, 42584), Interval::new(42586, 42586), Interval::new(42588, 42588), Interval::new(42590, 42590), Interval::new(42592, 42592), Interval::new(42594, 42594), Interval::new(42596, 42596), Interval::new(42598, 42598), Interval::new(42600, 42600), Interval::new(42602, 42602), Interval::new(42604, 42604), Interval::new(42624, 42624), Interval::new(42626, 42626), Interval::new(42628, 42628), Interval::new(42630, 42630), Interval::new(42632, 42632), Interval::new(42634, 42634), Interval::new(42636, 42636), Interval::new(42638, 42638), Interval::new(42640, 42640), Interval::new(42642, 42642), Interval::new(42644, 42644), Interval::new(42646, 42646), Interval::new(42648, 42648), Interval::new(42650, 42650), Interval::new(42786, 42786), Interval::new(42788, 42788), Interval::new(42790, 42790), Interval::new(42792, 42792), Interval::new(42794, 42794), Interval::new(42796, 42796), Interval::new(42798, 42798), Interval::new(42802, 42802), Interval::new(42804, 42804), Interval::new(42806, 42806), Interval::new(42808, 42808), Interval::new(42810, 42810), Interval::new(42812, 42812), Interval::new(42814, 42814), Interval::new(42816, 42816), Interval::new(42818, 42818), Interval::new(42820, 42820), Interval::new(42822, 42822), Interval::new(42824, 42824), Interval::new(42826, 42826), Interval::new(42828, 42828), Interval::new(42830, 42830), Interval::new(42832, 42832), Interval::new(42834, 42834), Interval::new(42836, 42836), Interval::new(42838, 42838), Interval::new(42840, 42840), Interval::new(42842, 42842), Interval::new(42844, 42844), Interval::new(42846, 42846), Interval::new(42848, 42848), Interval::new(42850, 42850), Interval::new(42852, 42852), Interval::new(42854, 42854), Interval::new(42856, 42856), Interval::new(42858, 42858), Interval::new(42860, 42860), Interval::new(42862, 42862), Interval::new(42873, 42873), Interval::new(42875, 42875), Interval::new(42877, 42878), Interval::new(42880, 42880), Interval::new(42882, 42882), Interval::new(42884, 42884), Interval::new(42886, 42886), Interval::new(42891, 42891), Interval::new(42893, 42893), Interval::new(42896, 42896), Interval::new(42898, 42898), Interval::new(42902, 42902), Interval::new(42904, 42904), Interval::new(42906, 42906), Interval::new(42908, 42908), Interval::new(42910, 42910), Interval::new(42912, 42912), Interval::new(42914, 42914), Interval::new(42916, 42916), Interval::new(42918, 42918), Interval::new(42920, 42920), Interval::new(42922, 42926), Interval::new(42928, 42932), Interval::new(42934, 42934), Interval::new(42936, 42936), Interval::new(42938, 42938), Interval::new(42940, 42940), Interval::new(42942, 42942), Interval::new(42944, 42944), Interval::new(42946, 42946), Interval::new(42948, 42951), Interval::new(42953, 42953), Interval::new(42960, 42960), Interval::new(42966, 42966), Interval::new(42968, 42968), Interval::new(42997, 42997), Interval::new(65313, 65338), Interval::new(66560, 66599), Interval::new(66736, 66771), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(68736, 68786), Interval::new(71840, 71871), Interval::new(93760, 93791), Interval::new(119808, 119833), Interval::new(119860, 119885), Interval::new(119912, 119937), Interval::new(119964, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119989), Interval::new(120016, 120041), Interval::new(120068, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120120, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120172, 120197), Interval::new(120224, 120249), Interval::new(120276, 120301), Interval::new(120328, 120353), Interval::new(120380, 120405), Interval::new(120432, 120457), Interval::new(120488, 120512), Interval::new(120546, 120570), Interval::new(120604, 120628), Interval::new(120662, 120686), Interval::new(120720, 120744), Interval::new(120778, 120778), Interval::new(125184, 125217), Interval::new(127280, 127305), Interval::new(127312, 127337), Interval::new(127344, 127369), ]; /// Return the code point ranges of the 'Uppercase' Unicode property. pub(crate) fn uppercase_ranges() -> &'static [Interval] { &UPPERCASE } const VARIATION_SELECTOR: [Interval; 4] = [ Interval::new(6155, 6157), Interval::new(6159, 6159), Interval::new(65024, 65039), Interval::new(917760, 917999), ]; /// Return the code point ranges of the 'Variation_Selector' Unicode property. pub(crate) fn variation_selector_ranges() -> &'static [Interval] { &VARIATION_SELECTOR } const WHITE_SPACE: [Interval; 10] = [ Interval::new(9, 13), Interval::new(32, 32), Interval::new(133, 133), Interval::new(160, 160), Interval::new(5760, 5760), Interval::new(8192, 8202), Interval::new(8232, 8233), Interval::new(8239, 8239), Interval::new(8287, 8287), Interval::new(12288, 12288), ]; /// Return the code point ranges of the 'White_Space' Unicode property. pub(crate) fn white_space_ranges() -> &'static [Interval] { &WHITE_SPACE } const EMOJI: [Interval; 151] = [ Interval::new(35, 35), Interval::new(42, 42), Interval::new(48, 57), Interval::new(169, 169), Interval::new(174, 174), Interval::new(8252, 8252), Interval::new(8265, 8265), Interval::new(8482, 8482), Interval::new(8505, 8505), Interval::new(8596, 8601), Interval::new(8617, 8618), Interval::new(8986, 8987), Interval::new(9000, 9000), Interval::new(9167, 9167), Interval::new(9193, 9203), Interval::new(9208, 9210), Interval::new(9410, 9410), Interval::new(9642, 9643), Interval::new(9654, 9654), Interval::new(9664, 9664), Interval::new(9723, 9726), Interval::new(9728, 9732), Interval::new(9742, 9742), Interval::new(9745, 9745), Interval::new(9748, 9749), Interval::new(9752, 9752), Interval::new(9757, 9757), Interval::new(9760, 9760), Interval::new(9762, 9763), Interval::new(9766, 9766), Interval::new(9770, 9770), Interval::new(9774, 9775), Interval::new(9784, 9786), Interval::new(9792, 9792), Interval::new(9794, 9794), Interval::new(9800, 9811), Interval::new(9823, 9824), Interval::new(9827, 9827), Interval::new(9829, 9830), Interval::new(9832, 9832), Interval::new(9851, 9851), Interval::new(9854, 9855), Interval::new(9874, 9879), Interval::new(9881, 9881), Interval::new(9883, 9884), Interval::new(9888, 9889), Interval::new(9895, 9895), Interval::new(9898, 9899), Interval::new(9904, 9905), Interval::new(9917, 9918), Interval::new(9924, 9925), Interval::new(9928, 9928), Interval::new(9934, 9935), Interval::new(9937, 9937), Interval::new(9939, 9940), Interval::new(9961, 9962), Interval::new(9968, 9973), Interval::new(9975, 9978), Interval::new(9981, 9981), Interval::new(9986, 9986), Interval::new(9989, 9989), Interval::new(9992, 9997), Interval::new(9999, 9999), Interval::new(10002, 10002), Interval::new(10004, 10004), Interval::new(10006, 10006), Interval::new(10013, 10013), Interval::new(10017, 10017), Interval::new(10024, 10024), Interval::new(10035, 10036), Interval::new(10052, 10052), Interval::new(10055, 10055), Interval::new(10060, 10060), Interval::new(10062, 10062), Interval::new(10067, 10069), Interval::new(10071, 10071), Interval::new(10083, 10084), Interval::new(10133, 10135), Interval::new(10145, 10145), Interval::new(10160, 10160), Interval::new(10175, 10175), Interval::new(10548, 10549), Interval::new(11013, 11015), Interval::new(11035, 11036), Interval::new(11088, 11088), Interval::new(11093, 11093), Interval::new(12336, 12336), Interval::new(12349, 12349), Interval::new(12951, 12951), Interval::new(12953, 12953), Interval::new(126980, 126980), Interval::new(127183, 127183), Interval::new(127344, 127345), Interval::new(127358, 127359), Interval::new(127374, 127374), Interval::new(127377, 127386), Interval::new(127462, 127487), Interval::new(127489, 127490), Interval::new(127514, 127514), Interval::new(127535, 127535), Interval::new(127538, 127546), Interval::new(127568, 127569), Interval::new(127744, 127777), Interval::new(127780, 127891), Interval::new(127894, 127895), Interval::new(127897, 127899), Interval::new(127902, 127984), Interval::new(127987, 127989), Interval::new(127991, 128253), Interval::new(128255, 128317), Interval::new(128329, 128334), Interval::new(128336, 128359), Interval::new(128367, 128368), Interval::new(128371, 128378), Interval::new(128391, 128391), Interval::new(128394, 128397), Interval::new(128400, 128400), Interval::new(128405, 128406), Interval::new(128420, 128421), Interval::new(128424, 128424), Interval::new(128433, 128434), Interval::new(128444, 128444), Interval::new(128450, 128452), Interval::new(128465, 128467), Interval::new(128476, 128478), Interval::new(128481, 128481), Interval::new(128483, 128483), Interval::new(128488, 128488), Interval::new(128495, 128495), Interval::new(128499, 128499), Interval::new(128506, 128591), Interval::new(128640, 128709), Interval::new(128715, 128722), Interval::new(128725, 128727), Interval::new(128732, 128741), Interval::new(128745, 128745), Interval::new(128747, 128748), Interval::new(128752, 128752), Interval::new(128755, 128764), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129292, 129338), Interval::new(129340, 129349), Interval::new(129351, 129535), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), ]; /// Return the code point ranges of the 'Emoji' Unicode property. pub(crate) fn emoji_ranges() -> &'static [Interval] { &EMOJI } const EMOJI_COMPONENT: [Interval; 10] = [ Interval::new(35, 35), Interval::new(42, 42), Interval::new(48, 57), Interval::new(8205, 8205), Interval::new(8419, 8419), Interval::new(65039, 65039), Interval::new(127462, 127487), Interval::new(127995, 127999), Interval::new(129456, 129459), Interval::new(917536, 917631), ]; /// Return the code point ranges of the 'Emoji_Component' Unicode property. pub(crate) fn emoji_component_ranges() -> &'static [Interval] { &EMOJI_COMPONENT } const EMOJI_MODIFIER: [Interval; 1] = [Interval::new(127995, 127999)]; /// Return the code point ranges of the 'Emoji_Modifier' Unicode property. pub(crate) fn emoji_modifier_ranges() -> &'static [Interval] { &EMOJI_MODIFIER } const EMOJI_MODIFIER_BASE: [Interval; 40] = [ Interval::new(9757, 9757), Interval::new(9977, 9977), Interval::new(9994, 9997), Interval::new(127877, 127877), Interval::new(127938, 127940), Interval::new(127943, 127943), Interval::new(127946, 127948), Interval::new(128066, 128067), Interval::new(128070, 128080), Interval::new(128102, 128120), Interval::new(128124, 128124), Interval::new(128129, 128131), Interval::new(128133, 128135), Interval::new(128143, 128143), Interval::new(128145, 128145), Interval::new(128170, 128170), Interval::new(128372, 128373), Interval::new(128378, 128378), Interval::new(128400, 128400), Interval::new(128405, 128406), Interval::new(128581, 128583), Interval::new(128587, 128591), Interval::new(128675, 128675), Interval::new(128692, 128694), Interval::new(128704, 128704), Interval::new(128716, 128716), Interval::new(129292, 129292), Interval::new(129295, 129295), Interval::new(129304, 129311), Interval::new(129318, 129318), Interval::new(129328, 129337), Interval::new(129340, 129342), Interval::new(129399, 129399), Interval::new(129461, 129462), Interval::new(129464, 129465), Interval::new(129467, 129467), Interval::new(129485, 129487), Interval::new(129489, 129501), Interval::new(129731, 129733), Interval::new(129776, 129784), ]; /// Return the code point ranges of the 'Emoji_Modifier_Base' Unicode property. pub(crate) fn emoji_modifier_base_ranges() -> &'static [Interval] { &EMOJI_MODIFIER_BASE } const EMOJI_PRESENTATION: [Interval; 81] = [ Interval::new(8986, 8987), Interval::new(9193, 9196), Interval::new(9200, 9200), Interval::new(9203, 9203), Interval::new(9725, 9726), Interval::new(9748, 9749), Interval::new(9800, 9811), Interval::new(9855, 9855), Interval::new(9875, 9875), Interval::new(9889, 9889), Interval::new(9898, 9899), Interval::new(9917, 9918), Interval::new(9924, 9925), Interval::new(9934, 9934), Interval::new(9940, 9940), Interval::new(9962, 9962), Interval::new(9970, 9971), Interval::new(9973, 9973), Interval::new(9978, 9978), Interval::new(9981, 9981), Interval::new(9989, 9989), Interval::new(9994, 9995), Interval::new(10024, 10024), Interval::new(10060, 10060), Interval::new(10062, 10062), Interval::new(10067, 10069), Interval::new(10071, 10071), Interval::new(10133, 10135), Interval::new(10160, 10160), Interval::new(10175, 10175), Interval::new(11035, 11036), Interval::new(11088, 11088), Interval::new(11093, 11093), Interval::new(126980, 126980), Interval::new(127183, 127183), Interval::new(127374, 127374), Interval::new(127377, 127386), Interval::new(127462, 127487), Interval::new(127489, 127489), Interval::new(127514, 127514), Interval::new(127535, 127535), Interval::new(127538, 127542), Interval::new(127544, 127546), Interval::new(127568, 127569), Interval::new(127744, 127776), Interval::new(127789, 127797), Interval::new(127799, 127868), Interval::new(127870, 127891), Interval::new(127904, 127946), Interval::new(127951, 127955), Interval::new(127968, 127984), Interval::new(127988, 127988), Interval::new(127992, 128062), Interval::new(128064, 128064), Interval::new(128066, 128252), Interval::new(128255, 128317), Interval::new(128331, 128334), Interval::new(128336, 128359), Interval::new(128378, 128378), Interval::new(128405, 128406), Interval::new(128420, 128420), Interval::new(128507, 128591), Interval::new(128640, 128709), Interval::new(128716, 128716), Interval::new(128720, 128722), Interval::new(128725, 128727), Interval::new(128732, 128735), Interval::new(128747, 128748), Interval::new(128756, 128764), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129292, 129338), Interval::new(129340, 129349), Interval::new(129351, 129535), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), ]; /// Return the code point ranges of the 'Emoji_Presentation' Unicode property. pub(crate) fn emoji_presentation_ranges() -> &'static [Interval] { &EMOJI_PRESENTATION } const EXTENDED_PICTOGRAPHIC: [Interval; 78] = [ Interval::new(169, 169), Interval::new(174, 174), Interval::new(8252, 8252), Interval::new(8265, 8265), Interval::new(8482, 8482), Interval::new(8505, 8505), Interval::new(8596, 8601), Interval::new(8617, 8618), Interval::new(8986, 8987), Interval::new(9000, 9000), Interval::new(9096, 9096), Interval::new(9167, 9167), Interval::new(9193, 9203), Interval::new(9208, 9210), Interval::new(9410, 9410), Interval::new(9642, 9643), Interval::new(9654, 9654), Interval::new(9664, 9664), Interval::new(9723, 9726), Interval::new(9728, 9733), Interval::new(9735, 9746), Interval::new(9748, 9861), Interval::new(9872, 9989), Interval::new(9992, 10002), Interval::new(10004, 10004), Interval::new(10006, 10006), Interval::new(10013, 10013), Interval::new(10017, 10017), Interval::new(10024, 10024), Interval::new(10035, 10036), Interval::new(10052, 10052), Interval::new(10055, 10055), Interval::new(10060, 10060), Interval::new(10062, 10062), Interval::new(10067, 10069), Interval::new(10071, 10071), Interval::new(10083, 10087), Interval::new(10133, 10135), Interval::new(10145, 10145), Interval::new(10160, 10160), Interval::new(10175, 10175), Interval::new(10548, 10549), Interval::new(11013, 11015), Interval::new(11035, 11036), Interval::new(11088, 11088), Interval::new(11093, 11093), Interval::new(12336, 12336), Interval::new(12349, 12349), Interval::new(12951, 12951), Interval::new(12953, 12953), Interval::new(126976, 127231), Interval::new(127245, 127247), Interval::new(127279, 127279), Interval::new(127340, 127345), Interval::new(127358, 127359), Interval::new(127374, 127374), Interval::new(127377, 127386), Interval::new(127405, 127461), Interval::new(127489, 127503), Interval::new(127514, 127514), Interval::new(127535, 127535), Interval::new(127538, 127546), Interval::new(127548, 127551), Interval::new(127561, 127994), Interval::new(128000, 128317), Interval::new(128326, 128591), Interval::new(128640, 128767), Interval::new(128884, 128895), Interval::new(128981, 129023), Interval::new(129036, 129039), Interval::new(129096, 129103), Interval::new(129114, 129119), Interval::new(129160, 129167), Interval::new(129198, 129279), Interval::new(129292, 129338), Interval::new(129340, 129349), Interval::new(129351, 129791), Interval::new(130048, 131069), ]; /// Return the code point ranges of the 'Extended_Pictographic' Unicode property. pub(crate) fn extended_pictographic_ranges() -> &'static [Interval] { &EXTENDED_PICTOGRAPHIC } const CHANGES_WHEN_NFKC_CASEFOLDED: [Interval; 839] = [ Interval::new(65, 90), Interval::new(160, 160), Interval::new(168, 168), Interval::new(170, 170), Interval::new(173, 173), Interval::new(175, 175), Interval::new(178, 181), Interval::new(184, 186), Interval::new(188, 190), Interval::new(192, 214), Interval::new(216, 223), Interval::new(256, 256), Interval::new(258, 258), Interval::new(260, 260), Interval::new(262, 262), Interval::new(264, 264), Interval::new(266, 266), Interval::new(268, 268), Interval::new(270, 270), Interval::new(272, 272), Interval::new(274, 274), Interval::new(276, 276), Interval::new(278, 278), Interval::new(280, 280), Interval::new(282, 282), Interval::new(284, 284), Interval::new(286, 286), Interval::new(288, 288), Interval::new(290, 290), Interval::new(292, 292), Interval::new(294, 294), Interval::new(296, 296), Interval::new(298, 298), Interval::new(300, 300), Interval::new(302, 302), Interval::new(304, 304), Interval::new(306, 308), Interval::new(310, 310), Interval::new(313, 313), Interval::new(315, 315), Interval::new(317, 317), Interval::new(319, 321), Interval::new(323, 323), Interval::new(325, 325), Interval::new(327, 327), Interval::new(329, 330), Interval::new(332, 332), Interval::new(334, 334), Interval::new(336, 336), Interval::new(338, 338), Interval::new(340, 340), Interval::new(342, 342), Interval::new(344, 344), Interval::new(346, 346), Interval::new(348, 348), Interval::new(350, 350), Interval::new(352, 352), Interval::new(354, 354), Interval::new(356, 356), Interval::new(358, 358), Interval::new(360, 360), Interval::new(362, 362), Interval::new(364, 364), Interval::new(366, 366), Interval::new(368, 368), Interval::new(370, 370), Interval::new(372, 372), Interval::new(374, 374), Interval::new(376, 377), Interval::new(379, 379), Interval::new(381, 381), Interval::new(383, 383), Interval::new(385, 386), Interval::new(388, 388), Interval::new(390, 391), Interval::new(393, 395), Interval::new(398, 401), Interval::new(403, 404), Interval::new(406, 408), Interval::new(412, 413), Interval::new(415, 416), Interval::new(418, 418), Interval::new(420, 420), Interval::new(422, 423), Interval::new(425, 425), Interval::new(428, 428), Interval::new(430, 431), Interval::new(433, 435), Interval::new(437, 437), Interval::new(439, 440), Interval::new(444, 444), Interval::new(452, 461), Interval::new(463, 463), Interval::new(465, 465), Interval::new(467, 467), Interval::new(469, 469), Interval::new(471, 471), Interval::new(473, 473), Interval::new(475, 475), Interval::new(478, 478), Interval::new(480, 480), Interval::new(482, 482), Interval::new(484, 484), Interval::new(486, 486), Interval::new(488, 488), Interval::new(490, 490), Interval::new(492, 492), Interval::new(494, 494), Interval::new(497, 500), Interval::new(502, 504), Interval::new(506, 506), Interval::new(508, 508), Interval::new(510, 510), Interval::new(512, 512), Interval::new(514, 514), Interval::new(516, 516), Interval::new(518, 518), Interval::new(520, 520), Interval::new(522, 522), Interval::new(524, 524), Interval::new(526, 526), Interval::new(528, 528), Interval::new(530, 530), Interval::new(532, 532), Interval::new(534, 534), Interval::new(536, 536), Interval::new(538, 538), Interval::new(540, 540), Interval::new(542, 542), Interval::new(544, 544), Interval::new(546, 546), Interval::new(548, 548), Interval::new(550, 550), Interval::new(552, 552), Interval::new(554, 554), Interval::new(556, 556), Interval::new(558, 558), Interval::new(560, 560), Interval::new(562, 562), Interval::new(570, 571), Interval::new(573, 574), Interval::new(577, 577), Interval::new(579, 582), Interval::new(584, 584), Interval::new(586, 586), Interval::new(588, 588), Interval::new(590, 590), Interval::new(688, 696), Interval::new(728, 733), Interval::new(736, 740), Interval::new(832, 833), Interval::new(835, 837), Interval::new(847, 847), Interval::new(880, 880), Interval::new(882, 882), Interval::new(884, 884), Interval::new(886, 886), Interval::new(890, 890), Interval::new(894, 895), Interval::new(900, 906), Interval::new(908, 908), Interval::new(910, 911), Interval::new(913, 929), Interval::new(931, 939), Interval::new(962, 962), Interval::new(975, 982), Interval::new(984, 984), Interval::new(986, 986), Interval::new(988, 988), Interval::new(990, 990), Interval::new(992, 992), Interval::new(994, 994), Interval::new(996, 996), Interval::new(998, 998), Interval::new(1000, 1000), Interval::new(1002, 1002), Interval::new(1004, 1004), Interval::new(1006, 1006), Interval::new(1008, 1010), Interval::new(1012, 1013), Interval::new(1015, 1015), Interval::new(1017, 1018), Interval::new(1021, 1071), Interval::new(1120, 1120), Interval::new(1122, 1122), Interval::new(1124, 1124), Interval::new(1126, 1126), Interval::new(1128, 1128), Interval::new(1130, 1130), Interval::new(1132, 1132), Interval::new(1134, 1134), Interval::new(1136, 1136), Interval::new(1138, 1138), Interval::new(1140, 1140), Interval::new(1142, 1142), Interval::new(1144, 1144), Interval::new(1146, 1146), Interval::new(1148, 1148), Interval::new(1150, 1150), Interval::new(1152, 1152), Interval::new(1162, 1162), Interval::new(1164, 1164), Interval::new(1166, 1166), Interval::new(1168, 1168), Interval::new(1170, 1170), Interval::new(1172, 1172), Interval::new(1174, 1174), Interval::new(1176, 1176), Interval::new(1178, 1178), Interval::new(1180, 1180), Interval::new(1182, 1182), Interval::new(1184, 1184), Interval::new(1186, 1186), Interval::new(1188, 1188), Interval::new(1190, 1190), Interval::new(1192, 1192), Interval::new(1194, 1194), Interval::new(1196, 1196), Interval::new(1198, 1198), Interval::new(1200, 1200), Interval::new(1202, 1202), Interval::new(1204, 1204), Interval::new(1206, 1206), Interval::new(1208, 1208), Interval::new(1210, 1210), Interval::new(1212, 1212), Interval::new(1214, 1214), Interval::new(1216, 1217), Interval::new(1219, 1219), Interval::new(1221, 1221), Interval::new(1223, 1223), Interval::new(1225, 1225), Interval::new(1227, 1227), Interval::new(1229, 1229), Interval::new(1232, 1232), Interval::new(1234, 1234), Interval::new(1236, 1236), Interval::new(1238, 1238), Interval::new(1240, 1240), Interval::new(1242, 1242), Interval::new(1244, 1244), Interval::new(1246, 1246), Interval::new(1248, 1248), Interval::new(1250, 1250), Interval::new(1252, 1252), Interval::new(1254, 1254), Interval::new(1256, 1256), Interval::new(1258, 1258), Interval::new(1260, 1260), Interval::new(1262, 1262), Interval::new(1264, 1264), Interval::new(1266, 1266), Interval::new(1268, 1268), Interval::new(1270, 1270), Interval::new(1272, 1272), Interval::new(1274, 1274), Interval::new(1276, 1276), Interval::new(1278, 1278), Interval::new(1280, 1280), Interval::new(1282, 1282), Interval::new(1284, 1284), Interval::new(1286, 1286), Interval::new(1288, 1288), Interval::new(1290, 1290), Interval::new(1292, 1292), Interval::new(1294, 1294), Interval::new(1296, 1296), Interval::new(1298, 1298), Interval::new(1300, 1300), Interval::new(1302, 1302), Interval::new(1304, 1304), Interval::new(1306, 1306), Interval::new(1308, 1308), Interval::new(1310, 1310), Interval::new(1312, 1312), Interval::new(1314, 1314), Interval::new(1316, 1316), Interval::new(1318, 1318), Interval::new(1320, 1320), Interval::new(1322, 1322), Interval::new(1324, 1324), Interval::new(1326, 1326), Interval::new(1329, 1366), Interval::new(1415, 1415), Interval::new(1564, 1564), Interval::new(1653, 1656), Interval::new(2392, 2399), Interval::new(2524, 2525), Interval::new(2527, 2527), Interval::new(2611, 2611), Interval::new(2614, 2614), Interval::new(2649, 2651), Interval::new(2654, 2654), Interval::new(2908, 2909), Interval::new(3635, 3635), Interval::new(3763, 3763), Interval::new(3804, 3805), Interval::new(3852, 3852), Interval::new(3907, 3907), Interval::new(3917, 3917), Interval::new(3922, 3922), Interval::new(3927, 3927), Interval::new(3932, 3932), Interval::new(3945, 3945), Interval::new(3955, 3955), Interval::new(3957, 3961), Interval::new(3969, 3969), Interval::new(3987, 3987), Interval::new(3997, 3997), Interval::new(4002, 4002), Interval::new(4007, 4007), Interval::new(4012, 4012), Interval::new(4025, 4025), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4348, 4348), Interval::new(4447, 4448), Interval::new(5112, 5117), Interval::new(6068, 6069), Interval::new(6155, 6159), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7468, 7470), Interval::new(7472, 7482), Interval::new(7484, 7501), Interval::new(7503, 7530), Interval::new(7544, 7544), Interval::new(7579, 7615), Interval::new(7680, 7680), Interval::new(7682, 7682), Interval::new(7684, 7684), Interval::new(7686, 7686), Interval::new(7688, 7688), Interval::new(7690, 7690), Interval::new(7692, 7692), Interval::new(7694, 7694), Interval::new(7696, 7696), Interval::new(7698, 7698), Interval::new(7700, 7700), Interval::new(7702, 7702), Interval::new(7704, 7704), Interval::new(7706, 7706), Interval::new(7708, 7708), Interval::new(7710, 7710), Interval::new(7712, 7712), Interval::new(7714, 7714), Interval::new(7716, 7716), Interval::new(7718, 7718), Interval::new(7720, 7720), Interval::new(7722, 7722), Interval::new(7724, 7724), Interval::new(7726, 7726), Interval::new(7728, 7728), Interval::new(7730, 7730), Interval::new(7732, 7732), Interval::new(7734, 7734), Interval::new(7736, 7736), Interval::new(7738, 7738), Interval::new(7740, 7740), Interval::new(7742, 7742), Interval::new(7744, 7744), Interval::new(7746, 7746), Interval::new(7748, 7748), Interval::new(7750, 7750), Interval::new(7752, 7752), Interval::new(7754, 7754), Interval::new(7756, 7756), Interval::new(7758, 7758), Interval::new(7760, 7760), Interval::new(7762, 7762), Interval::new(7764, 7764), Interval::new(7766, 7766), Interval::new(7768, 7768), Interval::new(7770, 7770), Interval::new(7772, 7772), Interval::new(7774, 7774), Interval::new(7776, 7776), Interval::new(7778, 7778), Interval::new(7780, 7780), Interval::new(7782, 7782), Interval::new(7784, 7784), Interval::new(7786, 7786), Interval::new(7788, 7788), Interval::new(7790, 7790), Interval::new(7792, 7792), Interval::new(7794, 7794), Interval::new(7796, 7796), Interval::new(7798, 7798), Interval::new(7800, 7800), Interval::new(7802, 7802), Interval::new(7804, 7804), Interval::new(7806, 7806), Interval::new(7808, 7808), Interval::new(7810, 7810), Interval::new(7812, 7812), Interval::new(7814, 7814), Interval::new(7816, 7816), Interval::new(7818, 7818), Interval::new(7820, 7820), Interval::new(7822, 7822), Interval::new(7824, 7824), Interval::new(7826, 7826), Interval::new(7828, 7828), Interval::new(7834, 7835), Interval::new(7838, 7838), Interval::new(7840, 7840), Interval::new(7842, 7842), Interval::new(7844, 7844), Interval::new(7846, 7846), Interval::new(7848, 7848), Interval::new(7850, 7850), Interval::new(7852, 7852), Interval::new(7854, 7854), Interval::new(7856, 7856), Interval::new(7858, 7858), Interval::new(7860, 7860), Interval::new(7862, 7862), Interval::new(7864, 7864), Interval::new(7866, 7866), Interval::new(7868, 7868), Interval::new(7870, 7870), Interval::new(7872, 7872), Interval::new(7874, 7874), Interval::new(7876, 7876), Interval::new(7878, 7878), Interval::new(7880, 7880), Interval::new(7882, 7882), Interval::new(7884, 7884), Interval::new(7886, 7886), Interval::new(7888, 7888), Interval::new(7890, 7890), Interval::new(7892, 7892), Interval::new(7894, 7894), Interval::new(7896, 7896), Interval::new(7898, 7898), Interval::new(7900, 7900), Interval::new(7902, 7902), Interval::new(7904, 7904), Interval::new(7906, 7906), Interval::new(7908, 7908), Interval::new(7910, 7910), Interval::new(7912, 7912), Interval::new(7914, 7914), Interval::new(7916, 7916), Interval::new(7918, 7918), Interval::new(7920, 7920), Interval::new(7922, 7922), Interval::new(7924, 7924), Interval::new(7926, 7926), Interval::new(7928, 7928), Interval::new(7930, 7930), Interval::new(7932, 7932), Interval::new(7934, 7934), Interval::new(7944, 7951), Interval::new(7960, 7965), Interval::new(7976, 7983), Interval::new(7992, 7999), Interval::new(8008, 8013), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8031), Interval::new(8040, 8047), Interval::new(8049, 8049), Interval::new(8051, 8051), Interval::new(8053, 8053), Interval::new(8055, 8055), Interval::new(8057, 8057), Interval::new(8059, 8059), Interval::new(8061, 8061), Interval::new(8064, 8111), Interval::new(8114, 8116), Interval::new(8119, 8132), Interval::new(8135, 8143), Interval::new(8147, 8147), Interval::new(8152, 8155), Interval::new(8157, 8159), Interval::new(8163, 8163), Interval::new(8168, 8175), Interval::new(8178, 8180), Interval::new(8183, 8190), Interval::new(8192, 8207), Interval::new(8209, 8209), Interval::new(8215, 8215), Interval::new(8228, 8230), Interval::new(8234, 8239), Interval::new(8243, 8244), Interval::new(8246, 8247), Interval::new(8252, 8252), Interval::new(8254, 8254), Interval::new(8263, 8265), Interval::new(8279, 8279), Interval::new(8287, 8305), Interval::new(8308, 8334), Interval::new(8336, 8348), Interval::new(8360, 8360), Interval::new(8448, 8451), Interval::new(8453, 8455), Interval::new(8457, 8467), Interval::new(8469, 8470), Interval::new(8473, 8477), Interval::new(8480, 8482), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8493), Interval::new(8495, 8505), Interval::new(8507, 8512), Interval::new(8517, 8521), Interval::new(8528, 8575), Interval::new(8579, 8579), Interval::new(8585, 8585), Interval::new(8748, 8749), Interval::new(8751, 8752), Interval::new(9001, 9002), Interval::new(9312, 9450), Interval::new(10764, 10764), Interval::new(10868, 10870), Interval::new(10972, 10972), Interval::new(11264, 11311), Interval::new(11360, 11360), Interval::new(11362, 11364), Interval::new(11367, 11367), Interval::new(11369, 11369), Interval::new(11371, 11371), Interval::new(11373, 11376), Interval::new(11378, 11378), Interval::new(11381, 11381), Interval::new(11388, 11392), Interval::new(11394, 11394), Interval::new(11396, 11396), Interval::new(11398, 11398), Interval::new(11400, 11400), Interval::new(11402, 11402), Interval::new(11404, 11404), Interval::new(11406, 11406), Interval::new(11408, 11408), Interval::new(11410, 11410), Interval::new(11412, 11412), Interval::new(11414, 11414), Interval::new(11416, 11416), Interval::new(11418, 11418), Interval::new(11420, 11420), Interval::new(11422, 11422), Interval::new(11424, 11424), Interval::new(11426, 11426), Interval::new(11428, 11428), Interval::new(11430, 11430), Interval::new(11432, 11432), Interval::new(11434, 11434), Interval::new(11436, 11436), Interval::new(11438, 11438), Interval::new(11440, 11440), Interval::new(11442, 11442), Interval::new(11444, 11444), Interval::new(11446, 11446), Interval::new(11448, 11448), Interval::new(11450, 11450), Interval::new(11452, 11452), Interval::new(11454, 11454), Interval::new(11456, 11456), Interval::new(11458, 11458), Interval::new(11460, 11460), Interval::new(11462, 11462), Interval::new(11464, 11464), Interval::new(11466, 11466), Interval::new(11468, 11468), Interval::new(11470, 11470), Interval::new(11472, 11472), Interval::new(11474, 11474), Interval::new(11476, 11476), Interval::new(11478, 11478), Interval::new(11480, 11480), Interval::new(11482, 11482), Interval::new(11484, 11484), Interval::new(11486, 11486), Interval::new(11488, 11488), Interval::new(11490, 11490), Interval::new(11499, 11499), Interval::new(11501, 11501), Interval::new(11506, 11506), Interval::new(11631, 11631), Interval::new(11935, 11935), Interval::new(12019, 12019), Interval::new(12032, 12245), Interval::new(12288, 12288), Interval::new(12342, 12342), Interval::new(12344, 12346), Interval::new(12443, 12444), Interval::new(12447, 12447), Interval::new(12543, 12543), Interval::new(12593, 12686), Interval::new(12690, 12703), Interval::new(12800, 12830), Interval::new(12832, 12871), Interval::new(12880, 12926), Interval::new(12928, 13311), Interval::new(42560, 42560), Interval::new(42562, 42562), Interval::new(42564, 42564), Interval::new(42566, 42566), Interval::new(42568, 42568), Interval::new(42570, 42570), Interval::new(42572, 42572), Interval::new(42574, 42574), Interval::new(42576, 42576), Interval::new(42578, 42578), Interval::new(42580, 42580), Interval::new(42582, 42582), Interval::new(42584, 42584), Interval::new(42586, 42586), Interval::new(42588, 42588), Interval::new(42590, 42590), Interval::new(42592, 42592), Interval::new(42594, 42594), Interval::new(42596, 42596), Interval::new(42598, 42598), Interval::new(42600, 42600), Interval::new(42602, 42602), Interval::new(42604, 42604), Interval::new(42624, 42624), Interval::new(42626, 42626), Interval::new(42628, 42628), Interval::new(42630, 42630), Interval::new(42632, 42632), Interval::new(42634, 42634), Interval::new(42636, 42636), Interval::new(42638, 42638), Interval::new(42640, 42640), Interval::new(42642, 42642), Interval::new(42644, 42644), Interval::new(42646, 42646), Interval::new(42648, 42648), Interval::new(42650, 42650), Interval::new(42652, 42653), Interval::new(42786, 42786), Interval::new(42788, 42788), Interval::new(42790, 42790), Interval::new(42792, 42792), Interval::new(42794, 42794), Interval::new(42796, 42796), Interval::new(42798, 42798), Interval::new(42802, 42802), Interval::new(42804, 42804), Interval::new(42806, 42806), Interval::new(42808, 42808), Interval::new(42810, 42810), Interval::new(42812, 42812), Interval::new(42814, 42814), Interval::new(42816, 42816), Interval::new(42818, 42818), Interval::new(42820, 42820), Interval::new(42822, 42822), Interval::new(42824, 42824), Interval::new(42826, 42826), Interval::new(42828, 42828), Interval::new(42830, 42830), Interval::new(42832, 42832), Interval::new(42834, 42834), Interval::new(42836, 42836), Interval::new(42838, 42838), Interval::new(42840, 42840), Interval::new(42842, 42842), Interval::new(42844, 42844), Interval::new(42846, 42846), Interval::new(42848, 42848), Interval::new(42850, 42850), Interval::new(42852, 42852), Interval::new(42854, 42854), Interval::new(42856, 42856), Interval::new(42858, 42858), Interval::new(42860, 42860), Interval::new(42862, 42862), Interval::new(42864, 42864), Interval::new(42873, 42873), Interval::new(42875, 42875), Interval::new(42877, 42878), Interval::new(42880, 42880), Interval::new(42882, 42882), Interval::new(42884, 42884), Interval::new(42886, 42886), Interval::new(42891, 42891), Interval::new(42893, 42893), Interval::new(42896, 42896), Interval::new(42898, 42898), Interval::new(42902, 42902), Interval::new(42904, 42904), Interval::new(42906, 42906), Interval::new(42908, 42908), Interval::new(42910, 42910), Interval::new(42912, 42912), Interval::new(42914, 42914), Interval::new(42916, 42916), Interval::new(42918, 42918), Interval::new(42920, 42920), Interval::new(42922, 42926), Interval::new(42928, 42932), Interval::new(42934, 42934), Interval::new(42936, 42936), Interval::new(42938, 42938), Interval::new(42940, 42940), Interval::new(42942, 42942), Interval::new(42944, 42944), Interval::new(42946, 42946), Interval::new(42948, 42951), Interval::new(42953, 42953), Interval::new(42960, 42960), Interval::new(42966, 42966), Interval::new(42968, 42968), Interval::new(42994, 42997), Interval::new(43000, 43001), Interval::new(43868, 43871), Interval::new(43881, 43881), Interval::new(43888, 43967), Interval::new(63744, 64013), Interval::new(64016, 64016), Interval::new(64018, 64018), Interval::new(64021, 64030), Interval::new(64032, 64032), Interval::new(64034, 64034), Interval::new(64037, 64038), Interval::new(64042, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64285), Interval::new(64287, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65020), Interval::new(65024, 65049), Interval::new(65072, 65092), Interval::new(65095, 65106), Interval::new(65108, 65126), Interval::new(65128, 65131), Interval::new(65136, 65138), Interval::new(65140, 65140), Interval::new(65142, 65276), Interval::new(65279, 65279), Interval::new(65281, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65504, 65510), Interval::new(65512, 65518), Interval::new(65520, 65528), Interval::new(66560, 66599), Interval::new(66736, 66771), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(67457, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(68736, 68786), Interval::new(71840, 71871), Interval::new(93760, 93791), Interval::new(113824, 113827), Interval::new(119134, 119140), Interval::new(119155, 119162), Interval::new(119227, 119232), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120779), Interval::new(120782, 120831), Interval::new(122928, 122989), Interval::new(125184, 125217), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(127232, 127242), Interval::new(127248, 127278), Interval::new(127280, 127311), Interval::new(127338, 127340), Interval::new(127376, 127376), Interval::new(127488, 127490), Interval::new(127504, 127547), Interval::new(127552, 127560), Interval::new(127568, 127569), Interval::new(130032, 130041), Interval::new(194560, 195101), Interval::new(917504, 921599), ]; /// Return the code point ranges of the 'Changes_When_NFKC_Casefolded' Unicode property. pub(crate) fn changes_when_nfkc_casefolded_ranges() -> &'static [Interval] { &CHANGES_WHEN_NFKC_CASEFOLDED } const BIDI_MIRRORED: [Interval; 114] = [ Interval::new(40, 41), Interval::new(60, 60), Interval::new(62, 62), Interval::new(91, 91), Interval::new(93, 93), Interval::new(123, 123), Interval::new(125, 125), Interval::new(171, 171), Interval::new(187, 187), Interval::new(3898, 3901), Interval::new(5787, 5788), Interval::new(8249, 8250), Interval::new(8261, 8262), Interval::new(8317, 8318), Interval::new(8333, 8334), Interval::new(8512, 8512), Interval::new(8705, 8708), Interval::new(8712, 8717), Interval::new(8721, 8721), Interval::new(8725, 8726), Interval::new(8730, 8733), Interval::new(8735, 8738), Interval::new(8740, 8740), Interval::new(8742, 8742), Interval::new(8747, 8755), Interval::new(8761, 8761), Interval::new(8763, 8780), Interval::new(8786, 8789), Interval::new(8799, 8800), Interval::new(8802, 8802), Interval::new(8804, 8811), Interval::new(8814, 8844), Interval::new(8847, 8850), Interval::new(8856, 8856), Interval::new(8866, 8867), Interval::new(8870, 8888), Interval::new(8894, 8895), Interval::new(8905, 8909), Interval::new(8912, 8913), Interval::new(8918, 8941), Interval::new(8944, 8959), Interval::new(8968, 8971), Interval::new(8992, 8993), Interval::new(9001, 9002), Interval::new(10088, 10101), Interval::new(10176, 10176), Interval::new(10179, 10182), Interval::new(10184, 10185), Interval::new(10187, 10189), Interval::new(10195, 10198), Interval::new(10204, 10206), Interval::new(10210, 10223), Interval::new(10627, 10648), Interval::new(10651, 10656), Interval::new(10658, 10671), Interval::new(10680, 10680), Interval::new(10688, 10693), Interval::new(10697, 10697), Interval::new(10702, 10706), Interval::new(10708, 10709), Interval::new(10712, 10716), Interval::new(10721, 10721), Interval::new(10723, 10725), Interval::new(10728, 10729), Interval::new(10740, 10745), Interval::new(10748, 10749), Interval::new(10762, 10780), Interval::new(10782, 10785), Interval::new(10788, 10788), Interval::new(10790, 10790), Interval::new(10793, 10793), Interval::new(10795, 10798), Interval::new(10804, 10805), Interval::new(10812, 10814), Interval::new(10839, 10840), Interval::new(10852, 10853), Interval::new(10858, 10861), Interval::new(10863, 10864), Interval::new(10867, 10868), Interval::new(10873, 10915), Interval::new(10918, 10925), Interval::new(10927, 10966), Interval::new(10972, 10972), Interval::new(10974, 10974), Interval::new(10978, 10982), Interval::new(10988, 10990), Interval::new(10995, 10995), Interval::new(10999, 11003), Interval::new(11005, 11005), Interval::new(11262, 11262), Interval::new(11778, 11781), Interval::new(11785, 11786), Interval::new(11788, 11789), Interval::new(11804, 11805), Interval::new(11808, 11817), Interval::new(11861, 11868), Interval::new(12296, 12305), Interval::new(12308, 12315), Interval::new(65113, 65118), Interval::new(65124, 65125), Interval::new(65288, 65289), Interval::new(65308, 65308), Interval::new(65310, 65310), Interval::new(65339, 65339), Interval::new(65341, 65341), Interval::new(65371, 65371), Interval::new(65373, 65373), Interval::new(65375, 65376), Interval::new(65378, 65379), Interval::new(120539, 120539), Interval::new(120597, 120597), Interval::new(120655, 120655), Interval::new(120713, 120713), Interval::new(120771, 120771), ]; /// Return the code point ranges of the 'Bidi_Mirrored' Unicode property. pub(crate) fn bidi_mirrored_ranges() -> &'static [Interval] { &BIDI_MIRRORED } pub(crate) const ASCII: [Interval; 1] = [Interval::new(0, 127)]; /// Return the code point ranges of the 'ASCII' Unicode property. pub(crate) fn ascii_ranges() -> &'static [Interval] { &ASCII } pub(crate) const ANY: [Interval; 1] = [Interval::new(0, 1114111)]; /// Return the code point ranges of the 'ANY' Unicode property. pub(crate) fn any_ranges() -> &'static [Interval] { &ANY } const ASSIGNED: [Interval; 707] = [ Interval::new(0, 887), Interval::new(890, 895), Interval::new(900, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1327), Interval::new(1329, 1366), Interval::new(1369, 1418), Interval::new(1421, 1423), Interval::new(1425, 1479), Interval::new(1488, 1514), Interval::new(1519, 1524), Interval::new(1536, 1805), Interval::new(1807, 1866), Interval::new(1869, 1969), Interval::new(1984, 2042), Interval::new(2045, 2093), Interval::new(2096, 2110), Interval::new(2112, 2139), Interval::new(2142, 2142), Interval::new(2144, 2154), Interval::new(2160, 2190), Interval::new(2192, 2193), Interval::new(2200, 2435), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2492, 2500), Interval::new(2503, 2504), Interval::new(2507, 2510), Interval::new(2519, 2519), Interval::new(2524, 2525), Interval::new(2527, 2531), Interval::new(2534, 2558), Interval::new(2561, 2563), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2620, 2620), Interval::new(2622, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2662, 2678), Interval::new(2689, 2691), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2748, 2757), Interval::new(2759, 2761), Interval::new(2763, 2765), Interval::new(2768, 2768), Interval::new(2784, 2787), Interval::new(2790, 2801), Interval::new(2809, 2815), Interval::new(2817, 2819), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2876, 2884), Interval::new(2887, 2888), Interval::new(2891, 2893), Interval::new(2901, 2903), Interval::new(2908, 2909), Interval::new(2911, 2915), Interval::new(2918, 2935), Interval::new(2946, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3006, 3010), Interval::new(3014, 3016), Interval::new(3018, 3021), Interval::new(3024, 3024), Interval::new(3031, 3031), Interval::new(3046, 3066), Interval::new(3072, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3132, 3140), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3171), Interval::new(3174, 3183), Interval::new(3191, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3260, 3268), Interval::new(3270, 3272), Interval::new(3274, 3277), Interval::new(3285, 3286), Interval::new(3293, 3294), Interval::new(3296, 3299), Interval::new(3302, 3311), Interval::new(3313, 3315), Interval::new(3328, 3340), Interval::new(3342, 3344), Interval::new(3346, 3396), Interval::new(3398, 3400), Interval::new(3402, 3407), Interval::new(3412, 3427), Interval::new(3430, 3455), Interval::new(3457, 3459), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3530, 3530), Interval::new(3535, 3540), Interval::new(3542, 3542), Interval::new(3544, 3551), Interval::new(3558, 3567), Interval::new(3570, 3572), Interval::new(3585, 3642), Interval::new(3647, 3675), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3784, 3790), Interval::new(3792, 3801), Interval::new(3804, 3807), Interval::new(3840, 3911), Interval::new(3913, 3948), Interval::new(3953, 3991), Interval::new(3993, 4028), Interval::new(4030, 4044), Interval::new(4046, 4058), Interval::new(4096, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4957, 4988), Interval::new(4992, 5017), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5120, 5788), Interval::new(5792, 5880), Interval::new(5888, 5909), Interval::new(5919, 5942), Interval::new(5952, 5971), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6002, 6003), Interval::new(6016, 6109), Interval::new(6112, 6121), Interval::new(6128, 6137), Interval::new(6144, 6169), Interval::new(6176, 6264), Interval::new(6272, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6432, 6443), Interval::new(6448, 6459), Interval::new(6464, 6464), Interval::new(6468, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6608, 6618), Interval::new(6622, 6683), Interval::new(6686, 6750), Interval::new(6752, 6780), Interval::new(6783, 6793), Interval::new(6800, 6809), Interval::new(6816, 6829), Interval::new(6832, 6862), Interval::new(6912, 6988), Interval::new(6992, 7038), Interval::new(7040, 7155), Interval::new(7164, 7223), Interval::new(7227, 7241), Interval::new(7245, 7304), Interval::new(7312, 7354), Interval::new(7357, 7367), Interval::new(7376, 7418), Interval::new(7424, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8132), Interval::new(8134, 8147), Interval::new(8150, 8155), Interval::new(8157, 8175), Interval::new(8178, 8180), Interval::new(8182, 8190), Interval::new(8192, 8292), Interval::new(8294, 8305), Interval::new(8308, 8334), Interval::new(8336, 8348), Interval::new(8352, 8384), Interval::new(8400, 8432), Interval::new(8448, 8587), Interval::new(8592, 9254), Interval::new(9280, 9290), Interval::new(9312, 11123), Interval::new(11126, 11157), Interval::new(11159, 11507), Interval::new(11513, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11632), Interval::new(11647, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(11744, 11869), Interval::new(11904, 11929), Interval::new(11931, 12019), Interval::new(12032, 12245), Interval::new(12272, 12351), Interval::new(12353, 12438), Interval::new(12441, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12688, 12771), Interval::new(12783, 12830), Interval::new(12832, 42124), Interval::new(42128, 42182), Interval::new(42192, 42539), Interval::new(42560, 42743), Interval::new(42752, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43052), Interval::new(43056, 43065), Interval::new(43072, 43127), Interval::new(43136, 43205), Interval::new(43214, 43225), Interval::new(43232, 43347), Interval::new(43359, 43388), Interval::new(43392, 43469), Interval::new(43471, 43481), Interval::new(43486, 43518), Interval::new(43520, 43574), Interval::new(43584, 43597), Interval::new(43600, 43609), Interval::new(43612, 43714), Interval::new(43739, 43766), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43883), Interval::new(43888, 44013), Interval::new(44016, 44025), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(55296, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64450), Interval::new(64467, 64911), Interval::new(64914, 64967), Interval::new(64975, 64975), Interval::new(65008, 65049), Interval::new(65056, 65106), Interval::new(65108, 65126), Interval::new(65128, 65131), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(65279, 65279), Interval::new(65281, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65504, 65510), Interval::new(65512, 65518), Interval::new(65529, 65533), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65792, 65794), Interval::new(65799, 65843), Interval::new(65847, 65934), Interval::new(65936, 65948), Interval::new(65952, 65952), Interval::new(66000, 66045), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66272, 66299), Interval::new(66304, 66339), Interval::new(66349, 66378), Interval::new(66384, 66426), Interval::new(66432, 66461), Interval::new(66463, 66499), Interval::new(66504, 66517), Interval::new(66560, 66717), Interval::new(66720, 66729), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66927, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67671, 67742), Interval::new(67751, 67759), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67835, 67867), Interval::new(67871, 67897), Interval::new(67903, 67903), Interval::new(67968, 68023), Interval::new(68028, 68047), Interval::new(68050, 68099), Interval::new(68101, 68102), Interval::new(68108, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68152, 68154), Interval::new(68159, 68168), Interval::new(68176, 68184), Interval::new(68192, 68255), Interval::new(68288, 68326), Interval::new(68331, 68342), Interval::new(68352, 68405), Interval::new(68409, 68437), Interval::new(68440, 68466), Interval::new(68472, 68497), Interval::new(68505, 68508), Interval::new(68521, 68527), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68858, 68903), Interval::new(68912, 68921), Interval::new(69216, 69246), Interval::new(69248, 69289), Interval::new(69291, 69293), Interval::new(69296, 69297), Interval::new(69373, 69415), Interval::new(69424, 69465), Interval::new(69488, 69513), Interval::new(69552, 69579), Interval::new(69600, 69622), Interval::new(69632, 69709), Interval::new(69714, 69749), Interval::new(69759, 69826), Interval::new(69837, 69837), Interval::new(69840, 69864), Interval::new(69872, 69881), Interval::new(69888, 69940), Interval::new(69942, 69959), Interval::new(69968, 70006), Interval::new(70016, 70111), Interval::new(70113, 70132), Interval::new(70144, 70161), Interval::new(70163, 70209), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70313), Interval::new(70320, 70378), Interval::new(70384, 70393), Interval::new(70400, 70403), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70459, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70480, 70480), Interval::new(70487, 70487), Interval::new(70493, 70499), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70656, 70747), Interval::new(70749, 70753), Interval::new(70784, 70855), Interval::new(70864, 70873), Interval::new(71040, 71093), Interval::new(71096, 71133), Interval::new(71168, 71236), Interval::new(71248, 71257), Interval::new(71264, 71276), Interval::new(71296, 71353), Interval::new(71360, 71369), Interval::new(71424, 71450), Interval::new(71453, 71467), Interval::new(71472, 71494), Interval::new(71680, 71739), Interval::new(71840, 71922), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71989), Interval::new(71991, 71992), Interval::new(71995, 72006), Interval::new(72016, 72025), Interval::new(72096, 72103), Interval::new(72106, 72151), Interval::new(72154, 72164), Interval::new(72192, 72263), Interval::new(72272, 72354), Interval::new(72368, 72440), Interval::new(72448, 72457), Interval::new(72704, 72712), Interval::new(72714, 72758), Interval::new(72760, 72773), Interval::new(72784, 72812), Interval::new(72816, 72847), Interval::new(72850, 72871), Interval::new(72873, 72886), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73031), Interval::new(73040, 73049), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73102), Interval::new(73104, 73105), Interval::new(73107, 73112), Interval::new(73120, 73129), Interval::new(73440, 73464), Interval::new(73472, 73488), Interval::new(73490, 73530), Interval::new(73534, 73561), Interval::new(73648, 73648), Interval::new(73664, 73713), Interval::new(73727, 74649), Interval::new(74752, 74862), Interval::new(74864, 74868), Interval::new(74880, 75075), Interval::new(77712, 77810), Interval::new(77824, 78933), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92768, 92777), Interval::new(92782, 92862), Interval::new(92864, 92873), Interval::new(92880, 92909), Interval::new(92912, 92917), Interval::new(92928, 92997), Interval::new(93008, 93017), Interval::new(93019, 93025), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93850), Interval::new(93952, 94026), Interval::new(94031, 94087), Interval::new(94095, 94111), Interval::new(94176, 94180), Interval::new(94192, 94193), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(113820, 113827), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(118608, 118723), Interval::new(118784, 119029), Interval::new(119040, 119078), Interval::new(119081, 119274), Interval::new(119296, 119365), Interval::new(119488, 119507), Interval::new(119520, 119539), Interval::new(119552, 119638), Interval::new(119648, 119672), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120779), Interval::new(120782, 121483), Interval::new(121499, 121503), Interval::new(121505, 121519), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(122928, 122989), Interval::new(123023, 123023), Interval::new(123136, 123180), Interval::new(123184, 123197), Interval::new(123200, 123209), Interval::new(123214, 123215), Interval::new(123536, 123566), Interval::new(123584, 123641), Interval::new(123647, 123647), Interval::new(124112, 124153), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125127, 125142), Interval::new(125184, 125259), Interval::new(125264, 125273), Interval::new(125278, 125279), Interval::new(126065, 126132), Interval::new(126209, 126269), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(126704, 126705), Interval::new(126976, 127019), Interval::new(127024, 127123), Interval::new(127136, 127150), Interval::new(127153, 127167), Interval::new(127169, 127183), Interval::new(127185, 127221), Interval::new(127232, 127405), Interval::new(127462, 127490), Interval::new(127504, 127547), Interval::new(127552, 127560), Interval::new(127568, 127569), Interval::new(127584, 127589), Interval::new(127744, 128727), Interval::new(128732, 128748), Interval::new(128752, 128764), Interval::new(128768, 128886), Interval::new(128891, 128985), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129024, 129035), Interval::new(129040, 129095), Interval::new(129104, 129113), Interval::new(129120, 129159), Interval::new(129168, 129197), Interval::new(129200, 129201), Interval::new(129280, 129619), Interval::new(129632, 129645), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), Interval::new(129792, 129938), Interval::new(129940, 129994), Interval::new(130032, 130041), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), Interval::new(917505, 917505), Interval::new(917536, 917631), Interval::new(917760, 917999), Interval::new(983040, 1048573), Interval::new(1048576, 1114109), ]; /// Return the code point ranges of the 'ANY' Unicode property. pub(crate) fn assigned_ranges() -> &'static [Interval] { &ASSIGNED } pub(crate) fn binary_property_ranges(value: &UnicodePropertyBinary) -> &'static [Interval] { use UnicodePropertyBinary::*; match value { Alphabetic => alphabetic_ranges(), CaseIgnorable => case_ignorable_ranges(), Cased => cased_ranges(), ChangesWhenCasefolded => changes_when_casefolded_ranges(), ChangesWhenCasemapped => changes_when_casemapped_ranges(), ChangesWhenLowercased => changes_when_lowercased_ranges(), ChangesWhenTitlecased => changes_when_titlecased_ranges(), ChangesWhenUppercased => changes_when_uppercased_ranges(), DefaultIgnorableCodePoint => default_ignorable_code_point_ranges(), GraphemeBase => grapheme_base_ranges(), GraphemeExtend => grapheme_extend_ranges(), IDContinue => id_continue_ranges(), IDStart => id_start_ranges(), Math => math_ranges(), XIDContinue => xid_continue_ranges(), XIDStart => xid_start_ranges(), ASCIIHexDigit => ascii_hex_digit_ranges(), BidiControl => bidi_control_ranges(), Dash => dash_ranges(), Deprecated => deprecated_ranges(), Diacritic => diacritic_ranges(), Extender => extender_ranges(), HexDigit => hex_digit_ranges(), IDSBinaryOperator => ids_binary_operator_ranges(), IDSTrinaryOperator => ids_trinary_operator_ranges(), Ideographic => ideographic_ranges(), JoinControl => join_control_ranges(), LogicalOrderException => logical_order_exception_ranges(), Lowercase => lowercase_ranges(), NoncharacterCodePoint => noncharacter_code_point_ranges(), PatternSyntax => pattern_syntax_ranges(), PatternWhiteSpace => pattern_white_space_ranges(), QuotationMark => quotation_mark_ranges(), Radical => radical_ranges(), RegionalIndicator => regional_indicator_ranges(), SentenceTerminal => sentence_terminal_ranges(), SoftDotted => soft_dotted_ranges(), TerminalPunctuation => terminal_punctuation_ranges(), UnifiedIdeograph => unified_ideograph_ranges(), Uppercase => uppercase_ranges(), VariationSelector => variation_selector_ranges(), WhiteSpace => white_space_ranges(), Emoji => emoji_ranges(), EmojiComponent => emoji_component_ranges(), EmojiModifier => emoji_modifier_ranges(), EmojiModifierBase => emoji_modifier_base_ranges(), EmojiPresentation => emoji_presentation_ranges(), ExtendedPictographic => extended_pictographic_ranges(), ChangesWhenNFKCCasefolded => changes_when_nfkc_casefolded_ranges(), BidiMirrored => bidi_mirrored_ranges(), Ascii => ascii_ranges(), Any => any_ranges(), Assigned => assigned_ranges(), } } #[derive(Debug, Clone, Copy)] pub enum UnicodePropertyBinary { Alphabetic, CaseIgnorable, Cased, ChangesWhenCasefolded, ChangesWhenCasemapped, ChangesWhenLowercased, ChangesWhenTitlecased, ChangesWhenUppercased, DefaultIgnorableCodePoint, GraphemeBase, GraphemeExtend, IDContinue, IDStart, Math, XIDContinue, XIDStart, ASCIIHexDigit, BidiControl, Dash, Deprecated, Diacritic, Extender, HexDigit, IDSBinaryOperator, IDSTrinaryOperator, Ideographic, JoinControl, LogicalOrderException, Lowercase, NoncharacterCodePoint, PatternSyntax, PatternWhiteSpace, QuotationMark, Radical, RegionalIndicator, SentenceTerminal, SoftDotted, TerminalPunctuation, UnifiedIdeograph, Uppercase, VariationSelector, WhiteSpace, Emoji, EmojiComponent, EmojiModifier, EmojiModifierBase, EmojiPresentation, ExtendedPictographic, ChangesWhenNFKCCasefolded, BidiMirrored, Ascii, Any, Assigned, } pub fn unicode_property_binary_from_str(s: &str) -> Option { use UnicodePropertyBinary::*; match s { "Alpha" | "Alphabetic" => Some(Alphabetic), "CI" | "Case_Ignorable" => Some(CaseIgnorable), "Cased" => Some(Cased), "CWCF" | "Changes_When_Casefolded" => Some(ChangesWhenCasefolded), "CWCM" | "Changes_When_Casemapped" => Some(ChangesWhenCasemapped), "CWL" | "Changes_When_Lowercased" => Some(ChangesWhenLowercased), "CWT" | "Changes_When_Titlecased" => Some(ChangesWhenTitlecased), "CWU" | "Changes_When_Uppercased" => Some(ChangesWhenUppercased), "DI" | "Default_Ignorable_Code_Point" => Some(DefaultIgnorableCodePoint), "Gr_Base" | "Grapheme_Base" => Some(GraphemeBase), "Gr_Ext" | "Grapheme_Extend" => Some(GraphemeExtend), "IDC" | "ID_Continue" => Some(IDContinue), "IDS" | "ID_Start" => Some(IDStart), "Math" => Some(Math), "XIDC" | "XID_Continue" => Some(XIDContinue), "XIDS" | "XID_Start" => Some(XIDStart), "AHex" | "ASCII_Hex_Digit" => Some(ASCIIHexDigit), "Bidi_C" | "Bidi_Control" => Some(BidiControl), "Dash" => Some(Dash), "Dep" | "Deprecated" => Some(Deprecated), "Dia" | "Diacritic" => Some(Diacritic), "Ext" | "Extender" => Some(Extender), "Hex" | "Hex_Digit" => Some(HexDigit), "IDSB" | "IDS_Binary_Operator" => Some(IDSBinaryOperator), "IDST" | "IDS_Trinary_Operator" => Some(IDSTrinaryOperator), "Ideo" | "Ideographic" => Some(Ideographic), "Join_C" | "Join_Control" => Some(JoinControl), "LOE" | "Logical_Order_Exception" => Some(LogicalOrderException), "Lower" | "Lowercase" => Some(Lowercase), "NChar" | "Noncharacter_Code_Point" => Some(NoncharacterCodePoint), "Pat_Syn" | "Pattern_Syntax" => Some(PatternSyntax), "Pat_WS" | "Pattern_White_Space" => Some(PatternWhiteSpace), "QMark" | "Quotation_Mark" => Some(QuotationMark), "Radical" => Some(Radical), "RI" | "Regional_Indicator" => Some(RegionalIndicator), "STerm" | "Sentence_Terminal" => Some(SentenceTerminal), "SD" | "Soft_Dotted" => Some(SoftDotted), "Term" | "Terminal_Punctuation" => Some(TerminalPunctuation), "UIdeo" | "Unified_Ideograph" => Some(UnifiedIdeograph), "Upper" | "Uppercase" => Some(Uppercase), "VS" | "Variation_Selector" => Some(VariationSelector), "space" | "White_Space" => Some(WhiteSpace), "Emoji" => Some(Emoji), "EComp" | "Emoji_Component" => Some(EmojiComponent), "EMod" | "Emoji_Modifier" => Some(EmojiModifier), "EBase" | "Emoji_Modifier_Base" => Some(EmojiModifierBase), "EPres" | "Emoji_Presentation" => Some(EmojiPresentation), "ExtPict" | "Extended_Pictographic" => Some(ExtendedPictographic), "CWKCF" | "Changes_When_NFKC_Casefolded" => Some(ChangesWhenNFKCCasefolded), "Bidi_M" | "Bidi_Mirrored" => Some(BidiMirrored), "ASCII" => Some(Ascii), "Any" => Some(Any), "Assigned" => Some(Assigned), _ => None, } } pub(crate) const FOLDS: [FoldRange; 204] = [ FoldRange::from(0x41, 26, 32, 1), FoldRange::from(0xB5, 1, 775, 1), FoldRange::from(0xC0, 23, 32, 1), FoldRange::from(0xD8, 7, 32, 1), FoldRange::from(0x100, 47, 1, 2), FoldRange::from(0x132, 5, 1, 2), FoldRange::from(0x139, 15, 1, 2), FoldRange::from(0x14A, 45, 1, 2), FoldRange::from(0x178, 1, -121, 1), FoldRange::from(0x179, 5, 1, 2), FoldRange::from(0x17F, 1, -268, 1), FoldRange::from(0x181, 1, 210, 1), FoldRange::from(0x182, 3, 1, 2), FoldRange::from(0x186, 1, 206, 1), FoldRange::from(0x187, 1, 1, 1), FoldRange::from(0x189, 2, 205, 1), FoldRange::from(0x18B, 1, 1, 1), FoldRange::from(0x18E, 1, 79, 1), FoldRange::from(0x18F, 1, 202, 1), FoldRange::from(0x190, 1, 203, 1), FoldRange::from(0x191, 1, 1, 1), FoldRange::from(0x193, 1, 205, 1), FoldRange::from(0x194, 1, 207, 1), FoldRange::from(0x196, 1, 211, 1), FoldRange::from(0x197, 1, 209, 1), FoldRange::from(0x198, 1, 1, 1), FoldRange::from(0x19C, 1, 211, 1), FoldRange::from(0x19D, 1, 213, 1), FoldRange::from(0x19F, 1, 214, 1), FoldRange::from(0x1A0, 5, 1, 2), FoldRange::from(0x1A6, 1, 218, 1), FoldRange::from(0x1A7, 1, 1, 1), FoldRange::from(0x1A9, 1, 218, 1), FoldRange::from(0x1AC, 1, 1, 1), FoldRange::from(0x1AE, 1, 218, 1), FoldRange::from(0x1AF, 1, 1, 1), FoldRange::from(0x1B1, 2, 217, 1), FoldRange::from(0x1B3, 3, 1, 2), FoldRange::from(0x1B7, 1, 219, 1), FoldRange::from(0x1B8, 5, 1, 4), FoldRange::from(0x1C4, 1, 2, 1), FoldRange::from(0x1C5, 1, 1, 1), FoldRange::from(0x1C7, 1, 2, 1), FoldRange::from(0x1C8, 1, 1, 1), FoldRange::from(0x1CA, 1, 2, 1), FoldRange::from(0x1CB, 17, 1, 2), FoldRange::from(0x1DE, 17, 1, 2), FoldRange::from(0x1F1, 1, 2, 1), FoldRange::from(0x1F2, 3, 1, 2), FoldRange::from(0x1F6, 1, -97, 1), FoldRange::from(0x1F7, 1, -56, 1), FoldRange::from(0x1F8, 39, 1, 2), FoldRange::from(0x220, 1, -130, 1), FoldRange::from(0x222, 17, 1, 2), FoldRange::from(0x23A, 1, 10795, 1), FoldRange::from(0x23B, 1, 1, 1), FoldRange::from(0x23D, 1, -163, 1), FoldRange::from(0x23E, 1, 10792, 1), FoldRange::from(0x241, 1, 1, 1), FoldRange::from(0x243, 1, -195, 1), FoldRange::from(0x244, 1, 69, 1), FoldRange::from(0x245, 1, 71, 1), FoldRange::from(0x246, 9, 1, 2), FoldRange::from(0x345, 1, 116, 1), FoldRange::from(0x370, 3, 1, 2), FoldRange::from(0x376, 1, 1, 1), FoldRange::from(0x37F, 1, 116, 1), FoldRange::from(0x386, 1, 38, 1), FoldRange::from(0x388, 3, 37, 1), FoldRange::from(0x38C, 1, 64, 1), FoldRange::from(0x38E, 2, 63, 1), FoldRange::from(0x391, 17, 32, 1), FoldRange::from(0x3A3, 9, 32, 1), FoldRange::from(0x3C2, 1, 1, 1), FoldRange::from(0x3CF, 1, 8, 1), FoldRange::from(0x3D0, 1, -30, 1), FoldRange::from(0x3D1, 1, -25, 1), FoldRange::from(0x3D5, 1, -15, 1), FoldRange::from(0x3D6, 1, -22, 1), FoldRange::from(0x3D8, 23, 1, 2), FoldRange::from(0x3F0, 1, -54, 1), FoldRange::from(0x3F1, 1, -48, 1), FoldRange::from(0x3F4, 1, -60, 1), FoldRange::from(0x3F5, 1, -64, 1), FoldRange::from(0x3F7, 1, 1, 1), FoldRange::from(0x3F9, 1, -7, 1), FoldRange::from(0x3FA, 1, 1, 1), FoldRange::from(0x3FD, 3, -130, 1), FoldRange::from(0x400, 16, 80, 1), FoldRange::from(0x410, 32, 32, 1), FoldRange::from(0x460, 33, 1, 2), FoldRange::from(0x48A, 53, 1, 2), FoldRange::from(0x4C0, 1, 15, 1), FoldRange::from(0x4C1, 13, 1, 2), FoldRange::from(0x4D0, 95, 1, 2), FoldRange::from(0x531, 38, 48, 1), FoldRange::from(0x10A0, 38, 7264, 1), FoldRange::from(0x10C7, 1, 7264, 1), FoldRange::from(0x10CD, 1, 7264, 1), FoldRange::from(0x13F8, 6, -8, 1), FoldRange::from(0x1C80, 1, -6222, 1), FoldRange::from(0x1C81, 1, -6221, 1), FoldRange::from(0x1C82, 1, -6212, 1), FoldRange::from(0x1C83, 2, -6210, 1), FoldRange::from(0x1C85, 1, -6211, 1), FoldRange::from(0x1C86, 1, -6204, 1), FoldRange::from(0x1C87, 1, -6180, 1), FoldRange::from(0x1C88, 1, 35267, 1), FoldRange::from(0x1C90, 43, -3008, 1), FoldRange::from(0x1CBD, 3, -3008, 1), FoldRange::from(0x1E00, 149, 1, 2), FoldRange::from(0x1E9B, 1, -58, 1), FoldRange::from(0x1E9E, 1, -7615, 1), FoldRange::from(0x1EA0, 95, 1, 2), FoldRange::from(0x1F08, 8, -8, 1), FoldRange::from(0x1F18, 6, -8, 1), FoldRange::from(0x1F28, 8, -8, 1), FoldRange::from(0x1F38, 8, -8, 1), FoldRange::from(0x1F48, 6, -8, 1), FoldRange::from(0x1F59, 7, -8, 2), FoldRange::from(0x1F68, 8, -8, 1), FoldRange::from(0x1F88, 8, -8, 1), FoldRange::from(0x1F98, 8, -8, 1), FoldRange::from(0x1FA8, 8, -8, 1), FoldRange::from(0x1FB8, 2, -8, 1), FoldRange::from(0x1FBA, 2, -74, 1), FoldRange::from(0x1FBC, 1, -9, 1), FoldRange::from(0x1FBE, 1, -7173, 1), FoldRange::from(0x1FC8, 4, -86, 1), FoldRange::from(0x1FCC, 1, -9, 1), FoldRange::from(0x1FD3, 1, -7235, 1), FoldRange::from(0x1FD8, 2, -8, 1), FoldRange::from(0x1FDA, 2, -100, 1), FoldRange::from(0x1FE3, 1, -7219, 1), FoldRange::from(0x1FE8, 2, -8, 1), FoldRange::from(0x1FEA, 2, -112, 1), FoldRange::from(0x1FEC, 1, -7, 1), FoldRange::from(0x1FF8, 2, -128, 1), FoldRange::from(0x1FFA, 2, -126, 1), FoldRange::from(0x1FFC, 1, -9, 1), FoldRange::from(0x2126, 1, -7517, 1), FoldRange::from(0x212A, 1, -8383, 1), FoldRange::from(0x212B, 1, -8262, 1), FoldRange::from(0x2132, 1, 28, 1), FoldRange::from(0x2160, 16, 16, 1), FoldRange::from(0x2183, 1, 1, 1), FoldRange::from(0x24B6, 26, 26, 1), FoldRange::from(0x2C00, 48, 48, 1), FoldRange::from(0x2C60, 1, 1, 1), FoldRange::from(0x2C62, 1, -10743, 1), FoldRange::from(0x2C63, 1, -3814, 1), FoldRange::from(0x2C64, 1, -10727, 1), FoldRange::from(0x2C67, 5, 1, 2), FoldRange::from(0x2C6D, 1, -10780, 1), FoldRange::from(0x2C6E, 1, -10749, 1), FoldRange::from(0x2C6F, 1, -10783, 1), FoldRange::from(0x2C70, 1, -10782, 1), FoldRange::from(0x2C72, 1, 1, 1), FoldRange::from(0x2C75, 1, 1, 1), FoldRange::from(0x2C7E, 2, -10815, 1), FoldRange::from(0x2C80, 99, 1, 2), FoldRange::from(0x2CEB, 3, 1, 2), FoldRange::from(0x2CF2, 1, 1, 1), FoldRange::from(0xA640, 45, 1, 2), FoldRange::from(0xA680, 27, 1, 2), FoldRange::from(0xA722, 13, 1, 2), FoldRange::from(0xA732, 61, 1, 2), FoldRange::from(0xA779, 3, 1, 2), FoldRange::from(0xA77D, 1, -35332, 1), FoldRange::from(0xA77E, 9, 1, 2), FoldRange::from(0xA78B, 1, 1, 1), FoldRange::from(0xA78D, 1, -42280, 1), FoldRange::from(0xA790, 3, 1, 2), FoldRange::from(0xA796, 19, 1, 2), FoldRange::from(0xA7AA, 1, -42308, 1), FoldRange::from(0xA7AB, 1, -42319, 1), FoldRange::from(0xA7AC, 1, -42315, 1), FoldRange::from(0xA7AD, 1, -42305, 1), FoldRange::from(0xA7AE, 1, -42308, 1), FoldRange::from(0xA7B0, 1, -42258, 1), FoldRange::from(0xA7B1, 1, -42282, 1), FoldRange::from(0xA7B2, 1, -42261, 1), FoldRange::from(0xA7B3, 1, 928, 1), FoldRange::from(0xA7B4, 15, 1, 2), FoldRange::from(0xA7C4, 1, -48, 1), FoldRange::from(0xA7C5, 1, -42307, 1), FoldRange::from(0xA7C6, 1, -35384, 1), FoldRange::from(0xA7C7, 3, 1, 2), FoldRange::from(0xA7D0, 1, 1, 1), FoldRange::from(0xA7D6, 3, 1, 2), FoldRange::from(0xA7F5, 1, 1, 1), FoldRange::from(0xAB70, 80, -38864, 1), FoldRange::from(0xFB05, 1, 1, 1), FoldRange::from(0xFF21, 26, 32, 1), FoldRange::from(0x10400, 40, 40, 1), FoldRange::from(0x104B0, 36, 40, 1), FoldRange::from(0x10570, 11, 39, 1), FoldRange::from(0x1057C, 15, 39, 1), FoldRange::from(0x1058C, 7, 39, 1), FoldRange::from(0x10594, 2, 39, 1), FoldRange::from(0x10C80, 51, 64, 1), FoldRange::from(0x118A0, 32, 32, 1), FoldRange::from(0x16E40, 32, 32, 1), FoldRange::from(0x1E900, 34, 34, 1), ]; const CLOSE_PUNCTUATION: [Interval; 76] = [ Interval::new(41, 41), Interval::new(93, 93), Interval::new(125, 125), Interval::new(3899, 3899), Interval::new(3901, 3901), Interval::new(5788, 5788), Interval::new(8262, 8262), Interval::new(8318, 8318), Interval::new(8334, 8334), Interval::new(8969, 8969), Interval::new(8971, 8971), Interval::new(9002, 9002), Interval::new(10089, 10089), Interval::new(10091, 10091), Interval::new(10093, 10093), Interval::new(10095, 10095), Interval::new(10097, 10097), Interval::new(10099, 10099), Interval::new(10101, 10101), Interval::new(10182, 10182), Interval::new(10215, 10215), Interval::new(10217, 10217), Interval::new(10219, 10219), Interval::new(10221, 10221), Interval::new(10223, 10223), Interval::new(10628, 10628), Interval::new(10630, 10630), Interval::new(10632, 10632), Interval::new(10634, 10634), Interval::new(10636, 10636), Interval::new(10638, 10638), Interval::new(10640, 10640), Interval::new(10642, 10642), Interval::new(10644, 10644), Interval::new(10646, 10646), Interval::new(10648, 10648), Interval::new(10713, 10713), Interval::new(10715, 10715), Interval::new(10749, 10749), Interval::new(11811, 11811), Interval::new(11813, 11813), Interval::new(11815, 11815), Interval::new(11817, 11817), Interval::new(11862, 11862), Interval::new(11864, 11864), Interval::new(11866, 11866), Interval::new(11868, 11868), Interval::new(12297, 12297), Interval::new(12299, 12299), Interval::new(12301, 12301), Interval::new(12303, 12303), Interval::new(12305, 12305), Interval::new(12309, 12309), Interval::new(12311, 12311), Interval::new(12313, 12313), Interval::new(12315, 12315), Interval::new(12318, 12319), Interval::new(64830, 64830), Interval::new(65048, 65048), Interval::new(65078, 65078), Interval::new(65080, 65080), Interval::new(65082, 65082), Interval::new(65084, 65084), Interval::new(65086, 65086), Interval::new(65088, 65088), Interval::new(65090, 65090), Interval::new(65092, 65092), Interval::new(65096, 65096), Interval::new(65114, 65114), Interval::new(65116, 65116), Interval::new(65118, 65118), Interval::new(65289, 65289), Interval::new(65341, 65341), Interval::new(65373, 65373), Interval::new(65376, 65376), Interval::new(65379, 65379), ]; /// Return the code point ranges of the 'Close_Punctuation' Unicode property. pub(crate) fn close_punctuation_ranges() -> &'static [Interval] { &CLOSE_PUNCTUATION } const CONNECTOR_PUNCTUATION: [Interval; 6] = [ Interval::new(95, 95), Interval::new(8255, 8256), Interval::new(8276, 8276), Interval::new(65075, 65076), Interval::new(65101, 65103), Interval::new(65343, 65343), ]; /// Return the code point ranges of the 'Connector_Punctuation' Unicode property. pub(crate) fn connector_punctuation_ranges() -> &'static [Interval] { &CONNECTOR_PUNCTUATION } const CONTROL: [Interval; 2] = [Interval::new(0, 31), Interval::new(127, 159)]; /// Return the code point ranges of the 'Control' Unicode property. pub(crate) fn control_ranges() -> &'static [Interval] { &CONTROL } const CURRENCY_SYMBOL: [Interval; 21] = [ Interval::new(36, 36), Interval::new(162, 165), Interval::new(1423, 1423), Interval::new(1547, 1547), Interval::new(2046, 2047), Interval::new(2546, 2547), Interval::new(2555, 2555), Interval::new(2801, 2801), Interval::new(3065, 3065), Interval::new(3647, 3647), Interval::new(6107, 6107), Interval::new(8352, 8384), Interval::new(43064, 43064), Interval::new(65020, 65020), Interval::new(65129, 65129), Interval::new(65284, 65284), Interval::new(65504, 65505), Interval::new(65509, 65510), Interval::new(73693, 73696), Interval::new(123647, 123647), Interval::new(126128, 126128), ]; /// Return the code point ranges of the 'Currency_Symbol' Unicode property. pub(crate) fn currency_symbol_ranges() -> &'static [Interval] { &CURRENCY_SYMBOL } const DASH_PUNCTUATION: [Interval; 19] = [ Interval::new(45, 45), Interval::new(1418, 1418), Interval::new(1470, 1470), Interval::new(5120, 5120), Interval::new(6150, 6150), Interval::new(8208, 8213), Interval::new(11799, 11799), Interval::new(11802, 11802), Interval::new(11834, 11835), Interval::new(11840, 11840), Interval::new(11869, 11869), Interval::new(12316, 12316), Interval::new(12336, 12336), Interval::new(12448, 12448), Interval::new(65073, 65074), Interval::new(65112, 65112), Interval::new(65123, 65123), Interval::new(65293, 65293), Interval::new(69293, 69293), ]; /// Return the code point ranges of the 'Dash_Punctuation' Unicode property. pub(crate) fn dash_punctuation_ranges() -> &'static [Interval] { &DASH_PUNCTUATION } const DECIMAL_NUMBER: [Interval; 64] = [ Interval::new(48, 57), Interval::new(1632, 1641), Interval::new(1776, 1785), Interval::new(1984, 1993), Interval::new(2406, 2415), Interval::new(2534, 2543), Interval::new(2662, 2671), Interval::new(2790, 2799), Interval::new(2918, 2927), Interval::new(3046, 3055), Interval::new(3174, 3183), Interval::new(3302, 3311), Interval::new(3430, 3439), Interval::new(3558, 3567), Interval::new(3664, 3673), Interval::new(3792, 3801), Interval::new(3872, 3881), Interval::new(4160, 4169), Interval::new(4240, 4249), Interval::new(6112, 6121), Interval::new(6160, 6169), Interval::new(6470, 6479), Interval::new(6608, 6617), Interval::new(6784, 6793), Interval::new(6800, 6809), Interval::new(6992, 7001), Interval::new(7088, 7097), Interval::new(7232, 7241), Interval::new(7248, 7257), Interval::new(42528, 42537), Interval::new(43216, 43225), Interval::new(43264, 43273), Interval::new(43472, 43481), Interval::new(43504, 43513), Interval::new(43600, 43609), Interval::new(44016, 44025), Interval::new(65296, 65305), Interval::new(66720, 66729), Interval::new(68912, 68921), Interval::new(69734, 69743), Interval::new(69872, 69881), Interval::new(69942, 69951), Interval::new(70096, 70105), Interval::new(70384, 70393), Interval::new(70736, 70745), Interval::new(70864, 70873), Interval::new(71248, 71257), Interval::new(71360, 71369), Interval::new(71472, 71481), Interval::new(71904, 71913), Interval::new(72016, 72025), Interval::new(72784, 72793), Interval::new(73040, 73049), Interval::new(73120, 73129), Interval::new(73552, 73561), Interval::new(92768, 92777), Interval::new(92864, 92873), Interval::new(93008, 93017), Interval::new(120782, 120831), Interval::new(123200, 123209), Interval::new(123632, 123641), Interval::new(124144, 124153), Interval::new(125264, 125273), Interval::new(130032, 130041), ]; /// Return the code point ranges of the 'Decimal_Number' Unicode property. pub(crate) fn decimal_number_ranges() -> &'static [Interval] { &DECIMAL_NUMBER } const ENCLOSING_MARK: [Interval; 5] = [ Interval::new(1160, 1161), Interval::new(6846, 6846), Interval::new(8413, 8416), Interval::new(8418, 8420), Interval::new(42608, 42610), ]; /// Return the code point ranges of the 'Enclosing_Mark' Unicode property. pub(crate) fn enclosing_mark_ranges() -> &'static [Interval] { &ENCLOSING_MARK } const FINAL_PUNCTUATION: [Interval; 10] = [ Interval::new(187, 187), Interval::new(8217, 8217), Interval::new(8221, 8221), Interval::new(8250, 8250), Interval::new(11779, 11779), Interval::new(11781, 11781), Interval::new(11786, 11786), Interval::new(11789, 11789), Interval::new(11805, 11805), Interval::new(11809, 11809), ]; /// Return the code point ranges of the 'Final_Punctuation' Unicode property. pub(crate) fn final_punctuation_ranges() -> &'static [Interval] { &FINAL_PUNCTUATION } const FORMAT: [Interval; 21] = [ Interval::new(173, 173), Interval::new(1536, 1541), Interval::new(1564, 1564), Interval::new(1757, 1757), Interval::new(1807, 1807), Interval::new(2192, 2193), Interval::new(2274, 2274), Interval::new(6158, 6158), Interval::new(8203, 8207), Interval::new(8234, 8238), Interval::new(8288, 8292), Interval::new(8294, 8303), Interval::new(65279, 65279), Interval::new(65529, 65531), Interval::new(69821, 69821), Interval::new(69837, 69837), Interval::new(78896, 78911), Interval::new(113824, 113827), Interval::new(119155, 119162), Interval::new(917505, 917505), Interval::new(917536, 917631), ]; /// Return the code point ranges of the 'Format' Unicode property. pub(crate) fn format_ranges() -> &'static [Interval] { &FORMAT } const INITIAL_PUNCTUATION: [Interval; 11] = [ Interval::new(171, 171), Interval::new(8216, 8216), Interval::new(8219, 8220), Interval::new(8223, 8223), Interval::new(8249, 8249), Interval::new(11778, 11778), Interval::new(11780, 11780), Interval::new(11785, 11785), Interval::new(11788, 11788), Interval::new(11804, 11804), Interval::new(11808, 11808), ]; /// Return the code point ranges of the 'Initial_Punctuation' Unicode property. pub(crate) fn initial_punctuation_ranges() -> &'static [Interval] { &INITIAL_PUNCTUATION } const LETTER_NUMBER: [Interval; 12] = [ Interval::new(5870, 5872), Interval::new(8544, 8578), Interval::new(8581, 8584), Interval::new(12295, 12295), Interval::new(12321, 12329), Interval::new(12344, 12346), Interval::new(42726, 42735), Interval::new(65856, 65908), Interval::new(66369, 66369), Interval::new(66378, 66378), Interval::new(66513, 66517), Interval::new(74752, 74862), ]; /// Return the code point ranges of the 'Letter_Number' Unicode property. pub(crate) fn letter_number_ranges() -> &'static [Interval] { &LETTER_NUMBER } const LINE_SEPARATOR: [Interval; 1] = [Interval::new(8232, 8232)]; /// Return the code point ranges of the 'Line_Separator' Unicode property. pub(crate) fn line_separator_ranges() -> &'static [Interval] { &LINE_SEPARATOR } const LOWERCASE_LETTER: [Interval; 658] = [ Interval::new(97, 122), Interval::new(181, 181), Interval::new(223, 246), Interval::new(248, 255), Interval::new(257, 257), Interval::new(259, 259), Interval::new(261, 261), Interval::new(263, 263), Interval::new(265, 265), Interval::new(267, 267), Interval::new(269, 269), Interval::new(271, 271), Interval::new(273, 273), Interval::new(275, 275), Interval::new(277, 277), Interval::new(279, 279), Interval::new(281, 281), Interval::new(283, 283), Interval::new(285, 285), Interval::new(287, 287), Interval::new(289, 289), Interval::new(291, 291), Interval::new(293, 293), Interval::new(295, 295), Interval::new(297, 297), Interval::new(299, 299), Interval::new(301, 301), Interval::new(303, 303), Interval::new(305, 305), Interval::new(307, 307), Interval::new(309, 309), Interval::new(311, 312), Interval::new(314, 314), Interval::new(316, 316), Interval::new(318, 318), Interval::new(320, 320), Interval::new(322, 322), Interval::new(324, 324), Interval::new(326, 326), Interval::new(328, 329), Interval::new(331, 331), Interval::new(333, 333), Interval::new(335, 335), Interval::new(337, 337), Interval::new(339, 339), Interval::new(341, 341), Interval::new(343, 343), Interval::new(345, 345), Interval::new(347, 347), Interval::new(349, 349), Interval::new(351, 351), Interval::new(353, 353), Interval::new(355, 355), Interval::new(357, 357), Interval::new(359, 359), Interval::new(361, 361), Interval::new(363, 363), Interval::new(365, 365), Interval::new(367, 367), Interval::new(369, 369), Interval::new(371, 371), Interval::new(373, 373), Interval::new(375, 375), Interval::new(378, 378), Interval::new(380, 380), Interval::new(382, 384), Interval::new(387, 387), Interval::new(389, 389), Interval::new(392, 392), Interval::new(396, 397), Interval::new(402, 402), Interval::new(405, 405), Interval::new(409, 411), Interval::new(414, 414), Interval::new(417, 417), Interval::new(419, 419), Interval::new(421, 421), Interval::new(424, 424), Interval::new(426, 427), Interval::new(429, 429), Interval::new(432, 432), Interval::new(436, 436), Interval::new(438, 438), Interval::new(441, 442), Interval::new(445, 447), Interval::new(454, 454), Interval::new(457, 457), Interval::new(460, 460), Interval::new(462, 462), Interval::new(464, 464), Interval::new(466, 466), Interval::new(468, 468), Interval::new(470, 470), Interval::new(472, 472), Interval::new(474, 474), Interval::new(476, 477), Interval::new(479, 479), Interval::new(481, 481), Interval::new(483, 483), Interval::new(485, 485), Interval::new(487, 487), Interval::new(489, 489), Interval::new(491, 491), Interval::new(493, 493), Interval::new(495, 496), Interval::new(499, 499), Interval::new(501, 501), Interval::new(505, 505), Interval::new(507, 507), Interval::new(509, 509), Interval::new(511, 511), Interval::new(513, 513), Interval::new(515, 515), Interval::new(517, 517), Interval::new(519, 519), Interval::new(521, 521), Interval::new(523, 523), Interval::new(525, 525), Interval::new(527, 527), Interval::new(529, 529), Interval::new(531, 531), Interval::new(533, 533), Interval::new(535, 535), Interval::new(537, 537), Interval::new(539, 539), Interval::new(541, 541), Interval::new(543, 543), Interval::new(545, 545), Interval::new(547, 547), Interval::new(549, 549), Interval::new(551, 551), Interval::new(553, 553), Interval::new(555, 555), Interval::new(557, 557), Interval::new(559, 559), Interval::new(561, 561), Interval::new(563, 569), Interval::new(572, 572), Interval::new(575, 576), Interval::new(578, 578), Interval::new(583, 583), Interval::new(585, 585), Interval::new(587, 587), Interval::new(589, 589), Interval::new(591, 659), Interval::new(661, 687), Interval::new(881, 881), Interval::new(883, 883), Interval::new(887, 887), Interval::new(891, 893), Interval::new(912, 912), Interval::new(940, 974), Interval::new(976, 977), Interval::new(981, 983), Interval::new(985, 985), Interval::new(987, 987), Interval::new(989, 989), Interval::new(991, 991), Interval::new(993, 993), Interval::new(995, 995), Interval::new(997, 997), Interval::new(999, 999), Interval::new(1001, 1001), Interval::new(1003, 1003), Interval::new(1005, 1005), Interval::new(1007, 1011), Interval::new(1013, 1013), Interval::new(1016, 1016), Interval::new(1019, 1020), Interval::new(1072, 1119), Interval::new(1121, 1121), Interval::new(1123, 1123), Interval::new(1125, 1125), Interval::new(1127, 1127), Interval::new(1129, 1129), Interval::new(1131, 1131), Interval::new(1133, 1133), Interval::new(1135, 1135), Interval::new(1137, 1137), Interval::new(1139, 1139), Interval::new(1141, 1141), Interval::new(1143, 1143), Interval::new(1145, 1145), Interval::new(1147, 1147), Interval::new(1149, 1149), Interval::new(1151, 1151), Interval::new(1153, 1153), Interval::new(1163, 1163), Interval::new(1165, 1165), Interval::new(1167, 1167), Interval::new(1169, 1169), Interval::new(1171, 1171), Interval::new(1173, 1173), Interval::new(1175, 1175), Interval::new(1177, 1177), Interval::new(1179, 1179), Interval::new(1181, 1181), Interval::new(1183, 1183), Interval::new(1185, 1185), Interval::new(1187, 1187), Interval::new(1189, 1189), Interval::new(1191, 1191), Interval::new(1193, 1193), Interval::new(1195, 1195), Interval::new(1197, 1197), Interval::new(1199, 1199), Interval::new(1201, 1201), Interval::new(1203, 1203), Interval::new(1205, 1205), Interval::new(1207, 1207), Interval::new(1209, 1209), Interval::new(1211, 1211), Interval::new(1213, 1213), Interval::new(1215, 1215), Interval::new(1218, 1218), Interval::new(1220, 1220), Interval::new(1222, 1222), Interval::new(1224, 1224), Interval::new(1226, 1226), Interval::new(1228, 1228), Interval::new(1230, 1231), Interval::new(1233, 1233), Interval::new(1235, 1235), Interval::new(1237, 1237), Interval::new(1239, 1239), Interval::new(1241, 1241), Interval::new(1243, 1243), Interval::new(1245, 1245), Interval::new(1247, 1247), Interval::new(1249, 1249), Interval::new(1251, 1251), Interval::new(1253, 1253), Interval::new(1255, 1255), Interval::new(1257, 1257), Interval::new(1259, 1259), Interval::new(1261, 1261), Interval::new(1263, 1263), Interval::new(1265, 1265), Interval::new(1267, 1267), Interval::new(1269, 1269), Interval::new(1271, 1271), Interval::new(1273, 1273), Interval::new(1275, 1275), Interval::new(1277, 1277), Interval::new(1279, 1279), Interval::new(1281, 1281), Interval::new(1283, 1283), Interval::new(1285, 1285), Interval::new(1287, 1287), Interval::new(1289, 1289), Interval::new(1291, 1291), Interval::new(1293, 1293), Interval::new(1295, 1295), Interval::new(1297, 1297), Interval::new(1299, 1299), Interval::new(1301, 1301), Interval::new(1303, 1303), Interval::new(1305, 1305), Interval::new(1307, 1307), Interval::new(1309, 1309), Interval::new(1311, 1311), Interval::new(1313, 1313), Interval::new(1315, 1315), Interval::new(1317, 1317), Interval::new(1319, 1319), Interval::new(1321, 1321), Interval::new(1323, 1323), Interval::new(1325, 1325), Interval::new(1327, 1327), Interval::new(1376, 1416), Interval::new(4304, 4346), Interval::new(4349, 4351), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7424, 7467), Interval::new(7531, 7543), Interval::new(7545, 7578), Interval::new(7681, 7681), Interval::new(7683, 7683), Interval::new(7685, 7685), Interval::new(7687, 7687), Interval::new(7689, 7689), Interval::new(7691, 7691), Interval::new(7693, 7693), Interval::new(7695, 7695), Interval::new(7697, 7697), Interval::new(7699, 7699), Interval::new(7701, 7701), Interval::new(7703, 7703), Interval::new(7705, 7705), Interval::new(7707, 7707), Interval::new(7709, 7709), Interval::new(7711, 7711), Interval::new(7713, 7713), Interval::new(7715, 7715), Interval::new(7717, 7717), Interval::new(7719, 7719), Interval::new(7721, 7721), Interval::new(7723, 7723), Interval::new(7725, 7725), Interval::new(7727, 7727), Interval::new(7729, 7729), Interval::new(7731, 7731), Interval::new(7733, 7733), Interval::new(7735, 7735), Interval::new(7737, 7737), Interval::new(7739, 7739), Interval::new(7741, 7741), Interval::new(7743, 7743), Interval::new(7745, 7745), Interval::new(7747, 7747), Interval::new(7749, 7749), Interval::new(7751, 7751), Interval::new(7753, 7753), Interval::new(7755, 7755), Interval::new(7757, 7757), Interval::new(7759, 7759), Interval::new(7761, 7761), Interval::new(7763, 7763), Interval::new(7765, 7765), Interval::new(7767, 7767), Interval::new(7769, 7769), Interval::new(7771, 7771), Interval::new(7773, 7773), Interval::new(7775, 7775), Interval::new(7777, 7777), Interval::new(7779, 7779), Interval::new(7781, 7781), Interval::new(7783, 7783), Interval::new(7785, 7785), Interval::new(7787, 7787), Interval::new(7789, 7789), Interval::new(7791, 7791), Interval::new(7793, 7793), Interval::new(7795, 7795), Interval::new(7797, 7797), Interval::new(7799, 7799), Interval::new(7801, 7801), Interval::new(7803, 7803), Interval::new(7805, 7805), Interval::new(7807, 7807), Interval::new(7809, 7809), Interval::new(7811, 7811), Interval::new(7813, 7813), Interval::new(7815, 7815), Interval::new(7817, 7817), Interval::new(7819, 7819), Interval::new(7821, 7821), Interval::new(7823, 7823), Interval::new(7825, 7825), Interval::new(7827, 7827), Interval::new(7829, 7837), Interval::new(7839, 7839), Interval::new(7841, 7841), Interval::new(7843, 7843), Interval::new(7845, 7845), Interval::new(7847, 7847), Interval::new(7849, 7849), Interval::new(7851, 7851), Interval::new(7853, 7853), Interval::new(7855, 7855), Interval::new(7857, 7857), Interval::new(7859, 7859), Interval::new(7861, 7861), Interval::new(7863, 7863), Interval::new(7865, 7865), Interval::new(7867, 7867), Interval::new(7869, 7869), Interval::new(7871, 7871), Interval::new(7873, 7873), Interval::new(7875, 7875), Interval::new(7877, 7877), Interval::new(7879, 7879), Interval::new(7881, 7881), Interval::new(7883, 7883), Interval::new(7885, 7885), Interval::new(7887, 7887), Interval::new(7889, 7889), Interval::new(7891, 7891), Interval::new(7893, 7893), Interval::new(7895, 7895), Interval::new(7897, 7897), Interval::new(7899, 7899), Interval::new(7901, 7901), Interval::new(7903, 7903), Interval::new(7905, 7905), Interval::new(7907, 7907), Interval::new(7909, 7909), Interval::new(7911, 7911), Interval::new(7913, 7913), Interval::new(7915, 7915), Interval::new(7917, 7917), Interval::new(7919, 7919), Interval::new(7921, 7921), Interval::new(7923, 7923), Interval::new(7925, 7925), Interval::new(7927, 7927), Interval::new(7929, 7929), Interval::new(7931, 7931), Interval::new(7933, 7933), Interval::new(7935, 7943), Interval::new(7952, 7957), Interval::new(7968, 7975), Interval::new(7984, 7991), Interval::new(8000, 8005), Interval::new(8016, 8023), Interval::new(8032, 8039), Interval::new(8048, 8061), Interval::new(8064, 8071), Interval::new(8080, 8087), Interval::new(8096, 8103), Interval::new(8112, 8116), Interval::new(8118, 8119), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8135), Interval::new(8144, 8147), Interval::new(8150, 8151), Interval::new(8160, 8167), Interval::new(8178, 8180), Interval::new(8182, 8183), Interval::new(8458, 8458), Interval::new(8462, 8463), Interval::new(8467, 8467), Interval::new(8495, 8495), Interval::new(8500, 8500), Interval::new(8505, 8505), Interval::new(8508, 8509), Interval::new(8518, 8521), Interval::new(8526, 8526), Interval::new(8580, 8580), Interval::new(11312, 11359), Interval::new(11361, 11361), Interval::new(11365, 11366), Interval::new(11368, 11368), Interval::new(11370, 11370), Interval::new(11372, 11372), Interval::new(11377, 11377), Interval::new(11379, 11380), Interval::new(11382, 11387), Interval::new(11393, 11393), Interval::new(11395, 11395), Interval::new(11397, 11397), Interval::new(11399, 11399), Interval::new(11401, 11401), Interval::new(11403, 11403), Interval::new(11405, 11405), Interval::new(11407, 11407), Interval::new(11409, 11409), Interval::new(11411, 11411), Interval::new(11413, 11413), Interval::new(11415, 11415), Interval::new(11417, 11417), Interval::new(11419, 11419), Interval::new(11421, 11421), Interval::new(11423, 11423), Interval::new(11425, 11425), Interval::new(11427, 11427), Interval::new(11429, 11429), Interval::new(11431, 11431), Interval::new(11433, 11433), Interval::new(11435, 11435), Interval::new(11437, 11437), Interval::new(11439, 11439), Interval::new(11441, 11441), Interval::new(11443, 11443), Interval::new(11445, 11445), Interval::new(11447, 11447), Interval::new(11449, 11449), Interval::new(11451, 11451), Interval::new(11453, 11453), Interval::new(11455, 11455), Interval::new(11457, 11457), Interval::new(11459, 11459), Interval::new(11461, 11461), Interval::new(11463, 11463), Interval::new(11465, 11465), Interval::new(11467, 11467), Interval::new(11469, 11469), Interval::new(11471, 11471), Interval::new(11473, 11473), Interval::new(11475, 11475), Interval::new(11477, 11477), Interval::new(11479, 11479), Interval::new(11481, 11481), Interval::new(11483, 11483), Interval::new(11485, 11485), Interval::new(11487, 11487), Interval::new(11489, 11489), Interval::new(11491, 11492), Interval::new(11500, 11500), Interval::new(11502, 11502), Interval::new(11507, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(42561, 42561), Interval::new(42563, 42563), Interval::new(42565, 42565), Interval::new(42567, 42567), Interval::new(42569, 42569), Interval::new(42571, 42571), Interval::new(42573, 42573), Interval::new(42575, 42575), Interval::new(42577, 42577), Interval::new(42579, 42579), Interval::new(42581, 42581), Interval::new(42583, 42583), Interval::new(42585, 42585), Interval::new(42587, 42587), Interval::new(42589, 42589), Interval::new(42591, 42591), Interval::new(42593, 42593), Interval::new(42595, 42595), Interval::new(42597, 42597), Interval::new(42599, 42599), Interval::new(42601, 42601), Interval::new(42603, 42603), Interval::new(42605, 42605), Interval::new(42625, 42625), Interval::new(42627, 42627), Interval::new(42629, 42629), Interval::new(42631, 42631), Interval::new(42633, 42633), Interval::new(42635, 42635), Interval::new(42637, 42637), Interval::new(42639, 42639), Interval::new(42641, 42641), Interval::new(42643, 42643), Interval::new(42645, 42645), Interval::new(42647, 42647), Interval::new(42649, 42649), Interval::new(42651, 42651), Interval::new(42787, 42787), Interval::new(42789, 42789), Interval::new(42791, 42791), Interval::new(42793, 42793), Interval::new(42795, 42795), Interval::new(42797, 42797), Interval::new(42799, 42801), Interval::new(42803, 42803), Interval::new(42805, 42805), Interval::new(42807, 42807), Interval::new(42809, 42809), Interval::new(42811, 42811), Interval::new(42813, 42813), Interval::new(42815, 42815), Interval::new(42817, 42817), Interval::new(42819, 42819), Interval::new(42821, 42821), Interval::new(42823, 42823), Interval::new(42825, 42825), Interval::new(42827, 42827), Interval::new(42829, 42829), Interval::new(42831, 42831), Interval::new(42833, 42833), Interval::new(42835, 42835), Interval::new(42837, 42837), Interval::new(42839, 42839), Interval::new(42841, 42841), Interval::new(42843, 42843), Interval::new(42845, 42845), Interval::new(42847, 42847), Interval::new(42849, 42849), Interval::new(42851, 42851), Interval::new(42853, 42853), Interval::new(42855, 42855), Interval::new(42857, 42857), Interval::new(42859, 42859), Interval::new(42861, 42861), Interval::new(42863, 42863), Interval::new(42865, 42872), Interval::new(42874, 42874), Interval::new(42876, 42876), Interval::new(42879, 42879), Interval::new(42881, 42881), Interval::new(42883, 42883), Interval::new(42885, 42885), Interval::new(42887, 42887), Interval::new(42892, 42892), Interval::new(42894, 42894), Interval::new(42897, 42897), Interval::new(42899, 42901), Interval::new(42903, 42903), Interval::new(42905, 42905), Interval::new(42907, 42907), Interval::new(42909, 42909), Interval::new(42911, 42911), Interval::new(42913, 42913), Interval::new(42915, 42915), Interval::new(42917, 42917), Interval::new(42919, 42919), Interval::new(42921, 42921), Interval::new(42927, 42927), Interval::new(42933, 42933), Interval::new(42935, 42935), Interval::new(42937, 42937), Interval::new(42939, 42939), Interval::new(42941, 42941), Interval::new(42943, 42943), Interval::new(42945, 42945), Interval::new(42947, 42947), Interval::new(42952, 42952), Interval::new(42954, 42954), Interval::new(42961, 42961), Interval::new(42963, 42963), Interval::new(42965, 42965), Interval::new(42967, 42967), Interval::new(42969, 42969), Interval::new(42998, 42998), Interval::new(43002, 43002), Interval::new(43824, 43866), Interval::new(43872, 43880), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65345, 65370), Interval::new(66600, 66639), Interval::new(66776, 66811), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(68800, 68850), Interval::new(71872, 71903), Interval::new(93792, 93823), Interval::new(119834, 119859), Interval::new(119886, 119892), Interval::new(119894, 119911), Interval::new(119938, 119963), Interval::new(119990, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120015), Interval::new(120042, 120067), Interval::new(120094, 120119), Interval::new(120146, 120171), Interval::new(120198, 120223), Interval::new(120250, 120275), Interval::new(120302, 120327), Interval::new(120354, 120379), Interval::new(120406, 120431), Interval::new(120458, 120485), Interval::new(120514, 120538), Interval::new(120540, 120545), Interval::new(120572, 120596), Interval::new(120598, 120603), Interval::new(120630, 120654), Interval::new(120656, 120661), Interval::new(120688, 120712), Interval::new(120714, 120719), Interval::new(120746, 120770), Interval::new(120772, 120777), Interval::new(120779, 120779), Interval::new(122624, 122633), Interval::new(122635, 122654), Interval::new(122661, 122666), Interval::new(125218, 125251), ]; /// Return the code point ranges of the 'Lowercase_Letter' Unicode property. pub(crate) fn lowercase_letter_ranges() -> &'static [Interval] { &LOWERCASE_LETTER } const MATH_SYMBOL: [Interval; 64] = [ Interval::new(43, 43), Interval::new(60, 62), Interval::new(124, 124), Interval::new(126, 126), Interval::new(172, 172), Interval::new(177, 177), Interval::new(215, 215), Interval::new(247, 247), Interval::new(1014, 1014), Interval::new(1542, 1544), Interval::new(8260, 8260), Interval::new(8274, 8274), Interval::new(8314, 8316), Interval::new(8330, 8332), Interval::new(8472, 8472), Interval::new(8512, 8516), Interval::new(8523, 8523), Interval::new(8592, 8596), Interval::new(8602, 8603), Interval::new(8608, 8608), Interval::new(8611, 8611), Interval::new(8614, 8614), Interval::new(8622, 8622), Interval::new(8654, 8655), Interval::new(8658, 8658), Interval::new(8660, 8660), Interval::new(8692, 8959), Interval::new(8992, 8993), Interval::new(9084, 9084), Interval::new(9115, 9139), Interval::new(9180, 9185), Interval::new(9655, 9655), Interval::new(9665, 9665), Interval::new(9720, 9727), Interval::new(9839, 9839), Interval::new(10176, 10180), Interval::new(10183, 10213), Interval::new(10224, 10239), Interval::new(10496, 10626), Interval::new(10649, 10711), Interval::new(10716, 10747), Interval::new(10750, 11007), Interval::new(11056, 11076), Interval::new(11079, 11084), Interval::new(64297, 64297), Interval::new(65122, 65122), Interval::new(65124, 65126), Interval::new(65291, 65291), Interval::new(65308, 65310), Interval::new(65372, 65372), Interval::new(65374, 65374), Interval::new(65506, 65506), Interval::new(65513, 65516), Interval::new(120513, 120513), Interval::new(120539, 120539), Interval::new(120571, 120571), Interval::new(120597, 120597), Interval::new(120629, 120629), Interval::new(120655, 120655), Interval::new(120687, 120687), Interval::new(120713, 120713), Interval::new(120745, 120745), Interval::new(120771, 120771), Interval::new(126704, 126705), ]; /// Return the code point ranges of the 'Math_Symbol' Unicode property. pub(crate) fn math_symbol_ranges() -> &'static [Interval] { &MATH_SYMBOL } const MODIFIER_LETTER: [Interval; 71] = [ Interval::new(688, 705), Interval::new(710, 721), Interval::new(736, 740), Interval::new(748, 748), Interval::new(750, 750), Interval::new(884, 884), Interval::new(890, 890), Interval::new(1369, 1369), Interval::new(1600, 1600), Interval::new(1765, 1766), Interval::new(2036, 2037), Interval::new(2042, 2042), Interval::new(2074, 2074), Interval::new(2084, 2084), Interval::new(2088, 2088), Interval::new(2249, 2249), Interval::new(2417, 2417), Interval::new(3654, 3654), Interval::new(3782, 3782), Interval::new(4348, 4348), Interval::new(6103, 6103), Interval::new(6211, 6211), Interval::new(6823, 6823), Interval::new(7288, 7293), Interval::new(7468, 7530), Interval::new(7544, 7544), Interval::new(7579, 7615), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(11388, 11389), Interval::new(11631, 11631), Interval::new(11823, 11823), Interval::new(12293, 12293), Interval::new(12337, 12341), Interval::new(12347, 12347), Interval::new(12445, 12446), Interval::new(12540, 12542), Interval::new(40981, 40981), Interval::new(42232, 42237), Interval::new(42508, 42508), Interval::new(42623, 42623), Interval::new(42652, 42653), Interval::new(42775, 42783), Interval::new(42864, 42864), Interval::new(42888, 42888), Interval::new(42994, 42996), Interval::new(43000, 43001), Interval::new(43471, 43471), Interval::new(43494, 43494), Interval::new(43632, 43632), Interval::new(43741, 43741), Interval::new(43763, 43764), Interval::new(43868, 43871), Interval::new(43881, 43881), Interval::new(65392, 65392), Interval::new(65438, 65439), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(92992, 92995), Interval::new(94099, 94111), Interval::new(94176, 94177), Interval::new(94179, 94179), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(122928, 122989), Interval::new(123191, 123197), Interval::new(124139, 124139), Interval::new(125259, 125259), ]; /// Return the code point ranges of the 'Modifier_Letter' Unicode property. pub(crate) fn modifier_letter_ranges() -> &'static [Interval] { &MODIFIER_LETTER } const MODIFIER_SYMBOL: [Interval; 31] = [ Interval::new(94, 94), Interval::new(96, 96), Interval::new(168, 168), Interval::new(175, 175), Interval::new(180, 180), Interval::new(184, 184), Interval::new(706, 709), Interval::new(722, 735), Interval::new(741, 747), Interval::new(749, 749), Interval::new(751, 767), Interval::new(885, 885), Interval::new(900, 901), Interval::new(2184, 2184), Interval::new(8125, 8125), Interval::new(8127, 8129), Interval::new(8141, 8143), Interval::new(8157, 8159), Interval::new(8173, 8175), Interval::new(8189, 8190), Interval::new(12443, 12444), Interval::new(42752, 42774), Interval::new(42784, 42785), Interval::new(42889, 42890), Interval::new(43867, 43867), Interval::new(43882, 43883), Interval::new(64434, 64450), Interval::new(65342, 65342), Interval::new(65344, 65344), Interval::new(65507, 65507), Interval::new(127995, 127999), ]; /// Return the code point ranges of the 'Modifier_Symbol' Unicode property. pub(crate) fn modifier_symbol_ranges() -> &'static [Interval] { &MODIFIER_SYMBOL } const NONSPACING_MARK: [Interval; 346] = [ Interval::new(768, 879), Interval::new(1155, 1159), Interval::new(1425, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1477), Interval::new(1479, 1479), Interval::new(1552, 1562), Interval::new(1611, 1631), Interval::new(1648, 1648), Interval::new(1750, 1756), Interval::new(1759, 1764), Interval::new(1767, 1768), Interval::new(1770, 1773), Interval::new(1809, 1809), Interval::new(1840, 1866), Interval::new(1958, 1968), Interval::new(2027, 2035), Interval::new(2045, 2045), Interval::new(2070, 2073), Interval::new(2075, 2083), Interval::new(2085, 2087), Interval::new(2089, 2093), Interval::new(2137, 2139), Interval::new(2200, 2207), Interval::new(2250, 2273), Interval::new(2275, 2306), Interval::new(2362, 2362), Interval::new(2364, 2364), Interval::new(2369, 2376), Interval::new(2381, 2381), Interval::new(2385, 2391), Interval::new(2402, 2403), Interval::new(2433, 2433), Interval::new(2492, 2492), Interval::new(2497, 2500), Interval::new(2509, 2509), Interval::new(2530, 2531), Interval::new(2558, 2558), Interval::new(2561, 2562), Interval::new(2620, 2620), Interval::new(2625, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2672, 2673), Interval::new(2677, 2677), Interval::new(2689, 2690), Interval::new(2748, 2748), Interval::new(2753, 2757), Interval::new(2759, 2760), Interval::new(2765, 2765), Interval::new(2786, 2787), Interval::new(2810, 2815), Interval::new(2817, 2817), Interval::new(2876, 2876), Interval::new(2879, 2879), Interval::new(2881, 2884), Interval::new(2893, 2893), Interval::new(2901, 2902), Interval::new(2914, 2915), Interval::new(2946, 2946), Interval::new(3008, 3008), Interval::new(3021, 3021), Interval::new(3072, 3072), Interval::new(3076, 3076), Interval::new(3132, 3132), Interval::new(3134, 3136), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3170, 3171), Interval::new(3201, 3201), Interval::new(3260, 3260), Interval::new(3263, 3263), Interval::new(3270, 3270), Interval::new(3276, 3277), Interval::new(3298, 3299), Interval::new(3328, 3329), Interval::new(3387, 3388), Interval::new(3393, 3396), Interval::new(3405, 3405), Interval::new(3426, 3427), Interval::new(3457, 3457), Interval::new(3530, 3530), Interval::new(3538, 3540), Interval::new(3542, 3542), Interval::new(3633, 3633), Interval::new(3636, 3642), Interval::new(3655, 3662), Interval::new(3761, 3761), Interval::new(3764, 3772), Interval::new(3784, 3790), Interval::new(3864, 3865), Interval::new(3893, 3893), Interval::new(3895, 3895), Interval::new(3897, 3897), Interval::new(3953, 3966), Interval::new(3968, 3972), Interval::new(3974, 3975), Interval::new(3981, 3991), Interval::new(3993, 4028), Interval::new(4038, 4038), Interval::new(4141, 4144), Interval::new(4146, 4151), Interval::new(4153, 4154), Interval::new(4157, 4158), Interval::new(4184, 4185), Interval::new(4190, 4192), Interval::new(4209, 4212), Interval::new(4226, 4226), Interval::new(4229, 4230), Interval::new(4237, 4237), Interval::new(4253, 4253), Interval::new(4957, 4959), Interval::new(5906, 5908), Interval::new(5938, 5939), Interval::new(5970, 5971), Interval::new(6002, 6003), Interval::new(6068, 6069), Interval::new(6071, 6077), Interval::new(6086, 6086), Interval::new(6089, 6099), Interval::new(6109, 6109), Interval::new(6155, 6157), Interval::new(6159, 6159), Interval::new(6277, 6278), Interval::new(6313, 6313), Interval::new(6432, 6434), Interval::new(6439, 6440), Interval::new(6450, 6450), Interval::new(6457, 6459), Interval::new(6679, 6680), Interval::new(6683, 6683), Interval::new(6742, 6742), Interval::new(6744, 6750), Interval::new(6752, 6752), Interval::new(6754, 6754), Interval::new(6757, 6764), Interval::new(6771, 6780), Interval::new(6783, 6783), Interval::new(6832, 6845), Interval::new(6847, 6862), Interval::new(6912, 6915), Interval::new(6964, 6964), Interval::new(6966, 6970), Interval::new(6972, 6972), Interval::new(6978, 6978), Interval::new(7019, 7027), Interval::new(7040, 7041), Interval::new(7074, 7077), Interval::new(7080, 7081), Interval::new(7083, 7085), Interval::new(7142, 7142), Interval::new(7144, 7145), Interval::new(7149, 7149), Interval::new(7151, 7153), Interval::new(7212, 7219), Interval::new(7222, 7223), Interval::new(7376, 7378), Interval::new(7380, 7392), Interval::new(7394, 7400), Interval::new(7405, 7405), Interval::new(7412, 7412), Interval::new(7416, 7417), Interval::new(7616, 7679), Interval::new(8400, 8412), Interval::new(8417, 8417), Interval::new(8421, 8432), Interval::new(11503, 11505), Interval::new(11647, 11647), Interval::new(11744, 11775), Interval::new(12330, 12333), Interval::new(12441, 12442), Interval::new(42607, 42607), Interval::new(42612, 42621), Interval::new(42654, 42655), Interval::new(42736, 42737), Interval::new(43010, 43010), Interval::new(43014, 43014), Interval::new(43019, 43019), Interval::new(43045, 43046), Interval::new(43052, 43052), Interval::new(43204, 43205), Interval::new(43232, 43249), Interval::new(43263, 43263), Interval::new(43302, 43309), Interval::new(43335, 43345), Interval::new(43392, 43394), Interval::new(43443, 43443), Interval::new(43446, 43449), Interval::new(43452, 43453), Interval::new(43493, 43493), Interval::new(43561, 43566), Interval::new(43569, 43570), Interval::new(43573, 43574), Interval::new(43587, 43587), Interval::new(43596, 43596), Interval::new(43644, 43644), Interval::new(43696, 43696), Interval::new(43698, 43700), Interval::new(43703, 43704), Interval::new(43710, 43711), Interval::new(43713, 43713), Interval::new(43756, 43757), Interval::new(43766, 43766), Interval::new(44005, 44005), Interval::new(44008, 44008), Interval::new(44013, 44013), Interval::new(64286, 64286), Interval::new(65024, 65039), Interval::new(65056, 65071), Interval::new(66045, 66045), Interval::new(66272, 66272), Interval::new(66422, 66426), Interval::new(68097, 68099), Interval::new(68101, 68102), Interval::new(68108, 68111), Interval::new(68152, 68154), Interval::new(68159, 68159), Interval::new(68325, 68326), Interval::new(68900, 68903), Interval::new(69291, 69292), Interval::new(69373, 69375), Interval::new(69446, 69456), Interval::new(69506, 69509), Interval::new(69633, 69633), Interval::new(69688, 69702), Interval::new(69744, 69744), Interval::new(69747, 69748), Interval::new(69759, 69761), Interval::new(69811, 69814), Interval::new(69817, 69818), Interval::new(69826, 69826), Interval::new(69888, 69890), Interval::new(69927, 69931), Interval::new(69933, 69940), Interval::new(70003, 70003), Interval::new(70016, 70017), Interval::new(70070, 70078), Interval::new(70089, 70092), Interval::new(70095, 70095), Interval::new(70191, 70193), Interval::new(70196, 70196), Interval::new(70198, 70199), Interval::new(70206, 70206), Interval::new(70209, 70209), Interval::new(70367, 70367), Interval::new(70371, 70378), Interval::new(70400, 70401), Interval::new(70459, 70460), Interval::new(70464, 70464), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70712, 70719), Interval::new(70722, 70724), Interval::new(70726, 70726), Interval::new(70750, 70750), Interval::new(70835, 70840), Interval::new(70842, 70842), Interval::new(70847, 70848), Interval::new(70850, 70851), Interval::new(71090, 71093), Interval::new(71100, 71101), Interval::new(71103, 71104), Interval::new(71132, 71133), Interval::new(71219, 71226), Interval::new(71229, 71229), Interval::new(71231, 71232), Interval::new(71339, 71339), Interval::new(71341, 71341), Interval::new(71344, 71349), Interval::new(71351, 71351), Interval::new(71453, 71455), Interval::new(71458, 71461), Interval::new(71463, 71467), Interval::new(71727, 71735), Interval::new(71737, 71738), Interval::new(71995, 71996), Interval::new(71998, 71998), Interval::new(72003, 72003), Interval::new(72148, 72151), Interval::new(72154, 72155), Interval::new(72160, 72160), Interval::new(72193, 72202), Interval::new(72243, 72248), Interval::new(72251, 72254), Interval::new(72263, 72263), Interval::new(72273, 72278), Interval::new(72281, 72283), Interval::new(72330, 72342), Interval::new(72344, 72345), Interval::new(72752, 72758), Interval::new(72760, 72765), Interval::new(72767, 72767), Interval::new(72850, 72871), Interval::new(72874, 72880), Interval::new(72882, 72883), Interval::new(72885, 72886), Interval::new(73009, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73029), Interval::new(73031, 73031), Interval::new(73104, 73105), Interval::new(73109, 73109), Interval::new(73111, 73111), Interval::new(73459, 73460), Interval::new(73472, 73473), Interval::new(73526, 73530), Interval::new(73536, 73536), Interval::new(73538, 73538), Interval::new(78912, 78912), Interval::new(78919, 78933), Interval::new(92912, 92916), Interval::new(92976, 92982), Interval::new(94031, 94031), Interval::new(94095, 94098), Interval::new(94180, 94180), Interval::new(113821, 113822), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119143, 119145), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(119362, 119364), Interval::new(121344, 121398), Interval::new(121403, 121452), Interval::new(121461, 121461), Interval::new(121476, 121476), Interval::new(121499, 121503), Interval::new(121505, 121519), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(123023, 123023), Interval::new(123184, 123190), Interval::new(123566, 123566), Interval::new(123628, 123631), Interval::new(124140, 124143), Interval::new(125136, 125142), Interval::new(125252, 125258), Interval::new(917760, 917999), ]; /// Return the code point ranges of the 'Nonspacing_Mark' Unicode property. pub(crate) fn nonspacing_mark_ranges() -> &'static [Interval] { &NONSPACING_MARK } const OPEN_PUNCTUATION: [Interval; 79] = [ Interval::new(40, 40), Interval::new(91, 91), Interval::new(123, 123), Interval::new(3898, 3898), Interval::new(3900, 3900), Interval::new(5787, 5787), Interval::new(8218, 8218), Interval::new(8222, 8222), Interval::new(8261, 8261), Interval::new(8317, 8317), Interval::new(8333, 8333), Interval::new(8968, 8968), Interval::new(8970, 8970), Interval::new(9001, 9001), Interval::new(10088, 10088), Interval::new(10090, 10090), Interval::new(10092, 10092), Interval::new(10094, 10094), Interval::new(10096, 10096), Interval::new(10098, 10098), Interval::new(10100, 10100), Interval::new(10181, 10181), Interval::new(10214, 10214), Interval::new(10216, 10216), Interval::new(10218, 10218), Interval::new(10220, 10220), Interval::new(10222, 10222), Interval::new(10627, 10627), Interval::new(10629, 10629), Interval::new(10631, 10631), Interval::new(10633, 10633), Interval::new(10635, 10635), Interval::new(10637, 10637), Interval::new(10639, 10639), Interval::new(10641, 10641), Interval::new(10643, 10643), Interval::new(10645, 10645), Interval::new(10647, 10647), Interval::new(10712, 10712), Interval::new(10714, 10714), Interval::new(10748, 10748), Interval::new(11810, 11810), Interval::new(11812, 11812), Interval::new(11814, 11814), Interval::new(11816, 11816), Interval::new(11842, 11842), Interval::new(11861, 11861), Interval::new(11863, 11863), Interval::new(11865, 11865), Interval::new(11867, 11867), Interval::new(12296, 12296), Interval::new(12298, 12298), Interval::new(12300, 12300), Interval::new(12302, 12302), Interval::new(12304, 12304), Interval::new(12308, 12308), Interval::new(12310, 12310), Interval::new(12312, 12312), Interval::new(12314, 12314), Interval::new(12317, 12317), Interval::new(64831, 64831), Interval::new(65047, 65047), Interval::new(65077, 65077), Interval::new(65079, 65079), Interval::new(65081, 65081), Interval::new(65083, 65083), Interval::new(65085, 65085), Interval::new(65087, 65087), Interval::new(65089, 65089), Interval::new(65091, 65091), Interval::new(65095, 65095), Interval::new(65113, 65113), Interval::new(65115, 65115), Interval::new(65117, 65117), Interval::new(65288, 65288), Interval::new(65339, 65339), Interval::new(65371, 65371), Interval::new(65375, 65375), Interval::new(65378, 65378), ]; /// Return the code point ranges of the 'Open_Punctuation' Unicode property. pub(crate) fn open_punctuation_ranges() -> &'static [Interval] { &OPEN_PUNCTUATION } const OTHER_LETTER: [Interval; 511] = [ Interval::new(170, 170), Interval::new(186, 186), Interval::new(443, 443), Interval::new(448, 451), Interval::new(660, 660), Interval::new(1488, 1514), Interval::new(1519, 1522), Interval::new(1568, 1599), Interval::new(1601, 1610), Interval::new(1646, 1647), Interval::new(1649, 1747), Interval::new(1749, 1749), Interval::new(1774, 1775), Interval::new(1786, 1788), Interval::new(1791, 1791), Interval::new(1808, 1808), Interval::new(1810, 1839), Interval::new(1869, 1957), Interval::new(1969, 1969), Interval::new(1994, 2026), Interval::new(2048, 2069), Interval::new(2112, 2136), Interval::new(2144, 2154), Interval::new(2160, 2183), Interval::new(2185, 2190), Interval::new(2208, 2248), Interval::new(2308, 2361), Interval::new(2365, 2365), Interval::new(2384, 2384), Interval::new(2392, 2401), Interval::new(2418, 2432), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2493, 2493), Interval::new(2510, 2510), Interval::new(2524, 2525), Interval::new(2527, 2529), Interval::new(2544, 2545), Interval::new(2556, 2556), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2674, 2676), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2749, 2749), Interval::new(2768, 2768), Interval::new(2784, 2785), Interval::new(2809, 2809), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2877, 2877), Interval::new(2908, 2909), Interval::new(2911, 2913), Interval::new(2929, 2929), Interval::new(2947, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3024, 3024), Interval::new(3077, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3133, 3133), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3169), Interval::new(3200, 3200), Interval::new(3205, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3261, 3261), Interval::new(3293, 3294), Interval::new(3296, 3297), Interval::new(3313, 3314), Interval::new(3332, 3340), Interval::new(3342, 3344), Interval::new(3346, 3386), Interval::new(3389, 3389), Interval::new(3406, 3406), Interval::new(3412, 3414), Interval::new(3423, 3425), Interval::new(3450, 3455), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3585, 3632), Interval::new(3634, 3635), Interval::new(3648, 3653), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3760), Interval::new(3762, 3763), Interval::new(3773, 3773), Interval::new(3776, 3780), Interval::new(3804, 3807), Interval::new(3840, 3840), Interval::new(3904, 3911), Interval::new(3913, 3948), Interval::new(3976, 3980), Interval::new(4096, 4138), Interval::new(4159, 4159), Interval::new(4176, 4181), Interval::new(4186, 4189), Interval::new(4193, 4193), Interval::new(4197, 4198), Interval::new(4206, 4208), Interval::new(4213, 4225), Interval::new(4238, 4238), Interval::new(4352, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4992, 5007), Interval::new(5121, 5740), Interval::new(5743, 5759), Interval::new(5761, 5786), Interval::new(5792, 5866), Interval::new(5873, 5880), Interval::new(5888, 5905), Interval::new(5919, 5937), Interval::new(5952, 5969), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6016, 6067), Interval::new(6108, 6108), Interval::new(6176, 6210), Interval::new(6212, 6264), Interval::new(6272, 6276), Interval::new(6279, 6312), Interval::new(6314, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6480, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6656, 6678), Interval::new(6688, 6740), Interval::new(6917, 6963), Interval::new(6981, 6988), Interval::new(7043, 7072), Interval::new(7086, 7087), Interval::new(7098, 7141), Interval::new(7168, 7203), Interval::new(7245, 7247), Interval::new(7258, 7287), Interval::new(7401, 7404), Interval::new(7406, 7411), Interval::new(7413, 7414), Interval::new(7418, 7418), Interval::new(8501, 8504), Interval::new(11568, 11623), Interval::new(11648, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(12294, 12294), Interval::new(12348, 12348), Interval::new(12353, 12438), Interval::new(12447, 12447), Interval::new(12449, 12538), Interval::new(12543, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12704, 12735), Interval::new(12784, 12799), Interval::new(13312, 19903), Interval::new(19968, 40980), Interval::new(40982, 42124), Interval::new(42192, 42231), Interval::new(42240, 42507), Interval::new(42512, 42527), Interval::new(42538, 42539), Interval::new(42606, 42606), Interval::new(42656, 42725), Interval::new(42895, 42895), Interval::new(42999, 42999), Interval::new(43003, 43009), Interval::new(43011, 43013), Interval::new(43015, 43018), Interval::new(43020, 43042), Interval::new(43072, 43123), Interval::new(43138, 43187), Interval::new(43250, 43255), Interval::new(43259, 43259), Interval::new(43261, 43262), Interval::new(43274, 43301), Interval::new(43312, 43334), Interval::new(43360, 43388), Interval::new(43396, 43442), Interval::new(43488, 43492), Interval::new(43495, 43503), Interval::new(43514, 43518), Interval::new(43520, 43560), Interval::new(43584, 43586), Interval::new(43588, 43595), Interval::new(43616, 43631), Interval::new(43633, 43638), Interval::new(43642, 43642), Interval::new(43646, 43695), Interval::new(43697, 43697), Interval::new(43701, 43702), Interval::new(43705, 43709), Interval::new(43712, 43712), Interval::new(43714, 43714), Interval::new(43739, 43740), Interval::new(43744, 43754), Interval::new(43762, 43762), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43968, 44002), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64285, 64285), Interval::new(64287, 64296), Interval::new(64298, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65019), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(65382, 65391), Interval::new(65393, 65437), Interval::new(65440, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66304, 66335), Interval::new(66349, 66368), Interval::new(66370, 66377), Interval::new(66384, 66421), Interval::new(66432, 66461), Interval::new(66464, 66499), Interval::new(66504, 66511), Interval::new(66640, 66717), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67680, 67702), Interval::new(67712, 67742), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67840, 67861), Interval::new(67872, 67897), Interval::new(67968, 68023), Interval::new(68030, 68031), Interval::new(68096, 68096), Interval::new(68112, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68192, 68220), Interval::new(68224, 68252), Interval::new(68288, 68295), Interval::new(68297, 68324), Interval::new(68352, 68405), Interval::new(68416, 68437), Interval::new(68448, 68466), Interval::new(68480, 68497), Interval::new(68608, 68680), Interval::new(68864, 68899), Interval::new(69248, 69289), Interval::new(69296, 69297), Interval::new(69376, 69404), Interval::new(69415, 69415), Interval::new(69424, 69445), Interval::new(69488, 69505), Interval::new(69552, 69572), Interval::new(69600, 69622), Interval::new(69635, 69687), Interval::new(69745, 69746), Interval::new(69749, 69749), Interval::new(69763, 69807), Interval::new(69840, 69864), Interval::new(69891, 69926), Interval::new(69956, 69956), Interval::new(69959, 69959), Interval::new(69968, 70002), Interval::new(70006, 70006), Interval::new(70019, 70066), Interval::new(70081, 70084), Interval::new(70106, 70106), Interval::new(70108, 70108), Interval::new(70144, 70161), Interval::new(70163, 70187), Interval::new(70207, 70208), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70312), Interval::new(70320, 70366), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70461, 70461), Interval::new(70480, 70480), Interval::new(70493, 70497), Interval::new(70656, 70708), Interval::new(70727, 70730), Interval::new(70751, 70753), Interval::new(70784, 70831), Interval::new(70852, 70853), Interval::new(70855, 70855), Interval::new(71040, 71086), Interval::new(71128, 71131), Interval::new(71168, 71215), Interval::new(71236, 71236), Interval::new(71296, 71338), Interval::new(71352, 71352), Interval::new(71424, 71450), Interval::new(71488, 71494), Interval::new(71680, 71723), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71983), Interval::new(71999, 71999), Interval::new(72001, 72001), Interval::new(72096, 72103), Interval::new(72106, 72144), Interval::new(72161, 72161), Interval::new(72163, 72163), Interval::new(72192, 72192), Interval::new(72203, 72242), Interval::new(72250, 72250), Interval::new(72272, 72272), Interval::new(72284, 72329), Interval::new(72349, 72349), Interval::new(72368, 72440), Interval::new(72704, 72712), Interval::new(72714, 72750), Interval::new(72768, 72768), Interval::new(72818, 72847), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73008), Interval::new(73030, 73030), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73097), Interval::new(73112, 73112), Interval::new(73440, 73458), Interval::new(73474, 73474), Interval::new(73476, 73488), Interval::new(73490, 73523), Interval::new(73648, 73648), Interval::new(73728, 74649), Interval::new(74880, 75075), Interval::new(77712, 77808), Interval::new(77824, 78895), Interval::new(78913, 78918), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92784, 92862), Interval::new(92880, 92909), Interval::new(92928, 92975), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93952, 94026), Interval::new(94032, 94032), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(122634, 122634), Interval::new(123136, 123180), Interval::new(123214, 123214), Interval::new(123536, 123565), Interval::new(123584, 123627), Interval::new(124112, 124138), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'Other_Letter' Unicode property. pub(crate) fn other_letter_ranges() -> &'static [Interval] { &OTHER_LETTER } const OTHER_NUMBER: [Interval; 72] = [ Interval::new(178, 179), Interval::new(185, 185), Interval::new(188, 190), Interval::new(2548, 2553), Interval::new(2930, 2935), Interval::new(3056, 3058), Interval::new(3192, 3198), Interval::new(3416, 3422), Interval::new(3440, 3448), Interval::new(3882, 3891), Interval::new(4969, 4988), Interval::new(6128, 6137), Interval::new(6618, 6618), Interval::new(8304, 8304), Interval::new(8308, 8313), Interval::new(8320, 8329), Interval::new(8528, 8543), Interval::new(8585, 8585), Interval::new(9312, 9371), Interval::new(9450, 9471), Interval::new(10102, 10131), Interval::new(11517, 11517), Interval::new(12690, 12693), Interval::new(12832, 12841), Interval::new(12872, 12879), Interval::new(12881, 12895), Interval::new(12928, 12937), Interval::new(12977, 12991), Interval::new(43056, 43061), Interval::new(65799, 65843), Interval::new(65909, 65912), Interval::new(65930, 65931), Interval::new(66273, 66299), Interval::new(66336, 66339), Interval::new(67672, 67679), Interval::new(67705, 67711), Interval::new(67751, 67759), Interval::new(67835, 67839), Interval::new(67862, 67867), Interval::new(68028, 68029), Interval::new(68032, 68047), Interval::new(68050, 68095), Interval::new(68160, 68168), Interval::new(68221, 68222), Interval::new(68253, 68255), Interval::new(68331, 68335), Interval::new(68440, 68447), Interval::new(68472, 68479), Interval::new(68521, 68527), Interval::new(68858, 68863), Interval::new(69216, 69246), Interval::new(69405, 69414), Interval::new(69457, 69460), Interval::new(69573, 69579), Interval::new(69714, 69733), Interval::new(70113, 70132), Interval::new(71482, 71483), Interval::new(71914, 71922), Interval::new(72794, 72812), Interval::new(73664, 73684), Interval::new(93019, 93025), Interval::new(93824, 93846), Interval::new(119488, 119507), Interval::new(119520, 119539), Interval::new(119648, 119672), Interval::new(125127, 125135), Interval::new(126065, 126123), Interval::new(126125, 126127), Interval::new(126129, 126132), Interval::new(126209, 126253), Interval::new(126255, 126269), Interval::new(127232, 127244), ]; /// Return the code point ranges of the 'Other_Number' Unicode property. pub(crate) fn other_number_ranges() -> &'static [Interval] { &OTHER_NUMBER } const OTHER_PUNCTUATION: [Interval; 187] = [ Interval::new(33, 35), Interval::new(37, 39), Interval::new(42, 42), Interval::new(44, 44), Interval::new(46, 47), Interval::new(58, 59), Interval::new(63, 64), Interval::new(92, 92), Interval::new(161, 161), Interval::new(167, 167), Interval::new(182, 183), Interval::new(191, 191), Interval::new(894, 894), Interval::new(903, 903), Interval::new(1370, 1375), Interval::new(1417, 1417), Interval::new(1472, 1472), Interval::new(1475, 1475), Interval::new(1478, 1478), Interval::new(1523, 1524), Interval::new(1545, 1546), Interval::new(1548, 1549), Interval::new(1563, 1563), Interval::new(1565, 1567), Interval::new(1642, 1645), Interval::new(1748, 1748), Interval::new(1792, 1805), Interval::new(2039, 2041), Interval::new(2096, 2110), Interval::new(2142, 2142), Interval::new(2404, 2405), Interval::new(2416, 2416), Interval::new(2557, 2557), Interval::new(2678, 2678), Interval::new(2800, 2800), Interval::new(3191, 3191), Interval::new(3204, 3204), Interval::new(3572, 3572), Interval::new(3663, 3663), Interval::new(3674, 3675), Interval::new(3844, 3858), Interval::new(3860, 3860), Interval::new(3973, 3973), Interval::new(4048, 4052), Interval::new(4057, 4058), Interval::new(4170, 4175), Interval::new(4347, 4347), Interval::new(4960, 4968), Interval::new(5742, 5742), Interval::new(5867, 5869), Interval::new(5941, 5942), Interval::new(6100, 6102), Interval::new(6104, 6106), Interval::new(6144, 6149), Interval::new(6151, 6154), Interval::new(6468, 6469), Interval::new(6686, 6687), Interval::new(6816, 6822), Interval::new(6824, 6829), Interval::new(7002, 7008), Interval::new(7037, 7038), Interval::new(7164, 7167), Interval::new(7227, 7231), Interval::new(7294, 7295), Interval::new(7360, 7367), Interval::new(7379, 7379), Interval::new(8214, 8215), Interval::new(8224, 8231), Interval::new(8240, 8248), Interval::new(8251, 8254), Interval::new(8257, 8259), Interval::new(8263, 8273), Interval::new(8275, 8275), Interval::new(8277, 8286), Interval::new(11513, 11516), Interval::new(11518, 11519), Interval::new(11632, 11632), Interval::new(11776, 11777), Interval::new(11782, 11784), Interval::new(11787, 11787), Interval::new(11790, 11798), Interval::new(11800, 11801), Interval::new(11803, 11803), Interval::new(11806, 11807), Interval::new(11818, 11822), Interval::new(11824, 11833), Interval::new(11836, 11839), Interval::new(11841, 11841), Interval::new(11843, 11855), Interval::new(11858, 11860), Interval::new(12289, 12291), Interval::new(12349, 12349), Interval::new(12539, 12539), Interval::new(42238, 42239), Interval::new(42509, 42511), Interval::new(42611, 42611), Interval::new(42622, 42622), Interval::new(42738, 42743), Interval::new(43124, 43127), Interval::new(43214, 43215), Interval::new(43256, 43258), Interval::new(43260, 43260), Interval::new(43310, 43311), Interval::new(43359, 43359), Interval::new(43457, 43469), Interval::new(43486, 43487), Interval::new(43612, 43615), Interval::new(43742, 43743), Interval::new(43760, 43761), Interval::new(44011, 44011), Interval::new(65040, 65046), Interval::new(65049, 65049), Interval::new(65072, 65072), Interval::new(65093, 65094), Interval::new(65097, 65100), Interval::new(65104, 65106), Interval::new(65108, 65111), Interval::new(65119, 65121), Interval::new(65128, 65128), Interval::new(65130, 65131), Interval::new(65281, 65283), Interval::new(65285, 65287), Interval::new(65290, 65290), Interval::new(65292, 65292), Interval::new(65294, 65295), Interval::new(65306, 65307), Interval::new(65311, 65312), Interval::new(65340, 65340), Interval::new(65377, 65377), Interval::new(65380, 65381), Interval::new(65792, 65794), Interval::new(66463, 66463), Interval::new(66512, 66512), Interval::new(66927, 66927), Interval::new(67671, 67671), Interval::new(67871, 67871), Interval::new(67903, 67903), Interval::new(68176, 68184), Interval::new(68223, 68223), Interval::new(68336, 68342), Interval::new(68409, 68415), Interval::new(68505, 68508), Interval::new(69461, 69465), Interval::new(69510, 69513), Interval::new(69703, 69709), Interval::new(69819, 69820), Interval::new(69822, 69825), Interval::new(69952, 69955), Interval::new(70004, 70005), Interval::new(70085, 70088), Interval::new(70093, 70093), Interval::new(70107, 70107), Interval::new(70109, 70111), Interval::new(70200, 70205), Interval::new(70313, 70313), Interval::new(70731, 70735), Interval::new(70746, 70747), Interval::new(70749, 70749), Interval::new(70854, 70854), Interval::new(71105, 71127), Interval::new(71233, 71235), Interval::new(71264, 71276), Interval::new(71353, 71353), Interval::new(71484, 71486), Interval::new(71739, 71739), Interval::new(72004, 72006), Interval::new(72162, 72162), Interval::new(72255, 72262), Interval::new(72346, 72348), Interval::new(72350, 72354), Interval::new(72448, 72457), Interval::new(72769, 72773), Interval::new(72816, 72817), Interval::new(73463, 73464), Interval::new(73539, 73551), Interval::new(73727, 73727), Interval::new(74864, 74868), Interval::new(77809, 77810), Interval::new(92782, 92783), Interval::new(92917, 92917), Interval::new(92983, 92987), Interval::new(92996, 92996), Interval::new(93847, 93850), Interval::new(94178, 94178), Interval::new(113823, 113823), Interval::new(121479, 121483), Interval::new(125278, 125279), ]; /// Return the code point ranges of the 'Other_Punctuation' Unicode property. pub(crate) fn other_punctuation_ranges() -> &'static [Interval] { &OTHER_PUNCTUATION } const OTHER_SYMBOL: [Interval; 185] = [ Interval::new(166, 166), Interval::new(169, 169), Interval::new(174, 174), Interval::new(176, 176), Interval::new(1154, 1154), Interval::new(1421, 1422), Interval::new(1550, 1551), Interval::new(1758, 1758), Interval::new(1769, 1769), Interval::new(1789, 1790), Interval::new(2038, 2038), Interval::new(2554, 2554), Interval::new(2928, 2928), Interval::new(3059, 3064), Interval::new(3066, 3066), Interval::new(3199, 3199), Interval::new(3407, 3407), Interval::new(3449, 3449), Interval::new(3841, 3843), Interval::new(3859, 3859), Interval::new(3861, 3863), Interval::new(3866, 3871), Interval::new(3892, 3892), Interval::new(3894, 3894), Interval::new(3896, 3896), Interval::new(4030, 4037), Interval::new(4039, 4044), Interval::new(4046, 4047), Interval::new(4053, 4056), Interval::new(4254, 4255), Interval::new(5008, 5017), Interval::new(5741, 5741), Interval::new(6464, 6464), Interval::new(6622, 6655), Interval::new(7009, 7018), Interval::new(7028, 7036), Interval::new(8448, 8449), Interval::new(8451, 8454), Interval::new(8456, 8457), Interval::new(8468, 8468), Interval::new(8470, 8471), Interval::new(8478, 8483), Interval::new(8485, 8485), Interval::new(8487, 8487), Interval::new(8489, 8489), Interval::new(8494, 8494), Interval::new(8506, 8507), Interval::new(8522, 8522), Interval::new(8524, 8525), Interval::new(8527, 8527), Interval::new(8586, 8587), Interval::new(8597, 8601), Interval::new(8604, 8607), Interval::new(8609, 8610), Interval::new(8612, 8613), Interval::new(8615, 8621), Interval::new(8623, 8653), Interval::new(8656, 8657), Interval::new(8659, 8659), Interval::new(8661, 8691), Interval::new(8960, 8967), Interval::new(8972, 8991), Interval::new(8994, 9000), Interval::new(9003, 9083), Interval::new(9085, 9114), Interval::new(9140, 9179), Interval::new(9186, 9254), Interval::new(9280, 9290), Interval::new(9372, 9449), Interval::new(9472, 9654), Interval::new(9656, 9664), Interval::new(9666, 9719), Interval::new(9728, 9838), Interval::new(9840, 10087), Interval::new(10132, 10175), Interval::new(10240, 10495), Interval::new(11008, 11055), Interval::new(11077, 11078), Interval::new(11085, 11123), Interval::new(11126, 11157), Interval::new(11159, 11263), Interval::new(11493, 11498), Interval::new(11856, 11857), Interval::new(11904, 11929), Interval::new(11931, 12019), Interval::new(12032, 12245), Interval::new(12272, 12287), Interval::new(12292, 12292), Interval::new(12306, 12307), Interval::new(12320, 12320), Interval::new(12342, 12343), Interval::new(12350, 12351), Interval::new(12688, 12689), Interval::new(12694, 12703), Interval::new(12736, 12771), Interval::new(12783, 12783), Interval::new(12800, 12830), Interval::new(12842, 12871), Interval::new(12880, 12880), Interval::new(12896, 12927), Interval::new(12938, 12976), Interval::new(12992, 13311), Interval::new(19904, 19967), Interval::new(42128, 42182), Interval::new(43048, 43051), Interval::new(43062, 43063), Interval::new(43065, 43065), Interval::new(43639, 43641), Interval::new(64832, 64847), Interval::new(64975, 64975), Interval::new(65021, 65023), Interval::new(65508, 65508), Interval::new(65512, 65512), Interval::new(65517, 65518), Interval::new(65532, 65533), Interval::new(65847, 65855), Interval::new(65913, 65929), Interval::new(65932, 65934), Interval::new(65936, 65948), Interval::new(65952, 65952), Interval::new(66000, 66044), Interval::new(67703, 67704), Interval::new(68296, 68296), Interval::new(71487, 71487), Interval::new(73685, 73692), Interval::new(73697, 73713), Interval::new(92988, 92991), Interval::new(92997, 92997), Interval::new(113820, 113820), Interval::new(118608, 118723), Interval::new(118784, 119029), Interval::new(119040, 119078), Interval::new(119081, 119140), Interval::new(119146, 119148), Interval::new(119171, 119172), Interval::new(119180, 119209), Interval::new(119214, 119274), Interval::new(119296, 119361), Interval::new(119365, 119365), Interval::new(119552, 119638), Interval::new(120832, 121343), Interval::new(121399, 121402), Interval::new(121453, 121460), Interval::new(121462, 121475), Interval::new(121477, 121478), Interval::new(123215, 123215), Interval::new(126124, 126124), Interval::new(126254, 126254), Interval::new(126976, 127019), Interval::new(127024, 127123), Interval::new(127136, 127150), Interval::new(127153, 127167), Interval::new(127169, 127183), Interval::new(127185, 127221), Interval::new(127245, 127405), Interval::new(127462, 127490), Interval::new(127504, 127547), Interval::new(127552, 127560), Interval::new(127568, 127569), Interval::new(127584, 127589), Interval::new(127744, 127994), Interval::new(128000, 128727), Interval::new(128732, 128748), Interval::new(128752, 128764), Interval::new(128768, 128886), Interval::new(128891, 128985), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129024, 129035), Interval::new(129040, 129095), Interval::new(129104, 129113), Interval::new(129120, 129159), Interval::new(129168, 129197), Interval::new(129200, 129201), Interval::new(129280, 129619), Interval::new(129632, 129645), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), Interval::new(129792, 129938), Interval::new(129940, 129994), ]; /// Return the code point ranges of the 'Other_Symbol' Unicode property. pub(crate) fn other_symbol_ranges() -> &'static [Interval] { &OTHER_SYMBOL } const PARAGRAPH_SEPARATOR: [Interval; 1] = [Interval::new(8233, 8233)]; /// Return the code point ranges of the 'Paragraph_Separator' Unicode property. pub(crate) fn paragraph_separator_ranges() -> &'static [Interval] { &PARAGRAPH_SEPARATOR } const PRIVATE_USE: [Interval; 3] = [ Interval::new(57344, 63743), Interval::new(983040, 1048573), Interval::new(1048576, 1114109), ]; /// Return the code point ranges of the 'Private_Use' Unicode property. pub(crate) fn private_use_ranges() -> &'static [Interval] { &PRIVATE_USE } const SPACE_SEPARATOR: [Interval; 7] = [ Interval::new(32, 32), Interval::new(160, 160), Interval::new(5760, 5760), Interval::new(8192, 8202), Interval::new(8239, 8239), Interval::new(8287, 8287), Interval::new(12288, 12288), ]; /// Return the code point ranges of the 'Space_Separator' Unicode property. pub(crate) fn space_separator_ranges() -> &'static [Interval] { &SPACE_SEPARATOR } const SPACING_MARK: [Interval; 182] = [ Interval::new(2307, 2307), Interval::new(2363, 2363), Interval::new(2366, 2368), Interval::new(2377, 2380), Interval::new(2382, 2383), Interval::new(2434, 2435), Interval::new(2494, 2496), Interval::new(2503, 2504), Interval::new(2507, 2508), Interval::new(2519, 2519), Interval::new(2563, 2563), Interval::new(2622, 2624), Interval::new(2691, 2691), Interval::new(2750, 2752), Interval::new(2761, 2761), Interval::new(2763, 2764), Interval::new(2818, 2819), Interval::new(2878, 2878), Interval::new(2880, 2880), Interval::new(2887, 2888), Interval::new(2891, 2892), Interval::new(2903, 2903), Interval::new(3006, 3007), Interval::new(3009, 3010), Interval::new(3014, 3016), Interval::new(3018, 3020), Interval::new(3031, 3031), Interval::new(3073, 3075), Interval::new(3137, 3140), Interval::new(3202, 3203), Interval::new(3262, 3262), Interval::new(3264, 3268), Interval::new(3271, 3272), Interval::new(3274, 3275), Interval::new(3285, 3286), Interval::new(3315, 3315), Interval::new(3330, 3331), Interval::new(3390, 3392), Interval::new(3398, 3400), Interval::new(3402, 3404), Interval::new(3415, 3415), Interval::new(3458, 3459), Interval::new(3535, 3537), Interval::new(3544, 3551), Interval::new(3570, 3571), Interval::new(3902, 3903), Interval::new(3967, 3967), Interval::new(4139, 4140), Interval::new(4145, 4145), Interval::new(4152, 4152), Interval::new(4155, 4156), Interval::new(4182, 4183), Interval::new(4194, 4196), Interval::new(4199, 4205), Interval::new(4227, 4228), Interval::new(4231, 4236), Interval::new(4239, 4239), Interval::new(4250, 4252), Interval::new(5909, 5909), Interval::new(5940, 5940), Interval::new(6070, 6070), Interval::new(6078, 6085), Interval::new(6087, 6088), Interval::new(6435, 6438), Interval::new(6441, 6443), Interval::new(6448, 6449), Interval::new(6451, 6456), Interval::new(6681, 6682), Interval::new(6741, 6741), Interval::new(6743, 6743), Interval::new(6753, 6753), Interval::new(6755, 6756), Interval::new(6765, 6770), Interval::new(6916, 6916), Interval::new(6965, 6965), Interval::new(6971, 6971), Interval::new(6973, 6977), Interval::new(6979, 6980), Interval::new(7042, 7042), Interval::new(7073, 7073), Interval::new(7078, 7079), Interval::new(7082, 7082), Interval::new(7143, 7143), Interval::new(7146, 7148), Interval::new(7150, 7150), Interval::new(7154, 7155), Interval::new(7204, 7211), Interval::new(7220, 7221), Interval::new(7393, 7393), Interval::new(7415, 7415), Interval::new(12334, 12335), Interval::new(43043, 43044), Interval::new(43047, 43047), Interval::new(43136, 43137), Interval::new(43188, 43203), Interval::new(43346, 43347), Interval::new(43395, 43395), Interval::new(43444, 43445), Interval::new(43450, 43451), Interval::new(43454, 43456), Interval::new(43567, 43568), Interval::new(43571, 43572), Interval::new(43597, 43597), Interval::new(43643, 43643), Interval::new(43645, 43645), Interval::new(43755, 43755), Interval::new(43758, 43759), Interval::new(43765, 43765), Interval::new(44003, 44004), Interval::new(44006, 44007), Interval::new(44009, 44010), Interval::new(44012, 44012), Interval::new(69632, 69632), Interval::new(69634, 69634), Interval::new(69762, 69762), Interval::new(69808, 69810), Interval::new(69815, 69816), Interval::new(69932, 69932), Interval::new(69957, 69958), Interval::new(70018, 70018), Interval::new(70067, 70069), Interval::new(70079, 70080), Interval::new(70094, 70094), Interval::new(70188, 70190), Interval::new(70194, 70195), Interval::new(70197, 70197), Interval::new(70368, 70370), Interval::new(70402, 70403), Interval::new(70462, 70463), Interval::new(70465, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70487, 70487), Interval::new(70498, 70499), Interval::new(70709, 70711), Interval::new(70720, 70721), Interval::new(70725, 70725), Interval::new(70832, 70834), Interval::new(70841, 70841), Interval::new(70843, 70846), Interval::new(70849, 70849), Interval::new(71087, 71089), Interval::new(71096, 71099), Interval::new(71102, 71102), Interval::new(71216, 71218), Interval::new(71227, 71228), Interval::new(71230, 71230), Interval::new(71340, 71340), Interval::new(71342, 71343), Interval::new(71350, 71350), Interval::new(71456, 71457), Interval::new(71462, 71462), Interval::new(71724, 71726), Interval::new(71736, 71736), Interval::new(71984, 71989), Interval::new(71991, 71992), Interval::new(71997, 71997), Interval::new(72000, 72000), Interval::new(72002, 72002), Interval::new(72145, 72147), Interval::new(72156, 72159), Interval::new(72164, 72164), Interval::new(72249, 72249), Interval::new(72279, 72280), Interval::new(72343, 72343), Interval::new(72751, 72751), Interval::new(72766, 72766), Interval::new(72873, 72873), Interval::new(72881, 72881), Interval::new(72884, 72884), Interval::new(73098, 73102), Interval::new(73107, 73108), Interval::new(73110, 73110), Interval::new(73461, 73462), Interval::new(73475, 73475), Interval::new(73524, 73525), Interval::new(73534, 73535), Interval::new(73537, 73537), Interval::new(94033, 94087), Interval::new(94192, 94193), Interval::new(119141, 119142), Interval::new(119149, 119154), ]; /// Return the code point ranges of the 'Spacing_Mark' Unicode property. pub(crate) fn spacing_mark_ranges() -> &'static [Interval] { &SPACING_MARK } const SURROGATE: [Interval; 1] = [Interval::new(55296, 57343)]; /// Return the code point ranges of the 'Surrogate' Unicode property. pub(crate) fn surrogate_ranges() -> &'static [Interval] { &SURROGATE } const TITLECASE_LETTER: [Interval; 10] = [ Interval::new(453, 453), Interval::new(456, 456), Interval::new(459, 459), Interval::new(498, 498), Interval::new(8072, 8079), Interval::new(8088, 8095), Interval::new(8104, 8111), Interval::new(8124, 8124), Interval::new(8140, 8140), Interval::new(8188, 8188), ]; /// Return the code point ranges of the 'Titlecase_Letter' Unicode property. pub(crate) fn titlecase_letter_ranges() -> &'static [Interval] { &TITLECASE_LETTER } const UNASSIGNED: [Interval; 707] = [ Interval::new(888, 889), Interval::new(896, 899), Interval::new(907, 907), Interval::new(909, 909), Interval::new(930, 930), Interval::new(1328, 1328), Interval::new(1367, 1368), Interval::new(1419, 1420), Interval::new(1424, 1424), Interval::new(1480, 1487), Interval::new(1515, 1518), Interval::new(1525, 1535), Interval::new(1806, 1806), Interval::new(1867, 1868), Interval::new(1970, 1983), Interval::new(2043, 2044), Interval::new(2094, 2095), Interval::new(2111, 2111), Interval::new(2140, 2141), Interval::new(2143, 2143), Interval::new(2155, 2159), Interval::new(2191, 2191), Interval::new(2194, 2199), Interval::new(2436, 2436), Interval::new(2445, 2446), Interval::new(2449, 2450), Interval::new(2473, 2473), Interval::new(2481, 2481), Interval::new(2483, 2485), Interval::new(2490, 2491), Interval::new(2501, 2502), Interval::new(2505, 2506), Interval::new(2511, 2518), Interval::new(2520, 2523), Interval::new(2526, 2526), Interval::new(2532, 2533), Interval::new(2559, 2560), Interval::new(2564, 2564), Interval::new(2571, 2574), Interval::new(2577, 2578), Interval::new(2601, 2601), Interval::new(2609, 2609), Interval::new(2612, 2612), Interval::new(2615, 2615), Interval::new(2618, 2619), Interval::new(2621, 2621), Interval::new(2627, 2630), Interval::new(2633, 2634), Interval::new(2638, 2640), Interval::new(2642, 2648), Interval::new(2653, 2653), Interval::new(2655, 2661), Interval::new(2679, 2688), Interval::new(2692, 2692), Interval::new(2702, 2702), Interval::new(2706, 2706), Interval::new(2729, 2729), Interval::new(2737, 2737), Interval::new(2740, 2740), Interval::new(2746, 2747), Interval::new(2758, 2758), Interval::new(2762, 2762), Interval::new(2766, 2767), Interval::new(2769, 2783), Interval::new(2788, 2789), Interval::new(2802, 2808), Interval::new(2816, 2816), Interval::new(2820, 2820), Interval::new(2829, 2830), Interval::new(2833, 2834), Interval::new(2857, 2857), Interval::new(2865, 2865), Interval::new(2868, 2868), Interval::new(2874, 2875), Interval::new(2885, 2886), Interval::new(2889, 2890), Interval::new(2894, 2900), Interval::new(2904, 2907), Interval::new(2910, 2910), Interval::new(2916, 2917), Interval::new(2936, 2945), Interval::new(2948, 2948), Interval::new(2955, 2957), Interval::new(2961, 2961), Interval::new(2966, 2968), Interval::new(2971, 2971), Interval::new(2973, 2973), Interval::new(2976, 2978), Interval::new(2981, 2983), Interval::new(2987, 2989), Interval::new(3002, 3005), Interval::new(3011, 3013), Interval::new(3017, 3017), Interval::new(3022, 3023), Interval::new(3025, 3030), Interval::new(3032, 3045), Interval::new(3067, 3071), Interval::new(3085, 3085), Interval::new(3089, 3089), Interval::new(3113, 3113), Interval::new(3130, 3131), Interval::new(3141, 3141), Interval::new(3145, 3145), Interval::new(3150, 3156), Interval::new(3159, 3159), Interval::new(3163, 3164), Interval::new(3166, 3167), Interval::new(3172, 3173), Interval::new(3184, 3190), Interval::new(3213, 3213), Interval::new(3217, 3217), Interval::new(3241, 3241), Interval::new(3252, 3252), Interval::new(3258, 3259), Interval::new(3269, 3269), Interval::new(3273, 3273), Interval::new(3278, 3284), Interval::new(3287, 3292), Interval::new(3295, 3295), Interval::new(3300, 3301), Interval::new(3312, 3312), Interval::new(3316, 3327), Interval::new(3341, 3341), Interval::new(3345, 3345), Interval::new(3397, 3397), Interval::new(3401, 3401), Interval::new(3408, 3411), Interval::new(3428, 3429), Interval::new(3456, 3456), Interval::new(3460, 3460), Interval::new(3479, 3481), Interval::new(3506, 3506), Interval::new(3516, 3516), Interval::new(3518, 3519), Interval::new(3527, 3529), Interval::new(3531, 3534), Interval::new(3541, 3541), Interval::new(3543, 3543), Interval::new(3552, 3557), Interval::new(3568, 3569), Interval::new(3573, 3584), Interval::new(3643, 3646), Interval::new(3676, 3712), Interval::new(3715, 3715), Interval::new(3717, 3717), Interval::new(3723, 3723), Interval::new(3748, 3748), Interval::new(3750, 3750), Interval::new(3774, 3775), Interval::new(3781, 3781), Interval::new(3783, 3783), Interval::new(3791, 3791), Interval::new(3802, 3803), Interval::new(3808, 3839), Interval::new(3912, 3912), Interval::new(3949, 3952), Interval::new(3992, 3992), Interval::new(4029, 4029), Interval::new(4045, 4045), Interval::new(4059, 4095), Interval::new(4294, 4294), Interval::new(4296, 4300), Interval::new(4302, 4303), Interval::new(4681, 4681), Interval::new(4686, 4687), Interval::new(4695, 4695), Interval::new(4697, 4697), Interval::new(4702, 4703), Interval::new(4745, 4745), Interval::new(4750, 4751), Interval::new(4785, 4785), Interval::new(4790, 4791), Interval::new(4799, 4799), Interval::new(4801, 4801), Interval::new(4806, 4807), Interval::new(4823, 4823), Interval::new(4881, 4881), Interval::new(4886, 4887), Interval::new(4955, 4956), Interval::new(4989, 4991), Interval::new(5018, 5023), Interval::new(5110, 5111), Interval::new(5118, 5119), Interval::new(5789, 5791), Interval::new(5881, 5887), Interval::new(5910, 5918), Interval::new(5943, 5951), Interval::new(5972, 5983), Interval::new(5997, 5997), Interval::new(6001, 6001), Interval::new(6004, 6015), Interval::new(6110, 6111), Interval::new(6122, 6127), Interval::new(6138, 6143), Interval::new(6170, 6175), Interval::new(6265, 6271), Interval::new(6315, 6319), Interval::new(6390, 6399), Interval::new(6431, 6431), Interval::new(6444, 6447), Interval::new(6460, 6463), Interval::new(6465, 6467), Interval::new(6510, 6511), Interval::new(6517, 6527), Interval::new(6572, 6575), Interval::new(6602, 6607), Interval::new(6619, 6621), Interval::new(6684, 6685), Interval::new(6751, 6751), Interval::new(6781, 6782), Interval::new(6794, 6799), Interval::new(6810, 6815), Interval::new(6830, 6831), Interval::new(6863, 6911), Interval::new(6989, 6991), Interval::new(7039, 7039), Interval::new(7156, 7163), Interval::new(7224, 7226), Interval::new(7242, 7244), Interval::new(7305, 7311), Interval::new(7355, 7356), Interval::new(7368, 7375), Interval::new(7419, 7423), Interval::new(7958, 7959), Interval::new(7966, 7967), Interval::new(8006, 8007), Interval::new(8014, 8015), Interval::new(8024, 8024), Interval::new(8026, 8026), Interval::new(8028, 8028), Interval::new(8030, 8030), Interval::new(8062, 8063), Interval::new(8117, 8117), Interval::new(8133, 8133), Interval::new(8148, 8149), Interval::new(8156, 8156), Interval::new(8176, 8177), Interval::new(8181, 8181), Interval::new(8191, 8191), Interval::new(8293, 8293), Interval::new(8306, 8307), Interval::new(8335, 8335), Interval::new(8349, 8351), Interval::new(8385, 8399), Interval::new(8433, 8447), Interval::new(8588, 8591), Interval::new(9255, 9279), Interval::new(9291, 9311), Interval::new(11124, 11125), Interval::new(11158, 11158), Interval::new(11508, 11512), Interval::new(11558, 11558), Interval::new(11560, 11564), Interval::new(11566, 11567), Interval::new(11624, 11630), Interval::new(11633, 11646), Interval::new(11671, 11679), Interval::new(11687, 11687), Interval::new(11695, 11695), Interval::new(11703, 11703), Interval::new(11711, 11711), Interval::new(11719, 11719), Interval::new(11727, 11727), Interval::new(11735, 11735), Interval::new(11743, 11743), Interval::new(11870, 11903), Interval::new(11930, 11930), Interval::new(12020, 12031), Interval::new(12246, 12271), Interval::new(12352, 12352), Interval::new(12439, 12440), Interval::new(12544, 12548), Interval::new(12592, 12592), Interval::new(12687, 12687), Interval::new(12772, 12782), Interval::new(12831, 12831), Interval::new(42125, 42127), Interval::new(42183, 42191), Interval::new(42540, 42559), Interval::new(42744, 42751), Interval::new(42955, 42959), Interval::new(42962, 42962), Interval::new(42964, 42964), Interval::new(42970, 42993), Interval::new(43053, 43055), Interval::new(43066, 43071), Interval::new(43128, 43135), Interval::new(43206, 43213), Interval::new(43226, 43231), Interval::new(43348, 43358), Interval::new(43389, 43391), Interval::new(43470, 43470), Interval::new(43482, 43485), Interval::new(43519, 43519), Interval::new(43575, 43583), Interval::new(43598, 43599), Interval::new(43610, 43611), Interval::new(43715, 43738), Interval::new(43767, 43776), Interval::new(43783, 43784), Interval::new(43791, 43792), Interval::new(43799, 43807), Interval::new(43815, 43815), Interval::new(43823, 43823), Interval::new(43884, 43887), Interval::new(44014, 44015), Interval::new(44026, 44031), Interval::new(55204, 55215), Interval::new(55239, 55242), Interval::new(55292, 55295), Interval::new(64110, 64111), Interval::new(64218, 64255), Interval::new(64263, 64274), Interval::new(64280, 64284), Interval::new(64311, 64311), Interval::new(64317, 64317), Interval::new(64319, 64319), Interval::new(64322, 64322), Interval::new(64325, 64325), Interval::new(64451, 64466), Interval::new(64912, 64913), Interval::new(64968, 64974), Interval::new(64976, 65007), Interval::new(65050, 65055), Interval::new(65107, 65107), Interval::new(65127, 65127), Interval::new(65132, 65135), Interval::new(65141, 65141), Interval::new(65277, 65278), Interval::new(65280, 65280), Interval::new(65471, 65473), Interval::new(65480, 65481), Interval::new(65488, 65489), Interval::new(65496, 65497), Interval::new(65501, 65503), Interval::new(65511, 65511), Interval::new(65519, 65528), Interval::new(65534, 65535), Interval::new(65548, 65548), Interval::new(65575, 65575), Interval::new(65595, 65595), Interval::new(65598, 65598), Interval::new(65614, 65615), Interval::new(65630, 65663), Interval::new(65787, 65791), Interval::new(65795, 65798), Interval::new(65844, 65846), Interval::new(65935, 65935), Interval::new(65949, 65951), Interval::new(65953, 65999), Interval::new(66046, 66175), Interval::new(66205, 66207), Interval::new(66257, 66271), Interval::new(66300, 66303), Interval::new(66340, 66348), Interval::new(66379, 66383), Interval::new(66427, 66431), Interval::new(66462, 66462), Interval::new(66500, 66503), Interval::new(66518, 66559), Interval::new(66718, 66719), Interval::new(66730, 66735), Interval::new(66772, 66775), Interval::new(66812, 66815), Interval::new(66856, 66863), Interval::new(66916, 66926), Interval::new(66939, 66939), Interval::new(66955, 66955), Interval::new(66963, 66963), Interval::new(66966, 66966), Interval::new(66978, 66978), Interval::new(66994, 66994), Interval::new(67002, 67002), Interval::new(67005, 67071), Interval::new(67383, 67391), Interval::new(67414, 67423), Interval::new(67432, 67455), Interval::new(67462, 67462), Interval::new(67505, 67505), Interval::new(67515, 67583), Interval::new(67590, 67591), Interval::new(67593, 67593), Interval::new(67638, 67638), Interval::new(67641, 67643), Interval::new(67645, 67646), Interval::new(67670, 67670), Interval::new(67743, 67750), Interval::new(67760, 67807), Interval::new(67827, 67827), Interval::new(67830, 67834), Interval::new(67868, 67870), Interval::new(67898, 67902), Interval::new(67904, 67967), Interval::new(68024, 68027), Interval::new(68048, 68049), Interval::new(68100, 68100), Interval::new(68103, 68107), Interval::new(68116, 68116), Interval::new(68120, 68120), Interval::new(68150, 68151), Interval::new(68155, 68158), Interval::new(68169, 68175), Interval::new(68185, 68191), Interval::new(68256, 68287), Interval::new(68327, 68330), Interval::new(68343, 68351), Interval::new(68406, 68408), Interval::new(68438, 68439), Interval::new(68467, 68471), Interval::new(68498, 68504), Interval::new(68509, 68520), Interval::new(68528, 68607), Interval::new(68681, 68735), Interval::new(68787, 68799), Interval::new(68851, 68857), Interval::new(68904, 68911), Interval::new(68922, 69215), Interval::new(69247, 69247), Interval::new(69290, 69290), Interval::new(69294, 69295), Interval::new(69298, 69372), Interval::new(69416, 69423), Interval::new(69466, 69487), Interval::new(69514, 69551), Interval::new(69580, 69599), Interval::new(69623, 69631), Interval::new(69710, 69713), Interval::new(69750, 69758), Interval::new(69827, 69836), Interval::new(69838, 69839), Interval::new(69865, 69871), Interval::new(69882, 69887), Interval::new(69941, 69941), Interval::new(69960, 69967), Interval::new(70007, 70015), Interval::new(70112, 70112), Interval::new(70133, 70143), Interval::new(70162, 70162), Interval::new(70210, 70271), Interval::new(70279, 70279), Interval::new(70281, 70281), Interval::new(70286, 70286), Interval::new(70302, 70302), Interval::new(70314, 70319), Interval::new(70379, 70383), Interval::new(70394, 70399), Interval::new(70404, 70404), Interval::new(70413, 70414), Interval::new(70417, 70418), Interval::new(70441, 70441), Interval::new(70449, 70449), Interval::new(70452, 70452), Interval::new(70458, 70458), Interval::new(70469, 70470), Interval::new(70473, 70474), Interval::new(70478, 70479), Interval::new(70481, 70486), Interval::new(70488, 70492), Interval::new(70500, 70501), Interval::new(70509, 70511), Interval::new(70517, 70655), Interval::new(70748, 70748), Interval::new(70754, 70783), Interval::new(70856, 70863), Interval::new(70874, 71039), Interval::new(71094, 71095), Interval::new(71134, 71167), Interval::new(71237, 71247), Interval::new(71258, 71263), Interval::new(71277, 71295), Interval::new(71354, 71359), Interval::new(71370, 71423), Interval::new(71451, 71452), Interval::new(71468, 71471), Interval::new(71495, 71679), Interval::new(71740, 71839), Interval::new(71923, 71934), Interval::new(71943, 71944), Interval::new(71946, 71947), Interval::new(71956, 71956), Interval::new(71959, 71959), Interval::new(71990, 71990), Interval::new(71993, 71994), Interval::new(72007, 72015), Interval::new(72026, 72095), Interval::new(72104, 72105), Interval::new(72152, 72153), Interval::new(72165, 72191), Interval::new(72264, 72271), Interval::new(72355, 72367), Interval::new(72441, 72447), Interval::new(72458, 72703), Interval::new(72713, 72713), Interval::new(72759, 72759), Interval::new(72774, 72783), Interval::new(72813, 72815), Interval::new(72848, 72849), Interval::new(72872, 72872), Interval::new(72887, 72959), Interval::new(72967, 72967), Interval::new(72970, 72970), Interval::new(73015, 73017), Interval::new(73019, 73019), Interval::new(73022, 73022), Interval::new(73032, 73039), Interval::new(73050, 73055), Interval::new(73062, 73062), Interval::new(73065, 73065), Interval::new(73103, 73103), Interval::new(73106, 73106), Interval::new(73113, 73119), Interval::new(73130, 73439), Interval::new(73465, 73471), Interval::new(73489, 73489), Interval::new(73531, 73533), Interval::new(73562, 73647), Interval::new(73649, 73663), Interval::new(73714, 73726), Interval::new(74650, 74751), Interval::new(74863, 74863), Interval::new(74869, 74879), Interval::new(75076, 77711), Interval::new(77811, 77823), Interval::new(78934, 82943), Interval::new(83527, 92159), Interval::new(92729, 92735), Interval::new(92767, 92767), Interval::new(92778, 92781), Interval::new(92863, 92863), Interval::new(92874, 92879), Interval::new(92910, 92911), Interval::new(92918, 92927), Interval::new(92998, 93007), Interval::new(93018, 93018), Interval::new(93026, 93026), Interval::new(93048, 93052), Interval::new(93072, 93759), Interval::new(93851, 93951), Interval::new(94027, 94030), Interval::new(94088, 94094), Interval::new(94112, 94175), Interval::new(94181, 94191), Interval::new(94194, 94207), Interval::new(100344, 100351), Interval::new(101590, 101631), Interval::new(101641, 110575), Interval::new(110580, 110580), Interval::new(110588, 110588), Interval::new(110591, 110591), Interval::new(110883, 110897), Interval::new(110899, 110927), Interval::new(110931, 110932), Interval::new(110934, 110947), Interval::new(110952, 110959), Interval::new(111356, 113663), Interval::new(113771, 113775), Interval::new(113789, 113791), Interval::new(113801, 113807), Interval::new(113818, 113819), Interval::new(113828, 118527), Interval::new(118574, 118575), Interval::new(118599, 118607), Interval::new(118724, 118783), Interval::new(119030, 119039), Interval::new(119079, 119080), Interval::new(119275, 119295), Interval::new(119366, 119487), Interval::new(119508, 119519), Interval::new(119540, 119551), Interval::new(119639, 119647), Interval::new(119673, 119807), Interval::new(119893, 119893), Interval::new(119965, 119965), Interval::new(119968, 119969), Interval::new(119971, 119972), Interval::new(119975, 119976), Interval::new(119981, 119981), Interval::new(119994, 119994), Interval::new(119996, 119996), Interval::new(120004, 120004), Interval::new(120070, 120070), Interval::new(120075, 120076), Interval::new(120085, 120085), Interval::new(120093, 120093), Interval::new(120122, 120122), Interval::new(120127, 120127), Interval::new(120133, 120133), Interval::new(120135, 120137), Interval::new(120145, 120145), Interval::new(120486, 120487), Interval::new(120780, 120781), Interval::new(121484, 121498), Interval::new(121504, 121504), Interval::new(121520, 122623), Interval::new(122655, 122660), Interval::new(122667, 122879), Interval::new(122887, 122887), Interval::new(122905, 122906), Interval::new(122914, 122914), Interval::new(122917, 122917), Interval::new(122923, 122927), Interval::new(122990, 123022), Interval::new(123024, 123135), Interval::new(123181, 123183), Interval::new(123198, 123199), Interval::new(123210, 123213), Interval::new(123216, 123535), Interval::new(123567, 123583), Interval::new(123642, 123646), Interval::new(123648, 124111), Interval::new(124154, 124895), Interval::new(124903, 124903), Interval::new(124908, 124908), Interval::new(124911, 124911), Interval::new(124927, 124927), Interval::new(125125, 125126), Interval::new(125143, 125183), Interval::new(125260, 125263), Interval::new(125274, 125277), Interval::new(125280, 126064), Interval::new(126133, 126208), Interval::new(126270, 126463), Interval::new(126468, 126468), Interval::new(126496, 126496), Interval::new(126499, 126499), Interval::new(126501, 126502), Interval::new(126504, 126504), Interval::new(126515, 126515), Interval::new(126520, 126520), Interval::new(126522, 126522), Interval::new(126524, 126529), Interval::new(126531, 126534), Interval::new(126536, 126536), Interval::new(126538, 126538), Interval::new(126540, 126540), Interval::new(126544, 126544), Interval::new(126547, 126547), Interval::new(126549, 126550), Interval::new(126552, 126552), Interval::new(126554, 126554), Interval::new(126556, 126556), Interval::new(126558, 126558), Interval::new(126560, 126560), Interval::new(126563, 126563), Interval::new(126565, 126566), Interval::new(126571, 126571), Interval::new(126579, 126579), Interval::new(126584, 126584), Interval::new(126589, 126589), Interval::new(126591, 126591), Interval::new(126602, 126602), Interval::new(126620, 126624), Interval::new(126628, 126628), Interval::new(126634, 126634), Interval::new(126652, 126703), Interval::new(126706, 126975), Interval::new(127020, 127023), Interval::new(127124, 127135), Interval::new(127151, 127152), Interval::new(127168, 127168), Interval::new(127184, 127184), Interval::new(127222, 127231), Interval::new(127406, 127461), Interval::new(127491, 127503), Interval::new(127548, 127551), Interval::new(127561, 127567), Interval::new(127570, 127583), Interval::new(127590, 127743), Interval::new(128728, 128731), Interval::new(128749, 128751), Interval::new(128765, 128767), Interval::new(128887, 128890), Interval::new(128986, 128991), Interval::new(129004, 129007), Interval::new(129009, 129023), Interval::new(129036, 129039), Interval::new(129096, 129103), Interval::new(129114, 129119), Interval::new(129160, 129167), Interval::new(129198, 129199), Interval::new(129202, 129279), Interval::new(129620, 129631), Interval::new(129646, 129647), Interval::new(129661, 129663), Interval::new(129673, 129679), Interval::new(129726, 129726), Interval::new(129734, 129741), Interval::new(129756, 129759), Interval::new(129769, 129775), Interval::new(129785, 129791), Interval::new(129939, 129939), Interval::new(129995, 130031), Interval::new(130042, 131071), Interval::new(173792, 173823), Interval::new(177978, 177983), Interval::new(178206, 178207), Interval::new(183970, 183983), Interval::new(191457, 191471), Interval::new(192094, 194559), Interval::new(195102, 196607), Interval::new(201547, 201551), Interval::new(205744, 917504), Interval::new(917506, 917535), Interval::new(917632, 917759), Interval::new(918000, 983039), Interval::new(1048574, 1048575), Interval::new(1114110, 1114111), ]; /// Return the code point ranges of the 'Unassigned' Unicode property. pub(crate) fn unassigned_ranges() -> &'static [Interval] { &UNASSIGNED } const UPPERCASE_LETTER: [Interval; 646] = [ Interval::new(65, 90), Interval::new(192, 214), Interval::new(216, 222), Interval::new(256, 256), Interval::new(258, 258), Interval::new(260, 260), Interval::new(262, 262), Interval::new(264, 264), Interval::new(266, 266), Interval::new(268, 268), Interval::new(270, 270), Interval::new(272, 272), Interval::new(274, 274), Interval::new(276, 276), Interval::new(278, 278), Interval::new(280, 280), Interval::new(282, 282), Interval::new(284, 284), Interval::new(286, 286), Interval::new(288, 288), Interval::new(290, 290), Interval::new(292, 292), Interval::new(294, 294), Interval::new(296, 296), Interval::new(298, 298), Interval::new(300, 300), Interval::new(302, 302), Interval::new(304, 304), Interval::new(306, 306), Interval::new(308, 308), Interval::new(310, 310), Interval::new(313, 313), Interval::new(315, 315), Interval::new(317, 317), Interval::new(319, 319), Interval::new(321, 321), Interval::new(323, 323), Interval::new(325, 325), Interval::new(327, 327), Interval::new(330, 330), Interval::new(332, 332), Interval::new(334, 334), Interval::new(336, 336), Interval::new(338, 338), Interval::new(340, 340), Interval::new(342, 342), Interval::new(344, 344), Interval::new(346, 346), Interval::new(348, 348), Interval::new(350, 350), Interval::new(352, 352), Interval::new(354, 354), Interval::new(356, 356), Interval::new(358, 358), Interval::new(360, 360), Interval::new(362, 362), Interval::new(364, 364), Interval::new(366, 366), Interval::new(368, 368), Interval::new(370, 370), Interval::new(372, 372), Interval::new(374, 374), Interval::new(376, 377), Interval::new(379, 379), Interval::new(381, 381), Interval::new(385, 386), Interval::new(388, 388), Interval::new(390, 391), Interval::new(393, 395), Interval::new(398, 401), Interval::new(403, 404), Interval::new(406, 408), Interval::new(412, 413), Interval::new(415, 416), Interval::new(418, 418), Interval::new(420, 420), Interval::new(422, 423), Interval::new(425, 425), Interval::new(428, 428), Interval::new(430, 431), Interval::new(433, 435), Interval::new(437, 437), Interval::new(439, 440), Interval::new(444, 444), Interval::new(452, 452), Interval::new(455, 455), Interval::new(458, 458), Interval::new(461, 461), Interval::new(463, 463), Interval::new(465, 465), Interval::new(467, 467), Interval::new(469, 469), Interval::new(471, 471), Interval::new(473, 473), Interval::new(475, 475), Interval::new(478, 478), Interval::new(480, 480), Interval::new(482, 482), Interval::new(484, 484), Interval::new(486, 486), Interval::new(488, 488), Interval::new(490, 490), Interval::new(492, 492), Interval::new(494, 494), Interval::new(497, 497), Interval::new(500, 500), Interval::new(502, 504), Interval::new(506, 506), Interval::new(508, 508), Interval::new(510, 510), Interval::new(512, 512), Interval::new(514, 514), Interval::new(516, 516), Interval::new(518, 518), Interval::new(520, 520), Interval::new(522, 522), Interval::new(524, 524), Interval::new(526, 526), Interval::new(528, 528), Interval::new(530, 530), Interval::new(532, 532), Interval::new(534, 534), Interval::new(536, 536), Interval::new(538, 538), Interval::new(540, 540), Interval::new(542, 542), Interval::new(544, 544), Interval::new(546, 546), Interval::new(548, 548), Interval::new(550, 550), Interval::new(552, 552), Interval::new(554, 554), Interval::new(556, 556), Interval::new(558, 558), Interval::new(560, 560), Interval::new(562, 562), Interval::new(570, 571), Interval::new(573, 574), Interval::new(577, 577), Interval::new(579, 582), Interval::new(584, 584), Interval::new(586, 586), Interval::new(588, 588), Interval::new(590, 590), Interval::new(880, 880), Interval::new(882, 882), Interval::new(886, 886), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 911), Interval::new(913, 929), Interval::new(931, 939), Interval::new(975, 975), Interval::new(978, 980), Interval::new(984, 984), Interval::new(986, 986), Interval::new(988, 988), Interval::new(990, 990), Interval::new(992, 992), Interval::new(994, 994), Interval::new(996, 996), Interval::new(998, 998), Interval::new(1000, 1000), Interval::new(1002, 1002), Interval::new(1004, 1004), Interval::new(1006, 1006), Interval::new(1012, 1012), Interval::new(1015, 1015), Interval::new(1017, 1018), Interval::new(1021, 1071), Interval::new(1120, 1120), Interval::new(1122, 1122), Interval::new(1124, 1124), Interval::new(1126, 1126), Interval::new(1128, 1128), Interval::new(1130, 1130), Interval::new(1132, 1132), Interval::new(1134, 1134), Interval::new(1136, 1136), Interval::new(1138, 1138), Interval::new(1140, 1140), Interval::new(1142, 1142), Interval::new(1144, 1144), Interval::new(1146, 1146), Interval::new(1148, 1148), Interval::new(1150, 1150), Interval::new(1152, 1152), Interval::new(1162, 1162), Interval::new(1164, 1164), Interval::new(1166, 1166), Interval::new(1168, 1168), Interval::new(1170, 1170), Interval::new(1172, 1172), Interval::new(1174, 1174), Interval::new(1176, 1176), Interval::new(1178, 1178), Interval::new(1180, 1180), Interval::new(1182, 1182), Interval::new(1184, 1184), Interval::new(1186, 1186), Interval::new(1188, 1188), Interval::new(1190, 1190), Interval::new(1192, 1192), Interval::new(1194, 1194), Interval::new(1196, 1196), Interval::new(1198, 1198), Interval::new(1200, 1200), Interval::new(1202, 1202), Interval::new(1204, 1204), Interval::new(1206, 1206), Interval::new(1208, 1208), Interval::new(1210, 1210), Interval::new(1212, 1212), Interval::new(1214, 1214), Interval::new(1216, 1217), Interval::new(1219, 1219), Interval::new(1221, 1221), Interval::new(1223, 1223), Interval::new(1225, 1225), Interval::new(1227, 1227), Interval::new(1229, 1229), Interval::new(1232, 1232), Interval::new(1234, 1234), Interval::new(1236, 1236), Interval::new(1238, 1238), Interval::new(1240, 1240), Interval::new(1242, 1242), Interval::new(1244, 1244), Interval::new(1246, 1246), Interval::new(1248, 1248), Interval::new(1250, 1250), Interval::new(1252, 1252), Interval::new(1254, 1254), Interval::new(1256, 1256), Interval::new(1258, 1258), Interval::new(1260, 1260), Interval::new(1262, 1262), Interval::new(1264, 1264), Interval::new(1266, 1266), Interval::new(1268, 1268), Interval::new(1270, 1270), Interval::new(1272, 1272), Interval::new(1274, 1274), Interval::new(1276, 1276), Interval::new(1278, 1278), Interval::new(1280, 1280), Interval::new(1282, 1282), Interval::new(1284, 1284), Interval::new(1286, 1286), Interval::new(1288, 1288), Interval::new(1290, 1290), Interval::new(1292, 1292), Interval::new(1294, 1294), Interval::new(1296, 1296), Interval::new(1298, 1298), Interval::new(1300, 1300), Interval::new(1302, 1302), Interval::new(1304, 1304), Interval::new(1306, 1306), Interval::new(1308, 1308), Interval::new(1310, 1310), Interval::new(1312, 1312), Interval::new(1314, 1314), Interval::new(1316, 1316), Interval::new(1318, 1318), Interval::new(1320, 1320), Interval::new(1322, 1322), Interval::new(1324, 1324), Interval::new(1326, 1326), Interval::new(1329, 1366), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(5024, 5109), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7680, 7680), Interval::new(7682, 7682), Interval::new(7684, 7684), Interval::new(7686, 7686), Interval::new(7688, 7688), Interval::new(7690, 7690), Interval::new(7692, 7692), Interval::new(7694, 7694), Interval::new(7696, 7696), Interval::new(7698, 7698), Interval::new(7700, 7700), Interval::new(7702, 7702), Interval::new(7704, 7704), Interval::new(7706, 7706), Interval::new(7708, 7708), Interval::new(7710, 7710), Interval::new(7712, 7712), Interval::new(7714, 7714), Interval::new(7716, 7716), Interval::new(7718, 7718), Interval::new(7720, 7720), Interval::new(7722, 7722), Interval::new(7724, 7724), Interval::new(7726, 7726), Interval::new(7728, 7728), Interval::new(7730, 7730), Interval::new(7732, 7732), Interval::new(7734, 7734), Interval::new(7736, 7736), Interval::new(7738, 7738), Interval::new(7740, 7740), Interval::new(7742, 7742), Interval::new(7744, 7744), Interval::new(7746, 7746), Interval::new(7748, 7748), Interval::new(7750, 7750), Interval::new(7752, 7752), Interval::new(7754, 7754), Interval::new(7756, 7756), Interval::new(7758, 7758), Interval::new(7760, 7760), Interval::new(7762, 7762), Interval::new(7764, 7764), Interval::new(7766, 7766), Interval::new(7768, 7768), Interval::new(7770, 7770), Interval::new(7772, 7772), Interval::new(7774, 7774), Interval::new(7776, 7776), Interval::new(7778, 7778), Interval::new(7780, 7780), Interval::new(7782, 7782), Interval::new(7784, 7784), Interval::new(7786, 7786), Interval::new(7788, 7788), Interval::new(7790, 7790), Interval::new(7792, 7792), Interval::new(7794, 7794), Interval::new(7796, 7796), Interval::new(7798, 7798), Interval::new(7800, 7800), Interval::new(7802, 7802), Interval::new(7804, 7804), Interval::new(7806, 7806), Interval::new(7808, 7808), Interval::new(7810, 7810), Interval::new(7812, 7812), Interval::new(7814, 7814), Interval::new(7816, 7816), Interval::new(7818, 7818), Interval::new(7820, 7820), Interval::new(7822, 7822), Interval::new(7824, 7824), Interval::new(7826, 7826), Interval::new(7828, 7828), Interval::new(7838, 7838), Interval::new(7840, 7840), Interval::new(7842, 7842), Interval::new(7844, 7844), Interval::new(7846, 7846), Interval::new(7848, 7848), Interval::new(7850, 7850), Interval::new(7852, 7852), Interval::new(7854, 7854), Interval::new(7856, 7856), Interval::new(7858, 7858), Interval::new(7860, 7860), Interval::new(7862, 7862), Interval::new(7864, 7864), Interval::new(7866, 7866), Interval::new(7868, 7868), Interval::new(7870, 7870), Interval::new(7872, 7872), Interval::new(7874, 7874), Interval::new(7876, 7876), Interval::new(7878, 7878), Interval::new(7880, 7880), Interval::new(7882, 7882), Interval::new(7884, 7884), Interval::new(7886, 7886), Interval::new(7888, 7888), Interval::new(7890, 7890), Interval::new(7892, 7892), Interval::new(7894, 7894), Interval::new(7896, 7896), Interval::new(7898, 7898), Interval::new(7900, 7900), Interval::new(7902, 7902), Interval::new(7904, 7904), Interval::new(7906, 7906), Interval::new(7908, 7908), Interval::new(7910, 7910), Interval::new(7912, 7912), Interval::new(7914, 7914), Interval::new(7916, 7916), Interval::new(7918, 7918), Interval::new(7920, 7920), Interval::new(7922, 7922), Interval::new(7924, 7924), Interval::new(7926, 7926), Interval::new(7928, 7928), Interval::new(7930, 7930), Interval::new(7932, 7932), Interval::new(7934, 7934), Interval::new(7944, 7951), Interval::new(7960, 7965), Interval::new(7976, 7983), Interval::new(7992, 7999), Interval::new(8008, 8013), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8031), Interval::new(8040, 8047), Interval::new(8120, 8123), Interval::new(8136, 8139), Interval::new(8152, 8155), Interval::new(8168, 8172), Interval::new(8184, 8187), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8459, 8461), Interval::new(8464, 8466), Interval::new(8469, 8469), Interval::new(8473, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8493), Interval::new(8496, 8499), Interval::new(8510, 8511), Interval::new(8517, 8517), Interval::new(8579, 8579), Interval::new(11264, 11311), Interval::new(11360, 11360), Interval::new(11362, 11364), Interval::new(11367, 11367), Interval::new(11369, 11369), Interval::new(11371, 11371), Interval::new(11373, 11376), Interval::new(11378, 11378), Interval::new(11381, 11381), Interval::new(11390, 11392), Interval::new(11394, 11394), Interval::new(11396, 11396), Interval::new(11398, 11398), Interval::new(11400, 11400), Interval::new(11402, 11402), Interval::new(11404, 11404), Interval::new(11406, 11406), Interval::new(11408, 11408), Interval::new(11410, 11410), Interval::new(11412, 11412), Interval::new(11414, 11414), Interval::new(11416, 11416), Interval::new(11418, 11418), Interval::new(11420, 11420), Interval::new(11422, 11422), Interval::new(11424, 11424), Interval::new(11426, 11426), Interval::new(11428, 11428), Interval::new(11430, 11430), Interval::new(11432, 11432), Interval::new(11434, 11434), Interval::new(11436, 11436), Interval::new(11438, 11438), Interval::new(11440, 11440), Interval::new(11442, 11442), Interval::new(11444, 11444), Interval::new(11446, 11446), Interval::new(11448, 11448), Interval::new(11450, 11450), Interval::new(11452, 11452), Interval::new(11454, 11454), Interval::new(11456, 11456), Interval::new(11458, 11458), Interval::new(11460, 11460), Interval::new(11462, 11462), Interval::new(11464, 11464), Interval::new(11466, 11466), Interval::new(11468, 11468), Interval::new(11470, 11470), Interval::new(11472, 11472), Interval::new(11474, 11474), Interval::new(11476, 11476), Interval::new(11478, 11478), Interval::new(11480, 11480), Interval::new(11482, 11482), Interval::new(11484, 11484), Interval::new(11486, 11486), Interval::new(11488, 11488), Interval::new(11490, 11490), Interval::new(11499, 11499), Interval::new(11501, 11501), Interval::new(11506, 11506), Interval::new(42560, 42560), Interval::new(42562, 42562), Interval::new(42564, 42564), Interval::new(42566, 42566), Interval::new(42568, 42568), Interval::new(42570, 42570), Interval::new(42572, 42572), Interval::new(42574, 42574), Interval::new(42576, 42576), Interval::new(42578, 42578), Interval::new(42580, 42580), Interval::new(42582, 42582), Interval::new(42584, 42584), Interval::new(42586, 42586), Interval::new(42588, 42588), Interval::new(42590, 42590), Interval::new(42592, 42592), Interval::new(42594, 42594), Interval::new(42596, 42596), Interval::new(42598, 42598), Interval::new(42600, 42600), Interval::new(42602, 42602), Interval::new(42604, 42604), Interval::new(42624, 42624), Interval::new(42626, 42626), Interval::new(42628, 42628), Interval::new(42630, 42630), Interval::new(42632, 42632), Interval::new(42634, 42634), Interval::new(42636, 42636), Interval::new(42638, 42638), Interval::new(42640, 42640), Interval::new(42642, 42642), Interval::new(42644, 42644), Interval::new(42646, 42646), Interval::new(42648, 42648), Interval::new(42650, 42650), Interval::new(42786, 42786), Interval::new(42788, 42788), Interval::new(42790, 42790), Interval::new(42792, 42792), Interval::new(42794, 42794), Interval::new(42796, 42796), Interval::new(42798, 42798), Interval::new(42802, 42802), Interval::new(42804, 42804), Interval::new(42806, 42806), Interval::new(42808, 42808), Interval::new(42810, 42810), Interval::new(42812, 42812), Interval::new(42814, 42814), Interval::new(42816, 42816), Interval::new(42818, 42818), Interval::new(42820, 42820), Interval::new(42822, 42822), Interval::new(42824, 42824), Interval::new(42826, 42826), Interval::new(42828, 42828), Interval::new(42830, 42830), Interval::new(42832, 42832), Interval::new(42834, 42834), Interval::new(42836, 42836), Interval::new(42838, 42838), Interval::new(42840, 42840), Interval::new(42842, 42842), Interval::new(42844, 42844), Interval::new(42846, 42846), Interval::new(42848, 42848), Interval::new(42850, 42850), Interval::new(42852, 42852), Interval::new(42854, 42854), Interval::new(42856, 42856), Interval::new(42858, 42858), Interval::new(42860, 42860), Interval::new(42862, 42862), Interval::new(42873, 42873), Interval::new(42875, 42875), Interval::new(42877, 42878), Interval::new(42880, 42880), Interval::new(42882, 42882), Interval::new(42884, 42884), Interval::new(42886, 42886), Interval::new(42891, 42891), Interval::new(42893, 42893), Interval::new(42896, 42896), Interval::new(42898, 42898), Interval::new(42902, 42902), Interval::new(42904, 42904), Interval::new(42906, 42906), Interval::new(42908, 42908), Interval::new(42910, 42910), Interval::new(42912, 42912), Interval::new(42914, 42914), Interval::new(42916, 42916), Interval::new(42918, 42918), Interval::new(42920, 42920), Interval::new(42922, 42926), Interval::new(42928, 42932), Interval::new(42934, 42934), Interval::new(42936, 42936), Interval::new(42938, 42938), Interval::new(42940, 42940), Interval::new(42942, 42942), Interval::new(42944, 42944), Interval::new(42946, 42946), Interval::new(42948, 42951), Interval::new(42953, 42953), Interval::new(42960, 42960), Interval::new(42966, 42966), Interval::new(42968, 42968), Interval::new(42997, 42997), Interval::new(65313, 65338), Interval::new(66560, 66599), Interval::new(66736, 66771), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(68736, 68786), Interval::new(71840, 71871), Interval::new(93760, 93791), Interval::new(119808, 119833), Interval::new(119860, 119885), Interval::new(119912, 119937), Interval::new(119964, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119989), Interval::new(120016, 120041), Interval::new(120068, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120120, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120172, 120197), Interval::new(120224, 120249), Interval::new(120276, 120301), Interval::new(120328, 120353), Interval::new(120380, 120405), Interval::new(120432, 120457), Interval::new(120488, 120512), Interval::new(120546, 120570), Interval::new(120604, 120628), Interval::new(120662, 120686), Interval::new(120720, 120744), Interval::new(120778, 120778), Interval::new(125184, 125217), ]; /// Return the code point ranges of the 'Uppercase_Letter' Unicode property. pub(crate) fn uppercase_letter_ranges() -> &'static [Interval] { &UPPERCASE_LETTER } const CASED_LETTER: [Interval; 143] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(181, 181), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 442), Interval::new(444, 447), Interval::new(452, 659), Interval::new(661, 687), Interval::new(880, 883), Interval::new(886, 887), Interval::new(891, 893), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1376, 1416), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4349, 4351), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7424, 7467), Interval::new(7531, 7543), Interval::new(7545, 7578), Interval::new(7680, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8473, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8493), Interval::new(8495, 8500), Interval::new(8505, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8579, 8580), Interval::new(11264, 11387), Interval::new(11390, 11492), Interval::new(11499, 11502), Interval::new(11506, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(42560, 42605), Interval::new(42624, 42651), Interval::new(42786, 42863), Interval::new(42865, 42887), Interval::new(42891, 42894), Interval::new(42896, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42997, 42998), Interval::new(43002, 43002), Interval::new(43824, 43866), Interval::new(43872, 43880), Interval::new(43888, 43967), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(66560, 66639), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(71840, 71903), Interval::new(93760, 93823), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(122624, 122633), Interval::new(122635, 122654), Interval::new(122661, 122666), Interval::new(125184, 125251), ]; /// Return the code point ranges of the 'Cased_Letter' Unicode property. pub(crate) fn cased_letter_ranges() -> &'static [Interval] { &CASED_LETTER } const OTHER: [Interval; 712] = [ Interval::new(0, 31), Interval::new(127, 159), Interval::new(173, 173), Interval::new(888, 889), Interval::new(896, 899), Interval::new(907, 907), Interval::new(909, 909), Interval::new(930, 930), Interval::new(1328, 1328), Interval::new(1367, 1368), Interval::new(1419, 1420), Interval::new(1424, 1424), Interval::new(1480, 1487), Interval::new(1515, 1518), Interval::new(1525, 1541), Interval::new(1564, 1564), Interval::new(1757, 1757), Interval::new(1806, 1807), Interval::new(1867, 1868), Interval::new(1970, 1983), Interval::new(2043, 2044), Interval::new(2094, 2095), Interval::new(2111, 2111), Interval::new(2140, 2141), Interval::new(2143, 2143), Interval::new(2155, 2159), Interval::new(2191, 2199), Interval::new(2274, 2274), Interval::new(2436, 2436), Interval::new(2445, 2446), Interval::new(2449, 2450), Interval::new(2473, 2473), Interval::new(2481, 2481), Interval::new(2483, 2485), Interval::new(2490, 2491), Interval::new(2501, 2502), Interval::new(2505, 2506), Interval::new(2511, 2518), Interval::new(2520, 2523), Interval::new(2526, 2526), Interval::new(2532, 2533), Interval::new(2559, 2560), Interval::new(2564, 2564), Interval::new(2571, 2574), Interval::new(2577, 2578), Interval::new(2601, 2601), Interval::new(2609, 2609), Interval::new(2612, 2612), Interval::new(2615, 2615), Interval::new(2618, 2619), Interval::new(2621, 2621), Interval::new(2627, 2630), Interval::new(2633, 2634), Interval::new(2638, 2640), Interval::new(2642, 2648), Interval::new(2653, 2653), Interval::new(2655, 2661), Interval::new(2679, 2688), Interval::new(2692, 2692), Interval::new(2702, 2702), Interval::new(2706, 2706), Interval::new(2729, 2729), Interval::new(2737, 2737), Interval::new(2740, 2740), Interval::new(2746, 2747), Interval::new(2758, 2758), Interval::new(2762, 2762), Interval::new(2766, 2767), Interval::new(2769, 2783), Interval::new(2788, 2789), Interval::new(2802, 2808), Interval::new(2816, 2816), Interval::new(2820, 2820), Interval::new(2829, 2830), Interval::new(2833, 2834), Interval::new(2857, 2857), Interval::new(2865, 2865), Interval::new(2868, 2868), Interval::new(2874, 2875), Interval::new(2885, 2886), Interval::new(2889, 2890), Interval::new(2894, 2900), Interval::new(2904, 2907), Interval::new(2910, 2910), Interval::new(2916, 2917), Interval::new(2936, 2945), Interval::new(2948, 2948), Interval::new(2955, 2957), Interval::new(2961, 2961), Interval::new(2966, 2968), Interval::new(2971, 2971), Interval::new(2973, 2973), Interval::new(2976, 2978), Interval::new(2981, 2983), Interval::new(2987, 2989), Interval::new(3002, 3005), Interval::new(3011, 3013), Interval::new(3017, 3017), Interval::new(3022, 3023), Interval::new(3025, 3030), Interval::new(3032, 3045), Interval::new(3067, 3071), Interval::new(3085, 3085), Interval::new(3089, 3089), Interval::new(3113, 3113), Interval::new(3130, 3131), Interval::new(3141, 3141), Interval::new(3145, 3145), Interval::new(3150, 3156), Interval::new(3159, 3159), Interval::new(3163, 3164), Interval::new(3166, 3167), Interval::new(3172, 3173), Interval::new(3184, 3190), Interval::new(3213, 3213), Interval::new(3217, 3217), Interval::new(3241, 3241), Interval::new(3252, 3252), Interval::new(3258, 3259), Interval::new(3269, 3269), Interval::new(3273, 3273), Interval::new(3278, 3284), Interval::new(3287, 3292), Interval::new(3295, 3295), Interval::new(3300, 3301), Interval::new(3312, 3312), Interval::new(3316, 3327), Interval::new(3341, 3341), Interval::new(3345, 3345), Interval::new(3397, 3397), Interval::new(3401, 3401), Interval::new(3408, 3411), Interval::new(3428, 3429), Interval::new(3456, 3456), Interval::new(3460, 3460), Interval::new(3479, 3481), Interval::new(3506, 3506), Interval::new(3516, 3516), Interval::new(3518, 3519), Interval::new(3527, 3529), Interval::new(3531, 3534), Interval::new(3541, 3541), Interval::new(3543, 3543), Interval::new(3552, 3557), Interval::new(3568, 3569), Interval::new(3573, 3584), Interval::new(3643, 3646), Interval::new(3676, 3712), Interval::new(3715, 3715), Interval::new(3717, 3717), Interval::new(3723, 3723), Interval::new(3748, 3748), Interval::new(3750, 3750), Interval::new(3774, 3775), Interval::new(3781, 3781), Interval::new(3783, 3783), Interval::new(3791, 3791), Interval::new(3802, 3803), Interval::new(3808, 3839), Interval::new(3912, 3912), Interval::new(3949, 3952), Interval::new(3992, 3992), Interval::new(4029, 4029), Interval::new(4045, 4045), Interval::new(4059, 4095), Interval::new(4294, 4294), Interval::new(4296, 4300), Interval::new(4302, 4303), Interval::new(4681, 4681), Interval::new(4686, 4687), Interval::new(4695, 4695), Interval::new(4697, 4697), Interval::new(4702, 4703), Interval::new(4745, 4745), Interval::new(4750, 4751), Interval::new(4785, 4785), Interval::new(4790, 4791), Interval::new(4799, 4799), Interval::new(4801, 4801), Interval::new(4806, 4807), Interval::new(4823, 4823), Interval::new(4881, 4881), Interval::new(4886, 4887), Interval::new(4955, 4956), Interval::new(4989, 4991), Interval::new(5018, 5023), Interval::new(5110, 5111), Interval::new(5118, 5119), Interval::new(5789, 5791), Interval::new(5881, 5887), Interval::new(5910, 5918), Interval::new(5943, 5951), Interval::new(5972, 5983), Interval::new(5997, 5997), Interval::new(6001, 6001), Interval::new(6004, 6015), Interval::new(6110, 6111), Interval::new(6122, 6127), Interval::new(6138, 6143), Interval::new(6158, 6158), Interval::new(6170, 6175), Interval::new(6265, 6271), Interval::new(6315, 6319), Interval::new(6390, 6399), Interval::new(6431, 6431), Interval::new(6444, 6447), Interval::new(6460, 6463), Interval::new(6465, 6467), Interval::new(6510, 6511), Interval::new(6517, 6527), Interval::new(6572, 6575), Interval::new(6602, 6607), Interval::new(6619, 6621), Interval::new(6684, 6685), Interval::new(6751, 6751), Interval::new(6781, 6782), Interval::new(6794, 6799), Interval::new(6810, 6815), Interval::new(6830, 6831), Interval::new(6863, 6911), Interval::new(6989, 6991), Interval::new(7039, 7039), Interval::new(7156, 7163), Interval::new(7224, 7226), Interval::new(7242, 7244), Interval::new(7305, 7311), Interval::new(7355, 7356), Interval::new(7368, 7375), Interval::new(7419, 7423), Interval::new(7958, 7959), Interval::new(7966, 7967), Interval::new(8006, 8007), Interval::new(8014, 8015), Interval::new(8024, 8024), Interval::new(8026, 8026), Interval::new(8028, 8028), Interval::new(8030, 8030), Interval::new(8062, 8063), Interval::new(8117, 8117), Interval::new(8133, 8133), Interval::new(8148, 8149), Interval::new(8156, 8156), Interval::new(8176, 8177), Interval::new(8181, 8181), Interval::new(8191, 8191), Interval::new(8203, 8207), Interval::new(8234, 8238), Interval::new(8288, 8303), Interval::new(8306, 8307), Interval::new(8335, 8335), Interval::new(8349, 8351), Interval::new(8385, 8399), Interval::new(8433, 8447), Interval::new(8588, 8591), Interval::new(9255, 9279), Interval::new(9291, 9311), Interval::new(11124, 11125), Interval::new(11158, 11158), Interval::new(11508, 11512), Interval::new(11558, 11558), Interval::new(11560, 11564), Interval::new(11566, 11567), Interval::new(11624, 11630), Interval::new(11633, 11646), Interval::new(11671, 11679), Interval::new(11687, 11687), Interval::new(11695, 11695), Interval::new(11703, 11703), Interval::new(11711, 11711), Interval::new(11719, 11719), Interval::new(11727, 11727), Interval::new(11735, 11735), Interval::new(11743, 11743), Interval::new(11870, 11903), Interval::new(11930, 11930), Interval::new(12020, 12031), Interval::new(12246, 12271), Interval::new(12352, 12352), Interval::new(12439, 12440), Interval::new(12544, 12548), Interval::new(12592, 12592), Interval::new(12687, 12687), Interval::new(12772, 12782), Interval::new(12831, 12831), Interval::new(42125, 42127), Interval::new(42183, 42191), Interval::new(42540, 42559), Interval::new(42744, 42751), Interval::new(42955, 42959), Interval::new(42962, 42962), Interval::new(42964, 42964), Interval::new(42970, 42993), Interval::new(43053, 43055), Interval::new(43066, 43071), Interval::new(43128, 43135), Interval::new(43206, 43213), Interval::new(43226, 43231), Interval::new(43348, 43358), Interval::new(43389, 43391), Interval::new(43470, 43470), Interval::new(43482, 43485), Interval::new(43519, 43519), Interval::new(43575, 43583), Interval::new(43598, 43599), Interval::new(43610, 43611), Interval::new(43715, 43738), Interval::new(43767, 43776), Interval::new(43783, 43784), Interval::new(43791, 43792), Interval::new(43799, 43807), Interval::new(43815, 43815), Interval::new(43823, 43823), Interval::new(43884, 43887), Interval::new(44014, 44015), Interval::new(44026, 44031), Interval::new(55204, 55215), Interval::new(55239, 55242), Interval::new(55292, 63743), Interval::new(64110, 64111), Interval::new(64218, 64255), Interval::new(64263, 64274), Interval::new(64280, 64284), Interval::new(64311, 64311), Interval::new(64317, 64317), Interval::new(64319, 64319), Interval::new(64322, 64322), Interval::new(64325, 64325), Interval::new(64451, 64466), Interval::new(64912, 64913), Interval::new(64968, 64974), Interval::new(64976, 65007), Interval::new(65050, 65055), Interval::new(65107, 65107), Interval::new(65127, 65127), Interval::new(65132, 65135), Interval::new(65141, 65141), Interval::new(65277, 65280), Interval::new(65471, 65473), Interval::new(65480, 65481), Interval::new(65488, 65489), Interval::new(65496, 65497), Interval::new(65501, 65503), Interval::new(65511, 65511), Interval::new(65519, 65531), Interval::new(65534, 65535), Interval::new(65548, 65548), Interval::new(65575, 65575), Interval::new(65595, 65595), Interval::new(65598, 65598), Interval::new(65614, 65615), Interval::new(65630, 65663), Interval::new(65787, 65791), Interval::new(65795, 65798), Interval::new(65844, 65846), Interval::new(65935, 65935), Interval::new(65949, 65951), Interval::new(65953, 65999), Interval::new(66046, 66175), Interval::new(66205, 66207), Interval::new(66257, 66271), Interval::new(66300, 66303), Interval::new(66340, 66348), Interval::new(66379, 66383), Interval::new(66427, 66431), Interval::new(66462, 66462), Interval::new(66500, 66503), Interval::new(66518, 66559), Interval::new(66718, 66719), Interval::new(66730, 66735), Interval::new(66772, 66775), Interval::new(66812, 66815), Interval::new(66856, 66863), Interval::new(66916, 66926), Interval::new(66939, 66939), Interval::new(66955, 66955), Interval::new(66963, 66963), Interval::new(66966, 66966), Interval::new(66978, 66978), Interval::new(66994, 66994), Interval::new(67002, 67002), Interval::new(67005, 67071), Interval::new(67383, 67391), Interval::new(67414, 67423), Interval::new(67432, 67455), Interval::new(67462, 67462), Interval::new(67505, 67505), Interval::new(67515, 67583), Interval::new(67590, 67591), Interval::new(67593, 67593), Interval::new(67638, 67638), Interval::new(67641, 67643), Interval::new(67645, 67646), Interval::new(67670, 67670), Interval::new(67743, 67750), Interval::new(67760, 67807), Interval::new(67827, 67827), Interval::new(67830, 67834), Interval::new(67868, 67870), Interval::new(67898, 67902), Interval::new(67904, 67967), Interval::new(68024, 68027), Interval::new(68048, 68049), Interval::new(68100, 68100), Interval::new(68103, 68107), Interval::new(68116, 68116), Interval::new(68120, 68120), Interval::new(68150, 68151), Interval::new(68155, 68158), Interval::new(68169, 68175), Interval::new(68185, 68191), Interval::new(68256, 68287), Interval::new(68327, 68330), Interval::new(68343, 68351), Interval::new(68406, 68408), Interval::new(68438, 68439), Interval::new(68467, 68471), Interval::new(68498, 68504), Interval::new(68509, 68520), Interval::new(68528, 68607), Interval::new(68681, 68735), Interval::new(68787, 68799), Interval::new(68851, 68857), Interval::new(68904, 68911), Interval::new(68922, 69215), Interval::new(69247, 69247), Interval::new(69290, 69290), Interval::new(69294, 69295), Interval::new(69298, 69372), Interval::new(69416, 69423), Interval::new(69466, 69487), Interval::new(69514, 69551), Interval::new(69580, 69599), Interval::new(69623, 69631), Interval::new(69710, 69713), Interval::new(69750, 69758), Interval::new(69821, 69821), Interval::new(69827, 69839), Interval::new(69865, 69871), Interval::new(69882, 69887), Interval::new(69941, 69941), Interval::new(69960, 69967), Interval::new(70007, 70015), Interval::new(70112, 70112), Interval::new(70133, 70143), Interval::new(70162, 70162), Interval::new(70210, 70271), Interval::new(70279, 70279), Interval::new(70281, 70281), Interval::new(70286, 70286), Interval::new(70302, 70302), Interval::new(70314, 70319), Interval::new(70379, 70383), Interval::new(70394, 70399), Interval::new(70404, 70404), Interval::new(70413, 70414), Interval::new(70417, 70418), Interval::new(70441, 70441), Interval::new(70449, 70449), Interval::new(70452, 70452), Interval::new(70458, 70458), Interval::new(70469, 70470), Interval::new(70473, 70474), Interval::new(70478, 70479), Interval::new(70481, 70486), Interval::new(70488, 70492), Interval::new(70500, 70501), Interval::new(70509, 70511), Interval::new(70517, 70655), Interval::new(70748, 70748), Interval::new(70754, 70783), Interval::new(70856, 70863), Interval::new(70874, 71039), Interval::new(71094, 71095), Interval::new(71134, 71167), Interval::new(71237, 71247), Interval::new(71258, 71263), Interval::new(71277, 71295), Interval::new(71354, 71359), Interval::new(71370, 71423), Interval::new(71451, 71452), Interval::new(71468, 71471), Interval::new(71495, 71679), Interval::new(71740, 71839), Interval::new(71923, 71934), Interval::new(71943, 71944), Interval::new(71946, 71947), Interval::new(71956, 71956), Interval::new(71959, 71959), Interval::new(71990, 71990), Interval::new(71993, 71994), Interval::new(72007, 72015), Interval::new(72026, 72095), Interval::new(72104, 72105), Interval::new(72152, 72153), Interval::new(72165, 72191), Interval::new(72264, 72271), Interval::new(72355, 72367), Interval::new(72441, 72447), Interval::new(72458, 72703), Interval::new(72713, 72713), Interval::new(72759, 72759), Interval::new(72774, 72783), Interval::new(72813, 72815), Interval::new(72848, 72849), Interval::new(72872, 72872), Interval::new(72887, 72959), Interval::new(72967, 72967), Interval::new(72970, 72970), Interval::new(73015, 73017), Interval::new(73019, 73019), Interval::new(73022, 73022), Interval::new(73032, 73039), Interval::new(73050, 73055), Interval::new(73062, 73062), Interval::new(73065, 73065), Interval::new(73103, 73103), Interval::new(73106, 73106), Interval::new(73113, 73119), Interval::new(73130, 73439), Interval::new(73465, 73471), Interval::new(73489, 73489), Interval::new(73531, 73533), Interval::new(73562, 73647), Interval::new(73649, 73663), Interval::new(73714, 73726), Interval::new(74650, 74751), Interval::new(74863, 74863), Interval::new(74869, 74879), Interval::new(75076, 77711), Interval::new(77811, 77823), Interval::new(78896, 78911), Interval::new(78934, 82943), Interval::new(83527, 92159), Interval::new(92729, 92735), Interval::new(92767, 92767), Interval::new(92778, 92781), Interval::new(92863, 92863), Interval::new(92874, 92879), Interval::new(92910, 92911), Interval::new(92918, 92927), Interval::new(92998, 93007), Interval::new(93018, 93018), Interval::new(93026, 93026), Interval::new(93048, 93052), Interval::new(93072, 93759), Interval::new(93851, 93951), Interval::new(94027, 94030), Interval::new(94088, 94094), Interval::new(94112, 94175), Interval::new(94181, 94191), Interval::new(94194, 94207), Interval::new(100344, 100351), Interval::new(101590, 101631), Interval::new(101641, 110575), Interval::new(110580, 110580), Interval::new(110588, 110588), Interval::new(110591, 110591), Interval::new(110883, 110897), Interval::new(110899, 110927), Interval::new(110931, 110932), Interval::new(110934, 110947), Interval::new(110952, 110959), Interval::new(111356, 113663), Interval::new(113771, 113775), Interval::new(113789, 113791), Interval::new(113801, 113807), Interval::new(113818, 113819), Interval::new(113824, 118527), Interval::new(118574, 118575), Interval::new(118599, 118607), Interval::new(118724, 118783), Interval::new(119030, 119039), Interval::new(119079, 119080), Interval::new(119155, 119162), Interval::new(119275, 119295), Interval::new(119366, 119487), Interval::new(119508, 119519), Interval::new(119540, 119551), Interval::new(119639, 119647), Interval::new(119673, 119807), Interval::new(119893, 119893), Interval::new(119965, 119965), Interval::new(119968, 119969), Interval::new(119971, 119972), Interval::new(119975, 119976), Interval::new(119981, 119981), Interval::new(119994, 119994), Interval::new(119996, 119996), Interval::new(120004, 120004), Interval::new(120070, 120070), Interval::new(120075, 120076), Interval::new(120085, 120085), Interval::new(120093, 120093), Interval::new(120122, 120122), Interval::new(120127, 120127), Interval::new(120133, 120133), Interval::new(120135, 120137), Interval::new(120145, 120145), Interval::new(120486, 120487), Interval::new(120780, 120781), Interval::new(121484, 121498), Interval::new(121504, 121504), Interval::new(121520, 122623), Interval::new(122655, 122660), Interval::new(122667, 122879), Interval::new(122887, 122887), Interval::new(122905, 122906), Interval::new(122914, 122914), Interval::new(122917, 122917), Interval::new(122923, 122927), Interval::new(122990, 123022), Interval::new(123024, 123135), Interval::new(123181, 123183), Interval::new(123198, 123199), Interval::new(123210, 123213), Interval::new(123216, 123535), Interval::new(123567, 123583), Interval::new(123642, 123646), Interval::new(123648, 124111), Interval::new(124154, 124895), Interval::new(124903, 124903), Interval::new(124908, 124908), Interval::new(124911, 124911), Interval::new(124927, 124927), Interval::new(125125, 125126), Interval::new(125143, 125183), Interval::new(125260, 125263), Interval::new(125274, 125277), Interval::new(125280, 126064), Interval::new(126133, 126208), Interval::new(126270, 126463), Interval::new(126468, 126468), Interval::new(126496, 126496), Interval::new(126499, 126499), Interval::new(126501, 126502), Interval::new(126504, 126504), Interval::new(126515, 126515), Interval::new(126520, 126520), Interval::new(126522, 126522), Interval::new(126524, 126529), Interval::new(126531, 126534), Interval::new(126536, 126536), Interval::new(126538, 126538), Interval::new(126540, 126540), Interval::new(126544, 126544), Interval::new(126547, 126547), Interval::new(126549, 126550), Interval::new(126552, 126552), Interval::new(126554, 126554), Interval::new(126556, 126556), Interval::new(126558, 126558), Interval::new(126560, 126560), Interval::new(126563, 126563), Interval::new(126565, 126566), Interval::new(126571, 126571), Interval::new(126579, 126579), Interval::new(126584, 126584), Interval::new(126589, 126589), Interval::new(126591, 126591), Interval::new(126602, 126602), Interval::new(126620, 126624), Interval::new(126628, 126628), Interval::new(126634, 126634), Interval::new(126652, 126703), Interval::new(126706, 126975), Interval::new(127020, 127023), Interval::new(127124, 127135), Interval::new(127151, 127152), Interval::new(127168, 127168), Interval::new(127184, 127184), Interval::new(127222, 127231), Interval::new(127406, 127461), Interval::new(127491, 127503), Interval::new(127548, 127551), Interval::new(127561, 127567), Interval::new(127570, 127583), Interval::new(127590, 127743), Interval::new(128728, 128731), Interval::new(128749, 128751), Interval::new(128765, 128767), Interval::new(128887, 128890), Interval::new(128986, 128991), Interval::new(129004, 129007), Interval::new(129009, 129023), Interval::new(129036, 129039), Interval::new(129096, 129103), Interval::new(129114, 129119), Interval::new(129160, 129167), Interval::new(129198, 129199), Interval::new(129202, 129279), Interval::new(129620, 129631), Interval::new(129646, 129647), Interval::new(129661, 129663), Interval::new(129673, 129679), Interval::new(129726, 129726), Interval::new(129734, 129741), Interval::new(129756, 129759), Interval::new(129769, 129775), Interval::new(129785, 129791), Interval::new(129939, 129939), Interval::new(129995, 130031), Interval::new(130042, 131071), Interval::new(173792, 173823), Interval::new(177978, 177983), Interval::new(178206, 178207), Interval::new(183970, 183983), Interval::new(191457, 191471), Interval::new(192094, 194559), Interval::new(195102, 196607), Interval::new(201547, 201551), Interval::new(205744, 917759), Interval::new(918000, 1114111), ]; /// Return the code point ranges of the 'Other' Unicode property. pub(crate) fn other_ranges() -> &'static [Interval] { &OTHER } const LETTER: [Interval; 660] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(170, 170), Interval::new(181, 181), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 705), Interval::new(710, 721), Interval::new(736, 740), Interval::new(748, 748), Interval::new(750, 750), Interval::new(880, 884), Interval::new(886, 887), Interval::new(890, 893), Interval::new(895, 895), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 1013), Interval::new(1015, 1153), Interval::new(1162, 1327), Interval::new(1329, 1366), Interval::new(1369, 1369), Interval::new(1376, 1416), Interval::new(1488, 1514), Interval::new(1519, 1522), Interval::new(1568, 1610), Interval::new(1646, 1647), Interval::new(1649, 1747), Interval::new(1749, 1749), Interval::new(1765, 1766), Interval::new(1774, 1775), Interval::new(1786, 1788), Interval::new(1791, 1791), Interval::new(1808, 1808), Interval::new(1810, 1839), Interval::new(1869, 1957), Interval::new(1969, 1969), Interval::new(1994, 2026), Interval::new(2036, 2037), Interval::new(2042, 2042), Interval::new(2048, 2069), Interval::new(2074, 2074), Interval::new(2084, 2084), Interval::new(2088, 2088), Interval::new(2112, 2136), Interval::new(2144, 2154), Interval::new(2160, 2183), Interval::new(2185, 2190), Interval::new(2208, 2249), Interval::new(2308, 2361), Interval::new(2365, 2365), Interval::new(2384, 2384), Interval::new(2392, 2401), Interval::new(2417, 2432), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2493, 2493), Interval::new(2510, 2510), Interval::new(2524, 2525), Interval::new(2527, 2529), Interval::new(2544, 2545), Interval::new(2556, 2556), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2674, 2676), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2749, 2749), Interval::new(2768, 2768), Interval::new(2784, 2785), Interval::new(2809, 2809), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2877, 2877), Interval::new(2908, 2909), Interval::new(2911, 2913), Interval::new(2929, 2929), Interval::new(2947, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3024, 3024), Interval::new(3077, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3133, 3133), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3169), Interval::new(3200, 3200), Interval::new(3205, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3261, 3261), Interval::new(3293, 3294), Interval::new(3296, 3297), Interval::new(3313, 3314), Interval::new(3332, 3340), Interval::new(3342, 3344), Interval::new(3346, 3386), Interval::new(3389, 3389), Interval::new(3406, 3406), Interval::new(3412, 3414), Interval::new(3423, 3425), Interval::new(3450, 3455), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3585, 3632), Interval::new(3634, 3635), Interval::new(3648, 3654), Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3760), Interval::new(3762, 3763), Interval::new(3773, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3804, 3807), Interval::new(3840, 3840), Interval::new(3904, 3911), Interval::new(3913, 3948), Interval::new(3976, 3980), Interval::new(4096, 4138), Interval::new(4159, 4159), Interval::new(4176, 4181), Interval::new(4186, 4189), Interval::new(4193, 4193), Interval::new(4197, 4198), Interval::new(4206, 4208), Interval::new(4213, 4225), Interval::new(4238, 4238), Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4992, 5007), Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(5121, 5740), Interval::new(5743, 5759), Interval::new(5761, 5786), Interval::new(5792, 5866), Interval::new(5873, 5880), Interval::new(5888, 5905), Interval::new(5919, 5937), Interval::new(5952, 5969), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6016, 6067), Interval::new(6103, 6103), Interval::new(6108, 6108), Interval::new(6176, 6264), Interval::new(6272, 6276), Interval::new(6279, 6312), Interval::new(6314, 6314), Interval::new(6320, 6389), Interval::new(6400, 6430), Interval::new(6480, 6509), Interval::new(6512, 6516), Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6656, 6678), Interval::new(6688, 6740), Interval::new(6823, 6823), Interval::new(6917, 6963), Interval::new(6981, 6988), Interval::new(7043, 7072), Interval::new(7086, 7087), Interval::new(7098, 7141), Interval::new(7168, 7203), Interval::new(7245, 7247), Interval::new(7258, 7293), Interval::new(7296, 7304), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(7401, 7404), Interval::new(7406, 7411), Interval::new(7413, 7414), Interval::new(7418, 7418), Interval::new(7424, 7615), Interval::new(7680, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8124), Interval::new(8126, 8126), Interval::new(8130, 8132), Interval::new(8134, 8140), Interval::new(8144, 8147), Interval::new(8150, 8155), Interval::new(8160, 8172), Interval::new(8178, 8180), Interval::new(8182, 8188), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8450, 8450), Interval::new(8455, 8455), Interval::new(8458, 8467), Interval::new(8469, 8469), Interval::new(8473, 8477), Interval::new(8484, 8484), Interval::new(8486, 8486), Interval::new(8488, 8488), Interval::new(8490, 8493), Interval::new(8495, 8505), Interval::new(8508, 8511), Interval::new(8517, 8521), Interval::new(8526, 8526), Interval::new(8579, 8580), Interval::new(11264, 11492), Interval::new(11499, 11502), Interval::new(11506, 11507), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), Interval::new(11568, 11623), Interval::new(11631, 11631), Interval::new(11648, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(11823, 11823), Interval::new(12293, 12294), Interval::new(12337, 12341), Interval::new(12347, 12348), Interval::new(12353, 12438), Interval::new(12445, 12447), Interval::new(12449, 12538), Interval::new(12540, 12543), Interval::new(12549, 12591), Interval::new(12593, 12686), Interval::new(12704, 12735), Interval::new(12784, 12799), Interval::new(13312, 19903), Interval::new(19968, 42124), Interval::new(42192, 42237), Interval::new(42240, 42508), Interval::new(42512, 42527), Interval::new(42538, 42539), Interval::new(42560, 42606), Interval::new(42623, 42653), Interval::new(42656, 42725), Interval::new(42775, 42783), Interval::new(42786, 42888), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43009), Interval::new(43011, 43013), Interval::new(43015, 43018), Interval::new(43020, 43042), Interval::new(43072, 43123), Interval::new(43138, 43187), Interval::new(43250, 43255), Interval::new(43259, 43259), Interval::new(43261, 43262), Interval::new(43274, 43301), Interval::new(43312, 43334), Interval::new(43360, 43388), Interval::new(43396, 43442), Interval::new(43471, 43471), Interval::new(43488, 43492), Interval::new(43494, 43503), Interval::new(43514, 43518), Interval::new(43520, 43560), Interval::new(43584, 43586), Interval::new(43588, 43595), Interval::new(43616, 43638), Interval::new(43642, 43642), Interval::new(43646, 43695), Interval::new(43697, 43697), Interval::new(43701, 43702), Interval::new(43705, 43709), Interval::new(43712, 43712), Interval::new(43714, 43714), Interval::new(43739, 43741), Interval::new(43744, 43754), Interval::new(43762, 43764), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(43824, 43866), Interval::new(43868, 43881), Interval::new(43888, 44002), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(64256, 64262), Interval::new(64275, 64279), Interval::new(64285, 64285), Interval::new(64287, 64296), Interval::new(64298, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64433), Interval::new(64467, 64829), Interval::new(64848, 64911), Interval::new(64914, 64967), Interval::new(65008, 65019), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(65382, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(66176, 66204), Interval::new(66208, 66256), Interval::new(66304, 66335), Interval::new(66349, 66368), Interval::new(66370, 66377), Interval::new(66384, 66421), Interval::new(66432, 66461), Interval::new(66464, 66499), Interval::new(66504, 66511), Interval::new(66560, 66717), Interval::new(66736, 66771), Interval::new(66776, 66811), Interval::new(66816, 66855), Interval::new(66864, 66915), Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67669), Interval::new(67680, 67702), Interval::new(67712, 67742), Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67840, 67861), Interval::new(67872, 67897), Interval::new(67968, 68023), Interval::new(68030, 68031), Interval::new(68096, 68096), Interval::new(68112, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68192, 68220), Interval::new(68224, 68252), Interval::new(68288, 68295), Interval::new(68297, 68324), Interval::new(68352, 68405), Interval::new(68416, 68437), Interval::new(68448, 68466), Interval::new(68480, 68497), Interval::new(68608, 68680), Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68864, 68899), Interval::new(69248, 69289), Interval::new(69296, 69297), Interval::new(69376, 69404), Interval::new(69415, 69415), Interval::new(69424, 69445), Interval::new(69488, 69505), Interval::new(69552, 69572), Interval::new(69600, 69622), Interval::new(69635, 69687), Interval::new(69745, 69746), Interval::new(69749, 69749), Interval::new(69763, 69807), Interval::new(69840, 69864), Interval::new(69891, 69926), Interval::new(69956, 69956), Interval::new(69959, 69959), Interval::new(69968, 70002), Interval::new(70006, 70006), Interval::new(70019, 70066), Interval::new(70081, 70084), Interval::new(70106, 70106), Interval::new(70108, 70108), Interval::new(70144, 70161), Interval::new(70163, 70187), Interval::new(70207, 70208), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70312), Interval::new(70320, 70366), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70461, 70461), Interval::new(70480, 70480), Interval::new(70493, 70497), Interval::new(70656, 70708), Interval::new(70727, 70730), Interval::new(70751, 70753), Interval::new(70784, 70831), Interval::new(70852, 70853), Interval::new(70855, 70855), Interval::new(71040, 71086), Interval::new(71128, 71131), Interval::new(71168, 71215), Interval::new(71236, 71236), Interval::new(71296, 71338), Interval::new(71352, 71352), Interval::new(71424, 71450), Interval::new(71488, 71494), Interval::new(71680, 71723), Interval::new(71840, 71903), Interval::new(71935, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71983), Interval::new(71999, 71999), Interval::new(72001, 72001), Interval::new(72096, 72103), Interval::new(72106, 72144), Interval::new(72161, 72161), Interval::new(72163, 72163), Interval::new(72192, 72192), Interval::new(72203, 72242), Interval::new(72250, 72250), Interval::new(72272, 72272), Interval::new(72284, 72329), Interval::new(72349, 72349), Interval::new(72368, 72440), Interval::new(72704, 72712), Interval::new(72714, 72750), Interval::new(72768, 72768), Interval::new(72818, 72847), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73008), Interval::new(73030, 73030), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73097), Interval::new(73112, 73112), Interval::new(73440, 73458), Interval::new(73474, 73474), Interval::new(73476, 73488), Interval::new(73490, 73523), Interval::new(73648, 73648), Interval::new(73728, 74649), Interval::new(74880, 75075), Interval::new(77712, 77808), Interval::new(77824, 78895), Interval::new(78913, 78918), Interval::new(82944, 83526), Interval::new(92160, 92728), Interval::new(92736, 92766), Interval::new(92784, 92862), Interval::new(92880, 92909), Interval::new(92928, 92975), Interval::new(92992, 92995), Interval::new(93027, 93047), Interval::new(93053, 93071), Interval::new(93760, 93823), Interval::new(93952, 94026), Interval::new(94032, 94032), Interval::new(94099, 94111), Interval::new(94176, 94177), Interval::new(94179, 94179), Interval::new(94208, 100343), Interval::new(100352, 101589), Interval::new(101632, 101640), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110882), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(110933, 110933), Interval::new(110948, 110951), Interval::new(110960, 111355), Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120512), Interval::new(120514, 120538), Interval::new(120540, 120570), Interval::new(120572, 120596), Interval::new(120598, 120628), Interval::new(120630, 120654), Interval::new(120656, 120686), Interval::new(120688, 120712), Interval::new(120714, 120744), Interval::new(120746, 120770), Interval::new(120772, 120779), Interval::new(122624, 122654), Interval::new(122661, 122666), Interval::new(122928, 122989), Interval::new(123136, 123180), Interval::new(123191, 123197), Interval::new(123214, 123214), Interval::new(123536, 123565), Interval::new(123584, 123627), Interval::new(124112, 124139), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), Interval::new(124928, 125124), Interval::new(125184, 125251), Interval::new(125259, 125259), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; /// Return the code point ranges of the 'Letter' Unicode property. pub(crate) fn letter_ranges() -> &'static [Interval] { &LETTER } const MARK: [Interval; 310] = [ Interval::new(768, 879), Interval::new(1155, 1161), Interval::new(1425, 1469), Interval::new(1471, 1471), Interval::new(1473, 1474), Interval::new(1476, 1477), Interval::new(1479, 1479), Interval::new(1552, 1562), Interval::new(1611, 1631), Interval::new(1648, 1648), Interval::new(1750, 1756), Interval::new(1759, 1764), Interval::new(1767, 1768), Interval::new(1770, 1773), Interval::new(1809, 1809), Interval::new(1840, 1866), Interval::new(1958, 1968), Interval::new(2027, 2035), Interval::new(2045, 2045), Interval::new(2070, 2073), Interval::new(2075, 2083), Interval::new(2085, 2087), Interval::new(2089, 2093), Interval::new(2137, 2139), Interval::new(2200, 2207), Interval::new(2250, 2273), Interval::new(2275, 2307), Interval::new(2362, 2364), Interval::new(2366, 2383), Interval::new(2385, 2391), Interval::new(2402, 2403), Interval::new(2433, 2435), Interval::new(2492, 2492), Interval::new(2494, 2500), Interval::new(2503, 2504), Interval::new(2507, 2509), Interval::new(2519, 2519), Interval::new(2530, 2531), Interval::new(2558, 2558), Interval::new(2561, 2563), Interval::new(2620, 2620), Interval::new(2622, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2672, 2673), Interval::new(2677, 2677), Interval::new(2689, 2691), Interval::new(2748, 2748), Interval::new(2750, 2757), Interval::new(2759, 2761), Interval::new(2763, 2765), Interval::new(2786, 2787), Interval::new(2810, 2815), Interval::new(2817, 2819), Interval::new(2876, 2876), Interval::new(2878, 2884), Interval::new(2887, 2888), Interval::new(2891, 2893), Interval::new(2901, 2903), Interval::new(2914, 2915), Interval::new(2946, 2946), Interval::new(3006, 3010), Interval::new(3014, 3016), Interval::new(3018, 3021), Interval::new(3031, 3031), Interval::new(3072, 3076), Interval::new(3132, 3132), Interval::new(3134, 3140), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3170, 3171), Interval::new(3201, 3203), Interval::new(3260, 3260), Interval::new(3262, 3268), Interval::new(3270, 3272), Interval::new(3274, 3277), Interval::new(3285, 3286), Interval::new(3298, 3299), Interval::new(3315, 3315), Interval::new(3328, 3331), Interval::new(3387, 3388), Interval::new(3390, 3396), Interval::new(3398, 3400), Interval::new(3402, 3405), Interval::new(3415, 3415), Interval::new(3426, 3427), Interval::new(3457, 3459), Interval::new(3530, 3530), Interval::new(3535, 3540), Interval::new(3542, 3542), Interval::new(3544, 3551), Interval::new(3570, 3571), Interval::new(3633, 3633), Interval::new(3636, 3642), Interval::new(3655, 3662), Interval::new(3761, 3761), Interval::new(3764, 3772), Interval::new(3784, 3790), Interval::new(3864, 3865), Interval::new(3893, 3893), Interval::new(3895, 3895), Interval::new(3897, 3897), Interval::new(3902, 3903), Interval::new(3953, 3972), Interval::new(3974, 3975), Interval::new(3981, 3991), Interval::new(3993, 4028), Interval::new(4038, 4038), Interval::new(4139, 4158), Interval::new(4182, 4185), Interval::new(4190, 4192), Interval::new(4194, 4196), Interval::new(4199, 4205), Interval::new(4209, 4212), Interval::new(4226, 4237), Interval::new(4239, 4239), Interval::new(4250, 4253), Interval::new(4957, 4959), Interval::new(5906, 5909), Interval::new(5938, 5940), Interval::new(5970, 5971), Interval::new(6002, 6003), Interval::new(6068, 6099), Interval::new(6109, 6109), Interval::new(6155, 6157), Interval::new(6159, 6159), Interval::new(6277, 6278), Interval::new(6313, 6313), Interval::new(6432, 6443), Interval::new(6448, 6459), Interval::new(6679, 6683), Interval::new(6741, 6750), Interval::new(6752, 6780), Interval::new(6783, 6783), Interval::new(6832, 6862), Interval::new(6912, 6916), Interval::new(6964, 6980), Interval::new(7019, 7027), Interval::new(7040, 7042), Interval::new(7073, 7085), Interval::new(7142, 7155), Interval::new(7204, 7223), Interval::new(7376, 7378), Interval::new(7380, 7400), Interval::new(7405, 7405), Interval::new(7412, 7412), Interval::new(7415, 7417), Interval::new(7616, 7679), Interval::new(8400, 8432), Interval::new(11503, 11505), Interval::new(11647, 11647), Interval::new(11744, 11775), Interval::new(12330, 12335), Interval::new(12441, 12442), Interval::new(42607, 42610), Interval::new(42612, 42621), Interval::new(42654, 42655), Interval::new(42736, 42737), Interval::new(43010, 43010), Interval::new(43014, 43014), Interval::new(43019, 43019), Interval::new(43043, 43047), Interval::new(43052, 43052), Interval::new(43136, 43137), Interval::new(43188, 43205), Interval::new(43232, 43249), Interval::new(43263, 43263), Interval::new(43302, 43309), Interval::new(43335, 43347), Interval::new(43392, 43395), Interval::new(43443, 43456), Interval::new(43493, 43493), Interval::new(43561, 43574), Interval::new(43587, 43587), Interval::new(43596, 43597), Interval::new(43643, 43645), Interval::new(43696, 43696), Interval::new(43698, 43700), Interval::new(43703, 43704), Interval::new(43710, 43711), Interval::new(43713, 43713), Interval::new(43755, 43759), Interval::new(43765, 43766), Interval::new(44003, 44010), Interval::new(44012, 44013), Interval::new(64286, 64286), Interval::new(65024, 65039), Interval::new(65056, 65071), Interval::new(66045, 66045), Interval::new(66272, 66272), Interval::new(66422, 66426), Interval::new(68097, 68099), Interval::new(68101, 68102), Interval::new(68108, 68111), Interval::new(68152, 68154), Interval::new(68159, 68159), Interval::new(68325, 68326), Interval::new(68900, 68903), Interval::new(69291, 69292), Interval::new(69373, 69375), Interval::new(69446, 69456), Interval::new(69506, 69509), Interval::new(69632, 69634), Interval::new(69688, 69702), Interval::new(69744, 69744), Interval::new(69747, 69748), Interval::new(69759, 69762), Interval::new(69808, 69818), Interval::new(69826, 69826), Interval::new(69888, 69890), Interval::new(69927, 69940), Interval::new(69957, 69958), Interval::new(70003, 70003), Interval::new(70016, 70018), Interval::new(70067, 70080), Interval::new(70089, 70092), Interval::new(70094, 70095), Interval::new(70188, 70199), Interval::new(70206, 70206), Interval::new(70209, 70209), Interval::new(70367, 70378), Interval::new(70400, 70403), Interval::new(70459, 70460), Interval::new(70462, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70487, 70487), Interval::new(70498, 70499), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(70709, 70726), Interval::new(70750, 70750), Interval::new(70832, 70851), Interval::new(71087, 71093), Interval::new(71096, 71104), Interval::new(71132, 71133), Interval::new(71216, 71232), Interval::new(71339, 71351), Interval::new(71453, 71467), Interval::new(71724, 71738), Interval::new(71984, 71989), Interval::new(71991, 71992), Interval::new(71995, 71998), Interval::new(72000, 72000), Interval::new(72002, 72003), Interval::new(72145, 72151), Interval::new(72154, 72160), Interval::new(72164, 72164), Interval::new(72193, 72202), Interval::new(72243, 72249), Interval::new(72251, 72254), Interval::new(72263, 72263), Interval::new(72273, 72283), Interval::new(72330, 72345), Interval::new(72751, 72758), Interval::new(72760, 72767), Interval::new(72850, 72871), Interval::new(72873, 72886), Interval::new(73009, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73029), Interval::new(73031, 73031), Interval::new(73098, 73102), Interval::new(73104, 73105), Interval::new(73107, 73111), Interval::new(73459, 73462), Interval::new(73472, 73473), Interval::new(73475, 73475), Interval::new(73524, 73530), Interval::new(73534, 73538), Interval::new(78912, 78912), Interval::new(78919, 78933), Interval::new(92912, 92916), Interval::new(92976, 92982), Interval::new(94031, 94031), Interval::new(94033, 94087), Interval::new(94095, 94098), Interval::new(94180, 94180), Interval::new(94192, 94193), Interval::new(113821, 113822), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119141, 119145), Interval::new(119149, 119154), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(119362, 119364), Interval::new(121344, 121398), Interval::new(121403, 121452), Interval::new(121461, 121461), Interval::new(121476, 121476), Interval::new(121499, 121503), Interval::new(121505, 121519), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), Interval::new(123023, 123023), Interval::new(123184, 123190), Interval::new(123566, 123566), Interval::new(123628, 123631), Interval::new(124140, 124143), Interval::new(125136, 125142), Interval::new(125252, 125258), Interval::new(917760, 917999), ]; /// Return the code point ranges of the 'Mark' Unicode property. pub(crate) fn mark_ranges() -> &'static [Interval] { &MARK } const NUMBER: [Interval; 137] = [ Interval::new(48, 57), Interval::new(178, 179), Interval::new(185, 185), Interval::new(188, 190), Interval::new(1632, 1641), Interval::new(1776, 1785), Interval::new(1984, 1993), Interval::new(2406, 2415), Interval::new(2534, 2543), Interval::new(2548, 2553), Interval::new(2662, 2671), Interval::new(2790, 2799), Interval::new(2918, 2927), Interval::new(2930, 2935), Interval::new(3046, 3058), Interval::new(3174, 3183), Interval::new(3192, 3198), Interval::new(3302, 3311), Interval::new(3416, 3422), Interval::new(3430, 3448), Interval::new(3558, 3567), Interval::new(3664, 3673), Interval::new(3792, 3801), Interval::new(3872, 3891), Interval::new(4160, 4169), Interval::new(4240, 4249), Interval::new(4969, 4988), Interval::new(5870, 5872), Interval::new(6112, 6121), Interval::new(6128, 6137), Interval::new(6160, 6169), Interval::new(6470, 6479), Interval::new(6608, 6618), Interval::new(6784, 6793), Interval::new(6800, 6809), Interval::new(6992, 7001), Interval::new(7088, 7097), Interval::new(7232, 7241), Interval::new(7248, 7257), Interval::new(8304, 8304), Interval::new(8308, 8313), Interval::new(8320, 8329), Interval::new(8528, 8578), Interval::new(8581, 8585), Interval::new(9312, 9371), Interval::new(9450, 9471), Interval::new(10102, 10131), Interval::new(11517, 11517), Interval::new(12295, 12295), Interval::new(12321, 12329), Interval::new(12344, 12346), Interval::new(12690, 12693), Interval::new(12832, 12841), Interval::new(12872, 12879), Interval::new(12881, 12895), Interval::new(12928, 12937), Interval::new(12977, 12991), Interval::new(42528, 42537), Interval::new(42726, 42735), Interval::new(43056, 43061), Interval::new(43216, 43225), Interval::new(43264, 43273), Interval::new(43472, 43481), Interval::new(43504, 43513), Interval::new(43600, 43609), Interval::new(44016, 44025), Interval::new(65296, 65305), Interval::new(65799, 65843), Interval::new(65856, 65912), Interval::new(65930, 65931), Interval::new(66273, 66299), Interval::new(66336, 66339), Interval::new(66369, 66369), Interval::new(66378, 66378), Interval::new(66513, 66517), Interval::new(66720, 66729), Interval::new(67672, 67679), Interval::new(67705, 67711), Interval::new(67751, 67759), Interval::new(67835, 67839), Interval::new(67862, 67867), Interval::new(68028, 68029), Interval::new(68032, 68047), Interval::new(68050, 68095), Interval::new(68160, 68168), Interval::new(68221, 68222), Interval::new(68253, 68255), Interval::new(68331, 68335), Interval::new(68440, 68447), Interval::new(68472, 68479), Interval::new(68521, 68527), Interval::new(68858, 68863), Interval::new(68912, 68921), Interval::new(69216, 69246), Interval::new(69405, 69414), Interval::new(69457, 69460), Interval::new(69573, 69579), Interval::new(69714, 69743), Interval::new(69872, 69881), Interval::new(69942, 69951), Interval::new(70096, 70105), Interval::new(70113, 70132), Interval::new(70384, 70393), Interval::new(70736, 70745), Interval::new(70864, 70873), Interval::new(71248, 71257), Interval::new(71360, 71369), Interval::new(71472, 71483), Interval::new(71904, 71922), Interval::new(72016, 72025), Interval::new(72784, 72812), Interval::new(73040, 73049), Interval::new(73120, 73129), Interval::new(73552, 73561), Interval::new(73664, 73684), Interval::new(74752, 74862), Interval::new(92768, 92777), Interval::new(92864, 92873), Interval::new(93008, 93017), Interval::new(93019, 93025), Interval::new(93824, 93846), Interval::new(119488, 119507), Interval::new(119520, 119539), Interval::new(119648, 119672), Interval::new(120782, 120831), Interval::new(123200, 123209), Interval::new(123632, 123641), Interval::new(124144, 124153), Interval::new(125127, 125135), Interval::new(125264, 125273), Interval::new(126065, 126123), Interval::new(126125, 126127), Interval::new(126129, 126132), Interval::new(126209, 126253), Interval::new(126255, 126269), Interval::new(127232, 127244), Interval::new(130032, 130041), ]; /// Return the code point ranges of the 'Number' Unicode property. pub(crate) fn number_ranges() -> &'static [Interval] { &NUMBER } const PUNCTUATION: [Interval; 191] = [ Interval::new(33, 35), Interval::new(37, 42), Interval::new(44, 47), Interval::new(58, 59), Interval::new(63, 64), Interval::new(91, 93), Interval::new(95, 95), Interval::new(123, 123), Interval::new(125, 125), Interval::new(161, 161), Interval::new(167, 167), Interval::new(171, 171), Interval::new(182, 183), Interval::new(187, 187), Interval::new(191, 191), Interval::new(894, 894), Interval::new(903, 903), Interval::new(1370, 1375), Interval::new(1417, 1418), Interval::new(1470, 1470), Interval::new(1472, 1472), Interval::new(1475, 1475), Interval::new(1478, 1478), Interval::new(1523, 1524), Interval::new(1545, 1546), Interval::new(1548, 1549), Interval::new(1563, 1563), Interval::new(1565, 1567), Interval::new(1642, 1645), Interval::new(1748, 1748), Interval::new(1792, 1805), Interval::new(2039, 2041), Interval::new(2096, 2110), Interval::new(2142, 2142), Interval::new(2404, 2405), Interval::new(2416, 2416), Interval::new(2557, 2557), Interval::new(2678, 2678), Interval::new(2800, 2800), Interval::new(3191, 3191), Interval::new(3204, 3204), Interval::new(3572, 3572), Interval::new(3663, 3663), Interval::new(3674, 3675), Interval::new(3844, 3858), Interval::new(3860, 3860), Interval::new(3898, 3901), Interval::new(3973, 3973), Interval::new(4048, 4052), Interval::new(4057, 4058), Interval::new(4170, 4175), Interval::new(4347, 4347), Interval::new(4960, 4968), Interval::new(5120, 5120), Interval::new(5742, 5742), Interval::new(5787, 5788), Interval::new(5867, 5869), Interval::new(5941, 5942), Interval::new(6100, 6102), Interval::new(6104, 6106), Interval::new(6144, 6154), Interval::new(6468, 6469), Interval::new(6686, 6687), Interval::new(6816, 6822), Interval::new(6824, 6829), Interval::new(7002, 7008), Interval::new(7037, 7038), Interval::new(7164, 7167), Interval::new(7227, 7231), Interval::new(7294, 7295), Interval::new(7360, 7367), Interval::new(7379, 7379), Interval::new(8208, 8231), Interval::new(8240, 8259), Interval::new(8261, 8273), Interval::new(8275, 8286), Interval::new(8317, 8318), Interval::new(8333, 8334), Interval::new(8968, 8971), Interval::new(9001, 9002), Interval::new(10088, 10101), Interval::new(10181, 10182), Interval::new(10214, 10223), Interval::new(10627, 10648), Interval::new(10712, 10715), Interval::new(10748, 10749), Interval::new(11513, 11516), Interval::new(11518, 11519), Interval::new(11632, 11632), Interval::new(11776, 11822), Interval::new(11824, 11855), Interval::new(11858, 11869), Interval::new(12289, 12291), Interval::new(12296, 12305), Interval::new(12308, 12319), Interval::new(12336, 12336), Interval::new(12349, 12349), Interval::new(12448, 12448), Interval::new(12539, 12539), Interval::new(42238, 42239), Interval::new(42509, 42511), Interval::new(42611, 42611), Interval::new(42622, 42622), Interval::new(42738, 42743), Interval::new(43124, 43127), Interval::new(43214, 43215), Interval::new(43256, 43258), Interval::new(43260, 43260), Interval::new(43310, 43311), Interval::new(43359, 43359), Interval::new(43457, 43469), Interval::new(43486, 43487), Interval::new(43612, 43615), Interval::new(43742, 43743), Interval::new(43760, 43761), Interval::new(44011, 44011), Interval::new(64830, 64831), Interval::new(65040, 65049), Interval::new(65072, 65106), Interval::new(65108, 65121), Interval::new(65123, 65123), Interval::new(65128, 65128), Interval::new(65130, 65131), Interval::new(65281, 65283), Interval::new(65285, 65290), Interval::new(65292, 65295), Interval::new(65306, 65307), Interval::new(65311, 65312), Interval::new(65339, 65341), Interval::new(65343, 65343), Interval::new(65371, 65371), Interval::new(65373, 65373), Interval::new(65375, 65381), Interval::new(65792, 65794), Interval::new(66463, 66463), Interval::new(66512, 66512), Interval::new(66927, 66927), Interval::new(67671, 67671), Interval::new(67871, 67871), Interval::new(67903, 67903), Interval::new(68176, 68184), Interval::new(68223, 68223), Interval::new(68336, 68342), Interval::new(68409, 68415), Interval::new(68505, 68508), Interval::new(69293, 69293), Interval::new(69461, 69465), Interval::new(69510, 69513), Interval::new(69703, 69709), Interval::new(69819, 69820), Interval::new(69822, 69825), Interval::new(69952, 69955), Interval::new(70004, 70005), Interval::new(70085, 70088), Interval::new(70093, 70093), Interval::new(70107, 70107), Interval::new(70109, 70111), Interval::new(70200, 70205), Interval::new(70313, 70313), Interval::new(70731, 70735), Interval::new(70746, 70747), Interval::new(70749, 70749), Interval::new(70854, 70854), Interval::new(71105, 71127), Interval::new(71233, 71235), Interval::new(71264, 71276), Interval::new(71353, 71353), Interval::new(71484, 71486), Interval::new(71739, 71739), Interval::new(72004, 72006), Interval::new(72162, 72162), Interval::new(72255, 72262), Interval::new(72346, 72348), Interval::new(72350, 72354), Interval::new(72448, 72457), Interval::new(72769, 72773), Interval::new(72816, 72817), Interval::new(73463, 73464), Interval::new(73539, 73551), Interval::new(73727, 73727), Interval::new(74864, 74868), Interval::new(77809, 77810), Interval::new(92782, 92783), Interval::new(92917, 92917), Interval::new(92983, 92987), Interval::new(92996, 92996), Interval::new(93847, 93850), Interval::new(94178, 94178), Interval::new(113823, 113823), Interval::new(121479, 121483), Interval::new(125278, 125279), ]; /// Return the code point ranges of the 'Punctuation' Unicode property. pub(crate) fn punctuation_ranges() -> &'static [Interval] { &PUNCTUATION } const SYMBOL: [Interval; 233] = [ Interval::new(36, 36), Interval::new(43, 43), Interval::new(60, 62), Interval::new(94, 94), Interval::new(96, 96), Interval::new(124, 124), Interval::new(126, 126), Interval::new(162, 166), Interval::new(168, 169), Interval::new(172, 172), Interval::new(174, 177), Interval::new(180, 180), Interval::new(184, 184), Interval::new(215, 215), Interval::new(247, 247), Interval::new(706, 709), Interval::new(722, 735), Interval::new(741, 747), Interval::new(749, 749), Interval::new(751, 767), Interval::new(885, 885), Interval::new(900, 901), Interval::new(1014, 1014), Interval::new(1154, 1154), Interval::new(1421, 1423), Interval::new(1542, 1544), Interval::new(1547, 1547), Interval::new(1550, 1551), Interval::new(1758, 1758), Interval::new(1769, 1769), Interval::new(1789, 1790), Interval::new(2038, 2038), Interval::new(2046, 2047), Interval::new(2184, 2184), Interval::new(2546, 2547), Interval::new(2554, 2555), Interval::new(2801, 2801), Interval::new(2928, 2928), Interval::new(3059, 3066), Interval::new(3199, 3199), Interval::new(3407, 3407), Interval::new(3449, 3449), Interval::new(3647, 3647), Interval::new(3841, 3843), Interval::new(3859, 3859), Interval::new(3861, 3863), Interval::new(3866, 3871), Interval::new(3892, 3892), Interval::new(3894, 3894), Interval::new(3896, 3896), Interval::new(4030, 4037), Interval::new(4039, 4044), Interval::new(4046, 4047), Interval::new(4053, 4056), Interval::new(4254, 4255), Interval::new(5008, 5017), Interval::new(5741, 5741), Interval::new(6107, 6107), Interval::new(6464, 6464), Interval::new(6622, 6655), Interval::new(7009, 7018), Interval::new(7028, 7036), Interval::new(8125, 8125), Interval::new(8127, 8129), Interval::new(8141, 8143), Interval::new(8157, 8159), Interval::new(8173, 8175), Interval::new(8189, 8190), Interval::new(8260, 8260), Interval::new(8274, 8274), Interval::new(8314, 8316), Interval::new(8330, 8332), Interval::new(8352, 8384), Interval::new(8448, 8449), Interval::new(8451, 8454), Interval::new(8456, 8457), Interval::new(8468, 8468), Interval::new(8470, 8472), Interval::new(8478, 8483), Interval::new(8485, 8485), Interval::new(8487, 8487), Interval::new(8489, 8489), Interval::new(8494, 8494), Interval::new(8506, 8507), Interval::new(8512, 8516), Interval::new(8522, 8525), Interval::new(8527, 8527), Interval::new(8586, 8587), Interval::new(8592, 8967), Interval::new(8972, 9000), Interval::new(9003, 9254), Interval::new(9280, 9290), Interval::new(9372, 9449), Interval::new(9472, 10087), Interval::new(10132, 10180), Interval::new(10183, 10213), Interval::new(10224, 10626), Interval::new(10649, 10711), Interval::new(10716, 10747), Interval::new(10750, 11123), Interval::new(11126, 11157), Interval::new(11159, 11263), Interval::new(11493, 11498), Interval::new(11856, 11857), Interval::new(11904, 11929), Interval::new(11931, 12019), Interval::new(12032, 12245), Interval::new(12272, 12287), Interval::new(12292, 12292), Interval::new(12306, 12307), Interval::new(12320, 12320), Interval::new(12342, 12343), Interval::new(12350, 12351), Interval::new(12443, 12444), Interval::new(12688, 12689), Interval::new(12694, 12703), Interval::new(12736, 12771), Interval::new(12783, 12783), Interval::new(12800, 12830), Interval::new(12842, 12871), Interval::new(12880, 12880), Interval::new(12896, 12927), Interval::new(12938, 12976), Interval::new(12992, 13311), Interval::new(19904, 19967), Interval::new(42128, 42182), Interval::new(42752, 42774), Interval::new(42784, 42785), Interval::new(42889, 42890), Interval::new(43048, 43051), Interval::new(43062, 43065), Interval::new(43639, 43641), Interval::new(43867, 43867), Interval::new(43882, 43883), Interval::new(64297, 64297), Interval::new(64434, 64450), Interval::new(64832, 64847), Interval::new(64975, 64975), Interval::new(65020, 65023), Interval::new(65122, 65122), Interval::new(65124, 65126), Interval::new(65129, 65129), Interval::new(65284, 65284), Interval::new(65291, 65291), Interval::new(65308, 65310), Interval::new(65342, 65342), Interval::new(65344, 65344), Interval::new(65372, 65372), Interval::new(65374, 65374), Interval::new(65504, 65510), Interval::new(65512, 65518), Interval::new(65532, 65533), Interval::new(65847, 65855), Interval::new(65913, 65929), Interval::new(65932, 65934), Interval::new(65936, 65948), Interval::new(65952, 65952), Interval::new(66000, 66044), Interval::new(67703, 67704), Interval::new(68296, 68296), Interval::new(71487, 71487), Interval::new(73685, 73713), Interval::new(92988, 92991), Interval::new(92997, 92997), Interval::new(113820, 113820), Interval::new(118608, 118723), Interval::new(118784, 119029), Interval::new(119040, 119078), Interval::new(119081, 119140), Interval::new(119146, 119148), Interval::new(119171, 119172), Interval::new(119180, 119209), Interval::new(119214, 119274), Interval::new(119296, 119361), Interval::new(119365, 119365), Interval::new(119552, 119638), Interval::new(120513, 120513), Interval::new(120539, 120539), Interval::new(120571, 120571), Interval::new(120597, 120597), Interval::new(120629, 120629), Interval::new(120655, 120655), Interval::new(120687, 120687), Interval::new(120713, 120713), Interval::new(120745, 120745), Interval::new(120771, 120771), Interval::new(120832, 121343), Interval::new(121399, 121402), Interval::new(121453, 121460), Interval::new(121462, 121475), Interval::new(121477, 121478), Interval::new(123215, 123215), Interval::new(123647, 123647), Interval::new(126124, 126124), Interval::new(126128, 126128), Interval::new(126254, 126254), Interval::new(126704, 126705), Interval::new(126976, 127019), Interval::new(127024, 127123), Interval::new(127136, 127150), Interval::new(127153, 127167), Interval::new(127169, 127183), Interval::new(127185, 127221), Interval::new(127245, 127405), Interval::new(127462, 127490), Interval::new(127504, 127547), Interval::new(127552, 127560), Interval::new(127568, 127569), Interval::new(127584, 127589), Interval::new(127744, 128727), Interval::new(128732, 128748), Interval::new(128752, 128764), Interval::new(128768, 128886), Interval::new(128891, 128985), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129024, 129035), Interval::new(129040, 129095), Interval::new(129104, 129113), Interval::new(129120, 129159), Interval::new(129168, 129197), Interval::new(129200, 129201), Interval::new(129280, 129619), Interval::new(129632, 129645), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), Interval::new(129792, 129938), Interval::new(129940, 129994), ]; /// Return the code point ranges of the 'Symbol' Unicode property. pub(crate) fn symbol_ranges() -> &'static [Interval] { &SYMBOL } const SEPARATOR: [Interval; 8] = [ Interval::new(32, 32), Interval::new(160, 160), Interval::new(5760, 5760), Interval::new(8192, 8202), Interval::new(8232, 8233), Interval::new(8239, 8239), Interval::new(8287, 8287), Interval::new(12288, 12288), ]; /// Return the code point ranges of the 'Separator' Unicode property. pub(crate) fn separator_ranges() -> &'static [Interval] { &SEPARATOR } pub(crate) fn general_category_property_value_ranges( value: &UnicodePropertyValueGeneralCategory, ) -> &'static [Interval] { use UnicodePropertyValueGeneralCategory::*; match value { ClosePunctuation => close_punctuation_ranges(), ConnectorPunctuation => connector_punctuation_ranges(), Control => control_ranges(), CurrencySymbol => currency_symbol_ranges(), DashPunctuation => dash_punctuation_ranges(), DecimalNumber => decimal_number_ranges(), EnclosingMark => enclosing_mark_ranges(), FinalPunctuation => final_punctuation_ranges(), Format => format_ranges(), InitialPunctuation => initial_punctuation_ranges(), LetterNumber => letter_number_ranges(), LineSeparator => line_separator_ranges(), LowercaseLetter => lowercase_letter_ranges(), MathSymbol => math_symbol_ranges(), ModifierLetter => modifier_letter_ranges(), ModifierSymbol => modifier_symbol_ranges(), NonspacingMark => nonspacing_mark_ranges(), OpenPunctuation => open_punctuation_ranges(), OtherLetter => other_letter_ranges(), OtherNumber => other_number_ranges(), OtherPunctuation => other_punctuation_ranges(), OtherSymbol => other_symbol_ranges(), ParagraphSeparator => paragraph_separator_ranges(), PrivateUse => private_use_ranges(), SpaceSeparator => space_separator_ranges(), SpacingMark => spacing_mark_ranges(), Surrogate => surrogate_ranges(), TitlecaseLetter => titlecase_letter_ranges(), Unassigned => unassigned_ranges(), UppercaseLetter => uppercase_letter_ranges(), CasedLetter => cased_letter_ranges(), Other => other_ranges(), Letter => letter_ranges(), Mark => mark_ranges(), Number => number_ranges(), Punctuation => punctuation_ranges(), Symbol => symbol_ranges(), Separator => separator_ranges(), } } #[derive(Debug, Clone, Copy)] pub enum UnicodePropertyValueGeneralCategory { ClosePunctuation, ConnectorPunctuation, Control, CurrencySymbol, DashPunctuation, DecimalNumber, EnclosingMark, FinalPunctuation, Format, InitialPunctuation, LetterNumber, LineSeparator, LowercaseLetter, MathSymbol, ModifierLetter, ModifierSymbol, NonspacingMark, OpenPunctuation, OtherLetter, OtherNumber, OtherPunctuation, OtherSymbol, ParagraphSeparator, PrivateUse, SpaceSeparator, SpacingMark, Surrogate, TitlecaseLetter, Unassigned, UppercaseLetter, CasedLetter, Other, Letter, Mark, Number, Punctuation, Symbol, Separator, } pub fn unicode_property_value_general_category_from_str( s: &str, ) -> Option { use UnicodePropertyValueGeneralCategory::*; match s { "Pe" | "Close_Punctuation" => Some(ClosePunctuation), "Pc" | "Connector_Punctuation" => Some(ConnectorPunctuation), "cntrl" | "Cc" | "Control" => Some(Control), "Sc" | "Currency_Symbol" => Some(CurrencySymbol), "Pd" | "Dash_Punctuation" => Some(DashPunctuation), "digit" | "Nd" | "Decimal_Number" => Some(DecimalNumber), "Me" | "Enclosing_Mark" => Some(EnclosingMark), "Pf" | "Final_Punctuation" => Some(FinalPunctuation), "Cf" | "Format" => Some(Format), "Pi" | "Initial_Punctuation" => Some(InitialPunctuation), "Nl" | "Letter_Number" => Some(LetterNumber), "Zl" | "Line_Separator" => Some(LineSeparator), "Ll" | "Lowercase_Letter" => Some(LowercaseLetter), "Sm" | "Math_Symbol" => Some(MathSymbol), "Lm" | "Modifier_Letter" => Some(ModifierLetter), "Sk" | "Modifier_Symbol" => Some(ModifierSymbol), "Mn" | "Nonspacing_Mark" => Some(NonspacingMark), "Ps" | "Open_Punctuation" => Some(OpenPunctuation), "Lo" | "Other_Letter" => Some(OtherLetter), "No" | "Other_Number" => Some(OtherNumber), "Po" | "Other_Punctuation" => Some(OtherPunctuation), "So" | "Other_Symbol" => Some(OtherSymbol), "Zp" | "Paragraph_Separator" => Some(ParagraphSeparator), "Co" | "Private_Use" => Some(PrivateUse), "Zs" | "Space_Separator" => Some(SpaceSeparator), "Mc" | "Spacing_Mark" => Some(SpacingMark), "Cs" | "Surrogate" => Some(Surrogate), "Lt" | "Titlecase_Letter" => Some(TitlecaseLetter), "Cn" | "Unassigned" => Some(Unassigned), "Lu" | "Uppercase_Letter" => Some(UppercaseLetter), "LC" | "Cased_Letter" => Some(CasedLetter), "C" | "Other" => Some(Other), "L" | "Letter" => Some(Letter), "Combining_Mark" | "M" | "Mark" => Some(Mark), "N" | "Number" => Some(Number), "punct" | "P" | "Punctuation" => Some(Punctuation), "S" | "Symbol" => Some(Symbol), "Z" | "Separator" => Some(Separator), _ => None, } } const ADLAM: [Interval; 3] = [ Interval::new(125184, 125259), Interval::new(125264, 125273), Interval::new(125278, 125279), ]; const ADLAM_EXTENSIONS: [Interval; 5] = [ Interval::new(1567, 1567), Interval::new(1600, 1600), Interval::new(125184, 125259), Interval::new(125264, 125273), Interval::new(125278, 125279), ]; const CAUCASIAN_ALBANIAN: [Interval; 2] = [Interval::new(66864, 66915), Interval::new(66927, 66927)]; const AHOM: [Interval; 3] = [ Interval::new(71424, 71450), Interval::new(71453, 71467), Interval::new(71472, 71494), ]; const ARABIC: [Interval; 58] = [ Interval::new(1536, 1540), Interval::new(1542, 1547), Interval::new(1549, 1562), Interval::new(1564, 1566), Interval::new(1568, 1599), Interval::new(1601, 1610), Interval::new(1622, 1647), Interval::new(1649, 1756), Interval::new(1758, 1791), Interval::new(1872, 1919), Interval::new(2160, 2190), Interval::new(2192, 2193), Interval::new(2200, 2273), Interval::new(2275, 2303), Interval::new(64336, 64450), Interval::new(64467, 64829), Interval::new(64832, 64911), Interval::new(64914, 64967), Interval::new(64975, 64975), Interval::new(65008, 65023), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(69216, 69246), Interval::new(69373, 69375), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(126704, 126705), ]; const ARABIC_EXTENSIONS: [Interval; 53] = [ Interval::new(1536, 1540), Interval::new(1542, 1564), Interval::new(1564, 1756), Interval::new(1758, 1791), Interval::new(1872, 1919), Interval::new(2160, 2190), Interval::new(2192, 2193), Interval::new(2200, 2273), Interval::new(2275, 2303), Interval::new(64336, 64450), Interval::new(64467, 64911), Interval::new(64914, 64967), Interval::new(64975, 64975), Interval::new(65008, 65023), Interval::new(65136, 65140), Interval::new(65142, 65276), Interval::new(66272, 66299), Interval::new(69216, 69246), Interval::new(69373, 69375), Interval::new(126464, 126467), Interval::new(126469, 126495), Interval::new(126497, 126498), Interval::new(126500, 126500), Interval::new(126503, 126503), Interval::new(126505, 126514), Interval::new(126516, 126519), Interval::new(126521, 126521), Interval::new(126523, 126523), Interval::new(126530, 126530), Interval::new(126535, 126535), Interval::new(126537, 126537), Interval::new(126539, 126539), Interval::new(126541, 126543), Interval::new(126545, 126546), Interval::new(126548, 126548), Interval::new(126551, 126551), Interval::new(126553, 126553), Interval::new(126555, 126555), Interval::new(126557, 126557), Interval::new(126559, 126559), Interval::new(126561, 126562), Interval::new(126564, 126564), Interval::new(126567, 126570), Interval::new(126572, 126578), Interval::new(126580, 126583), Interval::new(126585, 126588), Interval::new(126590, 126590), Interval::new(126592, 126601), Interval::new(126603, 126619), Interval::new(126625, 126627), Interval::new(126629, 126633), Interval::new(126635, 126651), Interval::new(126704, 126705), ]; const IMPERIAL_ARAMAIC: [Interval; 2] = [Interval::new(67648, 67669), Interval::new(67671, 67679)]; const ARMENIAN: [Interval; 4] = [ Interval::new(1329, 1366), Interval::new(1369, 1418), Interval::new(1421, 1423), Interval::new(64275, 64279), ]; const AVESTAN: [Interval; 2] = [Interval::new(68352, 68405), Interval::new(68409, 68415)]; const BALINESE: [Interval; 2] = [Interval::new(6912, 6988), Interval::new(6992, 7038)]; const BAMUM: [Interval; 2] = [Interval::new(42656, 42743), Interval::new(92160, 92728)]; const BASSA_VAH: [Interval; 2] = [Interval::new(92880, 92909), Interval::new(92912, 92917)]; const BATAK: [Interval; 2] = [Interval::new(7104, 7155), Interval::new(7164, 7167)]; const BENGALI: [Interval; 14] = [ Interval::new(2432, 2435), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2492, 2500), Interval::new(2503, 2504), Interval::new(2507, 2510), Interval::new(2519, 2519), Interval::new(2524, 2525), Interval::new(2527, 2531), Interval::new(2534, 2558), ]; const BENGALI_EXTENSIONS: [Interval; 27] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(2432, 2435), Interval::new(2437, 2444), Interval::new(2447, 2448), Interval::new(2451, 2472), Interval::new(2474, 2480), Interval::new(2482, 2482), Interval::new(2486, 2489), Interval::new(2492, 2500), Interval::new(2503, 2504), Interval::new(2507, 2510), Interval::new(2519, 2519), Interval::new(2524, 2525), Interval::new(2527, 2531), Interval::new(2534, 2543), Interval::new(2534, 2558), Interval::new(7376, 7376), Interval::new(7378, 7378), Interval::new(7381, 7382), Interval::new(7384, 7384), Interval::new(7393, 7393), Interval::new(7402, 7402), Interval::new(7405, 7405), Interval::new(7410, 7410), Interval::new(7413, 7415), Interval::new(43249, 43249), ]; const BHAIKSUKI: [Interval; 4] = [ Interval::new(72704, 72712), Interval::new(72714, 72758), Interval::new(72760, 72773), Interval::new(72784, 72812), ]; const BOPOMOFO: [Interval; 3] = [ Interval::new(746, 747), Interval::new(12549, 12591), Interval::new(12704, 12735), ]; const BOPOMOFO_EXTENSIONS: [Interval; 12] = [ Interval::new(746, 747), Interval::new(12289, 12291), Interval::new(12296, 12305), Interval::new(12307, 12319), Interval::new(12330, 12333), Interval::new(12336, 12336), Interval::new(12343, 12343), Interval::new(12539, 12539), Interval::new(12549, 12591), Interval::new(12704, 12735), Interval::new(65093, 65094), Interval::new(65377, 65381), ]; const BRAHMI: [Interval; 3] = [ Interval::new(69632, 69709), Interval::new(69714, 69749), Interval::new(69759, 69759), ]; const BRAILLE: [Interval; 1] = [Interval::new(10240, 10495)]; const BUGINESE: [Interval; 2] = [Interval::new(6656, 6683), Interval::new(6686, 6687)]; const BUGINESE_EXTENSIONS: [Interval; 3] = [ Interval::new(6656, 6683), Interval::new(6686, 6687), Interval::new(43471, 43471), ]; const BUHID: [Interval; 1] = [Interval::new(5952, 5971)]; const BUHID_EXTENSIONS: [Interval; 2] = [Interval::new(5941, 5942), Interval::new(5952, 5971)]; const CHAKMA: [Interval; 2] = [Interval::new(69888, 69940), Interval::new(69942, 69959)]; const CHAKMA_EXTENSIONS: [Interval; 4] = [ Interval::new(2534, 2543), Interval::new(4160, 4169), Interval::new(69888, 69940), Interval::new(69942, 69959), ]; const CANADIAN_ABORIGINAL: [Interval; 3] = [ Interval::new(5120, 5759), Interval::new(6320, 6389), Interval::new(72368, 72383), ]; const CARIAN: [Interval; 1] = [Interval::new(66208, 66256)]; const CHAM: [Interval; 4] = [ Interval::new(43520, 43574), Interval::new(43584, 43597), Interval::new(43600, 43609), Interval::new(43612, 43615), ]; const CHEROKEE: [Interval; 3] = [ Interval::new(5024, 5109), Interval::new(5112, 5117), Interval::new(43888, 43967), ]; const CHORASMIAN: [Interval; 1] = [Interval::new(69552, 69579)]; const COPTIC: [Interval; 3] = [ Interval::new(994, 1007), Interval::new(11392, 11507), Interval::new(11513, 11519), ]; const COPTIC_EXTENSIONS: [Interval; 4] = [ Interval::new(994, 1007), Interval::new(11392, 11507), Interval::new(11513, 11519), Interval::new(66272, 66299), ]; const CYPRO_MINOAN: [Interval; 1] = [Interval::new(77712, 77810)]; const CYPRO_MINOAN_EXTENSIONS: [Interval; 2] = [Interval::new(65792, 65793), Interval::new(77712, 77810)]; const CYPRIOT: [Interval; 6] = [ Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67647), ]; const CYPRIOT_EXTENSIONS: [Interval; 9] = [ Interval::new(65792, 65794), Interval::new(65799, 65843), Interval::new(65847, 65855), Interval::new(67584, 67589), Interval::new(67592, 67592), Interval::new(67594, 67637), Interval::new(67639, 67640), Interval::new(67644, 67644), Interval::new(67647, 67647), ]; const CYRILLIC: [Interval; 10] = [ Interval::new(1024, 1156), Interval::new(1159, 1327), Interval::new(7296, 7304), Interval::new(7467, 7467), Interval::new(7544, 7544), Interval::new(11744, 11775), Interval::new(42560, 42655), Interval::new(65070, 65071), Interval::new(122928, 122989), Interval::new(123023, 123023), ]; const CYRILLIC_EXTENSIONS: [Interval; 13] = [ Interval::new(1024, 1156), Interval::new(1155, 1159), Interval::new(1159, 1327), Interval::new(7296, 7304), Interval::new(7467, 7467), Interval::new(7544, 7544), Interval::new(7672, 7672), Interval::new(11744, 11775), Interval::new(11843, 11843), Interval::new(42560, 42655), Interval::new(65070, 65071), Interval::new(122928, 122989), Interval::new(123023, 123023), ]; const DEVANAGARI: [Interval; 5] = [ Interval::new(2304, 2384), Interval::new(2389, 2403), Interval::new(2406, 2431), Interval::new(43232, 43263), Interval::new(72448, 72457), ]; const DEVANAGARI_EXTENSIONS: [Interval; 9] = [ Interval::new(2304, 2386), Interval::new(2389, 2415), Interval::new(2406, 2431), Interval::new(7376, 7414), Interval::new(7416, 7417), Interval::new(8432, 8432), Interval::new(43056, 43065), Interval::new(43232, 43263), Interval::new(72448, 72457), ]; const DIVES_AKURU: [Interval; 8] = [ Interval::new(71936, 71942), Interval::new(71945, 71945), Interval::new(71948, 71955), Interval::new(71957, 71958), Interval::new(71960, 71989), Interval::new(71991, 71992), Interval::new(71995, 72006), Interval::new(72016, 72025), ]; const DOGRA: [Interval; 1] = [Interval::new(71680, 71739)]; const DOGRA_EXTENSIONS: [Interval; 3] = [ Interval::new(2404, 2415), Interval::new(43056, 43065), Interval::new(71680, 71739), ]; const DESERET: [Interval; 1] = [Interval::new(66560, 66639)]; const DUPLOYAN: [Interval; 5] = [ Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(113820, 113823), ]; const DUPLOYAN_EXTENSIONS: [Interval; 5] = [ Interval::new(113664, 113770), Interval::new(113776, 113788), Interval::new(113792, 113800), Interval::new(113808, 113817), Interval::new(113820, 113827), ]; const EGYPTIAN_HIEROGLYPHS: [Interval; 1] = [Interval::new(77824, 78933)]; const ELBASAN: [Interval; 1] = [Interval::new(66816, 66855)]; const ELYMAIC: [Interval; 1] = [Interval::new(69600, 69622)]; const ETHIOPIC: [Interval; 36] = [ Interval::new(4608, 4680), Interval::new(4682, 4685), Interval::new(4688, 4694), Interval::new(4696, 4696), Interval::new(4698, 4701), Interval::new(4704, 4744), Interval::new(4746, 4749), Interval::new(4752, 4784), Interval::new(4786, 4789), Interval::new(4792, 4798), Interval::new(4800, 4800), Interval::new(4802, 4805), Interval::new(4808, 4822), Interval::new(4824, 4880), Interval::new(4882, 4885), Interval::new(4888, 4954), Interval::new(4957, 4988), Interval::new(4992, 5017), Interval::new(11648, 11670), Interval::new(11680, 11686), Interval::new(11688, 11694), Interval::new(11696, 11702), Interval::new(11704, 11710), Interval::new(11712, 11718), Interval::new(11720, 11726), Interval::new(11728, 11734), Interval::new(11736, 11742), Interval::new(43777, 43782), Interval::new(43785, 43790), Interval::new(43793, 43798), Interval::new(43808, 43814), Interval::new(43816, 43822), Interval::new(124896, 124902), Interval::new(124904, 124907), Interval::new(124909, 124910), Interval::new(124912, 124926), ]; const GEORGIAN: [Interval; 10] = [ Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4346), Interval::new(4348, 4351), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), ]; const GEORGIAN_EXTENSIONS: [Interval; 9] = [ Interval::new(4256, 4293), Interval::new(4295, 4295), Interval::new(4301, 4301), Interval::new(4304, 4351), Interval::new(7312, 7354), Interval::new(7357, 7359), Interval::new(11520, 11557), Interval::new(11559, 11559), Interval::new(11565, 11565), ]; const GLAGOLITIC: [Interval; 6] = [ Interval::new(11264, 11359), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), ]; const GLAGOLITIC_EXTENSIONS: [Interval; 10] = [ Interval::new(1156, 1156), Interval::new(1159, 1159), Interval::new(11264, 11359), Interval::new(11843, 11843), Interval::new(42607, 42607), Interval::new(122880, 122886), Interval::new(122888, 122904), Interval::new(122907, 122913), Interval::new(122915, 122916), Interval::new(122918, 122922), ]; const GUNJALA_GONDI: [Interval; 6] = [ Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73102), Interval::new(73104, 73105), Interval::new(73107, 73112), Interval::new(73120, 73129), ]; const GUNJALA_GONDI_EXTENSIONS: [Interval; 7] = [ Interval::new(2404, 2405), Interval::new(73056, 73061), Interval::new(73063, 73064), Interval::new(73066, 73102), Interval::new(73104, 73105), Interval::new(73107, 73112), Interval::new(73120, 73129), ]; const MASARAM_GONDI: [Interval; 7] = [ Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73031), Interval::new(73040, 73049), ]; const MASARAM_GONDI_EXTENSIONS: [Interval; 8] = [ Interval::new(2404, 2405), Interval::new(72960, 72966), Interval::new(72968, 72969), Interval::new(72971, 73014), Interval::new(73018, 73018), Interval::new(73020, 73021), Interval::new(73023, 73031), Interval::new(73040, 73049), ]; const GOTHIC: [Interval; 1] = [Interval::new(66352, 66378)]; const GRANTHA: [Interval; 15] = [ Interval::new(70400, 70403), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70460, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70480, 70480), Interval::new(70487, 70487), Interval::new(70493, 70499), Interval::new(70502, 70508), Interval::new(70512, 70516), ]; const GRANTHA_EXTENSIONS: [Interval; 26] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(3046, 3059), Interval::new(7376, 7376), Interval::new(7378, 7379), Interval::new(7410, 7412), Interval::new(7416, 7417), Interval::new(8432, 8432), Interval::new(70400, 70403), Interval::new(70405, 70412), Interval::new(70415, 70416), Interval::new(70419, 70440), Interval::new(70442, 70448), Interval::new(70450, 70451), Interval::new(70453, 70457), Interval::new(70459, 70460), Interval::new(70460, 70468), Interval::new(70471, 70472), Interval::new(70475, 70477), Interval::new(70480, 70480), Interval::new(70487, 70487), Interval::new(70493, 70499), Interval::new(70502, 70508), Interval::new(70512, 70516), Interval::new(73680, 73681), Interval::new(73683, 73683), ]; const GREEK: [Interval; 36] = [ Interval::new(880, 883), Interval::new(885, 887), Interval::new(890, 893), Interval::new(895, 895), Interval::new(900, 900), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 993), Interval::new(1008, 1023), Interval::new(7462, 7466), Interval::new(7517, 7521), Interval::new(7526, 7530), Interval::new(7615, 7615), Interval::new(7936, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8132), Interval::new(8134, 8147), Interval::new(8150, 8155), Interval::new(8157, 8175), Interval::new(8178, 8180), Interval::new(8182, 8190), Interval::new(8486, 8486), Interval::new(43877, 43877), Interval::new(65856, 65934), Interval::new(65952, 65952), Interval::new(119296, 119365), ]; const GREEK_EXTENSIONS: [Interval; 38] = [ Interval::new(834, 834), Interval::new(837, 837), Interval::new(880, 883), Interval::new(885, 887), Interval::new(890, 893), Interval::new(895, 895), Interval::new(900, 900), Interval::new(902, 902), Interval::new(904, 906), Interval::new(908, 908), Interval::new(910, 929), Interval::new(931, 993), Interval::new(1008, 1023), Interval::new(7462, 7466), Interval::new(7517, 7521), Interval::new(7526, 7530), Interval::new(7615, 7617), Interval::new(7936, 7957), Interval::new(7960, 7965), Interval::new(7968, 8005), Interval::new(8008, 8013), Interval::new(8016, 8023), Interval::new(8025, 8025), Interval::new(8027, 8027), Interval::new(8029, 8029), Interval::new(8031, 8061), Interval::new(8064, 8116), Interval::new(8118, 8132), Interval::new(8134, 8147), Interval::new(8150, 8155), Interval::new(8157, 8175), Interval::new(8178, 8180), Interval::new(8182, 8190), Interval::new(8486, 8486), Interval::new(43877, 43877), Interval::new(65856, 65934), Interval::new(65952, 65952), Interval::new(119296, 119365), ]; const GUJARATI: [Interval; 14] = [ Interval::new(2689, 2691), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2748, 2757), Interval::new(2759, 2761), Interval::new(2763, 2765), Interval::new(2768, 2768), Interval::new(2784, 2787), Interval::new(2790, 2801), Interval::new(2809, 2815), ]; const GUJARATI_EXTENSIONS: [Interval; 18] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(2689, 2691), Interval::new(2693, 2701), Interval::new(2703, 2705), Interval::new(2707, 2728), Interval::new(2730, 2736), Interval::new(2738, 2739), Interval::new(2741, 2745), Interval::new(2748, 2757), Interval::new(2759, 2761), Interval::new(2763, 2765), Interval::new(2768, 2768), Interval::new(2784, 2787), Interval::new(2790, 2799), Interval::new(2790, 2801), Interval::new(2809, 2815), Interval::new(43056, 43065), ]; const GURMUKHI: [Interval; 16] = [ Interval::new(2561, 2563), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2620, 2620), Interval::new(2622, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2662, 2678), ]; const GURMUKHI_EXTENSIONS: [Interval; 20] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(2561, 2563), Interval::new(2565, 2570), Interval::new(2575, 2576), Interval::new(2579, 2600), Interval::new(2602, 2608), Interval::new(2610, 2611), Interval::new(2613, 2614), Interval::new(2616, 2617), Interval::new(2620, 2620), Interval::new(2622, 2626), Interval::new(2631, 2632), Interval::new(2635, 2637), Interval::new(2641, 2641), Interval::new(2649, 2652), Interval::new(2654, 2654), Interval::new(2662, 2671), Interval::new(2662, 2678), Interval::new(43056, 43065), ]; const HANGUL: [Interval; 14] = [ Interval::new(4352, 4607), Interval::new(12334, 12335), Interval::new(12593, 12686), Interval::new(12800, 12830), Interval::new(12896, 12926), Interval::new(43360, 43388), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(65440, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), ]; const HANGUL_EXTENSIONS: [Interval; 21] = [ Interval::new(4352, 4607), Interval::new(12289, 12291), Interval::new(12296, 12305), Interval::new(12307, 12319), Interval::new(12334, 12336), Interval::new(12343, 12343), Interval::new(12539, 12539), Interval::new(12593, 12686), Interval::new(12800, 12830), Interval::new(12896, 12926), Interval::new(43360, 43388), Interval::new(44032, 55203), Interval::new(55216, 55238), Interval::new(55243, 55291), Interval::new(65093, 65094), Interval::new(65377, 65381), Interval::new(65440, 65470), Interval::new(65474, 65479), Interval::new(65482, 65487), Interval::new(65490, 65495), Interval::new(65498, 65500), ]; const HAN: [Interval; 22] = [ Interval::new(11904, 11929), Interval::new(11931, 12019), Interval::new(12032, 12245), Interval::new(12293, 12293), Interval::new(12295, 12295), Interval::new(12321, 12329), Interval::new(12344, 12347), Interval::new(13312, 19903), Interval::new(19968, 40959), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(94178, 94179), Interval::new(94192, 94193), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; const HAN_EXTENSIONS: [Interval; 39] = [ Interval::new(11904, 11929), Interval::new(11931, 12019), Interval::new(12032, 12245), Interval::new(12289, 12291), Interval::new(12293, 12305), Interval::new(12307, 12319), Interval::new(12321, 12333), Interval::new(12336, 12336), Interval::new(12343, 12351), Interval::new(12539, 12539), Interval::new(12688, 12703), Interval::new(12736, 12771), Interval::new(12832, 12871), Interval::new(12928, 12976), Interval::new(12992, 13003), Interval::new(13055, 13055), Interval::new(13144, 13168), Interval::new(13179, 13183), Interval::new(13280, 13310), Interval::new(13312, 19903), Interval::new(19968, 40959), Interval::new(42752, 42759), Interval::new(63744, 64109), Interval::new(64112, 64217), Interval::new(65093, 65094), Interval::new(65377, 65381), Interval::new(94178, 94179), Interval::new(94192, 94193), Interval::new(119648, 119665), Interval::new(127568, 127569), Interval::new(131072, 173791), Interval::new(173824, 177977), Interval::new(177984, 178205), Interval::new(178208, 183969), Interval::new(183984, 191456), Interval::new(191472, 192093), Interval::new(194560, 195101), Interval::new(196608, 201546), Interval::new(201552, 205743), ]; const HANUNOO: [Interval; 1] = [Interval::new(5920, 5940)]; const HANUNOO_EXTENSIONS: [Interval; 1] = [Interval::new(5920, 5942)]; const HATRAN: [Interval; 3] = [ Interval::new(67808, 67826), Interval::new(67828, 67829), Interval::new(67835, 67839), ]; const HEBREW: [Interval; 9] = [ Interval::new(1425, 1479), Interval::new(1488, 1514), Interval::new(1519, 1524), Interval::new(64285, 64310), Interval::new(64312, 64316), Interval::new(64318, 64318), Interval::new(64320, 64321), Interval::new(64323, 64324), Interval::new(64326, 64335), ]; const HIRAGANA: [Interval; 6] = [ Interval::new(12353, 12438), Interval::new(12445, 12447), Interval::new(110593, 110879), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(127488, 127488), ]; const HIRAGANA_EXTENSIONS: [Interval; 17] = [ Interval::new(12289, 12291), Interval::new(12296, 12305), Interval::new(12307, 12319), Interval::new(12336, 12341), Interval::new(12343, 12343), Interval::new(12348, 12349), Interval::new(12353, 12438), Interval::new(12441, 12448), Interval::new(12539, 12540), Interval::new(65093, 65094), Interval::new(65377, 65381), Interval::new(65392, 65392), Interval::new(65438, 65439), Interval::new(110593, 110879), Interval::new(110898, 110898), Interval::new(110928, 110930), Interval::new(127488, 127488), ]; const ANATOLIAN_HIEROGLYPHS: [Interval; 1] = [Interval::new(82944, 83526)]; const PAHAWH_HMONG: [Interval; 5] = [ Interval::new(92928, 92997), Interval::new(93008, 93017), Interval::new(93019, 93025), Interval::new(93027, 93047), Interval::new(93053, 93071), ]; const NYIAKENG_PUACHUE_HMONG: [Interval; 4] = [ Interval::new(123136, 123180), Interval::new(123184, 123197), Interval::new(123200, 123209), Interval::new(123214, 123215), ]; const OLD_HUNGARIAN: [Interval; 3] = [ Interval::new(68736, 68786), Interval::new(68800, 68850), Interval::new(68858, 68863), ]; const OLD_ITALIC: [Interval; 2] = [Interval::new(66304, 66339), Interval::new(66349, 66351)]; const JAVANESE: [Interval; 3] = [ Interval::new(43392, 43469), Interval::new(43472, 43481), Interval::new(43486, 43487), ]; const JAVANESE_EXTENSIONS: [Interval; 3] = [ Interval::new(43392, 43469), Interval::new(43471, 43481), Interval::new(43486, 43487), ]; const KAYAH_LI: [Interval; 2] = [Interval::new(43264, 43309), Interval::new(43311, 43311)]; const KAYAH_LI_EXTENSIONS: [Interval; 1] = [Interval::new(43264, 43311)]; const KATAKANA: [Interval; 14] = [ Interval::new(12449, 12538), Interval::new(12541, 12543), Interval::new(12784, 12799), Interval::new(13008, 13054), Interval::new(13056, 13143), Interval::new(65382, 65391), Interval::new(65393, 65437), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110592), Interval::new(110880, 110882), Interval::new(110933, 110933), Interval::new(110948, 110951), ]; const KATAKANA_EXTENSIONS: [Interval; 20] = [ Interval::new(12289, 12291), Interval::new(12296, 12305), Interval::new(12307, 12319), Interval::new(12336, 12341), Interval::new(12343, 12343), Interval::new(12348, 12349), Interval::new(12441, 12444), Interval::new(12448, 12543), Interval::new(12784, 12799), Interval::new(13008, 13054), Interval::new(13056, 13143), Interval::new(65093, 65094), Interval::new(65377, 65439), Interval::new(110576, 110579), Interval::new(110581, 110587), Interval::new(110589, 110590), Interval::new(110592, 110592), Interval::new(110880, 110882), Interval::new(110933, 110933), Interval::new(110948, 110951), ]; const KAWI: [Interval; 3] = [ Interval::new(73472, 73488), Interval::new(73490, 73530), Interval::new(73534, 73561), ]; const KHAROSHTHI: [Interval; 8] = [ Interval::new(68096, 68099), Interval::new(68101, 68102), Interval::new(68108, 68115), Interval::new(68117, 68119), Interval::new(68121, 68149), Interval::new(68152, 68154), Interval::new(68159, 68168), Interval::new(68176, 68184), ]; const KHMER: [Interval; 4] = [ Interval::new(6016, 6109), Interval::new(6112, 6121), Interval::new(6128, 6137), Interval::new(6624, 6655), ]; const KHOJKI: [Interval; 2] = [Interval::new(70144, 70161), Interval::new(70163, 70209)]; const KHOJKI_EXTENSIONS: [Interval; 4] = [ Interval::new(2790, 2799), Interval::new(43056, 43065), Interval::new(70144, 70161), Interval::new(70163, 70209), ]; const KHITAN_SMALL_SCRIPT: [Interval; 2] = [Interval::new(94180, 94180), Interval::new(101120, 101589)]; const KANNADA: [Interval; 13] = [ Interval::new(3200, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3260, 3268), Interval::new(3270, 3272), Interval::new(3274, 3277), Interval::new(3285, 3286), Interval::new(3293, 3294), Interval::new(3296, 3299), Interval::new(3302, 3311), Interval::new(3313, 3315), ]; const KANNADA_EXTENSIONS: [Interval; 21] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(3200, 3212), Interval::new(3214, 3216), Interval::new(3218, 3240), Interval::new(3242, 3251), Interval::new(3253, 3257), Interval::new(3260, 3268), Interval::new(3270, 3272), Interval::new(3274, 3277), Interval::new(3285, 3286), Interval::new(3293, 3294), Interval::new(3296, 3299), Interval::new(3302, 3311), Interval::new(3313, 3315), Interval::new(7376, 7376), Interval::new(7378, 7378), Interval::new(7386, 7386), Interval::new(7410, 7410), Interval::new(7412, 7412), Interval::new(43056, 43061), ]; const KAITHI: [Interval; 2] = [Interval::new(69760, 69826), Interval::new(69837, 69837)]; const KAITHI_EXTENSIONS: [Interval; 4] = [ Interval::new(2406, 2415), Interval::new(43056, 43065), Interval::new(69760, 69826), Interval::new(69837, 69837), ]; const TAI_THAM: [Interval; 5] = [ Interval::new(6688, 6750), Interval::new(6752, 6780), Interval::new(6783, 6793), Interval::new(6800, 6809), Interval::new(6816, 6829), ]; const LAO: [Interval; 11] = [ Interval::new(3713, 3714), Interval::new(3716, 3716), Interval::new(3718, 3722), Interval::new(3724, 3747), Interval::new(3749, 3749), Interval::new(3751, 3773), Interval::new(3776, 3780), Interval::new(3782, 3782), Interval::new(3784, 3790), Interval::new(3792, 3801), Interval::new(3804, 3807), ]; const LATIN: [Interval; 39] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(170, 170), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 696), Interval::new(736, 740), Interval::new(7424, 7461), Interval::new(7468, 7516), Interval::new(7522, 7525), Interval::new(7531, 7543), Interval::new(7545, 7614), Interval::new(7680, 7935), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8490, 8491), Interval::new(8498, 8498), Interval::new(8526, 8526), Interval::new(8544, 8584), Interval::new(11360, 11391), Interval::new(42786, 42887), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43007), Interval::new(43824, 43866), Interval::new(43868, 43876), Interval::new(43878, 43881), Interval::new(64256, 64262), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(122624, 122654), Interval::new(122661, 122666), ]; const LATIN_EXTENSIONS: [Interval; 47] = [ Interval::new(65, 90), Interval::new(97, 122), Interval::new(170, 170), Interval::new(186, 186), Interval::new(192, 214), Interval::new(216, 246), Interval::new(248, 696), Interval::new(736, 740), Interval::new(867, 879), Interval::new(1157, 1158), Interval::new(2385, 2386), Interval::new(4347, 4347), Interval::new(7424, 7461), Interval::new(7468, 7516), Interval::new(7522, 7525), Interval::new(7531, 7543), Interval::new(7545, 7614), Interval::new(7680, 7935), Interval::new(8239, 8239), Interval::new(8305, 8305), Interval::new(8319, 8319), Interval::new(8336, 8348), Interval::new(8432, 8432), Interval::new(8490, 8491), Interval::new(8498, 8498), Interval::new(8526, 8526), Interval::new(8544, 8584), Interval::new(11360, 11391), Interval::new(42752, 42759), Interval::new(42786, 42887), Interval::new(42891, 42954), Interval::new(42960, 42961), Interval::new(42963, 42963), Interval::new(42965, 42969), Interval::new(42994, 43007), Interval::new(43310, 43310), Interval::new(43824, 43866), Interval::new(43868, 43876), Interval::new(43878, 43881), Interval::new(64256, 64262), Interval::new(65313, 65338), Interval::new(65345, 65370), Interval::new(67456, 67461), Interval::new(67463, 67504), Interval::new(67506, 67514), Interval::new(122624, 122654), Interval::new(122661, 122666), ]; const LEPCHA: [Interval; 3] = [ Interval::new(7168, 7223), Interval::new(7227, 7241), Interval::new(7245, 7247), ]; const LIMBU: [Interval; 5] = [ Interval::new(6400, 6430), Interval::new(6432, 6443), Interval::new(6448, 6459), Interval::new(6464, 6464), Interval::new(6468, 6479), ]; const LIMBU_EXTENSIONS: [Interval; 6] = [ Interval::new(2405, 2405), Interval::new(6400, 6430), Interval::new(6432, 6443), Interval::new(6448, 6459), Interval::new(6464, 6464), Interval::new(6468, 6479), ]; const LINEAR_A: [Interval; 3] = [ Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), ]; const LINEAR_A_EXTENSIONS: [Interval; 4] = [ Interval::new(65799, 65843), Interval::new(67072, 67382), Interval::new(67392, 67413), Interval::new(67424, 67431), ]; const LINEAR_B: [Interval; 7] = [ Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), ]; const LINEAR_B_EXTENSIONS: [Interval; 10] = [ Interval::new(65536, 65547), Interval::new(65549, 65574), Interval::new(65576, 65594), Interval::new(65596, 65597), Interval::new(65599, 65613), Interval::new(65616, 65629), Interval::new(65664, 65786), Interval::new(65792, 65794), Interval::new(65799, 65843), Interval::new(65847, 65855), ]; const LISU: [Interval; 2] = [Interval::new(42192, 42239), Interval::new(73648, 73648)]; const LYCIAN: [Interval; 1] = [Interval::new(66176, 66204)]; const LYDIAN: [Interval; 2] = [Interval::new(67872, 67897), Interval::new(67903, 67903)]; const MAHAJANI: [Interval; 1] = [Interval::new(69968, 70006)]; const MAHAJANI_EXTENSIONS: [Interval; 3] = [ Interval::new(2404, 2415), Interval::new(43056, 43065), Interval::new(69968, 70006), ]; const MAKASAR: [Interval; 1] = [Interval::new(73440, 73464)]; const MANDAIC: [Interval; 2] = [Interval::new(2112, 2139), Interval::new(2142, 2142)]; const MANDAIC_EXTENSIONS: [Interval; 3] = [ Interval::new(1600, 1600), Interval::new(2112, 2139), Interval::new(2142, 2142), ]; const MANICHAEAN: [Interval; 2] = [Interval::new(68288, 68326), Interval::new(68331, 68342)]; const MANICHAEAN_EXTENSIONS: [Interval; 3] = [ Interval::new(1600, 1600), Interval::new(68288, 68326), Interval::new(68331, 68342), ]; const MARCHEN: [Interval; 3] = [ Interval::new(72816, 72847), Interval::new(72850, 72871), Interval::new(72873, 72886), ]; const MEDEFAIDRIN: [Interval; 1] = [Interval::new(93760, 93850)]; const MENDE_KIKAKUI: [Interval; 2] = [Interval::new(124928, 125124), Interval::new(125127, 125142)]; const MEROITIC_CURSIVE: [Interval; 3] = [ Interval::new(68000, 68023), Interval::new(68028, 68047), Interval::new(68050, 68095), ]; const MEROITIC_HIEROGLYPHS: [Interval; 1] = [Interval::new(67968, 67999)]; const MALAYALAM: [Interval; 7] = [ Interval::new(3328, 3340), Interval::new(3342, 3344), Interval::new(3346, 3396), Interval::new(3398, 3400), Interval::new(3402, 3407), Interval::new(3412, 3427), Interval::new(3430, 3455), ]; const MALAYALAM_EXTENSIONS: [Interval; 12] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(3328, 3340), Interval::new(3342, 3344), Interval::new(3346, 3396), Interval::new(3398, 3400), Interval::new(3402, 3407), Interval::new(3412, 3427), Interval::new(3430, 3455), Interval::new(7386, 7386), Interval::new(7410, 7410), Interval::new(43056, 43058), ]; const MODI: [Interval; 2] = [Interval::new(71168, 71236), Interval::new(71248, 71257)]; const MODI_EXTENSIONS: [Interval; 3] = [ Interval::new(43056, 43065), Interval::new(71168, 71236), Interval::new(71248, 71257), ]; const MONGOLIAN: [Interval; 6] = [ Interval::new(6144, 6145), Interval::new(6148, 6148), Interval::new(6150, 6169), Interval::new(6176, 6264), Interval::new(6272, 6314), Interval::new(71264, 71276), ]; const MONGOLIAN_EXTENSIONS: [Interval; 5] = [ Interval::new(6144, 6169), Interval::new(6176, 6264), Interval::new(6272, 6314), Interval::new(8239, 8239), Interval::new(71264, 71276), ]; const MRO: [Interval; 3] = [ Interval::new(92736, 92766), Interval::new(92768, 92777), Interval::new(92782, 92783), ]; const MEETEI_MAYEK: [Interval; 3] = [ Interval::new(43744, 43766), Interval::new(43968, 44013), Interval::new(44016, 44025), ]; const MULTANI: [Interval; 5] = [ Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70313), ]; const MULTANI_EXTENSIONS: [Interval; 6] = [ Interval::new(2662, 2671), Interval::new(70272, 70278), Interval::new(70280, 70280), Interval::new(70282, 70285), Interval::new(70287, 70301), Interval::new(70303, 70313), ]; const MYANMAR: [Interval; 3] = [ Interval::new(4096, 4255), Interval::new(43488, 43518), Interval::new(43616, 43647), ]; const MYANMAR_EXTENSIONS: [Interval; 4] = [ Interval::new(4096, 4255), Interval::new(43310, 43310), Interval::new(43488, 43518), Interval::new(43616, 43647), ]; const NAG_MUNDARI: [Interval; 1] = [Interval::new(124112, 124153)]; const NANDINAGARI: [Interval; 3] = [ Interval::new(72096, 72103), Interval::new(72106, 72151), Interval::new(72154, 72164), ]; const NANDINAGARI_EXTENSIONS: [Interval; 9] = [ Interval::new(2404, 2405), Interval::new(3302, 3311), Interval::new(7401, 7401), Interval::new(7410, 7410), Interval::new(7418, 7418), Interval::new(43056, 43061), Interval::new(72096, 72103), Interval::new(72106, 72151), Interval::new(72154, 72164), ]; const OLD_NORTH_ARABIAN: [Interval; 1] = [Interval::new(68224, 68255)]; const NABATAEAN: [Interval; 2] = [Interval::new(67712, 67742), Interval::new(67751, 67759)]; const NEWA: [Interval; 2] = [Interval::new(70656, 70747), Interval::new(70749, 70753)]; const NKO: [Interval; 2] = [Interval::new(1984, 2042), Interval::new(2045, 2047)]; const NKO_EXTENSIONS: [Interval; 6] = [ Interval::new(1548, 1548), Interval::new(1563, 1563), Interval::new(1567, 1567), Interval::new(1984, 2042), Interval::new(2045, 2047), Interval::new(64830, 64831), ]; const NUSHU: [Interval; 2] = [Interval::new(94177, 94177), Interval::new(110960, 111355)]; const OGHAM: [Interval; 1] = [Interval::new(5760, 5788)]; const OL_CHIKI: [Interval; 1] = [Interval::new(7248, 7295)]; const OLD_TURKIC: [Interval; 1] = [Interval::new(68608, 68680)]; const ORIYA: [Interval; 14] = [ Interval::new(2817, 2819), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2876, 2884), Interval::new(2887, 2888), Interval::new(2891, 2893), Interval::new(2901, 2903), Interval::new(2908, 2909), Interval::new(2911, 2915), Interval::new(2918, 2935), ]; const ORIYA_EXTENSIONS: [Interval; 18] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(2817, 2819), Interval::new(2821, 2828), Interval::new(2831, 2832), Interval::new(2835, 2856), Interval::new(2858, 2864), Interval::new(2866, 2867), Interval::new(2869, 2873), Interval::new(2876, 2884), Interval::new(2887, 2888), Interval::new(2891, 2893), Interval::new(2901, 2903), Interval::new(2908, 2909), Interval::new(2911, 2915), Interval::new(2918, 2935), Interval::new(7386, 7386), Interval::new(7410, 7410), ]; const OSAGE: [Interval; 2] = [Interval::new(66736, 66771), Interval::new(66776, 66811)]; const OSMANYA: [Interval; 2] = [Interval::new(66688, 66717), Interval::new(66720, 66729)]; const OLD_UYGHUR: [Interval; 1] = [Interval::new(69488, 69513)]; const OLD_UYGHUR_EXTENSIONS: [Interval; 3] = [ Interval::new(1600, 1600), Interval::new(68338, 68338), Interval::new(69488, 69513), ]; const PALMYRENE: [Interval; 1] = [Interval::new(67680, 67711)]; const PAU_CIN_HAU: [Interval; 1] = [Interval::new(72384, 72440)]; const OLD_PERMIC: [Interval; 1] = [Interval::new(66384, 66426)]; const OLD_PERMIC_EXTENSIONS: [Interval; 2] = [Interval::new(1155, 1155), Interval::new(66384, 66426)]; const PHAGS_PA: [Interval; 1] = [Interval::new(43072, 43127)]; const PHAGS_PA_EXTENSIONS: [Interval; 3] = [ Interval::new(6146, 6147), Interval::new(6149, 6149), Interval::new(43072, 43127), ]; const INSCRIPTIONAL_PAHLAVI: [Interval; 2] = [Interval::new(68448, 68466), Interval::new(68472, 68479)]; const PSALTER_PAHLAVI: [Interval; 3] = [ Interval::new(68480, 68497), Interval::new(68505, 68508), Interval::new(68521, 68527), ]; const PSALTER_PAHLAVI_EXTENSIONS: [Interval; 4] = [ Interval::new(1600, 1600), Interval::new(68480, 68497), Interval::new(68505, 68508), Interval::new(68521, 68527), ]; const PHOENICIAN: [Interval; 2] = [Interval::new(67840, 67867), Interval::new(67871, 67871)]; const MIAO: [Interval; 3] = [ Interval::new(93952, 94026), Interval::new(94031, 94087), Interval::new(94095, 94111), ]; const INSCRIPTIONAL_PARTHIAN: [Interval; 2] = [Interval::new(68416, 68437), Interval::new(68440, 68447)]; const REJANG: [Interval; 2] = [Interval::new(43312, 43347), Interval::new(43359, 43359)]; const HANIFI_ROHINGYA: [Interval; 2] = [Interval::new(68864, 68903), Interval::new(68912, 68921)]; const HANIFI_ROHINGYA_EXTENSIONS: [Interval; 7] = [ Interval::new(1548, 1548), Interval::new(1563, 1563), Interval::new(1567, 1567), Interval::new(1600, 1600), Interval::new(1748, 1748), Interval::new(68864, 68903), Interval::new(68912, 68921), ]; const RUNIC: [Interval; 2] = [Interval::new(5792, 5866), Interval::new(5870, 5880)]; const SAMARITAN: [Interval; 2] = [Interval::new(2048, 2093), Interval::new(2096, 2110)]; const OLD_SOUTH_ARABIAN: [Interval; 1] = [Interval::new(68192, 68223)]; const SAURASHTRA: [Interval; 2] = [Interval::new(43136, 43205), Interval::new(43214, 43225)]; const SIGNWRITING: [Interval; 3] = [ Interval::new(120832, 121483), Interval::new(121499, 121503), Interval::new(121505, 121519), ]; const SHAVIAN: [Interval; 1] = [Interval::new(66640, 66687)]; const SHARADA: [Interval; 1] = [Interval::new(70016, 70111)]; const SHARADA_EXTENSIONS: [Interval; 8] = [ Interval::new(2385, 2385), Interval::new(7383, 7383), Interval::new(7385, 7385), Interval::new(7388, 7389), Interval::new(7392, 7392), Interval::new(43056, 43061), Interval::new(43064, 43064), Interval::new(70016, 70111), ]; const SIDDHAM: [Interval; 2] = [Interval::new(71040, 71093), Interval::new(71096, 71133)]; const KHUDAWADI: [Interval; 2] = [Interval::new(70320, 70378), Interval::new(70384, 70393)]; const KHUDAWADI_EXTENSIONS: [Interval; 4] = [ Interval::new(2404, 2405), Interval::new(43056, 43065), Interval::new(70320, 70378), Interval::new(70384, 70393), ]; const SINHALA: [Interval; 13] = [ Interval::new(3457, 3459), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3530, 3530), Interval::new(3535, 3540), Interval::new(3542, 3542), Interval::new(3544, 3551), Interval::new(3558, 3567), Interval::new(3570, 3572), Interval::new(70113, 70132), ]; const SINHALA_EXTENSIONS: [Interval; 15] = [ Interval::new(2404, 2405), Interval::new(3457, 3459), Interval::new(3461, 3478), Interval::new(3482, 3505), Interval::new(3507, 3515), Interval::new(3517, 3517), Interval::new(3520, 3526), Interval::new(3530, 3530), Interval::new(3535, 3540), Interval::new(3542, 3542), Interval::new(3544, 3551), Interval::new(3558, 3567), Interval::new(3570, 3572), Interval::new(7410, 7410), Interval::new(70113, 70132), ]; const SOGDIAN: [Interval; 1] = [Interval::new(69424, 69465)]; const SOGDIAN_EXTENSIONS: [Interval; 2] = [Interval::new(1600, 1600), Interval::new(69424, 69465)]; const OLD_SOGDIAN: [Interval; 1] = [Interval::new(69376, 69415)]; const SORA_SOMPENG: [Interval; 2] = [Interval::new(69840, 69864), Interval::new(69872, 69881)]; const SOYOMBO: [Interval; 1] = [Interval::new(72272, 72354)]; const SUNDANESE: [Interval; 2] = [Interval::new(7040, 7103), Interval::new(7360, 7367)]; const SYLOTI_NAGRI: [Interval; 1] = [Interval::new(43008, 43052)]; const SYLOTI_NAGRI_EXTENSIONS: [Interval; 3] = [ Interval::new(2404, 2405), Interval::new(2534, 2543), Interval::new(43008, 43052), ]; const SYRIAC: [Interval; 4] = [ Interval::new(1792, 1805), Interval::new(1807, 1866), Interval::new(1869, 1871), Interval::new(2144, 2154), ]; const SYRIAC_EXTENSIONS: [Interval; 12] = [ Interval::new(1548, 1548), Interval::new(1563, 1564), Interval::new(1567, 1567), Interval::new(1600, 1600), Interval::new(1611, 1621), Interval::new(1648, 1648), Interval::new(1792, 1805), Interval::new(1807, 1866), Interval::new(1869, 1871), Interval::new(2144, 2154), Interval::new(7672, 7672), Interval::new(7674, 7674), ]; const TAGBANWA: [Interval; 3] = [ Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6002, 6003), ]; const TAGBANWA_EXTENSIONS: [Interval; 4] = [ Interval::new(5941, 5942), Interval::new(5984, 5996), Interval::new(5998, 6000), Interval::new(6002, 6003), ]; const TAKRI: [Interval; 2] = [Interval::new(71296, 71353), Interval::new(71360, 71369)]; const TAKRI_EXTENSIONS: [Interval; 4] = [ Interval::new(2404, 2405), Interval::new(43056, 43065), Interval::new(71296, 71353), Interval::new(71360, 71369), ]; const TAI_LE: [Interval; 2] = [Interval::new(6480, 6509), Interval::new(6512, 6516)]; const TAI_LE_EXTENSIONS: [Interval; 3] = [ Interval::new(4160, 4169), Interval::new(6480, 6509), Interval::new(6512, 6516), ]; const NEW_TAI_LUE: [Interval; 4] = [ Interval::new(6528, 6571), Interval::new(6576, 6601), Interval::new(6608, 6618), Interval::new(6622, 6623), ]; const TAMIL: [Interval; 18] = [ Interval::new(2946, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3006, 3010), Interval::new(3014, 3016), Interval::new(3018, 3021), Interval::new(3024, 3024), Interval::new(3031, 3031), Interval::new(3046, 3066), Interval::new(73664, 73713), Interval::new(73727, 73727), ]; const TAMIL_EXTENSIONS: [Interval; 26] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(2946, 2947), Interval::new(2949, 2954), Interval::new(2958, 2960), Interval::new(2962, 2965), Interval::new(2969, 2970), Interval::new(2972, 2972), Interval::new(2974, 2975), Interval::new(2979, 2980), Interval::new(2984, 2986), Interval::new(2990, 3001), Interval::new(3006, 3010), Interval::new(3014, 3016), Interval::new(3018, 3021), Interval::new(3024, 3024), Interval::new(3031, 3031), Interval::new(3046, 3059), Interval::new(3046, 3066), Interval::new(7386, 7386), Interval::new(43251, 43251), Interval::new(70401, 70401), Interval::new(70403, 70403), Interval::new(70459, 70460), Interval::new(73664, 73713), Interval::new(73727, 73727), ]; const TANGUT: [Interval; 4] = [ Interval::new(94176, 94176), Interval::new(94208, 100343), Interval::new(100352, 101119), Interval::new(101632, 101640), ]; const TAI_VIET: [Interval; 2] = [Interval::new(43648, 43714), Interval::new(43739, 43743)]; const TELUGU: [Interval; 13] = [ Interval::new(3072, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3132, 3140), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3171), Interval::new(3174, 3183), Interval::new(3191, 3199), ]; const TELUGU_EXTENSIONS: [Interval; 17] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(3072, 3084), Interval::new(3086, 3088), Interval::new(3090, 3112), Interval::new(3114, 3129), Interval::new(3132, 3140), Interval::new(3142, 3144), Interval::new(3146, 3149), Interval::new(3157, 3158), Interval::new(3160, 3162), Interval::new(3165, 3165), Interval::new(3168, 3171), Interval::new(3174, 3183), Interval::new(3191, 3199), Interval::new(7386, 7386), Interval::new(7410, 7410), ]; const TIFINAGH: [Interval; 3] = [ Interval::new(11568, 11623), Interval::new(11631, 11632), Interval::new(11647, 11647), ]; const TAGALOG: [Interval; 2] = [Interval::new(5888, 5909), Interval::new(5919, 5919)]; const TAGALOG_EXTENSIONS: [Interval; 3] = [ Interval::new(5888, 5909), Interval::new(5919, 5919), Interval::new(5941, 5942), ]; const THAANA: [Interval; 1] = [Interval::new(1920, 1969)]; const THAANA_EXTENSIONS: [Interval; 7] = [ Interval::new(1548, 1548), Interval::new(1563, 1564), Interval::new(1567, 1567), Interval::new(1632, 1641), Interval::new(1920, 1969), Interval::new(65010, 65010), Interval::new(65021, 65021), ]; const THAI: [Interval; 2] = [Interval::new(3585, 3642), Interval::new(3648, 3675)]; const TIBETAN: [Interval; 7] = [ Interval::new(3840, 3911), Interval::new(3913, 3948), Interval::new(3953, 3991), Interval::new(3993, 4028), Interval::new(4030, 4044), Interval::new(4046, 4052), Interval::new(4057, 4058), ]; const TIRHUTA: [Interval; 2] = [Interval::new(70784, 70855), Interval::new(70864, 70873)]; const TIRHUTA_EXTENSIONS: [Interval; 6] = [ Interval::new(2385, 2386), Interval::new(2404, 2405), Interval::new(7410, 7410), Interval::new(43056, 43065), Interval::new(70784, 70855), Interval::new(70864, 70873), ]; const TANGSA: [Interval; 2] = [Interval::new(92784, 92862), Interval::new(92864, 92873)]; const TOTO: [Interval; 1] = [Interval::new(123536, 123566)]; const UGARITIC: [Interval; 2] = [Interval::new(66432, 66461), Interval::new(66463, 66463)]; const VAI: [Interval; 1] = [Interval::new(42240, 42539)]; const VITHKUQI: [Interval; 8] = [ Interval::new(66928, 66938), Interval::new(66940, 66954), Interval::new(66956, 66962), Interval::new(66964, 66965), Interval::new(66967, 66977), Interval::new(66979, 66993), Interval::new(66995, 67001), Interval::new(67003, 67004), ]; const WARANG_CITI: [Interval; 2] = [Interval::new(71840, 71922), Interval::new(71935, 71935)]; const WANCHO: [Interval; 2] = [Interval::new(123584, 123641), Interval::new(123647, 123647)]; const OLD_PERSIAN: [Interval; 2] = [Interval::new(66464, 66499), Interval::new(66504, 66517)]; const CUNEIFORM: [Interval; 4] = [ Interval::new(73728, 74649), Interval::new(74752, 74862), Interval::new(74864, 74868), Interval::new(74880, 75075), ]; const YEZIDI: [Interval; 3] = [ Interval::new(69248, 69289), Interval::new(69291, 69293), Interval::new(69296, 69297), ]; const YEZIDI_EXTENSIONS: [Interval; 7] = [ Interval::new(1548, 1548), Interval::new(1563, 1563), Interval::new(1567, 1567), Interval::new(1632, 1641), Interval::new(69248, 69289), Interval::new(69291, 69293), Interval::new(69296, 69297), ]; const YI: [Interval; 2] = [Interval::new(40960, 42124), Interval::new(42128, 42182)]; const YI_EXTENSIONS: [Interval; 7] = [ Interval::new(12289, 12290), Interval::new(12296, 12305), Interval::new(12308, 12315), Interval::new(12539, 12539), Interval::new(40960, 42124), Interval::new(42128, 42182), Interval::new(65377, 65381), ]; const ZANABAZAR_SQUARE: [Interval; 1] = [Interval::new(72192, 72263)]; const INHERITED: [Interval; 29] = [ Interval::new(768, 879), Interval::new(1157, 1158), Interval::new(1611, 1621), Interval::new(1648, 1648), Interval::new(2385, 2388), Interval::new(6832, 6862), Interval::new(7376, 7378), Interval::new(7380, 7392), Interval::new(7394, 7400), Interval::new(7405, 7405), Interval::new(7412, 7412), Interval::new(7416, 7417), Interval::new(7616, 7679), Interval::new(8204, 8205), Interval::new(8400, 8432), Interval::new(12330, 12333), Interval::new(12441, 12442), Interval::new(65024, 65039), Interval::new(65056, 65069), Interval::new(66045, 66045), Interval::new(66272, 66272), Interval::new(70459, 70459), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119143, 119145), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(917760, 917999), ]; const INHERITED_EXTENSIONS: [Interval; 20] = [ Interval::new(768, 833), Interval::new(835, 836), Interval::new(838, 866), Interval::new(2387, 2388), Interval::new(6832, 6862), Interval::new(7618, 7671), Interval::new(7673, 7673), Interval::new(7675, 7679), Interval::new(8204, 8205), Interval::new(8400, 8431), Interval::new(65024, 65039), Interval::new(65056, 65069), Interval::new(66045, 66045), Interval::new(118528, 118573), Interval::new(118576, 118598), Interval::new(119143, 119145), Interval::new(119163, 119170), Interval::new(119173, 119179), Interval::new(119210, 119213), Interval::new(917760, 917999), ]; const COMMON: [Interval; 173] = [ Interval::new(0, 64), Interval::new(91, 96), Interval::new(123, 169), Interval::new(171, 185), Interval::new(187, 191), Interval::new(215, 215), Interval::new(247, 247), Interval::new(697, 735), Interval::new(741, 745), Interval::new(748, 767), Interval::new(884, 884), Interval::new(894, 894), Interval::new(901, 901), Interval::new(903, 903), Interval::new(1541, 1541), Interval::new(1548, 1548), Interval::new(1563, 1563), Interval::new(1567, 1567), Interval::new(1600, 1600), Interval::new(1757, 1757), Interval::new(2274, 2274), Interval::new(2404, 2405), Interval::new(3647, 3647), Interval::new(4053, 4056), Interval::new(4347, 4347), Interval::new(5867, 5869), Interval::new(5941, 5942), Interval::new(6146, 6147), Interval::new(6149, 6149), Interval::new(7379, 7379), Interval::new(7393, 7393), Interval::new(7401, 7404), Interval::new(7406, 7411), Interval::new(7413, 7415), Interval::new(7418, 7418), Interval::new(8192, 8203), Interval::new(8206, 8292), Interval::new(8294, 8304), Interval::new(8308, 8318), Interval::new(8320, 8334), Interval::new(8352, 8384), Interval::new(8448, 8485), Interval::new(8487, 8489), Interval::new(8492, 8497), Interval::new(8499, 8525), Interval::new(8527, 8543), Interval::new(8585, 8587), Interval::new(8592, 9254), Interval::new(9280, 9290), Interval::new(9312, 10239), Interval::new(10496, 11123), Interval::new(11126, 11157), Interval::new(11159, 11263), Interval::new(11776, 11869), Interval::new(12272, 12292), Interval::new(12294, 12294), Interval::new(12296, 12320), Interval::new(12336, 12343), Interval::new(12348, 12351), Interval::new(12443, 12444), Interval::new(12448, 12448), Interval::new(12539, 12540), Interval::new(12688, 12703), Interval::new(12736, 12771), Interval::new(12783, 12783), Interval::new(12832, 12895), Interval::new(12927, 13007), Interval::new(13055, 13055), Interval::new(13144, 13311), Interval::new(19904, 19967), Interval::new(42752, 42785), Interval::new(42888, 42890), Interval::new(43056, 43065), Interval::new(43310, 43310), Interval::new(43471, 43471), Interval::new(43867, 43867), Interval::new(43882, 43883), Interval::new(64830, 64831), Interval::new(65040, 65049), Interval::new(65072, 65106), Interval::new(65108, 65126), Interval::new(65128, 65131), Interval::new(65279, 65279), Interval::new(65281, 65312), Interval::new(65339, 65344), Interval::new(65371, 65381), Interval::new(65392, 65392), Interval::new(65438, 65439), Interval::new(65504, 65510), Interval::new(65512, 65518), Interval::new(65529, 65533), Interval::new(65792, 65794), Interval::new(65799, 65843), Interval::new(65847, 65855), Interval::new(65936, 65948), Interval::new(66000, 66044), Interval::new(66273, 66299), Interval::new(113824, 113827), Interval::new(118608, 118723), Interval::new(118784, 119029), Interval::new(119040, 119078), Interval::new(119081, 119142), Interval::new(119146, 119162), Interval::new(119171, 119172), Interval::new(119180, 119209), Interval::new(119214, 119274), Interval::new(119488, 119507), Interval::new(119520, 119539), Interval::new(119552, 119638), Interval::new(119648, 119672), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120779), Interval::new(120782, 120831), Interval::new(126065, 126132), Interval::new(126209, 126269), Interval::new(126976, 127019), Interval::new(127024, 127123), Interval::new(127136, 127150), Interval::new(127153, 127167), Interval::new(127169, 127183), Interval::new(127185, 127221), Interval::new(127232, 127405), Interval::new(127462, 127487), Interval::new(127489, 127490), Interval::new(127504, 127547), Interval::new(127552, 127560), Interval::new(127568, 127569), Interval::new(127584, 127589), Interval::new(127744, 128727), Interval::new(128732, 128748), Interval::new(128752, 128764), Interval::new(128768, 128886), Interval::new(128891, 128985), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129024, 129035), Interval::new(129040, 129095), Interval::new(129104, 129113), Interval::new(129120, 129159), Interval::new(129168, 129197), Interval::new(129200, 129201), Interval::new(129280, 129619), Interval::new(129632, 129645), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), Interval::new(129792, 129938), Interval::new(129940, 129994), Interval::new(130032, 130041), Interval::new(917505, 917505), Interval::new(917536, 917631), ]; const COMMON_EXTENSIONS: [Interval; 147] = [ Interval::new(0, 64), Interval::new(91, 96), Interval::new(123, 169), Interval::new(171, 185), Interval::new(187, 191), Interval::new(215, 215), Interval::new(247, 247), Interval::new(697, 735), Interval::new(741, 745), Interval::new(748, 767), Interval::new(884, 884), Interval::new(894, 894), Interval::new(901, 901), Interval::new(903, 903), Interval::new(1541, 1541), Interval::new(1757, 1757), Interval::new(2274, 2274), Interval::new(3647, 3647), Interval::new(4053, 4056), Interval::new(5867, 5869), Interval::new(8192, 8203), Interval::new(8206, 8238), Interval::new(8240, 8292), Interval::new(8294, 8304), Interval::new(8308, 8318), Interval::new(8320, 8334), Interval::new(8352, 8384), Interval::new(8448, 8485), Interval::new(8487, 8489), Interval::new(8492, 8497), Interval::new(8499, 8525), Interval::new(8527, 8543), Interval::new(8585, 8587), Interval::new(8592, 9254), Interval::new(9280, 9290), Interval::new(9312, 10239), Interval::new(10496, 11123), Interval::new(11126, 11157), Interval::new(11159, 11263), Interval::new(11776, 11842), Interval::new(11844, 11869), Interval::new(12272, 12288), Interval::new(12292, 12292), Interval::new(12306, 12306), Interval::new(12320, 12320), Interval::new(12342, 12342), Interval::new(12783, 12783), Interval::new(12872, 12895), Interval::new(12927, 12927), Interval::new(12977, 12991), Interval::new(13004, 13007), Interval::new(13169, 13178), Interval::new(13184, 13279), Interval::new(13311, 13311), Interval::new(19904, 19967), Interval::new(42760, 42785), Interval::new(42888, 42890), Interval::new(43867, 43867), Interval::new(43882, 43883), Interval::new(65040, 65049), Interval::new(65072, 65092), Interval::new(65095, 65106), Interval::new(65108, 65126), Interval::new(65128, 65131), Interval::new(65279, 65279), Interval::new(65281, 65312), Interval::new(65339, 65344), Interval::new(65371, 65376), Interval::new(65504, 65510), Interval::new(65512, 65518), Interval::new(65529, 65533), Interval::new(65936, 65948), Interval::new(66000, 66044), Interval::new(118608, 118723), Interval::new(118784, 119029), Interval::new(119040, 119078), Interval::new(119081, 119142), Interval::new(119146, 119162), Interval::new(119171, 119172), Interval::new(119180, 119209), Interval::new(119214, 119274), Interval::new(119488, 119507), Interval::new(119520, 119539), Interval::new(119552, 119638), Interval::new(119666, 119672), Interval::new(119808, 119892), Interval::new(119894, 119964), Interval::new(119966, 119967), Interval::new(119970, 119970), Interval::new(119973, 119974), Interval::new(119977, 119980), Interval::new(119982, 119993), Interval::new(119995, 119995), Interval::new(119997, 120003), Interval::new(120005, 120069), Interval::new(120071, 120074), Interval::new(120077, 120084), Interval::new(120086, 120092), Interval::new(120094, 120121), Interval::new(120123, 120126), Interval::new(120128, 120132), Interval::new(120134, 120134), Interval::new(120138, 120144), Interval::new(120146, 120485), Interval::new(120488, 120779), Interval::new(120782, 120831), Interval::new(126065, 126132), Interval::new(126209, 126269), Interval::new(126976, 127019), Interval::new(127024, 127123), Interval::new(127136, 127150), Interval::new(127153, 127167), Interval::new(127169, 127183), Interval::new(127185, 127221), Interval::new(127232, 127405), Interval::new(127462, 127487), Interval::new(127489, 127490), Interval::new(127504, 127547), Interval::new(127552, 127560), Interval::new(127584, 127589), Interval::new(127744, 128727), Interval::new(128732, 128748), Interval::new(128752, 128764), Interval::new(128768, 128886), Interval::new(128891, 128985), Interval::new(128992, 129003), Interval::new(129008, 129008), Interval::new(129024, 129035), Interval::new(129040, 129095), Interval::new(129104, 129113), Interval::new(129120, 129159), Interval::new(129168, 129197), Interval::new(129200, 129201), Interval::new(129280, 129619), Interval::new(129632, 129645), Interval::new(129648, 129660), Interval::new(129664, 129672), Interval::new(129680, 129725), Interval::new(129727, 129733), Interval::new(129742, 129755), Interval::new(129760, 129768), Interval::new(129776, 129784), Interval::new(129792, 129938), Interval::new(129940, 129994), Interval::new(130032, 130041), Interval::new(917505, 917505), Interval::new(917536, 917631), ]; #[derive(Debug, Clone, Copy)] pub enum UnicodePropertyValueScript { Adlam, CaucasianAlbanian, Ahom, Arabic, ImperialAramaic, Armenian, Avestan, Balinese, Bamum, BassaVah, Batak, Bengali, Bhaiksuki, Bopomofo, Brahmi, Braille, Buginese, Buhid, Chakma, CanadianAboriginal, Carian, Cham, Cherokee, Chorasmian, Coptic, CyproMinoan, Cypriot, Cyrillic, Devanagari, DivesAkuru, Dogra, Deseret, Duployan, EgyptianHieroglyphs, Elbasan, Elymaic, Ethiopic, Georgian, Glagolitic, GunjalaGondi, MasaramGondi, Gothic, Grantha, Greek, Gujarati, Gurmukhi, Hangul, Han, Hanunoo, Hatran, Hebrew, Hiragana, AnatolianHieroglyphs, PahawhHmong, NyiakengPuachueHmong, OldHungarian, OldItalic, Javanese, KayahLi, Katakana, Kawi, Kharoshthi, Khmer, Khojki, KhitanSmallScript, Kannada, Kaithi, TaiTham, Lao, Latin, Lepcha, Limbu, LinearA, LinearB, Lisu, Lycian, Lydian, Mahajani, Makasar, Mandaic, Manichaean, Marchen, Medefaidrin, MendeKikakui, MeroiticCursive, MeroiticHieroglyphs, Malayalam, Modi, Mongolian, Mro, MeeteiMayek, Multani, Myanmar, NagMundari, Nandinagari, OldNorthArabian, Nabataean, Newa, Nko, Nushu, Ogham, OlChiki, OldTurkic, Oriya, Osage, Osmanya, OldUyghur, Palmyrene, PauCinHau, OldPermic, PhagsPa, InscriptionalPahlavi, PsalterPahlavi, Phoenician, Miao, InscriptionalParthian, Rejang, HanifiRohingya, Runic, Samaritan, OldSouthArabian, Saurashtra, SignWriting, Shavian, Sharada, Siddham, Khudawadi, Sinhala, Sogdian, OldSogdian, SoraSompeng, Soyombo, Sundanese, SylotiNagri, Syriac, Tagbanwa, Takri, TaiLe, NewTaiLue, Tamil, Tangut, TaiViet, Telugu, Tifinagh, Tagalog, Thaana, Thai, Tibetan, Tirhuta, Tangsa, Toto, Ugaritic, Vai, Vithkuqi, WarangCiti, Wancho, OldPersian, Cuneiform, Yezidi, Yi, ZanabazarSquare, Inherited, Common, } pub(crate) fn unicode_property_value_script_from_str( s: &str, ) -> Option { use UnicodePropertyValueScript::*; match s { "Adlam" | "Adlm" => Some(Adlam), "Caucasian_Albanian" | "Aghb" => Some(CaucasianAlbanian), "Ahom" => Some(Ahom), "Arabic" | "Arab" => Some(Arabic), "Imperial_Aramaic" | "Armi" => Some(ImperialAramaic), "Armenian" | "Armn" => Some(Armenian), "Avestan" | "Avst" => Some(Avestan), "Balinese" | "Bali" => Some(Balinese), "Bamum" | "Bamu" => Some(Bamum), "Bassa_Vah" | "Bass" => Some(BassaVah), "Batak" | "Batk" => Some(Batak), "Bengali" | "Beng" => Some(Bengali), "Bhaiksuki" | "Bhks" => Some(Bhaiksuki), "Bopomofo" | "Bopo" => Some(Bopomofo), "Brahmi" | "Brah" => Some(Brahmi), "Braille" | "Brai" => Some(Braille), "Buginese" | "Bugi" => Some(Buginese), "Buhid" | "Buhd" => Some(Buhid), "Chakma" | "Cakm" => Some(Chakma), "Canadian_Aboriginal" | "Cans" => Some(CanadianAboriginal), "Carian" | "Cari" => Some(Carian), "Cham" => Some(Cham), "Cherokee" | "Cher" => Some(Cherokee), "Chorasmian" | "Chrs" => Some(Chorasmian), "Coptic" | "Copt" | "Qaac" => Some(Coptic), "Cypro_Minoan" | "Cpmn" => Some(CyproMinoan), "Cypriot" | "Cprt" => Some(Cypriot), "Cyrillic" | "Cyrl" => Some(Cyrillic), "Devanagari" | "Deva" => Some(Devanagari), "Dives_Akuru" | "Diak" => Some(DivesAkuru), "Dogra" | "Dogr" => Some(Dogra), "Deseret" | "Dsrt" => Some(Deseret), "Duployan" | "Dupl" => Some(Duployan), "Egyptian_Hieroglyphs" | "Egyp" => Some(EgyptianHieroglyphs), "Elbasan" | "Elba" => Some(Elbasan), "Elymaic" | "Elym" => Some(Elymaic), "Ethiopic" | "Ethi" => Some(Ethiopic), "Georgian" | "Geor" => Some(Georgian), "Glagolitic" | "Glag" => Some(Glagolitic), "Gunjala_Gondi" | "Gong" => Some(GunjalaGondi), "Masaram_Gondi" | "Gonm" => Some(MasaramGondi), "Gothic" | "Goth" => Some(Gothic), "Grantha" | "Gran" => Some(Grantha), "Greek" | "Grek" => Some(Greek), "Gujarati" | "Gujr" => Some(Gujarati), "Gurmukhi" | "Guru" => Some(Gurmukhi), "Hangul" | "Hang" => Some(Hangul), "Han" | "Hani" => Some(Han), "Hanunoo" | "Hano" => Some(Hanunoo), "Hatran" | "Hatr" => Some(Hatran), "Hebrew" | "Hebr" => Some(Hebrew), "Hiragana" | "Hira" => Some(Hiragana), "Anatolian_Hieroglyphs" | "Hluw" => Some(AnatolianHieroglyphs), "Pahawh_Hmong" | "Hmng" => Some(PahawhHmong), "Nyiakeng_Puachue_Hmong" | "Hmnp" => Some(NyiakengPuachueHmong), "Old_Hungarian" | "Hung" => Some(OldHungarian), "Old_Italic" | "Ital" => Some(OldItalic), "Javanese" | "Java" => Some(Javanese), "Kayah_Li" | "Kali" => Some(KayahLi), "Katakana" | "Kana" => Some(Katakana), "Kawi" => Some(Kawi), "Kharoshthi" | "Khar" => Some(Kharoshthi), "Khmer" | "Khmr" => Some(Khmer), "Khojki" | "Khoj" => Some(Khojki), "Khitan_Small_Script" | "Kits" => Some(KhitanSmallScript), "Kannada" | "Knda" => Some(Kannada), "Kaithi" | "Kthi" => Some(Kaithi), "Tai_Tham" | "Lana" => Some(TaiTham), "Lao" | "Laoo" => Some(Lao), "Latin" | "Latn" => Some(Latin), "Lepcha" | "Lepc" => Some(Lepcha), "Limbu" | "Limb" => Some(Limbu), "Linear_A" | "Lina" => Some(LinearA), "Linear_B" | "Linb" => Some(LinearB), "Lisu" => Some(Lisu), "Lycian" | "Lyci" => Some(Lycian), "Lydian" | "Lydi" => Some(Lydian), "Mahajani" | "Mahj" => Some(Mahajani), "Makasar" | "Maka" => Some(Makasar), "Mandaic" | "Mand" => Some(Mandaic), "Manichaean" | "Mani" => Some(Manichaean), "Marchen" | "Marc" => Some(Marchen), "Medefaidrin" | "Medf" => Some(Medefaidrin), "Mende_Kikakui" | "Mend" => Some(MendeKikakui), "Meroitic_Cursive" | "Merc" => Some(MeroiticCursive), "Meroitic_Hieroglyphs" | "Mero" => Some(MeroiticHieroglyphs), "Malayalam" | "Mlym" => Some(Malayalam), "Modi" => Some(Modi), "Mongolian" | "Mong" => Some(Mongolian), "Mro" | "Mroo" => Some(Mro), "Meetei_Mayek" | "Mtei" => Some(MeeteiMayek), "Multani" | "Mult" => Some(Multani), "Myanmar" | "Mymr" => Some(Myanmar), "Nag_Mundari" | "Nagm" => Some(NagMundari), "Nandinagari" | "Nand" => Some(Nandinagari), "Old_North_Arabian" | "Narb" => Some(OldNorthArabian), "Nabataean" | "Nbat" => Some(Nabataean), "Newa" => Some(Newa), "Nko" | "Nkoo" => Some(Nko), "Nushu" | "Nshu" => Some(Nushu), "Ogham" | "Ogam" => Some(Ogham), "Ol_Chiki" | "Olck" => Some(OlChiki), "Old_Turkic" | "Orkh" => Some(OldTurkic), "Oriya" | "Orya" => Some(Oriya), "Osage" | "Osge" => Some(Osage), "Osmanya" | "Osma" => Some(Osmanya), "Old_Uyghur" | "Ougr" => Some(OldUyghur), "Palmyrene" | "Palm" => Some(Palmyrene), "Pau_Cin_Hau" | "Pauc" => Some(PauCinHau), "Old_Permic" | "Perm" => Some(OldPermic), "Phags_Pa" | "Phag" => Some(PhagsPa), "Inscriptional_Pahlavi" | "Phli" => Some(InscriptionalPahlavi), "Psalter_Pahlavi" | "Phlp" => Some(PsalterPahlavi), "Phoenician" | "Phnx" => Some(Phoenician), "Miao" | "Plrd" => Some(Miao), "Inscriptional_Parthian" | "Prti" => Some(InscriptionalParthian), "Rejang" | "Rjng" => Some(Rejang), "Hanifi_Rohingya" | "Rohg" => Some(HanifiRohingya), "Runic" | "Runr" => Some(Runic), "Samaritan" | "Samr" => Some(Samaritan), "Old_South_Arabian" | "Sarb" => Some(OldSouthArabian), "Saurashtra" | "Saur" => Some(Saurashtra), "SignWriting" | "Sgnw" => Some(SignWriting), "Shavian" | "Shaw" => Some(Shavian), "Sharada" | "Shrd" => Some(Sharada), "Siddham" | "Sidd" => Some(Siddham), "Khudawadi" | "Sind" => Some(Khudawadi), "Sinhala" | "Sinh" => Some(Sinhala), "Sogdian" | "Sogd" => Some(Sogdian), "Old_Sogdian" | "Sogo" => Some(OldSogdian), "Sora_Sompeng" | "Sora" => Some(SoraSompeng), "Soyombo" | "Soyo" => Some(Soyombo), "Sundanese" | "Sund" => Some(Sundanese), "Syloti_Nagri" | "Sylo" => Some(SylotiNagri), "Syriac" | "Syrc" => Some(Syriac), "Tagbanwa" | "Tagb" => Some(Tagbanwa), "Takri" | "Takr" => Some(Takri), "Tai_Le" | "Tale" => Some(TaiLe), "New_Tai_Lue" | "Talu" => Some(NewTaiLue), "Tamil" | "Taml" => Some(Tamil), "Tangut" | "Tang" => Some(Tangut), "Tai_Viet" | "Tavt" => Some(TaiViet), "Telugu" | "Telu" => Some(Telugu), "Tifinagh" | "Tfng" => Some(Tifinagh), "Tagalog" | "Tglg" => Some(Tagalog), "Thaana" | "Thaa" => Some(Thaana), "Thai" => Some(Thai), "Tibetan" | "Tibt" => Some(Tibetan), "Tirhuta" | "Tirh" => Some(Tirhuta), "Tangsa" | "Tnsa" => Some(Tangsa), "Toto" => Some(Toto), "Ugaritic" | "Ugar" => Some(Ugaritic), "Vai" | "Vaii" => Some(Vai), "Vithkuqi" | "Vith" => Some(Vithkuqi), "Warang_Citi" | "Wara" => Some(WarangCiti), "Wancho" | "Wcho" => Some(Wancho), "Old_Persian" | "Xpeo" => Some(OldPersian), "Cuneiform" | "Xsux" => Some(Cuneiform), "Yezidi" | "Yezi" => Some(Yezidi), "Yi" | "Yiii" => Some(Yi), "Zanabazar_Square" | "Zanb" => Some(ZanabazarSquare), "Inherited" | "Zinh" | "Qaai" => Some(Inherited), "Common" | "Zyyy" => Some(Common), _ => None, } } pub(crate) fn script_value_ranges(value: &UnicodePropertyValueScript) -> &'static [Interval] { use UnicodePropertyValueScript::*; match value { Adlam => &ADLAM, CaucasianAlbanian => &CAUCASIAN_ALBANIAN, Ahom => &AHOM, Arabic => &ARABIC, ImperialAramaic => &IMPERIAL_ARAMAIC, Armenian => &ARMENIAN, Avestan => &AVESTAN, Balinese => &BALINESE, Bamum => &BAMUM, BassaVah => &BASSA_VAH, Batak => &BATAK, Bengali => &BENGALI, Bhaiksuki => &BHAIKSUKI, Bopomofo => &BOPOMOFO, Brahmi => &BRAHMI, Braille => &BRAILLE, Buginese => &BUGINESE, Buhid => &BUHID, Chakma => &CHAKMA, CanadianAboriginal => &CANADIAN_ABORIGINAL, Carian => &CARIAN, Cham => &CHAM, Cherokee => &CHEROKEE, Chorasmian => &CHORASMIAN, Coptic => &COPTIC, CyproMinoan => &CYPRO_MINOAN, Cypriot => &CYPRIOT, Cyrillic => &CYRILLIC, Devanagari => &DEVANAGARI, DivesAkuru => &DIVES_AKURU, Dogra => &DOGRA, Deseret => &DESERET, Duployan => &DUPLOYAN, EgyptianHieroglyphs => &EGYPTIAN_HIEROGLYPHS, Elbasan => &ELBASAN, Elymaic => &ELYMAIC, Ethiopic => ÐIOPIC, Georgian => &GEORGIAN, Glagolitic => &GLAGOLITIC, GunjalaGondi => &GUNJALA_GONDI, MasaramGondi => &MASARAM_GONDI, Gothic => &GOTHIC, Grantha => &GRANTHA, Greek => &GREEK, Gujarati => &GUJARATI, Gurmukhi => &GURMUKHI, Hangul => &HANGUL, Han => &HAN, Hanunoo => &HANUNOO, Hatran => &HATRAN, Hebrew => &HEBREW, Hiragana => &HIRAGANA, AnatolianHieroglyphs => &ANATOLIAN_HIEROGLYPHS, PahawhHmong => &PAHAWH_HMONG, NyiakengPuachueHmong => &NYIAKENG_PUACHUE_HMONG, OldHungarian => &OLD_HUNGARIAN, OldItalic => &OLD_ITALIC, Javanese => &JAVANESE, KayahLi => &KAYAH_LI, Katakana => &KATAKANA, Kawi => &KAWI, Kharoshthi => &KHAROSHTHI, Khmer => &KHMER, Khojki => &KHOJKI, KhitanSmallScript => &KHITAN_SMALL_SCRIPT, Kannada => &KANNADA, Kaithi => &KAITHI, TaiTham => &TAI_THAM, Lao => &LAO, Latin => &LATIN, Lepcha => &LEPCHA, Limbu => &LIMBU, LinearA => &LINEAR_A, LinearB => &LINEAR_B, Lisu => &LISU, Lycian => &LYCIAN, Lydian => &LYDIAN, Mahajani => &MAHAJANI, Makasar => &MAKASAR, Mandaic => &MANDAIC, Manichaean => &MANICHAEAN, Marchen => &MARCHEN, Medefaidrin => &MEDEFAIDRIN, MendeKikakui => &MENDE_KIKAKUI, MeroiticCursive => &MEROITIC_CURSIVE, MeroiticHieroglyphs => &MEROITIC_HIEROGLYPHS, Malayalam => &MALAYALAM, Modi => &MODI, Mongolian => &MONGOLIAN, Mro => &MRO, MeeteiMayek => &MEETEI_MAYEK, Multani => &MULTANI, Myanmar => &MYANMAR, NagMundari => &NAG_MUNDARI, Nandinagari => &NANDINAGARI, OldNorthArabian => &OLD_NORTH_ARABIAN, Nabataean => &NABATAEAN, Newa => &NEWA, Nko => &NKO, Nushu => &NUSHU, Ogham => &OGHAM, OlChiki => &OL_CHIKI, OldTurkic => &OLD_TURKIC, Oriya => &ORIYA, Osage => &OSAGE, Osmanya => &OSMANYA, OldUyghur => &OLD_UYGHUR, Palmyrene => &PALMYRENE, PauCinHau => &PAU_CIN_HAU, OldPermic => &OLD_PERMIC, PhagsPa => &PHAGS_PA, InscriptionalPahlavi => &INSCRIPTIONAL_PAHLAVI, PsalterPahlavi => &PSALTER_PAHLAVI, Phoenician => &PHOENICIAN, Miao => &MIAO, InscriptionalParthian => &INSCRIPTIONAL_PARTHIAN, Rejang => &REJANG, HanifiRohingya => &HANIFI_ROHINGYA, Runic => &RUNIC, Samaritan => &SAMARITAN, OldSouthArabian => &OLD_SOUTH_ARABIAN, Saurashtra => &SAURASHTRA, SignWriting => &SIGNWRITING, Shavian => &SHAVIAN, Sharada => &SHARADA, Siddham => &SIDDHAM, Khudawadi => &KHUDAWADI, Sinhala => &SINHALA, Sogdian => &SOGDIAN, OldSogdian => &OLD_SOGDIAN, SoraSompeng => &SORA_SOMPENG, Soyombo => &SOYOMBO, Sundanese => &SUNDANESE, SylotiNagri => &SYLOTI_NAGRI, Syriac => &SYRIAC, Tagbanwa => &TAGBANWA, Takri => &TAKRI, TaiLe => &TAI_LE, NewTaiLue => &NEW_TAI_LUE, Tamil => &TAMIL, Tangut => &TANGUT, TaiViet => &TAI_VIET, Telugu => &TELUGU, Tifinagh => &TIFINAGH, Tagalog => &TAGALOG, Thaana => &THAANA, Thai => &THAI, Tibetan => &TIBETAN, Tirhuta => &TIRHUTA, Tangsa => &TANGSA, Toto => &TOTO, Ugaritic => &UGARITIC, Vai => &VAI, Vithkuqi => &VITHKUQI, WarangCiti => &WARANG_CITI, Wancho => &WANCHO, OldPersian => &OLD_PERSIAN, Cuneiform => &CUNEIFORM, Yezidi => &YEZIDI, Yi => &YI, ZanabazarSquare => &ZANABAZAR_SQUARE, Inherited => &INHERITED, Common => &COMMON, } } pub(crate) fn script_extensions_value_ranges( value: &UnicodePropertyValueScript, ) -> &'static [Interval] { use UnicodePropertyValueScript::*; match value { Adlam => &ADLAM_EXTENSIONS, CaucasianAlbanian => &CAUCASIAN_ALBANIAN, Ahom => &AHOM, Arabic => &ARABIC_EXTENSIONS, ImperialAramaic => &IMPERIAL_ARAMAIC, Armenian => &ARMENIAN, Avestan => &AVESTAN, Balinese => &BALINESE, Bamum => &BAMUM, BassaVah => &BASSA_VAH, Batak => &BATAK, Bengali => &BENGALI_EXTENSIONS, Bhaiksuki => &BHAIKSUKI, Bopomofo => &BOPOMOFO_EXTENSIONS, Brahmi => &BRAHMI, Braille => &BRAILLE, Buginese => &BUGINESE_EXTENSIONS, Buhid => &BUHID_EXTENSIONS, Chakma => &CHAKMA_EXTENSIONS, CanadianAboriginal => &CANADIAN_ABORIGINAL, Carian => &CARIAN, Cham => &CHAM, Cherokee => &CHEROKEE, Chorasmian => &CHORASMIAN, Coptic => &COPTIC_EXTENSIONS, CyproMinoan => &CYPRO_MINOAN_EXTENSIONS, Cypriot => &CYPRIOT_EXTENSIONS, Cyrillic => &CYRILLIC_EXTENSIONS, Devanagari => &DEVANAGARI_EXTENSIONS, DivesAkuru => &DIVES_AKURU, Dogra => &DOGRA_EXTENSIONS, Deseret => &DESERET, Duployan => &DUPLOYAN_EXTENSIONS, EgyptianHieroglyphs => &EGYPTIAN_HIEROGLYPHS, Elbasan => &ELBASAN, Elymaic => &ELYMAIC, Ethiopic => ÐIOPIC, Georgian => &GEORGIAN_EXTENSIONS, Glagolitic => &GLAGOLITIC_EXTENSIONS, GunjalaGondi => &GUNJALA_GONDI_EXTENSIONS, MasaramGondi => &MASARAM_GONDI_EXTENSIONS, Gothic => &GOTHIC, Grantha => &GRANTHA_EXTENSIONS, Greek => &GREEK_EXTENSIONS, Gujarati => &GUJARATI_EXTENSIONS, Gurmukhi => &GURMUKHI_EXTENSIONS, Hangul => &HANGUL_EXTENSIONS, Han => &HAN_EXTENSIONS, Hanunoo => &HANUNOO_EXTENSIONS, Hatran => &HATRAN, Hebrew => &HEBREW, Hiragana => &HIRAGANA_EXTENSIONS, AnatolianHieroglyphs => &ANATOLIAN_HIEROGLYPHS, PahawhHmong => &PAHAWH_HMONG, NyiakengPuachueHmong => &NYIAKENG_PUACHUE_HMONG, OldHungarian => &OLD_HUNGARIAN, OldItalic => &OLD_ITALIC, Javanese => &JAVANESE_EXTENSIONS, KayahLi => &KAYAH_LI_EXTENSIONS, Katakana => &KATAKANA_EXTENSIONS, Kawi => &KAWI, Kharoshthi => &KHAROSHTHI, Khmer => &KHMER, Khojki => &KHOJKI_EXTENSIONS, KhitanSmallScript => &KHITAN_SMALL_SCRIPT, Kannada => &KANNADA_EXTENSIONS, Kaithi => &KAITHI_EXTENSIONS, TaiTham => &TAI_THAM, Lao => &LAO, Latin => &LATIN_EXTENSIONS, Lepcha => &LEPCHA, Limbu => &LIMBU_EXTENSIONS, LinearA => &LINEAR_A_EXTENSIONS, LinearB => &LINEAR_B_EXTENSIONS, Lisu => &LISU, Lycian => &LYCIAN, Lydian => &LYDIAN, Mahajani => &MAHAJANI_EXTENSIONS, Makasar => &MAKASAR, Mandaic => &MANDAIC_EXTENSIONS, Manichaean => &MANICHAEAN_EXTENSIONS, Marchen => &MARCHEN, Medefaidrin => &MEDEFAIDRIN, MendeKikakui => &MENDE_KIKAKUI, MeroiticCursive => &MEROITIC_CURSIVE, MeroiticHieroglyphs => &MEROITIC_HIEROGLYPHS, Malayalam => &MALAYALAM_EXTENSIONS, Modi => &MODI_EXTENSIONS, Mongolian => &MONGOLIAN_EXTENSIONS, Mro => &MRO, MeeteiMayek => &MEETEI_MAYEK, Multani => &MULTANI_EXTENSIONS, Myanmar => &MYANMAR_EXTENSIONS, NagMundari => &NAG_MUNDARI, Nandinagari => &NANDINAGARI_EXTENSIONS, OldNorthArabian => &OLD_NORTH_ARABIAN, Nabataean => &NABATAEAN, Newa => &NEWA, Nko => &NKO_EXTENSIONS, Nushu => &NUSHU, Ogham => &OGHAM, OlChiki => &OL_CHIKI, OldTurkic => &OLD_TURKIC, Oriya => &ORIYA_EXTENSIONS, Osage => &OSAGE, Osmanya => &OSMANYA, OldUyghur => &OLD_UYGHUR_EXTENSIONS, Palmyrene => &PALMYRENE, PauCinHau => &PAU_CIN_HAU, OldPermic => &OLD_PERMIC_EXTENSIONS, PhagsPa => &PHAGS_PA_EXTENSIONS, InscriptionalPahlavi => &INSCRIPTIONAL_PAHLAVI, PsalterPahlavi => &PSALTER_PAHLAVI_EXTENSIONS, Phoenician => &PHOENICIAN, Miao => &MIAO, InscriptionalParthian => &INSCRIPTIONAL_PARTHIAN, Rejang => &REJANG, HanifiRohingya => &HANIFI_ROHINGYA_EXTENSIONS, Runic => &RUNIC, Samaritan => &SAMARITAN, OldSouthArabian => &OLD_SOUTH_ARABIAN, Saurashtra => &SAURASHTRA, SignWriting => &SIGNWRITING, Shavian => &SHAVIAN, Sharada => &SHARADA_EXTENSIONS, Siddham => &SIDDHAM, Khudawadi => &KHUDAWADI_EXTENSIONS, Sinhala => &SINHALA_EXTENSIONS, Sogdian => &SOGDIAN_EXTENSIONS, OldSogdian => &OLD_SOGDIAN, SoraSompeng => &SORA_SOMPENG, Soyombo => &SOYOMBO, Sundanese => &SUNDANESE, SylotiNagri => &SYLOTI_NAGRI_EXTENSIONS, Syriac => &SYRIAC_EXTENSIONS, Tagbanwa => &TAGBANWA_EXTENSIONS, Takri => &TAKRI_EXTENSIONS, TaiLe => &TAI_LE_EXTENSIONS, NewTaiLue => &NEW_TAI_LUE, Tamil => &TAMIL_EXTENSIONS, Tangut => &TANGUT, TaiViet => &TAI_VIET, Telugu => &TELUGU_EXTENSIONS, Tifinagh => &TIFINAGH, Tagalog => &TAGALOG_EXTENSIONS, Thaana => &THAANA_EXTENSIONS, Thai => &THAI, Tibetan => &TIBETAN, Tirhuta => &TIRHUTA_EXTENSIONS, Tangsa => &TANGSA, Toto => &TOTO, Ugaritic => &UGARITIC, Vai => &VAI, Vithkuqi => &VITHKUQI, WarangCiti => &WARANG_CITI, Wancho => &WANCHO, OldPersian => &OLD_PERSIAN, Cuneiform => &CUNEIFORM, Yezidi => &YEZIDI_EXTENSIONS, Yi => &YI_EXTENSIONS, ZanabazarSquare => &ZANABAZAR_SQUARE, Inherited => &INHERITED_EXTENSIONS, Common => &COMMON_EXTENSIONS, } } pub(crate) const TO_UPPERCASE: [FoldRange; 198] = [ FoldRange::from(0x61, 26, -32, 1), FoldRange::from(0xB5, 1, 743, 1), FoldRange::from(0xE0, 23, -32, 1), FoldRange::from(0xF8, 7, -32, 1), FoldRange::from(0xFF, 1, 121, 1), FoldRange::from(0x101, 47, -1, 2), FoldRange::from(0x131, 1, -232, 1), FoldRange::from(0x133, 5, -1, 2), FoldRange::from(0x13A, 15, -1, 2), FoldRange::from(0x14B, 45, -1, 2), FoldRange::from(0x17A, 5, -1, 2), FoldRange::from(0x17F, 1, -300, 1), FoldRange::from(0x180, 1, 195, 1), FoldRange::from(0x183, 3, -1, 2), FoldRange::from(0x188, 5, -1, 4), FoldRange::from(0x192, 1, -1, 1), FoldRange::from(0x195, 1, 97, 1), FoldRange::from(0x199, 1, -1, 1), FoldRange::from(0x19A, 1, 163, 1), FoldRange::from(0x19E, 1, 130, 1), FoldRange::from(0x1A1, 5, -1, 2), FoldRange::from(0x1A8, 1, -1, 1), FoldRange::from(0x1AD, 1, -1, 1), FoldRange::from(0x1B0, 5, -1, 4), FoldRange::from(0x1B6, 1, -1, 1), FoldRange::from(0x1B9, 5, -1, 4), FoldRange::from(0x1BF, 1, 56, 1), FoldRange::from(0x1C5, 1, -1, 1), FoldRange::from(0x1C6, 1, -2, 1), FoldRange::from(0x1C8, 1, -1, 1), FoldRange::from(0x1C9, 1, -2, 1), FoldRange::from(0x1CB, 1, -1, 1), FoldRange::from(0x1CC, 1, -2, 1), FoldRange::from(0x1CE, 15, -1, 2), FoldRange::from(0x1DD, 1, -79, 1), FoldRange::from(0x1DF, 17, -1, 2), FoldRange::from(0x1F2, 1, -1, 1), FoldRange::from(0x1F3, 1, -2, 1), FoldRange::from(0x1F5, 5, -1, 4), FoldRange::from(0x1FB, 37, -1, 2), FoldRange::from(0x223, 17, -1, 2), FoldRange::from(0x23C, 1, -1, 1), FoldRange::from(0x23F, 2, 10815, 1), FoldRange::from(0x242, 1, -1, 1), FoldRange::from(0x247, 9, -1, 2), FoldRange::from(0x250, 1, 10783, 1), FoldRange::from(0x251, 1, 10780, 1), FoldRange::from(0x252, 1, 10782, 1), FoldRange::from(0x253, 1, -210, 1), FoldRange::from(0x254, 1, -206, 1), FoldRange::from(0x256, 2, -205, 1), FoldRange::from(0x259, 1, -202, 1), FoldRange::from(0x25B, 1, -203, 1), FoldRange::from(0x25C, 1, 42319, 1), FoldRange::from(0x260, 1, -205, 1), FoldRange::from(0x261, 1, 42315, 1), FoldRange::from(0x263, 1, -207, 1), FoldRange::from(0x265, 1, 42280, 1), FoldRange::from(0x266, 1, 42308, 1), FoldRange::from(0x268, 1, -209, 1), FoldRange::from(0x269, 1, -211, 1), FoldRange::from(0x26A, 1, 42308, 1), FoldRange::from(0x26B, 1, 10743, 1), FoldRange::from(0x26C, 1, 42305, 1), FoldRange::from(0x26F, 1, -211, 1), FoldRange::from(0x271, 1, 10749, 1), FoldRange::from(0x272, 1, -213, 1), FoldRange::from(0x275, 1, -214, 1), FoldRange::from(0x27D, 1, 10727, 1), FoldRange::from(0x280, 1, -218, 1), FoldRange::from(0x282, 1, 42307, 1), FoldRange::from(0x283, 1, -218, 1), FoldRange::from(0x287, 1, 42282, 1), FoldRange::from(0x288, 1, -218, 1), FoldRange::from(0x289, 1, -69, 1), FoldRange::from(0x28A, 2, -217, 1), FoldRange::from(0x28C, 1, -71, 1), FoldRange::from(0x292, 1, -219, 1), FoldRange::from(0x29D, 1, 42261, 1), FoldRange::from(0x29E, 1, 42258, 1), FoldRange::from(0x345, 1, 84, 1), FoldRange::from(0x371, 3, -1, 2), FoldRange::from(0x377, 1, -1, 1), FoldRange::from(0x37B, 3, 130, 1), FoldRange::from(0x3AC, 1, -38, 1), FoldRange::from(0x3AD, 3, -37, 1), FoldRange::from(0x3B1, 17, -32, 1), FoldRange::from(0x3C2, 1, -31, 1), FoldRange::from(0x3C3, 9, -32, 1), FoldRange::from(0x3CC, 1, -64, 1), FoldRange::from(0x3CD, 2, -63, 1), FoldRange::from(0x3D0, 1, -62, 1), FoldRange::from(0x3D1, 1, -57, 1), FoldRange::from(0x3D5, 1, -47, 1), FoldRange::from(0x3D6, 1, -54, 1), FoldRange::from(0x3D7, 1, -8, 1), FoldRange::from(0x3D9, 23, -1, 2), FoldRange::from(0x3F0, 1, -86, 1), FoldRange::from(0x3F1, 1, -80, 1), FoldRange::from(0x3F2, 1, 7, 1), FoldRange::from(0x3F3, 1, -116, 1), FoldRange::from(0x3F5, 1, -96, 1), FoldRange::from(0x3F8, 1, -1, 1), FoldRange::from(0x3FB, 1, -1, 1), FoldRange::from(0x430, 32, -32, 1), FoldRange::from(0x450, 16, -80, 1), FoldRange::from(0x461, 33, -1, 2), FoldRange::from(0x48B, 53, -1, 2), FoldRange::from(0x4C2, 13, -1, 2), FoldRange::from(0x4CF, 1, -15, 1), FoldRange::from(0x4D1, 95, -1, 2), FoldRange::from(0x561, 38, -48, 1), FoldRange::from(0x10D0, 43, 3008, 1), FoldRange::from(0x10FD, 3, 3008, 1), FoldRange::from(0x13F8, 6, -8, 1), FoldRange::from(0x1C80, 1, -6254, 1), FoldRange::from(0x1C81, 1, -6253, 1), FoldRange::from(0x1C82, 1, -6244, 1), FoldRange::from(0x1C83, 2, -6242, 1), FoldRange::from(0x1C85, 1, -6243, 1), FoldRange::from(0x1C86, 1, -6236, 1), FoldRange::from(0x1C87, 1, -6181, 1), FoldRange::from(0x1C88, 1, 35266, 1), FoldRange::from(0x1D79, 1, 35332, 1), FoldRange::from(0x1D7D, 1, 3814, 1), FoldRange::from(0x1D8E, 1, 35384, 1), FoldRange::from(0x1E01, 149, -1, 2), FoldRange::from(0x1E9B, 1, -59, 1), FoldRange::from(0x1EA1, 95, -1, 2), FoldRange::from(0x1F00, 8, 8, 1), FoldRange::from(0x1F10, 6, 8, 1), FoldRange::from(0x1F20, 8, 8, 1), FoldRange::from(0x1F30, 8, 8, 1), FoldRange::from(0x1F40, 6, 8, 1), FoldRange::from(0x1F51, 7, 8, 2), FoldRange::from(0x1F60, 8, 8, 1), FoldRange::from(0x1F70, 2, 74, 1), FoldRange::from(0x1F72, 4, 86, 1), FoldRange::from(0x1F76, 2, 100, 1), FoldRange::from(0x1F78, 2, 128, 1), FoldRange::from(0x1F7A, 2, 112, 1), FoldRange::from(0x1F7C, 2, 126, 1), FoldRange::from(0x1F80, 8, 8, 1), FoldRange::from(0x1F90, 8, 8, 1), FoldRange::from(0x1FA0, 8, 8, 1), FoldRange::from(0x1FB0, 2, 8, 1), FoldRange::from(0x1FB3, 1, 9, 1), FoldRange::from(0x1FBE, 1, -7205, 1), FoldRange::from(0x1FC3, 1, 9, 1), FoldRange::from(0x1FD0, 2, 8, 1), FoldRange::from(0x1FE0, 2, 8, 1), FoldRange::from(0x1FE5, 1, 7, 1), FoldRange::from(0x1FF3, 1, 9, 1), FoldRange::from(0x214E, 1, -28, 1), FoldRange::from(0x2170, 16, -16, 1), FoldRange::from(0x2184, 1, -1, 1), FoldRange::from(0x24D0, 26, -26, 1), FoldRange::from(0x2C30, 48, -48, 1), FoldRange::from(0x2C61, 1, -1, 1), FoldRange::from(0x2C65, 1, -10795, 1), FoldRange::from(0x2C66, 1, -10792, 1), FoldRange::from(0x2C68, 5, -1, 2), FoldRange::from(0x2C73, 1, -1, 1), FoldRange::from(0x2C76, 1, -1, 1), FoldRange::from(0x2C81, 99, -1, 2), FoldRange::from(0x2CEC, 3, -1, 2), FoldRange::from(0x2CF3, 1, -1, 1), FoldRange::from(0x2D00, 38, -7264, 1), FoldRange::from(0x2D27, 1, -7264, 1), FoldRange::from(0x2D2D, 1, -7264, 1), FoldRange::from(0xA641, 45, -1, 2), FoldRange::from(0xA681, 27, -1, 2), FoldRange::from(0xA723, 13, -1, 2), FoldRange::from(0xA733, 61, -1, 2), FoldRange::from(0xA77A, 3, -1, 2), FoldRange::from(0xA77F, 9, -1, 2), FoldRange::from(0xA78C, 1, -1, 1), FoldRange::from(0xA791, 3, -1, 2), FoldRange::from(0xA794, 1, 48, 1), FoldRange::from(0xA797, 19, -1, 2), FoldRange::from(0xA7B5, 15, -1, 2), FoldRange::from(0xA7C8, 3, -1, 2), FoldRange::from(0xA7D1, 1, -1, 1), FoldRange::from(0xA7D7, 3, -1, 2), FoldRange::from(0xA7F6, 1, -1, 1), FoldRange::from(0xAB53, 1, -928, 1), FoldRange::from(0xAB70, 80, -38864, 1), FoldRange::from(0xFF41, 26, -32, 1), FoldRange::from(0x10428, 40, -40, 1), FoldRange::from(0x104D8, 36, -40, 1), FoldRange::from(0x10597, 11, -39, 1), FoldRange::from(0x105A3, 15, -39, 1), FoldRange::from(0x105B3, 7, -39, 1), FoldRange::from(0x105BB, 2, -39, 1), FoldRange::from(0x10CC0, 51, -64, 1), FoldRange::from(0x118C0, 32, -32, 1), FoldRange::from(0x16E60, 32, -32, 1), FoldRange::from(0x1E922, 34, -34, 1), ]; static BASIC_EMOJI: &[&[u32]; 1386] = &[ &[8986], &[8987], &[9193], &[9194], &[9195], &[9196], &[9200], &[9203], &[9725], &[9726], &[9748], &[9749], &[9800], &[9801], &[9802], &[9803], &[9804], &[9805], &[9806], &[9807], &[9808], &[9809], &[9810], &[9811], &[9855], &[9875], &[9889], &[9898], &[9899], &[9917], &[9918], &[9924], &[9925], &[9934], &[9940], &[9962], &[9970], &[9971], &[9973], &[9978], &[9981], &[9989], &[9994], &[9995], &[10024], &[10060], &[10062], &[10067], &[10068], &[10069], &[10071], &[10133], &[10134], &[10135], &[10160], &[10175], &[11035], &[11036], &[11088], &[11093], &[126980], &[127183], &[127374], &[127377], &[127378], &[127379], &[127380], &[127381], &[127382], &[127383], &[127384], &[127385], &[127386], &[127489], &[127514], &[127535], &[127538], &[127539], &[127540], &[127541], &[127542], &[127544], &[127545], &[127546], &[127568], &[127569], &[127744], &[127745], &[127746], &[127747], &[127748], &[127749], &[127750], &[127751], &[127752], &[127753], &[127754], &[127755], &[127756], &[127757], &[127758], &[127759], &[127760], &[127761], &[127762], &[127763], &[127764], &[127765], &[127766], &[127767], &[127768], &[127769], &[127770], &[127771], &[127772], &[127773], &[127774], &[127775], &[127776], &[127789], &[127790], &[127791], &[127792], &[127793], &[127794], &[127795], &[127796], &[127797], &[127799], &[127800], &[127801], &[127802], &[127803], &[127804], &[127805], &[127806], &[127807], &[127808], &[127809], &[127810], &[127811], &[127812], &[127813], &[127814], &[127815], &[127816], &[127817], &[127818], &[127819], &[127820], &[127821], &[127822], &[127823], &[127824], &[127825], &[127826], &[127827], &[127828], &[127829], &[127830], &[127831], &[127832], &[127833], &[127834], &[127835], &[127836], &[127837], &[127838], &[127839], &[127840], &[127841], &[127842], &[127843], &[127844], &[127845], &[127846], &[127847], &[127848], &[127849], &[127850], &[127851], &[127852], &[127853], &[127854], &[127855], &[127856], &[127857], &[127858], &[127859], &[127860], &[127861], &[127862], &[127863], &[127864], &[127865], &[127866], &[127867], &[127868], &[127870], &[127871], &[127872], &[127873], &[127874], &[127875], &[127876], &[127877], &[127878], &[127879], &[127880], &[127881], &[127882], &[127883], &[127884], &[127885], &[127886], &[127887], &[127888], &[127889], &[127890], &[127891], &[127904], &[127905], &[127906], &[127907], &[127908], &[127909], &[127910], &[127911], &[127912], &[127913], &[127914], &[127915], &[127916], &[127917], &[127918], &[127919], &[127920], &[127921], &[127922], &[127923], &[127924], &[127925], &[127926], &[127927], &[127928], &[127929], &[127930], &[127931], &[127932], &[127933], &[127934], &[127935], &[127936], &[127937], &[127938], &[127939], &[127940], &[127941], &[127942], &[127943], &[127944], &[127945], &[127946], &[127951], &[127952], &[127953], &[127954], &[127955], &[127968], &[127969], &[127970], &[127971], &[127972], &[127973], &[127974], &[127975], &[127976], &[127977], &[127978], &[127979], &[127980], &[127981], &[127982], &[127983], &[127984], &[127988], &[127992], &[127993], &[127994], &[127995], &[127996], &[127997], &[127998], &[127999], &[128000], &[128001], &[128002], &[128003], &[128004], &[128005], &[128006], &[128007], &[128008], &[128009], &[128010], &[128011], &[128012], &[128013], &[128014], &[128015], &[128016], &[128017], &[128018], &[128019], &[128020], &[128021], &[128022], &[128023], &[128024], &[128025], &[128026], &[128027], &[128028], &[128029], &[128030], &[128031], &[128032], &[128033], &[128034], &[128035], &[128036], &[128037], &[128038], &[128039], &[128040], &[128041], &[128042], &[128043], &[128044], &[128045], &[128046], &[128047], &[128048], &[128049], &[128050], &[128051], &[128052], &[128053], &[128054], &[128055], &[128056], &[128057], &[128058], &[128059], &[128060], &[128061], &[128062], &[128064], &[128066], &[128067], &[128068], &[128069], &[128070], &[128071], &[128072], &[128073], &[128074], &[128075], &[128076], &[128077], &[128078], &[128079], &[128080], &[128081], &[128082], &[128083], &[128084], &[128085], &[128086], &[128087], &[128088], &[128089], &[128090], &[128091], &[128092], &[128093], &[128094], &[128095], &[128096], &[128097], &[128098], &[128099], &[128100], &[128101], &[128102], &[128103], &[128104], &[128105], &[128106], &[128107], &[128108], &[128109], &[128110], &[128111], &[128112], &[128113], &[128114], &[128115], &[128116], &[128117], &[128118], &[128119], &[128120], &[128121], &[128122], &[128123], &[128124], &[128125], &[128126], &[128127], &[128128], &[128129], &[128130], &[128131], &[128132], &[128133], &[128134], &[128135], &[128136], &[128137], &[128138], &[128139], &[128140], &[128141], &[128142], &[128143], &[128144], &[128145], &[128146], &[128147], &[128148], &[128149], &[128150], &[128151], &[128152], &[128153], &[128154], &[128155], &[128156], &[128157], &[128158], &[128159], &[128160], &[128161], &[128162], &[128163], &[128164], &[128165], &[128166], &[128167], &[128168], &[128169], &[128170], &[128171], &[128172], &[128173], &[128174], &[128175], &[128176], &[128177], &[128178], &[128179], &[128180], &[128181], &[128182], &[128183], &[128184], &[128185], &[128186], &[128187], &[128188], &[128189], &[128190], &[128191], &[128192], &[128193], &[128194], &[128195], &[128196], &[128197], &[128198], &[128199], &[128200], &[128201], &[128202], &[128203], &[128204], &[128205], &[128206], &[128207], &[128208], &[128209], &[128210], &[128211], &[128212], &[128213], &[128214], &[128215], &[128216], &[128217], &[128218], &[128219], &[128220], &[128221], &[128222], &[128223], &[128224], &[128225], &[128226], &[128227], &[128228], &[128229], &[128230], &[128231], &[128232], &[128233], &[128234], &[128235], &[128236], &[128237], &[128238], &[128239], &[128240], &[128241], &[128242], &[128243], &[128244], &[128245], &[128246], &[128247], &[128248], &[128249], &[128250], &[128251], &[128252], &[128255], &[128256], &[128257], &[128258], &[128259], &[128260], &[128261], &[128262], &[128263], &[128264], &[128265], &[128266], &[128267], &[128268], &[128269], &[128270], &[128271], &[128272], &[128273], &[128274], &[128275], &[128276], &[128277], &[128278], &[128279], &[128280], &[128281], &[128282], &[128283], &[128284], &[128285], &[128286], &[128287], &[128288], &[128289], &[128290], &[128291], &[128292], &[128293], &[128294], &[128295], &[128296], &[128297], &[128298], &[128299], &[128300], &[128301], &[128302], &[128303], &[128304], &[128305], &[128306], &[128307], &[128308], &[128309], &[128310], &[128311], &[128312], &[128313], &[128314], &[128315], &[128316], &[128317], &[128331], &[128332], &[128333], &[128334], &[128336], &[128337], &[128338], &[128339], &[128340], &[128341], &[128342], &[128343], &[128344], &[128345], &[128346], &[128347], &[128348], &[128349], &[128350], &[128351], &[128352], &[128353], &[128354], &[128355], &[128356], &[128357], &[128358], &[128359], &[128378], &[128405], &[128406], &[128420], &[128507], &[128508], &[128509], &[128510], &[128511], &[128512], &[128513], &[128514], &[128515], &[128516], &[128517], &[128518], &[128519], &[128520], &[128521], &[128522], &[128523], &[128524], &[128525], &[128526], &[128527], &[128528], &[128529], &[128530], &[128531], &[128532], &[128533], &[128534], &[128535], &[128536], &[128537], &[128538], &[128539], &[128540], &[128541], &[128542], &[128543], &[128544], &[128545], &[128546], &[128547], &[128548], &[128549], &[128550], &[128551], &[128552], &[128553], &[128554], &[128555], &[128556], &[128557], &[128558], &[128559], &[128560], &[128561], &[128562], &[128563], &[128564], &[128565], &[128566], &[128567], &[128568], &[128569], &[128570], &[128571], &[128572], &[128573], &[128574], &[128575], &[128576], &[128577], &[128578], &[128579], &[128580], &[128581], &[128582], &[128583], &[128584], &[128585], &[128586], &[128587], &[128588], &[128589], &[128590], &[128591], &[128640], &[128641], &[128642], &[128643], &[128644], &[128645], &[128646], &[128647], &[128648], &[128649], &[128650], &[128651], &[128652], &[128653], &[128654], &[128655], &[128656], &[128657], &[128658], &[128659], &[128660], &[128661], &[128662], &[128663], &[128664], &[128665], &[128666], &[128667], &[128668], &[128669], &[128670], &[128671], &[128672], &[128673], &[128674], &[128675], &[128676], &[128677], &[128678], &[128679], &[128680], &[128681], &[128682], &[128683], &[128684], &[128685], &[128686], &[128687], &[128688], &[128689], &[128690], &[128691], &[128692], &[128693], &[128694], &[128695], &[128696], &[128697], &[128698], &[128699], &[128700], &[128701], &[128702], &[128703], &[128704], &[128705], &[128706], &[128707], &[128708], &[128709], &[128716], &[128720], &[128721], &[128722], &[128725], &[128726], &[128727], &[128732], &[128733], &[128734], &[128735], &[128747], &[128748], &[128756], &[128757], &[128758], &[128759], &[128760], &[128761], &[128762], &[128763], &[128764], &[128992], &[128993], &[128994], &[128995], &[128996], &[128997], &[128998], &[128999], &[129000], &[129001], &[129002], &[129003], &[129008], &[129292], &[129293], &[129294], &[129295], &[129296], &[129297], &[129298], &[129299], &[129300], &[129301], &[129302], &[129303], &[129304], &[129305], &[129306], &[129307], &[129308], &[129309], &[129310], &[129311], &[129312], &[129313], &[129314], &[129315], &[129316], &[129317], &[129318], &[129319], &[129320], &[129321], &[129322], &[129323], &[129324], &[129325], &[129326], &[129327], &[129328], &[129329], &[129330], &[129331], &[129332], &[129333], &[129334], &[129335], &[129336], &[129337], &[129338], &[129340], &[129341], &[129342], &[129343], &[129344], &[129345], &[129346], &[129347], &[129348], &[129349], &[129351], &[129352], &[129353], &[129354], &[129355], &[129356], &[129357], &[129358], &[129359], &[129360], &[129361], &[129362], &[129363], &[129364], &[129365], &[129366], &[129367], &[129368], &[129369], &[129370], &[129371], &[129372], &[129373], &[129374], &[129375], &[129376], &[129377], &[129378], &[129379], &[129380], &[129381], &[129382], &[129383], &[129384], &[129385], &[129386], &[129387], &[129388], &[129389], &[129390], &[129391], &[129392], &[129393], &[129394], &[129395], &[129396], &[129397], &[129398], &[129399], &[129400], &[129401], &[129402], &[129403], &[129404], &[129405], &[129406], &[129407], &[129408], &[129409], &[129410], &[129411], &[129412], &[129413], &[129414], &[129415], &[129416], &[129417], &[129418], &[129419], &[129420], &[129421], &[129422], &[129423], &[129424], &[129425], &[129426], &[129427], &[129428], &[129429], &[129430], &[129431], &[129432], &[129433], &[129434], &[129435], &[129436], &[129437], &[129438], &[129439], &[129440], &[129441], &[129442], &[129443], &[129444], &[129445], &[129446], &[129447], &[129448], &[129449], &[129450], &[129451], &[129452], &[129453], &[129454], &[129455], &[129456], &[129457], &[129458], &[129459], &[129460], &[129461], &[129462], &[129463], &[129464], &[129465], &[129466], &[129467], &[129468], &[129469], &[129470], &[129471], &[129472], &[129473], &[129474], &[129475], &[129476], &[129477], &[129478], &[129479], &[129480], &[129481], &[129482], &[129483], &[129484], &[129485], &[129486], &[129487], &[129488], &[129489], &[129490], &[129491], &[129492], &[129493], &[129494], &[129495], &[129496], &[129497], &[129498], &[129499], &[129500], &[129501], &[129502], &[129503], &[129504], &[129505], &[129506], &[129507], &[129508], &[129509], &[129510], &[129511], &[129512], &[129513], &[129514], &[129515], &[129516], &[129517], &[129518], &[129519], &[129520], &[129521], &[129522], &[129523], &[129524], &[129525], &[129526], &[129527], &[129528], &[129529], &[129530], &[129531], &[129532], &[129533], &[129534], &[129535], &[129648], &[129649], &[129650], &[129651], &[129652], &[129653], &[129654], &[129655], &[129656], &[129657], &[129658], &[129659], &[129660], &[129664], &[129665], &[129666], &[129667], &[129668], &[129669], &[129670], &[129671], &[129672], &[129680], &[129681], &[129682], &[129683], &[129684], &[129685], &[129686], &[129687], &[129688], &[129689], &[129690], &[129691], &[129692], &[129693], &[129694], &[129695], &[129696], &[129697], &[129698], &[129699], &[129700], &[129701], &[129702], &[129703], &[129704], &[129705], &[129706], &[129707], &[129708], &[129709], &[129710], &[129711], &[129712], &[129713], &[129714], &[129715], &[129716], &[129717], &[129718], &[129719], &[129720], &[129721], &[129722], &[129723], &[129724], &[129725], &[129727], &[129728], &[129729], &[129730], &[129731], &[129732], &[129733], &[129742], &[129743], &[129744], &[129745], &[129746], &[129747], &[129748], &[129749], &[129750], &[129751], &[129752], &[129753], &[129754], &[129755], &[129760], &[129761], &[129762], &[129763], &[129764], &[129765], &[129766], &[129767], &[129768], &[129776], &[129777], &[129778], &[129779], &[129780], &[129781], &[129782], &[129783], &[129784], &[169, 65039], &[174, 65039], &[8252, 65039], &[8265, 65039], &[8482, 65039], &[8505, 65039], &[8596, 65039], &[8597, 65039], &[8598, 65039], &[8599, 65039], &[8600, 65039], &[8601, 65039], &[8617, 65039], &[8618, 65039], &[9000, 65039], &[9167, 65039], &[9197, 65039], &[9198, 65039], &[9199, 65039], &[9201, 65039], &[9202, 65039], &[9208, 65039], &[9209, 65039], &[9210, 65039], &[9410, 65039], &[9642, 65039], &[9643, 65039], &[9654, 65039], &[9664, 65039], &[9723, 65039], &[9724, 65039], &[9728, 65039], &[9729, 65039], &[9730, 65039], &[9731, 65039], &[9732, 65039], &[9742, 65039], &[9745, 65039], &[9752, 65039], &[9757, 65039], &[9760, 65039], &[9762, 65039], &[9763, 65039], &[9766, 65039], &[9770, 65039], &[9774, 65039], &[9775, 65039], &[9784, 65039], &[9785, 65039], &[9786, 65039], &[9792, 65039], &[9794, 65039], &[9823, 65039], &[9824, 65039], &[9827, 65039], &[9829, 65039], &[9830, 65039], &[9832, 65039], &[9851, 65039], &[9854, 65039], &[9874, 65039], &[9876, 65039], &[9877, 65039], &[9878, 65039], &[9879, 65039], &[9881, 65039], &[9883, 65039], &[9884, 65039], &[9888, 65039], &[9895, 65039], &[9904, 65039], &[9905, 65039], &[9928, 65039], &[9935, 65039], &[9937, 65039], &[9939, 65039], &[9961, 65039], &[9968, 65039], &[9969, 65039], &[9972, 65039], &[9975, 65039], &[9976, 65039], &[9977, 65039], &[9986, 65039], &[9992, 65039], &[9993, 65039], &[9996, 65039], &[9997, 65039], &[9999, 65039], &[10002, 65039], &[10004, 65039], &[10006, 65039], &[10013, 65039], &[10017, 65039], &[10035, 65039], &[10036, 65039], &[10052, 65039], &[10055, 65039], &[10083, 65039], &[10084, 65039], &[10145, 65039], &[10548, 65039], &[10549, 65039], &[11013, 65039], &[11014, 65039], &[11015, 65039], &[12336, 65039], &[12349, 65039], &[12951, 65039], &[12953, 65039], &[127344, 65039], &[127345, 65039], &[127358, 65039], &[127359, 65039], &[127490, 65039], &[127543, 65039], &[127777, 65039], &[127780, 65039], &[127781, 65039], &[127782, 65039], &[127783, 65039], &[127784, 65039], &[127785, 65039], &[127786, 65039], &[127787, 65039], &[127788, 65039], &[127798, 65039], &[127869, 65039], &[127894, 65039], &[127895, 65039], &[127897, 65039], &[127898, 65039], &[127899, 65039], &[127902, 65039], &[127903, 65039], &[127947, 65039], &[127948, 65039], &[127949, 65039], &[127950, 65039], &[127956, 65039], &[127957, 65039], &[127958, 65039], &[127959, 65039], &[127960, 65039], &[127961, 65039], &[127962, 65039], &[127963, 65039], &[127964, 65039], &[127965, 65039], &[127966, 65039], &[127967, 65039], &[127987, 65039], &[127989, 65039], &[127991, 65039], &[128063, 65039], &[128065, 65039], &[128253, 65039], &[128329, 65039], &[128330, 65039], &[128367, 65039], &[128368, 65039], &[128371, 65039], &[128372, 65039], &[128373, 65039], &[128374, 65039], &[128375, 65039], &[128376, 65039], &[128377, 65039], &[128391, 65039], &[128394, 65039], &[128395, 65039], &[128396, 65039], &[128397, 65039], &[128400, 65039], &[128421, 65039], &[128424, 65039], &[128433, 65039], &[128434, 65039], &[128444, 65039], &[128450, 65039], &[128451, 65039], &[128452, 65039], &[128465, 65039], &[128466, 65039], &[128467, 65039], &[128476, 65039], &[128477, 65039], &[128478, 65039], &[128481, 65039], &[128483, 65039], &[128488, 65039], &[128495, 65039], &[128499, 65039], &[128506, 65039], &[128715, 65039], &[128717, 65039], &[128718, 65039], &[128719, 65039], &[128736, 65039], &[128737, 65039], &[128738, 65039], &[128739, 65039], &[128740, 65039], &[128741, 65039], &[128745, 65039], &[128752, 65039], &[128755, 65039], ]; /// Return the code point ranges of the 'Basic_Emoji' Unicode property. pub(crate) fn basic_emoji_sets() -> &'static [&'static [u32]] { BASIC_EMOJI.as_slice() } static EMOJI_KEYCAP_SEQUENCE: &[&[u32]; 12] = &[ &[35, 65039, 8419], &[42, 65039, 8419], &[48, 65039, 8419], &[49, 65039, 8419], &[50, 65039, 8419], &[51, 65039, 8419], &[52, 65039, 8419], &[53, 65039, 8419], &[54, 65039, 8419], &[55, 65039, 8419], &[56, 65039, 8419], &[57, 65039, 8419], ]; /// Return the code point ranges of the 'Emoji_Keycap_Sequence' Unicode property. pub(crate) fn emoji_keycap_sequence_sets() -> &'static [&'static [u32]] { EMOJI_KEYCAP_SEQUENCE.as_slice() } static RGI_EMOJI_FLAG_SEQUENCE: &[&[u32]; 258] = &[ &[127462, 127464], &[127462, 127465], &[127462, 127466], &[127462, 127467], &[127462, 127468], &[127462, 127470], &[127462, 127473], &[127462, 127474], &[127462, 127476], &[127462, 127478], &[127462, 127479], &[127462, 127480], &[127462, 127481], &[127462, 127482], &[127462, 127484], &[127462, 127485], &[127462, 127487], &[127463, 127462], &[127463, 127463], &[127463, 127465], &[127463, 127466], &[127463, 127467], &[127463, 127468], &[127463, 127469], &[127463, 127470], &[127463, 127471], &[127463, 127473], &[127463, 127474], &[127463, 127475], &[127463, 127476], &[127463, 127478], &[127463, 127479], &[127463, 127480], &[127463, 127481], &[127463, 127483], &[127463, 127484], &[127463, 127486], &[127463, 127487], &[127464, 127462], &[127464, 127464], &[127464, 127465], &[127464, 127467], &[127464, 127468], &[127464, 127469], &[127464, 127470], &[127464, 127472], &[127464, 127473], &[127464, 127474], &[127464, 127475], &[127464, 127476], &[127464, 127477], &[127464, 127479], &[127464, 127482], &[127464, 127483], &[127464, 127484], &[127464, 127485], &[127464, 127486], &[127464, 127487], &[127465, 127466], &[127465, 127468], &[127465, 127471], &[127465, 127472], &[127465, 127474], &[127465, 127476], &[127465, 127487], &[127466, 127462], &[127466, 127464], &[127466, 127466], &[127466, 127468], &[127466, 127469], &[127466, 127479], &[127466, 127480], &[127466, 127481], &[127466, 127482], &[127467, 127470], &[127467, 127471], &[127467, 127472], &[127467, 127474], &[127467, 127476], &[127467, 127479], &[127468, 127462], &[127468, 127463], &[127468, 127465], &[127468, 127466], &[127468, 127467], &[127468, 127468], &[127468, 127469], &[127468, 127470], &[127468, 127473], &[127468, 127474], &[127468, 127475], &[127468, 127477], &[127468, 127478], &[127468, 127479], &[127468, 127480], &[127468, 127481], &[127468, 127482], &[127468, 127484], &[127468, 127486], &[127469, 127472], &[127469, 127474], &[127469, 127475], &[127469, 127479], &[127469, 127481], &[127469, 127482], &[127470, 127464], &[127470, 127465], &[127470, 127466], &[127470, 127473], &[127470, 127474], &[127470, 127475], &[127470, 127476], &[127470, 127478], &[127470, 127479], &[127470, 127480], &[127470, 127481], &[127471, 127466], &[127471, 127474], &[127471, 127476], &[127471, 127477], &[127472, 127466], &[127472, 127468], &[127472, 127469], &[127472, 127470], &[127472, 127474], &[127472, 127475], &[127472, 127477], &[127472, 127479], &[127472, 127484], &[127472, 127486], &[127472, 127487], &[127473, 127462], &[127473, 127463], &[127473, 127464], &[127473, 127470], &[127473, 127472], &[127473, 127479], &[127473, 127480], &[127473, 127481], &[127473, 127482], &[127473, 127483], &[127473, 127486], &[127474, 127462], &[127474, 127464], &[127474, 127465], &[127474, 127466], &[127474, 127467], &[127474, 127468], &[127474, 127469], &[127474, 127472], &[127474, 127473], &[127474, 127474], &[127474, 127475], &[127474, 127476], &[127474, 127477], &[127474, 127478], &[127474, 127479], &[127474, 127480], &[127474, 127481], &[127474, 127482], &[127474, 127483], &[127474, 127484], &[127474, 127485], &[127474, 127486], &[127474, 127487], &[127475, 127462], &[127475, 127464], &[127475, 127466], &[127475, 127467], &[127475, 127468], &[127475, 127470], &[127475, 127473], &[127475, 127476], &[127475, 127477], &[127475, 127479], &[127475, 127482], &[127475, 127487], &[127476, 127474], &[127477, 127462], &[127477, 127466], &[127477, 127467], &[127477, 127468], &[127477, 127469], &[127477, 127472], &[127477, 127473], &[127477, 127474], &[127477, 127475], &[127477, 127479], &[127477, 127480], &[127477, 127481], &[127477, 127484], &[127477, 127486], &[127478, 127462], &[127479, 127466], &[127479, 127476], &[127479, 127480], &[127479, 127482], &[127479, 127484], &[127480, 127462], &[127480, 127463], &[127480, 127464], &[127480, 127465], &[127480, 127466], &[127480, 127468], &[127480, 127469], &[127480, 127470], &[127480, 127471], &[127480, 127472], &[127480, 127473], &[127480, 127474], &[127480, 127475], &[127480, 127476], &[127480, 127479], &[127480, 127480], &[127480, 127481], &[127480, 127483], &[127480, 127485], &[127480, 127486], &[127480, 127487], &[127481, 127462], &[127481, 127464], &[127481, 127465], &[127481, 127467], &[127481, 127468], &[127481, 127469], &[127481, 127471], &[127481, 127472], &[127481, 127473], &[127481, 127474], &[127481, 127475], &[127481, 127476], &[127481, 127479], &[127481, 127481], &[127481, 127483], &[127481, 127484], &[127481, 127487], &[127482, 127462], &[127482, 127468], &[127482, 127474], &[127482, 127475], &[127482, 127480], &[127482, 127486], &[127482, 127487], &[127483, 127462], &[127483, 127464], &[127483, 127466], &[127483, 127468], &[127483, 127470], &[127483, 127475], &[127483, 127482], &[127484, 127467], &[127484, 127480], &[127485, 127472], &[127486, 127466], &[127486, 127481], &[127487, 127462], &[127487, 127474], &[127487, 127484], ]; /// Return the code point ranges of the 'RGI_Emoji_Flag_Sequence' Unicode property. pub(crate) fn rgi_emoji_flag_sequence_sets() -> &'static [&'static [u32]] { RGI_EMOJI_FLAG_SEQUENCE.as_slice() } static RGI_EMOJI_MODIFIER_SEQUENCE: &[&[u32]; 655] = &[ &[9757, 127995], &[9757, 127996], &[9757, 127997], &[9757, 127998], &[9757, 127999], &[9977, 127995], &[9977, 127996], &[9977, 127997], &[9977, 127998], &[9977, 127999], &[9994, 127995], &[9994, 127996], &[9994, 127997], &[9994, 127998], &[9994, 127999], &[9995, 127995], &[9995, 127996], &[9995, 127997], &[9995, 127998], &[9995, 127999], &[9996, 127995], &[9996, 127996], &[9996, 127997], &[9996, 127998], &[9996, 127999], &[9997, 127995], &[9997, 127996], &[9997, 127997], &[9997, 127998], &[9997, 127999], &[127877, 127995], &[127877, 127996], &[127877, 127997], &[127877, 127998], &[127877, 127999], &[127938, 127995], &[127938, 127996], &[127938, 127997], &[127938, 127998], &[127938, 127999], &[127939, 127995], &[127939, 127996], &[127939, 127997], &[127939, 127998], &[127939, 127999], &[127940, 127995], &[127940, 127996], &[127940, 127997], &[127940, 127998], &[127940, 127999], &[127943, 127995], &[127943, 127996], &[127943, 127997], &[127943, 127998], &[127943, 127999], &[127946, 127995], &[127946, 127996], &[127946, 127997], &[127946, 127998], &[127946, 127999], &[127947, 127995], &[127947, 127996], &[127947, 127997], &[127947, 127998], &[127947, 127999], &[127948, 127995], &[127948, 127996], &[127948, 127997], &[127948, 127998], &[127948, 127999], &[128066, 127995], &[128066, 127996], &[128066, 127997], &[128066, 127998], &[128066, 127999], &[128067, 127995], &[128067, 127996], &[128067, 127997], &[128067, 127998], &[128067, 127999], &[128070, 127995], &[128070, 127996], &[128070, 127997], &[128070, 127998], &[128070, 127999], &[128071, 127995], &[128071, 127996], &[128071, 127997], &[128071, 127998], &[128071, 127999], &[128072, 127995], &[128072, 127996], &[128072, 127997], &[128072, 127998], &[128072, 127999], &[128073, 127995], &[128073, 127996], &[128073, 127997], &[128073, 127998], &[128073, 127999], &[128074, 127995], &[128074, 127996], &[128074, 127997], &[128074, 127998], &[128074, 127999], &[128075, 127995], &[128075, 127996], &[128075, 127997], &[128075, 127998], &[128075, 127999], &[128076, 127995], &[128076, 127996], &[128076, 127997], &[128076, 127998], &[128076, 127999], &[128077, 127995], &[128077, 127996], &[128077, 127997], &[128077, 127998], &[128077, 127999], &[128078, 127995], &[128078, 127996], &[128078, 127997], &[128078, 127998], &[128078, 127999], &[128079, 127995], &[128079, 127996], &[128079, 127997], &[128079, 127998], &[128079, 127999], &[128080, 127995], &[128080, 127996], &[128080, 127997], &[128080, 127998], &[128080, 127999], &[128102, 127995], &[128102, 127996], &[128102, 127997], &[128102, 127998], &[128102, 127999], &[128103, 127995], &[128103, 127996], &[128103, 127997], &[128103, 127998], &[128103, 127999], &[128104, 127995], &[128104, 127996], &[128104, 127997], &[128104, 127998], &[128104, 127999], &[128105, 127995], &[128105, 127996], &[128105, 127997], &[128105, 127998], &[128105, 127999], &[128107, 127995], &[128107, 127996], &[128107, 127997], &[128107, 127998], &[128107, 127999], &[128108, 127995], &[128108, 127996], &[128108, 127997], &[128108, 127998], &[128108, 127999], &[128109, 127995], &[128109, 127996], &[128109, 127997], &[128109, 127998], &[128109, 127999], &[128110, 127995], &[128110, 127996], &[128110, 127997], &[128110, 127998], &[128110, 127999], &[128112, 127995], &[128112, 127996], &[128112, 127997], &[128112, 127998], &[128112, 127999], &[128113, 127995], &[128113, 127996], &[128113, 127997], &[128113, 127998], &[128113, 127999], &[128114, 127995], &[128114, 127996], &[128114, 127997], &[128114, 127998], &[128114, 127999], &[128115, 127995], &[128115, 127996], &[128115, 127997], &[128115, 127998], &[128115, 127999], &[128116, 127995], &[128116, 127996], &[128116, 127997], &[128116, 127998], &[128116, 127999], &[128117, 127995], &[128117, 127996], &[128117, 127997], &[128117, 127998], &[128117, 127999], &[128118, 127995], &[128118, 127996], &[128118, 127997], &[128118, 127998], &[128118, 127999], &[128119, 127995], &[128119, 127996], &[128119, 127997], &[128119, 127998], &[128119, 127999], &[128120, 127995], &[128120, 127996], &[128120, 127997], &[128120, 127998], &[128120, 127999], &[128124, 127995], &[128124, 127996], &[128124, 127997], &[128124, 127998], &[128124, 127999], &[128129, 127995], &[128129, 127996], &[128129, 127997], &[128129, 127998], &[128129, 127999], &[128130, 127995], &[128130, 127996], &[128130, 127997], &[128130, 127998], &[128130, 127999], &[128131, 127995], &[128131, 127996], &[128131, 127997], &[128131, 127998], &[128131, 127999], &[128133, 127995], &[128133, 127996], &[128133, 127997], &[128133, 127998], &[128133, 127999], &[128134, 127995], &[128134, 127996], &[128134, 127997], &[128134, 127998], &[128134, 127999], &[128135, 127995], &[128135, 127996], &[128135, 127997], &[128135, 127998], &[128135, 127999], &[128143, 127995], &[128143, 127996], &[128143, 127997], &[128143, 127998], &[128143, 127999], &[128145, 127995], &[128145, 127996], &[128145, 127997], &[128145, 127998], &[128145, 127999], &[128170, 127995], &[128170, 127996], &[128170, 127997], &[128170, 127998], &[128170, 127999], &[128372, 127995], &[128372, 127996], &[128372, 127997], &[128372, 127998], &[128372, 127999], &[128373, 127995], &[128373, 127996], &[128373, 127997], &[128373, 127998], &[128373, 127999], &[128378, 127995], &[128378, 127996], &[128378, 127997], &[128378, 127998], &[128378, 127999], &[128400, 127995], &[128400, 127996], &[128400, 127997], &[128400, 127998], &[128400, 127999], &[128405, 127995], &[128405, 127996], &[128405, 127997], &[128405, 127998], &[128405, 127999], &[128406, 127995], &[128406, 127996], &[128406, 127997], &[128406, 127998], &[128406, 127999], &[128581, 127995], &[128581, 127996], &[128581, 127997], &[128581, 127998], &[128581, 127999], &[128582, 127995], &[128582, 127996], &[128582, 127997], &[128582, 127998], &[128582, 127999], &[128583, 127995], &[128583, 127996], &[128583, 127997], &[128583, 127998], &[128583, 127999], &[128587, 127995], &[128587, 127996], &[128587, 127997], &[128587, 127998], &[128587, 127999], &[128588, 127995], &[128588, 127996], &[128588, 127997], &[128588, 127998], &[128588, 127999], &[128589, 127995], &[128589, 127996], &[128589, 127997], &[128589, 127998], &[128589, 127999], &[128590, 127995], &[128590, 127996], &[128590, 127997], &[128590, 127998], &[128590, 127999], &[128591, 127995], &[128591, 127996], &[128591, 127997], &[128591, 127998], &[128591, 127999], &[128675, 127995], &[128675, 127996], &[128675, 127997], &[128675, 127998], &[128675, 127999], &[128692, 127995], &[128692, 127996], &[128692, 127997], &[128692, 127998], &[128692, 127999], &[128693, 127995], &[128693, 127996], &[128693, 127997], &[128693, 127998], &[128693, 127999], &[128694, 127995], &[128694, 127996], &[128694, 127997], &[128694, 127998], &[128694, 127999], &[128704, 127995], &[128704, 127996], &[128704, 127997], &[128704, 127998], &[128704, 127999], &[128716, 127995], &[128716, 127996], &[128716, 127997], &[128716, 127998], &[128716, 127999], &[129292, 127995], &[129292, 127996], &[129292, 127997], &[129292, 127998], &[129292, 127999], &[129295, 127995], &[129295, 127996], &[129295, 127997], &[129295, 127998], &[129295, 127999], &[129304, 127995], &[129304, 127996], &[129304, 127997], &[129304, 127998], &[129304, 127999], &[129305, 127995], &[129305, 127996], &[129305, 127997], &[129305, 127998], &[129305, 127999], &[129306, 127995], &[129306, 127996], &[129306, 127997], &[129306, 127998], &[129306, 127999], &[129307, 127995], &[129307, 127996], &[129307, 127997], &[129307, 127998], &[129307, 127999], &[129308, 127995], &[129308, 127996], &[129308, 127997], &[129308, 127998], &[129308, 127999], &[129309, 127995], &[129309, 127996], &[129309, 127997], &[129309, 127998], &[129309, 127999], &[129310, 127995], &[129310, 127996], &[129310, 127997], &[129310, 127998], &[129310, 127999], &[129311, 127995], &[129311, 127996], &[129311, 127997], &[129311, 127998], &[129311, 127999], &[129318, 127995], &[129318, 127996], &[129318, 127997], &[129318, 127998], &[129318, 127999], &[129328, 127995], &[129328, 127996], &[129328, 127997], &[129328, 127998], &[129328, 127999], &[129329, 127995], &[129329, 127996], &[129329, 127997], &[129329, 127998], &[129329, 127999], &[129330, 127995], &[129330, 127996], &[129330, 127997], &[129330, 127998], &[129330, 127999], &[129331, 127995], &[129331, 127996], &[129331, 127997], &[129331, 127998], &[129331, 127999], &[129332, 127995], &[129332, 127996], &[129332, 127997], &[129332, 127998], &[129332, 127999], &[129333, 127995], &[129333, 127996], &[129333, 127997], &[129333, 127998], &[129333, 127999], &[129334, 127995], &[129334, 127996], &[129334, 127997], &[129334, 127998], &[129334, 127999], &[129335, 127995], &[129335, 127996], &[129335, 127997], &[129335, 127998], &[129335, 127999], &[129336, 127995], &[129336, 127996], &[129336, 127997], &[129336, 127998], &[129336, 127999], &[129337, 127995], &[129337, 127996], &[129337, 127997], &[129337, 127998], &[129337, 127999], &[129341, 127995], &[129341, 127996], &[129341, 127997], &[129341, 127998], &[129341, 127999], &[129342, 127995], &[129342, 127996], &[129342, 127997], &[129342, 127998], &[129342, 127999], &[129399, 127995], &[129399, 127996], &[129399, 127997], &[129399, 127998], &[129399, 127999], &[129461, 127995], &[129461, 127996], &[129461, 127997], &[129461, 127998], &[129461, 127999], &[129462, 127995], &[129462, 127996], &[129462, 127997], &[129462, 127998], &[129462, 127999], &[129464, 127995], &[129464, 127996], &[129464, 127997], &[129464, 127998], &[129464, 127999], &[129465, 127995], &[129465, 127996], &[129465, 127997], &[129465, 127998], &[129465, 127999], &[129467, 127995], &[129467, 127996], &[129467, 127997], &[129467, 127998], &[129467, 127999], &[129485, 127995], &[129485, 127996], &[129485, 127997], &[129485, 127998], &[129485, 127999], &[129486, 127995], &[129486, 127996], &[129486, 127997], &[129486, 127998], &[129486, 127999], &[129487, 127995], &[129487, 127996], &[129487, 127997], &[129487, 127998], &[129487, 127999], &[129489, 127995], &[129489, 127996], &[129489, 127997], &[129489, 127998], &[129489, 127999], &[129490, 127995], &[129490, 127996], &[129490, 127997], &[129490, 127998], &[129490, 127999], &[129491, 127995], &[129491, 127996], &[129491, 127997], &[129491, 127998], &[129491, 127999], &[129492, 127995], &[129492, 127996], &[129492, 127997], &[129492, 127998], &[129492, 127999], &[129493, 127995], &[129493, 127996], &[129493, 127997], &[129493, 127998], &[129493, 127999], &[129494, 127995], &[129494, 127996], &[129494, 127997], &[129494, 127998], &[129494, 127999], &[129495, 127995], &[129495, 127996], &[129495, 127997], &[129495, 127998], &[129495, 127999], &[129496, 127995], &[129496, 127996], &[129496, 127997], &[129496, 127998], &[129496, 127999], &[129497, 127995], &[129497, 127996], &[129497, 127997], &[129497, 127998], &[129497, 127999], &[129498, 127995], &[129498, 127996], &[129498, 127997], &[129498, 127998], &[129498, 127999], &[129499, 127995], &[129499, 127996], &[129499, 127997], &[129499, 127998], &[129499, 127999], &[129500, 127995], &[129500, 127996], &[129500, 127997], &[129500, 127998], &[129500, 127999], &[129501, 127995], &[129501, 127996], &[129501, 127997], &[129501, 127998], &[129501, 127999], &[129731, 127995], &[129731, 127996], &[129731, 127997], &[129731, 127998], &[129731, 127999], &[129732, 127995], &[129732, 127996], &[129732, 127997], &[129732, 127998], &[129732, 127999], &[129733, 127995], &[129733, 127996], &[129733, 127997], &[129733, 127998], &[129733, 127999], &[129776, 127995], &[129776, 127996], &[129776, 127997], &[129776, 127998], &[129776, 127999], &[129777, 127995], &[129777, 127996], &[129777, 127997], &[129777, 127998], &[129777, 127999], &[129778, 127995], &[129778, 127996], &[129778, 127997], &[129778, 127998], &[129778, 127999], &[129779, 127995], &[129779, 127996], &[129779, 127997], &[129779, 127998], &[129779, 127999], &[129780, 127995], &[129780, 127996], &[129780, 127997], &[129780, 127998], &[129780, 127999], &[129781, 127995], &[129781, 127996], &[129781, 127997], &[129781, 127998], &[129781, 127999], &[129782, 127995], &[129782, 127996], &[129782, 127997], &[129782, 127998], &[129782, 127999], &[129783, 127995], &[129783, 127996], &[129783, 127997], &[129783, 127998], &[129783, 127999], &[129784, 127995], &[129784, 127996], &[129784, 127997], &[129784, 127998], &[129784, 127999], ]; /// Return the code point ranges of the 'RGI_Emoji_Modifier_Sequence' Unicode property. pub(crate) fn rgi_emoji_modifier_sequence_sets() -> &'static [&'static [u32]] { RGI_EMOJI_MODIFIER_SEQUENCE.as_slice() } static RGI_EMOJI_TAG_SEQUENCE: &[&[u32]; 3] = &[ &[127988, 917607, 917602, 917605, 917614, 917607, 917631], &[127988, 917607, 917602, 917619, 917603, 917620, 917631], &[127988, 917607, 917602, 917623, 917612, 917619, 917631], ]; /// Return the code point ranges of the 'RGI_Emoji_Tag_Sequence' Unicode property. pub(crate) fn rgi_emoji_tag_sequence_sets() -> &'static [&'static [u32]] { RGI_EMOJI_TAG_SEQUENCE.as_slice() } static RGI_EMOJI_ZWJ_SEQUENCE: &[&[u32]; 1468] = &[ &[128104, 8205, 10084, 65039, 8205, 128104], &[128104, 8205, 10084, 65039, 8205, 128139, 8205, 128104], &[128104, 8205, 128102], &[128104, 8205, 128102, 8205, 128102], &[128104, 8205, 128103], &[128104, 8205, 128103, 8205, 128102], &[128104, 8205, 128103, 8205, 128103], &[128104, 8205, 128104, 8205, 128102], &[128104, 8205, 128104, 8205, 128102, 8205, 128102], &[128104, 8205, 128104, 8205, 128103], &[128104, 8205, 128104, 8205, 128103, 8205, 128102], &[128104, 8205, 128104, 8205, 128103, 8205, 128103], &[128104, 8205, 128105, 8205, 128102], &[128104, 8205, 128105, 8205, 128102, 8205, 128102], &[128104, 8205, 128105, 8205, 128103], &[128104, 8205, 128105, 8205, 128103, 8205, 128102], &[128104, 8205, 128105, 8205, 128103, 8205, 128103], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127995, 8205, 129309, 8205, 128104, 127996], &[128104, 127995, 8205, 129309, 8205, 128104, 127997], &[128104, 127995, 8205, 129309, 8205, 128104, 127998], &[128104, 127995, 8205, 129309, 8205, 128104, 127999], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127996, 8205, 129309, 8205, 128104, 127995], &[128104, 127996, 8205, 129309, 8205, 128104, 127997], &[128104, 127996, 8205, 129309, 8205, 128104, 127998], &[128104, 127996, 8205, 129309, 8205, 128104, 127999], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127997, 8205, 129309, 8205, 128104, 127995], &[128104, 127997, 8205, 129309, 8205, 128104, 127996], &[128104, 127997, 8205, 129309, 8205, 128104, 127998], &[128104, 127997, 8205, 129309, 8205, 128104, 127999], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127998, 8205, 129309, 8205, 128104, 127995], &[128104, 127998, 8205, 129309, 8205, 128104, 127996], &[128104, 127998, 8205, 129309, 8205, 128104, 127997], &[128104, 127998, 8205, 129309, 8205, 128104, 127999], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127999, 8205, 129309, 8205, 128104, 127995], &[128104, 127999, 8205, 129309, 8205, 128104, 127996], &[128104, 127999, 8205, 129309, 8205, 128104, 127997], &[128104, 127999, 8205, 129309, 8205, 128104, 127998], &[128105, 8205, 10084, 65039, 8205, 128104], &[128105, 8205, 10084, 65039, 8205, 128105], &[128105, 8205, 10084, 65039, 8205, 128139, 8205, 128104], &[128105, 8205, 10084, 65039, 8205, 128139, 8205, 128105], &[128105, 8205, 128102], &[128105, 8205, 128102, 8205, 128102], &[128105, 8205, 128103], &[128105, 8205, 128103, 8205, 128102], &[128105, 8205, 128103, 8205, 128103], &[128105, 8205, 128105, 8205, 128102], &[128105, 8205, 128105, 8205, 128102, 8205, 128102], &[128105, 8205, 128105, 8205, 128103], &[128105, 8205, 128105, 8205, 128103, 8205, 128102], &[128105, 8205, 128105, 8205, 128103, 8205, 128103], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127995, 8205, 129309, 8205, 128104, 127996], &[128105, 127995, 8205, 129309, 8205, 128104, 127997], &[128105, 127995, 8205, 129309, 8205, 128104, 127998], &[128105, 127995, 8205, 129309, 8205, 128104, 127999], &[128105, 127995, 8205, 129309, 8205, 128105, 127996], &[128105, 127995, 8205, 129309, 8205, 128105, 127997], &[128105, 127995, 8205, 129309, 8205, 128105, 127998], &[128105, 127995, 8205, 129309, 8205, 128105, 127999], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127996, 8205, 129309, 8205, 128104, 127995], &[128105, 127996, 8205, 129309, 8205, 128104, 127997], &[128105, 127996, 8205, 129309, 8205, 128104, 127998], &[128105, 127996, 8205, 129309, 8205, 128104, 127999], &[128105, 127996, 8205, 129309, 8205, 128105, 127995], &[128105, 127996, 8205, 129309, 8205, 128105, 127997], &[128105, 127996, 8205, 129309, 8205, 128105, 127998], &[128105, 127996, 8205, 129309, 8205, 128105, 127999], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127997, 8205, 129309, 8205, 128104, 127995], &[128105, 127997, 8205, 129309, 8205, 128104, 127996], &[128105, 127997, 8205, 129309, 8205, 128104, 127998], &[128105, 127997, 8205, 129309, 8205, 128104, 127999], &[128105, 127997, 8205, 129309, 8205, 128105, 127995], &[128105, 127997, 8205, 129309, 8205, 128105, 127996], &[128105, 127997, 8205, 129309, 8205, 128105, 127998], &[128105, 127997, 8205, 129309, 8205, 128105, 127999], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127998, 8205, 129309, 8205, 128104, 127995], &[128105, 127998, 8205, 129309, 8205, 128104, 127996], &[128105, 127998, 8205, 129309, 8205, 128104, 127997], &[128105, 127998, 8205, 129309, 8205, 128104, 127999], &[128105, 127998, 8205, 129309, 8205, 128105, 127995], &[128105, 127998, 8205, 129309, 8205, 128105, 127996], &[128105, 127998, 8205, 129309, 8205, 128105, 127997], &[128105, 127998, 8205, 129309, 8205, 128105, 127999], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127999, 8205, 129309, 8205, 128104, 127995], &[128105, 127999, 8205, 129309, 8205, 128104, 127996], &[128105, 127999, 8205, 129309, 8205, 128104, 127997], &[128105, 127999, 8205, 129309, 8205, 128104, 127998], &[128105, 127999, 8205, 129309, 8205, 128105, 127995], &[128105, 127999, 8205, 129309, 8205, 128105, 127996], &[128105, 127999, 8205, 129309, 8205, 128105, 127997], &[128105, 127999, 8205, 129309, 8205, 128105, 127998], &[129489, 8205, 129309, 8205, 129489], &[129489, 8205, 129489, 8205, 129490], &[129489, 8205, 129489, 8205, 129490, 8205, 129490], &[129489, 8205, 129490], &[129489, 8205, 129490, 8205, 129490], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127995, 8205, 129309, 8205, 129489, 127995], &[129489, 127995, 8205, 129309, 8205, 129489, 127996], &[129489, 127995, 8205, 129309, 8205, 129489, 127997], &[129489, 127995, 8205, 129309, 8205, 129489, 127998], &[129489, 127995, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127996, 8205, 129309, 8205, 129489, 127995], &[129489, 127996, 8205, 129309, 8205, 129489, 127996], &[129489, 127996, 8205, 129309, 8205, 129489, 127997], &[129489, 127996, 8205, 129309, 8205, 129489, 127998], &[129489, 127996, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127997, 8205, 129309, 8205, 129489, 127995], &[129489, 127997, 8205, 129309, 8205, 129489, 127996], &[129489, 127997, 8205, 129309, 8205, 129489, 127997], &[129489, 127997, 8205, 129309, 8205, 129489, 127998], &[129489, 127997, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127998, 8205, 129309, 8205, 129489, 127995], &[129489, 127998, 8205, 129309, 8205, 129489, 127996], &[129489, 127998, 8205, 129309, 8205, 129489, 127997], &[129489, 127998, 8205, 129309, 8205, 129489, 127998], &[129489, 127998, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127999, 8205, 129309, 8205, 129489, 127995], &[129489, 127999, 8205, 129309, 8205, 129489, 127996], &[129489, 127999, 8205, 129309, 8205, 129489, 127997], &[129489, 127999, 8205, 129309, 8205, 129489, 127998], &[129489, 127999, 8205, 129309, 8205, 129489, 127999], &[129777, 127995, 8205, 129778, 127996], &[129777, 127995, 8205, 129778, 127997], &[129777, 127995, 8205, 129778, 127998], &[129777, 127995, 8205, 129778, 127999], &[129777, 127996, 8205, 129778, 127995], &[129777, 127996, 8205, 129778, 127997], &[129777, 127996, 8205, 129778, 127998], &[129777, 127996, 8205, 129778, 127999], &[129777, 127997, 8205, 129778, 127995], &[129777, 127997, 8205, 129778, 127996], &[129777, 127997, 8205, 129778, 127998], &[129777, 127997, 8205, 129778, 127999], &[129777, 127998, 8205, 129778, 127995], &[129777, 127998, 8205, 129778, 127996], &[129777, 127998, 8205, 129778, 127997], &[129777, 127998, 8205, 129778, 127999], &[129777, 127999, 8205, 129778, 127995], &[129777, 127999, 8205, 129778, 127996], &[129777, 127999, 8205, 129778, 127997], &[129777, 127999, 8205, 129778, 127998], &[127939, 8205, 10145, 65039], &[127939, 127995, 8205, 10145, 65039], &[127939, 127996, 8205, 10145, 65039], &[127939, 127997, 8205, 10145, 65039], &[127939, 127998, 8205, 10145, 65039], &[127939, 127999, 8205, 10145, 65039], &[128104, 8205, 9877, 65039], &[128104, 8205, 9878, 65039], &[128104, 8205, 9992, 65039], &[128104, 8205, 127806], &[128104, 8205, 127859], &[128104, 8205, 127868], &[128104, 8205, 127891], &[128104, 8205, 127908], &[128104, 8205, 127912], &[128104, 8205, 127979], &[128104, 8205, 127981], &[128104, 8205, 128187], &[128104, 8205, 128188], &[128104, 8205, 128295], &[128104, 8205, 128300], &[128104, 8205, 128640], &[128104, 8205, 128658], &[128104, 8205, 129455], &[128104, 8205, 129455, 8205, 10145, 65039], &[128104, 8205, 129468], &[128104, 8205, 129468, 8205, 10145, 65039], &[128104, 8205, 129469], &[128104, 8205, 129469, 8205, 10145, 65039], &[128104, 127995, 8205, 9877, 65039], &[128104, 127995, 8205, 9878, 65039], &[128104, 127995, 8205, 9992, 65039], &[128104, 127995, 8205, 127806], &[128104, 127995, 8205, 127859], &[128104, 127995, 8205, 127868], &[128104, 127995, 8205, 127891], &[128104, 127995, 8205, 127908], &[128104, 127995, 8205, 127912], &[128104, 127995, 8205, 127979], &[128104, 127995, 8205, 127981], &[128104, 127995, 8205, 128187], &[128104, 127995, 8205, 128188], &[128104, 127995, 8205, 128295], &[128104, 127995, 8205, 128300], &[128104, 127995, 8205, 128640], &[128104, 127995, 8205, 128658], &[128104, 127995, 8205, 129455], &[128104, 127995, 8205, 129455, 8205, 10145, 65039], &[128104, 127995, 8205, 129468], &[128104, 127995, 8205, 129468, 8205, 10145, 65039], &[128104, 127995, 8205, 129469], &[128104, 127995, 8205, 129469, 8205, 10145, 65039], &[128104, 127996, 8205, 9877, 65039], &[128104, 127996, 8205, 9878, 65039], &[128104, 127996, 8205, 9992, 65039], &[128104, 127996, 8205, 127806], &[128104, 127996, 8205, 127859], &[128104, 127996, 8205, 127868], &[128104, 127996, 8205, 127891], &[128104, 127996, 8205, 127908], &[128104, 127996, 8205, 127912], &[128104, 127996, 8205, 127979], &[128104, 127996, 8205, 127981], &[128104, 127996, 8205, 128187], &[128104, 127996, 8205, 128188], &[128104, 127996, 8205, 128295], &[128104, 127996, 8205, 128300], &[128104, 127996, 8205, 128640], &[128104, 127996, 8205, 128658], &[128104, 127996, 8205, 129455], &[128104, 127996, 8205, 129455, 8205, 10145, 65039], &[128104, 127996, 8205, 129468], &[128104, 127996, 8205, 129468, 8205, 10145, 65039], &[128104, 127996, 8205, 129469], &[128104, 127996, 8205, 129469, 8205, 10145, 65039], &[128104, 127997, 8205, 9877, 65039], &[128104, 127997, 8205, 9878, 65039], &[128104, 127997, 8205, 9992, 65039], &[128104, 127997, 8205, 127806], &[128104, 127997, 8205, 127859], &[128104, 127997, 8205, 127868], &[128104, 127997, 8205, 127891], &[128104, 127997, 8205, 127908], &[128104, 127997, 8205, 127912], &[128104, 127997, 8205, 127979], &[128104, 127997, 8205, 127981], &[128104, 127997, 8205, 128187], &[128104, 127997, 8205, 128188], &[128104, 127997, 8205, 128295], &[128104, 127997, 8205, 128300], &[128104, 127997, 8205, 128640], &[128104, 127997, 8205, 128658], &[128104, 127997, 8205, 129455], &[128104, 127997, 8205, 129455, 8205, 10145, 65039], &[128104, 127997, 8205, 129468], &[128104, 127997, 8205, 129468, 8205, 10145, 65039], &[128104, 127997, 8205, 129469], &[128104, 127997, 8205, 129469, 8205, 10145, 65039], &[128104, 127998, 8205, 9877, 65039], &[128104, 127998, 8205, 9878, 65039], &[128104, 127998, 8205, 9992, 65039], &[128104, 127998, 8205, 127806], &[128104, 127998, 8205, 127859], &[128104, 127998, 8205, 127868], &[128104, 127998, 8205, 127891], &[128104, 127998, 8205, 127908], &[128104, 127998, 8205, 127912], &[128104, 127998, 8205, 127979], &[128104, 127998, 8205, 127981], &[128104, 127998, 8205, 128187], &[128104, 127998, 8205, 128188], &[128104, 127998, 8205, 128295], &[128104, 127998, 8205, 128300], &[128104, 127998, 8205, 128640], &[128104, 127998, 8205, 128658], &[128104, 127998, 8205, 129455], &[128104, 127998, 8205, 129455, 8205, 10145, 65039], &[128104, 127998, 8205, 129468], &[128104, 127998, 8205, 129468, 8205, 10145, 65039], &[128104, 127998, 8205, 129469], &[128104, 127998, 8205, 129469, 8205, 10145, 65039], &[128104, 127999, 8205, 9877, 65039], &[128104, 127999, 8205, 9878, 65039], &[128104, 127999, 8205, 9992, 65039], &[128104, 127999, 8205, 127806], &[128104, 127999, 8205, 127859], &[128104, 127999, 8205, 127868], &[128104, 127999, 8205, 127891], &[128104, 127999, 8205, 127908], &[128104, 127999, 8205, 127912], &[128104, 127999, 8205, 127979], &[128104, 127999, 8205, 127981], &[128104, 127999, 8205, 128187], &[128104, 127999, 8205, 128188], &[128104, 127999, 8205, 128295], &[128104, 127999, 8205, 128300], &[128104, 127999, 8205, 128640], &[128104, 127999, 8205, 128658], &[128104, 127999, 8205, 129455], &[128104, 127999, 8205, 129455, 8205, 10145, 65039], &[128104, 127999, 8205, 129468], &[128104, 127999, 8205, 129468, 8205, 10145, 65039], &[128104, 127999, 8205, 129469], &[128104, 127999, 8205, 129469, 8205, 10145, 65039], &[128105, 8205, 9877, 65039], &[128105, 8205, 9878, 65039], &[128105, 8205, 9992, 65039], &[128105, 8205, 127806], &[128105, 8205, 127859], &[128105, 8205, 127868], &[128105, 8205, 127891], &[128105, 8205, 127908], &[128105, 8205, 127912], &[128105, 8205, 127979], &[128105, 8205, 127981], &[128105, 8205, 128187], &[128105, 8205, 128188], &[128105, 8205, 128295], &[128105, 8205, 128300], &[128105, 8205, 128640], &[128105, 8205, 128658], &[128105, 8205, 129455], &[128105, 8205, 129455, 8205, 10145, 65039], &[128105, 8205, 129468], &[128105, 8205, 129468, 8205, 10145, 65039], &[128105, 8205, 129469], &[128105, 8205, 129469, 8205, 10145, 65039], &[128105, 127995, 8205, 9877, 65039], &[128105, 127995, 8205, 9878, 65039], &[128105, 127995, 8205, 9992, 65039], &[128105, 127995, 8205, 127806], &[128105, 127995, 8205, 127859], &[128105, 127995, 8205, 127868], &[128105, 127995, 8205, 127891], &[128105, 127995, 8205, 127908], &[128105, 127995, 8205, 127912], &[128105, 127995, 8205, 127979], &[128105, 127995, 8205, 127981], &[128105, 127995, 8205, 128187], &[128105, 127995, 8205, 128188], &[128105, 127995, 8205, 128295], &[128105, 127995, 8205, 128300], &[128105, 127995, 8205, 128640], &[128105, 127995, 8205, 128658], &[128105, 127995, 8205, 129455], &[128105, 127995, 8205, 129455, 8205, 10145, 65039], &[128105, 127995, 8205, 129468], &[128105, 127995, 8205, 129468, 8205, 10145, 65039], &[128105, 127995, 8205, 129469], &[128105, 127995, 8205, 129469, 8205, 10145, 65039], &[128105, 127996, 8205, 9877, 65039], &[128105, 127996, 8205, 9878, 65039], &[128105, 127996, 8205, 9992, 65039], &[128105, 127996, 8205, 127806], &[128105, 127996, 8205, 127859], &[128105, 127996, 8205, 127868], &[128105, 127996, 8205, 127891], &[128105, 127996, 8205, 127908], &[128105, 127996, 8205, 127912], &[128105, 127996, 8205, 127979], &[128105, 127996, 8205, 127981], &[128105, 127996, 8205, 128187], &[128105, 127996, 8205, 128188], &[128105, 127996, 8205, 128295], &[128105, 127996, 8205, 128300], &[128105, 127996, 8205, 128640], &[128105, 127996, 8205, 128658], &[128105, 127996, 8205, 129455], &[128105, 127996, 8205, 129455, 8205, 10145, 65039], &[128105, 127996, 8205, 129468], &[128105, 127996, 8205, 129468, 8205, 10145, 65039], &[128105, 127996, 8205, 129469], &[128105, 127996, 8205, 129469, 8205, 10145, 65039], &[128105, 127997, 8205, 9877, 65039], &[128105, 127997, 8205, 9878, 65039], &[128105, 127997, 8205, 9992, 65039], &[128105, 127997, 8205, 127806], &[128105, 127997, 8205, 127859], &[128105, 127997, 8205, 127868], &[128105, 127997, 8205, 127891], &[128105, 127997, 8205, 127908], &[128105, 127997, 8205, 127912], &[128105, 127997, 8205, 127979], &[128105, 127997, 8205, 127981], &[128105, 127997, 8205, 128187], &[128105, 127997, 8205, 128188], &[128105, 127997, 8205, 128295], &[128105, 127997, 8205, 128300], &[128105, 127997, 8205, 128640], &[128105, 127997, 8205, 128658], &[128105, 127997, 8205, 129455], &[128105, 127997, 8205, 129455, 8205, 10145, 65039], &[128105, 127997, 8205, 129468], &[128105, 127997, 8205, 129468, 8205, 10145, 65039], &[128105, 127997, 8205, 129469], &[128105, 127997, 8205, 129469, 8205, 10145, 65039], &[128105, 127998, 8205, 9877, 65039], &[128105, 127998, 8205, 9878, 65039], &[128105, 127998, 8205, 9992, 65039], &[128105, 127998, 8205, 127806], &[128105, 127998, 8205, 127859], &[128105, 127998, 8205, 127868], &[128105, 127998, 8205, 127891], &[128105, 127998, 8205, 127908], &[128105, 127998, 8205, 127912], &[128105, 127998, 8205, 127979], &[128105, 127998, 8205, 127981], &[128105, 127998, 8205, 128187], &[128105, 127998, 8205, 128188], &[128105, 127998, 8205, 128295], &[128105, 127998, 8205, 128300], &[128105, 127998, 8205, 128640], &[128105, 127998, 8205, 128658], &[128105, 127998, 8205, 129455], &[128105, 127998, 8205, 129455, 8205, 10145, 65039], &[128105, 127998, 8205, 129468], &[128105, 127998, 8205, 129468, 8205, 10145, 65039], &[128105, 127998, 8205, 129469], &[128105, 127998, 8205, 129469, 8205, 10145, 65039], &[128105, 127999, 8205, 9877, 65039], &[128105, 127999, 8205, 9878, 65039], &[128105, 127999, 8205, 9992, 65039], &[128105, 127999, 8205, 127806], &[128105, 127999, 8205, 127859], &[128105, 127999, 8205, 127868], &[128105, 127999, 8205, 127891], &[128105, 127999, 8205, 127908], &[128105, 127999, 8205, 127912], &[128105, 127999, 8205, 127979], &[128105, 127999, 8205, 127981], &[128105, 127999, 8205, 128187], &[128105, 127999, 8205, 128188], &[128105, 127999, 8205, 128295], &[128105, 127999, 8205, 128300], &[128105, 127999, 8205, 128640], &[128105, 127999, 8205, 128658], &[128105, 127999, 8205, 129455], &[128105, 127999, 8205, 129455, 8205, 10145, 65039], &[128105, 127999, 8205, 129468], &[128105, 127999, 8205, 129468, 8205, 10145, 65039], &[128105, 127999, 8205, 129469], &[128105, 127999, 8205, 129469, 8205, 10145, 65039], &[128694, 8205, 10145, 65039], &[128694, 127995, 8205, 10145, 65039], &[128694, 127996, 8205, 10145, 65039], &[128694, 127997, 8205, 10145, 65039], &[128694, 127998, 8205, 10145, 65039], &[128694, 127999, 8205, 10145, 65039], &[129486, 8205, 10145, 65039], &[129486, 127995, 8205, 10145, 65039], &[129486, 127996, 8205, 10145, 65039], &[129486, 127997, 8205, 10145, 65039], &[129486, 127998, 8205, 10145, 65039], &[129486, 127999, 8205, 10145, 65039], &[129489, 8205, 9877, 65039], &[129489, 8205, 9878, 65039], &[129489, 8205, 9992, 65039], &[129489, 8205, 127806], &[129489, 8205, 127859], &[129489, 8205, 127868], &[129489, 8205, 127876], &[129489, 8205, 127891], &[129489, 8205, 127908], &[129489, 8205, 127912], &[129489, 8205, 127979], &[129489, 8205, 127981], &[129489, 8205, 128187], &[129489, 8205, 128188], &[129489, 8205, 128295], &[129489, 8205, 128300], &[129489, 8205, 128640], &[129489, 8205, 128658], &[129489, 8205, 129455], &[129489, 8205, 129455, 8205, 10145, 65039], &[129489, 8205, 129468], &[129489, 8205, 129468, 8205, 10145, 65039], &[129489, 8205, 129469], &[129489, 8205, 129469, 8205, 10145, 65039], &[129489, 127995, 8205, 9877, 65039], &[129489, 127995, 8205, 9878, 65039], &[129489, 127995, 8205, 9992, 65039], &[129489, 127995, 8205, 127806], &[129489, 127995, 8205, 127859], &[129489, 127995, 8205, 127868], &[129489, 127995, 8205, 127876], &[129489, 127995, 8205, 127891], &[129489, 127995, 8205, 127908], &[129489, 127995, 8205, 127912], &[129489, 127995, 8205, 127979], &[129489, 127995, 8205, 127981], &[129489, 127995, 8205, 128187], &[129489, 127995, 8205, 128188], &[129489, 127995, 8205, 128295], &[129489, 127995, 8205, 128300], &[129489, 127995, 8205, 128640], &[129489, 127995, 8205, 128658], &[129489, 127995, 8205, 129455], &[129489, 127995, 8205, 129455, 8205, 10145, 65039], &[129489, 127995, 8205, 129468], &[129489, 127995, 8205, 129468, 8205, 10145, 65039], &[129489, 127995, 8205, 129469], &[129489, 127995, 8205, 129469, 8205, 10145, 65039], &[129489, 127996, 8205, 9877, 65039], &[129489, 127996, 8205, 9878, 65039], &[129489, 127996, 8205, 9992, 65039], &[129489, 127996, 8205, 127806], &[129489, 127996, 8205, 127859], &[129489, 127996, 8205, 127868], &[129489, 127996, 8205, 127876], &[129489, 127996, 8205, 127891], &[129489, 127996, 8205, 127908], &[129489, 127996, 8205, 127912], &[129489, 127996, 8205, 127979], &[129489, 127996, 8205, 127981], &[129489, 127996, 8205, 128187], &[129489, 127996, 8205, 128188], &[129489, 127996, 8205, 128295], &[129489, 127996, 8205, 128300], &[129489, 127996, 8205, 128640], &[129489, 127996, 8205, 128658], &[129489, 127996, 8205, 129455], &[129489, 127996, 8205, 129455, 8205, 10145, 65039], &[129489, 127996, 8205, 129468], &[129489, 127996, 8205, 129468, 8205, 10145, 65039], &[129489, 127996, 8205, 129469], &[129489, 127996, 8205, 129469, 8205, 10145, 65039], &[129489, 127997, 8205, 9877, 65039], &[129489, 127997, 8205, 9878, 65039], &[129489, 127997, 8205, 9992, 65039], &[129489, 127997, 8205, 127806], &[129489, 127997, 8205, 127859], &[129489, 127997, 8205, 127868], &[129489, 127997, 8205, 127876], &[129489, 127997, 8205, 127891], &[129489, 127997, 8205, 127908], &[129489, 127997, 8205, 127912], &[129489, 127997, 8205, 127979], &[129489, 127997, 8205, 127981], &[129489, 127997, 8205, 128187], &[129489, 127997, 8205, 128188], &[129489, 127997, 8205, 128295], &[129489, 127997, 8205, 128300], &[129489, 127997, 8205, 128640], &[129489, 127997, 8205, 128658], &[129489, 127997, 8205, 129455], &[129489, 127997, 8205, 129455, 8205, 10145, 65039], &[129489, 127997, 8205, 129468], &[129489, 127997, 8205, 129468, 8205, 10145, 65039], &[129489, 127997, 8205, 129469], &[129489, 127997, 8205, 129469, 8205, 10145, 65039], &[129489, 127998, 8205, 9877, 65039], &[129489, 127998, 8205, 9878, 65039], &[129489, 127998, 8205, 9992, 65039], &[129489, 127998, 8205, 127806], &[129489, 127998, 8205, 127859], &[129489, 127998, 8205, 127868], &[129489, 127998, 8205, 127876], &[129489, 127998, 8205, 127891], &[129489, 127998, 8205, 127908], &[129489, 127998, 8205, 127912], &[129489, 127998, 8205, 127979], &[129489, 127998, 8205, 127981], &[129489, 127998, 8205, 128187], &[129489, 127998, 8205, 128188], &[129489, 127998, 8205, 128295], &[129489, 127998, 8205, 128300], &[129489, 127998, 8205, 128640], &[129489, 127998, 8205, 128658], &[129489, 127998, 8205, 129455], &[129489, 127998, 8205, 129455, 8205, 10145, 65039], &[129489, 127998, 8205, 129468], &[129489, 127998, 8205, 129468, 8205, 10145, 65039], &[129489, 127998, 8205, 129469], &[129489, 127998, 8205, 129469, 8205, 10145, 65039], &[129489, 127999, 8205, 9877, 65039], &[129489, 127999, 8205, 9878, 65039], &[129489, 127999, 8205, 9992, 65039], &[129489, 127999, 8205, 127806], &[129489, 127999, 8205, 127859], &[129489, 127999, 8205, 127868], &[129489, 127999, 8205, 127876], &[129489, 127999, 8205, 127891], &[129489, 127999, 8205, 127908], &[129489, 127999, 8205, 127912], &[129489, 127999, 8205, 127979], &[129489, 127999, 8205, 127981], &[129489, 127999, 8205, 128187], &[129489, 127999, 8205, 128188], &[129489, 127999, 8205, 128295], &[129489, 127999, 8205, 128300], &[129489, 127999, 8205, 128640], &[129489, 127999, 8205, 128658], &[129489, 127999, 8205, 129455], &[129489, 127999, 8205, 129455, 8205, 10145, 65039], &[129489, 127999, 8205, 129468], &[129489, 127999, 8205, 129468, 8205, 10145, 65039], &[129489, 127999, 8205, 129469], &[129489, 127999, 8205, 129469, 8205, 10145, 65039], &[9977, 127995, 8205, 9792, 65039], &[9977, 127995, 8205, 9794, 65039], &[9977, 127996, 8205, 9792, 65039], &[9977, 127996, 8205, 9794, 65039], &[9977, 127997, 8205, 9792, 65039], &[9977, 127997, 8205, 9794, 65039], &[9977, 127998, 8205, 9792, 65039], &[9977, 127998, 8205, 9794, 65039], &[9977, 127999, 8205, 9792, 65039], &[9977, 127999, 8205, 9794, 65039], &[9977, 65039, 8205, 9792, 65039], &[9977, 65039, 8205, 9794, 65039], &[127939, 8205, 9792, 65039], &[127939, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 8205, 9794, 65039], &[127939, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127995, 8205, 9792, 65039], &[127939, 127995, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127995, 8205, 9794, 65039], &[127939, 127995, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127996, 8205, 9792, 65039], &[127939, 127996, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127996, 8205, 9794, 65039], &[127939, 127996, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127997, 8205, 9792, 65039], &[127939, 127997, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127997, 8205, 9794, 65039], &[127939, 127997, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127998, 8205, 9792, 65039], &[127939, 127998, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127998, 8205, 9794, 65039], &[127939, 127998, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127999, 8205, 9792, 65039], &[127939, 127999, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127999, 8205, 9794, 65039], &[127939, 127999, 8205, 9794, 65039, 8205, 10145, 65039], &[127940, 8205, 9792, 65039], &[127940, 8205, 9794, 65039], &[127940, 127995, 8205, 9792, 65039], &[127940, 127995, 8205, 9794, 65039], &[127940, 127996, 8205, 9792, 65039], &[127940, 127996, 8205, 9794, 65039], &[127940, 127997, 8205, 9792, 65039], &[127940, 127997, 8205, 9794, 65039], &[127940, 127998, 8205, 9792, 65039], &[127940, 127998, 8205, 9794, 65039], &[127940, 127999, 8205, 9792, 65039], &[127940, 127999, 8205, 9794, 65039], &[127946, 8205, 9792, 65039], &[127946, 8205, 9794, 65039], &[127946, 127995, 8205, 9792, 65039], &[127946, 127995, 8205, 9794, 65039], &[127946, 127996, 8205, 9792, 65039], &[127946, 127996, 8205, 9794, 65039], &[127946, 127997, 8205, 9792, 65039], &[127946, 127997, 8205, 9794, 65039], &[127946, 127998, 8205, 9792, 65039], &[127946, 127998, 8205, 9794, 65039], &[127946, 127999, 8205, 9792, 65039], &[127946, 127999, 8205, 9794, 65039], &[127947, 127995, 8205, 9792, 65039], &[127947, 127995, 8205, 9794, 65039], &[127947, 127996, 8205, 9792, 65039], &[127947, 127996, 8205, 9794, 65039], &[127947, 127997, 8205, 9792, 65039], &[127947, 127997, 8205, 9794, 65039], &[127947, 127998, 8205, 9792, 65039], &[127947, 127998, 8205, 9794, 65039], &[127947, 127999, 8205, 9792, 65039], &[127947, 127999, 8205, 9794, 65039], &[127947, 65039, 8205, 9792, 65039], &[127947, 65039, 8205, 9794, 65039], &[127948, 127995, 8205, 9792, 65039], &[127948, 127995, 8205, 9794, 65039], &[127948, 127996, 8205, 9792, 65039], &[127948, 127996, 8205, 9794, 65039], &[127948, 127997, 8205, 9792, 65039], &[127948, 127997, 8205, 9794, 65039], &[127948, 127998, 8205, 9792, 65039], &[127948, 127998, 8205, 9794, 65039], &[127948, 127999, 8205, 9792, 65039], &[127948, 127999, 8205, 9794, 65039], &[127948, 65039, 8205, 9792, 65039], &[127948, 65039, 8205, 9794, 65039], &[128110, 8205, 9792, 65039], &[128110, 8205, 9794, 65039], &[128110, 127995, 8205, 9792, 65039], &[128110, 127995, 8205, 9794, 65039], &[128110, 127996, 8205, 9792, 65039], &[128110, 127996, 8205, 9794, 65039], &[128110, 127997, 8205, 9792, 65039], &[128110, 127997, 8205, 9794, 65039], &[128110, 127998, 8205, 9792, 65039], &[128110, 127998, 8205, 9794, 65039], &[128110, 127999, 8205, 9792, 65039], &[128110, 127999, 8205, 9794, 65039], &[128111, 8205, 9792, 65039], &[128111, 8205, 9794, 65039], &[128112, 8205, 9792, 65039], &[128112, 8205, 9794, 65039], &[128112, 127995, 8205, 9792, 65039], &[128112, 127995, 8205, 9794, 65039], &[128112, 127996, 8205, 9792, 65039], &[128112, 127996, 8205, 9794, 65039], &[128112, 127997, 8205, 9792, 65039], &[128112, 127997, 8205, 9794, 65039], &[128112, 127998, 8205, 9792, 65039], &[128112, 127998, 8205, 9794, 65039], &[128112, 127999, 8205, 9792, 65039], &[128112, 127999, 8205, 9794, 65039], &[128113, 8205, 9792, 65039], &[128113, 8205, 9794, 65039], &[128113, 127995, 8205, 9792, 65039], &[128113, 127995, 8205, 9794, 65039], &[128113, 127996, 8205, 9792, 65039], &[128113, 127996, 8205, 9794, 65039], &[128113, 127997, 8205, 9792, 65039], &[128113, 127997, 8205, 9794, 65039], &[128113, 127998, 8205, 9792, 65039], &[128113, 127998, 8205, 9794, 65039], &[128113, 127999, 8205, 9792, 65039], &[128113, 127999, 8205, 9794, 65039], &[128115, 8205, 9792, 65039], &[128115, 8205, 9794, 65039], &[128115, 127995, 8205, 9792, 65039], &[128115, 127995, 8205, 9794, 65039], &[128115, 127996, 8205, 9792, 65039], &[128115, 127996, 8205, 9794, 65039], &[128115, 127997, 8205, 9792, 65039], &[128115, 127997, 8205, 9794, 65039], &[128115, 127998, 8205, 9792, 65039], &[128115, 127998, 8205, 9794, 65039], &[128115, 127999, 8205, 9792, 65039], &[128115, 127999, 8205, 9794, 65039], &[128119, 8205, 9792, 65039], &[128119, 8205, 9794, 65039], &[128119, 127995, 8205, 9792, 65039], &[128119, 127995, 8205, 9794, 65039], &[128119, 127996, 8205, 9792, 65039], &[128119, 127996, 8205, 9794, 65039], &[128119, 127997, 8205, 9792, 65039], &[128119, 127997, 8205, 9794, 65039], &[128119, 127998, 8205, 9792, 65039], &[128119, 127998, 8205, 9794, 65039], &[128119, 127999, 8205, 9792, 65039], &[128119, 127999, 8205, 9794, 65039], &[128129, 8205, 9792, 65039], &[128129, 8205, 9794, 65039], &[128129, 127995, 8205, 9792, 65039], &[128129, 127995, 8205, 9794, 65039], &[128129, 127996, 8205, 9792, 65039], &[128129, 127996, 8205, 9794, 65039], &[128129, 127997, 8205, 9792, 65039], &[128129, 127997, 8205, 9794, 65039], &[128129, 127998, 8205, 9792, 65039], &[128129, 127998, 8205, 9794, 65039], &[128129, 127999, 8205, 9792, 65039], &[128129, 127999, 8205, 9794, 65039], &[128130, 8205, 9792, 65039], &[128130, 8205, 9794, 65039], &[128130, 127995, 8205, 9792, 65039], &[128130, 127995, 8205, 9794, 65039], &[128130, 127996, 8205, 9792, 65039], &[128130, 127996, 8205, 9794, 65039], &[128130, 127997, 8205, 9792, 65039], &[128130, 127997, 8205, 9794, 65039], &[128130, 127998, 8205, 9792, 65039], &[128130, 127998, 8205, 9794, 65039], &[128130, 127999, 8205, 9792, 65039], &[128130, 127999, 8205, 9794, 65039], &[128134, 8205, 9792, 65039], &[128134, 8205, 9794, 65039], &[128134, 127995, 8205, 9792, 65039], &[128134, 127995, 8205, 9794, 65039], &[128134, 127996, 8205, 9792, 65039], &[128134, 127996, 8205, 9794, 65039], &[128134, 127997, 8205, 9792, 65039], &[128134, 127997, 8205, 9794, 65039], &[128134, 127998, 8205, 9792, 65039], &[128134, 127998, 8205, 9794, 65039], &[128134, 127999, 8205, 9792, 65039], &[128134, 127999, 8205, 9794, 65039], &[128135, 8205, 9792, 65039], &[128135, 8205, 9794, 65039], &[128135, 127995, 8205, 9792, 65039], &[128135, 127995, 8205, 9794, 65039], &[128135, 127996, 8205, 9792, 65039], &[128135, 127996, 8205, 9794, 65039], &[128135, 127997, 8205, 9792, 65039], &[128135, 127997, 8205, 9794, 65039], &[128135, 127998, 8205, 9792, 65039], &[128135, 127998, 8205, 9794, 65039], &[128135, 127999, 8205, 9792, 65039], &[128135, 127999, 8205, 9794, 65039], &[128373, 127995, 8205, 9792, 65039], &[128373, 127995, 8205, 9794, 65039], &[128373, 127996, 8205, 9792, 65039], &[128373, 127996, 8205, 9794, 65039], &[128373, 127997, 8205, 9792, 65039], &[128373, 127997, 8205, 9794, 65039], &[128373, 127998, 8205, 9792, 65039], &[128373, 127998, 8205, 9794, 65039], &[128373, 127999, 8205, 9792, 65039], &[128373, 127999, 8205, 9794, 65039], &[128373, 65039, 8205, 9792, 65039], &[128373, 65039, 8205, 9794, 65039], &[128581, 8205, 9792, 65039], &[128581, 8205, 9794, 65039], &[128581, 127995, 8205, 9792, 65039], &[128581, 127995, 8205, 9794, 65039], &[128581, 127996, 8205, 9792, 65039], &[128581, 127996, 8205, 9794, 65039], &[128581, 127997, 8205, 9792, 65039], &[128581, 127997, 8205, 9794, 65039], &[128581, 127998, 8205, 9792, 65039], &[128581, 127998, 8205, 9794, 65039], &[128581, 127999, 8205, 9792, 65039], &[128581, 127999, 8205, 9794, 65039], &[128582, 8205, 9792, 65039], &[128582, 8205, 9794, 65039], &[128582, 127995, 8205, 9792, 65039], &[128582, 127995, 8205, 9794, 65039], &[128582, 127996, 8205, 9792, 65039], &[128582, 127996, 8205, 9794, 65039], &[128582, 127997, 8205, 9792, 65039], &[128582, 127997, 8205, 9794, 65039], &[128582, 127998, 8205, 9792, 65039], &[128582, 127998, 8205, 9794, 65039], &[128582, 127999, 8205, 9792, 65039], &[128582, 127999, 8205, 9794, 65039], &[128583, 8205, 9792, 65039], &[128583, 8205, 9794, 65039], &[128583, 127995, 8205, 9792, 65039], &[128583, 127995, 8205, 9794, 65039], &[128583, 127996, 8205, 9792, 65039], &[128583, 127996, 8205, 9794, 65039], &[128583, 127997, 8205, 9792, 65039], &[128583, 127997, 8205, 9794, 65039], &[128583, 127998, 8205, 9792, 65039], &[128583, 127998, 8205, 9794, 65039], &[128583, 127999, 8205, 9792, 65039], &[128583, 127999, 8205, 9794, 65039], &[128587, 8205, 9792, 65039], &[128587, 8205, 9794, 65039], &[128587, 127995, 8205, 9792, 65039], &[128587, 127995, 8205, 9794, 65039], &[128587, 127996, 8205, 9792, 65039], &[128587, 127996, 8205, 9794, 65039], &[128587, 127997, 8205, 9792, 65039], &[128587, 127997, 8205, 9794, 65039], &[128587, 127998, 8205, 9792, 65039], &[128587, 127998, 8205, 9794, 65039], &[128587, 127999, 8205, 9792, 65039], &[128587, 127999, 8205, 9794, 65039], &[128589, 8205, 9792, 65039], &[128589, 8205, 9794, 65039], &[128589, 127995, 8205, 9792, 65039], &[128589, 127995, 8205, 9794, 65039], &[128589, 127996, 8205, 9792, 65039], &[128589, 127996, 8205, 9794, 65039], &[128589, 127997, 8205, 9792, 65039], &[128589, 127997, 8205, 9794, 65039], &[128589, 127998, 8205, 9792, 65039], &[128589, 127998, 8205, 9794, 65039], &[128589, 127999, 8205, 9792, 65039], &[128589, 127999, 8205, 9794, 65039], &[128590, 8205, 9792, 65039], &[128590, 8205, 9794, 65039], &[128590, 127995, 8205, 9792, 65039], &[128590, 127995, 8205, 9794, 65039], &[128590, 127996, 8205, 9792, 65039], &[128590, 127996, 8205, 9794, 65039], &[128590, 127997, 8205, 9792, 65039], &[128590, 127997, 8205, 9794, 65039], &[128590, 127998, 8205, 9792, 65039], &[128590, 127998, 8205, 9794, 65039], &[128590, 127999, 8205, 9792, 65039], &[128590, 127999, 8205, 9794, 65039], &[128675, 8205, 9792, 65039], &[128675, 8205, 9794, 65039], &[128675, 127995, 8205, 9792, 65039], &[128675, 127995, 8205, 9794, 65039], &[128675, 127996, 8205, 9792, 65039], &[128675, 127996, 8205, 9794, 65039], &[128675, 127997, 8205, 9792, 65039], &[128675, 127997, 8205, 9794, 65039], &[128675, 127998, 8205, 9792, 65039], &[128675, 127998, 8205, 9794, 65039], &[128675, 127999, 8205, 9792, 65039], &[128675, 127999, 8205, 9794, 65039], &[128692, 8205, 9792, 65039], &[128692, 8205, 9794, 65039], &[128692, 127995, 8205, 9792, 65039], &[128692, 127995, 8205, 9794, 65039], &[128692, 127996, 8205, 9792, 65039], &[128692, 127996, 8205, 9794, 65039], &[128692, 127997, 8205, 9792, 65039], &[128692, 127997, 8205, 9794, 65039], &[128692, 127998, 8205, 9792, 65039], &[128692, 127998, 8205, 9794, 65039], &[128692, 127999, 8205, 9792, 65039], &[128692, 127999, 8205, 9794, 65039], &[128693, 8205, 9792, 65039], &[128693, 8205, 9794, 65039], &[128693, 127995, 8205, 9792, 65039], &[128693, 127995, 8205, 9794, 65039], &[128693, 127996, 8205, 9792, 65039], &[128693, 127996, 8205, 9794, 65039], &[128693, 127997, 8205, 9792, 65039], &[128693, 127997, 8205, 9794, 65039], &[128693, 127998, 8205, 9792, 65039], &[128693, 127998, 8205, 9794, 65039], &[128693, 127999, 8205, 9792, 65039], &[128693, 127999, 8205, 9794, 65039], &[128694, 8205, 9792, 65039], &[128694, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 8205, 9794, 65039], &[128694, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127995, 8205, 9792, 65039], &[128694, 127995, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127995, 8205, 9794, 65039], &[128694, 127995, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127996, 8205, 9792, 65039], &[128694, 127996, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127996, 8205, 9794, 65039], &[128694, 127996, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127997, 8205, 9792, 65039], &[128694, 127997, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127997, 8205, 9794, 65039], &[128694, 127997, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127998, 8205, 9792, 65039], &[128694, 127998, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127998, 8205, 9794, 65039], &[128694, 127998, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127999, 8205, 9792, 65039], &[128694, 127999, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127999, 8205, 9794, 65039], &[128694, 127999, 8205, 9794, 65039, 8205, 10145, 65039], &[129318, 8205, 9792, 65039], &[129318, 8205, 9794, 65039], &[129318, 127995, 8205, 9792, 65039], &[129318, 127995, 8205, 9794, 65039], &[129318, 127996, 8205, 9792, 65039], &[129318, 127996, 8205, 9794, 65039], &[129318, 127997, 8205, 9792, 65039], &[129318, 127997, 8205, 9794, 65039], &[129318, 127998, 8205, 9792, 65039], &[129318, 127998, 8205, 9794, 65039], &[129318, 127999, 8205, 9792, 65039], &[129318, 127999, 8205, 9794, 65039], &[129333, 8205, 9792, 65039], &[129333, 8205, 9794, 65039], &[129333, 127995, 8205, 9792, 65039], &[129333, 127995, 8205, 9794, 65039], &[129333, 127996, 8205, 9792, 65039], &[129333, 127996, 8205, 9794, 65039], &[129333, 127997, 8205, 9792, 65039], &[129333, 127997, 8205, 9794, 65039], &[129333, 127998, 8205, 9792, 65039], &[129333, 127998, 8205, 9794, 65039], &[129333, 127999, 8205, 9792, 65039], &[129333, 127999, 8205, 9794, 65039], &[129335, 8205, 9792, 65039], &[129335, 8205, 9794, 65039], &[129335, 127995, 8205, 9792, 65039], &[129335, 127995, 8205, 9794, 65039], &[129335, 127996, 8205, 9792, 65039], &[129335, 127996, 8205, 9794, 65039], &[129335, 127997, 8205, 9792, 65039], &[129335, 127997, 8205, 9794, 65039], &[129335, 127998, 8205, 9792, 65039], &[129335, 127998, 8205, 9794, 65039], &[129335, 127999, 8205, 9792, 65039], &[129335, 127999, 8205, 9794, 65039], &[129336, 8205, 9792, 65039], &[129336, 8205, 9794, 65039], &[129336, 127995, 8205, 9792, 65039], &[129336, 127995, 8205, 9794, 65039], &[129336, 127996, 8205, 9792, 65039], &[129336, 127996, 8205, 9794, 65039], &[129336, 127997, 8205, 9792, 65039], &[129336, 127997, 8205, 9794, 65039], &[129336, 127998, 8205, 9792, 65039], &[129336, 127998, 8205, 9794, 65039], &[129336, 127999, 8205, 9792, 65039], &[129336, 127999, 8205, 9794, 65039], &[129337, 8205, 9792, 65039], &[129337, 8205, 9794, 65039], &[129337, 127995, 8205, 9792, 65039], &[129337, 127995, 8205, 9794, 65039], &[129337, 127996, 8205, 9792, 65039], &[129337, 127996, 8205, 9794, 65039], &[129337, 127997, 8205, 9792, 65039], &[129337, 127997, 8205, 9794, 65039], &[129337, 127998, 8205, 9792, 65039], &[129337, 127998, 8205, 9794, 65039], &[129337, 127999, 8205, 9792, 65039], &[129337, 127999, 8205, 9794, 65039], &[129340, 8205, 9792, 65039], &[129340, 8205, 9794, 65039], &[129341, 8205, 9792, 65039], &[129341, 8205, 9794, 65039], &[129341, 127995, 8205, 9792, 65039], &[129341, 127995, 8205, 9794, 65039], &[129341, 127996, 8205, 9792, 65039], &[129341, 127996, 8205, 9794, 65039], &[129341, 127997, 8205, 9792, 65039], &[129341, 127997, 8205, 9794, 65039], &[129341, 127998, 8205, 9792, 65039], &[129341, 127998, 8205, 9794, 65039], &[129341, 127999, 8205, 9792, 65039], &[129341, 127999, 8205, 9794, 65039], &[129342, 8205, 9792, 65039], &[129342, 8205, 9794, 65039], &[129342, 127995, 8205, 9792, 65039], &[129342, 127995, 8205, 9794, 65039], &[129342, 127996, 8205, 9792, 65039], &[129342, 127996, 8205, 9794, 65039], &[129342, 127997, 8205, 9792, 65039], &[129342, 127997, 8205, 9794, 65039], &[129342, 127998, 8205, 9792, 65039], &[129342, 127998, 8205, 9794, 65039], &[129342, 127999, 8205, 9792, 65039], &[129342, 127999, 8205, 9794, 65039], &[129464, 8205, 9792, 65039], &[129464, 8205, 9794, 65039], &[129464, 127995, 8205, 9792, 65039], &[129464, 127995, 8205, 9794, 65039], &[129464, 127996, 8205, 9792, 65039], &[129464, 127996, 8205, 9794, 65039], &[129464, 127997, 8205, 9792, 65039], &[129464, 127997, 8205, 9794, 65039], &[129464, 127998, 8205, 9792, 65039], &[129464, 127998, 8205, 9794, 65039], &[129464, 127999, 8205, 9792, 65039], &[129464, 127999, 8205, 9794, 65039], &[129465, 8205, 9792, 65039], &[129465, 8205, 9794, 65039], &[129465, 127995, 8205, 9792, 65039], &[129465, 127995, 8205, 9794, 65039], &[129465, 127996, 8205, 9792, 65039], &[129465, 127996, 8205, 9794, 65039], &[129465, 127997, 8205, 9792, 65039], &[129465, 127997, 8205, 9794, 65039], &[129465, 127998, 8205, 9792, 65039], &[129465, 127998, 8205, 9794, 65039], &[129465, 127999, 8205, 9792, 65039], &[129465, 127999, 8205, 9794, 65039], &[129485, 8205, 9792, 65039], &[129485, 8205, 9794, 65039], &[129485, 127995, 8205, 9792, 65039], &[129485, 127995, 8205, 9794, 65039], &[129485, 127996, 8205, 9792, 65039], &[129485, 127996, 8205, 9794, 65039], &[129485, 127997, 8205, 9792, 65039], &[129485, 127997, 8205, 9794, 65039], &[129485, 127998, 8205, 9792, 65039], &[129485, 127998, 8205, 9794, 65039], &[129485, 127999, 8205, 9792, 65039], &[129485, 127999, 8205, 9794, 65039], &[129486, 8205, 9792, 65039], &[129486, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 8205, 9794, 65039], &[129486, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127995, 8205, 9792, 65039], &[129486, 127995, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127995, 8205, 9794, 65039], &[129486, 127995, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127996, 8205, 9792, 65039], &[129486, 127996, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127996, 8205, 9794, 65039], &[129486, 127996, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127997, 8205, 9792, 65039], &[129486, 127997, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127997, 8205, 9794, 65039], &[129486, 127997, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127998, 8205, 9792, 65039], &[129486, 127998, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127998, 8205, 9794, 65039], &[129486, 127998, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127999, 8205, 9792, 65039], &[129486, 127999, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127999, 8205, 9794, 65039], &[129486, 127999, 8205, 9794, 65039, 8205, 10145, 65039], &[129487, 8205, 9792, 65039], &[129487, 8205, 9794, 65039], &[129487, 127995, 8205, 9792, 65039], &[129487, 127995, 8205, 9794, 65039], &[129487, 127996, 8205, 9792, 65039], &[129487, 127996, 8205, 9794, 65039], &[129487, 127997, 8205, 9792, 65039], &[129487, 127997, 8205, 9794, 65039], &[129487, 127998, 8205, 9792, 65039], &[129487, 127998, 8205, 9794, 65039], &[129487, 127999, 8205, 9792, 65039], &[129487, 127999, 8205, 9794, 65039], &[129492, 8205, 9792, 65039], &[129492, 8205, 9794, 65039], &[129492, 127995, 8205, 9792, 65039], &[129492, 127995, 8205, 9794, 65039], &[129492, 127996, 8205, 9792, 65039], &[129492, 127996, 8205, 9794, 65039], &[129492, 127997, 8205, 9792, 65039], &[129492, 127997, 8205, 9794, 65039], &[129492, 127998, 8205, 9792, 65039], &[129492, 127998, 8205, 9794, 65039], &[129492, 127999, 8205, 9792, 65039], &[129492, 127999, 8205, 9794, 65039], &[129494, 8205, 9792, 65039], &[129494, 8205, 9794, 65039], &[129494, 127995, 8205, 9792, 65039], &[129494, 127995, 8205, 9794, 65039], &[129494, 127996, 8205, 9792, 65039], &[129494, 127996, 8205, 9794, 65039], &[129494, 127997, 8205, 9792, 65039], &[129494, 127997, 8205, 9794, 65039], &[129494, 127998, 8205, 9792, 65039], &[129494, 127998, 8205, 9794, 65039], &[129494, 127999, 8205, 9792, 65039], &[129494, 127999, 8205, 9794, 65039], &[129495, 8205, 9792, 65039], &[129495, 8205, 9794, 65039], &[129495, 127995, 8205, 9792, 65039], &[129495, 127995, 8205, 9794, 65039], &[129495, 127996, 8205, 9792, 65039], &[129495, 127996, 8205, 9794, 65039], &[129495, 127997, 8205, 9792, 65039], &[129495, 127997, 8205, 9794, 65039], &[129495, 127998, 8205, 9792, 65039], &[129495, 127998, 8205, 9794, 65039], &[129495, 127999, 8205, 9792, 65039], &[129495, 127999, 8205, 9794, 65039], &[129496, 8205, 9792, 65039], &[129496, 8205, 9794, 65039], &[129496, 127995, 8205, 9792, 65039], &[129496, 127995, 8205, 9794, 65039], &[129496, 127996, 8205, 9792, 65039], &[129496, 127996, 8205, 9794, 65039], &[129496, 127997, 8205, 9792, 65039], &[129496, 127997, 8205, 9794, 65039], &[129496, 127998, 8205, 9792, 65039], &[129496, 127998, 8205, 9794, 65039], &[129496, 127999, 8205, 9792, 65039], &[129496, 127999, 8205, 9794, 65039], &[129497, 8205, 9792, 65039], &[129497, 8205, 9794, 65039], &[129497, 127995, 8205, 9792, 65039], &[129497, 127995, 8205, 9794, 65039], &[129497, 127996, 8205, 9792, 65039], &[129497, 127996, 8205, 9794, 65039], &[129497, 127997, 8205, 9792, 65039], &[129497, 127997, 8205, 9794, 65039], &[129497, 127998, 8205, 9792, 65039], &[129497, 127998, 8205, 9794, 65039], &[129497, 127999, 8205, 9792, 65039], &[129497, 127999, 8205, 9794, 65039], &[129498, 8205, 9792, 65039], &[129498, 8205, 9794, 65039], &[129498, 127995, 8205, 9792, 65039], &[129498, 127995, 8205, 9794, 65039], &[129498, 127996, 8205, 9792, 65039], &[129498, 127996, 8205, 9794, 65039], &[129498, 127997, 8205, 9792, 65039], &[129498, 127997, 8205, 9794, 65039], &[129498, 127998, 8205, 9792, 65039], &[129498, 127998, 8205, 9794, 65039], &[129498, 127999, 8205, 9792, 65039], &[129498, 127999, 8205, 9794, 65039], &[129499, 8205, 9792, 65039], &[129499, 8205, 9794, 65039], &[129499, 127995, 8205, 9792, 65039], &[129499, 127995, 8205, 9794, 65039], &[129499, 127996, 8205, 9792, 65039], &[129499, 127996, 8205, 9794, 65039], &[129499, 127997, 8205, 9792, 65039], &[129499, 127997, 8205, 9794, 65039], &[129499, 127998, 8205, 9792, 65039], &[129499, 127998, 8205, 9794, 65039], &[129499, 127999, 8205, 9792, 65039], &[129499, 127999, 8205, 9794, 65039], &[129500, 8205, 9792, 65039], &[129500, 8205, 9794, 65039], &[129500, 127995, 8205, 9792, 65039], &[129500, 127995, 8205, 9794, 65039], &[129500, 127996, 8205, 9792, 65039], &[129500, 127996, 8205, 9794, 65039], &[129500, 127997, 8205, 9792, 65039], &[129500, 127997, 8205, 9794, 65039], &[129500, 127998, 8205, 9792, 65039], &[129500, 127998, 8205, 9794, 65039], &[129500, 127999, 8205, 9792, 65039], &[129500, 127999, 8205, 9794, 65039], &[129501, 8205, 9792, 65039], &[129501, 8205, 9794, 65039], &[129501, 127995, 8205, 9792, 65039], &[129501, 127995, 8205, 9794, 65039], &[129501, 127996, 8205, 9792, 65039], &[129501, 127996, 8205, 9794, 65039], &[129501, 127997, 8205, 9792, 65039], &[129501, 127997, 8205, 9794, 65039], &[129501, 127998, 8205, 9792, 65039], &[129501, 127998, 8205, 9794, 65039], &[129501, 127999, 8205, 9792, 65039], &[129501, 127999, 8205, 9794, 65039], &[129502, 8205, 9792, 65039], &[129502, 8205, 9794, 65039], &[129503, 8205, 9792, 65039], &[129503, 8205, 9794, 65039], &[128104, 8205, 129456], &[128104, 8205, 129457], &[128104, 8205, 129458], &[128104, 8205, 129459], &[128104, 127995, 8205, 129456], &[128104, 127995, 8205, 129457], &[128104, 127995, 8205, 129458], &[128104, 127995, 8205, 129459], &[128104, 127996, 8205, 129456], &[128104, 127996, 8205, 129457], &[128104, 127996, 8205, 129458], &[128104, 127996, 8205, 129459], &[128104, 127997, 8205, 129456], &[128104, 127997, 8205, 129457], &[128104, 127997, 8205, 129458], &[128104, 127997, 8205, 129459], &[128104, 127998, 8205, 129456], &[128104, 127998, 8205, 129457], &[128104, 127998, 8205, 129458], &[128104, 127998, 8205, 129459], &[128104, 127999, 8205, 129456], &[128104, 127999, 8205, 129457], &[128104, 127999, 8205, 129458], &[128104, 127999, 8205, 129459], &[128105, 8205, 129456], &[128105, 8205, 129457], &[128105, 8205, 129458], &[128105, 8205, 129459], &[128105, 127995, 8205, 129456], &[128105, 127995, 8205, 129457], &[128105, 127995, 8205, 129458], &[128105, 127995, 8205, 129459], &[128105, 127996, 8205, 129456], &[128105, 127996, 8205, 129457], &[128105, 127996, 8205, 129458], &[128105, 127996, 8205, 129459], &[128105, 127997, 8205, 129456], &[128105, 127997, 8205, 129457], &[128105, 127997, 8205, 129458], &[128105, 127997, 8205, 129459], &[128105, 127998, 8205, 129456], &[128105, 127998, 8205, 129457], &[128105, 127998, 8205, 129458], &[128105, 127998, 8205, 129459], &[128105, 127999, 8205, 129456], &[128105, 127999, 8205, 129457], &[128105, 127999, 8205, 129458], &[128105, 127999, 8205, 129459], &[129489, 8205, 129456], &[129489, 8205, 129457], &[129489, 8205, 129458], &[129489, 8205, 129459], &[129489, 127995, 8205, 129456], &[129489, 127995, 8205, 129457], &[129489, 127995, 8205, 129458], &[129489, 127995, 8205, 129459], &[129489, 127996, 8205, 129456], &[129489, 127996, 8205, 129457], &[129489, 127996, 8205, 129458], &[129489, 127996, 8205, 129459], &[129489, 127997, 8205, 129456], &[129489, 127997, 8205, 129457], &[129489, 127997, 8205, 129458], &[129489, 127997, 8205, 129459], &[129489, 127998, 8205, 129456], &[129489, 127998, 8205, 129457], &[129489, 127998, 8205, 129458], &[129489, 127998, 8205, 129459], &[129489, 127999, 8205, 129456], &[129489, 127999, 8205, 129457], &[129489, 127999, 8205, 129458], &[129489, 127999, 8205, 129459], &[9939, 65039, 8205, 128165], &[10084, 65039, 8205, 128293], &[10084, 65039, 8205, 129657], &[127812, 8205, 129003], &[127819, 8205, 129001], &[127987, 65039, 8205, 9895, 65039], &[127987, 65039, 8205, 127752], &[127988, 8205, 9760, 65039], &[128008, 8205, 11035], &[128021, 8205, 129466], &[128038, 8205, 11035], &[128038, 8205, 128293], &[128059, 8205, 10052, 65039], &[128065, 65039, 8205, 128488, 65039], &[128558, 8205, 128168], &[128565, 8205, 128171], &[128566, 8205, 127787, 65039], &[128578, 8205, 8596, 65039], &[128578, 8205, 8597, 65039], ]; /// Return the code point ranges of the 'RGI_Emoji_ZWJ_Sequence' Unicode property. pub(crate) fn rgi_emoji_zwj_sequence_sets() -> &'static [&'static [u32]] { RGI_EMOJI_ZWJ_SEQUENCE.as_slice() } static RGI_EMOJI: &[&[u32]; 3782] = &[ &[8986], &[8987], &[9193], &[9194], &[9195], &[9196], &[9200], &[9203], &[9725], &[9726], &[9748], &[9749], &[9800], &[9801], &[9802], &[9803], &[9804], &[9805], &[9806], &[9807], &[9808], &[9809], &[9810], &[9811], &[9855], &[9875], &[9889], &[9898], &[9899], &[9917], &[9918], &[9924], &[9925], &[9934], &[9940], &[9962], &[9970], &[9971], &[9973], &[9978], &[9981], &[9989], &[9994], &[9995], &[10024], &[10060], &[10062], &[10067], &[10068], &[10069], &[10071], &[10133], &[10134], &[10135], &[10160], &[10175], &[11035], &[11036], &[11088], &[11093], &[126980], &[127183], &[127374], &[127377], &[127378], &[127379], &[127380], &[127381], &[127382], &[127383], &[127384], &[127385], &[127386], &[127489], &[127514], &[127535], &[127538], &[127539], &[127540], &[127541], &[127542], &[127544], &[127545], &[127546], &[127568], &[127569], &[127744], &[127745], &[127746], &[127747], &[127748], &[127749], &[127750], &[127751], &[127752], &[127753], &[127754], &[127755], &[127756], &[127757], &[127758], &[127759], &[127760], &[127761], &[127762], &[127763], &[127764], &[127765], &[127766], &[127767], &[127768], &[127769], &[127770], &[127771], &[127772], &[127773], &[127774], &[127775], &[127776], &[127789], &[127790], &[127791], &[127792], &[127793], &[127794], &[127795], &[127796], &[127797], &[127799], &[127800], &[127801], &[127802], &[127803], &[127804], &[127805], &[127806], &[127807], &[127808], &[127809], &[127810], &[127811], &[127812], &[127813], &[127814], &[127815], &[127816], &[127817], &[127818], &[127819], &[127820], &[127821], &[127822], &[127823], &[127824], &[127825], &[127826], &[127827], &[127828], &[127829], &[127830], &[127831], &[127832], &[127833], &[127834], &[127835], &[127836], &[127837], &[127838], &[127839], &[127840], &[127841], &[127842], &[127843], &[127844], &[127845], &[127846], &[127847], &[127848], &[127849], &[127850], &[127851], &[127852], &[127853], &[127854], &[127855], &[127856], &[127857], &[127858], &[127859], &[127860], &[127861], &[127862], &[127863], &[127864], &[127865], &[127866], &[127867], &[127868], &[127870], &[127871], &[127872], &[127873], &[127874], &[127875], &[127876], &[127877], &[127878], &[127879], &[127880], &[127881], &[127882], &[127883], &[127884], &[127885], &[127886], &[127887], &[127888], &[127889], &[127890], &[127891], &[127904], &[127905], &[127906], &[127907], &[127908], &[127909], &[127910], &[127911], &[127912], &[127913], &[127914], &[127915], &[127916], &[127917], &[127918], &[127919], &[127920], &[127921], &[127922], &[127923], &[127924], &[127925], &[127926], &[127927], &[127928], &[127929], &[127930], &[127931], &[127932], &[127933], &[127934], &[127935], &[127936], &[127937], &[127938], &[127939], &[127940], &[127941], &[127942], &[127943], &[127944], &[127945], &[127946], &[127951], &[127952], &[127953], &[127954], &[127955], &[127968], &[127969], &[127970], &[127971], &[127972], &[127973], &[127974], &[127975], &[127976], &[127977], &[127978], &[127979], &[127980], &[127981], &[127982], &[127983], &[127984], &[127988], &[127992], &[127993], &[127994], &[127995], &[127996], &[127997], &[127998], &[127999], &[128000], &[128001], &[128002], &[128003], &[128004], &[128005], &[128006], &[128007], &[128008], &[128009], &[128010], &[128011], &[128012], &[128013], &[128014], &[128015], &[128016], &[128017], &[128018], &[128019], &[128020], &[128021], &[128022], &[128023], &[128024], &[128025], &[128026], &[128027], &[128028], &[128029], &[128030], &[128031], &[128032], &[128033], &[128034], &[128035], &[128036], &[128037], &[128038], &[128039], &[128040], &[128041], &[128042], &[128043], &[128044], &[128045], &[128046], &[128047], &[128048], &[128049], &[128050], &[128051], &[128052], &[128053], &[128054], &[128055], &[128056], &[128057], &[128058], &[128059], &[128060], &[128061], &[128062], &[128064], &[128066], &[128067], &[128068], &[128069], &[128070], &[128071], &[128072], &[128073], &[128074], &[128075], &[128076], &[128077], &[128078], &[128079], &[128080], &[128081], &[128082], &[128083], &[128084], &[128085], &[128086], &[128087], &[128088], &[128089], &[128090], &[128091], &[128092], &[128093], &[128094], &[128095], &[128096], &[128097], &[128098], &[128099], &[128100], &[128101], &[128102], &[128103], &[128104], &[128105], &[128106], &[128107], &[128108], &[128109], &[128110], &[128111], &[128112], &[128113], &[128114], &[128115], &[128116], &[128117], &[128118], &[128119], &[128120], &[128121], &[128122], &[128123], &[128124], &[128125], &[128126], &[128127], &[128128], &[128129], &[128130], &[128131], &[128132], &[128133], &[128134], &[128135], &[128136], &[128137], &[128138], &[128139], &[128140], &[128141], &[128142], &[128143], &[128144], &[128145], &[128146], &[128147], &[128148], &[128149], &[128150], &[128151], &[128152], &[128153], &[128154], &[128155], &[128156], &[128157], &[128158], &[128159], &[128160], &[128161], &[128162], &[128163], &[128164], &[128165], &[128166], &[128167], &[128168], &[128169], &[128170], &[128171], &[128172], &[128173], &[128174], &[128175], &[128176], &[128177], &[128178], &[128179], &[128180], &[128181], &[128182], &[128183], &[128184], &[128185], &[128186], &[128187], &[128188], &[128189], &[128190], &[128191], &[128192], &[128193], &[128194], &[128195], &[128196], &[128197], &[128198], &[128199], &[128200], &[128201], &[128202], &[128203], &[128204], &[128205], &[128206], &[128207], &[128208], &[128209], &[128210], &[128211], &[128212], &[128213], &[128214], &[128215], &[128216], &[128217], &[128218], &[128219], &[128220], &[128221], &[128222], &[128223], &[128224], &[128225], &[128226], &[128227], &[128228], &[128229], &[128230], &[128231], &[128232], &[128233], &[128234], &[128235], &[128236], &[128237], &[128238], &[128239], &[128240], &[128241], &[128242], &[128243], &[128244], &[128245], &[128246], &[128247], &[128248], &[128249], &[128250], &[128251], &[128252], &[128255], &[128256], &[128257], &[128258], &[128259], &[128260], &[128261], &[128262], &[128263], &[128264], &[128265], &[128266], &[128267], &[128268], &[128269], &[128270], &[128271], &[128272], &[128273], &[128274], &[128275], &[128276], &[128277], &[128278], &[128279], &[128280], &[128281], &[128282], &[128283], &[128284], &[128285], &[128286], &[128287], &[128288], &[128289], &[128290], &[128291], &[128292], &[128293], &[128294], &[128295], &[128296], &[128297], &[128298], &[128299], &[128300], &[128301], &[128302], &[128303], &[128304], &[128305], &[128306], &[128307], &[128308], &[128309], &[128310], &[128311], &[128312], &[128313], &[128314], &[128315], &[128316], &[128317], &[128331], &[128332], &[128333], &[128334], &[128336], &[128337], &[128338], &[128339], &[128340], &[128341], &[128342], &[128343], &[128344], &[128345], &[128346], &[128347], &[128348], &[128349], &[128350], &[128351], &[128352], &[128353], &[128354], &[128355], &[128356], &[128357], &[128358], &[128359], &[128378], &[128405], &[128406], &[128420], &[128507], &[128508], &[128509], &[128510], &[128511], &[128512], &[128513], &[128514], &[128515], &[128516], &[128517], &[128518], &[128519], &[128520], &[128521], &[128522], &[128523], &[128524], &[128525], &[128526], &[128527], &[128528], &[128529], &[128530], &[128531], &[128532], &[128533], &[128534], &[128535], &[128536], &[128537], &[128538], &[128539], &[128540], &[128541], &[128542], &[128543], &[128544], &[128545], &[128546], &[128547], &[128548], &[128549], &[128550], &[128551], &[128552], &[128553], &[128554], &[128555], &[128556], &[128557], &[128558], &[128559], &[128560], &[128561], &[128562], &[128563], &[128564], &[128565], &[128566], &[128567], &[128568], &[128569], &[128570], &[128571], &[128572], &[128573], &[128574], &[128575], &[128576], &[128577], &[128578], &[128579], &[128580], &[128581], &[128582], &[128583], &[128584], &[128585], &[128586], &[128587], &[128588], &[128589], &[128590], &[128591], &[128640], &[128641], &[128642], &[128643], &[128644], &[128645], &[128646], &[128647], &[128648], &[128649], &[128650], &[128651], &[128652], &[128653], &[128654], &[128655], &[128656], &[128657], &[128658], &[128659], &[128660], &[128661], &[128662], &[128663], &[128664], &[128665], &[128666], &[128667], &[128668], &[128669], &[128670], &[128671], &[128672], &[128673], &[128674], &[128675], &[128676], &[128677], &[128678], &[128679], &[128680], &[128681], &[128682], &[128683], &[128684], &[128685], &[128686], &[128687], &[128688], &[128689], &[128690], &[128691], &[128692], &[128693], &[128694], &[128695], &[128696], &[128697], &[128698], &[128699], &[128700], &[128701], &[128702], &[128703], &[128704], &[128705], &[128706], &[128707], &[128708], &[128709], &[128716], &[128720], &[128721], &[128722], &[128725], &[128726], &[128727], &[128732], &[128733], &[128734], &[128735], &[128747], &[128748], &[128756], &[128757], &[128758], &[128759], &[128760], &[128761], &[128762], &[128763], &[128764], &[128992], &[128993], &[128994], &[128995], &[128996], &[128997], &[128998], &[128999], &[129000], &[129001], &[129002], &[129003], &[129008], &[129292], &[129293], &[129294], &[129295], &[129296], &[129297], &[129298], &[129299], &[129300], &[129301], &[129302], &[129303], &[129304], &[129305], &[129306], &[129307], &[129308], &[129309], &[129310], &[129311], &[129312], &[129313], &[129314], &[129315], &[129316], &[129317], &[129318], &[129319], &[129320], &[129321], &[129322], &[129323], &[129324], &[129325], &[129326], &[129327], &[129328], &[129329], &[129330], &[129331], &[129332], &[129333], &[129334], &[129335], &[129336], &[129337], &[129338], &[129340], &[129341], &[129342], &[129343], &[129344], &[129345], &[129346], &[129347], &[129348], &[129349], &[129351], &[129352], &[129353], &[129354], &[129355], &[129356], &[129357], &[129358], &[129359], &[129360], &[129361], &[129362], &[129363], &[129364], &[129365], &[129366], &[129367], &[129368], &[129369], &[129370], &[129371], &[129372], &[129373], &[129374], &[129375], &[129376], &[129377], &[129378], &[129379], &[129380], &[129381], &[129382], &[129383], &[129384], &[129385], &[129386], &[129387], &[129388], &[129389], &[129390], &[129391], &[129392], &[129393], &[129394], &[129395], &[129396], &[129397], &[129398], &[129399], &[129400], &[129401], &[129402], &[129403], &[129404], &[129405], &[129406], &[129407], &[129408], &[129409], &[129410], &[129411], &[129412], &[129413], &[129414], &[129415], &[129416], &[129417], &[129418], &[129419], &[129420], &[129421], &[129422], &[129423], &[129424], &[129425], &[129426], &[129427], &[129428], &[129429], &[129430], &[129431], &[129432], &[129433], &[129434], &[129435], &[129436], &[129437], &[129438], &[129439], &[129440], &[129441], &[129442], &[129443], &[129444], &[129445], &[129446], &[129447], &[129448], &[129449], &[129450], &[129451], &[129452], &[129453], &[129454], &[129455], &[129456], &[129457], &[129458], &[129459], &[129460], &[129461], &[129462], &[129463], &[129464], &[129465], &[129466], &[129467], &[129468], &[129469], &[129470], &[129471], &[129472], &[129473], &[129474], &[129475], &[129476], &[129477], &[129478], &[129479], &[129480], &[129481], &[129482], &[129483], &[129484], &[129485], &[129486], &[129487], &[129488], &[129489], &[129490], &[129491], &[129492], &[129493], &[129494], &[129495], &[129496], &[129497], &[129498], &[129499], &[129500], &[129501], &[129502], &[129503], &[129504], &[129505], &[129506], &[129507], &[129508], &[129509], &[129510], &[129511], &[129512], &[129513], &[129514], &[129515], &[129516], &[129517], &[129518], &[129519], &[129520], &[129521], &[129522], &[129523], &[129524], &[129525], &[129526], &[129527], &[129528], &[129529], &[129530], &[129531], &[129532], &[129533], &[129534], &[129535], &[129648], &[129649], &[129650], &[129651], &[129652], &[129653], &[129654], &[129655], &[129656], &[129657], &[129658], &[129659], &[129660], &[129664], &[129665], &[129666], &[129667], &[129668], &[129669], &[129670], &[129671], &[129672], &[129680], &[129681], &[129682], &[129683], &[129684], &[129685], &[129686], &[129687], &[129688], &[129689], &[129690], &[129691], &[129692], &[129693], &[129694], &[129695], &[129696], &[129697], &[129698], &[129699], &[129700], &[129701], &[129702], &[129703], &[129704], &[129705], &[129706], &[129707], &[129708], &[129709], &[129710], &[129711], &[129712], &[129713], &[129714], &[129715], &[129716], &[129717], &[129718], &[129719], &[129720], &[129721], &[129722], &[129723], &[129724], &[129725], &[129727], &[129728], &[129729], &[129730], &[129731], &[129732], &[129733], &[129742], &[129743], &[129744], &[129745], &[129746], &[129747], &[129748], &[129749], &[129750], &[129751], &[129752], &[129753], &[129754], &[129755], &[129760], &[129761], &[129762], &[129763], &[129764], &[129765], &[129766], &[129767], &[129768], &[129776], &[129777], &[129778], &[129779], &[129780], &[129781], &[129782], &[129783], &[129784], &[169, 65039], &[174, 65039], &[8252, 65039], &[8265, 65039], &[8482, 65039], &[8505, 65039], &[8596, 65039], &[8597, 65039], &[8598, 65039], &[8599, 65039], &[8600, 65039], &[8601, 65039], &[8617, 65039], &[8618, 65039], &[9000, 65039], &[9167, 65039], &[9197, 65039], &[9198, 65039], &[9199, 65039], &[9201, 65039], &[9202, 65039], &[9208, 65039], &[9209, 65039], &[9210, 65039], &[9410, 65039], &[9642, 65039], &[9643, 65039], &[9654, 65039], &[9664, 65039], &[9723, 65039], &[9724, 65039], &[9728, 65039], &[9729, 65039], &[9730, 65039], &[9731, 65039], &[9732, 65039], &[9742, 65039], &[9745, 65039], &[9752, 65039], &[9757, 65039], &[9760, 65039], &[9762, 65039], &[9763, 65039], &[9766, 65039], &[9770, 65039], &[9774, 65039], &[9775, 65039], &[9784, 65039], &[9785, 65039], &[9786, 65039], &[9792, 65039], &[9794, 65039], &[9823, 65039], &[9824, 65039], &[9827, 65039], &[9829, 65039], &[9830, 65039], &[9832, 65039], &[9851, 65039], &[9854, 65039], &[9874, 65039], &[9876, 65039], &[9877, 65039], &[9878, 65039], &[9879, 65039], &[9881, 65039], &[9883, 65039], &[9884, 65039], &[9888, 65039], &[9895, 65039], &[9904, 65039], &[9905, 65039], &[9928, 65039], &[9935, 65039], &[9937, 65039], &[9939, 65039], &[9961, 65039], &[9968, 65039], &[9969, 65039], &[9972, 65039], &[9975, 65039], &[9976, 65039], &[9977, 65039], &[9986, 65039], &[9992, 65039], &[9993, 65039], &[9996, 65039], &[9997, 65039], &[9999, 65039], &[10002, 65039], &[10004, 65039], &[10006, 65039], &[10013, 65039], &[10017, 65039], &[10035, 65039], &[10036, 65039], &[10052, 65039], &[10055, 65039], &[10083, 65039], &[10084, 65039], &[10145, 65039], &[10548, 65039], &[10549, 65039], &[11013, 65039], &[11014, 65039], &[11015, 65039], &[12336, 65039], &[12349, 65039], &[12951, 65039], &[12953, 65039], &[127344, 65039], &[127345, 65039], &[127358, 65039], &[127359, 65039], &[127490, 65039], &[127543, 65039], &[127777, 65039], &[127780, 65039], &[127781, 65039], &[127782, 65039], &[127783, 65039], &[127784, 65039], &[127785, 65039], &[127786, 65039], &[127787, 65039], &[127788, 65039], &[127798, 65039], &[127869, 65039], &[127894, 65039], &[127895, 65039], &[127897, 65039], &[127898, 65039], &[127899, 65039], &[127902, 65039], &[127903, 65039], &[127947, 65039], &[127948, 65039], &[127949, 65039], &[127950, 65039], &[127956, 65039], &[127957, 65039], &[127958, 65039], &[127959, 65039], &[127960, 65039], &[127961, 65039], &[127962, 65039], &[127963, 65039], &[127964, 65039], &[127965, 65039], &[127966, 65039], &[127967, 65039], &[127987, 65039], &[127989, 65039], &[127991, 65039], &[128063, 65039], &[128065, 65039], &[128253, 65039], &[128329, 65039], &[128330, 65039], &[128367, 65039], &[128368, 65039], &[128371, 65039], &[128372, 65039], &[128373, 65039], &[128374, 65039], &[128375, 65039], &[128376, 65039], &[128377, 65039], &[128391, 65039], &[128394, 65039], &[128395, 65039], &[128396, 65039], &[128397, 65039], &[128400, 65039], &[128421, 65039], &[128424, 65039], &[128433, 65039], &[128434, 65039], &[128444, 65039], &[128450, 65039], &[128451, 65039], &[128452, 65039], &[128465, 65039], &[128466, 65039], &[128467, 65039], &[128476, 65039], &[128477, 65039], &[128478, 65039], &[128481, 65039], &[128483, 65039], &[128488, 65039], &[128495, 65039], &[128499, 65039], &[128506, 65039], &[128715, 65039], &[128717, 65039], &[128718, 65039], &[128719, 65039], &[128736, 65039], &[128737, 65039], &[128738, 65039], &[128739, 65039], &[128740, 65039], &[128741, 65039], &[128745, 65039], &[128752, 65039], &[128755, 65039], &[35, 65039, 8419], &[42, 65039, 8419], &[48, 65039, 8419], &[49, 65039, 8419], &[50, 65039, 8419], &[51, 65039, 8419], &[52, 65039, 8419], &[53, 65039, 8419], &[54, 65039, 8419], &[55, 65039, 8419], &[56, 65039, 8419], &[57, 65039, 8419], &[127462, 127464], &[127462, 127465], &[127462, 127466], &[127462, 127467], &[127462, 127468], &[127462, 127470], &[127462, 127473], &[127462, 127474], &[127462, 127476], &[127462, 127478], &[127462, 127479], &[127462, 127480], &[127462, 127481], &[127462, 127482], &[127462, 127484], &[127462, 127485], &[127462, 127487], &[127463, 127462], &[127463, 127463], &[127463, 127465], &[127463, 127466], &[127463, 127467], &[127463, 127468], &[127463, 127469], &[127463, 127470], &[127463, 127471], &[127463, 127473], &[127463, 127474], &[127463, 127475], &[127463, 127476], &[127463, 127478], &[127463, 127479], &[127463, 127480], &[127463, 127481], &[127463, 127483], &[127463, 127484], &[127463, 127486], &[127463, 127487], &[127464, 127462], &[127464, 127464], &[127464, 127465], &[127464, 127467], &[127464, 127468], &[127464, 127469], &[127464, 127470], &[127464, 127472], &[127464, 127473], &[127464, 127474], &[127464, 127475], &[127464, 127476], &[127464, 127477], &[127464, 127479], &[127464, 127482], &[127464, 127483], &[127464, 127484], &[127464, 127485], &[127464, 127486], &[127464, 127487], &[127465, 127466], &[127465, 127468], &[127465, 127471], &[127465, 127472], &[127465, 127474], &[127465, 127476], &[127465, 127487], &[127466, 127462], &[127466, 127464], &[127466, 127466], &[127466, 127468], &[127466, 127469], &[127466, 127479], &[127466, 127480], &[127466, 127481], &[127466, 127482], &[127467, 127470], &[127467, 127471], &[127467, 127472], &[127467, 127474], &[127467, 127476], &[127467, 127479], &[127468, 127462], &[127468, 127463], &[127468, 127465], &[127468, 127466], &[127468, 127467], &[127468, 127468], &[127468, 127469], &[127468, 127470], &[127468, 127473], &[127468, 127474], &[127468, 127475], &[127468, 127477], &[127468, 127478], &[127468, 127479], &[127468, 127480], &[127468, 127481], &[127468, 127482], &[127468, 127484], &[127468, 127486], &[127469, 127472], &[127469, 127474], &[127469, 127475], &[127469, 127479], &[127469, 127481], &[127469, 127482], &[127470, 127464], &[127470, 127465], &[127470, 127466], &[127470, 127473], &[127470, 127474], &[127470, 127475], &[127470, 127476], &[127470, 127478], &[127470, 127479], &[127470, 127480], &[127470, 127481], &[127471, 127466], &[127471, 127474], &[127471, 127476], &[127471, 127477], &[127472, 127466], &[127472, 127468], &[127472, 127469], &[127472, 127470], &[127472, 127474], &[127472, 127475], &[127472, 127477], &[127472, 127479], &[127472, 127484], &[127472, 127486], &[127472, 127487], &[127473, 127462], &[127473, 127463], &[127473, 127464], &[127473, 127470], &[127473, 127472], &[127473, 127479], &[127473, 127480], &[127473, 127481], &[127473, 127482], &[127473, 127483], &[127473, 127486], &[127474, 127462], &[127474, 127464], &[127474, 127465], &[127474, 127466], &[127474, 127467], &[127474, 127468], &[127474, 127469], &[127474, 127472], &[127474, 127473], &[127474, 127474], &[127474, 127475], &[127474, 127476], &[127474, 127477], &[127474, 127478], &[127474, 127479], &[127474, 127480], &[127474, 127481], &[127474, 127482], &[127474, 127483], &[127474, 127484], &[127474, 127485], &[127474, 127486], &[127474, 127487], &[127475, 127462], &[127475, 127464], &[127475, 127466], &[127475, 127467], &[127475, 127468], &[127475, 127470], &[127475, 127473], &[127475, 127476], &[127475, 127477], &[127475, 127479], &[127475, 127482], &[127475, 127487], &[127476, 127474], &[127477, 127462], &[127477, 127466], &[127477, 127467], &[127477, 127468], &[127477, 127469], &[127477, 127472], &[127477, 127473], &[127477, 127474], &[127477, 127475], &[127477, 127479], &[127477, 127480], &[127477, 127481], &[127477, 127484], &[127477, 127486], &[127478, 127462], &[127479, 127466], &[127479, 127476], &[127479, 127480], &[127479, 127482], &[127479, 127484], &[127480, 127462], &[127480, 127463], &[127480, 127464], &[127480, 127465], &[127480, 127466], &[127480, 127468], &[127480, 127469], &[127480, 127470], &[127480, 127471], &[127480, 127472], &[127480, 127473], &[127480, 127474], &[127480, 127475], &[127480, 127476], &[127480, 127479], &[127480, 127480], &[127480, 127481], &[127480, 127483], &[127480, 127485], &[127480, 127486], &[127480, 127487], &[127481, 127462], &[127481, 127464], &[127481, 127465], &[127481, 127467], &[127481, 127468], &[127481, 127469], &[127481, 127471], &[127481, 127472], &[127481, 127473], &[127481, 127474], &[127481, 127475], &[127481, 127476], &[127481, 127479], &[127481, 127481], &[127481, 127483], &[127481, 127484], &[127481, 127487], &[127482, 127462], &[127482, 127468], &[127482, 127474], &[127482, 127475], &[127482, 127480], &[127482, 127486], &[127482, 127487], &[127483, 127462], &[127483, 127464], &[127483, 127466], &[127483, 127468], &[127483, 127470], &[127483, 127475], &[127483, 127482], &[127484, 127467], &[127484, 127480], &[127485, 127472], &[127486, 127466], &[127486, 127481], &[127487, 127462], &[127487, 127474], &[127487, 127484], &[9757, 127995], &[9757, 127996], &[9757, 127997], &[9757, 127998], &[9757, 127999], &[9977, 127995], &[9977, 127996], &[9977, 127997], &[9977, 127998], &[9977, 127999], &[9994, 127995], &[9994, 127996], &[9994, 127997], &[9994, 127998], &[9994, 127999], &[9995, 127995], &[9995, 127996], &[9995, 127997], &[9995, 127998], &[9995, 127999], &[9996, 127995], &[9996, 127996], &[9996, 127997], &[9996, 127998], &[9996, 127999], &[9997, 127995], &[9997, 127996], &[9997, 127997], &[9997, 127998], &[9997, 127999], &[127877, 127995], &[127877, 127996], &[127877, 127997], &[127877, 127998], &[127877, 127999], &[127938, 127995], &[127938, 127996], &[127938, 127997], &[127938, 127998], &[127938, 127999], &[127939, 127995], &[127939, 127996], &[127939, 127997], &[127939, 127998], &[127939, 127999], &[127940, 127995], &[127940, 127996], &[127940, 127997], &[127940, 127998], &[127940, 127999], &[127943, 127995], &[127943, 127996], &[127943, 127997], &[127943, 127998], &[127943, 127999], &[127946, 127995], &[127946, 127996], &[127946, 127997], &[127946, 127998], &[127946, 127999], &[127947, 127995], &[127947, 127996], &[127947, 127997], &[127947, 127998], &[127947, 127999], &[127948, 127995], &[127948, 127996], &[127948, 127997], &[127948, 127998], &[127948, 127999], &[128066, 127995], &[128066, 127996], &[128066, 127997], &[128066, 127998], &[128066, 127999], &[128067, 127995], &[128067, 127996], &[128067, 127997], &[128067, 127998], &[128067, 127999], &[128070, 127995], &[128070, 127996], &[128070, 127997], &[128070, 127998], &[128070, 127999], &[128071, 127995], &[128071, 127996], &[128071, 127997], &[128071, 127998], &[128071, 127999], &[128072, 127995], &[128072, 127996], &[128072, 127997], &[128072, 127998], &[128072, 127999], &[128073, 127995], &[128073, 127996], &[128073, 127997], &[128073, 127998], &[128073, 127999], &[128074, 127995], &[128074, 127996], &[128074, 127997], &[128074, 127998], &[128074, 127999], &[128075, 127995], &[128075, 127996], &[128075, 127997], &[128075, 127998], &[128075, 127999], &[128076, 127995], &[128076, 127996], &[128076, 127997], &[128076, 127998], &[128076, 127999], &[128077, 127995], &[128077, 127996], &[128077, 127997], &[128077, 127998], &[128077, 127999], &[128078, 127995], &[128078, 127996], &[128078, 127997], &[128078, 127998], &[128078, 127999], &[128079, 127995], &[128079, 127996], &[128079, 127997], &[128079, 127998], &[128079, 127999], &[128080, 127995], &[128080, 127996], &[128080, 127997], &[128080, 127998], &[128080, 127999], &[128102, 127995], &[128102, 127996], &[128102, 127997], &[128102, 127998], &[128102, 127999], &[128103, 127995], &[128103, 127996], &[128103, 127997], &[128103, 127998], &[128103, 127999], &[128104, 127995], &[128104, 127996], &[128104, 127997], &[128104, 127998], &[128104, 127999], &[128105, 127995], &[128105, 127996], &[128105, 127997], &[128105, 127998], &[128105, 127999], &[128107, 127995], &[128107, 127996], &[128107, 127997], &[128107, 127998], &[128107, 127999], &[128108, 127995], &[128108, 127996], &[128108, 127997], &[128108, 127998], &[128108, 127999], &[128109, 127995], &[128109, 127996], &[128109, 127997], &[128109, 127998], &[128109, 127999], &[128110, 127995], &[128110, 127996], &[128110, 127997], &[128110, 127998], &[128110, 127999], &[128112, 127995], &[128112, 127996], &[128112, 127997], &[128112, 127998], &[128112, 127999], &[128113, 127995], &[128113, 127996], &[128113, 127997], &[128113, 127998], &[128113, 127999], &[128114, 127995], &[128114, 127996], &[128114, 127997], &[128114, 127998], &[128114, 127999], &[128115, 127995], &[128115, 127996], &[128115, 127997], &[128115, 127998], &[128115, 127999], &[128116, 127995], &[128116, 127996], &[128116, 127997], &[128116, 127998], &[128116, 127999], &[128117, 127995], &[128117, 127996], &[128117, 127997], &[128117, 127998], &[128117, 127999], &[128118, 127995], &[128118, 127996], &[128118, 127997], &[128118, 127998], &[128118, 127999], &[128119, 127995], &[128119, 127996], &[128119, 127997], &[128119, 127998], &[128119, 127999], &[128120, 127995], &[128120, 127996], &[128120, 127997], &[128120, 127998], &[128120, 127999], &[128124, 127995], &[128124, 127996], &[128124, 127997], &[128124, 127998], &[128124, 127999], &[128129, 127995], &[128129, 127996], &[128129, 127997], &[128129, 127998], &[128129, 127999], &[128130, 127995], &[128130, 127996], &[128130, 127997], &[128130, 127998], &[128130, 127999], &[128131, 127995], &[128131, 127996], &[128131, 127997], &[128131, 127998], &[128131, 127999], &[128133, 127995], &[128133, 127996], &[128133, 127997], &[128133, 127998], &[128133, 127999], &[128134, 127995], &[128134, 127996], &[128134, 127997], &[128134, 127998], &[128134, 127999], &[128135, 127995], &[128135, 127996], &[128135, 127997], &[128135, 127998], &[128135, 127999], &[128143, 127995], &[128143, 127996], &[128143, 127997], &[128143, 127998], &[128143, 127999], &[128145, 127995], &[128145, 127996], &[128145, 127997], &[128145, 127998], &[128145, 127999], &[128170, 127995], &[128170, 127996], &[128170, 127997], &[128170, 127998], &[128170, 127999], &[128372, 127995], &[128372, 127996], &[128372, 127997], &[128372, 127998], &[128372, 127999], &[128373, 127995], &[128373, 127996], &[128373, 127997], &[128373, 127998], &[128373, 127999], &[128378, 127995], &[128378, 127996], &[128378, 127997], &[128378, 127998], &[128378, 127999], &[128400, 127995], &[128400, 127996], &[128400, 127997], &[128400, 127998], &[128400, 127999], &[128405, 127995], &[128405, 127996], &[128405, 127997], &[128405, 127998], &[128405, 127999], &[128406, 127995], &[128406, 127996], &[128406, 127997], &[128406, 127998], &[128406, 127999], &[128581, 127995], &[128581, 127996], &[128581, 127997], &[128581, 127998], &[128581, 127999], &[128582, 127995], &[128582, 127996], &[128582, 127997], &[128582, 127998], &[128582, 127999], &[128583, 127995], &[128583, 127996], &[128583, 127997], &[128583, 127998], &[128583, 127999], &[128587, 127995], &[128587, 127996], &[128587, 127997], &[128587, 127998], &[128587, 127999], &[128588, 127995], &[128588, 127996], &[128588, 127997], &[128588, 127998], &[128588, 127999], &[128589, 127995], &[128589, 127996], &[128589, 127997], &[128589, 127998], &[128589, 127999], &[128590, 127995], &[128590, 127996], &[128590, 127997], &[128590, 127998], &[128590, 127999], &[128591, 127995], &[128591, 127996], &[128591, 127997], &[128591, 127998], &[128591, 127999], &[128675, 127995], &[128675, 127996], &[128675, 127997], &[128675, 127998], &[128675, 127999], &[128692, 127995], &[128692, 127996], &[128692, 127997], &[128692, 127998], &[128692, 127999], &[128693, 127995], &[128693, 127996], &[128693, 127997], &[128693, 127998], &[128693, 127999], &[128694, 127995], &[128694, 127996], &[128694, 127997], &[128694, 127998], &[128694, 127999], &[128704, 127995], &[128704, 127996], &[128704, 127997], &[128704, 127998], &[128704, 127999], &[128716, 127995], &[128716, 127996], &[128716, 127997], &[128716, 127998], &[128716, 127999], &[129292, 127995], &[129292, 127996], &[129292, 127997], &[129292, 127998], &[129292, 127999], &[129295, 127995], &[129295, 127996], &[129295, 127997], &[129295, 127998], &[129295, 127999], &[129304, 127995], &[129304, 127996], &[129304, 127997], &[129304, 127998], &[129304, 127999], &[129305, 127995], &[129305, 127996], &[129305, 127997], &[129305, 127998], &[129305, 127999], &[129306, 127995], &[129306, 127996], &[129306, 127997], &[129306, 127998], &[129306, 127999], &[129307, 127995], &[129307, 127996], &[129307, 127997], &[129307, 127998], &[129307, 127999], &[129308, 127995], &[129308, 127996], &[129308, 127997], &[129308, 127998], &[129308, 127999], &[129309, 127995], &[129309, 127996], &[129309, 127997], &[129309, 127998], &[129309, 127999], &[129310, 127995], &[129310, 127996], &[129310, 127997], &[129310, 127998], &[129310, 127999], &[129311, 127995], &[129311, 127996], &[129311, 127997], &[129311, 127998], &[129311, 127999], &[129318, 127995], &[129318, 127996], &[129318, 127997], &[129318, 127998], &[129318, 127999], &[129328, 127995], &[129328, 127996], &[129328, 127997], &[129328, 127998], &[129328, 127999], &[129329, 127995], &[129329, 127996], &[129329, 127997], &[129329, 127998], &[129329, 127999], &[129330, 127995], &[129330, 127996], &[129330, 127997], &[129330, 127998], &[129330, 127999], &[129331, 127995], &[129331, 127996], &[129331, 127997], &[129331, 127998], &[129331, 127999], &[129332, 127995], &[129332, 127996], &[129332, 127997], &[129332, 127998], &[129332, 127999], &[129333, 127995], &[129333, 127996], &[129333, 127997], &[129333, 127998], &[129333, 127999], &[129334, 127995], &[129334, 127996], &[129334, 127997], &[129334, 127998], &[129334, 127999], &[129335, 127995], &[129335, 127996], &[129335, 127997], &[129335, 127998], &[129335, 127999], &[129336, 127995], &[129336, 127996], &[129336, 127997], &[129336, 127998], &[129336, 127999], &[129337, 127995], &[129337, 127996], &[129337, 127997], &[129337, 127998], &[129337, 127999], &[129341, 127995], &[129341, 127996], &[129341, 127997], &[129341, 127998], &[129341, 127999], &[129342, 127995], &[129342, 127996], &[129342, 127997], &[129342, 127998], &[129342, 127999], &[129399, 127995], &[129399, 127996], &[129399, 127997], &[129399, 127998], &[129399, 127999], &[129461, 127995], &[129461, 127996], &[129461, 127997], &[129461, 127998], &[129461, 127999], &[129462, 127995], &[129462, 127996], &[129462, 127997], &[129462, 127998], &[129462, 127999], &[129464, 127995], &[129464, 127996], &[129464, 127997], &[129464, 127998], &[129464, 127999], &[129465, 127995], &[129465, 127996], &[129465, 127997], &[129465, 127998], &[129465, 127999], &[129467, 127995], &[129467, 127996], &[129467, 127997], &[129467, 127998], &[129467, 127999], &[129485, 127995], &[129485, 127996], &[129485, 127997], &[129485, 127998], &[129485, 127999], &[129486, 127995], &[129486, 127996], &[129486, 127997], &[129486, 127998], &[129486, 127999], &[129487, 127995], &[129487, 127996], &[129487, 127997], &[129487, 127998], &[129487, 127999], &[129489, 127995], &[129489, 127996], &[129489, 127997], &[129489, 127998], &[129489, 127999], &[129490, 127995], &[129490, 127996], &[129490, 127997], &[129490, 127998], &[129490, 127999], &[129491, 127995], &[129491, 127996], &[129491, 127997], &[129491, 127998], &[129491, 127999], &[129492, 127995], &[129492, 127996], &[129492, 127997], &[129492, 127998], &[129492, 127999], &[129493, 127995], &[129493, 127996], &[129493, 127997], &[129493, 127998], &[129493, 127999], &[129494, 127995], &[129494, 127996], &[129494, 127997], &[129494, 127998], &[129494, 127999], &[129495, 127995], &[129495, 127996], &[129495, 127997], &[129495, 127998], &[129495, 127999], &[129496, 127995], &[129496, 127996], &[129496, 127997], &[129496, 127998], &[129496, 127999], &[129497, 127995], &[129497, 127996], &[129497, 127997], &[129497, 127998], &[129497, 127999], &[129498, 127995], &[129498, 127996], &[129498, 127997], &[129498, 127998], &[129498, 127999], &[129499, 127995], &[129499, 127996], &[129499, 127997], &[129499, 127998], &[129499, 127999], &[129500, 127995], &[129500, 127996], &[129500, 127997], &[129500, 127998], &[129500, 127999], &[129501, 127995], &[129501, 127996], &[129501, 127997], &[129501, 127998], &[129501, 127999], &[129731, 127995], &[129731, 127996], &[129731, 127997], &[129731, 127998], &[129731, 127999], &[129732, 127995], &[129732, 127996], &[129732, 127997], &[129732, 127998], &[129732, 127999], &[129733, 127995], &[129733, 127996], &[129733, 127997], &[129733, 127998], &[129733, 127999], &[129776, 127995], &[129776, 127996], &[129776, 127997], &[129776, 127998], &[129776, 127999], &[129777, 127995], &[129777, 127996], &[129777, 127997], &[129777, 127998], &[129777, 127999], &[129778, 127995], &[129778, 127996], &[129778, 127997], &[129778, 127998], &[129778, 127999], &[129779, 127995], &[129779, 127996], &[129779, 127997], &[129779, 127998], &[129779, 127999], &[129780, 127995], &[129780, 127996], &[129780, 127997], &[129780, 127998], &[129780, 127999], &[129781, 127995], &[129781, 127996], &[129781, 127997], &[129781, 127998], &[129781, 127999], &[129782, 127995], &[129782, 127996], &[129782, 127997], &[129782, 127998], &[129782, 127999], &[129783, 127995], &[129783, 127996], &[129783, 127997], &[129783, 127998], &[129783, 127999], &[129784, 127995], &[129784, 127996], &[129784, 127997], &[129784, 127998], &[129784, 127999], &[127988, 917607, 917602, 917605, 917614, 917607, 917631], &[127988, 917607, 917602, 917619, 917603, 917620, 917631], &[127988, 917607, 917602, 917623, 917612, 917619, 917631], &[128104, 8205, 10084, 65039, 8205, 128104], &[128104, 8205, 10084, 65039, 8205, 128139, 8205, 128104], &[128104, 8205, 128102], &[128104, 8205, 128102, 8205, 128102], &[128104, 8205, 128103], &[128104, 8205, 128103, 8205, 128102], &[128104, 8205, 128103, 8205, 128103], &[128104, 8205, 128104, 8205, 128102], &[128104, 8205, 128104, 8205, 128102, 8205, 128102], &[128104, 8205, 128104, 8205, 128103], &[128104, 8205, 128104, 8205, 128103, 8205, 128102], &[128104, 8205, 128104, 8205, 128103, 8205, 128103], &[128104, 8205, 128105, 8205, 128102], &[128104, 8205, 128105, 8205, 128102, 8205, 128102], &[128104, 8205, 128105, 8205, 128103], &[128104, 8205, 128105, 8205, 128103, 8205, 128102], &[128104, 8205, 128105, 8205, 128103, 8205, 128103], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127995, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127995, 8205, 129309, 8205, 128104, 127996], &[128104, 127995, 8205, 129309, 8205, 128104, 127997], &[128104, 127995, 8205, 129309, 8205, 128104, 127998], &[128104, 127995, 8205, 129309, 8205, 128104, 127999], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127996, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127996, 8205, 129309, 8205, 128104, 127995], &[128104, 127996, 8205, 129309, 8205, 128104, 127997], &[128104, 127996, 8205, 129309, 8205, 128104, 127998], &[128104, 127996, 8205, 129309, 8205, 128104, 127999], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127997, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127997, 8205, 129309, 8205, 128104, 127995], &[128104, 127997, 8205, 129309, 8205, 128104, 127996], &[128104, 127997, 8205, 129309, 8205, 128104, 127998], &[128104, 127997, 8205, 129309, 8205, 128104, 127999], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127998, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127998, 8205, 129309, 8205, 128104, 127995], &[128104, 127998, 8205, 129309, 8205, 128104, 127996], &[128104, 127998, 8205, 129309, 8205, 128104, 127997], &[128104, 127998, 8205, 129309, 8205, 128104, 127999], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127995], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127996], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127997], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127998], &[128104, 127999, 8205, 10084, 65039, 8205, 128104, 127999], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128104, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[128104, 127999, 8205, 129309, 8205, 128104, 127995], &[128104, 127999, 8205, 129309, 8205, 128104, 127996], &[128104, 127999, 8205, 129309, 8205, 128104, 127997], &[128104, 127999, 8205, 129309, 8205, 128104, 127998], &[128105, 8205, 10084, 65039, 8205, 128104], &[128105, 8205, 10084, 65039, 8205, 128105], &[128105, 8205, 10084, 65039, 8205, 128139, 8205, 128104], &[128105, 8205, 10084, 65039, 8205, 128139, 8205, 128105], &[128105, 8205, 128102], &[128105, 8205, 128102, 8205, 128102], &[128105, 8205, 128103], &[128105, 8205, 128103, 8205, 128102], &[128105, 8205, 128103, 8205, 128103], &[128105, 8205, 128105, 8205, 128102], &[128105, 8205, 128105, 8205, 128102, 8205, 128102], &[128105, 8205, 128105, 8205, 128103], &[128105, 8205, 128105, 8205, 128103, 8205, 128102], &[128105, 8205, 128105, 8205, 128103, 8205, 128103], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127995, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127995, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127995, 8205, 129309, 8205, 128104, 127996], &[128105, 127995, 8205, 129309, 8205, 128104, 127997], &[128105, 127995, 8205, 129309, 8205, 128104, 127998], &[128105, 127995, 8205, 129309, 8205, 128104, 127999], &[128105, 127995, 8205, 129309, 8205, 128105, 127996], &[128105, 127995, 8205, 129309, 8205, 128105, 127997], &[128105, 127995, 8205, 129309, 8205, 128105, 127998], &[128105, 127995, 8205, 129309, 8205, 128105, 127999], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127996, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127996, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127996, 8205, 129309, 8205, 128104, 127995], &[128105, 127996, 8205, 129309, 8205, 128104, 127997], &[128105, 127996, 8205, 129309, 8205, 128104, 127998], &[128105, 127996, 8205, 129309, 8205, 128104, 127999], &[128105, 127996, 8205, 129309, 8205, 128105, 127995], &[128105, 127996, 8205, 129309, 8205, 128105, 127997], &[128105, 127996, 8205, 129309, 8205, 128105, 127998], &[128105, 127996, 8205, 129309, 8205, 128105, 127999], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127997, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127997, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127997, 8205, 129309, 8205, 128104, 127995], &[128105, 127997, 8205, 129309, 8205, 128104, 127996], &[128105, 127997, 8205, 129309, 8205, 128104, 127998], &[128105, 127997, 8205, 129309, 8205, 128104, 127999], &[128105, 127997, 8205, 129309, 8205, 128105, 127995], &[128105, 127997, 8205, 129309, 8205, 128105, 127996], &[128105, 127997, 8205, 129309, 8205, 128105, 127998], &[128105, 127997, 8205, 129309, 8205, 128105, 127999], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127998, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127998, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127998, 8205, 129309, 8205, 128104, 127995], &[128105, 127998, 8205, 129309, 8205, 128104, 127996], &[128105, 127998, 8205, 129309, 8205, 128104, 127997], &[128105, 127998, 8205, 129309, 8205, 128104, 127999], &[128105, 127998, 8205, 129309, 8205, 128105, 127995], &[128105, 127998, 8205, 129309, 8205, 128105, 127996], &[128105, 127998, 8205, 129309, 8205, 128105, 127997], &[128105, 127998, 8205, 129309, 8205, 128105, 127999], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127995], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127996], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127997], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127998], &[128105, 127999, 8205, 10084, 65039, 8205, 128104, 127999], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127995], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127996], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127997], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127998], &[128105, 127999, 8205, 10084, 65039, 8205, 128105, 127999], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127995, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127996, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127997, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127998, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128104, 127999, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127995, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127996, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127997, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127998, ], &[ 128105, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 128105, 127999, ], &[128105, 127999, 8205, 129309, 8205, 128104, 127995], &[128105, 127999, 8205, 129309, 8205, 128104, 127996], &[128105, 127999, 8205, 129309, 8205, 128104, 127997], &[128105, 127999, 8205, 129309, 8205, 128104, 127998], &[128105, 127999, 8205, 129309, 8205, 128105, 127995], &[128105, 127999, 8205, 129309, 8205, 128105, 127996], &[128105, 127999, 8205, 129309, 8205, 128105, 127997], &[128105, 127999, 8205, 129309, 8205, 128105, 127998], &[129489, 8205, 129309, 8205, 129489], &[129489, 8205, 129489, 8205, 129490], &[129489, 8205, 129489, 8205, 129490, 8205, 129490], &[129489, 8205, 129490], &[129489, 8205, 129490, 8205, 129490], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[ 129489, 127995, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127995, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127995, 8205, 129309, 8205, 129489, 127995], &[129489, 127995, 8205, 129309, 8205, 129489, 127996], &[129489, 127995, 8205, 129309, 8205, 129489, 127997], &[129489, 127995, 8205, 129309, 8205, 129489, 127998], &[129489, 127995, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[ 129489, 127996, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127996, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127996, 8205, 129309, 8205, 129489, 127995], &[129489, 127996, 8205, 129309, 8205, 129489, 127996], &[129489, 127996, 8205, 129309, 8205, 129489, 127997], &[129489, 127996, 8205, 129309, 8205, 129489, 127998], &[129489, 127996, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[ 129489, 127997, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127997, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127997, 8205, 129309, 8205, 129489, 127995], &[129489, 127997, 8205, 129309, 8205, 129489, 127996], &[129489, 127997, 8205, 129309, 8205, 129489, 127997], &[129489, 127997, 8205, 129309, 8205, 129489, 127998], &[129489, 127997, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127998, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127999, ], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127998, 8205, 10084, 65039, 8205, 129489, 127999], &[129489, 127998, 8205, 129309, 8205, 129489, 127995], &[129489, 127998, 8205, 129309, 8205, 129489, 127996], &[129489, 127998, 8205, 129309, 8205, 129489, 127997], &[129489, 127998, 8205, 129309, 8205, 129489, 127998], &[129489, 127998, 8205, 129309, 8205, 129489, 127999], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127995, ], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127996, ], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127997, ], &[ 129489, 127999, 8205, 10084, 65039, 8205, 128139, 8205, 129489, 127998, ], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127995], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127996], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127997], &[129489, 127999, 8205, 10084, 65039, 8205, 129489, 127998], &[129489, 127999, 8205, 129309, 8205, 129489, 127995], &[129489, 127999, 8205, 129309, 8205, 129489, 127996], &[129489, 127999, 8205, 129309, 8205, 129489, 127997], &[129489, 127999, 8205, 129309, 8205, 129489, 127998], &[129489, 127999, 8205, 129309, 8205, 129489, 127999], &[129777, 127995, 8205, 129778, 127996], &[129777, 127995, 8205, 129778, 127997], &[129777, 127995, 8205, 129778, 127998], &[129777, 127995, 8205, 129778, 127999], &[129777, 127996, 8205, 129778, 127995], &[129777, 127996, 8205, 129778, 127997], &[129777, 127996, 8205, 129778, 127998], &[129777, 127996, 8205, 129778, 127999], &[129777, 127997, 8205, 129778, 127995], &[129777, 127997, 8205, 129778, 127996], &[129777, 127997, 8205, 129778, 127998], &[129777, 127997, 8205, 129778, 127999], &[129777, 127998, 8205, 129778, 127995], &[129777, 127998, 8205, 129778, 127996], &[129777, 127998, 8205, 129778, 127997], &[129777, 127998, 8205, 129778, 127999], &[129777, 127999, 8205, 129778, 127995], &[129777, 127999, 8205, 129778, 127996], &[129777, 127999, 8205, 129778, 127997], &[129777, 127999, 8205, 129778, 127998], &[127939, 8205, 10145, 65039], &[127939, 127995, 8205, 10145, 65039], &[127939, 127996, 8205, 10145, 65039], &[127939, 127997, 8205, 10145, 65039], &[127939, 127998, 8205, 10145, 65039], &[127939, 127999, 8205, 10145, 65039], &[128104, 8205, 9877, 65039], &[128104, 8205, 9878, 65039], &[128104, 8205, 9992, 65039], &[128104, 8205, 127806], &[128104, 8205, 127859], &[128104, 8205, 127868], &[128104, 8205, 127891], &[128104, 8205, 127908], &[128104, 8205, 127912], &[128104, 8205, 127979], &[128104, 8205, 127981], &[128104, 8205, 128187], &[128104, 8205, 128188], &[128104, 8205, 128295], &[128104, 8205, 128300], &[128104, 8205, 128640], &[128104, 8205, 128658], &[128104, 8205, 129455], &[128104, 8205, 129455, 8205, 10145, 65039], &[128104, 8205, 129468], &[128104, 8205, 129468, 8205, 10145, 65039], &[128104, 8205, 129469], &[128104, 8205, 129469, 8205, 10145, 65039], &[128104, 127995, 8205, 9877, 65039], &[128104, 127995, 8205, 9878, 65039], &[128104, 127995, 8205, 9992, 65039], &[128104, 127995, 8205, 127806], &[128104, 127995, 8205, 127859], &[128104, 127995, 8205, 127868], &[128104, 127995, 8205, 127891], &[128104, 127995, 8205, 127908], &[128104, 127995, 8205, 127912], &[128104, 127995, 8205, 127979], &[128104, 127995, 8205, 127981], &[128104, 127995, 8205, 128187], &[128104, 127995, 8205, 128188], &[128104, 127995, 8205, 128295], &[128104, 127995, 8205, 128300], &[128104, 127995, 8205, 128640], &[128104, 127995, 8205, 128658], &[128104, 127995, 8205, 129455], &[128104, 127995, 8205, 129455, 8205, 10145, 65039], &[128104, 127995, 8205, 129468], &[128104, 127995, 8205, 129468, 8205, 10145, 65039], &[128104, 127995, 8205, 129469], &[128104, 127995, 8205, 129469, 8205, 10145, 65039], &[128104, 127996, 8205, 9877, 65039], &[128104, 127996, 8205, 9878, 65039], &[128104, 127996, 8205, 9992, 65039], &[128104, 127996, 8205, 127806], &[128104, 127996, 8205, 127859], &[128104, 127996, 8205, 127868], &[128104, 127996, 8205, 127891], &[128104, 127996, 8205, 127908], &[128104, 127996, 8205, 127912], &[128104, 127996, 8205, 127979], &[128104, 127996, 8205, 127981], &[128104, 127996, 8205, 128187], &[128104, 127996, 8205, 128188], &[128104, 127996, 8205, 128295], &[128104, 127996, 8205, 128300], &[128104, 127996, 8205, 128640], &[128104, 127996, 8205, 128658], &[128104, 127996, 8205, 129455], &[128104, 127996, 8205, 129455, 8205, 10145, 65039], &[128104, 127996, 8205, 129468], &[128104, 127996, 8205, 129468, 8205, 10145, 65039], &[128104, 127996, 8205, 129469], &[128104, 127996, 8205, 129469, 8205, 10145, 65039], &[128104, 127997, 8205, 9877, 65039], &[128104, 127997, 8205, 9878, 65039], &[128104, 127997, 8205, 9992, 65039], &[128104, 127997, 8205, 127806], &[128104, 127997, 8205, 127859], &[128104, 127997, 8205, 127868], &[128104, 127997, 8205, 127891], &[128104, 127997, 8205, 127908], &[128104, 127997, 8205, 127912], &[128104, 127997, 8205, 127979], &[128104, 127997, 8205, 127981], &[128104, 127997, 8205, 128187], &[128104, 127997, 8205, 128188], &[128104, 127997, 8205, 128295], &[128104, 127997, 8205, 128300], &[128104, 127997, 8205, 128640], &[128104, 127997, 8205, 128658], &[128104, 127997, 8205, 129455], &[128104, 127997, 8205, 129455, 8205, 10145, 65039], &[128104, 127997, 8205, 129468], &[128104, 127997, 8205, 129468, 8205, 10145, 65039], &[128104, 127997, 8205, 129469], &[128104, 127997, 8205, 129469, 8205, 10145, 65039], &[128104, 127998, 8205, 9877, 65039], &[128104, 127998, 8205, 9878, 65039], &[128104, 127998, 8205, 9992, 65039], &[128104, 127998, 8205, 127806], &[128104, 127998, 8205, 127859], &[128104, 127998, 8205, 127868], &[128104, 127998, 8205, 127891], &[128104, 127998, 8205, 127908], &[128104, 127998, 8205, 127912], &[128104, 127998, 8205, 127979], &[128104, 127998, 8205, 127981], &[128104, 127998, 8205, 128187], &[128104, 127998, 8205, 128188], &[128104, 127998, 8205, 128295], &[128104, 127998, 8205, 128300], &[128104, 127998, 8205, 128640], &[128104, 127998, 8205, 128658], &[128104, 127998, 8205, 129455], &[128104, 127998, 8205, 129455, 8205, 10145, 65039], &[128104, 127998, 8205, 129468], &[128104, 127998, 8205, 129468, 8205, 10145, 65039], &[128104, 127998, 8205, 129469], &[128104, 127998, 8205, 129469, 8205, 10145, 65039], &[128104, 127999, 8205, 9877, 65039], &[128104, 127999, 8205, 9878, 65039], &[128104, 127999, 8205, 9992, 65039], &[128104, 127999, 8205, 127806], &[128104, 127999, 8205, 127859], &[128104, 127999, 8205, 127868], &[128104, 127999, 8205, 127891], &[128104, 127999, 8205, 127908], &[128104, 127999, 8205, 127912], &[128104, 127999, 8205, 127979], &[128104, 127999, 8205, 127981], &[128104, 127999, 8205, 128187], &[128104, 127999, 8205, 128188], &[128104, 127999, 8205, 128295], &[128104, 127999, 8205, 128300], &[128104, 127999, 8205, 128640], &[128104, 127999, 8205, 128658], &[128104, 127999, 8205, 129455], &[128104, 127999, 8205, 129455, 8205, 10145, 65039], &[128104, 127999, 8205, 129468], &[128104, 127999, 8205, 129468, 8205, 10145, 65039], &[128104, 127999, 8205, 129469], &[128104, 127999, 8205, 129469, 8205, 10145, 65039], &[128105, 8205, 9877, 65039], &[128105, 8205, 9878, 65039], &[128105, 8205, 9992, 65039], &[128105, 8205, 127806], &[128105, 8205, 127859], &[128105, 8205, 127868], &[128105, 8205, 127891], &[128105, 8205, 127908], &[128105, 8205, 127912], &[128105, 8205, 127979], &[128105, 8205, 127981], &[128105, 8205, 128187], &[128105, 8205, 128188], &[128105, 8205, 128295], &[128105, 8205, 128300], &[128105, 8205, 128640], &[128105, 8205, 128658], &[128105, 8205, 129455], &[128105, 8205, 129455, 8205, 10145, 65039], &[128105, 8205, 129468], &[128105, 8205, 129468, 8205, 10145, 65039], &[128105, 8205, 129469], &[128105, 8205, 129469, 8205, 10145, 65039], &[128105, 127995, 8205, 9877, 65039], &[128105, 127995, 8205, 9878, 65039], &[128105, 127995, 8205, 9992, 65039], &[128105, 127995, 8205, 127806], &[128105, 127995, 8205, 127859], &[128105, 127995, 8205, 127868], &[128105, 127995, 8205, 127891], &[128105, 127995, 8205, 127908], &[128105, 127995, 8205, 127912], &[128105, 127995, 8205, 127979], &[128105, 127995, 8205, 127981], &[128105, 127995, 8205, 128187], &[128105, 127995, 8205, 128188], &[128105, 127995, 8205, 128295], &[128105, 127995, 8205, 128300], &[128105, 127995, 8205, 128640], &[128105, 127995, 8205, 128658], &[128105, 127995, 8205, 129455], &[128105, 127995, 8205, 129455, 8205, 10145, 65039], &[128105, 127995, 8205, 129468], &[128105, 127995, 8205, 129468, 8205, 10145, 65039], &[128105, 127995, 8205, 129469], &[128105, 127995, 8205, 129469, 8205, 10145, 65039], &[128105, 127996, 8205, 9877, 65039], &[128105, 127996, 8205, 9878, 65039], &[128105, 127996, 8205, 9992, 65039], &[128105, 127996, 8205, 127806], &[128105, 127996, 8205, 127859], &[128105, 127996, 8205, 127868], &[128105, 127996, 8205, 127891], &[128105, 127996, 8205, 127908], &[128105, 127996, 8205, 127912], &[128105, 127996, 8205, 127979], &[128105, 127996, 8205, 127981], &[128105, 127996, 8205, 128187], &[128105, 127996, 8205, 128188], &[128105, 127996, 8205, 128295], &[128105, 127996, 8205, 128300], &[128105, 127996, 8205, 128640], &[128105, 127996, 8205, 128658], &[128105, 127996, 8205, 129455], &[128105, 127996, 8205, 129455, 8205, 10145, 65039], &[128105, 127996, 8205, 129468], &[128105, 127996, 8205, 129468, 8205, 10145, 65039], &[128105, 127996, 8205, 129469], &[128105, 127996, 8205, 129469, 8205, 10145, 65039], &[128105, 127997, 8205, 9877, 65039], &[128105, 127997, 8205, 9878, 65039], &[128105, 127997, 8205, 9992, 65039], &[128105, 127997, 8205, 127806], &[128105, 127997, 8205, 127859], &[128105, 127997, 8205, 127868], &[128105, 127997, 8205, 127891], &[128105, 127997, 8205, 127908], &[128105, 127997, 8205, 127912], &[128105, 127997, 8205, 127979], &[128105, 127997, 8205, 127981], &[128105, 127997, 8205, 128187], &[128105, 127997, 8205, 128188], &[128105, 127997, 8205, 128295], &[128105, 127997, 8205, 128300], &[128105, 127997, 8205, 128640], &[128105, 127997, 8205, 128658], &[128105, 127997, 8205, 129455], &[128105, 127997, 8205, 129455, 8205, 10145, 65039], &[128105, 127997, 8205, 129468], &[128105, 127997, 8205, 129468, 8205, 10145, 65039], &[128105, 127997, 8205, 129469], &[128105, 127997, 8205, 129469, 8205, 10145, 65039], &[128105, 127998, 8205, 9877, 65039], &[128105, 127998, 8205, 9878, 65039], &[128105, 127998, 8205, 9992, 65039], &[128105, 127998, 8205, 127806], &[128105, 127998, 8205, 127859], &[128105, 127998, 8205, 127868], &[128105, 127998, 8205, 127891], &[128105, 127998, 8205, 127908], &[128105, 127998, 8205, 127912], &[128105, 127998, 8205, 127979], &[128105, 127998, 8205, 127981], &[128105, 127998, 8205, 128187], &[128105, 127998, 8205, 128188], &[128105, 127998, 8205, 128295], &[128105, 127998, 8205, 128300], &[128105, 127998, 8205, 128640], &[128105, 127998, 8205, 128658], &[128105, 127998, 8205, 129455], &[128105, 127998, 8205, 129455, 8205, 10145, 65039], &[128105, 127998, 8205, 129468], &[128105, 127998, 8205, 129468, 8205, 10145, 65039], &[128105, 127998, 8205, 129469], &[128105, 127998, 8205, 129469, 8205, 10145, 65039], &[128105, 127999, 8205, 9877, 65039], &[128105, 127999, 8205, 9878, 65039], &[128105, 127999, 8205, 9992, 65039], &[128105, 127999, 8205, 127806], &[128105, 127999, 8205, 127859], &[128105, 127999, 8205, 127868], &[128105, 127999, 8205, 127891], &[128105, 127999, 8205, 127908], &[128105, 127999, 8205, 127912], &[128105, 127999, 8205, 127979], &[128105, 127999, 8205, 127981], &[128105, 127999, 8205, 128187], &[128105, 127999, 8205, 128188], &[128105, 127999, 8205, 128295], &[128105, 127999, 8205, 128300], &[128105, 127999, 8205, 128640], &[128105, 127999, 8205, 128658], &[128105, 127999, 8205, 129455], &[128105, 127999, 8205, 129455, 8205, 10145, 65039], &[128105, 127999, 8205, 129468], &[128105, 127999, 8205, 129468, 8205, 10145, 65039], &[128105, 127999, 8205, 129469], &[128105, 127999, 8205, 129469, 8205, 10145, 65039], &[128694, 8205, 10145, 65039], &[128694, 127995, 8205, 10145, 65039], &[128694, 127996, 8205, 10145, 65039], &[128694, 127997, 8205, 10145, 65039], &[128694, 127998, 8205, 10145, 65039], &[128694, 127999, 8205, 10145, 65039], &[129486, 8205, 10145, 65039], &[129486, 127995, 8205, 10145, 65039], &[129486, 127996, 8205, 10145, 65039], &[129486, 127997, 8205, 10145, 65039], &[129486, 127998, 8205, 10145, 65039], &[129486, 127999, 8205, 10145, 65039], &[129489, 8205, 9877, 65039], &[129489, 8205, 9878, 65039], &[129489, 8205, 9992, 65039], &[129489, 8205, 127806], &[129489, 8205, 127859], &[129489, 8205, 127868], &[129489, 8205, 127876], &[129489, 8205, 127891], &[129489, 8205, 127908], &[129489, 8205, 127912], &[129489, 8205, 127979], &[129489, 8205, 127981], &[129489, 8205, 128187], &[129489, 8205, 128188], &[129489, 8205, 128295], &[129489, 8205, 128300], &[129489, 8205, 128640], &[129489, 8205, 128658], &[129489, 8205, 129455], &[129489, 8205, 129455, 8205, 10145, 65039], &[129489, 8205, 129468], &[129489, 8205, 129468, 8205, 10145, 65039], &[129489, 8205, 129469], &[129489, 8205, 129469, 8205, 10145, 65039], &[129489, 127995, 8205, 9877, 65039], &[129489, 127995, 8205, 9878, 65039], &[129489, 127995, 8205, 9992, 65039], &[129489, 127995, 8205, 127806], &[129489, 127995, 8205, 127859], &[129489, 127995, 8205, 127868], &[129489, 127995, 8205, 127876], &[129489, 127995, 8205, 127891], &[129489, 127995, 8205, 127908], &[129489, 127995, 8205, 127912], &[129489, 127995, 8205, 127979], &[129489, 127995, 8205, 127981], &[129489, 127995, 8205, 128187], &[129489, 127995, 8205, 128188], &[129489, 127995, 8205, 128295], &[129489, 127995, 8205, 128300], &[129489, 127995, 8205, 128640], &[129489, 127995, 8205, 128658], &[129489, 127995, 8205, 129455], &[129489, 127995, 8205, 129455, 8205, 10145, 65039], &[129489, 127995, 8205, 129468], &[129489, 127995, 8205, 129468, 8205, 10145, 65039], &[129489, 127995, 8205, 129469], &[129489, 127995, 8205, 129469, 8205, 10145, 65039], &[129489, 127996, 8205, 9877, 65039], &[129489, 127996, 8205, 9878, 65039], &[129489, 127996, 8205, 9992, 65039], &[129489, 127996, 8205, 127806], &[129489, 127996, 8205, 127859], &[129489, 127996, 8205, 127868], &[129489, 127996, 8205, 127876], &[129489, 127996, 8205, 127891], &[129489, 127996, 8205, 127908], &[129489, 127996, 8205, 127912], &[129489, 127996, 8205, 127979], &[129489, 127996, 8205, 127981], &[129489, 127996, 8205, 128187], &[129489, 127996, 8205, 128188], &[129489, 127996, 8205, 128295], &[129489, 127996, 8205, 128300], &[129489, 127996, 8205, 128640], &[129489, 127996, 8205, 128658], &[129489, 127996, 8205, 129455], &[129489, 127996, 8205, 129455, 8205, 10145, 65039], &[129489, 127996, 8205, 129468], &[129489, 127996, 8205, 129468, 8205, 10145, 65039], &[129489, 127996, 8205, 129469], &[129489, 127996, 8205, 129469, 8205, 10145, 65039], &[129489, 127997, 8205, 9877, 65039], &[129489, 127997, 8205, 9878, 65039], &[129489, 127997, 8205, 9992, 65039], &[129489, 127997, 8205, 127806], &[129489, 127997, 8205, 127859], &[129489, 127997, 8205, 127868], &[129489, 127997, 8205, 127876], &[129489, 127997, 8205, 127891], &[129489, 127997, 8205, 127908], &[129489, 127997, 8205, 127912], &[129489, 127997, 8205, 127979], &[129489, 127997, 8205, 127981], &[129489, 127997, 8205, 128187], &[129489, 127997, 8205, 128188], &[129489, 127997, 8205, 128295], &[129489, 127997, 8205, 128300], &[129489, 127997, 8205, 128640], &[129489, 127997, 8205, 128658], &[129489, 127997, 8205, 129455], &[129489, 127997, 8205, 129455, 8205, 10145, 65039], &[129489, 127997, 8205, 129468], &[129489, 127997, 8205, 129468, 8205, 10145, 65039], &[129489, 127997, 8205, 129469], &[129489, 127997, 8205, 129469, 8205, 10145, 65039], &[129489, 127998, 8205, 9877, 65039], &[129489, 127998, 8205, 9878, 65039], &[129489, 127998, 8205, 9992, 65039], &[129489, 127998, 8205, 127806], &[129489, 127998, 8205, 127859], &[129489, 127998, 8205, 127868], &[129489, 127998, 8205, 127876], &[129489, 127998, 8205, 127891], &[129489, 127998, 8205, 127908], &[129489, 127998, 8205, 127912], &[129489, 127998, 8205, 127979], &[129489, 127998, 8205, 127981], &[129489, 127998, 8205, 128187], &[129489, 127998, 8205, 128188], &[129489, 127998, 8205, 128295], &[129489, 127998, 8205, 128300], &[129489, 127998, 8205, 128640], &[129489, 127998, 8205, 128658], &[129489, 127998, 8205, 129455], &[129489, 127998, 8205, 129455, 8205, 10145, 65039], &[129489, 127998, 8205, 129468], &[129489, 127998, 8205, 129468, 8205, 10145, 65039], &[129489, 127998, 8205, 129469], &[129489, 127998, 8205, 129469, 8205, 10145, 65039], &[129489, 127999, 8205, 9877, 65039], &[129489, 127999, 8205, 9878, 65039], &[129489, 127999, 8205, 9992, 65039], &[129489, 127999, 8205, 127806], &[129489, 127999, 8205, 127859], &[129489, 127999, 8205, 127868], &[129489, 127999, 8205, 127876], &[129489, 127999, 8205, 127891], &[129489, 127999, 8205, 127908], &[129489, 127999, 8205, 127912], &[129489, 127999, 8205, 127979], &[129489, 127999, 8205, 127981], &[129489, 127999, 8205, 128187], &[129489, 127999, 8205, 128188], &[129489, 127999, 8205, 128295], &[129489, 127999, 8205, 128300], &[129489, 127999, 8205, 128640], &[129489, 127999, 8205, 128658], &[129489, 127999, 8205, 129455], &[129489, 127999, 8205, 129455, 8205, 10145, 65039], &[129489, 127999, 8205, 129468], &[129489, 127999, 8205, 129468, 8205, 10145, 65039], &[129489, 127999, 8205, 129469], &[129489, 127999, 8205, 129469, 8205, 10145, 65039], &[9977, 127995, 8205, 9792, 65039], &[9977, 127995, 8205, 9794, 65039], &[9977, 127996, 8205, 9792, 65039], &[9977, 127996, 8205, 9794, 65039], &[9977, 127997, 8205, 9792, 65039], &[9977, 127997, 8205, 9794, 65039], &[9977, 127998, 8205, 9792, 65039], &[9977, 127998, 8205, 9794, 65039], &[9977, 127999, 8205, 9792, 65039], &[9977, 127999, 8205, 9794, 65039], &[9977, 65039, 8205, 9792, 65039], &[9977, 65039, 8205, 9794, 65039], &[127939, 8205, 9792, 65039], &[127939, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 8205, 9794, 65039], &[127939, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127995, 8205, 9792, 65039], &[127939, 127995, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127995, 8205, 9794, 65039], &[127939, 127995, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127996, 8205, 9792, 65039], &[127939, 127996, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127996, 8205, 9794, 65039], &[127939, 127996, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127997, 8205, 9792, 65039], &[127939, 127997, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127997, 8205, 9794, 65039], &[127939, 127997, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127998, 8205, 9792, 65039], &[127939, 127998, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127998, 8205, 9794, 65039], &[127939, 127998, 8205, 9794, 65039, 8205, 10145, 65039], &[127939, 127999, 8205, 9792, 65039], &[127939, 127999, 8205, 9792, 65039, 8205, 10145, 65039], &[127939, 127999, 8205, 9794, 65039], &[127939, 127999, 8205, 9794, 65039, 8205, 10145, 65039], &[127940, 8205, 9792, 65039], &[127940, 8205, 9794, 65039], &[127940, 127995, 8205, 9792, 65039], &[127940, 127995, 8205, 9794, 65039], &[127940, 127996, 8205, 9792, 65039], &[127940, 127996, 8205, 9794, 65039], &[127940, 127997, 8205, 9792, 65039], &[127940, 127997, 8205, 9794, 65039], &[127940, 127998, 8205, 9792, 65039], &[127940, 127998, 8205, 9794, 65039], &[127940, 127999, 8205, 9792, 65039], &[127940, 127999, 8205, 9794, 65039], &[127946, 8205, 9792, 65039], &[127946, 8205, 9794, 65039], &[127946, 127995, 8205, 9792, 65039], &[127946, 127995, 8205, 9794, 65039], &[127946, 127996, 8205, 9792, 65039], &[127946, 127996, 8205, 9794, 65039], &[127946, 127997, 8205, 9792, 65039], &[127946, 127997, 8205, 9794, 65039], &[127946, 127998, 8205, 9792, 65039], &[127946, 127998, 8205, 9794, 65039], &[127946, 127999, 8205, 9792, 65039], &[127946, 127999, 8205, 9794, 65039], &[127947, 127995, 8205, 9792, 65039], &[127947, 127995, 8205, 9794, 65039], &[127947, 127996, 8205, 9792, 65039], &[127947, 127996, 8205, 9794, 65039], &[127947, 127997, 8205, 9792, 65039], &[127947, 127997, 8205, 9794, 65039], &[127947, 127998, 8205, 9792, 65039], &[127947, 127998, 8205, 9794, 65039], &[127947, 127999, 8205, 9792, 65039], &[127947, 127999, 8205, 9794, 65039], &[127947, 65039, 8205, 9792, 65039], &[127947, 65039, 8205, 9794, 65039], &[127948, 127995, 8205, 9792, 65039], &[127948, 127995, 8205, 9794, 65039], &[127948, 127996, 8205, 9792, 65039], &[127948, 127996, 8205, 9794, 65039], &[127948, 127997, 8205, 9792, 65039], &[127948, 127997, 8205, 9794, 65039], &[127948, 127998, 8205, 9792, 65039], &[127948, 127998, 8205, 9794, 65039], &[127948, 127999, 8205, 9792, 65039], &[127948, 127999, 8205, 9794, 65039], &[127948, 65039, 8205, 9792, 65039], &[127948, 65039, 8205, 9794, 65039], &[128110, 8205, 9792, 65039], &[128110, 8205, 9794, 65039], &[128110, 127995, 8205, 9792, 65039], &[128110, 127995, 8205, 9794, 65039], &[128110, 127996, 8205, 9792, 65039], &[128110, 127996, 8205, 9794, 65039], &[128110, 127997, 8205, 9792, 65039], &[128110, 127997, 8205, 9794, 65039], &[128110, 127998, 8205, 9792, 65039], &[128110, 127998, 8205, 9794, 65039], &[128110, 127999, 8205, 9792, 65039], &[128110, 127999, 8205, 9794, 65039], &[128111, 8205, 9792, 65039], &[128111, 8205, 9794, 65039], &[128112, 8205, 9792, 65039], &[128112, 8205, 9794, 65039], &[128112, 127995, 8205, 9792, 65039], &[128112, 127995, 8205, 9794, 65039], &[128112, 127996, 8205, 9792, 65039], &[128112, 127996, 8205, 9794, 65039], &[128112, 127997, 8205, 9792, 65039], &[128112, 127997, 8205, 9794, 65039], &[128112, 127998, 8205, 9792, 65039], &[128112, 127998, 8205, 9794, 65039], &[128112, 127999, 8205, 9792, 65039], &[128112, 127999, 8205, 9794, 65039], &[128113, 8205, 9792, 65039], &[128113, 8205, 9794, 65039], &[128113, 127995, 8205, 9792, 65039], &[128113, 127995, 8205, 9794, 65039], &[128113, 127996, 8205, 9792, 65039], &[128113, 127996, 8205, 9794, 65039], &[128113, 127997, 8205, 9792, 65039], &[128113, 127997, 8205, 9794, 65039], &[128113, 127998, 8205, 9792, 65039], &[128113, 127998, 8205, 9794, 65039], &[128113, 127999, 8205, 9792, 65039], &[128113, 127999, 8205, 9794, 65039], &[128115, 8205, 9792, 65039], &[128115, 8205, 9794, 65039], &[128115, 127995, 8205, 9792, 65039], &[128115, 127995, 8205, 9794, 65039], &[128115, 127996, 8205, 9792, 65039], &[128115, 127996, 8205, 9794, 65039], &[128115, 127997, 8205, 9792, 65039], &[128115, 127997, 8205, 9794, 65039], &[128115, 127998, 8205, 9792, 65039], &[128115, 127998, 8205, 9794, 65039], &[128115, 127999, 8205, 9792, 65039], &[128115, 127999, 8205, 9794, 65039], &[128119, 8205, 9792, 65039], &[128119, 8205, 9794, 65039], &[128119, 127995, 8205, 9792, 65039], &[128119, 127995, 8205, 9794, 65039], &[128119, 127996, 8205, 9792, 65039], &[128119, 127996, 8205, 9794, 65039], &[128119, 127997, 8205, 9792, 65039], &[128119, 127997, 8205, 9794, 65039], &[128119, 127998, 8205, 9792, 65039], &[128119, 127998, 8205, 9794, 65039], &[128119, 127999, 8205, 9792, 65039], &[128119, 127999, 8205, 9794, 65039], &[128129, 8205, 9792, 65039], &[128129, 8205, 9794, 65039], &[128129, 127995, 8205, 9792, 65039], &[128129, 127995, 8205, 9794, 65039], &[128129, 127996, 8205, 9792, 65039], &[128129, 127996, 8205, 9794, 65039], &[128129, 127997, 8205, 9792, 65039], &[128129, 127997, 8205, 9794, 65039], &[128129, 127998, 8205, 9792, 65039], &[128129, 127998, 8205, 9794, 65039], &[128129, 127999, 8205, 9792, 65039], &[128129, 127999, 8205, 9794, 65039], &[128130, 8205, 9792, 65039], &[128130, 8205, 9794, 65039], &[128130, 127995, 8205, 9792, 65039], &[128130, 127995, 8205, 9794, 65039], &[128130, 127996, 8205, 9792, 65039], &[128130, 127996, 8205, 9794, 65039], &[128130, 127997, 8205, 9792, 65039], &[128130, 127997, 8205, 9794, 65039], &[128130, 127998, 8205, 9792, 65039], &[128130, 127998, 8205, 9794, 65039], &[128130, 127999, 8205, 9792, 65039], &[128130, 127999, 8205, 9794, 65039], &[128134, 8205, 9792, 65039], &[128134, 8205, 9794, 65039], &[128134, 127995, 8205, 9792, 65039], &[128134, 127995, 8205, 9794, 65039], &[128134, 127996, 8205, 9792, 65039], &[128134, 127996, 8205, 9794, 65039], &[128134, 127997, 8205, 9792, 65039], &[128134, 127997, 8205, 9794, 65039], &[128134, 127998, 8205, 9792, 65039], &[128134, 127998, 8205, 9794, 65039], &[128134, 127999, 8205, 9792, 65039], &[128134, 127999, 8205, 9794, 65039], &[128135, 8205, 9792, 65039], &[128135, 8205, 9794, 65039], &[128135, 127995, 8205, 9792, 65039], &[128135, 127995, 8205, 9794, 65039], &[128135, 127996, 8205, 9792, 65039], &[128135, 127996, 8205, 9794, 65039], &[128135, 127997, 8205, 9792, 65039], &[128135, 127997, 8205, 9794, 65039], &[128135, 127998, 8205, 9792, 65039], &[128135, 127998, 8205, 9794, 65039], &[128135, 127999, 8205, 9792, 65039], &[128135, 127999, 8205, 9794, 65039], &[128373, 127995, 8205, 9792, 65039], &[128373, 127995, 8205, 9794, 65039], &[128373, 127996, 8205, 9792, 65039], &[128373, 127996, 8205, 9794, 65039], &[128373, 127997, 8205, 9792, 65039], &[128373, 127997, 8205, 9794, 65039], &[128373, 127998, 8205, 9792, 65039], &[128373, 127998, 8205, 9794, 65039], &[128373, 127999, 8205, 9792, 65039], &[128373, 127999, 8205, 9794, 65039], &[128373, 65039, 8205, 9792, 65039], &[128373, 65039, 8205, 9794, 65039], &[128581, 8205, 9792, 65039], &[128581, 8205, 9794, 65039], &[128581, 127995, 8205, 9792, 65039], &[128581, 127995, 8205, 9794, 65039], &[128581, 127996, 8205, 9792, 65039], &[128581, 127996, 8205, 9794, 65039], &[128581, 127997, 8205, 9792, 65039], &[128581, 127997, 8205, 9794, 65039], &[128581, 127998, 8205, 9792, 65039], &[128581, 127998, 8205, 9794, 65039], &[128581, 127999, 8205, 9792, 65039], &[128581, 127999, 8205, 9794, 65039], &[128582, 8205, 9792, 65039], &[128582, 8205, 9794, 65039], &[128582, 127995, 8205, 9792, 65039], &[128582, 127995, 8205, 9794, 65039], &[128582, 127996, 8205, 9792, 65039], &[128582, 127996, 8205, 9794, 65039], &[128582, 127997, 8205, 9792, 65039], &[128582, 127997, 8205, 9794, 65039], &[128582, 127998, 8205, 9792, 65039], &[128582, 127998, 8205, 9794, 65039], &[128582, 127999, 8205, 9792, 65039], &[128582, 127999, 8205, 9794, 65039], &[128583, 8205, 9792, 65039], &[128583, 8205, 9794, 65039], &[128583, 127995, 8205, 9792, 65039], &[128583, 127995, 8205, 9794, 65039], &[128583, 127996, 8205, 9792, 65039], &[128583, 127996, 8205, 9794, 65039], &[128583, 127997, 8205, 9792, 65039], &[128583, 127997, 8205, 9794, 65039], &[128583, 127998, 8205, 9792, 65039], &[128583, 127998, 8205, 9794, 65039], &[128583, 127999, 8205, 9792, 65039], &[128583, 127999, 8205, 9794, 65039], &[128587, 8205, 9792, 65039], &[128587, 8205, 9794, 65039], &[128587, 127995, 8205, 9792, 65039], &[128587, 127995, 8205, 9794, 65039], &[128587, 127996, 8205, 9792, 65039], &[128587, 127996, 8205, 9794, 65039], &[128587, 127997, 8205, 9792, 65039], &[128587, 127997, 8205, 9794, 65039], &[128587, 127998, 8205, 9792, 65039], &[128587, 127998, 8205, 9794, 65039], &[128587, 127999, 8205, 9792, 65039], &[128587, 127999, 8205, 9794, 65039], &[128589, 8205, 9792, 65039], &[128589, 8205, 9794, 65039], &[128589, 127995, 8205, 9792, 65039], &[128589, 127995, 8205, 9794, 65039], &[128589, 127996, 8205, 9792, 65039], &[128589, 127996, 8205, 9794, 65039], &[128589, 127997, 8205, 9792, 65039], &[128589, 127997, 8205, 9794, 65039], &[128589, 127998, 8205, 9792, 65039], &[128589, 127998, 8205, 9794, 65039], &[128589, 127999, 8205, 9792, 65039], &[128589, 127999, 8205, 9794, 65039], &[128590, 8205, 9792, 65039], &[128590, 8205, 9794, 65039], &[128590, 127995, 8205, 9792, 65039], &[128590, 127995, 8205, 9794, 65039], &[128590, 127996, 8205, 9792, 65039], &[128590, 127996, 8205, 9794, 65039], &[128590, 127997, 8205, 9792, 65039], &[128590, 127997, 8205, 9794, 65039], &[128590, 127998, 8205, 9792, 65039], &[128590, 127998, 8205, 9794, 65039], &[128590, 127999, 8205, 9792, 65039], &[128590, 127999, 8205, 9794, 65039], &[128675, 8205, 9792, 65039], &[128675, 8205, 9794, 65039], &[128675, 127995, 8205, 9792, 65039], &[128675, 127995, 8205, 9794, 65039], &[128675, 127996, 8205, 9792, 65039], &[128675, 127996, 8205, 9794, 65039], &[128675, 127997, 8205, 9792, 65039], &[128675, 127997, 8205, 9794, 65039], &[128675, 127998, 8205, 9792, 65039], &[128675, 127998, 8205, 9794, 65039], &[128675, 127999, 8205, 9792, 65039], &[128675, 127999, 8205, 9794, 65039], &[128692, 8205, 9792, 65039], &[128692, 8205, 9794, 65039], &[128692, 127995, 8205, 9792, 65039], &[128692, 127995, 8205, 9794, 65039], &[128692, 127996, 8205, 9792, 65039], &[128692, 127996, 8205, 9794, 65039], &[128692, 127997, 8205, 9792, 65039], &[128692, 127997, 8205, 9794, 65039], &[128692, 127998, 8205, 9792, 65039], &[128692, 127998, 8205, 9794, 65039], &[128692, 127999, 8205, 9792, 65039], &[128692, 127999, 8205, 9794, 65039], &[128693, 8205, 9792, 65039], &[128693, 8205, 9794, 65039], &[128693, 127995, 8205, 9792, 65039], &[128693, 127995, 8205, 9794, 65039], &[128693, 127996, 8205, 9792, 65039], &[128693, 127996, 8205, 9794, 65039], &[128693, 127997, 8205, 9792, 65039], &[128693, 127997, 8205, 9794, 65039], &[128693, 127998, 8205, 9792, 65039], &[128693, 127998, 8205, 9794, 65039], &[128693, 127999, 8205, 9792, 65039], &[128693, 127999, 8205, 9794, 65039], &[128694, 8205, 9792, 65039], &[128694, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 8205, 9794, 65039], &[128694, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127995, 8205, 9792, 65039], &[128694, 127995, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127995, 8205, 9794, 65039], &[128694, 127995, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127996, 8205, 9792, 65039], &[128694, 127996, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127996, 8205, 9794, 65039], &[128694, 127996, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127997, 8205, 9792, 65039], &[128694, 127997, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127997, 8205, 9794, 65039], &[128694, 127997, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127998, 8205, 9792, 65039], &[128694, 127998, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127998, 8205, 9794, 65039], &[128694, 127998, 8205, 9794, 65039, 8205, 10145, 65039], &[128694, 127999, 8205, 9792, 65039], &[128694, 127999, 8205, 9792, 65039, 8205, 10145, 65039], &[128694, 127999, 8205, 9794, 65039], &[128694, 127999, 8205, 9794, 65039, 8205, 10145, 65039], &[129318, 8205, 9792, 65039], &[129318, 8205, 9794, 65039], &[129318, 127995, 8205, 9792, 65039], &[129318, 127995, 8205, 9794, 65039], &[129318, 127996, 8205, 9792, 65039], &[129318, 127996, 8205, 9794, 65039], &[129318, 127997, 8205, 9792, 65039], &[129318, 127997, 8205, 9794, 65039], &[129318, 127998, 8205, 9792, 65039], &[129318, 127998, 8205, 9794, 65039], &[129318, 127999, 8205, 9792, 65039], &[129318, 127999, 8205, 9794, 65039], &[129333, 8205, 9792, 65039], &[129333, 8205, 9794, 65039], &[129333, 127995, 8205, 9792, 65039], &[129333, 127995, 8205, 9794, 65039], &[129333, 127996, 8205, 9792, 65039], &[129333, 127996, 8205, 9794, 65039], &[129333, 127997, 8205, 9792, 65039], &[129333, 127997, 8205, 9794, 65039], &[129333, 127998, 8205, 9792, 65039], &[129333, 127998, 8205, 9794, 65039], &[129333, 127999, 8205, 9792, 65039], &[129333, 127999, 8205, 9794, 65039], &[129335, 8205, 9792, 65039], &[129335, 8205, 9794, 65039], &[129335, 127995, 8205, 9792, 65039], &[129335, 127995, 8205, 9794, 65039], &[129335, 127996, 8205, 9792, 65039], &[129335, 127996, 8205, 9794, 65039], &[129335, 127997, 8205, 9792, 65039], &[129335, 127997, 8205, 9794, 65039], &[129335, 127998, 8205, 9792, 65039], &[129335, 127998, 8205, 9794, 65039], &[129335, 127999, 8205, 9792, 65039], &[129335, 127999, 8205, 9794, 65039], &[129336, 8205, 9792, 65039], &[129336, 8205, 9794, 65039], &[129336, 127995, 8205, 9792, 65039], &[129336, 127995, 8205, 9794, 65039], &[129336, 127996, 8205, 9792, 65039], &[129336, 127996, 8205, 9794, 65039], &[129336, 127997, 8205, 9792, 65039], &[129336, 127997, 8205, 9794, 65039], &[129336, 127998, 8205, 9792, 65039], &[129336, 127998, 8205, 9794, 65039], &[129336, 127999, 8205, 9792, 65039], &[129336, 127999, 8205, 9794, 65039], &[129337, 8205, 9792, 65039], &[129337, 8205, 9794, 65039], &[129337, 127995, 8205, 9792, 65039], &[129337, 127995, 8205, 9794, 65039], &[129337, 127996, 8205, 9792, 65039], &[129337, 127996, 8205, 9794, 65039], &[129337, 127997, 8205, 9792, 65039], &[129337, 127997, 8205, 9794, 65039], &[129337, 127998, 8205, 9792, 65039], &[129337, 127998, 8205, 9794, 65039], &[129337, 127999, 8205, 9792, 65039], &[129337, 127999, 8205, 9794, 65039], &[129340, 8205, 9792, 65039], &[129340, 8205, 9794, 65039], &[129341, 8205, 9792, 65039], &[129341, 8205, 9794, 65039], &[129341, 127995, 8205, 9792, 65039], &[129341, 127995, 8205, 9794, 65039], &[129341, 127996, 8205, 9792, 65039], &[129341, 127996, 8205, 9794, 65039], &[129341, 127997, 8205, 9792, 65039], &[129341, 127997, 8205, 9794, 65039], &[129341, 127998, 8205, 9792, 65039], &[129341, 127998, 8205, 9794, 65039], &[129341, 127999, 8205, 9792, 65039], &[129341, 127999, 8205, 9794, 65039], &[129342, 8205, 9792, 65039], &[129342, 8205, 9794, 65039], &[129342, 127995, 8205, 9792, 65039], &[129342, 127995, 8205, 9794, 65039], &[129342, 127996, 8205, 9792, 65039], &[129342, 127996, 8205, 9794, 65039], &[129342, 127997, 8205, 9792, 65039], &[129342, 127997, 8205, 9794, 65039], &[129342, 127998, 8205, 9792, 65039], &[129342, 127998, 8205, 9794, 65039], &[129342, 127999, 8205, 9792, 65039], &[129342, 127999, 8205, 9794, 65039], &[129464, 8205, 9792, 65039], &[129464, 8205, 9794, 65039], &[129464, 127995, 8205, 9792, 65039], &[129464, 127995, 8205, 9794, 65039], &[129464, 127996, 8205, 9792, 65039], &[129464, 127996, 8205, 9794, 65039], &[129464, 127997, 8205, 9792, 65039], &[129464, 127997, 8205, 9794, 65039], &[129464, 127998, 8205, 9792, 65039], &[129464, 127998, 8205, 9794, 65039], &[129464, 127999, 8205, 9792, 65039], &[129464, 127999, 8205, 9794, 65039], &[129465, 8205, 9792, 65039], &[129465, 8205, 9794, 65039], &[129465, 127995, 8205, 9792, 65039], &[129465, 127995, 8205, 9794, 65039], &[129465, 127996, 8205, 9792, 65039], &[129465, 127996, 8205, 9794, 65039], &[129465, 127997, 8205, 9792, 65039], &[129465, 127997, 8205, 9794, 65039], &[129465, 127998, 8205, 9792, 65039], &[129465, 127998, 8205, 9794, 65039], &[129465, 127999, 8205, 9792, 65039], &[129465, 127999, 8205, 9794, 65039], &[129485, 8205, 9792, 65039], &[129485, 8205, 9794, 65039], &[129485, 127995, 8205, 9792, 65039], &[129485, 127995, 8205, 9794, 65039], &[129485, 127996, 8205, 9792, 65039], &[129485, 127996, 8205, 9794, 65039], &[129485, 127997, 8205, 9792, 65039], &[129485, 127997, 8205, 9794, 65039], &[129485, 127998, 8205, 9792, 65039], &[129485, 127998, 8205, 9794, 65039], &[129485, 127999, 8205, 9792, 65039], &[129485, 127999, 8205, 9794, 65039], &[129486, 8205, 9792, 65039], &[129486, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 8205, 9794, 65039], &[129486, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127995, 8205, 9792, 65039], &[129486, 127995, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127995, 8205, 9794, 65039], &[129486, 127995, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127996, 8205, 9792, 65039], &[129486, 127996, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127996, 8205, 9794, 65039], &[129486, 127996, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127997, 8205, 9792, 65039], &[129486, 127997, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127997, 8205, 9794, 65039], &[129486, 127997, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127998, 8205, 9792, 65039], &[129486, 127998, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127998, 8205, 9794, 65039], &[129486, 127998, 8205, 9794, 65039, 8205, 10145, 65039], &[129486, 127999, 8205, 9792, 65039], &[129486, 127999, 8205, 9792, 65039, 8205, 10145, 65039], &[129486, 127999, 8205, 9794, 65039], &[129486, 127999, 8205, 9794, 65039, 8205, 10145, 65039], &[129487, 8205, 9792, 65039], &[129487, 8205, 9794, 65039], &[129487, 127995, 8205, 9792, 65039], &[129487, 127995, 8205, 9794, 65039], &[129487, 127996, 8205, 9792, 65039], &[129487, 127996, 8205, 9794, 65039], &[129487, 127997, 8205, 9792, 65039], &[129487, 127997, 8205, 9794, 65039], &[129487, 127998, 8205, 9792, 65039], &[129487, 127998, 8205, 9794, 65039], &[129487, 127999, 8205, 9792, 65039], &[129487, 127999, 8205, 9794, 65039], &[129492, 8205, 9792, 65039], &[129492, 8205, 9794, 65039], &[129492, 127995, 8205, 9792, 65039], &[129492, 127995, 8205, 9794, 65039], &[129492, 127996, 8205, 9792, 65039], &[129492, 127996, 8205, 9794, 65039], &[129492, 127997, 8205, 9792, 65039], &[129492, 127997, 8205, 9794, 65039], &[129492, 127998, 8205, 9792, 65039], &[129492, 127998, 8205, 9794, 65039], &[129492, 127999, 8205, 9792, 65039], &[129492, 127999, 8205, 9794, 65039], &[129494, 8205, 9792, 65039], &[129494, 8205, 9794, 65039], &[129494, 127995, 8205, 9792, 65039], &[129494, 127995, 8205, 9794, 65039], &[129494, 127996, 8205, 9792, 65039], &[129494, 127996, 8205, 9794, 65039], &[129494, 127997, 8205, 9792, 65039], &[129494, 127997, 8205, 9794, 65039], &[129494, 127998, 8205, 9792, 65039], &[129494, 127998, 8205, 9794, 65039], &[129494, 127999, 8205, 9792, 65039], &[129494, 127999, 8205, 9794, 65039], &[129495, 8205, 9792, 65039], &[129495, 8205, 9794, 65039], &[129495, 127995, 8205, 9792, 65039], &[129495, 127995, 8205, 9794, 65039], &[129495, 127996, 8205, 9792, 65039], &[129495, 127996, 8205, 9794, 65039], &[129495, 127997, 8205, 9792, 65039], &[129495, 127997, 8205, 9794, 65039], &[129495, 127998, 8205, 9792, 65039], &[129495, 127998, 8205, 9794, 65039], &[129495, 127999, 8205, 9792, 65039], &[129495, 127999, 8205, 9794, 65039], &[129496, 8205, 9792, 65039], &[129496, 8205, 9794, 65039], &[129496, 127995, 8205, 9792, 65039], &[129496, 127995, 8205, 9794, 65039], &[129496, 127996, 8205, 9792, 65039], &[129496, 127996, 8205, 9794, 65039], &[129496, 127997, 8205, 9792, 65039], &[129496, 127997, 8205, 9794, 65039], &[129496, 127998, 8205, 9792, 65039], &[129496, 127998, 8205, 9794, 65039], &[129496, 127999, 8205, 9792, 65039], &[129496, 127999, 8205, 9794, 65039], &[129497, 8205, 9792, 65039], &[129497, 8205, 9794, 65039], &[129497, 127995, 8205, 9792, 65039], &[129497, 127995, 8205, 9794, 65039], &[129497, 127996, 8205, 9792, 65039], &[129497, 127996, 8205, 9794, 65039], &[129497, 127997, 8205, 9792, 65039], &[129497, 127997, 8205, 9794, 65039], &[129497, 127998, 8205, 9792, 65039], &[129497, 127998, 8205, 9794, 65039], &[129497, 127999, 8205, 9792, 65039], &[129497, 127999, 8205, 9794, 65039], &[129498, 8205, 9792, 65039], &[129498, 8205, 9794, 65039], &[129498, 127995, 8205, 9792, 65039], &[129498, 127995, 8205, 9794, 65039], &[129498, 127996, 8205, 9792, 65039], &[129498, 127996, 8205, 9794, 65039], &[129498, 127997, 8205, 9792, 65039], &[129498, 127997, 8205, 9794, 65039], &[129498, 127998, 8205, 9792, 65039], &[129498, 127998, 8205, 9794, 65039], &[129498, 127999, 8205, 9792, 65039], &[129498, 127999, 8205, 9794, 65039], &[129499, 8205, 9792, 65039], &[129499, 8205, 9794, 65039], &[129499, 127995, 8205, 9792, 65039], &[129499, 127995, 8205, 9794, 65039], &[129499, 127996, 8205, 9792, 65039], &[129499, 127996, 8205, 9794, 65039], &[129499, 127997, 8205, 9792, 65039], &[129499, 127997, 8205, 9794, 65039], &[129499, 127998, 8205, 9792, 65039], &[129499, 127998, 8205, 9794, 65039], &[129499, 127999, 8205, 9792, 65039], &[129499, 127999, 8205, 9794, 65039], &[129500, 8205, 9792, 65039], &[129500, 8205, 9794, 65039], &[129500, 127995, 8205, 9792, 65039], &[129500, 127995, 8205, 9794, 65039], &[129500, 127996, 8205, 9792, 65039], &[129500, 127996, 8205, 9794, 65039], &[129500, 127997, 8205, 9792, 65039], &[129500, 127997, 8205, 9794, 65039], &[129500, 127998, 8205, 9792, 65039], &[129500, 127998, 8205, 9794, 65039], &[129500, 127999, 8205, 9792, 65039], &[129500, 127999, 8205, 9794, 65039], &[129501, 8205, 9792, 65039], &[129501, 8205, 9794, 65039], &[129501, 127995, 8205, 9792, 65039], &[129501, 127995, 8205, 9794, 65039], &[129501, 127996, 8205, 9792, 65039], &[129501, 127996, 8205, 9794, 65039], &[129501, 127997, 8205, 9792, 65039], &[129501, 127997, 8205, 9794, 65039], &[129501, 127998, 8205, 9792, 65039], &[129501, 127998, 8205, 9794, 65039], &[129501, 127999, 8205, 9792, 65039], &[129501, 127999, 8205, 9794, 65039], &[129502, 8205, 9792, 65039], &[129502, 8205, 9794, 65039], &[129503, 8205, 9792, 65039], &[129503, 8205, 9794, 65039], &[128104, 8205, 129456], &[128104, 8205, 129457], &[128104, 8205, 129458], &[128104, 8205, 129459], &[128104, 127995, 8205, 129456], &[128104, 127995, 8205, 129457], &[128104, 127995, 8205, 129458], &[128104, 127995, 8205, 129459], &[128104, 127996, 8205, 129456], &[128104, 127996, 8205, 129457], &[128104, 127996, 8205, 129458], &[128104, 127996, 8205, 129459], &[128104, 127997, 8205, 129456], &[128104, 127997, 8205, 129457], &[128104, 127997, 8205, 129458], &[128104, 127997, 8205, 129459], &[128104, 127998, 8205, 129456], &[128104, 127998, 8205, 129457], &[128104, 127998, 8205, 129458], &[128104, 127998, 8205, 129459], &[128104, 127999, 8205, 129456], &[128104, 127999, 8205, 129457], &[128104, 127999, 8205, 129458], &[128104, 127999, 8205, 129459], &[128105, 8205, 129456], &[128105, 8205, 129457], &[128105, 8205, 129458], &[128105, 8205, 129459], &[128105, 127995, 8205, 129456], &[128105, 127995, 8205, 129457], &[128105, 127995, 8205, 129458], &[128105, 127995, 8205, 129459], &[128105, 127996, 8205, 129456], &[128105, 127996, 8205, 129457], &[128105, 127996, 8205, 129458], &[128105, 127996, 8205, 129459], &[128105, 127997, 8205, 129456], &[128105, 127997, 8205, 129457], &[128105, 127997, 8205, 129458], &[128105, 127997, 8205, 129459], &[128105, 127998, 8205, 129456], &[128105, 127998, 8205, 129457], &[128105, 127998, 8205, 129458], &[128105, 127998, 8205, 129459], &[128105, 127999, 8205, 129456], &[128105, 127999, 8205, 129457], &[128105, 127999, 8205, 129458], &[128105, 127999, 8205, 129459], &[129489, 8205, 129456], &[129489, 8205, 129457], &[129489, 8205, 129458], &[129489, 8205, 129459], &[129489, 127995, 8205, 129456], &[129489, 127995, 8205, 129457], &[129489, 127995, 8205, 129458], &[129489, 127995, 8205, 129459], &[129489, 127996, 8205, 129456], &[129489, 127996, 8205, 129457], &[129489, 127996, 8205, 129458], &[129489, 127996, 8205, 129459], &[129489, 127997, 8205, 129456], &[129489, 127997, 8205, 129457], &[129489, 127997, 8205, 129458], &[129489, 127997, 8205, 129459], &[129489, 127998, 8205, 129456], &[129489, 127998, 8205, 129457], &[129489, 127998, 8205, 129458], &[129489, 127998, 8205, 129459], &[129489, 127999, 8205, 129456], &[129489, 127999, 8205, 129457], &[129489, 127999, 8205, 129458], &[129489, 127999, 8205, 129459], &[9939, 65039, 8205, 128165], &[10084, 65039, 8205, 128293], &[10084, 65039, 8205, 129657], &[127812, 8205, 129003], &[127819, 8205, 129001], &[127987, 65039, 8205, 9895, 65039], &[127987, 65039, 8205, 127752], &[127988, 8205, 9760, 65039], &[128008, 8205, 11035], &[128021, 8205, 129466], &[128038, 8205, 11035], &[128038, 8205, 128293], &[128059, 8205, 10052, 65039], &[128065, 65039, 8205, 128488, 65039], &[128558, 8205, 128168], &[128565, 8205, 128171], &[128566, 8205, 127787, 65039], &[128578, 8205, 8596, 65039], &[128578, 8205, 8597, 65039], ]; /// Return the code point ranges of the 'RGI_Emoji' Unicode property. pub(crate) fn rgi_emoji_sets() -> &'static [&'static [u32]] { RGI_EMOJI.as_slice() } #[derive(Debug, Clone, Copy)] pub enum UnicodeStringProperty { BasicEmoji, EmojiKeycapSequence, RGIEmojiFlagSequence, RGIEmojiModifierSequence, RGIEmojiTagSequence, RGIEmojiZWJSequence, RGIEmoji, } pub(crate) fn string_property_sets(value: &UnicodeStringProperty) -> &'static [&'static [u32]] { use UnicodeStringProperty::*; match value { BasicEmoji => basic_emoji_sets(), EmojiKeycapSequence => emoji_keycap_sequence_sets(), RGIEmojiFlagSequence => rgi_emoji_flag_sequence_sets(), RGIEmojiModifierSequence => rgi_emoji_modifier_sequence_sets(), RGIEmojiTagSequence => rgi_emoji_tag_sequence_sets(), RGIEmojiZWJSequence => rgi_emoji_zwj_sequence_sets(), RGIEmoji => rgi_emoji_sets(), } } pub fn unicode_string_property_from_str(s: &str) -> Option { use UnicodeStringProperty::*; match s { "Basic_Emoji" => Some(BasicEmoji), "Emoji_Keycap_Sequence" => Some(EmojiKeycapSequence), "RGI_Emoji_Flag_Sequence" => Some(RGIEmojiFlagSequence), "RGI_Emoji_Modifier_Sequence" => Some(RGIEmojiModifierSequence), "RGI_Emoji_Tag_Sequence" => Some(RGIEmojiTagSequence), "RGI_Emoji_ZWJ_Sequence" => Some(RGIEmojiZWJSequence), "RGI_Emoji" => Some(RGIEmoji), _ => None, } } regress-0.10.5/src/util.rs000064400000000000000000000220141046102023000134720ustar 00000000000000use crate::bytesearch::ByteBitmap; use crate::codepointset::CODE_POINT_MAX; use crate::codepointset::Interval; #[cfg(not(feature = "std"))] use alloc::vec::Vec; use core::cmp::Ordering; use core::ops::{Index, IndexMut}; use core::slice::SliceIndex; // A macro which expresses either checked or unchecked reachability, depending on prohibit-unsafe. macro_rules! rs_unreachable { () => {{ if cfg!(feature = "prohibit-unsafe") { unreachable!(); } else { unsafe { core::hint::unreachable_unchecked() } } }}; ($msg:expr) => { if cfg!(feature = "prohibit-unsafe") { unreachable!($msg); } else { unsafe { core::hint::unreachable_unchecked() } } }; } /// A trait which performs bounds checking only in debug mode. pub trait DebugCheckIndex: Index + IndexMut { fn iat(&self, index: Idx) -> &Self::Output; fn mat(&mut self, index: Idx) -> &mut Self::Output; } impl DebugCheckIndex for Vec where Idx: SliceIndex<[T]> + Clone, { #[inline(always)] fn iat(&self, idx: Idx) -> &Self::Output { debug_assert!(self.get(idx.clone()).is_some(), "Index out of bounds"); if cfg!(feature = "prohibit-unsafe") { self.index(idx) } else { unsafe { self.get_unchecked(idx) } } } #[inline(always)] fn mat(&mut self, idx: Idx) -> &mut Self::Output { debug_assert!(self.get(idx.clone()).is_some(), "Index out of bounds"); if cfg!(feature = "prohibit-unsafe") { self.index_mut(idx) } else { unsafe { self.get_unchecked_mut(idx) } } } } impl DebugCheckIndex for [T] where Idx: SliceIndex<[T]> + Clone, { #[inline(always)] fn iat(&self, idx: Idx) -> &Self::Output { debug_assert!(self.get(idx.clone()).is_some(), "Index out of bounds"); if cfg!(feature = "prohibit-unsafe") { self.index(idx) } else { unsafe { self.get_unchecked(idx) } } } #[inline(always)] fn mat(&mut self, idx: Idx) -> &mut Self::Output { debug_assert!(self.get(idx.clone()).is_some(), "Index out of bounds"); if cfg!(feature = "prohibit-unsafe") { self.index_mut(idx) } else { unsafe { self.get_unchecked_mut(idx) } } } } // Helper function for matching u32s against chars. // It would be pleasant if you could pattern-match u32s against chars, but Rust does not allow this. // Convert a u32 to a char, except if the conversion fails, return the largest char. // Be careful to not use the result of this conversion except to pattern match against literals. pub fn to_char_sat(c: u32) -> char { char::from_u32(c).unwrap_or(core::char::MAX) } /// \return the first byte of a UTF-8 encoded code point. /// We do not use char because we don't want to deal with failing on surrogates. #[inline(always)] pub fn utf8_first_byte(cp: u32) -> u8 { debug_assert!(cp <= CODE_POINT_MAX); if cp < 0x80 { // One byte encoding. cp as u8 } else if cp < 0x800 { // Two byte encoding. ((cp >> 6) & 0x1F) as u8 | 0b1100_0000 } else if cp < 0x10000 { // Three byte encoding. ((cp >> 12) & 0x0F) as u8 | 0b1110_0000 } else { // Four byte encoding. ((cp >> 18) & 0x07) as u8 | 0b1111_0000 } } /// Add all of the first bytes of a code point interval to a byte bitmap. pub fn add_utf8_first_bytes_to_bitmap(interval: Interval, bitmap: &mut ByteBitmap) { // Note this is an inclusive interval. let Interval { first, last } = interval; let ranges = [ (first, last.min(0x7F)), // 1 byte range (first.max(0x80), last.min(0x7FF)), // 2 byte range (first.max(0x800), last.min(0xFFFF)), // 3 byte range (first.max(0x10000), last), // 4 byte range ]; for (first, last) in ranges.into_iter() { if first <= last { for byte in utf8_first_byte(first)..=utf8_first_byte(last) { bitmap.set(byte); } } } } pub trait SliceHelp { type Item; /// Given that self is sorted according to f, returns the range of indexes /// where f indicates equal elements. fn equal_range_by<'a, F>(&'a self, f: F) -> core::ops::Range where F: FnMut(&'a Self::Item) -> Ordering; } impl SliceHelp for [T] { type Item = T; fn equal_range_by<'a, F>(&'a self, mut f: F) -> core::ops::Range where F: FnMut(&'a Self::Item) -> Ordering, { let left = self .binary_search_by(|v| f(v).then(Ordering::Greater)) .unwrap_err(); let right = self[left..] .binary_search_by(|v| f(v).then(Ordering::Less)) .unwrap_err() + left; left..right } } // Given a byte \p b, keep its low \p mask bits, and then shift left by \p shift. const fn mask_shift(b: u8, mask: u8, shift: u8) -> u32 { let masked = b & ((1 << mask) - 1); (masked as u32) << (shift as u32) } // Number of significant bits in a utf8 continuation byte. const UTF8_CONT_SIGBITS: u8 = 6; /// \return true if \p b is a UTF8 continutation byte. #[inline(always)] pub fn is_utf8_continuation(b: u8) -> bool { (b & 0b1100_0000) == 0b1000_0000 } // Construct a code point from a list of bytes. #[inline(always)] pub fn utf8_w2(b0: u8, b1: u8) -> u32 { debug_assert!(!is_utf8_continuation(b0) && is_utf8_continuation(b1)); debug_assert!(b0 >> 5 == 0b110); mask_shift(b0, 5, UTF8_CONT_SIGBITS) | mask_shift(b1, UTF8_CONT_SIGBITS, 0) } #[inline(always)] pub fn utf8_w3(b0: u8, b1: u8, b2: u8) -> u32 { debug_assert!( !is_utf8_continuation(b0) && is_utf8_continuation(b1) && is_utf8_continuation(b2) ); debug_assert!(b0 >> 4 == 0b1110); mask_shift(b0, 4, 2 * UTF8_CONT_SIGBITS) | mask_shift(b1, UTF8_CONT_SIGBITS, UTF8_CONT_SIGBITS) | mask_shift(b2, UTF8_CONT_SIGBITS, 0) } #[inline(always)] pub fn utf8_w4(b0: u8, b1: u8, b2: u8, b3: u8) -> u32 { debug_assert!( !is_utf8_continuation(b0) && is_utf8_continuation(b1) && is_utf8_continuation(b2) && is_utf8_continuation(b3) ); debug_assert!(b0 >> 3 == 0b11110); mask_shift(b0, 3, 3 * UTF8_CONT_SIGBITS) | mask_shift(b1, UTF8_CONT_SIGBITS, 2 * UTF8_CONT_SIGBITS) | mask_shift(b2, UTF8_CONT_SIGBITS, UTF8_CONT_SIGBITS) | mask_shift(b3, UTF8_CONT_SIGBITS, 0) } #[cfg(test)] mod tests { use super::{ByteBitmap, Interval, SliceHelp, add_utf8_first_bytes_to_bitmap, utf8_first_byte}; #[test] fn ranges() { let vals = [0, 1, 2, 3, 4, 4, 4, 7, 8, 9, 9]; let fast_er = |needle: usize| vals.equal_range_by(|v| v.cmp(&needle)); let slow_er = |needle: usize| { let mut left = 0; while left < vals.len() && vals[left] < needle { left += 1 } let mut right = left; while right < vals.len() && vals[right] == needle { right += 1 } left..right }; for i in 0..10 { assert_eq!(fast_er(i), slow_er(i)) } } #[test] fn utf8() { for &cp in &[ 0x0, 0x7, 0xFF, 0x80, 0xABC, 0x7FF, 0x800, 0x801, 0xFFFF, 0x10000, 0x10001, 0x1FFFF, super::CODE_POINT_MAX - 1, super::CODE_POINT_MAX, ] { use super::{utf8_w2, utf8_w3, utf8_w4}; let mut buff = [0; 4]; let s = core::char::from_u32(cp).unwrap().encode_utf8(&mut buff); let bytes = s.as_bytes(); assert_eq!(bytes[0], utf8_first_byte(cp)); match bytes.len() { 1 => assert_eq!(bytes[0] as u32, cp), 2 => assert_eq!(utf8_w2(bytes[0], bytes[1]), cp), 3 => assert_eq!(utf8_w3(bytes[0], bytes[1], bytes[2]), cp), 4 => assert_eq!(utf8_w4(bytes[0], bytes[1], bytes[2], bytes[3]), cp), _ => panic!("Unexpected utf8 sequence length"), } } } #[test] fn test_add_utf8_first_bytes_to_bitmap() { let locs = [ 0, 1, 2, 3, 17, 25, 34, 99, 127, 128, 150, 255, 256, 257, 511, 512, 513, 0x7FF, 0x800, 0x905, 0xA123, 0xFF0F, 0xFFFF, 0x10000, 0x10001, 0x1FFFF, 0x20001, 0x2FFF7, 0x50001, 0x100000, 0x10FFFE, 0x10FFFF, ]; for (idx, &first) in locs.iter().enumerate() { let mut expected = ByteBitmap::default(); for &last in locs[idx..].iter() { assert!(first <= last); for cp in first..=last { expected.set(utf8_first_byte(cp)); } let mut bitmap = ByteBitmap::default(); add_utf8_first_bytes_to_bitmap(Interval { first, last }, &mut bitmap); assert_eq!(bitmap, expected); } } } } regress-0.10.5/tests/anchored_optimization.rs000064400000000000000000000017011046102023000174610ustar 00000000000000use regress::Regex; #[test] fn test_anchored_optimization() { // Test basic anchored regex let re = Regex::new(r"^abc").unwrap(); assert!(re.find("abc").is_some()); assert!(re.find("abcdef").is_some()); assert!(re.find("xabc").is_none()); // Should not match when not at start // Test anchored regex with more complex pattern let re = Regex::new(r"^hello\s+world").unwrap(); assert!(re.find("hello world").is_some()); assert!(re.find("hello world").is_some()); assert!(re.find(" hello world").is_none()); // Should not match when not at start // Test anchored regex with capture groups let re = Regex::new(r"^(\w+)=(\d+)").unwrap(); let text = "key=123 other=456"; let m = re.find(text).unwrap(); assert_eq!(m.group(1).map(|r| &text[r]), Some("key")); assert_eq!(m.group(2).map(|r| &text[r]), Some("123")); assert!(re.find(" key=123").is_none()); // Should not match when not at start } regress-0.10.5/tests/common/mod.rs000064400000000000000000000335701046102023000151500ustar 00000000000000#![allow(clippy::uninlined_format_args)] /// Test that \p pattern fails to parse with default flags. pub fn test_parse_fails(pattern: &str) { let res = regress::Regex::new(pattern); assert!(res.is_err(), "Pattern should not have parsed: {}", pattern); } /// Test that \p pattern fails to parse with flags. pub fn test_parse_fails_flags(pattern: &str, flags: &str) { let res = regress::Regex::with_flags(pattern, flags); assert!(res.is_err(), "Pattern should not have parsed: {}", pattern); } /// Format a Match by inserting commas between all capture groups. fn format_match(r: ®ress::Match, input: &str) -> String { let mut result = input[r.range()].to_string(); for cg in r.captures.iter() { result.push(','); if let Some(cg) = cg { result.push_str(&input[cg.clone()]) } } result } /// Encode a string as UTF16. pub fn to_utf16(input: &str) -> Vec { input.encode_utf16().collect() } /// Given a range of a string encoded as UTF16, return the corresponding /// range in the original string (UTF-8). pub fn range_from_utf16(utf16: &[u16], r: regress::Range) -> regress::Range { use std::char::decode_utf16; // Figure out start. let start_utf8: usize = decode_utf16(utf16[0..r.start].iter().copied()) .map(|r| r.expect("Invalid UTF16").len_utf8()) .sum(); let len_utf8: usize = decode_utf16(utf16[r].iter().copied()) .map(|r| r.expect("Invalid UTF16").len_utf8()) .sum(); start_utf8..(start_utf8 + len_utf8) } pub trait StringTestHelpers { /// "Fluent" style helper for testing that a String is equal to a str. fn test_eq(&self, s: &str); } impl StringTestHelpers for String { fn test_eq(&self, rhs: &str) { assert_eq!(self.as_str(), rhs) } } pub trait VecTestHelpers { /// "Fluent" style helper for testing that a Vec<&str> is equal to a /// Vec<&str>. fn test_eq(&self, rhs: Vec<&str>); } impl VecTestHelpers for Vec<&str> { fn test_eq(&self, rhs: Vec<&str>) { assert_eq!(*self, rhs) } } /// A compiled regex which remembers a TestConfig. #[derive(Debug, Clone)] pub struct TestCompiledRegex { re: regress::Regex, tc: TestConfig, } impl TestCompiledRegex { /// Search for self in \p input, returning a list of all matches. #[track_caller] pub fn matches(&'_ self, input: &'_ str, start: usize) -> Vec { use regress::backends as rbe; #[cfg(feature = "utf16")] { // We don't test the PikeVM backend with UTF16 or UCS2. if self.tc.encoding == Encoding::Utf16 { return self.match_utf16(input, start); } else if self.tc.encoding == Encoding::Ucs2 { // Don't test with UCS-2 if the input contains a surrogate pair, // as the tests expect these to pass. UCS-2 is tested separately // in other places. if input.chars().any(|c| c > '\u{FFFF}') { return self.match_utf16(input, start); } return self.match_ucs2(input, start); } } match (self.tc.use_ascii(input), self.tc.backend) { (true, Backend::PikeVM) => { rbe::find::(&self.re, input, start).collect() } (false, Backend::PikeVM) => { rbe::find::(&self.re, input, start).collect() } (true, Backend::Backtracking) => { rbe::find_ascii::(&self.re, input, start).collect() } (false, Backend::Backtracking) => { rbe::find::(&self.re, input, start).collect() } } } /// Encode a string as UTF16, and match against it as UTF16. /// 'start' is given as the byte offset into the UTF8 string. #[cfg(feature = "utf16")] #[track_caller] pub fn match_utf16(&self, input: &str, start: usize) -> Vec { // convert the input and start to UTF16. let u16_start = input[..start].chars().map(char::len_utf16).sum(); let u16_input = to_utf16(input); let mut matches: Vec<_> = self.re.find_from_utf16(&u16_input, u16_start).collect(); // Convert any ranges back to UTF8. for matc in matches.iter_mut() { matc.range = range_from_utf16(&u16_input, matc.range()); for r in matc.captures.iter_mut().flatten() { *r = range_from_utf16(&u16_input, r.clone()); } } matches } /// Encode a string as UTF16, and match against it as UCS2. #[cfg(feature = "utf16")] #[track_caller] pub fn match_ucs2(&self, input: &str, start: usize) -> Vec { let u16_start = input[..start].chars().map(char::len_utf16).sum(); let u16_input = to_utf16(input); let mut matches: Vec<_> = self.re.find_from_ucs2(&u16_input, u16_start).collect(); // Convert any ranges back to UTF8. for matc in matches.iter_mut() { matc.range = range_from_utf16(&u16_input, matc.range()); for r in matc.captures.iter_mut().flatten() { *r = range_from_utf16(&u16_input, r.clone()); } } matches } /// Search for self in \p input, returning the first Match, or None if /// none. pub fn find(&self, input: &str) -> Option { self.matches(input, 0).into_iter().next() } /// Like find(), but for UTF-16. #[cfg(feature = "utf16")] pub fn find_utf16(&self, input: &str) -> Option { self.match_utf16(input, 0).into_iter().next() } /// Like find(), but for UCS2. #[cfg(feature = "utf16")] pub fn find_ucs2(&self, input: &str) -> Option { self.match_ucs2(input, 0).into_iter().next() } /// Match against a string, returning the first formatted match. #[track_caller] pub fn match1f(&self, input: &str) -> String { match self.find(input) { Some(m) => format_match(&m, input), None => panic!("Failed to match {}", input), } } /// Match against a string, returning the string of the named capture group given. pub fn match1_named_group(&self, input: &str, group: &str) -> String { match self.find(input) { Some(m) => match m.named_group(group) { Some(r) => match input.get(r.clone()) { Some(str) => str.to_string(), None => panic!("Cannot get range from string input {:?}", r), }, None => panic!("Named capture group does not exist {}", group), }, None => panic!("Failed to match {}", input), } } /// Match against a string, returning the match as a Vec containing None /// for unmatched groups, or the matched strings. pub fn match1_vec<'b>(&self, input: &'b str) -> Vec> { let mut result = Vec::new(); let m: regress::Match = self.find(input).expect("Failed to match"); result.push(Some(&input[m.range()])); for cr in m.captures { result.push(cr.map(|r| &input[r])); } result } /// Test that matching against \p input fails. #[track_caller] pub fn test_fails(&self, input: &str) { assert!(self.find(input).is_none(), "Should not have matched") } /// Test that matching against \p input succeeds. #[track_caller] pub fn test_succeeds(&self, input: &str) { assert!(self.find(input).is_some(), "Should have matched") } /// Return a list of all non-overlapping total match ranges from a given /// start. pub fn match_all_from(&'_ self, input: &'_ str, start: usize) -> Vec { self.matches(input, start) .into_iter() .map(move |m| m.range()) .collect() } /// Return a list of all non-overlapping matches. pub fn match_all<'b>(&self, input: &'b str) -> Vec<&'b str> { self.matches(input, 0) .into_iter() .map(move |m| &input[m.range()]) .collect() } /// Collect all matches into a String, separated by commas. pub fn run_global_match(&self, input: &str) -> String { self.matches(input, 0) .into_iter() .map(move |m| format_match(&m, input)) .collect::>() .join(",") } } /// Our backend types. #[derive(Debug, Copy, Clone, PartialEq, Eq)] enum Backend { PikeVM, Backtracking, } /// Our encoding types. #[derive(Debug, Copy, Clone, PartialEq, Eq)] enum Encoding { Utf8, Utf16, Ucs2, } /// Description of how to test a regex. #[derive(Debug, Copy, Clone)] pub struct TestConfig { // Whether to prefer ASCII forms if the input is ASCII. ascii: bool, // Whether to optimize. optimize: bool, // Which backend to use. backend: Backend, // Which encoding to use. Only used if utf16 is enabled. #[allow(dead_code)] encoding: Encoding, } impl TestConfig { /// Whether to use ASCII for this input. pub fn use_ascii(&self, s: &str) -> bool { self.ascii && s.is_ascii() } /// Compile a pattern to a regex, with default flags. pub fn compile(&self, pattern: &str) -> TestCompiledRegex { self.compilef(pattern, "") } /// Compile a pattern to a regex, with given flags. #[track_caller] pub fn compilef(&self, pattern: &str, flags_str: &str) -> TestCompiledRegex { let mut flags = regress::Flags::from(flags_str); flags.no_opt = !self.optimize; let re = regress::Regex::with_flags(pattern, flags); assert!( re.is_ok(), "Failed to parse! flags: {} pattern: {}, error: {}", flags_str, pattern, re.unwrap_err() ); TestCompiledRegex { re: re.unwrap(), tc: *self, } } /// Test that \p pattern and \p flags successfully parses, and matches /// \p input. #[track_caller] pub fn test_match_succeeds(&self, pattern: &str, flags_str: &str, input: &str) { let cr = self.compilef(pattern, flags_str); cr.test_succeeds(input) } /// Test that \p pattern and \p flags successfully parses, and does not /// match \p input. pub fn test_match_fails(&self, pattern: &str, flags_str: &str, input: &str) { let cr = self.compilef(pattern, flags_str); cr.test_fails(input) } } /// Invoke \p F with each test config, in turn. pub fn test_with_configs(func: F) where F: Fn(TestConfig), { let encoding = Encoding::Utf8; // Note we wish to be able to determine the TestConfig from the line number. // Also note that optimizations are not supported for PikeVM backend, as it // doesn't implement Loop1CharBody. func(TestConfig { ascii: true, optimize: false, backend: Backend::PikeVM, encoding, }); func(TestConfig { ascii: false, optimize: false, backend: Backend::PikeVM, encoding, }); func(TestConfig { ascii: true, optimize: false, backend: Backend::Backtracking, encoding, }); func(TestConfig { ascii: false, optimize: false, backend: Backend::Backtracking, encoding, }); func(TestConfig { ascii: true, optimize: true, backend: Backend::Backtracking, encoding, }); func(TestConfig { ascii: false, optimize: true, backend: Backend::Backtracking, encoding, }); // UTF16 and UCS2. if cfg!(feature = "utf16") { func(TestConfig { ascii: false, optimize: false, backend: Backend::Backtracking, encoding: Encoding::Utf16, }); func(TestConfig { ascii: false, optimize: true, backend: Backend::Backtracking, encoding: Encoding::Utf16, }); func(TestConfig { ascii: false, optimize: false, backend: Backend::Backtracking, encoding: Encoding::Ucs2, }); func(TestConfig { ascii: false, optimize: true, backend: Backend::Backtracking, encoding: Encoding::Ucs2, }); } } /// Invoke `F` with each test config. /// Exclude ASCII tests. pub fn test_with_configs_no_ascii(func: F) where F: Fn(TestConfig), { // Note we wish to be able to determine the TestConfig from the line number. // Also note that optimizations are not supported for PikeVM backend, as it // doesn't implement Loop1CharBody. func(TestConfig { ascii: false, optimize: false, backend: Backend::PikeVM, encoding: Encoding::Utf8, }); func(TestConfig { ascii: false, optimize: false, backend: Backend::Backtracking, encoding: Encoding::Utf8, }); func(TestConfig { ascii: false, optimize: true, backend: Backend::Backtracking, encoding: Encoding::Utf8, }); // UTF16 and UCS2. if cfg!(feature = "utf16") { func(TestConfig { ascii: false, optimize: false, backend: Backend::Backtracking, encoding: Encoding::Utf16, }); func(TestConfig { ascii: false, optimize: true, backend: Backend::Backtracking, encoding: Encoding::Utf16, }); func(TestConfig { ascii: false, optimize: false, backend: Backend::Backtracking, encoding: Encoding::Ucs2, }); func(TestConfig { ascii: false, optimize: true, backend: Backend::Backtracking, encoding: Encoding::Ucs2, }); } } regress-0.10.5/tests/escape_tests.rs000064400000000000000000000072531046102023000155620ustar 00000000000000#![allow(clippy::uninlined_format_args)] use regress::{Regex, escape}; #[test] fn test_escape_basic() { assert_eq!(escape("hello"), "hello"); assert_eq!(escape(""), ""); assert_eq!(escape("abc123"), "abc123"); } #[test] fn test_escape_special_characters() { // Test individual special characters assert_eq!(escape("\\"), "\\\\"); assert_eq!(escape("^"), "\\^"); assert_eq!(escape("$"), "\\$"); assert_eq!(escape("."), "\\."); assert_eq!(escape("|"), "\\|"); assert_eq!(escape("?"), "\\?"); assert_eq!(escape("*"), "\\*"); assert_eq!(escape("+"), "\\+"); assert_eq!(escape("("), "\\("); assert_eq!(escape(")"), "\\)"); assert_eq!(escape("["), "\\["); assert_eq!(escape("]"), "\\]"); assert_eq!(escape("{"), "\\{"); assert_eq!(escape("}"), "\\}"); } #[test] fn test_escape_mixed_strings() { assert_eq!(escape("Hello. How are you?"), "Hello\\. How are you\\?"); assert_eq!(escape("$100 + tax (15%)"), "\\$100 \\+ tax \\(15%\\)"); assert_eq!( escape("a^b$c.d|e?f*g+h(i)j[k]l{m}n\\o"), "a\\^b\\$c\\.d\\|e\\?f\\*g\\+h\\(i\\)j\\[k\\]l\\{m\\}n\\\\o" ); assert_eq!(escape("file.txt"), "file\\.txt"); assert_eq!(escape("user@domain.com"), "user@domain\\.com"); } #[test] fn test_escape_with_regex() { // Test that escaped strings work as literal matches let test_cases = vec![ "Hello. How are you?", "$100 + tax (15%)", "file.txt", "user@domain.com", "a^b$c.d|e?f*g+h(i)j[k]l{m}n\\o", "C:\\Program Files\\MyApp", "[brackets] and {braces}", ".*+?|^$()[]{}\\", ]; for test_case in test_cases { let escaped = escape(test_case); let regex = Regex::new(&escaped) .unwrap_or_else(|_| panic!("Failed to create regex for: {}", escaped)); // The escaped pattern should match the original string literally assert!( regex.find(test_case).is_some(), "Escaped pattern '{}' should match original string '{}'", escaped, test_case ); // The match should be the entire string let m = regex.find(test_case).unwrap(); assert_eq!( &test_case[m.range()], test_case, "Match should be the entire string" ); } } #[test] fn test_escape_unicode() { let test_cases = vec![ "café", "привет", "你好", "🌟 emoji 🎉", "混合 text with ünìcödè", ]; for test_case in test_cases { let escaped = escape(test_case); let regex = Regex::new(&escaped) .unwrap_or_else(|_| panic!("Failed to create regex for: {}", escaped)); assert!( regex.find(test_case).is_some(), "Escaped pattern should match original unicode string" ); } } #[test] fn test_escape_prevents_regex_interpretation() { // These strings would have special meaning in regex, but after escaping should be literal let test_cases = vec![ (".*", "\\.\\*"), // .* means "any character, any number of times" ("a+", "a\\+"), // a+ means "one or more a's" ("(abc)", "\\(abc\\)"), // (abc) is a capture group ("[abc]", "\\[abc\\]"), // [abc] is a character class ("a|b", "a\\|b"), // a|b is alternation ("^start", "\\^start"), // ^ is start anchor ("end$", "end\\$"), // $ is end anchor ]; for (original, expected_escaped) in test_cases { let escaped = escape(original); assert_eq!(escaped, expected_escaped); let regex = Regex::new(&escaped).unwrap(); assert!(regex.find(original).is_some()); } } regress-0.10.5/tests/pattern_tests.rs000064400000000000000000000146331046102023000157770ustar 00000000000000//! Tests for Pattern trait implementation #![cfg(feature = "pattern")] #![feature(pattern)] use regress::Regex; #[test] fn test_pattern_find() { let re = Regex::new(r"\d+").unwrap(); let text = "abc123def456ghi"; // Test with &Regex assert_eq!(text.find(&re), Some(3)); // Test another pattern let re2 = Regex::new(r"def").unwrap(); assert_eq!(text.find(&re2), Some(6)); } #[test] fn test_pattern_contains() { let re = Regex::new(r"\d+").unwrap(); assert!(!"abc".contains(&re)); assert!("abc123".contains(&re)); assert!("123abc".contains(&re)); assert!("abc123def".contains(&re)); } #[test] fn test_pattern_starts_with() { let re = Regex::new(r"\d+").unwrap(); assert!(!"abc123".starts_with(&re)); assert!("123abc".starts_with(&re)); assert!("456".starts_with(&re)); } #[test] fn test_pattern_ends_with() { let re = Regex::new(r"\d+").unwrap(); assert!(!"123abc".ends_with(&re)); assert!("abc123".ends_with(&re)); assert!("456".ends_with(&re)); } #[test] fn test_pattern_split() { let re = Regex::new(r"\s+").unwrap(); let text = "hello world\t\nfoo bar"; let parts: Vec<&str> = text.split(&re).collect(); assert_eq!(parts, vec!["hello", "world", "foo", "bar"]); } #[test] fn test_pattern_split_inclusive() { let re = Regex::new(r"\s+").unwrap(); let text = "hello world foo"; let parts: Vec<&str> = text.split_inclusive(&re).collect(); assert_eq!(parts, vec!["hello ", "world ", "foo"]); } #[test] fn test_pattern_matches() { let re = Regex::new(r"\w+").unwrap(); let text = "hello world 123 test"; let matches: Vec<&str> = text.matches(&re).collect(); assert_eq!(matches, vec!["hello", "world", "123", "test"]); } #[test] fn test_pattern_match_indices() { let re = Regex::new(r"\d+").unwrap(); let text = "abc123def456ghi"; let indices: Vec<(usize, &str)> = text.match_indices(&re).collect(); assert_eq!(indices, vec![(3, "123"), (9, "456")]); } #[test] fn test_pattern_replacen() { let re = Regex::new(r"\d+").unwrap(); let text = "abc123def456ghi789"; let result = text.replacen(&re, "XXX", 2); assert_eq!(result, "abcXXXdefXXXghi789"); } #[test] fn test_pattern_replace() { let re = Regex::new(r"\d+").unwrap(); let text = "abc123def456ghi789"; let result = text.replace(&re, "XXX"); assert_eq!(result, "abcXXXdefXXXghiXXX"); } #[test] fn test_pattern_strip_prefix() { let re = Regex::new(r"\d+").unwrap(); assert_eq!("123abc".strip_prefix(&re), Some("abc")); assert_eq!("abc123".strip_prefix(&re), None); assert_eq!("456def789".strip_prefix(&re), Some("def789")); } #[test] fn test_pattern_strip_suffix() { let re = Regex::new(r"\d+").unwrap(); assert_eq!("abc123".strip_suffix(&re), Some("abc")); assert_eq!("123abc".strip_suffix(&re), None); assert_eq!("789def456".strip_suffix(&re), Some("789def")); } #[test] fn test_pattern_with_anchors() { let re = Regex::new(r"^\d+").unwrap(); let text = "123abc456"; assert_eq!(text.find(&re), Some(0)); assert!(text.starts_with(&re)); assert!(!text.ends_with(&re)); } #[test] fn test_pattern_zero_width_match() { let re = Regex::new(r"\b").unwrap(); // word boundary let text = "hello world"; // Test that we can find word boundaries assert_eq!(text.find(&re), Some(0)); // Test simple contains instead of matches to avoid infinite loop assert!(text.contains(&re)); } #[test] fn test_pattern_overlapping_pattern() { let re = Regex::new(r"aa").unwrap(); let text = "aaaa"; // Should find non-overlapping matches let matches: Vec<&str> = text.matches(&re).collect(); assert_eq!(matches, vec!["aa", "aa"]); } #[test] fn test_pattern_empty_regex() { let re = Regex::new(r"").unwrap(); let text = "abc"; // Empty regex should match at the beginning assert_eq!(text.find(&re), Some(0)); assert!(text.contains(&re)); // Test starts_with instead of matches to avoid infinite loop assert!(text.starts_with(&re)); } #[test] fn test_pattern_case_insensitive() { let re = Regex::with_flags(r"hello", "i").unwrap(); let text = "HELLO world Hello"; assert!(text.contains(&re)); let matches: Vec<&str> = text.matches(&re).collect(); assert_eq!(matches, vec!["HELLO", "Hello"]); } #[test] fn test_pattern_multiline() { let re = Regex::with_flags(r"^test", "m").unwrap(); let text = "hello\ntest world\ntest again"; let matches: Vec<&str> = text.matches(&re).collect(); assert_eq!(matches, vec!["test", "test"]); } #[test] fn test_pattern_no_match() { let re = Regex::new(r"\d+").unwrap(); let text = "hello world"; assert_eq!(text.find(&re), None); assert!(!text.contains(&re)); assert!(!text.starts_with(&re)); assert!(!text.ends_with(&re)); let matches: Vec<&str> = text.matches(&re).collect(); assert!(matches.is_empty()); } #[test] fn test_pattern_comprehensive_example() { // This test demonstrates the various str methods that work with Pattern let text = "The year 2023 was followed by 2024, and then 2025."; let year_regex = Regex::new(r"\d{4}").unwrap(); // Basic pattern operations assert!(text.contains(&year_regex)); assert_eq!(text.find(&year_regex), Some(9)); // Position of "2023" assert!(!text.starts_with(&year_regex)); assert!(!text.ends_with(&year_regex)); // Find all years let years: Vec<&str> = text.matches(&year_regex).collect(); assert_eq!(years, vec!["2023", "2024", "2025"]); // Find year positions let positions: Vec<(usize, &str)> = text.match_indices(&year_regex).collect(); // "The year 2023 was followed by 2024, and then 2025." // 0123456789012345678901234567890123456789012345678901 // ^ ^ ^ // 9 30 45 assert_eq!(positions, vec![(9, "2023"), (30, "2024"), (45, "2025")]); // Split on years let parts: Vec<&str> = text.split(&year_regex).collect(); assert_eq!( parts, vec!["The year ", " was followed by ", ", and then ", "."] ); // Replace years let masked = text.replace(&year_regex, "YEAR"); assert_eq!(masked, "The year YEAR was followed by YEAR, and then YEAR."); // Replace first two years only let partial = text.replacen(&year_regex, "XXXX", 2); assert_eq!( partial, "The year XXXX was followed by XXXX, and then 2025." ); } regress-0.10.5/tests/pcre_tests.rs000064400000000000000000007317211046102023000152570ustar 00000000000000// We like hashes around raw string literals. #![allow(clippy::needless_raw_string_hashes)] // Work around dead code warnings: rust-lang issue #46379 pub mod common; use common::*; #[test] fn run_parse_should_fail_tests() { test_parse_fails(r#"x{5,4}"#); test_parse_fails(r#"[abcd"#); test_parse_fails(r#"[z-a]"#); test_parse_fails(r#"^*"#); test_parse_fails(r#"(abc"#); test_parse_fails(r#"(?# abc"#); test_parse_fails(r#"{4,5}abc"#); test_parse_fails(r#")"#); test_parse_fails(r#"a[b-a]"#); test_parse_fails(r#"a["#); test_parse_fails(r#"*a"#); test_parse_fails(r#"abc)"#); test_parse_fails(r#"(abc"#); test_parse_fails(r#"a**"#); test_parse_fails(r#")("#); test_parse_fails(r#"a[b-a]"#); test_parse_fails(r#"a["#); test_parse_fails(r#"*a"#); test_parse_fails(r#"abc)"#); test_parse_fails(r#"(abc"#); test_parse_fails(r#"a**"#); test_parse_fails(r#")("#); test_parse_fails(r#":(?:"#); test_parse_fails(r#"a(?{)b"#); test_parse_fails(r#"a(?{{})b"#); test_parse_fails(r#"a(?{}})b"#); test_parse_fails(r#"a(?{"{"})b"#); test_parse_fails(r#"a(?{"{"}})b"#); test_parse_fails(r#"[a[:xyz:"#); test_parse_fails(r#"a{37,17}"#); test_parse_fails(r#"[\200-\110]"#); test_parse_fails(r#"["#); test_parse_fails(r#"[a-"#); test_parse_fails(r#"^[a-\Q\E]"#); test_parse_fails(r#"(ab|c)(?-1)"#); test_parse_fails(r#"x(?-0)y"#); test_parse_fails(r#"x(?-1)y"#); test_parse_fails(r#"(?|(abc)|(xyz))"#); test_parse_fails(r#"(x)(?|(abc)|(xyz))(x)"#); test_parse_fails(r#"(x)(?|(abc)(pqr)|(xyz))(x)"#); test_parse_fails(r#"(?|(abc)|(xyz))\1"#); test_parse_fails(r#"(?-+a)"#); test_parse_fails(r#"^\ca\cA\c[\c{\c:"#); test_parse_fails(r#"a(?)b"#); test_parse_fails(r#"(?|(abc)|(xyz))"#); test_parse_fails(r#"(x)(?|(abc)|(xyz))(x)"#); test_parse_fails(r#"(x)(?|(abc)(pqr)|(xyz))(x)"#); } #[test] fn run_pcre_match_tests() { test_with_configs(run_pcre_match_tests_config) } #[rustfmt::skip] fn run_pcre_match_tests_config(tc: TestConfig) { let run1_match = |pattern: &str, flags_str: &str, input: &str| -> String { let cr = tc.compilef(pattern, flags_str); cr.match1f(input) }; let test_eq = |left: String, right: &str| { assert_eq!(left.as_str(), right) }; test_eq(run1_match("abc", "i", "abc"), "abc"); // "abc" test_eq(run1_match("abc", "i", "defabc"), "abc"); // "abc" test_eq(run1_match("abc", "i", "Aabc"), "abc"); // "abc" test_eq(run1_match("abc", "i", "Adefabc"), "abc"); // "abc" test_eq(run1_match("abc", "i", "ABC"), "ABC"); // "abc" test_eq(run1_match("^abc", "i", "abc"), "abc"); // "^abc" test_eq(run1_match("^abc$", "i", "abc"), "abc"); // "^abc$" test_eq(run1_match("cat|dog|elephant", "i", "this sentence eventually mentions a cat"), "cat"); // "cat|dog|elephant" test_eq(run1_match("cat|dog|elephant", "i", "this sentences rambles on and on for a while and then reaches elephant"), "elephant"); // "cat|dog|elephant" test_eq(run1_match("cat|dog|elephant", "i", "this sentence eventually mentions a cat"), "cat"); // "cat|dog|elephant" test_eq(run1_match("cat|dog|elephant", "i", "this sentences rambles on and on for a while and then reaches elephant"), "elephant"); // "cat|dog|elephant" test_eq(run1_match("cat|dog|elephant", "i", "this sentence eventually mentions a CAT cat"), "CAT"); // "cat|dog|elephant" test_eq(run1_match("cat|dog|elephant", "i", "this sentences rambles on and on for a while to elephant ElePhant"), "elephant"); // "cat|dog|elephant" test_eq(run1_match("(a)(b)(c)\\2", "i", "abcb"), "abcb,a,b,c"); // "(a)(b)(c)\\2" test_eq(run1_match("(a)(b)(c)\\2", "i", "O0abcb"), "abcb,a,b,c"); // "(a)(b)(c)\\2" test_eq(run1_match("(a)(b)(c)\\2", "i", "O3abcb"), "abcb,a,b,c"); // "(a)(b)(c)\\2" test_eq(run1_match("(a)(b)(c)\\2", "i", "O6abcb"), "abcb,a,b,c"); // "(a)(b)(c)\\2" test_eq(run1_match("(a)(b)(c)\\2", "i", "O9abcb"), "abcb,a,b,c"); // "(a)(b)(c)\\2" test_eq(run1_match("(a)(b)(c)\\2", "i", "O12abcb"), "abcb,a,b,c"); // "(a)(b)(c)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "abc"), "abc,a,,"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O0abc"), "abc,a,,"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O3abc"), "abc,a,,"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O6abc"), "abc,a,,"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "aba"), "aba,,a,b"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O0aba"), "aba,,a,b"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O3aba"), "aba,,a,b"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O6aba"), "aba,,a,b"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O9aba"), "aba,,a,b"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("(a)bc|(a)(b)\\2", "i", "O12aba"), "aba,,a,b"); // "(a)bc|(a)(b)\\2" test_eq(run1_match("abc$", "i", "abc"), "abc"); // "abc$" test_eq(run1_match("the quick brown fox", "i", "the quick brown fox"), "the quick brown fox"); // "the quick brown fox" test_eq(run1_match("the quick brown fox", "i", "this is a line with the quick brown fox"), "the quick brown fox"); // "the quick brown fox" test_eq(run1_match("^abc|def", "i", "abcdef"), "abc"); // "^abc|def" test_eq(run1_match("^abc|def", "i", "abcdefB"), "abc"); // "^abc|def" test_eq(run1_match(".*((abc)$|(def))", "i", "defabc"), "defabc,abc,abc,"); // ".*((abc)$|(def))" test_eq(run1_match(".*((abc)$|(def))", "i", "Zdefabc"), "Zdefabc,abc,abc,"); // ".*((abc)$|(def))" test_eq(run1_match("abc", "i", "abc"), "abc"); // "abc" test_eq(run1_match("^abc|def", "i", "abcdef"), "abc"); // "^abc|def" test_eq(run1_match("^abc|def", "i", "abcdefB"), "abc"); // "^abc|def" test_eq(run1_match(".*((abc)$|(def))", "i", "defabc"), "defabc,abc,abc,"); // ".*((abc)$|(def))" test_eq(run1_match(".*((abc)$|(def))", "i", "Zdefabc"), "Zdefabc,abc,abc,"); // ".*((abc)$|(def))" test_eq(run1_match("the quick brown fox", "i", "the quick brown fox"), "the quick brown fox"); // "the quick brown fox" test_eq(run1_match("the quick brown fox", "i", "The Quick Brown Fox"), "The Quick Brown Fox"); // "the quick brown fox" test_eq(run1_match("the quick brown fox", "i", "the quick brown fox"), "the quick brown fox"); // "the quick brown fox" test_eq(run1_match("the quick brown fox", "i", "The Quick Brown Fox"), "The Quick Brown Fox"); // "the quick brown fox" test_eq(run1_match("abc$", "i", "abc"), "abc"); // "abc$" test_eq(run1_match("(abc\\1)", "i", "abc"), "abc,abc"); // "(abc\\1)" test_eq(run1_match("[^aeiou ]{3,}", "i", "co-processors, and for"), "-pr"); // "[^aeiou ]{3,}" test_eq(run1_match("<.*>", "i", "abcghinop"), "ghi"); // "<.*>" test_eq(run1_match("<.*?>", "i", "abcghinop"), ""); // "<.*?>" test_eq(run1_match("<.*?>", "i", "abcghinop"), ""); // "<.*?>" test_eq(run1_match("a$", "i", "a"), "a"); // "a$" test_eq(run1_match("a$", "i", "Za"), "a"); // "a$" test_eq(run1_match("a$", "im", "a"), "a"); // "a$" test_eq(run1_match("a$", "im", "a\n"), "a"); // "a$" test_eq(run1_match("a$", "im", "Za\n"), "a"); // "a$" test_eq(run1_match("a$", "im", "Za"), "a"); // "a$" test_eq(run1_match("(?!alphabet)[ab]", "i", "foo\nbarbar"), "b"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "***Failers"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "rhubarb"), "b"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "barbell"), "b"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "abc\nbarton"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "foo\nbarbar"), "b"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "***Failers"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "rhubarb"), "b"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "barbell"), "b"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "abc\nbarton"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "abc"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "def\nabc"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "*** Failers"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(?!alphabet)[ab]", "i", "defabc"), "a"); // "(?!alphabet)[ab]" test_eq(run1_match("(a)bc(d)", "i", "abcd"), "abcd,a,d"); // "(a)bc(d)" test_eq(run1_match("(a)bc(d)", "i", "abcdC2"), "abcd,a,d"); // "(a)bc(d)" test_eq(run1_match("(a)bc(d)", "i", "abcdC5"), "abcd,a,d"); // "(a)bc(d)" test_eq(run1_match("(.{20})", "i", "abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrst,abcdefghijklmnopqrst"); // "(.{20})" test_eq(run1_match("(.{20})", "i", "abcdefghijklmnopqrstuvwxyzC1"), "abcdefghijklmnopqrst,abcdefghijklmnopqrst"); // "(.{20})" test_eq(run1_match("(.{20})", "i", "abcdefghijklmnopqrstuvwxyzG1"), "abcdefghijklmnopqrst,abcdefghijklmnopqrst"); // "(.{20})" test_eq(run1_match("(.{15})", "i", "abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmno,abcdefghijklmno"); // "(.{15})" test_eq(run1_match("(.{15})", "i", "abcdefghijklmnopqrstuvwxyzC1G1"), "abcdefghijklmno,abcdefghijklmno"); // "(.{15})" test_eq(run1_match("(.{16})", "i", "abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnop,abcdefghijklmnop"); // "(.{16})" test_eq(run1_match("(.{16})", "i", "abcdefghijklmnopqrstuvwxyzC1G1L"), "abcdefghijklmnop,abcdefghijklmnop"); // "(.{16})" test_eq(run1_match("^(a|(bc))de(f)", "i", "adefG1G2G3G4L"), "adef,a,,f"); // "^(a|(bc))de(f)" test_eq(run1_match("^(a|(bc))de(f)", "i", "bcdefG1G2G3G4L"), "bcdef,bc,bc,f"); // "^(a|(bc))de(f)" test_eq(run1_match("^(a|(bc))de(f)", "i", "adefghijkC0"), "adef,a,,f"); // "^(a|(bc))de(f)" // Skipping Unicode-unfriendly ^abc\00def test_eq(run1_match("\\Biss\\B", "i", "Mississippi"), "iss"); // "\\Biss\\B" test_eq(tc.compilef("iss", "i").run_global_match("Mississippi"), "iss,iss"); // "iss" test_eq(tc.compilef("\\Biss\\B", "i").run_global_match("Mississippi"), "iss,iss"); // "\\Biss\\B" // Skipping global "\\Biss\\B" with string "MississippiA" // Skipping global "\\Biss\\B" with string "Mississippi" test_eq(tc.compilef("^iss", "i").run_global_match("ississippi"), "iss"); // "^iss" test_eq(tc.compilef(".*iss", "i").run_global_match("abciss\nxyzisspqr"), "abciss,xyziss"); // ".*iss" test_eq(tc.compilef(".i.", "i").run_global_match("Mississippi"), "Mis,sis,sip"); // ".i." // Skipping Unicode-unfriendly .i. // Skipping Unicode-unfriendly .i. // Skipping Unicode-unfriendly .i. test_eq(tc.compilef("^.is", "i").run_global_match("Mississippi"), "Mis"); // "^.is" test_eq(tc.compilef("^ab\\n", "i").run_global_match("ab\nab\ncd"), "ab\n"); // "^ab\\n" test_eq(tc.compilef("^ab\\n", "im").run_global_match("ab\nab\ncd"), "ab\n,ab\n"); // "^ab\\n" test_eq(run1_match("a?b?", "i", "a"), "a"); // "a?b?" test_eq(run1_match("a?b?", "i", "b"), "b"); // "a?b?" test_eq(run1_match("a?b?", "i", "ab"), "ab"); // "a?b?" test_eq(run1_match("a?b?", "i", "\\"), ""); // "a?b?" test_eq(run1_match("a?b?", "i", "*** Failers"), ""); // "a?b?" test_eq(run1_match("a?b?", "i", "N"), ""); // "a?b?" test_eq(run1_match("|-", "i", "abcd"), ""); // "|-" test_eq(run1_match("|-", "i", "-abc"), ""); // "|-" test_eq(run1_match("|-", "i", "Nab-c"), ""); // "|-" test_eq(run1_match("|-", "i", "*** Failers"), ""); // "|-" test_eq(run1_match("|-", "i", "Nabc"), ""); // "|-" test_eq(run1_match("a*(b+)(z)(z)", "i", "aaaabbbbzzzz"), "aaaabbbbzz,bbbb,z,z"); // "a*(b+)(z)(z)" test_eq(run1_match("a*(b+)(z)(z)", "i", "aaaabbbbzzzzO0"), "aaaabbbbzz,bbbb,z,z"); // "a*(b+)(z)(z)" test_eq(run1_match("a*(b+)(z)(z)", "i", "aaaabbbbzzzzO1"), "aaaabbbbzz,bbbb,z,z"); // "a*(b+)(z)(z)" test_eq(run1_match("a*(b+)(z)(z)", "i", "aaaabbbbzzzzO2"), "aaaabbbbzz,bbbb,z,z"); // "a*(b+)(z)(z)" test_eq(run1_match("a*(b+)(z)(z)", "i", "aaaabbbbzzzzO3"), "aaaabbbbzz,bbbb,z,z"); // "a*(b+)(z)(z)" test_eq(run1_match("a*(b+)(z)(z)", "i", "aaaabbbbzzzzO4"), "aaaabbbbzz,bbbb,z,z"); // "a*(b+)(z)(z)" test_eq(run1_match("a*(b+)(z)(z)", "i", "aaaabbbbzzzzO5"), "aaaabbbbzz,bbbb,z,z"); // "a*(b+)(z)(z)" test_eq(run1_match("^.?abcd", "i", "(abcd)"), "(abcd"); // "^.?abcd" test_eq(run1_match("^.?abcd", "i", "(abcd)xyz"), "(abcd"); // "^.?abcd" test_eq(run1_match("^.?abcd", "i", "abcd"), "abcd"); // "^.?abcd" test_eq(run1_match("^.?abcd", "i", "abcd)"), "abcd"); // "^.?abcd" test_eq(run1_match("^.?abcd", "i", "(abcd"), "(abcd"); // "^.?abcd" test_eq(run1_match("^.?abcd", "i", "(abcd)"), "(abcd"); // "^.?abcd" test_eq(run1_match("^.?abcd", "i", "(abcd(xyz

qrs)123)"), "(abcd"); // "^.?abcd" test_eq(run1_match("(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\w+)\\s+(\\270)", "i", "O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC"), "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60 ,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,107 ,108 ,109 ,110 ,111 ,112 ,113 ,114 ,115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,123 ,124 ,125 ,126 ,127 ,128 ,129 ,130 ,131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,139 ,140 ,141 ,142 ,143 ,144 ,145 ,146 ,147 ,148 ,149 ,150 ,151 ,152 ,153 ,154 ,155 ,156 ,157 ,158 ,159 ,160 ,161 ,162 ,163 ,164 ,165 ,166 ,167 ,168 ,169 ,170 ,171 ,172 ,173 ,174 ,175 ,176 ,177 ,178 ,179 ,180 ,181 ,182 ,183 ,184 ,185 ,186 ,187 ,188 ,189 ,190 ,191 ,192 ,193 ,194 ,195 ,196 ,197 ,198 ,199 ,200 ,201 ,202 ,203 ,204 ,205 ,206 ,207 ,208 ,209 ,210 ,211 ,212 ,213 ,214 ,215 ,216 ,217 ,218 ,219 ,220 ,221 ,222 ,223 ,224 ,225 ,226 ,227 ,228 ,229 ,230 ,231 ,232 ,233 ,234 ,235 ,236 ,237 ,238 ,239 ,240 ,241 ,242 ,243 ,244 ,245 ,246 ,247 ,248 ,249 ,250 ,251 ,252 ,253 ,254 ,255 ,256 ,257 ,258 ,259 ,260 ,261 ,262 ,263 ,264 ,265 ,266 ,267 ,268 ,269 ,ABC,ABC"); // "(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\w+)\\s+(\\270)" test_eq(run1_match("(main(O)?)+", "i", "mainmain"), "mainmain,main,"); // "(main(O)?)+" test_eq(run1_match("(main(O)?)+", "i", "mainOmain"), "mainOmain,main,"); // "(main(O)?)+" test_eq(run1_match("^(a(b)?)+$", "i", "aba"), "aba,a,"); // "^(a(b)?)+$" test_eq(run1_match("^(aa(bb)?)+$", "i", "aabbaa"), "aabbaa,aa,"); // "^(aa(bb)?)+$" test_eq(run1_match("^(aa|aa(bb))+$", "i", "aabbaa"), "aabbaa,aa,"); // "^(aa|aa(bb))+$" test_eq(run1_match("^(aa(bb)??)+$", "i", "aabbaa"), "aabbaa,aa,"); // "^(aa(bb)??)+$" test_eq(run1_match("^(?:aa(bb)?)+$", "i", "aabbaa"), "aabbaa,"); // "^(?:aa(bb)?)+$" test_eq(run1_match("^(aa(b(b))?)+$", "i", "aabbaa"), "aabbaa,aa,,"); // "^(aa(b(b))?)+$" test_eq(run1_match("^(?:aa(b(b))?)+$", "i", "aabbaa"), "aabbaa,,"); // "^(?:aa(b(b))?)+$" test_eq(run1_match("^(?:aa(b(?:b))?)+$", "i", "aabbaa"), "aabbaa,"); // "^(?:aa(b(?:b))?)+$" test_eq(run1_match("^(?:aa(bb(?:b))?)+$", "i", "aabbbaa"), "aabbbaa,"); // "^(?:aa(bb(?:b))?)+$" test_eq(run1_match("^(?:aa(b(?:bb))?)+$", "i", "aabbbaa"), "aabbbaa,"); // "^(?:aa(b(?:bb))?)+$" test_eq(run1_match("^(?:aa(?:b(b))?)+$", "i", "aabbaa"), "aabbaa,"); // "^(?:aa(?:b(b))?)+$" test_eq(run1_match("^(?:aa(?:b(bb))?)+$", "i", "aabbbaa"), "aabbbaa,"); // "^(?:aa(?:b(bb))?)+$" test_eq(run1_match("^(aa(b(bb))?)+$", "i", "aabbbaa"), "aabbbaa,aa,,"); // "^(aa(b(bb))?)+$" test_eq(run1_match("^(aa(bb(bb))?)+$", "i", "aabbbbaa"), "aabbbbaa,aa,,"); // "^(aa(bb(bb))?)+$" test_eq(run1_match("[\\S]", "", "ab"), "a"); // "[\\S]" test_eq(run1_match("[\\S]", "", "aB"), "a"); // "[\\S]" test_eq(run1_match("[\\S]", "", "*** Failers"), "*"); // "[\\S]" test_eq(run1_match("[\\S]", "", "AB"), "A"); // "[\\S]" test_eq(run1_match("[\\S]", "", "ab"), "a"); // "[\\S]" test_eq(run1_match("[\\S]", "", "aB"), "a"); // "[\\S]" test_eq(run1_match("[\\S]", "", "*** Failers"), "*"); // "[\\S]" test_eq(run1_match("[\\S]", "", "AB"), "A"); // "[\\S]" test_eq(run1_match("((.*))\\d+\\1", "i", "abc123bc"), "bc123bc,bc,bc"); // "((.*))\\d+\\1" test_eq(run1_match("c|abc", "i", "abcdef"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "1234abcdef"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcxyz"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcxyzf"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "123abcdef"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "1234abcdef"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcdef"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "\u{83}x0abcdef"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "123abcdef"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "123abcdefC+"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "123abcdefC-"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "123abcdefC!1"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcabcabc"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcabcC!1!3"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcabcabcC!1!3"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "123C+"), "C"); // "c|abc" test_eq(run1_match("c|abc", "i", "123456C+"), "C"); // "c|abc" test_eq(run1_match("c|abc", "i", "123456789C+"), "C"); // "c|abc" test_eq(run1_match("c|abc", "i", "xyzabcC+"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "XxyzabcC+"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcdefC+"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abcxyzC+"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "abbbbbcccC*1"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "abbbbbcccC*1"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "xbc"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "abc"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "a(b)c"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "a(b(c))d"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "a(b(c)d"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "Satan, oscillate my metallic sonatas!"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "A man, a plan, a canal: Panama!"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", "The quick brown fox"), "c"); // "c|abc" test_eq(run1_match("c|abc", "i", ""), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", " hij>"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", " hij>"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", "def>"), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", ""), "abc"); // "c|abc" test_eq(run1_match("c|abc", "i", ""), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}abc"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}abc"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}abc"), "abc"); // "^abc" test_eq(run1_match("abc$", "im", "xyzabc"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\n"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\npqr"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}pqr"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}\n"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}\npqr"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}pqr"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}\n"), "abc"); // "abc$" test_eq(run1_match("abc$", "im", "xyzabc\u{d}\npqr"), "abc"); // "abc$" test_eq(run1_match("^abc", "im", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "im", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("abc", "i", "xyz\u{d}abc"), "abc"); // "abc" test_eq(run1_match("abc", "i", "abc"), "abc"); // "abc" test_eq(run1_match(".*", "i", "abc\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\u{d}def"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\u{d}\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\u{d}def"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\u{d}\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\u{d}def"), "abc"); // ".*" test_eq(run1_match(".*", "i", "abc\u{d}\ndef"), "abc"); // ".*" test_eq(run1_match("()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()(.(.))", "i", "XYO400"), "XY,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XY,Y"); // "()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()(.(.))" test_eq(run1_match("^a+A\\d", "", "aaaA5"), "aaaA5"); // "^a+A\\d" test_eq(run1_match("^a*A\\d", "i", "aaaA5"), "aaaA5"); // "^a*A\\d" test_eq(run1_match("^a*A\\d", "i", "aaaa5"), "aaaa5"); // "^a*A\\d" test_eq(run1_match("a*[^a]", "", "xyCabcCxyz"), "x"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "xyCabcCxyz"), "x"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "bXaX"), "b"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "bXbX"), "b"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "** Failers"), "*"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "aXaX"), "aX"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "aXbX"), "aX"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "xx"), "x"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "xy"), "x"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "yy"), "y"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "yx"), "y"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "xx"), "x"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "xy"), "x"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "yy"), "y"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "yx"), "y"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "bxay"), "b"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "bxby"), "b"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "** Failers"), "*"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "axby"), "ax"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "XxXxxx"), "X"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "XxXyyx"), "X"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "XxXyxx"), "X"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "** Failers"), "*"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "x"), "x"); // "a*[^a]" test_eq(run1_match("a*[^a]", "", "abcabc"), "ab"); // "a*[^a]" test_eq(run1_match("^(?:(?:\\1|X)(a|b))+", "", "Xaaa"), "Xaaa,a"); // "^(?:(?:\\1|X)(a|b))+" test_eq(run1_match("^(?:(?:\\1|X)(a|b))+", "", "Xaba"), "Xaba,a"); // "^(?:(?:\\1|X)(a|b))+" test_eq(run1_match("(?=(\\w+))\\1:", "i", "abcd:"), "abcd:,abcd"); // "(?=(\\w+))\\1:" test_eq(run1_match("(?=(\\w+))\\1:", "i", "abcd:"), "abcd:,abcd"); // "(?=(\\w+))\\1:" test_eq(run1_match("(?=(\\w+))\\1:", "i", "a:aaxyz"), "a:,a"); // "(?=(\\w+))\\1:" test_eq(run1_match("(?=(\\w+))\\1:", "i", "ab:ababxyz"), "ab:,ab"); // "(?=(\\w+))\\1:" test_eq(run1_match("(?=(\\w+))\\1:", "i", "a:axyz"), "a:,a"); // "(?=(\\w+))\\1:" test_eq(run1_match("(?=(\\w+))\\1:", "i", "ab:abxyz"), "ab:,ab"); // "(?=(\\w+))\\1:" test_eq(run1_match("^a.b", "", "a\u{85}b "), "a\u{85}b"); // "^a.b" test_eq(run1_match("^a.b", "", "a\u{85}b "), "a\u{85}b"); // "^a.b" test_eq(run1_match("^abc.", "m", "abc1 \nabc2 \u{b}abc3xx \u{c}abc4 \u{d}abc5xx \u{d}\nabc6 \u{85}abc7 JUNK"), "abc1"); // "^abc." test_eq(run1_match("abc.$", "m", "abc1\n abc2\u{b} abc3\u{c} abc4\u{d} abc5\u{d}\n abc6\u{85} abc7 abc9"), "abc1"); // "abc.$" // Skipping Unicode-unfriendly ^a\R*b // Skipping Unicode-unfriendly ^a[\R]b test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match("^$", "m", "abc\u{d}\u{d}xyz"), ""); // "^$" // Skipping global "^$" with string "abc\n\u{d}xyz " // Skipping global "^$" with string "abc\u{d}\nxyz" // Skipping global "^$" with string "abc\u{d}\n\u{d}\n" // Skipping global "^$" with string "abc\u{d}\n\u{d}\n" // Skipping global "^$" with string "abc\u{d}\n\u{d}\n" test_eq(run1_match("abc.$", "m", "abc1\n abc2\u{b} abc3\u{c} abc4\u{d} abc5\u{d}\n abc6\u{85} abc9"), "abc1"); // "abc.$" test_eq(run1_match("^X", "m", "XABC"), "X"); // "^X" test_eq(run1_match("^X", "m", "XABCB"), "X"); // "^X" test_eq(run1_match("^X", "m", "XabcXabc "), "X"); // "^X" // Skipping Unicode-unfriendly (foo)(\Kbar|baz) test_eq(run1_match("\\nA", "", "\u{d}\nA "), "\nA"); // "\\nA" test_eq(run1_match("[\\r\\n]A", "", "\u{d}\nA "), "\nA"); // "[\\r\\n]A" test_eq(run1_match("(\\r|\\n)A", "", "\u{d}\nA "), "\nA,\n"); // "(\\r|\\n)A" // Skipping Unicode-unfriendly ^(a|b\g<1>c) // Skipping Unicode-unfriendly ^(a|b\g'1'c) // Skipping Unicode-unfriendly ^(a|b\g'-1'c) // Skipping Unicode-unfriendly (^(a|b\g<-1>c)) test_eq(run1_match("(\\3)(\\1)(a)", "", "cat"), "a,,,a"); // "(\\3)(\\1)(a)" test_eq(run1_match("(\\3)(\\1)(a)", "", "cat"), "a,,,a"); // "(\\3)(\\1)(a)" // Skipping Unicode-unfriendly TA] // Skipping Unicode-unfriendly TA] test_eq(run1_match("a[^]b", "", "aXb"), "aXb"); // "a[^]b" test_eq(run1_match("a[^]b", "", "a\nb "), "a\nb"); // "a[^]b" test_eq(run1_match("a[^]+b", "", "aXb"), "aXb"); // "a[^]+b" test_eq(run1_match("a[^]+b", "", "a\nX\nXb "), "a\nX\nXb"); // "a[^]+b" test_eq(run1_match("a.b", "", "acb"), "acb"); // "a.b" test_eq(run1_match("a.b", "", "a\u{7f}b"), "a\u{7f}b"); // "a.b" test_eq(run1_match("a(.*?)(.)", "", "a\u{c0}\u{88}b"), "a\u{c0},,\u{c0}"); // "a(.*?)(.)" test_eq(run1_match("a(.*?)(.)", "", "ax{100}b"), "ax,,x"); // "a(.*?)(.)" test_eq(run1_match("a(.*)(.)", "", "a\u{c0}\u{88}b"), "a\u{c0}\u{88}b,\u{c0}\u{88},b"); // "a(.*)(.)" test_eq(run1_match("a(.*)(.)", "", "ax{100}b"), "ax{100}b,x{100},b"); // "a(.*)(.)" test_eq(run1_match("a(.)(.)", "", "a\u{c0}\u{92}bcd"), "a\u{c0}\u{92},\u{c0},\u{92}"); // "a(.)(.)" test_eq(run1_match("a(.)(.)", "", "ax{240}bcd"), "ax{,x,{"); // "a(.)(.)" test_eq(run1_match("a(.?)(.)", "", "a\u{c0}\u{92}bcd"), "a\u{c0}\u{92},\u{c0},\u{92}"); // "a(.?)(.)" test_eq(run1_match("a(.?)(.)", "", "ax{240}bcd"), "ax{,x,{"); // "a(.?)(.)" test_eq(run1_match("a(.??)(.)", "", "a\u{c0}\u{92}bcd"), "a\u{c0},,\u{c0}"); // "a(.??)(.)" test_eq(run1_match("a(.??)(.)", "", "ax{240}bcd"), "ax,,x"); // "a(.??)(.)" test_eq(run1_match("a(.{3,})b", "", "ax{1234}xyb "), "ax{1234}xyb,x{1234}xy"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}x{4321}yb "), "ax{1234}x{4321}yb,x{1234}x{4321}y"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}x{4321}x{3412}b "), "ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "axxxxbcdefghijb "), "axxxxbcdefghijb,xxxxbcdefghij"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}x{4321}x{3412}x{3421}b "), "ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}b "), "ax{1234}b,x{1234}"); // "a(.{3,})b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}xyb "), "ax{1234}xyb,x{1234}xy"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}x{4321}yb "), "ax{1234}x{4321}yb,x{1234}x{4321}y"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}x{4321}x{3412}b "), "ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "axxxxbcdefghijb "), "axxxxb,xxxx"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}x{4321}x{3412}x{3421}b "), "ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}b "), "ax{1234}b,x{1234}"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,5})b", "", "axxxxbcdefghijb "), "axxxxb,xxxx"); // "a(.{3,5})b" test_eq(run1_match("a(.{3,5})b", "", "axbxxbcdefghijb "), "axbxxb,xbxx"); // "a(.{3,5})b" test_eq(run1_match("a(.{3,5})b", "", "axxxxxbcdefghijb "), "axxxxxb,xxxxx"); // "a(.{3,5})b" test_eq(run1_match("a(.{3,5}?)b", "", "axxxxbcdefghijb "), "axxxxb,xxxx"); // "a(.{3,5}?)b" test_eq(run1_match("a(.{3,5}?)b", "", "axbxxbcdefghijb "), "axbxxb,xbxx"); // "a(.{3,5}?)b" test_eq(run1_match("a(.{3,5}?)b", "", "axxxxxbcdefghijb "), "axxxxxb,xxxxx"); // "a(.{3,5}?)b" // Skipping Unicode-unfriendly X\C* // Skipping Unicode-unfriendly X\C*? test_eq(tc.compile("[^a]+").run_global_match("bcd"), "bcd"); // "[^a]+" // Skipping Unicode-unfriendly [^a]+ test_eq(run1_match("^[^a]{2}", "", "x{100}bc"), "x{"); // "^[^a]{2}" test_eq(run1_match("^[^a]{2,}", "", "x{100}bcAa"), "x{100}bcA"); // "^[^a]{2,}" test_eq(run1_match("^[^a]{2,}?", "", "x{100}bca"), "x{"); // "^[^a]{2,}?" test_eq(tc.compilef("[^a]+", "i").run_global_match("bcd"), "bcd"); // "[^a]+" // Skipping Unicode-unfriendly [^a]+ test_eq(run1_match("^[^a]{2}", "i", "x{100}bc"), "x{"); // "^[^a]{2}" test_eq(run1_match("^[^a]{2,}", "i", "x{100}bcAa"), "x{100}bc"); // "^[^a]{2,}" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}bca"), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100}x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100}x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "Xyyyax{100}x{100}bXzzz"), "Xy"); // "^[^a]{2,}?" test_eq(run1_match("\\D", "", "1X2"), "X"); // "\\D" test_eq(run1_match("\\D", "", "1x{100}2 "), "x"); // "\\D" test_eq(run1_match(">\\S", "", "> >X Y"), ">X"); // ">\\S" test_eq(run1_match(">\\S", "", "> >x{100} Y"), ">x"); // ">\\S" test_eq(run1_match("\\d", "", "x{100}3"), "1"); // "\\d" test_eq(run1_match("\\s", "", "x{100} X"), " "); // "\\s" test_eq(run1_match("\\D+", "", "12abcd34"), "abcd"); // "\\D+" test_eq(run1_match("\\D+", "", "*** Failers"), "*** Failers"); // "\\D+" test_eq(run1_match("\\D+", "", "1234 "), " "); // "\\D+" test_eq(run1_match("\\D{2,3}", "", "12abcd34"), "abc"); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}", "", "12ab34"), "ab"); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}", "", "*** Failers "), "***"); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}", "", "12a34 "), " "); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}?", "", "12abcd34"), "ab"); // "\\D{2,3}?" test_eq(run1_match("\\D{2,3}?", "", "12ab34"), "ab"); // "\\D{2,3}?" test_eq(run1_match("\\D{2,3}?", "", "*** Failers "), "**"); // "\\D{2,3}?" test_eq(run1_match("\\D{2,3}?", "", "12a34 "), " "); // "\\D{2,3}?" test_eq(run1_match("\\d+", "", "12abcd34"), "12"); // "\\d+" test_eq(run1_match("\\d{2,3}", "", "12abcd34"), "12"); // "\\d{2,3}" test_eq(run1_match("\\d{2,3}", "", "1234abcd"), "123"); // "\\d{2,3}" test_eq(run1_match("\\d{2,3}?", "", "12abcd34"), "12"); // "\\d{2,3}?" test_eq(run1_match("\\d{2,3}?", "", "1234abcd"), "12"); // "\\d{2,3}?" test_eq(run1_match("\\S+", "", "12abcd34"), "12abcd34"); // "\\S+" test_eq(run1_match("\\S+", "", "*** Failers"), "***"); // "\\S+" test_eq(run1_match("\\S{2,3}", "", "12abcd34"), "12a"); // "\\S{2,3}" test_eq(run1_match("\\S{2,3}", "", "1234abcd"), "123"); // "\\S{2,3}" test_eq(run1_match("\\S{2,3}", "", "*** Failers"), "***"); // "\\S{2,3}" test_eq(run1_match("\\S{2,3}?", "", "12abcd34"), "12"); // "\\S{2,3}?" test_eq(run1_match("\\S{2,3}?", "", "1234abcd"), "12"); // "\\S{2,3}?" test_eq(run1_match("\\S{2,3}?", "", "*** Failers"), "**"); // "\\S{2,3}?" test_eq(run1_match(">\\s+<", "", "12> <34"), "> <"); // ">\\s+<" test_eq(run1_match(">\\s{2,3}<", "", "ab> <"); // ">\\s{2,3}<" test_eq(run1_match(">\\s{2,3}<", "", "ab> <"); // ">\\s{2,3}<" test_eq(run1_match(">\\s{2,3}?<", "", "ab> <"); // ">\\s{2,3}?<" test_eq(run1_match(">\\s{2,3}?<", "", "ab> <"); // ">\\s{2,3}?<" test_eq(run1_match("\\w+", "", "12 34"), "12"); // "\\w+" test_eq(run1_match("\\w+", "", "*** Failers"), "Failers"); // "\\w+" test_eq(run1_match("\\w{2,3}", "", "ab cd"), "ab"); // "\\w{2,3}" test_eq(run1_match("\\w{2,3}", "", "abcd ce"), "abc"); // "\\w{2,3}" test_eq(run1_match("\\w{2,3}", "", "*** Failers"), "Fai"); // "\\w{2,3}" test_eq(run1_match("\\w{2,3}?", "", "ab cd"), "ab"); // "\\w{2,3}?" test_eq(run1_match("\\w{2,3}?", "", "abcd ce"), "ab"); // "\\w{2,3}?" test_eq(run1_match("\\w{2,3}?", "", "*** Failers"), "Fa"); // "\\w{2,3}?" test_eq(run1_match("\\W+", "", "12====34"), "===="); // "\\W+" test_eq(run1_match("\\W+", "", "*** Failers"), "*** "); // "\\W+" test_eq(run1_match("\\W+", "", "abcd "), " "); // "\\W+" test_eq(run1_match("\\W{2,3}", "", "ab====cd"), "==="); // "\\W{2,3}" test_eq(run1_match("\\W{2,3}", "", "ab==cd"), "=="); // "\\W{2,3}" test_eq(run1_match("\\W{2,3}", "", "*** Failers"), "***"); // "\\W{2,3}" test_eq(run1_match("\\W{2,3}?", "", "ab====cd"), "=="); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "ab==cd"), "=="); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers "), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers "), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "x{200}X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "x{200}X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "x{200}X "), " "); // "\\W{2,3}?" test_eq(run1_match("[\\xFF]", "", ">\u{ff}<"), "\u{ff}"); // "[\\xFF]" test_eq(run1_match("[^\\xFF]", "", "XYZ"), "X"); // "[^\\xFF]" test_eq(run1_match("[^\\xff]", "", "XYZ"), "X"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "x{123} "), "x"); // "[^\\xff]" test_eq(run1_match("(|a)", "", "catac"), ","); // "(|a)" // Skipping global "(|a)" with string "ax{256}a " // Skipping global "(|a)" with string "x{85}" // Skipping global "(|a)" with string "\u{1234} " // Skipping global "(|a)" with string "\u{1234} " // Skipping global "(|a)" with string "abcdefg" // Skipping global "(|a)" with string "ab" // Skipping global "(|a)" with string "a " test_eq(run1_match("\\S\\S", "", "Ax{a3}BC"), "Ax"); // "\\S\\S" test_eq(run1_match("\\S{2}", "", "Ax{a3}BC"), "Ax"); // "\\S{2}" test_eq(run1_match("\\W\\W", "", "+x{a3}== "), "}="); // "\\W\\W" test_eq(run1_match("\\W{2}", "", "+x{a3}== "), "}="); // "\\W{2}" test_eq(run1_match("\\S", "", "x{442}x{435}x{441}x{442}"), "x"); // "\\S" test_eq(run1_match("[\\S]", "", "x{442}x{435}x{441}x{442}"), "x"); // "[\\S]" test_eq(run1_match("\\D", "", "x{442}x{435}x{441}x{442}"), "x"); // "\\D" test_eq(run1_match("[\\D]", "", "x{442}x{435}x{441}x{442}"), "x"); // "[\\D]" test_eq(run1_match("\\W", "", "x{2442}x{2435}x{2441}x{2442}"), "{"); // "\\W" test_eq(run1_match("[\\W]", "", "x{2442}x{2435}x{2441}x{2442}"), "{"); // "[\\W]" test_eq(run1_match("[\\S\\s]*", "", "abc\n\u{d}x{442}x{435}x{441}x{442}xyz "), "abc\n\u{d}x{442}x{435}x{441}x{442}xyz "); // "[\\S\\s]*" test_eq(run1_match("[\\S\\s]*", "", "x{442}x{435}x{441}x{442}"), "x{442}x{435}x{441}x{442}"); // "[\\S\\s]*" test_eq(run1_match(".[^\\S].", "", "abc defx{442}x{443}xyz\npqr"), "c d"); // ".[^\\S]." test_eq(run1_match(".[^\\S\\n].", "", "abc defx{442}x{443}xyz\npqr"), "c d"); // ".[^\\S\\n]." test_eq(run1_match("^[^d]*?$", "", "abc"), "abc"); // "^[^d]*?$" test_eq(run1_match("^[^d]*?$", "", "abc"), "abc"); // "^[^d]*?$" test_eq(run1_match("^[^d]*?$", "i", "abc"), "abc"); // "^[^d]*?$" test_eq(run1_match("^[^d]*?$", "i", "abc"), "abc"); // "^[^d]*?$" test_eq(run1_match(".{3,5}X", "", "x{212ab}x{212ab}x{212ab}x{861}X"), "{861}X"); // ".{3,5}X" test_eq(run1_match(".{3,5}?", "", "x{212ab}x{212ab}x{212ab}x{861}"), "x{2"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "x{c0}b"), "x{c"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "ax{c0}aaaa/ "), "ax{"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "ax{c0}aaaa/ "), "ax{"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "ax{c0}ax{c0}aaa/ "), "ax{"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "ax{c0}aaaa/ "), "ax{"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "ax{c0}ax{c0}aaa/ "), "ax{"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "ax{c0}aaaa/ "), "ax{"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "ax{c0}ax{c0}aaa/ "), "ax{"); // ".{3,5}?" test_eq(run1_match(".{3,5}?", "", "Should produce an error diagnostic"), "Sho"); // ".{3,5}?" test_eq(run1_match("^[ab]", "", "bar"), "b"); // "^[ab]" test_eq(run1_match("^[^ab]", "", "c"), "c"); // "^[^ab]" test_eq(run1_match("^[^ab]", "", "x{ff}"), "x"); // "^[^ab]" test_eq(run1_match("^[^ab]", "", "x{100} "), "x"); // "^[^ab]" test_eq(run1_match("^[^ab]", "", "*** Failers "), "*"); // "^[^ab]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{f1}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{bf}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{1000} "), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "*** Failers"), "*"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{c0} "), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{f0} "), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "1234"), "1"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "\"1234\" "), "\""); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}1234"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "\"x{100}1234\" "), "\""); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}x{100}12ab "), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}x{100}\"12\" "), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "*** Failers "), "*"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}x{100}abcd"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "A"), "A"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "Zx{100}"), "Z"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}Z"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "*** Failers "), "*"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "Zx{100}"), "Z"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}Z"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "*** Failers "), "*"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{104}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "*** Failers"), "*"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{105}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{ff} "), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "x{100}"), "x"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[^ab\\xC0-\\xF0]", "", "\u{100} "), "\u{100}"); // "[^ab\\xC0-\\xF0]" test_eq(run1_match("[\\xFF]", "", ">\u{ff}<"), "\u{ff}"); // "[\\xFF]" test_eq(run1_match("[^\\xff]", "", "\u{d6} # Matches without Study"), "\u{d6}"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "x{d6}"), "x"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "\u{d6} <-- Same with Study"), "\u{d6}"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "x{d6}"), "x"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "\u{d6} # Matches without Study"), "\u{d6}"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "x{d6} "), "x"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "\u{d6} <-- Same with Study"), "\u{d6}"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "x{d6} "), "x"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "\u{fffd}]"), "\u{fffd}"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "\u{fffd}"), "\u{fffd}"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "\u{fffd}\u{fffd}\u{fffd}"), "\u{fffd}"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "\u{fffd}\u{fffd}\u{fffd}?"), "\u{fffd}"); // "[^\\xff]" test_eq(run1_match("\\W", "", "A.B"), "."); // "\\W" test_eq(run1_match("\\W", "", "Ax{100}B "), "{"); // "\\W" test_eq(run1_match("\\w", "", "x{100}X "), "x"); // "\\w" test_eq(run1_match("\\w", "", "ax{1234}b"), "a"); // "\\w" test_eq(run1_match("^abc.", "m", "abc1 \nabc2 \u{b}abc3xx \u{c}abc4 \u{d}abc5xx \u{d}\nabc6 x{0085}abc7 x{2028}abc8 x{2029}abc9 JUNK"), "abc1"); // "^abc." test_eq(run1_match("abc.$", "m", "abc1\n abc2\u{b} abc3\u{c} abc4\u{d} abc5\u{d}\n abc6x{0085} abc7x{2028} abc8x{2029} abc9"), "abc1"); // "abc.$" // Skipping Unicode-unfriendly ^a\R*b test_eq(run1_match(".*$", "", "x{1ec5} "), "x{1ec5} "); // ".*$" test_eq(run1_match(".*a.*=.b.*", "", "QQQx{2029}ABCaXYZ=!bPQR"), "QQQx{2029}ABCaXYZ=!bPQR"); // ".*a.*=.b.*" test_eq(run1_match("a[^]b", "", "a\nb "), "a\nb"); // "a[^]b" test_eq(run1_match("a[^]+b", "", "aXb"), "aXb"); // "a[^]+b" test_eq(run1_match("a[^]+b", "", "a\nX\nXx{1234}b "), "a\nX\nXx{1234}b"); // "a[^]+b" test_eq(run1_match("X", "", "Ax{1ec5}ABCXYZ"), "X"); // "X" // Skipping Unicode-unfriendly [\p{Nd}] // Skipping Unicode-unfriendly [\p{Nd}] // Skipping Unicode-unfriendly [\P{Nd}]+ test_eq(run1_match("\\D+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "\\D+" test_eq(run1_match("\\D+", "", " "), " "); // "\\D+" test_eq(run1_match("\\D+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "\\D+" test_eq(run1_match("[\\D]+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "[\\D]+" test_eq(run1_match("[\\D\\P{Nd}]+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "[\\D\\P{Nd}]+" // Skipping Unicode-unfriendly ^[\X] // Skipping Unicode-unfriendly ^(\X*)(.) // Skipping Unicode-unfriendly ^(\X*)(.) // Skipping Unicode-unfriendly ^(\X*?)(.) // Skipping Unicode-unfriendly ^(\X*?)(.) test_eq(run1_match("^[\\p{Any}]X", "", "AXYZ"), "AX"); // "^[\\p{Any}]X" // Skipping Unicode-unfriendly ^[\P{Any}]X test_eq(run1_match("^[\\p{Any}]?X", "", "XYZ"), "X"); // "^[\\p{Any}]?X" test_eq(run1_match("^[\\p{Any}]?X", "", "AXYZ"), "AX"); // "^[\\p{Any}]?X" test_eq(run1_match("^[\\P{Any}]?X", "", "XYZ"), "X"); // "^[\\P{Any}]?X" // Skipping Unicode-unfriendly ^[\P{Any}]?X test_eq(run1_match("^[\\p{Any}]+X", "", "AXYZ"), "AX"); // "^[\\p{Any}]+X" // Skipping Unicode-unfriendly ^[\P{Any}]+X test_eq(run1_match("^[\\p{Any}]*X", "", "XYZ"), "X"); // "^[\\p{Any}]*X" test_eq(run1_match("^[\\p{Any}]*X", "", "AXYZ"), "AX"); // "^[\\p{Any}]*X" test_eq(run1_match("^[\\P{Any}]*X", "", "XYZ"), "X"); // "^[\\P{Any}]*X" // Skipping Unicode-unfriendly ^[\P{Any}]*X // Skipping Unicode-unfriendly ([\pL]=(abc))*X test_eq(run1_match("(A)\\1", "i", "AA"), "AA,A"); // "(A)\\1" test_eq(run1_match("(A)\\1", "i", "Aa"), "Aa,A"); // "(A)\\1" test_eq(run1_match("(A)\\1", "i", "aa"), "aa,a"); // "(A)\\1" test_eq(run1_match("(A)\\1", "i", "aA"), "aA,a"); // "(A)\\1" test_eq(run1_match("abc", "", "abc"), "abc"); // "abc" test_eq(run1_match("ab*c", "", "abc"), "abc"); // "ab*c" test_eq(run1_match("ab*c", "", "abbbbc"), "abbbbc"); // "ab*c" test_eq(run1_match("ab*c", "", "ac"), "ac"); // "ab*c" test_eq(run1_match("ab+c", "", "abc"), "abc"); // "ab+c" test_eq(run1_match("ab+c", "", "abbbbbbc"), "abbbbbbc"); // "ab+c" test_eq(run1_match("a*", "", "a"), "a"); // "a*" test_eq(run1_match("a*", "", "aaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaa"); // "a*" test_eq(run1_match("a*", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "a*" test_eq(run1_match("a*", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaF "), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "a*" test_eq(run1_match("(a|abcd|african)", "", "a"), "a,a"); // "(a|abcd|african)" test_eq(run1_match("(a|abcd|african)", "", "abcd"), "a,a"); // "(a|abcd|african)" test_eq(run1_match("(a|abcd|african)", "", "african"), "a,a"); // "(a|abcd|african)" test_eq(run1_match("^abc", "", "abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\nabc "), "abc"); // "^abc" test_eq(run1_match("x\\dy\\Dz", "", "x9yzz"), "x9yzz"); // "x\\dy\\Dz" test_eq(run1_match("x\\dy\\Dz", "", "x0y+z"), "x0y+z"); // "x\\dy\\Dz" test_eq(run1_match("x\\sy\\Sz", "", "x yzz"), "x yzz"); // "x\\sy\\Sz" test_eq(run1_match("x\\sy\\Sz", "", "x y+z"), "x y+z"); // "x\\sy\\Sz" test_eq(run1_match("x\\wy\\Wz", "", "xxy+z"), "xxy+z"); // "x\\wy\\Wz" test_eq(run1_match("x.y", "", "x+y"), "x+y"); // "x.y" test_eq(run1_match("x.y", "", "x-y"), "x-y"); // "x.y" test_eq(run1_match("x.y", "", "x+y"), "x+y"); // "x.y" test_eq(run1_match("x.y", "", "x-y"), "x-y"); // "x.y" test_eq(run1_match("a\\d$", "", "ba0"), "a0"); // "a\\d$" test_eq(run1_match("a\\d$", "m", "ba0"), "a0"); // "a\\d$" test_eq(run1_match("a\\d$", "m", "ba0\n"), "a0"); // "a\\d$" test_eq(run1_match("a\\d$", "m", "ba0\ncd "), "a0"); // "a\\d$" test_eq(run1_match("abc", "i", "abc"), "abc"); // "abc" test_eq(run1_match("abc", "i", "aBc"), "aBc"); // "abc" test_eq(run1_match("abc", "i", "ABC"), "ABC"); // "abc" test_eq(run1_match("[^a]", "", "abcd"), "b"); // "[^a]" test_eq(run1_match("ab?\\w", "", "abz"), "abz"); // "ab?\\w" test_eq(run1_match("ab?\\w", "", "abbz"), "abb"); // "ab?\\w" test_eq(run1_match("ab?\\w", "", "azz "), "az"); // "ab?\\w" test_eq(run1_match("x{0,3}yz", "", "ayzq"), "yz"); // "x{0,3}yz" test_eq(run1_match("x{0,3}yz", "", "axyzq"), "xyz"); // "x{0,3}yz" test_eq(run1_match("x{0,3}yz", "", "axxyz"), "xxyz"); // "x{0,3}yz" test_eq(run1_match("x{0,3}yz", "", "axxxyzq"), "xxxyz"); // "x{0,3}yz" test_eq(run1_match("x{0,3}yz", "", "axxxxyzq"), "xxxyz"); // "x{0,3}yz" test_eq(run1_match("x{3}yz", "", "axxxyzq"), "xxxyz"); // "x{3}yz" test_eq(run1_match("x{3}yz", "", "axxxxyzq"), "xxxyz"); // "x{3}yz" test_eq(run1_match("x{2,3}yz", "", "axxyz"), "xxyz"); // "x{2,3}yz" test_eq(run1_match("x{2,3}yz", "", "axxxyzq"), "xxxyz"); // "x{2,3}yz" test_eq(run1_match("x{2,3}yz", "", "axxxxyzq"), "xxxyz"); // "x{2,3}yz" test_eq(run1_match("[^a]+", "", "bac"), "b"); // "[^a]+" test_eq(run1_match("[^a]+", "", "bcdefax"), "bcdef"); // "[^a]+" test_eq(run1_match("[^a]+", "", "*** Failers"), "*** F"); // "[^a]+" test_eq(run1_match("[^a]+", "", "aaaaa "), " "); // "[^a]+" test_eq(run1_match("[^a]*", "", "bac"), "b"); // "[^a]*" test_eq(run1_match("[^a]*", "", "bcdefax"), "bcdef"); // "[^a]*" test_eq(run1_match("[^a]*", "", "*** Failers"), "*** F"); // "[^a]*" test_eq(run1_match("[^a]*", "", "aaaaa "), ""); // "[^a]*" test_eq(run1_match("[^a]{3,5}", "", "xyz"), "xyz"); // "[^a]{3,5}" test_eq(run1_match("[^a]{3,5}", "", "awxyza"), "wxyz"); // "[^a]{3,5}" test_eq(run1_match("[^a]{3,5}", "", "abcdefa"), "bcdef"); // "[^a]{3,5}" test_eq(run1_match("[^a]{3,5}", "", "abcdefghijk"), "bcdef"); // "[^a]{3,5}" test_eq(run1_match("[^a]{3,5}", "", "*** Failers"), "*** F"); // "[^a]{3,5}" test_eq(run1_match("[^a]{3,5}", "", "aaaaa "), " "); // "[^a]{3,5}" test_eq(run1_match("\\d*", "", "1234b567"), "1234"); // "\\d*" test_eq(run1_match("\\d*", "", "xyz"), ""); // "\\d*" test_eq(run1_match("\\D*", "", "a1234b567"), "a"); // "\\D*" test_eq(run1_match("\\D*", "", "xyz"), "xyz"); // "\\D*" test_eq(run1_match("\\D*", "", " "), " "); // "\\D*" test_eq(run1_match("\\d+", "", "ab1234c56"), "1234"); // "\\d+" test_eq(run1_match("\\D+", "", "ab123c56"), "ab"); // "\\D+" test_eq(run1_match("\\D+", "", "*** Failers"), "*** Failers"); // "\\D+" test_eq(run1_match("\\d?A", "", "045ABC"), "5A"); // "\\d?A" test_eq(run1_match("\\d?A", "", "ABC"), "A"); // "\\d?A" test_eq(run1_match("\\D?A", "", "ABC"), "A"); // "\\D?A" test_eq(run1_match("\\D?A", "", "BAC"), "BA"); // "\\D?A" test_eq(run1_match("\\D?A", "", "9ABC "), "A"); // "\\D?A" test_eq(run1_match("a+", "", "aaaa"), "aaaa"); // "a+" test_eq(run1_match("^.*xyz", "", "xyz"), "xyz"); // "^.*xyz" test_eq(run1_match("^.*xyz", "", "ggggggggxyz"), "ggggggggxyz"); // "^.*xyz" test_eq(run1_match("^.+xyz", "", "abcdxyz"), "abcdxyz"); // "^.+xyz" test_eq(run1_match("^.+xyz", "", "axyz"), "axyz"); // "^.+xyz" test_eq(run1_match("^.?xyz", "", "xyz"), "xyz"); // "^.?xyz" test_eq(run1_match("^.?xyz", "", "cxyz "), "cxyz"); // "^.?xyz" test_eq(run1_match("^\\d{2,3}X", "", "12X"), "12X"); // "^\\d{2,3}X" test_eq(run1_match("^\\d{2,3}X", "", "123X"), "123X"); // "^\\d{2,3}X" test_eq(run1_match("^[abcd]\\d", "", "a45"), "a4"); // "^[abcd]\\d" test_eq(run1_match("^[abcd]\\d", "", "b93"), "b9"); // "^[abcd]\\d" test_eq(run1_match("^[abcd]\\d", "", "c99z"), "c9"); // "^[abcd]\\d" test_eq(run1_match("^[abcd]\\d", "", "d04"), "d0"); // "^[abcd]\\d" test_eq(run1_match("^[abcd]*\\d", "", "a45"), "a4"); // "^[abcd]*\\d" test_eq(run1_match("^[abcd]*\\d", "", "b93"), "b9"); // "^[abcd]*\\d" test_eq(run1_match("^[abcd]*\\d", "", "c99z"), "c9"); // "^[abcd]*\\d" test_eq(run1_match("^[abcd]*\\d", "", "d04"), "d0"); // "^[abcd]*\\d" test_eq(run1_match("^[abcd]*\\d", "", "abcd1234"), "abcd1"); // "^[abcd]*\\d" test_eq(run1_match("^[abcd]*\\d", "", "1234 "), "1"); // "^[abcd]*\\d" test_eq(run1_match("^[abcd]+\\d", "", "a45"), "a4"); // "^[abcd]+\\d" test_eq(run1_match("^[abcd]+\\d", "", "b93"), "b9"); // "^[abcd]+\\d" test_eq(run1_match("^[abcd]+\\d", "", "c99z"), "c9"); // "^[abcd]+\\d" test_eq(run1_match("^[abcd]+\\d", "", "d04"), "d0"); // "^[abcd]+\\d" test_eq(run1_match("^[abcd]+\\d", "", "abcd1234"), "abcd1"); // "^[abcd]+\\d" test_eq(run1_match("^a+X", "", "aX"), "aX"); // "^a+X" test_eq(run1_match("^a+X", "", "aaX "), "aaX"); // "^a+X" test_eq(run1_match("^[abcd]?\\d", "", "a45"), "a4"); // "^[abcd]?\\d" test_eq(run1_match("^[abcd]?\\d", "", "b93"), "b9"); // "^[abcd]?\\d" test_eq(run1_match("^[abcd]?\\d", "", "c99z"), "c9"); // "^[abcd]?\\d" test_eq(run1_match("^[abcd]?\\d", "", "d04"), "d0"); // "^[abcd]?\\d" test_eq(run1_match("^[abcd]?\\d", "", "1234 "), "1"); // "^[abcd]?\\d" test_eq(run1_match("^[abcd]{2,3}\\d", "", "ab45"), "ab4"); // "^[abcd]{2,3}\\d" test_eq(run1_match("^[abcd]{2,3}\\d", "", "bcd93"), "bcd9"); // "^[abcd]{2,3}\\d" test_eq(run1_match("^(abc)*\\d", "", "abc45"), "abc4,abc"); // "^(abc)*\\d" test_eq(run1_match("^(abc)*\\d", "", "abcabcabc45"), "abcabcabc4,abc"); // "^(abc)*\\d" test_eq(run1_match("^(abc)*\\d", "", "42xyz "), "4,"); // "^(abc)*\\d" test_eq(run1_match("^(abc)+\\d", "", "abc45"), "abc4,abc"); // "^(abc)+\\d" test_eq(run1_match("^(abc)+\\d", "", "abcabcabc45"), "abcabcabc4,abc"); // "^(abc)+\\d" test_eq(run1_match("^(abc)?\\d", "", "abc45"), "abc4,abc"); // "^(abc)?\\d" test_eq(run1_match("^(abc)?\\d", "", "42xyz "), "4,"); // "^(abc)?\\d" test_eq(run1_match("^(abc){2,3}\\d", "", "abcabc45"), "abcabc4,abc"); // "^(abc){2,3}\\d" test_eq(run1_match("^(abc){2,3}\\d", "", "abcabcabc45"), "abcabcabc4,abc"); // "^(abc){2,3}\\d" test_eq(run1_match("^(a*\\w|ab)=(a*\\w|ab)", "", "ab=ab"), "ab=ab,ab,ab"); // "^(a*\\w|ab)=(a*\\w|ab)" test_eq(run1_match("^(a*\\w|ab)=(a*\\w|ab)", "", "ab=ab"), "ab=ab,ab,ab"); // "^(a*\\w|ab)=(a*\\w|ab)" test_eq(run1_match("^abc", "", "abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "", "abcdefB "), "abc"); // "^abc" test_eq(run1_match("^(a*|xyz)", "", "bcd"), ","); // "^(a*|xyz)" test_eq(run1_match("^(a*|xyz)", "", "aaabcd"), "aaa,aaa"); // "^(a*|xyz)" test_eq(run1_match("^(a*|xyz)", "", "xyz"), ","); // "^(a*|xyz)" test_eq(run1_match("^(a*|xyz)", "", "xyzN "), ","); // "^(a*|xyz)" test_eq(run1_match("^(a*|xyz)", "", "*** Failers"), ","); // "^(a*|xyz)" test_eq(run1_match("^(a*|xyz)", "", "bcdN "), ","); // "^(a*|xyz)" test_eq(run1_match("xyz$", "", "xyz"), "xyz"); // "xyz$" test_eq(run1_match("xyz$", "m", "xyz"), "xyz"); // "xyz$" test_eq(run1_match("xyz$", "m", "xyz\n "), "xyz"); // "xyz$" test_eq(run1_match("xyz$", "m", "abcxyz\npqr "), "xyz"); // "xyz$" test_eq(run1_match("xyz$", "m", "abcxyz\npqrZ "), "xyz"); // "xyz$" test_eq(run1_match("xyz$", "m", "xyz\nZ "), "xyz"); // "xyz$" test_eq(run1_match("^abcdef", "", "abcdefP"), "abcdef"); // "^abcdef" test_eq(run1_match("^a{2,4}\\d+z", "", "aa0zP"), "aa0z"); // "^a{2,4}\\d+z" test_eq(run1_match("^a{2,4}\\d+z", "", "aaaa4444444444444zP "), "aaaa4444444444444z"); // "^a{2,4}\\d+z" test_eq(run1_match("the quick brown fox", "", "the quick brown fox"), "the quick brown fox"); // "the quick brown fox" test_eq(run1_match("the quick brown fox", "", "What do you know about the quick brown fox?"), "the quick brown fox"); // "the quick brown fox" test_eq(run1_match("The quick brown fox", "i", "the quick brown fox"), "the quick brown fox"); // "The quick brown fox" test_eq(run1_match("The quick brown fox", "i", "The quick brown FOX"), "The quick brown FOX"); // "The quick brown fox" test_eq(run1_match("The quick brown fox", "i", "What do you know about the quick brown fox?"), "the quick brown fox"); // "The quick brown fox" test_eq(run1_match("The quick brown fox", "i", "What do you know about THE QUICK BROWN FOX?"), "THE QUICK BROWN FOX"); // "The quick brown fox" // Skipping Unicode-unfriendly abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "abxyzpqrrrabbxyyyypqAzz"), "abxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "abxyzpqrrrabbxyyyypqAzz"), "abxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aabxyzpqrrrabbxyyyypqAzz"), "aabxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabxyzpqrrrabbxyyyypqAzz"), "aaabxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaaabxyzpqrrrabbxyyyypqAzz"), "aaaabxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "abcxyzpqrrrabbxyyyypqAzz"), "abcxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aabcxyzpqrrrabbxyyyypqAzz"), "aabcxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypAzz"), "aaabcxyzpqrrrabbxyyyypAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypqAzz"), "aaabcxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypqqAzz"), "aaabcxyzpqrrrabbxyyyypqqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypqqqAzz"), "aaabcxyzpqrrrabbxyyyypqqqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypqqqqAzz"), "aaabcxyzpqrrrabbxyyyypqqqqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypqqqqqAzz"), "aaabcxyzpqrrrabbxyyyypqqqqqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypqqqqqqAzz"), "aaabcxyzpqrrrabbxyyyypqqqqqqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaaabcxyzpqrrrabbxyyyypqAzz"), "aaaabcxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "abxyzzpqrrrabbxyyyypqAzz"), "abxyzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aabxyzzzpqrrrabbxyyyypqAzz"), "aabxyzzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabxyzzzzpqrrrabbxyyyypqAzz"), "aaabxyzzzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaaabxyzzzzpqrrrabbxyyyypqAzz"), "aaaabxyzzzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "abcxyzzpqrrrabbxyyyypqAzz"), "abcxyzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aabcxyzzzpqrrrabbxyyyypqAzz"), "aabcxyzzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzzzzpqrrrabbxyyyypqAzz"), "aaabcxyzzzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaaabcxyzzzzpqrrrabbxyyyypqAzz"), "aaaabcxyzzzzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaaabcxyzzzzpqrrrabbbxyyyypqAzz"), "aaaabcxyzzzzpqrrrabbbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz"), "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypABzz"), "aaabcxyzpqrrrabbxyyyypABzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", "aaabcxyzpqrrrabbxyyyypABBzz"), "aaabcxyzpqrrrabbxyyyypABBzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", ">>>aaabxyzpqrrrabbxyyyypqAzz"), "aaabxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", ">aaaabxyzpqrrrabbxyyyypqAzz"), "aaaabxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz", "", ">>>>abcxyzpqrrrabbxyyyypqAzz"), "abcxyzpqrrrabbxyyyypqAzz"); // "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" test_eq(run1_match("^(abc){1,2}zz", "", "abczz"), "abczz,abc"); // "^(abc){1,2}zz" test_eq(run1_match("^(abc){1,2}zz", "", "abcabczz"), "abcabczz,abc"); // "^(abc){1,2}zz" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bc"), "bc,b"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbc"), "bbc,b"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbbc"), "bbbc,bb"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bac"), "bac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbac"), "bbac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "aac"), "aac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "abbbbbbbbbbbc"), "abbbbbbbbbbbc,bbbbbbbbbbb"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbbbbbbbbbbac"), "bbbbbbbbbbbac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+|a){1,2}c", "", "bc"), "bc,b"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "bbc"), "bbc,bb"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "bbbc"), "bbbc,bbb"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "bac"), "bac,a"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "bbac"), "bbac,a"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "aac"), "aac,a"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "abbbbbbbbbbbc"), "abbbbbbbbbbbc,bbbbbbbbbbb"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "bbbbbbbbbbbac"), "bbbbbbbbbbbac,a"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b+|a){1,2}c", "", "bbc"), "bbc,bb"); // "^(b+|a){1,2}c" test_eq(run1_match("^(b*|ba){1,2}?bc", "", "babc"), "babc,ba"); // "^(b*|ba){1,2}?bc" test_eq(run1_match("^(b*|ba){1,2}?bc", "", "bbabc"), "bbabc,ba"); // "^(b*|ba){1,2}?bc" test_eq(run1_match("^(b*|ba){1,2}?bc", "", "bababc"), "bababc,ba"); // "^(b*|ba){1,2}?bc" test_eq(run1_match("^(ba|b*){1,2}?bc", "", "babc"), "babc,ba"); // "^(ba|b*){1,2}?bc" test_eq(run1_match("^(ba|b*){1,2}?bc", "", "bbabc"), "bbabc,ba"); // "^(ba|b*){1,2}?bc" test_eq(run1_match("^(ba|b*){1,2}?bc", "", "bababc"), "bababc,ba"); // "^(ba|b*){1,2}?bc" test_eq(run1_match("^[ab\\]cde]", "", "athing"), "a"); // "^[ab\\]cde]" test_eq(run1_match("^[ab\\]cde]", "", "bthing"), "b"); // "^[ab\\]cde]" test_eq(run1_match("^[ab\\]cde]", "", "]thing"), "]"); // "^[ab\\]cde]" test_eq(run1_match("^[ab\\]cde]", "", "cthing"), "c"); // "^[ab\\]cde]" test_eq(run1_match("^[ab\\]cde]", "", "dthing"), "d"); // "^[ab\\]cde]" test_eq(run1_match("^[ab\\]cde]", "", "ething"), "e"); // "^[ab\\]cde]" test_eq(run1_match("^[^ab\\]cde]", "", "fthing"), "f"); // "^[^ab\\]cde]" test_eq(run1_match("^[^ab\\]cde]", "", "[thing"), "["); // "^[^ab\\]cde]" test_eq(run1_match("^[^ab\\]cde]", "", "\\thing"), "\\"); // "^[^ab\\]cde]" test_eq(run1_match("^[^ab\\]cde]", "", "*** Failers"), "*"); // "^[^ab\\]cde]" test_eq(run1_match("^[0-9]+$", "", "0"), "0"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "1"), "1"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "2"), "2"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "3"), "3"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "4"), "4"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "5"), "5"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "6"), "6"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "7"), "7"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "8"), "8"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "9"), "9"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "10"), "10"); // "^[0-9]+$" test_eq(run1_match("^[0-9]+$", "", "100"), "100"); // "^[0-9]+$" test_eq(run1_match("^.*nter", "", "enter"), "enter"); // "^.*nter" test_eq(run1_match("^.*nter", "", "inter"), "inter"); // "^.*nter" test_eq(run1_match("^.*nter", "", "uponter"), "uponter"); // "^.*nter" test_eq(run1_match("^xxx[0-9]+$", "", "xxx0"), "xxx0"); // "^xxx[0-9]+$" test_eq(run1_match("^xxx[0-9]+$", "", "xxx1234"), "xxx1234"); // "^xxx[0-9]+$" test_eq(run1_match("^.+[0-9][0-9][0-9]$", "", "x123"), "x123"); // "^.+[0-9][0-9][0-9]$" test_eq(run1_match("^.+[0-9][0-9][0-9]$", "", "xx123"), "xx123"); // "^.+[0-9][0-9][0-9]$" test_eq(run1_match("^.+[0-9][0-9][0-9]$", "", "123456"), "123456"); // "^.+[0-9][0-9][0-9]$" test_eq(run1_match("^.+[0-9][0-9][0-9]$", "", "x1234"), "x1234"); // "^.+[0-9][0-9][0-9]$" test_eq(run1_match("^.+?[0-9][0-9][0-9]$", "", "x123"), "x123"); // "^.+?[0-9][0-9][0-9]$" test_eq(run1_match("^.+?[0-9][0-9][0-9]$", "", "xx123"), "xx123"); // "^.+?[0-9][0-9][0-9]$" test_eq(run1_match("^.+?[0-9][0-9][0-9]$", "", "123456"), "123456"); // "^.+?[0-9][0-9][0-9]$" test_eq(run1_match("^.+?[0-9][0-9][0-9]$", "", "x1234"), "x1234"); // "^.+?[0-9][0-9][0-9]$" test_eq(run1_match("^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$", "", "abc!pqr=apquxz.ixr.zzz.ac.uk"), "abc!pqr=apquxz.ixr.zzz.ac.uk,abc,pqr"); // "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" test_eq(run1_match(":", "", "Well, we need a colon: somewhere"), ":"); // ":" test_eq(run1_match("([\\da-f:]+)$", "i", "0abc"), "0abc,0abc"); // "([\\da-f:]+)$" test_eq(run1_match("([\\da-f:]+)$", "i", "abc"), "abc,abc"); // "([\\da-f:]+)$" test_eq(run1_match("([\\da-f:]+)$", "i", "fed"), "fed,fed"); // "([\\da-f:]+)$" test_eq(run1_match("([\\da-f:]+)$", "i", "E"), "E,E"); // "([\\da-f:]+)$" test_eq(run1_match("([\\da-f:]+)$", "i", "::"), "::,::"); // "([\\da-f:]+)$" test_eq(run1_match("([\\da-f:]+)$", "i", "5f03:12C0::932e"), "5f03:12C0::932e,5f03:12C0::932e"); // "([\\da-f:]+)$" test_eq(run1_match("([\\da-f:]+)$", "i", "fed def"), "def,def"); // "([\\da-f:]+)$" test_eq(run1_match("([\\da-f:]+)$", "i", "Any old stuff"), "ff,ff"); // "([\\da-f:]+)$" test_eq(run1_match("^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$", "", ".1.2.3"), ".1.2.3,1,2,3"); // "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" test_eq(run1_match("^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$", "", "A.12.123.0"), "A.12.123.0,12,123,0"); // "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" test_eq(run1_match("^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$", "", "1 IN SOA non-sp1 non-sp2("), "1 IN SOA non-sp1 non-sp2(,1,non-sp1,non-sp2"); // "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" test_eq(run1_match("^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$", "", "1 IN SOA non-sp1 non-sp2 ("), "1 IN SOA non-sp1 non-sp2 (,1,non-sp1,non-sp2"); // "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" test_eq(run1_match("^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$", "", "a."), "a.,"); // "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$" test_eq(run1_match("^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$", "", "Z."), "Z.,"); // "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$" test_eq(run1_match("^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$", "", "2."), "2.,"); // "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$" test_eq(run1_match("^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$", "", "ab-c.pq-r."), "ab-c.pq-r.,.pq-r"); // "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$" test_eq(run1_match("^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$", "", "sxk.zzz.ac.uk."), "sxk.zzz.ac.uk.,.uk"); // "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$" test_eq(run1_match("^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$", "", "x-.y-."), "x-.y-.,.y-"); // "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-Z\\d\\-]*)*\\.$" test_eq(run1_match("^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$", "", "*.a"), "*.a,,,"); // "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" test_eq(run1_match("^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$", "", "*.b0-a"), "*.b0-a,0-a,,"); // "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" test_eq(run1_match("^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$", "", "*.c3-b.c"), "*.c3-b.c,3-b,.c,"); // "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" test_eq(run1_match("^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$", "", "*.c-a.b-c"), "*.c-a.b-c,-a,.b-c,-c"); // "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" test_eq(run1_match("^(?=ab(de))(abd)(e)", "", "abde"), "abde,de,abd,e"); // "^(?=ab(de))(abd)(e)" test_eq(run1_match("^(?!(ab)de|x)(abd)(f)", "", "abdf"), "abdf,,abd,f"); // "^(?!(ab)de|x)(abd)(f)" test_eq(run1_match("^(?=(ab(cd)))(ab)", "", "abcd"), "ab,abcd,cd,ab"); // "^(?=(ab(cd)))(ab)" test_eq(run1_match("^[\\da-f](\\.[\\da-f])*$", "i", "a.b.c.d"), "a.b.c.d,.d"); // "^[\\da-f](\\.[\\da-f])*$" test_eq(run1_match("^[\\da-f](\\.[\\da-f])*$", "i", "A.B.C.D"), "A.B.C.D,.D"); // "^[\\da-f](\\.[\\da-f])*$" test_eq(run1_match("^[\\da-f](\\.[\\da-f])*$", "i", "a.b.c.1.2.3.C"), "a.b.c.1.2.3.C,.C"); // "^[\\da-f](\\.[\\da-f])*$" // Skipping Unicode-unfriendly ^\".*\"\s*(;.*)?$ // Skipping Unicode-unfriendly ^\".*\"\s*(;.*)?$ // Skipping Unicode-unfriendly ^\".*\"\s*(;.*)?$ test_eq(run1_match("^ab\\sc$", "", "ab c"), "ab c"); // "^ab\\sc$" test_eq(run1_match("^ab\\sc$", "", "ab c"), "ab c"); // "^ab\\sc$" // Skipping Unicode-unfriendly ^a\ b[c]d$ test_eq(run1_match("^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$", "", "abcdefhijklm"), "abcdefhijklm,abc,bc,c,def,ef,f,hij,ij,j,klm,lm,m"); // "^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$" test_eq(run1_match("^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$", "", "abcdefhijklm"), "abcdefhijklm,bc,c,ef,f,ij,j,lm,m"); // "^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$" test_eq(run1_match("^a*\\w", "", "z"), "z"); // "^a*\\w" test_eq(run1_match("^a*\\w", "", "az"), "az"); // "^a*\\w" test_eq(run1_match("^a*\\w", "", "aaaz"), "aaaz"); // "^a*\\w" test_eq(run1_match("^a*\\w", "", "a"), "a"); // "^a*\\w" test_eq(run1_match("^a*\\w", "", "aa"), "aa"); // "^a*\\w" test_eq(run1_match("^a*\\w", "", "aaaa"), "aaaa"); // "^a*\\w" test_eq(run1_match("^a*\\w", "", "a+"), "a"); // "^a*\\w" test_eq(run1_match("^a*\\w", "", "aa+"), "aa"); // "^a*\\w" test_eq(run1_match("^a*?\\w", "", "z"), "z"); // "^a*?\\w" test_eq(run1_match("^a*?\\w", "", "az"), "a"); // "^a*?\\w" test_eq(run1_match("^a*?\\w", "", "aaaz"), "a"); // "^a*?\\w" test_eq(run1_match("^a*?\\w", "", "a"), "a"); // "^a*?\\w" test_eq(run1_match("^a*?\\w", "", "aa"), "a"); // "^a*?\\w" test_eq(run1_match("^a*?\\w", "", "aaaa"), "a"); // "^a*?\\w" test_eq(run1_match("^a*?\\w", "", "a+"), "a"); // "^a*?\\w" test_eq(run1_match("^a*?\\w", "", "aa+"), "a"); // "^a*?\\w" test_eq(run1_match("^a+\\w", "", "az"), "az"); // "^a+\\w" test_eq(run1_match("^a+\\w", "", "aaaz"), "aaaz"); // "^a+\\w" test_eq(run1_match("^a+\\w", "", "aa"), "aa"); // "^a+\\w" test_eq(run1_match("^a+\\w", "", "aaaa"), "aaaa"); // "^a+\\w" test_eq(run1_match("^a+\\w", "", "aa+"), "aa"); // "^a+\\w" test_eq(run1_match("^a+?\\w", "", "az"), "az"); // "^a+?\\w" test_eq(run1_match("^a+?\\w", "", "aaaz"), "aa"); // "^a+?\\w" test_eq(run1_match("^a+?\\w", "", "aa"), "aa"); // "^a+?\\w" test_eq(run1_match("^a+?\\w", "", "aaaa"), "aa"); // "^a+?\\w" test_eq(run1_match("^a+?\\w", "", "aa+"), "aa"); // "^a+?\\w" test_eq(run1_match("^\\d{8}\\w{2,}", "", "1234567890"), "1234567890"); // "^\\d{8}\\w{2,}" test_eq(run1_match("^\\d{8}\\w{2,}", "", "12345678ab"), "12345678ab"); // "^\\d{8}\\w{2,}" test_eq(run1_match("^\\d{8}\\w{2,}", "", "12345678__"), "12345678__"); // "^\\d{8}\\w{2,}" test_eq(run1_match("^[aeiou\\d]{4,5}$", "", "uoie"), "uoie"); // "^[aeiou\\d]{4,5}$" test_eq(run1_match("^[aeiou\\d]{4,5}$", "", "1234"), "1234"); // "^[aeiou\\d]{4,5}$" test_eq(run1_match("^[aeiou\\d]{4,5}$", "", "12345"), "12345"); // "^[aeiou\\d]{4,5}$" test_eq(run1_match("^[aeiou\\d]{4,5}$", "", "aaaaa"), "aaaaa"); // "^[aeiou\\d]{4,5}$" test_eq(run1_match("^[aeiou\\d]{4,5}?", "", "uoie"), "uoie"); // "^[aeiou\\d]{4,5}?" test_eq(run1_match("^[aeiou\\d]{4,5}?", "", "1234"), "1234"); // "^[aeiou\\d]{4,5}?" test_eq(run1_match("^[aeiou\\d]{4,5}?", "", "12345"), "1234"); // "^[aeiou\\d]{4,5}?" test_eq(run1_match("^[aeiou\\d]{4,5}?", "", "aaaaa"), "aaaa"); // "^[aeiou\\d]{4,5}?" test_eq(run1_match("^[aeiou\\d]{4,5}?", "", "123456"), "1234"); // "^[aeiou\\d]{4,5}?" test_eq(run1_match("^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]", "", "From abcd Mon Sep 01 12:33:02 1997"), "From abcd Mon Sep 01 12:33,abcd"); // "^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]" test_eq(run1_match("^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d", "", "From abcd Mon Sep 01 12:33:02 1997"), "From abcd Mon Sep 01 12:33,Sep "); // "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" test_eq(run1_match("^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d", "", "From abcd Mon Sep 1 12:33:02 1997"), "From abcd Mon Sep 1 12:33,Sep "); // "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" test_eq(run1_match("\\w+(?=\\t)", "", "the quick brown\u{9} fox"), "brown"); // "\\w+(?=\\t)" test_eq(run1_match("foo(?!bar)(.*)", "", "foobar is foolish see?"), "foolish see?,lish see?"); // "foo(?!bar)(.*)" test_eq(run1_match("(?:(?!foo)...|^.{0,2})bar(.*)", "", "foobar crowbar etc"), "rowbar etc, etc"); // "(?:(?!foo)...|^.{0,2})bar(.*)" test_eq(run1_match("(?:(?!foo)...|^.{0,2})bar(.*)", "", "barrel"), "barrel,rel"); // "(?:(?!foo)...|^.{0,2})bar(.*)" test_eq(run1_match("(?:(?!foo)...|^.{0,2})bar(.*)", "", "2barrel"), "2barrel,rel"); // "(?:(?!foo)...|^.{0,2})bar(.*)" test_eq(run1_match("(?:(?!foo)...|^.{0,2})bar(.*)", "", "A barrel"), "A barrel,rel"); // "(?:(?!foo)...|^.{0,2})bar(.*)" test_eq(run1_match("^(\\D*)(?=\\d)(?!123)", "", "abc456"), "abc,abc"); // "^(\\D*)(?=\\d)(?!123)" test_eq(run1_match("^1234", "", "1234"), "1234"); // "^1234" test_eq(run1_match("^1234", "", "1234"), "1234"); // "^1234" test_eq(run1_match("abcd", "", "abcd"), "abcd"); // "abcd" test_eq(run1_match("^abcd", "", "abcd"), "abcd"); // "^abcd" test_eq(run1_match("(?!^)abc", "", "the abc"), "abc"); // "(?!^)abc" test_eq(run1_match("(?=^)abc", "", "abc"), "abc"); // "(?=^)abc" test_eq(run1_match("^[ab]{1,3}(ab*|b)", "", "aabbbbb"), "aabb,b"); // "^[ab]{1,3}(ab*|b)" test_eq(run1_match("^[ab]{1,3}?(ab*|b)", "", "aabbbbb"), "aabbbbb,abbbbb"); // "^[ab]{1,3}?(ab*|b)" test_eq(run1_match("^[ab]{1,3}?(ab*?|b)", "", "aabbbbb"), "aa,a"); // "^[ab]{1,3}?(ab*?|b)" test_eq(run1_match("^[ab]{1,3}(ab*?|b)", "", "aabbbbb"), "aabb,b"); // "^[ab]{1,3}(ab*?|b)" // Skipping Unicode-unfriendly (?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))* // Skipping Unicode-unfriendly (?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))* // Skipping Unicode-unfriendly (?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))* // Skipping Unicode-unfriendly (?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))* // Skipping Unicode-unfriendly (?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))* // Skipping Unicode-unfriendly (?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))* // Skipping Unicode-unfriendly (?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))* // Skipping Unicode-unfriendly [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>) // Skipping Unicode-unfriendly [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>) // Skipping Unicode-unfriendly [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>) // Skipping Unicode-unfriendly [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>) // Skipping Unicode-unfriendly [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>) // Skipping Unicode-unfriendly [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>) // Skipping Unicode-unfriendly [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>) test_eq(run1_match("abc\\x0def\\x00pqr\\x000xyz\\x0000AB", "", "abc\u{d}ef\u{0}pqr\u{0}0xyz\u{0}00AB"), "abc\u{d}ef\u{0}pqr\u{0}0xyz\u{0}00AB"); // "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" test_eq(run1_match("abc\\x0def\\x00pqr\\x000xyz\\x0000AB", "", "abc456 abc\u{d}ef\u{0}pqr\u{0}0xyz\u{0}00ABCDE"), "abc\u{d}ef\u{0}pqr\u{0}0xyz\u{0}00AB"); // "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" // Skipping Unicode-unfriendly ^[\000-\037] // Skipping Unicode-unfriendly ^[\000-\037] // Skipping Unicode-unfriendly ^[\000-\037] test_eq(run1_match("\\0*", "", "\u{0}\u{0}\u{0}\u{0}"), "\u{0}\u{0}\u{0}\u{0}"); // "\\0*" test_eq(run1_match("^\\s", "", " abc"), " "); // "^\\s" test_eq(run1_match("^\\s", "", "\u{c}abc"), "\u{c}"); // "^\\s" test_eq(run1_match("^\\s", "", "\nabc"), "\n"); // "^\\s" test_eq(run1_match("^\\s", "", "\u{d}abc"), "\u{d}"); // "^\\s" test_eq(run1_match("^\\s", "", "\u{9}abc"), "\u{9}"); // "^\\s" test_eq(run1_match("^abc", "", "abc"), "abc"); // "^abc" test_eq(run1_match("ab{1,3}bc", "", "abbbbc"), "abbbbc"); // "ab{1,3}bc" test_eq(run1_match("ab{1,3}bc", "", "abbbc"), "abbbc"); // "ab{1,3}bc" test_eq(run1_match("ab{1,3}bc", "", "abbc"), "abbc"); // "ab{1,3}bc" test_eq(run1_match("([^.]*)\\.([^:]*):[T ]+(.*)", "", "track1.title:TBlah blah blah"), "track1.title:TBlah blah blah,track1,title,Blah blah blah"); // "([^.]*)\\.([^:]*):[T ]+(.*)" test_eq(run1_match("([^.]*)\\.([^:]*):[T ]+(.*)", "i", "track1.title:TBlah blah blah"), "track1.title:TBlah blah blah,track1,title,Blah blah blah"); // "([^.]*)\\.([^:]*):[T ]+(.*)" test_eq(run1_match("([^.]*)\\.([^:]*):[t ]+(.*)", "i", "track1.title:TBlah blah blah"), "track1.title:TBlah blah blah,track1,title,Blah blah blah"); // "([^.]*)\\.([^:]*):[t ]+(.*)" test_eq(run1_match("^[W-c]+$", "", "WXY_^abc"), "WXY_^abc"); // "^[W-c]+$" test_eq(run1_match("^[W-c]+$", "i", "WXY_^abc"), "WXY_^abc"); // "^[W-c]+$" test_eq(run1_match("^[W-c]+$", "i", "wxy_^ABC"), "wxy_^ABC"); // "^[W-c]+$" test_eq(run1_match("^[\\x3f-\\x5F]+$", "i", "WXY_^abc"), "WXY_^abc"); // "^[\\x3f-\\x5F]+$" test_eq(run1_match("^[\\x3f-\\x5F]+$", "i", "wxy_^ABC"), "wxy_^ABC"); // "^[\\x3f-\\x5F]+$" test_eq(run1_match("^abc$", "m", "abc"), "abc"); // "^abc$" test_eq(run1_match("^abc$", "m", "qqq\nabc"), "abc"); // "^abc$" test_eq(run1_match("^abc$", "m", "abc\nzzz"), "abc"); // "^abc$" test_eq(run1_match("^abc$", "m", "qqq\nabc\nzzz"), "abc"); // "^abc$" test_eq(run1_match("^abc$", "", "abc"), "abc"); // "^abc$" test_eq(run1_match("(?:b)|(?::+)", "", "b::c"), "b"); // "(?:b)|(?::+)" test_eq(run1_match("(?:b)|(?::+)", "", "c::b"), "::"); // "(?:b)|(?::+)" test_eq(run1_match("[-az]+", "", "az-"), "az-"); // "[-az]+" test_eq(run1_match("[-az]+", "", "*** Failers"), "a"); // "[-az]+" test_eq(run1_match("[az-]+", "", "za-"), "za-"); // "[az-]+" test_eq(run1_match("[az-]+", "", "*** Failers"), "a"); // "[az-]+" test_eq(run1_match("[a\\-z]+", "", "a-z"), "a-z"); // "[a\\-z]+" test_eq(run1_match("[a\\-z]+", "", "*** Failers"), "a"); // "[a\\-z]+" test_eq(run1_match("[a-z]+", "", "abcdxyz"), "abcdxyz"); // "[a-z]+" test_eq(run1_match("[\\d-]+", "", "12-34"), "12-34"); // "[\\d-]+" // Skipping Unicode-unfriendly [\d-z]+ test_eq(run1_match("\\x5c", "", "\\\\"), "\\"); // "\\x5c" test_eq(run1_match("\\x20Z", "", "the Zoo"), " Z"); // "\\x20Z" // Skipping Unicode-unfriendly ab{3cd // Skipping Unicode-unfriendly ab{3,cd // Skipping Unicode-unfriendly ab{3,4a}cd // Skipping Unicode-unfriendly {4,5a}bc test_eq(run1_match("abc$", "", "abc"), "abc"); // "abc$" // Skipping Unicode-unfriendly (abc)\123 // Skipping Unicode-unfriendly (abc)\223 // Skipping Unicode-unfriendly (abc)\323 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (abc)\100 // Skipping Unicode-unfriendly (a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123 // Skipping Unicode-unfriendly ab\idef test_eq(run1_match("a{0}bc", "", "bc"), "bc"); // "a{0}bc" test_eq(run1_match("(a|(bc)){0,0}?xyz", "", "xyz"), "xyz,,"); // "(a|(bc)){0,0}?xyz" // Skipping Unicode-unfriendly abc[\10]de // Skipping Unicode-unfriendly abc[\1]de // Skipping Unicode-unfriendly (abc)[\1]de test_eq(run1_match("^([^a])([^\\b])([^c]*)([^d]{3,4})", "", "baNOTccccd"), "baNOTcccc,b,a,NOT,cccc"); // "^([^a])([^\\b])([^c]*)([^d]{3,4})" test_eq(run1_match("^([^a])([^\\b])([^c]*)([^d]{3,4})", "", "baNOTcccd"), "baNOTccc,b,a,NOT,ccc"); // "^([^a])([^\\b])([^c]*)([^d]{3,4})" test_eq(run1_match("^([^a])([^\\b])([^c]*)([^d]{3,4})", "", "baNOTccd"), "baNOTcc,b,a,NO,Tcc"); // "^([^a])([^\\b])([^c]*)([^d]{3,4})" test_eq(run1_match("^([^a])([^\\b])([^c]*)([^d]{3,4})", "", "bacccd"), "baccc,b,a,,ccc"); // "^([^a])([^\\b])([^c]*)([^d]{3,4})" test_eq(run1_match("^([^a])([^\\b])([^c]*)([^d]{3,4})", "", "*** Failers"), "*** Failers,*,*,* Fail,ers"); // "^([^a])([^\\b])([^c]*)([^d]{3,4})" test_eq(run1_match("[^a]", "", "Abc"), "A"); // "[^a]" test_eq(run1_match("[^a]", "i", "Abc "), "b"); // "[^a]" test_eq(run1_match("[^a]+", "", "AAAaAbc"), "AAA"); // "[^a]+" test_eq(run1_match("[^a]+", "i", "AAAaAbc "), "bc "); // "[^a]+" test_eq(run1_match("[^a]+", "", "bbb\nccc"), "bbb\nccc"); // "[^a]+" test_eq(run1_match("[^k]$", "", "abc"), "c"); // "[^k]$" test_eq(run1_match("[^k]$", "", "*** Failers"), "s"); // "[^k]$" test_eq(run1_match("[^k]$", "", "abk "), " "); // "[^k]$" test_eq(run1_match("[^k]{2,3}$", "", "abc"), "abc"); // "[^k]{2,3}$" test_eq(run1_match("[^k]{2,3}$", "", "kbc"), "bc"); // "[^k]{2,3}$" test_eq(run1_match("[^k]{2,3}$", "", "kabc "), "bc "); // "[^k]{2,3}$" test_eq(run1_match("[^k]{2,3}$", "", "*** Failers"), "ers"); // "[^k]{2,3}$" // Skipping Unicode-unfriendly ^\d{8,}\@.+[^k]$ // Skipping Unicode-unfriendly ^\d{8,}\@.+[^k]$ test_eq(run1_match("[^a]", "", "aaaabcd"), "b"); // "[^a]" test_eq(run1_match("[^a]", "", "aaAabcd "), "A"); // "[^a]" test_eq(run1_match("[^a]", "i", "aaaabcd"), "b"); // "[^a]" test_eq(run1_match("[^a]", "i", "aaAabcd "), "b"); // "[^a]" test_eq(run1_match("[^az]", "", "aaaabcd"), "b"); // "[^az]" test_eq(run1_match("[^az]", "", "aaAabcd "), "A"); // "[^az]" test_eq(run1_match("[^az]", "i", "aaaabcd"), "b"); // "[^az]" test_eq(run1_match("[^az]", "i", "aaAabcd "), "b"); // "[^az]" test_eq(run1_match("P[^*]TAIRE[^*]{1,6}?LL", "", "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx"), "PSTAIREISLL"); // "P[^*]TAIRE[^*]{1,6}?LL" test_eq(run1_match("P[^*]TAIRE[^*]{1,}?LL", "", "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx"), "PSTAIREISLL"); // "P[^*]TAIRE[^*]{1,}?LL" test_eq(run1_match("(\\.\\d\\d[1-9]?)\\d+", "", "1.230003938"), ".230003938,.23"); // "(\\.\\d\\d[1-9]?)\\d+" test_eq(run1_match("(\\.\\d\\d[1-9]?)\\d+", "", "1.875000282 "), ".875000282,.875"); // "(\\.\\d\\d[1-9]?)\\d+" test_eq(run1_match("(\\.\\d\\d[1-9]?)\\d+", "", "1.235 "), ".235,.23"); // "(\\.\\d\\d[1-9]?)\\d+" test_eq(run1_match("(\\.\\d\\d((?=0)|\\d(?=\\d)))", "", "1.230003938 "), ".23,.23,"); // "(\\.\\d\\d((?=0)|\\d(?=\\d)))" test_eq(run1_match("(\\.\\d\\d((?=0)|\\d(?=\\d)))", "", "1.875000282"), ".875,.875,5"); // "(\\.\\d\\d((?=0)|\\d(?=\\d)))" test_eq(run1_match("\\b(foo)\\s+(\\w+)", "i", "Food is on the foo table"), "foo table,foo,table"); // "\\b(foo)\\s+(\\w+)" test_eq(run1_match("foo(.*)bar", "", "The food is under the bar in the barn."), "food is under the bar in the bar,d is under the bar in the "); // "foo(.*)bar" test_eq(run1_match("foo(.*?)bar", "", "The food is under the bar in the barn."), "food is under the bar,d is under the "); // "foo(.*?)bar" test_eq(run1_match("(.*)(\\d*)", "", "I have 2 numbers: 53147"), "I have 2 numbers: 53147,I have 2 numbers: 53147,"); // "(.*)(\\d*)" test_eq(run1_match("(.*)(\\d+)", "", "I have 2 numbers: 53147"), "I have 2 numbers: 53147,I have 2 numbers: 5314,7"); // "(.*)(\\d+)" test_eq(run1_match("(.*?)(\\d*)", "", "I have 2 numbers: 53147"), ",,"); // "(.*?)(\\d*)" test_eq(run1_match("(.*?)(\\d+)", "", "I have 2 numbers: 53147"), "I have 2,I have ,2"); // "(.*?)(\\d+)" test_eq(run1_match("(.*)(\\d+)$", "", "I have 2 numbers: 53147"), "I have 2 numbers: 53147,I have 2 numbers: 5314,7"); // "(.*)(\\d+)$" test_eq(run1_match("(.*?)(\\d+)$", "", "I have 2 numbers: 53147"), "I have 2 numbers: 53147,I have 2 numbers: ,53147"); // "(.*?)(\\d+)$" test_eq(run1_match("(.*)\\b(\\d+)$", "", "I have 2 numbers: 53147"), "I have 2 numbers: 53147,I have 2 numbers: ,53147"); // "(.*)\\b(\\d+)$" test_eq(run1_match("(.*\\D)(\\d+)$", "", "I have 2 numbers: 53147"), "I have 2 numbers: 53147,I have 2 numbers: ,53147"); // "(.*\\D)(\\d+)$" test_eq(run1_match("^\\D*(?!123)", "", "ABC123"), "AB"); // "^\\D*(?!123)" test_eq(run1_match("^\\D*(?!123)", "", " "), " "); // "^\\D*(?!123)" test_eq(run1_match("^(\\D*)(?=\\d)(?!123)", "", "ABC445"), "ABC,ABC"); // "^(\\D*)(?=\\d)(?!123)" // Skipping Unicode-unfriendly ^[W-]46] // Skipping Unicode-unfriendly ^[W-]46] test_eq(run1_match("^[W-\\]46]", "", "W46]789 "), "W"); // "^[W-\\]46]" test_eq(run1_match("^[W-\\]46]", "", "Wall"), "W"); // "^[W-\\]46]" test_eq(run1_match("^[W-\\]46]", "", "Zebra"), "Z"); // "^[W-\\]46]" test_eq(run1_match("^[W-\\]46]", "", "Xylophone "), "X"); // "^[W-\\]46]" test_eq(run1_match("^[W-\\]46]", "", "42"), "4"); // "^[W-\\]46]" test_eq(run1_match("^[W-\\]46]", "", "[abcd] "), "["); // "^[W-\\]46]" test_eq(run1_match("^[W-\\]46]", "", "]abcd["), "]"); // "^[W-\\]46]" test_eq(run1_match("^[W-\\]46]", "", "\\backslash "), "\\"); // "^[W-\\]46]" test_eq(run1_match("\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d", "", "01/01/2000"), "01/01/2000"); // "\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d" test_eq(run1_match("^(a){0,0}", "", "bcd"), ","); // "^(a){0,0}" test_eq(run1_match("^(a){0,0}", "", "abc"), ","); // "^(a){0,0}" test_eq(run1_match("^(a){0,0}", "", "aab "), ","); // "^(a){0,0}" test_eq(run1_match("^(a){0,1}", "", "bcd"), ","); // "^(a){0,1}" test_eq(run1_match("^(a){0,1}", "", "abc"), "a,a"); // "^(a){0,1}" test_eq(run1_match("^(a){0,1}", "", "aab "), "a,a"); // "^(a){0,1}" test_eq(run1_match("^(a){0,2}", "", "bcd"), ","); // "^(a){0,2}" test_eq(run1_match("^(a){0,2}", "", "abc"), "a,a"); // "^(a){0,2}" test_eq(run1_match("^(a){0,2}", "", "aab "), "aa,a"); // "^(a){0,2}" test_eq(run1_match("^(a){0,3}", "", "bcd"), ","); // "^(a){0,3}" test_eq(run1_match("^(a){0,3}", "", "abc"), "a,a"); // "^(a){0,3}" test_eq(run1_match("^(a){0,3}", "", "aab"), "aa,a"); // "^(a){0,3}" test_eq(run1_match("^(a){0,3}", "", "aaa "), "aaa,a"); // "^(a){0,3}" test_eq(run1_match("^(a){0,}", "", "bcd"), ","); // "^(a){0,}" test_eq(run1_match("^(a){0,}", "", "abc"), "a,a"); // "^(a){0,}" test_eq(run1_match("^(a){0,}", "", "aab"), "aa,a"); // "^(a){0,}" test_eq(run1_match("^(a){0,}", "", "aaa"), "aaa,a"); // "^(a){0,}" test_eq(run1_match("^(a){0,}", "", "aaaaaaaa "), "aaaaaaaa,a"); // "^(a){0,}" test_eq(run1_match("^(a){1,1}", "", "abc"), "a,a"); // "^(a){1,1}" test_eq(run1_match("^(a){1,1}", "", "aab "), "a,a"); // "^(a){1,1}" test_eq(run1_match("^(a){1,2}", "", "abc"), "a,a"); // "^(a){1,2}" test_eq(run1_match("^(a){1,2}", "", "aab "), "aa,a"); // "^(a){1,2}" test_eq(run1_match("^(a){1,3}", "", "abc"), "a,a"); // "^(a){1,3}" test_eq(run1_match("^(a){1,3}", "", "aab"), "aa,a"); // "^(a){1,3}" test_eq(run1_match("^(a){1,3}", "", "aaa "), "aaa,a"); // "^(a){1,3}" test_eq(run1_match("^(a){1,}", "", "abc"), "a,a"); // "^(a){1,}" test_eq(run1_match("^(a){1,}", "", "aab"), "aa,a"); // "^(a){1,}" test_eq(run1_match("^(a){1,}", "", "aaa"), "aaa,a"); // "^(a){1,}" test_eq(run1_match("^(a){1,}", "", "aaaaaaaa "), "aaaaaaaa,a"); // "^(a){1,}" test_eq(run1_match(".*\\.gif", "", "borfle\nbib.gif\nno"), "bib.gif"); // ".*\\.gif" test_eq(run1_match(".{0,}\\.gif", "", "borfle\nbib.gif\nno"), "bib.gif"); // ".{0,}\\.gif" test_eq(run1_match(".*\\.gif", "m", "borfle\nbib.gif\nno"), "bib.gif"); // ".*\\.gif" test_eq(run1_match(".*\\.gif", "", "borfle\nbib.gif\nno"), "bib.gif"); // ".*\\.gif" test_eq(run1_match(".*\\.gif", "m", "borfle\nbib.gif\nno"), "bib.gif"); // ".*\\.gif" test_eq(run1_match(".*$", "", "borfle\nbib.gif\nno"), "no"); // ".*$" test_eq(run1_match(".*$", "m", "borfle\nbib.gif\nno"), "borfle"); // ".*$" test_eq(run1_match(".*$", "", "borfle\nbib.gif\nno"), "no"); // ".*$" test_eq(run1_match(".*$", "m", "borfle\nbib.gif\nno"), "borfle"); // ".*$" test_eq(run1_match(".*$", "", "borfle\nbib.gif\nno\n"), ""); // ".*$" test_eq(run1_match(".*$", "m", "borfle\nbib.gif\nno\n"), "borfle"); // ".*$" test_eq(run1_match(".*$", "", "borfle\nbib.gif\nno\n"), ""); // ".*$" test_eq(run1_match(".*$", "m", "borfle\nbib.gif\nno\n"), "borfle"); // ".*$" test_eq(run1_match("(.*X|^B)", "", "abcde\n1234Xyz"), "1234X,1234X"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "", "BarFoo "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\n1234Xyz"), "1234X,1234X"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "BarFoo "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\nBar "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "", "abcde\n1234Xyz"), "1234X,1234X"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "", "BarFoo "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\n1234Xyz"), "1234X,1234X"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "BarFoo "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\nBar "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\n1234Xyz"), "1234X,1234X"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "BarFoo "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\nBar "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\n1234Xyz"), "1234X,1234X"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "BarFoo "), "B,B"); // "(.*X|^B)" test_eq(run1_match("(.*X|^B)", "m", "abcde\nBar "), "B,B"); // "(.*X|^B)" test_eq(run1_match("^.*B", "", "B\n"), "B"); // "^.*B" test_eq(run1_match("^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", "", "123456654321"), "123456654321"); // "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" test_eq(run1_match("^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d", "", "123456654321 "), "123456654321"); // "^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d" test_eq(run1_match("^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]", "", "123456654321"), "123456654321"); // "^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]" test_eq(run1_match("^[abc]{12}", "", "abcabcabcabc"), "abcabcabcabc"); // "^[abc]{12}" test_eq(run1_match("^[a-c]{12}", "", "abcabcabcabc"), "abcabcabcabc"); // "^[a-c]{12}" test_eq(run1_match("^(a|b|c){12}", "", "abcabcabcabc "), "abcabcabcabc,c"); // "^(a|b|c){12}" test_eq(run1_match("^[abcdefghijklmnopqrstuvwxy0123456789]", "", "n"), "n"); // "^[abcdefghijklmnopqrstuvwxy0123456789]" test_eq(run1_match("abcde{0,0}", "", "abcd"), "abcd"); // "abcde{0,0}" test_eq(run1_match("ab[cd]{0,0}e", "", "abe"), "abe"); // "ab[cd]{0,0}e" test_eq(run1_match("ab(c){0,0}d", "", "abd"), "abd,"); // "ab(c){0,0}d" test_eq(run1_match("a(b*)", "", "a"), "a,"); // "a(b*)" test_eq(run1_match("a(b*)", "", "ab"), "ab,b"); // "a(b*)" test_eq(run1_match("a(b*)", "", "abbbb"), "abbbb,bbbb"); // "a(b*)" test_eq(run1_match("a(b*)", "", "*** Failers"), "a,"); // "a(b*)" test_eq(run1_match("ab\\d{0}e", "", "abe"), "abe"); // "ab\\d{0}e" test_eq(run1_match("\"([^\\\\\"]+|\\\\.)*\"", "", "the \"quick\" brown fox"), "\"quick\",quick"); // "\"([^\\\\\"]+|\\\\.)*\"" test_eq(run1_match("\"([^\\\\\"]+|\\\\.)*\"", "", "\"the \\\"quick\\\" brown fox\" "), "\"the \\\"quick\\\" brown fox\", brown fox"); // "\"([^\\\\\"]+|\\\\.)*\"" test_eq(run1_match(".*?", "", "abc"), ""); // ".*?" test_eq(run1_match("\\b", "", "abc "), ""); // "\\b" test_eq(tc.compile("\\b").run_global_match("abc "), ","); // "\\b" // Skipping global "\\b" with string "abc" test_eq(run1_match("a[^a]b", "", "acb"), "acb"); // "a[^a]b" test_eq(run1_match("a[^a]b", "", "a\nb"), "a\nb"); // "a[^a]b" test_eq(run1_match("a.b", "", "acb"), "acb"); // "a.b" test_eq(run1_match("a[^a]b", "", "acb"), "acb"); // "a[^a]b" test_eq(run1_match("a[^a]b", "", "a\nb "), "a\nb"); // "a[^a]b" test_eq(run1_match("a.b", "", "acb"), "acb"); // "a.b" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bac"), "bac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbac"), "bbac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbbac"), "bbbac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbbbac"), "bbbbac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+?|a){1,2}?c", "", "bbbbbac "), "bbbbbac,a"); // "^(b+?|a){1,2}?c" test_eq(run1_match("^(b+|a){1,2}?c", "", "bac"), "bac,a"); // "^(b+|a){1,2}?c" test_eq(run1_match("^(b+|a){1,2}?c", "", "bbac"), "bbac,a"); // "^(b+|a){1,2}?c" test_eq(run1_match("^(b+|a){1,2}?c", "", "bbbac"), "bbbac,a"); // "^(b+|a){1,2}?c" test_eq(run1_match("^(b+|a){1,2}?c", "", "bbbbac"), "bbbbac,a"); // "^(b+|a){1,2}?c" test_eq(run1_match("^(b+|a){1,2}?c", "", "bbbbbac "), "bbbbbac,a"); // "^(b+|a){1,2}?c" // Skipping Unicode-unfriendly (?!\A)x // Skipping Unicode-unfriendly (?!\A)x test_eq(run1_match("(A|B)*?CD", "", "CD "), "CD,"); // "(A|B)*?CD" test_eq(run1_match("(A|B)*CD", "", "CD "), "CD,"); // "(A|B)*CD" test_eq(run1_match("(\\d+)(\\w)", "", "12345a"), "12345a,12345,a"); // "(\\d+)(\\w)" test_eq(run1_match("(\\d+)(\\w)", "", "12345+ "), "12345,1234,5"); // "(\\d+)(\\w)" test_eq(run1_match("(\\d+)(\\w)", "", "12345a"), "12345a,12345,a"); // "(\\d+)(\\w)" test_eq(run1_match("(\\d+)(\\w)", "", "12345+ "), "12345,1234,5"); // "(\\d+)(\\w)" test_eq(run1_match("(a+|b+|c+)*c", "", "aaabbbbccccd"), "aaabbbbcccc,ccc"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "((abc(ade)ufh()()x"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "(abc)"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "(abc(def)xyz)"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "a bcd e"), "bc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "a b cd e"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abcd e "), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "a bcde "), "bc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "a bcde f"), "bc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abcdef "), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abc"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "Abc"), "bc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "ABc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abc"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBBc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abcd"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abcD "), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abc"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBbc"), "bc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBBc "), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "Abc"), "bc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abc"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abxxc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "aBxxc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "Abxxc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "ABxxc"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abc:"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "abc:"), "abc,b"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "cat"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "fcat"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "focat "), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "foocat "), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "cat"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "fcat"), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "focat "), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(a+|b+|c+)*c", "", "foocat "), "c,"); // "(a+|b+|c+)*c" test_eq(run1_match("(abc|)+", "", "abc"), "abc,abc"); // "(abc|)+" test_eq(run1_match("(abc|)+", "", "abcabc"), "abcabc,abc"); // "(abc|)+" test_eq(run1_match("(abc|)+", "", "abcabcabc"), "abcabcabc,abc"); // "(abc|)+" test_eq(run1_match("(abc|)+", "", "xyz "), ","); // "(abc|)+" test_eq(run1_match("([a]*)*", "", "a"), "a,a"); // "([a]*)*" test_eq(run1_match("([a]*)*", "", "aaaaa "), "aaaaa,aaaaa"); // "([a]*)*" test_eq(run1_match("([ab]*)*", "", "a"), "a,a"); // "([ab]*)*" test_eq(run1_match("([ab]*)*", "", "b"), "b,b"); // "([ab]*)*" test_eq(run1_match("([ab]*)*", "", "ababab"), "ababab,ababab"); // "([ab]*)*" test_eq(run1_match("([ab]*)*", "", "aaaabcde"), "aaaab,aaaab"); // "([ab]*)*" test_eq(run1_match("([ab]*)*", "", "bbbb "), "bbbb,bbbb"); // "([ab]*)*" test_eq(run1_match("([^a]*)*", "", "b"), "b,b"); // "([^a]*)*" test_eq(run1_match("([^a]*)*", "", "bbbb"), "bbbb,bbbb"); // "([^a]*)*" test_eq(run1_match("([^a]*)*", "", "aaa "), ","); // "([^a]*)*" test_eq(run1_match("([^ab]*)*", "", "cccc"), "cccc,cccc"); // "([^ab]*)*" test_eq(run1_match("([^ab]*)*", "", "abab "), ","); // "([^ab]*)*" test_eq(run1_match("([a]*?)*", "", "a"), "a,a"); // "([a]*?)*" test_eq(run1_match("([a]*?)*", "", "aaaa "), "aaaa,a"); // "([a]*?)*" test_eq(run1_match("([ab]*?)*", "", "a"), "a,a"); // "([ab]*?)*" test_eq(run1_match("([ab]*?)*", "", "b"), "b,b"); // "([ab]*?)*" test_eq(run1_match("([ab]*?)*", "", "abab"), "abab,b"); // "([ab]*?)*" test_eq(run1_match("([ab]*?)*", "", "baba "), "baba,a"); // "([ab]*?)*" test_eq(run1_match("([^a]*?)*", "", "b"), "b,b"); // "([^a]*?)*" test_eq(run1_match("([^a]*?)*", "", "bbbb"), "bbbb,b"); // "([^a]*?)*" test_eq(run1_match("([^a]*?)*", "", "aaa "), ","); // "([^a]*?)*" test_eq(run1_match("([^ab]*?)*", "", "c"), "c,c"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "cccc"), "cccc,c"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "baba "), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "a"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aaabcde "), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aaaaa"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aabbaa "), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aaaaa"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aabbaa "), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "12-sep-98"), "12-sep-98,8"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "12-09-98"), "12-09-98,8"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "*** Failers"), "*** F,F"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "sep-12-98"), "sep-12-98,8"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", " "), " , "); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "saturday"), "s,s"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "sunday"), "sund,d"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "Saturday"), "S,S"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "Sunday"), "Sund,d"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "SATURDAY"), "SATURDAY,Y"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "SUNDAY"), "SUNDAY,Y"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "SunDay"), "SunD,D"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "abcx"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aBCx"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "bbx"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "BBx"), "BBx,x"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "*** Failers"), "*** F,F"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "abcX"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aBCX"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "bbX"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "BBX "), "BBX , "); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "ac"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aC"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "bD"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "elephant"), "eleph,h"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "Europe "), "Europe , "); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "frog"), "frog,g"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "France"), "Fr,r"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "*** Failers"), "*** F,F"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "Africa "), "Afric,c"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "ab"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aBd"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "xy"), "xy,y"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "xY"), "xY,Y"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "zebra"), "ze,e"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "Zambesi"), "Z,Z"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "*** Failers"), "*** F,F"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "aCD "), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "XY "), "XY , "); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "foo\nbar"), "foo\n,\n"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "*** Failers"), "*** F,F"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "bar"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "baz\nbar "), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "barbaz"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "barbarbaz "), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "koobarbaz "), "koo,o"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "*** Failers"), "*** F,F"); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "baz"), ","); // "([^ab]*?)*" test_eq(run1_match("([^ab]*?)*", "", "foobarbaz "), "foo,o"); // "([^ab]*?)*" test_eq(run1_match("abc", "", "abc"), "abc"); // "abc" test_eq(run1_match("abc", "", "xabcy"), "abc"); // "abc" test_eq(run1_match("abc", "", "ababc"), "abc"); // "abc" test_eq(run1_match("ab*c", "", "abc"), "abc"); // "ab*c" test_eq(run1_match("ab*bc", "", "abc"), "abc"); // "ab*bc" test_eq(run1_match("ab*bc", "", "abbc"), "abbc"); // "ab*bc" test_eq(run1_match("ab*bc", "", "abbbbc"), "abbbbc"); // "ab*bc" test_eq(run1_match(".{1}", "", "abbbbc"), "a"); // ".{1}" test_eq(run1_match(".{3,4}", "", "abbbbc"), "abbb"); // ".{3,4}" test_eq(run1_match("ab{0,}bc", "", "abbbbc"), "abbbbc"); // "ab{0,}bc" test_eq(run1_match("ab+bc", "", "abbc"), "abbc"); // "ab+bc" test_eq(run1_match("ab+bc", "", "abbbbc"), "abbbbc"); // "ab+bc" test_eq(run1_match("ab{1,}bc", "", "abbbbc"), "abbbbc"); // "ab{1,}bc" test_eq(run1_match("ab{1,3}bc", "", "abbbbc"), "abbbbc"); // "ab{1,3}bc" test_eq(run1_match("ab{3,4}bc", "", "abbbbc"), "abbbbc"); // "ab{3,4}bc" test_eq(run1_match("ab?bc", "", "abbc"), "abbc"); // "ab?bc" test_eq(run1_match("ab?bc", "", "abc"), "abc"); // "ab?bc" test_eq(run1_match("ab{0,1}bc", "", "abc"), "abc"); // "ab{0,1}bc" test_eq(run1_match("ab?c", "", "abc"), "abc"); // "ab?c" test_eq(run1_match("ab{0,1}c", "", "abc"), "abc"); // "ab{0,1}c" test_eq(run1_match("^abc$", "", "abc"), "abc"); // "^abc$" test_eq(run1_match("^abc", "", "abcc"), "abc"); // "^abc" test_eq(run1_match("abc$", "", "aabc"), "abc"); // "abc$" test_eq(run1_match("abc$", "", "aabc"), "abc"); // "abc$" test_eq(run1_match("^", "", "abc"), ""); // "^" test_eq(run1_match("$", "", "abc"), ""); // "$" test_eq(run1_match("a.c", "", "abc"), "abc"); // "a.c" test_eq(run1_match("a.c", "", "axc"), "axc"); // "a.c" test_eq(run1_match("a.*c", "", "axyzc"), "axyzc"); // "a.*c" test_eq(run1_match("a[bc]d", "", "abd"), "abd"); // "a[bc]d" test_eq(run1_match("a[b-d]e", "", "ace"), "ace"); // "a[b-d]e" test_eq(run1_match("a[b-d]", "", "aac"), "ac"); // "a[b-d]" test_eq(run1_match("a[-b]", "", "a-"), "a-"); // "a[-b]" test_eq(run1_match("a[b-]", "", "a-"), "a-"); // "a[b-]" // Skipping Unicode-unfriendly a] test_eq(run1_match("a[^bc]d", "", "aed"), "aed"); // "a[^bc]d" test_eq(run1_match("a[^-b]c", "", "adc"), "adc"); // "a[^-b]c" test_eq(run1_match("\\ba\\b", "", "a-"), "a"); // "\\ba\\b" test_eq(run1_match("\\ba\\b", "", "-a"), "a"); // "\\ba\\b" test_eq(run1_match("\\ba\\b", "", "-a-"), "a"); // "\\ba\\b" test_eq(run1_match("\\Ba\\B", "", "*** Failers"), "a"); // "\\Ba\\B" test_eq(run1_match("\\By\\b", "", "xy"), "y"); // "\\By\\b" test_eq(run1_match("\\by\\B", "", "yz"), "y"); // "\\by\\B" test_eq(run1_match("\\By\\B", "", "xyz"), "y"); // "\\By\\B" test_eq(run1_match("\\w", "", "a"), "a"); // "\\w" test_eq(run1_match("\\W", "", "-"), "-"); // "\\W" test_eq(run1_match("\\W", "", "*** Failers"), "*"); // "\\W" test_eq(run1_match("\\W", "", "-"), "-"); // "\\W" test_eq(run1_match("a\\sb", "", "a b"), "a b"); // "a\\sb" test_eq(run1_match("a\\Sb", "", "a-b"), "a-b"); // "a\\Sb" test_eq(run1_match("a\\Sb", "", "a-b"), "a-b"); // "a\\Sb" test_eq(run1_match("\\d", "", "1"), "1"); // "\\d" test_eq(run1_match("\\D", "", "-"), "-"); // "\\D" test_eq(run1_match("\\D", "", "*** Failers"), "*"); // "\\D" test_eq(run1_match("\\D", "", "-"), "-"); // "\\D" test_eq(run1_match("[\\w]", "", "a"), "a"); // "[\\w]" test_eq(run1_match("[\\W]", "", "-"), "-"); // "[\\W]" test_eq(run1_match("[\\W]", "", "*** Failers"), "*"); // "[\\W]" test_eq(run1_match("[\\W]", "", "-"), "-"); // "[\\W]" test_eq(run1_match("a[\\s]b", "", "a b"), "a b"); // "a[\\s]b" test_eq(run1_match("a[\\S]b", "", "a-b"), "a-b"); // "a[\\S]b" test_eq(run1_match("a[\\S]b", "", "a-b"), "a-b"); // "a[\\S]b" test_eq(run1_match("[\\d]", "", "1"), "1"); // "[\\d]" test_eq(run1_match("[\\D]", "", "-"), "-"); // "[\\D]" test_eq(run1_match("[\\D]", "", "*** Failers"), "*"); // "[\\D]" test_eq(run1_match("[\\D]", "", "-"), "-"); // "[\\D]" test_eq(run1_match("ab|cd", "", "abc"), "ab"); // "ab|cd" test_eq(run1_match("ab|cd", "", "abcd"), "ab"); // "ab|cd" test_eq(run1_match("()ef", "", "def"), "ef,"); // "()ef" test_eq(run1_match("a\\(b", "", "a(b"), "a(b"); // "a\\(b" test_eq(run1_match("((a))", "", "abc"), "a,a,a"); // "((a))" test_eq(run1_match("(a)b(c)", "", "abc"), "abc,a,c"); // "(a)b(c)" test_eq(run1_match("a+b+c", "", "aabbabc"), "abc"); // "a+b+c" test_eq(run1_match("a{1,}b{1,}c", "", "aabbabc"), "abc"); // "a{1,}b{1,}c" test_eq(run1_match("a.+?c", "", "abcabc"), "abc"); // "a.+?c" test_eq(run1_match("(a+|b)*", "", "ab"), "ab,b"); // "(a+|b)*" test_eq(run1_match("(a+|b){0,}", "", "ab"), "ab,b"); // "(a+|b){0,}" test_eq(run1_match("(a+|b)+", "", "ab"), "ab,b"); // "(a+|b)+" test_eq(run1_match("(a+|b){1,}", "", "ab"), "ab,b"); // "(a+|b){1,}" test_eq(run1_match("(a+|b)?", "", "ab"), "a,a"); // "(a+|b)?" test_eq(run1_match("(a+|b){0,1}", "", "ab"), "a,a"); // "(a+|b){0,1}" test_eq(run1_match("[^ab]*", "", "cde"), "cde"); // "[^ab]*" test_eq(run1_match("([abc])*d", "", "abbbcd"), "abbbcd,c"); // "([abc])*d" test_eq(run1_match("([abc])*bcd", "", "abcd"), "abcd,a"); // "([abc])*bcd" test_eq(run1_match("a|b|c|d|e", "", "e"), "e"); // "a|b|c|d|e" test_eq(run1_match("(a|b|c|d|e)f", "", "ef"), "ef,e"); // "(a|b|c|d|e)f" test_eq(run1_match("abcd*efg", "", "abcdefg"), "abcdefg"); // "abcd*efg" test_eq(run1_match("ab*", "", "xabyabbbz"), "ab"); // "ab*" test_eq(run1_match("ab*", "", "xayabbbz"), "a"); // "ab*" test_eq(run1_match("(ab|cd)e", "", "abcde"), "cde,cd"); // "(ab|cd)e" test_eq(run1_match("[abhgefdc]ij", "", "hij"), "hij"); // "[abhgefdc]ij" test_eq(run1_match("(abc|)ef", "", "abcdef"), "ef,"); // "(abc|)ef" test_eq(run1_match("(a|b)c*d", "", "abcd"), "bcd,b"); // "(a|b)c*d" test_eq(run1_match("(ab|ab*)bc", "", "abc"), "abc,a"); // "(ab|ab*)bc" test_eq(run1_match("a([bc]*)c*", "", "abc"), "abc,bc"); // "a([bc]*)c*" test_eq(run1_match("a([bc]*)(c*d)", "", "abcd"), "abcd,bc,d"); // "a([bc]*)(c*d)" test_eq(run1_match("a([bc]+)(c*d)", "", "abcd"), "abcd,bc,d"); // "a([bc]+)(c*d)" test_eq(run1_match("a([bc]*)(c+d)", "", "abcd"), "abcd,b,cd"); // "a([bc]*)(c+d)" test_eq(run1_match("a[bcd]*dcdcde", "", "adcdcde"), "adcdcde"); // "a[bcd]*dcdcde" test_eq(run1_match("(ab|a)b*c", "", "abc"), "abc,ab"); // "(ab|a)b*c" test_eq(run1_match("((a)(b)c)(d)", "", "abcd"), "abcd,abc,a,b,d"); // "((a)(b)c)(d)" test_eq(run1_match("[a-zA-Z_][a-zA-Z0-9_]*", "", "alpha"), "alpha"); // "[a-zA-Z_][a-zA-Z0-9_]*" test_eq(run1_match("^a(bc+|b[eh])g|.h$", "", "abh"), "bh,"); // "^a(bc+|b[eh])g|.h$" test_eq(run1_match("(bc+d$|ef*g.|h?i(j|k))", "", "effgz"), "effgz,effgz,"); // "(bc+d$|ef*g.|h?i(j|k))" test_eq(run1_match("(bc+d$|ef*g.|h?i(j|k))", "", "ij"), "ij,ij,j"); // "(bc+d$|ef*g.|h?i(j|k))" test_eq(run1_match("(bc+d$|ef*g.|h?i(j|k))", "", "reffgz"), "effgz,effgz,"); // "(bc+d$|ef*g.|h?i(j|k))" test_eq(run1_match("((((((((((a))))))))))", "", "a"), "a,a,a,a,a,a,a,a,a,a,a"); // "((((((((((a))))))))))" test_eq(run1_match("(((((((((a)))))))))", "", "a"), "a,a,a,a,a,a,a,a,a,a"); // "(((((((((a)))))))))" test_eq(run1_match("multiple words", "", "multiple words, yeah"), "multiple words"); // "multiple words" test_eq(run1_match("(.*)c(.*)", "", "abcde"), "abcde,ab,de"); // "(.*)c(.*)" test_eq(run1_match("\\((.*), (.*)\\)", "", "(a, b)"), "(a, b),a,b"); // "\\((.*), (.*)\\)" test_eq(run1_match("abcd", "", "abcd"), "abcd"); // "abcd" test_eq(run1_match("a(bc)d", "", "abcd"), "abcd,bc"); // "a(bc)d" test_eq(run1_match("a[-]?c", "", "ac"), "ac"); // "a[-]?c" test_eq(run1_match("abc", "i", "ABC"), "ABC"); // "abc" test_eq(run1_match("abc", "i", "XABCY"), "ABC"); // "abc" test_eq(run1_match("abc", "i", "ABABC"), "ABC"); // "abc" test_eq(run1_match("ab*c", "i", "ABC"), "ABC"); // "ab*c" test_eq(run1_match("ab*bc", "i", "ABC"), "ABC"); // "ab*bc" test_eq(run1_match("ab*bc", "i", "ABBC"), "ABBC"); // "ab*bc" test_eq(run1_match("ab*?bc", "i", "ABBBBC"), "ABBBBC"); // "ab*?bc" test_eq(run1_match("ab{0,}?bc", "i", "ABBBBC"), "ABBBBC"); // "ab{0,}?bc" test_eq(run1_match("ab+?bc", "i", "ABBC"), "ABBC"); // "ab+?bc" test_eq(run1_match("ab+bc", "i", "ABBBBC"), "ABBBBC"); // "ab+bc" test_eq(run1_match("ab{1,}?bc", "i", "ABBBBC"), "ABBBBC"); // "ab{1,}?bc" test_eq(run1_match("ab{1,3}?bc", "i", "ABBBBC"), "ABBBBC"); // "ab{1,3}?bc" test_eq(run1_match("ab{3,4}?bc", "i", "ABBBBC"), "ABBBBC"); // "ab{3,4}?bc" test_eq(run1_match("ab??bc", "i", "ABBC"), "ABBC"); // "ab??bc" test_eq(run1_match("ab??bc", "i", "ABC"), "ABC"); // "ab??bc" test_eq(run1_match("ab{0,1}?bc", "i", "ABC"), "ABC"); // "ab{0,1}?bc" test_eq(run1_match("ab??c", "i", "ABC"), "ABC"); // "ab??c" test_eq(run1_match("ab{0,1}?c", "i", "ABC"), "ABC"); // "ab{0,1}?c" test_eq(run1_match("^abc$", "i", "ABC"), "ABC"); // "^abc$" test_eq(run1_match("^abc", "i", "ABCC"), "ABC"); // "^abc" test_eq(run1_match("abc$", "i", "AABC"), "ABC"); // "abc$" test_eq(run1_match("^", "i", "ABC"), ""); // "^" test_eq(run1_match("$", "i", "ABC"), ""); // "$" test_eq(run1_match("a.c", "i", "ABC"), "ABC"); // "a.c" test_eq(run1_match("a.c", "i", "AXC"), "AXC"); // "a.c" test_eq(run1_match("a.*?c", "i", "AXYZC"), "AXYZC"); // "a.*?c" test_eq(run1_match("a.*c", "i", "AABC"), "AABC"); // "a.*c" test_eq(run1_match("a[bc]d", "i", "ABD"), "ABD"); // "a[bc]d" test_eq(run1_match("a[b-d]e", "i", "ACE"), "ACE"); // "a[b-d]e" test_eq(run1_match("a[b-d]", "i", "AAC"), "AC"); // "a[b-d]" test_eq(run1_match("a[-b]", "i", "A-"), "A-"); // "a[-b]" test_eq(run1_match("a[b-]", "i", "A-"), "A-"); // "a[b-]" // Skipping Unicode-unfriendly a] test_eq(run1_match("a[^bc]d", "i", "AED"), "AED"); // "a[^bc]d" test_eq(run1_match("a[^-b]c", "i", "ADC"), "ADC"); // "a[^-b]c" test_eq(run1_match("ab|cd", "i", "ABC"), "AB"); // "ab|cd" test_eq(run1_match("ab|cd", "i", "ABCD"), "AB"); // "ab|cd" test_eq(run1_match("()ef", "i", "DEF"), "EF,"); // "()ef" test_eq(run1_match("a\\(b", "i", "A(B"), "A(B"); // "a\\(b" test_eq(run1_match("((a))", "i", "ABC"), "A,A,A"); // "((a))" test_eq(run1_match("(a)b(c)", "i", "ABC"), "ABC,A,C"); // "(a)b(c)" test_eq(run1_match("a+b+c", "i", "AABBABC"), "ABC"); // "a+b+c" test_eq(run1_match("a{1,}b{1,}c", "i", "AABBABC"), "ABC"); // "a{1,}b{1,}c" test_eq(run1_match("a.+?c", "i", "ABCABC"), "ABC"); // "a.+?c" test_eq(run1_match("a.*?c", "i", "ABCABC"), "ABC"); // "a.*?c" test_eq(run1_match("a.{0,5}?c", "i", "ABCABC"), "ABC"); // "a.{0,5}?c" test_eq(run1_match("(a+|b)*", "i", "AB"), "AB,B"); // "(a+|b)*" test_eq(run1_match("(a+|b){0,}", "i", "AB"), "AB,B"); // "(a+|b){0,}" test_eq(run1_match("(a+|b)+", "i", "AB"), "AB,B"); // "(a+|b)+" test_eq(run1_match("(a+|b){1,}", "i", "AB"), "AB,B"); // "(a+|b){1,}" test_eq(run1_match("(a+|b)?", "i", "AB"), "A,A"); // "(a+|b)?" test_eq(run1_match("(a+|b){0,1}", "i", "AB"), "A,A"); // "(a+|b){0,1}" test_eq(run1_match("(a+|b){0,1}?", "i", "AB"), ","); // "(a+|b){0,1}?" test_eq(run1_match("[^ab]*", "i", "CDE"), "CDE"); // "[^ab]*" test_eq(run1_match("([abc])*d", "i", "ABBBCD"), "ABBBCD,C"); // "([abc])*d" test_eq(run1_match("([abc])*bcd", "i", "ABCD"), "ABCD,A"); // "([abc])*bcd" test_eq(run1_match("a|b|c|d|e", "i", "E"), "E"); // "a|b|c|d|e" test_eq(run1_match("(a|b|c|d|e)f", "i", "EF"), "EF,E"); // "(a|b|c|d|e)f" test_eq(run1_match("abcd*efg", "i", "ABCDEFG"), "ABCDEFG"); // "abcd*efg" test_eq(run1_match("ab*", "i", "XABYABBBZ"), "AB"); // "ab*" test_eq(run1_match("ab*", "i", "XAYABBBZ"), "A"); // "ab*" test_eq(run1_match("(ab|cd)e", "i", "ABCDE"), "CDE,CD"); // "(ab|cd)e" test_eq(run1_match("[abhgefdc]ij", "i", "HIJ"), "HIJ"); // "[abhgefdc]ij" test_eq(run1_match("(abc|)ef", "i", "ABCDEF"), "EF,"); // "(abc|)ef" test_eq(run1_match("(a|b)c*d", "i", "ABCD"), "BCD,B"); // "(a|b)c*d" test_eq(run1_match("(ab|ab*)bc", "i", "ABC"), "ABC,A"); // "(ab|ab*)bc" test_eq(run1_match("a([bc]*)c*", "i", "ABC"), "ABC,BC"); // "a([bc]*)c*" test_eq(run1_match("a([bc]*)(c*d)", "i", "ABCD"), "ABCD,BC,D"); // "a([bc]*)(c*d)" test_eq(run1_match("a([bc]+)(c*d)", "i", "ABCD"), "ABCD,BC,D"); // "a([bc]+)(c*d)" test_eq(run1_match("a([bc]*)(c+d)", "i", "ABCD"), "ABCD,B,CD"); // "a([bc]*)(c+d)" test_eq(run1_match("a[bcd]*dcdcde", "i", "ADCDCDE"), "ADCDCDE"); // "a[bcd]*dcdcde" test_eq(run1_match("(ab|a)b*c", "i", "ABC"), "ABC,AB"); // "(ab|a)b*c" test_eq(run1_match("((a)(b)c)(d)", "i", "ABCD"), "ABCD,ABC,A,B,D"); // "((a)(b)c)(d)" test_eq(run1_match("[a-zA-Z_][a-zA-Z0-9_]*", "i", "ALPHA"), "ALPHA"); // "[a-zA-Z_][a-zA-Z0-9_]*" test_eq(run1_match("^a(bc+|b[eh])g|.h$", "i", "ABH"), "BH,"); // "^a(bc+|b[eh])g|.h$" test_eq(run1_match("(bc+d$|ef*g.|h?i(j|k))", "i", "EFFGZ"), "EFFGZ,EFFGZ,"); // "(bc+d$|ef*g.|h?i(j|k))" test_eq(run1_match("(bc+d$|ef*g.|h?i(j|k))", "i", "IJ"), "IJ,IJ,J"); // "(bc+d$|ef*g.|h?i(j|k))" test_eq(run1_match("(bc+d$|ef*g.|h?i(j|k))", "i", "REFFGZ"), "EFFGZ,EFFGZ,"); // "(bc+d$|ef*g.|h?i(j|k))" test_eq(run1_match("((((((((((a))))))))))", "i", "A"), "A,A,A,A,A,A,A,A,A,A,A"); // "((((((((((a))))))))))" test_eq(run1_match("(((((((((a)))))))))", "i", "A"), "A,A,A,A,A,A,A,A,A,A"); // "(((((((((a)))))))))" test_eq(run1_match("(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))", "i", "A"), "A,A"); // "(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))" test_eq(run1_match("(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))", "i", "C"), "C,C"); // "(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))" test_eq(run1_match("multiple words", "i", "MULTIPLE WORDS, YEAH"), "MULTIPLE WORDS"); // "multiple words" test_eq(run1_match("(.*)c(.*)", "i", "ABCDE"), "ABCDE,AB,DE"); // "(.*)c(.*)" test_eq(run1_match("\\((.*), (.*)\\)", "i", "(A, B)"), "(A, B),A,B"); // "\\((.*), (.*)\\)" test_eq(run1_match("abcd", "i", "ABCD"), "ABCD"); // "abcd" test_eq(run1_match("a(bc)d", "i", "ABCD"), "ABCD,BC"); // "a(bc)d" test_eq(run1_match("a[-]?c", "i", "AC"), "AC"); // "a[-]?c" test_eq(run1_match("a(?!b).", "", "abad"), "ad"); // "a(?!b)." test_eq(run1_match("a(?=d).", "", "abad"), "ad"); // "a(?=d)." test_eq(run1_match("a(?=c|d).", "", "abad"), "ad"); // "a(?=c|d)." test_eq(run1_match("a(?:b|c|d)(.)", "", "ace"), "ace,e"); // "a(?:b|c|d)(.)" test_eq(run1_match("a(?:b|c|d)*(.)", "", "ace"), "ace,e"); // "a(?:b|c|d)*(.)" test_eq(run1_match("a(?:b|c|d)+?(.)", "", "ace"), "ace,e"); // "a(?:b|c|d)+?(.)" test_eq(run1_match("a(?:b|c|d)+?(.)", "", "acdbcdbe"), "acd,d"); // "a(?:b|c|d)+?(.)" test_eq(run1_match("a(?:b|c|d)+(.)", "", "acdbcdbe"), "acdbcdbe,e"); // "a(?:b|c|d)+(.)" test_eq(run1_match("a(?:b|c|d){2}(.)", "", "acdbcdbe"), "acdb,b"); // "a(?:b|c|d){2}(.)" test_eq(run1_match("a(?:b|c|d){4,5}(.)", "", "acdbcdbe"), "acdbcdb,b"); // "a(?:b|c|d){4,5}(.)" test_eq(run1_match("a(?:b|c|d){4,5}?(.)", "", "acdbcdbe"), "acdbcd,d"); // "a(?:b|c|d){4,5}?(.)" test_eq(run1_match("((foo)|(bar))*", "", "foobar"), "foobar,bar,,bar"); // "((foo)|(bar))*" test_eq(run1_match("a(?:b|c|d){6,7}(.)", "", "acdbcdbe"), "acdbcdbe,e"); // "a(?:b|c|d){6,7}(.)" test_eq(run1_match("a(?:b|c|d){6,7}?(.)", "", "acdbcdbe"), "acdbcdbe,e"); // "a(?:b|c|d){6,7}?(.)" test_eq(run1_match("a(?:b|c|d){5,6}(.)", "", "acdbcdbe"), "acdbcdbe,e"); // "a(?:b|c|d){5,6}(.)" test_eq(run1_match("a(?:b|c|d){5,6}?(.)", "", "acdbcdbe"), "acdbcdb,b"); // "a(?:b|c|d){5,6}?(.)" test_eq(run1_match("a(?:b|c|d){5,7}(.)", "", "acdbcdbe"), "acdbcdbe,e"); // "a(?:b|c|d){5,7}(.)" test_eq(run1_match("a(?:b|c|d){5,7}?(.)", "", "acdbcdbe"), "acdbcdb,b"); // "a(?:b|c|d){5,7}?(.)" test_eq(run1_match("a(?:b|(c|e){1,2}?|d)+?(.)", "", "ace"), "ace,c,e"); // "a(?:b|(c|e){1,2}?|d)+?(.)" test_eq(run1_match("^(.+)?B", "", "AB"), "AB,A"); // "^(.+)?B" test_eq(run1_match("^([^a-z])|(\\^)$", "", "."), ".,.,"); // "^([^a-z])|(\\^)$" test_eq(run1_match("^[<>]&", "", "<&OUT"), "<&"); // "^[<>]&" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "foobar"), "foobar,,,,b,a,r"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "ab"), ",,,,,,"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "*** Failers"), ",,,,,,"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "cb"), ",,,,,,"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "b"), ",,,,,,"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "ab"), ",,,,,,"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "b"), ",,,,,,"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:(f)(o)(o)|(b)(a)(r))*", "", "b"), ",,,,,,"); // "(?:(f)(o)(o)|(b)(a)(r))*" test_eq(run1_match("(?:..)*a", "", "aba"), "aba"); // "(?:..)*a" test_eq(run1_match("(?:..)*?a", "", "aba"), "a"); // "(?:..)*?a" test_eq(run1_match("^(){3,5}", "", "abc"), ","); // "^(){3,5}" test_eq(run1_match("^(a+)*ax", "", "aax"), "aax,a"); // "^(a+)*ax" test_eq(run1_match("^((a|b)+)*ax", "", "aax"), "aax,a,a"); // "^((a|b)+)*ax" test_eq(run1_match("^((a|bc)+)*ax", "", "aax"), "aax,a,a"); // "^((a|bc)+)*ax" test_eq(run1_match("(a|x)*ab", "", "cab"), "ab,"); // "(a|x)*ab" test_eq(run1_match("(a)*ab", "", "cab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(a)*ab", "", "ab"), "ab,"); // "(a)*ab" test_eq(run1_match("(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))", "", "cabbbb"), "cabbbb"); // "(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))" test_eq(run1_match("(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))", "", "caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), "caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); // "(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))" test_eq(run1_match("foo\\w*\\d{4}baz", "", "foobar1234baz"), "foobar1234baz"); // "foo\\w*\\d{4}baz" test_eq(run1_match("x(~~)*(?:(?:F)?)?", "", "x~~"), "x~~,~~"); // "x(~~)*(?:(?:F)?)?" test_eq(run1_match("^a{3}c", "", "aaac"), "aaac"); // "^a{3}c" test_eq(run1_match("^a{3}c", "", "aaac"), "aaac"); // "^a{3}c" test_eq(run1_match("(\\w+:)+", "", "one:"), "one:,one:"); // "(\\w+:)+" test_eq(run1_match("([\\w:]+::)?(\\w+)$", "", "abcd"), "abcd,,abcd"); // "([\\w:]+::)?(\\w+)$" test_eq(run1_match("([\\w:]+::)?(\\w+)$", "", "xy:z:::abcd"), "xy:z:::abcd,xy:z:::,abcd"); // "([\\w:]+::)?(\\w+)$" test_eq(run1_match("^[^bcd]*(c+)", "", "aexycd"), "aexyc,c"); // "^[^bcd]*(c+)" test_eq(run1_match("(a*)b+", "", "caab"), "aab,aa"); // "(a*)b+" test_eq(run1_match("([\\w:]+::)?(\\w+)$", "", "abcd"), "abcd,,abcd"); // "([\\w:]+::)?(\\w+)$" test_eq(run1_match("([\\w:]+::)?(\\w+)$", "", "xy:z:::abcd"), "xy:z:::abcd,xy:z:::,abcd"); // "([\\w:]+::)?(\\w+)$" test_eq(run1_match("([\\w:]+::)?(\\w+)$", "", "*** Failers"), "Failers,,Failers"); // "([\\w:]+::)?(\\w+)$" test_eq(run1_match("^[^bcd]*(c+)", "", "aexycd"), "aexyc,c"); // "^[^bcd]*(c+)" test_eq(run1_match("([[:]+)", "", "a:[b]:"), ":[,:["); // "([[:]+)" test_eq(run1_match("([[=]+)", "", "a=[b]="), "=[,=["); // "([[=]+)" test_eq(run1_match("([[.]+)", "", "a.[b]."), ".[,.["); // "([[.]+)" test_eq(run1_match("((Z)+|A)*", "", "ZABCDEFG"), "ZA,A,"); // "((Z)+|A)*" test_eq(run1_match("(Z()|A)*", "", "ZABCDEFG"), "ZA,A,"); // "(Z()|A)*" test_eq(run1_match("(Z(())|A)*", "", "ZABCDEFG"), "ZA,A,,"); // "(Z(())|A)*" test_eq(run1_match("(Z(())|A)*", "", "ZABCDEFG"), "ZA,A,,"); // "(Z(())|A)*" test_eq(run1_match("(Z(())|A)*", "", "ZABCDEFG"), "ZA,A,,"); // "(Z(())|A)*" test_eq(run1_match("a*", "", "abbab"), "a"); // "a*" // Skipping Unicode-unfriendly a* test_eq(run1_match("a*", "", "-things"), ""); // "a*" // Skipping global "a*" with string "0digit" // Skipping global "a*" with string "*** Failers" // Skipping global "a*" with string "bcdef " // Skipping Unicode-unfriendly ^[\d-a] // Skipping Unicode-unfriendly ^[\d-a] // Skipping Unicode-unfriendly ^[\d-a] test_eq(run1_match("[\\s]+", "", "> \u{9}\n\u{c}\u{d}\u{b}<"), " \u{9}\n\u{c}\u{d}\u{b}"); // "[\\s]+" test_eq(run1_match("[\\s]+", "", " "), " "); // "[\\s]+" test_eq(run1_match("\\s+", "", "> \u{9}\n\u{c}\u{d}\u{b}<"), " \u{9}\n\u{c}\u{d}\u{b}"); // "\\s+" test_eq(run1_match("\\s+", "", " "), " "); // "\\s+" test_eq(run1_match("abc.", "", "abc1abc2xyzabc3 "), "abc1"); // "abc." // Skipping global "abc." with string "XabcY" // Skipping global "abc." with string "XabcY " // Skipping global "abc." with string "abcE" // Skipping Unicode-unfriendly [\z\C] // Skipping Unicode-unfriendly [\z\C] // Skipping Unicode-unfriendly \M test_eq(run1_match("(a+)*b", "", "bbbbc"), "b,"); // "(a+)*b" test_eq(run1_match("(a+)*b", "", "abc"), "ab,a"); // "(a+)*b" test_eq(run1_match("(a+)*b", "", "bca"), "b,"); // "(a+)*b" test_eq(run1_match("(a+)*b", "", "abc"), "ab,a"); // "(a+)*b" test_eq(run1_match("(a+)*b", "", "bca"), "b,"); // "(a+)*b" test_eq(run1_match("(a+)*b", "", "abc"), "ab,a"); // "(a+)*b" test_eq(run1_match("(a+)*b", "", "abc"), "ab,a"); // "(a+)*b" test_eq(run1_match("line\\nbreak", "", "this is a line\nbreak"), "line\nbreak"); // "line\\nbreak" test_eq(run1_match("line\\nbreak", "", "line one\nthis is a line\nbreak in the second line "), "line\nbreak"); // "line\\nbreak" test_eq(run1_match("line\\nbreak", "", "this is a line\nbreak"), "line\nbreak"); // "line\\nbreak" test_eq(run1_match("line\\nbreak", "", "line one\nthis is a line\nbreak in the second line "), "line\nbreak"); // "line\\nbreak" test_eq(run1_match("line\\nbreak", "m", "this is a line\nbreak"), "line\nbreak"); // "line\\nbreak" test_eq(run1_match("line\\nbreak", "m", "line one\nthis is a line\nbreak in the second line "), "line\nbreak"); // "line\\nbreak" test_eq(run1_match("^", "m", "a\nb\nc\n"), ""); // "^" // Skipping global "^" with string " " // Skipping global "^" with string "A\nC\nC\n " // Skipping global "^" with string "AB" // Skipping global "^" with string "aB " // Skipping global "^" with string "AB" // Skipping global "^" with string "aB " // Skipping global "^" with string "AB" // Skipping global "^" with string "aB " // Skipping global "^" with string "AB" // Skipping global "^" with string "aB " test_eq(run1_match("Content-Type\\x3A[^\\r\\n]{6,}", "", "Content-Type:xxxxxyyy "), "Content-Type:xxxxxyyy "); // "Content-Type\\x3A[^\\r\\n]{6,}" test_eq(run1_match("Content-Type\\x3A[^\\r\\n]{6,}z", "", "Content-Type:xxxxxyyyz"), "Content-Type:xxxxxyyyz"); // "Content-Type\\x3A[^\\r\\n]{6,}z" test_eq(run1_match("Content-Type\\x3A[^a]{6,}", "", "Content-Type:xxxyyy "), "Content-Type:xxxyyy "); // "Content-Type\\x3A[^a]{6,}" test_eq(run1_match("Content-Type\\x3A[^a]{6,}z", "", "Content-Type:xxxyyyz"), "Content-Type:xxxyyyz"); // "Content-Type\\x3A[^a]{6,}z" test_eq(run1_match("^abc", "m", "xyz\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}abc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\nabc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}abc"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}abc"), "abc"); // "^abc" test_eq(run1_match("abc$", "m", "xyzabc"), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\n "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\npqr "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d} "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d}pqr "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d}\n "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d}\npqr "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d} "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d}pqr "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d}\n "), "abc"); // "abc$" test_eq(run1_match("abc$", "m", "xyzabc\u{d}\npqr "), "abc"); // "abc$" test_eq(run1_match("^abc", "m", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}\nabcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match("^abc", "m", "xyz\u{d}abcdef"), "abc"); // "^abc" test_eq(run1_match(".*", "", "abc\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\u{d}def"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\u{d}\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\u{d}def"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\u{d}\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\ndef"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\u{d}def"), "abc"); // ".*" test_eq(run1_match(".*", "", "abc\u{d}\ndef"), "abc"); // ".*" test_eq(run1_match("^\\w+=.*(\\\\\\n.*)*", "", "abc=xyz\\\npqr"), "abc=xyz\\,"); // "^\\w+=.*(\\\\\\n.*)*" test_eq(run1_match("^(a()*)*", "", "aaaa"), "aaaa,a,"); // "^(a()*)*" test_eq(run1_match("^(?:a(?:(?:))*)*", "", "aaaa"), "aaaa"); // "^(?:a(?:(?:))*)*" test_eq(run1_match("^(a()+)+", "", "aaaa"), "aaaa,a,"); // "^(a()+)+" test_eq(run1_match("^(?:a(?:(?:))+)+", "", "aaaa"), "aaaa"); // "^(?:a(?:(?:))+)+" test_eq(run1_match("^abc.", "m", "abc1 \nabc2 \u{b}abc3xx \u{c}abc4 \u{d}abc5xx \u{d}\nabc6 \u{85}abc7 JUNK"), "abc1"); // "^abc." test_eq(run1_match("abc.$", "m", "abc1\n abc2\u{b} abc3\u{c} abc4\u{d} abc5\u{d}\n abc6\u{85} abc9"), "abc1"); // "abc.$" // Skipping Unicode-unfriendly ^a\R*b // Skipping Unicode-unfriendly ^a[\R]b test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match(".+foo", "", "afoo"), "afoo"); // ".+foo" test_eq(run1_match("^$", "m", "abc\u{d}\u{d}xyz"), ""); // "^$" // Skipping global "^$" with string "abc\n\u{d}xyz " // Skipping global "^$" with string "abc\u{d}\nxyz" test_eq(run1_match("^X", "m", "XABC"), "X"); // "^X" test_eq(run1_match("^X", "m", "XABCB"), "X"); // "^X" test_eq(run1_match("\\nA", "", "\u{d}\nA "), "\nA"); // "\\nA" test_eq(run1_match("[\\r\\n]A", "", "\u{d}\nA "), "\nA"); // "[\\r\\n]A" test_eq(run1_match("(\\r|\\n)A", "", "\u{d}\nA "), "\nA,\n"); // "(\\r|\\n)A" test_eq(run1_match("a(?!)|\\wbc", "", "abc "), "abc"); // "a(?!)|\\wbc" test_eq(run1_match("a[^]b", "", "aXb"), "aXb"); // "a[^]b" test_eq(run1_match("a[^]b", "", "a\nb "), "a\nb"); // "a[^]b" test_eq(run1_match("a[^]+b", "", "aXb"), "aXb"); // "a[^]+b" test_eq(run1_match("a[^]+b", "", "a\nX\nXb "), "a\nX\nXb"); // "a[^]+b" test_eq(run1_match("\\bX", "", "Xoanon"), "X"); // "\\bX" test_eq(run1_match("\\bX", "", "+Xoanon"), "X"); // "\\bX" test_eq(run1_match("\\bX", "", "x{300}Xoanon "), "X"); // "\\bX" test_eq(run1_match("\\BX", "", "YXoanon"), "X"); // "\\BX" test_eq(run1_match("X\\b", "", "X+oanon"), "X"); // "X\\b" test_eq(run1_match("X\\b", "", "FAX "), "X"); // "X\\b" test_eq(run1_match("X\\B", "", "Xoanon "), "X"); // "X\\B" test_eq(run1_match("X\\B", "", "ZXx{300}oanon "), "X"); // "X\\B" test_eq(run1_match("[^a]", "", "abcd"), "b"); // "[^a]" test_eq(run1_match("[^a]", "", "ax{100} "), "x"); // "[^a]" test_eq(run1_match("[^a]", "", "ab99"), "b"); // "[^a]" test_eq(run1_match("[^a]", "", "x{123}x{123}45"), "x"); // "[^a]" test_eq(run1_match("[^a]", "", "x{400}x{401}x{402}6 "), "x"); // "[^a]" test_eq(run1_match("[^a]", "", "*** Failers"), "*"); // "[^a]" test_eq(run1_match("[^a]", "", "d99"), "d"); // "[^a]" test_eq(run1_match("[^a]", "", "x{123}x{122}4 "), "x"); // "[^a]" test_eq(run1_match("[^a]", "", "x{400}x{403}6 "), "x"); // "[^a]" test_eq(run1_match("[^a]", "", "x{400}x{401}x{402}x{402}6 "), "x"); // "[^a]" test_eq(run1_match("a.b", "", "acb"), "acb"); // "a.b" test_eq(run1_match("a.b", "", "a\u{7f}b"), "a\u{7f}b"); // "a.b" test_eq(run1_match("a(.*?)(.)", "", "a\u{c0}\u{88}b"), "a\u{c0},,\u{c0}"); // "a(.*?)(.)" test_eq(run1_match("a(.*?)(.)", "", "ax{100}b"), "ax,,x"); // "a(.*?)(.)" test_eq(run1_match("a(.*)(.)", "", "a\u{c0}\u{88}b"), "a\u{c0}\u{88}b,\u{c0}\u{88},b"); // "a(.*)(.)" test_eq(run1_match("a(.*)(.)", "", "ax{100}b"), "ax{100}b,x{100},b"); // "a(.*)(.)" test_eq(run1_match("a(.)(.)", "", "a\u{c0}\u{92}bcd"), "a\u{c0}\u{92},\u{c0},\u{92}"); // "a(.)(.)" test_eq(run1_match("a(.)(.)", "", "ax{240}bcd"), "ax{,x,{"); // "a(.)(.)" test_eq(run1_match("a(.?)(.)", "", "a\u{c0}\u{92}bcd"), "a\u{c0}\u{92},\u{c0},\u{92}"); // "a(.?)(.)" test_eq(run1_match("a(.?)(.)", "", "ax{240}bcd"), "ax{,x,{"); // "a(.?)(.)" test_eq(run1_match("a(.??)(.)", "", "a\u{c0}\u{92}bcd"), "a\u{c0},,\u{c0}"); // "a(.??)(.)" test_eq(run1_match("a(.??)(.)", "", "ax{240}bcd"), "ax,,x"); // "a(.??)(.)" test_eq(run1_match("a(.{3,})b", "", "ax{1234}xyb "), "ax{1234}xyb,x{1234}xy"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}x{4321}yb "), "ax{1234}x{4321}yb,x{1234}x{4321}y"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}x{4321}x{3412}b "), "ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "axxxxbcdefghijb "), "axxxxbcdefghijb,xxxxbcdefghij"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}x{4321}x{3412}x{3421}b "), "ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}"); // "a(.{3,})b" test_eq(run1_match("a(.{3,})b", "", "ax{1234}b "), "ax{1234}b,x{1234}"); // "a(.{3,})b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}xyb "), "ax{1234}xyb,x{1234}xy"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}x{4321}yb "), "ax{1234}x{4321}yb,x{1234}x{4321}y"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}x{4321}x{3412}b "), "ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "axxxxbcdefghijb "), "axxxxb,xxxx"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}x{4321}x{3412}x{3421}b "), "ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,}?)b", "", "ax{1234}b "), "ax{1234}b,x{1234}"); // "a(.{3,}?)b" test_eq(run1_match("a(.{3,5})b", "", "axxxxbcdefghijb "), "axxxxb,xxxx"); // "a(.{3,5})b" test_eq(run1_match("a(.{3,5})b", "", "axbxxbcdefghijb "), "axbxxb,xbxx"); // "a(.{3,5})b" test_eq(run1_match("a(.{3,5})b", "", "axxxxxbcdefghijb "), "axxxxxb,xxxxx"); // "a(.{3,5})b" test_eq(run1_match("a(.{3,5}?)b", "", "axxxxbcdefghijb "), "axxxxb,xxxx"); // "a(.{3,5}?)b" test_eq(run1_match("a(.{3,5}?)b", "", "axbxxbcdefghijb "), "axbxxb,xbxx"); // "a(.{3,5}?)b" test_eq(run1_match("a(.{3,5}?)b", "", "axxxxxbcdefghijb "), "axxxxxb,xxxxx"); // "a(.{3,5}?)b" test_eq(run1_match("[^a]+", "", "bcd"), "bcd"); // "[^a]+" // Skipping Unicode-unfriendly [^a]+ test_eq(run1_match("^[^a]{2}", "", "x{100}bc"), "x{"); // "^[^a]{2}" test_eq(run1_match("^[^a]{2,}", "", "x{100}bcAa"), "x{100}bcA"); // "^[^a]{2,}" test_eq(run1_match("^[^a]{2,}?", "", "x{100}bca"), "x{"); // "^[^a]{2,}?" test_eq(run1_match("[^a]+", "i", "bcd"), "bcd"); // "[^a]+" // Skipping Unicode-unfriendly [^a]+ test_eq(run1_match("^[^a]{2}", "i", "x{100}bc"), "x{"); // "^[^a]{2}" test_eq(run1_match("^[^a]{2,}", "i", "x{100}bcAa"), "x{100}bc"); // "^[^a]{2,}" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}bca"), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100}x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "x{100}x{100}x{100}x{100} "), "x{"); // "^[^a]{2,}?" test_eq(run1_match("^[^a]{2,}?", "i", "Xyyyax{100}x{100}bXzzz"), "Xy"); // "^[^a]{2,}?" test_eq(run1_match("\\D", "", "1X2"), "X"); // "\\D" test_eq(run1_match("\\D", "", "1x{100}2 "), "x"); // "\\D" test_eq(run1_match(">\\S", "", "> >X Y"), ">X"); // ">\\S" test_eq(run1_match(">\\S", "", "> >x{100} Y"), ">x"); // ">\\S" test_eq(run1_match("\\d", "", "x{100}3"), "1"); // "\\d" test_eq(run1_match("\\s", "", "x{100} X"), " "); // "\\s" test_eq(run1_match("\\D+", "", "12abcd34"), "abcd"); // "\\D+" test_eq(run1_match("\\D+", "", "*** Failers"), "*** Failers"); // "\\D+" test_eq(run1_match("\\D+", "", "1234 "), " "); // "\\D+" test_eq(run1_match("\\D{2,3}", "", "12abcd34"), "abc"); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}", "", "12ab34"), "ab"); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}", "", "*** Failers "), "***"); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}", "", "12a34 "), " "); // "\\D{2,3}" test_eq(run1_match("\\D{2,3}?", "", "12abcd34"), "ab"); // "\\D{2,3}?" test_eq(run1_match("\\D{2,3}?", "", "12ab34"), "ab"); // "\\D{2,3}?" test_eq(run1_match("\\D{2,3}?", "", "*** Failers "), "**"); // "\\D{2,3}?" test_eq(run1_match("\\D{2,3}?", "", "12a34 "), " "); // "\\D{2,3}?" test_eq(run1_match("\\d+", "", "12abcd34"), "12"); // "\\d+" test_eq(run1_match("\\d{2,3}", "", "12abcd34"), "12"); // "\\d{2,3}" test_eq(run1_match("\\d{2,3}", "", "1234abcd"), "123"); // "\\d{2,3}" test_eq(run1_match("\\d{2,3}?", "", "12abcd34"), "12"); // "\\d{2,3}?" test_eq(run1_match("\\d{2,3}?", "", "1234abcd"), "12"); // "\\d{2,3}?" test_eq(run1_match("\\S+", "", "12abcd34"), "12abcd34"); // "\\S+" test_eq(run1_match("\\S+", "", "*** Failers"), "***"); // "\\S+" test_eq(run1_match("\\S{2,3}", "", "12abcd34"), "12a"); // "\\S{2,3}" test_eq(run1_match("\\S{2,3}", "", "1234abcd"), "123"); // "\\S{2,3}" test_eq(run1_match("\\S{2,3}", "", "*** Failers"), "***"); // "\\S{2,3}" test_eq(run1_match("\\S{2,3}?", "", "12abcd34"), "12"); // "\\S{2,3}?" test_eq(run1_match("\\S{2,3}?", "", "1234abcd"), "12"); // "\\S{2,3}?" test_eq(run1_match("\\S{2,3}?", "", "*** Failers"), "**"); // "\\S{2,3}?" test_eq(run1_match(">\\s+<", "", "12> <34"), "> <"); // ">\\s+<" test_eq(run1_match(">\\s{2,3}<", "", "ab> <"); // ">\\s{2,3}<" test_eq(run1_match(">\\s{2,3}<", "", "ab> <"); // ">\\s{2,3}<" test_eq(run1_match(">\\s{2,3}?<", "", "ab> <"); // ">\\s{2,3}?<" test_eq(run1_match(">\\s{2,3}?<", "", "ab> <"); // ">\\s{2,3}?<" test_eq(run1_match("\\w+", "", "12 34"), "12"); // "\\w+" test_eq(run1_match("\\w+", "", "*** Failers"), "Failers"); // "\\w+" test_eq(run1_match("\\w{2,3}", "", "ab cd"), "ab"); // "\\w{2,3}" test_eq(run1_match("\\w{2,3}", "", "abcd ce"), "abc"); // "\\w{2,3}" test_eq(run1_match("\\w{2,3}", "", "*** Failers"), "Fai"); // "\\w{2,3}" test_eq(run1_match("\\w{2,3}?", "", "ab cd"), "ab"); // "\\w{2,3}?" test_eq(run1_match("\\w{2,3}?", "", "abcd ce"), "ab"); // "\\w{2,3}?" test_eq(run1_match("\\w{2,3}?", "", "*** Failers"), "Fa"); // "\\w{2,3}?" test_eq(run1_match("\\W+", "", "12====34"), "===="); // "\\W+" test_eq(run1_match("\\W+", "", "*** Failers"), "*** "); // "\\W+" test_eq(run1_match("\\W+", "", "abcd "), " "); // "\\W+" test_eq(run1_match("\\W{2,3}", "", "ab====cd"), "==="); // "\\W{2,3}" test_eq(run1_match("\\W{2,3}", "", "ab==cd"), "=="); // "\\W{2,3}" test_eq(run1_match("\\W{2,3}", "", "*** Failers"), "***"); // "\\W{2,3}" test_eq(run1_match("\\W{2,3}?", "", "ab====cd"), "=="); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "ab==cd"), "=="); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers "), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers "), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "x{200}X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "x{200}X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "x{200}X "), " "); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "*** Failers"), "**"); // "\\W{2,3}?" test_eq(run1_match("\\W{2,3}?", "", "y "), " "); // "\\W{2,3}?" test_eq(run1_match("[\\xFF]", "", ">\u{ff}<"), "\u{ff}"); // "[\\xFF]" test_eq(run1_match("[^\\xFF]", "", "XYZ"), "X"); // "[^\\xFF]" test_eq(run1_match("[^\\xff]", "", "XYZ"), "X"); // "[^\\xff]" test_eq(run1_match("[^\\xff]", "", "x{123} "), "x"); // "[^\\xff]" test_eq(run1_match("(|a)", "", "catac"), ","); // "(|a)" // Skipping global "(|a)" with string "ax{256}a " // Skipping global "(|a)" with string "x{85}" test_eq(run1_match("^abc.", "m", "abc1 \nabc2 \u{b}abc3xx \u{c}abc4 \u{d}abc5xx \u{d}\nabc6 x{0085}abc7 x{2028}abc8 x{2029}abc9 JUNK"), "abc1"); // "^abc." test_eq(run1_match("abc.$", "m", "abc1\n abc2\u{b} abc3\u{c} abc4\u{d} abc5\u{d}\n abc6x{0085} abc7x{2028} abc8x{2029} abc9"), "abc1"); // "abc.$" // Skipping Unicode-unfriendly ^a\R*b test_eq(run1_match("X", "", "Ax{1ec5}ABCXYZ"), "X"); // "X" // Skipping Unicode-unfriendly \X?abc // Skipping Unicode-unfriendly \X?abc // Skipping Unicode-unfriendly \X?abc // Skipping Unicode-unfriendly \X?abc // Skipping Unicode-unfriendly ^\X?abc // Skipping Unicode-unfriendly \X*abc // Skipping Unicode-unfriendly \X*abc // Skipping Unicode-unfriendly \X*abc // Skipping Unicode-unfriendly \X*abc // Skipping Unicode-unfriendly ^\X*abc // Skipping Unicode-unfriendly [\p{Nd}] // Skipping Unicode-unfriendly [\p{Nd}] // Skipping Unicode-unfriendly [\P{Nd}]+ test_eq(run1_match("\\D+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "\\D+" test_eq(run1_match("\\D+", "", " "), " "); // "\\D+" test_eq(run1_match("\\D+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "\\D+" test_eq(run1_match("[\\D]+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "[\\D]+" test_eq(run1_match("[\\D\\P{Nd}]+", "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // "[\\D\\P{Nd}]+" // Skipping Unicode-unfriendly ^[\X] // Skipping Unicode-unfriendly ^(\X*)(.) // Skipping Unicode-unfriendly ^(\X*)(.) // Skipping Unicode-unfriendly ^(\X*?)(.) // Skipping Unicode-unfriendly ^(\X*?)(.) test_eq(run1_match("^[\\p{Any}]X", "", "AXYZ"), "AX"); // "^[\\p{Any}]X" // Skipping Unicode-unfriendly ^[\P{Any}]X test_eq(run1_match("^[\\p{Any}]?X", "", "XYZ"), "X"); // "^[\\p{Any}]?X" test_eq(run1_match("^[\\p{Any}]?X", "", "AXYZ"), "AX"); // "^[\\p{Any}]?X" test_eq(run1_match("^[\\P{Any}]?X", "", "XYZ"), "X"); // "^[\\P{Any}]?X" // Skipping Unicode-unfriendly ^[\P{Any}]?X test_eq(run1_match("^[\\p{Any}]+X", "", "AXYZ"), "AX"); // "^[\\p{Any}]+X" // Skipping Unicode-unfriendly ^[\P{Any}]+X test_eq(run1_match("^[\\p{Any}]*X", "", "XYZ"), "X"); // "^[\\p{Any}]*X" test_eq(run1_match("^[\\p{Any}]*X", "", "AXYZ"), "AX"); // "^[\\p{Any}]*X" test_eq(run1_match("^[\\P{Any}]*X", "", "XYZ"), "X"); // "^[\\P{Any}]*X" // Skipping Unicode-unfriendly ^[\P{Any}]*X } regress-0.10.5/tests/replacement_tests.rs000064400000000000000000000111461046102023000166150ustar 00000000000000use regress::Regex; #[test] fn test_replace_basic() { let re = Regex::new(r"world").unwrap(); let result = re.replace("hello world", "universe"); assert_eq!(result, "hello universe"); } #[test] fn test_replace_no_match() { let re = Regex::new(r"xyz").unwrap(); let result = re.replace("hello world", "universe"); assert_eq!(result, "hello world"); } #[test] fn test_replace_with_capture_groups() { let re = Regex::new(r"(\w+)\s+(\w+)").unwrap(); let result = re.replace("hello world", "$2 $1"); assert_eq!(result, "world hello"); } #[test] fn test_replace_with_group_zero() { let re = Regex::new(r"\d+").unwrap(); let result = re.replace("Price: $123", "[$0]"); assert_eq!(result, "Price: $[123]"); } #[test] fn test_replace_with_literal_dollar() { let re = Regex::new(r"\d+").unwrap(); let result = re.replace("Price: 123", "$$0"); assert_eq!(result, "Price: $0"); } #[test] fn test_replace_date_format() { let re = Regex::new(r"(\d{4})-(\d{2})-(\d{2})").unwrap(); let result = re.replace("2023-12-25", "$2/$3/$1"); assert_eq!(result, "12/25/2023"); } #[test] fn test_replace_all_basic() { let re = Regex::new(r"\d+").unwrap(); let result = re.replace_all("a1b2c3", "X"); assert_eq!(result, "aXbXcX"); } #[test] fn test_replace_all_with_groups() { let re = Regex::new(r"(\w+)\s+(\w+)").unwrap(); let result = re.replace_all("hello world foo bar", "$2-$1"); assert_eq!(result, "world-hello bar-foo"); } #[test] fn test_replace_all_word_boundaries() { let re = Regex::new(r"\b(\w)(\w+)").unwrap(); let result = re.replace_all("hello world", "$1.$2"); assert_eq!(result, "h.ello w.orld"); } #[test] fn test_replace_with_closure() { let re = Regex::new(r"\d+").unwrap(); let text = "Price: $123"; let result = re.replace_with(text, |m| { let num: i32 = m.as_str(text).parse().unwrap(); format!("{}", num * 2) }); assert_eq!(result, "Price: $246"); } #[test] fn test_replace_all_with_closure() { let re = Regex::new(r"\d+").unwrap(); let text = "Items: 5, 10, 15"; let result = re.replace_all_with(text, |m| { let num: i32 = m.as_str(text).parse().unwrap(); format!("[{}]", num * 10) }); assert_eq!(result, "Items: [50], [100], [150]"); } #[test] fn test_replace_named_groups() { let re = Regex::new(r"(?\w+)\s+(?\w+)").unwrap(); let result = re.replace("hello world", "${second} ${first}"); assert_eq!(result, "world hello"); } #[test] fn test_replace_named_groups_malformed() { let re = Regex::new(r"(?\w+)").unwrap(); let result = re.replace("hello", "${first"); assert_eq!(result, "${first"); } #[test] fn test_replace_nonexistent_group() { let re = Regex::new(r"(\w+)").unwrap(); let result = re.replace("hello", "$1 $2 $3"); assert_eq!(result, "hello "); } #[test] fn test_replace_high_group_numbers() { let re = Regex::new(r"(\w)(\w)(\w)").unwrap(); let result = re.replace("abc", "$3$2$1$0"); assert_eq!(result, "cbaabc"); } #[test] fn test_replace_large_group_number() { let re = Regex::new(r"(\w+)").unwrap(); let result = re.replace("hello", "$999"); assert_eq!(result, ""); } #[test] fn test_replace_dollar_at_end() { let re = Regex::new(r"\w+").unwrap(); let result = re.replace("hello", "test$"); assert_eq!(result, "test$"); } #[test] fn test_replace_email() { let re = Regex::new(r"(\w+)@(\w+)\.(\w+)").unwrap(); let result = re.replace("Contact: user@example.com", "$1 at $2 dot $3"); assert_eq!(result, "Contact: user at example dot com"); } #[test] fn test_replace_backreferences() { let re = Regex::new(r"(\w+)\s+\1").unwrap(); let result = re.replace("hello hello world", "[$1]"); assert_eq!(result, "[hello] world"); } #[test] fn test_replace_case_insensitive() { let re = Regex::with_flags(r"(\w+)", "i").unwrap(); let result = re.replace("Hello WORLD", "[$1]"); assert_eq!(result, "[Hello] WORLD"); } #[test] fn test_as_str_method() { let re = Regex::new(r"\d+").unwrap(); let text = "Price: $123 and $456"; let m = re.find(text).unwrap(); assert_eq!(m.as_str(text), "123"); } #[test] fn test_replace_empty_match() { let re = Regex::new(r"(?=\d)").unwrap(); // Zero-width lookahead let result = re.replace("a1b2c", "X"); assert_eq!(result, "aX1b2c"); } #[test] fn test_complex_replacement() { let re = Regex::new(r"(\d{1,2})/(\d{1,2})/(\d{4})").unwrap(); let result = re.replace_all("Born on 12/25/1990 and graduated on 5/15/2012", "$3-$1-$2"); assert_eq!(result, "Born on 1990-12-25 and graduated on 2012-5-15"); } regress-0.10.5/tests/syntax_error_tests.rs000064400000000000000000000037111046102023000170540ustar 00000000000000#![allow(clippy::uninlined_format_args)] #[track_caller] fn test_1_error(pattern: &str, expected_err: &str) { let res = regress::Regex::with_flags(pattern, "u"); assert!(res.is_err(), "Pattern should not have parsed: {}", pattern); let err = res.err().unwrap().text; assert!( err.contains(expected_err), "Error text '{}' did not contain '{}' for pattern '{}'", err, expected_err, pattern ); } #[test] fn test_excessive_capture_groups() { let mut captures = String::from("s"); let mut loops = String::from("s"); for _ in 0..65536 { captures.push_str("(x)"); loops.push_str("x{3,5}"); } test_1_error(captures.as_str(), "Capture group count limit exceeded"); test_1_error(loops.as_str(), "Loop count limit exceeded"); } #[test] fn test_syntax_errors() { test_1_error(r"*", "Invalid atom character"); test_1_error(r"x**", "Invalid atom character"); test_1_error(r"?", "Invalid atom character"); test_1_error(r"{3,5}", "Invalid atom character"); test_1_error(r"x{5,3}", "Invalid quantifier"); test_1_error(r"]", "Invalid atom character"); test_1_error(r"[abc", "Unbalanced bracket"); test_1_error(r"(", "Unbalanced parenthesis"); test_1_error(r"(?!", "Unbalanced parenthesis"); test_1_error(r"abc)", "Unbalanced parenthesis"); test_1_error( r"[z-a]", "Range values reversed, start char code is greater than end char code.", ); // In unicode mode this is not allowed. test_1_error(r"[a-\s]", "Invalid character range"); test_1_error("\\", "Incomplete escape"); test_1_error("^*", "Quantifier not allowed here"); test_1_error("${3}", "Quantifier not allowed here"); test_1_error("(?=abc)*", "Quantifier not allowed here"); test_1_error("(?!abc){3,}", "Quantifier not allowed here"); test_1_error(r"\2(a)", "Invalid character escape"); test_1_error("(?q:abc)", "Invalid group modifier"); } regress-0.10.5/tests/tests.rs000064400000000000000000003302671046102023000142460ustar 00000000000000// We like hashes around raw string literals. #![allow(clippy::needless_raw_string_hashes)] // Work around dead code warnings: rust-lang issue #46379 pub mod common; use common::*; fn test_zero_length_matches_tc(tc: TestConfig) { tc.compile(".*?").match_all("a").test_eq(vec!["", ""]); tc.compile(".*?") .match_all("\u{0251}") .test_eq(vec!["", ""]); } #[test] fn test_zero_length_matches() { test_with_configs(test_zero_length_matches_tc) } fn non_matching_captures_tc(tc: TestConfig) { assert_eq!( tc.compile("aa(b)?aa").match1_vec("aaaa"), &[Some("aaaa"), None] ); assert_eq!( tc.compile(r"(\1a)aa").match1_vec("aaa"), &[Some("aaa"), Some("a")] ); } #[test] fn non_matching_captures() { test_with_configs(non_matching_captures_tc) } fn test_captures_tc(tc: TestConfig) { // Zero explicit groups - but group zero is the entire match. let m = tc.compile("derp").find("derp").unwrap(); assert_eq!(m.group(0), Some(0..4)); let g = m.groups(); assert_eq!(g.size_hint(), (1, Some(1))); assert!(g.eq([Some(0..4)])); let ng = m.named_groups(); assert_eq!(ng.size_hint(), (0, Some(0))); assert!(ng.eq([])); // One group. let m = tc.compile("d(er)p").find("derp").unwrap(); assert_eq!(m.group(0), Some(0..4)); assert_eq!(m.group(1), Some(1..3)); let mut g = m.groups(); assert_eq!(g.size_hint(), (2, Some(2))); assert_eq!(g.next(), Some(Some(0..4))); assert_eq!(g.next(), Some(Some(1..3))); assert_eq!(g.next(), None); let ng = m.named_groups(); assert_eq!(ng.size_hint(), (0, Some(0))); assert!(ng.eq([])); // Multiple groups. let m = tc.compile("(d)(er)(p)").find("derp").unwrap(); assert_eq!(m.group(0), Some(0..4)); assert_eq!(m.group(1), Some(0..1)); assert_eq!(m.group(2), Some(1..3)); assert_eq!(m.group(3), Some(3..4)); let g = m.groups(); assert_eq!(g.size_hint(), (4, Some(4))); assert!(g.eq([Some(0..4), Some(0..1), Some(1..3), Some(3..4)])); let ng = m.named_groups(); assert_eq!(ng.size_hint(), (0, Some(0))); assert!(ng.eq([])); // Optional group not matched. let m = tc.compile("d(er)?p").find("dp").unwrap(); assert_eq!(m.group(0), Some(0..2)); assert_eq!(m.group(1), None); let g = m.groups(); assert_eq!(g.size_hint(), (2, Some(2))); assert!(g.eq([Some(0..2), None])); let ng = m.named_groups(); assert_eq!(ng.size_hint(), (0, Some(0))); // Named groups skip groups without names. let m = tc .compile(r"(?d)(?:(er)|(?unmatched))(?p)") .find("derp") .unwrap(); assert_eq!(m.group(0), Some(0..4)); assert_eq!(m.group(1), Some(0..1)); assert_eq!(m.group(2), Some(1..3)); assert_eq!(m.group(3), None); assert_eq!(m.group(4), Some(3..4)); let g = m.groups(); assert!(g.eq([Some(0..4), Some(0..1), Some(1..3), None, Some(3..4)])); let ng = m.named_groups(); assert!(ng.eq([("first", Some(0..1)), ("skip", None), ("third", Some(3..4))])); } #[test] fn test_captures() { test_with_configs(test_captures_tc) } fn test_multiline_tc(tc: TestConfig) { tc.compilef(r"^abc", "").match1f("abc").test_eq("abc"); tc.compile(r"^def").test_fails("abc\ndef"); tc.compilef(r"^def", "m").match1f("abc\ndef").test_eq("def"); tc.compilef(r"^def", "m") .match1f("abc\n\rdef") .test_eq("def"); tc.compile(r"(a*)^(a*)$").test_fails("aa\raaa"); tc.compilef(r"(a*)^(a*)$", "m") .match1f("aa\raaa") .test_eq("aa,,aa"); tc.compilef(r"[ab]$", "").match1f("a\rb").test_eq("b"); tc.compilef(r"[ab]$", "m").match1f("a\rb").test_eq("a"); tc.compilef(r"^\d", "m") .match_all("aaa\n789\r\nccc\r\n345") .test_eq(vec!["7", "3"]); tc.compilef(r"\d$", "m") .match_all("aaa789\n789\r\nccc10\r\n345") .test_eq(vec!["9", "9", "0", "5"]); } #[test] fn test_multiline() { test_with_configs(test_multiline_tc) } fn group_modifiers_tc(tc: TestConfig) { let re = tc.compile(r"(?i:foo)bar"); assert!(re.find("FOObar").is_some()); assert!(re.find("FOOBAR").is_none()); let re = tc.compilef(r"foo(?-i:bar)", "i"); assert!(re.find("FOObar").is_some()); assert!(re.find("FOOBAR").is_none()); let re = tc.compile(r"(?s:.)a"); assert_eq!(re.match1f("\na"), "\na"); let re = tc.compile(r".a"); assert!(re.find("\na").is_none()); let re = tc.compile(r"(?m:^foo)"); assert_eq!(re.match1f("bar\nfoo"), "foo"); let re = tc.compile(r"^foo"); assert!(re.find("bar\nfoo").is_none()); } #[test] fn group_modifiers() { test_with_configs(group_modifiers_tc) } fn test_dotall_tc(tc: TestConfig) { tc.compile(r".").test_fails("\n"); tc.compilef(r".", "s").match1f("\n").test_eq("\n"); tc.compile(r".").test_fails("\r"); tc.compilef(r".", "s").match1f("\r").test_eq("\r"); tc.compile(r".").test_fails("\u{2028}"); tc.compilef(r".", "s") .match1f("\u{2028}") .test_eq("\u{2028}"); tc.compile(r".").test_fails("\u{2029}"); tc.compilef(r".", "s") .match1f("\u{2029}") .test_eq("\u{2029}"); tc.compile("abc.def").test_fails("abc\ndef"); tc.compilef("abc.def", "s") .match1f("abc\ndef") .test_eq("abc\ndef"); tc.compile(".*").match1f("abc\ndef").test_eq("abc"); tc.compilef(".*", "s") .match1f("abc\ndef") .test_eq("abc\ndef"); } #[test] fn test_dotall() { test_with_configs(test_dotall_tc) } fn test_lookbehinds_tc(tc: TestConfig) { tc.compilef(r"(?<=efg)..", "") .match1f("abcdefghijk123456") .test_eq("hi"); tc.compilef(r"(?<=\d{3}).*", "") .match1f("abcdefghijk123456") .test_eq("456"); tc.test_match_succeeds(r"(?<=\d{3}.*)", "", "abcdefghijk123456"); tc.compilef(r"(?>() .join(",") .test_eq("1..2,3..4"); } #[test] fn test_lookbehinds() { test_with_configs(test_lookbehinds_tc); // From 262 test/language/literals/regexp/invalid-range-negative-lookbehind.js test_parse_fails(".(?"); tc.compilef("^(.)\\1$", "i").test_fails("\u{1f}?"); tc.compilef("^(.)\\1$", "i").test_fails(" \u{0}"); tc.compilef("^(.)\\1$", "i").test_fails("!\u{1}"); tc.compilef("^(.)\\1$", "i").test_fails("\"\u{2}"); tc.compilef("^(.)\\1$", "i").test_fails("#\u{3}"); tc.compilef("^(.)\\1$", "i").test_fails("$\u{4}"); tc.compilef("^(.)\\1$", "i").test_fails("%\u{5}"); tc.compilef("^(.)\\1$", "i").test_fails("&\u{6}"); tc.compilef("^(.)\\1$", "i").test_fails("'\u{7}"); tc.compilef("^(.)\\1$", "i").test_fails("(\u{8}"); tc.compilef("^(.)\\1$", "i").test_fails(")\u{9}"); tc.compilef("^(.)\\1$", "i").test_fails("*\n"); tc.compilef("^(.)\\1$", "i").test_fails("+\u{b}"); tc.compilef("^(.)\\1$", "i").test_fails(",\u{c}"); tc.compilef("^(.)\\1$", "i").test_fails("-\r"); tc.compilef("^(.)\\1$", "i").test_fails(".\u{e}"); tc.compilef("^(.)\\1$", "i").test_fails("/\u{f}"); tc.compilef("^(.)\\1$", "i").test_fails("0\u{10}"); tc.compilef("^(.)\\1$", "i").test_fails("1\u{11}"); tc.compilef("^(.)\\1$", "i").test_fails("2\u{12}"); tc.compilef("^(.)\\1$", "i").test_fails("3\u{13}"); tc.compilef("^(.)\\1$", "i").test_fails("4\u{14}"); tc.compilef("^(.)\\1$", "i").test_fails("5\u{15}"); tc.compilef("^(.)\\1$", "i").test_fails("6\u{16}"); tc.compilef("^(.)\\1$", "i").test_fails("7\u{17}"); tc.compilef("^(.)\\1$", "i").test_fails("8\u{18}"); tc.compilef("^(.)\\1$", "i").test_fails("9\u{19}"); tc.compilef("^(.)\\1$", "i").test_fails(":\u{1a}"); tc.compilef("^(.)\\1$", "i").test_fails(";\u{1b}"); tc.compilef("^(.)\\1$", "i").test_fails("<\u{1c}"); tc.compilef("^(.)\\1$", "i").test_fails("=\u{1d}"); tc.compilef("^(.)\\1$", "i").test_fails(">\u{1e}"); tc.compilef("^(.)\\1$", "i").test_fails("?\u{1f}"); tc.compilef("^(.)\\1$", "i").test_fails("@`"); tc.test_match_succeeds("^(.)\\1$", "i", "Aa"); tc.test_match_succeeds("^(.)\\1$", "i", "Bb"); tc.test_match_succeeds("^(.)\\1$", "i", "Cc"); tc.test_match_succeeds("^(.)\\1$", "i", "Dd"); tc.test_match_succeeds("^(.)\\1$", "i", "Ee"); tc.test_match_succeeds("^(.)\\1$", "i", "Ff"); tc.test_match_succeeds("^(.)\\1$", "i", "Gg"); tc.test_match_succeeds("^(.)\\1$", "i", "Hh"); tc.test_match_succeeds("^(.)\\1$", "i", "Ii"); tc.test_match_succeeds("^(.)\\1$", "i", "Jj"); tc.test_match_succeeds("^(.)\\1$", "i", "Kk"); tc.test_match_succeeds("^(.)\\1$", "i", "Ll"); tc.test_match_succeeds("^(.)\\1$", "i", "Mm"); tc.test_match_succeeds("^(.)\\1$", "i", "Nn"); tc.test_match_succeeds("^(.)\\1$", "i", "Oo"); tc.test_match_succeeds("^(.)\\1$", "i", "Pp"); tc.test_match_succeeds("^(.)\\1$", "i", "Qq"); tc.test_match_succeeds("^(.)\\1$", "i", "Rr"); tc.test_match_succeeds("^(.)\\1$", "i", "Ss"); tc.test_match_succeeds("^(.)\\1$", "i", "Tt"); tc.test_match_succeeds("^(.)\\1$", "i", "Uu"); tc.test_match_succeeds("^(.)\\1$", "i", "Vv"); tc.test_match_succeeds("^(.)\\1$", "i", "Ww"); tc.test_match_succeeds("^(.)\\1$", "i", "Xx"); tc.test_match_succeeds("^(.)\\1$", "i", "Yy"); tc.test_match_succeeds("^(.)\\1$", "i", "Zz"); tc.compilef("^(.)\\1$", "i").test_fails("[{"); tc.compilef("^(.)\\1$", "i").test_fails("\\|"); tc.compilef("^(.)\\1$", "i").test_fails("]}"); tc.compilef("^(.)\\1$", "i").test_fails("^~"); tc.compilef("^(.)\\1$", "i").test_fails("_\u{7f}"); tc.compilef("^(.)\\1$", "i").test_fails("`@"); tc.test_match_succeeds("^(.)\\1$", "i", "aA"); tc.test_match_succeeds("^(.)\\1$", "i", "bB"); tc.test_match_succeeds("^(.)\\1$", "i", "cC"); tc.test_match_succeeds("^(.)\\1$", "i", "dD"); tc.test_match_succeeds("^(.)\\1$", "i", "eE"); tc.test_match_succeeds("^(.)\\1$", "i", "fF"); tc.test_match_succeeds("^(.)\\1$", "i", "gG"); tc.test_match_succeeds("^(.)\\1$", "i", "hH"); tc.test_match_succeeds("^(.)\\1$", "i", "iI"); tc.test_match_succeeds("^(.)\\1$", "i", "jJ"); tc.test_match_succeeds("^(.)\\1$", "i", "kK"); tc.test_match_succeeds("^(.)\\1$", "i", "lL"); tc.test_match_succeeds("^(.)\\1$", "i", "mM"); tc.test_match_succeeds("^(.)\\1$", "i", "nN"); tc.test_match_succeeds("^(.)\\1$", "i", "oO"); tc.test_match_succeeds("^(.)\\1$", "i", "pP"); tc.test_match_succeeds("^(.)\\1$", "i", "qQ"); tc.test_match_succeeds("^(.)\\1$", "i", "rR"); tc.test_match_succeeds("^(.)\\1$", "i", "sS"); tc.test_match_succeeds("^(.)\\1$", "i", "tT"); tc.test_match_succeeds("^(.)\\1$", "i", "uU"); tc.test_match_succeeds("^(.)\\1$", "i", "vV"); tc.test_match_succeeds("^(.)\\1$", "i", "wW"); tc.test_match_succeeds("^(.)\\1$", "i", "xX"); tc.test_match_succeeds("^(.)\\1$", "i", "yY"); tc.test_match_succeeds("^(.)\\1$", "i", "zZ"); tc.compilef("^(.)\\1$", "i").test_fails("{["); tc.compilef("^(.)\\1$", "i").test_fails("|\\"); tc.compilef("^(.)\\1$", "i").test_fails("}]"); tc.compilef("^(.)\\1$", "i").test_fails("~^"); tc.compilef("^(.)\\1$", "i").test_fails("\u{7f}_"); tc.compilef("f(o)$\\1", "").test_fails("foo"); tc.compilef("a{111111111111111111111111111111111111111111111}", "").test_fails("b"); tc.compilef("a{999999999999999999999999999999999999999999999}", "").test_fails("b"); tc.compilef("a{1,111111111111111111111111111111111111111111111}", "").test_fails("b"); tc.compilef("a{1,999999999999999999999999999999999999999999999}", "").test_fails("b"); tc.compilef("a{2147483648}", "").test_fails("b"); tc.compilef("a{21474836471}", "").test_fails("b"); tc.compilef("a{1,2147483648}", "").test_fails("b"); tc.compilef("a{1,21474836471}", "").test_fails("b"); tc.compilef("a{2147483648,2147483648}", "").test_fails("b"); tc.compilef("a{21474836471,21474836471}", "").test_fails("b"); tc.compilef("a{2147483647}", "").test_fails("b"); tc.compilef("a{1,2147483647}", "").test_fails("b"); tc.test_match_succeeds("a{1,2147483647}", "", "a"); tc.compilef("a{2147483647,2147483647}", "").test_fails("a"); tc.compilef("f", "").test_fails("b"); tc.compilef("[abc]f", "").test_fails("x"); tc.compilef("[abc]f", "").test_fails("xa"); tc.compilef("[abc]<", "").test_fails("x"); tc.compilef("[abc]<", "").test_fails("xa"); tc.compilef("f", "i").test_fails("b"); tc.compilef("[abc]f", "i").test_fails("x"); tc.compilef("[abc]f", "i").test_fails("xa"); tc.compilef("[abc]<", "i").test_fails("x"); tc.compilef("[abc]<", "i").test_fails("xa"); tc.compilef("f[abc]", "").test_fails("x"); tc.compilef("f[abc]", "").test_fails("xa"); tc.compilef("<[abc]", "").test_fails("x"); tc.compilef("<[abc]", "").test_fails("xa"); tc.compilef("f[abc]", "i").test_fails("x"); tc.compilef("f[abc]", "i").test_fails("xa"); tc.compilef("<[abc]", "i").test_fails("x"); tc.compilef("<[abc]", "i").test_fails("xa"); tc.compilef("x([0-7]%%x|[0-6]%%y)", "").test_fails("x7%%y"); tc.compilef("()x\\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)", "").test_fails("xy7%%%y"); tc.compilef("()x\\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)", "").test_fails("xy%%%y"); tc.compilef("()x\\1y([0-7]%%%x|[0-6]%%%y)", "").test_fails("xy7%%%y"); tc.compilef("()x\\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)", "").test_fails("xy%%%y"); tc.compilef("()x\\1y([0-7]%%%x|[0-6]%%%y)", "").test_fails("xy7%%%y"); tc.compilef("xy([0-7]%%%x|[0-6]%%%y)", "").test_fails("xy7%%%y"); tc.compilef("x([0-7]%%%x|[0-6]%%%y)", "").test_fails("x7%%%y"); tc.test_match_succeeds("[^\\xfe-\\xff]*", "", ""); tc.test_match_succeeds("b\\b", "", "b"); tc.test_match_succeeds("b\\b$", "", "b"); tc.test_match_succeeds("\\bb", "", "b"); tc.test_match_succeeds("^\\bb", "", "b"); tc.compilef(",\\b", "").test_fails(","); tc.compilef(",\\b$", "").test_fails(","); tc.compilef("\\b,", "").test_fails(","); tc.compilef("^\\b,", "").test_fails(","); tc.compilef("b\\B", "").test_fails("b"); tc.compilef("b\\B$", "").test_fails("b"); tc.compilef("\\Bb", "").test_fails("b"); tc.compilef("^\\Bb", "").test_fails("b"); tc.test_match_succeeds(",\\B", "", ","); tc.test_match_succeeds(",\\B$", "", ","); tc.test_match_succeeds("\\B,", "", ","); tc.test_match_succeeds("^\\B,", "", ","); tc.test_match_succeeds("b\\b", "", "b,"); tc.compilef("b\\b", "").test_fails("ba"); tc.compilef("b\\B", "").test_fails("b,"); tc.test_match_succeeds("b\\B", "", "ba"); tc.test_match_succeeds("b\\Bb", "", "bb"); tc.compilef("b\\bb", "").test_fails("bb"); tc.compilef("b\\b[,b]", "").test_fails("bb"); tc.test_match_succeeds("b\\B[,b]", "", "bb"); tc.test_match_succeeds("b\\b[,b]", "", "b,"); tc.compilef("b\\B[,b]", "").test_fails("b,"); tc.compilef("[,b]\\bb", "").test_fails("bb"); tc.test_match_succeeds("[,b]\\Bb", "", "bb"); tc.test_match_succeeds("[,b]\\bb", "", ",b"); tc.compilef("[,b]\\Bb", "").test_fails(",b"); tc.compilef("[,b]\\b[,b]", "").test_fails("bb"); tc.test_match_succeeds("[,b]\\B[,b]", "", "bb"); tc.test_match_succeeds("[,b]\\b[,b]", "", ",b"); tc.compilef("[,b]\\B[,b]", "").test_fails(",b"); tc.test_match_succeeds("[,b]\\b[,b]", "", "b,"); tc.compilef("[,b]\\B[,b]", "").test_fails("b,"); tc.test_match_succeeds("(?:a|bc)g$", "", "ag"); tc.test_match_succeeds("(?:a|bc)g$", "", "bcg"); tc.test_match_succeeds("(?:a|bc)g$", "", "abcg"); tc.test_match_succeeds("(?:a|bc)g$", "", "zimbag"); tc.test_match_succeeds("(?:a|bc)g$", "", "zimbcg"); tc.compilef("(?:a|bc)g$", "").test_fails(""); tc.compilef("(?:a|bc)g$", "").test_fails(""); tc.test_match_succeeds("(?:a|bc)g$", "", "ag"); tc.test_match_succeeds("(?:a|bc)g$", "", "zimbag"); tc.test_match_succeeds("^(?:a|bc)g$", "", "ag"); tc.compilef("^(?:a|bc)g$", "").test_fails("zag"); tc.test_match_succeeds("VeryLongRegExp!{1,1000}$", "", "BahoolaVeryLongRegExp!!!!!!"); tc.compilef("VeryLongRegExp!{1,1000}$", "").test_fails("VeryLongRegExp"); tc.compilef("VeryLongRegExp!{1,1000}$", "").test_fails("!"); tc.test_match_succeeds("(?:a$|bc$)", "", "a"); tc.test_match_succeeds("(?:a$|bc$)", "", "bc"); tc.test_match_succeeds("(?:a$|bc$)", "", "abc"); tc.test_match_succeeds("(?:a$|bc$)", "", "zimzamzumba"); tc.test_match_succeeds("(?:a$|bc$)", "", "zimzamzumbc"); tc.compilef("(?:a$|bc$)", "").test_fails("c"); tc.compilef("(?:a$|bc$)", "").test_fails(""); tc.test_match_succeeds("(?:a|bc$)", "", "a"); tc.test_match_succeeds("(?:a|bc$)", "", "bc"); tc.compilef("(?:a|bc$)", "").test_fails("c"); tc.compilef("(?:a|bc$)", "").test_fails(""); tc.test_match_succeeds(".*abc", "", "abc"); tc.compilef(".*\\d+", "").test_fails("q"); // Skipping Unicode-unsavvy ^{*$ // Skipping Unicode-unsavvy ^}*$ // Skipping Unicode-unsavvy ] // Skipping Unicode-unsavvy ^\c%$ tc.test_match_succeeds("^\\d%$", "", "2%"); // Skipping Unicode-unsavvy ^\e%$ tc.test_match_succeeds("^\\ca$", "", "\u{1}"); tc.test_match_succeeds("^\\cA$", "", "\u{1}"); // Skipping Unicode-unsavvy ^\c9$ // Skipping Unicode-unsavvy ^\c$ // Skipping Unicode-unsavvy ^[\c%]*$ // Skipping Unicode-unsavvy ^[\c:]*$ // Skipping Unicode-unsavvy ^[\c0]*$ // Skipping Unicode-unsavvy ^[\c1]*$ // Skipping Unicode-unsavvy ^[\c2]*$ // Skipping Unicode-unsavvy ^[\c3]*$ // Skipping Unicode-unsavvy ^[\c4]*$ // Skipping Unicode-unsavvy ^[\c5]*$ // Skipping Unicode-unsavvy ^[\c6]*$ // Skipping Unicode-unsavvy ^[\c7]*$ // Skipping Unicode-unsavvy ^[\c8]*$ // Skipping Unicode-unsavvy ^[\c9]*$ // Skipping Unicode-unsavvy ^[\c_]*$ // Skipping Unicode-unsavvy ^[\c11]*$ // Skipping Unicode-unsavvy ^[\8]*$ // Skipping Unicode-unsavvy ^[\7]*$ // Skipping Unicode-unsavvy ^[\11]*$ // Skipping Unicode-unsavvy ^[\111]*$ // Skipping Unicode-unsavvy ^[\222]*$ // Skipping Unicode-unsavvy ^[\333]*$ // Skipping Unicode-unsavvy ^[\444]*$ // Skipping Unicode-unsavvy ^[\d-X]*$ // Skipping Unicode-unsavvy ^[\d-X-Z]*$ // Skipping Unicode-unsavvy ^[\d-X-Z]*$ tc.compilef("\\uDB88|\\uDBEC|aa", "").test_fails(""); } fn named_capture_groups_in_order_tc(tc: TestConfig) { // Named capture groups are returned in their definition order. let re = tc.compile("(?a)(?b)(?c)(?d)?"); let m = re.find("abc").unwrap(); assert_eq!( m.named_groups().collect::>(), [ ("zoo", Some(0..1)), ("apple", Some(1..2)), ("space", Some(2..3)), ("nothing", None), ] ); let re = tc.compile( r#"(abc)\s+(?(?:(?:(?:(?def)(qqq)(?def\s+))+)+)+(?def)(?rrr)?)"#, ); let m = re .find("blah blah abc defqqqdef defqqqdef defqqqdef def blah blah") .unwrap(); assert_eq!( m.named_groups().collect::>(), [ ("big", Some(14..47)), ("zoo", Some(34..37)), ("ack", Some(40..44)), ("hmm", Some(44..47)), ("wut", None), ] ); assert_eq!(m.named_group(""), None); assert_eq!(m.named_group("not_here"), None); assert_eq!(m.named_group("123"), None); assert_eq!(m.named_group("bi"), None); assert_eq!(m.named_group("bigg"), None); assert_eq!(m.named_group("BIG"), None); assert_eq!(m.named_group("big"), Some(14..47)); assert_eq!(m.named_group("zoo"), Some(34..37)); assert_eq!(m.named_group("ack"), Some(40..44)); assert_eq!(m.named_group("hmm"), Some(44..47)); assert_eq!(m.named_group("wut"), None); } #[test] fn named_capture_groups_in_order() { test_with_configs(named_capture_groups_in_order_tc) } #[test] fn run_regexp_named_capture_groups() { test_with_configs(run_regexp_named_capture_groups_tc) } #[rustfmt::skip] fn run_regexp_named_capture_groups_tc(tc: TestConfig) { // From 262 test/built-ins/RegExp/named-groups/lookbehind.js tc.compilef(r#"(?<=(?\w){3})f"#, "").match1f("abcdef").test_eq("f,c"); tc.compilef(r#"(?<=(?\w){4})f"#, "").match1f("abcdef").test_eq("f,b"); tc.compilef(r#"(?<=(?\w)+)f"#, "").match1f("abcdef").test_eq("f,a"); tc.compilef(r#"(?<=(?\w){6})f"#, "").test_fails("abcdef"); tc.compilef(r#"((?<=\w{3}))f"#, "").match1f("abcdef").test_eq("f,"); tc.compilef(r#"(?(?<=\w{3}))f"#, "").match1f("abcdef").test_eq("f,"); tc.compilef(r#"(?\d){3})f"#, "").match1f("abcdef").test_eq("f,"); tc.compilef(r#"(?\D){3})f"#, "").test_fails("abcdef"); tc.compilef(r#"(?\D){3})f|f"#, "").match1f("abcdef").test_eq("f,"); tc.compilef(r#"(?(?a)"#, "").match1f("bab").test_eq("a,a"); tc.compilef(r#"(?a)"#, "").match1f("bab").test_eq("a,a"); tc.compilef(r#"(?<_>a)"#, "").match1f("bab").test_eq("a,a"); tc.compilef(r#"(?<$>a)"#, "").match1f("bab").test_eq("a,a"); tc.compilef(r#".(?<$>a)."#, "").match1f("bab").test_eq("bab,a"); tc.compilef(r#".(?a)(.)"#, "").match1f("bab").test_eq("bab,a,b"); tc.compilef(r#".(?a)(?.)"#, "").match1f("bab").test_eq("bab,a,b"); tc.compilef(r#".(?\w\w)"#, "").match1f("bab").test_eq("bab,ab"); tc.compilef(r#"(?\w\w\w)"#, "").match1f("bab").test_eq("bab,bab"); tc.compilef(r#"(?\w\w)(?\w)"#, "").match1f("bab").test_eq("bab,ba,b"); tc.compilef(r#"(?.)(?.)(?.)\k\k\k"#, "").match1_named_group("abccba", "a").test_eq("a"); tc.compilef(r#"(?.)(?.)(?.)\k\k\k"#, "").match1_named_group("abccba", "b").test_eq("b"); tc.compilef(r#"(?.)(?.)(?.)\k\k\k"#, "").match1_named_group("abccba", "c").test_eq("c"); tc.compilef(r#"(?b).\1"#, "").match1f("bab").test_eq("bab,b"); tc.compilef(r#"(.)(?a)\1\2"#, "").match1f("baba").test_eq("baba,b,a"); tc.compilef(r#"(.)(?a)(?\1)(\2)"#, "").match1f("baba").test_eq("baba,b,a,b,a"); tc.compilef(r#"(?<)a"#, "").match1f(">)a"#, "").match1f(">a").test_eq(">a,>"); // From 262 test/built-ins/RegExp/named-groups/unicode-property-names-invalid.js test_parse_fails(r#"(?<🦊>fox)"#); test_parse_fails(r#"(?<\u{1f98a}>fox)"#); test_parse_fails(r#"(?<\ud83e\udd8a>fox)"#); test_parse_fails(r#"(?<🐕>dog)"#); test_parse_fails(r#"(?<\u{1f415}>dog)"#); test_parse_fails(r#"(?<\ud83d \udc15>dog)"#); test_parse_fails(r#"(?<𝟚the>the)"#); test_parse_fails(r#"(?<\u{1d7da}the>the)"#); test_parse_fails(r#"(?<\ud835\udfdathe>the)"#); // From 262 test/built-ins/RegExp/named-groups/unicode-property-names-valid.js let input = "The quick brown fox jumped over the lazy dog's back".to_string(); tc.compilef(r#"(?fox|dog)"#, "").match1_named_group(&input, "animal").test_eq("fox"); tc.compilef(r#"(?the)"#, "").match1_named_group(&input, "the2").test_eq("the"); tc.compilef(r#"(?<𝑓𝑜𝑥>fox).*(?<𝓓𝓸𝓰>dog)"#, "").match1_named_group(&input, "𝑓𝑜𝑥").test_eq("fox"); tc.compilef(r#"(?<𝑓𝑜𝑥>fox).*(?<𝓓𝓸𝓰>dog)"#, "").match1_named_group(&input, "𝓓𝓸𝓰").test_eq("dog"); tc.compilef(r#"(?<𝑓𝑜𝑥>fox).*(?<𝓓𝓸𝓰>dog)"#, "").match1f(&input).test_eq("fox jumped over the lazy dog,fox,dog"); tc.compilef(r#"(?<狸>fox).*(?<狗>dog)"#, "").match1_named_group(&input, "狸").test_eq("fox"); tc.compilef(r#"(?<狸>fox).*(?<狗>dog)"#, "").match1_named_group(&input, "狗").test_eq("dog"); tc.compilef(r#"(?<狸>fox).*(?<狗>dog)"#, "").match1f(&input).test_eq("fox jumped over the lazy dog,fox,dog"); tc.compilef(r#"(?<𝓑𝓻𝓸𝔀𝓷>brown)"#, "").match1_named_group(&input, "𝓑𝓻𝓸𝔀𝓷").test_eq("brown"); tc.compilef(r#"(?<\u{1d4d1}\u{1d4fb}\u{1d4f8}\u{1d500}\u{1d4f7}>brown)"#, "").match1_named_group(&input, "𝓑𝓻𝓸𝔀𝓷").test_eq("brown"); tc.compilef(r#"(?<\ud835\udcd1\ud835\udcfb\ud835\udcf8\ud835\udd00\ud835\udcf7>brown)"#, "").match1_named_group(&input, "𝓑𝓻𝓸𝔀𝓷").test_eq("brown"); tc.compilef(r#"(?<𝖰𝖡𝖥>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?<𝖰𝖡\u{1d5a5}>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?<𝖰\u{1d5a1}𝖥>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?<𝖰\u{1d5a1}\u{1d5a5}>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?<\u{1d5b0}𝖡𝖥>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?<\u{1d5b0}𝖡\u{1d5a5}>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?<\u{1d5b0}\u{1d5a1}𝖥>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?<\u{1d5b0}\u{1d5a1}\u{1d5a5}>q\w*\W\w*\W\w*)"#, "").match1_named_group(&input, "𝖰𝖡𝖥").test_eq("quick brown fox"); tc.compilef(r#"(?the)"#, "").match1_named_group(&input, "the𝟚").test_eq("the"); tc.compilef(r#"(?the)"#, "").match1_named_group(&input, "the𝟚").test_eq("the"); tc.compilef(r#"(?the)"#, "").match1_named_group(&input, "the𝟚").test_eq("the"); let input = "It is a dog eat dog world.".to_string(); tc.compilef(r#"(?dog)(.*?)(\k)"#, "").match1_named_group(&input, "dog").test_eq("dog"); tc.compilef(r#"(?dog)(.*?)(\k)"#, "").match1f(&input).test_eq("dog eat dog,dog, eat ,dog"); tc.compilef(r#"(?<𝓓𝓸𝓰>dog)(.*?)(\k<𝓓𝓸𝓰>)"#, "").match1_named_group(&input, "𝓓𝓸𝓰").test_eq("dog"); tc.compilef(r#"(?<𝓓𝓸𝓰>dog)(.*?)(\k<𝓓𝓸𝓰>)"#, "").match1f(&input).test_eq("dog eat dog,dog, eat ,dog"); tc.compilef(r#"(?<狗>dog)(.*?)(\k<狗>)"#, "").match1_named_group(&input, "狗").test_eq("dog"); tc.compilef(r#"(?<狗>dog)(.*?)(\k<狗>)"#, "").match1f(&input).test_eq("dog eat dog,dog, eat ,dog"); // From 262 test/built-ins/RegExp/named-groups/unicode-property-names.js tc.compilef(r#"(?<π>a)"#, "").match1_named_group("bab", "π").test_eq("a"); tc.compilef(r#"(?<\u{03C0}>a)"#, "").match1_named_group("bab", "π").test_eq("a"); tc.compilef(r#"(?<$>a)"#, "").match1_named_group("bab", "$").test_eq("a"); tc.compilef(r#"(?<_>a)"#, "").match1_named_group("bab", "_").test_eq("a"); tc.compilef(r#"(?<$𐒤>a)"#, "").match1_named_group("bab", "$𐒤").test_eq("a"); tc.compilef(r#"(?<_\u200C>a)"#, "").match1_named_group("bab", "_\u{200C}").test_eq("a"); tc.compilef(r#"(?<_\u200D>a)"#, "").match1_named_group("bab", "_\u{200D}").test_eq("a"); tc.compilef(r#"(?<ಠ_ಠ>a)"#, "").match1_named_group("bab", "ಠ_ಠ").test_eq("a"); tc.compilef(r#"(?.)"#, "").match1f("a").test_eq("a,a"); tc.compilef(r#"(?<\u0041>.)"#, "").match1f("a").test_eq("a,a"); tc.compilef(r#"(?<\u{0041}>.)"#, "").match1f("a").test_eq("a,a"); tc.compilef(r#"(?.)"#, "").match1f("a").test_eq("a,a"); // From 262 test/built-ins/RegExp/named-groups/unicode-references.js tc.compilef(r#"(?.).\k"#, "").match1f("bab").test_eq("bab,b"); tc.compilef(r#"(?.).\k"#, "").test_fails("baa"); tc.compilef(r#"(?\k\w).."#, "").match1f("bab").test_eq("bab,b"); tc.compilef(r#"(?\k\w).."#, "").match1_named_group("bab", "a").test_eq("b"); tc.compilef(r#"\k(?b)\w\k"#, "").match1f("bab").test_eq("bab,b"); tc.compilef(r#"\k(?b)\w\k"#, "").match1_named_group("bab", "a").test_eq("b"); tc.compilef(r#"(?b)\k(?a)\k"#, "").match1f("bab").test_eq("bab,b,a"); tc.compilef(r#"(?b)\k(?a)\k"#, "").match1_named_group("bab", "a").test_eq("a"); tc.compilef(r#"(?b)\k(?a)\k"#, "").match1_named_group("bab", "b").test_eq("b"); tc.compilef(r#"\k(?b)\w\k"#, "").match1f("bab").test_eq("bab,b"); tc.compilef(r#"(?b)\k(?a)\k"#, "").match1f("bab").test_eq("bab,b,a"); tc.compilef(r#"(?a)(?b)\k"#, "").match1_named_group("aba", "a").test_eq("a"); tc.compilef(r#"(?a)(?b)\k"#, "").match1_named_group("aba", "b").test_eq("b"); // regression test for // https://github.com/ridiculousfish/regress/issues/41 tc.compilef(r#"(?.)"#, "").match1_named_group("xxx", "u").test_eq("x"); tc.compilef(r#"(?.)"#, "").match1_named_group("xxx", "au").test_eq("x"); tc.compilef(r#"(?.)"#, "").match1_named_group("xxx", "aau").test_eq("x"); // Escapes are valid in group names. tc.compilef(r#"(?<\u0041\u0042>c+)"#, "").match1_named_group("aabbccddeeff", "AB").test_eq("cc"); // Make sure that escapes are parsed correctly in the fast capture group parser. // This pattern should fail in unicode mode, because there is a backreference without a capture group. // If the `\]` is not handled correctly in the parser, the following `(.)` may be parsed as a capture group. test_parse_fails_flags(r#"[\](.)]\1"#, "u"); // Empty group names are not allowed. test_parse_fails_flags(r#"(?<>)a"#, "u"); // Duplicate group names are not allowed. test_parse_fails_flags(r#"(?a) (abc) (?a) (?a)"#, "u"); } #[test] fn run_regexp_named_groups_unicode_malformed() { test_with_configs(run_regexp_named_groups_unicode_malformed_tc) } fn run_regexp_named_groups_unicode_malformed_tc(tc: TestConfig) { // From 262 test/annexB/built-ins/RegExp/named-groups/non-unicode-malformed-lookbehind.js tc.compile(r#"\k(?<=>)a"#).test_succeeds(r#"ka"#); tc.compile(r#"(?<=>)\k"#).test_succeeds(r#">k"#); tc.compile(r#"\k(?a"#); tc.compile(r#"(?)\k"#).test_succeeds(r#"k"#); // Negative parse tests in unicode mode. test_parse_fails_flags(r#"\k(?<=>)a"#, "u"); test_parse_fails_flags(r#"(?<=>)\k"#, "u"); test_parse_fails_flags(r#"\k(?)\k"#, "u"); // From 262 test/annexB/built-ins/RegExp/named-groups/non-unicode-malformed.js tc.compile(r#"\k"#).test_succeeds(r#"k"#); tc.compile(r#"\k<4>"#).test_succeeds(r#"k<4>"#); tc.compile(r#"\k\a)"#).test_succeeds(r#"a"#); tc.compile(r#"\k(x)"#).test_succeeds(r#"kx"#); tc.compile(r#"\k\1"#).test_succeeds("k\u{1}"); tc.compile(r#"\1(b)\k"#).test_succeeds(r#"bk"#); // Negative parse tests in unicode mode. test_parse_fails_flags(r#"\k"#, "u"); test_parse_fails_flags(r#"\k<4>"#, "u"); test_parse_fails_flags(r#"\k\a)"#, "u"); test_parse_fails_flags(r#"\k(x)"#, "u"); test_parse_fails_flags(r#"\k\1"#, "u"); test_parse_fails_flags(r#"\1(b)\k"#, "u"); // From 262 test/language/literals/regexp/named-groups/invalid-duplicate-groupspecifier.js test_parse_fails(r#"(?a)(?a)"#); // From 262 test/language/literals/regexp/named-groups/invalid-duplicate-groupspecifier-2.js test_parse_fails(r#"(?a)(?b)(?a)"#); } #[test] fn run_regexp_unicode_escape() { test_with_configs(run_regexp_unicode_escape_tc) } #[rustfmt::skip] fn run_regexp_unicode_escape_tc(tc: TestConfig) { // From 262 test/language/literals/regexp/u-unicode-esc.js tc.compilef(r#"\u{0}"#, "").test_succeeds("\u{0}"); tc.compilef(r#"\u{1}"#, "").test_succeeds("\u{1}"); tc.compilef(r#"\u{1}"#, "").test_fails("u"); tc.compilef(r#"\u{3f}"#, "").test_succeeds("?"); tc.compilef(r#"\u{000000003f}"#, "").test_succeeds("?"); tc.compilef(r#"\u{3F}"#, "").test_succeeds("?"); tc.compilef(r#"\u{10ffff}"#, "").test_succeeds("\u{10ffff}"); } #[test] fn run_regexp_unicode_property_classes() { test_with_configs(run_regexp_unicode_property_classes_tc) } #[rustfmt::skip] fn run_regexp_unicode_property_classes_tc(tc: TestConfig) { // TODO: tests tc.compilef(r#"\p{Script=Buhid}"#, "u").test_succeeds("ᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑ\u{1752}\u{1753}ᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑ\u{1752}\u{1753}"); } #[test] fn property_escapes_invalid() { // From 262 test/built-ins/RegExp/property-escapes/ test_parse_fails_flags(r#"\P{ASCII=F}"#, "u"); test_parse_fails_flags(r#"\p{ASCII=F}"#, "u"); test_parse_fails_flags(r#"\P{ASCII=Invalid}"#, "u"); test_parse_fails_flags(r#"\p{ASCII=Invalid}"#, "u"); test_parse_fails_flags(r#"\P{ASCII=N}"#, "u"); test_parse_fails_flags(r#"\p{ASCII=N}"#, "u"); test_parse_fails_flags(r#"\P{ASCII=No}"#, "u"); test_parse_fails_flags(r#"\p{ASCII=No}"#, "u"); test_parse_fails_flags(r#"\P{ASCII=T}"#, "u"); test_parse_fails_flags(r#"\p{ASCII=T}"#, "u"); test_parse_fails_flags(r#"\P{ASCII=Y}"#, "u"); test_parse_fails_flags(r#"\p{ASCII=Y}"#, "u"); test_parse_fails_flags(r#"\P{ASCII=Yes}"#, "u"); test_parse_fails_flags(r#"\p{ASCII=Yes}"#, "u"); test_parse_fails_flags(r#"[--\p{Hex}]"#, "u"); test_parse_fails_flags(r#"[\uFFFF-\p{Hex}]"#, "u"); test_parse_fails_flags(r#"[\p{Hex}-\uFFFF]"#, "u"); test_parse_fails_flags(r#"[\p{Hex}--]"#, "u"); test_parse_fails_flags(r#"\P{^General_Category=Letter}"#, "u"); test_parse_fails_flags(r#"\p{^General_Category=Letter}"#, "u"); test_parse_fails_flags(r#"[\p{}]"#, "u"); test_parse_fails_flags(r#"[\P{}]"#, "u"); test_parse_fails_flags(r#"\P{InAdlam}"#, "u"); test_parse_fails_flags(r#"\p{InAdlam}"#, "u"); test_parse_fails_flags(r#"\P{InAdlam}"#, "u"); test_parse_fails_flags(r#"\p{InAdlam}"#, "u"); test_parse_fails_flags(r#"\P{InScript=Adlam}"#, "u"); test_parse_fails_flags(r#"\p{InScript=Adlam}"#, "u"); test_parse_fails_flags(r#"[\P{invalid}]"#, "u"); test_parse_fails_flags(r#"[\p{invalid}]"#, "u"); test_parse_fails_flags(r#"\P{IsScript=Adlam}"#, "u"); test_parse_fails_flags(r#"\p{IsScript=Adlam}"#, "u"); test_parse_fails_flags(r#"\P"#, "u"); test_parse_fails_flags(r#"\PL"#, "u"); test_parse_fails_flags(r#"\pL"#, "u"); test_parse_fails_flags(r#"\p"#, "u"); test_parse_fails_flags(r#"\P{=Letter}"#, "u"); test_parse_fails_flags(r#"\p{=Letter}"#, "u"); test_parse_fails_flags(r#"\P{General_Category:Letter}"#, "u"); test_parse_fails_flags(r#"\P{=}"#, "u"); test_parse_fails_flags(r#"\p{=}"#, "u"); test_parse_fails_flags(r#"\p{General_Category:Letter}"#, "u"); test_parse_fails_flags(r#"\P{"#, "u"); test_parse_fails_flags(r#"\p{"#, "u"); test_parse_fails_flags(r#"\P}"#, "u"); test_parse_fails_flags(r#"\p}"#, "u"); test_parse_fails_flags(r#"\P{ General_Category=Uppercase_Letter }"#, "u"); test_parse_fails_flags(r#"\p{ General_Category=Uppercase_Letter }"#, "u"); test_parse_fails_flags(r#"\P{ Lowercase }"#, "u"); test_parse_fails_flags(r#"\p{ Lowercase }"#, "u"); test_parse_fails_flags(r#"\P{ANY}"#, "u"); test_parse_fails_flags(r#"\p{ANY}"#, "u"); test_parse_fails_flags(r#"\P{ASSIGNED}"#, "u"); test_parse_fails_flags(r#"\p{ASSIGNED}"#, "u"); test_parse_fails_flags(r#"\P{Ascii}"#, "u"); test_parse_fails_flags(r#"\p{Ascii}"#, "u"); test_parse_fails_flags(r#"\P{General_Category = Uppercase_Letter}"#, "u"); test_parse_fails_flags(r#"\p{General_Category = Uppercase_Letter}"#, "u"); test_parse_fails_flags(r#"\P{_-_lOwEr_C-A_S-E_-_}"#, "u"); test_parse_fails_flags(r#"\p{_-_lOwEr_C-A_S-E_-_}"#, "u"); test_parse_fails_flags(r#"\P{any}"#, "u"); test_parse_fails_flags(r#"\p{any}"#, "u"); test_parse_fails_flags(r#"\P{ascii}"#, "u"); test_parse_fails_flags(r#"\p{ascii}"#, "u"); test_parse_fails_flags(r#"\P{assigned}"#, "u"); test_parse_fails_flags(r#"\p{assigned}"#, "u"); test_parse_fails_flags(r#"\P{gC=uppercase_letter}"#, "u"); test_parse_fails_flags(r#"\p{gC=uppercase_letter}"#, "u"); test_parse_fails_flags(r#"\P{gc=uppercaseletter}"#, "u"); test_parse_fails_flags(r#"\p{gc=uppercaseletter}"#, "u"); test_parse_fails_flags(r#"\P{lowercase}"#, "u"); test_parse_fails_flags(r#"\p{lowercase}"#, "u"); test_parse_fails_flags(r#"\P{lowercase}"#, "u"); test_parse_fails_flags(r#"\p{lowercase}"#, "u"); test_parse_fails_flags(r#"\P{General_Category=}"#, "u"); test_parse_fails_flags(r#"\p{General_Category=}"#, "u"); test_parse_fails_flags(r#"\P{General_Category}"#, "u"); test_parse_fails_flags( r#"\p{General_Category}","u"); test_parse_fails_flags(r#"\P{Script_Extensions=}","u"); test_parse_fails_flags(r#"\p{Script_Extensions=}","u"); test_parse_fails_flags(r#"\P{Script_Extensions}","u"); test_parse_fails_flags(r#"\p{Script_Extensions}","u"); test_parse_fails_flags(r#"\P{Script=}","u"); test_parse_fails_flags(r#"\p{Script=}","u"); test_parse_fails_flags(r#"\P{Script}","u"); test_parse_fails_flags(r#"\p{Script}","u"); test_parse_fails_flags(r#"\P{UnknownBinaryProperty}","u"); test_parse_fails_flags(r#"\p{UnknownBinaryProperty}","u"); test_parse_fails_flags(r#"\P{Line_Breakz=WAT}","u"); test_parse_fails_flags(r#"\p{Line_Breakz=WAT}","u"); test_parse_fails_flags(r#"\P{Line_Breakz=Alphabetic}","u"); test_parse_fails_flags(r#"\p{Line_Breakz=Alphabetic}","u"); test_parse_fails_flags(r#"\\P{General_Category=WAT}"#, "u", ); test_parse_fails_flags(r#"\\p{General_Category=WAT}"#, "u"); test_parse_fails_flags(r#"\\P{Script_Extensions=H_e_h}"#, "u"); test_parse_fails_flags(r#"\\p{Script_Extensions=H_e_h}"#, "u"); test_parse_fails_flags(r#"\\P{Script=FooBarBazInvalid}"#, "u"); test_parse_fails_flags(r#"\\p{Script=FooBarBazInvalid}"#, "u"); test_parse_fails_flags(r#"\P{Composition_Exclusion}"#, "u"); test_parse_fails_flags(r#"\p{Composition_Exclusion}"#, "u"); test_parse_fails_flags(r#"\P{Expands_On_NFC}"#, "u"); test_parse_fails_flags(r#"\p{Expands_On_NFC}"#, "u"); test_parse_fails_flags(r#"\P{Expands_On_NFD}"#, "u"); test_parse_fails_flags(r#"\p{Expands_On_NFD}"#, "u"); test_parse_fails_flags(r#"\P{Expands_On_NFKC}"#, "u"); test_parse_fails_flags(r#"\p{Expands_On_NFKC}"#, "u"); test_parse_fails_flags(r#"\P{Expands_On_NFKD}"#, "u"); test_parse_fails_flags(r#"\p{Expands_On_NFKD}"#, "u"); test_parse_fails_flags(r#"\P{FC_NFKC_Closure}"#, "u"); test_parse_fails_flags(r#"\p{FC_NFKC_Closure}"#, "u"); test_parse_fails_flags(r#"\P{Full_Composition_Exclusion}"#, "u"); test_parse_fails_flags(r#"\p{Full_Composition_Exclusion}"#, "u"); test_parse_fails_flags(r#"\P{Grapheme_Link}"#, "u"); test_parse_fails_flags(r#"\p{Grapheme_Link}"#, "u"); test_parse_fails_flags(r#"\P{Hyphen}"#, "u"); test_parse_fails_flags(r#"\p{Hyphen}"#, "u"); test_parse_fails_flags(r#"\P{Other_Alphabetic}"#, "u"); test_parse_fails_flags(r#"\p{Other_Alphabetic}"#, "u"); test_parse_fails_flags(r#"\P{Other_Default_Ignorable_Code_Point}"#, "u"); test_parse_fails_flags(r#"\p{Other_Default_Ignorable_Code_Point}"#, "u"); test_parse_fails_flags(r#"\P{Other_Grapheme_Extend}"#, "u"); test_parse_fails_flags(r#"\p{Other_Grapheme_Extend}"#, "u"); test_parse_fails_flags(r#"\P{Other_ID_Continue}"#, "u"); test_parse_fails_flags(r#"\p{Other_ID_Continue}"#, "u"); test_parse_fails_flags(r#"\P{Other_ID_Start}"#, "u"); test_parse_fails_flags(r#"\p{Other_ID_Start}"#, "u"); test_parse_fails_flags(r#"\P{Other_Lowercase}"#, "u"); test_parse_fails_flags(r#"\p{Other_Lowercase}"#, "u"); test_parse_fails_flags(r#"\P{Other_Math}"#, "u"); test_parse_fails_flags(r#"\p{Other_Math}"#, "u"); test_parse_fails_flags(r#"\P{Other_Uppercase}"#, "u"); test_parse_fails_flags(r#"\p{Other_Uppercase}"#, "u"); test_parse_fails_flags(r#"\P{Prepended_Concatenation_Mark}"#, "u"); test_parse_fails_flags(r#"\p{Prepended_Concatenation_Mark}"#, "u"); test_parse_fails_flags(r#"\P{Block=Adlam}"#, "u"); test_parse_fails_flags(r#"\p{Block=Adlam}"#, "u"); test_parse_fails_flags(r#"\P{FC_NFKC_Closure}"#, "u"); test_parse_fails_flags(r#"\p{FC_NFKC_Closure}"#, "u"); test_parse_fails_flags(r#"\P{Line_Break=Alphabetic}"#, "u"); test_parse_fails_flags(r#"\P{Line_Break=Alphabetic}"#, "u"); test_parse_fails_flags(r#"\p{Line_Break=Alphabetic}"#, "u"); test_parse_fails_flags(r#"\p{Line_Break}"#, "u"); } #[test] fn unicode_escape_property_binary_ascii() { test_with_configs(unicode_escape_property_binary_ascii_tc) } fn unicode_escape_property_binary_ascii_tc(tc: TestConfig) { const CODE_POINTS: [&str; 7] = [ "\u{0}", "\u{A}", "\u{17}", "\u{2A}", "\u{3C}", "\u{63}", "\u{7F}", ]; const REGEXES: [&str; 1] = ["^\\p{ASCII}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_any() { test_with_configs(unicode_escape_property_binary_any_tc) } fn unicode_escape_property_binary_any_tc(tc: TestConfig) { const CODE_POINTS: [&str; 7] = [ "\u{0}", "\u{F}", "\u{FF}", "\u{FFF}", "\u{FFFF}", "\u{FFFFF}", "\u{10FFFF}", ]; const REGEXES: [&str; 1] = ["^\\p{Any}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_assigned() { test_with_configs(unicode_escape_property_binary_assigned_tc) } fn unicode_escape_property_binary_assigned_tc(tc: TestConfig) { const CODE_POINTS: [&str; 6] = [ "\u{377}", "\u{c69}", "\u{2d96}", "\u{11a47}", "\u{1d51c}", "\u{10fffd}", ]; const REGEXES: [&str; 1] = ["^\\p{Assigned}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_id_start() { test_with_configs(unicode_escape_id_start_tc) } fn unicode_escape_id_start_tc(tc: TestConfig) { const CODE_POINTS: [&str; 5] = ["A", "ꬦ", "ꫪ", "ꩂ", "ᮠ"]; const REGEXES: [&str; 1] = [ // `/\p{ID_Start}/u` r"(?:[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])", ]; for regex in REGEXES { let regex = tc.compile(regex); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_id_continue() { test_with_configs(unicode_escape_id_continue_tc) } fn unicode_escape_id_continue_tc(tc: TestConfig) { const CODE_POINTS: [&str; 5] = ["9", "꯵", "᧖", "႗", "႙"]; const REGEXES: [&str; 1] = [ // `/\p{ID_Continue}/u` r"(?:[0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u08D3-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF\u1AC0\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])", ]; for regex in REGEXES { let regex = tc.compile(regex); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn test_valid_character_sets_in_annex_b() { test_with_configs(test_valid_character_sets_in_annex_b_tc) } fn test_valid_character_sets_in_annex_b_tc(tc: TestConfig) { // From: https://github.com/boa-dev/boa/issues/2794 let regexp = r"[a-\s]"; tc.test_match_succeeds(regexp, "", "a"); tc.test_match_succeeds(regexp, "", "-"); tc.test_match_succeeds(regexp, "", " "); tc.test_match_fails(regexp, "", "s"); tc.test_match_fails(regexp, "", "$"); let regexp = r"[\d-z]"; tc.test_match_succeeds(regexp, "", "z"); tc.test_match_succeeds(regexp, "", "1"); tc.test_match_succeeds(regexp, "", "7"); tc.test_match_succeeds(regexp, "", "9"); tc.test_match_fails(regexp, "", "a"); tc.test_match_fails(regexp, "", "f"); tc.test_match_fails(regexp, "", " "); } #[test] fn test_escapes_folding() { test_with_configs(test_escapes_folding_tc) } fn test_escapes_folding_tc(tc: TestConfig) { // Regression test for failing to fold characters which come from escapes. tc.test_match_fails(r"\u{41}", "", "a"); tc.test_match_succeeds(r"\u{41}", "", "A"); tc.test_match_fails(r"\u{61}", "", "A"); tc.test_match_succeeds(r"\u{61}", "", "a"); tc.test_match_succeeds(r"\u{41}", "i", "a"); tc.test_match_succeeds(r"\u{41}", "i", "A"); tc.test_match_succeeds(r"\u{61}", "i", "a"); tc.test_match_succeeds(r"\u{61}", "i", "A"); } #[test] fn test_high_folds() { test_with_configs(test_high_folds_tc) } fn test_high_folds_tc(tc: TestConfig) { // Regression test for bogus folding. // We incorrectly folded certain characters in delta blocks: // we folded U+100 to U+101 (correctly) but then U+101 to U+102 (wrong). tc.test_match_succeeds(r"\u{100}", "", "\u{100}"); tc.test_match_succeeds(r"\u{100}", "i", "\u{100}"); tc.test_match_fails(r"\u{100}", "", "\u{101}"); tc.test_match_succeeds(r"\u{100}", "i", "\u{101}"); tc.test_match_succeeds(r"\u{101}", "", "\u{101}"); tc.test_match_succeeds(r"\u{101}", "i", "\u{101}"); tc.test_match_fails(r"\u{101}", "", "\u{102}"); tc.test_match_fails(r"\u{101}", "i", "\u{102}"); // Exercise a "mod 4 range": // U+1B8 folds to U+1B9 // U+1BC folds to U+1BD // Codepoints between fold to themselves. tc.test_match_succeeds(r"\u{1B8}", "", "\u{1B8}"); tc.test_match_succeeds(r"\u{1B8}", "i", "\u{1B8}"); tc.test_match_fails(r"\u{1B8}", "", "\u{1B9}"); tc.test_match_succeeds(r"\u{1B8}", "i", "\u{1B9}"); tc.test_match_succeeds(r"\u{1B9}", "", "\u{1B9}"); tc.test_match_succeeds(r"\u{1B9}", "i", "\u{1B9}"); tc.test_match_fails(r"\u{1B9}", "", "\u{1BA}"); tc.test_match_fails(r"\u{1B9}", "i", "\u{1BA}"); tc.test_match_succeeds(r"\u{1BC}", "", "\u{1BC}"); tc.test_match_succeeds(r"\u{1BC}", "i", "\u{1BC}"); tc.test_match_fails(r"\u{1BC}", "", "\u{1BD}"); tc.test_match_succeeds(r"\u{1BC}", "i", "\u{1BD}"); tc.test_match_succeeds(r"\u{1BD}", "", "\u{1BD}"); tc.test_match_succeeds(r"\u{1BD}", "i", "\u{1BD}"); tc.test_match_fails(r"\u{1BD}", "", "\u{1BE}"); tc.test_match_fails(r"\u{1BD}", "i", "\u{1BE}"); } #[test] fn test_invalid_quantifier_loop() { test_with_configs(test_invalid_quantifier_loop_tc) } fn test_invalid_quantifier_loop_tc(tc: TestConfig) { tc.test_match_fails(r#"\c*"#, "", "\n"); } #[test] fn test_empty_brackets() { // Regression test for issue 99. test_with_configs(|tc: TestConfig| { tc.test_match_succeeds(r#"[x]*a"#, "", "a"); tc.test_match_succeeds(r#"[]*a"#, "", "a"); tc.test_match_succeeds(r#"[^\s\S]*a"#, "", "a"); tc.test_match_fails(r#"[x]*a"#, "", "b"); tc.test_match_fails(r#"[]*a"#, "", "b"); tc.test_match_fails(r#"[^\s\S]a"#, "", "a"); }) } #[test] fn test_keeps_capture_groups_for_impossible_matches() { // Regression test for the following issue: // branches which can never match a string but contain a capture group // were being incorrectly removed, leading to capture group misnumbering. test_with_configs(|tc: TestConfig| { tc.test_match_succeeds(r#"(?:[](fail))?(capture)"#, "", "capture"); }) } #[test] fn test_just_fails() { test_with_configs(|tc: TestConfig| { // Test cases where some part of the regex is guaranteed to fail. tc.test_match_fails(r#"abc[]def"#, "", "abcdef"); tc.test_match_fails(r#"abc[^\s\S]def"#, "", "abcdef"); tc.test_match_succeeds(r#"(:?fail[])|x"#, "", "x"); tc.test_match_succeeds(r#"(fail[])|x"#, "", "x"); tc.test_match_succeeds(r#"(fail[^\s\S])|x"#, "", "x"); }) } #[test] fn test_unicode_folding() { test_with_configs_no_ascii(test_unicode_folding_tc) } /// 262 test/language/literals/regexp/u-case-mapping.js fn test_unicode_folding_tc(tc: TestConfig) { tc.test_match_fails(r"\u{212A}", "i", "k"); tc.test_match_fails(r"\u{212A}", "i", "K"); tc.test_match_fails(r"\u{212A}", "u", "k"); tc.test_match_fails(r"\u{212A}", "u", "K"); tc.test_match_succeeds(r"\u{212A}", "iu", "k"); tc.test_match_succeeds(r"\u{212A}", "iu", "K"); } #[test] fn test_class_invalid_control_character() { test_with_configs(test_class_invalid_control_character_tc) } fn test_class_invalid_control_character_tc(tc: TestConfig) { tc.test_match_succeeds("[\\c\u{0}]", "", "\\"); tc.test_match_succeeds("[\\c\u{0}]", "", "c"); tc.test_match_succeeds("[\\c\u{0}]", "", "\u{0}"); } #[test] fn test_quantifiable_assertion_not_followed_by() { test_with_configs(test_quantifiable_assertion_not_followed_by_tc) } /// 262 test/annexB/language/literals/regexp/quantifiable-assertion-not-followed-by.js fn test_quantifiable_assertion_not_followed_by_tc(tc: TestConfig) { tc.compile(r#"[a-e](?!Z)*"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("a"); tc.compile(r#"[a-e](?!Z)+"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); tc.compile(r#"[a-e](?!Z)?"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("a"); tc.compile(r#"[a-e](?!Z){2}"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); tc.compile(r#"[a-e](?!Z){2,}"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); tc.compile(r#"[a-e](?!Z){2,3}"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); tc.compile(r#"[a-e](?!Z)*?"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("a"); tc.compile(r#"[a-e](?!Z)+?"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); tc.compile(r#"[a-e](?!Z)??"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("a"); tc.compile(r#"[a-e](?!Z){2}?"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); tc.compile(r#"[a-e](?!Z){2,}?"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); tc.compile(r#"[a-e](?!Z){2,3}?"#) .match1f(r#"aZZZZ bZZZ cZZ dZ e"#) .test_eq("e"); } #[test] fn test_quantifiable_assertion_followed_by() { test_with_configs(test_quantifiable_assertion_followed_by_tc) } /// 262 test/annexB/language/literals/regexp/quantifiable-assertion-followed-by.js fn test_quantifiable_assertion_followed_by_tc(tc: TestConfig) { tc.compile(r#".(?=Z)*"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("a"); tc.compile(r#".(?=Z)+"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); tc.compile(r#".(?=Z)?"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("a"); tc.compile(r#".(?=Z){2}"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); tc.compile(r#".(?=Z){2,}"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); tc.compile(r#".(?=Z){2,3}"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); tc.compile(r#".(?=Z)*?"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("a"); tc.compile(r#".(?=Z)+?"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); tc.compile(r#".(?=Z)??"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("a"); tc.compile(r#".(?=Z){2}?"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); tc.compile(r#".(?=Z){2,}?"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); tc.compile(r#".(?=Z){2,3}?"#) .match1f(r#"a bZ cZZ dZZZ eZZZZ"#) .test_eq("b"); } #[cfg(feature = "utf16")] mod utf16_tests { use super::*; #[test] fn test_utf16_regression_100() { test_with_configs(test_utf16_regression_100_tc) } fn test_utf16_regression_100_tc(tc: TestConfig) { // Ensure the leading bytes of UTF-16 characters don't match against brackets. let input = "赔"; // U+8D54 let re = tc.compile(r"[A-Z]"); // 0x41 - 0x5A let matched = re.find_utf16(input); assert!(matched.is_none()); let matched = re.find_ucs2(input); assert!(matched.is_none()); } #[test] fn test_utf16_byte_sequences() { test_with_configs(test_utf16_byte_sequences_tc) } fn test_utf16_byte_sequences_tc(tc: TestConfig) { // Regress emits byte sequences for e.g. 'abc'. // Ensure these are properly decoded in UTF-16/UCS2. for flags in ["", "i", "u", "iu"] { let re = tc.compilef(r"abc", flags); let input = "abc"; let matched = re.find_utf16(input); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 0..3); let matched = re.find_ucs2(input); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 0..3); let input = "xxxabczzz"; let matched = re.find_utf16(input); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 3..6); let matched = re.find_ucs2(input); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 3..6); } } #[test] fn test_utf16_regression_101() { test_with_configs(test_utf16_regression_101_tc) } fn test_utf16_regression_101_tc(tc: TestConfig) { for flags in ["", "i", "u", "iu"] { let re = tc.compilef(r"foo", flags); let matched = re.find_ucs2("football"); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 0..3); } } #[test] fn test_ucs2_surrogates() { // Test that we can match against surrogates in UCS-2 mode. // TODO: we improperly match this in UTF-16 mode, because our API is // kind of bad. We ought to infer UTF-16 vs UCS2 from the "u" flag, // matching the JS spec. let re = regress::Regex::new(r"[\uD800-\uDBFF]").unwrap(); // High surrogate. let matched = re.find_from_ucs2(&[0xD800], 0).next(); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 0..1); let input = to_utf16("😀"); let matched = re.find_from_ucs2(&input, 0).next(); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 0..1); // Low surrogate. let re = regress::Regex::new(r"[\uDC00-\uDFFF]").unwrap(); let matched = re.find_from_ucs2(&[1, 2, 3, 0xDC00], 0).next(); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 3..4); let input = to_utf16("😀"); let matched = re.find_from_ucs2(&input, 0).next(); assert!(matched.is_some()); assert_eq!(matched.unwrap().range, 1..2); } } #[test] fn test_range_from_utf16() { use std::char::decode_utf16; let weird_utf8 = "a🌍b\u{1F600}q"; // 'a', '🌍', 'b', '😀', 'q' let utf16: Vec = to_utf16(weird_utf8); assert_eq!(utf16, weird_utf8.encode_utf16().collect::>()); // Define all possible ranges in UTF-16 for start in 0..utf16.len() { for end in start..=utf16.len() { let utf16_range = start..end; // The prefix and body must not split surrogate pairs, else we cannot convert the range. if decode_utf16(utf16[0..utf16_range.end].iter().copied()).any(|r| r.is_err()) { continue; } if decode_utf16(utf16[utf16_range.clone()].iter().copied()).any(|r| r.is_err()) { continue; } let utf16_to_utf8: String = decode_utf16(utf16[utf16_range.clone()].iter().copied()) .map(|r| r.unwrap()) .collect(); let utf8_range = range_from_utf16(&utf16, utf16_range); assert_eq!(&weird_utf8[utf8_range], utf16_to_utf8); } } } #[test] fn test_anchored_optimization() { test_with_configs(test_anchored_optimization_tc) } fn test_anchored_optimization_tc(tc: TestConfig) { // Test basic anchored matching with ^ tc.compile(r"^hello") .match1f("hello world") .test_eq("hello"); tc.compile(r"^hello").test_fails(" hello world"); // Should not match when not at start // Test anchored regex with whitespace tc.compile(r"^hello\s+world") .match1f("hello world") .test_eq("hello world"); tc.compile(r"^hello\s+world").test_fails(" hello world"); // Should not match when not at start // Test anchored regex with capture groups tc.compile(r"^(\w+)=(\d+)") .match1f("key=123 other=456") .test_eq("key=123,key,123"); tc.compile(r"^(\w+)=(\d+)").test_fails(" key=123"); // Should not match when not at start // Test anchored alternation tc.compile(r"^(abc|def)").match1f("abc").test_eq("abc,abc"); tc.compile(r"^(abc|def)").match1f("def").test_eq("def,def"); tc.compile(r"^(abc|def)").test_fails(" abc"); // Test anchored regex with multiline flag tc.compilef(r"^hello", "m") .match1f("world\nhello") .test_eq("hello"); // Test that non-anchored regexes still work normally tc.compile(r"abc").match1f("xabc").test_eq("abc"); tc.compile(r"abc").match1f("abcx").test_eq("abc"); } #[test] fn test_non_greedy_quantifiers() { test_with_configs(test_non_greedy_quantifiers_tc) } fn test_non_greedy_quantifiers_tc(tc: TestConfig) { // Test that non-greedy quantifiers match minimally tc.compile(r"a.*?b") .match1f("aXXXXbYYYYb") .test_eq("aXXXXb"); tc.compile(r"a.+?b") .match1f("aXXXXbYYYYb") .test_eq("aXXXXb"); // Test difference between greedy and non-greedy tc.compile(r"a.*b") .match1f("aXXXXbYYYYb") .test_eq("aXXXXbYYYYb"); tc.compile(r"a.*?b") .match1f("aXXXXbYYYYb") .test_eq("aXXXXb"); // Test non-greedy with capture groups tc.compile(r"a(.*?)b") .match1f("aXXXXbYYYYb") .test_eq("aXXXXb,XXXX"); tc.compile(r"a(.*)b") .match1f("aXXXXbYYYYb") .test_eq("aXXXXbYYYYb,XXXXbYYYY"); // Test non-greedy quantifier at end of string tc.compile(r"a.*?$").match1f("aXXXX").test_eq("aXXXX"); // Test multiple non-greedy quantifiers tc.compile(r"a.*?b.*?c").match1f("aXbYcZ").test_eq("aXbYc"); // Test non-greedy with alternation tc.compile(r"(a|b)*?c").match1f("ababc").test_eq("ababc,b"); // Test zero-width non-greedy match tc.compile(r"a.*?a").match1f("aa").test_eq("aa"); } #[test] fn test_empty_alternation_in_capture() { test_with_configs(test_empty_alternation_in_capture_tc) } fn test_empty_alternation_in_capture_tc(tc: TestConfig) { // Regression tests for empty alternations in capture groups. tc.compile("(z|)*?x").match1f("z0x").test_eq("x,"); } regress-0.10.5/tests/unicode_property_escapes.rs000064400000000000000000024444061046102023000202040ustar 00000000000000// DO NOT EDIT! This file is autogenerated from gen-unicode. use common::*; #[test] fn unicode_escape_property_script_adlam() { test_with_configs(unicode_escape_property_script_adlam_tc) } fn unicode_escape_property_script_adlam_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [125184..=125259, 125264..=125273, 125278..=125279]; const REGEXES: [&str; 4] = [ "^\\p{Script=Adlam}+$", "^\\p{sc=Adlam}+$", "^\\p{Script=Adlm}+$", "^\\p{sc=Adlm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_caucasian_albanian() { test_with_configs(unicode_escape_property_script_caucasian_albanian_tc) } fn unicode_escape_property_script_caucasian_albanian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [66864..=66915, 66927..=66927]; const REGEXES: [&str; 4] = [ "^\\p{Script=Caucasian_Albanian}+$", "^\\p{sc=Caucasian_Albanian}+$", "^\\p{Script=Aghb}+$", "^\\p{sc=Aghb}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_ahom() { test_with_configs(unicode_escape_property_script_ahom_tc) } fn unicode_escape_property_script_ahom_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [71424..=71450, 71453..=71467, 71472..=71494]; const REGEXES: [&str; 2] = ["^\\p{Script=Ahom}+$", "^\\p{sc=Ahom}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_arabic() { test_with_configs(unicode_escape_property_script_arabic_tc) } fn unicode_escape_property_script_arabic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 58] = [ 1536..=1540, 1542..=1547, 1549..=1562, 1564..=1566, 1568..=1599, 1601..=1610, 1622..=1647, 1649..=1756, 1758..=1791, 1872..=1919, 2160..=2190, 2192..=2193, 2200..=2273, 2275..=2303, 64336..=64450, 64467..=64829, 64832..=64911, 64914..=64967, 64975..=64975, 65008..=65023, 65136..=65140, 65142..=65276, 69216..=69246, 69373..=69375, 126464..=126467, 126469..=126495, 126497..=126498, 126500..=126500, 126503..=126503, 126505..=126514, 126516..=126519, 126521..=126521, 126523..=126523, 126530..=126530, 126535..=126535, 126537..=126537, 126539..=126539, 126541..=126543, 126545..=126546, 126548..=126548, 126551..=126551, 126553..=126553, 126555..=126555, 126557..=126557, 126559..=126559, 126561..=126562, 126564..=126564, 126567..=126570, 126572..=126578, 126580..=126583, 126585..=126588, 126590..=126590, 126592..=126601, 126603..=126619, 126625..=126627, 126629..=126633, 126635..=126651, 126704..=126705, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Arabic}+$", "^\\p{sc=Arabic}+$", "^\\p{Script=Arab}+$", "^\\p{sc=Arab}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_imperial_aramaic() { test_with_configs(unicode_escape_property_script_imperial_aramaic_tc) } fn unicode_escape_property_script_imperial_aramaic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [67648..=67669, 67671..=67679]; const REGEXES: [&str; 4] = [ "^\\p{Script=Imperial_Aramaic}+$", "^\\p{sc=Imperial_Aramaic}+$", "^\\p{Script=Armi}+$", "^\\p{sc=Armi}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_armenian() { test_with_configs(unicode_escape_property_script_armenian_tc) } fn unicode_escape_property_script_armenian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [1329..=1366, 1369..=1418, 1421..=1423, 64275..=64279]; const REGEXES: [&str; 4] = [ "^\\p{Script=Armenian}+$", "^\\p{sc=Armenian}+$", "^\\p{Script=Armn}+$", "^\\p{sc=Armn}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_avestan() { test_with_configs(unicode_escape_property_script_avestan_tc) } fn unicode_escape_property_script_avestan_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [68352..=68405, 68409..=68415]; const REGEXES: [&str; 4] = [ "^\\p{Script=Avestan}+$", "^\\p{sc=Avestan}+$", "^\\p{Script=Avst}+$", "^\\p{sc=Avst}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_balinese() { test_with_configs(unicode_escape_property_script_balinese_tc) } fn unicode_escape_property_script_balinese_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [6912..=6988, 6992..=7038]; const REGEXES: [&str; 4] = [ "^\\p{Script=Balinese}+$", "^\\p{sc=Balinese}+$", "^\\p{Script=Bali}+$", "^\\p{sc=Bali}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_bamum() { test_with_configs(unicode_escape_property_script_bamum_tc) } fn unicode_escape_property_script_bamum_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [42656..=42743, 92160..=92728]; const REGEXES: [&str; 4] = [ "^\\p{Script=Bamum}+$", "^\\p{sc=Bamum}+$", "^\\p{Script=Bamu}+$", "^\\p{sc=Bamu}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_bassa_vah() { test_with_configs(unicode_escape_property_script_bassa_vah_tc) } fn unicode_escape_property_script_bassa_vah_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [92880..=92909, 92912..=92917]; const REGEXES: [&str; 4] = [ "^\\p{Script=Bassa_Vah}+$", "^\\p{sc=Bassa_Vah}+$", "^\\p{Script=Bass}+$", "^\\p{sc=Bass}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_batak() { test_with_configs(unicode_escape_property_script_batak_tc) } fn unicode_escape_property_script_batak_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [7104..=7155, 7164..=7167]; const REGEXES: [&str; 4] = [ "^\\p{Script=Batak}+$", "^\\p{sc=Batak}+$", "^\\p{Script=Batk}+$", "^\\p{sc=Batk}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_bengali() { test_with_configs(unicode_escape_property_script_bengali_tc) } fn unicode_escape_property_script_bengali_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 14] = [ 2432..=2435, 2437..=2444, 2447..=2448, 2451..=2472, 2474..=2480, 2482..=2482, 2486..=2489, 2492..=2500, 2503..=2504, 2507..=2510, 2519..=2519, 2524..=2525, 2527..=2531, 2534..=2558, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Bengali}+$", "^\\p{sc=Bengali}+$", "^\\p{Script=Beng}+$", "^\\p{sc=Beng}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_bhaiksuki() { test_with_configs(unicode_escape_property_script_bhaiksuki_tc) } fn unicode_escape_property_script_bhaiksuki_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [72704..=72712, 72714..=72758, 72760..=72773, 72784..=72812]; const REGEXES: [&str; 4] = [ "^\\p{Script=Bhaiksuki}+$", "^\\p{sc=Bhaiksuki}+$", "^\\p{Script=Bhks}+$", "^\\p{sc=Bhks}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_bopomofo() { test_with_configs(unicode_escape_property_script_bopomofo_tc) } fn unicode_escape_property_script_bopomofo_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [746..=747, 12549..=12591, 12704..=12735]; const REGEXES: [&str; 4] = [ "^\\p{Script=Bopomofo}+$", "^\\p{sc=Bopomofo}+$", "^\\p{Script=Bopo}+$", "^\\p{sc=Bopo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_brahmi() { test_with_configs(unicode_escape_property_script_brahmi_tc) } fn unicode_escape_property_script_brahmi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [69632..=69709, 69714..=69749, 69759..=69759]; const REGEXES: [&str; 4] = [ "^\\p{Script=Brahmi}+$", "^\\p{sc=Brahmi}+$", "^\\p{Script=Brah}+$", "^\\p{sc=Brah}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_braille() { test_with_configs(unicode_escape_property_script_braille_tc) } fn unicode_escape_property_script_braille_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [10240..=10495]; const REGEXES: [&str; 4] = [ "^\\p{Script=Braille}+$", "^\\p{sc=Braille}+$", "^\\p{Script=Brai}+$", "^\\p{sc=Brai}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_buginese() { test_with_configs(unicode_escape_property_script_buginese_tc) } fn unicode_escape_property_script_buginese_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [6656..=6683, 6686..=6687]; const REGEXES: [&str; 4] = [ "^\\p{Script=Buginese}+$", "^\\p{sc=Buginese}+$", "^\\p{Script=Bugi}+$", "^\\p{sc=Bugi}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_buhid() { test_with_configs(unicode_escape_property_script_buhid_tc) } fn unicode_escape_property_script_buhid_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [5952..=5971]; const REGEXES: [&str; 4] = [ "^\\p{Script=Buhid}+$", "^\\p{sc=Buhid}+$", "^\\p{Script=Buhd}+$", "^\\p{sc=Buhd}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_chakma() { test_with_configs(unicode_escape_property_script_chakma_tc) } fn unicode_escape_property_script_chakma_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [69888..=69940, 69942..=69959]; const REGEXES: [&str; 4] = [ "^\\p{Script=Chakma}+$", "^\\p{sc=Chakma}+$", "^\\p{Script=Cakm}+$", "^\\p{sc=Cakm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_canadian_aboriginal() { test_with_configs(unicode_escape_property_script_canadian_aboriginal_tc) } fn unicode_escape_property_script_canadian_aboriginal_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [5120..=5759, 6320..=6389, 72368..=72383]; const REGEXES: [&str; 4] = [ "^\\p{Script=Canadian_Aboriginal}+$", "^\\p{sc=Canadian_Aboriginal}+$", "^\\p{Script=Cans}+$", "^\\p{sc=Cans}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_carian() { test_with_configs(unicode_escape_property_script_carian_tc) } fn unicode_escape_property_script_carian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [66208..=66256]; const REGEXES: [&str; 4] = [ "^\\p{Script=Carian}+$", "^\\p{sc=Carian}+$", "^\\p{Script=Cari}+$", "^\\p{sc=Cari}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_cham() { test_with_configs(unicode_escape_property_script_cham_tc) } fn unicode_escape_property_script_cham_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [43520..=43574, 43584..=43597, 43600..=43609, 43612..=43615]; const REGEXES: [&str; 2] = ["^\\p{Script=Cham}+$", "^\\p{sc=Cham}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_cherokee() { test_with_configs(unicode_escape_property_script_cherokee_tc) } fn unicode_escape_property_script_cherokee_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [5024..=5109, 5112..=5117, 43888..=43967]; const REGEXES: [&str; 4] = [ "^\\p{Script=Cherokee}+$", "^\\p{sc=Cherokee}+$", "^\\p{Script=Cher}+$", "^\\p{sc=Cher}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_chorasmian() { test_with_configs(unicode_escape_property_script_chorasmian_tc) } fn unicode_escape_property_script_chorasmian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [69552..=69579]; const REGEXES: [&str; 4] = [ "^\\p{Script=Chorasmian}+$", "^\\p{sc=Chorasmian}+$", "^\\p{Script=Chrs}+$", "^\\p{sc=Chrs}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_coptic() { test_with_configs(unicode_escape_property_script_coptic_tc) } fn unicode_escape_property_script_coptic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [994..=1007, 11392..=11507, 11513..=11519]; const REGEXES: [&str; 6] = [ "^\\p{Script=Coptic}+$", "^\\p{sc=Coptic}+$", "^\\p{Script=Copt}+$", "^\\p{sc=Copt}+$", "^\\p{Script=Qaac}+$", "^\\p{sc=Qaac}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_cypro_minoan() { test_with_configs(unicode_escape_property_script_cypro_minoan_tc) } fn unicode_escape_property_script_cypro_minoan_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [77712..=77810]; const REGEXES: [&str; 4] = [ "^\\p{Script=Cypro_Minoan}+$", "^\\p{sc=Cypro_Minoan}+$", "^\\p{Script=Cpmn}+$", "^\\p{sc=Cpmn}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_cypriot() { test_with_configs(unicode_escape_property_script_cypriot_tc) } fn unicode_escape_property_script_cypriot_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 6] = [ 67584..=67589, 67592..=67592, 67594..=67637, 67639..=67640, 67644..=67644, 67647..=67647, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Cypriot}+$", "^\\p{sc=Cypriot}+$", "^\\p{Script=Cprt}+$", "^\\p{sc=Cprt}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_cyrillic() { test_with_configs(unicode_escape_property_script_cyrillic_tc) } fn unicode_escape_property_script_cyrillic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 10] = [ 1024..=1156, 1159..=1327, 7296..=7304, 7467..=7467, 7544..=7544, 11744..=11775, 42560..=42655, 65070..=65071, 122928..=122989, 123023..=123023, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Cyrillic}+$", "^\\p{sc=Cyrillic}+$", "^\\p{Script=Cyrl}+$", "^\\p{sc=Cyrl}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_devanagari() { test_with_configs(unicode_escape_property_script_devanagari_tc) } fn unicode_escape_property_script_devanagari_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 5] = [ 2304..=2384, 2389..=2403, 2406..=2431, 43232..=43263, 72448..=72457, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Devanagari}+$", "^\\p{sc=Devanagari}+$", "^\\p{Script=Deva}+$", "^\\p{sc=Deva}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_dives_akuru() { test_with_configs(unicode_escape_property_script_dives_akuru_tc) } fn unicode_escape_property_script_dives_akuru_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 8] = [ 71936..=71942, 71945..=71945, 71948..=71955, 71957..=71958, 71960..=71989, 71991..=71992, 71995..=72006, 72016..=72025, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Dives_Akuru}+$", "^\\p{sc=Dives_Akuru}+$", "^\\p{Script=Diak}+$", "^\\p{sc=Diak}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_dogra() { test_with_configs(unicode_escape_property_script_dogra_tc) } fn unicode_escape_property_script_dogra_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [71680..=71739]; const REGEXES: [&str; 4] = [ "^\\p{Script=Dogra}+$", "^\\p{sc=Dogra}+$", "^\\p{Script=Dogr}+$", "^\\p{sc=Dogr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_deseret() { test_with_configs(unicode_escape_property_script_deseret_tc) } fn unicode_escape_property_script_deseret_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [66560..=66639]; const REGEXES: [&str; 4] = [ "^\\p{Script=Deseret}+$", "^\\p{sc=Deseret}+$", "^\\p{Script=Dsrt}+$", "^\\p{sc=Dsrt}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_duployan() { test_with_configs(unicode_escape_property_script_duployan_tc) } fn unicode_escape_property_script_duployan_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 5] = [ 113664..=113770, 113776..=113788, 113792..=113800, 113808..=113817, 113820..=113823, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Duployan}+$", "^\\p{sc=Duployan}+$", "^\\p{Script=Dupl}+$", "^\\p{sc=Dupl}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_egyptian_hieroglyphs() { test_with_configs(unicode_escape_property_script_egyptian_hieroglyphs_tc) } fn unicode_escape_property_script_egyptian_hieroglyphs_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [77824..=78933]; const REGEXES: [&str; 4] = [ "^\\p{Script=Egyptian_Hieroglyphs}+$", "^\\p{sc=Egyptian_Hieroglyphs}+$", "^\\p{Script=Egyp}+$", "^\\p{sc=Egyp}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_elbasan() { test_with_configs(unicode_escape_property_script_elbasan_tc) } fn unicode_escape_property_script_elbasan_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [66816..=66855]; const REGEXES: [&str; 4] = [ "^\\p{Script=Elbasan}+$", "^\\p{sc=Elbasan}+$", "^\\p{Script=Elba}+$", "^\\p{sc=Elba}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_elymaic() { test_with_configs(unicode_escape_property_script_elymaic_tc) } fn unicode_escape_property_script_elymaic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [69600..=69622]; const REGEXES: [&str; 4] = [ "^\\p{Script=Elymaic}+$", "^\\p{sc=Elymaic}+$", "^\\p{Script=Elym}+$", "^\\p{sc=Elym}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_ethiopic() { test_with_configs(unicode_escape_property_script_ethiopic_tc) } fn unicode_escape_property_script_ethiopic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 36] = [ 4608..=4680, 4682..=4685, 4688..=4694, 4696..=4696, 4698..=4701, 4704..=4744, 4746..=4749, 4752..=4784, 4786..=4789, 4792..=4798, 4800..=4800, 4802..=4805, 4808..=4822, 4824..=4880, 4882..=4885, 4888..=4954, 4957..=4988, 4992..=5017, 11648..=11670, 11680..=11686, 11688..=11694, 11696..=11702, 11704..=11710, 11712..=11718, 11720..=11726, 11728..=11734, 11736..=11742, 43777..=43782, 43785..=43790, 43793..=43798, 43808..=43814, 43816..=43822, 124896..=124902, 124904..=124907, 124909..=124910, 124912..=124926, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Ethiopic}+$", "^\\p{sc=Ethiopic}+$", "^\\p{Script=Ethi}+$", "^\\p{sc=Ethi}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_georgian() { test_with_configs(unicode_escape_property_script_georgian_tc) } fn unicode_escape_property_script_georgian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 10] = [ 4256..=4293, 4295..=4295, 4301..=4301, 4304..=4346, 4348..=4351, 7312..=7354, 7357..=7359, 11520..=11557, 11559..=11559, 11565..=11565, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Georgian}+$", "^\\p{sc=Georgian}+$", "^\\p{Script=Geor}+$", "^\\p{sc=Geor}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_glagolitic() { test_with_configs(unicode_escape_property_script_glagolitic_tc) } fn unicode_escape_property_script_glagolitic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 6] = [ 11264..=11359, 122880..=122886, 122888..=122904, 122907..=122913, 122915..=122916, 122918..=122922, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Glagolitic}+$", "^\\p{sc=Glagolitic}+$", "^\\p{Script=Glag}+$", "^\\p{sc=Glag}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_gunjala_gondi() { test_with_configs(unicode_escape_property_script_gunjala_gondi_tc) } fn unicode_escape_property_script_gunjala_gondi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 6] = [ 73056..=73061, 73063..=73064, 73066..=73102, 73104..=73105, 73107..=73112, 73120..=73129, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Gunjala_Gondi}+$", "^\\p{sc=Gunjala_Gondi}+$", "^\\p{Script=Gong}+$", "^\\p{sc=Gong}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_masaram_gondi() { test_with_configs(unicode_escape_property_script_masaram_gondi_tc) } fn unicode_escape_property_script_masaram_gondi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 7] = [ 72960..=72966, 72968..=72969, 72971..=73014, 73018..=73018, 73020..=73021, 73023..=73031, 73040..=73049, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Masaram_Gondi}+$", "^\\p{sc=Masaram_Gondi}+$", "^\\p{Script=Gonm}+$", "^\\p{sc=Gonm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_gothic() { test_with_configs(unicode_escape_property_script_gothic_tc) } fn unicode_escape_property_script_gothic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [66352..=66378]; const REGEXES: [&str; 4] = [ "^\\p{Script=Gothic}+$", "^\\p{sc=Gothic}+$", "^\\p{Script=Goth}+$", "^\\p{sc=Goth}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_grantha() { test_with_configs(unicode_escape_property_script_grantha_tc) } fn unicode_escape_property_script_grantha_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 15] = [ 70400..=70403, 70405..=70412, 70415..=70416, 70419..=70440, 70442..=70448, 70450..=70451, 70453..=70457, 70460..=70468, 70471..=70472, 70475..=70477, 70480..=70480, 70487..=70487, 70493..=70499, 70502..=70508, 70512..=70516, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Grantha}+$", "^\\p{sc=Grantha}+$", "^\\p{Script=Gran}+$", "^\\p{sc=Gran}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_greek() { test_with_configs(unicode_escape_property_script_greek_tc) } fn unicode_escape_property_script_greek_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 36] = [ 880..=883, 885..=887, 890..=893, 895..=895, 900..=900, 902..=902, 904..=906, 908..=908, 910..=929, 931..=993, 1008..=1023, 7462..=7466, 7517..=7521, 7526..=7530, 7615..=7615, 7936..=7957, 7960..=7965, 7968..=8005, 8008..=8013, 8016..=8023, 8025..=8025, 8027..=8027, 8029..=8029, 8031..=8061, 8064..=8116, 8118..=8132, 8134..=8147, 8150..=8155, 8157..=8175, 8178..=8180, 8182..=8190, 8486..=8486, 43877..=43877, 65856..=65934, 65952..=65952, 119296..=119365, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Greek}+$", "^\\p{sc=Greek}+$", "^\\p{Script=Grek}+$", "^\\p{sc=Grek}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_gujarati() { test_with_configs(unicode_escape_property_script_gujarati_tc) } fn unicode_escape_property_script_gujarati_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 14] = [ 2689..=2691, 2693..=2701, 2703..=2705, 2707..=2728, 2730..=2736, 2738..=2739, 2741..=2745, 2748..=2757, 2759..=2761, 2763..=2765, 2768..=2768, 2784..=2787, 2790..=2801, 2809..=2815, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Gujarati}+$", "^\\p{sc=Gujarati}+$", "^\\p{Script=Gujr}+$", "^\\p{sc=Gujr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_gurmukhi() { test_with_configs(unicode_escape_property_script_gurmukhi_tc) } fn unicode_escape_property_script_gurmukhi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 16] = [ 2561..=2563, 2565..=2570, 2575..=2576, 2579..=2600, 2602..=2608, 2610..=2611, 2613..=2614, 2616..=2617, 2620..=2620, 2622..=2626, 2631..=2632, 2635..=2637, 2641..=2641, 2649..=2652, 2654..=2654, 2662..=2678, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Gurmukhi}+$", "^\\p{sc=Gurmukhi}+$", "^\\p{Script=Guru}+$", "^\\p{sc=Guru}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_hangul() { test_with_configs(unicode_escape_property_script_hangul_tc) } fn unicode_escape_property_script_hangul_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 14] = [ 4352..=4607, 12334..=12335, 12593..=12686, 12800..=12830, 12896..=12926, 43360..=43388, 44032..=55203, 55216..=55238, 55243..=55291, 65440..=65470, 65474..=65479, 65482..=65487, 65490..=65495, 65498..=65500, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Hangul}+$", "^\\p{sc=Hangul}+$", "^\\p{Script=Hang}+$", "^\\p{sc=Hang}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_han() { test_with_configs(unicode_escape_property_script_han_tc) } fn unicode_escape_property_script_han_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 22] = [ 11904..=11929, 11931..=12019, 12032..=12245, 12293..=12293, 12295..=12295, 12321..=12329, 12344..=12347, 13312..=19903, 19968..=40959, 63744..=64109, 64112..=64217, 94178..=94179, 94192..=94193, 131072..=173791, 173824..=177977, 177984..=178205, 178208..=183969, 183984..=191456, 191472..=192093, 194560..=195101, 196608..=201546, 201552..=205743, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Han}+$", "^\\p{sc=Han}+$", "^\\p{Script=Hani}+$", "^\\p{sc=Hani}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_hanunoo() { test_with_configs(unicode_escape_property_script_hanunoo_tc) } fn unicode_escape_property_script_hanunoo_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [5920..=5940]; const REGEXES: [&str; 4] = [ "^\\p{Script=Hanunoo}+$", "^\\p{sc=Hanunoo}+$", "^\\p{Script=Hano}+$", "^\\p{sc=Hano}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_hatran() { test_with_configs(unicode_escape_property_script_hatran_tc) } fn unicode_escape_property_script_hatran_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [67808..=67826, 67828..=67829, 67835..=67839]; const REGEXES: [&str; 4] = [ "^\\p{Script=Hatran}+$", "^\\p{sc=Hatran}+$", "^\\p{Script=Hatr}+$", "^\\p{sc=Hatr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_hebrew() { test_with_configs(unicode_escape_property_script_hebrew_tc) } fn unicode_escape_property_script_hebrew_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 9] = [ 1425..=1479, 1488..=1514, 1519..=1524, 64285..=64310, 64312..=64316, 64318..=64318, 64320..=64321, 64323..=64324, 64326..=64335, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Hebrew}+$", "^\\p{sc=Hebrew}+$", "^\\p{Script=Hebr}+$", "^\\p{sc=Hebr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_hiragana() { test_with_configs(unicode_escape_property_script_hiragana_tc) } fn unicode_escape_property_script_hiragana_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 6] = [ 12353..=12438, 12445..=12447, 110593..=110879, 110898..=110898, 110928..=110930, 127488..=127488, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Hiragana}+$", "^\\p{sc=Hiragana}+$", "^\\p{Script=Hira}+$", "^\\p{sc=Hira}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_anatolian_hieroglyphs() { test_with_configs(unicode_escape_property_script_anatolian_hieroglyphs_tc) } fn unicode_escape_property_script_anatolian_hieroglyphs_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [82944..=83526]; const REGEXES: [&str; 4] = [ "^\\p{Script=Anatolian_Hieroglyphs}+$", "^\\p{sc=Anatolian_Hieroglyphs}+$", "^\\p{Script=Hluw}+$", "^\\p{sc=Hluw}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_pahawh_hmong() { test_with_configs(unicode_escape_property_script_pahawh_hmong_tc) } fn unicode_escape_property_script_pahawh_hmong_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 5] = [ 92928..=92997, 93008..=93017, 93019..=93025, 93027..=93047, 93053..=93071, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Pahawh_Hmong}+$", "^\\p{sc=Pahawh_Hmong}+$", "^\\p{Script=Hmng}+$", "^\\p{sc=Hmng}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_nyiakeng_puachue_hmong() { test_with_configs(unicode_escape_property_script_nyiakeng_puachue_hmong_tc) } fn unicode_escape_property_script_nyiakeng_puachue_hmong_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [ 123136..=123180, 123184..=123197, 123200..=123209, 123214..=123215, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Nyiakeng_Puachue_Hmong}+$", "^\\p{sc=Nyiakeng_Puachue_Hmong}+$", "^\\p{Script=Hmnp}+$", "^\\p{sc=Hmnp}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_hungarian() { test_with_configs(unicode_escape_property_script_old_hungarian_tc) } fn unicode_escape_property_script_old_hungarian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [68736..=68786, 68800..=68850, 68858..=68863]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_Hungarian}+$", "^\\p{sc=Old_Hungarian}+$", "^\\p{Script=Hung}+$", "^\\p{sc=Hung}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_italic() { test_with_configs(unicode_escape_property_script_old_italic_tc) } fn unicode_escape_property_script_old_italic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [66304..=66339, 66349..=66351]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_Italic}+$", "^\\p{sc=Old_Italic}+$", "^\\p{Script=Ital}+$", "^\\p{sc=Ital}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_javanese() { test_with_configs(unicode_escape_property_script_javanese_tc) } fn unicode_escape_property_script_javanese_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [43392..=43469, 43472..=43481, 43486..=43487]; const REGEXES: [&str; 4] = [ "^\\p{Script=Javanese}+$", "^\\p{sc=Javanese}+$", "^\\p{Script=Java}+$", "^\\p{sc=Java}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_kayah_li() { test_with_configs(unicode_escape_property_script_kayah_li_tc) } fn unicode_escape_property_script_kayah_li_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [43264..=43309, 43311..=43311]; const REGEXES: [&str; 4] = [ "^\\p{Script=Kayah_Li}+$", "^\\p{sc=Kayah_Li}+$", "^\\p{Script=Kali}+$", "^\\p{sc=Kali}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_katakana() { test_with_configs(unicode_escape_property_script_katakana_tc) } fn unicode_escape_property_script_katakana_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 14] = [ 12449..=12538, 12541..=12543, 12784..=12799, 13008..=13054, 13056..=13143, 65382..=65391, 65393..=65437, 110576..=110579, 110581..=110587, 110589..=110590, 110592..=110592, 110880..=110882, 110933..=110933, 110948..=110951, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Katakana}+$", "^\\p{sc=Katakana}+$", "^\\p{Script=Kana}+$", "^\\p{sc=Kana}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_kawi() { test_with_configs(unicode_escape_property_script_kawi_tc) } fn unicode_escape_property_script_kawi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [73472..=73488, 73490..=73530, 73534..=73561]; const REGEXES: [&str; 2] = ["^\\p{Script=Kawi}+$", "^\\p{sc=Kawi}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_kharoshthi() { test_with_configs(unicode_escape_property_script_kharoshthi_tc) } fn unicode_escape_property_script_kharoshthi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 8] = [ 68096..=68099, 68101..=68102, 68108..=68115, 68117..=68119, 68121..=68149, 68152..=68154, 68159..=68168, 68176..=68184, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Kharoshthi}+$", "^\\p{sc=Kharoshthi}+$", "^\\p{Script=Khar}+$", "^\\p{sc=Khar}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_khmer() { test_with_configs(unicode_escape_property_script_khmer_tc) } fn unicode_escape_property_script_khmer_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [6016..=6109, 6112..=6121, 6128..=6137, 6624..=6655]; const REGEXES: [&str; 4] = [ "^\\p{Script=Khmer}+$", "^\\p{sc=Khmer}+$", "^\\p{Script=Khmr}+$", "^\\p{sc=Khmr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_khojki() { test_with_configs(unicode_escape_property_script_khojki_tc) } fn unicode_escape_property_script_khojki_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [70144..=70161, 70163..=70209]; const REGEXES: [&str; 4] = [ "^\\p{Script=Khojki}+$", "^\\p{sc=Khojki}+$", "^\\p{Script=Khoj}+$", "^\\p{sc=Khoj}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_khitan_small_script() { test_with_configs(unicode_escape_property_script_khitan_small_script_tc) } fn unicode_escape_property_script_khitan_small_script_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [94180..=94180, 101120..=101589]; const REGEXES: [&str; 4] = [ "^\\p{Script=Khitan_Small_Script}+$", "^\\p{sc=Khitan_Small_Script}+$", "^\\p{Script=Kits}+$", "^\\p{sc=Kits}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_kannada() { test_with_configs(unicode_escape_property_script_kannada_tc) } fn unicode_escape_property_script_kannada_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 13] = [ 3200..=3212, 3214..=3216, 3218..=3240, 3242..=3251, 3253..=3257, 3260..=3268, 3270..=3272, 3274..=3277, 3285..=3286, 3293..=3294, 3296..=3299, 3302..=3311, 3313..=3315, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Kannada}+$", "^\\p{sc=Kannada}+$", "^\\p{Script=Knda}+$", "^\\p{sc=Knda}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_kaithi() { test_with_configs(unicode_escape_property_script_kaithi_tc) } fn unicode_escape_property_script_kaithi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [69760..=69826, 69837..=69837]; const REGEXES: [&str; 4] = [ "^\\p{Script=Kaithi}+$", "^\\p{sc=Kaithi}+$", "^\\p{Script=Kthi}+$", "^\\p{sc=Kthi}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tai_tham() { test_with_configs(unicode_escape_property_script_tai_tham_tc) } fn unicode_escape_property_script_tai_tham_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 5] = [ 6688..=6750, 6752..=6780, 6783..=6793, 6800..=6809, 6816..=6829, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tai_Tham}+$", "^\\p{sc=Tai_Tham}+$", "^\\p{Script=Lana}+$", "^\\p{sc=Lana}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_lao() { test_with_configs(unicode_escape_property_script_lao_tc) } fn unicode_escape_property_script_lao_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 11] = [ 3713..=3714, 3716..=3716, 3718..=3722, 3724..=3747, 3749..=3749, 3751..=3773, 3776..=3780, 3782..=3782, 3784..=3790, 3792..=3801, 3804..=3807, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Lao}+$", "^\\p{sc=Lao}+$", "^\\p{Script=Laoo}+$", "^\\p{sc=Laoo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_latin() { test_with_configs(unicode_escape_property_script_latin_tc) } fn unicode_escape_property_script_latin_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 39] = [ 65..=90, 97..=122, 170..=170, 186..=186, 192..=214, 216..=246, 248..=696, 736..=740, 7424..=7461, 7468..=7516, 7522..=7525, 7531..=7543, 7545..=7614, 7680..=7935, 8305..=8305, 8319..=8319, 8336..=8348, 8490..=8491, 8498..=8498, 8526..=8526, 8544..=8584, 11360..=11391, 42786..=42887, 42891..=42954, 42960..=42961, 42963..=42963, 42965..=42969, 42994..=43007, 43824..=43866, 43868..=43876, 43878..=43881, 64256..=64262, 65313..=65338, 65345..=65370, 67456..=67461, 67463..=67504, 67506..=67514, 122624..=122654, 122661..=122666, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Latin}+$", "^\\p{sc=Latin}+$", "^\\p{Script=Latn}+$", "^\\p{sc=Latn}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_lepcha() { test_with_configs(unicode_escape_property_script_lepcha_tc) } fn unicode_escape_property_script_lepcha_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [7168..=7223, 7227..=7241, 7245..=7247]; const REGEXES: [&str; 4] = [ "^\\p{Script=Lepcha}+$", "^\\p{sc=Lepcha}+$", "^\\p{Script=Lepc}+$", "^\\p{sc=Lepc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_limbu() { test_with_configs(unicode_escape_property_script_limbu_tc) } fn unicode_escape_property_script_limbu_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 5] = [ 6400..=6430, 6432..=6443, 6448..=6459, 6464..=6464, 6468..=6479, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Limbu}+$", "^\\p{sc=Limbu}+$", "^\\p{Script=Limb}+$", "^\\p{sc=Limb}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_linear_a() { test_with_configs(unicode_escape_property_script_linear_a_tc) } fn unicode_escape_property_script_linear_a_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [67072..=67382, 67392..=67413, 67424..=67431]; const REGEXES: [&str; 4] = [ "^\\p{Script=Linear_A}+$", "^\\p{sc=Linear_A}+$", "^\\p{Script=Lina}+$", "^\\p{sc=Lina}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_linear_b() { test_with_configs(unicode_escape_property_script_linear_b_tc) } fn unicode_escape_property_script_linear_b_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 7] = [ 65536..=65547, 65549..=65574, 65576..=65594, 65596..=65597, 65599..=65613, 65616..=65629, 65664..=65786, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Linear_B}+$", "^\\p{sc=Linear_B}+$", "^\\p{Script=Linb}+$", "^\\p{sc=Linb}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_lisu() { test_with_configs(unicode_escape_property_script_lisu_tc) } fn unicode_escape_property_script_lisu_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [42192..=42239, 73648..=73648]; const REGEXES: [&str; 2] = ["^\\p{Script=Lisu}+$", "^\\p{sc=Lisu}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_lycian() { test_with_configs(unicode_escape_property_script_lycian_tc) } fn unicode_escape_property_script_lycian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [66176..=66204]; const REGEXES: [&str; 4] = [ "^\\p{Script=Lycian}+$", "^\\p{sc=Lycian}+$", "^\\p{Script=Lyci}+$", "^\\p{sc=Lyci}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_lydian() { test_with_configs(unicode_escape_property_script_lydian_tc) } fn unicode_escape_property_script_lydian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [67872..=67897, 67903..=67903]; const REGEXES: [&str; 4] = [ "^\\p{Script=Lydian}+$", "^\\p{sc=Lydian}+$", "^\\p{Script=Lydi}+$", "^\\p{sc=Lydi}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_mahajani() { test_with_configs(unicode_escape_property_script_mahajani_tc) } fn unicode_escape_property_script_mahajani_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [69968..=70006]; const REGEXES: [&str; 4] = [ "^\\p{Script=Mahajani}+$", "^\\p{sc=Mahajani}+$", "^\\p{Script=Mahj}+$", "^\\p{sc=Mahj}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_makasar() { test_with_configs(unicode_escape_property_script_makasar_tc) } fn unicode_escape_property_script_makasar_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [73440..=73464]; const REGEXES: [&str; 4] = [ "^\\p{Script=Makasar}+$", "^\\p{sc=Makasar}+$", "^\\p{Script=Maka}+$", "^\\p{sc=Maka}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_mandaic() { test_with_configs(unicode_escape_property_script_mandaic_tc) } fn unicode_escape_property_script_mandaic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [2112..=2139, 2142..=2142]; const REGEXES: [&str; 4] = [ "^\\p{Script=Mandaic}+$", "^\\p{sc=Mandaic}+$", "^\\p{Script=Mand}+$", "^\\p{sc=Mand}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_manichaean() { test_with_configs(unicode_escape_property_script_manichaean_tc) } fn unicode_escape_property_script_manichaean_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [68288..=68326, 68331..=68342]; const REGEXES: [&str; 4] = [ "^\\p{Script=Manichaean}+$", "^\\p{sc=Manichaean}+$", "^\\p{Script=Mani}+$", "^\\p{sc=Mani}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_marchen() { test_with_configs(unicode_escape_property_script_marchen_tc) } fn unicode_escape_property_script_marchen_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [72816..=72847, 72850..=72871, 72873..=72886]; const REGEXES: [&str; 4] = [ "^\\p{Script=Marchen}+$", "^\\p{sc=Marchen}+$", "^\\p{Script=Marc}+$", "^\\p{sc=Marc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_medefaidrin() { test_with_configs(unicode_escape_property_script_medefaidrin_tc) } fn unicode_escape_property_script_medefaidrin_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [93760..=93850]; const REGEXES: [&str; 4] = [ "^\\p{Script=Medefaidrin}+$", "^\\p{sc=Medefaidrin}+$", "^\\p{Script=Medf}+$", "^\\p{sc=Medf}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_mende_kikakui() { test_with_configs(unicode_escape_property_script_mende_kikakui_tc) } fn unicode_escape_property_script_mende_kikakui_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [124928..=125124, 125127..=125142]; const REGEXES: [&str; 4] = [ "^\\p{Script=Mende_Kikakui}+$", "^\\p{sc=Mende_Kikakui}+$", "^\\p{Script=Mend}+$", "^\\p{sc=Mend}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_meroitic_cursive() { test_with_configs(unicode_escape_property_script_meroitic_cursive_tc) } fn unicode_escape_property_script_meroitic_cursive_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [68000..=68023, 68028..=68047, 68050..=68095]; const REGEXES: [&str; 4] = [ "^\\p{Script=Meroitic_Cursive}+$", "^\\p{sc=Meroitic_Cursive}+$", "^\\p{Script=Merc}+$", "^\\p{sc=Merc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_meroitic_hieroglyphs() { test_with_configs(unicode_escape_property_script_meroitic_hieroglyphs_tc) } fn unicode_escape_property_script_meroitic_hieroglyphs_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [67968..=67999]; const REGEXES: [&str; 4] = [ "^\\p{Script=Meroitic_Hieroglyphs}+$", "^\\p{sc=Meroitic_Hieroglyphs}+$", "^\\p{Script=Mero}+$", "^\\p{sc=Mero}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_malayalam() { test_with_configs(unicode_escape_property_script_malayalam_tc) } fn unicode_escape_property_script_malayalam_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 7] = [ 3328..=3340, 3342..=3344, 3346..=3396, 3398..=3400, 3402..=3407, 3412..=3427, 3430..=3455, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Malayalam}+$", "^\\p{sc=Malayalam}+$", "^\\p{Script=Mlym}+$", "^\\p{sc=Mlym}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_modi() { test_with_configs(unicode_escape_property_script_modi_tc) } fn unicode_escape_property_script_modi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [71168..=71236, 71248..=71257]; const REGEXES: [&str; 2] = ["^\\p{Script=Modi}+$", "^\\p{sc=Modi}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_mongolian() { test_with_configs(unicode_escape_property_script_mongolian_tc) } fn unicode_escape_property_script_mongolian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 6] = [ 6144..=6145, 6148..=6148, 6150..=6169, 6176..=6264, 6272..=6314, 71264..=71276, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Mongolian}+$", "^\\p{sc=Mongolian}+$", "^\\p{Script=Mong}+$", "^\\p{sc=Mong}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_mro() { test_with_configs(unicode_escape_property_script_mro_tc) } fn unicode_escape_property_script_mro_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [92736..=92766, 92768..=92777, 92782..=92783]; const REGEXES: [&str; 4] = [ "^\\p{Script=Mro}+$", "^\\p{sc=Mro}+$", "^\\p{Script=Mroo}+$", "^\\p{sc=Mroo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_meetei_mayek() { test_with_configs(unicode_escape_property_script_meetei_mayek_tc) } fn unicode_escape_property_script_meetei_mayek_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [43744..=43766, 43968..=44013, 44016..=44025]; const REGEXES: [&str; 4] = [ "^\\p{Script=Meetei_Mayek}+$", "^\\p{sc=Meetei_Mayek}+$", "^\\p{Script=Mtei}+$", "^\\p{sc=Mtei}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_multani() { test_with_configs(unicode_escape_property_script_multani_tc) } fn unicode_escape_property_script_multani_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 5] = [ 70272..=70278, 70280..=70280, 70282..=70285, 70287..=70301, 70303..=70313, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Multani}+$", "^\\p{sc=Multani}+$", "^\\p{Script=Mult}+$", "^\\p{sc=Mult}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_myanmar() { test_with_configs(unicode_escape_property_script_myanmar_tc) } fn unicode_escape_property_script_myanmar_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [4096..=4255, 43488..=43518, 43616..=43647]; const REGEXES: [&str; 4] = [ "^\\p{Script=Myanmar}+$", "^\\p{sc=Myanmar}+$", "^\\p{Script=Mymr}+$", "^\\p{sc=Mymr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_nag_mundari() { test_with_configs(unicode_escape_property_script_nag_mundari_tc) } fn unicode_escape_property_script_nag_mundari_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [124112..=124153]; const REGEXES: [&str; 4] = [ "^\\p{Script=Nag_Mundari}+$", "^\\p{sc=Nag_Mundari}+$", "^\\p{Script=Nagm}+$", "^\\p{sc=Nagm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_nandinagari() { test_with_configs(unicode_escape_property_script_nandinagari_tc) } fn unicode_escape_property_script_nandinagari_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [72096..=72103, 72106..=72151, 72154..=72164]; const REGEXES: [&str; 4] = [ "^\\p{Script=Nandinagari}+$", "^\\p{sc=Nandinagari}+$", "^\\p{Script=Nand}+$", "^\\p{sc=Nand}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_north_arabian() { test_with_configs(unicode_escape_property_script_old_north_arabian_tc) } fn unicode_escape_property_script_old_north_arabian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [68224..=68255]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_North_Arabian}+$", "^\\p{sc=Old_North_Arabian}+$", "^\\p{Script=Narb}+$", "^\\p{sc=Narb}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_nabataean() { test_with_configs(unicode_escape_property_script_nabataean_tc) } fn unicode_escape_property_script_nabataean_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [67712..=67742, 67751..=67759]; const REGEXES: [&str; 4] = [ "^\\p{Script=Nabataean}+$", "^\\p{sc=Nabataean}+$", "^\\p{Script=Nbat}+$", "^\\p{sc=Nbat}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_newa() { test_with_configs(unicode_escape_property_script_newa_tc) } fn unicode_escape_property_script_newa_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [70656..=70747, 70749..=70753]; const REGEXES: [&str; 2] = ["^\\p{Script=Newa}+$", "^\\p{sc=Newa}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_nko() { test_with_configs(unicode_escape_property_script_nko_tc) } fn unicode_escape_property_script_nko_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [1984..=2042, 2045..=2047]; const REGEXES: [&str; 4] = [ "^\\p{Script=Nko}+$", "^\\p{sc=Nko}+$", "^\\p{Script=Nkoo}+$", "^\\p{sc=Nkoo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_nushu() { test_with_configs(unicode_escape_property_script_nushu_tc) } fn unicode_escape_property_script_nushu_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [94177..=94177, 110960..=111355]; const REGEXES: [&str; 4] = [ "^\\p{Script=Nushu}+$", "^\\p{sc=Nushu}+$", "^\\p{Script=Nshu}+$", "^\\p{sc=Nshu}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_ogham() { test_with_configs(unicode_escape_property_script_ogham_tc) } fn unicode_escape_property_script_ogham_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [5760..=5788]; const REGEXES: [&str; 4] = [ "^\\p{Script=Ogham}+$", "^\\p{sc=Ogham}+$", "^\\p{Script=Ogam}+$", "^\\p{sc=Ogam}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_ol_chiki() { test_with_configs(unicode_escape_property_script_ol_chiki_tc) } fn unicode_escape_property_script_ol_chiki_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [7248..=7295]; const REGEXES: [&str; 4] = [ "^\\p{Script=Ol_Chiki}+$", "^\\p{sc=Ol_Chiki}+$", "^\\p{Script=Olck}+$", "^\\p{sc=Olck}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_turkic() { test_with_configs(unicode_escape_property_script_old_turkic_tc) } fn unicode_escape_property_script_old_turkic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [68608..=68680]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_Turkic}+$", "^\\p{sc=Old_Turkic}+$", "^\\p{Script=Orkh}+$", "^\\p{sc=Orkh}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_oriya() { test_with_configs(unicode_escape_property_script_oriya_tc) } fn unicode_escape_property_script_oriya_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 14] = [ 2817..=2819, 2821..=2828, 2831..=2832, 2835..=2856, 2858..=2864, 2866..=2867, 2869..=2873, 2876..=2884, 2887..=2888, 2891..=2893, 2901..=2903, 2908..=2909, 2911..=2915, 2918..=2935, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Oriya}+$", "^\\p{sc=Oriya}+$", "^\\p{Script=Orya}+$", "^\\p{sc=Orya}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_osage() { test_with_configs(unicode_escape_property_script_osage_tc) } fn unicode_escape_property_script_osage_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [66736..=66771, 66776..=66811]; const REGEXES: [&str; 4] = [ "^\\p{Script=Osage}+$", "^\\p{sc=Osage}+$", "^\\p{Script=Osge}+$", "^\\p{sc=Osge}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_osmanya() { test_with_configs(unicode_escape_property_script_osmanya_tc) } fn unicode_escape_property_script_osmanya_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [66688..=66717, 66720..=66729]; const REGEXES: [&str; 4] = [ "^\\p{Script=Osmanya}+$", "^\\p{sc=Osmanya}+$", "^\\p{Script=Osma}+$", "^\\p{sc=Osma}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_uyghur() { test_with_configs(unicode_escape_property_script_old_uyghur_tc) } fn unicode_escape_property_script_old_uyghur_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [69488..=69513]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_Uyghur}+$", "^\\p{sc=Old_Uyghur}+$", "^\\p{Script=Ougr}+$", "^\\p{sc=Ougr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_palmyrene() { test_with_configs(unicode_escape_property_script_palmyrene_tc) } fn unicode_escape_property_script_palmyrene_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [67680..=67711]; const REGEXES: [&str; 4] = [ "^\\p{Script=Palmyrene}+$", "^\\p{sc=Palmyrene}+$", "^\\p{Script=Palm}+$", "^\\p{sc=Palm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_pau_cin_hau() { test_with_configs(unicode_escape_property_script_pau_cin_hau_tc) } fn unicode_escape_property_script_pau_cin_hau_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [72384..=72440]; const REGEXES: [&str; 4] = [ "^\\p{Script=Pau_Cin_Hau}+$", "^\\p{sc=Pau_Cin_Hau}+$", "^\\p{Script=Pauc}+$", "^\\p{sc=Pauc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_permic() { test_with_configs(unicode_escape_property_script_old_permic_tc) } fn unicode_escape_property_script_old_permic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [66384..=66426]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_Permic}+$", "^\\p{sc=Old_Permic}+$", "^\\p{Script=Perm}+$", "^\\p{sc=Perm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_phags_pa() { test_with_configs(unicode_escape_property_script_phags_pa_tc) } fn unicode_escape_property_script_phags_pa_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [43072..=43127]; const REGEXES: [&str; 4] = [ "^\\p{Script=Phags_Pa}+$", "^\\p{sc=Phags_Pa}+$", "^\\p{Script=Phag}+$", "^\\p{sc=Phag}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_inscriptional_pahlavi() { test_with_configs(unicode_escape_property_script_inscriptional_pahlavi_tc) } fn unicode_escape_property_script_inscriptional_pahlavi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [68448..=68466, 68472..=68479]; const REGEXES: [&str; 4] = [ "^\\p{Script=Inscriptional_Pahlavi}+$", "^\\p{sc=Inscriptional_Pahlavi}+$", "^\\p{Script=Phli}+$", "^\\p{sc=Phli}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_psalter_pahlavi() { test_with_configs(unicode_escape_property_script_psalter_pahlavi_tc) } fn unicode_escape_property_script_psalter_pahlavi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [68480..=68497, 68505..=68508, 68521..=68527]; const REGEXES: [&str; 4] = [ "^\\p{Script=Psalter_Pahlavi}+$", "^\\p{sc=Psalter_Pahlavi}+$", "^\\p{Script=Phlp}+$", "^\\p{sc=Phlp}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_phoenician() { test_with_configs(unicode_escape_property_script_phoenician_tc) } fn unicode_escape_property_script_phoenician_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [67840..=67867, 67871..=67871]; const REGEXES: [&str; 4] = [ "^\\p{Script=Phoenician}+$", "^\\p{sc=Phoenician}+$", "^\\p{Script=Phnx}+$", "^\\p{sc=Phnx}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_miao() { test_with_configs(unicode_escape_property_script_miao_tc) } fn unicode_escape_property_script_miao_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [93952..=94026, 94031..=94087, 94095..=94111]; const REGEXES: [&str; 4] = [ "^\\p{Script=Miao}+$", "^\\p{sc=Miao}+$", "^\\p{Script=Plrd}+$", "^\\p{sc=Plrd}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_inscriptional_parthian() { test_with_configs(unicode_escape_property_script_inscriptional_parthian_tc) } fn unicode_escape_property_script_inscriptional_parthian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [68416..=68437, 68440..=68447]; const REGEXES: [&str; 4] = [ "^\\p{Script=Inscriptional_Parthian}+$", "^\\p{sc=Inscriptional_Parthian}+$", "^\\p{Script=Prti}+$", "^\\p{sc=Prti}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_rejang() { test_with_configs(unicode_escape_property_script_rejang_tc) } fn unicode_escape_property_script_rejang_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [43312..=43347, 43359..=43359]; const REGEXES: [&str; 4] = [ "^\\p{Script=Rejang}+$", "^\\p{sc=Rejang}+$", "^\\p{Script=Rjng}+$", "^\\p{sc=Rjng}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_hanifi_rohingya() { test_with_configs(unicode_escape_property_script_hanifi_rohingya_tc) } fn unicode_escape_property_script_hanifi_rohingya_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [68864..=68903, 68912..=68921]; const REGEXES: [&str; 4] = [ "^\\p{Script=Hanifi_Rohingya}+$", "^\\p{sc=Hanifi_Rohingya}+$", "^\\p{Script=Rohg}+$", "^\\p{sc=Rohg}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_runic() { test_with_configs(unicode_escape_property_script_runic_tc) } fn unicode_escape_property_script_runic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [5792..=5866, 5870..=5880]; const REGEXES: [&str; 4] = [ "^\\p{Script=Runic}+$", "^\\p{sc=Runic}+$", "^\\p{Script=Runr}+$", "^\\p{sc=Runr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_samaritan() { test_with_configs(unicode_escape_property_script_samaritan_tc) } fn unicode_escape_property_script_samaritan_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [2048..=2093, 2096..=2110]; const REGEXES: [&str; 4] = [ "^\\p{Script=Samaritan}+$", "^\\p{sc=Samaritan}+$", "^\\p{Script=Samr}+$", "^\\p{sc=Samr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_south_arabian() { test_with_configs(unicode_escape_property_script_old_south_arabian_tc) } fn unicode_escape_property_script_old_south_arabian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [68192..=68223]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_South_Arabian}+$", "^\\p{sc=Old_South_Arabian}+$", "^\\p{Script=Sarb}+$", "^\\p{sc=Sarb}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_saurashtra() { test_with_configs(unicode_escape_property_script_saurashtra_tc) } fn unicode_escape_property_script_saurashtra_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [43136..=43205, 43214..=43225]; const REGEXES: [&str; 4] = [ "^\\p{Script=Saurashtra}+$", "^\\p{sc=Saurashtra}+$", "^\\p{Script=Saur}+$", "^\\p{sc=Saur}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_signwriting() { test_with_configs(unicode_escape_property_script_signwriting_tc) } fn unicode_escape_property_script_signwriting_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [120832..=121483, 121499..=121503, 121505..=121519]; const REGEXES: [&str; 4] = [ "^\\p{Script=SignWriting}+$", "^\\p{sc=SignWriting}+$", "^\\p{Script=Sgnw}+$", "^\\p{sc=Sgnw}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_shavian() { test_with_configs(unicode_escape_property_script_shavian_tc) } fn unicode_escape_property_script_shavian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [66640..=66687]; const REGEXES: [&str; 4] = [ "^\\p{Script=Shavian}+$", "^\\p{sc=Shavian}+$", "^\\p{Script=Shaw}+$", "^\\p{sc=Shaw}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_sharada() { test_with_configs(unicode_escape_property_script_sharada_tc) } fn unicode_escape_property_script_sharada_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [70016..=70111]; const REGEXES: [&str; 4] = [ "^\\p{Script=Sharada}+$", "^\\p{sc=Sharada}+$", "^\\p{Script=Shrd}+$", "^\\p{sc=Shrd}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_siddham() { test_with_configs(unicode_escape_property_script_siddham_tc) } fn unicode_escape_property_script_siddham_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [71040..=71093, 71096..=71133]; const REGEXES: [&str; 4] = [ "^\\p{Script=Siddham}+$", "^\\p{sc=Siddham}+$", "^\\p{Script=Sidd}+$", "^\\p{sc=Sidd}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_khudawadi() { test_with_configs(unicode_escape_property_script_khudawadi_tc) } fn unicode_escape_property_script_khudawadi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [70320..=70378, 70384..=70393]; const REGEXES: [&str; 4] = [ "^\\p{Script=Khudawadi}+$", "^\\p{sc=Khudawadi}+$", "^\\p{Script=Sind}+$", "^\\p{sc=Sind}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_sinhala() { test_with_configs(unicode_escape_property_script_sinhala_tc) } fn unicode_escape_property_script_sinhala_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 13] = [ 3457..=3459, 3461..=3478, 3482..=3505, 3507..=3515, 3517..=3517, 3520..=3526, 3530..=3530, 3535..=3540, 3542..=3542, 3544..=3551, 3558..=3567, 3570..=3572, 70113..=70132, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Sinhala}+$", "^\\p{sc=Sinhala}+$", "^\\p{Script=Sinh}+$", "^\\p{sc=Sinh}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_sogdian() { test_with_configs(unicode_escape_property_script_sogdian_tc) } fn unicode_escape_property_script_sogdian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [69424..=69465]; const REGEXES: [&str; 4] = [ "^\\p{Script=Sogdian}+$", "^\\p{sc=Sogdian}+$", "^\\p{Script=Sogd}+$", "^\\p{sc=Sogd}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_sogdian() { test_with_configs(unicode_escape_property_script_old_sogdian_tc) } fn unicode_escape_property_script_old_sogdian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [69376..=69415]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_Sogdian}+$", "^\\p{sc=Old_Sogdian}+$", "^\\p{Script=Sogo}+$", "^\\p{sc=Sogo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_sora_sompeng() { test_with_configs(unicode_escape_property_script_sora_sompeng_tc) } fn unicode_escape_property_script_sora_sompeng_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [69840..=69864, 69872..=69881]; const REGEXES: [&str; 4] = [ "^\\p{Script=Sora_Sompeng}+$", "^\\p{sc=Sora_Sompeng}+$", "^\\p{Script=Sora}+$", "^\\p{sc=Sora}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_soyombo() { test_with_configs(unicode_escape_property_script_soyombo_tc) } fn unicode_escape_property_script_soyombo_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [72272..=72354]; const REGEXES: [&str; 4] = [ "^\\p{Script=Soyombo}+$", "^\\p{sc=Soyombo}+$", "^\\p{Script=Soyo}+$", "^\\p{sc=Soyo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_sundanese() { test_with_configs(unicode_escape_property_script_sundanese_tc) } fn unicode_escape_property_script_sundanese_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [7040..=7103, 7360..=7367]; const REGEXES: [&str; 4] = [ "^\\p{Script=Sundanese}+$", "^\\p{sc=Sundanese}+$", "^\\p{Script=Sund}+$", "^\\p{sc=Sund}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_syloti_nagri() { test_with_configs(unicode_escape_property_script_syloti_nagri_tc) } fn unicode_escape_property_script_syloti_nagri_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [43008..=43052]; const REGEXES: [&str; 4] = [ "^\\p{Script=Syloti_Nagri}+$", "^\\p{sc=Syloti_Nagri}+$", "^\\p{Script=Sylo}+$", "^\\p{sc=Sylo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_syriac() { test_with_configs(unicode_escape_property_script_syriac_tc) } fn unicode_escape_property_script_syriac_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [1792..=1805, 1807..=1866, 1869..=1871, 2144..=2154]; const REGEXES: [&str; 4] = [ "^\\p{Script=Syriac}+$", "^\\p{sc=Syriac}+$", "^\\p{Script=Syrc}+$", "^\\p{sc=Syrc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tagbanwa() { test_with_configs(unicode_escape_property_script_tagbanwa_tc) } fn unicode_escape_property_script_tagbanwa_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [5984..=5996, 5998..=6000, 6002..=6003]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tagbanwa}+$", "^\\p{sc=Tagbanwa}+$", "^\\p{Script=Tagb}+$", "^\\p{sc=Tagb}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_takri() { test_with_configs(unicode_escape_property_script_takri_tc) } fn unicode_escape_property_script_takri_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [71296..=71353, 71360..=71369]; const REGEXES: [&str; 4] = [ "^\\p{Script=Takri}+$", "^\\p{sc=Takri}+$", "^\\p{Script=Takr}+$", "^\\p{sc=Takr}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tai_le() { test_with_configs(unicode_escape_property_script_tai_le_tc) } fn unicode_escape_property_script_tai_le_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [6480..=6509, 6512..=6516]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tai_Le}+$", "^\\p{sc=Tai_Le}+$", "^\\p{Script=Tale}+$", "^\\p{sc=Tale}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_new_tai_lue() { test_with_configs(unicode_escape_property_script_new_tai_lue_tc) } fn unicode_escape_property_script_new_tai_lue_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [6528..=6571, 6576..=6601, 6608..=6618, 6622..=6623]; const REGEXES: [&str; 4] = [ "^\\p{Script=New_Tai_Lue}+$", "^\\p{sc=New_Tai_Lue}+$", "^\\p{Script=Talu}+$", "^\\p{sc=Talu}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tamil() { test_with_configs(unicode_escape_property_script_tamil_tc) } fn unicode_escape_property_script_tamil_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 18] = [ 2946..=2947, 2949..=2954, 2958..=2960, 2962..=2965, 2969..=2970, 2972..=2972, 2974..=2975, 2979..=2980, 2984..=2986, 2990..=3001, 3006..=3010, 3014..=3016, 3018..=3021, 3024..=3024, 3031..=3031, 3046..=3066, 73664..=73713, 73727..=73727, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tamil}+$", "^\\p{sc=Tamil}+$", "^\\p{Script=Taml}+$", "^\\p{sc=Taml}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tangut() { test_with_configs(unicode_escape_property_script_tangut_tc) } fn unicode_escape_property_script_tangut_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [ 94176..=94176, 94208..=100343, 100352..=101119, 101632..=101640, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tangut}+$", "^\\p{sc=Tangut}+$", "^\\p{Script=Tang}+$", "^\\p{sc=Tang}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tai_viet() { test_with_configs(unicode_escape_property_script_tai_viet_tc) } fn unicode_escape_property_script_tai_viet_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [43648..=43714, 43739..=43743]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tai_Viet}+$", "^\\p{sc=Tai_Viet}+$", "^\\p{Script=Tavt}+$", "^\\p{sc=Tavt}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_telugu() { test_with_configs(unicode_escape_property_script_telugu_tc) } fn unicode_escape_property_script_telugu_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 13] = [ 3072..=3084, 3086..=3088, 3090..=3112, 3114..=3129, 3132..=3140, 3142..=3144, 3146..=3149, 3157..=3158, 3160..=3162, 3165..=3165, 3168..=3171, 3174..=3183, 3191..=3199, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Telugu}+$", "^\\p{sc=Telugu}+$", "^\\p{Script=Telu}+$", "^\\p{sc=Telu}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tifinagh() { test_with_configs(unicode_escape_property_script_tifinagh_tc) } fn unicode_escape_property_script_tifinagh_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [11568..=11623, 11631..=11632, 11647..=11647]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tifinagh}+$", "^\\p{sc=Tifinagh}+$", "^\\p{Script=Tfng}+$", "^\\p{sc=Tfng}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tagalog() { test_with_configs(unicode_escape_property_script_tagalog_tc) } fn unicode_escape_property_script_tagalog_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [5888..=5909, 5919..=5919]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tagalog}+$", "^\\p{sc=Tagalog}+$", "^\\p{Script=Tglg}+$", "^\\p{sc=Tglg}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_thaana() { test_with_configs(unicode_escape_property_script_thaana_tc) } fn unicode_escape_property_script_thaana_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [1920..=1969]; const REGEXES: [&str; 4] = [ "^\\p{Script=Thaana}+$", "^\\p{sc=Thaana}+$", "^\\p{Script=Thaa}+$", "^\\p{sc=Thaa}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_thai() { test_with_configs(unicode_escape_property_script_thai_tc) } fn unicode_escape_property_script_thai_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [3585..=3642, 3648..=3675]; const REGEXES: [&str; 2] = ["^\\p{Script=Thai}+$", "^\\p{sc=Thai}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tibetan() { test_with_configs(unicode_escape_property_script_tibetan_tc) } fn unicode_escape_property_script_tibetan_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 7] = [ 3840..=3911, 3913..=3948, 3953..=3991, 3993..=4028, 4030..=4044, 4046..=4052, 4057..=4058, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tibetan}+$", "^\\p{sc=Tibetan}+$", "^\\p{Script=Tibt}+$", "^\\p{sc=Tibt}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tirhuta() { test_with_configs(unicode_escape_property_script_tirhuta_tc) } fn unicode_escape_property_script_tirhuta_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [70784..=70855, 70864..=70873]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tirhuta}+$", "^\\p{sc=Tirhuta}+$", "^\\p{Script=Tirh}+$", "^\\p{sc=Tirh}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_tangsa() { test_with_configs(unicode_escape_property_script_tangsa_tc) } fn unicode_escape_property_script_tangsa_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [92784..=92862, 92864..=92873]; const REGEXES: [&str; 4] = [ "^\\p{Script=Tangsa}+$", "^\\p{sc=Tangsa}+$", "^\\p{Script=Tnsa}+$", "^\\p{sc=Tnsa}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_toto() { test_with_configs(unicode_escape_property_script_toto_tc) } fn unicode_escape_property_script_toto_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [123536..=123566]; const REGEXES: [&str; 2] = ["^\\p{Script=Toto}+$", "^\\p{sc=Toto}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_ugaritic() { test_with_configs(unicode_escape_property_script_ugaritic_tc) } fn unicode_escape_property_script_ugaritic_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [66432..=66461, 66463..=66463]; const REGEXES: [&str; 4] = [ "^\\p{Script=Ugaritic}+$", "^\\p{sc=Ugaritic}+$", "^\\p{Script=Ugar}+$", "^\\p{sc=Ugar}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_vai() { test_with_configs(unicode_escape_property_script_vai_tc) } fn unicode_escape_property_script_vai_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [42240..=42539]; const REGEXES: [&str; 4] = [ "^\\p{Script=Vai}+$", "^\\p{sc=Vai}+$", "^\\p{Script=Vaii}+$", "^\\p{sc=Vaii}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_vithkuqi() { test_with_configs(unicode_escape_property_script_vithkuqi_tc) } fn unicode_escape_property_script_vithkuqi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 8] = [ 66928..=66938, 66940..=66954, 66956..=66962, 66964..=66965, 66967..=66977, 66979..=66993, 66995..=67001, 67003..=67004, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Vithkuqi}+$", "^\\p{sc=Vithkuqi}+$", "^\\p{Script=Vith}+$", "^\\p{sc=Vith}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_warang_citi() { test_with_configs(unicode_escape_property_script_warang_citi_tc) } fn unicode_escape_property_script_warang_citi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [71840..=71922, 71935..=71935]; const REGEXES: [&str; 4] = [ "^\\p{Script=Warang_Citi}+$", "^\\p{sc=Warang_Citi}+$", "^\\p{Script=Wara}+$", "^\\p{sc=Wara}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_wancho() { test_with_configs(unicode_escape_property_script_wancho_tc) } fn unicode_escape_property_script_wancho_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [123584..=123641, 123647..=123647]; const REGEXES: [&str; 4] = [ "^\\p{Script=Wancho}+$", "^\\p{sc=Wancho}+$", "^\\p{Script=Wcho}+$", "^\\p{sc=Wcho}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_old_persian() { test_with_configs(unicode_escape_property_script_old_persian_tc) } fn unicode_escape_property_script_old_persian_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [66464..=66499, 66504..=66517]; const REGEXES: [&str; 4] = [ "^\\p{Script=Old_Persian}+$", "^\\p{sc=Old_Persian}+$", "^\\p{Script=Xpeo}+$", "^\\p{sc=Xpeo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_cuneiform() { test_with_configs(unicode_escape_property_script_cuneiform_tc) } fn unicode_escape_property_script_cuneiform_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 4] = [73728..=74649, 74752..=74862, 74864..=74868, 74880..=75075]; const REGEXES: [&str; 4] = [ "^\\p{Script=Cuneiform}+$", "^\\p{sc=Cuneiform}+$", "^\\p{Script=Xsux}+$", "^\\p{sc=Xsux}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_yezidi() { test_with_configs(unicode_escape_property_script_yezidi_tc) } fn unicode_escape_property_script_yezidi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 3] = [69248..=69289, 69291..=69293, 69296..=69297]; const REGEXES: [&str; 4] = [ "^\\p{Script=Yezidi}+$", "^\\p{sc=Yezidi}+$", "^\\p{Script=Yezi}+$", "^\\p{sc=Yezi}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_yi() { test_with_configs(unicode_escape_property_script_yi_tc) } fn unicode_escape_property_script_yi_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 2] = [40960..=42124, 42128..=42182]; const REGEXES: [&str; 4] = [ "^\\p{Script=Yi}+$", "^\\p{sc=Yi}+$", "^\\p{Script=Yiii}+$", "^\\p{sc=Yiii}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_zanabazar_square() { test_with_configs(unicode_escape_property_script_zanabazar_square_tc) } fn unicode_escape_property_script_zanabazar_square_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 1] = [72192..=72263]; const REGEXES: [&str; 4] = [ "^\\p{Script=Zanabazar_Square}+$", "^\\p{sc=Zanabazar_Square}+$", "^\\p{Script=Zanb}+$", "^\\p{sc=Zanb}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_inherited() { test_with_configs(unicode_escape_property_script_inherited_tc) } fn unicode_escape_property_script_inherited_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 29] = [ 768..=879, 1157..=1158, 1611..=1621, 1648..=1648, 2385..=2388, 6832..=6862, 7376..=7378, 7380..=7392, 7394..=7400, 7405..=7405, 7412..=7412, 7416..=7417, 7616..=7679, 8204..=8205, 8400..=8432, 12330..=12333, 12441..=12442, 65024..=65039, 65056..=65069, 66045..=66045, 66272..=66272, 70459..=70459, 118528..=118573, 118576..=118598, 119143..=119145, 119163..=119170, 119173..=119179, 119210..=119213, 917760..=917999, ]; const REGEXES: [&str; 6] = [ "^\\p{Script=Inherited}+$", "^\\p{sc=Inherited}+$", "^\\p{Script=Zinh}+$", "^\\p{sc=Zinh}+$", "^\\p{Script=Qaai}+$", "^\\p{sc=Qaai}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } #[test] fn unicode_escape_property_script_common() { test_with_configs(unicode_escape_property_script_common_tc) } fn unicode_escape_property_script_common_tc(tc: TestConfig) { const CODE_POINTS: [std::ops::RangeInclusive; 173] = [ 0..=64, 91..=96, 123..=169, 171..=185, 187..=191, 215..=215, 247..=247, 697..=735, 741..=745, 748..=767, 884..=884, 894..=894, 901..=901, 903..=903, 1541..=1541, 1548..=1548, 1563..=1563, 1567..=1567, 1600..=1600, 1757..=1757, 2274..=2274, 2404..=2405, 3647..=3647, 4053..=4056, 4347..=4347, 5867..=5869, 5941..=5942, 6146..=6147, 6149..=6149, 7379..=7379, 7393..=7393, 7401..=7404, 7406..=7411, 7413..=7415, 7418..=7418, 8192..=8203, 8206..=8292, 8294..=8304, 8308..=8318, 8320..=8334, 8352..=8384, 8448..=8485, 8487..=8489, 8492..=8497, 8499..=8525, 8527..=8543, 8585..=8587, 8592..=9254, 9280..=9290, 9312..=10239, 10496..=11123, 11126..=11157, 11159..=11263, 11776..=11869, 12272..=12292, 12294..=12294, 12296..=12320, 12336..=12343, 12348..=12351, 12443..=12444, 12448..=12448, 12539..=12540, 12688..=12703, 12736..=12771, 12783..=12783, 12832..=12895, 12927..=13007, 13055..=13055, 13144..=13311, 19904..=19967, 42752..=42785, 42888..=42890, 43056..=43065, 43310..=43310, 43471..=43471, 43867..=43867, 43882..=43883, 64830..=64831, 65040..=65049, 65072..=65106, 65108..=65126, 65128..=65131, 65279..=65279, 65281..=65312, 65339..=65344, 65371..=65381, 65392..=65392, 65438..=65439, 65504..=65510, 65512..=65518, 65529..=65533, 65792..=65794, 65799..=65843, 65847..=65855, 65936..=65948, 66000..=66044, 66273..=66299, 113824..=113827, 118608..=118723, 118784..=119029, 119040..=119078, 119081..=119142, 119146..=119162, 119171..=119172, 119180..=119209, 119214..=119274, 119488..=119507, 119520..=119539, 119552..=119638, 119648..=119672, 119808..=119892, 119894..=119964, 119966..=119967, 119970..=119970, 119973..=119974, 119977..=119980, 119982..=119993, 119995..=119995, 119997..=120003, 120005..=120069, 120071..=120074, 120077..=120084, 120086..=120092, 120094..=120121, 120123..=120126, 120128..=120132, 120134..=120134, 120138..=120144, 120146..=120485, 120488..=120779, 120782..=120831, 126065..=126132, 126209..=126269, 126976..=127019, 127024..=127123, 127136..=127150, 127153..=127167, 127169..=127183, 127185..=127221, 127232..=127405, 127462..=127487, 127489..=127490, 127504..=127547, 127552..=127560, 127568..=127569, 127584..=127589, 127744..=128727, 128732..=128748, 128752..=128764, 128768..=128886, 128891..=128985, 128992..=129003, 129008..=129008, 129024..=129035, 129040..=129095, 129104..=129113, 129120..=129159, 129168..=129197, 129200..=129201, 129280..=129619, 129632..=129645, 129648..=129660, 129664..=129672, 129680..=129725, 129727..=129733, 129742..=129755, 129760..=129768, 129776..=129784, 129792..=129938, 129940..=129994, 130032..=130041, 917505..=917505, 917536..=917631, ]; const REGEXES: [&str; 4] = [ "^\\p{Script=Common}+$", "^\\p{sc=Common}+$", "^\\p{Script=Zyyy}+$", "^\\p{sc=Zyyy}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for range in CODE_POINTS { for cp in range { regex.test_succeeds(&char::from_u32(cp).unwrap().to_string()); } } } } pub mod common; #[test] fn unicode_escape_property_binary_alphabetic() { test_with_configs(unicode_escape_property_binary_alphabetic_tc) } fn unicode_escape_property_binary_alphabetic_tc(tc: TestConfig) { static CODE_POINTS: [&str; 1141] = [ "\u{41}", "\u{61}", "\u{aa}", "\u{b5}", "\u{ba}", "\u{c0}", "\u{d8}", "\u{f8}", "\u{1bb}", "\u{1bc}", "\u{1c0}", "\u{1c4}", "\u{294}", "\u{295}", "\u{2b0}", "\u{2c6}", "\u{2e0}", "\u{2ec}", "\u{2ee}", "\u{345}", "\u{370}", "\u{374}", "\u{376}", "\u{37a}", "\u{37b}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3f7}", "\u{48a}", "\u{531}", "\u{559}", "\u{560}", "\u{5b0}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{5c7}", "\u{5d0}", "\u{5ef}", "\u{610}", "\u{620}", "\u{640}", "\u{641}", "\u{64b}", "\u{659}", "\u{66e}", "\u{670}", "\u{671}", "\u{6d5}", "\u{6d6}", "\u{6e1}", "\u{6e5}", "\u{6e7}", "\u{6ed}", "\u{6ee}", "\u{6fa}", "\u{6ff}", "\u{710}", "\u{711}", "\u{712}", "\u{730}", "\u{74d}", "\u{7a6}", "\u{7b1}", "\u{7ca}", "\u{7f4}", "\u{7fa}", "\u{800}", "\u{816}", "\u{81a}", "\u{81b}", "\u{824}", "\u{825}", "\u{828}", "\u{829}", "\u{840}", "\u{860}", "\u{870}", "\u{889}", "\u{8a0}", "\u{8c9}", "\u{8d4}", "\u{8e3}", "\u{8f0}", "\u{903}", "\u{904}", "\u{93a}", "\u{93b}", "\u{93d}", "\u{93e}", "\u{941}", "\u{949}", "\u{94e}", "\u{950}", "\u{955}", "\u{958}", "\u{962}", "\u{971}", "\u{972}", "\u{981}", "\u{982}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bd}", "\u{9be}", "\u{9c1}", "\u{9c7}", "\u{9cb}", "\u{9ce}", "\u{9d7}", "\u{9dc}", "\u{9df}", "\u{9e2}", "\u{9f0}", "\u{9fc}", "\u{a01}", "\u{a03}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a3e}", "\u{a41}", "\u{a47}", "\u{a4b}", "\u{a51}", "\u{a59}", "\u{a5e}", "\u{a70}", "\u{a72}", "\u{a75}", "\u{a81}", "\u{a83}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abd}", "\u{abe}", "\u{ac1}", "\u{ac7}", "\u{ac9}", "\u{acb}", "\u{ad0}", "\u{ae0}", "\u{ae2}", "\u{af9}", "\u{afa}", "\u{b01}", "\u{b02}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3d}", "\u{b3e}", "\u{b3f}", "\u{b40}", "\u{b41}", "\u{b47}", "\u{b4b}", "\u{b56}", "\u{b57}", "\u{b5c}", "\u{b5f}", "\u{b62}", "\u{b71}", "\u{b82}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bbe}", "\u{bc0}", "\u{bc1}", "\u{bc6}", "\u{bca}", "\u{bd0}", "\u{bd7}", "\u{c00}", "\u{c01}", "\u{c04}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3d}", "\u{c3e}", "\u{c41}", "\u{c46}", "\u{c4a}", "\u{c55}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c62}", "\u{c80}", "\u{c81}", "\u{c82}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbd}", "\u{cbe}", "\u{cbf}", "\u{cc0}", "\u{cc6}", "\u{cc7}", "\u{cca}", "\u{ccc}", "\u{cd5}", "\u{cdd}", "\u{ce0}", "\u{ce2}", "\u{cf1}", "\u{cf3}", "\u{d00}", "\u{d02}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3d}", "\u{d3e}", "\u{d41}", "\u{d46}", "\u{d4a}", "\u{d4e}", "\u{d54}", "\u{d57}", "\u{d5f}", "\u{d62}", "\u{d7a}", "\u{d81}", "\u{d82}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{dcf}", "\u{dd2}", "\u{dd6}", "\u{dd8}", "\u{df2}", "\u{e01}", "\u{e31}", "\u{e32}", "\u{e34}", "\u{e40}", "\u{e46}", "\u{e4d}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb1}", "\u{eb2}", "\u{eb4}", "\u{ebb}", "\u{ebd}", "\u{ec0}", "\u{ec6}", "\u{ecd}", "\u{edc}", "\u{f00}", "\u{f40}", "\u{f49}", "\u{f71}", "\u{f7f}", "\u{f80}", "\u{f88}", "\u{f8d}", "\u{f99}", "\u{1000}", "\u{102b}", "\u{102d}", "\u{1031}", "\u{1032}", "\u{1038}", "\u{103b}", "\u{103d}", "\u{103f}", "\u{1050}", "\u{1056}", "\u{1058}", "\u{105a}", "\u{105e}", "\u{1061}", "\u{1062}", "\u{1065}", "\u{1067}", "\u{106e}", "\u{1071}", "\u{1075}", "\u{1082}", "\u{1083}", "\u{1085}", "\u{1087}", "\u{108d}", "\u{108e}", "\u{108f}", "\u{109a}", "\u{109d}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fc}", "\u{10fd}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{1380}", "\u{13a0}", "\u{13f8}", "\u{1401}", "\u{166f}", "\u{1681}", "\u{16a0}", "\u{16ee}", "\u{16f1}", "\u{1700}", "\u{1712}", "\u{171f}", "\u{1732}", "\u{1740}", "\u{1752}", "\u{1760}", "\u{176e}", "\u{1772}", "\u{1780}", "\u{17b6}", "\u{17b7}", "\u{17be}", "\u{17c6}", "\u{17c7}", "\u{17d7}", "\u{17dc}", "\u{1820}", "\u{1843}", "\u{1844}", "\u{1880}", "\u{1885}", "\u{1887}", "\u{18a9}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1920}", "\u{1923}", "\u{1927}", "\u{1929}", "\u{1930}", "\u{1932}", "\u{1933}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{1a00}", "\u{1a17}", "\u{1a19}", "\u{1a1b}", "\u{1a20}", "\u{1a55}", "\u{1a56}", "\u{1a57}", "\u{1a58}", "\u{1a61}", "\u{1a62}", "\u{1a63}", "\u{1a65}", "\u{1a6d}", "\u{1a73}", "\u{1aa7}", "\u{1abf}", "\u{1acc}", "\u{1b00}", "\u{1b04}", "\u{1b05}", "\u{1b35}", "\u{1b36}", "\u{1b3b}", "\u{1b3c}", "\u{1b3d}", "\u{1b42}", "\u{1b43}", "\u{1b45}", "\u{1b80}", "\u{1b82}", "\u{1b83}", "\u{1ba1}", "\u{1ba2}", "\u{1ba6}", "\u{1ba8}", "\u{1bac}", "\u{1bae}", "\u{1bba}", "\u{1be7}", "\u{1be8}", "\u{1bea}", "\u{1bed}", "\u{1bee}", "\u{1bef}", "\u{1c00}", "\u{1c24}", "\u{1c2c}", "\u{1c34}", "\u{1c36}", "\u{1c4d}", "\u{1c5a}", "\u{1c78}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1ce9}", "\u{1cee}", "\u{1cf5}", "\u{1cfa}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1de7}", "\u{1e00}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{2102}", "\u{2107}", "\u{210a}", "\u{2115}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{212f}", "\u{2135}", "\u{2139}", "\u{213c}", "\u{2145}", "\u{214e}", "\u{2160}", "\u{2183}", "\u{2185}", "\u{24b6}", "\u{2c00}", "\u{2c7c}", "\u{2c7e}", "\u{2ceb}", "\u{2cf2}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{2d30}", "\u{2d6f}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{2de0}", "\u{2e2f}", "\u{3005}", "\u{3006}", "\u{3007}", "\u{3021}", "\u{3031}", "\u{3038}", "\u{303b}", "\u{303c}", "\u{3041}", "\u{309d}", "\u{309f}", "\u{30a1}", "\u{30fc}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{31a0}", "\u{31f0}", "\u{3400}", "\u{4e00}", "\u{a015}", "\u{a016}", "\u{a4d0}", "\u{a4f8}", "\u{a500}", "\u{a60c}", "\u{a610}", "\u{a62a}", "\u{a640}", "\u{a66e}", "\u{a674}", "\u{a67f}", "\u{a680}", "\u{a69c}", "\u{a69e}", "\u{a6a0}", "\u{a6e6}", "\u{a717}", "\u{a722}", "\u{a770}", "\u{a771}", "\u{a788}", "\u{a78b}", "\u{a78f}", "\u{a790}", "\u{a7d0}", "\u{a7d3}", "\u{a7d5}", "\u{a7f2}", "\u{a7f5}", "\u{a7f7}", "\u{a7f8}", "\u{a7fa}", "\u{a7fb}", "\u{a802}", "\u{a803}", "\u{a807}", "\u{a80b}", "\u{a80c}", "\u{a823}", "\u{a825}", "\u{a827}", "\u{a840}", "\u{a880}", "\u{a882}", "\u{a8b4}", "\u{a8c5}", "\u{a8f2}", "\u{a8fb}", "\u{a8fd}", "\u{a8ff}", "\u{a90a}", "\u{a926}", "\u{a930}", "\u{a947}", "\u{a952}", "\u{a960}", "\u{a980}", "\u{a983}", "\u{a984}", "\u{a9b4}", "\u{a9b6}", "\u{a9ba}", "\u{a9bc}", "\u{a9be}", "\u{a9cf}", "\u{a9e0}", "\u{a9e5}", "\u{a9e6}", "\u{a9e7}", "\u{a9fa}", "\u{aa00}", "\u{aa29}", "\u{aa2f}", "\u{aa31}", "\u{aa33}", "\u{aa35}", "\u{aa40}", "\u{aa43}", "\u{aa44}", "\u{aa4c}", "\u{aa4d}", "\u{aa60}", "\u{aa70}", "\u{aa71}", "\u{aa7a}", "\u{aa7b}", "\u{aa7c}", "\u{aa7d}", "\u{aa7e}", "\u{aab0}", "\u{aab1}", "\u{aab2}", "\u{aab5}", "\u{aab7}", "\u{aab9}", "\u{aabe}", "\u{aac0}", "\u{aac2}", "\u{aadb}", "\u{aadd}", "\u{aae0}", "\u{aaeb}", "\u{aaec}", "\u{aaee}", "\u{aaf2}", "\u{aaf3}", "\u{aaf5}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{ab30}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab70}", "\u{abc0}", "\u{abe3}", "\u{abe5}", "\u{abe6}", "\u{abe8}", "\u{abe9}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb00}", "\u{fb13}", "\u{fb1d}", "\u{fb1e}", "\u{fb1f}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fe70}", "\u{fe76}", "\u{ff21}", "\u{ff41}", "\u{ff66}", "\u{ff70}", "\u{ff71}", "\u{ff9e}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10140}", "\u{10280}", "\u{102a0}", "\u{10300}", "\u{1032d}", "\u{10341}", "\u{10342}", "\u{1034a}", "\u{10350}", "\u{10376}", "\u{10380}", "\u{103a0}", "\u{103c8}", "\u{103d1}", "\u{10400}", "\u{10450}", "\u{104b0}", "\u{104d8}", "\u{10500}", "\u{10530}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10860}", "\u{10880}", "\u{108e0}", "\u{108f4}", "\u{10900}", "\u{10920}", "\u{10980}", "\u{109be}", "\u{10a00}", "\u{10a01}", "\u{10a05}", "\u{10a0c}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a60}", "\u{10a80}", "\u{10ac0}", "\u{10ac9}", "\u{10b00}", "\u{10b40}", "\u{10b60}", "\u{10b80}", "\u{10c00}", "\u{10c80}", "\u{10cc0}", "\u{10d00}", "\u{10d24}", "\u{10e80}", "\u{10eab}", "\u{10eb0}", "\u{10f00}", "\u{10f27}", "\u{10f30}", "\u{10f70}", "\u{10fb0}", "\u{10fe0}", "\u{11000}", "\u{11001}", "\u{11002}", "\u{11003}", "\u{11038}", "\u{11071}", "\u{11073}", "\u{11075}", "\u{11080}", "\u{11082}", "\u{11083}", "\u{110b0}", "\u{110b3}", "\u{110b7}", "\u{110c2}", "\u{110d0}", "\u{11100}", "\u{11103}", "\u{11127}", "\u{1112c}", "\u{1112d}", "\u{11144}", "\u{11145}", "\u{11147}", "\u{11150}", "\u{11176}", "\u{11180}", "\u{11182}", "\u{11183}", "\u{111b3}", "\u{111b6}", "\u{111bf}", "\u{111c1}", "\u{111ce}", "\u{111cf}", "\u{111da}", "\u{111dc}", "\u{11200}", "\u{11213}", "\u{1122c}", "\u{1122f}", "\u{11232}", "\u{11234}", "\u{11237}", "\u{1123e}", "\u{1123f}", "\u{11241}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112b0}", "\u{112df}", "\u{112e0}", "\u{112e3}", "\u{11300}", "\u{11302}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133d}", "\u{1133e}", "\u{11340}", "\u{11341}", "\u{11347}", "\u{1134b}", "\u{11350}", "\u{11357}", "\u{1135d}", "\u{11362}", "\u{11400}", "\u{11435}", "\u{11438}", "\u{11440}", "\u{11443}", "\u{11445}", "\u{11447}", "\u{1145f}", "\u{11480}", "\u{114b0}", "\u{114b3}", "\u{114b9}", "\u{114ba}", "\u{114bb}", "\u{114bf}", "\u{114c1}", "\u{114c4}", "\u{114c7}", "\u{11580}", "\u{115af}", "\u{115b2}", "\u{115b8}", "\u{115bc}", "\u{115be}", "\u{115d8}", "\u{115dc}", "\u{11600}", "\u{11630}", "\u{11633}", "\u{1163b}", "\u{1163d}", "\u{1163e}", "\u{11640}", "\u{11644}", "\u{11680}", "\u{116ab}", "\u{116ac}", "\u{116ad}", "\u{116ae}", "\u{116b0}", "\u{116b8}", "\u{11700}", "\u{1171d}", "\u{11720}", "\u{11722}", "\u{11726}", "\u{11727}", "\u{11740}", "\u{11800}", "\u{1182c}", "\u{1182f}", "\u{11838}", "\u{118a0}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{11930}", "\u{11937}", "\u{1193b}", "\u{1193f}", "\u{11940}", "\u{11941}", "\u{11942}", "\u{119a0}", "\u{119aa}", "\u{119d1}", "\u{119d4}", "\u{119da}", "\u{119dc}", "\u{119e1}", "\u{119e3}", "\u{119e4}", "\u{11a00}", "\u{11a01}", "\u{11a0b}", "\u{11a35}", "\u{11a39}", "\u{11a3a}", "\u{11a3b}", "\u{11a50}", "\u{11a51}", "\u{11a57}", "\u{11a59}", "\u{11a5c}", "\u{11a8a}", "\u{11a97}", "\u{11a9d}", "\u{11ab0}", "\u{11c00}", "\u{11c0a}", "\u{11c2f}", "\u{11c30}", "\u{11c38}", "\u{11c3e}", "\u{11c40}", "\u{11c72}", "\u{11c92}", "\u{11ca9}", "\u{11caa}", "\u{11cb1}", "\u{11cb2}", "\u{11cb4}", "\u{11cb5}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d31}", "\u{11d3a}", "\u{11d3c}", "\u{11d3f}", "\u{11d43}", "\u{11d46}", "\u{11d47}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d8a}", "\u{11d90}", "\u{11d93}", "\u{11d95}", "\u{11d96}", "\u{11d98}", "\u{11ee0}", "\u{11ef3}", "\u{11ef5}", "\u{11f00}", "\u{11f02}", "\u{11f03}", "\u{11f04}", "\u{11f12}", "\u{11f34}", "\u{11f36}", "\u{11f3e}", "\u{11f40}", "\u{11fb0}", "\u{12000}", "\u{12400}", "\u{12480}", "\u{12f90}", "\u{13000}", "\u{13441}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a70}", "\u{16ad0}", "\u{16b00}", "\u{16b40}", "\u{16b63}", "\u{16b7d}", "\u{16e40}", "\u{16f00}", "\u{16f4f}", "\u{16f50}", "\u{16f51}", "\u{16f8f}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{16ff0}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1bc9e}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1df00}", "\u{1df0a}", "\u{1df0b}", "\u{1df25}", "\u{1e000}", "\u{1e008}", "\u{1e01b}", "\u{1e023}", "\u{1e026}", "\u{1e030}", "\u{1e08f}", "\u{1e100}", "\u{1e137}", "\u{1e14e}", "\u{1e290}", "\u{1e2c0}", "\u{1e4d0}", "\u{1e4eb}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1e900}", "\u{1e947}", "\u{1e94b}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{1f130}", "\u{1f150}", "\u{1f170}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", ]; const REGEXES: [&str; 2] = ["^\\p{Alphabetic}+$", "^\\p{Alpha}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_caseignorable() { test_with_configs(unicode_escape_property_binary_caseignorable_tc) } fn unicode_escape_property_binary_caseignorable_tc(tc: TestConfig) { const CODE_POINTS: [&str; 491] = [ "\u{27}", "\u{2e}", "\u{3a}", "\u{5e}", "\u{60}", "\u{a8}", "\u{ad}", "\u{af}", "\u{b4}", "\u{b7}", "\u{b8}", "\u{2b0}", "\u{2c2}", "\u{2c6}", "\u{2d2}", "\u{2e0}", "\u{2e5}", "\u{2ec}", "\u{2ed}", "\u{2ee}", "\u{2ef}", "\u{300}", "\u{374}", "\u{375}", "\u{37a}", "\u{384}", "\u{387}", "\u{483}", "\u{488}", "\u{559}", "\u{55f}", "\u{591}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{5c7}", "\u{5f4}", "\u{600}", "\u{610}", "\u{61c}", "\u{640}", "\u{64b}", "\u{670}", "\u{6d6}", "\u{6dd}", "\u{6df}", "\u{6e5}", "\u{6e7}", "\u{6ea}", "\u{70f}", "\u{711}", "\u{730}", "\u{7a6}", "\u{7eb}", "\u{7f4}", "\u{7fa}", "\u{7fd}", "\u{816}", "\u{81a}", "\u{81b}", "\u{824}", "\u{825}", "\u{828}", "\u{829}", "\u{859}", "\u{888}", "\u{890}", "\u{898}", "\u{8c9}", "\u{8ca}", "\u{8e2}", "\u{8e3}", "\u{93a}", "\u{93c}", "\u{941}", "\u{94d}", "\u{951}", "\u{962}", "\u{971}", "\u{981}", "\u{9bc}", "\u{9c1}", "\u{9cd}", "\u{9e2}", "\u{9fe}", "\u{a01}", "\u{a3c}", "\u{a41}", "\u{a47}", "\u{a4b}", "\u{a51}", "\u{a70}", "\u{a75}", "\u{a81}", "\u{abc}", "\u{ac1}", "\u{ac7}", "\u{acd}", "\u{ae2}", "\u{afa}", "\u{b01}", "\u{b3c}", "\u{b3f}", "\u{b41}", "\u{b4d}", "\u{b55}", "\u{b62}", "\u{b82}", "\u{bc0}", "\u{bcd}", "\u{c00}", "\u{c04}", "\u{c3c}", "\u{c3e}", "\u{c46}", "\u{c4a}", "\u{c55}", "\u{c62}", "\u{c81}", "\u{cbc}", "\u{cbf}", "\u{cc6}", "\u{ccc}", "\u{ce2}", "\u{d00}", "\u{d3b}", "\u{d41}", "\u{d4d}", "\u{d62}", "\u{d81}", "\u{dca}", "\u{dd2}", "\u{dd6}", "\u{e31}", "\u{e34}", "\u{e46}", "\u{e47}", "\u{eb1}", "\u{eb4}", "\u{ec6}", "\u{ec8}", "\u{f18}", "\u{f35}", "\u{f37}", "\u{f39}", "\u{f71}", "\u{f80}", "\u{f86}", "\u{f8d}", "\u{f99}", "\u{fc6}", "\u{102d}", "\u{1032}", "\u{1039}", "\u{103d}", "\u{1058}", "\u{105e}", "\u{1071}", "\u{1082}", "\u{1085}", "\u{108d}", "\u{109d}", "\u{10fc}", "\u{135d}", "\u{1712}", "\u{1732}", "\u{1752}", "\u{1772}", "\u{17b4}", "\u{17b7}", "\u{17c6}", "\u{17c9}", "\u{17d7}", "\u{17dd}", "\u{180b}", "\u{180e}", "\u{180f}", "\u{1843}", "\u{1885}", "\u{18a9}", "\u{1920}", "\u{1927}", "\u{1932}", "\u{1939}", "\u{1a17}", "\u{1a1b}", "\u{1a56}", "\u{1a58}", "\u{1a60}", "\u{1a62}", "\u{1a65}", "\u{1a73}", "\u{1a7f}", "\u{1aa7}", "\u{1ab0}", "\u{1abe}", "\u{1abf}", "\u{1b00}", "\u{1b34}", "\u{1b36}", "\u{1b3c}", "\u{1b42}", "\u{1b6b}", "\u{1b80}", "\u{1ba2}", "\u{1ba8}", "\u{1bab}", "\u{1be6}", "\u{1be8}", "\u{1bed}", "\u{1bef}", "\u{1c2c}", "\u{1c36}", "\u{1c78}", "\u{1cd0}", "\u{1cd4}", "\u{1ce2}", "\u{1ced}", "\u{1cf4}", "\u{1cf8}", "\u{1d2c}", "\u{1d78}", "\u{1d9b}", "\u{1dc0}", "\u{1fbd}", "\u{1fbf}", "\u{1fcd}", "\u{1fdd}", "\u{1fed}", "\u{1ffd}", "\u{200b}", "\u{2018}", "\u{2019}", "\u{2024}", "\u{2027}", "\u{202a}", "\u{2060}", "\u{2066}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{20d0}", "\u{20dd}", "\u{20e1}", "\u{20e2}", "\u{20e5}", "\u{2c7c}", "\u{2cef}", "\u{2d6f}", "\u{2d7f}", "\u{2de0}", "\u{2e2f}", "\u{3005}", "\u{302a}", "\u{3031}", "\u{303b}", "\u{3099}", "\u{309b}", "\u{309d}", "\u{30fc}", "\u{a015}", "\u{a4f8}", "\u{a60c}", "\u{a66f}", "\u{a670}", "\u{a674}", "\u{a67f}", "\u{a69c}", "\u{a69e}", "\u{a6f0}", "\u{a700}", "\u{a717}", "\u{a720}", "\u{a770}", "\u{a788}", "\u{a789}", "\u{a7f2}", "\u{a7f8}", "\u{a802}", "\u{a806}", "\u{a80b}", "\u{a825}", "\u{a82c}", "\u{a8c4}", "\u{a8e0}", "\u{a8ff}", "\u{a926}", "\u{a947}", "\u{a980}", "\u{a9b3}", "\u{a9b6}", "\u{a9bc}", "\u{a9cf}", "\u{a9e5}", "\u{a9e6}", "\u{aa29}", "\u{aa31}", "\u{aa35}", "\u{aa43}", "\u{aa4c}", "\u{aa70}", "\u{aa7c}", "\u{aab0}", "\u{aab2}", "\u{aab7}", "\u{aabe}", "\u{aac1}", "\u{aadd}", "\u{aaec}", "\u{aaf3}", "\u{aaf6}", "\u{ab5b}", "\u{ab5c}", "\u{ab69}", "\u{ab6a}", "\u{abe5}", "\u{abe8}", "\u{abed}", "\u{fb1e}", "\u{fbb2}", "\u{fe00}", "\u{fe13}", "\u{fe20}", "\u{fe52}", "\u{fe55}", "\u{feff}", "\u{ff07}", "\u{ff0e}", "\u{ff1a}", "\u{ff3e}", "\u{ff40}", "\u{ff70}", "\u{ff9e}", "\u{ffe3}", "\u{fff9}", "\u{101fd}", "\u{102e0}", "\u{10376}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10a01}", "\u{10a05}", "\u{10a0c}", "\u{10a38}", "\u{10a3f}", "\u{10ae5}", "\u{10d24}", "\u{10eab}", "\u{10efd}", "\u{10f46}", "\u{10f82}", "\u{11001}", "\u{11038}", "\u{11070}", "\u{11073}", "\u{1107f}", "\u{110b3}", "\u{110b9}", "\u{110bd}", "\u{110c2}", "\u{110cd}", "\u{11100}", "\u{11127}", "\u{1112d}", "\u{11173}", "\u{11180}", "\u{111b6}", "\u{111c9}", "\u{111cf}", "\u{1122f}", "\u{11234}", "\u{11236}", "\u{1123e}", "\u{11241}", "\u{112df}", "\u{112e3}", "\u{11300}", "\u{1133b}", "\u{11340}", "\u{11366}", "\u{11370}", "\u{11438}", "\u{11442}", "\u{11446}", "\u{1145e}", "\u{114b3}", "\u{114ba}", "\u{114bf}", "\u{114c2}", "\u{115b2}", "\u{115bc}", "\u{115bf}", "\u{115dc}", "\u{11633}", "\u{1163d}", "\u{1163f}", "\u{116ab}", "\u{116ad}", "\u{116b0}", "\u{116b7}", "\u{1171d}", "\u{11722}", "\u{11727}", "\u{1182f}", "\u{11839}", "\u{1193b}", "\u{1193e}", "\u{11943}", "\u{119d4}", "\u{119da}", "\u{119e0}", "\u{11a01}", "\u{11a33}", "\u{11a3b}", "\u{11a47}", "\u{11a51}", "\u{11a59}", "\u{11a8a}", "\u{11a98}", "\u{11c30}", "\u{11c38}", "\u{11c3f}", "\u{11c92}", "\u{11caa}", "\u{11cb2}", "\u{11cb5}", "\u{11d31}", "\u{11d3a}", "\u{11d3c}", "\u{11d3f}", "\u{11d47}", "\u{11d90}", "\u{11d95}", "\u{11d97}", "\u{11ef3}", "\u{11f00}", "\u{11f36}", "\u{11f40}", "\u{11f42}", "\u{13430}", "\u{13440}", "\u{13447}", "\u{16af0}", "\u{16b30}", "\u{16b40}", "\u{16f4f}", "\u{16f8f}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{16fe4}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1bc9d}", "\u{1bca0}", "\u{1cf00}", "\u{1cf30}", "\u{1d167}", "\u{1d173}", "\u{1d17b}", "\u{1d185}", "\u{1d1aa}", "\u{1d242}", "\u{1da00}", "\u{1da3b}", "\u{1da75}", "\u{1da84}", "\u{1da9b}", "\u{1daa1}", "\u{1e000}", "\u{1e008}", "\u{1e01b}", "\u{1e023}", "\u{1e026}", "\u{1e030}", "\u{1e08f}", "\u{1e130}", "\u{1e137}", "\u{1e2ae}", "\u{1e2ec}", "\u{1e4eb}", "\u{1e4ec}", "\u{1e8d0}", "\u{1e944}", "\u{1e94b}", "\u{1f3fb}", "\u{e0001}", "\u{e0020}", "\u{e0100}", ]; const REGEXES: [&str; 2] = ["^\\p{Case_Ignorable}+$", "^\\p{CI}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_cased() { test_with_configs(unicode_escape_property_binary_cased_tc) } fn unicode_escape_property_binary_cased_tc(tc: TestConfig) { const CODE_POINTS: [&str; 174] = [ "\u{41}", "\u{61}", "\u{aa}", "\u{b5}", "\u{ba}", "\u{c0}", "\u{d8}", "\u{f8}", "\u{1bc}", "\u{1c4}", "\u{295}", "\u{2b0}", "\u{2c0}", "\u{2e0}", "\u{345}", "\u{370}", "\u{376}", "\u{37a}", "\u{37b}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3f7}", "\u{48a}", "\u{531}", "\u{560}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fc}", "\u{10fd}", "\u{13a0}", "\u{13f8}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1e00}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{2102}", "\u{2107}", "\u{210a}", "\u{2115}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{212f}", "\u{2139}", "\u{213c}", "\u{2145}", "\u{214e}", "\u{2160}", "\u{2183}", "\u{24b6}", "\u{2c00}", "\u{2c7c}", "\u{2c7e}", "\u{2ceb}", "\u{2cf2}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a640}", "\u{a680}", "\u{a69c}", "\u{a722}", "\u{a770}", "\u{a771}", "\u{a78b}", "\u{a790}", "\u{a7d0}", "\u{a7d3}", "\u{a7d5}", "\u{a7f2}", "\u{a7f5}", "\u{a7f8}", "\u{a7fa}", "\u{ab30}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff21}", "\u{ff41}", "\u{10400}", "\u{104b0}", "\u{104d8}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10780}", "\u{10783}", "\u{10787}", "\u{107b2}", "\u{10c80}", "\u{10cc0}", "\u{118a0}", "\u{16e40}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1df00}", "\u{1df0b}", "\u{1df25}", "\u{1e030}", "\u{1e900}", "\u{1f130}", "\u{1f150}", "\u{1f170}", ]; const REGEXES: [&str; 1] = ["^\\p{Cased}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_changeswhencasefolded() { test_with_configs(unicode_escape_property_binary_changeswhencasefolded_tc) } fn unicode_escape_property_binary_changeswhencasefolded_tc(tc: TestConfig) { const CODE_POINTS: [&str; 622] = [ "\u{41}", "\u{b5}", "\u{c0}", "\u{d8}", "\u{100}", "\u{102}", "\u{104}", "\u{106}", "\u{108}", "\u{10a}", "\u{10c}", "\u{10e}", "\u{110}", "\u{112}", "\u{114}", "\u{116}", "\u{118}", "\u{11a}", "\u{11c}", "\u{11e}", "\u{120}", "\u{122}", "\u{124}", "\u{126}", "\u{128}", "\u{12a}", "\u{12c}", "\u{12e}", "\u{130}", "\u{132}", "\u{134}", "\u{136}", "\u{139}", "\u{13b}", "\u{13d}", "\u{13f}", "\u{141}", "\u{143}", "\u{145}", "\u{147}", "\u{149}", "\u{14c}", "\u{14e}", "\u{150}", "\u{152}", "\u{154}", "\u{156}", "\u{158}", "\u{15a}", "\u{15c}", "\u{15e}", "\u{160}", "\u{162}", "\u{164}", "\u{166}", "\u{168}", "\u{16a}", "\u{16c}", "\u{16e}", "\u{170}", "\u{172}", "\u{174}", "\u{176}", "\u{178}", "\u{17b}", "\u{17d}", "\u{17f}", "\u{181}", "\u{184}", "\u{186}", "\u{189}", "\u{18e}", "\u{193}", "\u{196}", "\u{19c}", "\u{19f}", "\u{1a2}", "\u{1a4}", "\u{1a6}", "\u{1a9}", "\u{1ac}", "\u{1ae}", "\u{1b1}", "\u{1b5}", "\u{1b7}", "\u{1bc}", "\u{1c4}", "\u{1c7}", "\u{1ca}", "\u{1cd}", "\u{1cf}", "\u{1d1}", "\u{1d3}", "\u{1d5}", "\u{1d7}", "\u{1d9}", "\u{1db}", "\u{1de}", "\u{1e0}", "\u{1e2}", "\u{1e4}", "\u{1e6}", "\u{1e8}", "\u{1ea}", "\u{1ec}", "\u{1ee}", "\u{1f1}", "\u{1f4}", "\u{1f6}", "\u{1fa}", "\u{1fc}", "\u{1fe}", "\u{200}", "\u{202}", "\u{204}", "\u{206}", "\u{208}", "\u{20a}", "\u{20c}", "\u{20e}", "\u{210}", "\u{212}", "\u{214}", "\u{216}", "\u{218}", "\u{21a}", "\u{21c}", "\u{21e}", "\u{220}", "\u{222}", "\u{224}", "\u{226}", "\u{228}", "\u{22a}", "\u{22c}", "\u{22e}", "\u{230}", "\u{232}", "\u{23a}", "\u{23d}", "\u{241}", "\u{243}", "\u{248}", "\u{24a}", "\u{24c}", "\u{24e}", "\u{345}", "\u{370}", "\u{372}", "\u{376}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{391}", "\u{3a3}", "\u{3c2}", "\u{3cf}", "\u{3d5}", "\u{3d8}", "\u{3da}", "\u{3dc}", "\u{3de}", "\u{3e0}", "\u{3e2}", "\u{3e4}", "\u{3e6}", "\u{3e8}", "\u{3ea}", "\u{3ec}", "\u{3ee}", "\u{3f0}", "\u{3f4}", "\u{3f7}", "\u{3f9}", "\u{3fd}", "\u{460}", "\u{462}", "\u{464}", "\u{466}", "\u{468}", "\u{46a}", "\u{46c}", "\u{46e}", "\u{470}", "\u{472}", "\u{474}", "\u{476}", "\u{478}", "\u{47a}", "\u{47c}", "\u{47e}", "\u{480}", "\u{48a}", "\u{48c}", "\u{48e}", "\u{490}", "\u{492}", "\u{494}", "\u{496}", "\u{498}", "\u{49a}", "\u{49c}", "\u{49e}", "\u{4a0}", "\u{4a2}", "\u{4a4}", "\u{4a6}", "\u{4a8}", "\u{4aa}", "\u{4ac}", "\u{4ae}", "\u{4b0}", "\u{4b2}", "\u{4b4}", "\u{4b6}", "\u{4b8}", "\u{4ba}", "\u{4bc}", "\u{4be}", "\u{4c0}", "\u{4c3}", "\u{4c5}", "\u{4c7}", "\u{4c9}", "\u{4cb}", "\u{4cd}", "\u{4d0}", "\u{4d2}", "\u{4d4}", "\u{4d6}", "\u{4d8}", "\u{4da}", "\u{4dc}", "\u{4de}", "\u{4e0}", "\u{4e2}", "\u{4e4}", "\u{4e6}", "\u{4e8}", "\u{4ea}", "\u{4ec}", "\u{4ee}", "\u{4f0}", "\u{4f2}", "\u{4f4}", "\u{4f6}", "\u{4f8}", "\u{4fa}", "\u{4fc}", "\u{4fe}", "\u{500}", "\u{502}", "\u{504}", "\u{506}", "\u{508}", "\u{50a}", "\u{50c}", "\u{50e}", "\u{510}", "\u{512}", "\u{514}", "\u{516}", "\u{518}", "\u{51a}", "\u{51c}", "\u{51e}", "\u{520}", "\u{522}", "\u{524}", "\u{526}", "\u{528}", "\u{52a}", "\u{52c}", "\u{52e}", "\u{531}", "\u{587}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{13f8}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1e00}", "\u{1e02}", "\u{1e04}", "\u{1e06}", "\u{1e08}", "\u{1e0a}", "\u{1e0c}", "\u{1e0e}", "\u{1e10}", "\u{1e12}", "\u{1e14}", "\u{1e16}", "\u{1e18}", "\u{1e1a}", "\u{1e1c}", "\u{1e1e}", "\u{1e20}", "\u{1e22}", "\u{1e24}", "\u{1e26}", "\u{1e28}", "\u{1e2a}", "\u{1e2c}", "\u{1e2e}", "\u{1e30}", "\u{1e32}", "\u{1e34}", "\u{1e36}", "\u{1e38}", "\u{1e3a}", "\u{1e3c}", "\u{1e3e}", "\u{1e40}", "\u{1e42}", "\u{1e44}", "\u{1e46}", "\u{1e48}", "\u{1e4a}", "\u{1e4c}", "\u{1e4e}", "\u{1e50}", "\u{1e52}", "\u{1e54}", "\u{1e56}", "\u{1e58}", "\u{1e5a}", "\u{1e5c}", "\u{1e5e}", "\u{1e60}", "\u{1e62}", "\u{1e64}", "\u{1e66}", "\u{1e68}", "\u{1e6a}", "\u{1e6c}", "\u{1e6e}", "\u{1e70}", "\u{1e72}", "\u{1e74}", "\u{1e76}", "\u{1e78}", "\u{1e7a}", "\u{1e7c}", "\u{1e7e}", "\u{1e80}", "\u{1e82}", "\u{1e84}", "\u{1e86}", "\u{1e88}", "\u{1e8a}", "\u{1e8c}", "\u{1e8e}", "\u{1e90}", "\u{1e92}", "\u{1e94}", "\u{1e9a}", "\u{1e9e}", "\u{1ea0}", "\u{1ea2}", "\u{1ea4}", "\u{1ea6}", "\u{1ea8}", "\u{1eaa}", "\u{1eac}", "\u{1eae}", "\u{1eb0}", "\u{1eb2}", "\u{1eb4}", "\u{1eb6}", "\u{1eb8}", "\u{1eba}", "\u{1ebc}", "\u{1ebe}", "\u{1ec0}", "\u{1ec2}", "\u{1ec4}", "\u{1ec6}", "\u{1ec8}", "\u{1eca}", "\u{1ecc}", "\u{1ece}", "\u{1ed0}", "\u{1ed2}", "\u{1ed4}", "\u{1ed6}", "\u{1ed8}", "\u{1eda}", "\u{1edc}", "\u{1ede}", "\u{1ee0}", "\u{1ee2}", "\u{1ee4}", "\u{1ee6}", "\u{1ee8}", "\u{1eea}", "\u{1eec}", "\u{1eee}", "\u{1ef0}", "\u{1ef2}", "\u{1ef4}", "\u{1ef6}", "\u{1ef8}", "\u{1efa}", "\u{1efc}", "\u{1efe}", "\u{1f08}", "\u{1f18}", "\u{1f28}", "\u{1f38}", "\u{1f48}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f68}", "\u{1f80}", "\u{1fb2}", "\u{1fb7}", "\u{1fc2}", "\u{1fc7}", "\u{1fd8}", "\u{1fe8}", "\u{1ff2}", "\u{1ff7}", "\u{2126}", "\u{212a}", "\u{2132}", "\u{2160}", "\u{2183}", "\u{24b6}", "\u{2c00}", "\u{2c60}", "\u{2c62}", "\u{2c67}", "\u{2c69}", "\u{2c6b}", "\u{2c6d}", "\u{2c72}", "\u{2c75}", "\u{2c7e}", "\u{2c82}", "\u{2c84}", "\u{2c86}", "\u{2c88}", "\u{2c8a}", "\u{2c8c}", "\u{2c8e}", "\u{2c90}", "\u{2c92}", "\u{2c94}", "\u{2c96}", "\u{2c98}", "\u{2c9a}", "\u{2c9c}", "\u{2c9e}", "\u{2ca0}", "\u{2ca2}", "\u{2ca4}", "\u{2ca6}", "\u{2ca8}", "\u{2caa}", "\u{2cac}", "\u{2cae}", "\u{2cb0}", "\u{2cb2}", "\u{2cb4}", "\u{2cb6}", "\u{2cb8}", "\u{2cba}", "\u{2cbc}", "\u{2cbe}", "\u{2cc0}", "\u{2cc2}", "\u{2cc4}", "\u{2cc6}", "\u{2cc8}", "\u{2cca}", "\u{2ccc}", "\u{2cce}", "\u{2cd0}", "\u{2cd2}", "\u{2cd4}", "\u{2cd6}", "\u{2cd8}", "\u{2cda}", "\u{2cdc}", "\u{2cde}", "\u{2ce0}", "\u{2ce2}", "\u{2ceb}", "\u{2ced}", "\u{2cf2}", "\u{a640}", "\u{a642}", "\u{a644}", "\u{a646}", "\u{a648}", "\u{a64a}", "\u{a64c}", "\u{a64e}", "\u{a650}", "\u{a652}", "\u{a654}", "\u{a656}", "\u{a658}", "\u{a65a}", "\u{a65c}", "\u{a65e}", "\u{a660}", "\u{a662}", "\u{a664}", "\u{a666}", "\u{a668}", "\u{a66a}", "\u{a66c}", "\u{a680}", "\u{a682}", "\u{a684}", "\u{a686}", "\u{a688}", "\u{a68a}", "\u{a68c}", "\u{a68e}", "\u{a690}", "\u{a692}", "\u{a694}", "\u{a696}", "\u{a698}", "\u{a69a}", "\u{a722}", "\u{a724}", "\u{a726}", "\u{a728}", "\u{a72a}", "\u{a72c}", "\u{a72e}", "\u{a732}", "\u{a734}", "\u{a736}", "\u{a738}", "\u{a73a}", "\u{a73c}", "\u{a73e}", "\u{a740}", "\u{a742}", "\u{a744}", "\u{a746}", "\u{a748}", "\u{a74a}", "\u{a74c}", "\u{a74e}", "\u{a750}", "\u{a752}", "\u{a754}", "\u{a756}", "\u{a758}", "\u{a75a}", "\u{a75c}", "\u{a75e}", "\u{a760}", "\u{a762}", "\u{a764}", "\u{a766}", "\u{a768}", "\u{a76a}", "\u{a76c}", "\u{a76e}", "\u{a779}", "\u{a77b}", "\u{a77d}", "\u{a780}", "\u{a782}", "\u{a784}", "\u{a786}", "\u{a78b}", "\u{a78d}", "\u{a790}", "\u{a792}", "\u{a796}", "\u{a798}", "\u{a79a}", "\u{a79c}", "\u{a79e}", "\u{a7a0}", "\u{a7a2}", "\u{a7a4}", "\u{a7a6}", "\u{a7a8}", "\u{a7aa}", "\u{a7b0}", "\u{a7b6}", "\u{a7b8}", "\u{a7ba}", "\u{a7bc}", "\u{a7be}", "\u{a7c0}", "\u{a7c2}", "\u{a7c4}", "\u{a7c9}", "\u{a7d0}", "\u{a7d6}", "\u{a7d8}", "\u{a7f5}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff21}", "\u{10400}", "\u{104b0}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10c80}", "\u{118a0}", "\u{16e40}", "\u{1e900}", ]; const REGEXES: [&str; 2] = ["^\\p{Changes_When_Casefolded}+$", "^\\p{CWCF}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_changeswhencasemapped() { test_with_configs(unicode_escape_property_binary_changeswhencasemapped_tc) } fn unicode_escape_property_binary_changeswhencasemapped_tc(tc: TestConfig) { const CODE_POINTS: [&str; 131] = [ "\u{41}", "\u{61}", "\u{b5}", "\u{c0}", "\u{d8}", "\u{f8}", "\u{139}", "\u{18e}", "\u{19c}", "\u{1ac}", "\u{1bc}", "\u{1bf}", "\u{1c4}", "\u{222}", "\u{23a}", "\u{256}", "\u{259}", "\u{25b}", "\u{260}", "\u{263}", "\u{265}", "\u{268}", "\u{26f}", "\u{271}", "\u{275}", "\u{27d}", "\u{280}", "\u{282}", "\u{287}", "\u{292}", "\u{29d}", "\u{345}", "\u{370}", "\u{376}", "\u{37b}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3d5}", "\u{3f7}", "\u{3fd}", "\u{48a}", "\u{531}", "\u{561}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fd}", "\u{13a0}", "\u{13f8}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1d79}", "\u{1d7d}", "\u{1d8e}", "\u{1e00}", "\u{1e9e}", "\u{1ea0}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{2126}", "\u{212a}", "\u{2132}", "\u{214e}", "\u{2160}", "\u{2183}", "\u{24b6}", "\u{2c00}", "\u{2c72}", "\u{2c75}", "\u{2c7e}", "\u{2ceb}", "\u{2cf2}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a640}", "\u{a680}", "\u{a722}", "\u{a732}", "\u{a779}", "\u{a78b}", "\u{a790}", "\u{a796}", "\u{a7b0}", "\u{a7d0}", "\u{a7d6}", "\u{a7f5}", "\u{ab53}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff21}", "\u{ff41}", "\u{10400}", "\u{104b0}", "\u{104d8}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10c80}", "\u{10cc0}", "\u{118a0}", "\u{16e40}", "\u{1e900}", ]; const REGEXES: [&str; 2] = ["^\\p{Changes_When_Casemapped}+$", "^\\p{CWCM}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_changeswhenlowercased() { test_with_configs(unicode_escape_property_binary_changeswhenlowercased_tc) } fn unicode_escape_property_binary_changeswhenlowercased_tc(tc: TestConfig) { const CODE_POINTS: [&str; 609] = [ "\u{41}", "\u{c0}", "\u{d8}", "\u{100}", "\u{102}", "\u{104}", "\u{106}", "\u{108}", "\u{10a}", "\u{10c}", "\u{10e}", "\u{110}", "\u{112}", "\u{114}", "\u{116}", "\u{118}", "\u{11a}", "\u{11c}", "\u{11e}", "\u{120}", "\u{122}", "\u{124}", "\u{126}", "\u{128}", "\u{12a}", "\u{12c}", "\u{12e}", "\u{130}", "\u{132}", "\u{134}", "\u{136}", "\u{139}", "\u{13b}", "\u{13d}", "\u{13f}", "\u{141}", "\u{143}", "\u{145}", "\u{147}", "\u{14a}", "\u{14c}", "\u{14e}", "\u{150}", "\u{152}", "\u{154}", "\u{156}", "\u{158}", "\u{15a}", "\u{15c}", "\u{15e}", "\u{160}", "\u{162}", "\u{164}", "\u{166}", "\u{168}", "\u{16a}", "\u{16c}", "\u{16e}", "\u{170}", "\u{172}", "\u{174}", "\u{176}", "\u{178}", "\u{17b}", "\u{17d}", "\u{181}", "\u{184}", "\u{186}", "\u{189}", "\u{18e}", "\u{193}", "\u{196}", "\u{19c}", "\u{19f}", "\u{1a2}", "\u{1a4}", "\u{1a6}", "\u{1a9}", "\u{1ac}", "\u{1ae}", "\u{1b1}", "\u{1b5}", "\u{1b7}", "\u{1bc}", "\u{1c4}", "\u{1c7}", "\u{1ca}", "\u{1cd}", "\u{1cf}", "\u{1d1}", "\u{1d3}", "\u{1d5}", "\u{1d7}", "\u{1d9}", "\u{1db}", "\u{1de}", "\u{1e0}", "\u{1e2}", "\u{1e4}", "\u{1e6}", "\u{1e8}", "\u{1ea}", "\u{1ec}", "\u{1ee}", "\u{1f1}", "\u{1f4}", "\u{1f6}", "\u{1fa}", "\u{1fc}", "\u{1fe}", "\u{200}", "\u{202}", "\u{204}", "\u{206}", "\u{208}", "\u{20a}", "\u{20c}", "\u{20e}", "\u{210}", "\u{212}", "\u{214}", "\u{216}", "\u{218}", "\u{21a}", "\u{21c}", "\u{21e}", "\u{220}", "\u{222}", "\u{224}", "\u{226}", "\u{228}", "\u{22a}", "\u{22c}", "\u{22e}", "\u{230}", "\u{232}", "\u{23a}", "\u{23d}", "\u{241}", "\u{243}", "\u{248}", "\u{24a}", "\u{24c}", "\u{24e}", "\u{370}", "\u{372}", "\u{376}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{391}", "\u{3a3}", "\u{3cf}", "\u{3d8}", "\u{3da}", "\u{3dc}", "\u{3de}", "\u{3e0}", "\u{3e2}", "\u{3e4}", "\u{3e6}", "\u{3e8}", "\u{3ea}", "\u{3ec}", "\u{3ee}", "\u{3f4}", "\u{3f7}", "\u{3f9}", "\u{3fd}", "\u{460}", "\u{462}", "\u{464}", "\u{466}", "\u{468}", "\u{46a}", "\u{46c}", "\u{46e}", "\u{470}", "\u{472}", "\u{474}", "\u{476}", "\u{478}", "\u{47a}", "\u{47c}", "\u{47e}", "\u{480}", "\u{48a}", "\u{48c}", "\u{48e}", "\u{490}", "\u{492}", "\u{494}", "\u{496}", "\u{498}", "\u{49a}", "\u{49c}", "\u{49e}", "\u{4a0}", "\u{4a2}", "\u{4a4}", "\u{4a6}", "\u{4a8}", "\u{4aa}", "\u{4ac}", "\u{4ae}", "\u{4b0}", "\u{4b2}", "\u{4b4}", "\u{4b6}", "\u{4b8}", "\u{4ba}", "\u{4bc}", "\u{4be}", "\u{4c0}", "\u{4c3}", "\u{4c5}", "\u{4c7}", "\u{4c9}", "\u{4cb}", "\u{4cd}", "\u{4d0}", "\u{4d2}", "\u{4d4}", "\u{4d6}", "\u{4d8}", "\u{4da}", "\u{4dc}", "\u{4de}", "\u{4e0}", "\u{4e2}", "\u{4e4}", "\u{4e6}", "\u{4e8}", "\u{4ea}", "\u{4ec}", "\u{4ee}", "\u{4f0}", "\u{4f2}", "\u{4f4}", "\u{4f6}", "\u{4f8}", "\u{4fa}", "\u{4fc}", "\u{4fe}", "\u{500}", "\u{502}", "\u{504}", "\u{506}", "\u{508}", "\u{50a}", "\u{50c}", "\u{50e}", "\u{510}", "\u{512}", "\u{514}", "\u{516}", "\u{518}", "\u{51a}", "\u{51c}", "\u{51e}", "\u{520}", "\u{522}", "\u{524}", "\u{526}", "\u{528}", "\u{52a}", "\u{52c}", "\u{52e}", "\u{531}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{13a0}", "\u{1c90}", "\u{1cbd}", "\u{1e00}", "\u{1e02}", "\u{1e04}", "\u{1e06}", "\u{1e08}", "\u{1e0a}", "\u{1e0c}", "\u{1e0e}", "\u{1e10}", "\u{1e12}", "\u{1e14}", "\u{1e16}", "\u{1e18}", "\u{1e1a}", "\u{1e1c}", "\u{1e1e}", "\u{1e20}", "\u{1e22}", "\u{1e24}", "\u{1e26}", "\u{1e28}", "\u{1e2a}", "\u{1e2c}", "\u{1e2e}", "\u{1e30}", "\u{1e32}", "\u{1e34}", "\u{1e36}", "\u{1e38}", "\u{1e3a}", "\u{1e3c}", "\u{1e3e}", "\u{1e40}", "\u{1e42}", "\u{1e44}", "\u{1e46}", "\u{1e48}", "\u{1e4a}", "\u{1e4c}", "\u{1e4e}", "\u{1e50}", "\u{1e52}", "\u{1e54}", "\u{1e56}", "\u{1e58}", "\u{1e5a}", "\u{1e5c}", "\u{1e5e}", "\u{1e60}", "\u{1e62}", "\u{1e64}", "\u{1e66}", "\u{1e68}", "\u{1e6a}", "\u{1e6c}", "\u{1e6e}", "\u{1e70}", "\u{1e72}", "\u{1e74}", "\u{1e76}", "\u{1e78}", "\u{1e7a}", "\u{1e7c}", "\u{1e7e}", "\u{1e80}", "\u{1e82}", "\u{1e84}", "\u{1e86}", "\u{1e88}", "\u{1e8a}", "\u{1e8c}", "\u{1e8e}", "\u{1e90}", "\u{1e92}", "\u{1e94}", "\u{1e9e}", "\u{1ea0}", "\u{1ea2}", "\u{1ea4}", "\u{1ea6}", "\u{1ea8}", "\u{1eaa}", "\u{1eac}", "\u{1eae}", "\u{1eb0}", "\u{1eb2}", "\u{1eb4}", "\u{1eb6}", "\u{1eb8}", "\u{1eba}", "\u{1ebc}", "\u{1ebe}", "\u{1ec0}", "\u{1ec2}", "\u{1ec4}", "\u{1ec6}", "\u{1ec8}", "\u{1eca}", "\u{1ecc}", "\u{1ece}", "\u{1ed0}", "\u{1ed2}", "\u{1ed4}", "\u{1ed6}", "\u{1ed8}", "\u{1eda}", "\u{1edc}", "\u{1ede}", "\u{1ee0}", "\u{1ee2}", "\u{1ee4}", "\u{1ee6}", "\u{1ee8}", "\u{1eea}", "\u{1eec}", "\u{1eee}", "\u{1ef0}", "\u{1ef2}", "\u{1ef4}", "\u{1ef6}", "\u{1ef8}", "\u{1efa}", "\u{1efc}", "\u{1efe}", "\u{1f08}", "\u{1f18}", "\u{1f28}", "\u{1f38}", "\u{1f48}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f68}", "\u{1f88}", "\u{1f98}", "\u{1fa8}", "\u{1fb8}", "\u{1fc8}", "\u{1fd8}", "\u{1fe8}", "\u{1ff8}", "\u{2126}", "\u{212a}", "\u{2132}", "\u{2160}", "\u{2183}", "\u{24b6}", "\u{2c00}", "\u{2c60}", "\u{2c62}", "\u{2c67}", "\u{2c69}", "\u{2c6b}", "\u{2c6d}", "\u{2c72}", "\u{2c75}", "\u{2c7e}", "\u{2c82}", "\u{2c84}", "\u{2c86}", "\u{2c88}", "\u{2c8a}", "\u{2c8c}", "\u{2c8e}", "\u{2c90}", "\u{2c92}", "\u{2c94}", "\u{2c96}", "\u{2c98}", "\u{2c9a}", "\u{2c9c}", "\u{2c9e}", "\u{2ca0}", "\u{2ca2}", "\u{2ca4}", "\u{2ca6}", "\u{2ca8}", "\u{2caa}", "\u{2cac}", "\u{2cae}", "\u{2cb0}", "\u{2cb2}", "\u{2cb4}", "\u{2cb6}", "\u{2cb8}", "\u{2cba}", "\u{2cbc}", "\u{2cbe}", "\u{2cc0}", "\u{2cc2}", "\u{2cc4}", "\u{2cc6}", "\u{2cc8}", "\u{2cca}", "\u{2ccc}", "\u{2cce}", "\u{2cd0}", "\u{2cd2}", "\u{2cd4}", "\u{2cd6}", "\u{2cd8}", "\u{2cda}", "\u{2cdc}", "\u{2cde}", "\u{2ce0}", "\u{2ce2}", "\u{2ceb}", "\u{2ced}", "\u{2cf2}", "\u{a640}", "\u{a642}", "\u{a644}", "\u{a646}", "\u{a648}", "\u{a64a}", "\u{a64c}", "\u{a64e}", "\u{a650}", "\u{a652}", "\u{a654}", "\u{a656}", "\u{a658}", "\u{a65a}", "\u{a65c}", "\u{a65e}", "\u{a660}", "\u{a662}", "\u{a664}", "\u{a666}", "\u{a668}", "\u{a66a}", "\u{a66c}", "\u{a680}", "\u{a682}", "\u{a684}", "\u{a686}", "\u{a688}", "\u{a68a}", "\u{a68c}", "\u{a68e}", "\u{a690}", "\u{a692}", "\u{a694}", "\u{a696}", "\u{a698}", "\u{a69a}", "\u{a722}", "\u{a724}", "\u{a726}", "\u{a728}", "\u{a72a}", "\u{a72c}", "\u{a72e}", "\u{a732}", "\u{a734}", "\u{a736}", "\u{a738}", "\u{a73a}", "\u{a73c}", "\u{a73e}", "\u{a740}", "\u{a742}", "\u{a744}", "\u{a746}", "\u{a748}", "\u{a74a}", "\u{a74c}", "\u{a74e}", "\u{a750}", "\u{a752}", "\u{a754}", "\u{a756}", "\u{a758}", "\u{a75a}", "\u{a75c}", "\u{a75e}", "\u{a760}", "\u{a762}", "\u{a764}", "\u{a766}", "\u{a768}", "\u{a76a}", "\u{a76c}", "\u{a76e}", "\u{a779}", "\u{a77b}", "\u{a77d}", "\u{a780}", "\u{a782}", "\u{a784}", "\u{a786}", "\u{a78b}", "\u{a78d}", "\u{a790}", "\u{a792}", "\u{a796}", "\u{a798}", "\u{a79a}", "\u{a79c}", "\u{a79e}", "\u{a7a0}", "\u{a7a2}", "\u{a7a4}", "\u{a7a6}", "\u{a7a8}", "\u{a7aa}", "\u{a7b0}", "\u{a7b6}", "\u{a7b8}", "\u{a7ba}", "\u{a7bc}", "\u{a7be}", "\u{a7c0}", "\u{a7c2}", "\u{a7c4}", "\u{a7c9}", "\u{a7d0}", "\u{a7d6}", "\u{a7d8}", "\u{a7f5}", "\u{ff21}", "\u{10400}", "\u{104b0}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10c80}", "\u{118a0}", "\u{16e40}", "\u{1e900}", ]; const REGEXES: [&str; 2] = ["^\\p{Changes_When_Lowercased}+$", "^\\p{CWL}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_changeswhentitlecased() { test_with_configs(unicode_escape_property_binary_changeswhentitlecased_tc) } fn unicode_escape_property_binary_changeswhentitlecased_tc(tc: TestConfig) { const CODE_POINTS: [&str; 626] = [ "\u{61}", "\u{b5}", "\u{df}", "\u{f8}", "\u{101}", "\u{103}", "\u{105}", "\u{107}", "\u{109}", "\u{10b}", "\u{10d}", "\u{10f}", "\u{111}", "\u{113}", "\u{115}", "\u{117}", "\u{119}", "\u{11b}", "\u{11d}", "\u{11f}", "\u{121}", "\u{123}", "\u{125}", "\u{127}", "\u{129}", "\u{12b}", "\u{12d}", "\u{12f}", "\u{131}", "\u{133}", "\u{135}", "\u{137}", "\u{13a}", "\u{13c}", "\u{13e}", "\u{140}", "\u{142}", "\u{144}", "\u{146}", "\u{148}", "\u{14b}", "\u{14d}", "\u{14f}", "\u{151}", "\u{153}", "\u{155}", "\u{157}", "\u{159}", "\u{15b}", "\u{15d}", "\u{15f}", "\u{161}", "\u{163}", "\u{165}", "\u{167}", "\u{169}", "\u{16b}", "\u{16d}", "\u{16f}", "\u{171}", "\u{173}", "\u{175}", "\u{177}", "\u{17a}", "\u{17c}", "\u{17e}", "\u{183}", "\u{185}", "\u{188}", "\u{18c}", "\u{192}", "\u{195}", "\u{199}", "\u{19e}", "\u{1a1}", "\u{1a3}", "\u{1a5}", "\u{1a8}", "\u{1ad}", "\u{1b0}", "\u{1b4}", "\u{1b6}", "\u{1b9}", "\u{1bd}", "\u{1bf}", "\u{1c4}", "\u{1c6}", "\u{1c9}", "\u{1cc}", "\u{1ce}", "\u{1d0}", "\u{1d2}", "\u{1d4}", "\u{1d6}", "\u{1d8}", "\u{1da}", "\u{1dc}", "\u{1df}", "\u{1e1}", "\u{1e3}", "\u{1e5}", "\u{1e7}", "\u{1e9}", "\u{1eb}", "\u{1ed}", "\u{1ef}", "\u{1f3}", "\u{1f5}", "\u{1f9}", "\u{1fb}", "\u{1fd}", "\u{1ff}", "\u{201}", "\u{203}", "\u{205}", "\u{207}", "\u{209}", "\u{20b}", "\u{20d}", "\u{20f}", "\u{211}", "\u{213}", "\u{215}", "\u{217}", "\u{219}", "\u{21b}", "\u{21d}", "\u{21f}", "\u{223}", "\u{225}", "\u{227}", "\u{229}", "\u{22b}", "\u{22d}", "\u{22f}", "\u{231}", "\u{233}", "\u{23c}", "\u{23f}", "\u{242}", "\u{247}", "\u{249}", "\u{24b}", "\u{24d}", "\u{24f}", "\u{256}", "\u{259}", "\u{25b}", "\u{260}", "\u{263}", "\u{265}", "\u{268}", "\u{26f}", "\u{271}", "\u{275}", "\u{27d}", "\u{280}", "\u{282}", "\u{287}", "\u{292}", "\u{29d}", "\u{345}", "\u{371}", "\u{373}", "\u{377}", "\u{37b}", "\u{390}", "\u{3ac}", "\u{3d0}", "\u{3d5}", "\u{3d9}", "\u{3db}", "\u{3dd}", "\u{3df}", "\u{3e1}", "\u{3e3}", "\u{3e5}", "\u{3e7}", "\u{3e9}", "\u{3eb}", "\u{3ed}", "\u{3ef}", "\u{3f5}", "\u{3f8}", "\u{3fb}", "\u{430}", "\u{461}", "\u{463}", "\u{465}", "\u{467}", "\u{469}", "\u{46b}", "\u{46d}", "\u{46f}", "\u{471}", "\u{473}", "\u{475}", "\u{477}", "\u{479}", "\u{47b}", "\u{47d}", "\u{47f}", "\u{481}", "\u{48b}", "\u{48d}", "\u{48f}", "\u{491}", "\u{493}", "\u{495}", "\u{497}", "\u{499}", "\u{49b}", "\u{49d}", "\u{49f}", "\u{4a1}", "\u{4a3}", "\u{4a5}", "\u{4a7}", "\u{4a9}", "\u{4ab}", "\u{4ad}", "\u{4af}", "\u{4b1}", "\u{4b3}", "\u{4b5}", "\u{4b7}", "\u{4b9}", "\u{4bb}", "\u{4bd}", "\u{4bf}", "\u{4c2}", "\u{4c4}", "\u{4c6}", "\u{4c8}", "\u{4ca}", "\u{4cc}", "\u{4ce}", "\u{4d1}", "\u{4d3}", "\u{4d5}", "\u{4d7}", "\u{4d9}", "\u{4db}", "\u{4dd}", "\u{4df}", "\u{4e1}", "\u{4e3}", "\u{4e5}", "\u{4e7}", "\u{4e9}", "\u{4eb}", "\u{4ed}", "\u{4ef}", "\u{4f1}", "\u{4f3}", "\u{4f5}", "\u{4f7}", "\u{4f9}", "\u{4fb}", "\u{4fd}", "\u{4ff}", "\u{501}", "\u{503}", "\u{505}", "\u{507}", "\u{509}", "\u{50b}", "\u{50d}", "\u{50f}", "\u{511}", "\u{513}", "\u{515}", "\u{517}", "\u{519}", "\u{51b}", "\u{51d}", "\u{51f}", "\u{521}", "\u{523}", "\u{525}", "\u{527}", "\u{529}", "\u{52b}", "\u{52d}", "\u{52f}", "\u{561}", "\u{13f8}", "\u{1c80}", "\u{1d79}", "\u{1d7d}", "\u{1d8e}", "\u{1e01}", "\u{1e03}", "\u{1e05}", "\u{1e07}", "\u{1e09}", "\u{1e0b}", "\u{1e0d}", "\u{1e0f}", "\u{1e11}", "\u{1e13}", "\u{1e15}", "\u{1e17}", "\u{1e19}", "\u{1e1b}", "\u{1e1d}", "\u{1e1f}", "\u{1e21}", "\u{1e23}", "\u{1e25}", "\u{1e27}", "\u{1e29}", "\u{1e2b}", "\u{1e2d}", "\u{1e2f}", "\u{1e31}", "\u{1e33}", "\u{1e35}", "\u{1e37}", "\u{1e39}", "\u{1e3b}", "\u{1e3d}", "\u{1e3f}", "\u{1e41}", "\u{1e43}", "\u{1e45}", "\u{1e47}", "\u{1e49}", "\u{1e4b}", "\u{1e4d}", "\u{1e4f}", "\u{1e51}", "\u{1e53}", "\u{1e55}", "\u{1e57}", "\u{1e59}", "\u{1e5b}", "\u{1e5d}", "\u{1e5f}", "\u{1e61}", "\u{1e63}", "\u{1e65}", "\u{1e67}", "\u{1e69}", "\u{1e6b}", "\u{1e6d}", "\u{1e6f}", "\u{1e71}", "\u{1e73}", "\u{1e75}", "\u{1e77}", "\u{1e79}", "\u{1e7b}", "\u{1e7d}", "\u{1e7f}", "\u{1e81}", "\u{1e83}", "\u{1e85}", "\u{1e87}", "\u{1e89}", "\u{1e8b}", "\u{1e8d}", "\u{1e8f}", "\u{1e91}", "\u{1e93}", "\u{1e95}", "\u{1ea1}", "\u{1ea3}", "\u{1ea5}", "\u{1ea7}", "\u{1ea9}", "\u{1eab}", "\u{1ead}", "\u{1eaf}", "\u{1eb1}", "\u{1eb3}", "\u{1eb5}", "\u{1eb7}", "\u{1eb9}", "\u{1ebb}", "\u{1ebd}", "\u{1ebf}", "\u{1ec1}", "\u{1ec3}", "\u{1ec5}", "\u{1ec7}", "\u{1ec9}", "\u{1ecb}", "\u{1ecd}", "\u{1ecf}", "\u{1ed1}", "\u{1ed3}", "\u{1ed5}", "\u{1ed7}", "\u{1ed9}", "\u{1edb}", "\u{1edd}", "\u{1edf}", "\u{1ee1}", "\u{1ee3}", "\u{1ee5}", "\u{1ee7}", "\u{1ee9}", "\u{1eeb}", "\u{1eed}", "\u{1eef}", "\u{1ef1}", "\u{1ef3}", "\u{1ef5}", "\u{1ef7}", "\u{1ef9}", "\u{1efb}", "\u{1efd}", "\u{1eff}", "\u{1f10}", "\u{1f20}", "\u{1f30}", "\u{1f40}", "\u{1f50}", "\u{1f60}", "\u{1f70}", "\u{1f80}", "\u{1f90}", "\u{1fa0}", "\u{1fb0}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{214e}", "\u{2170}", "\u{2184}", "\u{24d0}", "\u{2c30}", "\u{2c61}", "\u{2c65}", "\u{2c68}", "\u{2c6a}", "\u{2c6c}", "\u{2c73}", "\u{2c76}", "\u{2c81}", "\u{2c83}", "\u{2c85}", "\u{2c87}", "\u{2c89}", "\u{2c8b}", "\u{2c8d}", "\u{2c8f}", "\u{2c91}", "\u{2c93}", "\u{2c95}", "\u{2c97}", "\u{2c99}", "\u{2c9b}", "\u{2c9d}", "\u{2c9f}", "\u{2ca1}", "\u{2ca3}", "\u{2ca5}", "\u{2ca7}", "\u{2ca9}", "\u{2cab}", "\u{2cad}", "\u{2caf}", "\u{2cb1}", "\u{2cb3}", "\u{2cb5}", "\u{2cb7}", "\u{2cb9}", "\u{2cbb}", "\u{2cbd}", "\u{2cbf}", "\u{2cc1}", "\u{2cc3}", "\u{2cc5}", "\u{2cc7}", "\u{2cc9}", "\u{2ccb}", "\u{2ccd}", "\u{2ccf}", "\u{2cd1}", "\u{2cd3}", "\u{2cd5}", "\u{2cd7}", "\u{2cd9}", "\u{2cdb}", "\u{2cdd}", "\u{2cdf}", "\u{2ce1}", "\u{2ce3}", "\u{2cec}", "\u{2cee}", "\u{2cf3}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a641}", "\u{a643}", "\u{a645}", "\u{a647}", "\u{a649}", "\u{a64b}", "\u{a64d}", "\u{a64f}", "\u{a651}", "\u{a653}", "\u{a655}", "\u{a657}", "\u{a659}", "\u{a65b}", "\u{a65d}", "\u{a65f}", "\u{a661}", "\u{a663}", "\u{a665}", "\u{a667}", "\u{a669}", "\u{a66b}", "\u{a66d}", "\u{a681}", "\u{a683}", "\u{a685}", "\u{a687}", "\u{a689}", "\u{a68b}", "\u{a68d}", "\u{a68f}", "\u{a691}", "\u{a693}", "\u{a695}", "\u{a697}", "\u{a699}", "\u{a69b}", "\u{a723}", "\u{a725}", "\u{a727}", "\u{a729}", "\u{a72b}", "\u{a72d}", "\u{a72f}", "\u{a733}", "\u{a735}", "\u{a737}", "\u{a739}", "\u{a73b}", "\u{a73d}", "\u{a73f}", "\u{a741}", "\u{a743}", "\u{a745}", "\u{a747}", "\u{a749}", "\u{a74b}", "\u{a74d}", "\u{a74f}", "\u{a751}", "\u{a753}", "\u{a755}", "\u{a757}", "\u{a759}", "\u{a75b}", "\u{a75d}", "\u{a75f}", "\u{a761}", "\u{a763}", "\u{a765}", "\u{a767}", "\u{a769}", "\u{a76b}", "\u{a76d}", "\u{a76f}", "\u{a77a}", "\u{a77c}", "\u{a77f}", "\u{a781}", "\u{a783}", "\u{a785}", "\u{a787}", "\u{a78c}", "\u{a791}", "\u{a793}", "\u{a797}", "\u{a799}", "\u{a79b}", "\u{a79d}", "\u{a79f}", "\u{a7a1}", "\u{a7a3}", "\u{a7a5}", "\u{a7a7}", "\u{a7a9}", "\u{a7b5}", "\u{a7b7}", "\u{a7b9}", "\u{a7bb}", "\u{a7bd}", "\u{a7bf}", "\u{a7c1}", "\u{a7c3}", "\u{a7c8}", "\u{a7ca}", "\u{a7d1}", "\u{a7d7}", "\u{a7d9}", "\u{a7f6}", "\u{ab53}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff41}", "\u{10428}", "\u{104d8}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10cc0}", "\u{118c0}", "\u{16e60}", "\u{1e922}", ]; const REGEXES: [&str; 2] = ["^\\p{Changes_When_Titlecased}+$", "^\\p{CWT}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_changeswhenuppercased() { test_with_configs(unicode_escape_property_binary_changeswhenuppercased_tc) } fn unicode_escape_property_binary_changeswhenuppercased_tc(tc: TestConfig) { const CODE_POINTS: [&str; 627] = [ "\u{61}", "\u{b5}", "\u{df}", "\u{f8}", "\u{101}", "\u{103}", "\u{105}", "\u{107}", "\u{109}", "\u{10b}", "\u{10d}", "\u{10f}", "\u{111}", "\u{113}", "\u{115}", "\u{117}", "\u{119}", "\u{11b}", "\u{11d}", "\u{11f}", "\u{121}", "\u{123}", "\u{125}", "\u{127}", "\u{129}", "\u{12b}", "\u{12d}", "\u{12f}", "\u{131}", "\u{133}", "\u{135}", "\u{137}", "\u{13a}", "\u{13c}", "\u{13e}", "\u{140}", "\u{142}", "\u{144}", "\u{146}", "\u{148}", "\u{14b}", "\u{14d}", "\u{14f}", "\u{151}", "\u{153}", "\u{155}", "\u{157}", "\u{159}", "\u{15b}", "\u{15d}", "\u{15f}", "\u{161}", "\u{163}", "\u{165}", "\u{167}", "\u{169}", "\u{16b}", "\u{16d}", "\u{16f}", "\u{171}", "\u{173}", "\u{175}", "\u{177}", "\u{17a}", "\u{17c}", "\u{17e}", "\u{183}", "\u{185}", "\u{188}", "\u{18c}", "\u{192}", "\u{195}", "\u{199}", "\u{19e}", "\u{1a1}", "\u{1a3}", "\u{1a5}", "\u{1a8}", "\u{1ad}", "\u{1b0}", "\u{1b4}", "\u{1b6}", "\u{1b9}", "\u{1bd}", "\u{1bf}", "\u{1c5}", "\u{1c8}", "\u{1cb}", "\u{1ce}", "\u{1d0}", "\u{1d2}", "\u{1d4}", "\u{1d6}", "\u{1d8}", "\u{1da}", "\u{1dc}", "\u{1df}", "\u{1e1}", "\u{1e3}", "\u{1e5}", "\u{1e7}", "\u{1e9}", "\u{1eb}", "\u{1ed}", "\u{1ef}", "\u{1f2}", "\u{1f5}", "\u{1f9}", "\u{1fb}", "\u{1fd}", "\u{1ff}", "\u{201}", "\u{203}", "\u{205}", "\u{207}", "\u{209}", "\u{20b}", "\u{20d}", "\u{20f}", "\u{211}", "\u{213}", "\u{215}", "\u{217}", "\u{219}", "\u{21b}", "\u{21d}", "\u{21f}", "\u{223}", "\u{225}", "\u{227}", "\u{229}", "\u{22b}", "\u{22d}", "\u{22f}", "\u{231}", "\u{233}", "\u{23c}", "\u{23f}", "\u{242}", "\u{247}", "\u{249}", "\u{24b}", "\u{24d}", "\u{24f}", "\u{256}", "\u{259}", "\u{25b}", "\u{260}", "\u{263}", "\u{265}", "\u{268}", "\u{26f}", "\u{271}", "\u{275}", "\u{27d}", "\u{280}", "\u{282}", "\u{287}", "\u{292}", "\u{29d}", "\u{345}", "\u{371}", "\u{373}", "\u{377}", "\u{37b}", "\u{390}", "\u{3ac}", "\u{3d0}", "\u{3d5}", "\u{3d9}", "\u{3db}", "\u{3dd}", "\u{3df}", "\u{3e1}", "\u{3e3}", "\u{3e5}", "\u{3e7}", "\u{3e9}", "\u{3eb}", "\u{3ed}", "\u{3ef}", "\u{3f5}", "\u{3f8}", "\u{3fb}", "\u{430}", "\u{461}", "\u{463}", "\u{465}", "\u{467}", "\u{469}", "\u{46b}", "\u{46d}", "\u{46f}", "\u{471}", "\u{473}", "\u{475}", "\u{477}", "\u{479}", "\u{47b}", "\u{47d}", "\u{47f}", "\u{481}", "\u{48b}", "\u{48d}", "\u{48f}", "\u{491}", "\u{493}", "\u{495}", "\u{497}", "\u{499}", "\u{49b}", "\u{49d}", "\u{49f}", "\u{4a1}", "\u{4a3}", "\u{4a5}", "\u{4a7}", "\u{4a9}", "\u{4ab}", "\u{4ad}", "\u{4af}", "\u{4b1}", "\u{4b3}", "\u{4b5}", "\u{4b7}", "\u{4b9}", "\u{4bb}", "\u{4bd}", "\u{4bf}", "\u{4c2}", "\u{4c4}", "\u{4c6}", "\u{4c8}", "\u{4ca}", "\u{4cc}", "\u{4ce}", "\u{4d1}", "\u{4d3}", "\u{4d5}", "\u{4d7}", "\u{4d9}", "\u{4db}", "\u{4dd}", "\u{4df}", "\u{4e1}", "\u{4e3}", "\u{4e5}", "\u{4e7}", "\u{4e9}", "\u{4eb}", "\u{4ed}", "\u{4ef}", "\u{4f1}", "\u{4f3}", "\u{4f5}", "\u{4f7}", "\u{4f9}", "\u{4fb}", "\u{4fd}", "\u{4ff}", "\u{501}", "\u{503}", "\u{505}", "\u{507}", "\u{509}", "\u{50b}", "\u{50d}", "\u{50f}", "\u{511}", "\u{513}", "\u{515}", "\u{517}", "\u{519}", "\u{51b}", "\u{51d}", "\u{51f}", "\u{521}", "\u{523}", "\u{525}", "\u{527}", "\u{529}", "\u{52b}", "\u{52d}", "\u{52f}", "\u{561}", "\u{10d0}", "\u{10fd}", "\u{13f8}", "\u{1c80}", "\u{1d79}", "\u{1d7d}", "\u{1d8e}", "\u{1e01}", "\u{1e03}", "\u{1e05}", "\u{1e07}", "\u{1e09}", "\u{1e0b}", "\u{1e0d}", "\u{1e0f}", "\u{1e11}", "\u{1e13}", "\u{1e15}", "\u{1e17}", "\u{1e19}", "\u{1e1b}", "\u{1e1d}", "\u{1e1f}", "\u{1e21}", "\u{1e23}", "\u{1e25}", "\u{1e27}", "\u{1e29}", "\u{1e2b}", "\u{1e2d}", "\u{1e2f}", "\u{1e31}", "\u{1e33}", "\u{1e35}", "\u{1e37}", "\u{1e39}", "\u{1e3b}", "\u{1e3d}", "\u{1e3f}", "\u{1e41}", "\u{1e43}", "\u{1e45}", "\u{1e47}", "\u{1e49}", "\u{1e4b}", "\u{1e4d}", "\u{1e4f}", "\u{1e51}", "\u{1e53}", "\u{1e55}", "\u{1e57}", "\u{1e59}", "\u{1e5b}", "\u{1e5d}", "\u{1e5f}", "\u{1e61}", "\u{1e63}", "\u{1e65}", "\u{1e67}", "\u{1e69}", "\u{1e6b}", "\u{1e6d}", "\u{1e6f}", "\u{1e71}", "\u{1e73}", "\u{1e75}", "\u{1e77}", "\u{1e79}", "\u{1e7b}", "\u{1e7d}", "\u{1e7f}", "\u{1e81}", "\u{1e83}", "\u{1e85}", "\u{1e87}", "\u{1e89}", "\u{1e8b}", "\u{1e8d}", "\u{1e8f}", "\u{1e91}", "\u{1e93}", "\u{1e95}", "\u{1ea1}", "\u{1ea3}", "\u{1ea5}", "\u{1ea7}", "\u{1ea9}", "\u{1eab}", "\u{1ead}", "\u{1eaf}", "\u{1eb1}", "\u{1eb3}", "\u{1eb5}", "\u{1eb7}", "\u{1eb9}", "\u{1ebb}", "\u{1ebd}", "\u{1ebf}", "\u{1ec1}", "\u{1ec3}", "\u{1ec5}", "\u{1ec7}", "\u{1ec9}", "\u{1ecb}", "\u{1ecd}", "\u{1ecf}", "\u{1ed1}", "\u{1ed3}", "\u{1ed5}", "\u{1ed7}", "\u{1ed9}", "\u{1edb}", "\u{1edd}", "\u{1edf}", "\u{1ee1}", "\u{1ee3}", "\u{1ee5}", "\u{1ee7}", "\u{1ee9}", "\u{1eeb}", "\u{1eed}", "\u{1eef}", "\u{1ef1}", "\u{1ef3}", "\u{1ef5}", "\u{1ef7}", "\u{1ef9}", "\u{1efb}", "\u{1efd}", "\u{1eff}", "\u{1f10}", "\u{1f20}", "\u{1f30}", "\u{1f40}", "\u{1f50}", "\u{1f60}", "\u{1f70}", "\u{1f80}", "\u{1fb6}", "\u{1fbc}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fcc}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{1ffc}", "\u{214e}", "\u{2170}", "\u{2184}", "\u{24d0}", "\u{2c30}", "\u{2c61}", "\u{2c65}", "\u{2c68}", "\u{2c6a}", "\u{2c6c}", "\u{2c73}", "\u{2c76}", "\u{2c81}", "\u{2c83}", "\u{2c85}", "\u{2c87}", "\u{2c89}", "\u{2c8b}", "\u{2c8d}", "\u{2c8f}", "\u{2c91}", "\u{2c93}", "\u{2c95}", "\u{2c97}", "\u{2c99}", "\u{2c9b}", "\u{2c9d}", "\u{2c9f}", "\u{2ca1}", "\u{2ca3}", "\u{2ca5}", "\u{2ca7}", "\u{2ca9}", "\u{2cab}", "\u{2cad}", "\u{2caf}", "\u{2cb1}", "\u{2cb3}", "\u{2cb5}", "\u{2cb7}", "\u{2cb9}", "\u{2cbb}", "\u{2cbd}", "\u{2cbf}", "\u{2cc1}", "\u{2cc3}", "\u{2cc5}", "\u{2cc7}", "\u{2cc9}", "\u{2ccb}", "\u{2ccd}", "\u{2ccf}", "\u{2cd1}", "\u{2cd3}", "\u{2cd5}", "\u{2cd7}", "\u{2cd9}", "\u{2cdb}", "\u{2cdd}", "\u{2cdf}", "\u{2ce1}", "\u{2ce3}", "\u{2cec}", "\u{2cee}", "\u{2cf3}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a641}", "\u{a643}", "\u{a645}", "\u{a647}", "\u{a649}", "\u{a64b}", "\u{a64d}", "\u{a64f}", "\u{a651}", "\u{a653}", "\u{a655}", "\u{a657}", "\u{a659}", "\u{a65b}", "\u{a65d}", "\u{a65f}", "\u{a661}", "\u{a663}", "\u{a665}", "\u{a667}", "\u{a669}", "\u{a66b}", "\u{a66d}", "\u{a681}", "\u{a683}", "\u{a685}", "\u{a687}", "\u{a689}", "\u{a68b}", "\u{a68d}", "\u{a68f}", "\u{a691}", "\u{a693}", "\u{a695}", "\u{a697}", "\u{a699}", "\u{a69b}", "\u{a723}", "\u{a725}", "\u{a727}", "\u{a729}", "\u{a72b}", "\u{a72d}", "\u{a72f}", "\u{a733}", "\u{a735}", "\u{a737}", "\u{a739}", "\u{a73b}", "\u{a73d}", "\u{a73f}", "\u{a741}", "\u{a743}", "\u{a745}", "\u{a747}", "\u{a749}", "\u{a74b}", "\u{a74d}", "\u{a74f}", "\u{a751}", "\u{a753}", "\u{a755}", "\u{a757}", "\u{a759}", "\u{a75b}", "\u{a75d}", "\u{a75f}", "\u{a761}", "\u{a763}", "\u{a765}", "\u{a767}", "\u{a769}", "\u{a76b}", "\u{a76d}", "\u{a76f}", "\u{a77a}", "\u{a77c}", "\u{a77f}", "\u{a781}", "\u{a783}", "\u{a785}", "\u{a787}", "\u{a78c}", "\u{a791}", "\u{a793}", "\u{a797}", "\u{a799}", "\u{a79b}", "\u{a79d}", "\u{a79f}", "\u{a7a1}", "\u{a7a3}", "\u{a7a5}", "\u{a7a7}", "\u{a7a9}", "\u{a7b5}", "\u{a7b7}", "\u{a7b9}", "\u{a7bb}", "\u{a7bd}", "\u{a7bf}", "\u{a7c1}", "\u{a7c3}", "\u{a7c8}", "\u{a7ca}", "\u{a7d1}", "\u{a7d7}", "\u{a7d9}", "\u{a7f6}", "\u{ab53}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff41}", "\u{10428}", "\u{104d8}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10cc0}", "\u{118c0}", "\u{16e60}", "\u{1e922}", ]; const REGEXES: [&str; 2] = ["^\\p{Changes_When_Uppercased}+$", "^\\p{CWU}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_defaultignorablecodepoint() { test_with_configs(unicode_escape_property_binary_defaultignorablecodepoint_tc) } fn unicode_escape_property_binary_defaultignorablecodepoint_tc(tc: TestConfig) { const CODE_POINTS: [&str; 27] = [ "\u{ad}", "\u{34f}", "\u{61c}", "\u{115f}", "\u{17b4}", "\u{180b}", "\u{180e}", "\u{180f}", "\u{200b}", "\u{202a}", "\u{2060}", "\u{2065}", "\u{2066}", "\u{3164}", "\u{fe00}", "\u{feff}", "\u{ffa0}", "\u{fff0}", "\u{1bca0}", "\u{1d173}", "\u{e0000}", "\u{e0001}", "\u{e0002}", "\u{e0020}", "\u{e0080}", "\u{e0100}", "\u{e01f0}", ]; const REGEXES: [&str; 2] = ["^\\p{Default_Ignorable_Code_Point}+$", "^\\p{DI}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_graphemebase() { test_with_configs(unicode_escape_property_binary_graphemebase_tc) } fn unicode_escape_property_binary_graphemebase_tc(tc: TestConfig) { static CODE_POINTS: [&str; 1743] = [ "\u{20}", "\u{21}", "\u{24}", "\u{25}", "\u{28}", "\u{29}", "\u{2a}", "\u{2b}", "\u{2c}", "\u{2d}", "\u{2e}", "\u{30}", "\u{3a}", "\u{3c}", "\u{3f}", "\u{41}", "\u{5b}", "\u{5c}", "\u{5d}", "\u{5e}", "\u{5f}", "\u{60}", "\u{61}", "\u{7b}", "\u{7c}", "\u{7d}", "\u{7e}", "\u{a0}", "\u{a1}", "\u{a2}", "\u{a6}", "\u{a7}", "\u{a8}", "\u{a9}", "\u{aa}", "\u{ab}", "\u{ac}", "\u{ae}", "\u{af}", "\u{b0}", "\u{b1}", "\u{b2}", "\u{b4}", "\u{b5}", "\u{b6}", "\u{b8}", "\u{b9}", "\u{ba}", "\u{bb}", "\u{bc}", "\u{bf}", "\u{c0}", "\u{d7}", "\u{d8}", "\u{f7}", "\u{f8}", "\u{1bb}", "\u{1bc}", "\u{1c0}", "\u{1c4}", "\u{294}", "\u{295}", "\u{2b0}", "\u{2c2}", "\u{2c6}", "\u{2d2}", "\u{2e0}", "\u{2e5}", "\u{2ec}", "\u{2ed}", "\u{2ee}", "\u{2ef}", "\u{370}", "\u{374}", "\u{375}", "\u{376}", "\u{37a}", "\u{37b}", "\u{37e}", "\u{37f}", "\u{384}", "\u{386}", "\u{387}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3f6}", "\u{3f7}", "\u{482}", "\u{48a}", "\u{531}", "\u{559}", "\u{55a}", "\u{560}", "\u{589}", "\u{58a}", "\u{58d}", "\u{58f}", "\u{5be}", "\u{5c0}", "\u{5c3}", "\u{5c6}", "\u{5d0}", "\u{5ef}", "\u{5f3}", "\u{606}", "\u{609}", "\u{60b}", "\u{60c}", "\u{60e}", "\u{61b}", "\u{61d}", "\u{620}", "\u{640}", "\u{641}", "\u{660}", "\u{66a}", "\u{66e}", "\u{671}", "\u{6d4}", "\u{6d5}", "\u{6de}", "\u{6e5}", "\u{6e9}", "\u{6ee}", "\u{6f0}", "\u{6fa}", "\u{6fd}", "\u{6ff}", "\u{700}", "\u{710}", "\u{712}", "\u{74d}", "\u{7b1}", "\u{7c0}", "\u{7ca}", "\u{7f4}", "\u{7f6}", "\u{7f7}", "\u{7fa}", "\u{7fe}", "\u{800}", "\u{81a}", "\u{824}", "\u{828}", "\u{830}", "\u{840}", "\u{85e}", "\u{860}", "\u{870}", "\u{888}", "\u{889}", "\u{8a0}", "\u{8c9}", "\u{903}", "\u{904}", "\u{93b}", "\u{93d}", "\u{93e}", "\u{949}", "\u{94e}", "\u{950}", "\u{958}", "\u{964}", "\u{966}", "\u{970}", "\u{971}", "\u{972}", "\u{982}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bd}", "\u{9bf}", "\u{9c7}", "\u{9cb}", "\u{9ce}", "\u{9dc}", "\u{9df}", "\u{9e6}", "\u{9f0}", "\u{9f2}", "\u{9f4}", "\u{9fa}", "\u{9fb}", "\u{9fc}", "\u{9fd}", "\u{a03}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a3e}", "\u{a59}", "\u{a5e}", "\u{a66}", "\u{a72}", "\u{a76}", "\u{a83}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abd}", "\u{abe}", "\u{ac9}", "\u{acb}", "\u{ad0}", "\u{ae0}", "\u{ae6}", "\u{af0}", "\u{af1}", "\u{af9}", "\u{b02}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3d}", "\u{b40}", "\u{b47}", "\u{b4b}", "\u{b5c}", "\u{b5f}", "\u{b66}", "\u{b70}", "\u{b71}", "\u{b72}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bbf}", "\u{bc1}", "\u{bc6}", "\u{bca}", "\u{bd0}", "\u{be6}", "\u{bf0}", "\u{bf3}", "\u{bf9}", "\u{bfa}", "\u{c01}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3d}", "\u{c41}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c66}", "\u{c77}", "\u{c78}", "\u{c7f}", "\u{c80}", "\u{c82}", "\u{c84}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbd}", "\u{cbe}", "\u{cc0}", "\u{cc3}", "\u{cc7}", "\u{cca}", "\u{cdd}", "\u{ce0}", "\u{ce6}", "\u{cf1}", "\u{cf3}", "\u{d02}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3d}", "\u{d3f}", "\u{d46}", "\u{d4a}", "\u{d4e}", "\u{d4f}", "\u{d54}", "\u{d58}", "\u{d5f}", "\u{d66}", "\u{d70}", "\u{d79}", "\u{d7a}", "\u{d82}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{dd0}", "\u{dd8}", "\u{de6}", "\u{df2}", "\u{df4}", "\u{e01}", "\u{e32}", "\u{e3f}", "\u{e40}", "\u{e46}", "\u{e4f}", "\u{e50}", "\u{e5a}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb2}", "\u{ebd}", "\u{ec0}", "\u{ec6}", "\u{ed0}", "\u{edc}", "\u{f00}", "\u{f01}", "\u{f04}", "\u{f13}", "\u{f14}", "\u{f15}", "\u{f1a}", "\u{f20}", "\u{f2a}", "\u{f34}", "\u{f36}", "\u{f38}", "\u{f3a}", "\u{f3b}", "\u{f3c}", "\u{f3d}", "\u{f3e}", "\u{f40}", "\u{f49}", "\u{f7f}", "\u{f85}", "\u{f88}", "\u{fbe}", "\u{fc7}", "\u{fce}", "\u{fd0}", "\u{fd5}", "\u{fd9}", "\u{1000}", "\u{102b}", "\u{1031}", "\u{1038}", "\u{103b}", "\u{103f}", "\u{1040}", "\u{104a}", "\u{1050}", "\u{1056}", "\u{105a}", "\u{1061}", "\u{1062}", "\u{1065}", "\u{1067}", "\u{106e}", "\u{1075}", "\u{1083}", "\u{1087}", "\u{108e}", "\u{108f}", "\u{1090}", "\u{109a}", "\u{109e}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fb}", "\u{10fc}", "\u{10fd}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{1360}", "\u{1369}", "\u{1380}", "\u{1390}", "\u{13a0}", "\u{13f8}", "\u{1400}", "\u{1401}", "\u{166d}", "\u{166e}", "\u{166f}", "\u{1680}", "\u{1681}", "\u{169b}", "\u{169c}", "\u{16a0}", "\u{16eb}", "\u{16ee}", "\u{16f1}", "\u{1700}", "\u{1715}", "\u{171f}", "\u{1734}", "\u{1735}", "\u{1740}", "\u{1760}", "\u{176e}", "\u{1780}", "\u{17b6}", "\u{17be}", "\u{17c7}", "\u{17d4}", "\u{17d7}", "\u{17d8}", "\u{17db}", "\u{17dc}", "\u{17e0}", "\u{17f0}", "\u{1800}", "\u{1806}", "\u{1807}", "\u{1810}", "\u{1820}", "\u{1843}", "\u{1844}", "\u{1880}", "\u{1887}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1923}", "\u{1929}", "\u{1930}", "\u{1933}", "\u{1940}", "\u{1944}", "\u{1946}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{19d0}", "\u{19da}", "\u{19de}", "\u{1a00}", "\u{1a19}", "\u{1a1e}", "\u{1a20}", "\u{1a55}", "\u{1a57}", "\u{1a61}", "\u{1a63}", "\u{1a6d}", "\u{1a80}", "\u{1a90}", "\u{1aa0}", "\u{1aa7}", "\u{1aa8}", "\u{1b04}", "\u{1b05}", "\u{1b3b}", "\u{1b3d}", "\u{1b43}", "\u{1b45}", "\u{1b50}", "\u{1b5a}", "\u{1b61}", "\u{1b74}", "\u{1b7d}", "\u{1b82}", "\u{1b83}", "\u{1ba1}", "\u{1ba6}", "\u{1baa}", "\u{1bae}", "\u{1bb0}", "\u{1bba}", "\u{1be7}", "\u{1bea}", "\u{1bee}", "\u{1bf2}", "\u{1bfc}", "\u{1c00}", "\u{1c24}", "\u{1c34}", "\u{1c3b}", "\u{1c40}", "\u{1c4d}", "\u{1c50}", "\u{1c5a}", "\u{1c78}", "\u{1c7e}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1cc0}", "\u{1cd3}", "\u{1ce1}", "\u{1ce9}", "\u{1cee}", "\u{1cf5}", "\u{1cf7}", "\u{1cfa}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1e00}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbd}", "\u{1fbe}", "\u{1fbf}", "\u{1fc2}", "\u{1fc6}", "\u{1fcd}", "\u{1fd0}", "\u{1fd6}", "\u{1fdd}", "\u{1fe0}", "\u{1fed}", "\u{1ff2}", "\u{1ff6}", "\u{1ffd}", "\u{2000}", "\u{2010}", "\u{2016}", "\u{2018}", "\u{2019}", "\u{201a}", "\u{201b}", "\u{201d}", "\u{201e}", "\u{201f}", "\u{2020}", "\u{202f}", "\u{2030}", "\u{2039}", "\u{203a}", "\u{203b}", "\u{203f}", "\u{2041}", "\u{2044}", "\u{2045}", "\u{2046}", "\u{2047}", "\u{2052}", "\u{2053}", "\u{2054}", "\u{2055}", "\u{205f}", "\u{2070}", "\u{2071}", "\u{2074}", "\u{207a}", "\u{207d}", "\u{207e}", "\u{207f}", "\u{2080}", "\u{208a}", "\u{208d}", "\u{208e}", "\u{2090}", "\u{20a0}", "\u{2100}", "\u{2102}", "\u{2103}", "\u{2107}", "\u{2108}", "\u{210a}", "\u{2114}", "\u{2115}", "\u{2116}", "\u{2118}", "\u{2119}", "\u{211e}", "\u{2124}", "\u{2125}", "\u{2126}", "\u{2127}", "\u{2128}", "\u{2129}", "\u{212a}", "\u{212e}", "\u{212f}", "\u{2135}", "\u{2139}", "\u{213a}", "\u{213c}", "\u{2140}", "\u{2145}", "\u{214a}", "\u{214b}", "\u{214c}", "\u{214e}", "\u{214f}", "\u{2150}", "\u{2160}", "\u{2183}", "\u{2185}", "\u{2189}", "\u{218a}", "\u{2190}", "\u{2195}", "\u{219a}", "\u{219c}", "\u{21a0}", "\u{21a1}", "\u{21a3}", "\u{21a4}", "\u{21a6}", "\u{21a7}", "\u{21ae}", "\u{21af}", "\u{21ce}", "\u{21d0}", "\u{21d2}", "\u{21d3}", "\u{21d4}", "\u{21d5}", "\u{21f4}", "\u{2300}", "\u{2308}", "\u{2309}", "\u{230a}", "\u{230b}", "\u{230c}", "\u{2320}", "\u{2322}", "\u{2329}", "\u{232a}", "\u{232b}", "\u{237c}", "\u{237d}", "\u{239b}", "\u{23b4}", "\u{23dc}", "\u{23e2}", "\u{2440}", "\u{2460}", "\u{249c}", "\u{24ea}", "\u{2500}", "\u{25b7}", "\u{25b8}", "\u{25c1}", "\u{25c2}", "\u{25f8}", "\u{2600}", "\u{266f}", "\u{2670}", "\u{2768}", "\u{2769}", "\u{276a}", "\u{276b}", "\u{276c}", "\u{276d}", "\u{276e}", "\u{276f}", "\u{2770}", "\u{2771}", "\u{2772}", "\u{2773}", "\u{2774}", "\u{2775}", "\u{2776}", "\u{2794}", "\u{27c0}", "\u{27c5}", "\u{27c6}", "\u{27c7}", "\u{27e6}", "\u{27e7}", "\u{27e8}", "\u{27e9}", "\u{27ea}", "\u{27eb}", "\u{27ec}", "\u{27ed}", "\u{27ee}", "\u{27ef}", "\u{27f0}", "\u{2800}", "\u{2900}", "\u{2983}", "\u{2984}", "\u{2985}", "\u{2986}", "\u{2987}", "\u{2988}", "\u{2989}", "\u{298a}", "\u{298b}", "\u{298c}", "\u{298d}", "\u{298e}", "\u{298f}", "\u{2990}", "\u{2991}", "\u{2992}", "\u{2993}", "\u{2994}", "\u{2995}", "\u{2996}", "\u{2997}", "\u{2998}", "\u{2999}", "\u{29d8}", "\u{29d9}", "\u{29da}", "\u{29db}", "\u{29dc}", "\u{29fc}", "\u{29fd}", "\u{29fe}", "\u{2b00}", "\u{2b30}", "\u{2b45}", "\u{2b47}", "\u{2b4d}", "\u{2b76}", "\u{2b97}", "\u{2c00}", "\u{2c7c}", "\u{2c7e}", "\u{2ce5}", "\u{2ceb}", "\u{2cf2}", "\u{2cf9}", "\u{2cfd}", "\u{2cfe}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{2d30}", "\u{2d6f}", "\u{2d70}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{2e00}", "\u{2e02}", "\u{2e03}", "\u{2e04}", "\u{2e05}", "\u{2e06}", "\u{2e09}", "\u{2e0a}", "\u{2e0b}", "\u{2e0c}", "\u{2e0d}", "\u{2e0e}", "\u{2e17}", "\u{2e18}", "\u{2e1a}", "\u{2e1b}", "\u{2e1c}", "\u{2e1d}", "\u{2e1e}", "\u{2e20}", "\u{2e21}", "\u{2e22}", "\u{2e23}", "\u{2e24}", "\u{2e25}", "\u{2e26}", "\u{2e27}", "\u{2e28}", "\u{2e29}", "\u{2e2a}", "\u{2e2f}", "\u{2e30}", "\u{2e3a}", "\u{2e3c}", "\u{2e40}", "\u{2e41}", "\u{2e42}", "\u{2e43}", "\u{2e50}", "\u{2e52}", "\u{2e55}", "\u{2e56}", "\u{2e57}", "\u{2e58}", "\u{2e59}", "\u{2e5a}", "\u{2e5b}", "\u{2e5c}", "\u{2e5d}", "\u{2e80}", "\u{2e9b}", "\u{2f00}", "\u{2ff0}", "\u{3000}", "\u{3001}", "\u{3004}", "\u{3005}", "\u{3006}", "\u{3007}", "\u{3008}", "\u{3009}", "\u{300a}", "\u{300b}", "\u{300c}", "\u{300d}", "\u{300e}", "\u{300f}", "\u{3010}", "\u{3011}", "\u{3012}", "\u{3014}", "\u{3015}", "\u{3016}", "\u{3017}", "\u{3018}", "\u{3019}", "\u{301a}", "\u{301b}", "\u{301c}", "\u{301d}", "\u{301e}", "\u{3020}", "\u{3021}", "\u{3030}", "\u{3031}", "\u{3036}", "\u{3038}", "\u{303b}", "\u{303c}", "\u{303d}", "\u{303e}", "\u{3041}", "\u{309b}", "\u{309d}", "\u{309f}", "\u{30a0}", "\u{30a1}", "\u{30fb}", "\u{30fc}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{3190}", "\u{3192}", "\u{3196}", "\u{31a0}", "\u{31c0}", "\u{31ef}", "\u{31f0}", "\u{3200}", "\u{3220}", "\u{322a}", "\u{3248}", "\u{3250}", "\u{3251}", "\u{3260}", "\u{3280}", "\u{328a}", "\u{32b1}", "\u{32c0}", "\u{3400}", "\u{4dc0}", "\u{4e00}", "\u{a015}", "\u{a016}", "\u{a490}", "\u{a4d0}", "\u{a4f8}", "\u{a4fe}", "\u{a500}", "\u{a60c}", "\u{a60d}", "\u{a610}", "\u{a620}", "\u{a62a}", "\u{a640}", "\u{a66e}", "\u{a673}", "\u{a67e}", "\u{a67f}", "\u{a680}", "\u{a69c}", "\u{a6a0}", "\u{a6e6}", "\u{a6f2}", "\u{a700}", "\u{a717}", "\u{a720}", "\u{a722}", "\u{a770}", "\u{a771}", "\u{a788}", "\u{a789}", "\u{a78b}", "\u{a78f}", "\u{a790}", "\u{a7d0}", "\u{a7d3}", "\u{a7d5}", "\u{a7f2}", "\u{a7f5}", "\u{a7f7}", "\u{a7f8}", "\u{a7fa}", "\u{a7fb}", "\u{a803}", "\u{a807}", "\u{a80c}", "\u{a823}", "\u{a827}", "\u{a828}", "\u{a830}", "\u{a836}", "\u{a838}", "\u{a839}", "\u{a840}", "\u{a874}", "\u{a880}", "\u{a882}", "\u{a8b4}", "\u{a8ce}", "\u{a8d0}", "\u{a8f2}", "\u{a8f8}", "\u{a8fb}", "\u{a8fc}", "\u{a8fd}", "\u{a900}", "\u{a90a}", "\u{a92e}", "\u{a930}", "\u{a952}", "\u{a95f}", "\u{a960}", "\u{a983}", "\u{a984}", "\u{a9b4}", "\u{a9ba}", "\u{a9be}", "\u{a9c1}", "\u{a9cf}", "\u{a9d0}", "\u{a9de}", "\u{a9e0}", "\u{a9e6}", "\u{a9e7}", "\u{a9f0}", "\u{a9fa}", "\u{aa00}", "\u{aa2f}", "\u{aa33}", "\u{aa40}", "\u{aa44}", "\u{aa4d}", "\u{aa50}", "\u{aa5c}", "\u{aa60}", "\u{aa70}", "\u{aa71}", "\u{aa77}", "\u{aa7a}", "\u{aa7b}", "\u{aa7d}", "\u{aa7e}", "\u{aab1}", "\u{aab5}", "\u{aab9}", "\u{aac0}", "\u{aac2}", "\u{aadb}", "\u{aadd}", "\u{aade}", "\u{aae0}", "\u{aaeb}", "\u{aaee}", "\u{aaf0}", "\u{aaf2}", "\u{aaf3}", "\u{aaf5}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{ab30}", "\u{ab5b}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab6a}", "\u{ab70}", "\u{abc0}", "\u{abe3}", "\u{abe6}", "\u{abe9}", "\u{abeb}", "\u{abec}", "\u{abf0}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb00}", "\u{fb13}", "\u{fb1d}", "\u{fb1f}", "\u{fb29}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbb2}", "\u{fbd3}", "\u{fd3e}", "\u{fd3f}", "\u{fd40}", "\u{fd50}", "\u{fd92}", "\u{fdcf}", "\u{fdf0}", "\u{fdfc}", "\u{fdfd}", "\u{fe10}", "\u{fe17}", "\u{fe18}", "\u{fe19}", "\u{fe30}", "\u{fe31}", "\u{fe33}", "\u{fe35}", "\u{fe36}", "\u{fe37}", "\u{fe38}", "\u{fe39}", "\u{fe3a}", "\u{fe3b}", "\u{fe3c}", "\u{fe3d}", "\u{fe3e}", "\u{fe3f}", "\u{fe40}", "\u{fe41}", "\u{fe42}", "\u{fe43}", "\u{fe44}", "\u{fe45}", "\u{fe47}", "\u{fe48}", "\u{fe49}", "\u{fe4d}", "\u{fe50}", "\u{fe54}", "\u{fe58}", "\u{fe59}", "\u{fe5a}", "\u{fe5b}", "\u{fe5c}", "\u{fe5d}", "\u{fe5e}", "\u{fe5f}", "\u{fe62}", "\u{fe63}", "\u{fe64}", "\u{fe68}", "\u{fe69}", "\u{fe6a}", "\u{fe70}", "\u{fe76}", "\u{ff01}", "\u{ff04}", "\u{ff05}", "\u{ff08}", "\u{ff09}", "\u{ff0a}", "\u{ff0b}", "\u{ff0c}", "\u{ff0d}", "\u{ff0e}", "\u{ff10}", "\u{ff1a}", "\u{ff1c}", "\u{ff1f}", "\u{ff21}", "\u{ff3b}", "\u{ff3c}", "\u{ff3d}", "\u{ff3e}", "\u{ff3f}", "\u{ff40}", "\u{ff41}", "\u{ff5b}", "\u{ff5c}", "\u{ff5d}", "\u{ff5e}", "\u{ff5f}", "\u{ff60}", "\u{ff61}", "\u{ff62}", "\u{ff63}", "\u{ff64}", "\u{ff66}", "\u{ff70}", "\u{ff71}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{ffe0}", "\u{ffe2}", "\u{ffe3}", "\u{ffe4}", "\u{ffe5}", "\u{ffe8}", "\u{ffe9}", "\u{ffed}", "\u{fffc}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10100}", "\u{10107}", "\u{10137}", "\u{10140}", "\u{10175}", "\u{10179}", "\u{1018a}", "\u{1018c}", "\u{10190}", "\u{101a0}", "\u{101d0}", "\u{10280}", "\u{102a0}", "\u{102e1}", "\u{10300}", "\u{10320}", "\u{1032d}", "\u{10341}", "\u{10342}", "\u{1034a}", "\u{10350}", "\u{10380}", "\u{1039f}", "\u{103a0}", "\u{103c8}", "\u{103d0}", "\u{103d1}", "\u{10400}", "\u{10450}", "\u{104a0}", "\u{104b0}", "\u{104d8}", "\u{10500}", "\u{10530}", "\u{1056f}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10857}", "\u{10858}", "\u{10860}", "\u{10877}", "\u{10879}", "\u{10880}", "\u{108a7}", "\u{108e0}", "\u{108f4}", "\u{108fb}", "\u{10900}", "\u{10916}", "\u{1091f}", "\u{10920}", "\u{1093f}", "\u{10980}", "\u{109bc}", "\u{109be}", "\u{109c0}", "\u{109d2}", "\u{10a00}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a40}", "\u{10a50}", "\u{10a60}", "\u{10a7d}", "\u{10a7f}", "\u{10a80}", "\u{10a9d}", "\u{10ac0}", "\u{10ac8}", "\u{10ac9}", "\u{10aeb}", "\u{10af0}", "\u{10b00}", "\u{10b39}", "\u{10b40}", "\u{10b58}", "\u{10b60}", "\u{10b78}", "\u{10b80}", "\u{10b99}", "\u{10ba9}", "\u{10c00}", "\u{10c80}", "\u{10cc0}", "\u{10cfa}", "\u{10d00}", "\u{10d30}", "\u{10e60}", "\u{10e80}", "\u{10ead}", "\u{10eb0}", "\u{10f00}", "\u{10f1d}", "\u{10f27}", "\u{10f30}", "\u{10f51}", "\u{10f55}", "\u{10f70}", "\u{10f86}", "\u{10fb0}", "\u{10fc5}", "\u{10fe0}", "\u{11000}", "\u{11002}", "\u{11003}", "\u{11047}", "\u{11052}", "\u{11066}", "\u{11071}", "\u{11075}", "\u{11082}", "\u{11083}", "\u{110b0}", "\u{110b7}", "\u{110bb}", "\u{110be}", "\u{110d0}", "\u{110f0}", "\u{11103}", "\u{1112c}", "\u{11136}", "\u{11140}", "\u{11144}", "\u{11145}", "\u{11147}", "\u{11150}", "\u{11174}", "\u{11176}", "\u{11182}", "\u{11183}", "\u{111b3}", "\u{111bf}", "\u{111c1}", "\u{111c5}", "\u{111cd}", "\u{111ce}", "\u{111d0}", "\u{111da}", "\u{111db}", "\u{111dc}", "\u{111dd}", "\u{111e1}", "\u{11200}", "\u{11213}", "\u{1122c}", "\u{11232}", "\u{11235}", "\u{11238}", "\u{1123f}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112a9}", "\u{112b0}", "\u{112e0}", "\u{112f0}", "\u{11302}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133d}", "\u{1133f}", "\u{11341}", "\u{11347}", "\u{1134b}", "\u{11350}", "\u{1135d}", "\u{11362}", "\u{11400}", "\u{11435}", "\u{11440}", "\u{11445}", "\u{11447}", "\u{1144b}", "\u{11450}", "\u{1145a}", "\u{1145d}", "\u{1145f}", "\u{11480}", "\u{114b1}", "\u{114b9}", "\u{114bb}", "\u{114be}", "\u{114c1}", "\u{114c4}", "\u{114c6}", "\u{114c7}", "\u{114d0}", "\u{11580}", "\u{115b0}", "\u{115b8}", "\u{115be}", "\u{115c1}", "\u{115d8}", "\u{11600}", "\u{11630}", "\u{1163b}", "\u{1163e}", "\u{11641}", "\u{11644}", "\u{11650}", "\u{11660}", "\u{11680}", "\u{116ac}", "\u{116ae}", "\u{116b6}", "\u{116b8}", "\u{116b9}", "\u{116c0}", "\u{11700}", "\u{11720}", "\u{11726}", "\u{11730}", "\u{1173a}", "\u{1173c}", "\u{1173f}", "\u{11740}", "\u{11800}", "\u{1182c}", "\u{11838}", "\u{1183b}", "\u{118a0}", "\u{118e0}", "\u{118ea}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{11931}", "\u{11937}", "\u{1193d}", "\u{1193f}", "\u{11940}", "\u{11941}", "\u{11942}", "\u{11944}", "\u{11950}", "\u{119a0}", "\u{119aa}", "\u{119d1}", "\u{119dc}", "\u{119e1}", "\u{119e2}", "\u{119e3}", "\u{119e4}", "\u{11a00}", "\u{11a0b}", "\u{11a39}", "\u{11a3a}", "\u{11a3f}", "\u{11a50}", "\u{11a57}", "\u{11a5c}", "\u{11a97}", "\u{11a9a}", "\u{11a9d}", "\u{11a9e}", "\u{11ab0}", "\u{11b00}", "\u{11c00}", "\u{11c0a}", "\u{11c2f}", "\u{11c3e}", "\u{11c40}", "\u{11c41}", "\u{11c50}", "\u{11c5a}", "\u{11c70}", "\u{11c72}", "\u{11ca9}", "\u{11cb1}", "\u{11cb4}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d46}", "\u{11d50}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d8a}", "\u{11d93}", "\u{11d96}", "\u{11d98}", "\u{11da0}", "\u{11ee0}", "\u{11ef5}", "\u{11ef7}", "\u{11f02}", "\u{11f03}", "\u{11f04}", "\u{11f12}", "\u{11f34}", "\u{11f3e}", "\u{11f41}", "\u{11f43}", "\u{11f50}", "\u{11fb0}", "\u{11fc0}", "\u{11fd5}", "\u{11fdd}", "\u{11fe1}", "\u{11fff}", "\u{12000}", "\u{12400}", "\u{12470}", "\u{12480}", "\u{12f90}", "\u{12ff1}", "\u{13000}", "\u{13441}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a60}", "\u{16a6e}", "\u{16a70}", "\u{16ac0}", "\u{16ad0}", "\u{16af5}", "\u{16b00}", "\u{16b37}", "\u{16b3c}", "\u{16b40}", "\u{16b44}", "\u{16b45}", "\u{16b50}", "\u{16b5b}", "\u{16b63}", "\u{16b7d}", "\u{16e40}", "\u{16e80}", "\u{16e97}", "\u{16f00}", "\u{16f50}", "\u{16f51}", "\u{16f93}", "\u{16fe0}", "\u{16fe2}", "\u{16fe3}", "\u{16ff0}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1bc9c}", "\u{1bc9f}", "\u{1cf50}", "\u{1d000}", "\u{1d100}", "\u{1d129}", "\u{1d166}", "\u{1d16a}", "\u{1d16d}", "\u{1d183}", "\u{1d18c}", "\u{1d1ae}", "\u{1d200}", "\u{1d245}", "\u{1d2c0}", "\u{1d2e0}", "\u{1d300}", "\u{1d360}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c1}", "\u{1d6c2}", "\u{1d6db}", "\u{1d6dc}", "\u{1d6fb}", "\u{1d6fc}", "\u{1d715}", "\u{1d716}", "\u{1d735}", "\u{1d736}", "\u{1d74f}", "\u{1d750}", "\u{1d76f}", "\u{1d770}", "\u{1d789}", "\u{1d78a}", "\u{1d7a9}", "\u{1d7aa}", "\u{1d7c3}", "\u{1d7c4}", "\u{1d7ce}", "\u{1d800}", "\u{1da37}", "\u{1da6d}", "\u{1da76}", "\u{1da85}", "\u{1da87}", "\u{1df00}", "\u{1df0a}", "\u{1df0b}", "\u{1df25}", "\u{1e030}", "\u{1e100}", "\u{1e137}", "\u{1e140}", "\u{1e14e}", "\u{1e14f}", "\u{1e290}", "\u{1e2c0}", "\u{1e2f0}", "\u{1e2ff}", "\u{1e4d0}", "\u{1e4eb}", "\u{1e4f0}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1e8c7}", "\u{1e900}", "\u{1e94b}", "\u{1e950}", "\u{1e95e}", "\u{1ec71}", "\u{1ecac}", "\u{1ecad}", "\u{1ecb0}", "\u{1ecb1}", "\u{1ed01}", "\u{1ed2e}", "\u{1ed2f}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{1eef0}", "\u{1f000}", "\u{1f030}", "\u{1f0a0}", "\u{1f0b1}", "\u{1f0c1}", "\u{1f0d1}", "\u{1f100}", "\u{1f10d}", "\u{1f1e6}", "\u{1f210}", "\u{1f240}", "\u{1f250}", "\u{1f260}", "\u{1f300}", "\u{1f3fb}", "\u{1f400}", "\u{1f6dc}", "\u{1f6f0}", "\u{1f700}", "\u{1f77b}", "\u{1f7e0}", "\u{1f7f0}", "\u{1f800}", "\u{1f810}", "\u{1f850}", "\u{1f860}", "\u{1f890}", "\u{1f8b0}", "\u{1f900}", "\u{1fa60}", "\u{1fa70}", "\u{1fa80}", "\u{1fa90}", "\u{1fabf}", "\u{1face}", "\u{1fae0}", "\u{1faf0}", "\u{1fb00}", "\u{1fb94}", "\u{1fbf0}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", ]; const REGEXES: [&str; 2] = ["^\\p{Grapheme_Base}+$", "^\\p{Gr_Base}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_graphemeextend() { test_with_configs(unicode_escape_property_binary_graphemeextend_tc) } fn unicode_escape_property_binary_graphemeextend_tc(tc: TestConfig) { const CODE_POINTS: [&str; 376] = [ "\u{300}", "\u{483}", "\u{488}", "\u{591}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{5c7}", "\u{610}", "\u{64b}", "\u{670}", "\u{6d6}", "\u{6df}", "\u{6e7}", "\u{6ea}", "\u{711}", "\u{730}", "\u{7a6}", "\u{7eb}", "\u{7fd}", "\u{816}", "\u{81b}", "\u{825}", "\u{829}", "\u{859}", "\u{898}", "\u{8ca}", "\u{8e3}", "\u{93a}", "\u{93c}", "\u{941}", "\u{94d}", "\u{951}", "\u{962}", "\u{981}", "\u{9bc}", "\u{9be}", "\u{9c1}", "\u{9cd}", "\u{9d7}", "\u{9e2}", "\u{9fe}", "\u{a01}", "\u{a3c}", "\u{a41}", "\u{a47}", "\u{a4b}", "\u{a51}", "\u{a70}", "\u{a75}", "\u{a81}", "\u{abc}", "\u{ac1}", "\u{ac7}", "\u{acd}", "\u{ae2}", "\u{afa}", "\u{b01}", "\u{b3c}", "\u{b3e}", "\u{b3f}", "\u{b41}", "\u{b4d}", "\u{b55}", "\u{b57}", "\u{b62}", "\u{b82}", "\u{bbe}", "\u{bc0}", "\u{bcd}", "\u{bd7}", "\u{c00}", "\u{c04}", "\u{c3c}", "\u{c3e}", "\u{c46}", "\u{c4a}", "\u{c55}", "\u{c62}", "\u{c81}", "\u{cbc}", "\u{cbf}", "\u{cc2}", "\u{cc6}", "\u{ccc}", "\u{cd5}", "\u{ce2}", "\u{d00}", "\u{d3b}", "\u{d3e}", "\u{d41}", "\u{d4d}", "\u{d57}", "\u{d62}", "\u{d81}", "\u{dca}", "\u{dcf}", "\u{dd2}", "\u{dd6}", "\u{ddf}", "\u{e31}", "\u{e34}", "\u{e47}", "\u{eb1}", "\u{eb4}", "\u{ec8}", "\u{f18}", "\u{f35}", "\u{f37}", "\u{f39}", "\u{f71}", "\u{f80}", "\u{f86}", "\u{f8d}", "\u{f99}", "\u{fc6}", "\u{102d}", "\u{1032}", "\u{1039}", "\u{103d}", "\u{1058}", "\u{105e}", "\u{1071}", "\u{1082}", "\u{1085}", "\u{108d}", "\u{109d}", "\u{135d}", "\u{1712}", "\u{1732}", "\u{1752}", "\u{1772}", "\u{17b4}", "\u{17b7}", "\u{17c6}", "\u{17c9}", "\u{17dd}", "\u{180b}", "\u{180f}", "\u{1885}", "\u{18a9}", "\u{1920}", "\u{1927}", "\u{1932}", "\u{1939}", "\u{1a17}", "\u{1a1b}", "\u{1a56}", "\u{1a58}", "\u{1a60}", "\u{1a62}", "\u{1a65}", "\u{1a73}", "\u{1a7f}", "\u{1ab0}", "\u{1abe}", "\u{1abf}", "\u{1b00}", "\u{1b34}", "\u{1b35}", "\u{1b36}", "\u{1b3c}", "\u{1b42}", "\u{1b6b}", "\u{1b80}", "\u{1ba2}", "\u{1ba8}", "\u{1bab}", "\u{1be6}", "\u{1be8}", "\u{1bed}", "\u{1bef}", "\u{1c2c}", "\u{1c36}", "\u{1cd0}", "\u{1cd4}", "\u{1ce2}", "\u{1ced}", "\u{1cf4}", "\u{1cf8}", "\u{1dc0}", "\u{200c}", "\u{20d0}", "\u{20dd}", "\u{20e1}", "\u{20e2}", "\u{20e5}", "\u{2cef}", "\u{2d7f}", "\u{2de0}", "\u{302a}", "\u{302e}", "\u{3099}", "\u{a66f}", "\u{a670}", "\u{a674}", "\u{a69e}", "\u{a6f0}", "\u{a802}", "\u{a806}", "\u{a80b}", "\u{a825}", "\u{a82c}", "\u{a8c4}", "\u{a8e0}", "\u{a8ff}", "\u{a926}", "\u{a947}", "\u{a980}", "\u{a9b3}", "\u{a9b6}", "\u{a9bc}", "\u{a9e5}", "\u{aa29}", "\u{aa31}", "\u{aa35}", "\u{aa43}", "\u{aa4c}", "\u{aa7c}", "\u{aab0}", "\u{aab2}", "\u{aab7}", "\u{aabe}", "\u{aac1}", "\u{aaec}", "\u{aaf6}", "\u{abe5}", "\u{abe8}", "\u{abed}", "\u{fb1e}", "\u{fe00}", "\u{fe20}", "\u{ff9e}", "\u{101fd}", "\u{102e0}", "\u{10376}", "\u{10a01}", "\u{10a05}", "\u{10a0c}", "\u{10a38}", "\u{10a3f}", "\u{10ae5}", "\u{10d24}", "\u{10eab}", "\u{10efd}", "\u{10f46}", "\u{10f82}", "\u{11001}", "\u{11038}", "\u{11070}", "\u{11073}", "\u{1107f}", "\u{110b3}", "\u{110b9}", "\u{110c2}", "\u{11100}", "\u{11127}", "\u{1112d}", "\u{11173}", "\u{11180}", "\u{111b6}", "\u{111c9}", "\u{111cf}", "\u{1122f}", "\u{11234}", "\u{11236}", "\u{1123e}", "\u{11241}", "\u{112df}", "\u{112e3}", "\u{11300}", "\u{1133b}", "\u{1133e}", "\u{11340}", "\u{11357}", "\u{11366}", "\u{11370}", "\u{11438}", "\u{11442}", "\u{11446}", "\u{1145e}", "\u{114b0}", "\u{114b3}", "\u{114ba}", "\u{114bd}", "\u{114bf}", "\u{114c2}", "\u{115af}", "\u{115b2}", "\u{115bc}", "\u{115bf}", "\u{115dc}", "\u{11633}", "\u{1163d}", "\u{1163f}", "\u{116ab}", "\u{116ad}", "\u{116b0}", "\u{116b7}", "\u{1171d}", "\u{11722}", "\u{11727}", "\u{1182f}", "\u{11839}", "\u{11930}", "\u{1193b}", "\u{1193e}", "\u{11943}", "\u{119d4}", "\u{119da}", "\u{119e0}", "\u{11a01}", "\u{11a33}", "\u{11a3b}", "\u{11a47}", "\u{11a51}", "\u{11a59}", "\u{11a8a}", "\u{11a98}", "\u{11c30}", "\u{11c38}", "\u{11c3f}", "\u{11c92}", "\u{11caa}", "\u{11cb2}", "\u{11cb5}", "\u{11d31}", "\u{11d3a}", "\u{11d3c}", "\u{11d3f}", "\u{11d47}", "\u{11d90}", "\u{11d95}", "\u{11d97}", "\u{11ef3}", "\u{11f00}", "\u{11f36}", "\u{11f40}", "\u{11f42}", "\u{13440}", "\u{13447}", "\u{16af0}", "\u{16b30}", "\u{16f4f}", "\u{16f8f}", "\u{16fe4}", "\u{1bc9d}", "\u{1cf00}", "\u{1cf30}", "\u{1d165}", "\u{1d167}", "\u{1d16e}", "\u{1d17b}", "\u{1d185}", "\u{1d1aa}", "\u{1d242}", "\u{1da00}", "\u{1da3b}", "\u{1da75}", "\u{1da84}", "\u{1da9b}", "\u{1daa1}", "\u{1e000}", "\u{1e008}", "\u{1e01b}", "\u{1e023}", "\u{1e026}", "\u{1e08f}", "\u{1e130}", "\u{1e2ae}", "\u{1e2ec}", "\u{1e4ec}", "\u{1e8d0}", "\u{1e944}", "\u{e0020}", "\u{e0100}", ]; const REGEXES: [&str; 2] = ["^\\p{Grapheme_Extend}+$", "^\\p{Gr_Ext}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_idcontinue() { test_with_configs(unicode_escape_property_binary_idcontinue_tc) } fn unicode_escape_property_binary_idcontinue_tc(tc: TestConfig) { static CODE_POINTS: [&str; 1344] = [ "\u{30}", "\u{41}", "\u{5f}", "\u{61}", "\u{aa}", "\u{b5}", "\u{b7}", "\u{ba}", "\u{c0}", "\u{d8}", "\u{f8}", "\u{1bb}", "\u{1bc}", "\u{1c0}", "\u{1c4}", "\u{294}", "\u{295}", "\u{2b0}", "\u{2c6}", "\u{2e0}", "\u{2ec}", "\u{2ee}", "\u{300}", "\u{370}", "\u{374}", "\u{376}", "\u{37a}", "\u{37b}", "\u{37f}", "\u{386}", "\u{387}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3f7}", "\u{483}", "\u{48a}", "\u{531}", "\u{559}", "\u{560}", "\u{591}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{5c7}", "\u{5d0}", "\u{5ef}", "\u{610}", "\u{620}", "\u{640}", "\u{641}", "\u{64b}", "\u{660}", "\u{66e}", "\u{670}", "\u{671}", "\u{6d5}", "\u{6d6}", "\u{6df}", "\u{6e5}", "\u{6e7}", "\u{6ea}", "\u{6ee}", "\u{6f0}", "\u{6fa}", "\u{6ff}", "\u{710}", "\u{711}", "\u{712}", "\u{730}", "\u{74d}", "\u{7a6}", "\u{7b1}", "\u{7c0}", "\u{7ca}", "\u{7eb}", "\u{7f4}", "\u{7fa}", "\u{7fd}", "\u{800}", "\u{816}", "\u{81a}", "\u{81b}", "\u{824}", "\u{825}", "\u{828}", "\u{829}", "\u{840}", "\u{859}", "\u{860}", "\u{870}", "\u{889}", "\u{898}", "\u{8a0}", "\u{8c9}", "\u{8ca}", "\u{8e3}", "\u{903}", "\u{904}", "\u{93a}", "\u{93b}", "\u{93c}", "\u{93d}", "\u{93e}", "\u{941}", "\u{949}", "\u{94d}", "\u{94e}", "\u{950}", "\u{951}", "\u{958}", "\u{962}", "\u{966}", "\u{971}", "\u{972}", "\u{981}", "\u{982}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bc}", "\u{9bd}", "\u{9be}", "\u{9c1}", "\u{9c7}", "\u{9cb}", "\u{9cd}", "\u{9ce}", "\u{9d7}", "\u{9dc}", "\u{9df}", "\u{9e2}", "\u{9e6}", "\u{9f0}", "\u{9fc}", "\u{9fe}", "\u{a01}", "\u{a03}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a3c}", "\u{a3e}", "\u{a41}", "\u{a47}", "\u{a4b}", "\u{a51}", "\u{a59}", "\u{a5e}", "\u{a66}", "\u{a70}", "\u{a72}", "\u{a75}", "\u{a81}", "\u{a83}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abc}", "\u{abd}", "\u{abe}", "\u{ac1}", "\u{ac7}", "\u{ac9}", "\u{acb}", "\u{acd}", "\u{ad0}", "\u{ae0}", "\u{ae2}", "\u{ae6}", "\u{af9}", "\u{afa}", "\u{b01}", "\u{b02}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3c}", "\u{b3d}", "\u{b3e}", "\u{b3f}", "\u{b40}", "\u{b41}", "\u{b47}", "\u{b4b}", "\u{b4d}", "\u{b55}", "\u{b57}", "\u{b5c}", "\u{b5f}", "\u{b62}", "\u{b66}", "\u{b71}", "\u{b82}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bbe}", "\u{bc0}", "\u{bc1}", "\u{bc6}", "\u{bca}", "\u{bcd}", "\u{bd0}", "\u{bd7}", "\u{be6}", "\u{c00}", "\u{c01}", "\u{c04}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3c}", "\u{c3d}", "\u{c3e}", "\u{c41}", "\u{c46}", "\u{c4a}", "\u{c55}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c62}", "\u{c66}", "\u{c80}", "\u{c81}", "\u{c82}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbc}", "\u{cbd}", "\u{cbe}", "\u{cbf}", "\u{cc0}", "\u{cc6}", "\u{cc7}", "\u{cca}", "\u{ccc}", "\u{cd5}", "\u{cdd}", "\u{ce0}", "\u{ce2}", "\u{ce6}", "\u{cf1}", "\u{cf3}", "\u{d00}", "\u{d02}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3b}", "\u{d3d}", "\u{d3e}", "\u{d41}", "\u{d46}", "\u{d4a}", "\u{d4d}", "\u{d4e}", "\u{d54}", "\u{d57}", "\u{d5f}", "\u{d62}", "\u{d66}", "\u{d7a}", "\u{d81}", "\u{d82}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{dca}", "\u{dcf}", "\u{dd2}", "\u{dd6}", "\u{dd8}", "\u{de6}", "\u{df2}", "\u{e01}", "\u{e31}", "\u{e32}", "\u{e34}", "\u{e40}", "\u{e46}", "\u{e47}", "\u{e50}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb1}", "\u{eb2}", "\u{eb4}", "\u{ebd}", "\u{ec0}", "\u{ec6}", "\u{ec8}", "\u{ed0}", "\u{edc}", "\u{f00}", "\u{f18}", "\u{f20}", "\u{f35}", "\u{f37}", "\u{f39}", "\u{f3e}", "\u{f40}", "\u{f49}", "\u{f71}", "\u{f7f}", "\u{f80}", "\u{f86}", "\u{f88}", "\u{f8d}", "\u{f99}", "\u{fc6}", "\u{1000}", "\u{102b}", "\u{102d}", "\u{1031}", "\u{1032}", "\u{1038}", "\u{1039}", "\u{103b}", "\u{103d}", "\u{103f}", "\u{1040}", "\u{1050}", "\u{1056}", "\u{1058}", "\u{105a}", "\u{105e}", "\u{1061}", "\u{1062}", "\u{1065}", "\u{1067}", "\u{106e}", "\u{1071}", "\u{1075}", "\u{1082}", "\u{1083}", "\u{1085}", "\u{1087}", "\u{108d}", "\u{108e}", "\u{108f}", "\u{1090}", "\u{109a}", "\u{109d}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fc}", "\u{10fd}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{135d}", "\u{1369}", "\u{1380}", "\u{13a0}", "\u{13f8}", "\u{1401}", "\u{166f}", "\u{1681}", "\u{16a0}", "\u{16ee}", "\u{16f1}", "\u{1700}", "\u{1712}", "\u{1715}", "\u{171f}", "\u{1732}", "\u{1734}", "\u{1740}", "\u{1752}", "\u{1760}", "\u{176e}", "\u{1772}", "\u{1780}", "\u{17b4}", "\u{17b6}", "\u{17b7}", "\u{17be}", "\u{17c6}", "\u{17c7}", "\u{17c9}", "\u{17d7}", "\u{17dc}", "\u{17dd}", "\u{17e0}", "\u{180b}", "\u{180f}", "\u{1810}", "\u{1820}", "\u{1843}", "\u{1844}", "\u{1880}", "\u{1885}", "\u{1887}", "\u{18a9}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1920}", "\u{1923}", "\u{1927}", "\u{1929}", "\u{1930}", "\u{1932}", "\u{1933}", "\u{1939}", "\u{1946}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{19d0}", "\u{19da}", "\u{1a00}", "\u{1a17}", "\u{1a19}", "\u{1a1b}", "\u{1a20}", "\u{1a55}", "\u{1a56}", "\u{1a57}", "\u{1a58}", "\u{1a60}", "\u{1a61}", "\u{1a62}", "\u{1a63}", "\u{1a65}", "\u{1a6d}", "\u{1a73}", "\u{1a7f}", "\u{1a80}", "\u{1a90}", "\u{1aa7}", "\u{1ab0}", "\u{1abf}", "\u{1b00}", "\u{1b04}", "\u{1b05}", "\u{1b34}", "\u{1b35}", "\u{1b36}", "\u{1b3b}", "\u{1b3c}", "\u{1b3d}", "\u{1b42}", "\u{1b43}", "\u{1b45}", "\u{1b50}", "\u{1b6b}", "\u{1b80}", "\u{1b82}", "\u{1b83}", "\u{1ba1}", "\u{1ba2}", "\u{1ba6}", "\u{1ba8}", "\u{1baa}", "\u{1bab}", "\u{1bae}", "\u{1bb0}", "\u{1bba}", "\u{1be6}", "\u{1be7}", "\u{1be8}", "\u{1bea}", "\u{1bed}", "\u{1bee}", "\u{1bef}", "\u{1bf2}", "\u{1c00}", "\u{1c24}", "\u{1c2c}", "\u{1c34}", "\u{1c36}", "\u{1c40}", "\u{1c4d}", "\u{1c50}", "\u{1c5a}", "\u{1c78}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1cd0}", "\u{1cd4}", "\u{1ce1}", "\u{1ce2}", "\u{1ce9}", "\u{1ced}", "\u{1cee}", "\u{1cf4}", "\u{1cf5}", "\u{1cf7}", "\u{1cf8}", "\u{1cfa}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1dc0}", "\u{1e00}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{200c}", "\u{203f}", "\u{2054}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{20d0}", "\u{20e1}", "\u{20e5}", "\u{2102}", "\u{2107}", "\u{210a}", "\u{2115}", "\u{2118}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{212e}", "\u{212f}", "\u{2135}", "\u{2139}", "\u{213c}", "\u{2145}", "\u{214e}", "\u{2160}", "\u{2183}", "\u{2185}", "\u{2c00}", "\u{2c7c}", "\u{2c7e}", "\u{2ceb}", "\u{2cef}", "\u{2cf2}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{2d30}", "\u{2d6f}", "\u{2d7f}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{2de0}", "\u{3005}", "\u{3006}", "\u{3007}", "\u{3021}", "\u{302a}", "\u{302e}", "\u{3031}", "\u{3038}", "\u{303b}", "\u{303c}", "\u{3041}", "\u{3099}", "\u{309b}", "\u{309d}", "\u{309f}", "\u{30a1}", "\u{30fb}", "\u{30fc}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{31a0}", "\u{31f0}", "\u{3400}", "\u{4e00}", "\u{a015}", "\u{a016}", "\u{a4d0}", "\u{a4f8}", "\u{a500}", "\u{a60c}", "\u{a610}", "\u{a620}", "\u{a62a}", "\u{a640}", "\u{a66e}", "\u{a66f}", "\u{a674}", "\u{a67f}", "\u{a680}", "\u{a69c}", "\u{a69e}", "\u{a6a0}", "\u{a6e6}", "\u{a6f0}", "\u{a717}", "\u{a722}", "\u{a770}", "\u{a771}", "\u{a788}", "\u{a78b}", "\u{a78f}", "\u{a790}", "\u{a7d0}", "\u{a7d3}", "\u{a7d5}", "\u{a7f2}", "\u{a7f5}", "\u{a7f7}", "\u{a7f8}", "\u{a7fa}", "\u{a7fb}", "\u{a802}", "\u{a803}", "\u{a806}", "\u{a807}", "\u{a80b}", "\u{a80c}", "\u{a823}", "\u{a825}", "\u{a827}", "\u{a82c}", "\u{a840}", "\u{a880}", "\u{a882}", "\u{a8b4}", "\u{a8c4}", "\u{a8d0}", "\u{a8e0}", "\u{a8f2}", "\u{a8fb}", "\u{a8fd}", "\u{a8ff}", "\u{a900}", "\u{a90a}", "\u{a926}", "\u{a930}", "\u{a947}", "\u{a952}", "\u{a960}", "\u{a980}", "\u{a983}", "\u{a984}", "\u{a9b3}", "\u{a9b4}", "\u{a9b6}", "\u{a9ba}", "\u{a9bc}", "\u{a9be}", "\u{a9cf}", "\u{a9d0}", "\u{a9e0}", "\u{a9e5}", "\u{a9e6}", "\u{a9e7}", "\u{a9f0}", "\u{a9fa}", "\u{aa00}", "\u{aa29}", "\u{aa2f}", "\u{aa31}", "\u{aa33}", "\u{aa35}", "\u{aa40}", "\u{aa43}", "\u{aa44}", "\u{aa4c}", "\u{aa4d}", "\u{aa50}", "\u{aa60}", "\u{aa70}", "\u{aa71}", "\u{aa7a}", "\u{aa7b}", "\u{aa7c}", "\u{aa7d}", "\u{aa7e}", "\u{aab0}", "\u{aab1}", "\u{aab2}", "\u{aab5}", "\u{aab7}", "\u{aab9}", "\u{aabe}", "\u{aac0}", "\u{aac1}", "\u{aac2}", "\u{aadb}", "\u{aadd}", "\u{aae0}", "\u{aaeb}", "\u{aaec}", "\u{aaee}", "\u{aaf2}", "\u{aaf3}", "\u{aaf5}", "\u{aaf6}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{ab30}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab70}", "\u{abc0}", "\u{abe3}", "\u{abe5}", "\u{abe6}", "\u{abe8}", "\u{abe9}", "\u{abec}", "\u{abed}", "\u{abf0}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb00}", "\u{fb13}", "\u{fb1d}", "\u{fb1e}", "\u{fb1f}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fe00}", "\u{fe20}", "\u{fe33}", "\u{fe4d}", "\u{fe70}", "\u{fe76}", "\u{ff10}", "\u{ff21}", "\u{ff3f}", "\u{ff41}", "\u{ff65}", "\u{ff66}", "\u{ff70}", "\u{ff71}", "\u{ff9e}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10140}", "\u{101fd}", "\u{10280}", "\u{102a0}", "\u{102e0}", "\u{10300}", "\u{1032d}", "\u{10341}", "\u{10342}", "\u{1034a}", "\u{10350}", "\u{10376}", "\u{10380}", "\u{103a0}", "\u{103c8}", "\u{103d1}", "\u{10400}", "\u{10450}", "\u{104a0}", "\u{104b0}", "\u{104d8}", "\u{10500}", "\u{10530}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10860}", "\u{10880}", "\u{108e0}", "\u{108f4}", "\u{10900}", "\u{10920}", "\u{10980}", "\u{109be}", "\u{10a00}", "\u{10a01}", "\u{10a05}", "\u{10a0c}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a38}", "\u{10a3f}", "\u{10a60}", "\u{10a80}", "\u{10ac0}", "\u{10ac9}", "\u{10ae5}", "\u{10b00}", "\u{10b40}", "\u{10b60}", "\u{10b80}", "\u{10c00}", "\u{10c80}", "\u{10cc0}", "\u{10d00}", "\u{10d24}", "\u{10d30}", "\u{10e80}", "\u{10eab}", "\u{10eb0}", "\u{10efd}", "\u{10f00}", "\u{10f27}", "\u{10f30}", "\u{10f46}", "\u{10f70}", "\u{10f82}", "\u{10fb0}", "\u{10fe0}", "\u{11000}", "\u{11001}", "\u{11002}", "\u{11003}", "\u{11038}", "\u{11066}", "\u{11070}", "\u{11071}", "\u{11073}", "\u{11075}", "\u{1107f}", "\u{11082}", "\u{11083}", "\u{110b0}", "\u{110b3}", "\u{110b7}", "\u{110b9}", "\u{110c2}", "\u{110d0}", "\u{110f0}", "\u{11100}", "\u{11103}", "\u{11127}", "\u{1112c}", "\u{1112d}", "\u{11136}", "\u{11144}", "\u{11145}", "\u{11147}", "\u{11150}", "\u{11173}", "\u{11176}", "\u{11180}", "\u{11182}", "\u{11183}", "\u{111b3}", "\u{111b6}", "\u{111bf}", "\u{111c1}", "\u{111c9}", "\u{111ce}", "\u{111cf}", "\u{111d0}", "\u{111da}", "\u{111dc}", "\u{11200}", "\u{11213}", "\u{1122c}", "\u{1122f}", "\u{11232}", "\u{11234}", "\u{11235}", "\u{11236}", "\u{1123e}", "\u{1123f}", "\u{11241}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112b0}", "\u{112df}", "\u{112e0}", "\u{112e3}", "\u{112f0}", "\u{11300}", "\u{11302}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133b}", "\u{1133d}", "\u{1133e}", "\u{11340}", "\u{11341}", "\u{11347}", "\u{1134b}", "\u{11350}", "\u{11357}", "\u{1135d}", "\u{11362}", "\u{11366}", "\u{11370}", "\u{11400}", "\u{11435}", "\u{11438}", "\u{11440}", "\u{11442}", "\u{11445}", "\u{11446}", "\u{11447}", "\u{11450}", "\u{1145e}", "\u{1145f}", "\u{11480}", "\u{114b0}", "\u{114b3}", "\u{114b9}", "\u{114ba}", "\u{114bb}", "\u{114bf}", "\u{114c1}", "\u{114c2}", "\u{114c4}", "\u{114c7}", "\u{114d0}", "\u{11580}", "\u{115af}", "\u{115b2}", "\u{115b8}", "\u{115bc}", "\u{115be}", "\u{115bf}", "\u{115d8}", "\u{115dc}", "\u{11600}", "\u{11630}", "\u{11633}", "\u{1163b}", "\u{1163d}", "\u{1163e}", "\u{1163f}", "\u{11644}", "\u{11650}", "\u{11680}", "\u{116ab}", "\u{116ac}", "\u{116ad}", "\u{116ae}", "\u{116b0}", "\u{116b6}", "\u{116b7}", "\u{116b8}", "\u{116c0}", "\u{11700}", "\u{1171d}", "\u{11720}", "\u{11722}", "\u{11726}", "\u{11727}", "\u{11730}", "\u{11740}", "\u{11800}", "\u{1182c}", "\u{1182f}", "\u{11838}", "\u{11839}", "\u{118a0}", "\u{118e0}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{11930}", "\u{11937}", "\u{1193b}", "\u{1193d}", "\u{1193e}", "\u{1193f}", "\u{11940}", "\u{11941}", "\u{11942}", "\u{11943}", "\u{11950}", "\u{119a0}", "\u{119aa}", "\u{119d1}", "\u{119d4}", "\u{119da}", "\u{119dc}", "\u{119e0}", "\u{119e1}", "\u{119e3}", "\u{119e4}", "\u{11a00}", "\u{11a01}", "\u{11a0b}", "\u{11a33}", "\u{11a39}", "\u{11a3a}", "\u{11a3b}", "\u{11a47}", "\u{11a50}", "\u{11a51}", "\u{11a57}", "\u{11a59}", "\u{11a5c}", "\u{11a8a}", "\u{11a97}", "\u{11a98}", "\u{11a9d}", "\u{11ab0}", "\u{11c00}", "\u{11c0a}", "\u{11c2f}", "\u{11c30}", "\u{11c38}", "\u{11c3e}", "\u{11c3f}", "\u{11c40}", "\u{11c50}", "\u{11c72}", "\u{11c92}", "\u{11ca9}", "\u{11caa}", "\u{11cb1}", "\u{11cb2}", "\u{11cb4}", "\u{11cb5}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d31}", "\u{11d3a}", "\u{11d3c}", "\u{11d3f}", "\u{11d46}", "\u{11d47}", "\u{11d50}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d8a}", "\u{11d90}", "\u{11d93}", "\u{11d95}", "\u{11d96}", "\u{11d97}", "\u{11d98}", "\u{11da0}", "\u{11ee0}", "\u{11ef3}", "\u{11ef5}", "\u{11f00}", "\u{11f02}", "\u{11f03}", "\u{11f04}", "\u{11f12}", "\u{11f34}", "\u{11f36}", "\u{11f3e}", "\u{11f40}", "\u{11f41}", "\u{11f42}", "\u{11f50}", "\u{11fb0}", "\u{12000}", "\u{12400}", "\u{12480}", "\u{12f90}", "\u{13000}", "\u{13440}", "\u{13441}", "\u{13447}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a60}", "\u{16a70}", "\u{16ac0}", "\u{16ad0}", "\u{16af0}", "\u{16b00}", "\u{16b30}", "\u{16b40}", "\u{16b50}", "\u{16b63}", "\u{16b7d}", "\u{16e40}", "\u{16f00}", "\u{16f4f}", "\u{16f50}", "\u{16f51}", "\u{16f8f}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{16fe4}", "\u{16ff0}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1bc9d}", "\u{1cf00}", "\u{1cf30}", "\u{1d165}", "\u{1d167}", "\u{1d16d}", "\u{1d17b}", "\u{1d185}", "\u{1d1aa}", "\u{1d242}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1d7ce}", "\u{1da00}", "\u{1da3b}", "\u{1da75}", "\u{1da84}", "\u{1da9b}", "\u{1daa1}", "\u{1df00}", "\u{1df0a}", "\u{1df0b}", "\u{1df25}", "\u{1e000}", "\u{1e008}", "\u{1e01b}", "\u{1e023}", "\u{1e026}", "\u{1e030}", "\u{1e08f}", "\u{1e100}", "\u{1e130}", "\u{1e137}", "\u{1e140}", "\u{1e14e}", "\u{1e290}", "\u{1e2ae}", "\u{1e2c0}", "\u{1e2ec}", "\u{1e2f0}", "\u{1e4d0}", "\u{1e4eb}", "\u{1e4ec}", "\u{1e4f0}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1e8d0}", "\u{1e900}", "\u{1e944}", "\u{1e94b}", "\u{1e950}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{1fbf0}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", "\u{e0100}", ]; const REGEXES: [&str; 2] = ["^\\p{ID_Continue}+$", "^\\p{IDC}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_idstart() { test_with_configs(unicode_escape_property_binary_idstart_tc) } fn unicode_escape_property_binary_idstart_tc(tc: TestConfig) { const CODE_POINTS: [&str; 740] = [ "\u{41}", "\u{61}", "\u{aa}", "\u{b5}", "\u{ba}", "\u{c0}", "\u{d8}", "\u{f8}", "\u{1bb}", "\u{1bc}", "\u{1c0}", "\u{1c4}", "\u{294}", "\u{295}", "\u{2b0}", "\u{2c6}", "\u{2e0}", "\u{2ec}", "\u{2ee}", "\u{370}", "\u{374}", "\u{376}", "\u{37a}", "\u{37b}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3f7}", "\u{48a}", "\u{531}", "\u{559}", "\u{560}", "\u{5d0}", "\u{5ef}", "\u{620}", "\u{640}", "\u{641}", "\u{66e}", "\u{671}", "\u{6d5}", "\u{6e5}", "\u{6ee}", "\u{6fa}", "\u{6ff}", "\u{710}", "\u{712}", "\u{74d}", "\u{7b1}", "\u{7ca}", "\u{7f4}", "\u{7fa}", "\u{800}", "\u{81a}", "\u{824}", "\u{828}", "\u{840}", "\u{860}", "\u{870}", "\u{889}", "\u{8a0}", "\u{8c9}", "\u{904}", "\u{93d}", "\u{950}", "\u{958}", "\u{971}", "\u{972}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bd}", "\u{9ce}", "\u{9dc}", "\u{9df}", "\u{9f0}", "\u{9fc}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a59}", "\u{a5e}", "\u{a72}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abd}", "\u{ad0}", "\u{ae0}", "\u{af9}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3d}", "\u{b5c}", "\u{b5f}", "\u{b71}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bd0}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3d}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c80}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbd}", "\u{cdd}", "\u{ce0}", "\u{cf1}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3d}", "\u{d4e}", "\u{d54}", "\u{d5f}", "\u{d7a}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{e01}", "\u{e32}", "\u{e40}", "\u{e46}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb2}", "\u{ebd}", "\u{ec0}", "\u{ec6}", "\u{edc}", "\u{f00}", "\u{f40}", "\u{f49}", "\u{f88}", "\u{1000}", "\u{103f}", "\u{1050}", "\u{105a}", "\u{1061}", "\u{1065}", "\u{106e}", "\u{1075}", "\u{108e}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fc}", "\u{10fd}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{1380}", "\u{13a0}", "\u{13f8}", "\u{1401}", "\u{166f}", "\u{1681}", "\u{16a0}", "\u{16ee}", "\u{16f1}", "\u{1700}", "\u{171f}", "\u{1740}", "\u{1760}", "\u{176e}", "\u{1780}", "\u{17d7}", "\u{17dc}", "\u{1820}", "\u{1843}", "\u{1844}", "\u{1880}", "\u{1885}", "\u{1887}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{1a00}", "\u{1a20}", "\u{1aa7}", "\u{1b05}", "\u{1b45}", "\u{1b83}", "\u{1bae}", "\u{1bba}", "\u{1c00}", "\u{1c4d}", "\u{1c5a}", "\u{1c78}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1ce9}", "\u{1cee}", "\u{1cf5}", "\u{1cfa}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1e00}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{2102}", "\u{2107}", "\u{210a}", "\u{2115}", "\u{2118}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{212e}", "\u{212f}", "\u{2135}", "\u{2139}", "\u{213c}", "\u{2145}", "\u{214e}", "\u{2160}", "\u{2183}", "\u{2185}", "\u{2c00}", "\u{2c7c}", "\u{2c7e}", "\u{2ceb}", "\u{2cf2}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{2d30}", "\u{2d6f}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{3005}", "\u{3006}", "\u{3007}", "\u{3021}", "\u{3031}", "\u{3038}", "\u{303b}", "\u{303c}", "\u{3041}", "\u{309b}", "\u{309d}", "\u{309f}", "\u{30a1}", "\u{30fc}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{31a0}", "\u{31f0}", "\u{3400}", "\u{4e00}", "\u{a015}", "\u{a016}", "\u{a4d0}", "\u{a4f8}", "\u{a500}", "\u{a60c}", "\u{a610}", "\u{a62a}", "\u{a640}", "\u{a66e}", "\u{a67f}", "\u{a680}", "\u{a69c}", "\u{a6a0}", "\u{a6e6}", "\u{a717}", "\u{a722}", "\u{a770}", "\u{a771}", "\u{a788}", "\u{a78b}", "\u{a78f}", "\u{a790}", "\u{a7d0}", "\u{a7d3}", "\u{a7d5}", "\u{a7f2}", "\u{a7f5}", "\u{a7f7}", "\u{a7f8}", "\u{a7fa}", "\u{a7fb}", "\u{a803}", "\u{a807}", "\u{a80c}", "\u{a840}", "\u{a882}", "\u{a8f2}", "\u{a8fb}", "\u{a8fd}", "\u{a90a}", "\u{a930}", "\u{a960}", "\u{a984}", "\u{a9cf}", "\u{a9e0}", "\u{a9e6}", "\u{a9e7}", "\u{a9fa}", "\u{aa00}", "\u{aa40}", "\u{aa44}", "\u{aa60}", "\u{aa70}", "\u{aa71}", "\u{aa7a}", "\u{aa7e}", "\u{aab1}", "\u{aab5}", "\u{aab9}", "\u{aac0}", "\u{aac2}", "\u{aadb}", "\u{aadd}", "\u{aae0}", "\u{aaf2}", "\u{aaf3}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{ab30}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab70}", "\u{abc0}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb00}", "\u{fb13}", "\u{fb1d}", "\u{fb1f}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fe70}", "\u{fe76}", "\u{ff21}", "\u{ff41}", "\u{ff66}", "\u{ff70}", "\u{ff71}", "\u{ff9e}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10140}", "\u{10280}", "\u{102a0}", "\u{10300}", "\u{1032d}", "\u{10341}", "\u{10342}", "\u{1034a}", "\u{10350}", "\u{10380}", "\u{103a0}", "\u{103c8}", "\u{103d1}", "\u{10400}", "\u{10450}", "\u{104b0}", "\u{104d8}", "\u{10500}", "\u{10530}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10860}", "\u{10880}", "\u{108e0}", "\u{108f4}", "\u{10900}", "\u{10920}", "\u{10980}", "\u{109be}", "\u{10a00}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a60}", "\u{10a80}", "\u{10ac0}", "\u{10ac9}", "\u{10b00}", "\u{10b40}", "\u{10b60}", "\u{10b80}", "\u{10c00}", "\u{10c80}", "\u{10cc0}", "\u{10d00}", "\u{10e80}", "\u{10eb0}", "\u{10f00}", "\u{10f27}", "\u{10f30}", "\u{10f70}", "\u{10fb0}", "\u{10fe0}", "\u{11003}", "\u{11071}", "\u{11075}", "\u{11083}", "\u{110d0}", "\u{11103}", "\u{11144}", "\u{11147}", "\u{11150}", "\u{11176}", "\u{11183}", "\u{111c1}", "\u{111da}", "\u{111dc}", "\u{11200}", "\u{11213}", "\u{1123f}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112b0}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133d}", "\u{11350}", "\u{1135d}", "\u{11400}", "\u{11447}", "\u{1145f}", "\u{11480}", "\u{114c4}", "\u{114c7}", "\u{11580}", "\u{115d8}", "\u{11600}", "\u{11644}", "\u{11680}", "\u{116b8}", "\u{11700}", "\u{11740}", "\u{11800}", "\u{118a0}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{1193f}", "\u{11941}", "\u{119a0}", "\u{119aa}", "\u{119e1}", "\u{119e3}", "\u{11a00}", "\u{11a0b}", "\u{11a3a}", "\u{11a50}", "\u{11a5c}", "\u{11a9d}", "\u{11ab0}", "\u{11c00}", "\u{11c0a}", "\u{11c40}", "\u{11c72}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d46}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d98}", "\u{11ee0}", "\u{11f02}", "\u{11f04}", "\u{11f12}", "\u{11fb0}", "\u{12000}", "\u{12400}", "\u{12480}", "\u{12f90}", "\u{13000}", "\u{13441}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a70}", "\u{16ad0}", "\u{16b00}", "\u{16b40}", "\u{16b63}", "\u{16b7d}", "\u{16e40}", "\u{16f00}", "\u{16f50}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1df00}", "\u{1df0a}", "\u{1df0b}", "\u{1df25}", "\u{1e030}", "\u{1e100}", "\u{1e137}", "\u{1e14e}", "\u{1e290}", "\u{1e2c0}", "\u{1e4d0}", "\u{1e4eb}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1e900}", "\u{1e94b}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", ]; const REGEXES: [&str; 2] = ["^\\p{ID_Start}+$", "^\\p{IDS}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_math() { test_with_configs(unicode_escape_property_binary_math_tc) } fn unicode_escape_property_binary_math_tc(tc: TestConfig) { const CODE_POINTS: [&str; 240] = [ "\u{2b}", "\u{3c}", "\u{5e}", "\u{7c}", "\u{7e}", "\u{ac}", "\u{b1}", "\u{d7}", "\u{f7}", "\u{3d0}", "\u{3d5}", "\u{3f0}", "\u{3f4}", "\u{3f6}", "\u{606}", "\u{2016}", "\u{2032}", "\u{2040}", "\u{2044}", "\u{2052}", "\u{2061}", "\u{207a}", "\u{207d}", "\u{207e}", "\u{208a}", "\u{208d}", "\u{208e}", "\u{20d0}", "\u{20e1}", "\u{20e5}", "\u{20eb}", "\u{2102}", "\u{2107}", "\u{210a}", "\u{2115}", "\u{2118}", "\u{2119}", "\u{2124}", "\u{2128}", "\u{2129}", "\u{212c}", "\u{212f}", "\u{2133}", "\u{2135}", "\u{213c}", "\u{2140}", "\u{2145}", "\u{214b}", "\u{2190}", "\u{2195}", "\u{219a}", "\u{219c}", "\u{21a0}", "\u{21a1}", "\u{21a3}", "\u{21a4}", "\u{21a6}", "\u{21a7}", "\u{21a9}", "\u{21ae}", "\u{21b0}", "\u{21b6}", "\u{21bc}", "\u{21ce}", "\u{21d0}", "\u{21d2}", "\u{21d3}", "\u{21d4}", "\u{21d5}", "\u{21dd}", "\u{21e4}", "\u{21f4}", "\u{2308}", "\u{2309}", "\u{230a}", "\u{230b}", "\u{2320}", "\u{237c}", "\u{239b}", "\u{23b4}", "\u{23b7}", "\u{23d0}", "\u{23dc}", "\u{23e2}", "\u{25a0}", "\u{25ae}", "\u{25b7}", "\u{25bc}", "\u{25c1}", "\u{25c6}", "\u{25ca}", "\u{25cf}", "\u{25e2}", "\u{25e4}", "\u{25e7}", "\u{25f8}", "\u{2605}", "\u{2640}", "\u{2642}", "\u{2660}", "\u{266d}", "\u{266f}", "\u{27c0}", "\u{27c5}", "\u{27c6}", "\u{27c7}", "\u{27e6}", "\u{27e7}", "\u{27e8}", "\u{27e9}", "\u{27ea}", "\u{27eb}", "\u{27ec}", "\u{27ed}", "\u{27ee}", "\u{27ef}", "\u{27f0}", "\u{2900}", "\u{2983}", "\u{2984}", "\u{2985}", "\u{2986}", "\u{2987}", "\u{2988}", "\u{2989}", "\u{298a}", "\u{298b}", "\u{298c}", "\u{298d}", "\u{298e}", "\u{298f}", "\u{2990}", "\u{2991}", "\u{2992}", "\u{2993}", "\u{2994}", "\u{2995}", "\u{2996}", "\u{2997}", "\u{2998}", "\u{2999}", "\u{29d8}", "\u{29d9}", "\u{29da}", "\u{29db}", "\u{29dc}", "\u{29fc}", "\u{29fd}", "\u{29fe}", "\u{2b30}", "\u{2b47}", "\u{fb29}", "\u{fe61}", "\u{fe62}", "\u{fe63}", "\u{fe64}", "\u{fe68}", "\u{ff0b}", "\u{ff1c}", "\u{ff3c}", "\u{ff3e}", "\u{ff5c}", "\u{ff5e}", "\u{ffe2}", "\u{ffe9}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c1}", "\u{1d6c2}", "\u{1d6db}", "\u{1d6dc}", "\u{1d6fb}", "\u{1d6fc}", "\u{1d715}", "\u{1d716}", "\u{1d735}", "\u{1d736}", "\u{1d74f}", "\u{1d750}", "\u{1d76f}", "\u{1d770}", "\u{1d789}", "\u{1d78a}", "\u{1d7a9}", "\u{1d7aa}", "\u{1d7c3}", "\u{1d7c4}", "\u{1d7ce}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{1eef0}", ]; const REGEXES: [&str; 1] = ["^\\p{Math}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_xidcontinue() { test_with_configs(unicode_escape_property_binary_xidcontinue_tc) } fn unicode_escape_property_binary_xidcontinue_tc(tc: TestConfig) { static CODE_POINTS: [&str; 1348] = [ "\u{30}", "\u{41}", "\u{5f}", "\u{61}", "\u{aa}", "\u{b5}", "\u{b7}", "\u{ba}", "\u{c0}", "\u{d8}", "\u{f8}", "\u{1bb}", "\u{1bc}", "\u{1c0}", "\u{1c4}", "\u{294}", "\u{295}", "\u{2b0}", "\u{2c6}", "\u{2e0}", "\u{2ec}", "\u{2ee}", "\u{300}", "\u{370}", "\u{374}", "\u{376}", "\u{37b}", "\u{37f}", "\u{386}", "\u{387}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3f7}", "\u{483}", "\u{48a}", "\u{531}", "\u{559}", "\u{560}", "\u{591}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{5c7}", "\u{5d0}", "\u{5ef}", "\u{610}", "\u{620}", "\u{640}", "\u{641}", "\u{64b}", "\u{660}", "\u{66e}", "\u{670}", "\u{671}", "\u{6d5}", "\u{6d6}", "\u{6df}", "\u{6e5}", "\u{6e7}", "\u{6ea}", "\u{6ee}", "\u{6f0}", "\u{6fa}", "\u{6ff}", "\u{710}", "\u{711}", "\u{712}", "\u{730}", "\u{74d}", "\u{7a6}", "\u{7b1}", "\u{7c0}", "\u{7ca}", "\u{7eb}", "\u{7f4}", "\u{7fa}", "\u{7fd}", "\u{800}", "\u{816}", "\u{81a}", "\u{81b}", "\u{824}", "\u{825}", "\u{828}", "\u{829}", "\u{840}", "\u{859}", "\u{860}", "\u{870}", "\u{889}", "\u{898}", "\u{8a0}", "\u{8c9}", "\u{8ca}", "\u{8e3}", "\u{903}", "\u{904}", "\u{93a}", "\u{93b}", "\u{93c}", "\u{93d}", "\u{93e}", "\u{941}", "\u{949}", "\u{94d}", "\u{94e}", "\u{950}", "\u{951}", "\u{958}", "\u{962}", "\u{966}", "\u{971}", "\u{972}", "\u{981}", "\u{982}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bc}", "\u{9bd}", "\u{9be}", "\u{9c1}", "\u{9c7}", "\u{9cb}", "\u{9cd}", "\u{9ce}", "\u{9d7}", "\u{9dc}", "\u{9df}", "\u{9e2}", "\u{9e6}", "\u{9f0}", "\u{9fc}", "\u{9fe}", "\u{a01}", "\u{a03}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a3c}", "\u{a3e}", "\u{a41}", "\u{a47}", "\u{a4b}", "\u{a51}", "\u{a59}", "\u{a5e}", "\u{a66}", "\u{a70}", "\u{a72}", "\u{a75}", "\u{a81}", "\u{a83}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abc}", "\u{abd}", "\u{abe}", "\u{ac1}", "\u{ac7}", "\u{ac9}", "\u{acb}", "\u{acd}", "\u{ad0}", "\u{ae0}", "\u{ae2}", "\u{ae6}", "\u{af9}", "\u{afa}", "\u{b01}", "\u{b02}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3c}", "\u{b3d}", "\u{b3e}", "\u{b3f}", "\u{b40}", "\u{b41}", "\u{b47}", "\u{b4b}", "\u{b4d}", "\u{b55}", "\u{b57}", "\u{b5c}", "\u{b5f}", "\u{b62}", "\u{b66}", "\u{b71}", "\u{b82}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bbe}", "\u{bc0}", "\u{bc1}", "\u{bc6}", "\u{bca}", "\u{bcd}", "\u{bd0}", "\u{bd7}", "\u{be6}", "\u{c00}", "\u{c01}", "\u{c04}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3c}", "\u{c3d}", "\u{c3e}", "\u{c41}", "\u{c46}", "\u{c4a}", "\u{c55}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c62}", "\u{c66}", "\u{c80}", "\u{c81}", "\u{c82}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbc}", "\u{cbd}", "\u{cbe}", "\u{cbf}", "\u{cc0}", "\u{cc6}", "\u{cc7}", "\u{cca}", "\u{ccc}", "\u{cd5}", "\u{cdd}", "\u{ce0}", "\u{ce2}", "\u{ce6}", "\u{cf1}", "\u{cf3}", "\u{d00}", "\u{d02}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3b}", "\u{d3d}", "\u{d3e}", "\u{d41}", "\u{d46}", "\u{d4a}", "\u{d4d}", "\u{d4e}", "\u{d54}", "\u{d57}", "\u{d5f}", "\u{d62}", "\u{d66}", "\u{d7a}", "\u{d81}", "\u{d82}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{dca}", "\u{dcf}", "\u{dd2}", "\u{dd6}", "\u{dd8}", "\u{de6}", "\u{df2}", "\u{e01}", "\u{e31}", "\u{e32}", "\u{e34}", "\u{e40}", "\u{e46}", "\u{e47}", "\u{e50}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb1}", "\u{eb2}", "\u{eb4}", "\u{ebd}", "\u{ec0}", "\u{ec6}", "\u{ec8}", "\u{ed0}", "\u{edc}", "\u{f00}", "\u{f18}", "\u{f20}", "\u{f35}", "\u{f37}", "\u{f39}", "\u{f3e}", "\u{f40}", "\u{f49}", "\u{f71}", "\u{f7f}", "\u{f80}", "\u{f86}", "\u{f88}", "\u{f8d}", "\u{f99}", "\u{fc6}", "\u{1000}", "\u{102b}", "\u{102d}", "\u{1031}", "\u{1032}", "\u{1038}", "\u{1039}", "\u{103b}", "\u{103d}", "\u{103f}", "\u{1040}", "\u{1050}", "\u{1056}", "\u{1058}", "\u{105a}", "\u{105e}", "\u{1061}", "\u{1062}", "\u{1065}", "\u{1067}", "\u{106e}", "\u{1071}", "\u{1075}", "\u{1082}", "\u{1083}", "\u{1085}", "\u{1087}", "\u{108d}", "\u{108e}", "\u{108f}", "\u{1090}", "\u{109a}", "\u{109d}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fc}", "\u{10fd}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{135d}", "\u{1369}", "\u{1380}", "\u{13a0}", "\u{13f8}", "\u{1401}", "\u{166f}", "\u{1681}", "\u{16a0}", "\u{16ee}", "\u{16f1}", "\u{1700}", "\u{1712}", "\u{1715}", "\u{171f}", "\u{1732}", "\u{1734}", "\u{1740}", "\u{1752}", "\u{1760}", "\u{176e}", "\u{1772}", "\u{1780}", "\u{17b4}", "\u{17b6}", "\u{17b7}", "\u{17be}", "\u{17c6}", "\u{17c7}", "\u{17c9}", "\u{17d7}", "\u{17dc}", "\u{17dd}", "\u{17e0}", "\u{180b}", "\u{180f}", "\u{1810}", "\u{1820}", "\u{1843}", "\u{1844}", "\u{1880}", "\u{1885}", "\u{1887}", "\u{18a9}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1920}", "\u{1923}", "\u{1927}", "\u{1929}", "\u{1930}", "\u{1932}", "\u{1933}", "\u{1939}", "\u{1946}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{19d0}", "\u{19da}", "\u{1a00}", "\u{1a17}", "\u{1a19}", "\u{1a1b}", "\u{1a20}", "\u{1a55}", "\u{1a56}", "\u{1a57}", "\u{1a58}", "\u{1a60}", "\u{1a61}", "\u{1a62}", "\u{1a63}", "\u{1a65}", "\u{1a6d}", "\u{1a73}", "\u{1a7f}", "\u{1a80}", "\u{1a90}", "\u{1aa7}", "\u{1ab0}", "\u{1abf}", "\u{1b00}", "\u{1b04}", "\u{1b05}", "\u{1b34}", "\u{1b35}", "\u{1b36}", "\u{1b3b}", "\u{1b3c}", "\u{1b3d}", "\u{1b42}", "\u{1b43}", "\u{1b45}", "\u{1b50}", "\u{1b6b}", "\u{1b80}", "\u{1b82}", "\u{1b83}", "\u{1ba1}", "\u{1ba2}", "\u{1ba6}", "\u{1ba8}", "\u{1baa}", "\u{1bab}", "\u{1bae}", "\u{1bb0}", "\u{1bba}", "\u{1be6}", "\u{1be7}", "\u{1be8}", "\u{1bea}", "\u{1bed}", "\u{1bee}", "\u{1bef}", "\u{1bf2}", "\u{1c00}", "\u{1c24}", "\u{1c2c}", "\u{1c34}", "\u{1c36}", "\u{1c40}", "\u{1c4d}", "\u{1c50}", "\u{1c5a}", "\u{1c78}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1cd0}", "\u{1cd4}", "\u{1ce1}", "\u{1ce2}", "\u{1ce9}", "\u{1ced}", "\u{1cee}", "\u{1cf4}", "\u{1cf5}", "\u{1cf7}", "\u{1cf8}", "\u{1cfa}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1dc0}", "\u{1e00}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{200c}", "\u{203f}", "\u{2054}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{20d0}", "\u{20e1}", "\u{20e5}", "\u{2102}", "\u{2107}", "\u{210a}", "\u{2115}", "\u{2118}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{212e}", "\u{212f}", "\u{2135}", "\u{2139}", "\u{213c}", "\u{2145}", "\u{214e}", "\u{2160}", "\u{2183}", "\u{2185}", "\u{2c00}", "\u{2c7c}", "\u{2c7e}", "\u{2ceb}", "\u{2cef}", "\u{2cf2}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{2d30}", "\u{2d6f}", "\u{2d7f}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{2de0}", "\u{3005}", "\u{3006}", "\u{3007}", "\u{3021}", "\u{302a}", "\u{302e}", "\u{3031}", "\u{3038}", "\u{303b}", "\u{303c}", "\u{3041}", "\u{3099}", "\u{309d}", "\u{309f}", "\u{30a1}", "\u{30fb}", "\u{30fc}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{31a0}", "\u{31f0}", "\u{3400}", "\u{4e00}", "\u{a015}", "\u{a016}", "\u{a4d0}", "\u{a4f8}", "\u{a500}", "\u{a60c}", "\u{a610}", "\u{a620}", "\u{a62a}", "\u{a640}", "\u{a66e}", "\u{a66f}", "\u{a674}", "\u{a67f}", "\u{a680}", "\u{a69c}", "\u{a69e}", "\u{a6a0}", "\u{a6e6}", "\u{a6f0}", "\u{a717}", "\u{a722}", "\u{a770}", "\u{a771}", "\u{a788}", "\u{a78b}", "\u{a78f}", "\u{a790}", "\u{a7d0}", "\u{a7d3}", "\u{a7d5}", "\u{a7f2}", "\u{a7f5}", "\u{a7f7}", "\u{a7f8}", "\u{a7fa}", "\u{a7fb}", "\u{a802}", "\u{a803}", "\u{a806}", "\u{a807}", "\u{a80b}", "\u{a80c}", "\u{a823}", "\u{a825}", "\u{a827}", "\u{a82c}", "\u{a840}", "\u{a880}", "\u{a882}", "\u{a8b4}", "\u{a8c4}", "\u{a8d0}", "\u{a8e0}", "\u{a8f2}", "\u{a8fb}", "\u{a8fd}", "\u{a8ff}", "\u{a900}", "\u{a90a}", "\u{a926}", "\u{a930}", "\u{a947}", "\u{a952}", "\u{a960}", "\u{a980}", "\u{a983}", "\u{a984}", "\u{a9b3}", "\u{a9b4}", "\u{a9b6}", "\u{a9ba}", "\u{a9bc}", "\u{a9be}", "\u{a9cf}", "\u{a9d0}", "\u{a9e0}", "\u{a9e5}", "\u{a9e6}", "\u{a9e7}", "\u{a9f0}", "\u{a9fa}", "\u{aa00}", "\u{aa29}", "\u{aa2f}", "\u{aa31}", "\u{aa33}", "\u{aa35}", "\u{aa40}", "\u{aa43}", "\u{aa44}", "\u{aa4c}", "\u{aa4d}", "\u{aa50}", "\u{aa60}", "\u{aa70}", "\u{aa71}", "\u{aa7a}", "\u{aa7b}", "\u{aa7c}", "\u{aa7d}", "\u{aa7e}", "\u{aab0}", "\u{aab1}", "\u{aab2}", "\u{aab5}", "\u{aab7}", "\u{aab9}", "\u{aabe}", "\u{aac0}", "\u{aac1}", "\u{aac2}", "\u{aadb}", "\u{aadd}", "\u{aae0}", "\u{aaeb}", "\u{aaec}", "\u{aaee}", "\u{aaf2}", "\u{aaf3}", "\u{aaf5}", "\u{aaf6}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{ab30}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab70}", "\u{abc0}", "\u{abe3}", "\u{abe5}", "\u{abe6}", "\u{abe8}", "\u{abe9}", "\u{abec}", "\u{abed}", "\u{abf0}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb00}", "\u{fb13}", "\u{fb1d}", "\u{fb1e}", "\u{fb1f}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fc64}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fe00}", "\u{fe20}", "\u{fe33}", "\u{fe4d}", "\u{fe71}", "\u{fe73}", "\u{fe77}", "\u{fe79}", "\u{fe7b}", "\u{fe7d}", "\u{fe7f}", "\u{ff10}", "\u{ff21}", "\u{ff3f}", "\u{ff41}", "\u{ff65}", "\u{ff66}", "\u{ff70}", "\u{ff71}", "\u{ff9e}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10140}", "\u{101fd}", "\u{10280}", "\u{102a0}", "\u{102e0}", "\u{10300}", "\u{1032d}", "\u{10341}", "\u{10342}", "\u{1034a}", "\u{10350}", "\u{10376}", "\u{10380}", "\u{103a0}", "\u{103c8}", "\u{103d1}", "\u{10400}", "\u{10450}", "\u{104a0}", "\u{104b0}", "\u{104d8}", "\u{10500}", "\u{10530}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10860}", "\u{10880}", "\u{108e0}", "\u{108f4}", "\u{10900}", "\u{10920}", "\u{10980}", "\u{109be}", "\u{10a00}", "\u{10a01}", "\u{10a05}", "\u{10a0c}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a38}", "\u{10a3f}", "\u{10a60}", "\u{10a80}", "\u{10ac0}", "\u{10ac9}", "\u{10ae5}", "\u{10b00}", "\u{10b40}", "\u{10b60}", "\u{10b80}", "\u{10c00}", "\u{10c80}", "\u{10cc0}", "\u{10d00}", "\u{10d24}", "\u{10d30}", "\u{10e80}", "\u{10eab}", "\u{10eb0}", "\u{10efd}", "\u{10f00}", "\u{10f27}", "\u{10f30}", "\u{10f46}", "\u{10f70}", "\u{10f82}", "\u{10fb0}", "\u{10fe0}", "\u{11000}", "\u{11001}", "\u{11002}", "\u{11003}", "\u{11038}", "\u{11066}", "\u{11070}", "\u{11071}", "\u{11073}", "\u{11075}", "\u{1107f}", "\u{11082}", "\u{11083}", "\u{110b0}", "\u{110b3}", "\u{110b7}", "\u{110b9}", "\u{110c2}", "\u{110d0}", "\u{110f0}", "\u{11100}", "\u{11103}", "\u{11127}", "\u{1112c}", "\u{1112d}", "\u{11136}", "\u{11144}", "\u{11145}", "\u{11147}", "\u{11150}", "\u{11173}", "\u{11176}", "\u{11180}", "\u{11182}", "\u{11183}", "\u{111b3}", "\u{111b6}", "\u{111bf}", "\u{111c1}", "\u{111c9}", "\u{111ce}", "\u{111cf}", "\u{111d0}", "\u{111da}", "\u{111dc}", "\u{11200}", "\u{11213}", "\u{1122c}", "\u{1122f}", "\u{11232}", "\u{11234}", "\u{11235}", "\u{11236}", "\u{1123e}", "\u{1123f}", "\u{11241}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112b0}", "\u{112df}", "\u{112e0}", "\u{112e3}", "\u{112f0}", "\u{11300}", "\u{11302}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133b}", "\u{1133d}", "\u{1133e}", "\u{11340}", "\u{11341}", "\u{11347}", "\u{1134b}", "\u{11350}", "\u{11357}", "\u{1135d}", "\u{11362}", "\u{11366}", "\u{11370}", "\u{11400}", "\u{11435}", "\u{11438}", "\u{11440}", "\u{11442}", "\u{11445}", "\u{11446}", "\u{11447}", "\u{11450}", "\u{1145e}", "\u{1145f}", "\u{11480}", "\u{114b0}", "\u{114b3}", "\u{114b9}", "\u{114ba}", "\u{114bb}", "\u{114bf}", "\u{114c1}", "\u{114c2}", "\u{114c4}", "\u{114c7}", "\u{114d0}", "\u{11580}", "\u{115af}", "\u{115b2}", "\u{115b8}", "\u{115bc}", "\u{115be}", "\u{115bf}", "\u{115d8}", "\u{115dc}", "\u{11600}", "\u{11630}", "\u{11633}", "\u{1163b}", "\u{1163d}", "\u{1163e}", "\u{1163f}", "\u{11644}", "\u{11650}", "\u{11680}", "\u{116ab}", "\u{116ac}", "\u{116ad}", "\u{116ae}", "\u{116b0}", "\u{116b6}", "\u{116b7}", "\u{116b8}", "\u{116c0}", "\u{11700}", "\u{1171d}", "\u{11720}", "\u{11722}", "\u{11726}", "\u{11727}", "\u{11730}", "\u{11740}", "\u{11800}", "\u{1182c}", "\u{1182f}", "\u{11838}", "\u{11839}", "\u{118a0}", "\u{118e0}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{11930}", "\u{11937}", "\u{1193b}", "\u{1193d}", "\u{1193e}", "\u{1193f}", "\u{11940}", "\u{11941}", "\u{11942}", "\u{11943}", "\u{11950}", "\u{119a0}", "\u{119aa}", "\u{119d1}", "\u{119d4}", "\u{119da}", "\u{119dc}", "\u{119e0}", "\u{119e1}", "\u{119e3}", "\u{119e4}", "\u{11a00}", "\u{11a01}", "\u{11a0b}", "\u{11a33}", "\u{11a39}", "\u{11a3a}", "\u{11a3b}", "\u{11a47}", "\u{11a50}", "\u{11a51}", "\u{11a57}", "\u{11a59}", "\u{11a5c}", "\u{11a8a}", "\u{11a97}", "\u{11a98}", "\u{11a9d}", "\u{11ab0}", "\u{11c00}", "\u{11c0a}", "\u{11c2f}", "\u{11c30}", "\u{11c38}", "\u{11c3e}", "\u{11c3f}", "\u{11c40}", "\u{11c50}", "\u{11c72}", "\u{11c92}", "\u{11ca9}", "\u{11caa}", "\u{11cb1}", "\u{11cb2}", "\u{11cb4}", "\u{11cb5}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d31}", "\u{11d3a}", "\u{11d3c}", "\u{11d3f}", "\u{11d46}", "\u{11d47}", "\u{11d50}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d8a}", "\u{11d90}", "\u{11d93}", "\u{11d95}", "\u{11d96}", "\u{11d97}", "\u{11d98}", "\u{11da0}", "\u{11ee0}", "\u{11ef3}", "\u{11ef5}", "\u{11f00}", "\u{11f02}", "\u{11f03}", "\u{11f04}", "\u{11f12}", "\u{11f34}", "\u{11f36}", "\u{11f3e}", "\u{11f40}", "\u{11f41}", "\u{11f42}", "\u{11f50}", "\u{11fb0}", "\u{12000}", "\u{12400}", "\u{12480}", "\u{12f90}", "\u{13000}", "\u{13440}", "\u{13441}", "\u{13447}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a60}", "\u{16a70}", "\u{16ac0}", "\u{16ad0}", "\u{16af0}", "\u{16b00}", "\u{16b30}", "\u{16b40}", "\u{16b50}", "\u{16b63}", "\u{16b7d}", "\u{16e40}", "\u{16f00}", "\u{16f4f}", "\u{16f50}", "\u{16f51}", "\u{16f8f}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{16fe4}", "\u{16ff0}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1bc9d}", "\u{1cf00}", "\u{1cf30}", "\u{1d165}", "\u{1d167}", "\u{1d16d}", "\u{1d17b}", "\u{1d185}", "\u{1d1aa}", "\u{1d242}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1d7ce}", "\u{1da00}", "\u{1da3b}", "\u{1da75}", "\u{1da84}", "\u{1da9b}", "\u{1daa1}", "\u{1df00}", "\u{1df0a}", "\u{1df0b}", "\u{1df25}", "\u{1e000}", "\u{1e008}", "\u{1e01b}", "\u{1e023}", "\u{1e026}", "\u{1e030}", "\u{1e08f}", "\u{1e100}", "\u{1e130}", "\u{1e137}", "\u{1e140}", "\u{1e14e}", "\u{1e290}", "\u{1e2ae}", "\u{1e2c0}", "\u{1e2ec}", "\u{1e2f0}", "\u{1e4d0}", "\u{1e4eb}", "\u{1e4ec}", "\u{1e4f0}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1e8d0}", "\u{1e900}", "\u{1e944}", "\u{1e94b}", "\u{1e950}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{1fbf0}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", "\u{e0100}", ]; const REGEXES: [&str; 2] = ["^\\p{XID_Continue}+$", "^\\p{XIDC}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_xidstart() { test_with_configs(unicode_escape_property_binary_xidstart_tc) } fn unicode_escape_property_binary_xidstart_tc(tc: TestConfig) { const CODE_POINTS: [&str; 743] = [ "\u{41}", "\u{61}", "\u{aa}", "\u{b5}", "\u{ba}", "\u{c0}", "\u{d8}", "\u{f8}", "\u{1bb}", "\u{1bc}", "\u{1c0}", "\u{1c4}", "\u{294}", "\u{295}", "\u{2b0}", "\u{2c6}", "\u{2e0}", "\u{2ec}", "\u{2ee}", "\u{370}", "\u{374}", "\u{376}", "\u{37b}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{3a3}", "\u{3f7}", "\u{48a}", "\u{531}", "\u{559}", "\u{560}", "\u{5d0}", "\u{5ef}", "\u{620}", "\u{640}", "\u{641}", "\u{66e}", "\u{671}", "\u{6d5}", "\u{6e5}", "\u{6ee}", "\u{6fa}", "\u{6ff}", "\u{710}", "\u{712}", "\u{74d}", "\u{7b1}", "\u{7ca}", "\u{7f4}", "\u{7fa}", "\u{800}", "\u{81a}", "\u{824}", "\u{828}", "\u{840}", "\u{860}", "\u{870}", "\u{889}", "\u{8a0}", "\u{8c9}", "\u{904}", "\u{93d}", "\u{950}", "\u{958}", "\u{971}", "\u{972}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bd}", "\u{9ce}", "\u{9dc}", "\u{9df}", "\u{9f0}", "\u{9fc}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a59}", "\u{a5e}", "\u{a72}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abd}", "\u{ad0}", "\u{ae0}", "\u{af9}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3d}", "\u{b5c}", "\u{b5f}", "\u{b71}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bd0}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3d}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c80}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbd}", "\u{cdd}", "\u{ce0}", "\u{cf1}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3d}", "\u{d4e}", "\u{d54}", "\u{d5f}", "\u{d7a}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{e01}", "\u{e32}", "\u{e40}", "\u{e46}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb2}", "\u{ebd}", "\u{ec0}", "\u{ec6}", "\u{edc}", "\u{f00}", "\u{f40}", "\u{f49}", "\u{f88}", "\u{1000}", "\u{103f}", "\u{1050}", "\u{105a}", "\u{1061}", "\u{1065}", "\u{106e}", "\u{1075}", "\u{108e}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10d0}", "\u{10fc}", "\u{10fd}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{1380}", "\u{13a0}", "\u{13f8}", "\u{1401}", "\u{166f}", "\u{1681}", "\u{16a0}", "\u{16ee}", "\u{16f1}", "\u{1700}", "\u{171f}", "\u{1740}", "\u{1760}", "\u{176e}", "\u{1780}", "\u{17d7}", "\u{17dc}", "\u{1820}", "\u{1843}", "\u{1844}", "\u{1880}", "\u{1885}", "\u{1887}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{1a00}", "\u{1a20}", "\u{1aa7}", "\u{1b05}", "\u{1b45}", "\u{1b83}", "\u{1bae}", "\u{1bba}", "\u{1c00}", "\u{1c4d}", "\u{1c5a}", "\u{1c78}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1ce9}", "\u{1cee}", "\u{1cf5}", "\u{1cfa}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1e00}", "\u{1f18}", "\u{1f20}", "\u{1f48}", "\u{1f50}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f80}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{2102}", "\u{2107}", "\u{210a}", "\u{2115}", "\u{2118}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{212e}", "\u{212f}", "\u{2135}", "\u{2139}", "\u{213c}", "\u{2145}", "\u{214e}", "\u{2160}", "\u{2183}", "\u{2185}", "\u{2c00}", "\u{2c7c}", "\u{2c7e}", "\u{2ceb}", "\u{2cf2}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{2d30}", "\u{2d6f}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{3005}", "\u{3006}", "\u{3007}", "\u{3021}", "\u{3031}", "\u{3038}", "\u{303b}", "\u{303c}", "\u{3041}", "\u{309d}", "\u{309f}", "\u{30a1}", "\u{30fc}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{31a0}", "\u{31f0}", "\u{3400}", "\u{4e00}", "\u{a015}", "\u{a016}", "\u{a4d0}", "\u{a4f8}", "\u{a500}", "\u{a60c}", "\u{a610}", "\u{a62a}", "\u{a640}", "\u{a66e}", "\u{a67f}", "\u{a680}", "\u{a69c}", "\u{a6a0}", "\u{a6e6}", "\u{a717}", "\u{a722}", "\u{a770}", "\u{a771}", "\u{a788}", "\u{a78b}", "\u{a78f}", "\u{a790}", "\u{a7d0}", "\u{a7d3}", "\u{a7d5}", "\u{a7f2}", "\u{a7f5}", "\u{a7f7}", "\u{a7f8}", "\u{a7fa}", "\u{a7fb}", "\u{a803}", "\u{a807}", "\u{a80c}", "\u{a840}", "\u{a882}", "\u{a8f2}", "\u{a8fb}", "\u{a8fd}", "\u{a90a}", "\u{a930}", "\u{a960}", "\u{a984}", "\u{a9cf}", "\u{a9e0}", "\u{a9e6}", "\u{a9e7}", "\u{a9fa}", "\u{aa00}", "\u{aa40}", "\u{aa44}", "\u{aa60}", "\u{aa70}", "\u{aa71}", "\u{aa7a}", "\u{aa7e}", "\u{aab1}", "\u{aab5}", "\u{aab9}", "\u{aac0}", "\u{aac2}", "\u{aadb}", "\u{aadd}", "\u{aae0}", "\u{aaf2}", "\u{aaf3}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{ab30}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab70}", "\u{abc0}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb00}", "\u{fb13}", "\u{fb1d}", "\u{fb1f}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fc64}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fe71}", "\u{fe73}", "\u{fe77}", "\u{fe79}", "\u{fe7b}", "\u{fe7d}", "\u{fe7f}", "\u{ff21}", "\u{ff41}", "\u{ff66}", "\u{ff70}", "\u{ff71}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10140}", "\u{10280}", "\u{102a0}", "\u{10300}", "\u{1032d}", "\u{10341}", "\u{10342}", "\u{1034a}", "\u{10350}", "\u{10380}", "\u{103a0}", "\u{103c8}", "\u{103d1}", "\u{10400}", "\u{10450}", "\u{104b0}", "\u{104d8}", "\u{10500}", "\u{10530}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10860}", "\u{10880}", "\u{108e0}", "\u{108f4}", "\u{10900}", "\u{10920}", "\u{10980}", "\u{109be}", "\u{10a00}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a60}", "\u{10a80}", "\u{10ac0}", "\u{10ac9}", "\u{10b00}", "\u{10b40}", "\u{10b60}", "\u{10b80}", "\u{10c00}", "\u{10c80}", "\u{10cc0}", "\u{10d00}", "\u{10e80}", "\u{10eb0}", "\u{10f00}", "\u{10f27}", "\u{10f30}", "\u{10f70}", "\u{10fb0}", "\u{10fe0}", "\u{11003}", "\u{11071}", "\u{11075}", "\u{11083}", "\u{110d0}", "\u{11103}", "\u{11144}", "\u{11147}", "\u{11150}", "\u{11176}", "\u{11183}", "\u{111c1}", "\u{111da}", "\u{111dc}", "\u{11200}", "\u{11213}", "\u{1123f}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112b0}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133d}", "\u{11350}", "\u{1135d}", "\u{11400}", "\u{11447}", "\u{1145f}", "\u{11480}", "\u{114c4}", "\u{114c7}", "\u{11580}", "\u{115d8}", "\u{11600}", "\u{11644}", "\u{11680}", "\u{116b8}", "\u{11700}", "\u{11740}", "\u{11800}", "\u{118a0}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{1193f}", "\u{11941}", "\u{119a0}", "\u{119aa}", "\u{119e1}", "\u{119e3}", "\u{11a00}", "\u{11a0b}", "\u{11a3a}", "\u{11a50}", "\u{11a5c}", "\u{11a9d}", "\u{11ab0}", "\u{11c00}", "\u{11c0a}", "\u{11c40}", "\u{11c72}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d46}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d98}", "\u{11ee0}", "\u{11f02}", "\u{11f04}", "\u{11f12}", "\u{11fb0}", "\u{12000}", "\u{12400}", "\u{12480}", "\u{12f90}", "\u{13000}", "\u{13441}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a70}", "\u{16ad0}", "\u{16b00}", "\u{16b40}", "\u{16b63}", "\u{16b7d}", "\u{16e40}", "\u{16f00}", "\u{16f50}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1df00}", "\u{1df0a}", "\u{1df0b}", "\u{1df25}", "\u{1e030}", "\u{1e100}", "\u{1e137}", "\u{1e14e}", "\u{1e290}", "\u{1e2c0}", "\u{1e4d0}", "\u{1e4eb}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1e900}", "\u{1e94b}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", ]; const REGEXES: [&str; 2] = ["^\\p{XID_Start}+$", "^\\p{XIDS}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_asciihexdigit() { test_with_configs(unicode_escape_property_binary_asciihexdigit_tc) } fn unicode_escape_property_binary_asciihexdigit_tc(tc: TestConfig) { const CODE_POINTS: [&str; 3] = ["\u{30}", "\u{41}", "\u{61}"]; const REGEXES: [&str; 2] = ["^\\p{ASCII_Hex_Digit}+$", "^\\p{AHex}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_bidicontrol() { test_with_configs(unicode_escape_property_binary_bidicontrol_tc) } fn unicode_escape_property_binary_bidicontrol_tc(tc: TestConfig) { const CODE_POINTS: [&str; 4] = ["\u{61c}", "\u{200e}", "\u{202a}", "\u{2066}"]; const REGEXES: [&str; 2] = ["^\\p{Bidi_Control}+$", "^\\p{Bidi_C}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_dash() { test_with_configs(unicode_escape_property_binary_dash_tc) } fn unicode_escape_property_binary_dash_tc(tc: TestConfig) { const CODE_POINTS: [&str; 23] = [ "\u{2d}", "\u{58a}", "\u{5be}", "\u{1400}", "\u{1806}", "\u{2010}", "\u{2053}", "\u{207b}", "\u{208b}", "\u{2212}", "\u{2e17}", "\u{2e1a}", "\u{2e3a}", "\u{2e40}", "\u{2e5d}", "\u{301c}", "\u{3030}", "\u{30a0}", "\u{fe31}", "\u{fe58}", "\u{fe63}", "\u{ff0d}", "\u{10ead}", ]; const REGEXES: [&str; 1] = ["^\\p{Dash}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_deprecated() { test_with_configs(unicode_escape_property_binary_deprecated_tc) } fn unicode_escape_property_binary_deprecated_tc(tc: TestConfig) { const CODE_POINTS: [&str; 9] = [ "\u{149}", "\u{673}", "\u{f77}", "\u{f79}", "\u{17a3}", "\u{206a}", "\u{2329}", "\u{232a}", "\u{e0001}", ]; const REGEXES: [&str; 2] = ["^\\p{Deprecated}+$", "^\\p{Dep}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_diacritic() { test_with_configs(unicode_escape_property_binary_diacritic_tc) } fn unicode_escape_property_binary_diacritic_tc(tc: TestConfig) { const CODE_POINTS: [&str; 237] = [ "\u{5e}", "\u{60}", "\u{a8}", "\u{af}", "\u{b4}", "\u{b7}", "\u{b8}", "\u{2b0}", "\u{2c2}", "\u{2c6}", "\u{2d2}", "\u{2e0}", "\u{2e5}", "\u{2ec}", "\u{2ed}", "\u{2ee}", "\u{2ef}", "\u{300}", "\u{350}", "\u{35d}", "\u{374}", "\u{375}", "\u{37a}", "\u{384}", "\u{483}", "\u{559}", "\u{591}", "\u{5a3}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{64b}", "\u{657}", "\u{6df}", "\u{6e5}", "\u{6ea}", "\u{730}", "\u{7a6}", "\u{7eb}", "\u{7f4}", "\u{818}", "\u{898}", "\u{8c9}", "\u{8ca}", "\u{8e3}", "\u{93c}", "\u{94d}", "\u{951}", "\u{971}", "\u{9bc}", "\u{9cd}", "\u{a3c}", "\u{a4d}", "\u{abc}", "\u{acd}", "\u{afd}", "\u{b3c}", "\u{b4d}", "\u{b55}", "\u{bcd}", "\u{c3c}", "\u{c4d}", "\u{cbc}", "\u{ccd}", "\u{d3b}", "\u{d4d}", "\u{dca}", "\u{e47}", "\u{e4e}", "\u{eba}", "\u{ec8}", "\u{f18}", "\u{f35}", "\u{f37}", "\u{f39}", "\u{f3e}", "\u{f82}", "\u{f86}", "\u{fc6}", "\u{1037}", "\u{1039}", "\u{1063}", "\u{1069}", "\u{1087}", "\u{108d}", "\u{108f}", "\u{109a}", "\u{135d}", "\u{1714}", "\u{1715}", "\u{17c9}", "\u{17dd}", "\u{1939}", "\u{1a75}", "\u{1a7f}", "\u{1ab0}", "\u{1abe}", "\u{1ac1}", "\u{1b34}", "\u{1b44}", "\u{1b6b}", "\u{1baa}", "\u{1bab}", "\u{1c36}", "\u{1c78}", "\u{1cd0}", "\u{1cd3}", "\u{1cd4}", "\u{1ce1}", "\u{1ce2}", "\u{1ced}", "\u{1cf4}", "\u{1cf7}", "\u{1cf8}", "\u{1d2c}", "\u{1dc4}", "\u{1df5}", "\u{1fbd}", "\u{1fbf}", "\u{1fcd}", "\u{1fdd}", "\u{1fed}", "\u{1ffd}", "\u{2cef}", "\u{2e2f}", "\u{302a}", "\u{302e}", "\u{3099}", "\u{309b}", "\u{30fc}", "\u{a66f}", "\u{a67c}", "\u{a67f}", "\u{a69c}", "\u{a6f0}", "\u{a700}", "\u{a717}", "\u{a720}", "\u{a788}", "\u{a789}", "\u{a7f8}", "\u{a8c4}", "\u{a8e0}", "\u{a92b}", "\u{a92e}", "\u{a953}", "\u{a9b3}", "\u{a9c0}", "\u{a9e5}", "\u{aa7b}", "\u{aa7c}", "\u{aa7d}", "\u{aabf}", "\u{aac0}", "\u{aac1}", "\u{aac2}", "\u{aaf6}", "\u{ab5b}", "\u{ab5c}", "\u{ab69}", "\u{ab6a}", "\u{abec}", "\u{abed}", "\u{fb1e}", "\u{fe20}", "\u{ff3e}", "\u{ff40}", "\u{ff70}", "\u{ff9e}", "\u{ffe3}", "\u{102e0}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{10ae5}", "\u{10d22}", "\u{10d24}", "\u{10efd}", "\u{10f46}", "\u{10f82}", "\u{11046}", "\u{11070}", "\u{110b9}", "\u{11133}", "\u{11173}", "\u{111c0}", "\u{111ca}", "\u{11235}", "\u{11236}", "\u{112e9}", "\u{1133c}", "\u{1134d}", "\u{11366}", "\u{11370}", "\u{11442}", "\u{11446}", "\u{114c2}", "\u{115bf}", "\u{1163f}", "\u{116b6}", "\u{116b7}", "\u{1172b}", "\u{11839}", "\u{1193d}", "\u{1193e}", "\u{11943}", "\u{119e0}", "\u{11a34}", "\u{11a47}", "\u{11a99}", "\u{11c3f}", "\u{11d42}", "\u{11d44}", "\u{11d97}", "\u{13447}", "\u{16af0}", "\u{16b30}", "\u{16f8f}", "\u{16f93}", "\u{16ff0}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1cf00}", "\u{1cf30}", "\u{1d167}", "\u{1d16d}", "\u{1d17b}", "\u{1d185}", "\u{1d1aa}", "\u{1e030}", "\u{1e130}", "\u{1e2ae}", "\u{1e2ec}", "\u{1e8d0}", "\u{1e944}", "\u{1e948}", ]; const REGEXES: [&str; 2] = ["^\\p{Diacritic}+$", "^\\p{Dia}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_extender() { test_with_configs(unicode_escape_property_binary_extender_tc) } fn unicode_escape_property_binary_extender_tc(tc: TestConfig) { const CODE_POINTS: [&str; 33] = [ "\u{b7}", "\u{2d0}", "\u{640}", "\u{7fa}", "\u{b55}", "\u{e46}", "\u{ec6}", "\u{180a}", "\u{1843}", "\u{1aa7}", "\u{1c36}", "\u{1c7b}", "\u{3005}", "\u{3031}", "\u{309d}", "\u{30fc}", "\u{a015}", "\u{a60c}", "\u{a9cf}", "\u{a9e6}", "\u{aa70}", "\u{aadd}", "\u{aaf3}", "\u{ff70}", "\u{10781}", "\u{1135d}", "\u{115c6}", "\u{11a98}", "\u{16b42}", "\u{16fe0}", "\u{16fe3}", "\u{1e13c}", "\u{1e944}", ]; const REGEXES: [&str; 2] = ["^\\p{Extender}+$", "^\\p{Ext}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_hexdigit() { test_with_configs(unicode_escape_property_binary_hexdigit_tc) } fn unicode_escape_property_binary_hexdigit_tc(tc: TestConfig) { const CODE_POINTS: [&str; 6] = [ "\u{30}", "\u{41}", "\u{61}", "\u{ff10}", "\u{ff21}", "\u{ff41}", ]; const REGEXES: [&str; 2] = ["^\\p{Hex_Digit}+$", "^\\p{Hex}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_idsbinaryoperator() { test_with_configs(unicode_escape_property_binary_idsbinaryoperator_tc) } fn unicode_escape_property_binary_idsbinaryoperator_tc(tc: TestConfig) { const CODE_POINTS: [&str; 3] = ["\u{2ff0}", "\u{2ff4}", "\u{31ef}"]; const REGEXES: [&str; 2] = ["^\\p{IDS_Binary_Operator}+$", "^\\p{IDSB}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_idstrinaryoperator() { test_with_configs(unicode_escape_property_binary_idstrinaryoperator_tc) } fn unicode_escape_property_binary_idstrinaryoperator_tc(tc: TestConfig) { const CODE_POINTS: [&str; 1] = ["\u{2ff2}"]; const REGEXES: [&str; 2] = ["^\\p{IDS_Trinary_Operator}+$", "^\\p{IDST}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_ideographic() { test_with_configs(unicode_escape_property_binary_ideographic_tc) } fn unicode_escape_property_binary_ideographic_tc(tc: TestConfig) { const CODE_POINTS: [&str; 22] = [ "\u{3006}", "\u{3007}", "\u{3021}", "\u{3038}", "\u{3400}", "\u{4e00}", "\u{f900}", "\u{fa70}", "\u{16fe4}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1b170}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", ]; const REGEXES: [&str; 2] = ["^\\p{Ideographic}+$", "^\\p{Ideo}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_joincontrol() { test_with_configs(unicode_escape_property_binary_joincontrol_tc) } fn unicode_escape_property_binary_joincontrol_tc(tc: TestConfig) { const CODE_POINTS: [&str; 1] = ["\u{200c}"]; const REGEXES: [&str; 2] = ["^\\p{Join_Control}+$", "^\\p{Join_C}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_logicalorderexception() { test_with_configs(unicode_escape_property_binary_logicalorderexception_tc) } fn unicode_escape_property_binary_logicalorderexception_tc(tc: TestConfig) { const CODE_POINTS: [&str; 7] = [ "\u{e40}", "\u{ec0}", "\u{19b5}", "\u{19ba}", "\u{aab5}", "\u{aab9}", "\u{aabb}", ]; const REGEXES: [&str; 2] = ["^\\p{Logical_Order_Exception}+$", "^\\p{LOE}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_lowercase() { test_with_configs(unicode_escape_property_binary_lowercase_tc) } fn unicode_escape_property_binary_lowercase_tc(tc: TestConfig) { const CODE_POINTS: [&str; 686] = [ "\u{61}", "\u{aa}", "\u{b5}", "\u{ba}", "\u{df}", "\u{f8}", "\u{101}", "\u{103}", "\u{105}", "\u{107}", "\u{109}", "\u{10b}", "\u{10d}", "\u{10f}", "\u{111}", "\u{113}", "\u{115}", "\u{117}", "\u{119}", "\u{11b}", "\u{11d}", "\u{11f}", "\u{121}", "\u{123}", "\u{125}", "\u{127}", "\u{129}", "\u{12b}", "\u{12d}", "\u{12f}", "\u{131}", "\u{133}", "\u{135}", "\u{137}", "\u{13a}", "\u{13c}", "\u{13e}", "\u{140}", "\u{142}", "\u{144}", "\u{146}", "\u{148}", "\u{14b}", "\u{14d}", "\u{14f}", "\u{151}", "\u{153}", "\u{155}", "\u{157}", "\u{159}", "\u{15b}", "\u{15d}", "\u{15f}", "\u{161}", "\u{163}", "\u{165}", "\u{167}", "\u{169}", "\u{16b}", "\u{16d}", "\u{16f}", "\u{171}", "\u{173}", "\u{175}", "\u{177}", "\u{17a}", "\u{17c}", "\u{17e}", "\u{183}", "\u{185}", "\u{188}", "\u{18c}", "\u{192}", "\u{195}", "\u{199}", "\u{19e}", "\u{1a1}", "\u{1a3}", "\u{1a5}", "\u{1a8}", "\u{1aa}", "\u{1ad}", "\u{1b0}", "\u{1b4}", "\u{1b6}", "\u{1b9}", "\u{1bd}", "\u{1c6}", "\u{1c9}", "\u{1cc}", "\u{1ce}", "\u{1d0}", "\u{1d2}", "\u{1d4}", "\u{1d6}", "\u{1d8}", "\u{1da}", "\u{1dc}", "\u{1df}", "\u{1e1}", "\u{1e3}", "\u{1e5}", "\u{1e7}", "\u{1e9}", "\u{1eb}", "\u{1ed}", "\u{1ef}", "\u{1f3}", "\u{1f5}", "\u{1f9}", "\u{1fb}", "\u{1fd}", "\u{1ff}", "\u{201}", "\u{203}", "\u{205}", "\u{207}", "\u{209}", "\u{20b}", "\u{20d}", "\u{20f}", "\u{211}", "\u{213}", "\u{215}", "\u{217}", "\u{219}", "\u{21b}", "\u{21d}", "\u{21f}", "\u{221}", "\u{223}", "\u{225}", "\u{227}", "\u{229}", "\u{22b}", "\u{22d}", "\u{22f}", "\u{231}", "\u{233}", "\u{23c}", "\u{23f}", "\u{242}", "\u{247}", "\u{249}", "\u{24b}", "\u{24d}", "\u{24f}", "\u{295}", "\u{2b0}", "\u{2c0}", "\u{2e0}", "\u{345}", "\u{371}", "\u{373}", "\u{377}", "\u{37a}", "\u{37b}", "\u{390}", "\u{3ac}", "\u{3d0}", "\u{3d5}", "\u{3d9}", "\u{3db}", "\u{3dd}", "\u{3df}", "\u{3e1}", "\u{3e3}", "\u{3e5}", "\u{3e7}", "\u{3e9}", "\u{3eb}", "\u{3ed}", "\u{3ef}", "\u{3f5}", "\u{3f8}", "\u{3fb}", "\u{430}", "\u{461}", "\u{463}", "\u{465}", "\u{467}", "\u{469}", "\u{46b}", "\u{46d}", "\u{46f}", "\u{471}", "\u{473}", "\u{475}", "\u{477}", "\u{479}", "\u{47b}", "\u{47d}", "\u{47f}", "\u{481}", "\u{48b}", "\u{48d}", "\u{48f}", "\u{491}", "\u{493}", "\u{495}", "\u{497}", "\u{499}", "\u{49b}", "\u{49d}", "\u{49f}", "\u{4a1}", "\u{4a3}", "\u{4a5}", "\u{4a7}", "\u{4a9}", "\u{4ab}", "\u{4ad}", "\u{4af}", "\u{4b1}", "\u{4b3}", "\u{4b5}", "\u{4b7}", "\u{4b9}", "\u{4bb}", "\u{4bd}", "\u{4bf}", "\u{4c2}", "\u{4c4}", "\u{4c6}", "\u{4c8}", "\u{4ca}", "\u{4cc}", "\u{4ce}", "\u{4d1}", "\u{4d3}", "\u{4d5}", "\u{4d7}", "\u{4d9}", "\u{4db}", "\u{4dd}", "\u{4df}", "\u{4e1}", "\u{4e3}", "\u{4e5}", "\u{4e7}", "\u{4e9}", "\u{4eb}", "\u{4ed}", "\u{4ef}", "\u{4f1}", "\u{4f3}", "\u{4f5}", "\u{4f7}", "\u{4f9}", "\u{4fb}", "\u{4fd}", "\u{4ff}", "\u{501}", "\u{503}", "\u{505}", "\u{507}", "\u{509}", "\u{50b}", "\u{50d}", "\u{50f}", "\u{511}", "\u{513}", "\u{515}", "\u{517}", "\u{519}", "\u{51b}", "\u{51d}", "\u{51f}", "\u{521}", "\u{523}", "\u{525}", "\u{527}", "\u{529}", "\u{52b}", "\u{52d}", "\u{52f}", "\u{560}", "\u{10d0}", "\u{10fc}", "\u{10fd}", "\u{13f8}", "\u{1c80}", "\u{1d00}", "\u{1d2c}", "\u{1d6b}", "\u{1d78}", "\u{1d79}", "\u{1d9b}", "\u{1e01}", "\u{1e03}", "\u{1e05}", "\u{1e07}", "\u{1e09}", "\u{1e0b}", "\u{1e0d}", "\u{1e0f}", "\u{1e11}", "\u{1e13}", "\u{1e15}", "\u{1e17}", "\u{1e19}", "\u{1e1b}", "\u{1e1d}", "\u{1e1f}", "\u{1e21}", "\u{1e23}", "\u{1e25}", "\u{1e27}", "\u{1e29}", "\u{1e2b}", "\u{1e2d}", "\u{1e2f}", "\u{1e31}", "\u{1e33}", "\u{1e35}", "\u{1e37}", "\u{1e39}", "\u{1e3b}", "\u{1e3d}", "\u{1e3f}", "\u{1e41}", "\u{1e43}", "\u{1e45}", "\u{1e47}", "\u{1e49}", "\u{1e4b}", "\u{1e4d}", "\u{1e4f}", "\u{1e51}", "\u{1e53}", "\u{1e55}", "\u{1e57}", "\u{1e59}", "\u{1e5b}", "\u{1e5d}", "\u{1e5f}", "\u{1e61}", "\u{1e63}", "\u{1e65}", "\u{1e67}", "\u{1e69}", "\u{1e6b}", "\u{1e6d}", "\u{1e6f}", "\u{1e71}", "\u{1e73}", "\u{1e75}", "\u{1e77}", "\u{1e79}", "\u{1e7b}", "\u{1e7d}", "\u{1e7f}", "\u{1e81}", "\u{1e83}", "\u{1e85}", "\u{1e87}", "\u{1e89}", "\u{1e8b}", "\u{1e8d}", "\u{1e8f}", "\u{1e91}", "\u{1e93}", "\u{1e95}", "\u{1e9f}", "\u{1ea1}", "\u{1ea3}", "\u{1ea5}", "\u{1ea7}", "\u{1ea9}", "\u{1eab}", "\u{1ead}", "\u{1eaf}", "\u{1eb1}", "\u{1eb3}", "\u{1eb5}", "\u{1eb7}", "\u{1eb9}", "\u{1ebb}", "\u{1ebd}", "\u{1ebf}", "\u{1ec1}", "\u{1ec3}", "\u{1ec5}", "\u{1ec7}", "\u{1ec9}", "\u{1ecb}", "\u{1ecd}", "\u{1ecf}", "\u{1ed1}", "\u{1ed3}", "\u{1ed5}", "\u{1ed7}", "\u{1ed9}", "\u{1edb}", "\u{1edd}", "\u{1edf}", "\u{1ee1}", "\u{1ee3}", "\u{1ee5}", "\u{1ee7}", "\u{1ee9}", "\u{1eeb}", "\u{1eed}", "\u{1eef}", "\u{1ef1}", "\u{1ef3}", "\u{1ef5}", "\u{1ef7}", "\u{1ef9}", "\u{1efb}", "\u{1efd}", "\u{1eff}", "\u{1f10}", "\u{1f20}", "\u{1f30}", "\u{1f40}", "\u{1f50}", "\u{1f60}", "\u{1f70}", "\u{1f80}", "\u{1f90}", "\u{1fa0}", "\u{1fb0}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{210a}", "\u{210e}", "\u{2113}", "\u{212f}", "\u{2134}", "\u{2139}", "\u{213c}", "\u{2146}", "\u{214e}", "\u{2170}", "\u{2184}", "\u{24d0}", "\u{2c30}", "\u{2c61}", "\u{2c65}", "\u{2c68}", "\u{2c6a}", "\u{2c6c}", "\u{2c71}", "\u{2c73}", "\u{2c76}", "\u{2c7c}", "\u{2c81}", "\u{2c83}", "\u{2c85}", "\u{2c87}", "\u{2c89}", "\u{2c8b}", "\u{2c8d}", "\u{2c8f}", "\u{2c91}", "\u{2c93}", "\u{2c95}", "\u{2c97}", "\u{2c99}", "\u{2c9b}", "\u{2c9d}", "\u{2c9f}", "\u{2ca1}", "\u{2ca3}", "\u{2ca5}", "\u{2ca7}", "\u{2ca9}", "\u{2cab}", "\u{2cad}", "\u{2caf}", "\u{2cb1}", "\u{2cb3}", "\u{2cb5}", "\u{2cb7}", "\u{2cb9}", "\u{2cbb}", "\u{2cbd}", "\u{2cbf}", "\u{2cc1}", "\u{2cc3}", "\u{2cc5}", "\u{2cc7}", "\u{2cc9}", "\u{2ccb}", "\u{2ccd}", "\u{2ccf}", "\u{2cd1}", "\u{2cd3}", "\u{2cd5}", "\u{2cd7}", "\u{2cd9}", "\u{2cdb}", "\u{2cdd}", "\u{2cdf}", "\u{2ce1}", "\u{2ce3}", "\u{2cec}", "\u{2cee}", "\u{2cf3}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a641}", "\u{a643}", "\u{a645}", "\u{a647}", "\u{a649}", "\u{a64b}", "\u{a64d}", "\u{a64f}", "\u{a651}", "\u{a653}", "\u{a655}", "\u{a657}", "\u{a659}", "\u{a65b}", "\u{a65d}", "\u{a65f}", "\u{a661}", "\u{a663}", "\u{a665}", "\u{a667}", "\u{a669}", "\u{a66b}", "\u{a66d}", "\u{a681}", "\u{a683}", "\u{a685}", "\u{a687}", "\u{a689}", "\u{a68b}", "\u{a68d}", "\u{a68f}", "\u{a691}", "\u{a693}", "\u{a695}", "\u{a697}", "\u{a699}", "\u{a69b}", "\u{a69c}", "\u{a723}", "\u{a725}", "\u{a727}", "\u{a729}", "\u{a72b}", "\u{a72d}", "\u{a72f}", "\u{a733}", "\u{a735}", "\u{a737}", "\u{a739}", "\u{a73b}", "\u{a73d}", "\u{a73f}", "\u{a741}", "\u{a743}", "\u{a745}", "\u{a747}", "\u{a749}", "\u{a74b}", "\u{a74d}", "\u{a74f}", "\u{a751}", "\u{a753}", "\u{a755}", "\u{a757}", "\u{a759}", "\u{a75b}", "\u{a75d}", "\u{a75f}", "\u{a761}", "\u{a763}", "\u{a765}", "\u{a767}", "\u{a769}", "\u{a76b}", "\u{a76d}", "\u{a76f}", "\u{a770}", "\u{a771}", "\u{a77a}", "\u{a77c}", "\u{a77f}", "\u{a781}", "\u{a783}", "\u{a785}", "\u{a787}", "\u{a78c}", "\u{a78e}", "\u{a791}", "\u{a793}", "\u{a797}", "\u{a799}", "\u{a79b}", "\u{a79d}", "\u{a79f}", "\u{a7a1}", "\u{a7a3}", "\u{a7a5}", "\u{a7a7}", "\u{a7a9}", "\u{a7af}", "\u{a7b5}", "\u{a7b7}", "\u{a7b9}", "\u{a7bb}", "\u{a7bd}", "\u{a7bf}", "\u{a7c1}", "\u{a7c3}", "\u{a7c8}", "\u{a7ca}", "\u{a7d1}", "\u{a7d3}", "\u{a7d5}", "\u{a7d7}", "\u{a7d9}", "\u{a7f2}", "\u{a7f6}", "\u{a7f8}", "\u{a7fa}", "\u{ab30}", "\u{ab5c}", "\u{ab60}", "\u{ab69}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff41}", "\u{10428}", "\u{104d8}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10780}", "\u{10783}", "\u{10787}", "\u{107b2}", "\u{10cc0}", "\u{118c0}", "\u{16e60}", "\u{1d41a}", "\u{1d44e}", "\u{1d456}", "\u{1d482}", "\u{1d4b6}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d4ea}", "\u{1d51e}", "\u{1d552}", "\u{1d586}", "\u{1d5ba}", "\u{1d5ee}", "\u{1d622}", "\u{1d656}", "\u{1d68a}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1d7cb}", "\u{1df00}", "\u{1df0b}", "\u{1df25}", "\u{1e030}", "\u{1e922}", ]; const REGEXES: [&str; 2] = ["^\\p{Lowercase}+$", "^\\p{Lower}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_noncharactercodepoint() { test_with_configs(unicode_escape_property_binary_noncharactercodepoint_tc) } fn unicode_escape_property_binary_noncharactercodepoint_tc(tc: TestConfig) { const CODE_POINTS: [&str; 18] = [ "\u{fdd0}", "\u{fffe}", "\u{1fffe}", "\u{2fffe}", "\u{3fffe}", "\u{4fffe}", "\u{5fffe}", "\u{6fffe}", "\u{7fffe}", "\u{8fffe}", "\u{9fffe}", "\u{afffe}", "\u{bfffe}", "\u{cfffe}", "\u{dfffe}", "\u{efffe}", "\u{ffffe}", "\u{10fffe}", ]; const REGEXES: [&str; 2] = ["^\\p{Noncharacter_Code_Point}+$", "^\\p{NChar}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_patternsyntax() { test_with_configs(unicode_escape_property_binary_patternsyntax_tc) } fn unicode_escape_property_binary_patternsyntax_tc(tc: TestConfig) { const CODE_POINTS: [&str; 257] = [ "\u{21}", "\u{24}", "\u{25}", "\u{28}", "\u{29}", "\u{2a}", "\u{2b}", "\u{2c}", "\u{2d}", "\u{2e}", "\u{3a}", "\u{3c}", "\u{3f}", "\u{5b}", "\u{5c}", "\u{5d}", "\u{5e}", "\u{60}", "\u{7b}", "\u{7c}", "\u{7d}", "\u{7e}", "\u{a1}", "\u{a2}", "\u{a6}", "\u{a7}", "\u{a9}", "\u{ab}", "\u{ac}", "\u{ae}", "\u{b0}", "\u{b1}", "\u{b6}", "\u{bb}", "\u{bf}", "\u{d7}", "\u{f7}", "\u{2010}", "\u{2016}", "\u{2018}", "\u{2019}", "\u{201a}", "\u{201b}", "\u{201d}", "\u{201e}", "\u{201f}", "\u{2020}", "\u{2030}", "\u{2039}", "\u{203a}", "\u{203b}", "\u{2041}", "\u{2044}", "\u{2045}", "\u{2046}", "\u{2047}", "\u{2052}", "\u{2053}", "\u{2055}", "\u{2190}", "\u{2195}", "\u{219a}", "\u{219c}", "\u{21a0}", "\u{21a1}", "\u{21a3}", "\u{21a4}", "\u{21a6}", "\u{21a7}", "\u{21ae}", "\u{21af}", "\u{21ce}", "\u{21d0}", "\u{21d2}", "\u{21d3}", "\u{21d4}", "\u{21d5}", "\u{21f4}", "\u{2300}", "\u{2308}", "\u{2309}", "\u{230a}", "\u{230b}", "\u{230c}", "\u{2320}", "\u{2322}", "\u{2329}", "\u{232a}", "\u{232b}", "\u{237c}", "\u{237d}", "\u{239b}", "\u{23b4}", "\u{23dc}", "\u{23e2}", "\u{2427}", "\u{2440}", "\u{244b}", "\u{2500}", "\u{25b7}", "\u{25b8}", "\u{25c1}", "\u{25c2}", "\u{25f8}", "\u{2600}", "\u{266f}", "\u{2670}", "\u{2768}", "\u{2769}", "\u{276a}", "\u{276b}", "\u{276c}", "\u{276d}", "\u{276e}", "\u{276f}", "\u{2770}", "\u{2771}", "\u{2772}", "\u{2773}", "\u{2774}", "\u{2775}", "\u{2794}", "\u{27c0}", "\u{27c5}", "\u{27c6}", "\u{27c7}", "\u{27e6}", "\u{27e7}", "\u{27e8}", "\u{27e9}", "\u{27ea}", "\u{27eb}", "\u{27ec}", "\u{27ed}", "\u{27ee}", "\u{27ef}", "\u{27f0}", "\u{2800}", "\u{2900}", "\u{2983}", "\u{2984}", "\u{2985}", "\u{2986}", "\u{2987}", "\u{2988}", "\u{2989}", "\u{298a}", "\u{298b}", "\u{298c}", "\u{298d}", "\u{298e}", "\u{298f}", "\u{2990}", "\u{2991}", "\u{2992}", "\u{2993}", "\u{2994}", "\u{2995}", "\u{2996}", "\u{2997}", "\u{2998}", "\u{2999}", "\u{29d8}", "\u{29d9}", "\u{29da}", "\u{29db}", "\u{29dc}", "\u{29fc}", "\u{29fd}", "\u{29fe}", "\u{2b00}", "\u{2b30}", "\u{2b45}", "\u{2b47}", "\u{2b4d}", "\u{2b74}", "\u{2b76}", "\u{2b96}", "\u{2b97}", "\u{2e00}", "\u{2e02}", "\u{2e03}", "\u{2e04}", "\u{2e05}", "\u{2e06}", "\u{2e09}", "\u{2e0a}", "\u{2e0b}", "\u{2e0c}", "\u{2e0d}", "\u{2e0e}", "\u{2e17}", "\u{2e18}", "\u{2e1a}", "\u{2e1b}", "\u{2e1c}", "\u{2e1d}", "\u{2e1e}", "\u{2e20}", "\u{2e21}", "\u{2e22}", "\u{2e23}", "\u{2e24}", "\u{2e25}", "\u{2e26}", "\u{2e27}", "\u{2e28}", "\u{2e29}", "\u{2e2a}", "\u{2e2f}", "\u{2e30}", "\u{2e3a}", "\u{2e3c}", "\u{2e40}", "\u{2e41}", "\u{2e42}", "\u{2e43}", "\u{2e50}", "\u{2e52}", "\u{2e55}", "\u{2e56}", "\u{2e57}", "\u{2e58}", "\u{2e59}", "\u{2e5a}", "\u{2e5b}", "\u{2e5c}", "\u{2e5d}", "\u{2e5e}", "\u{3001}", "\u{3008}", "\u{3009}", "\u{300a}", "\u{300b}", "\u{300c}", "\u{300d}", "\u{300e}", "\u{300f}", "\u{3010}", "\u{3011}", "\u{3012}", "\u{3014}", "\u{3015}", "\u{3016}", "\u{3017}", "\u{3018}", "\u{3019}", "\u{301a}", "\u{301b}", "\u{301c}", "\u{301d}", "\u{301e}", "\u{3020}", "\u{3030}", "\u{fd3e}", "\u{fd3f}", "\u{fe45}", ]; const REGEXES: [&str; 2] = ["^\\p{Pattern_Syntax}+$", "^\\p{Pat_Syn}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_patternwhitespace() { test_with_configs(unicode_escape_property_binary_patternwhitespace_tc) } fn unicode_escape_property_binary_patternwhitespace_tc(tc: TestConfig) { const CODE_POINTS: [&str; 6] = [ "\u{9}", "\u{20}", "\u{85}", "\u{200e}", "\u{2028}", "\u{2029}", ]; const REGEXES: [&str; 2] = ["^\\p{Pattern_White_Space}+$", "^\\p{Pat_WS}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_quotationmark() { test_with_configs(unicode_escape_property_binary_quotationmark_tc) } fn unicode_escape_property_binary_quotationmark_tc(tc: TestConfig) { const CODE_POINTS: [&str; 28] = [ "\u{22}", "\u{27}", "\u{ab}", "\u{bb}", "\u{2018}", "\u{2019}", "\u{201a}", "\u{201b}", "\u{201d}", "\u{201e}", "\u{201f}", "\u{2039}", "\u{203a}", "\u{2e42}", "\u{300c}", "\u{300d}", "\u{300e}", "\u{300f}", "\u{301d}", "\u{301e}", "\u{fe41}", "\u{fe42}", "\u{fe43}", "\u{fe44}", "\u{ff02}", "\u{ff07}", "\u{ff62}", "\u{ff63}", ]; const REGEXES: [&str; 2] = ["^\\p{Quotation_Mark}+$", "^\\p{QMark}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_radical() { test_with_configs(unicode_escape_property_binary_radical_tc) } fn unicode_escape_property_binary_radical_tc(tc: TestConfig) { const CODE_POINTS: [&str; 3] = ["\u{2e80}", "\u{2e9b}", "\u{2f00}"]; const REGEXES: [&str; 1] = ["^\\p{Radical}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_regionalindicator() { test_with_configs(unicode_escape_property_binary_regionalindicator_tc) } fn unicode_escape_property_binary_regionalindicator_tc(tc: TestConfig) { const CODE_POINTS: [&str; 1] = ["\u{1f1e6}"]; const REGEXES: [&str; 2] = ["^\\p{Regional_Indicator}+$", "^\\p{RI}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_sentenceterminal() { test_with_configs(unicode_escape_property_binary_sentenceterminal_tc) } fn unicode_escape_property_binary_sentenceterminal_tc(tc: TestConfig) { const CODE_POINTS: [&str; 81] = [ "\u{21}", "\u{2e}", "\u{3f}", "\u{589}", "\u{61d}", "\u{6d4}", "\u{700}", "\u{7f9}", "\u{837}", "\u{839}", "\u{83d}", "\u{964}", "\u{104a}", "\u{1362}", "\u{1367}", "\u{166e}", "\u{1735}", "\u{17d4}", "\u{1803}", "\u{1809}", "\u{1944}", "\u{1aa8}", "\u{1b5a}", "\u{1b5e}", "\u{1b7d}", "\u{1c3b}", "\u{1c7e}", "\u{203c}", "\u{2047}", "\u{2e2e}", "\u{2e3c}", "\u{2e53}", "\u{3002}", "\u{a4ff}", "\u{a60e}", "\u{a6f3}", "\u{a6f7}", "\u{a876}", "\u{a8ce}", "\u{a92f}", "\u{a9c8}", "\u{aa5d}", "\u{aaf0}", "\u{abeb}", "\u{fe52}", "\u{fe56}", "\u{ff01}", "\u{ff0e}", "\u{ff1f}", "\u{ff61}", "\u{10a56}", "\u{10f55}", "\u{10f86}", "\u{11047}", "\u{110be}", "\u{11141}", "\u{111c5}", "\u{111cd}", "\u{111de}", "\u{11238}", "\u{1123b}", "\u{112a9}", "\u{1144b}", "\u{115c2}", "\u{115c9}", "\u{11641}", "\u{1173c}", "\u{11944}", "\u{11946}", "\u{11a42}", "\u{11a9b}", "\u{11c41}", "\u{11ef7}", "\u{11f43}", "\u{16a6e}", "\u{16af5}", "\u{16b37}", "\u{16b44}", "\u{16e98}", "\u{1bc9f}", "\u{1da88}", ]; const REGEXES: [&str; 2] = ["^\\p{Sentence_Terminal}+$", "^\\p{STerm}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_softdotted() { test_with_configs(unicode_escape_property_binary_softdotted_tc) } fn unicode_escape_property_binary_softdotted_tc(tc: TestConfig) { const CODE_POINTS: [&str; 34] = [ "\u{69}", "\u{12f}", "\u{249}", "\u{268}", "\u{29d}", "\u{2b2}", "\u{3f3}", "\u{456}", "\u{458}", "\u{1d62}", "\u{1d96}", "\u{1da4}", "\u{1da8}", "\u{1e2d}", "\u{1ecb}", "\u{2071}", "\u{2148}", "\u{2c7c}", "\u{1d422}", "\u{1d456}", "\u{1d48a}", "\u{1d4be}", "\u{1d4f2}", "\u{1d526}", "\u{1d55a}", "\u{1d58e}", "\u{1d5c2}", "\u{1d5f6}", "\u{1d62a}", "\u{1d65e}", "\u{1d692}", "\u{1df1a}", "\u{1e04c}", "\u{1e068}", ]; const REGEXES: [&str; 2] = ["^\\p{Soft_Dotted}+$", "^\\p{SD}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_terminalpunctuation() { test_with_configs(unicode_escape_property_binary_terminalpunctuation_tc) } fn unicode_escape_property_binary_terminalpunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 108] = [ "\u{21}", "\u{2c}", "\u{2e}", "\u{3a}", "\u{3f}", "\u{37e}", "\u{387}", "\u{589}", "\u{5c3}", "\u{60c}", "\u{61b}", "\u{61d}", "\u{6d4}", "\u{700}", "\u{70c}", "\u{7f8}", "\u{830}", "\u{85e}", "\u{964}", "\u{e5a}", "\u{f08}", "\u{f0d}", "\u{104a}", "\u{1361}", "\u{166e}", "\u{16eb}", "\u{1735}", "\u{17d4}", "\u{17da}", "\u{1802}", "\u{1808}", "\u{1944}", "\u{1aa8}", "\u{1b5a}", "\u{1b5d}", "\u{1b7d}", "\u{1c3b}", "\u{1c7e}", "\u{203c}", "\u{2047}", "\u{2e2e}", "\u{2e3c}", "\u{2e41}", "\u{2e4c}", "\u{2e4e}", "\u{2e53}", "\u{3001}", "\u{a4fe}", "\u{a60d}", "\u{a6f3}", "\u{a876}", "\u{a8ce}", "\u{a92f}", "\u{a9c7}", "\u{aa5d}", "\u{aadf}", "\u{aaf0}", "\u{abeb}", "\u{fe50}", "\u{fe54}", "\u{ff01}", "\u{ff0c}", "\u{ff0e}", "\u{ff1a}", "\u{ff1f}", "\u{ff61}", "\u{ff64}", "\u{1039f}", "\u{103d0}", "\u{10857}", "\u{1091f}", "\u{10a56}", "\u{10af0}", "\u{10b3a}", "\u{10b99}", "\u{10f55}", "\u{10f86}", "\u{11047}", "\u{110be}", "\u{11141}", "\u{111c5}", "\u{111cd}", "\u{111de}", "\u{11238}", "\u{112a9}", "\u{1144b}", "\u{1145a}", "\u{115c2}", "\u{115c9}", "\u{11641}", "\u{1173c}", "\u{11944}", "\u{11946}", "\u{11a42}", "\u{11a9b}", "\u{11aa1}", "\u{11c41}", "\u{11c71}", "\u{11ef7}", "\u{11f43}", "\u{12470}", "\u{16a6e}", "\u{16af5}", "\u{16b37}", "\u{16b44}", "\u{16e97}", "\u{1bc9f}", "\u{1da87}", ]; const REGEXES: [&str; 2] = ["^\\p{Terminal_Punctuation}+$", "^\\p{Term}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_unifiedideograph() { test_with_configs(unicode_escape_property_binary_unifiedideograph_tc) } fn unicode_escape_property_binary_unifiedideograph_tc(tc: TestConfig) { const CODE_POINTS: [&str; 17] = [ "\u{3400}", "\u{4e00}", "\u{fa0e}", "\u{fa11}", "\u{fa13}", "\u{fa1f}", "\u{fa21}", "\u{fa23}", "\u{fa27}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{30000}", "\u{31350}", ]; const REGEXES: [&str; 2] = ["^\\p{Unified_Ideograph}+$", "^\\p{UIdeo}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_uppercase() { test_with_configs(unicode_escape_property_binary_uppercase_tc) } fn unicode_escape_property_binary_uppercase_tc(tc: TestConfig) { const CODE_POINTS: [&str; 651] = [ "\u{41}", "\u{c0}", "\u{d8}", "\u{100}", "\u{102}", "\u{104}", "\u{106}", "\u{108}", "\u{10a}", "\u{10c}", "\u{10e}", "\u{110}", "\u{112}", "\u{114}", "\u{116}", "\u{118}", "\u{11a}", "\u{11c}", "\u{11e}", "\u{120}", "\u{122}", "\u{124}", "\u{126}", "\u{128}", "\u{12a}", "\u{12c}", "\u{12e}", "\u{130}", "\u{132}", "\u{134}", "\u{136}", "\u{139}", "\u{13b}", "\u{13d}", "\u{13f}", "\u{141}", "\u{143}", "\u{145}", "\u{147}", "\u{14a}", "\u{14c}", "\u{14e}", "\u{150}", "\u{152}", "\u{154}", "\u{156}", "\u{158}", "\u{15a}", "\u{15c}", "\u{15e}", "\u{160}", "\u{162}", "\u{164}", "\u{166}", "\u{168}", "\u{16a}", "\u{16c}", "\u{16e}", "\u{170}", "\u{172}", "\u{174}", "\u{176}", "\u{178}", "\u{17b}", "\u{17d}", "\u{181}", "\u{184}", "\u{186}", "\u{189}", "\u{18e}", "\u{193}", "\u{196}", "\u{19c}", "\u{19f}", "\u{1a2}", "\u{1a4}", "\u{1a6}", "\u{1a9}", "\u{1ac}", "\u{1ae}", "\u{1b1}", "\u{1b5}", "\u{1b7}", "\u{1bc}", "\u{1c4}", "\u{1c7}", "\u{1ca}", "\u{1cd}", "\u{1cf}", "\u{1d1}", "\u{1d3}", "\u{1d5}", "\u{1d7}", "\u{1d9}", "\u{1db}", "\u{1de}", "\u{1e0}", "\u{1e2}", "\u{1e4}", "\u{1e6}", "\u{1e8}", "\u{1ea}", "\u{1ec}", "\u{1ee}", "\u{1f1}", "\u{1f4}", "\u{1f6}", "\u{1fa}", "\u{1fc}", "\u{1fe}", "\u{200}", "\u{202}", "\u{204}", "\u{206}", "\u{208}", "\u{20a}", "\u{20c}", "\u{20e}", "\u{210}", "\u{212}", "\u{214}", "\u{216}", "\u{218}", "\u{21a}", "\u{21c}", "\u{21e}", "\u{220}", "\u{222}", "\u{224}", "\u{226}", "\u{228}", "\u{22a}", "\u{22c}", "\u{22e}", "\u{230}", "\u{232}", "\u{23a}", "\u{23d}", "\u{241}", "\u{243}", "\u{248}", "\u{24a}", "\u{24c}", "\u{24e}", "\u{370}", "\u{372}", "\u{376}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{391}", "\u{3a3}", "\u{3cf}", "\u{3d2}", "\u{3d8}", "\u{3da}", "\u{3dc}", "\u{3de}", "\u{3e0}", "\u{3e2}", "\u{3e4}", "\u{3e6}", "\u{3e8}", "\u{3ea}", "\u{3ec}", "\u{3ee}", "\u{3f4}", "\u{3f7}", "\u{3f9}", "\u{3fd}", "\u{460}", "\u{462}", "\u{464}", "\u{466}", "\u{468}", "\u{46a}", "\u{46c}", "\u{46e}", "\u{470}", "\u{472}", "\u{474}", "\u{476}", "\u{478}", "\u{47a}", "\u{47c}", "\u{47e}", "\u{480}", "\u{48a}", "\u{48c}", "\u{48e}", "\u{490}", "\u{492}", "\u{494}", "\u{496}", "\u{498}", "\u{49a}", "\u{49c}", "\u{49e}", "\u{4a0}", "\u{4a2}", "\u{4a4}", "\u{4a6}", "\u{4a8}", "\u{4aa}", "\u{4ac}", "\u{4ae}", "\u{4b0}", "\u{4b2}", "\u{4b4}", "\u{4b6}", "\u{4b8}", "\u{4ba}", "\u{4bc}", "\u{4be}", "\u{4c0}", "\u{4c3}", "\u{4c5}", "\u{4c7}", "\u{4c9}", "\u{4cb}", "\u{4cd}", "\u{4d0}", "\u{4d2}", "\u{4d4}", "\u{4d6}", "\u{4d8}", "\u{4da}", "\u{4dc}", "\u{4de}", "\u{4e0}", "\u{4e2}", "\u{4e4}", "\u{4e6}", "\u{4e8}", "\u{4ea}", "\u{4ec}", "\u{4ee}", "\u{4f0}", "\u{4f2}", "\u{4f4}", "\u{4f6}", "\u{4f8}", "\u{4fa}", "\u{4fc}", "\u{4fe}", "\u{500}", "\u{502}", "\u{504}", "\u{506}", "\u{508}", "\u{50a}", "\u{50c}", "\u{50e}", "\u{510}", "\u{512}", "\u{514}", "\u{516}", "\u{518}", "\u{51a}", "\u{51c}", "\u{51e}", "\u{520}", "\u{522}", "\u{524}", "\u{526}", "\u{528}", "\u{52a}", "\u{52c}", "\u{52e}", "\u{531}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{13a0}", "\u{1c90}", "\u{1cbd}", "\u{1e00}", "\u{1e02}", "\u{1e04}", "\u{1e06}", "\u{1e08}", "\u{1e0a}", "\u{1e0c}", "\u{1e0e}", "\u{1e10}", "\u{1e12}", "\u{1e14}", "\u{1e16}", "\u{1e18}", "\u{1e1a}", "\u{1e1c}", "\u{1e1e}", "\u{1e20}", "\u{1e22}", "\u{1e24}", "\u{1e26}", "\u{1e28}", "\u{1e2a}", "\u{1e2c}", "\u{1e2e}", "\u{1e30}", "\u{1e32}", "\u{1e34}", "\u{1e36}", "\u{1e38}", "\u{1e3a}", "\u{1e3c}", "\u{1e3e}", "\u{1e40}", "\u{1e42}", "\u{1e44}", "\u{1e46}", "\u{1e48}", "\u{1e4a}", "\u{1e4c}", "\u{1e4e}", "\u{1e50}", "\u{1e52}", "\u{1e54}", "\u{1e56}", "\u{1e58}", "\u{1e5a}", "\u{1e5c}", "\u{1e5e}", "\u{1e60}", "\u{1e62}", "\u{1e64}", "\u{1e66}", "\u{1e68}", "\u{1e6a}", "\u{1e6c}", "\u{1e6e}", "\u{1e70}", "\u{1e72}", "\u{1e74}", "\u{1e76}", "\u{1e78}", "\u{1e7a}", "\u{1e7c}", "\u{1e7e}", "\u{1e80}", "\u{1e82}", "\u{1e84}", "\u{1e86}", "\u{1e88}", "\u{1e8a}", "\u{1e8c}", "\u{1e8e}", "\u{1e90}", "\u{1e92}", "\u{1e94}", "\u{1e9e}", "\u{1ea0}", "\u{1ea2}", "\u{1ea4}", "\u{1ea6}", "\u{1ea8}", "\u{1eaa}", "\u{1eac}", "\u{1eae}", "\u{1eb0}", "\u{1eb2}", "\u{1eb4}", "\u{1eb6}", "\u{1eb8}", "\u{1eba}", "\u{1ebc}", "\u{1ebe}", "\u{1ec0}", "\u{1ec2}", "\u{1ec4}", "\u{1ec6}", "\u{1ec8}", "\u{1eca}", "\u{1ecc}", "\u{1ece}", "\u{1ed0}", "\u{1ed2}", "\u{1ed4}", "\u{1ed6}", "\u{1ed8}", "\u{1eda}", "\u{1edc}", "\u{1ede}", "\u{1ee0}", "\u{1ee2}", "\u{1ee4}", "\u{1ee6}", "\u{1ee8}", "\u{1eea}", "\u{1eec}", "\u{1eee}", "\u{1ef0}", "\u{1ef2}", "\u{1ef4}", "\u{1ef6}", "\u{1ef8}", "\u{1efa}", "\u{1efc}", "\u{1efe}", "\u{1f08}", "\u{1f18}", "\u{1f28}", "\u{1f38}", "\u{1f48}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f68}", "\u{1fb8}", "\u{1fc8}", "\u{1fd8}", "\u{1fe8}", "\u{1ff8}", "\u{2102}", "\u{2107}", "\u{210b}", "\u{2110}", "\u{2115}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{2130}", "\u{213e}", "\u{2145}", "\u{2160}", "\u{2183}", "\u{24b6}", "\u{2c00}", "\u{2c60}", "\u{2c62}", "\u{2c67}", "\u{2c69}", "\u{2c6b}", "\u{2c6d}", "\u{2c72}", "\u{2c75}", "\u{2c7e}", "\u{2c82}", "\u{2c84}", "\u{2c86}", "\u{2c88}", "\u{2c8a}", "\u{2c8c}", "\u{2c8e}", "\u{2c90}", "\u{2c92}", "\u{2c94}", "\u{2c96}", "\u{2c98}", "\u{2c9a}", "\u{2c9c}", "\u{2c9e}", "\u{2ca0}", "\u{2ca2}", "\u{2ca4}", "\u{2ca6}", "\u{2ca8}", "\u{2caa}", "\u{2cac}", "\u{2cae}", "\u{2cb0}", "\u{2cb2}", "\u{2cb4}", "\u{2cb6}", "\u{2cb8}", "\u{2cba}", "\u{2cbc}", "\u{2cbe}", "\u{2cc0}", "\u{2cc2}", "\u{2cc4}", "\u{2cc6}", "\u{2cc8}", "\u{2cca}", "\u{2ccc}", "\u{2cce}", "\u{2cd0}", "\u{2cd2}", "\u{2cd4}", "\u{2cd6}", "\u{2cd8}", "\u{2cda}", "\u{2cdc}", "\u{2cde}", "\u{2ce0}", "\u{2ce2}", "\u{2ceb}", "\u{2ced}", "\u{2cf2}", "\u{a640}", "\u{a642}", "\u{a644}", "\u{a646}", "\u{a648}", "\u{a64a}", "\u{a64c}", "\u{a64e}", "\u{a650}", "\u{a652}", "\u{a654}", "\u{a656}", "\u{a658}", "\u{a65a}", "\u{a65c}", "\u{a65e}", "\u{a660}", "\u{a662}", "\u{a664}", "\u{a666}", "\u{a668}", "\u{a66a}", "\u{a66c}", "\u{a680}", "\u{a682}", "\u{a684}", "\u{a686}", "\u{a688}", "\u{a68a}", "\u{a68c}", "\u{a68e}", "\u{a690}", "\u{a692}", "\u{a694}", "\u{a696}", "\u{a698}", "\u{a69a}", "\u{a722}", "\u{a724}", "\u{a726}", "\u{a728}", "\u{a72a}", "\u{a72c}", "\u{a72e}", "\u{a732}", "\u{a734}", "\u{a736}", "\u{a738}", "\u{a73a}", "\u{a73c}", "\u{a73e}", "\u{a740}", "\u{a742}", "\u{a744}", "\u{a746}", "\u{a748}", "\u{a74a}", "\u{a74c}", "\u{a74e}", "\u{a750}", "\u{a752}", "\u{a754}", "\u{a756}", "\u{a758}", "\u{a75a}", "\u{a75c}", "\u{a75e}", "\u{a760}", "\u{a762}", "\u{a764}", "\u{a766}", "\u{a768}", "\u{a76a}", "\u{a76c}", "\u{a76e}", "\u{a779}", "\u{a77b}", "\u{a77d}", "\u{a780}", "\u{a782}", "\u{a784}", "\u{a786}", "\u{a78b}", "\u{a78d}", "\u{a790}", "\u{a792}", "\u{a796}", "\u{a798}", "\u{a79a}", "\u{a79c}", "\u{a79e}", "\u{a7a0}", "\u{a7a2}", "\u{a7a4}", "\u{a7a6}", "\u{a7a8}", "\u{a7aa}", "\u{a7b0}", "\u{a7b6}", "\u{a7b8}", "\u{a7ba}", "\u{a7bc}", "\u{a7be}", "\u{a7c0}", "\u{a7c2}", "\u{a7c4}", "\u{a7c9}", "\u{a7d0}", "\u{a7d6}", "\u{a7d8}", "\u{a7f5}", "\u{ff21}", "\u{10400}", "\u{104b0}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10c80}", "\u{118a0}", "\u{16e40}", "\u{1d400}", "\u{1d434}", "\u{1d468}", "\u{1d49c}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4d0}", "\u{1d504}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d538}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d56c}", "\u{1d5a0}", "\u{1d5d4}", "\u{1d608}", "\u{1d63c}", "\u{1d670}", "\u{1d6a8}", "\u{1d6e2}", "\u{1d71c}", "\u{1d756}", "\u{1d790}", "\u{1d7ca}", "\u{1e900}", "\u{1f130}", "\u{1f150}", "\u{1f170}", ]; const REGEXES: [&str; 2] = ["^\\p{Uppercase}+$", "^\\p{Upper}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_variationselector() { test_with_configs(unicode_escape_property_binary_variationselector_tc) } fn unicode_escape_property_binary_variationselector_tc(tc: TestConfig) { const CODE_POINTS: [&str; 4] = ["\u{180b}", "\u{180f}", "\u{fe00}", "\u{e0100}"]; const REGEXES: [&str; 2] = ["^\\p{Variation_Selector}+$", "^\\p{VS}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_whitespace() { test_with_configs(unicode_escape_property_binary_whitespace_tc) } fn unicode_escape_property_binary_whitespace_tc(tc: TestConfig) { const CODE_POINTS: [&str; 11] = [ "\u{9}", "\u{20}", "\u{85}", "\u{a0}", "\u{1680}", "\u{2000}", "\u{2028}", "\u{2029}", "\u{202f}", "\u{205f}", "\u{3000}", ]; const REGEXES: [&str; 2] = ["^\\p{White_Space}+$", "^\\p{space}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_emoji() { test_with_configs(unicode_escape_property_binary_emoji_tc) } fn unicode_escape_property_binary_emoji_tc(tc: TestConfig) { const CODE_POINTS: [&str; 404] = [ "\u{23}", "\u{2a}", "\u{30}", "\u{a9}", "\u{ae}", "\u{203c}", "\u{2049}", "\u{2122}", "\u{2139}", "\u{2194}", "\u{21a9}", "\u{231a}", "\u{2328}", "\u{23cf}", "\u{23e9}", "\u{23ed}", "\u{23ef}", "\u{23f0}", "\u{23f1}", "\u{23f3}", "\u{23f8}", "\u{24c2}", "\u{25aa}", "\u{25b6}", "\u{25c0}", "\u{25fb}", "\u{2600}", "\u{2602}", "\u{2604}", "\u{260e}", "\u{2611}", "\u{2614}", "\u{2618}", "\u{261d}", "\u{2620}", "\u{2622}", "\u{2626}", "\u{262a}", "\u{262e}", "\u{262f}", "\u{2638}", "\u{263a}", "\u{2640}", "\u{2642}", "\u{2648}", "\u{265f}", "\u{2660}", "\u{2663}", "\u{2665}", "\u{2668}", "\u{267b}", "\u{267e}", "\u{267f}", "\u{2692}", "\u{2693}", "\u{2694}", "\u{2695}", "\u{2696}", "\u{2699}", "\u{269b}", "\u{26a0}", "\u{26a7}", "\u{26aa}", "\u{26b0}", "\u{26bd}", "\u{26c4}", "\u{26c8}", "\u{26ce}", "\u{26cf}", "\u{26d1}", "\u{26d3}", "\u{26d4}", "\u{26e9}", "\u{26ea}", "\u{26f0}", "\u{26f2}", "\u{26f4}", "\u{26f5}", "\u{26f7}", "\u{26fa}", "\u{26fd}", "\u{2702}", "\u{2705}", "\u{2708}", "\u{270d}", "\u{270f}", "\u{2712}", "\u{2714}", "\u{2716}", "\u{271d}", "\u{2721}", "\u{2728}", "\u{2733}", "\u{2744}", "\u{2747}", "\u{274c}", "\u{274e}", "\u{2753}", "\u{2757}", "\u{2763}", "\u{2764}", "\u{2795}", "\u{27a1}", "\u{27b0}", "\u{27bf}", "\u{2934}", "\u{2b05}", "\u{2b1b}", "\u{2b50}", "\u{2b55}", "\u{3030}", "\u{303d}", "\u{3297}", "\u{3299}", "\u{1f004}", "\u{1f0cf}", "\u{1f170}", "\u{1f17e}", "\u{1f18e}", "\u{1f191}", "\u{1f1e6}", "\u{1f201}", "\u{1f21a}", "\u{1f22f}", "\u{1f232}", "\u{1f250}", "\u{1f300}", "\u{1f30d}", "\u{1f30f}", "\u{1f310}", "\u{1f311}", "\u{1f312}", "\u{1f313}", "\u{1f316}", "\u{1f319}", "\u{1f31a}", "\u{1f31b}", "\u{1f31c}", "\u{1f31d}", "\u{1f31f}", "\u{1f321}", "\u{1f324}", "\u{1f32d}", "\u{1f330}", "\u{1f332}", "\u{1f334}", "\u{1f336}", "\u{1f337}", "\u{1f34b}", "\u{1f34c}", "\u{1f350}", "\u{1f351}", "\u{1f37c}", "\u{1f37d}", "\u{1f37e}", "\u{1f380}", "\u{1f396}", "\u{1f399}", "\u{1f39e}", "\u{1f3a0}", "\u{1f3c5}", "\u{1f3c6}", "\u{1f3c7}", "\u{1f3c8}", "\u{1f3c9}", "\u{1f3ca}", "\u{1f3cb}", "\u{1f3cf}", "\u{1f3d4}", "\u{1f3e0}", "\u{1f3e4}", "\u{1f3e5}", "\u{1f3f3}", "\u{1f3f4}", "\u{1f3f5}", "\u{1f3f7}", "\u{1f3f8}", "\u{1f408}", "\u{1f409}", "\u{1f40c}", "\u{1f40f}", "\u{1f411}", "\u{1f413}", "\u{1f414}", "\u{1f415}", "\u{1f416}", "\u{1f417}", "\u{1f42a}", "\u{1f42b}", "\u{1f43f}", "\u{1f440}", "\u{1f441}", "\u{1f442}", "\u{1f465}", "\u{1f466}", "\u{1f46c}", "\u{1f46e}", "\u{1f4ad}", "\u{1f4ae}", "\u{1f4b6}", "\u{1f4b8}", "\u{1f4ec}", "\u{1f4ee}", "\u{1f4ef}", "\u{1f4f0}", "\u{1f4f5}", "\u{1f4f6}", "\u{1f4f8}", "\u{1f4f9}", "\u{1f4fd}", "\u{1f4ff}", "\u{1f503}", "\u{1f504}", "\u{1f508}", "\u{1f509}", "\u{1f50a}", "\u{1f515}", "\u{1f516}", "\u{1f52c}", "\u{1f52e}", "\u{1f549}", "\u{1f54b}", "\u{1f550}", "\u{1f55c}", "\u{1f56f}", "\u{1f573}", "\u{1f57a}", "\u{1f587}", "\u{1f58a}", "\u{1f590}", "\u{1f595}", "\u{1f5a4}", "\u{1f5a5}", "\u{1f5a8}", "\u{1f5b1}", "\u{1f5bc}", "\u{1f5c2}", "\u{1f5d1}", "\u{1f5dc}", "\u{1f5e1}", "\u{1f5e3}", "\u{1f5e8}", "\u{1f5ef}", "\u{1f5f3}", "\u{1f5fa}", "\u{1f5fb}", "\u{1f600}", "\u{1f601}", "\u{1f607}", "\u{1f609}", "\u{1f60e}", "\u{1f60f}", "\u{1f610}", "\u{1f611}", "\u{1f612}", "\u{1f615}", "\u{1f616}", "\u{1f617}", "\u{1f618}", "\u{1f619}", "\u{1f61a}", "\u{1f61b}", "\u{1f61c}", "\u{1f61f}", "\u{1f620}", "\u{1f626}", "\u{1f628}", "\u{1f62c}", "\u{1f62d}", "\u{1f62e}", "\u{1f630}", "\u{1f634}", "\u{1f635}", "\u{1f636}", "\u{1f637}", "\u{1f641}", "\u{1f645}", "\u{1f680}", "\u{1f681}", "\u{1f683}", "\u{1f686}", "\u{1f687}", "\u{1f688}", "\u{1f689}", "\u{1f68a}", "\u{1f68c}", "\u{1f68d}", "\u{1f68e}", "\u{1f68f}", "\u{1f690}", "\u{1f691}", "\u{1f694}", "\u{1f695}", "\u{1f696}", "\u{1f697}", "\u{1f698}", "\u{1f699}", "\u{1f69b}", "\u{1f6a2}", "\u{1f6a3}", "\u{1f6a4}", "\u{1f6a6}", "\u{1f6a7}", "\u{1f6ae}", "\u{1f6b2}", "\u{1f6b3}", "\u{1f6b6}", "\u{1f6b7}", "\u{1f6b9}", "\u{1f6bf}", "\u{1f6c0}", "\u{1f6c1}", "\u{1f6cb}", "\u{1f6cc}", "\u{1f6cd}", "\u{1f6d0}", "\u{1f6d1}", "\u{1f6d5}", "\u{1f6d6}", "\u{1f6dc}", "\u{1f6dd}", "\u{1f6e0}", "\u{1f6e9}", "\u{1f6eb}", "\u{1f6f0}", "\u{1f6f3}", "\u{1f6f4}", "\u{1f6f7}", "\u{1f6f9}", "\u{1f6fa}", "\u{1f6fb}", "\u{1f7e0}", "\u{1f7f0}", "\u{1f90c}", "\u{1f90d}", "\u{1f910}", "\u{1f919}", "\u{1f91f}", "\u{1f920}", "\u{1f928}", "\u{1f930}", "\u{1f931}", "\u{1f933}", "\u{1f93c}", "\u{1f93f}", "\u{1f940}", "\u{1f947}", "\u{1f94c}", "\u{1f94d}", "\u{1f950}", "\u{1f95f}", "\u{1f96c}", "\u{1f971}", "\u{1f972}", "\u{1f973}", "\u{1f977}", "\u{1f979}", "\u{1f97a}", "\u{1f97b}", "\u{1f97c}", "\u{1f980}", "\u{1f985}", "\u{1f992}", "\u{1f998}", "\u{1f9a3}", "\u{1f9a5}", "\u{1f9ab}", "\u{1f9ae}", "\u{1f9b0}", "\u{1f9ba}", "\u{1f9c0}", "\u{1f9c1}", "\u{1f9c3}", "\u{1f9cb}", "\u{1f9cc}", "\u{1f9cd}", "\u{1f9d0}", "\u{1f9e7}", "\u{1fa70}", "\u{1fa74}", "\u{1fa75}", "\u{1fa78}", "\u{1fa7b}", "\u{1fa80}", "\u{1fa83}", "\u{1fa87}", "\u{1fa90}", "\u{1fa96}", "\u{1faa9}", "\u{1faad}", "\u{1fab0}", "\u{1fab7}", "\u{1fabb}", "\u{1fabf}", "\u{1fac0}", "\u{1fac3}", "\u{1face}", "\u{1fad0}", "\u{1fad7}", "\u{1fada}", "\u{1fae0}", "\u{1fae8}", "\u{1faf0}", "\u{1faf7}", ]; const REGEXES: [&str; 1] = ["^\\p{Emoji}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_emojicomponent() { test_with_configs(unicode_escape_property_binary_emojicomponent_tc) } fn unicode_escape_property_binary_emojicomponent_tc(tc: TestConfig) { const CODE_POINTS: [&str; 10] = [ "\u{23}", "\u{2a}", "\u{30}", "\u{200d}", "\u{20e3}", "\u{fe0f}", "\u{1f1e6}", "\u{1f3fb}", "\u{1f9b0}", "\u{e0020}", ]; const REGEXES: [&str; 2] = ["^\\p{Emoji_Component}+$", "^\\p{EComp}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_emojimodifier() { test_with_configs(unicode_escape_property_binary_emojimodifier_tc) } fn unicode_escape_property_binary_emojimodifier_tc(tc: TestConfig) { const CODE_POINTS: [&str; 1] = ["\u{1f3fb}"]; const REGEXES: [&str; 2] = ["^\\p{Emoji_Modifier}+$", "^\\p{EMod}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_emojimodifierbase() { test_with_configs(unicode_escape_property_binary_emojimodifierbase_tc) } fn unicode_escape_property_binary_emojimodifierbase_tc(tc: TestConfig) { const CODE_POINTS: [&str; 50] = [ "\u{261d}", "\u{26f9}", "\u{270a}", "\u{270d}", "\u{1f385}", "\u{1f3c2}", "\u{1f3c7}", "\u{1f3ca}", "\u{1f3cb}", "\u{1f442}", "\u{1f446}", "\u{1f466}", "\u{1f46c}", "\u{1f46e}", "\u{1f47c}", "\u{1f481}", "\u{1f485}", "\u{1f48f}", "\u{1f491}", "\u{1f4aa}", "\u{1f574}", "\u{1f57a}", "\u{1f590}", "\u{1f595}", "\u{1f645}", "\u{1f64b}", "\u{1f6a3}", "\u{1f6b4}", "\u{1f6b6}", "\u{1f6c0}", "\u{1f6cc}", "\u{1f90c}", "\u{1f90f}", "\u{1f918}", "\u{1f919}", "\u{1f91f}", "\u{1f926}", "\u{1f930}", "\u{1f931}", "\u{1f933}", "\u{1f93c}", "\u{1f977}", "\u{1f9b5}", "\u{1f9b8}", "\u{1f9bb}", "\u{1f9cd}", "\u{1f9d1}", "\u{1fac3}", "\u{1faf0}", "\u{1faf7}", ]; const REGEXES: [&str; 2] = ["^\\p{Emoji_Modifier_Base}+$", "^\\p{EBase}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_emojipresentation() { test_with_configs(unicode_escape_property_binary_emojipresentation_tc) } fn unicode_escape_property_binary_emojipresentation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 282] = [ "\u{231a}", "\u{23e9}", "\u{23f0}", "\u{23f3}", "\u{25fd}", "\u{2614}", "\u{2648}", "\u{267f}", "\u{2693}", "\u{26a1}", "\u{26aa}", "\u{26bd}", "\u{26c4}", "\u{26ce}", "\u{26d4}", "\u{26ea}", "\u{26f2}", "\u{26f5}", "\u{26fa}", "\u{26fd}", "\u{2705}", "\u{270a}", "\u{2728}", "\u{274c}", "\u{274e}", "\u{2753}", "\u{2757}", "\u{2795}", "\u{27b0}", "\u{27bf}", "\u{2b1b}", "\u{2b50}", "\u{2b55}", "\u{1f004}", "\u{1f0cf}", "\u{1f18e}", "\u{1f191}", "\u{1f1e6}", "\u{1f201}", "\u{1f21a}", "\u{1f22f}", "\u{1f232}", "\u{1f238}", "\u{1f250}", "\u{1f300}", "\u{1f30d}", "\u{1f30f}", "\u{1f310}", "\u{1f311}", "\u{1f312}", "\u{1f313}", "\u{1f316}", "\u{1f319}", "\u{1f31a}", "\u{1f31b}", "\u{1f31c}", "\u{1f31d}", "\u{1f31f}", "\u{1f32d}", "\u{1f330}", "\u{1f332}", "\u{1f334}", "\u{1f337}", "\u{1f34b}", "\u{1f34c}", "\u{1f350}", "\u{1f351}", "\u{1f37c}", "\u{1f37e}", "\u{1f380}", "\u{1f3a0}", "\u{1f3c5}", "\u{1f3c6}", "\u{1f3c7}", "\u{1f3c8}", "\u{1f3c9}", "\u{1f3ca}", "\u{1f3cf}", "\u{1f3e0}", "\u{1f3e4}", "\u{1f3e5}", "\u{1f3f4}", "\u{1f3f8}", "\u{1f408}", "\u{1f409}", "\u{1f40c}", "\u{1f40f}", "\u{1f411}", "\u{1f413}", "\u{1f414}", "\u{1f415}", "\u{1f416}", "\u{1f417}", "\u{1f42a}", "\u{1f42b}", "\u{1f440}", "\u{1f442}", "\u{1f465}", "\u{1f466}", "\u{1f46c}", "\u{1f46e}", "\u{1f4ad}", "\u{1f4ae}", "\u{1f4b6}", "\u{1f4b8}", "\u{1f4ec}", "\u{1f4ee}", "\u{1f4ef}", "\u{1f4f0}", "\u{1f4f5}", "\u{1f4f6}", "\u{1f4f8}", "\u{1f4f9}", "\u{1f4ff}", "\u{1f503}", "\u{1f504}", "\u{1f508}", "\u{1f509}", "\u{1f50a}", "\u{1f515}", "\u{1f516}", "\u{1f52c}", "\u{1f52e}", "\u{1f54b}", "\u{1f550}", "\u{1f55c}", "\u{1f57a}", "\u{1f595}", "\u{1f5a4}", "\u{1f5fb}", "\u{1f600}", "\u{1f601}", "\u{1f607}", "\u{1f609}", "\u{1f60e}", "\u{1f60f}", "\u{1f610}", "\u{1f611}", "\u{1f612}", "\u{1f615}", "\u{1f616}", "\u{1f617}", "\u{1f618}", "\u{1f619}", "\u{1f61a}", "\u{1f61b}", "\u{1f61c}", "\u{1f61f}", "\u{1f620}", "\u{1f626}", "\u{1f628}", "\u{1f62c}", "\u{1f62d}", "\u{1f62e}", "\u{1f630}", "\u{1f634}", "\u{1f635}", "\u{1f636}", "\u{1f637}", "\u{1f641}", "\u{1f645}", "\u{1f680}", "\u{1f681}", "\u{1f683}", "\u{1f686}", "\u{1f687}", "\u{1f688}", "\u{1f689}", "\u{1f68a}", "\u{1f68c}", "\u{1f68d}", "\u{1f68e}", "\u{1f68f}", "\u{1f690}", "\u{1f691}", "\u{1f694}", "\u{1f695}", "\u{1f696}", "\u{1f697}", "\u{1f698}", "\u{1f699}", "\u{1f69b}", "\u{1f6a2}", "\u{1f6a3}", "\u{1f6a4}", "\u{1f6a6}", "\u{1f6a7}", "\u{1f6ae}", "\u{1f6b2}", "\u{1f6b3}", "\u{1f6b6}", "\u{1f6b7}", "\u{1f6b9}", "\u{1f6bf}", "\u{1f6c0}", "\u{1f6c1}", "\u{1f6cc}", "\u{1f6d0}", "\u{1f6d1}", "\u{1f6d5}", "\u{1f6d6}", "\u{1f6dc}", "\u{1f6dd}", "\u{1f6eb}", "\u{1f6f4}", "\u{1f6f7}", "\u{1f6f9}", "\u{1f6fa}", "\u{1f6fb}", "\u{1f7e0}", "\u{1f7f0}", "\u{1f90c}", "\u{1f90d}", "\u{1f910}", "\u{1f919}", "\u{1f91f}", "\u{1f920}", "\u{1f928}", "\u{1f930}", "\u{1f931}", "\u{1f933}", "\u{1f93c}", "\u{1f93f}", "\u{1f940}", "\u{1f947}", "\u{1f94c}", "\u{1f94d}", "\u{1f950}", "\u{1f95f}", "\u{1f96c}", "\u{1f971}", "\u{1f972}", "\u{1f973}", "\u{1f977}", "\u{1f979}", "\u{1f97a}", "\u{1f97b}", "\u{1f97c}", "\u{1f980}", "\u{1f985}", "\u{1f992}", "\u{1f998}", "\u{1f9a3}", "\u{1f9a5}", "\u{1f9ab}", "\u{1f9ae}", "\u{1f9b0}", "\u{1f9ba}", "\u{1f9c0}", "\u{1f9c1}", "\u{1f9c3}", "\u{1f9cb}", "\u{1f9cc}", "\u{1f9cd}", "\u{1f9d0}", "\u{1f9e7}", "\u{1fa70}", "\u{1fa74}", "\u{1fa75}", "\u{1fa78}", "\u{1fa7b}", "\u{1fa80}", "\u{1fa83}", "\u{1fa87}", "\u{1fa90}", "\u{1fa96}", "\u{1faa9}", "\u{1faad}", "\u{1fab0}", "\u{1fab7}", "\u{1fabb}", "\u{1fabf}", "\u{1fac0}", "\u{1fac3}", "\u{1face}", "\u{1fad0}", "\u{1fad7}", "\u{1fada}", "\u{1fae0}", "\u{1fae8}", "\u{1faf0}", "\u{1faf7}", ]; const REGEXES: [&str; 2] = ["^\\p{Emoji_Presentation}+$", "^\\p{EPres}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_extendedpictographic() { test_with_configs(unicode_escape_property_binary_extendedpictographic_tc) } fn unicode_escape_property_binary_extendedpictographic_tc(tc: TestConfig) { const CODE_POINTS: [&str; 511] = [ "\u{a9}", "\u{ae}", "\u{203c}", "\u{2049}", "\u{2122}", "\u{2139}", "\u{2194}", "\u{21a9}", "\u{231a}", "\u{2328}", "\u{2388}", "\u{23cf}", "\u{23e9}", "\u{23ed}", "\u{23ef}", "\u{23f0}", "\u{23f1}", "\u{23f3}", "\u{23f8}", "\u{24c2}", "\u{25aa}", "\u{25b6}", "\u{25c0}", "\u{25fb}", "\u{2600}", "\u{2602}", "\u{2604}", "\u{2605}", "\u{2607}", "\u{260e}", "\u{260f}", "\u{2611}", "\u{2612}", "\u{2614}", "\u{2616}", "\u{2618}", "\u{2619}", "\u{261d}", "\u{261e}", "\u{2620}", "\u{2621}", "\u{2622}", "\u{2624}", "\u{2626}", "\u{2627}", "\u{262a}", "\u{262b}", "\u{262e}", "\u{262f}", "\u{2630}", "\u{2638}", "\u{263a}", "\u{263b}", "\u{2640}", "\u{2641}", "\u{2642}", "\u{2643}", "\u{2648}", "\u{2654}", "\u{265f}", "\u{2660}", "\u{2661}", "\u{2663}", "\u{2664}", "\u{2665}", "\u{2667}", "\u{2668}", "\u{2669}", "\u{267b}", "\u{267c}", "\u{267e}", "\u{267f}", "\u{2680}", "\u{2690}", "\u{2692}", "\u{2693}", "\u{2694}", "\u{2695}", "\u{2696}", "\u{2698}", "\u{2699}", "\u{269a}", "\u{269b}", "\u{269d}", "\u{26a0}", "\u{26a2}", "\u{26a7}", "\u{26a8}", "\u{26aa}", "\u{26ac}", "\u{26b0}", "\u{26b2}", "\u{26bd}", "\u{26bf}", "\u{26c4}", "\u{26c6}", "\u{26c8}", "\u{26c9}", "\u{26ce}", "\u{26cf}", "\u{26d0}", "\u{26d1}", "\u{26d2}", "\u{26d3}", "\u{26d4}", "\u{26d5}", "\u{26e9}", "\u{26ea}", "\u{26eb}", "\u{26f0}", "\u{26f2}", "\u{26f4}", "\u{26f5}", "\u{26f6}", "\u{26f7}", "\u{26fa}", "\u{26fb}", "\u{26fd}", "\u{26fe}", "\u{2702}", "\u{2703}", "\u{2705}", "\u{2708}", "\u{270d}", "\u{270e}", "\u{270f}", "\u{2710}", "\u{2712}", "\u{2714}", "\u{2716}", "\u{271d}", "\u{2721}", "\u{2728}", "\u{2733}", "\u{2744}", "\u{2747}", "\u{274c}", "\u{274e}", "\u{2753}", "\u{2757}", "\u{2763}", "\u{2764}", "\u{2765}", "\u{2795}", "\u{27a1}", "\u{27b0}", "\u{27bf}", "\u{2934}", "\u{2b05}", "\u{2b1b}", "\u{2b50}", "\u{2b55}", "\u{3030}", "\u{303d}", "\u{3297}", "\u{3299}", "\u{1f000}", "\u{1f004}", "\u{1f005}", "\u{1f0cf}", "\u{1f0d0}", "\u{1f10d}", "\u{1f12f}", "\u{1f16c}", "\u{1f170}", "\u{1f17e}", "\u{1f18e}", "\u{1f191}", "\u{1f1ad}", "\u{1f201}", "\u{1f203}", "\u{1f21a}", "\u{1f22f}", "\u{1f232}", "\u{1f23c}", "\u{1f249}", "\u{1f250}", "\u{1f252}", "\u{1f300}", "\u{1f30d}", "\u{1f30f}", "\u{1f310}", "\u{1f311}", "\u{1f312}", "\u{1f313}", "\u{1f316}", "\u{1f319}", "\u{1f31a}", "\u{1f31b}", "\u{1f31c}", "\u{1f31d}", "\u{1f31f}", "\u{1f321}", "\u{1f322}", "\u{1f324}", "\u{1f32d}", "\u{1f330}", "\u{1f332}", "\u{1f334}", "\u{1f336}", "\u{1f337}", "\u{1f34b}", "\u{1f34c}", "\u{1f350}", "\u{1f351}", "\u{1f37c}", "\u{1f37d}", "\u{1f37e}", "\u{1f380}", "\u{1f394}", "\u{1f396}", "\u{1f398}", "\u{1f399}", "\u{1f39c}", "\u{1f39e}", "\u{1f3a0}", "\u{1f3c5}", "\u{1f3c6}", "\u{1f3c7}", "\u{1f3c8}", "\u{1f3c9}", "\u{1f3ca}", "\u{1f3cb}", "\u{1f3cf}", "\u{1f3d4}", "\u{1f3e0}", "\u{1f3e4}", "\u{1f3e5}", "\u{1f3f1}", "\u{1f3f3}", "\u{1f3f4}", "\u{1f3f5}", "\u{1f3f6}", "\u{1f3f7}", "\u{1f3f8}", "\u{1f400}", "\u{1f408}", "\u{1f409}", "\u{1f40c}", "\u{1f40f}", "\u{1f411}", "\u{1f413}", "\u{1f414}", "\u{1f415}", "\u{1f416}", "\u{1f417}", "\u{1f42a}", "\u{1f42b}", "\u{1f43f}", "\u{1f440}", "\u{1f441}", "\u{1f442}", "\u{1f465}", "\u{1f466}", "\u{1f46c}", "\u{1f46e}", "\u{1f4ad}", "\u{1f4ae}", "\u{1f4b6}", "\u{1f4b8}", "\u{1f4ec}", "\u{1f4ee}", "\u{1f4ef}", "\u{1f4f0}", "\u{1f4f5}", "\u{1f4f6}", "\u{1f4f8}", "\u{1f4f9}", "\u{1f4fd}", "\u{1f4fe}", "\u{1f4ff}", "\u{1f503}", "\u{1f504}", "\u{1f508}", "\u{1f509}", "\u{1f50a}", "\u{1f515}", "\u{1f516}", "\u{1f52c}", "\u{1f52e}", "\u{1f546}", "\u{1f549}", "\u{1f54b}", "\u{1f54f}", "\u{1f550}", "\u{1f55c}", "\u{1f568}", "\u{1f56f}", "\u{1f571}", "\u{1f573}", "\u{1f57a}", "\u{1f57b}", "\u{1f587}", "\u{1f588}", "\u{1f58a}", "\u{1f58e}", "\u{1f590}", "\u{1f591}", "\u{1f595}", "\u{1f597}", "\u{1f5a4}", "\u{1f5a5}", "\u{1f5a6}", "\u{1f5a8}", "\u{1f5a9}", "\u{1f5b1}", "\u{1f5b3}", "\u{1f5bc}", "\u{1f5bd}", "\u{1f5c2}", "\u{1f5c5}", "\u{1f5d1}", "\u{1f5d4}", "\u{1f5dc}", "\u{1f5df}", "\u{1f5e1}", "\u{1f5e2}", "\u{1f5e3}", "\u{1f5e4}", "\u{1f5e8}", "\u{1f5e9}", "\u{1f5ef}", "\u{1f5f0}", "\u{1f5f3}", "\u{1f5f4}", "\u{1f5fa}", "\u{1f5fb}", "\u{1f600}", "\u{1f601}", "\u{1f607}", "\u{1f609}", "\u{1f60e}", "\u{1f60f}", "\u{1f610}", "\u{1f611}", "\u{1f612}", "\u{1f615}", "\u{1f616}", "\u{1f617}", "\u{1f618}", "\u{1f619}", "\u{1f61a}", "\u{1f61b}", "\u{1f61c}", "\u{1f61f}", "\u{1f620}", "\u{1f626}", "\u{1f628}", "\u{1f62c}", "\u{1f62d}", "\u{1f62e}", "\u{1f630}", "\u{1f634}", "\u{1f635}", "\u{1f636}", "\u{1f637}", "\u{1f641}", "\u{1f645}", "\u{1f680}", "\u{1f681}", "\u{1f683}", "\u{1f686}", "\u{1f687}", "\u{1f688}", "\u{1f689}", "\u{1f68a}", "\u{1f68c}", "\u{1f68d}", "\u{1f68e}", "\u{1f68f}", "\u{1f690}", "\u{1f691}", "\u{1f694}", "\u{1f695}", "\u{1f696}", "\u{1f697}", "\u{1f698}", "\u{1f699}", "\u{1f69b}", "\u{1f6a2}", "\u{1f6a3}", "\u{1f6a4}", "\u{1f6a6}", "\u{1f6a7}", "\u{1f6ae}", "\u{1f6b2}", "\u{1f6b3}", "\u{1f6b6}", "\u{1f6b7}", "\u{1f6b9}", "\u{1f6bf}", "\u{1f6c0}", "\u{1f6c1}", "\u{1f6c6}", "\u{1f6cb}", "\u{1f6cc}", "\u{1f6cd}", "\u{1f6d0}", "\u{1f6d1}", "\u{1f6d3}", "\u{1f6d5}", "\u{1f6d6}", "\u{1f6d8}", "\u{1f6dc}", "\u{1f6dd}", "\u{1f6e0}", "\u{1f6e6}", "\u{1f6e9}", "\u{1f6ea}", "\u{1f6eb}", "\u{1f6ed}", "\u{1f6f0}", "\u{1f6f1}", "\u{1f6f3}", "\u{1f6f4}", "\u{1f6f7}", "\u{1f6f9}", "\u{1f6fa}", "\u{1f6fb}", "\u{1f6fd}", "\u{1f774}", "\u{1f7d5}", "\u{1f7e0}", "\u{1f7ec}", "\u{1f7f0}", "\u{1f7f1}", "\u{1f80c}", "\u{1f848}", "\u{1f85a}", "\u{1f888}", "\u{1f8ae}", "\u{1f90c}", "\u{1f90d}", "\u{1f910}", "\u{1f919}", "\u{1f91f}", "\u{1f920}", "\u{1f928}", "\u{1f930}", "\u{1f931}", "\u{1f933}", "\u{1f93c}", "\u{1f93f}", "\u{1f940}", "\u{1f947}", "\u{1f94c}", "\u{1f94d}", "\u{1f950}", "\u{1f95f}", "\u{1f96c}", "\u{1f971}", "\u{1f972}", "\u{1f973}", "\u{1f977}", "\u{1f979}", "\u{1f97a}", "\u{1f97b}", "\u{1f97c}", "\u{1f980}", "\u{1f985}", "\u{1f992}", "\u{1f998}", "\u{1f9a3}", "\u{1f9a5}", "\u{1f9ab}", "\u{1f9ae}", "\u{1f9b0}", "\u{1f9ba}", "\u{1f9c0}", "\u{1f9c1}", "\u{1f9c3}", "\u{1f9cb}", "\u{1f9cc}", "\u{1f9cd}", "\u{1f9d0}", "\u{1f9e7}", "\u{1fa00}", "\u{1fa70}", "\u{1fa74}", "\u{1fa75}", "\u{1fa78}", "\u{1fa7b}", "\u{1fa7d}", "\u{1fa80}", "\u{1fa83}", "\u{1fa87}", "\u{1fa89}", "\u{1fa90}", "\u{1fa96}", "\u{1faa9}", "\u{1faad}", "\u{1fab0}", "\u{1fab7}", "\u{1fabb}", "\u{1fabe}", "\u{1fabf}", "\u{1fac0}", "\u{1fac3}", "\u{1fac6}", "\u{1face}", "\u{1fad0}", "\u{1fad7}", "\u{1fada}", "\u{1fadc}", "\u{1fae0}", "\u{1fae8}", "\u{1fae9}", "\u{1faf0}", "\u{1faf7}", "\u{1faf9}", "\u{1fc00}", ]; const REGEXES: [&str; 2] = ["^\\p{Extended_Pictographic}+$", "^\\p{ExtPict}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_changeswhennfkccasefolded() { test_with_configs(unicode_escape_property_binary_changeswhennfkccasefolded_tc) } fn unicode_escape_property_binary_changeswhennfkccasefolded_tc(tc: TestConfig) { const CODE_POINTS: [&str; 1003] = [ "\u{41}", "\u{a0}", "\u{a8}", "\u{aa}", "\u{ad}", "\u{af}", "\u{b2}", "\u{b4}", "\u{b5}", "\u{b8}", "\u{b9}", "\u{ba}", "\u{bc}", "\u{c0}", "\u{d8}", "\u{100}", "\u{102}", "\u{104}", "\u{106}", "\u{108}", "\u{10a}", "\u{10c}", "\u{10e}", "\u{110}", "\u{112}", "\u{114}", "\u{116}", "\u{118}", "\u{11a}", "\u{11c}", "\u{11e}", "\u{120}", "\u{122}", "\u{124}", "\u{126}", "\u{128}", "\u{12a}", "\u{12c}", "\u{12e}", "\u{130}", "\u{132}", "\u{136}", "\u{139}", "\u{13b}", "\u{13d}", "\u{13f}", "\u{143}", "\u{145}", "\u{147}", "\u{149}", "\u{14c}", "\u{14e}", "\u{150}", "\u{152}", "\u{154}", "\u{156}", "\u{158}", "\u{15a}", "\u{15c}", "\u{15e}", "\u{160}", "\u{162}", "\u{164}", "\u{166}", "\u{168}", "\u{16a}", "\u{16c}", "\u{16e}", "\u{170}", "\u{172}", "\u{174}", "\u{176}", "\u{178}", "\u{17b}", "\u{17d}", "\u{17f}", "\u{181}", "\u{184}", "\u{186}", "\u{189}", "\u{18e}", "\u{193}", "\u{196}", "\u{19c}", "\u{19f}", "\u{1a2}", "\u{1a4}", "\u{1a6}", "\u{1a9}", "\u{1ac}", "\u{1ae}", "\u{1b1}", "\u{1b5}", "\u{1b7}", "\u{1bc}", "\u{1c4}", "\u{1cf}", "\u{1d1}", "\u{1d3}", "\u{1d5}", "\u{1d7}", "\u{1d9}", "\u{1db}", "\u{1de}", "\u{1e0}", "\u{1e2}", "\u{1e4}", "\u{1e6}", "\u{1e8}", "\u{1ea}", "\u{1ec}", "\u{1ee}", "\u{1f1}", "\u{1f6}", "\u{1fa}", "\u{1fc}", "\u{1fe}", "\u{200}", "\u{202}", "\u{204}", "\u{206}", "\u{208}", "\u{20a}", "\u{20c}", "\u{20e}", "\u{210}", "\u{212}", "\u{214}", "\u{216}", "\u{218}", "\u{21a}", "\u{21c}", "\u{21e}", "\u{220}", "\u{222}", "\u{224}", "\u{226}", "\u{228}", "\u{22a}", "\u{22c}", "\u{22e}", "\u{230}", "\u{232}", "\u{23a}", "\u{23d}", "\u{241}", "\u{243}", "\u{248}", "\u{24a}", "\u{24c}", "\u{24e}", "\u{2b0}", "\u{2d8}", "\u{2e0}", "\u{340}", "\u{343}", "\u{34f}", "\u{370}", "\u{372}", "\u{374}", "\u{376}", "\u{37a}", "\u{37e}", "\u{37f}", "\u{384}", "\u{386}", "\u{387}", "\u{388}", "\u{38c}", "\u{38e}", "\u{391}", "\u{3a3}", "\u{3c2}", "\u{3cf}", "\u{3d8}", "\u{3da}", "\u{3dc}", "\u{3de}", "\u{3e0}", "\u{3e2}", "\u{3e4}", "\u{3e6}", "\u{3e8}", "\u{3ea}", "\u{3ec}", "\u{3ee}", "\u{3f0}", "\u{3f4}", "\u{3f7}", "\u{3f9}", "\u{3fd}", "\u{460}", "\u{462}", "\u{464}", "\u{466}", "\u{468}", "\u{46a}", "\u{46c}", "\u{46e}", "\u{470}", "\u{472}", "\u{474}", "\u{476}", "\u{478}", "\u{47a}", "\u{47c}", "\u{47e}", "\u{480}", "\u{48a}", "\u{48c}", "\u{48e}", "\u{490}", "\u{492}", "\u{494}", "\u{496}", "\u{498}", "\u{49a}", "\u{49c}", "\u{49e}", "\u{4a0}", "\u{4a2}", "\u{4a4}", "\u{4a6}", "\u{4a8}", "\u{4aa}", "\u{4ac}", "\u{4ae}", "\u{4b0}", "\u{4b2}", "\u{4b4}", "\u{4b6}", "\u{4b8}", "\u{4ba}", "\u{4bc}", "\u{4be}", "\u{4c0}", "\u{4c3}", "\u{4c5}", "\u{4c7}", "\u{4c9}", "\u{4cb}", "\u{4cd}", "\u{4d0}", "\u{4d2}", "\u{4d4}", "\u{4d6}", "\u{4d8}", "\u{4da}", "\u{4dc}", "\u{4de}", "\u{4e0}", "\u{4e2}", "\u{4e4}", "\u{4e6}", "\u{4e8}", "\u{4ea}", "\u{4ec}", "\u{4ee}", "\u{4f0}", "\u{4f2}", "\u{4f4}", "\u{4f6}", "\u{4f8}", "\u{4fa}", "\u{4fc}", "\u{4fe}", "\u{500}", "\u{502}", "\u{504}", "\u{506}", "\u{508}", "\u{50a}", "\u{50c}", "\u{50e}", "\u{510}", "\u{512}", "\u{514}", "\u{516}", "\u{518}", "\u{51a}", "\u{51c}", "\u{51e}", "\u{520}", "\u{522}", "\u{524}", "\u{526}", "\u{528}", "\u{52a}", "\u{52c}", "\u{52e}", "\u{531}", "\u{587}", "\u{61c}", "\u{675}", "\u{958}", "\u{9dc}", "\u{9df}", "\u{a33}", "\u{a36}", "\u{a59}", "\u{a5e}", "\u{b5c}", "\u{e33}", "\u{eb3}", "\u{edc}", "\u{f0c}", "\u{f43}", "\u{f4d}", "\u{f52}", "\u{f57}", "\u{f5c}", "\u{f69}", "\u{f73}", "\u{f75}", "\u{f81}", "\u{f93}", "\u{f9d}", "\u{fa2}", "\u{fa7}", "\u{fac}", "\u{fb9}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{10fc}", "\u{115f}", "\u{13f8}", "\u{17b4}", "\u{180b}", "\u{180e}", "\u{180f}", "\u{1c80}", "\u{1c90}", "\u{1cbd}", "\u{1d2c}", "\u{1d30}", "\u{1d3c}", "\u{1d4f}", "\u{1d78}", "\u{1d9b}", "\u{1e00}", "\u{1e02}", "\u{1e04}", "\u{1e06}", "\u{1e08}", "\u{1e0a}", "\u{1e0c}", "\u{1e0e}", "\u{1e10}", "\u{1e12}", "\u{1e14}", "\u{1e16}", "\u{1e18}", "\u{1e1a}", "\u{1e1c}", "\u{1e1e}", "\u{1e20}", "\u{1e22}", "\u{1e24}", "\u{1e26}", "\u{1e28}", "\u{1e2a}", "\u{1e2c}", "\u{1e2e}", "\u{1e30}", "\u{1e32}", "\u{1e34}", "\u{1e36}", "\u{1e38}", "\u{1e3a}", "\u{1e3c}", "\u{1e3e}", "\u{1e40}", "\u{1e42}", "\u{1e44}", "\u{1e46}", "\u{1e48}", "\u{1e4a}", "\u{1e4c}", "\u{1e4e}", "\u{1e50}", "\u{1e52}", "\u{1e54}", "\u{1e56}", "\u{1e58}", "\u{1e5a}", "\u{1e5c}", "\u{1e5e}", "\u{1e60}", "\u{1e62}", "\u{1e64}", "\u{1e66}", "\u{1e68}", "\u{1e6a}", "\u{1e6c}", "\u{1e6e}", "\u{1e70}", "\u{1e72}", "\u{1e74}", "\u{1e76}", "\u{1e78}", "\u{1e7a}", "\u{1e7c}", "\u{1e7e}", "\u{1e80}", "\u{1e82}", "\u{1e84}", "\u{1e86}", "\u{1e88}", "\u{1e8a}", "\u{1e8c}", "\u{1e8e}", "\u{1e90}", "\u{1e92}", "\u{1e94}", "\u{1e9a}", "\u{1e9e}", "\u{1ea0}", "\u{1ea2}", "\u{1ea4}", "\u{1ea6}", "\u{1ea8}", "\u{1eaa}", "\u{1eac}", "\u{1eae}", "\u{1eb0}", "\u{1eb2}", "\u{1eb4}", "\u{1eb6}", "\u{1eb8}", "\u{1eba}", "\u{1ebc}", "\u{1ebe}", "\u{1ec0}", "\u{1ec2}", "\u{1ec4}", "\u{1ec6}", "\u{1ec8}", "\u{1eca}", "\u{1ecc}", "\u{1ece}", "\u{1ed0}", "\u{1ed2}", "\u{1ed4}", "\u{1ed6}", "\u{1ed8}", "\u{1eda}", "\u{1edc}", "\u{1ede}", "\u{1ee0}", "\u{1ee2}", "\u{1ee4}", "\u{1ee6}", "\u{1ee8}", "\u{1eea}", "\u{1eec}", "\u{1eee}", "\u{1ef0}", "\u{1ef2}", "\u{1ef4}", "\u{1ef6}", "\u{1ef8}", "\u{1efa}", "\u{1efc}", "\u{1efe}", "\u{1f08}", "\u{1f18}", "\u{1f28}", "\u{1f38}", "\u{1f48}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f68}", "\u{1f71}", "\u{1f73}", "\u{1f75}", "\u{1f77}", "\u{1f79}", "\u{1f7b}", "\u{1f7d}", "\u{1f80}", "\u{1fb2}", "\u{1fb7}", "\u{1fbd}", "\u{1fbe}", "\u{1fbf}", "\u{1fc2}", "\u{1fc7}", "\u{1fcd}", "\u{1fd3}", "\u{1fd8}", "\u{1fdd}", "\u{1fe3}", "\u{1fe8}", "\u{1fed}", "\u{1ff2}", "\u{1ff7}", "\u{1ffd}", "\u{2000}", "\u{200b}", "\u{2011}", "\u{2017}", "\u{2024}", "\u{202a}", "\u{202f}", "\u{2033}", "\u{2036}", "\u{203c}", "\u{203e}", "\u{2047}", "\u{2057}", "\u{205f}", "\u{2060}", "\u{2065}", "\u{2066}", "\u{2070}", "\u{2071}", "\u{2074}", "\u{207a}", "\u{207d}", "\u{207e}", "\u{207f}", "\u{2080}", "\u{208a}", "\u{208d}", "\u{208e}", "\u{2090}", "\u{20a8}", "\u{2100}", "\u{2102}", "\u{2103}", "\u{2105}", "\u{2107}", "\u{2109}", "\u{210a}", "\u{2115}", "\u{2116}", "\u{2119}", "\u{2120}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{212f}", "\u{2135}", "\u{2139}", "\u{213b}", "\u{213c}", "\u{2140}", "\u{2145}", "\u{2150}", "\u{2160}", "\u{2183}", "\u{2189}", "\u{222c}", "\u{222f}", "\u{2329}", "\u{232a}", "\u{2460}", "\u{249c}", "\u{24ea}", "\u{2a0c}", "\u{2a74}", "\u{2adc}", "\u{2c00}", "\u{2c60}", "\u{2c62}", "\u{2c67}", "\u{2c69}", "\u{2c6b}", "\u{2c6d}", "\u{2c72}", "\u{2c75}", "\u{2c7c}", "\u{2c7e}", "\u{2c82}", "\u{2c84}", "\u{2c86}", "\u{2c88}", "\u{2c8a}", "\u{2c8c}", "\u{2c8e}", "\u{2c90}", "\u{2c92}", "\u{2c94}", "\u{2c96}", "\u{2c98}", "\u{2c9a}", "\u{2c9c}", "\u{2c9e}", "\u{2ca0}", "\u{2ca2}", "\u{2ca4}", "\u{2ca6}", "\u{2ca8}", "\u{2caa}", "\u{2cac}", "\u{2cae}", "\u{2cb0}", "\u{2cb2}", "\u{2cb4}", "\u{2cb6}", "\u{2cb8}", "\u{2cba}", "\u{2cbc}", "\u{2cbe}", "\u{2cc0}", "\u{2cc2}", "\u{2cc4}", "\u{2cc6}", "\u{2cc8}", "\u{2cca}", "\u{2ccc}", "\u{2cce}", "\u{2cd0}", "\u{2cd2}", "\u{2cd4}", "\u{2cd6}", "\u{2cd8}", "\u{2cda}", "\u{2cdc}", "\u{2cde}", "\u{2ce0}", "\u{2ce2}", "\u{2ceb}", "\u{2ced}", "\u{2cf2}", "\u{2d6f}", "\u{2e9f}", "\u{2ef3}", "\u{2f00}", "\u{3000}", "\u{3036}", "\u{3038}", "\u{309b}", "\u{309f}", "\u{30ff}", "\u{3131}", "\u{3192}", "\u{3196}", "\u{3200}", "\u{3220}", "\u{322a}", "\u{3250}", "\u{3251}", "\u{3260}", "\u{3280}", "\u{328a}", "\u{32b1}", "\u{32c0}", "\u{a640}", "\u{a642}", "\u{a644}", "\u{a646}", "\u{a648}", "\u{a64a}", "\u{a64c}", "\u{a64e}", "\u{a650}", "\u{a652}", "\u{a654}", "\u{a656}", "\u{a658}", "\u{a65a}", "\u{a65c}", "\u{a65e}", "\u{a660}", "\u{a662}", "\u{a664}", "\u{a666}", "\u{a668}", "\u{a66a}", "\u{a66c}", "\u{a680}", "\u{a682}", "\u{a684}", "\u{a686}", "\u{a688}", "\u{a68a}", "\u{a68c}", "\u{a68e}", "\u{a690}", "\u{a692}", "\u{a694}", "\u{a696}", "\u{a698}", "\u{a69a}", "\u{a69c}", "\u{a722}", "\u{a724}", "\u{a726}", "\u{a728}", "\u{a72a}", "\u{a72c}", "\u{a72e}", "\u{a732}", "\u{a734}", "\u{a736}", "\u{a738}", "\u{a73a}", "\u{a73c}", "\u{a73e}", "\u{a740}", "\u{a742}", "\u{a744}", "\u{a746}", "\u{a748}", "\u{a74a}", "\u{a74c}", "\u{a74e}", "\u{a750}", "\u{a752}", "\u{a754}", "\u{a756}", "\u{a758}", "\u{a75a}", "\u{a75c}", "\u{a75e}", "\u{a760}", "\u{a762}", "\u{a764}", "\u{a766}", "\u{a768}", "\u{a76a}", "\u{a76c}", "\u{a76e}", "\u{a770}", "\u{a779}", "\u{a77b}", "\u{a77d}", "\u{a780}", "\u{a782}", "\u{a784}", "\u{a786}", "\u{a78b}", "\u{a78d}", "\u{a790}", "\u{a792}", "\u{a796}", "\u{a798}", "\u{a79a}", "\u{a79c}", "\u{a79e}", "\u{a7a0}", "\u{a7a2}", "\u{a7a4}", "\u{a7a6}", "\u{a7a8}", "\u{a7aa}", "\u{a7b0}", "\u{a7b6}", "\u{a7b8}", "\u{a7ba}", "\u{a7bc}", "\u{a7be}", "\u{a7c0}", "\u{a7c2}", "\u{a7c4}", "\u{a7c9}", "\u{a7d0}", "\u{a7d6}", "\u{a7d8}", "\u{a7f2}", "\u{a7f5}", "\u{a7f8}", "\u{ab5c}", "\u{ab69}", "\u{ab70}", "\u{f900}", "\u{fa10}", "\u{fa12}", "\u{fa15}", "\u{fa20}", "\u{fa22}", "\u{fa25}", "\u{fa2a}", "\u{fa70}", "\u{fb00}", "\u{fb13}", "\u{fb1d}", "\u{fb1f}", "\u{fb29}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fdfc}", "\u{fe00}", "\u{fe10}", "\u{fe17}", "\u{fe18}", "\u{fe19}", "\u{fe30}", "\u{fe31}", "\u{fe33}", "\u{fe35}", "\u{fe36}", "\u{fe37}", "\u{fe38}", "\u{fe39}", "\u{fe3a}", "\u{fe3b}", "\u{fe3c}", "\u{fe3d}", "\u{fe3e}", "\u{fe3f}", "\u{fe40}", "\u{fe41}", "\u{fe42}", "\u{fe43}", "\u{fe44}", "\u{fe47}", "\u{fe48}", "\u{fe49}", "\u{fe4d}", "\u{fe50}", "\u{fe54}", "\u{fe58}", "\u{fe59}", "\u{fe5a}", "\u{fe5b}", "\u{fe5c}", "\u{fe5d}", "\u{fe5e}", "\u{fe5f}", "\u{fe62}", "\u{fe63}", "\u{fe64}", "\u{fe68}", "\u{fe69}", "\u{fe6a}", "\u{fe70}", "\u{fe74}", "\u{fe76}", "\u{feff}", "\u{ff01}", "\u{ff04}", "\u{ff05}", "\u{ff08}", "\u{ff09}", "\u{ff0a}", "\u{ff0b}", "\u{ff0c}", "\u{ff0d}", "\u{ff0e}", "\u{ff10}", "\u{ff1a}", "\u{ff1c}", "\u{ff1f}", "\u{ff21}", "\u{ff3b}", "\u{ff3c}", "\u{ff3d}", "\u{ff3e}", "\u{ff3f}", "\u{ff40}", "\u{ff41}", "\u{ff5b}", "\u{ff5c}", "\u{ff5d}", "\u{ff5e}", "\u{ff5f}", "\u{ff60}", "\u{ff61}", "\u{ff62}", "\u{ff63}", "\u{ff64}", "\u{ff66}", "\u{ff70}", "\u{ff71}", "\u{ff9e}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{ffe0}", "\u{ffe2}", "\u{ffe3}", "\u{ffe4}", "\u{ffe5}", "\u{ffe8}", "\u{ffe9}", "\u{ffed}", "\u{fff0}", "\u{10400}", "\u{104b0}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10781}", "\u{10787}", "\u{107b2}", "\u{10c80}", "\u{118a0}", "\u{16e40}", "\u{1bca0}", "\u{1d15e}", "\u{1d173}", "\u{1d1bb}", "\u{1d400}", "\u{1d456}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d51e}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d552}", "\u{1d6a8}", "\u{1d6c1}", "\u{1d6c2}", "\u{1d6db}", "\u{1d6dc}", "\u{1d6fb}", "\u{1d6fc}", "\u{1d715}", "\u{1d716}", "\u{1d735}", "\u{1d736}", "\u{1d74f}", "\u{1d750}", "\u{1d76f}", "\u{1d770}", "\u{1d789}", "\u{1d78a}", "\u{1d7a9}", "\u{1d7aa}", "\u{1d7c3}", "\u{1d7c4}", "\u{1d7ce}", "\u{1e030}", "\u{1e900}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{1f100}", "\u{1f110}", "\u{1f130}", "\u{1f16a}", "\u{1f190}", "\u{1f200}", "\u{1f210}", "\u{1f240}", "\u{1f250}", "\u{1fbf0}", "\u{2f800}", "\u{e0000}", "\u{e0001}", "\u{e0002}", "\u{e0020}", "\u{e0080}", "\u{e0100}", "\u{e01f0}", ]; const REGEXES: [&str; 2] = ["^\\p{Changes_When_NFKC_Casefolded}+$", "^\\p{CWKCF}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_binary_bidimirrored() { test_with_configs(unicode_escape_property_binary_bidimirrored_tc) } fn unicode_escape_property_binary_bidimirrored_tc(tc: TestConfig) { const CODE_POINTS: [&str; 224] = [ "\u{28}", "\u{29}", "\u{3c}", "\u{3e}", "\u{5b}", "\u{5d}", "\u{7b}", "\u{7d}", "\u{ab}", "\u{bb}", "\u{f3a}", "\u{f3b}", "\u{f3c}", "\u{f3d}", "\u{169b}", "\u{169c}", "\u{2039}", "\u{203a}", "\u{2045}", "\u{2046}", "\u{207d}", "\u{207e}", "\u{208d}", "\u{208e}", "\u{2140}", "\u{2201}", "\u{2208}", "\u{2211}", "\u{2215}", "\u{221a}", "\u{221f}", "\u{2224}", "\u{2226}", "\u{222b}", "\u{2239}", "\u{223b}", "\u{2252}", "\u{225f}", "\u{2262}", "\u{2264}", "\u{226e}", "\u{228f}", "\u{2298}", "\u{22a2}", "\u{22a6}", "\u{22be}", "\u{22c9}", "\u{22d0}", "\u{22d6}", "\u{22f0}", "\u{2308}", "\u{2309}", "\u{230a}", "\u{230b}", "\u{2320}", "\u{2329}", "\u{232a}", "\u{2768}", "\u{2769}", "\u{276a}", "\u{276b}", "\u{276c}", "\u{276d}", "\u{276e}", "\u{276f}", "\u{2770}", "\u{2771}", "\u{2772}", "\u{2773}", "\u{2774}", "\u{2775}", "\u{27c0}", "\u{27c3}", "\u{27c5}", "\u{27c6}", "\u{27c8}", "\u{27cb}", "\u{27d3}", "\u{27dc}", "\u{27e2}", "\u{27e6}", "\u{27e7}", "\u{27e8}", "\u{27e9}", "\u{27ea}", "\u{27eb}", "\u{27ec}", "\u{27ed}", "\u{27ee}", "\u{27ef}", "\u{2983}", "\u{2984}", "\u{2985}", "\u{2986}", "\u{2987}", "\u{2988}", "\u{2989}", "\u{298a}", "\u{298b}", "\u{298c}", "\u{298d}", "\u{298e}", "\u{298f}", "\u{2990}", "\u{2991}", "\u{2992}", "\u{2993}", "\u{2994}", "\u{2995}", "\u{2996}", "\u{2997}", "\u{2998}", "\u{299b}", "\u{29a2}", "\u{29b8}", "\u{29c0}", "\u{29c9}", "\u{29ce}", "\u{29d4}", "\u{29d8}", "\u{29d9}", "\u{29da}", "\u{29db}", "\u{29dc}", "\u{29e1}", "\u{29e3}", "\u{29e8}", "\u{29f4}", "\u{29fc}", "\u{29fd}", "\u{2a0a}", "\u{2a1e}", "\u{2a24}", "\u{2a26}", "\u{2a29}", "\u{2a2b}", "\u{2a34}", "\u{2a3c}", "\u{2a57}", "\u{2a64}", "\u{2a6a}", "\u{2a6f}", "\u{2a73}", "\u{2a79}", "\u{2aa6}", "\u{2aaf}", "\u{2adc}", "\u{2ade}", "\u{2ae2}", "\u{2aec}", "\u{2af3}", "\u{2af7}", "\u{2afd}", "\u{2bfe}", "\u{2e02}", "\u{2e03}", "\u{2e04}", "\u{2e05}", "\u{2e09}", "\u{2e0a}", "\u{2e0c}", "\u{2e0d}", "\u{2e1c}", "\u{2e1d}", "\u{2e20}", "\u{2e21}", "\u{2e22}", "\u{2e23}", "\u{2e24}", "\u{2e25}", "\u{2e26}", "\u{2e27}", "\u{2e28}", "\u{2e29}", "\u{2e55}", "\u{2e56}", "\u{2e57}", "\u{2e58}", "\u{2e59}", "\u{2e5a}", "\u{2e5b}", "\u{2e5c}", "\u{3008}", "\u{3009}", "\u{300a}", "\u{300b}", "\u{300c}", "\u{300d}", "\u{300e}", "\u{300f}", "\u{3010}", "\u{3011}", "\u{3014}", "\u{3015}", "\u{3016}", "\u{3017}", "\u{3018}", "\u{3019}", "\u{301a}", "\u{301b}", "\u{fe59}", "\u{fe5a}", "\u{fe5b}", "\u{fe5c}", "\u{fe5d}", "\u{fe5e}", "\u{fe64}", "\u{ff08}", "\u{ff09}", "\u{ff1c}", "\u{ff1e}", "\u{ff3b}", "\u{ff3d}", "\u{ff5b}", "\u{ff5d}", "\u{ff5f}", "\u{ff60}", "\u{ff62}", "\u{ff63}", "\u{1d6db}", "\u{1d715}", "\u{1d74f}", "\u{1d789}", "\u{1d7c3}", ]; const REGEXES: [&str; 2] = ["^\\p{Bidi_Mirrored}+$", "^\\p{Bidi_M}+$"]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_closepunctuation() { test_with_configs(unicode_escape_property_gc_closepunctuation_tc) } fn unicode_escape_property_gc_closepunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 76] = [ "\u{29}", "\u{5d}", "\u{7d}", "\u{f3b}", "\u{f3d}", "\u{169c}", "\u{2046}", "\u{207e}", "\u{208e}", "\u{2309}", "\u{230b}", "\u{232a}", "\u{2769}", "\u{276b}", "\u{276d}", "\u{276f}", "\u{2771}", "\u{2773}", "\u{2775}", "\u{27c6}", "\u{27e7}", "\u{27e9}", "\u{27eb}", "\u{27ed}", "\u{27ef}", "\u{2984}", "\u{2986}", "\u{2988}", "\u{298a}", "\u{298c}", "\u{298e}", "\u{2990}", "\u{2992}", "\u{2994}", "\u{2996}", "\u{2998}", "\u{29d9}", "\u{29db}", "\u{29fd}", "\u{2e23}", "\u{2e25}", "\u{2e27}", "\u{2e29}", "\u{2e56}", "\u{2e58}", "\u{2e5a}", "\u{2e5c}", "\u{3009}", "\u{300b}", "\u{300d}", "\u{300f}", "\u{3011}", "\u{3015}", "\u{3017}", "\u{3019}", "\u{301b}", "\u{301e}", "\u{fd3e}", "\u{fe18}", "\u{fe36}", "\u{fe38}", "\u{fe3a}", "\u{fe3c}", "\u{fe3e}", "\u{fe40}", "\u{fe42}", "\u{fe44}", "\u{fe48}", "\u{fe5a}", "\u{fe5c}", "\u{fe5e}", "\u{ff09}", "\u{ff3d}", "\u{ff5d}", "\u{ff60}", "\u{ff63}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Close_Punctuation}+$", "^\\p{gc=Close_Punctuation}+$", "^\\p{Close_Punctuation}+$", "^\\p{General_Category=Pe}+$", "^\\p{gc=Pe}+$", "^\\p{Pe}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_connectorpunctuation() { test_with_configs(unicode_escape_property_gc_connectorpunctuation_tc) } fn unicode_escape_property_gc_connectorpunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 6] = [ "\u{5f}", "\u{203f}", "\u{2054}", "\u{fe33}", "\u{fe4d}", "\u{ff3f}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Connector_Punctuation}+$", "^\\p{gc=Connector_Punctuation}+$", "^\\p{Connector_Punctuation}+$", "^\\p{General_Category=Pc}+$", "^\\p{gc=Pc}+$", "^\\p{Pc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_control() { test_with_configs(unicode_escape_property_gc_control_tc) } fn unicode_escape_property_gc_control_tc(tc: TestConfig) { const CODE_POINTS: [&str; 2] = ["\u{0}", "\u{7f}"]; const REGEXES: [&str; 9] = [ "^\\p{General_Category=Control}+$", "^\\p{gc=Control}+$", "^\\p{Control}+$", "^\\p{General_Category=cntrl}+$", "^\\p{gc=cntrl}+$", "^\\p{cntrl}+$", "^\\p{General_Category=Cc}+$", "^\\p{gc=Cc}+$", "^\\p{Cc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_currencysymbol() { test_with_configs(unicode_escape_property_gc_currencysymbol_tc) } fn unicode_escape_property_gc_currencysymbol_tc(tc: TestConfig) { const CODE_POINTS: [&str; 21] = [ "\u{24}", "\u{a2}", "\u{58f}", "\u{60b}", "\u{7fe}", "\u{9f2}", "\u{9fb}", "\u{af1}", "\u{bf9}", "\u{e3f}", "\u{17db}", "\u{20a0}", "\u{a838}", "\u{fdfc}", "\u{fe69}", "\u{ff04}", "\u{ffe0}", "\u{ffe5}", "\u{11fdd}", "\u{1e2ff}", "\u{1ecb0}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Currency_Symbol}+$", "^\\p{gc=Currency_Symbol}+$", "^\\p{Currency_Symbol}+$", "^\\p{General_Category=Sc}+$", "^\\p{gc=Sc}+$", "^\\p{Sc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_dashpunctuation() { test_with_configs(unicode_escape_property_gc_dashpunctuation_tc) } fn unicode_escape_property_gc_dashpunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 19] = [ "\u{2d}", "\u{58a}", "\u{5be}", "\u{1400}", "\u{1806}", "\u{2010}", "\u{2e17}", "\u{2e1a}", "\u{2e3a}", "\u{2e40}", "\u{2e5d}", "\u{301c}", "\u{3030}", "\u{30a0}", "\u{fe31}", "\u{fe58}", "\u{fe63}", "\u{ff0d}", "\u{10ead}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Dash_Punctuation}+$", "^\\p{gc=Dash_Punctuation}+$", "^\\p{Dash_Punctuation}+$", "^\\p{General_Category=Pd}+$", "^\\p{gc=Pd}+$", "^\\p{Pd}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_decimalnumber() { test_with_configs(unicode_escape_property_gc_decimalnumber_tc) } fn unicode_escape_property_gc_decimalnumber_tc(tc: TestConfig) { const CODE_POINTS: [&str; 64] = [ "\u{30}", "\u{660}", "\u{6f0}", "\u{7c0}", "\u{966}", "\u{9e6}", "\u{a66}", "\u{ae6}", "\u{b66}", "\u{be6}", "\u{c66}", "\u{ce6}", "\u{d66}", "\u{de6}", "\u{e50}", "\u{ed0}", "\u{f20}", "\u{1040}", "\u{1090}", "\u{17e0}", "\u{1810}", "\u{1946}", "\u{19d0}", "\u{1a80}", "\u{1a90}", "\u{1b50}", "\u{1bb0}", "\u{1c40}", "\u{1c50}", "\u{a620}", "\u{a8d0}", "\u{a900}", "\u{a9d0}", "\u{a9f0}", "\u{aa50}", "\u{abf0}", "\u{ff10}", "\u{104a0}", "\u{10d30}", "\u{11066}", "\u{110f0}", "\u{11136}", "\u{111d0}", "\u{112f0}", "\u{11450}", "\u{114d0}", "\u{11650}", "\u{116c0}", "\u{11730}", "\u{118e0}", "\u{11950}", "\u{11c50}", "\u{11d50}", "\u{11da0}", "\u{11f50}", "\u{16a60}", "\u{16ac0}", "\u{16b50}", "\u{1d7ce}", "\u{1e140}", "\u{1e2f0}", "\u{1e4f0}", "\u{1e950}", "\u{1fbf0}", ]; const REGEXES: [&str; 9] = [ "^\\p{General_Category=Decimal_Number}+$", "^\\p{gc=Decimal_Number}+$", "^\\p{Decimal_Number}+$", "^\\p{General_Category=digit}+$", "^\\p{gc=digit}+$", "^\\p{digit}+$", "^\\p{General_Category=Nd}+$", "^\\p{gc=Nd}+$", "^\\p{Nd}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_enclosingmark() { test_with_configs(unicode_escape_property_gc_enclosingmark_tc) } fn unicode_escape_property_gc_enclosingmark_tc(tc: TestConfig) { const CODE_POINTS: [&str; 5] = ["\u{488}", "\u{1abe}", "\u{20dd}", "\u{20e2}", "\u{a670}"]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Enclosing_Mark}+$", "^\\p{gc=Enclosing_Mark}+$", "^\\p{Enclosing_Mark}+$", "^\\p{General_Category=Me}+$", "^\\p{gc=Me}+$", "^\\p{Me}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_finalpunctuation() { test_with_configs(unicode_escape_property_gc_finalpunctuation_tc) } fn unicode_escape_property_gc_finalpunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 10] = [ "\u{bb}", "\u{2019}", "\u{201d}", "\u{203a}", "\u{2e03}", "\u{2e05}", "\u{2e0a}", "\u{2e0d}", "\u{2e1d}", "\u{2e21}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Final_Punctuation}+$", "^\\p{gc=Final_Punctuation}+$", "^\\p{Final_Punctuation}+$", "^\\p{General_Category=Pf}+$", "^\\p{gc=Pf}+$", "^\\p{Pf}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_format() { test_with_configs(unicode_escape_property_gc_format_tc) } fn unicode_escape_property_gc_format_tc(tc: TestConfig) { const CODE_POINTS: [&str; 21] = [ "\u{ad}", "\u{600}", "\u{61c}", "\u{6dd}", "\u{70f}", "\u{890}", "\u{8e2}", "\u{180e}", "\u{200b}", "\u{202a}", "\u{2060}", "\u{2066}", "\u{feff}", "\u{fff9}", "\u{110bd}", "\u{110cd}", "\u{13430}", "\u{1bca0}", "\u{1d173}", "\u{e0001}", "\u{e0020}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Format}+$", "^\\p{gc=Format}+$", "^\\p{Format}+$", "^\\p{General_Category=Cf}+$", "^\\p{gc=Cf}+$", "^\\p{Cf}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_initialpunctuation() { test_with_configs(unicode_escape_property_gc_initialpunctuation_tc) } fn unicode_escape_property_gc_initialpunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 11] = [ "\u{ab}", "\u{2018}", "\u{201b}", "\u{201f}", "\u{2039}", "\u{2e02}", "\u{2e04}", "\u{2e09}", "\u{2e0c}", "\u{2e1c}", "\u{2e20}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Initial_Punctuation}+$", "^\\p{gc=Initial_Punctuation}+$", "^\\p{Initial_Punctuation}+$", "^\\p{General_Category=Pi}+$", "^\\p{gc=Pi}+$", "^\\p{Pi}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_letternumber() { test_with_configs(unicode_escape_property_gc_letternumber_tc) } fn unicode_escape_property_gc_letternumber_tc(tc: TestConfig) { const CODE_POINTS: [&str; 12] = [ "\u{16ee}", "\u{2160}", "\u{2185}", "\u{3007}", "\u{3021}", "\u{3038}", "\u{a6e6}", "\u{10140}", "\u{10341}", "\u{1034a}", "\u{103d1}", "\u{12400}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Letter_Number}+$", "^\\p{gc=Letter_Number}+$", "^\\p{Letter_Number}+$", "^\\p{General_Category=Nl}+$", "^\\p{gc=Nl}+$", "^\\p{Nl}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_lineseparator() { test_with_configs(unicode_escape_property_gc_lineseparator_tc) } fn unicode_escape_property_gc_lineseparator_tc(tc: TestConfig) { const CODE_POINTS: [&str; 1] = ["\u{2028}"]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Line_Separator}+$", "^\\p{gc=Line_Separator}+$", "^\\p{Line_Separator}+$", "^\\p{General_Category=Zl}+$", "^\\p{gc=Zl}+$", "^\\p{Zl}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_lowercaseletter() { test_with_configs(unicode_escape_property_gc_lowercaseletter_tc) } fn unicode_escape_property_gc_lowercaseletter_tc(tc: TestConfig) { const CODE_POINTS: [&str; 658] = [ "\u{61}", "\u{b5}", "\u{df}", "\u{f8}", "\u{101}", "\u{103}", "\u{105}", "\u{107}", "\u{109}", "\u{10b}", "\u{10d}", "\u{10f}", "\u{111}", "\u{113}", "\u{115}", "\u{117}", "\u{119}", "\u{11b}", "\u{11d}", "\u{11f}", "\u{121}", "\u{123}", "\u{125}", "\u{127}", "\u{129}", "\u{12b}", "\u{12d}", "\u{12f}", "\u{131}", "\u{133}", "\u{135}", "\u{137}", "\u{13a}", "\u{13c}", "\u{13e}", "\u{140}", "\u{142}", "\u{144}", "\u{146}", "\u{148}", "\u{14b}", "\u{14d}", "\u{14f}", "\u{151}", "\u{153}", "\u{155}", "\u{157}", "\u{159}", "\u{15b}", "\u{15d}", "\u{15f}", "\u{161}", "\u{163}", "\u{165}", "\u{167}", "\u{169}", "\u{16b}", "\u{16d}", "\u{16f}", "\u{171}", "\u{173}", "\u{175}", "\u{177}", "\u{17a}", "\u{17c}", "\u{17e}", "\u{183}", "\u{185}", "\u{188}", "\u{18c}", "\u{192}", "\u{195}", "\u{199}", "\u{19e}", "\u{1a1}", "\u{1a3}", "\u{1a5}", "\u{1a8}", "\u{1aa}", "\u{1ad}", "\u{1b0}", "\u{1b4}", "\u{1b6}", "\u{1b9}", "\u{1bd}", "\u{1c6}", "\u{1c9}", "\u{1cc}", "\u{1ce}", "\u{1d0}", "\u{1d2}", "\u{1d4}", "\u{1d6}", "\u{1d8}", "\u{1da}", "\u{1dc}", "\u{1df}", "\u{1e1}", "\u{1e3}", "\u{1e5}", "\u{1e7}", "\u{1e9}", "\u{1eb}", "\u{1ed}", "\u{1ef}", "\u{1f3}", "\u{1f5}", "\u{1f9}", "\u{1fb}", "\u{1fd}", "\u{1ff}", "\u{201}", "\u{203}", "\u{205}", "\u{207}", "\u{209}", "\u{20b}", "\u{20d}", "\u{20f}", "\u{211}", "\u{213}", "\u{215}", "\u{217}", "\u{219}", "\u{21b}", "\u{21d}", "\u{21f}", "\u{221}", "\u{223}", "\u{225}", "\u{227}", "\u{229}", "\u{22b}", "\u{22d}", "\u{22f}", "\u{231}", "\u{233}", "\u{23c}", "\u{23f}", "\u{242}", "\u{247}", "\u{249}", "\u{24b}", "\u{24d}", "\u{24f}", "\u{295}", "\u{371}", "\u{373}", "\u{377}", "\u{37b}", "\u{390}", "\u{3ac}", "\u{3d0}", "\u{3d5}", "\u{3d9}", "\u{3db}", "\u{3dd}", "\u{3df}", "\u{3e1}", "\u{3e3}", "\u{3e5}", "\u{3e7}", "\u{3e9}", "\u{3eb}", "\u{3ed}", "\u{3ef}", "\u{3f5}", "\u{3f8}", "\u{3fb}", "\u{430}", "\u{461}", "\u{463}", "\u{465}", "\u{467}", "\u{469}", "\u{46b}", "\u{46d}", "\u{46f}", "\u{471}", "\u{473}", "\u{475}", "\u{477}", "\u{479}", "\u{47b}", "\u{47d}", "\u{47f}", "\u{481}", "\u{48b}", "\u{48d}", "\u{48f}", "\u{491}", "\u{493}", "\u{495}", "\u{497}", "\u{499}", "\u{49b}", "\u{49d}", "\u{49f}", "\u{4a1}", "\u{4a3}", "\u{4a5}", "\u{4a7}", "\u{4a9}", "\u{4ab}", "\u{4ad}", "\u{4af}", "\u{4b1}", "\u{4b3}", "\u{4b5}", "\u{4b7}", "\u{4b9}", "\u{4bb}", "\u{4bd}", "\u{4bf}", "\u{4c2}", "\u{4c4}", "\u{4c6}", "\u{4c8}", "\u{4ca}", "\u{4cc}", "\u{4ce}", "\u{4d1}", "\u{4d3}", "\u{4d5}", "\u{4d7}", "\u{4d9}", "\u{4db}", "\u{4dd}", "\u{4df}", "\u{4e1}", "\u{4e3}", "\u{4e5}", "\u{4e7}", "\u{4e9}", "\u{4eb}", "\u{4ed}", "\u{4ef}", "\u{4f1}", "\u{4f3}", "\u{4f5}", "\u{4f7}", "\u{4f9}", "\u{4fb}", "\u{4fd}", "\u{4ff}", "\u{501}", "\u{503}", "\u{505}", "\u{507}", "\u{509}", "\u{50b}", "\u{50d}", "\u{50f}", "\u{511}", "\u{513}", "\u{515}", "\u{517}", "\u{519}", "\u{51b}", "\u{51d}", "\u{51f}", "\u{521}", "\u{523}", "\u{525}", "\u{527}", "\u{529}", "\u{52b}", "\u{52d}", "\u{52f}", "\u{560}", "\u{10d0}", "\u{10fd}", "\u{13f8}", "\u{1c80}", "\u{1d00}", "\u{1d6b}", "\u{1d79}", "\u{1e01}", "\u{1e03}", "\u{1e05}", "\u{1e07}", "\u{1e09}", "\u{1e0b}", "\u{1e0d}", "\u{1e0f}", "\u{1e11}", "\u{1e13}", "\u{1e15}", "\u{1e17}", "\u{1e19}", "\u{1e1b}", "\u{1e1d}", "\u{1e1f}", "\u{1e21}", "\u{1e23}", "\u{1e25}", "\u{1e27}", "\u{1e29}", "\u{1e2b}", "\u{1e2d}", "\u{1e2f}", "\u{1e31}", "\u{1e33}", "\u{1e35}", "\u{1e37}", "\u{1e39}", "\u{1e3b}", "\u{1e3d}", "\u{1e3f}", "\u{1e41}", "\u{1e43}", "\u{1e45}", "\u{1e47}", "\u{1e49}", "\u{1e4b}", "\u{1e4d}", "\u{1e4f}", "\u{1e51}", "\u{1e53}", "\u{1e55}", "\u{1e57}", "\u{1e59}", "\u{1e5b}", "\u{1e5d}", "\u{1e5f}", "\u{1e61}", "\u{1e63}", "\u{1e65}", "\u{1e67}", "\u{1e69}", "\u{1e6b}", "\u{1e6d}", "\u{1e6f}", "\u{1e71}", "\u{1e73}", "\u{1e75}", "\u{1e77}", "\u{1e79}", "\u{1e7b}", "\u{1e7d}", "\u{1e7f}", "\u{1e81}", "\u{1e83}", "\u{1e85}", "\u{1e87}", "\u{1e89}", "\u{1e8b}", "\u{1e8d}", "\u{1e8f}", "\u{1e91}", "\u{1e93}", "\u{1e95}", "\u{1e9f}", "\u{1ea1}", "\u{1ea3}", "\u{1ea5}", "\u{1ea7}", "\u{1ea9}", "\u{1eab}", "\u{1ead}", "\u{1eaf}", "\u{1eb1}", "\u{1eb3}", "\u{1eb5}", "\u{1eb7}", "\u{1eb9}", "\u{1ebb}", "\u{1ebd}", "\u{1ebf}", "\u{1ec1}", "\u{1ec3}", "\u{1ec5}", "\u{1ec7}", "\u{1ec9}", "\u{1ecb}", "\u{1ecd}", "\u{1ecf}", "\u{1ed1}", "\u{1ed3}", "\u{1ed5}", "\u{1ed7}", "\u{1ed9}", "\u{1edb}", "\u{1edd}", "\u{1edf}", "\u{1ee1}", "\u{1ee3}", "\u{1ee5}", "\u{1ee7}", "\u{1ee9}", "\u{1eeb}", "\u{1eed}", "\u{1eef}", "\u{1ef1}", "\u{1ef3}", "\u{1ef5}", "\u{1ef7}", "\u{1ef9}", "\u{1efb}", "\u{1efd}", "\u{1eff}", "\u{1f10}", "\u{1f20}", "\u{1f30}", "\u{1f40}", "\u{1f50}", "\u{1f60}", "\u{1f70}", "\u{1f80}", "\u{1f90}", "\u{1fa0}", "\u{1fb0}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{210a}", "\u{210e}", "\u{2113}", "\u{212f}", "\u{2134}", "\u{2139}", "\u{213c}", "\u{2146}", "\u{214e}", "\u{2184}", "\u{2c30}", "\u{2c61}", "\u{2c65}", "\u{2c68}", "\u{2c6a}", "\u{2c6c}", "\u{2c71}", "\u{2c73}", "\u{2c76}", "\u{2c81}", "\u{2c83}", "\u{2c85}", "\u{2c87}", "\u{2c89}", "\u{2c8b}", "\u{2c8d}", "\u{2c8f}", "\u{2c91}", "\u{2c93}", "\u{2c95}", "\u{2c97}", "\u{2c99}", "\u{2c9b}", "\u{2c9d}", "\u{2c9f}", "\u{2ca1}", "\u{2ca3}", "\u{2ca5}", "\u{2ca7}", "\u{2ca9}", "\u{2cab}", "\u{2cad}", "\u{2caf}", "\u{2cb1}", "\u{2cb3}", "\u{2cb5}", "\u{2cb7}", "\u{2cb9}", "\u{2cbb}", "\u{2cbd}", "\u{2cbf}", "\u{2cc1}", "\u{2cc3}", "\u{2cc5}", "\u{2cc7}", "\u{2cc9}", "\u{2ccb}", "\u{2ccd}", "\u{2ccf}", "\u{2cd1}", "\u{2cd3}", "\u{2cd5}", "\u{2cd7}", "\u{2cd9}", "\u{2cdb}", "\u{2cdd}", "\u{2cdf}", "\u{2ce1}", "\u{2ce3}", "\u{2cec}", "\u{2cee}", "\u{2cf3}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a641}", "\u{a643}", "\u{a645}", "\u{a647}", "\u{a649}", "\u{a64b}", "\u{a64d}", "\u{a64f}", "\u{a651}", "\u{a653}", "\u{a655}", "\u{a657}", "\u{a659}", "\u{a65b}", "\u{a65d}", "\u{a65f}", "\u{a661}", "\u{a663}", "\u{a665}", "\u{a667}", "\u{a669}", "\u{a66b}", "\u{a66d}", "\u{a681}", "\u{a683}", "\u{a685}", "\u{a687}", "\u{a689}", "\u{a68b}", "\u{a68d}", "\u{a68f}", "\u{a691}", "\u{a693}", "\u{a695}", "\u{a697}", "\u{a699}", "\u{a69b}", "\u{a723}", "\u{a725}", "\u{a727}", "\u{a729}", "\u{a72b}", "\u{a72d}", "\u{a72f}", "\u{a733}", "\u{a735}", "\u{a737}", "\u{a739}", "\u{a73b}", "\u{a73d}", "\u{a73f}", "\u{a741}", "\u{a743}", "\u{a745}", "\u{a747}", "\u{a749}", "\u{a74b}", "\u{a74d}", "\u{a74f}", "\u{a751}", "\u{a753}", "\u{a755}", "\u{a757}", "\u{a759}", "\u{a75b}", "\u{a75d}", "\u{a75f}", "\u{a761}", "\u{a763}", "\u{a765}", "\u{a767}", "\u{a769}", "\u{a76b}", "\u{a76d}", "\u{a76f}", "\u{a771}", "\u{a77a}", "\u{a77c}", "\u{a77f}", "\u{a781}", "\u{a783}", "\u{a785}", "\u{a787}", "\u{a78c}", "\u{a78e}", "\u{a791}", "\u{a793}", "\u{a797}", "\u{a799}", "\u{a79b}", "\u{a79d}", "\u{a79f}", "\u{a7a1}", "\u{a7a3}", "\u{a7a5}", "\u{a7a7}", "\u{a7a9}", "\u{a7af}", "\u{a7b5}", "\u{a7b7}", "\u{a7b9}", "\u{a7bb}", "\u{a7bd}", "\u{a7bf}", "\u{a7c1}", "\u{a7c3}", "\u{a7c8}", "\u{a7ca}", "\u{a7d1}", "\u{a7d3}", "\u{a7d5}", "\u{a7d7}", "\u{a7d9}", "\u{a7f6}", "\u{a7fa}", "\u{ab30}", "\u{ab60}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff41}", "\u{10428}", "\u{104d8}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10cc0}", "\u{118c0}", "\u{16e60}", "\u{1d41a}", "\u{1d44e}", "\u{1d456}", "\u{1d482}", "\u{1d4b6}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d4ea}", "\u{1d51e}", "\u{1d552}", "\u{1d586}", "\u{1d5ba}", "\u{1d5ee}", "\u{1d622}", "\u{1d656}", "\u{1d68a}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1d7cb}", "\u{1df00}", "\u{1df0b}", "\u{1df25}", "\u{1e922}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Lowercase_Letter}+$", "^\\p{gc=Lowercase_Letter}+$", "^\\p{Lowercase_Letter}+$", "^\\p{General_Category=Ll}+$", "^\\p{gc=Ll}+$", "^\\p{Ll}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_mathsymbol() { test_with_configs(unicode_escape_property_gc_mathsymbol_tc) } fn unicode_escape_property_gc_mathsymbol_tc(tc: TestConfig) { const CODE_POINTS: [&str; 64] = [ "\u{2b}", "\u{3c}", "\u{7c}", "\u{7e}", "\u{ac}", "\u{b1}", "\u{d7}", "\u{f7}", "\u{3f6}", "\u{606}", "\u{2044}", "\u{2052}", "\u{207a}", "\u{208a}", "\u{2118}", "\u{2140}", "\u{214b}", "\u{2190}", "\u{219a}", "\u{21a0}", "\u{21a3}", "\u{21a6}", "\u{21ae}", "\u{21ce}", "\u{21d2}", "\u{21d4}", "\u{21f4}", "\u{2320}", "\u{237c}", "\u{239b}", "\u{23dc}", "\u{25b7}", "\u{25c1}", "\u{25f8}", "\u{266f}", "\u{27c0}", "\u{27c7}", "\u{27f0}", "\u{2900}", "\u{2999}", "\u{29dc}", "\u{29fe}", "\u{2b30}", "\u{2b47}", "\u{fb29}", "\u{fe62}", "\u{fe64}", "\u{ff0b}", "\u{ff1c}", "\u{ff5c}", "\u{ff5e}", "\u{ffe2}", "\u{ffe9}", "\u{1d6c1}", "\u{1d6db}", "\u{1d6fb}", "\u{1d715}", "\u{1d735}", "\u{1d74f}", "\u{1d76f}", "\u{1d789}", "\u{1d7a9}", "\u{1d7c3}", "\u{1eef0}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Math_Symbol}+$", "^\\p{gc=Math_Symbol}+$", "^\\p{Math_Symbol}+$", "^\\p{General_Category=Sm}+$", "^\\p{gc=Sm}+$", "^\\p{Sm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_modifierletter() { test_with_configs(unicode_escape_property_gc_modifierletter_tc) } fn unicode_escape_property_gc_modifierletter_tc(tc: TestConfig) { const CODE_POINTS: [&str; 71] = [ "\u{2b0}", "\u{2c6}", "\u{2e0}", "\u{2ec}", "\u{2ee}", "\u{374}", "\u{37a}", "\u{559}", "\u{640}", "\u{6e5}", "\u{7f4}", "\u{7fa}", "\u{81a}", "\u{824}", "\u{828}", "\u{8c9}", "\u{971}", "\u{e46}", "\u{ec6}", "\u{10fc}", "\u{17d7}", "\u{1843}", "\u{1aa7}", "\u{1c78}", "\u{1d2c}", "\u{1d78}", "\u{1d9b}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{2c7c}", "\u{2d6f}", "\u{2e2f}", "\u{3005}", "\u{3031}", "\u{303b}", "\u{309d}", "\u{30fc}", "\u{a015}", "\u{a4f8}", "\u{a60c}", "\u{a67f}", "\u{a69c}", "\u{a717}", "\u{a770}", "\u{a788}", "\u{a7f2}", "\u{a7f8}", "\u{a9cf}", "\u{a9e6}", "\u{aa70}", "\u{aadd}", "\u{aaf3}", "\u{ab5c}", "\u{ab69}", "\u{ff70}", "\u{ff9e}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{16b40}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1e030}", "\u{1e137}", "\u{1e4eb}", "\u{1e94b}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Modifier_Letter}+$", "^\\p{gc=Modifier_Letter}+$", "^\\p{Modifier_Letter}+$", "^\\p{General_Category=Lm}+$", "^\\p{gc=Lm}+$", "^\\p{Lm}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_modifiersymbol() { test_with_configs(unicode_escape_property_gc_modifiersymbol_tc) } fn unicode_escape_property_gc_modifiersymbol_tc(tc: TestConfig) { const CODE_POINTS: [&str; 31] = [ "\u{5e}", "\u{60}", "\u{a8}", "\u{af}", "\u{b4}", "\u{b8}", "\u{2c2}", "\u{2d2}", "\u{2e5}", "\u{2ed}", "\u{2ef}", "\u{375}", "\u{384}", "\u{888}", "\u{1fbd}", "\u{1fbf}", "\u{1fcd}", "\u{1fdd}", "\u{1fed}", "\u{1ffd}", "\u{309b}", "\u{a700}", "\u{a720}", "\u{a789}", "\u{ab5b}", "\u{ab6a}", "\u{fbb2}", "\u{ff3e}", "\u{ff40}", "\u{ffe3}", "\u{1f3fb}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Modifier_Symbol}+$", "^\\p{gc=Modifier_Symbol}+$", "^\\p{Modifier_Symbol}+$", "^\\p{General_Category=Sk}+$", "^\\p{gc=Sk}+$", "^\\p{Sk}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_nonspacingmark() { test_with_configs(unicode_escape_property_gc_nonspacingmark_tc) } fn unicode_escape_property_gc_nonspacingmark_tc(tc: TestConfig) { const CODE_POINTS: [&str; 346] = [ "\u{300}", "\u{483}", "\u{591}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{5c7}", "\u{610}", "\u{64b}", "\u{670}", "\u{6d6}", "\u{6df}", "\u{6e7}", "\u{6ea}", "\u{711}", "\u{730}", "\u{7a6}", "\u{7eb}", "\u{7fd}", "\u{816}", "\u{81b}", "\u{825}", "\u{829}", "\u{859}", "\u{898}", "\u{8ca}", "\u{8e3}", "\u{93a}", "\u{93c}", "\u{941}", "\u{94d}", "\u{951}", "\u{962}", "\u{981}", "\u{9bc}", "\u{9c1}", "\u{9cd}", "\u{9e2}", "\u{9fe}", "\u{a01}", "\u{a3c}", "\u{a41}", "\u{a47}", "\u{a4b}", "\u{a51}", "\u{a70}", "\u{a75}", "\u{a81}", "\u{abc}", "\u{ac1}", "\u{ac7}", "\u{acd}", "\u{ae2}", "\u{afa}", "\u{b01}", "\u{b3c}", "\u{b3f}", "\u{b41}", "\u{b4d}", "\u{b55}", "\u{b62}", "\u{b82}", "\u{bc0}", "\u{bcd}", "\u{c00}", "\u{c04}", "\u{c3c}", "\u{c3e}", "\u{c46}", "\u{c4a}", "\u{c55}", "\u{c62}", "\u{c81}", "\u{cbc}", "\u{cbf}", "\u{cc6}", "\u{ccc}", "\u{ce2}", "\u{d00}", "\u{d3b}", "\u{d41}", "\u{d4d}", "\u{d62}", "\u{d81}", "\u{dca}", "\u{dd2}", "\u{dd6}", "\u{e31}", "\u{e34}", "\u{e47}", "\u{eb1}", "\u{eb4}", "\u{ec8}", "\u{f18}", "\u{f35}", "\u{f37}", "\u{f39}", "\u{f71}", "\u{f80}", "\u{f86}", "\u{f8d}", "\u{f99}", "\u{fc6}", "\u{102d}", "\u{1032}", "\u{1039}", "\u{103d}", "\u{1058}", "\u{105e}", "\u{1071}", "\u{1082}", "\u{1085}", "\u{108d}", "\u{109d}", "\u{135d}", "\u{1712}", "\u{1732}", "\u{1752}", "\u{1772}", "\u{17b4}", "\u{17b7}", "\u{17c6}", "\u{17c9}", "\u{17dd}", "\u{180b}", "\u{180f}", "\u{1885}", "\u{18a9}", "\u{1920}", "\u{1927}", "\u{1932}", "\u{1939}", "\u{1a17}", "\u{1a1b}", "\u{1a56}", "\u{1a58}", "\u{1a60}", "\u{1a62}", "\u{1a65}", "\u{1a73}", "\u{1a7f}", "\u{1ab0}", "\u{1abf}", "\u{1b00}", "\u{1b34}", "\u{1b36}", "\u{1b3c}", "\u{1b42}", "\u{1b6b}", "\u{1b80}", "\u{1ba2}", "\u{1ba8}", "\u{1bab}", "\u{1be6}", "\u{1be8}", "\u{1bed}", "\u{1bef}", "\u{1c2c}", "\u{1c36}", "\u{1cd0}", "\u{1cd4}", "\u{1ce2}", "\u{1ced}", "\u{1cf4}", "\u{1cf8}", "\u{1dc0}", "\u{20d0}", "\u{20e1}", "\u{20e5}", "\u{2cef}", "\u{2d7f}", "\u{2de0}", "\u{302a}", "\u{3099}", "\u{a66f}", "\u{a674}", "\u{a69e}", "\u{a6f0}", "\u{a802}", "\u{a806}", "\u{a80b}", "\u{a825}", "\u{a82c}", "\u{a8c4}", "\u{a8e0}", "\u{a8ff}", "\u{a926}", "\u{a947}", "\u{a980}", "\u{a9b3}", "\u{a9b6}", "\u{a9bc}", "\u{a9e5}", "\u{aa29}", "\u{aa31}", "\u{aa35}", "\u{aa43}", "\u{aa4c}", "\u{aa7c}", "\u{aab0}", "\u{aab2}", "\u{aab7}", "\u{aabe}", "\u{aac1}", "\u{aaec}", "\u{aaf6}", "\u{abe5}", "\u{abe8}", "\u{abed}", "\u{fb1e}", "\u{fe00}", "\u{fe20}", "\u{101fd}", "\u{102e0}", "\u{10376}", "\u{10a01}", "\u{10a05}", "\u{10a0c}", "\u{10a38}", "\u{10a3f}", "\u{10ae5}", "\u{10d24}", "\u{10eab}", "\u{10efd}", "\u{10f46}", "\u{10f82}", "\u{11001}", "\u{11038}", "\u{11070}", "\u{11073}", "\u{1107f}", "\u{110b3}", "\u{110b9}", "\u{110c2}", "\u{11100}", "\u{11127}", "\u{1112d}", "\u{11173}", "\u{11180}", "\u{111b6}", "\u{111c9}", "\u{111cf}", "\u{1122f}", "\u{11234}", "\u{11236}", "\u{1123e}", "\u{11241}", "\u{112df}", "\u{112e3}", "\u{11300}", "\u{1133b}", "\u{11340}", "\u{11366}", "\u{11370}", "\u{11438}", "\u{11442}", "\u{11446}", "\u{1145e}", "\u{114b3}", "\u{114ba}", "\u{114bf}", "\u{114c2}", "\u{115b2}", "\u{115bc}", "\u{115bf}", "\u{115dc}", "\u{11633}", "\u{1163d}", "\u{1163f}", "\u{116ab}", "\u{116ad}", "\u{116b0}", "\u{116b7}", "\u{1171d}", "\u{11722}", "\u{11727}", "\u{1182f}", "\u{11839}", "\u{1193b}", "\u{1193e}", "\u{11943}", "\u{119d4}", "\u{119da}", "\u{119e0}", "\u{11a01}", "\u{11a33}", "\u{11a3b}", "\u{11a47}", "\u{11a51}", "\u{11a59}", "\u{11a8a}", "\u{11a98}", "\u{11c30}", "\u{11c38}", "\u{11c3f}", "\u{11c92}", "\u{11caa}", "\u{11cb2}", "\u{11cb5}", "\u{11d31}", "\u{11d3a}", "\u{11d3c}", "\u{11d3f}", "\u{11d47}", "\u{11d90}", "\u{11d95}", "\u{11d97}", "\u{11ef3}", "\u{11f00}", "\u{11f36}", "\u{11f40}", "\u{11f42}", "\u{13440}", "\u{13447}", "\u{16af0}", "\u{16b30}", "\u{16f4f}", "\u{16f8f}", "\u{16fe4}", "\u{1bc9d}", "\u{1cf00}", "\u{1cf30}", "\u{1d167}", "\u{1d17b}", "\u{1d185}", "\u{1d1aa}", "\u{1d242}", "\u{1da00}", "\u{1da3b}", "\u{1da75}", "\u{1da84}", "\u{1da9b}", "\u{1daa1}", "\u{1e000}", "\u{1e008}", "\u{1e01b}", "\u{1e023}", "\u{1e026}", "\u{1e08f}", "\u{1e130}", "\u{1e2ae}", "\u{1e2ec}", "\u{1e4ec}", "\u{1e8d0}", "\u{1e944}", "\u{e0100}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Nonspacing_Mark}+$", "^\\p{gc=Nonspacing_Mark}+$", "^\\p{Nonspacing_Mark}+$", "^\\p{General_Category=Mn}+$", "^\\p{gc=Mn}+$", "^\\p{Mn}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_openpunctuation() { test_with_configs(unicode_escape_property_gc_openpunctuation_tc) } fn unicode_escape_property_gc_openpunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 79] = [ "\u{28}", "\u{5b}", "\u{7b}", "\u{f3a}", "\u{f3c}", "\u{169b}", "\u{201a}", "\u{201e}", "\u{2045}", "\u{207d}", "\u{208d}", "\u{2308}", "\u{230a}", "\u{2329}", "\u{2768}", "\u{276a}", "\u{276c}", "\u{276e}", "\u{2770}", "\u{2772}", "\u{2774}", "\u{27c5}", "\u{27e6}", "\u{27e8}", "\u{27ea}", "\u{27ec}", "\u{27ee}", "\u{2983}", "\u{2985}", "\u{2987}", "\u{2989}", "\u{298b}", "\u{298d}", "\u{298f}", "\u{2991}", "\u{2993}", "\u{2995}", "\u{2997}", "\u{29d8}", "\u{29da}", "\u{29fc}", "\u{2e22}", "\u{2e24}", "\u{2e26}", "\u{2e28}", "\u{2e42}", "\u{2e55}", "\u{2e57}", "\u{2e59}", "\u{2e5b}", "\u{3008}", "\u{300a}", "\u{300c}", "\u{300e}", "\u{3010}", "\u{3014}", "\u{3016}", "\u{3018}", "\u{301a}", "\u{301d}", "\u{fd3f}", "\u{fe17}", "\u{fe35}", "\u{fe37}", "\u{fe39}", "\u{fe3b}", "\u{fe3d}", "\u{fe3f}", "\u{fe41}", "\u{fe43}", "\u{fe47}", "\u{fe59}", "\u{fe5b}", "\u{fe5d}", "\u{ff08}", "\u{ff3b}", "\u{ff5b}", "\u{ff5f}", "\u{ff62}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Open_Punctuation}+$", "^\\p{gc=Open_Punctuation}+$", "^\\p{Open_Punctuation}+$", "^\\p{General_Category=Ps}+$", "^\\p{gc=Ps}+$", "^\\p{Ps}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_otherletter() { test_with_configs(unicode_escape_property_gc_otherletter_tc) } fn unicode_escape_property_gc_otherletter_tc(tc: TestConfig) { const CODE_POINTS: [&str; 511] = [ "\u{aa}", "\u{ba}", "\u{1bb}", "\u{1c0}", "\u{294}", "\u{5d0}", "\u{5ef}", "\u{620}", "\u{641}", "\u{66e}", "\u{671}", "\u{6d5}", "\u{6ee}", "\u{6fa}", "\u{6ff}", "\u{710}", "\u{712}", "\u{74d}", "\u{7b1}", "\u{7ca}", "\u{800}", "\u{840}", "\u{860}", "\u{870}", "\u{889}", "\u{8a0}", "\u{904}", "\u{93d}", "\u{950}", "\u{958}", "\u{972}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bd}", "\u{9ce}", "\u{9dc}", "\u{9df}", "\u{9f0}", "\u{9fc}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a59}", "\u{a5e}", "\u{a72}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abd}", "\u{ad0}", "\u{ae0}", "\u{af9}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3d}", "\u{b5c}", "\u{b5f}", "\u{b71}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bd0}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3d}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c80}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbd}", "\u{cdd}", "\u{ce0}", "\u{cf1}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3d}", "\u{d4e}", "\u{d54}", "\u{d5f}", "\u{d7a}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{e01}", "\u{e32}", "\u{e40}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb2}", "\u{ebd}", "\u{ec0}", "\u{edc}", "\u{f00}", "\u{f40}", "\u{f49}", "\u{f88}", "\u{1000}", "\u{103f}", "\u{1050}", "\u{105a}", "\u{1061}", "\u{1065}", "\u{106e}", "\u{1075}", "\u{108e}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{1380}", "\u{1401}", "\u{166f}", "\u{1681}", "\u{16a0}", "\u{16f1}", "\u{1700}", "\u{171f}", "\u{1740}", "\u{1760}", "\u{176e}", "\u{1780}", "\u{17dc}", "\u{1820}", "\u{1844}", "\u{1880}", "\u{1887}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{1a00}", "\u{1a20}", "\u{1b05}", "\u{1b45}", "\u{1b83}", "\u{1bae}", "\u{1bba}", "\u{1c00}", "\u{1c4d}", "\u{1c5a}", "\u{1ce9}", "\u{1cee}", "\u{1cf5}", "\u{1cfa}", "\u{2135}", "\u{2d30}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{3006}", "\u{303c}", "\u{3041}", "\u{309f}", "\u{30a1}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{31a0}", "\u{31f0}", "\u{3400}", "\u{4e00}", "\u{a016}", "\u{a4d0}", "\u{a500}", "\u{a610}", "\u{a62a}", "\u{a66e}", "\u{a6a0}", "\u{a78f}", "\u{a7f7}", "\u{a7fb}", "\u{a803}", "\u{a807}", "\u{a80c}", "\u{a840}", "\u{a882}", "\u{a8f2}", "\u{a8fb}", "\u{a8fd}", "\u{a90a}", "\u{a930}", "\u{a960}", "\u{a984}", "\u{a9e0}", "\u{a9e7}", "\u{a9fa}", "\u{aa00}", "\u{aa40}", "\u{aa44}", "\u{aa60}", "\u{aa71}", "\u{aa7a}", "\u{aa7e}", "\u{aab1}", "\u{aab5}", "\u{aab9}", "\u{aac0}", "\u{aac2}", "\u{aadb}", "\u{aae0}", "\u{aaf2}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{abc0}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb1d}", "\u{fb1f}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fe70}", "\u{fe76}", "\u{ff66}", "\u{ff71}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10280}", "\u{102a0}", "\u{10300}", "\u{1032d}", "\u{10342}", "\u{10350}", "\u{10380}", "\u{103a0}", "\u{103c8}", "\u{10450}", "\u{10500}", "\u{10530}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10860}", "\u{10880}", "\u{108e0}", "\u{108f4}", "\u{10900}", "\u{10920}", "\u{10980}", "\u{109be}", "\u{10a00}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a60}", "\u{10a80}", "\u{10ac0}", "\u{10ac9}", "\u{10b00}", "\u{10b40}", "\u{10b60}", "\u{10b80}", "\u{10c00}", "\u{10d00}", "\u{10e80}", "\u{10eb0}", "\u{10f00}", "\u{10f27}", "\u{10f30}", "\u{10f70}", "\u{10fb0}", "\u{10fe0}", "\u{11003}", "\u{11071}", "\u{11075}", "\u{11083}", "\u{110d0}", "\u{11103}", "\u{11144}", "\u{11147}", "\u{11150}", "\u{11176}", "\u{11183}", "\u{111c1}", "\u{111da}", "\u{111dc}", "\u{11200}", "\u{11213}", "\u{1123f}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112b0}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133d}", "\u{11350}", "\u{1135d}", "\u{11400}", "\u{11447}", "\u{1145f}", "\u{11480}", "\u{114c4}", "\u{114c7}", "\u{11580}", "\u{115d8}", "\u{11600}", "\u{11644}", "\u{11680}", "\u{116b8}", "\u{11700}", "\u{11740}", "\u{11800}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{1193f}", "\u{11941}", "\u{119a0}", "\u{119aa}", "\u{119e1}", "\u{119e3}", "\u{11a00}", "\u{11a0b}", "\u{11a3a}", "\u{11a50}", "\u{11a5c}", "\u{11a9d}", "\u{11ab0}", "\u{11c00}", "\u{11c0a}", "\u{11c40}", "\u{11c72}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d46}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d98}", "\u{11ee0}", "\u{11f02}", "\u{11f04}", "\u{11f12}", "\u{11fb0}", "\u{12000}", "\u{12480}", "\u{12f90}", "\u{13000}", "\u{13441}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a70}", "\u{16ad0}", "\u{16b00}", "\u{16b63}", "\u{16b7d}", "\u{16f00}", "\u{16f50}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1df0a}", "\u{1e100}", "\u{1e14e}", "\u{1e290}", "\u{1e2c0}", "\u{1e4d0}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Other_Letter}+$", "^\\p{gc=Other_Letter}+$", "^\\p{Other_Letter}+$", "^\\p{General_Category=Lo}+$", "^\\p{gc=Lo}+$", "^\\p{Lo}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_othernumber() { test_with_configs(unicode_escape_property_gc_othernumber_tc) } fn unicode_escape_property_gc_othernumber_tc(tc: TestConfig) { const CODE_POINTS: [&str; 72] = [ "\u{b2}", "\u{b9}", "\u{bc}", "\u{9f4}", "\u{b72}", "\u{bf0}", "\u{c78}", "\u{d58}", "\u{d70}", "\u{f2a}", "\u{1369}", "\u{17f0}", "\u{19da}", "\u{2070}", "\u{2074}", "\u{2080}", "\u{2150}", "\u{2189}", "\u{2460}", "\u{24ea}", "\u{2776}", "\u{2cfd}", "\u{3192}", "\u{3220}", "\u{3248}", "\u{3251}", "\u{3280}", "\u{32b1}", "\u{a830}", "\u{10107}", "\u{10175}", "\u{1018a}", "\u{102e1}", "\u{10320}", "\u{10858}", "\u{10879}", "\u{108a7}", "\u{108fb}", "\u{10916}", "\u{109bc}", "\u{109c0}", "\u{109d2}", "\u{10a40}", "\u{10a7d}", "\u{10a9d}", "\u{10aeb}", "\u{10b58}", "\u{10b78}", "\u{10ba9}", "\u{10cfa}", "\u{10e60}", "\u{10f1d}", "\u{10f51}", "\u{10fc5}", "\u{11052}", "\u{111e1}", "\u{1173a}", "\u{118ea}", "\u{11c5a}", "\u{11fc0}", "\u{16b5b}", "\u{16e80}", "\u{1d2c0}", "\u{1d2e0}", "\u{1d360}", "\u{1e8c7}", "\u{1ec71}", "\u{1ecad}", "\u{1ecb1}", "\u{1ed01}", "\u{1ed2f}", "\u{1f100}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Other_Number}+$", "^\\p{gc=Other_Number}+$", "^\\p{Other_Number}+$", "^\\p{General_Category=No}+$", "^\\p{gc=No}+$", "^\\p{No}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_otherpunctuation() { test_with_configs(unicode_escape_property_gc_otherpunctuation_tc) } fn unicode_escape_property_gc_otherpunctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 187] = [ "\u{21}", "\u{25}", "\u{2a}", "\u{2c}", "\u{2e}", "\u{3a}", "\u{3f}", "\u{5c}", "\u{a1}", "\u{a7}", "\u{b6}", "\u{bf}", "\u{37e}", "\u{387}", "\u{55a}", "\u{589}", "\u{5c0}", "\u{5c3}", "\u{5c6}", "\u{5f3}", "\u{609}", "\u{60c}", "\u{61b}", "\u{61d}", "\u{66a}", "\u{6d4}", "\u{700}", "\u{7f7}", "\u{830}", "\u{85e}", "\u{964}", "\u{970}", "\u{9fd}", "\u{a76}", "\u{af0}", "\u{c77}", "\u{c84}", "\u{df4}", "\u{e4f}", "\u{e5a}", "\u{f04}", "\u{f14}", "\u{f85}", "\u{fd0}", "\u{fd9}", "\u{104a}", "\u{10fb}", "\u{1360}", "\u{166e}", "\u{16eb}", "\u{1735}", "\u{17d4}", "\u{17d8}", "\u{1800}", "\u{1807}", "\u{1944}", "\u{1a1e}", "\u{1aa0}", "\u{1aa8}", "\u{1b5a}", "\u{1b7d}", "\u{1bfc}", "\u{1c3b}", "\u{1c7e}", "\u{1cc0}", "\u{1cd3}", "\u{2016}", "\u{2020}", "\u{2030}", "\u{203b}", "\u{2041}", "\u{2047}", "\u{2053}", "\u{2055}", "\u{2cf9}", "\u{2cfe}", "\u{2d70}", "\u{2e00}", "\u{2e06}", "\u{2e0b}", "\u{2e0e}", "\u{2e18}", "\u{2e1b}", "\u{2e1e}", "\u{2e2a}", "\u{2e30}", "\u{2e3c}", "\u{2e41}", "\u{2e43}", "\u{2e52}", "\u{3001}", "\u{303d}", "\u{30fb}", "\u{a4fe}", "\u{a60d}", "\u{a673}", "\u{a67e}", "\u{a6f2}", "\u{a874}", "\u{a8ce}", "\u{a8f8}", "\u{a8fc}", "\u{a92e}", "\u{a95f}", "\u{a9c1}", "\u{a9de}", "\u{aa5c}", "\u{aade}", "\u{aaf0}", "\u{abeb}", "\u{fe10}", "\u{fe19}", "\u{fe30}", "\u{fe45}", "\u{fe49}", "\u{fe50}", "\u{fe54}", "\u{fe5f}", "\u{fe68}", "\u{fe6a}", "\u{ff01}", "\u{ff05}", "\u{ff0a}", "\u{ff0c}", "\u{ff0e}", "\u{ff1a}", "\u{ff1f}", "\u{ff3c}", "\u{ff61}", "\u{ff64}", "\u{10100}", "\u{1039f}", "\u{103d0}", "\u{1056f}", "\u{10857}", "\u{1091f}", "\u{1093f}", "\u{10a50}", "\u{10a7f}", "\u{10af0}", "\u{10b39}", "\u{10b99}", "\u{10f55}", "\u{10f86}", "\u{11047}", "\u{110bb}", "\u{110be}", "\u{11140}", "\u{11174}", "\u{111c5}", "\u{111cd}", "\u{111db}", "\u{111dd}", "\u{11238}", "\u{112a9}", "\u{1144b}", "\u{1145a}", "\u{1145d}", "\u{114c6}", "\u{115c1}", "\u{11641}", "\u{11660}", "\u{116b9}", "\u{1173c}", "\u{1183b}", "\u{11944}", "\u{119e2}", "\u{11a3f}", "\u{11a9a}", "\u{11a9e}", "\u{11b00}", "\u{11c41}", "\u{11c70}", "\u{11ef7}", "\u{11f43}", "\u{11fff}", "\u{12470}", "\u{12ff1}", "\u{16a6e}", "\u{16af5}", "\u{16b37}", "\u{16b44}", "\u{16e97}", "\u{16fe2}", "\u{1bc9f}", "\u{1da87}", "\u{1e95e}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Other_Punctuation}+$", "^\\p{gc=Other_Punctuation}+$", "^\\p{Other_Punctuation}+$", "^\\p{General_Category=Po}+$", "^\\p{gc=Po}+$", "^\\p{Po}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_othersymbol() { test_with_configs(unicode_escape_property_gc_othersymbol_tc) } fn unicode_escape_property_gc_othersymbol_tc(tc: TestConfig) { const CODE_POINTS: [&str; 185] = [ "\u{a6}", "\u{a9}", "\u{ae}", "\u{b0}", "\u{482}", "\u{58d}", "\u{60e}", "\u{6de}", "\u{6e9}", "\u{6fd}", "\u{7f6}", "\u{9fa}", "\u{b70}", "\u{bf3}", "\u{bfa}", "\u{c7f}", "\u{d4f}", "\u{d79}", "\u{f01}", "\u{f13}", "\u{f15}", "\u{f1a}", "\u{f34}", "\u{f36}", "\u{f38}", "\u{fbe}", "\u{fc7}", "\u{fce}", "\u{fd5}", "\u{109e}", "\u{1390}", "\u{166d}", "\u{1940}", "\u{19de}", "\u{1b61}", "\u{1b74}", "\u{2100}", "\u{2103}", "\u{2108}", "\u{2114}", "\u{2116}", "\u{211e}", "\u{2125}", "\u{2127}", "\u{2129}", "\u{212e}", "\u{213a}", "\u{214a}", "\u{214c}", "\u{214f}", "\u{218a}", "\u{2195}", "\u{219c}", "\u{21a1}", "\u{21a4}", "\u{21a7}", "\u{21af}", "\u{21d0}", "\u{21d3}", "\u{21d5}", "\u{2300}", "\u{230c}", "\u{2322}", "\u{232b}", "\u{237d}", "\u{23b4}", "\u{23e2}", "\u{2440}", "\u{249c}", "\u{2500}", "\u{25b8}", "\u{25c2}", "\u{2600}", "\u{2670}", "\u{2794}", "\u{2800}", "\u{2b00}", "\u{2b45}", "\u{2b4d}", "\u{2b76}", "\u{2b97}", "\u{2ce5}", "\u{2e50}", "\u{2e80}", "\u{2e9b}", "\u{2f00}", "\u{2ff0}", "\u{3004}", "\u{3012}", "\u{3020}", "\u{3036}", "\u{303e}", "\u{3190}", "\u{3196}", "\u{31c0}", "\u{31ef}", "\u{3200}", "\u{322a}", "\u{3250}", "\u{3260}", "\u{328a}", "\u{32c0}", "\u{4dc0}", "\u{a490}", "\u{a828}", "\u{a836}", "\u{a839}", "\u{aa77}", "\u{fd40}", "\u{fdcf}", "\u{fdfd}", "\u{ffe4}", "\u{ffe8}", "\u{ffed}", "\u{fffc}", "\u{10137}", "\u{10179}", "\u{1018c}", "\u{10190}", "\u{101a0}", "\u{101d0}", "\u{10877}", "\u{10ac8}", "\u{1173f}", "\u{11fd5}", "\u{11fe1}", "\u{16b3c}", "\u{16b45}", "\u{1bc9c}", "\u{1cf50}", "\u{1d000}", "\u{1d100}", "\u{1d129}", "\u{1d16a}", "\u{1d183}", "\u{1d18c}", "\u{1d1ae}", "\u{1d200}", "\u{1d245}", "\u{1d300}", "\u{1d800}", "\u{1da37}", "\u{1da6d}", "\u{1da76}", "\u{1da85}", "\u{1e14f}", "\u{1ecac}", "\u{1ed2e}", "\u{1f000}", "\u{1f030}", "\u{1f0a0}", "\u{1f0b1}", "\u{1f0c1}", "\u{1f0d1}", "\u{1f10d}", "\u{1f1e6}", "\u{1f210}", "\u{1f240}", "\u{1f250}", "\u{1f260}", "\u{1f300}", "\u{1f400}", "\u{1f6dc}", "\u{1f6f0}", "\u{1f700}", "\u{1f77b}", "\u{1f7e0}", "\u{1f7f0}", "\u{1f800}", "\u{1f810}", "\u{1f850}", "\u{1f860}", "\u{1f890}", "\u{1f8b0}", "\u{1f900}", "\u{1fa60}", "\u{1fa70}", "\u{1fa80}", "\u{1fa90}", "\u{1fabf}", "\u{1face}", "\u{1fae0}", "\u{1faf0}", "\u{1fb00}", "\u{1fb94}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Other_Symbol}+$", "^\\p{gc=Other_Symbol}+$", "^\\p{Other_Symbol}+$", "^\\p{General_Category=So}+$", "^\\p{gc=So}+$", "^\\p{So}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_paragraphseparator() { test_with_configs(unicode_escape_property_gc_paragraphseparator_tc) } fn unicode_escape_property_gc_paragraphseparator_tc(tc: TestConfig) { const CODE_POINTS: [&str; 1] = ["\u{2029}"]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Paragraph_Separator}+$", "^\\p{gc=Paragraph_Separator}+$", "^\\p{Paragraph_Separator}+$", "^\\p{General_Category=Zp}+$", "^\\p{gc=Zp}+$", "^\\p{Zp}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_privateuse() { test_with_configs(unicode_escape_property_gc_privateuse_tc) } fn unicode_escape_property_gc_privateuse_tc(tc: TestConfig) { const CODE_POINTS: [&str; 3] = ["\u{e000}", "\u{f0000}", "\u{100000}"]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Private_Use}+$", "^\\p{gc=Private_Use}+$", "^\\p{Private_Use}+$", "^\\p{General_Category=Co}+$", "^\\p{gc=Co}+$", "^\\p{Co}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_spaceseparator() { test_with_configs(unicode_escape_property_gc_spaceseparator_tc) } fn unicode_escape_property_gc_spaceseparator_tc(tc: TestConfig) { const CODE_POINTS: [&str; 7] = [ "\u{20}", "\u{a0}", "\u{1680}", "\u{2000}", "\u{202f}", "\u{205f}", "\u{3000}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Space_Separator}+$", "^\\p{gc=Space_Separator}+$", "^\\p{Space_Separator}+$", "^\\p{General_Category=Zs}+$", "^\\p{gc=Zs}+$", "^\\p{Zs}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_spacingmark() { test_with_configs(unicode_escape_property_gc_spacingmark_tc) } fn unicode_escape_property_gc_spacingmark_tc(tc: TestConfig) { const CODE_POINTS: [&str; 182] = [ "\u{903}", "\u{93b}", "\u{93e}", "\u{949}", "\u{94e}", "\u{982}", "\u{9be}", "\u{9c7}", "\u{9cb}", "\u{9d7}", "\u{a03}", "\u{a3e}", "\u{a83}", "\u{abe}", "\u{ac9}", "\u{acb}", "\u{b02}", "\u{b3e}", "\u{b40}", "\u{b47}", "\u{b4b}", "\u{b57}", "\u{bbe}", "\u{bc1}", "\u{bc6}", "\u{bca}", "\u{bd7}", "\u{c01}", "\u{c41}", "\u{c82}", "\u{cbe}", "\u{cc0}", "\u{cc7}", "\u{cca}", "\u{cd5}", "\u{cf3}", "\u{d02}", "\u{d3e}", "\u{d46}", "\u{d4a}", "\u{d57}", "\u{d82}", "\u{dcf}", "\u{dd8}", "\u{df2}", "\u{f3e}", "\u{f7f}", "\u{102b}", "\u{1031}", "\u{1038}", "\u{103b}", "\u{1056}", "\u{1062}", "\u{1067}", "\u{1083}", "\u{1087}", "\u{108f}", "\u{109a}", "\u{1715}", "\u{1734}", "\u{17b6}", "\u{17be}", "\u{17c7}", "\u{1923}", "\u{1929}", "\u{1930}", "\u{1933}", "\u{1a19}", "\u{1a55}", "\u{1a57}", "\u{1a61}", "\u{1a63}", "\u{1a6d}", "\u{1b04}", "\u{1b35}", "\u{1b3b}", "\u{1b3d}", "\u{1b43}", "\u{1b82}", "\u{1ba1}", "\u{1ba6}", "\u{1baa}", "\u{1be7}", "\u{1bea}", "\u{1bee}", "\u{1bf2}", "\u{1c24}", "\u{1c34}", "\u{1ce1}", "\u{1cf7}", "\u{302e}", "\u{a823}", "\u{a827}", "\u{a880}", "\u{a8b4}", "\u{a952}", "\u{a983}", "\u{a9b4}", "\u{a9ba}", "\u{a9be}", "\u{aa2f}", "\u{aa33}", "\u{aa4d}", "\u{aa7b}", "\u{aa7d}", "\u{aaeb}", "\u{aaee}", "\u{aaf5}", "\u{abe3}", "\u{abe6}", "\u{abe9}", "\u{abec}", "\u{11000}", "\u{11002}", "\u{11082}", "\u{110b0}", "\u{110b7}", "\u{1112c}", "\u{11145}", "\u{11182}", "\u{111b3}", "\u{111bf}", "\u{111ce}", "\u{1122c}", "\u{11232}", "\u{11235}", "\u{112e0}", "\u{11302}", "\u{1133e}", "\u{11341}", "\u{11347}", "\u{1134b}", "\u{11357}", "\u{11362}", "\u{11435}", "\u{11440}", "\u{11445}", "\u{114b0}", "\u{114b9}", "\u{114bb}", "\u{114c1}", "\u{115af}", "\u{115b8}", "\u{115be}", "\u{11630}", "\u{1163b}", "\u{1163e}", "\u{116ac}", "\u{116ae}", "\u{116b6}", "\u{11720}", "\u{11726}", "\u{1182c}", "\u{11838}", "\u{11930}", "\u{11937}", "\u{1193d}", "\u{11940}", "\u{11942}", "\u{119d1}", "\u{119dc}", "\u{119e4}", "\u{11a39}", "\u{11a57}", "\u{11a97}", "\u{11c2f}", "\u{11c3e}", "\u{11ca9}", "\u{11cb1}", "\u{11cb4}", "\u{11d8a}", "\u{11d93}", "\u{11d96}", "\u{11ef5}", "\u{11f03}", "\u{11f34}", "\u{11f3e}", "\u{11f41}", "\u{16f51}", "\u{16ff0}", "\u{1d165}", "\u{1d16d}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Spacing_Mark}+$", "^\\p{gc=Spacing_Mark}+$", "^\\p{Spacing_Mark}+$", "^\\p{General_Category=Mc}+$", "^\\p{gc=Mc}+$", "^\\p{Mc}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_titlecaseletter() { test_with_configs(unicode_escape_property_gc_titlecaseletter_tc) } fn unicode_escape_property_gc_titlecaseletter_tc(tc: TestConfig) { const CODE_POINTS: [&str; 10] = [ "\u{1c5}", "\u{1c8}", "\u{1cb}", "\u{1f2}", "\u{1f88}", "\u{1f98}", "\u{1fa8}", "\u{1fbc}", "\u{1fcc}", "\u{1ffc}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Titlecase_Letter}+$", "^\\p{gc=Titlecase_Letter}+$", "^\\p{Titlecase_Letter}+$", "^\\p{General_Category=Lt}+$", "^\\p{gc=Lt}+$", "^\\p{Lt}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_unassigned() { test_with_configs(unicode_escape_property_gc_unassigned_tc) } fn unicode_escape_property_gc_unassigned_tc(tc: TestConfig) { const CODE_POINTS: [&str; 707] = [ "\u{378}", "\u{380}", "\u{38b}", "\u{38d}", "\u{3a2}", "\u{530}", "\u{557}", "\u{58b}", "\u{590}", "\u{5c8}", "\u{5eb}", "\u{5f5}", "\u{70e}", "\u{74b}", "\u{7b2}", "\u{7fb}", "\u{82e}", "\u{83f}", "\u{85c}", "\u{85f}", "\u{86b}", "\u{88f}", "\u{892}", "\u{984}", "\u{98d}", "\u{991}", "\u{9a9}", "\u{9b1}", "\u{9b3}", "\u{9ba}", "\u{9c5}", "\u{9c9}", "\u{9cf}", "\u{9d8}", "\u{9de}", "\u{9e4}", "\u{9ff}", "\u{a04}", "\u{a0b}", "\u{a11}", "\u{a29}", "\u{a31}", "\u{a34}", "\u{a37}", "\u{a3a}", "\u{a3d}", "\u{a43}", "\u{a49}", "\u{a4e}", "\u{a52}", "\u{a5d}", "\u{a5f}", "\u{a77}", "\u{a84}", "\u{a8e}", "\u{a92}", "\u{aa9}", "\u{ab1}", "\u{ab4}", "\u{aba}", "\u{ac6}", "\u{aca}", "\u{ace}", "\u{ad1}", "\u{ae4}", "\u{af2}", "\u{b00}", "\u{b04}", "\u{b0d}", "\u{b11}", "\u{b29}", "\u{b31}", "\u{b34}", "\u{b3a}", "\u{b45}", "\u{b49}", "\u{b4e}", "\u{b58}", "\u{b5e}", "\u{b64}", "\u{b78}", "\u{b84}", "\u{b8b}", "\u{b91}", "\u{b96}", "\u{b9b}", "\u{b9d}", "\u{ba0}", "\u{ba5}", "\u{bab}", "\u{bba}", "\u{bc3}", "\u{bc9}", "\u{bce}", "\u{bd1}", "\u{bd8}", "\u{bfb}", "\u{c0d}", "\u{c11}", "\u{c29}", "\u{c3a}", "\u{c45}", "\u{c49}", "\u{c4e}", "\u{c57}", "\u{c5b}", "\u{c5e}", "\u{c64}", "\u{c70}", "\u{c8d}", "\u{c91}", "\u{ca9}", "\u{cb4}", "\u{cba}", "\u{cc5}", "\u{cc9}", "\u{cce}", "\u{cd7}", "\u{cdf}", "\u{ce4}", "\u{cf0}", "\u{cf4}", "\u{d0d}", "\u{d11}", "\u{d45}", "\u{d49}", "\u{d50}", "\u{d64}", "\u{d80}", "\u{d84}", "\u{d97}", "\u{db2}", "\u{dbc}", "\u{dbe}", "\u{dc7}", "\u{dcb}", "\u{dd5}", "\u{dd7}", "\u{de0}", "\u{df0}", "\u{df5}", "\u{e3b}", "\u{e5c}", "\u{e83}", "\u{e85}", "\u{e8b}", "\u{ea4}", "\u{ea6}", "\u{ebe}", "\u{ec5}", "\u{ec7}", "\u{ecf}", "\u{eda}", "\u{ee0}", "\u{f48}", "\u{f6d}", "\u{f98}", "\u{fbd}", "\u{fcd}", "\u{fdb}", "\u{10c6}", "\u{10c8}", "\u{10ce}", "\u{1249}", "\u{124e}", "\u{1257}", "\u{1259}", "\u{125e}", "\u{1289}", "\u{128e}", "\u{12b1}", "\u{12b6}", "\u{12bf}", "\u{12c1}", "\u{12c6}", "\u{12d7}", "\u{1311}", "\u{1316}", "\u{135b}", "\u{137d}", "\u{139a}", "\u{13f6}", "\u{13fe}", "\u{169d}", "\u{16f9}", "\u{1716}", "\u{1737}", "\u{1754}", "\u{176d}", "\u{1771}", "\u{1774}", "\u{17de}", "\u{17ea}", "\u{17fa}", "\u{181a}", "\u{1879}", "\u{18ab}", "\u{18f6}", "\u{191f}", "\u{192c}", "\u{193c}", "\u{1941}", "\u{196e}", "\u{1975}", "\u{19ac}", "\u{19ca}", "\u{19db}", "\u{1a1c}", "\u{1a5f}", "\u{1a7d}", "\u{1a8a}", "\u{1a9a}", "\u{1aae}", "\u{1acf}", "\u{1b4d}", "\u{1b7f}", "\u{1bf4}", "\u{1c38}", "\u{1c4a}", "\u{1c89}", "\u{1cbb}", "\u{1cc8}", "\u{1cfb}", "\u{1f16}", "\u{1f1e}", "\u{1f46}", "\u{1f4e}", "\u{1f58}", "\u{1f5a}", "\u{1f5c}", "\u{1f5e}", "\u{1f7e}", "\u{1fb5}", "\u{1fc5}", "\u{1fd4}", "\u{1fdc}", "\u{1ff0}", "\u{1ff5}", "\u{1fff}", "\u{2065}", "\u{2072}", "\u{208f}", "\u{209d}", "\u{20c1}", "\u{20f1}", "\u{218c}", "\u{2427}", "\u{244b}", "\u{2b74}", "\u{2b96}", "\u{2cf4}", "\u{2d26}", "\u{2d28}", "\u{2d2e}", "\u{2d68}", "\u{2d71}", "\u{2d97}", "\u{2da7}", "\u{2daf}", "\u{2db7}", "\u{2dbf}", "\u{2dc7}", "\u{2dcf}", "\u{2dd7}", "\u{2ddf}", "\u{2e5e}", "\u{2e9a}", "\u{2ef4}", "\u{2fd6}", "\u{3040}", "\u{3097}", "\u{3100}", "\u{3130}", "\u{318f}", "\u{31e4}", "\u{321f}", "\u{a48d}", "\u{a4c7}", "\u{a62c}", "\u{a6f8}", "\u{a7cb}", "\u{a7d2}", "\u{a7d4}", "\u{a7da}", "\u{a82d}", "\u{a83a}", "\u{a878}", "\u{a8c6}", "\u{a8da}", "\u{a954}", "\u{a97d}", "\u{a9ce}", "\u{a9da}", "\u{a9ff}", "\u{aa37}", "\u{aa4e}", "\u{aa5a}", "\u{aac3}", "\u{aaf7}", "\u{ab07}", "\u{ab0f}", "\u{ab17}", "\u{ab27}", "\u{ab2f}", "\u{ab6c}", "\u{abee}", "\u{abfa}", "\u{d7a4}", "\u{d7c7}", "\u{d7fc}", "\u{fa6e}", "\u{fada}", "\u{fb07}", "\u{fb18}", "\u{fb37}", "\u{fb3d}", "\u{fb3f}", "\u{fb42}", "\u{fb45}", "\u{fbc3}", "\u{fd90}", "\u{fdc8}", "\u{fdd0}", "\u{fe1a}", "\u{fe53}", "\u{fe67}", "\u{fe6c}", "\u{fe75}", "\u{fefd}", "\u{ff00}", "\u{ffbf}", "\u{ffc8}", "\u{ffd0}", "\u{ffd8}", "\u{ffdd}", "\u{ffe7}", "\u{ffef}", "\u{fffe}", "\u{1000c}", "\u{10027}", "\u{1003b}", "\u{1003e}", "\u{1004e}", "\u{1005e}", "\u{100fb}", "\u{10103}", "\u{10134}", "\u{1018f}", "\u{1019d}", "\u{101a1}", "\u{101fe}", "\u{1029d}", "\u{102d1}", "\u{102fc}", "\u{10324}", "\u{1034b}", "\u{1037b}", "\u{1039e}", "\u{103c4}", "\u{103d6}", "\u{1049e}", "\u{104aa}", "\u{104d4}", "\u{104fc}", "\u{10528}", "\u{10564}", "\u{1057b}", "\u{1058b}", "\u{10593}", "\u{10596}", "\u{105a2}", "\u{105b2}", "\u{105ba}", "\u{105bd}", "\u{10737}", "\u{10756}", "\u{10768}", "\u{10786}", "\u{107b1}", "\u{107bb}", "\u{10806}", "\u{10809}", "\u{10836}", "\u{10839}", "\u{1083d}", "\u{10856}", "\u{1089f}", "\u{108b0}", "\u{108f3}", "\u{108f6}", "\u{1091c}", "\u{1093a}", "\u{10940}", "\u{109b8}", "\u{109d0}", "\u{10a04}", "\u{10a07}", "\u{10a14}", "\u{10a18}", "\u{10a36}", "\u{10a3b}", "\u{10a49}", "\u{10a59}", "\u{10aa0}", "\u{10ae7}", "\u{10af7}", "\u{10b36}", "\u{10b56}", "\u{10b73}", "\u{10b92}", "\u{10b9d}", "\u{10bb0}", "\u{10c49}", "\u{10cb3}", "\u{10cf3}", "\u{10d28}", "\u{10d3a}", "\u{10e7f}", "\u{10eaa}", "\u{10eae}", "\u{10eb2}", "\u{10f28}", "\u{10f5a}", "\u{10f8a}", "\u{10fcc}", "\u{10ff7}", "\u{1104e}", "\u{11076}", "\u{110c3}", "\u{110ce}", "\u{110e9}", "\u{110fa}", "\u{11135}", "\u{11148}", "\u{11177}", "\u{111e0}", "\u{111f5}", "\u{11212}", "\u{11242}", "\u{11287}", "\u{11289}", "\u{1128e}", "\u{1129e}", "\u{112aa}", "\u{112eb}", "\u{112fa}", "\u{11304}", "\u{1130d}", "\u{11311}", "\u{11329}", "\u{11331}", "\u{11334}", "\u{1133a}", "\u{11345}", "\u{11349}", "\u{1134e}", "\u{11351}", "\u{11358}", "\u{11364}", "\u{1136d}", "\u{11375}", "\u{1145c}", "\u{11462}", "\u{114c8}", "\u{114da}", "\u{115b6}", "\u{115de}", "\u{11645}", "\u{1165a}", "\u{1166d}", "\u{116ba}", "\u{116ca}", "\u{1171b}", "\u{1172c}", "\u{11747}", "\u{1183c}", "\u{118f3}", "\u{11907}", "\u{1190a}", "\u{11914}", "\u{11917}", "\u{11936}", "\u{11939}", "\u{11947}", "\u{1195a}", "\u{119a8}", "\u{119d8}", "\u{119e5}", "\u{11a48}", "\u{11aa3}", "\u{11af9}", "\u{11b0a}", "\u{11c09}", "\u{11c37}", "\u{11c46}", "\u{11c6d}", "\u{11c90}", "\u{11ca8}", "\u{11cb7}", "\u{11d07}", "\u{11d0a}", "\u{11d37}", "\u{11d3b}", "\u{11d3e}", "\u{11d48}", "\u{11d5a}", "\u{11d66}", "\u{11d69}", "\u{11d8f}", "\u{11d92}", "\u{11d99}", "\u{11daa}", "\u{11ef9}", "\u{11f11}", "\u{11f3b}", "\u{11f5a}", "\u{11fb1}", "\u{11ff2}", "\u{1239a}", "\u{1246f}", "\u{12475}", "\u{12544}", "\u{12ff3}", "\u{13456}", "\u{14647}", "\u{16a39}", "\u{16a5f}", "\u{16a6a}", "\u{16abf}", "\u{16aca}", "\u{16aee}", "\u{16af6}", "\u{16b46}", "\u{16b5a}", "\u{16b62}", "\u{16b78}", "\u{16b90}", "\u{16e9b}", "\u{16f4b}", "\u{16f88}", "\u{16fa0}", "\u{16fe5}", "\u{16ff2}", "\u{187f8}", "\u{18cd6}", "\u{18d09}", "\u{1aff4}", "\u{1affc}", "\u{1afff}", "\u{1b123}", "\u{1b133}", "\u{1b153}", "\u{1b156}", "\u{1b168}", "\u{1b2fc}", "\u{1bc6b}", "\u{1bc7d}", "\u{1bc89}", "\u{1bc9a}", "\u{1bca4}", "\u{1cf2e}", "\u{1cf47}", "\u{1cfc4}", "\u{1d0f6}", "\u{1d127}", "\u{1d1eb}", "\u{1d246}", "\u{1d2d4}", "\u{1d2f4}", "\u{1d357}", "\u{1d379}", "\u{1d455}", "\u{1d49d}", "\u{1d4a0}", "\u{1d4a3}", "\u{1d4a7}", "\u{1d4ad}", "\u{1d4ba}", "\u{1d4bc}", "\u{1d4c4}", "\u{1d506}", "\u{1d50b}", "\u{1d515}", "\u{1d51d}", "\u{1d53a}", "\u{1d53f}", "\u{1d545}", "\u{1d547}", "\u{1d551}", "\u{1d6a6}", "\u{1d7cc}", "\u{1da8c}", "\u{1daa0}", "\u{1dab0}", "\u{1df1f}", "\u{1df2b}", "\u{1e007}", "\u{1e019}", "\u{1e022}", "\u{1e025}", "\u{1e02b}", "\u{1e06e}", "\u{1e090}", "\u{1e12d}", "\u{1e13e}", "\u{1e14a}", "\u{1e150}", "\u{1e2af}", "\u{1e2fa}", "\u{1e300}", "\u{1e4fa}", "\u{1e7e7}", "\u{1e7ec}", "\u{1e7ef}", "\u{1e7ff}", "\u{1e8c5}", "\u{1e8d7}", "\u{1e94c}", "\u{1e95a}", "\u{1e960}", "\u{1ecb5}", "\u{1ed3e}", "\u{1ee04}", "\u{1ee20}", "\u{1ee23}", "\u{1ee25}", "\u{1ee28}", "\u{1ee33}", "\u{1ee38}", "\u{1ee3a}", "\u{1ee3c}", "\u{1ee43}", "\u{1ee48}", "\u{1ee4a}", "\u{1ee4c}", "\u{1ee50}", "\u{1ee53}", "\u{1ee55}", "\u{1ee58}", "\u{1ee5a}", "\u{1ee5c}", "\u{1ee5e}", "\u{1ee60}", "\u{1ee63}", "\u{1ee65}", "\u{1ee6b}", "\u{1ee73}", "\u{1ee78}", "\u{1ee7d}", "\u{1ee7f}", "\u{1ee8a}", "\u{1ee9c}", "\u{1eea4}", "\u{1eeaa}", "\u{1eebc}", "\u{1eef2}", "\u{1f02c}", "\u{1f094}", "\u{1f0af}", "\u{1f0c0}", "\u{1f0d0}", "\u{1f0f6}", "\u{1f1ae}", "\u{1f203}", "\u{1f23c}", "\u{1f249}", "\u{1f252}", "\u{1f266}", "\u{1f6d8}", "\u{1f6ed}", "\u{1f6fd}", "\u{1f777}", "\u{1f7da}", "\u{1f7ec}", "\u{1f7f1}", "\u{1f80c}", "\u{1f848}", "\u{1f85a}", "\u{1f888}", "\u{1f8ae}", "\u{1f8b2}", "\u{1fa54}", "\u{1fa6e}", "\u{1fa7d}", "\u{1fa89}", "\u{1fabe}", "\u{1fac6}", "\u{1fadc}", "\u{1fae9}", "\u{1faf9}", "\u{1fb93}", "\u{1fbcb}", "\u{1fbfa}", "\u{2a6e0}", "\u{2b73a}", "\u{2b81e}", "\u{2cea2}", "\u{2ebe1}", "\u{2ee5e}", "\u{2fa1e}", "\u{3134b}", "\u{323b0}", "\u{e0002}", "\u{e0080}", "\u{e01f0}", "\u{ffffe}", "\u{10fffe}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Unassigned}+$", "^\\p{gc=Unassigned}+$", "^\\p{Unassigned}+$", "^\\p{General_Category=Cn}+$", "^\\p{gc=Cn}+$", "^\\p{Cn}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_uppercaseletter() { test_with_configs(unicode_escape_property_gc_uppercaseletter_tc) } fn unicode_escape_property_gc_uppercaseletter_tc(tc: TestConfig) { const CODE_POINTS: [&str; 646] = [ "\u{41}", "\u{c0}", "\u{d8}", "\u{100}", "\u{102}", "\u{104}", "\u{106}", "\u{108}", "\u{10a}", "\u{10c}", "\u{10e}", "\u{110}", "\u{112}", "\u{114}", "\u{116}", "\u{118}", "\u{11a}", "\u{11c}", "\u{11e}", "\u{120}", "\u{122}", "\u{124}", "\u{126}", "\u{128}", "\u{12a}", "\u{12c}", "\u{12e}", "\u{130}", "\u{132}", "\u{134}", "\u{136}", "\u{139}", "\u{13b}", "\u{13d}", "\u{13f}", "\u{141}", "\u{143}", "\u{145}", "\u{147}", "\u{14a}", "\u{14c}", "\u{14e}", "\u{150}", "\u{152}", "\u{154}", "\u{156}", "\u{158}", "\u{15a}", "\u{15c}", "\u{15e}", "\u{160}", "\u{162}", "\u{164}", "\u{166}", "\u{168}", "\u{16a}", "\u{16c}", "\u{16e}", "\u{170}", "\u{172}", "\u{174}", "\u{176}", "\u{178}", "\u{17b}", "\u{17d}", "\u{181}", "\u{184}", "\u{186}", "\u{189}", "\u{18e}", "\u{193}", "\u{196}", "\u{19c}", "\u{19f}", "\u{1a2}", "\u{1a4}", "\u{1a6}", "\u{1a9}", "\u{1ac}", "\u{1ae}", "\u{1b1}", "\u{1b5}", "\u{1b7}", "\u{1bc}", "\u{1c4}", "\u{1c7}", "\u{1ca}", "\u{1cd}", "\u{1cf}", "\u{1d1}", "\u{1d3}", "\u{1d5}", "\u{1d7}", "\u{1d9}", "\u{1db}", "\u{1de}", "\u{1e0}", "\u{1e2}", "\u{1e4}", "\u{1e6}", "\u{1e8}", "\u{1ea}", "\u{1ec}", "\u{1ee}", "\u{1f1}", "\u{1f4}", "\u{1f6}", "\u{1fa}", "\u{1fc}", "\u{1fe}", "\u{200}", "\u{202}", "\u{204}", "\u{206}", "\u{208}", "\u{20a}", "\u{20c}", "\u{20e}", "\u{210}", "\u{212}", "\u{214}", "\u{216}", "\u{218}", "\u{21a}", "\u{21c}", "\u{21e}", "\u{220}", "\u{222}", "\u{224}", "\u{226}", "\u{228}", "\u{22a}", "\u{22c}", "\u{22e}", "\u{230}", "\u{232}", "\u{23a}", "\u{23d}", "\u{241}", "\u{243}", "\u{248}", "\u{24a}", "\u{24c}", "\u{24e}", "\u{370}", "\u{372}", "\u{376}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{391}", "\u{3a3}", "\u{3cf}", "\u{3d2}", "\u{3d8}", "\u{3da}", "\u{3dc}", "\u{3de}", "\u{3e0}", "\u{3e2}", "\u{3e4}", "\u{3e6}", "\u{3e8}", "\u{3ea}", "\u{3ec}", "\u{3ee}", "\u{3f4}", "\u{3f7}", "\u{3f9}", "\u{3fd}", "\u{460}", "\u{462}", "\u{464}", "\u{466}", "\u{468}", "\u{46a}", "\u{46c}", "\u{46e}", "\u{470}", "\u{472}", "\u{474}", "\u{476}", "\u{478}", "\u{47a}", "\u{47c}", "\u{47e}", "\u{480}", "\u{48a}", "\u{48c}", "\u{48e}", "\u{490}", "\u{492}", "\u{494}", "\u{496}", "\u{498}", "\u{49a}", "\u{49c}", "\u{49e}", "\u{4a0}", "\u{4a2}", "\u{4a4}", "\u{4a6}", "\u{4a8}", "\u{4aa}", "\u{4ac}", "\u{4ae}", "\u{4b0}", "\u{4b2}", "\u{4b4}", "\u{4b6}", "\u{4b8}", "\u{4ba}", "\u{4bc}", "\u{4be}", "\u{4c0}", "\u{4c3}", "\u{4c5}", "\u{4c7}", "\u{4c9}", "\u{4cb}", "\u{4cd}", "\u{4d0}", "\u{4d2}", "\u{4d4}", "\u{4d6}", "\u{4d8}", "\u{4da}", "\u{4dc}", "\u{4de}", "\u{4e0}", "\u{4e2}", "\u{4e4}", "\u{4e6}", "\u{4e8}", "\u{4ea}", "\u{4ec}", "\u{4ee}", "\u{4f0}", "\u{4f2}", "\u{4f4}", "\u{4f6}", "\u{4f8}", "\u{4fa}", "\u{4fc}", "\u{4fe}", "\u{500}", "\u{502}", "\u{504}", "\u{506}", "\u{508}", "\u{50a}", "\u{50c}", "\u{50e}", "\u{510}", "\u{512}", "\u{514}", "\u{516}", "\u{518}", "\u{51a}", "\u{51c}", "\u{51e}", "\u{520}", "\u{522}", "\u{524}", "\u{526}", "\u{528}", "\u{52a}", "\u{52c}", "\u{52e}", "\u{531}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{13a0}", "\u{1c90}", "\u{1cbd}", "\u{1e00}", "\u{1e02}", "\u{1e04}", "\u{1e06}", "\u{1e08}", "\u{1e0a}", "\u{1e0c}", "\u{1e0e}", "\u{1e10}", "\u{1e12}", "\u{1e14}", "\u{1e16}", "\u{1e18}", "\u{1e1a}", "\u{1e1c}", "\u{1e1e}", "\u{1e20}", "\u{1e22}", "\u{1e24}", "\u{1e26}", "\u{1e28}", "\u{1e2a}", "\u{1e2c}", "\u{1e2e}", "\u{1e30}", "\u{1e32}", "\u{1e34}", "\u{1e36}", "\u{1e38}", "\u{1e3a}", "\u{1e3c}", "\u{1e3e}", "\u{1e40}", "\u{1e42}", "\u{1e44}", "\u{1e46}", "\u{1e48}", "\u{1e4a}", "\u{1e4c}", "\u{1e4e}", "\u{1e50}", "\u{1e52}", "\u{1e54}", "\u{1e56}", "\u{1e58}", "\u{1e5a}", "\u{1e5c}", "\u{1e5e}", "\u{1e60}", "\u{1e62}", "\u{1e64}", "\u{1e66}", "\u{1e68}", "\u{1e6a}", "\u{1e6c}", "\u{1e6e}", "\u{1e70}", "\u{1e72}", "\u{1e74}", "\u{1e76}", "\u{1e78}", "\u{1e7a}", "\u{1e7c}", "\u{1e7e}", "\u{1e80}", "\u{1e82}", "\u{1e84}", "\u{1e86}", "\u{1e88}", "\u{1e8a}", "\u{1e8c}", "\u{1e8e}", "\u{1e90}", "\u{1e92}", "\u{1e94}", "\u{1e9e}", "\u{1ea0}", "\u{1ea2}", "\u{1ea4}", "\u{1ea6}", "\u{1ea8}", "\u{1eaa}", "\u{1eac}", "\u{1eae}", "\u{1eb0}", "\u{1eb2}", "\u{1eb4}", "\u{1eb6}", "\u{1eb8}", "\u{1eba}", "\u{1ebc}", "\u{1ebe}", "\u{1ec0}", "\u{1ec2}", "\u{1ec4}", "\u{1ec6}", "\u{1ec8}", "\u{1eca}", "\u{1ecc}", "\u{1ece}", "\u{1ed0}", "\u{1ed2}", "\u{1ed4}", "\u{1ed6}", "\u{1ed8}", "\u{1eda}", "\u{1edc}", "\u{1ede}", "\u{1ee0}", "\u{1ee2}", "\u{1ee4}", "\u{1ee6}", "\u{1ee8}", "\u{1eea}", "\u{1eec}", "\u{1eee}", "\u{1ef0}", "\u{1ef2}", "\u{1ef4}", "\u{1ef6}", "\u{1ef8}", "\u{1efa}", "\u{1efc}", "\u{1efe}", "\u{1f08}", "\u{1f18}", "\u{1f28}", "\u{1f38}", "\u{1f48}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f68}", "\u{1fb8}", "\u{1fc8}", "\u{1fd8}", "\u{1fe8}", "\u{1ff8}", "\u{2102}", "\u{2107}", "\u{210b}", "\u{2110}", "\u{2115}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{2130}", "\u{213e}", "\u{2145}", "\u{2183}", "\u{2c00}", "\u{2c60}", "\u{2c62}", "\u{2c67}", "\u{2c69}", "\u{2c6b}", "\u{2c6d}", "\u{2c72}", "\u{2c75}", "\u{2c7e}", "\u{2c82}", "\u{2c84}", "\u{2c86}", "\u{2c88}", "\u{2c8a}", "\u{2c8c}", "\u{2c8e}", "\u{2c90}", "\u{2c92}", "\u{2c94}", "\u{2c96}", "\u{2c98}", "\u{2c9a}", "\u{2c9c}", "\u{2c9e}", "\u{2ca0}", "\u{2ca2}", "\u{2ca4}", "\u{2ca6}", "\u{2ca8}", "\u{2caa}", "\u{2cac}", "\u{2cae}", "\u{2cb0}", "\u{2cb2}", "\u{2cb4}", "\u{2cb6}", "\u{2cb8}", "\u{2cba}", "\u{2cbc}", "\u{2cbe}", "\u{2cc0}", "\u{2cc2}", "\u{2cc4}", "\u{2cc6}", "\u{2cc8}", "\u{2cca}", "\u{2ccc}", "\u{2cce}", "\u{2cd0}", "\u{2cd2}", "\u{2cd4}", "\u{2cd6}", "\u{2cd8}", "\u{2cda}", "\u{2cdc}", "\u{2cde}", "\u{2ce0}", "\u{2ce2}", "\u{2ceb}", "\u{2ced}", "\u{2cf2}", "\u{a640}", "\u{a642}", "\u{a644}", "\u{a646}", "\u{a648}", "\u{a64a}", "\u{a64c}", "\u{a64e}", "\u{a650}", "\u{a652}", "\u{a654}", "\u{a656}", "\u{a658}", "\u{a65a}", "\u{a65c}", "\u{a65e}", "\u{a660}", "\u{a662}", "\u{a664}", "\u{a666}", "\u{a668}", "\u{a66a}", "\u{a66c}", "\u{a680}", "\u{a682}", "\u{a684}", "\u{a686}", "\u{a688}", "\u{a68a}", "\u{a68c}", "\u{a68e}", "\u{a690}", "\u{a692}", "\u{a694}", "\u{a696}", "\u{a698}", "\u{a69a}", "\u{a722}", "\u{a724}", "\u{a726}", "\u{a728}", "\u{a72a}", "\u{a72c}", "\u{a72e}", "\u{a732}", "\u{a734}", "\u{a736}", "\u{a738}", "\u{a73a}", "\u{a73c}", "\u{a73e}", "\u{a740}", "\u{a742}", "\u{a744}", "\u{a746}", "\u{a748}", "\u{a74a}", "\u{a74c}", "\u{a74e}", "\u{a750}", "\u{a752}", "\u{a754}", "\u{a756}", "\u{a758}", "\u{a75a}", "\u{a75c}", "\u{a75e}", "\u{a760}", "\u{a762}", "\u{a764}", "\u{a766}", "\u{a768}", "\u{a76a}", "\u{a76c}", "\u{a76e}", "\u{a779}", "\u{a77b}", "\u{a77d}", "\u{a780}", "\u{a782}", "\u{a784}", "\u{a786}", "\u{a78b}", "\u{a78d}", "\u{a790}", "\u{a792}", "\u{a796}", "\u{a798}", "\u{a79a}", "\u{a79c}", "\u{a79e}", "\u{a7a0}", "\u{a7a2}", "\u{a7a4}", "\u{a7a6}", "\u{a7a8}", "\u{a7aa}", "\u{a7b0}", "\u{a7b6}", "\u{a7b8}", "\u{a7ba}", "\u{a7bc}", "\u{a7be}", "\u{a7c0}", "\u{a7c2}", "\u{a7c4}", "\u{a7c9}", "\u{a7d0}", "\u{a7d6}", "\u{a7d8}", "\u{a7f5}", "\u{ff21}", "\u{10400}", "\u{104b0}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10c80}", "\u{118a0}", "\u{16e40}", "\u{1d400}", "\u{1d434}", "\u{1d468}", "\u{1d49c}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4d0}", "\u{1d504}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d538}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d56c}", "\u{1d5a0}", "\u{1d5d4}", "\u{1d608}", "\u{1d63c}", "\u{1d670}", "\u{1d6a8}", "\u{1d6e2}", "\u{1d71c}", "\u{1d756}", "\u{1d790}", "\u{1d7ca}", "\u{1e900}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Uppercase_Letter}+$", "^\\p{gc=Uppercase_Letter}+$", "^\\p{Uppercase_Letter}+$", "^\\p{General_Category=Lu}+$", "^\\p{gc=Lu}+$", "^\\p{Lu}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_casedletter() { test_with_configs(unicode_escape_property_gc_casedletter_tc) } fn unicode_escape_property_gc_casedletter_tc(tc: TestConfig) { static CODE_POINTS: [&str; 1314] = [ "\u{61}", "\u{b5}", "\u{df}", "\u{f8}", "\u{101}", "\u{103}", "\u{105}", "\u{107}", "\u{109}", "\u{10b}", "\u{10d}", "\u{10f}", "\u{111}", "\u{113}", "\u{115}", "\u{117}", "\u{119}", "\u{11b}", "\u{11d}", "\u{11f}", "\u{121}", "\u{123}", "\u{125}", "\u{127}", "\u{129}", "\u{12b}", "\u{12d}", "\u{12f}", "\u{131}", "\u{133}", "\u{135}", "\u{137}", "\u{13a}", "\u{13c}", "\u{13e}", "\u{140}", "\u{142}", "\u{144}", "\u{146}", "\u{148}", "\u{14b}", "\u{14d}", "\u{14f}", "\u{151}", "\u{153}", "\u{155}", "\u{157}", "\u{159}", "\u{15b}", "\u{15d}", "\u{15f}", "\u{161}", "\u{163}", "\u{165}", "\u{167}", "\u{169}", "\u{16b}", "\u{16d}", "\u{16f}", "\u{171}", "\u{173}", "\u{175}", "\u{177}", "\u{17a}", "\u{17c}", "\u{17e}", "\u{183}", "\u{185}", "\u{188}", "\u{18c}", "\u{192}", "\u{195}", "\u{199}", "\u{19e}", "\u{1a1}", "\u{1a3}", "\u{1a5}", "\u{1a8}", "\u{1aa}", "\u{1ad}", "\u{1b0}", "\u{1b4}", "\u{1b6}", "\u{1b9}", "\u{1bd}", "\u{1c6}", "\u{1c9}", "\u{1cc}", "\u{1ce}", "\u{1d0}", "\u{1d2}", "\u{1d4}", "\u{1d6}", "\u{1d8}", "\u{1da}", "\u{1dc}", "\u{1df}", "\u{1e1}", "\u{1e3}", "\u{1e5}", "\u{1e7}", "\u{1e9}", "\u{1eb}", "\u{1ed}", "\u{1ef}", "\u{1f3}", "\u{1f5}", "\u{1f9}", "\u{1fb}", "\u{1fd}", "\u{1ff}", "\u{201}", "\u{203}", "\u{205}", "\u{207}", "\u{209}", "\u{20b}", "\u{20d}", "\u{20f}", "\u{211}", "\u{213}", "\u{215}", "\u{217}", "\u{219}", "\u{21b}", "\u{21d}", "\u{21f}", "\u{221}", "\u{223}", "\u{225}", "\u{227}", "\u{229}", "\u{22b}", "\u{22d}", "\u{22f}", "\u{231}", "\u{233}", "\u{23c}", "\u{23f}", "\u{242}", "\u{247}", "\u{249}", "\u{24b}", "\u{24d}", "\u{24f}", "\u{295}", "\u{371}", "\u{373}", "\u{377}", "\u{37b}", "\u{390}", "\u{3ac}", "\u{3d0}", "\u{3d5}", "\u{3d9}", "\u{3db}", "\u{3dd}", "\u{3df}", "\u{3e1}", "\u{3e3}", "\u{3e5}", "\u{3e7}", "\u{3e9}", "\u{3eb}", "\u{3ed}", "\u{3ef}", "\u{3f5}", "\u{3f8}", "\u{3fb}", "\u{430}", "\u{461}", "\u{463}", "\u{465}", "\u{467}", "\u{469}", "\u{46b}", "\u{46d}", "\u{46f}", "\u{471}", "\u{473}", "\u{475}", "\u{477}", "\u{479}", "\u{47b}", "\u{47d}", "\u{47f}", "\u{481}", "\u{48b}", "\u{48d}", "\u{48f}", "\u{491}", "\u{493}", "\u{495}", "\u{497}", "\u{499}", "\u{49b}", "\u{49d}", "\u{49f}", "\u{4a1}", "\u{4a3}", "\u{4a5}", "\u{4a7}", "\u{4a9}", "\u{4ab}", "\u{4ad}", "\u{4af}", "\u{4b1}", "\u{4b3}", "\u{4b5}", "\u{4b7}", "\u{4b9}", "\u{4bb}", "\u{4bd}", "\u{4bf}", "\u{4c2}", "\u{4c4}", "\u{4c6}", "\u{4c8}", "\u{4ca}", "\u{4cc}", "\u{4ce}", "\u{4d1}", "\u{4d3}", "\u{4d5}", "\u{4d7}", "\u{4d9}", "\u{4db}", "\u{4dd}", "\u{4df}", "\u{4e1}", "\u{4e3}", "\u{4e5}", "\u{4e7}", "\u{4e9}", "\u{4eb}", "\u{4ed}", "\u{4ef}", "\u{4f1}", "\u{4f3}", "\u{4f5}", "\u{4f7}", "\u{4f9}", "\u{4fb}", "\u{4fd}", "\u{4ff}", "\u{501}", "\u{503}", "\u{505}", "\u{507}", "\u{509}", "\u{50b}", "\u{50d}", "\u{50f}", "\u{511}", "\u{513}", "\u{515}", "\u{517}", "\u{519}", "\u{51b}", "\u{51d}", "\u{51f}", "\u{521}", "\u{523}", "\u{525}", "\u{527}", "\u{529}", "\u{52b}", "\u{52d}", "\u{52f}", "\u{560}", "\u{10d0}", "\u{10fd}", "\u{13f8}", "\u{1c80}", "\u{1d00}", "\u{1d6b}", "\u{1d79}", "\u{1e01}", "\u{1e03}", "\u{1e05}", "\u{1e07}", "\u{1e09}", "\u{1e0b}", "\u{1e0d}", "\u{1e0f}", "\u{1e11}", "\u{1e13}", "\u{1e15}", "\u{1e17}", "\u{1e19}", "\u{1e1b}", "\u{1e1d}", "\u{1e1f}", "\u{1e21}", "\u{1e23}", "\u{1e25}", "\u{1e27}", "\u{1e29}", "\u{1e2b}", "\u{1e2d}", "\u{1e2f}", "\u{1e31}", "\u{1e33}", "\u{1e35}", "\u{1e37}", "\u{1e39}", "\u{1e3b}", "\u{1e3d}", "\u{1e3f}", "\u{1e41}", "\u{1e43}", "\u{1e45}", "\u{1e47}", "\u{1e49}", "\u{1e4b}", "\u{1e4d}", "\u{1e4f}", "\u{1e51}", "\u{1e53}", "\u{1e55}", "\u{1e57}", "\u{1e59}", "\u{1e5b}", "\u{1e5d}", "\u{1e5f}", "\u{1e61}", "\u{1e63}", "\u{1e65}", "\u{1e67}", "\u{1e69}", "\u{1e6b}", "\u{1e6d}", "\u{1e6f}", "\u{1e71}", "\u{1e73}", "\u{1e75}", "\u{1e77}", "\u{1e79}", "\u{1e7b}", "\u{1e7d}", "\u{1e7f}", "\u{1e81}", "\u{1e83}", "\u{1e85}", "\u{1e87}", "\u{1e89}", "\u{1e8b}", "\u{1e8d}", "\u{1e8f}", "\u{1e91}", "\u{1e93}", "\u{1e95}", "\u{1e9f}", "\u{1ea1}", "\u{1ea3}", "\u{1ea5}", "\u{1ea7}", "\u{1ea9}", "\u{1eab}", "\u{1ead}", "\u{1eaf}", "\u{1eb1}", "\u{1eb3}", "\u{1eb5}", "\u{1eb7}", "\u{1eb9}", "\u{1ebb}", "\u{1ebd}", "\u{1ebf}", "\u{1ec1}", "\u{1ec3}", "\u{1ec5}", "\u{1ec7}", "\u{1ec9}", "\u{1ecb}", "\u{1ecd}", "\u{1ecf}", "\u{1ed1}", "\u{1ed3}", "\u{1ed5}", "\u{1ed7}", "\u{1ed9}", "\u{1edb}", "\u{1edd}", "\u{1edf}", "\u{1ee1}", "\u{1ee3}", "\u{1ee5}", "\u{1ee7}", "\u{1ee9}", "\u{1eeb}", "\u{1eed}", "\u{1eef}", "\u{1ef1}", "\u{1ef3}", "\u{1ef5}", "\u{1ef7}", "\u{1ef9}", "\u{1efb}", "\u{1efd}", "\u{1eff}", "\u{1f10}", "\u{1f20}", "\u{1f30}", "\u{1f40}", "\u{1f50}", "\u{1f60}", "\u{1f70}", "\u{1f80}", "\u{1f90}", "\u{1fa0}", "\u{1fb0}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{210a}", "\u{210e}", "\u{2113}", "\u{212f}", "\u{2134}", "\u{2139}", "\u{213c}", "\u{2146}", "\u{214e}", "\u{2184}", "\u{2c30}", "\u{2c61}", "\u{2c65}", "\u{2c68}", "\u{2c6a}", "\u{2c6c}", "\u{2c71}", "\u{2c73}", "\u{2c76}", "\u{2c81}", "\u{2c83}", "\u{2c85}", "\u{2c87}", "\u{2c89}", "\u{2c8b}", "\u{2c8d}", "\u{2c8f}", "\u{2c91}", "\u{2c93}", "\u{2c95}", "\u{2c97}", "\u{2c99}", "\u{2c9b}", "\u{2c9d}", "\u{2c9f}", "\u{2ca1}", "\u{2ca3}", "\u{2ca5}", "\u{2ca7}", "\u{2ca9}", "\u{2cab}", "\u{2cad}", "\u{2caf}", "\u{2cb1}", "\u{2cb3}", "\u{2cb5}", "\u{2cb7}", "\u{2cb9}", "\u{2cbb}", "\u{2cbd}", "\u{2cbf}", "\u{2cc1}", "\u{2cc3}", "\u{2cc5}", "\u{2cc7}", "\u{2cc9}", "\u{2ccb}", "\u{2ccd}", "\u{2ccf}", "\u{2cd1}", "\u{2cd3}", "\u{2cd5}", "\u{2cd7}", "\u{2cd9}", "\u{2cdb}", "\u{2cdd}", "\u{2cdf}", "\u{2ce1}", "\u{2ce3}", "\u{2cec}", "\u{2cee}", "\u{2cf3}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a641}", "\u{a643}", "\u{a645}", "\u{a647}", "\u{a649}", "\u{a64b}", "\u{a64d}", "\u{a64f}", "\u{a651}", "\u{a653}", "\u{a655}", "\u{a657}", "\u{a659}", "\u{a65b}", "\u{a65d}", "\u{a65f}", "\u{a661}", "\u{a663}", "\u{a665}", "\u{a667}", "\u{a669}", "\u{a66b}", "\u{a66d}", "\u{a681}", "\u{a683}", "\u{a685}", "\u{a687}", "\u{a689}", "\u{a68b}", "\u{a68d}", "\u{a68f}", "\u{a691}", "\u{a693}", "\u{a695}", "\u{a697}", "\u{a699}", "\u{a69b}", "\u{a723}", "\u{a725}", "\u{a727}", "\u{a729}", "\u{a72b}", "\u{a72d}", "\u{a72f}", "\u{a733}", "\u{a735}", "\u{a737}", "\u{a739}", "\u{a73b}", "\u{a73d}", "\u{a73f}", "\u{a741}", "\u{a743}", "\u{a745}", "\u{a747}", "\u{a749}", "\u{a74b}", "\u{a74d}", "\u{a74f}", "\u{a751}", "\u{a753}", "\u{a755}", "\u{a757}", "\u{a759}", "\u{a75b}", "\u{a75d}", "\u{a75f}", "\u{a761}", "\u{a763}", "\u{a765}", "\u{a767}", "\u{a769}", "\u{a76b}", "\u{a76d}", "\u{a76f}", "\u{a771}", "\u{a77a}", "\u{a77c}", "\u{a77f}", "\u{a781}", "\u{a783}", "\u{a785}", "\u{a787}", "\u{a78c}", "\u{a78e}", "\u{a791}", "\u{a793}", "\u{a797}", "\u{a799}", "\u{a79b}", "\u{a79d}", "\u{a79f}", "\u{a7a1}", "\u{a7a3}", "\u{a7a5}", "\u{a7a7}", "\u{a7a9}", "\u{a7af}", "\u{a7b5}", "\u{a7b7}", "\u{a7b9}", "\u{a7bb}", "\u{a7bd}", "\u{a7bf}", "\u{a7c1}", "\u{a7c3}", "\u{a7c8}", "\u{a7ca}", "\u{a7d1}", "\u{a7d3}", "\u{a7d5}", "\u{a7d7}", "\u{a7d9}", "\u{a7f6}", "\u{a7fa}", "\u{ab30}", "\u{ab60}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff41}", "\u{10428}", "\u{104d8}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10cc0}", "\u{118c0}", "\u{16e60}", "\u{1d41a}", "\u{1d44e}", "\u{1d456}", "\u{1d482}", "\u{1d4b6}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d4ea}", "\u{1d51e}", "\u{1d552}", "\u{1d586}", "\u{1d5ba}", "\u{1d5ee}", "\u{1d622}", "\u{1d656}", "\u{1d68a}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1d7cb}", "\u{1df00}", "\u{1df0b}", "\u{1df25}", "\u{1e922}", "\u{1c5}", "\u{1c8}", "\u{1cb}", "\u{1f2}", "\u{1f88}", "\u{1f98}", "\u{1fa8}", "\u{1fbc}", "\u{1fcc}", "\u{1ffc}", "\u{41}", "\u{c0}", "\u{d8}", "\u{100}", "\u{102}", "\u{104}", "\u{106}", "\u{108}", "\u{10a}", "\u{10c}", "\u{10e}", "\u{110}", "\u{112}", "\u{114}", "\u{116}", "\u{118}", "\u{11a}", "\u{11c}", "\u{11e}", "\u{120}", "\u{122}", "\u{124}", "\u{126}", "\u{128}", "\u{12a}", "\u{12c}", "\u{12e}", "\u{130}", "\u{132}", "\u{134}", "\u{136}", "\u{139}", "\u{13b}", "\u{13d}", "\u{13f}", "\u{141}", "\u{143}", "\u{145}", "\u{147}", "\u{14a}", "\u{14c}", "\u{14e}", "\u{150}", "\u{152}", "\u{154}", "\u{156}", "\u{158}", "\u{15a}", "\u{15c}", "\u{15e}", "\u{160}", "\u{162}", "\u{164}", "\u{166}", "\u{168}", "\u{16a}", "\u{16c}", "\u{16e}", "\u{170}", "\u{172}", "\u{174}", "\u{176}", "\u{178}", "\u{17b}", "\u{17d}", "\u{181}", "\u{184}", "\u{186}", "\u{189}", "\u{18e}", "\u{193}", "\u{196}", "\u{19c}", "\u{19f}", "\u{1a2}", "\u{1a4}", "\u{1a6}", "\u{1a9}", "\u{1ac}", "\u{1ae}", "\u{1b1}", "\u{1b5}", "\u{1b7}", "\u{1bc}", "\u{1c4}", "\u{1c7}", "\u{1ca}", "\u{1cd}", "\u{1cf}", "\u{1d1}", "\u{1d3}", "\u{1d5}", "\u{1d7}", "\u{1d9}", "\u{1db}", "\u{1de}", "\u{1e0}", "\u{1e2}", "\u{1e4}", "\u{1e6}", "\u{1e8}", "\u{1ea}", "\u{1ec}", "\u{1ee}", "\u{1f1}", "\u{1f4}", "\u{1f6}", "\u{1fa}", "\u{1fc}", "\u{1fe}", "\u{200}", "\u{202}", "\u{204}", "\u{206}", "\u{208}", "\u{20a}", "\u{20c}", "\u{20e}", "\u{210}", "\u{212}", "\u{214}", "\u{216}", "\u{218}", "\u{21a}", "\u{21c}", "\u{21e}", "\u{220}", "\u{222}", "\u{224}", "\u{226}", "\u{228}", "\u{22a}", "\u{22c}", "\u{22e}", "\u{230}", "\u{232}", "\u{23a}", "\u{23d}", "\u{241}", "\u{243}", "\u{248}", "\u{24a}", "\u{24c}", "\u{24e}", "\u{370}", "\u{372}", "\u{376}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{391}", "\u{3a3}", "\u{3cf}", "\u{3d2}", "\u{3d8}", "\u{3da}", "\u{3dc}", "\u{3de}", "\u{3e0}", "\u{3e2}", "\u{3e4}", "\u{3e6}", "\u{3e8}", "\u{3ea}", "\u{3ec}", "\u{3ee}", "\u{3f4}", "\u{3f7}", "\u{3f9}", "\u{3fd}", "\u{460}", "\u{462}", "\u{464}", "\u{466}", "\u{468}", "\u{46a}", "\u{46c}", "\u{46e}", "\u{470}", "\u{472}", "\u{474}", "\u{476}", "\u{478}", "\u{47a}", "\u{47c}", "\u{47e}", "\u{480}", "\u{48a}", "\u{48c}", "\u{48e}", "\u{490}", "\u{492}", "\u{494}", "\u{496}", "\u{498}", "\u{49a}", "\u{49c}", "\u{49e}", "\u{4a0}", "\u{4a2}", "\u{4a4}", "\u{4a6}", "\u{4a8}", "\u{4aa}", "\u{4ac}", "\u{4ae}", "\u{4b0}", "\u{4b2}", "\u{4b4}", "\u{4b6}", "\u{4b8}", "\u{4ba}", "\u{4bc}", "\u{4be}", "\u{4c0}", "\u{4c3}", "\u{4c5}", "\u{4c7}", "\u{4c9}", "\u{4cb}", "\u{4cd}", "\u{4d0}", "\u{4d2}", "\u{4d4}", "\u{4d6}", "\u{4d8}", "\u{4da}", "\u{4dc}", "\u{4de}", "\u{4e0}", "\u{4e2}", "\u{4e4}", "\u{4e6}", "\u{4e8}", "\u{4ea}", "\u{4ec}", "\u{4ee}", "\u{4f0}", "\u{4f2}", "\u{4f4}", "\u{4f6}", "\u{4f8}", "\u{4fa}", "\u{4fc}", "\u{4fe}", "\u{500}", "\u{502}", "\u{504}", "\u{506}", "\u{508}", "\u{50a}", "\u{50c}", "\u{50e}", "\u{510}", "\u{512}", "\u{514}", "\u{516}", "\u{518}", "\u{51a}", "\u{51c}", "\u{51e}", "\u{520}", "\u{522}", "\u{524}", "\u{526}", "\u{528}", "\u{52a}", "\u{52c}", "\u{52e}", "\u{531}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{13a0}", "\u{1c90}", "\u{1cbd}", "\u{1e00}", "\u{1e02}", "\u{1e04}", "\u{1e06}", "\u{1e08}", "\u{1e0a}", "\u{1e0c}", "\u{1e0e}", "\u{1e10}", "\u{1e12}", "\u{1e14}", "\u{1e16}", "\u{1e18}", "\u{1e1a}", "\u{1e1c}", "\u{1e1e}", "\u{1e20}", "\u{1e22}", "\u{1e24}", "\u{1e26}", "\u{1e28}", "\u{1e2a}", "\u{1e2c}", "\u{1e2e}", "\u{1e30}", "\u{1e32}", "\u{1e34}", "\u{1e36}", "\u{1e38}", "\u{1e3a}", "\u{1e3c}", "\u{1e3e}", "\u{1e40}", "\u{1e42}", "\u{1e44}", "\u{1e46}", "\u{1e48}", "\u{1e4a}", "\u{1e4c}", "\u{1e4e}", "\u{1e50}", "\u{1e52}", "\u{1e54}", "\u{1e56}", "\u{1e58}", "\u{1e5a}", "\u{1e5c}", "\u{1e5e}", "\u{1e60}", "\u{1e62}", "\u{1e64}", "\u{1e66}", "\u{1e68}", "\u{1e6a}", "\u{1e6c}", "\u{1e6e}", "\u{1e70}", "\u{1e72}", "\u{1e74}", "\u{1e76}", "\u{1e78}", "\u{1e7a}", "\u{1e7c}", "\u{1e7e}", "\u{1e80}", "\u{1e82}", "\u{1e84}", "\u{1e86}", "\u{1e88}", "\u{1e8a}", "\u{1e8c}", "\u{1e8e}", "\u{1e90}", "\u{1e92}", "\u{1e94}", "\u{1e9e}", "\u{1ea0}", "\u{1ea2}", "\u{1ea4}", "\u{1ea6}", "\u{1ea8}", "\u{1eaa}", "\u{1eac}", "\u{1eae}", "\u{1eb0}", "\u{1eb2}", "\u{1eb4}", "\u{1eb6}", "\u{1eb8}", "\u{1eba}", "\u{1ebc}", "\u{1ebe}", "\u{1ec0}", "\u{1ec2}", "\u{1ec4}", "\u{1ec6}", "\u{1ec8}", "\u{1eca}", "\u{1ecc}", "\u{1ece}", "\u{1ed0}", "\u{1ed2}", "\u{1ed4}", "\u{1ed6}", "\u{1ed8}", "\u{1eda}", "\u{1edc}", "\u{1ede}", "\u{1ee0}", "\u{1ee2}", "\u{1ee4}", "\u{1ee6}", "\u{1ee8}", "\u{1eea}", "\u{1eec}", "\u{1eee}", "\u{1ef0}", "\u{1ef2}", "\u{1ef4}", "\u{1ef6}", "\u{1ef8}", "\u{1efa}", "\u{1efc}", "\u{1efe}", "\u{1f08}", "\u{1f18}", "\u{1f28}", "\u{1f38}", "\u{1f48}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f68}", "\u{1fb8}", "\u{1fc8}", "\u{1fd8}", "\u{1fe8}", "\u{1ff8}", "\u{2102}", "\u{2107}", "\u{210b}", "\u{2110}", "\u{2115}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{2130}", "\u{213e}", "\u{2145}", "\u{2183}", "\u{2c00}", "\u{2c60}", "\u{2c62}", "\u{2c67}", "\u{2c69}", "\u{2c6b}", "\u{2c6d}", "\u{2c72}", "\u{2c75}", "\u{2c7e}", "\u{2c82}", "\u{2c84}", "\u{2c86}", "\u{2c88}", "\u{2c8a}", "\u{2c8c}", "\u{2c8e}", "\u{2c90}", "\u{2c92}", "\u{2c94}", "\u{2c96}", "\u{2c98}", "\u{2c9a}", "\u{2c9c}", "\u{2c9e}", "\u{2ca0}", "\u{2ca2}", "\u{2ca4}", "\u{2ca6}", "\u{2ca8}", "\u{2caa}", "\u{2cac}", "\u{2cae}", "\u{2cb0}", "\u{2cb2}", "\u{2cb4}", "\u{2cb6}", "\u{2cb8}", "\u{2cba}", "\u{2cbc}", "\u{2cbe}", "\u{2cc0}", "\u{2cc2}", "\u{2cc4}", "\u{2cc6}", "\u{2cc8}", "\u{2cca}", "\u{2ccc}", "\u{2cce}", "\u{2cd0}", "\u{2cd2}", "\u{2cd4}", "\u{2cd6}", "\u{2cd8}", "\u{2cda}", "\u{2cdc}", "\u{2cde}", "\u{2ce0}", "\u{2ce2}", "\u{2ceb}", "\u{2ced}", "\u{2cf2}", "\u{a640}", "\u{a642}", "\u{a644}", "\u{a646}", "\u{a648}", "\u{a64a}", "\u{a64c}", "\u{a64e}", "\u{a650}", "\u{a652}", "\u{a654}", "\u{a656}", "\u{a658}", "\u{a65a}", "\u{a65c}", "\u{a65e}", "\u{a660}", "\u{a662}", "\u{a664}", "\u{a666}", "\u{a668}", "\u{a66a}", "\u{a66c}", "\u{a680}", "\u{a682}", "\u{a684}", "\u{a686}", "\u{a688}", "\u{a68a}", "\u{a68c}", "\u{a68e}", "\u{a690}", "\u{a692}", "\u{a694}", "\u{a696}", "\u{a698}", "\u{a69a}", "\u{a722}", "\u{a724}", "\u{a726}", "\u{a728}", "\u{a72a}", "\u{a72c}", "\u{a72e}", "\u{a732}", "\u{a734}", "\u{a736}", "\u{a738}", "\u{a73a}", "\u{a73c}", "\u{a73e}", "\u{a740}", "\u{a742}", "\u{a744}", "\u{a746}", "\u{a748}", "\u{a74a}", "\u{a74c}", "\u{a74e}", "\u{a750}", "\u{a752}", "\u{a754}", "\u{a756}", "\u{a758}", "\u{a75a}", "\u{a75c}", "\u{a75e}", "\u{a760}", "\u{a762}", "\u{a764}", "\u{a766}", "\u{a768}", "\u{a76a}", "\u{a76c}", "\u{a76e}", "\u{a779}", "\u{a77b}", "\u{a77d}", "\u{a780}", "\u{a782}", "\u{a784}", "\u{a786}", "\u{a78b}", "\u{a78d}", "\u{a790}", "\u{a792}", "\u{a796}", "\u{a798}", "\u{a79a}", "\u{a79c}", "\u{a79e}", "\u{a7a0}", "\u{a7a2}", "\u{a7a4}", "\u{a7a6}", "\u{a7a8}", "\u{a7aa}", "\u{a7b0}", "\u{a7b6}", "\u{a7b8}", "\u{a7ba}", "\u{a7bc}", "\u{a7be}", "\u{a7c0}", "\u{a7c2}", "\u{a7c4}", "\u{a7c9}", "\u{a7d0}", "\u{a7d6}", "\u{a7d8}", "\u{a7f5}", "\u{ff21}", "\u{10400}", "\u{104b0}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10c80}", "\u{118a0}", "\u{16e40}", "\u{1d400}", "\u{1d434}", "\u{1d468}", "\u{1d49c}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4d0}", "\u{1d504}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d538}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d56c}", "\u{1d5a0}", "\u{1d5d4}", "\u{1d608}", "\u{1d63c}", "\u{1d670}", "\u{1d6a8}", "\u{1d6e2}", "\u{1d71c}", "\u{1d756}", "\u{1d790}", "\u{1d7ca}", "\u{1e900}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Cased_Letter}+$", "^\\p{gc=Cased_Letter}+$", "^\\p{Cased_Letter}+$", "^\\p{General_Category=LC}+$", "^\\p{gc=LC}+$", "^\\p{LC}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_other() { test_with_configs(unicode_escape_property_gc_other_tc) } fn unicode_escape_property_gc_other_tc(tc: TestConfig) { const CODE_POINTS: [&str; 733] = [ "\u{0}", "\u{7f}", "\u{ad}", "\u{600}", "\u{61c}", "\u{6dd}", "\u{70f}", "\u{890}", "\u{8e2}", "\u{180e}", "\u{200b}", "\u{202a}", "\u{2060}", "\u{2066}", "\u{feff}", "\u{fff9}", "\u{110bd}", "\u{110cd}", "\u{13430}", "\u{1bca0}", "\u{1d173}", "\u{e0001}", "\u{e0020}", "\u{378}", "\u{380}", "\u{38b}", "\u{38d}", "\u{3a2}", "\u{530}", "\u{557}", "\u{58b}", "\u{590}", "\u{5c8}", "\u{5eb}", "\u{5f5}", "\u{70e}", "\u{74b}", "\u{7b2}", "\u{7fb}", "\u{82e}", "\u{83f}", "\u{85c}", "\u{85f}", "\u{86b}", "\u{88f}", "\u{892}", "\u{984}", "\u{98d}", "\u{991}", "\u{9a9}", "\u{9b1}", "\u{9b3}", "\u{9ba}", "\u{9c5}", "\u{9c9}", "\u{9cf}", "\u{9d8}", "\u{9de}", "\u{9e4}", "\u{9ff}", "\u{a04}", "\u{a0b}", "\u{a11}", "\u{a29}", "\u{a31}", "\u{a34}", "\u{a37}", "\u{a3a}", "\u{a3d}", "\u{a43}", "\u{a49}", "\u{a4e}", "\u{a52}", "\u{a5d}", "\u{a5f}", "\u{a77}", "\u{a84}", "\u{a8e}", "\u{a92}", "\u{aa9}", "\u{ab1}", "\u{ab4}", "\u{aba}", "\u{ac6}", "\u{aca}", "\u{ace}", "\u{ad1}", "\u{ae4}", "\u{af2}", "\u{b00}", "\u{b04}", "\u{b0d}", "\u{b11}", "\u{b29}", "\u{b31}", "\u{b34}", "\u{b3a}", "\u{b45}", "\u{b49}", "\u{b4e}", "\u{b58}", "\u{b5e}", "\u{b64}", "\u{b78}", "\u{b84}", "\u{b8b}", "\u{b91}", "\u{b96}", "\u{b9b}", "\u{b9d}", "\u{ba0}", "\u{ba5}", "\u{bab}", "\u{bba}", "\u{bc3}", "\u{bc9}", "\u{bce}", "\u{bd1}", "\u{bd8}", "\u{bfb}", "\u{c0d}", "\u{c11}", "\u{c29}", "\u{c3a}", "\u{c45}", "\u{c49}", "\u{c4e}", "\u{c57}", "\u{c5b}", "\u{c5e}", "\u{c64}", "\u{c70}", "\u{c8d}", "\u{c91}", "\u{ca9}", "\u{cb4}", "\u{cba}", "\u{cc5}", "\u{cc9}", "\u{cce}", "\u{cd7}", "\u{cdf}", "\u{ce4}", "\u{cf0}", "\u{cf4}", "\u{d0d}", "\u{d11}", "\u{d45}", "\u{d49}", "\u{d50}", "\u{d64}", "\u{d80}", "\u{d84}", "\u{d97}", "\u{db2}", "\u{dbc}", "\u{dbe}", "\u{dc7}", "\u{dcb}", "\u{dd5}", "\u{dd7}", "\u{de0}", "\u{df0}", "\u{df5}", "\u{e3b}", "\u{e5c}", "\u{e83}", "\u{e85}", "\u{e8b}", "\u{ea4}", "\u{ea6}", "\u{ebe}", "\u{ec5}", "\u{ec7}", "\u{ecf}", "\u{eda}", "\u{ee0}", "\u{f48}", "\u{f6d}", "\u{f98}", "\u{fbd}", "\u{fcd}", "\u{fdb}", "\u{10c6}", "\u{10c8}", "\u{10ce}", "\u{1249}", "\u{124e}", "\u{1257}", "\u{1259}", "\u{125e}", "\u{1289}", "\u{128e}", "\u{12b1}", "\u{12b6}", "\u{12bf}", "\u{12c1}", "\u{12c6}", "\u{12d7}", "\u{1311}", "\u{1316}", "\u{135b}", "\u{137d}", "\u{139a}", "\u{13f6}", "\u{13fe}", "\u{169d}", "\u{16f9}", "\u{1716}", "\u{1737}", "\u{1754}", "\u{176d}", "\u{1771}", "\u{1774}", "\u{17de}", "\u{17ea}", "\u{17fa}", "\u{181a}", "\u{1879}", "\u{18ab}", "\u{18f6}", "\u{191f}", "\u{192c}", "\u{193c}", "\u{1941}", "\u{196e}", "\u{1975}", "\u{19ac}", "\u{19ca}", "\u{19db}", "\u{1a1c}", "\u{1a5f}", "\u{1a7d}", "\u{1a8a}", "\u{1a9a}", "\u{1aae}", "\u{1acf}", "\u{1b4d}", "\u{1b7f}", "\u{1bf4}", "\u{1c38}", "\u{1c4a}", "\u{1c89}", "\u{1cbb}", "\u{1cc8}", "\u{1cfb}", "\u{1f16}", "\u{1f1e}", "\u{1f46}", "\u{1f4e}", "\u{1f58}", "\u{1f5a}", "\u{1f5c}", "\u{1f5e}", "\u{1f7e}", "\u{1fb5}", "\u{1fc5}", "\u{1fd4}", "\u{1fdc}", "\u{1ff0}", "\u{1ff5}", "\u{1fff}", "\u{2065}", "\u{2072}", "\u{208f}", "\u{209d}", "\u{20c1}", "\u{20f1}", "\u{218c}", "\u{2427}", "\u{244b}", "\u{2b74}", "\u{2b96}", "\u{2cf4}", "\u{2d26}", "\u{2d28}", "\u{2d2e}", "\u{2d68}", "\u{2d71}", "\u{2d97}", "\u{2da7}", "\u{2daf}", "\u{2db7}", "\u{2dbf}", "\u{2dc7}", "\u{2dcf}", "\u{2dd7}", "\u{2ddf}", "\u{2e5e}", "\u{2e9a}", "\u{2ef4}", "\u{2fd6}", "\u{3040}", "\u{3097}", "\u{3100}", "\u{3130}", "\u{318f}", "\u{31e4}", "\u{321f}", "\u{a48d}", "\u{a4c7}", "\u{a62c}", "\u{a6f8}", "\u{a7cb}", "\u{a7d2}", "\u{a7d4}", "\u{a7da}", "\u{a82d}", "\u{a83a}", "\u{a878}", "\u{a8c6}", "\u{a8da}", "\u{a954}", "\u{a97d}", "\u{a9ce}", "\u{a9da}", "\u{a9ff}", "\u{aa37}", "\u{aa4e}", "\u{aa5a}", "\u{aac3}", "\u{aaf7}", "\u{ab07}", "\u{ab0f}", "\u{ab17}", "\u{ab27}", "\u{ab2f}", "\u{ab6c}", "\u{abee}", "\u{abfa}", "\u{d7a4}", "\u{d7c7}", "\u{d7fc}", "\u{fa6e}", "\u{fada}", "\u{fb07}", "\u{fb18}", "\u{fb37}", "\u{fb3d}", "\u{fb3f}", "\u{fb42}", "\u{fb45}", "\u{fbc3}", "\u{fd90}", "\u{fdc8}", "\u{fdd0}", "\u{fe1a}", "\u{fe53}", "\u{fe67}", "\u{fe6c}", "\u{fe75}", "\u{fefd}", "\u{ff00}", "\u{ffbf}", "\u{ffc8}", "\u{ffd0}", "\u{ffd8}", "\u{ffdd}", "\u{ffe7}", "\u{ffef}", "\u{fffe}", "\u{1000c}", "\u{10027}", "\u{1003b}", "\u{1003e}", "\u{1004e}", "\u{1005e}", "\u{100fb}", "\u{10103}", "\u{10134}", "\u{1018f}", "\u{1019d}", "\u{101a1}", "\u{101fe}", "\u{1029d}", "\u{102d1}", "\u{102fc}", "\u{10324}", "\u{1034b}", "\u{1037b}", "\u{1039e}", "\u{103c4}", "\u{103d6}", "\u{1049e}", "\u{104aa}", "\u{104d4}", "\u{104fc}", "\u{10528}", "\u{10564}", "\u{1057b}", "\u{1058b}", "\u{10593}", "\u{10596}", "\u{105a2}", "\u{105b2}", "\u{105ba}", "\u{105bd}", "\u{10737}", "\u{10756}", "\u{10768}", "\u{10786}", "\u{107b1}", "\u{107bb}", "\u{10806}", "\u{10809}", "\u{10836}", "\u{10839}", "\u{1083d}", "\u{10856}", "\u{1089f}", "\u{108b0}", "\u{108f3}", "\u{108f6}", "\u{1091c}", "\u{1093a}", "\u{10940}", "\u{109b8}", "\u{109d0}", "\u{10a04}", "\u{10a07}", "\u{10a14}", "\u{10a18}", "\u{10a36}", "\u{10a3b}", "\u{10a49}", "\u{10a59}", "\u{10aa0}", "\u{10ae7}", "\u{10af7}", "\u{10b36}", "\u{10b56}", "\u{10b73}", "\u{10b92}", "\u{10b9d}", "\u{10bb0}", "\u{10c49}", "\u{10cb3}", "\u{10cf3}", "\u{10d28}", "\u{10d3a}", "\u{10e7f}", "\u{10eaa}", "\u{10eae}", "\u{10eb2}", "\u{10f28}", "\u{10f5a}", "\u{10f8a}", "\u{10fcc}", "\u{10ff7}", "\u{1104e}", "\u{11076}", "\u{110c3}", "\u{110ce}", "\u{110e9}", "\u{110fa}", "\u{11135}", "\u{11148}", "\u{11177}", "\u{111e0}", "\u{111f5}", "\u{11212}", "\u{11242}", "\u{11287}", "\u{11289}", "\u{1128e}", "\u{1129e}", "\u{112aa}", "\u{112eb}", "\u{112fa}", "\u{11304}", "\u{1130d}", "\u{11311}", "\u{11329}", "\u{11331}", "\u{11334}", "\u{1133a}", "\u{11345}", "\u{11349}", "\u{1134e}", "\u{11351}", "\u{11358}", "\u{11364}", "\u{1136d}", "\u{11375}", "\u{1145c}", "\u{11462}", "\u{114c8}", "\u{114da}", "\u{115b6}", "\u{115de}", "\u{11645}", "\u{1165a}", "\u{1166d}", "\u{116ba}", "\u{116ca}", "\u{1171b}", "\u{1172c}", "\u{11747}", "\u{1183c}", "\u{118f3}", "\u{11907}", "\u{1190a}", "\u{11914}", "\u{11917}", "\u{11936}", "\u{11939}", "\u{11947}", "\u{1195a}", "\u{119a8}", "\u{119d8}", "\u{119e5}", "\u{11a48}", "\u{11aa3}", "\u{11af9}", "\u{11b0a}", "\u{11c09}", "\u{11c37}", "\u{11c46}", "\u{11c6d}", "\u{11c90}", "\u{11ca8}", "\u{11cb7}", "\u{11d07}", "\u{11d0a}", "\u{11d37}", "\u{11d3b}", "\u{11d3e}", "\u{11d48}", "\u{11d5a}", "\u{11d66}", "\u{11d69}", "\u{11d8f}", "\u{11d92}", "\u{11d99}", "\u{11daa}", "\u{11ef9}", "\u{11f11}", "\u{11f3b}", "\u{11f5a}", "\u{11fb1}", "\u{11ff2}", "\u{1239a}", "\u{1246f}", "\u{12475}", "\u{12544}", "\u{12ff3}", "\u{13456}", "\u{14647}", "\u{16a39}", "\u{16a5f}", "\u{16a6a}", "\u{16abf}", "\u{16aca}", "\u{16aee}", "\u{16af6}", "\u{16b46}", "\u{16b5a}", "\u{16b62}", "\u{16b78}", "\u{16b90}", "\u{16e9b}", "\u{16f4b}", "\u{16f88}", "\u{16fa0}", "\u{16fe5}", "\u{16ff2}", "\u{187f8}", "\u{18cd6}", "\u{18d09}", "\u{1aff4}", "\u{1affc}", "\u{1afff}", "\u{1b123}", "\u{1b133}", "\u{1b153}", "\u{1b156}", "\u{1b168}", "\u{1b2fc}", "\u{1bc6b}", "\u{1bc7d}", "\u{1bc89}", "\u{1bc9a}", "\u{1bca4}", "\u{1cf2e}", "\u{1cf47}", "\u{1cfc4}", "\u{1d0f6}", "\u{1d127}", "\u{1d1eb}", "\u{1d246}", "\u{1d2d4}", "\u{1d2f4}", "\u{1d357}", "\u{1d379}", "\u{1d455}", "\u{1d49d}", "\u{1d4a0}", "\u{1d4a3}", "\u{1d4a7}", "\u{1d4ad}", "\u{1d4ba}", "\u{1d4bc}", "\u{1d4c4}", "\u{1d506}", "\u{1d50b}", "\u{1d515}", "\u{1d51d}", "\u{1d53a}", "\u{1d53f}", "\u{1d545}", "\u{1d547}", "\u{1d551}", "\u{1d6a6}", "\u{1d7cc}", "\u{1da8c}", "\u{1daa0}", "\u{1dab0}", "\u{1df1f}", "\u{1df2b}", "\u{1e007}", "\u{1e019}", "\u{1e022}", "\u{1e025}", "\u{1e02b}", "\u{1e06e}", "\u{1e090}", "\u{1e12d}", "\u{1e13e}", "\u{1e14a}", "\u{1e150}", "\u{1e2af}", "\u{1e2fa}", "\u{1e300}", "\u{1e4fa}", "\u{1e7e7}", "\u{1e7ec}", "\u{1e7ef}", "\u{1e7ff}", "\u{1e8c5}", "\u{1e8d7}", "\u{1e94c}", "\u{1e95a}", "\u{1e960}", "\u{1ecb5}", "\u{1ed3e}", "\u{1ee04}", "\u{1ee20}", "\u{1ee23}", "\u{1ee25}", "\u{1ee28}", "\u{1ee33}", "\u{1ee38}", "\u{1ee3a}", "\u{1ee3c}", "\u{1ee43}", "\u{1ee48}", "\u{1ee4a}", "\u{1ee4c}", "\u{1ee50}", "\u{1ee53}", "\u{1ee55}", "\u{1ee58}", "\u{1ee5a}", "\u{1ee5c}", "\u{1ee5e}", "\u{1ee60}", "\u{1ee63}", "\u{1ee65}", "\u{1ee6b}", "\u{1ee73}", "\u{1ee78}", "\u{1ee7d}", "\u{1ee7f}", "\u{1ee8a}", "\u{1ee9c}", "\u{1eea4}", "\u{1eeaa}", "\u{1eebc}", "\u{1eef2}", "\u{1f02c}", "\u{1f094}", "\u{1f0af}", "\u{1f0c0}", "\u{1f0d0}", "\u{1f0f6}", "\u{1f1ae}", "\u{1f203}", "\u{1f23c}", "\u{1f249}", "\u{1f252}", "\u{1f266}", "\u{1f6d8}", "\u{1f6ed}", "\u{1f6fd}", "\u{1f777}", "\u{1f7da}", "\u{1f7ec}", "\u{1f7f1}", "\u{1f80c}", "\u{1f848}", "\u{1f85a}", "\u{1f888}", "\u{1f8ae}", "\u{1f8b2}", "\u{1fa54}", "\u{1fa6e}", "\u{1fa7d}", "\u{1fa89}", "\u{1fabe}", "\u{1fac6}", "\u{1fadc}", "\u{1fae9}", "\u{1faf9}", "\u{1fb93}", "\u{1fbcb}", "\u{1fbfa}", "\u{2a6e0}", "\u{2b73a}", "\u{2b81e}", "\u{2cea2}", "\u{2ebe1}", "\u{2ee5e}", "\u{2fa1e}", "\u{3134b}", "\u{323b0}", "\u{e0002}", "\u{e0080}", "\u{e01f0}", "\u{ffffe}", "\u{10fffe}", "\u{e000}", "\u{f0000}", "\u{100000}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Other}+$", "^\\p{gc=Other}+$", "^\\p{Other}+$", "^\\p{General_Category=C}+$", "^\\p{gc=C}+$", "^\\p{C}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_letter() { test_with_configs(unicode_escape_property_gc_letter_tc) } fn unicode_escape_property_gc_letter_tc(tc: TestConfig) { static CODE_POINTS: [&str; 1896] = [ "\u{61}", "\u{b5}", "\u{df}", "\u{f8}", "\u{101}", "\u{103}", "\u{105}", "\u{107}", "\u{109}", "\u{10b}", "\u{10d}", "\u{10f}", "\u{111}", "\u{113}", "\u{115}", "\u{117}", "\u{119}", "\u{11b}", "\u{11d}", "\u{11f}", "\u{121}", "\u{123}", "\u{125}", "\u{127}", "\u{129}", "\u{12b}", "\u{12d}", "\u{12f}", "\u{131}", "\u{133}", "\u{135}", "\u{137}", "\u{13a}", "\u{13c}", "\u{13e}", "\u{140}", "\u{142}", "\u{144}", "\u{146}", "\u{148}", "\u{14b}", "\u{14d}", "\u{14f}", "\u{151}", "\u{153}", "\u{155}", "\u{157}", "\u{159}", "\u{15b}", "\u{15d}", "\u{15f}", "\u{161}", "\u{163}", "\u{165}", "\u{167}", "\u{169}", "\u{16b}", "\u{16d}", "\u{16f}", "\u{171}", "\u{173}", "\u{175}", "\u{177}", "\u{17a}", "\u{17c}", "\u{17e}", "\u{183}", "\u{185}", "\u{188}", "\u{18c}", "\u{192}", "\u{195}", "\u{199}", "\u{19e}", "\u{1a1}", "\u{1a3}", "\u{1a5}", "\u{1a8}", "\u{1aa}", "\u{1ad}", "\u{1b0}", "\u{1b4}", "\u{1b6}", "\u{1b9}", "\u{1bd}", "\u{1c6}", "\u{1c9}", "\u{1cc}", "\u{1ce}", "\u{1d0}", "\u{1d2}", "\u{1d4}", "\u{1d6}", "\u{1d8}", "\u{1da}", "\u{1dc}", "\u{1df}", "\u{1e1}", "\u{1e3}", "\u{1e5}", "\u{1e7}", "\u{1e9}", "\u{1eb}", "\u{1ed}", "\u{1ef}", "\u{1f3}", "\u{1f5}", "\u{1f9}", "\u{1fb}", "\u{1fd}", "\u{1ff}", "\u{201}", "\u{203}", "\u{205}", "\u{207}", "\u{209}", "\u{20b}", "\u{20d}", "\u{20f}", "\u{211}", "\u{213}", "\u{215}", "\u{217}", "\u{219}", "\u{21b}", "\u{21d}", "\u{21f}", "\u{221}", "\u{223}", "\u{225}", "\u{227}", "\u{229}", "\u{22b}", "\u{22d}", "\u{22f}", "\u{231}", "\u{233}", "\u{23c}", "\u{23f}", "\u{242}", "\u{247}", "\u{249}", "\u{24b}", "\u{24d}", "\u{24f}", "\u{295}", "\u{371}", "\u{373}", "\u{377}", "\u{37b}", "\u{390}", "\u{3ac}", "\u{3d0}", "\u{3d5}", "\u{3d9}", "\u{3db}", "\u{3dd}", "\u{3df}", "\u{3e1}", "\u{3e3}", "\u{3e5}", "\u{3e7}", "\u{3e9}", "\u{3eb}", "\u{3ed}", "\u{3ef}", "\u{3f5}", "\u{3f8}", "\u{3fb}", "\u{430}", "\u{461}", "\u{463}", "\u{465}", "\u{467}", "\u{469}", "\u{46b}", "\u{46d}", "\u{46f}", "\u{471}", "\u{473}", "\u{475}", "\u{477}", "\u{479}", "\u{47b}", "\u{47d}", "\u{47f}", "\u{481}", "\u{48b}", "\u{48d}", "\u{48f}", "\u{491}", "\u{493}", "\u{495}", "\u{497}", "\u{499}", "\u{49b}", "\u{49d}", "\u{49f}", "\u{4a1}", "\u{4a3}", "\u{4a5}", "\u{4a7}", "\u{4a9}", "\u{4ab}", "\u{4ad}", "\u{4af}", "\u{4b1}", "\u{4b3}", "\u{4b5}", "\u{4b7}", "\u{4b9}", "\u{4bb}", "\u{4bd}", "\u{4bf}", "\u{4c2}", "\u{4c4}", "\u{4c6}", "\u{4c8}", "\u{4ca}", "\u{4cc}", "\u{4ce}", "\u{4d1}", "\u{4d3}", "\u{4d5}", "\u{4d7}", "\u{4d9}", "\u{4db}", "\u{4dd}", "\u{4df}", "\u{4e1}", "\u{4e3}", "\u{4e5}", "\u{4e7}", "\u{4e9}", "\u{4eb}", "\u{4ed}", "\u{4ef}", "\u{4f1}", "\u{4f3}", "\u{4f5}", "\u{4f7}", "\u{4f9}", "\u{4fb}", "\u{4fd}", "\u{4ff}", "\u{501}", "\u{503}", "\u{505}", "\u{507}", "\u{509}", "\u{50b}", "\u{50d}", "\u{50f}", "\u{511}", "\u{513}", "\u{515}", "\u{517}", "\u{519}", "\u{51b}", "\u{51d}", "\u{51f}", "\u{521}", "\u{523}", "\u{525}", "\u{527}", "\u{529}", "\u{52b}", "\u{52d}", "\u{52f}", "\u{560}", "\u{10d0}", "\u{10fd}", "\u{13f8}", "\u{1c80}", "\u{1d00}", "\u{1d6b}", "\u{1d79}", "\u{1e01}", "\u{1e03}", "\u{1e05}", "\u{1e07}", "\u{1e09}", "\u{1e0b}", "\u{1e0d}", "\u{1e0f}", "\u{1e11}", "\u{1e13}", "\u{1e15}", "\u{1e17}", "\u{1e19}", "\u{1e1b}", "\u{1e1d}", "\u{1e1f}", "\u{1e21}", "\u{1e23}", "\u{1e25}", "\u{1e27}", "\u{1e29}", "\u{1e2b}", "\u{1e2d}", "\u{1e2f}", "\u{1e31}", "\u{1e33}", "\u{1e35}", "\u{1e37}", "\u{1e39}", "\u{1e3b}", "\u{1e3d}", "\u{1e3f}", "\u{1e41}", "\u{1e43}", "\u{1e45}", "\u{1e47}", "\u{1e49}", "\u{1e4b}", "\u{1e4d}", "\u{1e4f}", "\u{1e51}", "\u{1e53}", "\u{1e55}", "\u{1e57}", "\u{1e59}", "\u{1e5b}", "\u{1e5d}", "\u{1e5f}", "\u{1e61}", "\u{1e63}", "\u{1e65}", "\u{1e67}", "\u{1e69}", "\u{1e6b}", "\u{1e6d}", "\u{1e6f}", "\u{1e71}", "\u{1e73}", "\u{1e75}", "\u{1e77}", "\u{1e79}", "\u{1e7b}", "\u{1e7d}", "\u{1e7f}", "\u{1e81}", "\u{1e83}", "\u{1e85}", "\u{1e87}", "\u{1e89}", "\u{1e8b}", "\u{1e8d}", "\u{1e8f}", "\u{1e91}", "\u{1e93}", "\u{1e95}", "\u{1e9f}", "\u{1ea1}", "\u{1ea3}", "\u{1ea5}", "\u{1ea7}", "\u{1ea9}", "\u{1eab}", "\u{1ead}", "\u{1eaf}", "\u{1eb1}", "\u{1eb3}", "\u{1eb5}", "\u{1eb7}", "\u{1eb9}", "\u{1ebb}", "\u{1ebd}", "\u{1ebf}", "\u{1ec1}", "\u{1ec3}", "\u{1ec5}", "\u{1ec7}", "\u{1ec9}", "\u{1ecb}", "\u{1ecd}", "\u{1ecf}", "\u{1ed1}", "\u{1ed3}", "\u{1ed5}", "\u{1ed7}", "\u{1ed9}", "\u{1edb}", "\u{1edd}", "\u{1edf}", "\u{1ee1}", "\u{1ee3}", "\u{1ee5}", "\u{1ee7}", "\u{1ee9}", "\u{1eeb}", "\u{1eed}", "\u{1eef}", "\u{1ef1}", "\u{1ef3}", "\u{1ef5}", "\u{1ef7}", "\u{1ef9}", "\u{1efb}", "\u{1efd}", "\u{1eff}", "\u{1f10}", "\u{1f20}", "\u{1f30}", "\u{1f40}", "\u{1f50}", "\u{1f60}", "\u{1f70}", "\u{1f80}", "\u{1f90}", "\u{1fa0}", "\u{1fb0}", "\u{1fb6}", "\u{1fbe}", "\u{1fc2}", "\u{1fc6}", "\u{1fd0}", "\u{1fd6}", "\u{1fe0}", "\u{1ff2}", "\u{1ff6}", "\u{210a}", "\u{210e}", "\u{2113}", "\u{212f}", "\u{2134}", "\u{2139}", "\u{213c}", "\u{2146}", "\u{214e}", "\u{2184}", "\u{2c30}", "\u{2c61}", "\u{2c65}", "\u{2c68}", "\u{2c6a}", "\u{2c6c}", "\u{2c71}", "\u{2c73}", "\u{2c76}", "\u{2c81}", "\u{2c83}", "\u{2c85}", "\u{2c87}", "\u{2c89}", "\u{2c8b}", "\u{2c8d}", "\u{2c8f}", "\u{2c91}", "\u{2c93}", "\u{2c95}", "\u{2c97}", "\u{2c99}", "\u{2c9b}", "\u{2c9d}", "\u{2c9f}", "\u{2ca1}", "\u{2ca3}", "\u{2ca5}", "\u{2ca7}", "\u{2ca9}", "\u{2cab}", "\u{2cad}", "\u{2caf}", "\u{2cb1}", "\u{2cb3}", "\u{2cb5}", "\u{2cb7}", "\u{2cb9}", "\u{2cbb}", "\u{2cbd}", "\u{2cbf}", "\u{2cc1}", "\u{2cc3}", "\u{2cc5}", "\u{2cc7}", "\u{2cc9}", "\u{2ccb}", "\u{2ccd}", "\u{2ccf}", "\u{2cd1}", "\u{2cd3}", "\u{2cd5}", "\u{2cd7}", "\u{2cd9}", "\u{2cdb}", "\u{2cdd}", "\u{2cdf}", "\u{2ce1}", "\u{2ce3}", "\u{2cec}", "\u{2cee}", "\u{2cf3}", "\u{2d00}", "\u{2d27}", "\u{2d2d}", "\u{a641}", "\u{a643}", "\u{a645}", "\u{a647}", "\u{a649}", "\u{a64b}", "\u{a64d}", "\u{a64f}", "\u{a651}", "\u{a653}", "\u{a655}", "\u{a657}", "\u{a659}", "\u{a65b}", "\u{a65d}", "\u{a65f}", "\u{a661}", "\u{a663}", "\u{a665}", "\u{a667}", "\u{a669}", "\u{a66b}", "\u{a66d}", "\u{a681}", "\u{a683}", "\u{a685}", "\u{a687}", "\u{a689}", "\u{a68b}", "\u{a68d}", "\u{a68f}", "\u{a691}", "\u{a693}", "\u{a695}", "\u{a697}", "\u{a699}", "\u{a69b}", "\u{a723}", "\u{a725}", "\u{a727}", "\u{a729}", "\u{a72b}", "\u{a72d}", "\u{a72f}", "\u{a733}", "\u{a735}", "\u{a737}", "\u{a739}", "\u{a73b}", "\u{a73d}", "\u{a73f}", "\u{a741}", "\u{a743}", "\u{a745}", "\u{a747}", "\u{a749}", "\u{a74b}", "\u{a74d}", "\u{a74f}", "\u{a751}", "\u{a753}", "\u{a755}", "\u{a757}", "\u{a759}", "\u{a75b}", "\u{a75d}", "\u{a75f}", "\u{a761}", "\u{a763}", "\u{a765}", "\u{a767}", "\u{a769}", "\u{a76b}", "\u{a76d}", "\u{a76f}", "\u{a771}", "\u{a77a}", "\u{a77c}", "\u{a77f}", "\u{a781}", "\u{a783}", "\u{a785}", "\u{a787}", "\u{a78c}", "\u{a78e}", "\u{a791}", "\u{a793}", "\u{a797}", "\u{a799}", "\u{a79b}", "\u{a79d}", "\u{a79f}", "\u{a7a1}", "\u{a7a3}", "\u{a7a5}", "\u{a7a7}", "\u{a7a9}", "\u{a7af}", "\u{a7b5}", "\u{a7b7}", "\u{a7b9}", "\u{a7bb}", "\u{a7bd}", "\u{a7bf}", "\u{a7c1}", "\u{a7c3}", "\u{a7c8}", "\u{a7ca}", "\u{a7d1}", "\u{a7d3}", "\u{a7d5}", "\u{a7d7}", "\u{a7d9}", "\u{a7f6}", "\u{a7fa}", "\u{ab30}", "\u{ab60}", "\u{ab70}", "\u{fb00}", "\u{fb13}", "\u{ff41}", "\u{10428}", "\u{104d8}", "\u{10597}", "\u{105a3}", "\u{105b3}", "\u{105bb}", "\u{10cc0}", "\u{118c0}", "\u{16e60}", "\u{1d41a}", "\u{1d44e}", "\u{1d456}", "\u{1d482}", "\u{1d4b6}", "\u{1d4bb}", "\u{1d4bd}", "\u{1d4c5}", "\u{1d4ea}", "\u{1d51e}", "\u{1d552}", "\u{1d586}", "\u{1d5ba}", "\u{1d5ee}", "\u{1d622}", "\u{1d656}", "\u{1d68a}", "\u{1d6c2}", "\u{1d6dc}", "\u{1d6fc}", "\u{1d716}", "\u{1d736}", "\u{1d750}", "\u{1d770}", "\u{1d78a}", "\u{1d7aa}", "\u{1d7c4}", "\u{1d7cb}", "\u{1df00}", "\u{1df0b}", "\u{1df25}", "\u{1e922}", "\u{2b0}", "\u{2c6}", "\u{2e0}", "\u{2ec}", "\u{2ee}", "\u{374}", "\u{37a}", "\u{559}", "\u{640}", "\u{6e5}", "\u{7f4}", "\u{7fa}", "\u{81a}", "\u{824}", "\u{828}", "\u{8c9}", "\u{971}", "\u{e46}", "\u{ec6}", "\u{10fc}", "\u{17d7}", "\u{1843}", "\u{1aa7}", "\u{1c78}", "\u{1d2c}", "\u{1d78}", "\u{1d9b}", "\u{2071}", "\u{207f}", "\u{2090}", "\u{2c7c}", "\u{2d6f}", "\u{2e2f}", "\u{3005}", "\u{3031}", "\u{303b}", "\u{309d}", "\u{30fc}", "\u{a015}", "\u{a4f8}", "\u{a60c}", "\u{a67f}", "\u{a69c}", "\u{a717}", "\u{a770}", "\u{a788}", "\u{a7f2}", "\u{a7f8}", "\u{a9cf}", "\u{a9e6}", "\u{aa70}", "\u{aadd}", "\u{aaf3}", "\u{ab5c}", "\u{ab69}", "\u{ff70}", "\u{ff9e}", "\u{10780}", "\u{10787}", "\u{107b2}", "\u{16b40}", "\u{16f93}", "\u{16fe0}", "\u{16fe3}", "\u{1aff0}", "\u{1aff5}", "\u{1affd}", "\u{1e030}", "\u{1e137}", "\u{1e4eb}", "\u{1e94b}", "\u{aa}", "\u{ba}", "\u{1bb}", "\u{1c0}", "\u{294}", "\u{5d0}", "\u{5ef}", "\u{620}", "\u{641}", "\u{66e}", "\u{671}", "\u{6d5}", "\u{6ee}", "\u{6fa}", "\u{6ff}", "\u{710}", "\u{712}", "\u{74d}", "\u{7b1}", "\u{7ca}", "\u{800}", "\u{840}", "\u{860}", "\u{870}", "\u{889}", "\u{8a0}", "\u{904}", "\u{93d}", "\u{950}", "\u{958}", "\u{972}", "\u{985}", "\u{98f}", "\u{993}", "\u{9aa}", "\u{9b2}", "\u{9b6}", "\u{9bd}", "\u{9ce}", "\u{9dc}", "\u{9df}", "\u{9f0}", "\u{9fc}", "\u{a05}", "\u{a0f}", "\u{a13}", "\u{a2a}", "\u{a32}", "\u{a35}", "\u{a38}", "\u{a59}", "\u{a5e}", "\u{a72}", "\u{a85}", "\u{a8f}", "\u{a93}", "\u{aaa}", "\u{ab2}", "\u{ab5}", "\u{abd}", "\u{ad0}", "\u{ae0}", "\u{af9}", "\u{b05}", "\u{b0f}", "\u{b13}", "\u{b2a}", "\u{b32}", "\u{b35}", "\u{b3d}", "\u{b5c}", "\u{b5f}", "\u{b71}", "\u{b83}", "\u{b85}", "\u{b8e}", "\u{b92}", "\u{b99}", "\u{b9c}", "\u{b9e}", "\u{ba3}", "\u{ba8}", "\u{bae}", "\u{bd0}", "\u{c05}", "\u{c0e}", "\u{c12}", "\u{c2a}", "\u{c3d}", "\u{c58}", "\u{c5d}", "\u{c60}", "\u{c80}", "\u{c85}", "\u{c8e}", "\u{c92}", "\u{caa}", "\u{cb5}", "\u{cbd}", "\u{cdd}", "\u{ce0}", "\u{cf1}", "\u{d04}", "\u{d0e}", "\u{d12}", "\u{d3d}", "\u{d4e}", "\u{d54}", "\u{d5f}", "\u{d7a}", "\u{d85}", "\u{d9a}", "\u{db3}", "\u{dbd}", "\u{dc0}", "\u{e01}", "\u{e32}", "\u{e40}", "\u{e81}", "\u{e84}", "\u{e86}", "\u{e8c}", "\u{ea5}", "\u{ea7}", "\u{eb2}", "\u{ebd}", "\u{ec0}", "\u{edc}", "\u{f00}", "\u{f40}", "\u{f49}", "\u{f88}", "\u{1000}", "\u{103f}", "\u{1050}", "\u{105a}", "\u{1061}", "\u{1065}", "\u{106e}", "\u{1075}", "\u{108e}", "\u{1100}", "\u{124a}", "\u{1250}", "\u{1258}", "\u{125a}", "\u{1260}", "\u{128a}", "\u{1290}", "\u{12b2}", "\u{12b8}", "\u{12c0}", "\u{12c2}", "\u{12c8}", "\u{12d8}", "\u{1312}", "\u{1318}", "\u{1380}", "\u{1401}", "\u{166f}", "\u{1681}", "\u{16a0}", "\u{16f1}", "\u{1700}", "\u{171f}", "\u{1740}", "\u{1760}", "\u{176e}", "\u{1780}", "\u{17dc}", "\u{1820}", "\u{1844}", "\u{1880}", "\u{1887}", "\u{18aa}", "\u{18b0}", "\u{1900}", "\u{1950}", "\u{1970}", "\u{1980}", "\u{19b0}", "\u{1a00}", "\u{1a20}", "\u{1b05}", "\u{1b45}", "\u{1b83}", "\u{1bae}", "\u{1bba}", "\u{1c00}", "\u{1c4d}", "\u{1c5a}", "\u{1ce9}", "\u{1cee}", "\u{1cf5}", "\u{1cfa}", "\u{2135}", "\u{2d30}", "\u{2d80}", "\u{2da0}", "\u{2da8}", "\u{2db0}", "\u{2db8}", "\u{2dc0}", "\u{2dc8}", "\u{2dd0}", "\u{2dd8}", "\u{3006}", "\u{303c}", "\u{3041}", "\u{309f}", "\u{30a1}", "\u{30ff}", "\u{3105}", "\u{3131}", "\u{31a0}", "\u{31f0}", "\u{3400}", "\u{4e00}", "\u{a016}", "\u{a4d0}", "\u{a500}", "\u{a610}", "\u{a62a}", "\u{a66e}", "\u{a6a0}", "\u{a78f}", "\u{a7f7}", "\u{a7fb}", "\u{a803}", "\u{a807}", "\u{a80c}", "\u{a840}", "\u{a882}", "\u{a8f2}", "\u{a8fb}", "\u{a8fd}", "\u{a90a}", "\u{a930}", "\u{a960}", "\u{a984}", "\u{a9e0}", "\u{a9e7}", "\u{a9fa}", "\u{aa00}", "\u{aa40}", "\u{aa44}", "\u{aa60}", "\u{aa71}", "\u{aa7a}", "\u{aa7e}", "\u{aab1}", "\u{aab5}", "\u{aab9}", "\u{aac0}", "\u{aac2}", "\u{aadb}", "\u{aae0}", "\u{aaf2}", "\u{ab01}", "\u{ab09}", "\u{ab11}", "\u{ab20}", "\u{ab28}", "\u{abc0}", "\u{ac00}", "\u{d7b0}", "\u{d7cb}", "\u{f900}", "\u{fa70}", "\u{fb1d}", "\u{fb1f}", "\u{fb2a}", "\u{fb38}", "\u{fb3e}", "\u{fb40}", "\u{fb43}", "\u{fb46}", "\u{fbd3}", "\u{fd50}", "\u{fd92}", "\u{fdf0}", "\u{fe70}", "\u{fe76}", "\u{ff66}", "\u{ff71}", "\u{ffa0}", "\u{ffc2}", "\u{ffca}", "\u{ffd2}", "\u{ffda}", "\u{10000}", "\u{1000d}", "\u{10028}", "\u{1003c}", "\u{1003f}", "\u{10050}", "\u{10080}", "\u{10280}", "\u{102a0}", "\u{10300}", "\u{1032d}", "\u{10342}", "\u{10350}", "\u{10380}", "\u{103a0}", "\u{103c8}", "\u{10450}", "\u{10500}", "\u{10530}", "\u{10600}", "\u{10740}", "\u{10760}", "\u{10800}", "\u{10808}", "\u{1080a}", "\u{10837}", "\u{1083c}", "\u{1083f}", "\u{10860}", "\u{10880}", "\u{108e0}", "\u{108f4}", "\u{10900}", "\u{10920}", "\u{10980}", "\u{109be}", "\u{10a00}", "\u{10a10}", "\u{10a15}", "\u{10a19}", "\u{10a60}", "\u{10a80}", "\u{10ac0}", "\u{10ac9}", "\u{10b00}", "\u{10b40}", "\u{10b60}", "\u{10b80}", "\u{10c00}", "\u{10d00}", "\u{10e80}", "\u{10eb0}", "\u{10f00}", "\u{10f27}", "\u{10f30}", "\u{10f70}", "\u{10fb0}", "\u{10fe0}", "\u{11003}", "\u{11071}", "\u{11075}", "\u{11083}", "\u{110d0}", "\u{11103}", "\u{11144}", "\u{11147}", "\u{11150}", "\u{11176}", "\u{11183}", "\u{111c1}", "\u{111da}", "\u{111dc}", "\u{11200}", "\u{11213}", "\u{1123f}", "\u{11280}", "\u{11288}", "\u{1128a}", "\u{1128f}", "\u{1129f}", "\u{112b0}", "\u{11305}", "\u{1130f}", "\u{11313}", "\u{1132a}", "\u{11332}", "\u{11335}", "\u{1133d}", "\u{11350}", "\u{1135d}", "\u{11400}", "\u{11447}", "\u{1145f}", "\u{11480}", "\u{114c4}", "\u{114c7}", "\u{11580}", "\u{115d8}", "\u{11600}", "\u{11644}", "\u{11680}", "\u{116b8}", "\u{11700}", "\u{11740}", "\u{11800}", "\u{118ff}", "\u{11909}", "\u{1190c}", "\u{11915}", "\u{11918}", "\u{1193f}", "\u{11941}", "\u{119a0}", "\u{119aa}", "\u{119e1}", "\u{119e3}", "\u{11a00}", "\u{11a0b}", "\u{11a3a}", "\u{11a50}", "\u{11a5c}", "\u{11a9d}", "\u{11ab0}", "\u{11c00}", "\u{11c0a}", "\u{11c40}", "\u{11c72}", "\u{11d00}", "\u{11d08}", "\u{11d0b}", "\u{11d46}", "\u{11d60}", "\u{11d67}", "\u{11d6a}", "\u{11d98}", "\u{11ee0}", "\u{11f02}", "\u{11f04}", "\u{11f12}", "\u{11fb0}", "\u{12000}", "\u{12480}", "\u{12f90}", "\u{13000}", "\u{13441}", "\u{14400}", "\u{16800}", "\u{16a40}", "\u{16a70}", "\u{16ad0}", "\u{16b00}", "\u{16b63}", "\u{16b7d}", "\u{16f00}", "\u{16f50}", "\u{17000}", "\u{18800}", "\u{18d00}", "\u{1b000}", "\u{1b132}", "\u{1b150}", "\u{1b155}", "\u{1b164}", "\u{1b170}", "\u{1bc00}", "\u{1bc70}", "\u{1bc80}", "\u{1bc90}", "\u{1df0a}", "\u{1e100}", "\u{1e14e}", "\u{1e290}", "\u{1e2c0}", "\u{1e4d0}", "\u{1e7e0}", "\u{1e7e8}", "\u{1e7ed}", "\u{1e7f0}", "\u{1e800}", "\u{1ee00}", "\u{1ee05}", "\u{1ee21}", "\u{1ee24}", "\u{1ee27}", "\u{1ee29}", "\u{1ee34}", "\u{1ee39}", "\u{1ee3b}", "\u{1ee42}", "\u{1ee47}", "\u{1ee49}", "\u{1ee4b}", "\u{1ee4d}", "\u{1ee51}", "\u{1ee54}", "\u{1ee57}", "\u{1ee59}", "\u{1ee5b}", "\u{1ee5d}", "\u{1ee5f}", "\u{1ee61}", "\u{1ee64}", "\u{1ee67}", "\u{1ee6c}", "\u{1ee74}", "\u{1ee79}", "\u{1ee7e}", "\u{1ee80}", "\u{1ee8b}", "\u{1eea1}", "\u{1eea5}", "\u{1eeab}", "\u{20000}", "\u{2a700}", "\u{2b740}", "\u{2b820}", "\u{2ceb0}", "\u{2ebf0}", "\u{2f800}", "\u{30000}", "\u{31350}", "\u{1c5}", "\u{1c8}", "\u{1cb}", "\u{1f2}", "\u{1f88}", "\u{1f98}", "\u{1fa8}", "\u{1fbc}", "\u{1fcc}", "\u{1ffc}", "\u{41}", "\u{c0}", "\u{d8}", "\u{100}", "\u{102}", "\u{104}", "\u{106}", "\u{108}", "\u{10a}", "\u{10c}", "\u{10e}", "\u{110}", "\u{112}", "\u{114}", "\u{116}", "\u{118}", "\u{11a}", "\u{11c}", "\u{11e}", "\u{120}", "\u{122}", "\u{124}", "\u{126}", "\u{128}", "\u{12a}", "\u{12c}", "\u{12e}", "\u{130}", "\u{132}", "\u{134}", "\u{136}", "\u{139}", "\u{13b}", "\u{13d}", "\u{13f}", "\u{141}", "\u{143}", "\u{145}", "\u{147}", "\u{14a}", "\u{14c}", "\u{14e}", "\u{150}", "\u{152}", "\u{154}", "\u{156}", "\u{158}", "\u{15a}", "\u{15c}", "\u{15e}", "\u{160}", "\u{162}", "\u{164}", "\u{166}", "\u{168}", "\u{16a}", "\u{16c}", "\u{16e}", "\u{170}", "\u{172}", "\u{174}", "\u{176}", "\u{178}", "\u{17b}", "\u{17d}", "\u{181}", "\u{184}", "\u{186}", "\u{189}", "\u{18e}", "\u{193}", "\u{196}", "\u{19c}", "\u{19f}", "\u{1a2}", "\u{1a4}", "\u{1a6}", "\u{1a9}", "\u{1ac}", "\u{1ae}", "\u{1b1}", "\u{1b5}", "\u{1b7}", "\u{1bc}", "\u{1c4}", "\u{1c7}", "\u{1ca}", "\u{1cd}", "\u{1cf}", "\u{1d1}", "\u{1d3}", "\u{1d5}", "\u{1d7}", "\u{1d9}", "\u{1db}", "\u{1de}", "\u{1e0}", "\u{1e2}", "\u{1e4}", "\u{1e6}", "\u{1e8}", "\u{1ea}", "\u{1ec}", "\u{1ee}", "\u{1f1}", "\u{1f4}", "\u{1f6}", "\u{1fa}", "\u{1fc}", "\u{1fe}", "\u{200}", "\u{202}", "\u{204}", "\u{206}", "\u{208}", "\u{20a}", "\u{20c}", "\u{20e}", "\u{210}", "\u{212}", "\u{214}", "\u{216}", "\u{218}", "\u{21a}", "\u{21c}", "\u{21e}", "\u{220}", "\u{222}", "\u{224}", "\u{226}", "\u{228}", "\u{22a}", "\u{22c}", "\u{22e}", "\u{230}", "\u{232}", "\u{23a}", "\u{23d}", "\u{241}", "\u{243}", "\u{248}", "\u{24a}", "\u{24c}", "\u{24e}", "\u{370}", "\u{372}", "\u{376}", "\u{37f}", "\u{386}", "\u{388}", "\u{38c}", "\u{38e}", "\u{391}", "\u{3a3}", "\u{3cf}", "\u{3d2}", "\u{3d8}", "\u{3da}", "\u{3dc}", "\u{3de}", "\u{3e0}", "\u{3e2}", "\u{3e4}", "\u{3e6}", "\u{3e8}", "\u{3ea}", "\u{3ec}", "\u{3ee}", "\u{3f4}", "\u{3f7}", "\u{3f9}", "\u{3fd}", "\u{460}", "\u{462}", "\u{464}", "\u{466}", "\u{468}", "\u{46a}", "\u{46c}", "\u{46e}", "\u{470}", "\u{472}", "\u{474}", "\u{476}", "\u{478}", "\u{47a}", "\u{47c}", "\u{47e}", "\u{480}", "\u{48a}", "\u{48c}", "\u{48e}", "\u{490}", "\u{492}", "\u{494}", "\u{496}", "\u{498}", "\u{49a}", "\u{49c}", "\u{49e}", "\u{4a0}", "\u{4a2}", "\u{4a4}", "\u{4a6}", "\u{4a8}", "\u{4aa}", "\u{4ac}", "\u{4ae}", "\u{4b0}", "\u{4b2}", "\u{4b4}", "\u{4b6}", "\u{4b8}", "\u{4ba}", "\u{4bc}", "\u{4be}", "\u{4c0}", "\u{4c3}", "\u{4c5}", "\u{4c7}", "\u{4c9}", "\u{4cb}", "\u{4cd}", "\u{4d0}", "\u{4d2}", "\u{4d4}", "\u{4d6}", "\u{4d8}", "\u{4da}", "\u{4dc}", "\u{4de}", "\u{4e0}", "\u{4e2}", "\u{4e4}", "\u{4e6}", "\u{4e8}", "\u{4ea}", "\u{4ec}", "\u{4ee}", "\u{4f0}", "\u{4f2}", "\u{4f4}", "\u{4f6}", "\u{4f8}", "\u{4fa}", "\u{4fc}", "\u{4fe}", "\u{500}", "\u{502}", "\u{504}", "\u{506}", "\u{508}", "\u{50a}", "\u{50c}", "\u{50e}", "\u{510}", "\u{512}", "\u{514}", "\u{516}", "\u{518}", "\u{51a}", "\u{51c}", "\u{51e}", "\u{520}", "\u{522}", "\u{524}", "\u{526}", "\u{528}", "\u{52a}", "\u{52c}", "\u{52e}", "\u{531}", "\u{10a0}", "\u{10c7}", "\u{10cd}", "\u{13a0}", "\u{1c90}", "\u{1cbd}", "\u{1e00}", "\u{1e02}", "\u{1e04}", "\u{1e06}", "\u{1e08}", "\u{1e0a}", "\u{1e0c}", "\u{1e0e}", "\u{1e10}", "\u{1e12}", "\u{1e14}", "\u{1e16}", "\u{1e18}", "\u{1e1a}", "\u{1e1c}", "\u{1e1e}", "\u{1e20}", "\u{1e22}", "\u{1e24}", "\u{1e26}", "\u{1e28}", "\u{1e2a}", "\u{1e2c}", "\u{1e2e}", "\u{1e30}", "\u{1e32}", "\u{1e34}", "\u{1e36}", "\u{1e38}", "\u{1e3a}", "\u{1e3c}", "\u{1e3e}", "\u{1e40}", "\u{1e42}", "\u{1e44}", "\u{1e46}", "\u{1e48}", "\u{1e4a}", "\u{1e4c}", "\u{1e4e}", "\u{1e50}", "\u{1e52}", "\u{1e54}", "\u{1e56}", "\u{1e58}", "\u{1e5a}", "\u{1e5c}", "\u{1e5e}", "\u{1e60}", "\u{1e62}", "\u{1e64}", "\u{1e66}", "\u{1e68}", "\u{1e6a}", "\u{1e6c}", "\u{1e6e}", "\u{1e70}", "\u{1e72}", "\u{1e74}", "\u{1e76}", "\u{1e78}", "\u{1e7a}", "\u{1e7c}", "\u{1e7e}", "\u{1e80}", "\u{1e82}", "\u{1e84}", "\u{1e86}", "\u{1e88}", "\u{1e8a}", "\u{1e8c}", "\u{1e8e}", "\u{1e90}", "\u{1e92}", "\u{1e94}", "\u{1e9e}", "\u{1ea0}", "\u{1ea2}", "\u{1ea4}", "\u{1ea6}", "\u{1ea8}", "\u{1eaa}", "\u{1eac}", "\u{1eae}", "\u{1eb0}", "\u{1eb2}", "\u{1eb4}", "\u{1eb6}", "\u{1eb8}", "\u{1eba}", "\u{1ebc}", "\u{1ebe}", "\u{1ec0}", "\u{1ec2}", "\u{1ec4}", "\u{1ec6}", "\u{1ec8}", "\u{1eca}", "\u{1ecc}", "\u{1ece}", "\u{1ed0}", "\u{1ed2}", "\u{1ed4}", "\u{1ed6}", "\u{1ed8}", "\u{1eda}", "\u{1edc}", "\u{1ede}", "\u{1ee0}", "\u{1ee2}", "\u{1ee4}", "\u{1ee6}", "\u{1ee8}", "\u{1eea}", "\u{1eec}", "\u{1eee}", "\u{1ef0}", "\u{1ef2}", "\u{1ef4}", "\u{1ef6}", "\u{1ef8}", "\u{1efa}", "\u{1efc}", "\u{1efe}", "\u{1f08}", "\u{1f18}", "\u{1f28}", "\u{1f38}", "\u{1f48}", "\u{1f59}", "\u{1f5b}", "\u{1f5d}", "\u{1f5f}", "\u{1f68}", "\u{1fb8}", "\u{1fc8}", "\u{1fd8}", "\u{1fe8}", "\u{1ff8}", "\u{2102}", "\u{2107}", "\u{210b}", "\u{2110}", "\u{2115}", "\u{2119}", "\u{2124}", "\u{2126}", "\u{2128}", "\u{212a}", "\u{2130}", "\u{213e}", "\u{2145}", "\u{2183}", "\u{2c00}", "\u{2c60}", "\u{2c62}", "\u{2c67}", "\u{2c69}", "\u{2c6b}", "\u{2c6d}", "\u{2c72}", "\u{2c75}", "\u{2c7e}", "\u{2c82}", "\u{2c84}", "\u{2c86}", "\u{2c88}", "\u{2c8a}", "\u{2c8c}", "\u{2c8e}", "\u{2c90}", "\u{2c92}", "\u{2c94}", "\u{2c96}", "\u{2c98}", "\u{2c9a}", "\u{2c9c}", "\u{2c9e}", "\u{2ca0}", "\u{2ca2}", "\u{2ca4}", "\u{2ca6}", "\u{2ca8}", "\u{2caa}", "\u{2cac}", "\u{2cae}", "\u{2cb0}", "\u{2cb2}", "\u{2cb4}", "\u{2cb6}", "\u{2cb8}", "\u{2cba}", "\u{2cbc}", "\u{2cbe}", "\u{2cc0}", "\u{2cc2}", "\u{2cc4}", "\u{2cc6}", "\u{2cc8}", "\u{2cca}", "\u{2ccc}", "\u{2cce}", "\u{2cd0}", "\u{2cd2}", "\u{2cd4}", "\u{2cd6}", "\u{2cd8}", "\u{2cda}", "\u{2cdc}", "\u{2cde}", "\u{2ce0}", "\u{2ce2}", "\u{2ceb}", "\u{2ced}", "\u{2cf2}", "\u{a640}", "\u{a642}", "\u{a644}", "\u{a646}", "\u{a648}", "\u{a64a}", "\u{a64c}", "\u{a64e}", "\u{a650}", "\u{a652}", "\u{a654}", "\u{a656}", "\u{a658}", "\u{a65a}", "\u{a65c}", "\u{a65e}", "\u{a660}", "\u{a662}", "\u{a664}", "\u{a666}", "\u{a668}", "\u{a66a}", "\u{a66c}", "\u{a680}", "\u{a682}", "\u{a684}", "\u{a686}", "\u{a688}", "\u{a68a}", "\u{a68c}", "\u{a68e}", "\u{a690}", "\u{a692}", "\u{a694}", "\u{a696}", "\u{a698}", "\u{a69a}", "\u{a722}", "\u{a724}", "\u{a726}", "\u{a728}", "\u{a72a}", "\u{a72c}", "\u{a72e}", "\u{a732}", "\u{a734}", "\u{a736}", "\u{a738}", "\u{a73a}", "\u{a73c}", "\u{a73e}", "\u{a740}", "\u{a742}", "\u{a744}", "\u{a746}", "\u{a748}", "\u{a74a}", "\u{a74c}", "\u{a74e}", "\u{a750}", "\u{a752}", "\u{a754}", "\u{a756}", "\u{a758}", "\u{a75a}", "\u{a75c}", "\u{a75e}", "\u{a760}", "\u{a762}", "\u{a764}", "\u{a766}", "\u{a768}", "\u{a76a}", "\u{a76c}", "\u{a76e}", "\u{a779}", "\u{a77b}", "\u{a77d}", "\u{a780}", "\u{a782}", "\u{a784}", "\u{a786}", "\u{a78b}", "\u{a78d}", "\u{a790}", "\u{a792}", "\u{a796}", "\u{a798}", "\u{a79a}", "\u{a79c}", "\u{a79e}", "\u{a7a0}", "\u{a7a2}", "\u{a7a4}", "\u{a7a6}", "\u{a7a8}", "\u{a7aa}", "\u{a7b0}", "\u{a7b6}", "\u{a7b8}", "\u{a7ba}", "\u{a7bc}", "\u{a7be}", "\u{a7c0}", "\u{a7c2}", "\u{a7c4}", "\u{a7c9}", "\u{a7d0}", "\u{a7d6}", "\u{a7d8}", "\u{a7f5}", "\u{ff21}", "\u{10400}", "\u{104b0}", "\u{10570}", "\u{1057c}", "\u{1058c}", "\u{10594}", "\u{10c80}", "\u{118a0}", "\u{16e40}", "\u{1d400}", "\u{1d434}", "\u{1d468}", "\u{1d49c}", "\u{1d49e}", "\u{1d4a2}", "\u{1d4a5}", "\u{1d4a9}", "\u{1d4ae}", "\u{1d4d0}", "\u{1d504}", "\u{1d507}", "\u{1d50d}", "\u{1d516}", "\u{1d538}", "\u{1d53b}", "\u{1d540}", "\u{1d546}", "\u{1d54a}", "\u{1d56c}", "\u{1d5a0}", "\u{1d5d4}", "\u{1d608}", "\u{1d63c}", "\u{1d670}", "\u{1d6a8}", "\u{1d6e2}", "\u{1d71c}", "\u{1d756}", "\u{1d790}", "\u{1d7ca}", "\u{1e900}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Letter}+$", "^\\p{gc=Letter}+$", "^\\p{Letter}+$", "^\\p{General_Category=L}+$", "^\\p{gc=L}+$", "^\\p{L}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_mark() { test_with_configs(unicode_escape_property_gc_mark_tc) } fn unicode_escape_property_gc_mark_tc(tc: TestConfig) { const CODE_POINTS: [&str; 533] = [ "\u{903}", "\u{93b}", "\u{93e}", "\u{949}", "\u{94e}", "\u{982}", "\u{9be}", "\u{9c7}", "\u{9cb}", "\u{9d7}", "\u{a03}", "\u{a3e}", "\u{a83}", "\u{abe}", "\u{ac9}", "\u{acb}", "\u{b02}", "\u{b3e}", "\u{b40}", "\u{b47}", "\u{b4b}", "\u{b57}", "\u{bbe}", "\u{bc1}", "\u{bc6}", "\u{bca}", "\u{bd7}", "\u{c01}", "\u{c41}", "\u{c82}", "\u{cbe}", "\u{cc0}", "\u{cc7}", "\u{cca}", "\u{cd5}", "\u{cf3}", "\u{d02}", "\u{d3e}", "\u{d46}", "\u{d4a}", "\u{d57}", "\u{d82}", "\u{dcf}", "\u{dd8}", "\u{df2}", "\u{f3e}", "\u{f7f}", "\u{102b}", "\u{1031}", "\u{1038}", "\u{103b}", "\u{1056}", "\u{1062}", "\u{1067}", "\u{1083}", "\u{1087}", "\u{108f}", "\u{109a}", "\u{1715}", "\u{1734}", "\u{17b6}", "\u{17be}", "\u{17c7}", "\u{1923}", "\u{1929}", "\u{1930}", "\u{1933}", "\u{1a19}", "\u{1a55}", "\u{1a57}", "\u{1a61}", "\u{1a63}", "\u{1a6d}", "\u{1b04}", "\u{1b35}", "\u{1b3b}", "\u{1b3d}", "\u{1b43}", "\u{1b82}", "\u{1ba1}", "\u{1ba6}", "\u{1baa}", "\u{1be7}", "\u{1bea}", "\u{1bee}", "\u{1bf2}", "\u{1c24}", "\u{1c34}", "\u{1ce1}", "\u{1cf7}", "\u{302e}", "\u{a823}", "\u{a827}", "\u{a880}", "\u{a8b4}", "\u{a952}", "\u{a983}", "\u{a9b4}", "\u{a9ba}", "\u{a9be}", "\u{aa2f}", "\u{aa33}", "\u{aa4d}", "\u{aa7b}", "\u{aa7d}", "\u{aaeb}", "\u{aaee}", "\u{aaf5}", "\u{abe3}", "\u{abe6}", "\u{abe9}", "\u{abec}", "\u{11000}", "\u{11002}", "\u{11082}", "\u{110b0}", "\u{110b7}", "\u{1112c}", "\u{11145}", "\u{11182}", "\u{111b3}", "\u{111bf}", "\u{111ce}", "\u{1122c}", "\u{11232}", "\u{11235}", "\u{112e0}", "\u{11302}", "\u{1133e}", "\u{11341}", "\u{11347}", "\u{1134b}", "\u{11357}", "\u{11362}", "\u{11435}", "\u{11440}", "\u{11445}", "\u{114b0}", "\u{114b9}", "\u{114bb}", "\u{114c1}", "\u{115af}", "\u{115b8}", "\u{115be}", "\u{11630}", "\u{1163b}", "\u{1163e}", "\u{116ac}", "\u{116ae}", "\u{116b6}", "\u{11720}", "\u{11726}", "\u{1182c}", "\u{11838}", "\u{11930}", "\u{11937}", "\u{1193d}", "\u{11940}", "\u{11942}", "\u{119d1}", "\u{119dc}", "\u{119e4}", "\u{11a39}", "\u{11a57}", "\u{11a97}", "\u{11c2f}", "\u{11c3e}", "\u{11ca9}", "\u{11cb1}", "\u{11cb4}", "\u{11d8a}", "\u{11d93}", "\u{11d96}", "\u{11ef5}", "\u{11f03}", "\u{11f34}", "\u{11f3e}", "\u{11f41}", "\u{16f51}", "\u{16ff0}", "\u{1d165}", "\u{1d16d}", "\u{488}", "\u{1abe}", "\u{20dd}", "\u{20e2}", "\u{a670}", "\u{300}", "\u{483}", "\u{591}", "\u{5bf}", "\u{5c1}", "\u{5c4}", "\u{5c7}", "\u{610}", "\u{64b}", "\u{670}", "\u{6d6}", "\u{6df}", "\u{6e7}", "\u{6ea}", "\u{711}", "\u{730}", "\u{7a6}", "\u{7eb}", "\u{7fd}", "\u{816}", "\u{81b}", "\u{825}", "\u{829}", "\u{859}", "\u{898}", "\u{8ca}", "\u{8e3}", "\u{93a}", "\u{93c}", "\u{941}", "\u{94d}", "\u{951}", "\u{962}", "\u{981}", "\u{9bc}", "\u{9c1}", "\u{9cd}", "\u{9e2}", "\u{9fe}", "\u{a01}", "\u{a3c}", "\u{a41}", "\u{a47}", "\u{a4b}", "\u{a51}", "\u{a70}", "\u{a75}", "\u{a81}", "\u{abc}", "\u{ac1}", "\u{ac7}", "\u{acd}", "\u{ae2}", "\u{afa}", "\u{b01}", "\u{b3c}", "\u{b3f}", "\u{b41}", "\u{b4d}", "\u{b55}", "\u{b62}", "\u{b82}", "\u{bc0}", "\u{bcd}", "\u{c00}", "\u{c04}", "\u{c3c}", "\u{c3e}", "\u{c46}", "\u{c4a}", "\u{c55}", "\u{c62}", "\u{c81}", "\u{cbc}", "\u{cbf}", "\u{cc6}", "\u{ccc}", "\u{ce2}", "\u{d00}", "\u{d3b}", "\u{d41}", "\u{d4d}", "\u{d62}", "\u{d81}", "\u{dca}", "\u{dd2}", "\u{dd6}", "\u{e31}", "\u{e34}", "\u{e47}", "\u{eb1}", "\u{eb4}", "\u{ec8}", "\u{f18}", "\u{f35}", "\u{f37}", "\u{f39}", "\u{f71}", "\u{f80}", "\u{f86}", "\u{f8d}", "\u{f99}", "\u{fc6}", "\u{102d}", "\u{1032}", "\u{1039}", "\u{103d}", "\u{1058}", "\u{105e}", "\u{1071}", "\u{1082}", "\u{1085}", "\u{108d}", "\u{109d}", "\u{135d}", "\u{1712}", "\u{1732}", "\u{1752}", "\u{1772}", "\u{17b4}", "\u{17b7}", "\u{17c6}", "\u{17c9}", "\u{17dd}", "\u{180b}", "\u{180f}", "\u{1885}", "\u{18a9}", "\u{1920}", "\u{1927}", "\u{1932}", "\u{1939}", "\u{1a17}", "\u{1a1b}", "\u{1a56}", "\u{1a58}", "\u{1a60}", "\u{1a62}", "\u{1a65}", "\u{1a73}", "\u{1a7f}", "\u{1ab0}", "\u{1abf}", "\u{1b00}", "\u{1b34}", "\u{1b36}", "\u{1b3c}", "\u{1b42}", "\u{1b6b}", "\u{1b80}", "\u{1ba2}", "\u{1ba8}", "\u{1bab}", "\u{1be6}", "\u{1be8}", "\u{1bed}", "\u{1bef}", "\u{1c2c}", "\u{1c36}", "\u{1cd0}", "\u{1cd4}", "\u{1ce2}", "\u{1ced}", "\u{1cf4}", "\u{1cf8}", "\u{1dc0}", "\u{20d0}", "\u{20e1}", "\u{20e5}", "\u{2cef}", "\u{2d7f}", "\u{2de0}", "\u{302a}", "\u{3099}", "\u{a66f}", "\u{a674}", "\u{a69e}", "\u{a6f0}", "\u{a802}", "\u{a806}", "\u{a80b}", "\u{a825}", "\u{a82c}", "\u{a8c4}", "\u{a8e0}", "\u{a8ff}", "\u{a926}", "\u{a947}", "\u{a980}", "\u{a9b3}", "\u{a9b6}", "\u{a9bc}", "\u{a9e5}", "\u{aa29}", "\u{aa31}", "\u{aa35}", "\u{aa43}", "\u{aa4c}", "\u{aa7c}", "\u{aab0}", "\u{aab2}", "\u{aab7}", "\u{aabe}", "\u{aac1}", "\u{aaec}", "\u{aaf6}", "\u{abe5}", "\u{abe8}", "\u{abed}", "\u{fb1e}", "\u{fe00}", "\u{fe20}", "\u{101fd}", "\u{102e0}", "\u{10376}", "\u{10a01}", "\u{10a05}", "\u{10a0c}", "\u{10a38}", "\u{10a3f}", "\u{10ae5}", "\u{10d24}", "\u{10eab}", "\u{10efd}", "\u{10f46}", "\u{10f82}", "\u{11001}", "\u{11038}", "\u{11070}", "\u{11073}", "\u{1107f}", "\u{110b3}", "\u{110b9}", "\u{110c2}", "\u{11100}", "\u{11127}", "\u{1112d}", "\u{11173}", "\u{11180}", "\u{111b6}", "\u{111c9}", "\u{111cf}", "\u{1122f}", "\u{11234}", "\u{11236}", "\u{1123e}", "\u{11241}", "\u{112df}", "\u{112e3}", "\u{11300}", "\u{1133b}", "\u{11340}", "\u{11366}", "\u{11370}", "\u{11438}", "\u{11442}", "\u{11446}", "\u{1145e}", "\u{114b3}", "\u{114ba}", "\u{114bf}", "\u{114c2}", "\u{115b2}", "\u{115bc}", "\u{115bf}", "\u{115dc}", "\u{11633}", "\u{1163d}", "\u{1163f}", "\u{116ab}", "\u{116ad}", "\u{116b0}", "\u{116b7}", "\u{1171d}", "\u{11722}", "\u{11727}", "\u{1182f}", "\u{11839}", "\u{1193b}", "\u{1193e}", "\u{11943}", "\u{119d4}", "\u{119da}", "\u{119e0}", "\u{11a01}", "\u{11a33}", "\u{11a3b}", "\u{11a47}", "\u{11a51}", "\u{11a59}", "\u{11a8a}", "\u{11a98}", "\u{11c30}", "\u{11c38}", "\u{11c3f}", "\u{11c92}", "\u{11caa}", "\u{11cb2}", "\u{11cb5}", "\u{11d31}", "\u{11d3a}", "\u{11d3c}", "\u{11d3f}", "\u{11d47}", "\u{11d90}", "\u{11d95}", "\u{11d97}", "\u{11ef3}", "\u{11f00}", "\u{11f36}", "\u{11f40}", "\u{11f42}", "\u{13440}", "\u{13447}", "\u{16af0}", "\u{16b30}", "\u{16f4f}", "\u{16f8f}", "\u{16fe4}", "\u{1bc9d}", "\u{1cf00}", "\u{1cf30}", "\u{1d167}", "\u{1d17b}", "\u{1d185}", "\u{1d1aa}", "\u{1d242}", "\u{1da00}", "\u{1da3b}", "\u{1da75}", "\u{1da84}", "\u{1da9b}", "\u{1daa1}", "\u{1e000}", "\u{1e008}", "\u{1e01b}", "\u{1e023}", "\u{1e026}", "\u{1e08f}", "\u{1e130}", "\u{1e2ae}", "\u{1e2ec}", "\u{1e4ec}", "\u{1e8d0}", "\u{1e944}", "\u{e0100}", ]; const REGEXES: [&str; 9] = [ "^\\p{General_Category=Mark}+$", "^\\p{gc=Mark}+$", "^\\p{Mark}+$", "^\\p{General_Category=Combining_Mark}+$", "^\\p{gc=Combining_Mark}+$", "^\\p{Combining_Mark}+$", "^\\p{General_Category=M}+$", "^\\p{gc=M}+$", "^\\p{M}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_number() { test_with_configs(unicode_escape_property_gc_number_tc) } fn unicode_escape_property_gc_number_tc(tc: TestConfig) { const CODE_POINTS: [&str; 148] = [ "\u{30}", "\u{660}", "\u{6f0}", "\u{7c0}", "\u{966}", "\u{9e6}", "\u{a66}", "\u{ae6}", "\u{b66}", "\u{be6}", "\u{c66}", "\u{ce6}", "\u{d66}", "\u{de6}", "\u{e50}", "\u{ed0}", "\u{f20}", "\u{1040}", "\u{1090}", "\u{17e0}", "\u{1810}", "\u{1946}", "\u{19d0}", "\u{1a80}", "\u{1a90}", "\u{1b50}", "\u{1bb0}", "\u{1c40}", "\u{1c50}", "\u{a620}", "\u{a8d0}", "\u{a900}", "\u{a9d0}", "\u{a9f0}", "\u{aa50}", "\u{abf0}", "\u{ff10}", "\u{104a0}", "\u{10d30}", "\u{11066}", "\u{110f0}", "\u{11136}", "\u{111d0}", "\u{112f0}", "\u{11450}", "\u{114d0}", "\u{11650}", "\u{116c0}", "\u{11730}", "\u{118e0}", "\u{11950}", "\u{11c50}", "\u{11d50}", "\u{11da0}", "\u{11f50}", "\u{16a60}", "\u{16ac0}", "\u{16b50}", "\u{1d7ce}", "\u{1e140}", "\u{1e2f0}", "\u{1e4f0}", "\u{1e950}", "\u{1fbf0}", "\u{16ee}", "\u{2160}", "\u{2185}", "\u{3007}", "\u{3021}", "\u{3038}", "\u{a6e6}", "\u{10140}", "\u{10341}", "\u{1034a}", "\u{103d1}", "\u{12400}", "\u{b2}", "\u{b9}", "\u{bc}", "\u{9f4}", "\u{b72}", "\u{bf0}", "\u{c78}", "\u{d58}", "\u{d70}", "\u{f2a}", "\u{1369}", "\u{17f0}", "\u{19da}", "\u{2070}", "\u{2074}", "\u{2080}", "\u{2150}", "\u{2189}", "\u{2460}", "\u{24ea}", "\u{2776}", "\u{2cfd}", "\u{3192}", "\u{3220}", "\u{3248}", "\u{3251}", "\u{3280}", "\u{32b1}", "\u{a830}", "\u{10107}", "\u{10175}", "\u{1018a}", "\u{102e1}", "\u{10320}", "\u{10858}", "\u{10879}", "\u{108a7}", "\u{108fb}", "\u{10916}", "\u{109bc}", "\u{109c0}", "\u{109d2}", "\u{10a40}", "\u{10a7d}", "\u{10a9d}", "\u{10aeb}", "\u{10b58}", "\u{10b78}", "\u{10ba9}", "\u{10cfa}", "\u{10e60}", "\u{10f1d}", "\u{10f51}", "\u{10fc5}", "\u{11052}", "\u{111e1}", "\u{1173a}", "\u{118ea}", "\u{11c5a}", "\u{11fc0}", "\u{16b5b}", "\u{16e80}", "\u{1d2c0}", "\u{1d2e0}", "\u{1d360}", "\u{1e8c7}", "\u{1ec71}", "\u{1ecad}", "\u{1ecb1}", "\u{1ed01}", "\u{1ed2f}", "\u{1f100}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Number}+$", "^\\p{gc=Number}+$", "^\\p{Number}+$", "^\\p{General_Category=N}+$", "^\\p{gc=N}+$", "^\\p{N}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_punctuation() { test_with_configs(unicode_escape_property_gc_punctuation_tc) } fn unicode_escape_property_gc_punctuation_tc(tc: TestConfig) { const CODE_POINTS: [&str; 388] = [ "\u{5f}", "\u{203f}", "\u{2054}", "\u{fe33}", "\u{fe4d}", "\u{ff3f}", "\u{2d}", "\u{58a}", "\u{5be}", "\u{1400}", "\u{1806}", "\u{2010}", "\u{2e17}", "\u{2e1a}", "\u{2e3a}", "\u{2e40}", "\u{2e5d}", "\u{301c}", "\u{3030}", "\u{30a0}", "\u{fe31}", "\u{fe58}", "\u{fe63}", "\u{ff0d}", "\u{10ead}", "\u{29}", "\u{5d}", "\u{7d}", "\u{f3b}", "\u{f3d}", "\u{169c}", "\u{2046}", "\u{207e}", "\u{208e}", "\u{2309}", "\u{230b}", "\u{232a}", "\u{2769}", "\u{276b}", "\u{276d}", "\u{276f}", "\u{2771}", "\u{2773}", "\u{2775}", "\u{27c6}", "\u{27e7}", "\u{27e9}", "\u{27eb}", "\u{27ed}", "\u{27ef}", "\u{2984}", "\u{2986}", "\u{2988}", "\u{298a}", "\u{298c}", "\u{298e}", "\u{2990}", "\u{2992}", "\u{2994}", "\u{2996}", "\u{2998}", "\u{29d9}", "\u{29db}", "\u{29fd}", "\u{2e23}", "\u{2e25}", "\u{2e27}", "\u{2e29}", "\u{2e56}", "\u{2e58}", "\u{2e5a}", "\u{2e5c}", "\u{3009}", "\u{300b}", "\u{300d}", "\u{300f}", "\u{3011}", "\u{3015}", "\u{3017}", "\u{3019}", "\u{301b}", "\u{301e}", "\u{fd3e}", "\u{fe18}", "\u{fe36}", "\u{fe38}", "\u{fe3a}", "\u{fe3c}", "\u{fe3e}", "\u{fe40}", "\u{fe42}", "\u{fe44}", "\u{fe48}", "\u{fe5a}", "\u{fe5c}", "\u{fe5e}", "\u{ff09}", "\u{ff3d}", "\u{ff5d}", "\u{ff60}", "\u{ff63}", "\u{bb}", "\u{2019}", "\u{201d}", "\u{203a}", "\u{2e03}", "\u{2e05}", "\u{2e0a}", "\u{2e0d}", "\u{2e1d}", "\u{2e21}", "\u{ab}", "\u{2018}", "\u{201b}", "\u{201f}", "\u{2039}", "\u{2e02}", "\u{2e04}", "\u{2e09}", "\u{2e0c}", "\u{2e1c}", "\u{2e20}", "\u{21}", "\u{25}", "\u{2a}", "\u{2c}", "\u{2e}", "\u{3a}", "\u{3f}", "\u{5c}", "\u{a1}", "\u{a7}", "\u{b6}", "\u{bf}", "\u{37e}", "\u{387}", "\u{55a}", "\u{589}", "\u{5c0}", "\u{5c3}", "\u{5c6}", "\u{5f3}", "\u{609}", "\u{60c}", "\u{61b}", "\u{61d}", "\u{66a}", "\u{6d4}", "\u{700}", "\u{7f7}", "\u{830}", "\u{85e}", "\u{964}", "\u{970}", "\u{9fd}", "\u{a76}", "\u{af0}", "\u{c77}", "\u{c84}", "\u{df4}", "\u{e4f}", "\u{e5a}", "\u{f04}", "\u{f14}", "\u{f85}", "\u{fd0}", "\u{fd9}", "\u{104a}", "\u{10fb}", "\u{1360}", "\u{166e}", "\u{16eb}", "\u{1735}", "\u{17d4}", "\u{17d8}", "\u{1800}", "\u{1807}", "\u{1944}", "\u{1a1e}", "\u{1aa0}", "\u{1aa8}", "\u{1b5a}", "\u{1b7d}", "\u{1bfc}", "\u{1c3b}", "\u{1c7e}", "\u{1cc0}", "\u{1cd3}", "\u{2016}", "\u{2020}", "\u{2030}", "\u{203b}", "\u{2041}", "\u{2047}", "\u{2053}", "\u{2055}", "\u{2cf9}", "\u{2cfe}", "\u{2d70}", "\u{2e00}", "\u{2e06}", "\u{2e0b}", "\u{2e0e}", "\u{2e18}", "\u{2e1b}", "\u{2e1e}", "\u{2e2a}", "\u{2e30}", "\u{2e3c}", "\u{2e41}", "\u{2e43}", "\u{2e52}", "\u{3001}", "\u{303d}", "\u{30fb}", "\u{a4fe}", "\u{a60d}", "\u{a673}", "\u{a67e}", "\u{a6f2}", "\u{a874}", "\u{a8ce}", "\u{a8f8}", "\u{a8fc}", "\u{a92e}", "\u{a95f}", "\u{a9c1}", "\u{a9de}", "\u{aa5c}", "\u{aade}", "\u{aaf0}", "\u{abeb}", "\u{fe10}", "\u{fe19}", "\u{fe30}", "\u{fe45}", "\u{fe49}", "\u{fe50}", "\u{fe54}", "\u{fe5f}", "\u{fe68}", "\u{fe6a}", "\u{ff01}", "\u{ff05}", "\u{ff0a}", "\u{ff0c}", "\u{ff0e}", "\u{ff1a}", "\u{ff1f}", "\u{ff3c}", "\u{ff61}", "\u{ff64}", "\u{10100}", "\u{1039f}", "\u{103d0}", "\u{1056f}", "\u{10857}", "\u{1091f}", "\u{1093f}", "\u{10a50}", "\u{10a7f}", "\u{10af0}", "\u{10b39}", "\u{10b99}", "\u{10f55}", "\u{10f86}", "\u{11047}", "\u{110bb}", "\u{110be}", "\u{11140}", "\u{11174}", "\u{111c5}", "\u{111cd}", "\u{111db}", "\u{111dd}", "\u{11238}", "\u{112a9}", "\u{1144b}", "\u{1145a}", "\u{1145d}", "\u{114c6}", "\u{115c1}", "\u{11641}", "\u{11660}", "\u{116b9}", "\u{1173c}", "\u{1183b}", "\u{11944}", "\u{119e2}", "\u{11a3f}", "\u{11a9a}", "\u{11a9e}", "\u{11b00}", "\u{11c41}", "\u{11c70}", "\u{11ef7}", "\u{11f43}", "\u{11fff}", "\u{12470}", "\u{12ff1}", "\u{16a6e}", "\u{16af5}", "\u{16b37}", "\u{16b44}", "\u{16e97}", "\u{16fe2}", "\u{1bc9f}", "\u{1da87}", "\u{1e95e}", "\u{28}", "\u{5b}", "\u{7b}", "\u{f3a}", "\u{f3c}", "\u{169b}", "\u{201a}", "\u{201e}", "\u{2045}", "\u{207d}", "\u{208d}", "\u{2308}", "\u{230a}", "\u{2329}", "\u{2768}", "\u{276a}", "\u{276c}", "\u{276e}", "\u{2770}", "\u{2772}", "\u{2774}", "\u{27c5}", "\u{27e6}", "\u{27e8}", "\u{27ea}", "\u{27ec}", "\u{27ee}", "\u{2983}", "\u{2985}", "\u{2987}", "\u{2989}", "\u{298b}", "\u{298d}", "\u{298f}", "\u{2991}", "\u{2993}", "\u{2995}", "\u{2997}", "\u{29d8}", "\u{29da}", "\u{29fc}", "\u{2e22}", "\u{2e24}", "\u{2e26}", "\u{2e28}", "\u{2e42}", "\u{2e55}", "\u{2e57}", "\u{2e59}", "\u{2e5b}", "\u{3008}", "\u{300a}", "\u{300c}", "\u{300e}", "\u{3010}", "\u{3014}", "\u{3016}", "\u{3018}", "\u{301a}", "\u{301d}", "\u{fd3f}", "\u{fe17}", "\u{fe35}", "\u{fe37}", "\u{fe39}", "\u{fe3b}", "\u{fe3d}", "\u{fe3f}", "\u{fe41}", "\u{fe43}", "\u{fe47}", "\u{fe59}", "\u{fe5b}", "\u{fe5d}", "\u{ff08}", "\u{ff3b}", "\u{ff5b}", "\u{ff5f}", "\u{ff62}", ]; const REGEXES: [&str; 9] = [ "^\\p{General_Category=Punctuation}+$", "^\\p{gc=Punctuation}+$", "^\\p{Punctuation}+$", "^\\p{General_Category=punct}+$", "^\\p{gc=punct}+$", "^\\p{punct}+$", "^\\p{General_Category=P}+$", "^\\p{gc=P}+$", "^\\p{P}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_symbol() { test_with_configs(unicode_escape_property_gc_symbol_tc) } fn unicode_escape_property_gc_symbol_tc(tc: TestConfig) { const CODE_POINTS: [&str; 301] = [ "\u{24}", "\u{a2}", "\u{58f}", "\u{60b}", "\u{7fe}", "\u{9f2}", "\u{9fb}", "\u{af1}", "\u{bf9}", "\u{e3f}", "\u{17db}", "\u{20a0}", "\u{a838}", "\u{fdfc}", "\u{fe69}", "\u{ff04}", "\u{ffe0}", "\u{ffe5}", "\u{11fdd}", "\u{1e2ff}", "\u{1ecb0}", "\u{5e}", "\u{60}", "\u{a8}", "\u{af}", "\u{b4}", "\u{b8}", "\u{2c2}", "\u{2d2}", "\u{2e5}", "\u{2ed}", "\u{2ef}", "\u{375}", "\u{384}", "\u{888}", "\u{1fbd}", "\u{1fbf}", "\u{1fcd}", "\u{1fdd}", "\u{1fed}", "\u{1ffd}", "\u{309b}", "\u{a700}", "\u{a720}", "\u{a789}", "\u{ab5b}", "\u{ab6a}", "\u{fbb2}", "\u{ff3e}", "\u{ff40}", "\u{ffe3}", "\u{1f3fb}", "\u{2b}", "\u{3c}", "\u{7c}", "\u{7e}", "\u{ac}", "\u{b1}", "\u{d7}", "\u{f7}", "\u{3f6}", "\u{606}", "\u{2044}", "\u{2052}", "\u{207a}", "\u{208a}", "\u{2118}", "\u{2140}", "\u{214b}", "\u{2190}", "\u{219a}", "\u{21a0}", "\u{21a3}", "\u{21a6}", "\u{21ae}", "\u{21ce}", "\u{21d2}", "\u{21d4}", "\u{21f4}", "\u{2320}", "\u{237c}", "\u{239b}", "\u{23dc}", "\u{25b7}", "\u{25c1}", "\u{25f8}", "\u{266f}", "\u{27c0}", "\u{27c7}", "\u{27f0}", "\u{2900}", "\u{2999}", "\u{29dc}", "\u{29fe}", "\u{2b30}", "\u{2b47}", "\u{fb29}", "\u{fe62}", "\u{fe64}", "\u{ff0b}", "\u{ff1c}", "\u{ff5c}", "\u{ff5e}", "\u{ffe2}", "\u{ffe9}", "\u{1d6c1}", "\u{1d6db}", "\u{1d6fb}", "\u{1d715}", "\u{1d735}", "\u{1d74f}", "\u{1d76f}", "\u{1d789}", "\u{1d7a9}", "\u{1d7c3}", "\u{1eef0}", "\u{a6}", "\u{a9}", "\u{ae}", "\u{b0}", "\u{482}", "\u{58d}", "\u{60e}", "\u{6de}", "\u{6e9}", "\u{6fd}", "\u{7f6}", "\u{9fa}", "\u{b70}", "\u{bf3}", "\u{bfa}", "\u{c7f}", "\u{d4f}", "\u{d79}", "\u{f01}", "\u{f13}", "\u{f15}", "\u{f1a}", "\u{f34}", "\u{f36}", "\u{f38}", "\u{fbe}", "\u{fc7}", "\u{fce}", "\u{fd5}", "\u{109e}", "\u{1390}", "\u{166d}", "\u{1940}", "\u{19de}", "\u{1b61}", "\u{1b74}", "\u{2100}", "\u{2103}", "\u{2108}", "\u{2114}", "\u{2116}", "\u{211e}", "\u{2125}", "\u{2127}", "\u{2129}", "\u{212e}", "\u{213a}", "\u{214a}", "\u{214c}", "\u{214f}", "\u{218a}", "\u{2195}", "\u{219c}", "\u{21a1}", "\u{21a4}", "\u{21a7}", "\u{21af}", "\u{21d0}", "\u{21d3}", "\u{21d5}", "\u{2300}", "\u{230c}", "\u{2322}", "\u{232b}", "\u{237d}", "\u{23b4}", "\u{23e2}", "\u{2440}", "\u{249c}", "\u{2500}", "\u{25b8}", "\u{25c2}", "\u{2600}", "\u{2670}", "\u{2794}", "\u{2800}", "\u{2b00}", "\u{2b45}", "\u{2b4d}", "\u{2b76}", "\u{2b97}", "\u{2ce5}", "\u{2e50}", "\u{2e80}", "\u{2e9b}", "\u{2f00}", "\u{2ff0}", "\u{3004}", "\u{3012}", "\u{3020}", "\u{3036}", "\u{303e}", "\u{3190}", "\u{3196}", "\u{31c0}", "\u{31ef}", "\u{3200}", "\u{322a}", "\u{3250}", "\u{3260}", "\u{328a}", "\u{32c0}", "\u{4dc0}", "\u{a490}", "\u{a828}", "\u{a836}", "\u{a839}", "\u{aa77}", "\u{fd40}", "\u{fdcf}", "\u{fdfd}", "\u{ffe4}", "\u{ffe8}", "\u{ffed}", "\u{fffc}", "\u{10137}", "\u{10179}", "\u{1018c}", "\u{10190}", "\u{101a0}", "\u{101d0}", "\u{10877}", "\u{10ac8}", "\u{1173f}", "\u{11fd5}", "\u{11fe1}", "\u{16b3c}", "\u{16b45}", "\u{1bc9c}", "\u{1cf50}", "\u{1d000}", "\u{1d100}", "\u{1d129}", "\u{1d16a}", "\u{1d183}", "\u{1d18c}", "\u{1d1ae}", "\u{1d200}", "\u{1d245}", "\u{1d300}", "\u{1d800}", "\u{1da37}", "\u{1da6d}", "\u{1da76}", "\u{1da85}", "\u{1e14f}", "\u{1ecac}", "\u{1ed2e}", "\u{1f000}", "\u{1f030}", "\u{1f0a0}", "\u{1f0b1}", "\u{1f0c1}", "\u{1f0d1}", "\u{1f10d}", "\u{1f1e6}", "\u{1f210}", "\u{1f240}", "\u{1f250}", "\u{1f260}", "\u{1f300}", "\u{1f400}", "\u{1f6dc}", "\u{1f6f0}", "\u{1f700}", "\u{1f77b}", "\u{1f7e0}", "\u{1f7f0}", "\u{1f800}", "\u{1f810}", "\u{1f850}", "\u{1f860}", "\u{1f890}", "\u{1f8b0}", "\u{1f900}", "\u{1fa60}", "\u{1fa70}", "\u{1fa80}", "\u{1fa90}", "\u{1fabf}", "\u{1face}", "\u{1fae0}", "\u{1faf0}", "\u{1fb00}", "\u{1fb94}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Symbol}+$", "^\\p{gc=Symbol}+$", "^\\p{Symbol}+$", "^\\p{General_Category=S}+$", "^\\p{gc=S}+$", "^\\p{S}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } #[test] fn unicode_escape_property_gc_separator() { test_with_configs(unicode_escape_property_gc_separator_tc) } fn unicode_escape_property_gc_separator_tc(tc: TestConfig) { const CODE_POINTS: [&str; 9] = [ "\u{2028}", "\u{2029}", "\u{20}", "\u{a0}", "\u{1680}", "\u{2000}", "\u{202f}", "\u{205f}", "\u{3000}", ]; const REGEXES: [&str; 6] = [ "^\\p{General_Category=Separator}+$", "^\\p{gc=Separator}+$", "^\\p{Separator}+$", "^\\p{General_Category=Z}+$", "^\\p{gc=Z}+$", "^\\p{Z}+$", ]; for regex in REGEXES { let regex = tc.compilef(regex, "u"); for code_point in CODE_POINTS { regex.test_succeeds(code_point); } } } regress-0.10.5/tests/unicodesets.rs000064400000000000000000003241631046102023000154270ustar 00000000000000pub mod common; use common::*; /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-01.js #[test] fn unicode_sets_breaking_change_from_u_to_v_01() { test_parse_fails_flags(r#"[(]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-02.js #[test] fn unicode_sets_breaking_change_from_u_to_v_02() { test_parse_fails_flags(r#"[)]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-03.js #[test] fn unicode_sets_breaking_change_from_u_to_v_03() { test_parse_fails_flags(r#"[[]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-04.js #[test] fn unicode_sets_breaking_change_from_u_to_v_04() { test_parse_fails_flags(r#"[{]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-05.js #[test] fn unicode_sets_breaking_change_from_u_to_v_05() { test_parse_fails_flags(r#"[}]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-06.js #[test] fn unicode_sets_breaking_change_from_u_to_v_06() { test_parse_fails_flags(r#"[/]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-07.js #[test] fn unicode_sets_breaking_change_from_u_to_v_07() { test_parse_fails_flags(r#"[-]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-08.js #[test] fn unicode_sets_breaking_change_from_u_to_v_08() { test_parse_fails_flags(r#"[|]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-09.js #[test] fn unicode_sets_breaking_change_from_u_to_v_09() { test_parse_fails_flags(r#"[&&]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-10.js #[test] fn unicode_sets_breaking_change_from_u_to_v_10() { test_parse_fails_flags(r#"[!!]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-11.js #[test] fn unicode_sets_breaking_change_from_u_to_v_11() { test_parse_fails_flags(r#"[##]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-12.js #[test] fn unicode_sets_breaking_change_from_u_to_v_12() { test_parse_fails_flags(r#"[$$]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-13.js #[test] fn unicode_sets_breaking_change_from_u_to_v_13() { test_parse_fails_flags(r#"[%%]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-14.js #[test] fn unicode_sets_breaking_change_from_u_to_v_14() { test_parse_fails_flags(r#"[**]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-15.js #[test] fn unicode_sets_breaking_change_from_u_to_v_15() { test_parse_fails_flags(r#"[++]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-16.js #[test] fn unicode_sets_breaking_change_from_u_to_v_16() { test_parse_fails_flags(r#"[,,]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-17.js #[test] fn unicode_sets_breaking_change_from_u_to_v_17() { test_parse_fails_flags(r#"[..]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-18.js #[test] fn unicode_sets_breaking_change_from_u_to_v_18() { test_parse_fails_flags(r#"[::]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-19.js #[test] fn unicode_sets_breaking_change_from_u_to_v_19() { test_parse_fails_flags(r#"[;;]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-20.js #[test] fn unicode_sets_breaking_change_from_u_to_v_20() { test_parse_fails_flags(r#"[<<]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-21.js #[test] fn unicode_sets_breaking_change_from_u_to_v_21() { test_parse_fails_flags(r#"[==]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-22.js #[test] fn unicode_sets_breaking_change_from_u_to_v_22() { test_parse_fails_flags(r#"[>>]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-23.js #[test] fn unicode_sets_breaking_change_from_u_to_v_23() { test_parse_fails_flags(r#"[??]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-24.js #[test] fn unicode_sets_breaking_change_from_u_to_v_24() { test_parse_fails_flags(r#"[@@]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-25.js #[test] fn unicode_sets_breaking_change_from_u_to_v_25() { test_parse_fails_flags(r#"[``]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-26.js #[test] fn unicode_sets_breaking_change_from_u_to_v_26() { test_parse_fails_flags(r#"[~~]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-27.js #[test] fn unicode_sets_breaking_change_from_u_to_v_27() { test_parse_fails_flags(r#"[^^^]"#, "v"); } /// 262 test/built-ins/RegExp/prototype/unicodeSets/breaking-change-from-u-to-v-28.js #[test] fn unicode_sets_breaking_change_from_u_to_v_28() { test_parse_fails_flags(r#"[_^^]"#, "v"); } fn test_unicode_sets_matches(tc: TestConfig, expression: &str, matches: &[&str], fails: &[&str]) { for m in matches { tc.test_match_succeeds(expression, "v", m); } for f in fails { tc.test_match_fails(expression, "v", f); } } /// 262 test/built-ins/RegExp/unicodeSets/generated/rgi-emoji-13.1.js #[test] fn unicode_sets_rgi_emoji_13_1() { const EXPRESSION: &str = "^\\p{RGI_Emoji}+$"; const MATCHES: &[&str] = &[ "\u{2764}\u{FE0F}\u{200D}\u{1F525}", "\u{2764}\u{FE0F}\u{200D}\u{1FA79}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}", "\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}", "\u{1F48F}\u{1F3FB}", "\u{1F48F}\u{1F3FC}", "\u{1F48F}\u{1F3FD}", "\u{1F48F}\u{1F3FE}", "\u{1F48F}\u{1F3FF}", "\u{1F491}\u{1F3FB}", "\u{1F491}\u{1F3FC}", "\u{1F491}\u{1F3FD}", "\u{1F491}\u{1F3FE}", "\u{1F491}\u{1F3FF}", "\u{1F62E}\u{200D}\u{1F4A8}", "\u{1F635}\u{200D}\u{1F4AB}", "\u{1F636}\u{200D}\u{1F32B}\u{FE0F}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}", "\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}", "\u{1F9D4}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D4}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D4}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D4}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D4}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D4}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D4}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D4}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D4}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D4}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D4}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D4}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", ]; const FAILS: &[&str] = &[]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/rgi-emoji-14.0.js #[test] fn unicode_sets_rgi_emoji_14_0() { const EXPRESSION: &str = "^\\p{RGI_Emoji}+$"; const MATCHES: &[&str] = &[ "\u{1F6DD}", "\u{1F6DE}", "\u{1F6DF}", "\u{1F7F0}", "\u{1F91D}\u{1F3FB}", "\u{1F91D}\u{1F3FC}", "\u{1F91D}\u{1F3FD}", "\u{1F91D}\u{1F3FE}", "\u{1F91D}\u{1F3FF}", "\u{1F979}", "\u{1F9CC}", "\u{1FA7B}", "\u{1FA7C}", "\u{1FAA9}", "\u{1FAAA}", "\u{1FAAB}", "\u{1FAAC}", "\u{1FAB7}", "\u{1FAB8}", "\u{1FAB9}", "\u{1FABA}", "\u{1FAC3}", "\u{1FAC3}\u{1F3FB}", "\u{1FAC3}\u{1F3FC}", "\u{1FAC3}\u{1F3FD}", "\u{1FAC3}\u{1F3FE}", "\u{1FAC3}\u{1F3FF}", "\u{1FAC4}", "\u{1FAC4}\u{1F3FB}", "\u{1FAC4}\u{1F3FC}", "\u{1FAC4}\u{1F3FD}", "\u{1FAC4}\u{1F3FE}", "\u{1FAC4}\u{1F3FF}", "\u{1FAC5}", "\u{1FAC5}\u{1F3FB}", "\u{1FAC5}\u{1F3FC}", "\u{1FAC5}\u{1F3FD}", "\u{1FAC5}\u{1F3FE}", "\u{1FAC5}\u{1F3FF}", "\u{1FAD7}", "\u{1FAD8}", "\u{1FAD9}", "\u{1FAE0}", "\u{1FAE1}", "\u{1FAE2}", "\u{1FAE3}", "\u{1FAE4}", "\u{1FAE5}", "\u{1FAE6}", "\u{1FAE7}", "\u{1FAF0}", "\u{1FAF0}\u{1F3FB}", "\u{1FAF0}\u{1F3FC}", "\u{1FAF0}\u{1F3FD}", "\u{1FAF0}\u{1F3FE}", "\u{1FAF0}\u{1F3FF}", "\u{1FAF1}", "\u{1FAF1}\u{1F3FB}", "\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FC}", "\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FD}", "\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FE}", "\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FF}", "\u{1FAF1}\u{1F3FC}", "\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FB}", "\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FD}", "\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FE}", "\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FF}", "\u{1FAF1}\u{1F3FD}", "\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FB}", "\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FC}", "\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FE}", "\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FF}", "\u{1FAF1}\u{1F3FE}", "\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FB}", "\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FC}", "\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FD}", "\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FF}", "\u{1FAF1}\u{1F3FF}", "\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FB}", "\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FC}", "\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FD}", "\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FE}", "\u{1FAF2}", "\u{1FAF2}\u{1F3FB}", "\u{1FAF2}\u{1F3FC}", "\u{1FAF2}\u{1F3FD}", "\u{1FAF2}\u{1F3FE}", "\u{1FAF2}\u{1F3FF}", "\u{1FAF3}", "\u{1FAF3}\u{1F3FB}", "\u{1FAF3}\u{1F3FC}", "\u{1FAF3}\u{1F3FD}", "\u{1FAF3}\u{1F3FE}", "\u{1FAF3}\u{1F3FF}", "\u{1FAF4}", "\u{1FAF4}\u{1F3FB}", "\u{1FAF4}\u{1F3FC}", "\u{1FAF4}\u{1F3FD}", "\u{1FAF4}\u{1F3FE}", "\u{1FAF4}\u{1F3FF}", "\u{1FAF5}", "\u{1FAF5}\u{1F3FB}", "\u{1FAF5}\u{1F3FC}", "\u{1FAF5}\u{1F3FD}", "\u{1FAF5}\u{1F3FE}", "\u{1FAF5}\u{1F3FF}", "\u{1FAF6}", "\u{1FAF6}\u{1F3FB}", "\u{1FAF6}\u{1F3FC}", "\u{1FAF6}\u{1F3FD}", "\u{1FAF6}\u{1F3FE}", "\u{1FAF6}\u{1F3FF}", ]; const FAILS: &[&str] = &[]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class-escape.js #[test] fn unicode_sets_character_property_escape_union_character_class_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\d]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-intersection-character-class.js #[test] fn unicode_sets_character_intersection_character_class() { const EXPRESSION: &str = "^[_&&[0-9]]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "_", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-union-character-property-escape.js #[test] fn unicode_sets_character_class_union_character_property_escape() { const EXPRESSION: &str = "^[[0-9]\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-class-escape.js #[test] fn unicode_sets_character_class_escape_intersection_character_class_escape() { const EXPRESSION: &str = "^[\\d&&\\d]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character.js #[test] fn unicode_sets_character_class_escape_intersection_character() { const EXPRESSION: &str = "^[\\d&&_]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-difference-character-property-escape.js #[test] fn unicode_sets_character_difference_character_property_escape() { const EXPRESSION: &str = "^[_--\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &["_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-intersection-character.js #[test] fn unicode_sets_string_literal_intersection_character() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&_]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-property-escape.js #[test] fn unicode_sets_character_class_escape_difference_character_property_escape() { const EXPRESSION: &str = "^[\\d--\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-intersection-string-literal.js #[test] fn unicode_sets_character_class_intersection_string_literal() { const EXPRESSION: &str = "^[[0-9]&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["0", "2", "4"]; const FAILS: &[&str] = &[ "1", "3", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-intersection-character-class.js #[test] fn unicode_sets_string_literal_intersection_character_class() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&[0-9]]+$"; const MATCHES: &[&str] = &["0", "2", "4"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-class-escape.js #[test] fn unicode_sets_property_of_strings_escape_difference_character_class_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\d]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-difference-character-class-escape.js #[test] fn unicode_sets_string_literal_difference_character_class_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\d]+$"; const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-difference-character.js #[test] fn unicode_sets_string_literal_difference_character() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--_]+$"; const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-string-literal.js #[test] fn unicode_sets_character_class_escape_intersection_string_literal() { const EXPRESSION: &str = "^[\\d&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["0", "2", "4"]; const FAILS: &[&str] = &[ "1", "3", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-difference-string-literal.js #[test] fn unicode_sets_character_class_difference_string_literal() { const EXPRESSION: &str = "^[[0-9]--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["1", "3", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-class-escape.js #[test] fn unicode_sets_property_of_strings_escape_intersection_character_class_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\d]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class.js #[test] fn unicode_sets_character_property_escape_difference_character_class() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--[0-9]]+$"; const MATCHES: &[&str] = &["A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f"]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-difference-string-literal.js #[test] fn unicode_sets_character_difference_string_literal() { const EXPRESSION: &str = "^[_--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-string-literal.js #[test] fn unicode_sets_property_of_strings_escape_difference_string_literal() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &[ "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-string-literal.js #[test] fn unicode_sets_property_of_strings_escape_intersection_string_literal() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"]; const FAILS: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-difference-property-of-strings-escape.js #[test] fn unicode_sets_string_literal_difference_property_of_strings_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &["0", "2", "4"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-union-character-class.js #[test] fn unicode_sets_character_class_union_character_class() { const EXPRESSION: &str = "^[[0-9][0-9]]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-string-literal.js #[test] fn unicode_sets_character_class_escape_difference_string_literal() { const EXPRESSION: &str = "^[\\d--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["1", "3", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-property-of-strings-escape.js #[test] fn unicode_sets_character_property_escape_difference_property_of_strings_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-property-of-strings-escape.js #[test] fn unicode_sets_property_of_strings_escape_difference_property_of_strings_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-union-property-of-strings-escape.js #[test] fn unicode_sets_character_union_property_of_strings_escape() { const EXPRESSION: &str = "^[_\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "_", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-union-string-literal.js #[test] fn unicode_sets_character_class_escape_union_string_literal() { const EXPRESSION: &str = "^[\\d\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-property-escape.js #[test] fn unicode_sets_character_class_escape_union_character_property_escape() { const EXPRESSION: &str = "^[\\d\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-class.js #[test] fn unicode_sets_property_of_strings_escape_union_character_class() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}[0-9]]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5", "5\u{FE0F}\u{20E3}", "6", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8", "8\u{FE0F}\u{20E3}", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-string-literal.js #[test] fn unicode_sets_character_property_escape_difference_string_literal() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[ "1", "3", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-union-character-property-escape.js #[test] fn unicode_sets_string_literal_union_character_property_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-property-escape.js #[test] fn unicode_sets_property_of_strings_escape_union_character_property_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5", "5\u{FE0F}\u{20E3}", "6", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8", "8\u{FE0F}\u{20E3}", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &["\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-intersection-character.js #[test] fn unicode_sets_character_intersection_character() { const EXPRESSION: &str = "^[_&&_]+$"; const MATCHES: &[&str] = &["_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-intersection-character-property-escape.js #[test] fn unicode_sets_character_intersection_character_property_escape() { const EXPRESSION: &str = "^[_&&\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "_", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-union-character-property-escape.js #[test] fn unicode_sets_character_union_character_property_escape() { const EXPRESSION: &str = "^[_\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "_", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-union-string-literal.js #[test] fn unicode_sets_character_class_union_string_literal() { const EXPRESSION: &str = "^[[0-9]\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-class-escape.js #[test] fn unicode_sets_character_class_escape_union_character_class_escape() { const EXPRESSION: &str = "^[\\d\\d]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character.js #[test] fn unicode_sets_property_of_strings_escape_intersection_character() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&_]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-class.js #[test] fn unicode_sets_character_class_intersection_character_class() { const EXPRESSION: &str = "^[[0-9]&&[0-9]]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class-escape.js #[test] fn unicode_sets_character_property_escape_intersection_character_class_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\d]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-difference-string-literal.js #[test] fn unicode_sets_string_literal_difference_string_literal() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character.js #[test] fn unicode_sets_character_property_escape_intersection_character() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&_]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-union-character-class.js #[test] fn unicode_sets_string_literal_union_character_class() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}[0-9]]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-property-of-strings-escape.js #[test] fn unicode_sets_property_of_strings_escape_union_property_of_strings_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-union-string-literal.js #[test] fn unicode_sets_character_union_string_literal() { const EXPRESSION: &str = "^[_\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}", "_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-union-string-literal.js #[test] fn unicode_sets_string_literal_union_string_literal() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class.js #[test] fn unicode_sets_character_property_escape_intersection_character_class() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&[0-9]]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-class.js #[test] fn unicode_sets_character_class_escape_intersection_character_class() { const EXPRESSION: &str = "^[\\d&&[0-9]]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character.js #[test] fn unicode_sets_property_of_strings_escape_difference_character() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--_]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-intersection-string-literal.js #[test] fn unicode_sets_character_intersection_string_literal() { const EXPRESSION: &str = "^[_&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "_", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-property-of-strings-escape.js #[test] fn unicode_sets_character_class_escape_difference_property_of_strings_escape() { const EXPRESSION: &str = "^[\\d--\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-union-character-class-escape.js #[test] fn unicode_sets_character_class_union_character_class_escape() { const EXPRESSION: &str = "^[[0-9]\\d]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-property-escape.js #[test] fn unicode_sets_character_property_escape_union_character_property_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character.js #[test] fn unicode_sets_property_of_strings_escape_union_character() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}_]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "_", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-class-escape.js #[test] fn unicode_sets_property_of_strings_escape_union_character_class_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\d]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5", "5\u{FE0F}\u{20E3}", "6", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8", "8\u{FE0F}\u{20E3}", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-property-escape.js #[test] fn unicode_sets_character_class_intersection_character_property_escape() { const EXPRESSION: &str = "^[[0-9]&&\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character.js #[test] fn unicode_sets_character_class_escape_union_character() { const EXPRESSION: &str = "^[\\d_]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-difference-character-class-escape.js #[test] fn unicode_sets_character_class_difference_character_class_escape() { const EXPRESSION: &str = "^[[0-9]--\\d]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-class.js #[test] fn unicode_sets_property_of_strings_escape_intersection_character_class() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&[0-9]]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-intersection-string-literal.js #[test] fn unicode_sets_string_literal_intersection_string_literal() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-union-string-literal.js #[test] fn unicode_sets_character_property_escape_union_string_literal() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-difference-property-of-strings-escape.js #[test] fn unicode_sets_character_class_difference_property_of_strings_escape() { const EXPRESSION: &str = "^[[0-9]--\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-difference-character-property-escape.js #[test] fn unicode_sets_character_class_difference_character_property_escape() { const EXPRESSION: &str = "^[[0-9]--\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-difference-character.js #[test] fn unicode_sets_character_class_difference_character() { const EXPRESSION: &str = "^[[0-9]--_]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-difference-character-property-escape.js #[test] fn unicode_sets_string_literal_difference_character_property_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-union-property-of-strings-escape.js #[test] fn unicode_sets_character_class_escape_union_property_of_strings_escape() { const EXPRESSION: &str = "^[\\d\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5", "5\u{FE0F}\u{20E3}", "6", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8", "8\u{FE0F}\u{20E3}", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-class-escape.js #[test] fn unicode_sets_character_class_intersection_character_class_escape() { const EXPRESSION: &str = "^[[0-9]&&\\d]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-difference-character.js #[test] fn unicode_sets_character_difference_character() { const EXPRESSION: &str = "^[_--_]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "_", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-property-escape.js #[test] fn unicode_sets_character_property_escape_difference_character_property_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-union-character-class-escape.js #[test] fn unicode_sets_string_literal_union_character_class_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\d]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class.js #[test] fn unicode_sets_character_property_escape_union_character_class() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}[0-9]]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-union-property-of-strings-escape.js #[test] fn unicode_sets_string_literal_union_property_of_strings_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-union-character.js #[test] fn unicode_sets_string_literal_union_character() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}_]+$"; const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}", "_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character.js #[test] fn unicode_sets_character_property_escape_difference_character() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--_]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/rgi-emoji-15.0.js #[test] fn unicode_sets_rgi_emoji_15_0() { const EXPRESSION: &str = "^\\p{RGI_Emoji}+$"; const MATCHES: &[&str] = &[ "\u{1F426}\u{200D}\u{2B1B}", "\u{1F6DC}", "\u{1FA75}", "\u{1FA76}", "\u{1FA77}", "\u{1FA87}", "\u{1FA88}", "\u{1FAAD}", "\u{1FAAE}", "\u{1FAAF}", "\u{1FABB}", "\u{1FABC}", "\u{1FABD}", "\u{1FABF}", "\u{1FACE}", "\u{1FACF}", "\u{1FADA}", "\u{1FADB}", "\u{1FAE8}", "\u{1FAF7}", "\u{1FAF7}\u{1F3FB}", "\u{1FAF7}\u{1F3FC}", "\u{1FAF7}\u{1F3FD}", "\u{1FAF7}\u{1F3FE}", "\u{1FAF7}\u{1F3FF}", "\u{1FAF8}", "\u{1FAF8}\u{1F3FB}", "\u{1FAF8}\u{1F3FC}", "\u{1FAF8}\u{1F3FD}", "\u{1FAF8}\u{1F3FE}", "\u{1FAF8}\u{1F3FF}", ]; const FAILS: &[&str] = &[]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-string-literal.js #[test] fn unicode_sets_character_property_escape_intersection_string_literal() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &["0", "2", "4"]; const FAILS: &[&str] = &[ "1", "3", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-difference-character-class.js #[test] fn unicode_sets_character_class_difference_character_class() { const EXPRESSION: &str = "^[[0-9]--[0-9]]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-property-of-strings-escape.js #[test] fn unicode_sets_character_class_escape_intersection_property_of_strings_escape() { const EXPRESSION: &str = "^[\\d&&\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-property-of-strings-escape.js #[test] fn unicode_sets_character_property_escape_intersection_property_of_strings_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-class.js #[test] fn unicode_sets_character_class_escape_difference_character_class() { const EXPRESSION: &str = "^[\\d--[0-9]]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-difference-character-class.js #[test] fn unicode_sets_string_literal_difference_character_class() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--[0-9]]+$"; const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-intersection-character-property-escape.js #[test] fn unicode_sets_string_literal_intersection_character_property_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &["0", "2", "4"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-difference-property-of-strings-escape.js #[test] fn unicode_sets_character_difference_property_of_strings_escape() { const EXPRESSION: &str = "^[_--\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &["_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-intersection-character-class-escape.js #[test] fn unicode_sets_string_literal_intersection_character_class_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\d]+$"; const MATCHES: &[&str] = &["0", "2", "4"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-class.js #[test] fn unicode_sets_character_class_escape_union_character_class() { const EXPRESSION: &str = "^[\\d[0-9]]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-union-character.js #[test] fn unicode_sets_character_class_union_character() { const EXPRESSION: &str = "^[[0-9]_]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-class.js #[test] fn unicode_sets_property_of_strings_escape_difference_character_class() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--[0-9]]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-union-character.js #[test] fn unicode_sets_character_union_character() { const EXPRESSION: &str = "^[__]+$"; const MATCHES: &[&str] = &["_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-union-property-of-strings-escape.js #[test] fn unicode_sets_character_class_union_property_of_strings_escape() { const EXPRESSION: &str = "^[[0-9]\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5", "5\u{FE0F}\u{20E3}", "6", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8", "8\u{FE0F}\u{20E3}", "9", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-property-escape.js #[test] fn unicode_sets_character_property_escape_intersection_character_property_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-property-escape.js #[test] fn unicode_sets_property_of_strings_escape_difference_character_property_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-intersection-property-of-strings-escape.js #[test] fn unicode_sets_character_intersection_property_of_strings_escape() { const EXPRESSION: &str = "^[_&&\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "_", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character.js #[test] fn unicode_sets_character_property_escape_union_character() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}_]+$"; const MATCHES: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "_", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character.js #[test] fn unicode_sets_character_class_escape_difference_character() { const EXPRESSION: &str = "^[\\d--_]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-intersection-character.js #[test] fn unicode_sets_character_class_intersection_character() { const EXPRESSION: &str = "^[[0-9]&&_]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-union-character-class.js #[test] fn unicode_sets_character_union_character_class() { const EXPRESSION: &str = "^[_[0-9]]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-union-property-of-strings-escape.js #[test] fn unicode_sets_character_property_escape_union_property_of_strings_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5", "5\u{FE0F}\u{20E3}", "6", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8", "8\u{FE0F}\u{20E3}", "9", "9\u{FE0F}\u{20E3}", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", ]; const FAILS: &[&str] = &["\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-intersection-character-class-escape.js #[test] fn unicode_sets_character_intersection_character_class_escape() { const EXPRESSION: &str = "^[_&&\\d]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "_", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class-escape.js #[test] fn unicode_sets_character_property_escape_difference_character_class_escape() { const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\d]+$"; const MATCHES: &[&str] = &["A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f"]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-property-escape.js #[test] fn unicode_sets_character_class_escape_intersection_character_property_escape() { const EXPRESSION: &str = "^[\\d&&\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-property-of-strings-escape.js #[test] fn unicode_sets_property_of_strings_escape_intersection_property_of_strings_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-class-escape.js #[test] fn unicode_sets_character_class_escape_difference_character_class_escape() { const EXPRESSION: &str = "^[\\d--\\d]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-class-intersection-property-of-strings-escape.js #[test] fn unicode_sets_character_class_intersection_property_of_strings_escape() { const EXPRESSION: &str = "^[[0-9]&&\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "0", "1", "2", "3", "4", "5", "6", "6\u{FE0F}\u{20E3}", "7", "8", "9", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-union-character-class-escape.js #[test] fn unicode_sets_character_union_character_class_escape() { const EXPRESSION: &str = "^[_\\d]+$"; const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-difference-character-class.js #[test] fn unicode_sets_character_difference_character_class() { const EXPRESSION: &str = "^[_--[0-9]]+$"; const MATCHES: &[&str] = &["_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/string-literal-intersection-property-of-strings-escape.js #[test] fn unicode_sets_string_literal_intersection_property_of_strings_escape() { const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\p{Emoji_Keycap_Sequence}]+$"; const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"]; const FAILS: &[&str] = &[ "0", "2", "4", "6\u{FE0F}\u{20E3}", "7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/character-difference-character-class-escape.js #[test] fn unicode_sets_character_difference_character_class_escape() { const EXPRESSION: &str = "^[_--\\d]+$"; const MATCHES: &[&str] = &["_"]; const FAILS: &[&str] = &[ "6\u{FE0F}\u{20E3}", "7", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-property-escape.js #[test] fn unicode_sets_property_of_strings_escape_intersection_character_property_escape() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\p{ASCII_Hex_Digit}]+$"; const MATCHES: &[&str] = &[]; const FAILS: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}", ]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } /// 262 test/built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-string-literal.js #[test] fn unicode_sets_property_of_strings_escape_union_string_literal() { const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$"; const MATCHES: &[&str] = &[ "#\u{FE0F}\u{20E3}", "*\u{FE0F}\u{20E3}", "0", "0\u{FE0F}\u{20E3}", "1\u{FE0F}\u{20E3}", "2", "2\u{FE0F}\u{20E3}", "3\u{FE0F}\u{20E3}", "4", "4\u{FE0F}\u{20E3}", "5\u{FE0F}\u{20E3}", "6\u{FE0F}\u{20E3}", "7\u{FE0F}\u{20E3}", "8\u{FE0F}\u{20E3}", "9\u{FE0F}\u{20E3}", ]; const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"]; test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS)); } #[test] fn unicode_sets_invalid_patterns() { test_parse_fails_flags(r#"[ab--c]"#, "v"); test_parse_fails_flags(r#"[a--bc]"#, "v"); test_parse_fails_flags(r#"[ab&&c]"#, "v"); test_parse_fails_flags(r#"[a&&bc]"#, "v"); } #[test] fn test_unicode_sets_intersection() { test_with_configs_no_ascii(test_unicode_sets_intersection_tc) } fn test_unicode_sets_intersection_tc(tc: TestConfig) { tc.test_match_succeeds(r"^[\q{a}]$", "v", "a"); tc.test_match_succeeds(r"^[\q{a}&&\q{a}]$", "v", "a"); tc.test_match_fails(r"^[\q{a}&&\q{b}]$", "v", "a"); tc.test_match_fails(r"^[\q{a}&&\q{b}&&\q{a}]$", "v", "a"); tc.test_match_succeeds(r"^[\q{ab}]$", "v", "ab"); tc.test_match_succeeds(r"^[\q{ab}&&\q{ab}]$", "v", "ab"); tc.test_match_fails(r"^[\q{ab}&&\q{bc}]$", "v", "ab"); tc.test_match_fails(r"^[\q{ab}&&\q{bc}&&\q{ab}]$", "v", "ab"); tc.test_match_succeeds(r"^[\q{ab|bc}&&\q{ab}]$", "v", "ab"); tc.test_match_fails(r"^[\q{ab|bc}&&\q{ab}&&\q{bc}]$", "v", "ab"); tc.test_match_fails(r"^[\q{ab|bc}&&\q{ab}&&\q{bc}]$", "v", "bc"); tc.test_match_succeeds(r"^[\q{a}&&a]$", "v", "a"); tc.test_match_fails(r"^[\q{a}&&b]$", "v", "a"); tc.test_match_fails(r"^[\q{a}&&b]$", "v", "b"); tc.test_match_fails(r"^[\q{ab}&&b]$", "v", "ab"); tc.test_match_fails(r"^[\q{ab}&&b]$", "v", "b"); tc.test_match_succeeds(r"^[\q{ab}c]$", "v", "ab"); tc.test_match_succeeds(r"^[\q{ab}c]$", "v", "c"); } #[test] fn test_unicode_sets_subtraction() { test_with_configs_no_ascii(test_unicode_sets_subtraction_tc) } fn test_unicode_sets_subtraction_tc(tc: TestConfig) { tc.test_match_succeeds(r"^[\q{a|b}--a]$", "v", "b"); tc.test_match_fails(r"^[\q{a|b}--a]$", "v", "a"); tc.test_match_succeeds(r"^[\q{a|b}--\q{a|c}]$", "v", "b"); tc.test_match_fails(r"^[\q{a|b}--\q{a|c}]$", "v", "a"); tc.test_match_fails(r"^[\q{a|b}--\q{a|c}]$", "v", "c"); tc.test_match_fails(r"^[a--\q{a|b}]+$", "v", "a"); tc.test_match_fails(r"^[a--\q{a|b}]+$", "v", "b"); tc.test_match_fails(r"^[c--\q{a|b}]+$", "v", "a"); tc.test_match_fails(r"^[c--\q{a|b}]+$", "v", "b"); tc.test_match_succeeds(r"^[c--\q{a|b}]+$", "v", "c"); } #[test] fn test_unicode_sets_nested_class() { test_with_configs_no_ascii(test_unicode_sets_nested_class_tc) } fn test_unicode_sets_nested_class_tc(tc: TestConfig) { tc.test_match_succeeds(r"^[[ab]]$", "v", "a"); tc.test_match_succeeds(r"^[[ab]]$", "v", "b"); tc.test_match_succeeds(r"^[[ab][c]]$", "v", "a"); tc.test_match_succeeds(r"^[[ab][c]]$", "v", "b"); tc.test_match_succeeds(r"^[[ab][c]]$", "v", "c"); tc.test_match_succeeds(r"^[[\q{a|b}]]$", "v", "a"); tc.test_match_succeeds(r"^[[\q{a|b}]]$", "v", "b"); tc.test_match_succeeds(r"^[[ab][\q{abc}]]$", "v", "a"); tc.test_match_succeeds(r"^[[ab][\q{abc}]]$", "v", "b"); tc.test_match_succeeds(r"^[[ab][\q{abc}]]$", "v", "abc"); tc.test_match_fails(r"^[[ab][\q{abc}]]$", "v", "ab"); tc.test_match_fails(r"^[[ab][\q{abc}]]$", "v", "bc"); tc.test_match_fails(r"^[[ab][\q{abc}]]$", "v", "c"); tc.test_match_fails(r"^[[\q{a|b}]--[\q{a}]]$", "v", "a"); tc.test_match_succeeds(r"^[[\q{a|b}]--[\q{a}]]$", "v", "b"); tc.test_match_succeeds(r"^[[\q{abc}ab]--a]$", "v", "abc"); tc.test_match_succeeds(r"^[[\q{abc}ab]--a]$", "v", "b"); tc.test_match_fails(r"^[[\q{abc}ab]--a]$", "v", "a"); tc.test_match_fails(r"^[[\q{abc}ab]&&a]$", "v", "abc"); tc.test_match_fails(r"^[[\q{abc}ab]&&a]$", "v", "b"); tc.test_match_succeeds(r"^[[\q{abc}ab]&&a]$", "v", "a"); tc.test_match_fails(r"^[a&&[\q{abc}ab]]$", "v", "abc"); tc.test_match_fails(r"^[a&&[\q{abc}ab]]$", "v", "b"); tc.test_match_succeeds(r"^[a&&[\q{abc}ab]]$", "v", "a"); tc.test_match_succeeds(r"^[[\q{a|b}]&&[\q{abc}ab]]$", "v", "a"); tc.test_match_succeeds(r"^[[\q{a|b}]&&[\q{abc}ab]]$", "v", "b"); tc.test_match_fails(r"^[[\q{a|b}]&&[\q{abc}ab]]$", "v", "abc"); tc.test_match_succeeds(r"^[[0-9]&&\q{0|2|4}]$", "v", "0"); tc.test_match_succeeds(r"^[[0-9]&&\q{0|2|4}]$", "v", "2"); tc.test_match_succeeds(r"^[[0-9]&&\q{0|2|4}]$", "v", "4"); } #[test] fn test_stuff() { test_with_configs(test_stuff_tc) } fn test_stuff_tc(tc: TestConfig) { let r = tc.compilef("c|abc", "i").match1f("\u{83}x0abcdef"); assert_eq!(r, "abc"); }